incubator-odf-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From svanteschub...@apache.org
Subject svn commit: r1799338 - in /incubator/odf/trunk/odfdom/src: main/java/org/odftoolkit/odfdom/pkg/OdfXMLFactory.java test/java/org/odftoolkit/odfdom/pkg/PackageTest.java test/resources/TestStyleStyleAttribute.odt
Date Tue, 20 Jun 2017 10:57:06 GMT
Author: svanteschubert
Date: Tue Jun 20 10:57:06 2017
New Revision: 1799338

URL: http://svn.apache.org/viewvc?rev=1799338&view=rev
Log:
#ODFTOOLKIT-455# Patch by Bjoern Kirchhoff - ODF document with style:style attribute cannot be parsed by odfdom

Added:
    incubator/odf/trunk/odfdom/src/test/resources/TestStyleStyleAttribute.odt   (with props)
Modified:
    incubator/odf/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfXMLFactory.java
    incubator/odf/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/PackageTest.java

Modified: incubator/odf/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfXMLFactory.java
URL: http://svn.apache.org/viewvc/incubator/odf/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfXMLFactory.java?rev=1799338&r1=1799337&r2=1799338&view=diff
==============================================================================
--- incubator/odf/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfXMLFactory.java (original)
+++ incubator/odf/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfXMLFactory.java Tue Jun 20 10:57:06 2017
@@ -1,301 +1,304 @@
-/************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
- *
- * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
- * 
- * Use is subject to license terms.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy
- * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
- * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- ************************************************************************/
-
-/*
- * This file is automatically generated.
- * Don't edit manually.
- */
-package org.odftoolkit.odfdom.pkg;
-
-import java.lang.reflect.Constructor;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.StringTokenizer;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.w3c.dom.DOMException;
-
-/** This factory determines what elements are being used in the DOC layer
- * (ie. the convenient layer).
- *
- *  The mapping of ODF element to convenient class can be changed from the user
- *  during run time.
- *
- *  For example, a user might want to create a table always with a certain style or default data and
- *  might want to overwrite the mapping for <code>{odf.element table:table}</code>, that a different
- *  class instead of <code>OdfTable</code> is being used.
- * 
- */
-public class OdfXMLFactory {
-
-	private static Map<OdfName, Class> mElementTypes = new HashMap<OdfName, Class>();
-	private static Map<OdfName, Class> mAttributeTypes = new HashMap<OdfName, Class>();
-	private static Map<String, String> mElementRenames = new HashMap<String, String>();
-	//a set for the element which need to load class from incubator package.
-	private static Set<String> mIncubatorElements = new HashSet<String>();
-	private static final String LOCAL_NAME_DELIMITER = "-";
-	private static final String ELEMENT_NAME_DELIMITER = ":";
-	private static final String ELEMENT_PACKAGE_NAME = "element";
-	private static final String ATTRIBUTE_PACKAGE_NAME = "attribute";
-
-	static {
-		mElementRenames.put("text:h", "text:heading");
-		mElementRenames.put("text:p", "text:paragraph");
-
-		mIncubatorElements.add("draw:frame");
-		mIncubatorElements.add("draw:image");
-		mIncubatorElements.add("number:currency-style");
-		mIncubatorElements.add("number:date-style");
-		mIncubatorElements.add("number:percentage-style");
-		mIncubatorElements.add("number:number-style");
-		mIncubatorElements.add("number:time-style");
-		mIncubatorElements.add("office:automatic-styles");
-		mIncubatorElements.add("office:master-styles");
-		mIncubatorElements.add("office:styles");
-		mIncubatorElements.add("style:default-style");
-		mIncubatorElements.add("style:style");
-		mIncubatorElements.add("style:page-layout");
-		mIncubatorElements.add("text:h");
-		mIncubatorElements.add("text:list");
-		mIncubatorElements.add("text:list-level-style-bullet");
-		mIncubatorElements.add("text:list-level-style-image");
-		mIncubatorElements.add("text:list-level-style-number");
-		mIncubatorElements.add("text:list-style");
-		mIncubatorElements.add("text:outline-level-style");
-		mIncubatorElements.add("text:outline-style");
-		mIncubatorElements.add("text:p");
-		mIncubatorElements.add("text:span");
-	}
-
-	/** Mapping an ODF element to a new Java DOM element class.
-	 *  Note: There is a default class for each element being generated from the latest ODF schema 
-	 */
-	private static void setOdfElementClass(OdfName odfName, Class className) {
-		mElementTypes.put(odfName, className);
-	}
-
-	/** Mapping an ODF attribute to a new Java DOM attribute class.
-	 *  Note: There is a default class for each element being generated from the latest ODF schema. */
-	private static void setOdfAttributeClass(OdfName odfName, Class className) {
-		mAttributeTypes.put(odfName, className);
-	}
-
-	/**
-	 * @param odfName the name of the ODF attribute the desired DOM class should represent.
-	 * @return the Java DOM attribute class to be mapped to a certain ODF attribute. */
-	private static Class getOdfAttributeClass(OdfName odfName) {
-		return getOdfNodeClass(odfName, ATTRIBUTE_PACKAGE_NAME, mAttributeTypes);
-	}
-
-	/**
-	 * @param odfName the name of the ODF element the desired DOM class should represent.
-	 * @return the Java DOM element class to be mapped to a certain ODF element. */
-	private static Class getOdfElementClass(OdfName odfName) {
-		return getOdfNodeClass(odfName, ELEMENT_PACKAGE_NAME, mElementTypes);
-	}
-
-	private static Class getOdfNodeClass(OdfName odfName, String nodeType, Map<OdfName, Class> classCache) {
-		Class c = null;
-		String className = "";
-		c = classCache.get(odfName);
-		if (c == null) {
-			String prefix = odfName.getPrefix();
-			if (prefix != null && !(nodeType.equals(ATTRIBUTE_PACKAGE_NAME) && prefix.equals("xmlns"))) {
-				String qName = odfName.getQName();
-				String localName = odfName.getLocalName();
-				//judge whether the element need to load class from incubator package.
-				if (mIncubatorElements.contains(qName)) {
-					//judge whether the element need to rename before find class name.
-					if (mElementRenames.containsKey(qName)) {
-						String renameName = mElementRenames.get(qName);
-						StringTokenizer stok = new StringTokenizer(renameName, ELEMENT_NAME_DELIMITER);
-						prefix = stok.nextToken();
-						localName = stok.nextToken();
-					}
-					className = getOdfIncubatorNodeClassName(prefix, localName);
-				} else if ("manifest".equals(prefix)) {
-					className = getOdfPKGNodeClassName(prefix, localName, nodeType);
-				} else {
-					className = getOdfDOMNodeClassName(prefix, localName, nodeType);
-				}
-				try {
-					c = Class.forName(className);
-					classCache.put(odfName, c);
-				} catch (ClassNotFoundException ex) {
-					// all classes are first tring to load and warning is given later
-				} catch (NoClassDefFoundError dex) {
-					Logger.getLogger(OdfXMLFactory.class.getName()).log(Level.INFO, "NoClassDefFoundError: " + className, dex.getMessage());
-				}
-			}
-		}
-		return c;
-	}
-
-	private static String getOdfIncubatorNodeClassName(String prefix, String localName) {
-		boolean contains = false;
-		StringBuilder className = new StringBuilder();
-
-		if (localName.indexOf(LOCAL_NAME_DELIMITER) != -1) {
-			StringTokenizer stok = new StringTokenizer(localName, LOCAL_NAME_DELIMITER);
-			while (stok.hasMoreElements()) {
-				String substr = stok.nextToken();
-				if (substr.equals(prefix)) {
-					contains = true;
-				}
-				className = className.append(toUpperCaseFirstCharacter(substr));
-			}
-		} else {
-			className = className.append(toUpperCaseFirstCharacter(localName));
-		}
-		if (!((contains && !localName.endsWith("table"))
-				|| (localName.equals(prefix))
-				|| (localName.startsWith(prefix) && prefix.equals("anim")))) {
-			className = className.insert(0, toUpperCaseFirstCharacter(prefix));
-		}
-		className = className.insert(0, "org.odftoolkit.odfdom.incubator.doc." + prefix + "." + "Odf");
-
-		return className.toString();
-	}
-	
-	private static String getOdfPKGNodeClassName(String prefix, String localName, String nodeType) {
-		StringBuilder className = new StringBuilder("org.odftoolkit.odfdom.pkg." + prefix + ".");
-		if (localName.indexOf(LOCAL_NAME_DELIMITER) != -1) {
-			StringTokenizer stok = new StringTokenizer(localName, LOCAL_NAME_DELIMITER);
-			while (stok.hasMoreElements()) {
-				className = className.append(toUpperCaseFirstCharacter(stok.nextToken()));
-			}
-		} else {
-			className = className.append(toUpperCaseFirstCharacter(localName));
-		}
-		className.append(toUpperCaseFirstCharacter(nodeType));
-		return className.toString();
-	}
-	
-	private static String getOdfDOMNodeClassName(String prefix, String localName, String nodeType) {
-		StringBuilder className = new StringBuilder("org.odftoolkit.odfdom.dom." + nodeType + "." + prefix + ".");
-		className = className.append(toUpperCaseFirstCharacter(prefix));
-		if (localName.indexOf(LOCAL_NAME_DELIMITER) != -1) {
-			StringTokenizer stok = new StringTokenizer(localName, LOCAL_NAME_DELIMITER);
-			while (stok.hasMoreElements()) {
-				className = className.append(toUpperCaseFirstCharacter(stok.nextToken()));
-			}
-		} else {
-			className = className.append(toUpperCaseFirstCharacter(localName));
-		}
-		className.append(toUpperCaseFirstCharacter(nodeType));
-		return className.toString();
-	}
-
-	private static String toUpperCaseFirstCharacter(String token) {
-		return token.substring(0, 1).toUpperCase() + token.substring(1);
-	}
-
-	public static OdfElement newOdfElement(OdfFileDom dom, OdfName name) throws DOMException {
-		OdfElement element = null;
-
-		// lookup registered element class for qname
-		Class elementClass = getOdfElementClass(name);
-
-		// if a class was registered create an instance of that class
-		if (elementClass != null) {
-			element = (OdfElement) getNodeFromClass(dom, elementClass);
-		} else {
-			String oldPrefix = name.getPrefix();
-			if (oldPrefix != null) {
-				// check if the namespace prefix is correct or add potential namespace to DOM
-				OdfName adaptedName = addNamespaceToDom(name, dom);
-				String newPrefix = adaptedName.getPrefix();
-				// in case the prefix was changed as it existed before
-				if (oldPrefix != null && !oldPrefix.equals(newPrefix)
-						// "_1" is the suffix added by OdfFileDom to an existing Namespace
-						&& newPrefix.indexOf("__") == -1) {
-					// look up again if there is a class registered for this prefix
-					element = newOdfElement(dom, adaptedName);
-				} else {
-					element = (OdfElement) new OdfAlienElement(dom, adaptedName);
-					Logger.getLogger(OdfXMLFactory.class.getName()).log(Level.FINE, "None-ODF element created for {0}", adaptedName.getQName());
-				}
-			} else {
-				element = (OdfElement) new OdfAlienElement(dom, name);
-				Logger.getLogger(OdfXMLFactory.class.getName()).log(Level.FINE, "None-ODF element created for {0}", name.getQName());
-			}
-		}
-		return element;
-	}
-
-	public static OdfAttribute newOdfAttribute(OdfFileDom dom, OdfName name) throws DOMException {
-		OdfAttribute attr = null;
-
-		// lookup registered attribute class for qname
-		Class attributeClass = getOdfAttributeClass(name);
-
-		// if a class was registered create an instance of that class
-		if (attributeClass != null) {
-			attr = (OdfAttribute) getNodeFromClass(dom, attributeClass);
-		} else { // in case it is not a default ODF
-			// add a namespace unless it is a xmlns attribute (no attr value to set the uri)
-			String prefix = name.getPrefix();
-			if (prefix != null && !prefix.equals("xmlns")) {
-				// check if the namespace prefix is correct or add potential namespace to DOM
-				OdfName adaptedName = addNamespaceToDom(name, dom);
-				String newPrefix = adaptedName.getPrefix();
-				// in case the prefix was changed as it existed before
-				if (!prefix.equals(newPrefix) && newPrefix.indexOf("__") == -1) {
-					// look up again if there is a class registered for this prefix
-					attr = newOdfAttribute(dom, adaptedName);
-				} else {
-					attr = (OdfAttribute) new OdfAlienAttribute(dom, name);
-					Logger.getLogger(OdfXMLFactory.class.getName()).log(Level.FINE, "None-ODF attribute created for {0}", adaptedName.getQName());
-				}
-			} else {
-				// create an alien attribute for namespace attribute "xmlns:*"
-				attr = (OdfAttribute) new OdfAlienAttribute(dom, name);
-			}
-
-		}
-		return attr;
-	}
-
-	private static OdfName addNamespaceToDom(OdfName name, OdfFileDom dom) {
-		OdfNamespace newNS = dom.setNamespace(name.getPrefix(), name.getUri());
-		return OdfName.newName(newNS, name.getLocalName());
-	}
-
-	/**
-	 * @param dom the XML DOM file where the node should be created on.
-	 * @param nodeClass being an XMLNode the Java class of the instance to be created.
-	 * @return an object instance of the XML node class being provided (usally an attribute or element). */
-	static Object getNodeFromClass(OdfFileDom dom, Class nodeClass) {
-		Object o = null;
-		try {
-			Constructor ctor = nodeClass.getConstructor(new Class[]{OdfFileDom.class});
-			o = ctor.newInstance(new Object[]{dom});
-		} catch (Exception cause) {
-			// an exception at this point is a bug. Throw an Error
-			throw new Error("ODF DOM error in attribute factory", cause);
-		}
-		return o;
-	}
-}
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg;
+
+import java.lang.reflect.Constructor;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.w3c.dom.DOMException;
+
+/** This factory determines what elements are being used in the DOC layer
+ * (ie. the convenient layer).
+ *
+ *  The mapping of ODF element to convenient class can be changed from the user
+ *  during run time.
+ *
+ *  For example, a user might want to create a table always with a certain style or default data and
+ *  might want to overwrite the mapping for <code>{odf.element table:table}</code>, that a different
+ *  class instead of <code>OdfTable</code> is being used.
+ *
+ */
+public class OdfXMLFactory {
+
+	private static Map<OdfName, Class> mElementTypes = new HashMap<OdfName, Class>();
+	private static Map<OdfName, Class> mAttributeTypes = new HashMap<OdfName, Class>();
+	private static Map<String, String> mElementRenames = new HashMap<String, String>();
+	//a set for the element which need to load class from incubator package.
+	private static Set<String> mIncubatorElements = new HashSet<String>();
+	private static final String LOCAL_NAME_DELIMITER = "-";
+	private static final String ELEMENT_NAME_DELIMITER = ":";
+	private static final String ELEMENT_PACKAGE_NAME = "element";
+	private static final String ATTRIBUTE_PACKAGE_NAME = "attribute";
+
+	static {
+		mElementRenames.put("text:h", "text:heading");
+		mElementRenames.put("text:p", "text:paragraph");
+
+		mIncubatorElements.add("draw:frame");
+		mIncubatorElements.add("draw:image");
+		mIncubatorElements.add("number:currency-style");
+		mIncubatorElements.add("number:date-style");
+		mIncubatorElements.add("number:percentage-style");
+		mIncubatorElements.add("number:number-style");
+		mIncubatorElements.add("number:time-style");
+		mIncubatorElements.add("office:automatic-styles");
+		mIncubatorElements.add("office:master-styles");
+		mIncubatorElements.add("office:styles");
+		mIncubatorElements.add("style:default-style");
+		mIncubatorElements.add("style:style");
+		mIncubatorElements.add("style:page-layout");
+		mIncubatorElements.add("text:h");
+		mIncubatorElements.add("text:list");
+		mIncubatorElements.add("text:list-level-style-bullet");
+		mIncubatorElements.add("text:list-level-style-image");
+		mIncubatorElements.add("text:list-level-style-number");
+		mIncubatorElements.add("text:list-style");
+		mIncubatorElements.add("text:outline-level-style");
+		mIncubatorElements.add("text:outline-style");
+		mIncubatorElements.add("text:p");
+		mIncubatorElements.add("text:span");
+	}
+
+	/** Mapping an ODF element to a new Java DOM element class.
+	 *  Note: There is a default class for each element being generated from the latest ODF schema
+	 */
+	private static void setOdfElementClass(OdfName odfName, Class className) {
+		mElementTypes.put(odfName, className);
+	}
+
+	/** Mapping an ODF attribute to a new Java DOM attribute class.
+	 *  Note: There is a default class for each element being generated from the latest ODF schema. */
+	private static void setOdfAttributeClass(OdfName odfName, Class className) {
+		mAttributeTypes.put(odfName, className);
+	}
+
+	/**
+	 * @param odfName the name of the ODF attribute the desired DOM class should represent.
+	 * @return the Java DOM attribute class to be mapped to a certain ODF attribute. */
+	private static Class getOdfAttributeClass(OdfName odfName) {
+		return getOdfNodeClass(odfName, ATTRIBUTE_PACKAGE_NAME, mAttributeTypes, true);
+	}
+
+	/**
+	 * @param odfName the name of the ODF element the desired DOM class should represent.
+	 * @return the Java DOM element class to be mapped to a certain ODF element. */
+	private static Class getOdfElementClass(OdfName odfName) {
+		return getOdfNodeClass(odfName, ELEMENT_PACKAGE_NAME, mElementTypes, false);
+	}
+
+	private static Class getOdfNodeClass(OdfName odfName, String nodeType, Map<OdfName, Class> classCache, boolean isAttribute) {
+		Class c = null;
+		String className = "";
+		c = classCache.get(odfName);
+		if (c == null) {
+        // Ignore looking for XML namespace attributes or ODF elements without prefix,
+        // as there are no typed ODF classes
+        // (NOTE: For any ODF node from the schema the ODF prefix would ALWAYS exist
+        // as there is a prefix normalization during the previous loading)
+        String prefix = odfName.getPrefix();
+		if (prefix != null && !(isAttribute && prefix.equals("xmlns"))) {
+				String qName = odfName.getQName();
+				String localName = odfName.getLocalName();
+				//judge whether the element need to load class from incubator package.
+				if (mIncubatorElements.contains(qName) && !isAttribute) {
+					//judge whether the element need to rename before find class name.
+					if (mElementRenames.containsKey(qName)) {
+						String renameName = mElementRenames.get(qName);
+						StringTokenizer stok = new StringTokenizer(renameName, ELEMENT_NAME_DELIMITER);
+						prefix = stok.nextToken();
+						localName = stok.nextToken();
+					}
+					className = getOdfIncubatorNodeClassName(prefix, localName);
+				} else if ("manifest".equals(prefix)) {
+					className = getOdfPKGNodeClassName(prefix, localName, nodeType);
+				} else {
+					className = getOdfDOMNodeClassName(prefix, localName, nodeType);
+				}
+				try {
+					c = Class.forName(className);
+					classCache.put(odfName, c);
+				} catch (ClassNotFoundException ex) {
+					// all classes are first tring to load and warning is given later
+				} catch (NoClassDefFoundError dex) {
+					Logger.getLogger(OdfXMLFactory.class.getName()).log(Level.INFO, "NoClassDefFoundError: " + className, dex.getMessage());
+				}
+			}
+		}
+		return c;
+	}
+
+	private static String getOdfIncubatorNodeClassName(String prefix, String localName) {
+		boolean contains = false;
+		StringBuilder className = new StringBuilder();
+
+		if (localName.indexOf(LOCAL_NAME_DELIMITER) != -1) {
+			StringTokenizer stok = new StringTokenizer(localName, LOCAL_NAME_DELIMITER);
+			while (stok.hasMoreElements()) {
+				String substr = stok.nextToken();
+				if (substr.equals(prefix)) {
+					contains = true;
+				}
+				className = className.append(toUpperCaseFirstCharacter(substr));
+			}
+		} else {
+			className = className.append(toUpperCaseFirstCharacter(localName));
+		}
+		if (!((contains && !localName.endsWith("table"))
+				|| (localName.equals(prefix))
+				|| (localName.startsWith(prefix) && prefix.equals("anim")))) {
+			className = className.insert(0, toUpperCaseFirstCharacter(prefix));
+		}
+		className = className.insert(0, "org.odftoolkit.odfdom.incubator.doc." + prefix + "." + "Odf");
+
+		return className.toString();
+	}
+
+	private static String getOdfPKGNodeClassName(String prefix, String localName, String nodeType) {
+		StringBuilder className = new StringBuilder("org.odftoolkit.odfdom.pkg." + prefix + ".");
+		if (localName.indexOf(LOCAL_NAME_DELIMITER) != -1) {
+			StringTokenizer stok = new StringTokenizer(localName, LOCAL_NAME_DELIMITER);
+			while (stok.hasMoreElements()) {
+				className = className.append(toUpperCaseFirstCharacter(stok.nextToken()));
+			}
+		} else {
+			className = className.append(toUpperCaseFirstCharacter(localName));
+		}
+		className.append(toUpperCaseFirstCharacter(nodeType));
+		return className.toString();
+	}
+
+	private static String getOdfDOMNodeClassName(String prefix, String localName, String nodeType) {
+		StringBuilder className = new StringBuilder("org.odftoolkit.odfdom.dom." + nodeType + "." + prefix + ".");
+		className = className.append(toUpperCaseFirstCharacter(prefix));
+		if (localName.indexOf(LOCAL_NAME_DELIMITER) != -1) {
+			StringTokenizer stok = new StringTokenizer(localName, LOCAL_NAME_DELIMITER);
+			while (stok.hasMoreElements()) {
+				className = className.append(toUpperCaseFirstCharacter(stok.nextToken()));
+			}
+		} else {
+			className = className.append(toUpperCaseFirstCharacter(localName));
+		}
+		className.append(toUpperCaseFirstCharacter(nodeType));
+		return className.toString();
+	}
+
+	private static String toUpperCaseFirstCharacter(String token) {
+		return token.substring(0, 1).toUpperCase() + token.substring(1);
+	}
+
+	public static OdfElement newOdfElement(OdfFileDom dom, OdfName name) throws DOMException {
+		OdfElement element = null;
+
+		// lookup registered element class for qname
+		Class elementClass = getOdfElementClass(name);
+
+		// if a class was registered create an instance of that class
+		if (elementClass != null) {
+			element = (OdfElement) getNodeFromClass(dom, elementClass);
+		} else {
+			String oldPrefix = name.getPrefix();
+			if (oldPrefix != null) {
+				// check if the namespace prefix is correct or add potential namespace to DOM
+				OdfName adaptedName = addNamespaceToDom(name, dom);
+				String newPrefix = adaptedName.getPrefix();
+				// in case the prefix was changed as it existed before
+				if (oldPrefix != null && !oldPrefix.equals(newPrefix)
+						// "_1" is the suffix added by OdfFileDom to an existing Namespace
+						&& newPrefix.indexOf("__") == -1) {
+					// look up again if there is a class registered for this prefix
+					element = newOdfElement(dom, adaptedName);
+				} else {
+					element = (OdfElement) new OdfAlienElement(dom, adaptedName);
+					Logger.getLogger(OdfXMLFactory.class.getName()).log(Level.FINE, "None-ODF element created for {0}", adaptedName.getQName());
+				}
+			} else {
+				element = (OdfElement) new OdfAlienElement(dom, name);
+				Logger.getLogger(OdfXMLFactory.class.getName()).log(Level.FINE, "None-ODF element created for {0}", name.getQName());
+			}
+		}
+		return element;
+	}
+
+	public static OdfAttribute newOdfAttribute(OdfFileDom dom, OdfName name) throws DOMException {
+		OdfAttribute attr = null;
+
+		// lookup registered attribute class for qname
+		Class attributeClass = getOdfAttributeClass(name);
+
+		// if a class was registered create an instance of that class
+		if (attributeClass != null) {
+			attr = (OdfAttribute) getNodeFromClass(dom, attributeClass);
+		} else { // in case it is not a default ODF
+			// add a namespace unless it is a xmlns attribute (no attr value to set the uri)
+			String prefix = name.getPrefix();
+			if (prefix != null && !prefix.equals("xmlns")) {
+				// check if the namespace prefix is correct or add potential namespace to DOM
+				OdfName adaptedName = addNamespaceToDom(name, dom);
+				String newPrefix = adaptedName.getPrefix();
+				// in case the prefix was changed as it existed before
+				if (!prefix.equals(newPrefix) && newPrefix.indexOf("__") == -1) {
+					// look up again if there is a class registered for this prefix
+					attr = newOdfAttribute(dom, adaptedName);
+				} else {
+					attr = (OdfAttribute) new OdfAlienAttribute(dom, name);
+					Logger.getLogger(OdfXMLFactory.class.getName()).log(Level.FINE, "None-ODF attribute created for {0}", adaptedName.getQName());
+				}
+			} else {
+				// create an alien attribute for namespace attribute "xmlns:*"
+				attr = (OdfAttribute) new OdfAlienAttribute(dom, name);
+			}
+
+		}
+		return attr;
+	}
+
+	private static OdfName addNamespaceToDom(OdfName name, OdfFileDom dom) {
+		OdfNamespace newNS = dom.setNamespace(name.getPrefix(), name.getUri());
+		return OdfName.newName(newNS, name.getLocalName());
+	}
+
+	/**
+	 * @param dom the XML DOM file where the node should be created on.
+	 * @param nodeClass being an XMLNode the Java class of the instance to be created.
+	 * @return an object instance of the XML node class being provided (usally an attribute or element). */
+	static Object getNodeFromClass(OdfFileDom dom, Class nodeClass) {
+		Object o = null;
+		try {
+			Constructor ctor = nodeClass.getConstructor(new Class[]{OdfFileDom.class});
+			o = ctor.newInstance(new Object[]{dom});
+		} catch (Exception cause) {
+			// an exception at this point is a bug. Throw an Error
+			throw new Error("ODF DOM error in attribute factory", cause);
+		}
+		return o;
+	}
+}

