aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNick Burch <nick@apache.org>2014-02-19 23:34:53 +0000
committerNick Burch <nick@apache.org>2014-02-19 23:34:53 +0000
commit4eb5150fc352f9485652ea51778b8cfa94c44872 (patch)
treeca127fb9a8818492306e1de147a75554fecba3a1 /src
parentd701d00438b848e45d0170125d4a0c4116c7f37b (diff)
downloadpoi-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.java58
-rw-r--r--src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestContentType.java34
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"));