You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by ht...@apache.org on 2012/01/04 23:29:38 UTC
svn commit: r1227364 -
/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AbstractCFMetaDataFactory.java
Author: hthomann
Date: Wed Jan 4 22:29:38 2012
New Revision: 1227364
URL: http://svn.apache.org/viewvc?rev=1227364&view=rev
Log:
OPENJPA-2102: Added code to compare decoded URLs in AbstractCFMetaDataFactory.
Modified:
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AbstractCFMetaDataFactory.java
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AbstractCFMetaDataFactory.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AbstractCFMetaDataFactory.java?rev=1227364&r1=1227363&r2=1227364&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AbstractCFMetaDataFactory.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AbstractCFMetaDataFactory.java Wed Jan 4 22:29:38 2012
@@ -787,7 +787,8 @@ public abstract class AbstractCFMetaData
if (log.isTraceEnabled())
log.trace(_loc.get("resource-url", urlString));
if (peMap != null) {
- if (puUrlString != null && urlString.indexOf(puUrlString) != -1)
+ //OPENJPA-2102: decode the URL to remove such things a spaces (' ') encoded as '%20'
+ if (puUrlString != null && decode(urlString).indexOf(decode(puUrlString)) != -1)
urls.add(url);
if (mappingFileNames != null && mappingFileNames.size() != 0) {
for (String mappingFileName : mappingFileNames) {
@@ -865,6 +866,66 @@ public abstract class AbstractCFMetaData
names.addAll(newNames);
}
}
+
+ /**
+ * Decodes a URL-encoded path string. For example, an encoded
+ * space (%20) is decoded into a normal space (' ') character.
+ * Added via OPENJPA-2102.
+ * @param String encoded - the encoded URL string
+ * @return String decoded - the decoded string.
+ */
+ public static String decode(String s) {
+ if (s == null) {
+ return null;
+ }
+
+ int i = s.indexOf('%');
+ if (i == -1) {
+ return s;
+ }
+
+ StringBuilder builder = new StringBuilder();
+ int begin = 0;
+
+ do {
+ builder.append(s, begin, i);
+ begin = i + 3;
+
+ char ch = (char) Integer.parseInt(s.substring(i + 1, begin), 16);
+
+ if ((ch & 0x80) != 0) {
+ // Decode "modified UTF-8".
+
+ if (s.charAt(begin++) != '%') {
+ throw new IllegalArgumentException();
+ }
+
+ char ch2 = (char) Integer.parseInt(s.substring(begin, begin + 2), 16);
+ begin += 2;
+
+ if ((ch & 0xe0) == 0xc0) {
+ ch = (char) (((ch & 0x1f) << 6) | (ch2 & 0x3f));
+ } else if ((ch & 0xf0) == 0xe0) {
+ if (s.charAt(begin++) != '%') {
+ throw new IllegalArgumentException();
+ }
+
+ char ch3 = (char) Integer.parseInt(s.substring(begin, begin + 2), 16);
+ begin += 2;
+
+ ch = (char) (((ch & 0x0f) << 12) | ((ch2 & 0x3f) << 6) | (ch3 & 0x3f));
+ } else {
+ throw new IllegalArgumentException();
+ }
+ }
+
+ builder.append(ch);
+ } while ((i = s.indexOf('%', begin)) != -1);
+
+ builder.append(s, begin, s.length());
+
+ return builder.toString();
+ }
/**
* Implement this method to map metadata resources to the persistent