Author: nick
Date: Wed Feb 19 23:12:56 2014
New Revision: 1569965

URL: http://svn.apache.org/r1569965
Log:
Begin to implement some of the tests and logic for content types with 
parameters, based on the test file for bug #55026

Modified:
    poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/PackagePart.java
    
poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/ContentType.java
    
poi/trunk/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestContentType.java

Modified: poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/PackagePart.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/PackagePart.java?rev=1569965&r1=1569964&r2=1569965&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/PackagePart.java 
(original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/PackagePart.java Wed 
Feb 19 23:12:56 2014
@@ -572,12 +572,19 @@ public abstract class PackagePart implem
        }
 
        /**
-        * @return the contentType
+        * @return The Content Type of the part
         */
        public String getContentType() {
                return _contentType.toString();
        }
 
+    /**
+     * @return The Content Type, including parameters, of the part
+     */
+    public ContentType getContentTypeDetails() {
+        return _contentType;
+    }
+
        /**
         * Set the content type.
         *

Modified: 
poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/ContentType.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/ContentType.java?rev=1569965&r1=1569964&r2=1569965&view=diff
==============================================================================
--- 
poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/ContentType.java 
(original)
+++ 
poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/ContentType.java 
Wed Feb 19 23:12:56 2014
@@ -17,7 +17,6 @@
 
 package org.apache.poi.openxml4j.opc.internal;
 
-import java.io.UnsupportedEncodingException;
 import java.util.Hashtable;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -66,9 +65,13 @@ public final class ContentType {
        private Hashtable<String, String> parameters;
 
        /**
-        * Media type compiled pattern for parameters.
+        * Media type compiled pattern, without parameters
         */
