OpenTTCN/Developer corner/Implementing external functions/Skeletons/Java/CD impl.java

From OpenTTCN

Jump to: navigation, search

  OpenTTCN DocZone

  Home | Developer's corner | Knowledge base | Working documents | Documentation | OpenTTCN IDE | Tutorials | Training | How do I | Frequently asked questions | Technical support


CD_impl.java


Back to main article >>

package extFuncAdapter;

import org.etsi.ttcn.tci.*;
import org.etsi.ttcn.tri.*;

import com.openttcn.sdk.StartHereCD;
import com.openttcn.sdk.FormatConverter;
import com.openttcn.sdk.TriFactory;
import com.openttcn.sdk.AdapterException;

class CD_impl implements TciCDProvided {

    private TriMessage stringToTriMessage(String buffer) {

        byte[] bufferBytes = null;

        try {
            bufferBytes = buffer.getBytes("UTF-8");
        }
        catch (java.io.UnsupportedEncodingException e) {
            throw new AdapterException(e);
        }

        return TriFactory.createTriMessage(bufferBytes);
    }

    private static String triMessageToString(TriMessage message) {

        String s = null;

        try {
            s = new String(message.getEncodedMessage(), "UTF-8");
        }
        catch (java.io.UnsupportedEncodingException e) {
            throw new AdapterException(e);
        }

        return s;
    }

    public TriMessage encode(Value value) {

        System.out.println("encode(): value = " +
            ((value != null) ? value.toString() : "null"));

        if (value.getType().getTypeClass() == TciTypeClass.CHARSTRING) {

            CharstringValue v = (CharstringValue) value;

            String buffer = "TypeCode=charstring:TypeName=" +
                value.getType().getName() + ":Value=" +
                FormatConverter.charstringToOctetstring(
                    v.getString().substring(1, v.getLength() + 1));

            return stringToTriMessage(buffer);
        }
        else if (value.getType().getTypeClass() == TciTypeClass.INTEGER) {

            IntegerValue v = (IntegerValue) value;

            String buffer = "TypeCode=integer:TypeName=" +
                value.getType().getName() + ":Value=" + v.toString();

            return stringToTriMessage(buffer);
        }

        throw new AdapterException(
            "Unable to encode value '" + value.toString() + "'.");
    }

    public Value decode(
        TriMessage message,
        Type decodingHypothesis) {

        TciCDRequired req = StartHereCD.getTciCDRequired();

        String s = triMessageToString(message);

        String[] elems = FormatConverter.split(s, ':');

        String typeCode = "";
        String typeName = "";
        String value = "";

        for (String elem : elems) {

            String[] subelems = FormatConverter.split(elem, '=');

            String subelemTag = subelems[0];
            String subelemValue = subelems[1];

            if (subelemTag.equals("TypeCode")) typeCode = subelemValue;
            else if (subelemTag.equals("TypeName")) typeName = subelemValue;
            else if (subelemTag.equals("Value")) value = subelemValue;
            else {
                throw new AdapterException(
                    "Unrecognized element tag in element: " + elem + ".");
            }
        }

        if (typeCode.equals("charstring")) {

            CharstringValue result =
                (CharstringValue) req.getTypeForName(typeName).newInstance();

            result.setString("\"" + FormatConverter.octetstringToCharstring(value) + "\"");

            return result;
        }
        else if (typeCode.equals("integer")) {

            IntegerValue result =
                (IntegerValue) req.getTypeForName(typeName).newInstance();

            ((com.openttcn.sdk.IntegerValue) result).setValue(Long.parseLong(value));

            return result;
        }

        throw new AdapterException("Unable to decode value '" + s + "'.");
    }
}
Views
Personal tools