From 56d6f0342a2801da1fecb162ab3ed46a8eab8b0c Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Wed, 19 Feb 2014 23:34:53 +0000 Subject: [PATCH] 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 --- .../openxml4j/opc/internal/ContentType.java | 58 +++++++++++-------- .../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(1); -//System.out.println(mMediaType.groupCount() + " = " + contentType); -//for (int j=1; j= 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")); -- 2.39.5