Skip to content

Commit

Permalink
- TranslateToTranslation: implement mapping of enum ALL OF (claeis/il…
Browse files Browse the repository at this point in the history
…i2db#439)

- TranslateToOrigin: implement mapping of enum ALL OF (claeis/ili2db#439)
  • Loading branch information
claeis committed Apr 27, 2022
1 parent 1dfbc62 commit d9b3fbc
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 5 deletions.
2 changes: 2 additions & 0 deletions doc/CHANGES.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ LATEST
- Validator: objectCount() throws NPE (ilivalidator#337)
- Validator: Speed of AREA-Constraint vs areAreas() (ilivalidator#308)
- Validator: remove result caching in areAreas(), areAreas2(), areAreas3() (#107)
- TranslateToTranslation: implement mapping of enum ALL OF (ili2db#439)
- TranslateToOrigin: implement mapping of enum ALL OF (ili2db#439)
- iox2wkb: split self-touching lines of polygon boundaries (ili2db#437)
- ReaderFactory: fix/close a left open ItfReader2
- ItfReader2: use ioxFactory to create objects read back from objPool to keep custom types
Expand Down
30 changes: 29 additions & 1 deletion src/main/java/ch/interlis/iox_j/filter/TranslateToOrigin.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import ch.interlis.ili2c.metamodel.AttributeDef;
import ch.interlis.ili2c.metamodel.CompositionType;
import ch.interlis.ili2c.metamodel.Element;
import ch.interlis.ili2c.metamodel.EnumTreeValueType;
import ch.interlis.ili2c.metamodel.Enumeration;
import ch.interlis.ili2c.metamodel.EnumerationType;
import ch.interlis.ili2c.metamodel.ObjectType;
Expand Down Expand Up @@ -149,10 +150,15 @@ private void translateAttrValue(IomObject iomObj, AttributeDef attr) {
}
boolean isCompType=attr.getDomain() instanceof CompositionType ? true :false;
boolean isEnumType=attr.getDomainResolvingAliases() instanceof EnumerationType ? true : false;
boolean isEnumAllType=attr.getDomainResolvingAliases() instanceof EnumTreeValueType ? true : false;
EnumerationType enumType=null;
if(isEnumType){
enumType=(EnumerationType)attr.getDomainResolvingAliases();
}
EnumTreeValueType enumAllType=null;
if(isEnumAllType){
enumAllType=(EnumTreeValueType)attr.getDomainResolvingAliases();
}
AttributeDef destAttr=(AttributeDef)attr.getTranslationOfOrSame();
String destAttrName=destAttr.getName();
ArrayList<Object> attrValues=new ArrayList<Object>();
Expand All @@ -172,6 +178,8 @@ private void translateAttrValue(IomObject iomObj, AttributeDef attr) {
if(attrValue instanceof String){
if(isEnumType){
attrValue=translateEnumValue((String)attrValue,enumType,(EnumerationType)destAttr.getDomainResolvingAliases());
}else if(isEnumAllType) {
attrValue=translateEnumAllValue((String)attrValue,enumAllType,(EnumTreeValueType)destAttr.getDomainResolvingAliases());
}
iomObj.setattrvalue(destAttrName, (String)attrValue);
}else{
Expand All @@ -190,9 +198,14 @@ private String translateEnumValue(String attrValue, EnumerationType enumType,Enu
String destValue=src2dest.get(attrValue);
return destValue;
}
private String translateEnumAllValue(String attrValue, EnumTreeValueType enumType,EnumTreeValueType destEnumType) {
Map<String,String> src2dest=getEnumAllMapping(enumType,destEnumType);
String destValue=src2dest.get(attrValue);
return destValue;
}


Map<EnumerationType,Map<String,String>> src2destEles=new HashMap<EnumerationType,Map<String,String>>();
Map<Type,Map<String,String>> src2destEles=new HashMap<Type,Map<String,String>>();
private Map<String, String> getEnumMapping(
EnumerationType enumType,EnumerationType destEnumType) {
Map<String,String> src2dest=src2destEles.get(enumType);
Expand All @@ -208,6 +221,21 @@ private Map<String, String> getEnumMapping(
}
return src2dest;
}
private Map<String, String> getEnumAllMapping(
EnumTreeValueType enumType,EnumTreeValueType destEnumType) {
Map<String,String> src2dest=src2destEles.get(enumType);
if(src2dest==null){
Enumeration eles=enumType.getConsolidatedEnumeration();
src2dest=new HashMap<String,String>();
List<String> srcVals=enumType.getValues();
List<String> destVals=destEnumType.getValues();
for(int i=0;i<srcVals.size();i++){
src2dest.put(srcVals.get(i),destVals.get(i));
}
src2destEles.put(enumType,src2dest);
}
return src2dest;
}


@Override
Expand Down
34 changes: 31 additions & 3 deletions src/main/java/ch/interlis/iox_j/filter/TranslateToTranslation.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import ch.interlis.ili2c.metamodel.CompositionType;
import ch.interlis.ili2c.metamodel.Container;
import ch.interlis.ili2c.metamodel.Element;
import ch.interlis.ili2c.metamodel.EnumTreeValueType;
import ch.interlis.ili2c.metamodel.Enumeration;
import ch.interlis.ili2c.metamodel.EnumerationType;
import ch.interlis.ili2c.metamodel.ExtendableContainer;
Expand Down Expand Up @@ -126,7 +127,7 @@ public IoxEvent filter(IoxEvent event) throws IoxException {
}
private void resetMapping() {
srctag2destElement=new HashMap<String,Element>();
src2destEles=new HashMap<EnumerationType,Map<String,String>>();
src2destEles=new HashMap<Type,Map<String,String>>();
}

private void translateObject(IomObject iomObj) {
Expand Down Expand Up @@ -219,10 +220,15 @@ private void translateAttrValue(IomObject iomObj, AttributeDef attr) {
}
boolean isCompType=attr.getDomain() instanceof CompositionType ? true :false;
boolean isEnumType=attr.getDomainResolvingAliases() instanceof EnumerationType ? true : false;
boolean isEnumAllType=attr.getDomainResolvingAliases() instanceof EnumTreeValueType ? true : false;
EnumerationType enumType=null;
EnumTreeValueType enumAllType=null;
if(isEnumType){
enumType=(EnumerationType)attr.getDomainResolvingAliases();
}
if(isEnumAllType){
enumAllType=(EnumTreeValueType)attr.getDomainResolvingAliases();
}
AttributeDef destAttr=(AttributeDef)getTranslatedElement(attr);
String destAttrName=destAttr.getName();
ArrayList<Object> values=new ArrayList<Object>();
Expand All @@ -242,7 +248,9 @@ private void translateAttrValue(IomObject iomObj, AttributeDef attr) {
if(attrValue instanceof String){
if(isEnumType){
attrValue=translateEnumValue((String)attrValue,enumType,(EnumerationType)destAttr.getDomainResolvingAliases());
}
}else if(isEnumAllType){
attrValue=translateEnumAllValue((String)attrValue,enumAllType,(EnumTreeValueType)destAttr.getDomainResolvingAliases());
}
iomObj.setattrvalue(destAttrName, (String)attrValue);
}else{
IomObject structValue=(IomObject)attrValue;
Expand All @@ -261,9 +269,14 @@ private String translateEnumValue(String attrValue, EnumerationType enumType,Enu
String destValue=src2dest.get(attrValue);
return destValue;
}
private String translateEnumAllValue(String attrValue, EnumTreeValueType enumType,EnumTreeValueType destEnumType) {
Map<String,String> src2dest=getEnumAllMapping(enumType,destEnumType);
String destValue=src2dest.get(attrValue);
return destValue;
}


Map<EnumerationType,Map<String,String>> src2destEles=null;
Map<Type,Map<String,String>> src2destEles=null;
private Map<String, String> getEnumMapping(
EnumerationType enumType,EnumerationType destEnumType) {
Map<String,String> src2dest=src2destEles.get(enumType);
Expand All @@ -279,6 +292,21 @@ private Map<String, String> getEnumMapping(
}
return src2dest;
}
private Map<String, String> getEnumAllMapping(
EnumTreeValueType enumType,EnumTreeValueType destEnumType) {
Map<String,String> src2dest=src2destEles.get(enumType);
if(src2dest==null){
Enumeration eles=enumType.getConsolidatedEnumeration();
src2dest=new HashMap<String,String>();
List<String> srcVals=enumType.getValues();
List<String> destVals=destEnumType.getValues();
for(int i=0;i<srcVals.size();i++){
src2dest.put(srcVals.get(i),destVals.get(i));
}
src2destEles.put(enumType,src2dest);
}
return src2dest;
}


@Override
Expand Down
10 changes: 9 additions & 1 deletion src/test/data/filter/enumOk.ili
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,14 @@ INTERLIS 2.3;

MODEL EnumOkA (de) AT "http://www.interlis.ch/ili2c/tests/" VERSION "1" =

DOMAIN
EnumA = (a1,a2(a21,a22));

TOPIC TopicA =

CLASS ClassA =
attrA : (a1,a2(a21,a22));
attrA2 : ALL OF EnumA;
END ClassA;

END TopicA;
Expand All @@ -16,10 +20,14 @@ MODEL EnumOkB (fr) AT "http://www.interlis.ch/ili2c/tests/" VERSION "1"
TRANSLATION OF EnumOkA [ "1"]
=

DOMAIN
EnumB = (b1,b2(b21,b22));

TOPIC TopicB =

CLASS ClassB =
attrB : (b1,b2(b21,b22));
attrB2 : ALL OF EnumB;
END ClassB;

END TopicB;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ public void simpleEnumToOrigin() throws Exception {
setUp("src/test/data/filter/enumOk.ili");
Iom_jObject iomObj=new Iom_jObject("EnumOkB.TopicB.ClassB", "o1");
iomObj.setattrvalue("attrB", "b2.b21");
iomObj.setattrvalue("attrB2", "b2");
Settings config=new Settings();
TranslateToOrigin filter=new TranslateToOrigin(td, config);
filter.filter(new StartTransferEvent());
Expand All @@ -48,12 +49,14 @@ public void simpleEnumToOrigin() throws Exception {
IomObject destObj = destObjEvent.getIomObject();
assertEquals("EnumOkA.TopicA.ClassA",destObj.getobjecttag());
assertEquals("a2.a21",destObj.getattrvalue("attrA"));
assertEquals("a2",destObj.getattrvalue("attrA2"));
}
@Test
public void simpleEnumToTranslation() throws Exception {
setUp("src/test/data/filter/enumOk.ili");
Iom_jObject iomObj=new Iom_jObject("EnumOkA.TopicA.ClassA", "o1");
iomObj.setattrvalue("attrA", "a2.a21");
iomObj.setattrvalue("attrA2", "a2");
Settings config=new Settings();
TranslateToTranslation filter=new TranslateToTranslation(td, config);
filter.filter(new StartTransferEvent());
Expand All @@ -66,6 +69,7 @@ public void simpleEnumToTranslation() throws Exception {
IomObject destObj = destObjEvent.getIomObject();
assertEquals("EnumOkB.TopicB.ClassB",destObj.getobjecttag());
assertEquals("b2.b21",destObj.getattrvalue("attrB"));
assertEquals("b2",destObj.getattrvalue("attrB2"));
}

}

0 comments on commit d9b3fbc

Please sign in to comment.