All Downloads are FREE. Search and download functionalities are using the official Maven repository.

gurux.dlms.GXDLMSTranslatorStructure Maven / Gradle / Ivy

There is a newer version: 4.0.72
Show newest version
//
// --------------------------------------------------------------------------
//  Gurux Ltd
// 
//
//
// Filename:        $HeadURL$
//
// Version:         $Revision$,
//                  $Date$
//                  $Author$
//
// Copyright (c) Gurux Ltd
//
//---------------------------------------------------------------------------
//
//  DESCRIPTION
//
// This file is a part of Gurux Device Framework.
//
// Gurux Device Framework is Open Source software; you can redistribute it
// and/or modify it under the terms of the GNU General Public License 
// as published by the Free Software Foundation; version 2 of the License.
// Gurux Device Framework is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of 
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
// See the GNU General Public License for more details.
//
// More information of Gurux products: https://www.gurux.org
//
// This code is licensed under the GNU General Public License v2. 
// Full text may be retrieved at http://www.gnu.org/licenses/gpl-2.0.txt
//---------------------------------------------------------------------------

package gurux.dlms;

import java.util.HashMap;

import gurux.dlms.enums.DataType;
import gurux.dlms.enums.TranslatorOutputType;
import gurux.dlms.internal.GXCommon;

/**
 * This class is used internally in GXDLMSTranslator to save generated XML.
 */
public class GXDLMSTranslatorStructure {
    // Is comment added already. Nested comments are not allowed in a XML.
    int commentsIndex = 0;
    private StringBuilder sb = new StringBuilder();
    private HashMap tags;

    private final TranslatorOutputType outputType;
    /**
     * Are numeric values shows as hex.
     */
    private boolean showNumericsAsHex;

    /**
     * Name space is omit.
     */
    private boolean omitNameSpace;

    /**
     * Is string serialized as hex.
     */
    private boolean showStringAsHex;

    /**
     * Amount of spaces.
     */
    private int offset;
    /**
     * Add comments.
     */
    private boolean comments;

    /**
     * @return Amount of spaces.
     */
    public final TranslatorOutputType getOutputType() {
        return outputType;
    }

    /**
     * @return Amount of spaces.
     */
    public final int getOffset() {
        return offset;
    }

    /**
     * @param value
     *            Amount of spaces.
     */
    public final void setOffset(final int value) {
        if (value < 0) {
            throw new IllegalArgumentException("offset");
        }
        offset = value;
    }

    public final boolean getShowStringAsHex() {
        return showStringAsHex;
    }

    final void setShowStringAsHex(final boolean value) {
        showStringAsHex = value;
    }

    /*
     * Constructor.
     * @param list List of tags.
     */
    GXDLMSTranslatorStructure(final TranslatorOutputType type, final boolean omitNS, final boolean numericAshex,
            final boolean hex, final boolean addComments, final HashMap list) {
        outputType = type;
        omitNameSpace = omitNS;
        showNumericsAsHex = numericAshex;
        setShowStringAsHex(hex);
        tags = list;
        comments = addComments;
    }

    @Override
    public final String toString() {
        return sb.toString();
    }

    public final String getDataType(final DataType type) {
        return getTag(GXDLMS.DATA_TYPE_OFFSET + type.getValue());
    }

    /**
     * Append spaces to the buffer.
     * 
     * @param count
     *            Amount of spaces.
     */
    private static void appendSpaces(final StringBuilder sb, final int count) {
        for (int pos = 0; pos != count; ++pos) {
            sb.append(' ');
        }
    }

    private String getTag(final int tag) {
        String tmp = tags.get(tag);
        if (getOutputType() == TranslatorOutputType.SIMPLE_XML || omitNameSpace) {
            return tmp;
        }
        return "x:" + tmp;
    }

    public final void appendLine(final String str) {
        appendSpaces(sb, 2 * offset);
        sb.append(str);
        sb.append('\r');
        sb.append('\n');
    }

    public final void appendLine(final int tag, final String name, final String value) {
        String tmp = getTag(tag);
        if (tmp == null) {
            throw new IllegalArgumentException("Tag");
        }
        appendLine(tmp, name, value);
    }

