diff --git a/src/main/java/avatartranslator/AvatarDataType.java b/src/main/java/avatartranslator/AvatarDataType.java index 56f14b9a2ac57f9685c7b7eb03cc35d649f50e7e..47357c0aa360c42ee0712553d5d3f3f356674389 100644 --- a/src/main/java/avatartranslator/AvatarDataType.java +++ b/src/main/java/avatartranslator/AvatarDataType.java @@ -1,25 +1,27 @@ package avatartranslator; +import myutil.NameChecker; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -public class AvatarDataType { +public class AvatarDataType extends AvatarElement implements NameChecker.NameStartWithUpperCase { public final static int INTEGER = 0; public final static int BOOLEAN = 1; public final static int DATATYPE = 2; public static Map<String,AvatarDataType> dataTypeMap = new HashMap<String,AvatarDataType>(); - private String name; - private List<String> fieldStrings; - private List<Integer> fieldStringTypes; - private List<String> fieldNames; - private List<Integer> fieldTypes; - private List<String> dataTypeNames; + + private List<String> fieldStrings; // list of all primitive fields, unrolling sub-datatypes + private List<Integer> fieldStringTypes; // list of primitive types associated to fieldStrings + private List<String> fieldNames; // list of direct fields + private List<Integer> fieldTypes; // types of direct fields + private List<String> dataTypeNames; // datatypes of direct fields (null for primitive types) private int fullSize; - public AvatarDataType(String _name) { - name = _name; + public AvatarDataType(String _name, Object _referenceObject) { + super(_name, _referenceObject); fieldStrings = new ArrayList<String>(); fieldStringTypes = new ArrayList<Integer>(); fieldNames = new ArrayList<String>(); @@ -27,7 +29,6 @@ public class AvatarDataType { dataTypeNames = new ArrayList<String>(); fullSize = -1; } - public String getName() { return name; } public int getFullSize() { return fullSize; } public int getNbFields() { return fieldNames.size(); } public String getFieldName(int _i) { return fieldNames.get(_i); } @@ -35,6 +36,7 @@ public class AvatarDataType { public int getFieldStringType(int _i) { return fieldStringTypes.get(_i); } public int getFieldType(int _i) { return fieldTypes.get(_i); } public String getDataTypeName(int _i) { return dataTypeNames.get(_i); } + public void addField(String _fieldName, int _fieldType, String _dataTypeName) { if (fullSize != -1) return; // DataType has already been finalized if (_fieldType == AvatarDataType.INTEGER || _fieldType == AvatarDataType.BOOLEAN) @@ -76,4 +78,47 @@ public class AvatarDataType { } adt.fullSize = size; } + public String toString() { + //Thread.currentThread().dumpStack(); + StringBuffer sb = new StringBuffer("DataType:" + getName() + " ID=" + getID() + " \n"); + int size = fieldNames.size(); + for (int i = 0; i < size; i++) { + String type; + if (fieldTypes.get(i) == AvatarDataType.INTEGER) type = "Integer"; + else if (fieldTypes.get(i) == AvatarDataType.BOOLEAN) type = "Boolean"; + else type = dataTypeNames.get(i); + sb.append(" field: " + fieldNames.get(i) + ", type = " + type + "\n"); + } + return sb.toString(); + } + public String toStringRecursive() { return toString(); } + public String toShortString() { return toString(); } + public int getIndexOfFieldWithName(String _name) { + int cpt = 0; + for (String fieldName : fieldNames) { + if (fieldName.compareTo(_name) == 0) { + return cpt; + } + cpt++; + } + return -1; + } + + public AvatarDataType advancedClone() { + AvatarDataType adt = new AvatarDataType(getName(), getReferenceObject()); + int size = fieldNames.size(); + for (int i=0; i < size; i++) { + adt.fieldNames.add(fieldNames.get(i)); + adt.fieldTypes.add(fieldTypes.get(i)); + adt.dataTypeNames.add(dataTypeNames.get(i)); + } + size = fieldStrings.size(); + for (int i=0; i < size; i++) { + adt.fieldStrings.add(fieldStrings.get(i)); + adt.fieldStringTypes.add(fieldStringTypes.get(i)); + } + adt.fullSize = fullSize; + return adt; + } + } diff --git a/src/main/java/avatartranslator/AvatarSpecification.java b/src/main/java/avatartranslator/AvatarSpecification.java index 06f28f937056e6e6af4ebe2a7b39a37d919aa44e..700c217a7a5283f3f83f06b19e446d4bfb90d6ac 100644 --- a/src/main/java/avatartranslator/AvatarSpecification.java +++ b/src/main/java/avatartranslator/AvatarSpecification.java @@ -44,6 +44,7 @@ import myutil.Conversion; import myutil.NameChecker; import myutil.TraceManager; import myutil.intboolsolver.IBSParamSpec; +import org.apache.derby.iapi.types.DataType; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java index 9b59150679d113b550dc2eb46337d6e13c616b2f..3c949a6359de03ee53232b7f2e9720e77c715a6b 100644 --- a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java +++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java @@ -170,7 +170,7 @@ public class AvatarFromSysML { private class BuildDataType implements BiConsumer<String, StxDataType> { public BuildDataType(){} public void accept(String n, StxDataType d) { - AvatarDataType dataType = new AvatarDataType(d.getName()); + AvatarDataType dataType = new AvatarDataType(d.getName(),null); AvatarDataType.dataTypeMap.put(d.getName(), dataType); avSpec.getDataTypes().add(dataType); int nbFields = d.getSize(); @@ -573,4 +573,16 @@ public class AvatarFromSysML { } } } + void rebuildDataTypes(AvatarSpecification as){} + // handle attribute list + // handle signal profiles + // handle methods (profiles and return type + // statemachine state: handle send action + // statemachine state: handle receive action + // statemachine transaction: handle method call + // statemachine transaction: handle assignment target + // statemachine transaction: handle right method call + // handle expressions in ui ??? + + } diff --git a/src/main/java/ui/AvatarDesignPanelTranslator.java b/src/main/java/ui/AvatarDesignPanelTranslator.java index 6f5f801b0a8cf36bc1376d9d4bbed46afcf0b6d8..8cd2a283fc37d83c8790199c0677ac5b13741075 100644 --- a/src/main/java/ui/AvatarDesignPanelTranslator.java +++ b/src/main/java/ui/AvatarDesignPanelTranslator.java @@ -87,6 +87,7 @@ public class AvatarDesignPanelTranslator { public AvatarSpecification generateAvatarSpecification(List<AvatarBDStateMachineOwner> _blocks) { List<AvatarBDBlock> blocks = new LinkedList<AvatarBDBlock>(); List<AvatarBDLibraryFunction> libraryFunctions = new LinkedList<AvatarBDLibraryFunction>(); + List<AvatarBDDataType> listOfDataTypes = new LinkedList<>(); for (AvatarBDStateMachineOwner owner : _blocks) if (owner instanceof AvatarBDBlock) @@ -100,15 +101,25 @@ public class AvatarDesignPanelTranslator { AvatarSpecification as = new AvatarSpecification("avatarspecification", adp); + //TraceManager.addDev("Getting graphical data types"); if (adp != null) { AvatarBDPanel abdp = adp.getAvatarBDPanel(); if (abdp != null) { as.addApplicationCode(abdp.getMainCode()); + for(TGComponent tgc: abdp.getAllComponentList()) { + if (tgc instanceof AvatarBDDataType) { + listOfDataTypes.add((AvatarBDDataType)(tgc)); + } + } + // Find data types } } + + TraceManager.addDev("Nb of data types: " + listOfDataTypes.size()); + typeAttributesMap = new HashMap<String, List<TAttribute>>(); nameTypeMap = new HashMap<String, String>(); - createDataTypes(as); + createDataTypes(as, listOfDataTypes); createLibraryFunctions(as, libraryFunctions); createBlocks(as, blocks); //createInterfaces(as, interfaces); @@ -1044,14 +1055,13 @@ public class AvatarDesignPanelTranslator { dataTypeList.add(d); } } - public void createDataTypes(AvatarSpecification as) { + public void createDataTypes(AvatarSpecification as, List<AvatarBDDataType> _dataTypes) { AvatarDataType.dataTypeMap.clear(); - for (TGComponent tgc : adp.getAvatarBDPanel().getComponentList()) - if (tgc instanceof AvatarBDDataType) { - AvatarBDDataType tgdt = (AvatarBDDataType)tgc; - String dtName = tgdt.getDataTypeName(); - AvatarDataType dataType = new AvatarDataType(dtName); - List<TAttribute> fields = tgdt.getAttributeList(); + + for (AvatarBDDataType dtt : _dataTypes) { + String dtName = dtt.getDataTypeName(); + AvatarDataType dataType = new AvatarDataType(dtName,dtt); + List<TAttribute> fields = dtt.getAttributeList(); for (TAttribute f : fields) { if(f.getType() == TAttribute.INTEGER || f.getType() == TAttribute.NATURAL) dataType.addField(f.getId(), AvatarDataType.INTEGER, null); @@ -1061,7 +1071,7 @@ public class AvatarDesignPanelTranslator { dataType.addField(f.getId(), AvatarDataType.DATATYPE, f.getTypeOther()); } AvatarDataType.dataTypeMap.put(dtName, dataType); - } + } AvatarDataType.dataTypeMap.forEach(new FinalizeAvatarDataType(as.getDataTypes())); } @@ -1080,7 +1090,7 @@ public class AvatarDesignPanelTranslator { aa.setInitialValue(_a.getInitialValue()); aa.setAsConstant(_a.isConstant()); - if ( (originAttribute != null) && (originAttribute.isConstant()) ) { + if ((originAttribute != null) && (originAttribute.isConstant())) { aa.setAsConstant(true); } @@ -2385,6 +2395,7 @@ public class AvatarDesignPanelTranslator { int index2 = actionText.indexOf(";"); if (index2 != -1) { + makeError(error, connector.tdp, block, connector, "transition action", actionText); } @@ -2944,7 +2955,7 @@ public class AvatarDesignPanelTranslator { String s = _input.substring(index0 + 1, index1).trim(); - String end = _input.substring(index1+1).trim(); + String end = _input.substring(index1 + 1).trim(); //TraceManager.addDev("end>" + end + "<"); if (end.length() > 0) { return null;