--- /dev/null
+// XMLDescrWriter.java\r
+// $Id: XMLDescrWriter.java,v 1.1 2010/06/15 12:28:58 smhuang Exp $\r
+// (c) COPYRIGHT MIT, INRIA and Keio, 1999.\r
+// Please first read the full copyright statement in file COPYRIGHT.html\r
+package org.w3c.tools.resources.serialization.xml;\r
+\r
+import java.io.Writer;\r
+import java.io.Reader;\r
+import java.io.IOException;\r
+\r
+import org.w3c.tools.resources.Resource;\r
+import org.w3c.tools.resources.ResourceFrame;\r
+import org.w3c.tools.resources.Attribute;\r
+import org.w3c.tools.resources.SimpleAttribute;\r
+import org.w3c.tools.resources.ArrayAttribute;\r
+import org.w3c.tools.resources.FrameArrayAttribute;\r
+import org.w3c.tools.resources.serialization.AttributeDescription;\r
+import org.w3c.tools.resources.serialization.ResourceDescription;\r
+import org.w3c.tools.resources.serialization.EmptyDescription;\r
+\r
+/**\r
+ * @version $Revision: 1.1 $\r
+ * @author Benoît Mahé (bmahe@w3.org)\r
+ */\r
+public class XMLDescrWriter extends XMLWriter implements JigXML {\r
+\r
+ protected void startResource(ResourceDescription res) \r
+ throws IOException\r
+ {\r
+ String classname = res.getClassName();\r
+ writer.write('<');\r
+ writer.write(RESOURCE_TAG);\r
+ writer.write(' ');\r
+ writer.write(CLASS_ATTR);\r
+ writer.write("='");\r
+ writer.write(classname);\r
+ writer.write("'>\n");\r
+ writeInherit(res.getClassHierarchy(), 1);\r
+ writeInterfaces(res.getInterfaces());\r
+ }\r
+\r
+ protected void startDescription(ResourceDescription res) \r
+ throws IOException\r
+ {\r
+ String classname = res.getClassName();\r
+ writer.write('<');\r
+ writer.write(DESCR_TAG);\r
+ writer.write(" ");\r
+ writer.write(CLASS_ATTR);\r
+ writer.write("='");\r
+ writer.write(classname);\r
+ String id = res.getIdentifier();\r
+ if (id == null)\r
+ id = NULL;\r
+ writer.write("' ");\r
+ writer.write(NAME_ATTR);\r
+ writer.write("='");\r
+ writer.write(id);\r
+ writer.write("'>\n");\r
+ }\r
+\r
+ protected void closeDescription() \r
+ throws IOException\r
+ {\r
+ writer.write("</");\r
+ writer.write(DESCR_TAG);\r
+ writer.write(">\n");\r
+ }\r
+\r
+ protected void writeInherit(String classes[], int idx)\r
+ throws IOException\r
+ {\r
+ if (idx < classes.length) {\r
+ level++;\r
+ indent();\r
+ writer.write('<'); \r
+ writer.write(INHERIT_TAG);\r
+ writer.write(' ');\r
+ writer.write(CLASS_ATTR);\r
+ writer.write("='");\r
+ writer.write(classes[idx]);\r
+ writer.write("'>\n");\r
+ writeInherit(classes, ++idx);\r
+ indent();\r
+ writer.write("</");\r
+ writer.write(INHERIT_TAG);\r
+ writer.write(">\n");\r
+ level--;\r
+ }\r
+ }\r
+ \r
+ protected void writeInterfaces(String classes[]) \r
+ throws IOException\r
+ {\r
+ level++;\r
+ for (int i = 0 ; i < classes.length ; i++) {\r
+ indent();\r
+ writer.write('<');\r
+ writer.write(IMPLEMENTS_TAG);\r
+ writer.write(' ');\r
+ writer.write(CLASS_ATTR);\r
+ writer.write("='");\r
+ writer.write(classes[i]);\r
+ writer.write("'/>\n");\r
+ }\r
+ level--;\r
+ }\r
+\r
+ protected void writeAttributeDescription(AttributeDescription descr)\r
+ throws IOException\r
+ {\r
+ level++;\r
+ String classname = descr.getClassName();\r
+ Attribute attr = descr.getAttribute();\r
+ Object value = descr.getValue();\r
+ if (attr instanceof SimpleAttribute) {\r
+ indent();\r
+ writer.write("<"+ATTRIBUTE_TAG+" "+NAME_ATTR+"='");\r
+ writer.write(descr.getName());\r
+ writer.write("' "+FLAG_ATTR+"='");\r
+ writer.write(attr.getFlag());\r
+ writer.write("' "+CLASS_ATTR+"='");\r
+ writer.write(classname);\r
+ if (value == null) {\r
+ writer.write("'>"+NULL);\r
+ } else {\r
+ writer.write("'>");\r
+ writer.write(encode(((SimpleAttribute)attr).pickle(value)));\r
+ }\r
+ writer.write("</");\r
+ writer.write(ATTRIBUTE_TAG);\r
+ writer.write(">\n");\r
+ } else if (attr instanceof ArrayAttribute) {\r
+ indent(); \r
+ writer.write('<');\r
+ writer.write(ARRAY_TAG);\r
+ writer.write(' ');\r
+ writer.write(NAME_ATTR);\r
+ writer.write("='");\r
+ writer.write(descr.getName());\r
+ writer.write("' ");\r
+ writer.write(FLAG_ATTR);\r
+ writer.write("='");\r
+ writer.write(attr.getFlag());\r
+ writer.write("' ");\r
+ writer.write(CLASS_ATTR);\r
+ writer.write("='");\r
+ writer.write(classname);\r
+ writer.write("' ");\r
+ String values[] = null;\r
+ if (value == null)\r
+ values = new String[0];\r
+ else\r
+ values = ((ArrayAttribute)attr).pickle(value);\r
+ int len = values.length;\r
+ writer.write(LENGTH_ATTR);\r
+ writer.write("='");\r
+ writer.write(String.valueOf(len));\r
+ writer.write("'>\n");\r
+ level++;\r
+ for (int i = 0 ; i < len ; i++) {\r
+ indent(); \r
+ writer.write('<');\r
+ writer.write(VALUE_TAG);\r
+ writer.write('>');\r
+ writer.write(encode(values[i]));\r
+ writer.write("</");\r
+ writer.write(VALUE_TAG);\r
+ writer.write(">\n");\r
+ }\r
+ level--;\r
+ indent(); \r
+ writer.write("</");\r
+ writer.write(ARRAY_TAG);\r
+ writer.write(">\n");\r
+ } else if (attr instanceof FrameArrayAttribute) {\r
+ indent();\r
+ writer.write('<');\r
+ writer.write(RESARRAY_TAG);\r
+ writer.write(' ');\r
+ writer.write(NAME_ATTR);\r
+ writer.write("='");\r
+ writer.write(descr.getName());\r
+ writer.write("' ");\r
+ writer.write(CLASS_ATTR);\r
+ writer.write("='");\r
+ writer.write(classname);\r
+ writer.write("' ");\r
+ ResourceDescription frames[] = null;\r
+ if (value == null)\r
+ frames = new ResourceDescription[0];\r
+ else\r
+ frames = (ResourceDescription[]) value;\r
+ int len = frames.length;\r
+ writer.write(LENGTH_ATTR);\r
+ writer.write("='");\r
+ writer.write(String.valueOf(len));\r
+ writer.write("'>\n");\r
+ for (int i = 0 ; i < len ; i++) {\r
+ writeResourceDescription(frames[i]);\r
+ }\r
+ indent();\r
+ writer.write("</");\r
+ writer.write(RESARRAY_TAG);\r
+ writer.write(">\n");\r
+ }\r
+ level--;\r
+ }\r
+\r
+ public void writeResourceDescription(ResourceDescription resource) \r
+ throws IOException\r
+ {\r
+ level++;\r
+ indent();\r
+ if (resource instanceof EmptyDescription) {\r
+ startDescription(resource);\r
+ indent();\r
+ closeDescription();\r
+ } else {\r
+ startResource(resource);\r
+ AttributeDescription attrs [] = \r
+ resource.getAttributeDescriptions();\r
+ for (int j = 0 ; j < attrs.length ; j++)\r
+ writeAttributeDescription(attrs[j]);\r
+ indent();\r
+ closeResource();\r
+ }\r
+ level--;\r
+ }\r
+\r
+ public XMLDescrWriter(Writer writer) {\r
+ super(writer);\r
+ }\r
+\r
+}\r