OpenTTCN/Developer corner/Implementing external functions/Final/Java/PA impl.java
From OpenTTCN
Home | Developer's corner | Knowledge base | Working documents | Documentation | OpenTTCN IDE | Tutorials | Training | How do I | Frequently asked questions | Technical support |
PA_impl.java
package extFuncAdapter;
import org.etsi.ttcn.tci.*;
import org.etsi.ttcn.tri.*;
import com.openttcn.sdk.StartHere;
import com.openttcn.sdk.StartHereCD;
import com.openttcn.sdk.TriFactory;
import java.util.Map;
import java.util.HashMap;
public class PA_impl implements org.etsi.ttcn.tri.TriPlatformPA {
/***************************************************************************
* Initialization of TRI interface (PA, user-provided part).
*/
private interface ExtFuncPtr {
public TriStatus refer(
TriFunctionId functionId,
TriParameterList parameterList,
TriParameter returnValue);
}
// Contains mappings of available external function implementations.
// Key is function name, value is function "pointer" implementing the
// external function with the specified name.
private static Map<String, ExtFuncPtr> _extFuncMap;
static {
_extFuncMap = new HashMap<String, ExtFuncPtr>();
_extFuncMap.put("ef_calc_sum", new ExtFuncPtr() {
public TriStatus refer(TriFunctionId functionId,
TriParameterList parameterList, TriParameter returnValue) {
return PA_impl.ef_calc_sum(functionId, parameterList, returnValue);
}
});
_extFuncMap.put("ef_calc_sub", new ExtFuncPtr() {
public TriStatus refer(TriFunctionId functionId,
TriParameterList parameterList, TriParameter returnValue) {
return PA_impl.ef_calc_sub(functionId, parameterList, returnValue);
}
});
_extFuncMap.put("ef_calc_mul", new ExtFuncPtr() {
public TriStatus refer(TriFunctionId functionId,
TriParameterList parameterList, TriParameter returnValue) {
return PA_impl.ef_calc_mul(functionId, parameterList, returnValue);
}
});
_extFuncMap.put("ef_calc_div", new ExtFuncPtr() {
public TriStatus refer(TriFunctionId functionId,
TriParameterList parameterList, TriParameter returnValue) {
return PA_impl.ef_calc_div(functionId, parameterList, returnValue);
}
});
_extFuncMap.put("ef_find_and_replace", new ExtFuncPtr() {
public TriStatus refer(TriFunctionId functionId,
TriParameterList parameterList, TriParameter returnValue) {
return PA_impl.ef_find_and_replace(functionId, parameterList, returnValue);
}
});
}
/***************************************************************************
* Implementation of TRI interface (PA, user-provided part).
*/
public TriStatus triExternalFunction(
TriFunctionId functionId,
TriParameterList parameterList,
TriParameter returnValue) {
String funcId = functionId.getFunctionName();
System.out.println("**************************************************************************");
System.out.println("*** DEBUG: triExternalFunction() callback called. Function: " + funcId);
if (_extFuncMap.containsKey(funcId))
{
return _extFuncMap.get(funcId).refer(functionId, parameterList, returnValue);
}
String errMsg = "Unrecognized external function " + funcId + " called.";
StartHere.reportError(errMsg);
return TriFactory.createTriStatus(TriStatus.TRI_ERROR);
}
public TriStatus triPAReset() {
return TriFactory.createTriStatus(TriStatus.TRI_OK);
}
public TriStatus triReadTimer(TriTimerId timerId, TriTimerDuration elapsedTime) {
return TriFactory.createTriStatus(TriStatus.TRI_ERROR);
}
public TriStatus triStartTimer(TriTimerId timerId, TriTimerDuration duration) {
return TriFactory.createTriStatus(TriStatus.TRI_ERROR);
}
public TriStatus triStopTimer(TriTimerId timerId) {
return TriFactory.createTriStatus(TriStatus.TRI_ERROR);
}
public TriStatus triTimerRunning(TriTimerId timerId, TriBoolean running) {
return TriFactory.createTriStatus(TriStatus.TRI_ERROR);
}
/***************************************************************************
* External function implementation helpers.
*/
public static long triParameterToLong(TriParameter src) {
CD_impl cd = new CD_impl();
TciCDRequired req = StartHereCD.getTciCDRequired();
IntegerValue v = (IntegerValue)
cd.decode(TriFactory.createTriMessage(src.getEncodedParameter()), req.getInteger());
return ((com.openttcn.sdk.IntegerValue) v).getValue();
}
public static void assignLongToTriParameter(TriParameter dst, long src) {
CD_impl cd = new CD_impl();
TciCDRequired req = StartHereCD.getTciCDRequired();
IntegerValue v = (IntegerValue) req.getInteger().newInstance();
((com.openttcn.sdk.IntegerValue) v).setValue(src);
TriMessage msg = cd.encode(v);
dst.setEncodedParameter(msg.getEncodedMessage());
dst.setNumberOfBits(msg.getNumberOfBits());
}
public static String triParameterToString(TriParameter src) {
CD_impl cd = new CD_impl();
TciCDRequired req = StartHereCD.getTciCDRequired();
CharstringValue v = (CharstringValue)
cd.decode(TriFactory.createTriMessage(src.getEncodedParameter()), req.getCharstring());
return ((com.openttcn.sdk.CharstringValue) v).getValue();
}
public static void assignStringToTriParameter(TriParameter dst, String src) {
CD_impl cd = new CD_impl();
TciCDRequired req = StartHereCD.getTciCDRequired();
CharstringValue v = (CharstringValue) req.getCharstring().newInstance();
((com.openttcn.sdk.CharstringValue) v).setValue(src);
TriMessage msg = cd.encode(v);
dst.setEncodedParameter(msg.getEncodedMessage());
dst.setNumberOfBits(msg.getNumberOfBits());
}
/***************************************************************************
* External function implementations.
*/
public static TriStatus ef_calc_sum(
TriFunctionId functionId,
TriParameterList parameterList,
TriParameter returnValue) {
assignLongToTriParameter(returnValue,
triParameterToLong(parameterList.get(0)) + triParameterToLong(parameterList.get(1)));
return TriFactory.createTriStatus(TriStatus.TRI_OK);
}
public static TriStatus ef_calc_sub(
TriFunctionId functionId,
TriParameterList parameterList,
TriParameter returnValue) {
assignLongToTriParameter(returnValue,
triParameterToLong(parameterList.get(0)) - triParameterToLong(parameterList.get(1)));
return TriFactory.createTriStatus(TriStatus.TRI_OK);
}
public static TriStatus ef_calc_mul(
TriFunctionId functionId,
TriParameterList parameterList,
TriParameter returnValue) {
assignLongToTriParameter(returnValue,
triParameterToLong(parameterList.get(0)) * triParameterToLong(parameterList.get(1)));
return TriFactory.createTriStatus(TriStatus.TRI_OK);
}
public static TriStatus ef_calc_div(
TriFunctionId functionId,
TriParameterList parameterList,
TriParameter returnValue) {
assignLongToTriParameter(returnValue,
triParameterToLong(parameterList.get(0)) / triParameterToLong(parameterList.get(1)));
return TriFactory.createTriStatus(TriStatus.TRI_OK);
}
private static void ef_find_and_replace_helper(
org.omg.CORBA.StringHolder str /* inout */,
String search_substr /* in */,
String new_substr /* in */,
org.omg.CORBA.LongHolder occurences_num /* out */) {
int i, len;
int substr_size = search_substr.length();
if (substr_size != new_substr.length()) {
StartHere.reportError("Strings size mismatch in ef_find_and_replace().");
occurences_num.value = -1;
return;
}
if (substr_size == 0) {
StartHere.reportError("Search string size is zero in ef_find_and_replace().");
occurences_num.value = -1;
return;
}
occurences_num.value = 0;
if (substr_size > str.value.length()) {
// No way bigger string can be a substring of the smaller one:
return;
}
StringBuilder sb = new StringBuilder();
len = str.value.length() - substr_size;
for (i = 0; i <= len; i++) {
if (str.value.substring(i, substr_size + i).equals(search_substr)) {
sb.append(new_substr);
occurences_num.value++;
i += substr_size - 1;
}
else {
sb.append(str.value.charAt(i));
}
}
if (i < str.value.length()) sb.append(str.value.substring(i, str.value.length()));
str.value = sb.toString();
}
public static TriStatus ef_find_and_replace(
TriFunctionId functionId,
TriParameterList parameterList,
TriParameter returnValue) {
org.omg.CORBA.StringHolder str = new org.omg.CORBA.StringHolder();
str.value = triParameterToString(parameterList.get(0));
String search_substr = triParameterToString(parameterList.get(1));
String new_substr = triParameterToString(parameterList.get(2));
org.omg.CORBA.LongHolder occurences_num = new org.omg.CORBA.LongHolder();
ef_find_and_replace_helper(
str, search_substr, new_substr, occurences_num);
// It is safe to assume that inout str always changes:
assignStringToTriParameter(parameterList.get(0), str.value);
// Perform mandatory assignment of occurences_num out parameter:
assignLongToTriParameter(parameterList.get(3), occurences_num.value);
// Duplicate occurences_num in the return value:
assignLongToTriParameter(returnValue, occurences_num.value);
return TriFactory.createTriStatus(TriStatus.TRI_OK);
}
}
