diff options
author | Nick Burch <nick@apache.org> | 2014-02-19 23:34:53 +0000 |
---|---|---|
committer | Nick Burch <nick@apache.org> | 2014-02-19 23:34:53 +0000 |
commit | 4eb5150fc352f9485652ea51778b8cfa94c44872 (patch) | |
tree | ca127fb9a8818492306e1de147a75554fecba3a1 /src | |
parent | d701d00438b848e45d0170125d4a0c4116c7f37b (diff) | |
download | poi-4eb5150fc352f9485652ea51778b8cfa94c44872.tar.gz poi-4eb5150fc352f9485652ea51778b8cfa94c44872.zip |
Complete support for OOXML content types with parameters, including parts of the patch from Sebastien Schneider from bug #55026
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1569976 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src')
-rw-r--r-- | src/ooxml/java/org/apache/poi/openxml4j/opc/internal/ContentType.java | 58 | ||||
-rw-r--r-- | src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestContentType.java | 34 |
2 files changed, 54 insertions, 38 deletions
diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/ContentType.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/ContentType.java index fcb77bc971..7ed6a98425 100644 --- a/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/ContentType.java +++ b/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/ContentType.java @@ -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(); + return toString(true); } - 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(); - } + 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) { diff --git a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestContentType.java b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestContentType.java index 350e0bb6c9..22660ddbf3 100644 --- a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestContentType.java +++ b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestContentType.java @@ -88,12 +88,15 @@ public final class TestContentType extends TestCase { * 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 extends TestCase { 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 extends TestCase { * 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 extends TestCase { } // 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")); |