+/* $Id: ArchFlattener.java 1 2010-02-24 13:03:05Z haidw $ */
+package dol.helper.flattener;
+
+import java.util.List;
+
+import org.jdom.Element;
+import org.jdom.Namespace;
+
+/**
+ *
+ */
+public class ArchFlattener extends FlattenerHelper {
+
+ /**
+ * Constructor.
+ *
+ * @param classname class name of the generated class
+ */
+ public ArchFlattener(String classname) {
+ super(classname);
+ }
+
+ public String processElement(Element element)
+ throws RuntimeException {
+
+ String string = "";
+
+ if (element.getName().equalsIgnoreCase("processor")) {
+ _generateElement = true;
+ string = generateProcessor(element);
+ }
+ else if (element.getName().equalsIgnoreCase("hw_channel")) {
+ _generateElement = true;
+ string = generateLink(element);
+ }
+ else if (element.getName().equalsIgnoreCase("memory")) {
+ _generateElement = true;
+ string = generateMemory(element);
+ }
+ else if (element.getName().equalsIgnoreCase("node")) {
+ _generateElement = true;
+ string = generateNode(element);
+ }
+
+ if (element.getName().equalsIgnoreCase("connection")) {
+ _generateElement = false;
+ string = generateConnection(element);
+ }
+
+ //belongs to mapping!
+ if (element.getName().equalsIgnoreCase("binding")) {
+ string = generateBinding(element);
+ }
+ return string;
+ }
+
+ /**
+ *
+ */
+ @SuppressWarnings("unchecked")
+ protected String generateProcessor(Element element) {
+ String attributes[] = {"name", "type", "basename"};
+ String sourceCode = generateElement(element, attributes, false);
+
+ for (Element childElement : (List<Element>)element.getChildren()) {
+ if (childElement.getName().equalsIgnoreCase("iterator")) {
+ sourceCode += generateIterator(childElement);
+ }
+ else if (childElement.getName().equalsIgnoreCase("node")) {
+ sourceCode += generateNode(childElement);
+ }
+ else if (childElement.getName().equalsIgnoreCase("configuration")) {
+ sourceCode += generateConfiguration(childElement);
+ }
+
+ }
+ sourceCode += _indent + "System.out.println(\"</processor>\");\n";
+ return sourceCode;
+ }
+
+ /**
+ *
+ */
+ @SuppressWarnings("unchecked")
+ protected String generateMemory(Element element) {
+ String attributes[] = {"name", "type", "basename"};
+ String sourceCode = generateElement(element, attributes, false);
+
+ for (Element childElement : (List<Element>)element.getChildren()) {
+ if (childElement.getName().equalsIgnoreCase("iterator")) {
+ sourceCode += generateIterator(childElement);
+ }
+ else if (childElement.getName().equalsIgnoreCase("node")) {
+ sourceCode += generateNode(childElement);
+ }
+ else if (childElement.getName().equalsIgnoreCase("configuration")) {
+ sourceCode += generateConfiguration(childElement);
+ }
+ }
+ sourceCode += _indent + "System.out.println(\"</memory>\");\n";
+ return sourceCode;
+ }
+
+ /**
+ *
+ */
+ @SuppressWarnings("unchecked")
+ protected String generateLink(Element element) {
+ String attributes[] = {"name", "type", "basename"};
+ String sourceCode = generateElement(element, attributes, false);
+
+ for (Element childElement : (List<Element>)element.getChildren()) {
+ if (childElement.getName().equalsIgnoreCase("iterator")) {
+ sourceCode += generateIterator(childElement);
+ }
+ else if (childElement.getName().equalsIgnoreCase("node")) {
+ sourceCode += generateNode(childElement);
+ }
+ else if (childElement.getName().equalsIgnoreCase("configuration")) {
+ sourceCode += generateConfiguration(childElement);
+ }
+ }
+ sourceCode += _indent + "System.out.println(\"</hw_channel>\");\n";
+ return sourceCode;
+ }
+
+ protected String generateConfiguration(Element element) {
+ String attributes[] = {"name", "value"};
+ increaseXmlIndent();
+ String sourceCode = generateElement(element, attributes, true);
+ decreaseXmlIndent();
+ return sourceCode;
+ }
+
+ /**
+ *
+ */
+ @SuppressWarnings("unchecked")
+ protected String generateNode(Element element) {
+ increaseXmlIndent();
+
+ String sourceCode = "";
+ if (_generateElement) {
+ String attributes[] = {"name", "basename"};
+ sourceCode = generateElement(element, attributes, false);
+ }
+ else {
+ String attributes[] = {"name"};
+ sourceCode = generateElement(element, attributes, false);
+ }
+
+ for (Element childElement : (List<Element>)element.getChildren()) {
+ if (childElement.getName().equalsIgnoreCase("duplexport")) {
+ sourceCode += generatePort(childElement);
+ }
+ else if (childElement.getName().equalsIgnoreCase("inputport")) {
+ sourceCode += generatePort(childElement);
+ }
+ else if (childElement.getName().equalsIgnoreCase("outputport")) {
+ sourceCode += generatePort(childElement);
+ }
+ else if (childElement.getName().equalsIgnoreCase("port")) {
+ sourceCode += generatePort(childElement);
+ }
+ }
+ sourceCode += _indent + "System.out.println(\"" + _xmlIndent
+ + "</node>\");\n";
+
+ decreaseXmlIndent();
+ return sourceCode;
+ }
+
+ protected String generatePort(Element element) {
+ increaseXmlIndent();
+ String sourceCode = "";
+ if (_generateElement) {
+ String attributes[] = {"name", "basename"};
+ sourceCode = generateElement(element, attributes, true);
+ }
+ else {
+ String attributes[] = {"name"};
+ sourceCode = generateElement(element, attributes, true);
+ }
+ decreaseXmlIndent();
+ return sourceCode;
+ }
+
+ /**
+ *
+ */
+ @SuppressWarnings("unchecked")
+ protected String generateConnection(Element element) {
+ String attributes[] = {"name"};
+ String sourceCode = generateElement(element, attributes, false);
+
+ //add origin and target elements
+ for (Element childElement : (List<Element>)element.getChildren()) {
+ if (childElement.getName().equalsIgnoreCase("origin")) {
+ //origin found
+ increaseXmlIndent();
+ sourceCode += generateElement(childElement, attributes, false);
+
+ Namespace ns= childElement.getNamespace();
+ Element nodeElement = childElement.getChild("node", ns);
+ if (nodeElement != null) {
+ sourceCode += generateNode(nodeElement);
+ }
+ sourceCode += _indent +
+ "System.out.println(\"" + _xmlIndent + "</origin>\");\n";
+ decreaseXmlIndent();
+ }
+ else if (childElement.getName().equalsIgnoreCase("target")) {
+ //target found
+ increaseXmlIndent();
+ sourceCode += generateElement(childElement, attributes, false);
+
+ Namespace ns= childElement.getNamespace();
+ Element nodeElement = childElement.getChild("node", ns);
+ if (nodeElement != null) {
+ sourceCode += generateNode(nodeElement);
+ }
+ sourceCode += _indent +
+ "System.out.println(\"" + _xmlIndent + "</target>\");\n";
+ decreaseXmlIndent();
+ }
+ }
+ sourceCode += _indent + "System.out.println(\"</connection>\");\n";
+ return sourceCode;
+ }
+
+ /**
+ *
+ */
+ @SuppressWarnings("unchecked")
+ protected String generateBinding(Element element) {
+ String attributes[] = {"name", "parameter", "type"};
+ String sourceCode = generateElement(element, attributes, false);
+
+ //add origin and target elements
+ for (Element childElement : (List<Element>)element.getChildren()) {
+ if (childElement.getName().equalsIgnoreCase("origin")) {
+ //origin found
+ increaseXmlIndent();
+ sourceCode += generateElement(childElement, attributes, false);
+
+ Namespace ns = childElement.getNamespace();
+ Element portElement = childElement.getChild("port", ns);
+ if (portElement != null) {
+ increaseXmlIndent();
+ String[] portAttributes = {"name", "basename"};
+ sourceCode += generateElement(portElement,
+ portAttributes, true);
+ decreaseXmlIndent();
+ }
+ sourceCode += _indent +
+ "System.out.println(\"" + _xmlIndent + "</origin>\");\n";
+ decreaseXmlIndent();
+ }
+ else if (childElement.getName().equalsIgnoreCase("target")) {
+ //target found
+ increaseXmlIndent();
+ sourceCode += generateElement(childElement, attributes, false);
+
+ Namespace ns = childElement.getNamespace();
+ Element portElement = childElement.getChild("port", ns);
+ if (portElement != null) {
+ increaseXmlIndent();
+ String[] portAttributes = {"name", "basename"};
+ sourceCode += generateElement(portElement,
+ portAttributes, true);
+ decreaseXmlIndent();
+ }
+ sourceCode += _indent +
+ "System.out.println(\"" + _xmlIndent + "</target>\");\n";
+ decreaseXmlIndent();
+ }
+ }
+ sourceCode += _indent + "System.out.println(\"</binding>\");\n";
+ return sourceCode;
+ }
+}