Permalink
Browse files

Complete support for OOXML content types with parameters, including p…

…arts 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
  • Loading branch information...
Gagravarr committed Feb 19, 2014
1 parent edf1ffd commit 56d6f0342a2801da1fecb162ab3ed46a8eab8b0c
@@ -72,6 +72,11 @@ Licensed to the Apache Software Foundation (ASF) under one or more
* 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 @@ Licensed to the Apache Software Foundation (ASF) under one or more
patternTypeSubType = Pattern.compile("^(" + token + "+)/(" +
token + "+)$");
patternTypeSubTypeParams = Pattern.compile("^(" + token + "+)/(" +
- token + "+)(;" + parameter + ")+$");
+ token + "+)(;" + parameter + ")*$");
+ patternParams = Pattern.compile(";" + parameter);
}
/**
@@ -154,37 +160,41 @@ public ContentType(String contentType) throws InvalidFormatException {
// 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) {
@@ -88,12 +88,15 @@ public void testContentTypeValidationFailure() {
* 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 void testContentTypeParam() {
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 void testFileWithContentTypeEntities() {
* 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 @@ else if (part.getPartName().toString().equals("/docProps/core.xml")) {
}
// 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"));

0 comments on commit 56d6f03

Please sign in to comment.