    public final void appendLine(final String tag, final String name, final String value) {
        appendSpaces(sb, 2 * offset);
        sb.append('<');
        sb.append(tag);
        if (outputType == TranslatorOutputType.SIMPLE_XML) {
            sb.append(' ');
            if (name == null) {
                sb.append("Value");
            } else {
                sb.append(name);
            }
            sb.append("=\"");
        } else {
            sb.append('>');
        }
        sb.append(value);
        if (outputType == TranslatorOutputType.SIMPLE_XML) {
            sb.append("\" />");
        } else {
            sb.append("');
        }
        sb.append('\r');
        sb.append('\n');
    }

    /**
     * Append comment.
     * 
     * @param comment
     *            Comment to add.
     */
    public final void appendComment(final String comment) {
        if (comments) {
            appendSpaces(sb, 2 * offset);
            if (commentsIndex == 0) {
                sb.append("");
            } else {
                sb.append("# ");
                sb.append(comment);
            }
            sb.append('\r');
            sb.append('\n');
        }
    }

    /**
     * Start comment section.
     * 
     * @param comment
     *            Comment to add.
     */
    public void startComment(final String comment) {
        if (comments) {
            appendSpaces(sb, 2 * offset);
            if (commentsIndex == 0) {
                sb.append("");
            }
            sb.append('\r');
            sb.append('\n');
        }
    }

    public final void append(final String value) {
        sb.append(value);
    }

    public final void append(final int tag, final boolean start) {
        if (start) {
            appendSpaces(sb, 2 * offset);
            sb.append('<');
        } else {
            sb.append("');
    }

    public final void appendStartTag(final int tag, final String name, final String value) {
        appendStartTag(getTag(tag), name, value);
    }

    public final void appendStartTag(final String tag, final String name, final String value) {
        appendSpaces(sb, 2 * offset);
        sb.append('<');
        sb.append(tag);
        if (outputType == TranslatorOutputType.SIMPLE_XML && name != null) {
            sb.append(' ');
            sb.append(name);
            sb.append("=\"");
            sb.append(value);
            sb.append("\" >");
        } else {
            sb.append('>');
        }
        sb.append('\r');
        sb.append('\n');
        ++offset;
    }

    public final void appendStartTag(final int tag) {
        appendStartTag(tag, false);
    }

    public final void appendStartTag(final int tag, final boolean plain) {
        String tmp = getTag(tag);
        if (tmp == null) {
            throw new IllegalArgumentException("appendStartTag");
        }
        appendSpaces(sb, 2 * offset);
        sb.append("<");
        sb.append(tmp);
        sb.append('>');
        if (!plain) {
            sb.append('\r');
            sb.append('\n');
        }
        ++offset;
    }

    public final void appendStartTag(final int cmd, final byte type) {
        appendStartTag(cmd << 8 | type);
    }

    public final void appendEndTag(final int cmd, final byte type) {
        appendEndTag(cmd << 8 | type);
    }

    public final void appendEndTag(final int tag, final boolean plain) {
        appendEndTag(getTag(tag), plain);
    }

    public final void appendEndTag(final int tag) {
        appendEndTag(getTag(tag));
    }

    public final void appendEndTag(final String tag) {
        appendEndTag(tag, false);
    }

    public final void appendEndTag(final String tag, final boolean plain) {
        setOffset(getOffset() - 1);
        if (!plain) {
            appendSpaces(sb, 2 * offset);
        }
        sb.append("');
        sb.append('\r');
        sb.append('\n');
    }

    public final void appendEmptyTag(final int tag) {
        appendEmptyTag(getTag(tag));
    }

    public final void appendEmptyTag(final String tag) {
        appendSpaces(sb, 2 * offset);
        sb.append("<");
        sb.append(tag);
        sb.append('/');
        sb.append('>');
        sb.append('\r');
        sb.append('\n');
    }

    /**
     * Remove \r\n.
     */
    public final void trim() {
        sb.setLength(sb.length() - 2);
    }

    /**
     * @return XML Length.
     */
    public final int getXmlLength() {
        return sb.length();
    }

    /**
     * @param value
     *            Set XML Length.
     */
    public final void setXmlLength(final int value) {
        sb.setLength(value);
    }

    /**
     * Convert integer to string.
     * 
     * @param value
     *            Converted value.
     * @param desimals
     *            Amount of decimals.
     * @return Integer as string.
     */
    public final String integerToHex(final long value, final int desimals) {
        return integerToHex(value, desimals, false);
    }

    /**
     * Convert integer to string.
     * 
     * @param value
     *            Converted value.
     * @param desimals
     *            Amount of decimals.
     * @param forceHex
     *            Force value as hex.
     * @return Integer as string.
     */
    public final String integerToHex(final long value, final int desimals, final boolean forceHex) {
        if (forceHex || (showNumericsAsHex && outputType == TranslatorOutputType.SIMPLE_XML)) {
            return GXCommon.integerToHex(value, desimals);
        }
        return String.valueOf(value);
    }

    /**
     * Convert integer to string.
     * 
     * @param value
     *            Converted value.
     * @param desimals
     *            Amount of decimals.
     * @return Integer as string.
     */
    public final String integerToHex(final Object value, final int desimals) {
        if (showNumericsAsHex && outputType == TranslatorOutputType.SIMPLE_XML) {
            return GXCommon.integerToHex(value, desimals);
        }
        return String.valueOf(value);
    }

    /**
     * @return Are comments added.
     */
    public boolean isComments() {
        return comments;
    }

    /**
     * @param value
     *            Are comments added.
     */
    public void setComments(final boolean value) {
        comments = value;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy