+ /**\r
+ * @param sddNamespace\r
+ * @param root\r
+ * @param elNodes\r
+ */\r
+ private void handleCharacterNodes(Namespace sddNamespace, FeatureNode root, Element elNodes) {\r
+ List<Element> listNodes = elNodes.getChildren("Node", sddNamespace);\r
+ if (listNodes != null) {\r
+ for (Element elNode : listNodes){\r
+ String idN = elNode.getAttributeValue("id");\r
+ FeatureNode fn = null;\r
+ Feature dc = null;\r
+ if (idN!=null) {\r
+ // DescriptiveConcepts are used as nodes in CharacterTrees\r
+ Element elDescriptiveConcept = elNode.getChild("DescriptiveConcept", sddNamespace);\r
+ if (elDescriptiveConcept != null){\r
+ String refDC = elDescriptiveConcept.getAttributeValue("ref");\r
+ dc = features.get(refDC);\r
+ fn = FeatureNode.NewInstance(dc);\r
+ }\r
+ if (fn==null){\r
+ fn = FeatureNode.NewInstance();\r
+ }\r
+ Element elParent = elNode.getChild("Parent", sddNamespace);\r
+ // in SDD links between Nodes are referenced by the <Parent> tag\r
+ if (elParent!=null){\r
+ String refP = elParent.getAttributeValue("ref");\r
+ if (refP!=null) {\r
+ FeatureNode parent = featureNodes.get(refP);\r
+ if (parent==null){\r
+ root.addChild(fn); // if no parent found or the reference is broken, add the node to the root of the tree\r
+ }\r
+ else {\r
+ parent.addChild(fn);\r
+ }\r
+ }\r
+ }\r
+ else {\r
+ root.addChild(fn); // if no parent found or the reference is broken, add the node to the root of the tree\r
+ }\r
+ }\r
+ featureNodes.put(idN, fn);\r
+ }\r
+ }\r
+\r
+ // Leaves of CharacterTrees in SDD are always CharNodes (referring to Characters)\r
+ List<Element> listCharNodes = elNodes.getChildren("CharNode", sddNamespace);\r
+ if (listCharNodes != null) {\r
+ for (Element elCharNode : listCharNodes){\r
+ Element elParent = elCharNode.getChild("Parent", sddNamespace);\r
+ Element elCharacter = elCharNode.getChild("Character", sddNamespace);\r
+ Element elDependencyRules = elCharNode.getChild("DependencyRules", sddNamespace);\r
+ FeatureNode fn = FeatureNode.NewInstance();\r
+ \r
+ if (elDependencyRules!=null){\r
+ Element elInapplicableIf = elCharNode.getChild("InapplicableIf", sddNamespace);\r
+ if (elInapplicableIf!=null){\r
+ List<Element> listStates = elInapplicableIf.getChildren("State", sddNamespace);\r
+ for (Element stateElement : listStates) {\r
+ String refState = stateElement.getAttributeValue("ref");\r
+ if ((refState!=null)&&(!refState.equals(""))) {\r
+ State state = states.get(refState);\r
+ fn.addInapplicableState(state);\r
+ }\r
+ }\r
+ }\r
+ Element elOnlyapplicableIf = elCharNode.getChild("OnlyApplicableIf", sddNamespace);\r
+ if (elOnlyapplicableIf!=null){\r
+ List<Element> listStates = elInapplicableIf.getChildren("State", sddNamespace);\r
+ for (Element stateElement : listStates) {\r
+ String refState = stateElement.getAttributeValue("ref");\r
+ if ((refState!=null)&&(!refState.equals(""))) {\r
+ State state = states.get(refState);\r
+ fn.addApplicableState(state);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ if (elParent!=null){\r
+ String refP = elParent.getAttributeValue("ref");\r
+ if ((refP!=null)&&(!refP.equals(""))) {\r
+ FeatureNode parent = featureNodes.get(refP);\r
+ if (parent==null){\r
+ parent = root; // if no parent found or the reference is broken, add the node to the root of the tree\r
+ }\r
+ parent.addChild(fn);\r
+ }\r
+ }\r
+ String refC = elCharacter.getAttributeValue("ref");\r
+ if ((refC!=null)&&(!refC.equals(""))){\r
+ Feature character = features.get(refC);\r
+ fn.setFeature(character);\r
+ featureNodes.put(refC, fn);\r
+ }\r
+ } \r
+ }\r
+ }\r
+\r