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: [email protected]
For additional commands, e-mail: [email protected]