-       private final static Pattern patternMediaType;
+       private final static Pattern patternTypeSubType;
+    /**
+     * Media type compiled pattern, with parameters.
+     */
+    private final static Pattern patternTypeSubTypeParams;
 
        static {
                /*
@@ -90,8 +93,7 @@ public final class ContentType {
                 *
                 * value = token | quoted-string
                 */
-               // Keep for future use with parameter:
-               // String parameter = "(" + token + "+)=(\"?" + token + "+\"?)";
+               String parameter = "(" + token + "+)=(\"?" + token + "+\"?)";
                /*
                 * Pattern for media type.
                 *
@@ -118,11 +120,10 @@ public final class ContentType {
                 * quoted-pair = "\" CHAR
                 */
 
-               // Keep for future use with parameter:
-               // patternMediaType = Pattern.compile("^(" + token + "+)/(" + 
token
-               // + "+)(;" + parameter + ")*$");
-               patternMediaType = Pattern.compile("^(" + token + "+)/(" + token
-                               + "+)$");
+               patternTypeSubType       = Pattern.compile("^(" + token + 
"+)/(" + 
+                                                          token + "+)$");
+               patternTypeSubTypeParams = Pattern.compile("^(" + token + 
"+)/(" + 
+                                                          token + "+)(;" + 
parameter + ")+$");
        }
 
        /**
@@ -134,19 +135,27 @@ public final class ContentType {
         *             If the specified content type is not valid with RFC 2616.
         */
        public ContentType(String contentType) throws InvalidFormatException {
-               Matcher mMediaType = patternMediaType.matcher(contentType);
-               if (!mMediaType.matches())
+               Matcher mMediaType = patternTypeSubType.matcher(contentType);
+               if (!mMediaType.matches()) {
+                   // How about with parameters?
+                   mMediaType = patternTypeSubTypeParams.matcher(contentType);
+               }
+        if (!mMediaType.matches()) {
                        throw new InvalidFormatException(
                                        "The specified content type '"
-                                                       + contentType
-                                                       + "' is not compliant 
with RFC 2616: malformed content type.");
+                                       + contentType
+                                       + "' is not compliant with RFC 2616: 
malformed content type.");
+        }
 
                // Type/subtype
                if (mMediaType.groupCount() >= 2) {
                        this.type = mMediaType.group(1);
                        this.subType = mMediaType.group(2);
+                       
                        // Parameters
                        this.parameters = new Hashtable<String, String>(1);
+//System.out.println(mMediaType.groupCount() + " = " + contentType);
+//for (int j=1; j<mMediaType.groupCount(); j++) { System.out.println("  " + j 
+ " - " + mMediaType.group(j)); }
                        for (int i = 4; i <= mMediaType.groupCount()
                                        && (mMediaType.group(i) != null); i += 
2) {
                                this.parameters.put(mMediaType.group(i), 
mMediaType
@@ -161,16 +170,22 @@ public final class ContentType {
                retVal.append(this.getType());
                retVal.append("/");
                retVal.append(this.getSubType());
-               // Keep for future implementation if needed
-               // for (String key : parameters.keySet()) {
-               // retVal.append(";");
-               // retVal.append(key);
-               // retVal.append("=");
-               // retVal.append(parameters.get(key));
-               // }
                return retVal.toString();
        }
 
+    public final String toStringWithParameters() {
+        StringBuffer retVal = new StringBuffer();
+        retVal.append(toString());
+        
+        for (String key : parameters.keySet()) {
+           retVal.append(";");
+           retVal.append(key);
+           retVal.append("=");
+           retVal.append(parameters.get(key));
+        }
+        return retVal.toString();
+    }
+
        @Override
        public boolean equals(Object obj) {
                return (!(obj instanceof ContentType))
@@ -201,6 +216,22 @@ public final class ContentType {
        public String getType() {
                return this.type;
        }
+       
+       /**
+        * Does this content type have any parameters associated with it?
+        */
+       public boolean hasParameters() {
+           return (parameters != null) && !parameters.isEmpty();
+       }
+       
+       /**
+        * Return the parameter keys
+        */
+       public String[] getParameterKeys() {
+           if (parameters == null)
+               return new String[0];
+           return parameters.keySet().toArray(new String[parameters.size()]);
+       }
 
        /**
         * Gets the value associated to the specified key.
@@ -209,7 +240,13 @@ public final class ContentType {
         *            The key of the key/value pair.
         * @return The value associated to the specified key.
         */
-       public String getParameters(String key) {
+       public String getParameter(String key) {
                return parameters.get(key);
        }
+       /**
+        * @deprecated Use {@link #getParameter(String)} instead
+        */
+    public String getParameters(String key) {
+        return getParameter(key);
+    }
 }

Modified: 
poi/trunk/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestContentType.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestContentType.java?rev=1569965&r1=1569964&r2=1569965&view=diff
==============================================================================
--- 
poi/trunk/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestContentType.java 
(original)
+++ 
poi/trunk/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestContentType.java 
Wed Feb 19 23:12:56 2014
@@ -17,8 +17,11 @@
 
 package org.apache.poi.openxml4j.opc;
 
+import java.io.InputStream;
+
 import junit.framework.TestCase;
 
+import org.apache.poi.openxml4j.OpenXML4JTestDataSamples;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.openxml4j.opc.internal.ContentType;
 
@@ -88,6 +91,9 @@ public final class TestContentType exten
    public void testContentTypeParam() {
       // TODO Review [01.2], then add tests for valid ones
       // TODO See bug #55026
+      // String[] contentTypesToTest = new String[] { "mail/toto;titi=tata",
+      //         "text/xml;a=b;c=d" // TODO Maybe more?
+      // };
    }
    
        /**
@@ -95,8 +101,8 @@ public final class TestContentType exten
         * parameters for content types.
         */
        public void testContentTypeParameterFailure() {
-               String[] contentTypesToTest = new String[] { 
"mail/toto;titi=tata",
-                               "text/xml;a=b;c=d", "mail/toto;\"titi=tata\"",
+               String[] contentTypesToTest = new String[] { 
+                       "mail/toto;\"titi=tata\"", // quotes not allowed like 
that
                 "text/\u0080" // characters above ASCII are not allowed
         };
                for (int i = 0; i < contentTypesToTest.length; ++i) {
@@ -129,10 +135,71 @@ public final class TestContentType exten
        }
        
        /**
+        * OOXML content types don't need entities, but we shouldn't
+        * barf if we get one from a third party system that added them
+        */
+       public void testFileWithContentTypeEntities() {
+           // TODO
+       }
+       
+       /**
         * Check that we can open a file where there are valid
         *  parameters on a content type
         */
-       public void testFileWithContentTypeParams() {
-          // TODO Implement with ContentTypeHasParameters.ooxml
+       public void DISABLEDtestFileWithContentTypeParams() throws Exception {
+        InputStream is = 
OpenXML4JTestDataSamples.openSampleStream("ContentTypeHasParameters.ooxml");
+
+        OPCPackage p = OPCPackage.open(is);
+        
+        final String typeResqml = "application/x-resqml+xml";
+        
+        // Check the types on everything
+        for (PackagePart part : p.getParts()) {
+            // _rels type doesn't have any params
+            if (part.isRelationshipPart()) {
+                assertEquals(ContentTypes.RELATIONSHIPS_PART, 
part.getContentType());
+                assertEquals(ContentTypes.RELATIONSHIPS_PART, 
part.getContentTypeDetails().toString());
+                assertEquals(false, 
part.getContentTypeDetails().hasParameters());
+                assertEquals(0, 
part.getContentTypeDetails().getParameterKeys().length);
+            }
+            // Core type doesn't have any params
+            else if 
(part.getPartName().toString().equals("/docProps/core.xml")) {
+                assertEquals(ContentTypes.CORE_PROPERTIES_PART, 
part.getContentType());
+                assertEquals(ContentTypes.CORE_PROPERTIES_PART, 
part.getContentTypeDetails().toString());
+                assertEquals(false, 
part.getContentTypeDetails().hasParameters());
+                assertEquals(0, 
part.getContentTypeDetails().getParameterKeys().length);
+            }
+            // Global Crs types do have params
+            else if (part.getPartName().toString().equals("/global1dCrs.xml")) 
{
+//System.out.println(part.getContentTypeDetails().toStringWithParameters());
+                assertEquals(typeResqml, part.getContentType());
+                assertEquals(typeResqml, 
part.getContentTypeDetails().toString());
+                assertEquals(true, 
part.getContentTypeDetails().hasParameters());
+                assertEquals(2, 
part.getContentTypeDetails().getParameterKeys().length);
+                assertEquals("2.0", 
part.getContentTypeDetails().getParameter("version"));
+                assertEquals("obj_global1dCrs", 
part.getContentTypeDetails().getParameter("type"));
+            }
+            else if (part.getPartName().toString().equals("/global2dCrs.xml")) 
{
+                assertEquals(typeResqml, part.getContentType());
+                assertEquals(typeResqml, 
part.getContentTypeDetails().toString());
+                assertEquals(true, 
part.getContentTypeDetails().hasParameters());
+                assertEquals(2, 
part.getContentTypeDetails().getParameterKeys().length);
+                assertEquals("2.0", 
part.getContentTypeDetails().getParameter("version"));
+                assertEquals("obj_global2dCrs", 
part.getContentTypeDetails().getParameter("type"));
+            }
+            // Other thingy
+            else if 
(part.getPartName().toString().equals("/myTestingGuid.xml")) {
+                assertEquals(typeResqml, part.getContentType());
+                assertEquals(typeResqml, 
part.getContentTypeDetails().toString());
+                assertEquals(true, 
part.getContentTypeDetails().hasParameters());
+                assertEquals(2, 
part.getContentTypeDetails().getParameterKeys().length);
+                assertEquals("2.0", 
part.getContentTypeDetails().getParameter("version"));
+                assertEquals("obj_tectonicBoundaryFeature", 
part.getContentTypeDetails().getParameter("type"));
+            }
+            // That should be it!
+            else {
+                fail("Unexpected part " + part);
+            }
+        }
        }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to