--- /dev/null
+/*\r
+ * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+package org.opendaylight.controller.yang.data.impl;\r
+\r
+import groovy.util.BuilderSupport;\r
+\r
+import java.net.URI;\r
+import java.net.URISyntaxException;\r
+import java.util.Date;\r
+import java.util.Map;\r
+import java.util.Map.Entry;\r
+\r
+import org.opendaylight.controller.yang.common.QName;\r
+import org.opendaylight.controller.yang.data.api.CompositeNode;\r
+import org.opendaylight.controller.yang.data.api.ModifyAction;\r
+import org.opendaylight.controller.yang.data.api.MutableCompositeNode;\r
+import org.opendaylight.controller.yang.data.api.Node;\r
+import org.opendaylight.controller.yang.data.api.SimpleNode;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+/**\r
+ * @author michal.rehak\r
+ *\r
+ */\r
+public class MyNodeBuilder extends BuilderSupport {\r
+ \r
+ private static final Logger LOG = LoggerFactory\r
+ .getLogger(MyNodeBuilder.class);\r
+\r
+ private URI qnNamespace;\r
+ private String qnPrefix;\r
+ private Date qnRevision;\r
+ \r
+ private CompositeNode rootNode;\r
+\r
+ /**\r
+ * @param baseQName\r
+ */\r
+ private MyNodeBuilder(QName baseQName) {\r
+ qnNamespace = baseQName.getNamespace();\r
+ qnPrefix = baseQName.getPrefix();\r
+ qnRevision = baseQName.getRevision();\r
+ }\r
+\r
+ /**\r
+ * @return initialized singleton instance\r
+ */\r
+ public static MyNodeBuilder newInstance() {\r
+ QName qName = null;\r
+ try {\r
+ qName = new QName(\r
+ new URI("urn:opendaylight:controller:network"), \r
+ new Date(42), "yang-data-impl-groovyTest_", null);\r
+ } catch (URISyntaxException e) {\r
+ LOG.error(e.getMessage(), e);\r
+ }\r
+ return new MyNodeBuilder(qName);\r
+ }\r
+\r
+ @Override\r
+ protected void setParent(Object parent, Object child) {\r
+ // do nothing\r
+ if (child instanceof AbstractNodeTO<?>) {\r
+ ((AbstractNodeTO<?>) child).setParent((CompositeNode) parent);\r
+ } else {\r
+ LOG.error("PARENTING FAILED: "+parent + " -> " + child);\r
+ }\r
+ }\r
+\r
+ @Override\r
+ protected Object createNode(Object name) {\r
+ MutableCompositeNode newNode = NodeFactory.createMutableCompositeNode(\r
+ createQName(name), getCurrentNode(), null, null, null);\r
+ NodeUtils.fixParentRelation(newNode);\r
+ return newNode;\r
+ }\r
+\r
+ @Override\r
+ protected Object createNode(Object name, @SuppressWarnings("rawtypes") Map attributes) {\r
+ ModifyAction modifyAction = processAttributes(attributes);\r
+ MutableCompositeNode newNode = NodeFactory.createMutableCompositeNode(\r
+ createQName(name), getCurrentNode(), null, modifyAction, null);\r
+ NodeUtils.fixParentRelation(newNode);\r
+ return newNode;\r
+ }\r
+\r
+\r
+ @Override\r
+ protected Object createNode(Object name, @SuppressWarnings("rawtypes") Map attributes, Object value) {\r
+ ModifyAction modifyAction = processAttributes(attributes);\r
+ SimpleNode<Object> newNode = NodeFactory.createImmutableSimpleNode(\r
+ createQName(name), (CompositeNode) getCurrent(), value, modifyAction);\r
+ NodeUtils.fixParentRelation(newNode);\r
+ return newNode;\r
+ }\r
+ \r
+ /**\r
+ * @param attributes\r
+ * @return \r
+ */\r
+ private ModifyAction processAttributes(@SuppressWarnings("rawtypes") Map attributes) {\r
+ LOG.debug("attributes:" + attributes);\r
+ ModifyAction modAction = null;\r
+ \r
+ @SuppressWarnings("unchecked")\r
+ Map<String, String> attributesSane = attributes;\r
+ for (Entry<String, String> attr : attributesSane.entrySet()) {\r
+ switch (attr.getKey()) {\r
+ case "xmlns":\r
+ try {\r
+ qnNamespace = new URI(attr.getValue());\r
+ } catch (URISyntaxException e) {\r
+ LOG.error(e.getMessage(), e);\r
+ }\r
+ break;\r
+ case "modifyAction":\r
+ modAction = ModifyAction.valueOf(attr.getValue());\r
+ break;\r
+ \r
+ default:\r
+ throw new IllegalArgumentException("Attribute not supported: "+attr.getKey());\r
+ }\r
+ }\r
+ return modAction;\r
+ }\r
+\r
+ @Override\r
+ protected Object createNode(Object name, Object value) {\r
+ SimpleNode<Object> newNode = NodeFactory.createImmutableSimpleNode(createQName(name), (CompositeNode) getCurrent(), value);\r
+ NodeUtils.fixParentRelation(newNode);\r
+ return newNode;\r
+ }\r
+\r
+ private QName createQName(Object localName) {\r
+ LOG.debug("qname for: "+localName);\r
+ return new QName(qnNamespace, qnRevision, qnPrefix, (String) localName);\r
+ }\r
+\r
+ protected CompositeNode getCurrentNode() {\r
+ if (getCurrent() != null) {\r
+ if (getCurrent() instanceof CompositeNode) {\r
+ return (CompositeNode) getCurrent();\r
+ \r
+ } else {\r
+ throw new IllegalAccessError("current node is not of type CompositeNode, but: "\r
+ +getCurrent().getClass().getSimpleName());\r
+ }\r
+ }\r
+ \r
+ return null;\r
+ }\r
+ \r
+ @Override\r
+ protected Object postNodeCompletion(Object parent, Object node) {\r
+ Node<?> nodeRevisited = (Node<?>) node;\r
+ LOG.debug("postNodeCompletion at: \n "+ nodeRevisited+"\n "+parent);\r
+ if (nodeRevisited instanceof MutableCompositeNode) {\r
+ MutableCompositeNode mutant = (MutableCompositeNode) nodeRevisited;\r
+ if (mutant.getValue().isEmpty()) {\r
+ LOG.error("why is it having empty value? -- " + mutant);\r
+ }\r
+ nodeRevisited = NodeFactory.createImmutableCompositeNode(\r
+ mutant.getNodeType(), mutant.getParent(), mutant.getValue(), mutant.getModificationAction());\r
+ NodeUtils.fixChildrenRelation((CompositeNode) nodeRevisited);\r
+\r
+ if (parent == null) {\r
+ rootNode = (CompositeNode) nodeRevisited;\r
+ } else {\r
+ NodeUtils.fixParentRelation(nodeRevisited);\r
+ nodeRevisited.getParent().getChildren().remove(mutant);\r
+ }\r
+ }\r
+ \r
+ \r
+ return nodeRevisited;\r
+ }\r
+ \r
+ /**\r
+ * @return tree root\r
+ */\r
+ public CompositeNode getRootNode() {\r
+ return rootNode;\r
+ }\r
+}
\ No newline at end of file