ODFTOOLKIT-447 Encrypted documents invalid due to misordered manifest XML elements

git-svn-id: https://svn.apache.org/repos/asf/incubator/odf/trunk@1786676 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfPackageNamespace.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfPackageNamespace.java
new file mode 100644
index 0000000..461d955
--- /dev/null
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfPackageNamespace.java
@@ -0,0 +1,53 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * 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;
+
+/**
+ * Namespaces of OpenDocument 1.2 XML Package Schema
+ */
+public enum OdfPackageNamespace implements NamespaceName {
+
+
+	MANIFEST("chart", "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0"),
+	XML("xml", "http://www.w3.org/XML/1998/namespace" );
+
+	private String mPrefix;
+	private String mUri;
+
+	OdfPackageNamespace(String prefix, String uri) {
+		mPrefix = prefix;
+		mUri = uri;
+	}
+
+	/**
+	 * @return the prefix currently related to ODF Namespace.
+	 */
+	public String getPrefix() {
+		return mPrefix;
+	}
+
+	/**
+	 * @return the URI identifying the ODF Namespace.
+	 */
+	public String getUri() {
+		return mUri;
+	}
+}
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/EncryptionDataElement.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/EncryptionDataElement.java
index 977bf9e..8e3aa02 100644
--- a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/EncryptionDataElement.java
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/EncryptionDataElement.java
@@ -1,9 +1,9 @@
 /************************************************************************

  *

  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER

- * 

+ *

  * Use is subject to license terms.

- * 

+ *

  * Licensed to the Apache Software Foundation (ASF) under one or more

  * contributor license agreements.  See the NOTICE file distributed with

  * this work for additional information regarding copyright ownership.

@@ -31,6 +31,8 @@
 import org.odftoolkit.odfdom.pkg.OdfElement;

 import org.odftoolkit.odfdom.pkg.OdfFileDom;

 import org.odftoolkit.odfdom.pkg.OdfName;

+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;

+import org.w3c.dom.NodeList;

 /**

  * Manifest implementation of OpenDocument element  {@odf.element manifest:encryption-data}.

  *

@@ -124,7 +126,21 @@
 		AlgorithmElement algorithm = ((OdfFileDom) this.ownerDocument).newOdfElement(AlgorithmElement.class);

 		algorithm.setAlgorithmNameAttribute(algorithmNameValue);

 		algorithm.setInitialisationVectorAttribute(initialisationVectorValue);

-		this.appendChild(algorithm);

+        if(this.hasChildNodes()){

+            OdfElement precedingSibling = null;

+            NodeList nl = this.getElementsByTagNameNS(OdfPackageNamespace.MANIFEST.getUri(), "start-key-generation");

+            if(nl.getLength() == 0){

+                nl = this.getElementsByTagNameNS(OdfPackageNamespace.MANIFEST.getUri(), "key-derivation");

+            }

+            if(nl.getLength() != 0){

+               precedingSibling = (OdfElement) nl.item(0);

+               this.insertBefore(algorithm, precedingSibling);

+            }else{

+                this.appendChild(algorithm);

+            }

+        }else{

+            this.appendChild(algorithm);

+        }

 		return algorithm;

 	}

 

@@ -160,8 +176,20 @@
 	 public StartKeyGenerationElement newStartKeyGenerationElement(String startKeyGenerationNameValue) {

 		StartKeyGenerationElement startKeyGeneration = ((OdfFileDom) this.ownerDocument).newOdfElement(StartKeyGenerationElement.class);

 		startKeyGeneration.setStartKeyGenerationNameAttribute(startKeyGenerationNameValue);

-		this.appendChild(startKeyGeneration);

-		return startKeyGeneration;

+

+        if(this.hasChildNodes()){

+            OdfElement precedingSibling = null;

+            NodeList nl = this.getElementsByTagNameNS(OdfPackageNamespace.MANIFEST.getUri(), "key-derivation");

+            if(nl.getLength() != 0){

+               precedingSibling = (OdfElement) nl.item(0);

+               this.insertBefore(startKeyGeneration, precedingSibling);

+            }else{

+                this.appendChild(startKeyGeneration);

+            }

+        }else{

+            this.appendChild(startKeyGeneration);

+        }

+        return startKeyGeneration;

 	}

 

 }