diff --git a/src/ui/AvatarDesignPanelTranslator.java b/src/ui/AvatarDesignPanelTranslator.java index 49f9d2bc93ae3008bbce93530cd4a1f40eacfad5..ea7f9ee50242ec3562543453fd74755593b8c056 100644 --- a/src/ui/AvatarDesignPanelTranslator.java +++ b/src/ui/AvatarDesignPanelTranslator.java @@ -217,8 +217,11 @@ public class AvatarDesignPanelTranslator { } } public boolean checkSafetyPragma(String _pragma, LinkedList<AvatarBDBlock> _blocks, AvatarSpecification as){ + //Todo: check types + //Todo: handle complex types _pragma = _pragma.trim(); - if (_pragma.contains("=") && !_pragma.contains("==")){ + if (_pragma.contains("=") && !(_pragma.contains("==") || _pragma.contains("<=") || _pragma.contains(">=") || _pragma.contains("!="))){ + //not a query return false; } String header = _pragma.split(" ")[0]; @@ -229,9 +232,9 @@ public class AvatarDesignPanelTranslator { if (!state1.contains(".") || !state2.contains(".")){ return false; } - if (state1.contains("==")){ - String p1 = state1.split("==")[0]; - String p2 = state1.split("==")[1]; + if (state1.contains("=")){ + String p1 = state1.split("==|>=|!=|<=")[0]; + String p2 = state1.split("==|>=|!=|<=")[1]; String block1 = p1.split("\\.")[0]; String attr1 = p1.split("\\.")[1]; AvatarBlock bl1 = as.getBlockWithName(block1); @@ -274,9 +277,9 @@ public class AvatarDesignPanelTranslator { } } //check the second half of implies - if (state2.contains("==")){ - String p1 = state2.split("==")[0]; - String p2 = state2.split("==")[1]; + if (state2.contains("=")){ + String p1 = state2.split("==|>=|!=|<=")[0]; + String p2 = state2.split("==|>=|!=|<=")[1]; String block1 = p1.split("\\.")[0]; String attr1 = p1.split("\\.")[1]; AvatarBlock bl1 = as.getBlockWithName(block1); @@ -320,12 +323,57 @@ public class AvatarDesignPanelTranslator { } } else if (header.equals("E[]") || header.equals("E<>") || header.equals("A[]") || header.equals("A<>")){ - return true; + String state = _pragma.replace("E[]","").replace("A[]","").replace("E<>","").replace("E<>",""); + + state = state.trim(); + if (state.contains("=")){ + String state1 = state.split("==|>=|!=|<=")[0]; + String state2 = state.split("==|>=|!=|<=")[1]; + String block1 = state1.split("\\.")[0]; + String attr1 = state1.split("\\.")[1]; + AvatarBlock bl1 = as.getBlockWithName(block1); + if (bl1 !=null){ + AvatarStateMachine asm = bl1.getStateMachine(); + if (bl1.getIndexOfAvatarAttributeWithName(attr1)==-1){ + return false; + } + } + else { + return false; + } + if (state2.contains(".")){ + String block2 = state2.split("\\.")[0]; + String attr2= state2.split("\\.")[1]; + AvatarBlock bl2 = as.getBlockWithName(block2); + if (bl2!=null){ + if (bl2.getIndexOfAvatarAttributeWithName(attr1)==-1){ + return false; + } + } + else { + return false; + } + } + } + else { + String block1 = state.split("\\.")[0]; + String attr1 = state.split("\\.")[1]; + AvatarBlock bl1 = as.getBlockWithName(block1); + if (bl1 !=null){ + AvatarStateMachine asm = bl1.getStateMachine(); + if (bl1.getIndexOfAvatarAttributeWithName(attr1)==-1 && asm.getStateWithName(attr1)==null){ + return false; + } + } + else { + return false; + } + } } else { return false; } - return false; + return true; } public String reworkPragma(String _pragma, LinkedList<AvatarBDBlock> _blocks) { String ret = "";