Update of /var/cvs/src/org/mmbase/util/xml
In directory james.mmbase.org:/tmp/cvs-serv1583
Modified Files:
BuilderReader.java
Log Message:
MMB-1714: It must be possible to replace builders while 'extending' them.
See also: http://cvs.mmbase.org/viewcvs/src/org/mmbase/util/xml
See also: http://www.mmbase.org/jira/browse/MMB-1714
Index: BuilderReader.java
===================================================================
RCS file: /var/cvs/src/org/mmbase/util/xml/BuilderReader.java,v
retrieving revision 1.99
retrieving revision 1.100
diff -u -b -r1.99 -r1.100
--- BuilderReader.java 28 Jul 2008 15:38:13 -0000 1.99
+++ BuilderReader.java 3 Sep 2008 16:31:02 -0000 1.100
@@ -10,6 +10,7 @@
package org.mmbase.util.xml;
import java.util.*;
+import java.util.regex.Pattern;
import org.w3c.dom.*;
import org.xml.sax.InputSource;
@@ -24,8 +25,8 @@
import org.mmbase.module.core.MMObjectBuilder;
import org.mmbase.storage.util.Index;
-import org.mmbase.util.LocalizedString;
-import org.mmbase.util.XMLEntityResolver;
+import org.mmbase.util.*;
+
import org.mmbase.util.functions.*;
import org.mmbase.util.logging.*;
@@ -38,7 +39,7 @@
* @author Rico Jansen
* @author Pierre van Rooden
* @author Michiel Meeuwissen
- * @version $Id: BuilderReader.java,v 1.99 2008/07/28 15:38:13 michiel Exp $
+ * @version $Id: BuilderReader.java,v 1.100 2008/09/03 16:31:02 michiel Exp $
*/
public class BuilderReader extends DocumentReader {
@@ -134,15 +135,52 @@
}
/**
- * @since MMBase-1.8
+ * @since MMBase-1.9
*/
public BuilderReader(Document doc, MMBase mmb) {
+ this(doc, mmb, Integer.MAX_VALUE);
+ }
+ /**
+ * @since MMBase-1.9
+ */
+ public BuilderReader(Document doc, MMBase mmb, int maxVersion) {
super(doc);
mmbase = mmb;
+ if (this.getVersion() < maxVersion) {
if (getRootElement().getTagName().equals("builder")) {
resolveInheritance();
}
}
+ }
+
+ /**
+ * Copy everyting from overrides to doc
+ * @since MMBase-1.9
+ */
+ protected void resolveInheritanceByXML(Document doc, Document overrides) {
+ {
+ // copy every attribute from root element
+ Element root = overrides.getDocumentElement();
+ NamedNodeMap nnm = root.getAttributes();
+ for (int i = 0 ; i < nnm.getLength() ; i++) {
+ Node item = nnm.item(i);
+ doc.getDocumentElement().setAttribute(item.getNodeName(),
item.getNodeValue());
+ }
+ }
+ {
+ // copy class, searchage
+ }
+ // add fieldlists
+ for(Element fieldList :
getChildElements(overrides.getDocumentElement(), "fieldlist")) {
+ Element newFieldList = (Element) doc.importNode(fieldList, true);
+ doc.getDocumentElement().appendChild(newFieldList);
+ }
+ // add functionlists
+ for(Element functionList :
getChildElements(overrides.getDocumentElement(), "functionlist")) {
+ Element newFunctionList = (Element) doc.importNode(functionList,
true);
+ doc.getDocumentElement().appendChild(newFunctionList);
+ }
+ }
/**
* Resolves inheritance.
@@ -163,6 +201,43 @@
if (buildername.equals("")) {
parentBuilder = null;
inheritanceResolved = true;
+ } else if (buildername.equals(getName())) {
+ int thisVersion = getVersion();
+ BuilderReader parent = null;
+ int foundVersion = -1;
+ ResourceLoader loader = mmbase.getBuilderLoader();
+ for (String s :
loader.getResourcePaths(Pattern.compile(getName()+ "\\.xml"), true)) {
+ for (java.net.URL url : loader.getResourceList(s)) {
+ try {
+
+ if (! url.openConnection().getDoInput()) continue;
+ org.w3c.dom.Document doc =
ResourceLoader.getDocument(url, true, BuilderReader.class);
+ BuilderReader prop = new BuilderReader(doc, mmbase,
thisVersion);
+ int v = prop.getVersion();
+ if (v < thisVersion && v > foundVersion) {
+ parent = prop;
+ foundVersion = v;
+ }
+ } catch (Exception ioe) {
+ log.warn(ioe);
+ }
+ }
+
+ }
+ if (parent == null) {
+ log.warn("Tried to extend builder " + getSystemId() + " from
itself, but no other builder resource found (with smaller version)");
+ inheritanceResolved = false;
+ } else {
+ log.info("Inheriting " + document.getDocumentURI() + " from "
+ parent.document.getDocumentURI());
+ Document inherit = this.document;
+ this.document = (Document) parent.document.cloneNode(true);
+ inherit.getDocumentElement().removeAttribute("extends");
+ resolveInheritanceByXML(document, inherit);
+ return resolveInheritance();
+
+ }
+
+
} else {
inheritanceResolved = false;
if (mmbase != null) {
@@ -970,8 +1045,8 @@
* @deprecated use getLocalizedDescription()
* @return the descriptions in a Map, accessible by language
*/
- public Hashtable<String,String> getDescriptions() {
- Hashtable<String,String> results = new Hashtable<String,String>();
+ public Map<String,String> getDescriptions() {
+ Map<String,String> results = new HashMap<String,String>();
for (Element desc :
getChildElements("builder.descriptions","description")) {
String lang = getElementAttributeValue(desc,"xml:lang");
results.put(lang,getElementValue(desc));
@@ -984,9 +1059,9 @@
* @deprecated use getLocalizedPluralName()
* @return the plural names in a Map, accessible by language
*/
- public Hashtable<String,String> getPluralNames() {
- Hashtable<String,String> results = new Hashtable<String,String>();
- for (Element name : getChildElements("builder.names","plural")) {
+ public Map<String,String> getPluralNames() {
+ Map<String,String> results = new HashMap<String, String>();
+ for (Element name : getChildElements("builder.names", "plural")) {
String lang = getElementAttributeValue(name,"xml:lang");
results.put(lang,getElementValue(name));
}
@@ -998,8 +1073,8 @@
* @deprecated use getLocalizedSingularName()
* @return the singular names in a Map, accessible by language
*/
- public Hashtable<String,String> getSingularNames() {
- Hashtable<String,String> results = new Hashtable<String,String>();
+ public Map<String,String> getSingularNames() {
+ Map<String, String> results = new HashMap<String,String>();
for (Element name : getChildElements("builder.names","singular")) {
String lang = getElementAttributeValue(name,"xml:lang");
results.put(lang,getElementValue(name));
@@ -1027,12 +1102,21 @@
}
/**
+ * Get the name of the builder that this builder extends
+ * @since MMBase-1.9
+ * @return the name of the parent builder
+ */
+ public String getName() {
+ return getElementAttributeValue("builder", "name");
+ }
+
+ /**
* Retrieve the (major) version number of this builder
* @since MMBase-1.8
* @return the version as an integer.
*/
public int getVersion() {
- String version = getElementAttributeValue("builder","version");
+ String version = getElementAttributeValue("builder", "version");
if (version.equals("") && parentBuilder != null) {
return parentBuilder.getVersion();
} else {
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs