You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xindice-dev@xml.apache.org by na...@apache.org on 2009/01/01 01:05:24 UTC
svn commit: r730491 - in /xml/xindice/trunk/java:
src/org/apache/xindice/xml/NamespaceMap.java
tests/src/org/apache/xindice/integration/client/services/XUpdateQueryTest.java
Author: natalia
Date: Wed Dec 31 16:05:24 2008
New Revision: 730491
URL: http://svn.apache.org/viewvc?rev=730491&view=rev
Log:
Workaround for XUpdate bug that stores default namespace prefix as null
Modified:
xml/xindice/trunk/java/src/org/apache/xindice/xml/NamespaceMap.java
xml/xindice/trunk/java/tests/src/org/apache/xindice/integration/client/services/XUpdateQueryTest.java
Modified: xml/xindice/trunk/java/src/org/apache/xindice/xml/NamespaceMap.java
URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/xml/NamespaceMap.java?rev=730491&r1=730490&r2=730491&view=diff
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/xml/NamespaceMap.java (original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/xml/NamespaceMap.java Wed Dec 31 16:05:24 2008
@@ -25,14 +25,20 @@
import org.w3c.dom.Element;
import org.w3c.dom.Node;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
+import java.util.*;
/**
* NamespaceMap is just a HashMap extension that provides some useful
* Namespace related functionality.
*
+ * <p>
+ * FIXME:
+ * XUpdate library has a bug that stores default namespace with null prefix
+ * istead of empty string. As a workaround, storing values with null key will
+ * store them with empty string key instead.
+ * If you are using Map interface methods on a NamespaceMap object, be aware
+ * of this.
+ * </p>
* @version $Revision$, $Date$
*/
public final class NamespaceMap extends HashMap {
@@ -44,10 +50,7 @@
}
public NamespaceMap(Map namespaces) {
- for (Iterator i = namespaces.entrySet().iterator(); i.hasNext(); ) {
- Map.Entry e = (Map.Entry) i.next();
- setNamespace((String) e.getKey(), (String) e.getValue());
- }
+ putAll(namespaces);
}
public Node getContextNode() {
@@ -60,7 +63,7 @@
Map.Entry entry = (Map.Entry) i.next();
String pfx = (String) entry.getKey();
String uri = (String) entry.getValue();
- if (pfx == null) {
+ if ("".equals(pfx)) {
elem.setAttribute("xmlns", uri);
} else {
elem.setAttribute("xmlns:" + pfx, uri);
@@ -107,11 +110,27 @@
Iterator newEntries = nsMap.entrySet().iterator();
while (newEntries.hasNext()) {
Map.Entry entry = (Map.Entry) newEntries.next();
- if (!override && super.containsKey(entry.getKey())) {
+ if (!override && containsKey(entry.getKey())) {
continue;
}
- super.put(entry.getKey(), entry.getValue());
+ put(entry.getKey(), entry.getValue());
}
elem = null;
}
+
+ /**
+ * This is a workaround.
+ * @see org.apache.xindice.xml.NamespaceMap
+ */
+ public Object put(Object o, Object o1) {
+ return o == null ? super.put("", o1) : super.put(o, o1);
+ }
+
+ /**
+ * This is a workaround.
+ * @see org.apache.xindice.xml.NamespaceMap
+ */
+ public boolean containsKey(Object o) {
+ return o == null ? super.containsKey(""): super.containsKey(o);
+ }
}
Modified: xml/xindice/trunk/java/tests/src/org/apache/xindice/integration/client/services/XUpdateQueryTest.java
URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/tests/src/org/apache/xindice/integration/client/services/XUpdateQueryTest.java?rev=730491&r1=730490&r2=730491&view=diff
==============================================================================
--- xml/xindice/trunk/java/tests/src/org/apache/xindice/integration/client/services/XUpdateQueryTest.java (original)
+++ xml/xindice/trunk/java/tests/src/org/apache/xindice/integration/client/services/XUpdateQueryTest.java Wed Dec 31 16:05:24 2008
@@ -39,21 +39,24 @@
public void setUp() throws Exception {
super.setUp();
- String document1 = "<?xml version=\"1.0\"?>" +
- "<person status=\"single\">" +
+ String document1 = "<?xml version='1.0'?>" +
+ "<person status='single'>" +
"<first>John</first>" +
"<last>Smith</last>" +
"<phone type=\"work\">555-345-6789</phone>" +
"</person>";
- String document2 = "<?xml version=\"1.0\"?>" +
- "<person status=\"married\">" +
+ String document2 = "<?xml version='1.0'?>" +
+ "<person status='married'>" +
"<first>Sally</first>" +
"<last>Benton</last>" +
"<phone type=\"work\">555-345-6789</phone>" +
"</person>";
+ String document3 = "<?xml version='1.0' encoding='utf-8'?>" +
+ "<document/>";
this.client.insertDocument(TEST_COLLECTION_PATH, "doc1", document1);
this.client.insertDocument(TEST_COLLECTION_PATH, "doc2", document2);
+ this.client.insertDocument(TEST_COLLECTION_PATH, "doc3", document3);
}
public void tearDown() throws Exception {
@@ -88,6 +91,27 @@
assertEquals(updatedDocument, doc);
}
+ public void testXUpdateWithDefaultNamespace() throws Exception {
+ String query = "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<xupdate:modifications xmlns:xupdate='http://www.xmldb.org/xupdate' version='1.0'>\n" +
+ " <xupdate:append select='/document'><element xmlns='http://xml.apache.org'/></xupdate:append>\n" +
+ "</xupdate:modifications>";
+
+ String updatedDocument = "<?xml version='1.0' encoding='utf-8'?>" +
+ "<document><element xmlns='http://xml.apache.org'/></document>";
+
+ Collection col = this.client.getCollection(TEST_COLLECTION_PATH);
+ XUpdateQueryService service = (XUpdateQueryService) col.getService("XUpdateQueryService", "1.0");
+
+ long count = service.updateResource("doc3", query);
+ assertEquals(1, count);
+
+ String doc = this.client.getDocument(TEST_COLLECTION_PATH, "doc3");
+ System.out.println(doc);
+ assertNotNull(doc);
+ XMLAssert.assertXMLEqual(updatedDocument, doc);
+ }
+
public void testUpdateCollection() throws Exception {
String query =
"<xupdate:modifications version=\"1.0\" xmlns:xupdate=\"http://www.xmldb.org/xupdate\">" +