Modified: incubator/odf/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/PackageTest.java
URL: http://svn.apache.org/viewvc/incubator/odf/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/PackageTest.java?rev=1799338&r1=1799337&r2=1799338&view=diff
==============================================================================
--- incubator/odf/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/PackageTest.java (original)
+++ incubator/odf/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/PackageTest.java Tue Jun 20 10:57:06 2017
@@ -1,400 +1,419 @@
-/************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
- *
- * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
- *
- * Use is subject to license terms.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy
- * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
- * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- ************************************************************************/
-package org.odftoolkit.odfdom.pkg;
-
-import java.io.BufferedInputStream;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.net.URI;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-import java.util.zip.ZipOutputStream;
-import javax.xml.transform.Templates;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.sax.SAXSource;
-import javax.xml.transform.stream.StreamResult;
-import junit.framework.Assert;
-import static org.junit.Assert.fail;
-import org.junit.Test;
-import org.odftoolkit.odfdom.doc.OdfDocument;
-import org.odftoolkit.odfdom.doc.OdfPresentationDocument;
-import org.odftoolkit.odfdom.doc.OdfSpreadsheetDocument;
-import org.odftoolkit.odfdom.doc.OdfTextDocument;
-import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
-import org.odftoolkit.odfdom.dom.element.draw.DrawPageElement;
-import org.odftoolkit.odfdom.dom.element.office.OfficePresentationElement;
-import org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawImage;
-import org.odftoolkit.odfdom.type.AnyURI;
-import org.odftoolkit.odfdom.utils.ErrorHandlerStub;
-import org.odftoolkit.odfdom.utils.ResourceUtilities;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-public class PackageTest {
-
-	private static final Logger LOG = Logger.getLogger(PackageTest.class.getName());
-	private static final String mImagePath = "src/main/javadoc/doc-files/";
-	private static final String mImageName = "ODFDOM-Layered-Model.png";
-	private static final String mImageMediaType = "image/png";
-	private static final String XSL_CONCAT = "xslt/concatfiles.xsl";
-	private static final String XSL_OUTPUT = "ResolverTest.html";
-	// ToDo: Package Structure for test output possbile?
-	// private static final String XSL_OUTPUT ="pkg" + File.separator +
-	// "ResolverTest.html";
-	private static final String SIMPLE_ODT = "test2.odt";
-	private static final String ODF_FORMULAR_TEST_FILE = "SimpleFormula.odf";
-	private static final String IMAGE_TEST_FILE = "testA.jpg";
-	private static final String IMAGE_PRESENTATION = "imageCompressed.odp";
-	private static final String TARGET_STEP_1 = "PackageLoadTestStep1.ods";
-	private static final String TARGET_STEP_2 = "PackageLoadTestStep2.ods";
-	private static final String TARGET_STEP_3 = "PackageLoadTestStep3.ods";
-
-	public PackageTest() {
-	}
-
-	@Test
-	public void testNotCompressImages() throws Exception {
-		// create test presentation
-		OdfPresentationDocument odp = OdfPresentationDocument.newPresentationDocument();
-		OfficePresentationElement officePresentation = odp.getContentRoot();
-		DrawPageElement page = officePresentation.newDrawPageElement(null);
-		DrawFrameElement frame = page.newDrawFrameElement();
-		OdfDrawImage image = (OdfDrawImage) frame.newDrawImageElement();
-		image.newImage(ResourceUtilities.getURI(IMAGE_TEST_FILE));
-		odp.save(ResourceUtilities.newTestOutputFile(IMAGE_PRESENTATION));
-
-		// test if the image is not compressed
-		ZipInputStream zinput = new ZipInputStream(ResourceUtilities.getTestResourceAsStream(IMAGE_PRESENTATION));
-		ZipEntry entry = zinput.getNextEntry();
-		while (entry != null) {
-			String entryName = entry.getName();
-			if (entryName.endsWith(".jpg")) {
-				File f = new File(ResourceUtilities.getAbsolutePath(IMAGE_TEST_FILE));
-				Assert.assertEquals(ZipEntry.STORED, entry.getMethod());
-				Assert.assertEquals(f.length(), entry.getSize());
-			}
-			entry = zinput.getNextEntry();
-		}
-	}
-
-	@Test
-	public void loadPackage() {
-		try {
-
-			// LOAD PACKAGE FORMULA
-			LOG.info("Loading an unsupported ODF Formula document as an ODF Package!");
-			OdfPackage formulaPackage = OdfPackage.loadPackage(ResourceUtilities.getAbsolutePath(ODF_FORMULAR_TEST_FILE));
-			Assert.assertNotNull(formulaPackage);
-
-			// LOAD PACKAGE IMAGE
-			LOG.info("Loading an unsupported image file as an ODF Package!");
-			try {
-				// Exception is expected!
-				OdfPackage.loadPackage(ResourceUtilities.getAbsolutePath(IMAGE_TEST_FILE));
-				Assert.fail();
-			} catch (Exception e) {
-				String errorMsg = OdfPackageConstraint.PACKAGE_IS_NO_ZIP.getMessage();
-				if (!e.getMessage().endsWith(errorMsg.substring(errorMsg.indexOf("%1$s") + 4))) {
-					LOG.log(Level.SEVERE, null, e);
-					Assert.fail();
-				}
-			}
-
-			// LOAD PACKAGE IMAGE (WITH ERROR HANDLER)
-			LOG.info("Loading an unsupported image file as an ODF Package (with error handler)!");
-			try {
-				// Exception is expected by error handler!
-				OdfPackage.loadPackage(new File(ResourceUtilities.getAbsolutePath(IMAGE_TEST_FILE)), null, new DefaultHandler());
-				Assert.fail();
-			} catch (SAXException e) {
-				String errorMsg = OdfPackageConstraint.PACKAGE_IS_NO_ZIP.getMessage();
-				if (!e.getMessage().endsWith(errorMsg.substring(errorMsg.indexOf("%1$s") + 4))) {
-					LOG.log(Level.SEVERE, null, e);
-					Assert.fail();
-				}
-			}
-		} catch (Exception e) {
-			LOG.log(Level.SEVERE, null, e);
-			Assert.fail(e.getMessage());
-		}
-	}
-
-	@Test
-	public void testPackage() {
-		File tmpFile1 = ResourceUtilities.newTestOutputFile(TARGET_STEP_1);
-		File tmpFile2 = ResourceUtilities.newTestOutputFile(TARGET_STEP_2);
-		File tmpFile3 = ResourceUtilities.newTestOutputFile(TARGET_STEP_3);
-		OdfDocument doc = null;
-		try {
-			doc = OdfSpreadsheetDocument.newSpreadsheetDocument();
-			doc.save(tmpFile1);
-			doc.close();
-		} catch (Exception ex) {
-			LOG.log(Level.SEVERE, mImagePath, ex);
-			Assert.fail();
-		}
-
-		long lengthBefore = tmpFile1.length();
-		try {
-			// not allowed to change the document simply by open and save
-			OdfPackage odfPackage = OdfPackage.loadPackage(tmpFile1);
-
-			URI imageURI = new URI(mImagePath + mImageName);
-			// testing encoded none ASCII in URL path
-			String pkgRef1 = AnyURI.encodePath("Pictures/a&b.jpg");
-			LOG.log(Level.INFO, "Attempt to write graphic to package path: {0}", pkgRef1);
-			odfPackage.insert(uri2ByteArray(imageURI), pkgRef1, mImageMediaType);
-
-			// testing allowed none-ASCII in URL path (see rfc1808.txt)
-			String pkgRef2 = "Pictures/a&%" + "\u00ea" + "\u00f1" + "\u00fc" + "b.jpg";
-			LOG.log(Level.INFO, "Attempt to write graphic to package path: {0}", pkgRef2);
-			odfPackage.insert(uri2ByteArray(imageURI), pkgRef2, mImageMediaType);
-			odfPackage.save(tmpFile2);
-			long lengthAfter2 = tmpFile2.length();
-			// the new package with the images have to be bigger
-			Assert.assertTrue(lengthBefore < lengthAfter2);
-			odfPackage.remove(pkgRef1);
-			odfPackage.remove(pkgRef2);
-			odfPackage.remove("Pictures/");
-			odfPackage.save(tmpFile3);
-			long lengthAfter3 = tmpFile3.length();
-			odfPackage.close();
-
-			// the package without the images should be as long as before
-			Assert.assertTrue("The files \n\t" + tmpFile1.getAbsolutePath() + " and \n\t" + tmpFile3.getAbsolutePath() + " differ!", lengthBefore == lengthAfter3);
-
-		} catch (Exception ex) {
-			LOG.log(Level.SEVERE, mImagePath, ex);
-			Assert.fail();
-		}
-	}
-
-	private static byte[] uri2ByteArray(URI uri) {
-		byte[] fileBytes = null;
-		try {
-			InputStream fileStream = null;
-			if (uri.isAbsolute()) {
-				// if the URI is absolute it can be converted to URL
-				fileStream = uri.toURL().openStream();
-			} else {
-				// otherwise create a file class to open the transformStream
-				fileStream = new FileInputStream(uri.toString());
-				// TODO: error handling in this case! -> allow method
-				// insert(URI, ppath, mtype)?
-			}
-			ByteArrayOutputStream baos = new ByteArrayOutputStream();
-			BufferedInputStream bis = new BufferedInputStream(fileStream);
-			StreamHelper.transformStream(bis, baos);
-			fileBytes = baos.toByteArray();
-		} catch (Exception e) {
-			Logger.getLogger(PackageTest.class.getName()).log(Level.SEVERE, null, e);
-			Assert.fail(e.getMessage());
-			e.getLocalizedMessage();
-		}
-		return fileBytes;
-	}
-
-	/**
-	 * Testing the XML helper and the OdfPackage to handle two files at the same
-	 * time (have them open)
-	 */
-	@Test
-	public void testResolverWithXSLT() {
-		try {
-			OdfXMLHelper helper = new OdfXMLHelper();
-			OdfTextDocument odt = (OdfTextDocument) OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(SIMPLE_ODT));
-			InputSource inputSource = new InputSource(ResourceUtilities.getURI(XSL_CONCAT).toString());
-			Templates multiFileAccessTemplate = TransformerFactory.newInstance().newTemplates(new SAXSource(inputSource));
-			File xslOut = ResourceUtilities.newTestOutputFile(XSL_OUTPUT);
-			helper.transform(odt.getPackage(), "content.xml", multiFileAccessTemplate, new StreamResult(xslOut));
-			LOG.info("Transformed ODF document " + SIMPLE_ODT + " to " + xslOut.getAbsolutePath() + "!");
-			File testOutputFile = new File(xslOut.getAbsolutePath());
-			if (testOutputFile.length() < 100) {
-				String errorMsg = "The file " + xslOut.getAbsolutePath() + " is smaller than it should be. \nIt was not created from multiple package files!";
-				LOG.severe(errorMsg);
-				Assert.fail(errorMsg);
-			}
-		} catch (Throwable t) {
-			Logger.getLogger(PackageTest.class.getName()).log(Level.SEVERE, t.getMessage(), t);
-			Assert.fail();
-		}
-
-	}
-
-	@Test
-	public void validationTestDefault() {
-		try {
-			// default no error handler: warnings and errors are not reported
-			OdfPackage.loadPackage(ResourceUtilities.getAbsolutePath("testInvalidPkg1.odt"));
-			OdfPackage.loadPackage(ResourceUtilities.getAbsolutePath("testInvalidPkg2.odt"));
-		} catch (Exception ex) {
-			LOG.log(Level.SEVERE, null, ex);
-			Assert.fail();
-		}
-
-		// default no error handler: fatal errors are reported
-		try {
-			OdfPackage.loadPackage(ResourceUtilities.getAbsolutePath("testA.jpg"));
-			Assert.fail();
-		} catch (Exception e) {
-			String errorMsg = OdfPackageConstraint.PACKAGE_IS_NO_ZIP.getMessage();
-			if (!e.getMessage().endsWith(errorMsg.substring(errorMsg.indexOf("%1$s") + 4))) {
-				Assert.fail();
-			}
-		}
-	}
-
-	@Test
-	public void loadPackageWithoutManifest() {
-		try {
-			// regression for ODFTOOLKIT-327: invalid package without
-			// errorhandler
-			// doesn't throw NPE
-			ByteArrayOutputStream out = new ByteArrayOutputStream();
-			ZipOutputStream zipped = new ZipOutputStream(out);
-			ZipEntry entry = new ZipEntry("someentry");
-			zipped.putNextEntry(entry);
-			zipped.close();
-
-			byte[] data = out.toByteArray();
-			ByteArrayInputStream in = new ByteArrayInputStream(data);
-			OdfPackage pkg = OdfPackage.loadPackage(in);
-			Assert.assertNotNull(pkg);
-		} catch (Exception ex) {
-			LOG.log(Level.SEVERE, null, ex);
-			Assert.fail();
-		}
-	}
-
-	@Test
-	public void validationTest() {
-
-		// TESTDOC1: Expected ODF Warnings
-		Map expectedWarning1 = new HashMap();
-		expectedWarning1.put(OdfPackageConstraint.MANIFEST_LISTS_DIRECTORY, 10);
-
-		// TESTDOC1: Expected ODF Errors
-		Map expectedErrors1 = new HashMap();
-		expectedErrors1.put(OdfPackageConstraint.MIMETYPE_NOT_FIRST_IN_PACKAGE, 1);
-		expectedErrors1.put(OdfPackageConstraint.MIMETYPE_IS_COMPRESSED, 1);
-		expectedErrors1.put(OdfPackageConstraint.MIMETYPE_HAS_EXTRA_FIELD, 1);
-		expectedErrors1.put(OdfPackageConstraint.MIMETYPE_DIFFERS_FROM_PACKAGE, 1);
-		expectedErrors1.put(OdfPackageConstraint.MANIFEST_LISTS_NONEXISTENT_FILE, 1);
-		ErrorHandlerStub handler1 = new ErrorHandlerStub(expectedWarning1, expectedErrors1, null);
-		handler1.setTestFilePath("testInvalidPkg1.odt");
-
-		// TESTDOC2: Expected ODF Warnings
-		Map expectedWarning2 = new HashMap();
-		expectedWarning2.put(OdfPackageConstraint.MIMETYPE_NOT_IN_PACKAGE, 1);
-		expectedWarning2.put(OdfPackageConstraint.MANIFEST_LISTS_DIRECTORY, 10);
-
-		// TESTDOC2: Expected ODF Errors
-		Map expectedErrors2 = new HashMap();
-		expectedErrors2.put(OdfPackageConstraint.MANIFEST_DOES_NOT_LIST_FILE, 1);
-		expectedErrors2.put(OdfPackageConstraint.MANIFEST_LISTS_NONEXISTENT_FILE, 3);
-		ErrorHandlerStub handler2 = new ErrorHandlerStub(expectedWarning2, expectedErrors2, null);
-		handler2.setTestFilePath("testInvalidPkg2.odt");
-
-		// TESTDOC3 DESCRIPTION - only mimetype file in package
-		// TESTDOC3: Expected ODF Errors
-		Map expectedErrors3 = new HashMap();
-		expectedErrors3.put(OdfPackageConstraint.MANIFEST_NOT_IN_PACKAGE, 1);
-		expectedErrors3.put(OdfPackageConstraint.MIMETYPE_WITHOUT_MANIFEST_MEDIATYPE, 1);
-		ErrorHandlerStub handler3 = new ErrorHandlerStub(null, expectedErrors3, null);
-		handler3.setTestFilePath("testInvalidPkg3.odt");
-
-		// TESTDOC4: Expected ODF FatalErrors
-		Map<ValidationConstraint, Integer> expectedFatalErrors4 = new HashMap<ValidationConstraint, Integer>();
-		// loading a graphic instead an ODF document
-		expectedFatalErrors4.put(OdfPackageConstraint.PACKAGE_IS_NO_ZIP, 1);
-		ErrorHandlerStub handler4 = new ErrorHandlerStub(null, null, expectedFatalErrors4);
-
-		try {
-			OdfPackage pkg1 = OdfPackage.loadPackage(new File(ResourceUtilities.getAbsolutePath(handler1.getTestFilePath())), null, handler1);
-			Assert.assertNotNull(pkg1);
-			OdfPackage pkg2 = OdfPackage.loadPackage(new File(ResourceUtilities.getAbsolutePath(handler2.getTestFilePath())), null, handler2);
-			Assert.assertNotNull(pkg2);
-			OdfPackage pkg3 = OdfPackage.loadPackage(new File(ResourceUtilities.getAbsolutePath(handler3.getTestFilePath())), null, handler3);
-			Assert.assertNotNull(pkg3);
-			try {
-				OdfPackage.loadPackage(new File(ResourceUtilities.getAbsolutePath("testA.jpg")), null, handler4);
-				Assert.fail();
-			} catch (Exception e) {
-				String errorMsg = OdfPackageConstraint.PACKAGE_IS_NO_ZIP.getMessage();
-				if (!e.getMessage().endsWith(errorMsg.substring(errorMsg.indexOf("%1$s") + 4))) {
-					Assert.fail();
-				}
-			}
-		} catch (Exception ex) {
-			LOG.log(Level.SEVERE, null, ex);
-			Assert.fail(ex.toString());
-		}
-		handler1.validate();
-		handler2.validate();
-		handler3.validate();
-		handler4.validate();
-	}
-
-	@Test
-	public void testPackagePassword() {
-		File tmpFile = ResourceUtilities.newTestOutputFile("PackagePassword.ods");
-		OdfDocument doc = null;
-		try {
-			doc = OdfSpreadsheetDocument.newSpreadsheetDocument();
-            OdfPackage odfPackage = doc.getPackage();
-            LOG.info("Unencrypted content.xml" + odfPackage.getRootDocument().getFileDom("content.xml").toString());
-			odfPackage.setPassword("password");
-			doc.save(tmpFile);
-			doc.close();
-            // using wrong password
-            odfPackage = OdfPackage.loadPackage(tmpFile, "passwordx");
-			byte[] contentBytes = odfPackage.getBytes("content.xml");
-            // some encrypted XML
-			Assert.assertNotNull(contentBytes);
-            try{
-                odfPackage.getRootDocument().getFileDom("content.xml").toString();
-                fail("NullPointerException missing!");
-            }catch(NullPointerException e){
-                // as expected
-            }
-            // using correct password
-            OdfPackage odfPackage2 = OdfPackage.loadPackage(tmpFile, "password");
-			byte[] contentBytes2 = odfPackage2.getBytes("content.xml");
-            // some encrypted XML
-			Assert.assertNotNull(contentBytes2);
-            // due to XML parse errors null
-            LOG.info("Decrypted content.xml" + odfPackage2.getRootDocument().getFileDom("content.xml").toString());
-
-		} catch (Exception ex) {
-			LOG.log(Level.SEVERE, "password test failed.", ex);
-			Assert.fail();
-		}
-	}
-}
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+import static org.junit.Assert.fail;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.net.URI;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import java.util.zip.ZipOutputStream;
+
+import javax.xml.transform.Templates;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.stream.StreamResult;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.doc.OdfPresentationDocument;
+import org.odftoolkit.odfdom.doc.OdfSpreadsheetDocument;
+import org.odftoolkit.odfdom.doc.OdfTextDocument;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficePresentationElement;
+import org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawImage;
+import org.odftoolkit.odfdom.type.AnyURI;
+import org.odftoolkit.odfdom.utils.ErrorHandlerStub;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+public class PackageTest {
+
+	
+	private static final Logger LOG = Logger.getLogger(PackageTest.class.getName());
+	private static final String mImagePath = "src/main/javadoc/doc-files/";
+	private static final String mImageName = "ODFDOM-Layered-Model.png";
+	private static final String mImageMediaType = "image/png";
+	private static final String XSL_CONCAT = "xslt/concatfiles.xsl";
+	private static final String XSL_OUTPUT = "ResolverTest.html";
+	// ToDo: Package Structure for test output possbile?
+	// private static final String XSL_OUTPUT ="pkg" + File.separator +
+	// "ResolverTest.html";
+	private static final String SIMPLE_ODT = "test2.odt";
+	private static final String ODF_FORMULAR_TEST_FILE = "SimpleFormula.odf";
+	private static final String IMAGE_TEST_FILE = "testA.jpg";
+	private static final String IMAGE_PRESENTATION = "imageCompressed.odp";
+	private static final String TARGET_STEP_1 = "PackageLoadTestStep1.ods";
+	private static final String TARGET_STEP_2 = "PackageLoadTestStep2.ods";
+	private static final String TARGET_STEP_3 = "PackageLoadTestStep3.ods";
+	private static final String TEST_STYLE_STYLE_ATTRIBUTE_ODT = "TestStyleStyleAttribute.odt";
+	
+	public PackageTest() {
+	}
+
+	@Test
+	public void testNotCompressImages() throws Exception {
+		// create test presentation
+		OdfPresentationDocument odp = OdfPresentationDocument.newPresentationDocument();
+		OfficePresentationElement officePresentation = odp.getContentRoot();
+		DrawPageElement page = officePresentation.newDrawPageElement(null);
+		DrawFrameElement frame = page.newDrawFrameElement();
+		OdfDrawImage image = (OdfDrawImage) frame.newDrawImageElement();
+		image.newImage(ResourceUtilities.getURI(IMAGE_TEST_FILE));
+		odp.save(ResourceUtilities.newTestOutputFile(IMAGE_PRESENTATION));
+
+		// test if the image is not compressed
+		ZipInputStream zinput = new ZipInputStream(ResourceUtilities.getTestResourceAsStream(IMAGE_PRESENTATION));
+		ZipEntry entry = zinput.getNextEntry();
+		while (entry != null) {
+			String entryName = entry.getName();
+			if (entryName.endsWith(".jpg")) {
+				File f = new File(ResourceUtilities.getAbsolutePath(IMAGE_TEST_FILE));
+				Assert.assertEquals(ZipEntry.STORED, entry.getMethod());
+				Assert.assertEquals(f.length(), entry.getSize());
+			}
+			entry = zinput.getNextEntry();
+		}
+	}
+
+	@Test
+	public void loadPackage() {
+		try {
+
+			// LOAD PACKAGE FORMULA
+			LOG.info("Loading an unsupported ODF Formula document as an ODF Package!");
+			OdfPackage formulaPackage = OdfPackage.loadPackage(ResourceUtilities.getAbsolutePath(ODF_FORMULAR_TEST_FILE));
+			Assert.assertNotNull(formulaPackage);
+
+			// LOAD PACKAGE IMAGE
+			LOG.info("Loading an unsupported image file as an ODF Package!");
+			try {
+				// Exception is expected!
+				OdfPackage.loadPackage(ResourceUtilities.getAbsolutePath(IMAGE_TEST_FILE));
+				Assert.fail();
+			} catch (Exception e) {
+				String errorMsg = OdfPackageConstraint.PACKAGE_IS_NO_ZIP.getMessage();
+				if (!e.getMessage().endsWith(errorMsg.substring(errorMsg.indexOf("%1$s") + 4))) {
+					LOG.log(Level.SEVERE, null, e);
+					Assert.fail();
+				}
+			}
+
+			// LOAD PACKAGE IMAGE (WITH ERROR HANDLER)
+			LOG.info("Loading an unsupported image file as an ODF Package (with error handler)!");
+			try {
+				// Exception is expected by error handler!
+				OdfPackage.loadPackage(new File(ResourceUtilities.getAbsolutePath(IMAGE_TEST_FILE)), null, new DefaultHandler());
+				Assert.fail();
+			} catch (SAXException e) {
+				String errorMsg = OdfPackageConstraint.PACKAGE_IS_NO_ZIP.getMessage();
+				if (!e.getMessage().endsWith(errorMsg.substring(errorMsg.indexOf("%1$s") + 4))) {
+					LOG.log(Level.SEVERE, null, e);
+					Assert.fail();
+				}
+			}
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testPackage() {
+		File tmpFile1 = ResourceUtilities.newTestOutputFile(TARGET_STEP_1);
+		File tmpFile2 = ResourceUtilities.newTestOutputFile(TARGET_STEP_2);
+		File tmpFile3 = ResourceUtilities.newTestOutputFile(TARGET_STEP_3);
+		OdfDocument doc = null;
+		try {
+			doc = OdfSpreadsheetDocument.newSpreadsheetDocument();
+			doc.save(tmpFile1);
+			doc.close();
+		} catch (Exception ex) {
+			LOG.log(Level.SEVERE, mImagePath, ex);
+			Assert.fail();
+		}
+
+		long lengthBefore = tmpFile1.length();
+		try {
+			// not allowed to change the document simply by open and save
+			OdfPackage odfPackage = OdfPackage.loadPackage(tmpFile1);
+
+			URI imageURI = new URI(mImagePath + mImageName);
+			// testing encoded none ASCII in URL path
+			String pkgRef1 = AnyURI.encodePath("Pictures/a&b.jpg");
+			LOG.log(Level.INFO, "Attempt to write graphic to package path: {0}", pkgRef1);
+			odfPackage.insert(uri2ByteArray(imageURI), pkgRef1, mImageMediaType);
+
+			// testing allowed none-ASCII in URL path (see rfc1808.txt)
+			String pkgRef2 = "Pictures/a&%" + "\u00ea" + "\u00f1" + "\u00fc" + "b.jpg";
+			LOG.log(Level.INFO, "Attempt to write graphic to package path: {0}", pkgRef2);
+			odfPackage.insert(uri2ByteArray(imageURI), pkgRef2, mImageMediaType);
+			odfPackage.save(tmpFile2);
+			long lengthAfter2 = tmpFile2.length();
+			// the new package with the images have to be bigger
+			Assert.assertTrue(lengthBefore < lengthAfter2);
+			odfPackage.remove(pkgRef1);
+			odfPackage.remove(pkgRef2);
+			odfPackage.remove("Pictures/");
+			odfPackage.save(tmpFile3);
+			long lengthAfter3 = tmpFile3.length();
+			odfPackage.close();
+
+			// the package without the images should be as long as before
+			Assert.assertTrue("The files \n\t" + tmpFile1.getAbsolutePath() + " and \n\t" + tmpFile3.getAbsolutePath() + " differ!", lengthBefore == lengthAfter3);
+
+		} catch (Exception ex) {
+			LOG.log(Level.SEVERE, mImagePath, ex);
+			Assert.fail();
+		}
+	}
+
+	private static byte[] uri2ByteArray(URI uri) {
+		byte[] fileBytes = null;
+		try {
+			InputStream fileStream = null;
+			if (uri.isAbsolute()) {
+				// if the URI is absolute it can be converted to URL
+				fileStream = uri.toURL().openStream();
+			} else {
+				// otherwise create a file class to open the transformStream
+				fileStream = new FileInputStream(uri.toString());
+				// TODO: error handling in this case! -> allow method
+				// insert(URI, ppath, mtype)?
+			}
+			ByteArrayOutputStream baos = new ByteArrayOutputStream();
+			BufferedInputStream bis = new BufferedInputStream(fileStream);
+			StreamHelper.transformStream(bis, baos);
+			fileBytes = baos.toByteArray();
+		} catch (Exception e) {
+			Logger.getLogger(PackageTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+			e.getLocalizedMessage();
+		}
+		return fileBytes;
+	}
+
+	/**
+	 * Testing the XML helper and the OdfPackage to handle two files at the same
+	 * time (have them open)
+	 */
+	@Test
+	public void testResolverWithXSLT() {
+		try {
+			OdfXMLHelper helper = new OdfXMLHelper();
+			OdfTextDocument odt = (OdfTextDocument) OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(SIMPLE_ODT));
+			InputSource inputSource = new InputSource(ResourceUtilities.getURI(XSL_CONCAT).toString());
+			Templates multiFileAccessTemplate = TransformerFactory.newInstance().newTemplates(new SAXSource(inputSource));
+			File xslOut = ResourceUtilities.newTestOutputFile(XSL_OUTPUT);
+			helper.transform(odt.getPackage(), "content.xml", multiFileAccessTemplate, new StreamResult(xslOut));
+			LOG.info("Transformed ODF document " + SIMPLE_ODT + " to " + xslOut.getAbsolutePath() + "!");
+			File testOutputFile = new File(xslOut.getAbsolutePath());
+			if (testOutputFile.length() < 100) {
+				String errorMsg = "The file " + xslOut.getAbsolutePath() + " is smaller than it should be. \nIt was not created from multiple package files!";
+				LOG.severe(errorMsg);
+				Assert.fail(errorMsg);
+			}
+		} catch (Throwable t) {
+			Logger.getLogger(PackageTest.class.getName()).log(Level.SEVERE, t.getMessage(), t);
+			Assert.fail();
+		}
+
+	}
+	
+	@Test
+	public void validationTestDefault() {
+		try {
+			// default no error handler: warnings and errors are not reported
+			OdfPackage.loadPackage(ResourceUtilities.getAbsolutePath("testInvalidPkg1.odt"));
+			OdfPackage.loadPackage(ResourceUtilities.getAbsolutePath("testInvalidPkg2.odt"));
+		} catch (Exception ex) {
+			LOG.log(Level.SEVERE, null, ex);
+			Assert.fail();
+		}
+
+		// default no error handler: fatal errors are reported
+		try {
+			OdfPackage.loadPackage(ResourceUtilities.getAbsolutePath("testA.jpg"));
+			Assert.fail();
+		} catch (Exception e) {
+			String errorMsg = OdfPackageConstraint.PACKAGE_IS_NO_ZIP.getMessage();
+			if (!e.getMessage().endsWith(errorMsg.substring(errorMsg.indexOf("%1$s") + 4))) {
+				Assert.fail();
+			}
+		}
+	}
+
+	@Test
+	public void loadPackageWithoutManifest() {
+		try {
+			// regression for ODFTOOLKIT-327: invalid package without
+			// errorhandler
+			// doesn't throw NPE
+			ByteArrayOutputStream out = new ByteArrayOutputStream();
+			ZipOutputStream zipped = new ZipOutputStream(out);
+			ZipEntry entry = new ZipEntry("someentry");
+			zipped.putNextEntry(entry);
+			zipped.close();
+
+			byte[] data = out.toByteArray();
+			ByteArrayInputStream in = new ByteArrayInputStream(data);
+			OdfPackage pkg = OdfPackage.loadPackage(in);
+			Assert.assertNotNull(pkg);
+		} catch (Exception ex) {
+			LOG.log(Level.SEVERE, null, ex);
+			Assert.fail();
+		}
+	}
+
+	@Test
+	public void validationTest() {
+
+		// TESTDOC1: Expected ODF Warnings
+		Map expectedWarning1 = new HashMap();
+		expectedWarning1.put(OdfPackageConstraint.MANIFEST_LISTS_DIRECTORY, 10);
+
+		// TESTDOC1: Expected ODF Errors
+		Map expectedErrors1 = new HashMap();
+		expectedErrors1.put(OdfPackageConstraint.MIMETYPE_NOT_FIRST_IN_PACKAGE, 1);
+		expectedErrors1.put(OdfPackageConstraint.MIMETYPE_IS_COMPRESSED, 1);
+		expectedErrors1.put(OdfPackageConstraint.MIMETYPE_HAS_EXTRA_FIELD, 1);
+		expectedErrors1.put(OdfPackageConstraint.MIMETYPE_DIFFERS_FROM_PACKAGE, 1);
+		expectedErrors1.put(OdfPackageConstraint.MANIFEST_LISTS_NONEXISTENT_FILE, 1);
+		ErrorHandlerStub handler1 = new ErrorHandlerStub(expectedWarning1, expectedErrors1, null);
+		handler1.setTestFilePath("testInvalidPkg1.odt");
+
+		// TESTDOC2: Expected ODF Warnings
+		Map expectedWarning2 = new HashMap();
+		expectedWarning2.put(OdfPackageConstraint.MIMETYPE_NOT_IN_PACKAGE, 1);
+		expectedWarning2.put(OdfPackageConstraint.MANIFEST_LISTS_DIRECTORY, 10);
+
+		// TESTDOC2: Expected ODF Errors
+		Map expectedErrors2 = new HashMap();
+		expectedErrors2.put(OdfPackageConstraint.MANIFEST_DOES_NOT_LIST_FILE, 1);
+		expectedErrors2.put(OdfPackageConstraint.MANIFEST_LISTS_NONEXISTENT_FILE, 3);
+		ErrorHandlerStub handler2 = new ErrorHandlerStub(expectedWarning2, expectedErrors2, null);
+		handler2.setTestFilePath("testInvalidPkg2.odt");
+
+		// TESTDOC3 DESCRIPTION - only mimetype file in package
+		// TESTDOC3: Expected ODF Errors
+		Map expectedErrors3 = new HashMap();
+		expectedErrors3.put(OdfPackageConstraint.MANIFEST_NOT_IN_PACKAGE, 1);
+		expectedErrors3.put(OdfPackageConstraint.MIMETYPE_WITHOUT_MANIFEST_MEDIATYPE, 1);
+		ErrorHandlerStub handler3 = new ErrorHandlerStub(null, expectedErrors3, null);
+		handler3.setTestFilePath("testInvalidPkg3.odt");
+
+		// TESTDOC4: Expected ODF FatalErrors
+		Map<ValidationConstraint, Integer> expectedFatalErrors4 = new HashMap<ValidationConstraint, Integer>();
+		// loading a graphic instead an ODF document
+		expectedFatalErrors4.put(OdfPackageConstraint.PACKAGE_IS_NO_ZIP, 1);
+		ErrorHandlerStub handler4 = new ErrorHandlerStub(null, null, expectedFatalErrors4);
+
+		try {
+			OdfPackage pkg1 = OdfPackage.loadPackage(new File(ResourceUtilities.getAbsolutePath(handler1.getTestFilePath())), null, handler1);
+			Assert.assertNotNull(pkg1);
+			OdfPackage pkg2 = OdfPackage.loadPackage(new File(ResourceUtilities.getAbsolutePath(handler2.getTestFilePath())), null, handler2);
+			Assert.assertNotNull(pkg2);
+			OdfPackage pkg3 = OdfPackage.loadPackage(new File(ResourceUtilities.getAbsolutePath(handler3.getTestFilePath())), null, handler3);
+			Assert.assertNotNull(pkg3);
+			try {
+				OdfPackage.loadPackage(new File(ResourceUtilities.getAbsolutePath("testA.jpg")), null, handler4);
+				Assert.fail();
+			} catch (Exception e) {
+				String errorMsg = OdfPackageConstraint.PACKAGE_IS_NO_ZIP.getMessage();
+				if (!e.getMessage().endsWith(errorMsg.substring(errorMsg.indexOf("%1$s") + 4))) {
+					Assert.fail();
+				}
+			}
+		} catch (Exception ex) {
+			LOG.log(Level.SEVERE, null, ex);
+			Assert.fail(ex.toString());
+		}
+		handler1.validate();
+		handler2.validate();
+		handler3.validate();
+		handler4.validate();
+	}
+
+	@Test
+	public void testPackagePassword() {
+		File tmpFile = ResourceUtilities.newTestOutputFile("PackagePassword.ods");
+		OdfDocument doc = null;
+		try {
+			doc = OdfSpreadsheetDocument.newSpreadsheetDocument();
+            OdfPackage odfPackage = doc.getPackage();
+            LOG.info("Unencrypted content.xml" + odfPackage.getRootDocument().getFileDom("content.xml").toString());
+			odfPackage.setPassword("password");
+			doc.save(tmpFile);
+			doc.close();
+            // using wrong password
+            odfPackage = OdfPackage.loadPackage(tmpFile, "passwordx");
+			byte[] contentBytes = odfPackage.getBytes("content.xml");
+            // some encrypted XML
+			Assert.assertNotNull(contentBytes);
+            try{
+                odfPackage.getRootDocument().getFileDom("content.xml").toString();
+                fail("NullPointerException missing!");
+            }catch(NullPointerException e){
+                // as expected
+            }
+            // using correct password
+            OdfPackage odfPackage2 = OdfPackage.loadPackage(tmpFile, "password");
+			byte[] contentBytes2 = odfPackage2.getBytes("content.xml");
+            // some encrypted XML
+			Assert.assertNotNull(contentBytes2);
+            // due to XML parse errors null
+            LOG.info("Decrypted content.xml" + odfPackage2.getRootDocument().getFileDom("content.xml").toString());
+
+		} catch (Exception ex) {
+			LOG.log(Level.SEVERE, "password test failed.", ex);
+			Assert.fail();
+		}
+	}
+
+	@Test
+	public void testLoadingDocumentWithStyleStyleAttribute() {
+		try {
+			OdfDocument doc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_STYLE_STYLE_ATTRIBUTE_ODT));
+			OdfElement contentRoot = doc.getContentRoot();			
+		} catch (Throwable t) {
+			Logger.getLogger(PackageTest.class.getName()).log(Level.SEVERE, t.getMessage(), t);
+			Assert.fail();
+		}
+	}
+	
+} 

Added: incubator/odf/trunk/odfdom/src/test/resources/TestStyleStyleAttribute.odt
URL: http://svn.apache.org/viewvc/incubator/odf/trunk/odfdom/src/test/resources/TestStyleStyleAttribute.odt?rev=1799338&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/odf/trunk/odfdom/src/test/resources/TestStyleStyleAttribute.odt
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream



Mime
View raw message