poi-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From n...@apache.org
Subject svn commit: r1569976 - in /poi/trunk/src/ooxml: java/org/apache/poi/openxml4j/opc/internal/ContentType.java testcases/org/apache/poi/openxml4j/opc/TestContentType.java
Date Wed, 19 Feb 2014 23:34:53 GMT
Author: nick
Date: Wed Feb 19 23:34:53 2014
New Revision: 1569976

URL: http://svn.apache.org/r1569976
Log:
Complete support for OOXML content types with parameters, including parts of the patch from
Sebastien Schneider from bug #55026

Modified:
    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/internal/ContentType.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/ContentType.java?rev=1569976&r1=1569975&r2=1569976&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:34:53 2014
@@ -72,6 +72,11 @@ public final class ContentType {
      * Media type compiled pattern, with parameters.
      */
     private final static Pattern patternTypeSubTypeParams;
+    /**
+     * Pattern to match on just the parameters part, to work
+     * around the Java Regexp group capture behaviour
+     */
+    private final static Pattern patternParams;
 
 	static {
 		/*
@@ -123,7 +128,8 @@ public final class ContentType {
 		patternTypeSubType       = Pattern.compile("^(" + token + "+)/(" + 
 		                                           token + "+)$");
 		patternTypeSubTypeParams = Pattern.compile("^(" + token + "+)/(" + 
-		                                           token + "+)(;" + parameter + ")+$");
+		                                           token + "+)(;" + parameter + ")*$");
+		patternParams            = Pattern.compile(";" + parameter);
 	}
 
 	/**
@@ -154,37 +160,41 @@ public final class ContentType {
 			
 			// 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
-						.group(i + 1));
+			// Java RegExps are unhelpful, and won't do multiple group captures
+			// See http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#cg
+			if (mMediaType.groupCount() >= 5) {
+			    Matcher mParams = patternParams.matcher(contentType.substring(mMediaType.end(2)));
+			    while (mParams.find()) {
+			        this.parameters.put(mParams.group(1), mParams.group(2));
+			    }
 			}
 		}
 	}
 
+    /**
+     * Returns the content type as a string, including parameters
+     */
 	@Override
 	public final String toString() {
-		StringBuffer retVal = new StringBuffer();
-		retVal.append(this.getType());
-		retVal.append("/");
-		retVal.append(this.getSubType());
-		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();
-    }
+	    return toString(true);
+	}
+
+	public final String toString(boolean withParameters) {
+	    StringBuffer retVal = new StringBuffer();
+	    retVal.append(this.getType());
+	    retVal.append("/");
+	    retVal.append(this.getSubType());
+
+	    if (withParameters) {
+	        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) {

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=1569976&r1=1569975&r2=1569976&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:34:53 2014
@@ -88,12 +88,15 @@ public final class TestContentType exten
     * Invalid parameters are verified as incorrect in 
     *  {@link #testContentTypeParameterFailure()}
     */
-   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?
-      // };
+   public void testContentTypeParam() throws InvalidFormatException {
+      String[] contentTypesToTest = new String[] { "mail/toto;titi=tata",
+               "text/xml;a=b;c=d", "text/xml;key1=param1;key2=param2",
+               "application/pgp-key;version=\"2\"", 
+               "application/x-resqml+xml;version=2.0;type=obj_global2dCrs"
+      };
+      for (String contentType : contentTypesToTest) {
+          new ContentType(contentType);
+      }
    }
    
 	/**
@@ -103,6 +106,7 @@ public final class TestContentType exten
 	public void testContentTypeParameterFailure() {
 		String[] contentTypesToTest = new String[] { 
 		        "mail/toto;\"titi=tata\"", // quotes not allowed like that
+                "mail/toto;titi = tata", // spaces not allowed
                 "text/\u0080" // characters above ASCII are not allowed
         };
 		for (int i = 0; i < contentTypesToTest.length; ++i) {
@@ -146,7 +150,7 @@ public final class TestContentType exten
 	 * Check that we can open a file where there are valid
 	 *  parameters on a content type
 	 */
-	public void DISABLEDtestFileWithContentTypeParams() throws Exception {
+	public void testFileWithContentTypeParams() throws Exception {
         InputStream is = OpenXML4JTestDataSamples.openSampleStream("ContentTypeHasParameters.ooxml");
 
         OPCPackage p = OPCPackage.open(is);
@@ -171,27 +175,29 @@ public final class TestContentType exten
             }
             // 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(typeResqml, part.getContentType().substring(0, typeResqml.length()));
+                assertEquals(typeResqml, part.getContentTypeDetails().toString(false));
                 assertEquals(true, part.getContentTypeDetails().hasParameters());
+                assertEquals(typeResqml+";version=2.0;type=obj_global1dCrs", part.getContentTypeDetails().toString());
                 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(typeResqml, part.getContentType().substring(0, typeResqml.length()));
+                assertEquals(typeResqml, part.getContentTypeDetails().toString(false));
                 assertEquals(true, part.getContentTypeDetails().hasParameters());
+                assertEquals(typeResqml+";version=2.0;type=obj_global2dCrs", part.getContentTypeDetails().toString());
                 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(typeResqml, part.getContentType().substring(0, typeResqml.length()));
+                assertEquals(typeResqml, part.getContentTypeDetails().toString(false));
                 assertEquals(true, part.getContentTypeDetails().hasParameters());
+                assertEquals(typeResqml+";version=2.0;type=obj_tectonicBoundaryFeature",
part.getContentTypeDetails().toString());
                 assertEquals(2, part.getContentTypeDetails().getParameterKeys().length);
                 assertEquals("2.0", part.getContentTypeDetails().getParameter("version"));
                 assertEquals("obj_tectonicBoundaryFeature", part.getContentTypeDetails().getParameter("type"));



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org


Mime
View raw message