Author: michiel
Date: 2010-02-09 18:59:46 +0100 (Tue, 09 Feb 2010)
New Revision: 40947

Modified:
   
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/datatypes/BasicDataType.java
   
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/datatypes/util/xml/DataTypeDefinition.java
   
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/datatypes/util/xml/resources/datatypes.xsd
Log:
  MMB-1930

Modified: 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/datatypes/BasicDataType.java
===================================================================
--- 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/datatypes/BasicDataType.java
       2010-02-09 16:39:30 UTC (rev 40946)
+++ 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/datatypes/BasicDataType.java
       2010-02-09 17:59:46 UTC (rev 40947)
@@ -73,6 +73,8 @@
     private Processor[]     getProcessors;
     private Processor[]     setProcessors;
 
+    private Processor defaultProcessor;
+
     private Map<String, Handler<?>> handlers = new ConcurrentHashMap<String, 
Handler<?>>();
 
     private Element xml = null;
@@ -126,6 +128,7 @@
         out.writeObject(setProcessors);
         out.writeObject(handlers);
         out.writeObject(restrictions);
+        out.writeObject(defaultProcessor);
     }
     // implementation of serializable
     @SuppressWarnings("unchecked")
@@ -151,6 +154,7 @@
         handlers              = (Map<String, Handler<?>>) in.readObject();
         restrictions          = (Collection<Restriction<?>>) in.readObject();
         unmodifiableRestrictions = 
Collections.unmodifiableCollection(restrictions);
+        defaultProcessor      = (Processor) in.readObject();
     }
 
     public String getBaseTypeIdentifier() {
@@ -181,6 +185,7 @@
         defaultValue    = origin.getDefaultValue();
 
         commitProcessor = (CommitProcessor) ( origin.commitProcessor 
instanceof PublicCloneable ? ((PublicCloneable) origin.commitProcessor).clone() 
 : origin.commitProcessor);
+        deleteProcessor = (CommitProcessor) ( origin.deleteProcessor 
instanceof PublicCloneable ? ((PublicCloneable) origin.deleteProcessor).clone() 
 : origin.deleteProcessor);
         if (origin.getProcessors == null) {
             getProcessors = null;
         } else {
@@ -191,6 +196,12 @@
         } else {
             setProcessors = origin.setProcessors.clone();
         }
+        if (origin.defaultProcessor == null) {
+            defaultProcessor = null;
+        } else {
+            defaultProcessor = origin.defaultProcessor;
+        }
+
         styleClasses = origin.styleClasses;
 
     }
@@ -397,16 +408,27 @@
      */
 
     public C getDefaultValue(Locale locale, Cloud cloud, Field field) {
-        if (defaultValue == null) return null;
-        C res =  cast(defaultValue, null, null);
-        if (res != null) return res;
-
-        try {
-            return cast(defaultValue, getCloud(cloud), null, null);
-        } catch (CastException ce) {
-            log.error(ce);
-            return Casting.toType(classType, cloud, preCast(defaultValue, 
cloud, null, field));
+        C res;
+        if (defaultValue != null) {
+            res =  cast(defaultValue, null, null);
+            if (res == null) {
+                try {
+                    res =  cast(defaultValue, getCloud(cloud), null, null);
+                } catch (CastException ce) {
+                    log.error(ce);
+                    res = Casting.toType(classType, cloud, 
preCast(defaultValue, cloud, null, field));
+                }
+            }
+        } else {
+            res = null;
         }
+        if (defaultProcessor != null) {
+            log.debug("Found " + defaultProcessor);
+            res = Casting.toType(classType, cloud, 
defaultProcessor.process(null, field, res));
+        } else {
+            //log.debug("No default processor found for " + this);
+        }
+        return res;
     }
 
 
@@ -620,6 +642,7 @@
         buf.append(getName() + " (" + getTypeAsClass() + (defaultValue != null 
? ":" + defaultValue : "") + ")");
         buf.append(commitProcessor == null || 
EmptyCommitProcessor.getInstance() == commitProcessor ? "" : " commit: " + 
commitProcessor + "");
         buf.append(deleteProcessor == null || 
EmptyCommitProcessor.getInstance() == deleteProcessor ? "" : " delete: " + 
deleteProcessor + "");
+        buf.append(defaultProcessor == null || CopyProcessor.getInstance() == 
defaultProcessor ? "" : " default: " + defaultProcessor + "");
         if (getProcessors != null) {
             for (int i = 0; i < Fields.TYPE_MAXVALUE; i++) {
                 buf.append(getProcessors[i] == null ? "" : ("; get [" + 
Fields.typeToClass(i) + "]:" + getProcessors[i] + " "));
@@ -925,6 +948,12 @@
     }
 
 
+    public Processor getDefaultProcessor() {
+        return defaultProcessor == null ? CopyProcessor.getInstance() : 
defaultProcessor;
+    }
+    public void setDefaultProcessor(Processor dp) {
+        defaultProcessor = dp;
+    }
 
     public CommitProcessor getCommitProcessor() {
         return commitProcessor == null ? EmptyCommitProcessor.getInstance() : 
commitProcessor;
@@ -932,7 +961,6 @@
     public void setCommitProcessor(CommitProcessor cp) {
         commitProcessor = cp;
     }
-
     public CommitProcessor getDeleteProcessor() {
         return deleteProcessor == null ? EmptyCommitProcessor.getInstance() : 
deleteProcessor;
     }

Modified: 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/datatypes/util/xml/DataTypeDefinition.java
===================================================================
--- 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/datatypes/util/xml/DataTypeDefinition.java
 2010-02-09 16:39:30 UTC (rev 40946)
+++ 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/datatypes/util/xml/DataTypeDefinition.java
 2010-02-09 17:59:46 UTC (rev 40947)
@@ -93,7 +93,7 @@
                                 dt.inherit(baseDataType);
                             }
                         } catch (Exception e) {
-                            log.error(e);
+                            log.error(e.getMessage(), e);
                         }
                     }
                     break;
@@ -169,7 +169,7 @@
         return this;
     }
 
-    private static final java.util.regex.Pattern nonConditions   = 
java.util.regex.Pattern.compile("specialization|datatype|class|name|description|handler|styleClass|getprocessor|setprocessor|commitprocessor|deleteprocessor");
+    private static final java.util.regex.Pattern nonConditions   = 
java.util.regex.Pattern.compile("specialization|datatype|class|name|description|handler|styleClass|getprocessor|setprocessor|defaultprocessor|commitprocessor|deleteprocessor");
 
     /**
      * Configures the conditions of a datatype definition, using data from a 
DOM element
@@ -213,7 +213,11 @@
                     for (String mimeType : 
childElement.getAttribute("mimetype").split(",")) {
                         try {
                             Handler handler = (Handler) 
Instantiator.getInstance(childElement);
-                            dataType.getHandlers().put(mimeType, handler);
+                            if (dataType.isFinished()) {
+                                log.error("The datatype " + dataType + " is 
finished already", new Exception());
+                            } else {
+                                dataType.getHandlers().put(mimeType, handler);
+                            }
                         } catch (Exception e) {
                             log.error("For mimetype " + mimeType + " " + 
e.getClass() + " " + e.getMessage(), e);
                         }
@@ -267,6 +271,8 @@
                     addProcessor(DataType.PROCESS_GET, childElement, getters);
                 } else if ("setprocessor".equals(childTag) && ! 
childElement.getAttribute("type").equals("*")) {
                     addProcessor(DataType.PROCESS_SET, childElement, setters);
+                } else if ("defaultprocessor".equals(childTag)) {
+                    addDefaultProcessor(childElement);
                 } else if ("commitprocessor".equals(childTag)) {
                     addCommitProcessor(childElement);
                 } else if ("deleteprocessor".equals(childTag)) {
@@ -383,6 +389,14 @@
         dataType.setDeleteProcessor(newProcessor);
     }
 
+    protected void addDefaultProcessor(Element processorElement) {
+        Processor newProcessor = DataTypeXml.createProcessor(processorElement);
+        Processor oldProcessor = dataType.getDefaultProcessor();
+        newProcessor = DataTypeXml.chainProcessors(oldProcessor, newProcessor);
+        log.info("Setting default processor " + newProcessor);
+        dataType.setDefaultProcessor(newProcessor);
+    }
+
     protected void setRestrictionData(DataType.Restriction restriction, 
Element element) {
         if (DataTypeXml.hasAttribute(element, "fixed")) {
             boolean isFixed = 
Boolean.valueOf(DataTypeXml.getAttribute(element, "fixed")).booleanValue();

Modified: 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/datatypes/util/xml/resources/datatypes.xsd
===================================================================
--- 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/datatypes/util/xml/resources/datatypes.xsd
 2010-02-09 16:39:30 UTC (rev 40946)
+++ 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/datatypes/util/xml/resources/datatypes.xsd
 2010-02-09 17:59:46 UTC (rev 40947)
@@ -115,10 +115,11 @@
         </xsd:complexType>
       </xsd:element>
       <xsd:element ref="enumeration" maxOccurs="unbounded" minOccurs="0" />
+      <xsd:element name="defaultprocessor" type="SingleProcessor" 
maxOccurs="unbounded" minOccurs="0" />
       <xsd:element name="setprocessor"    type="Processor" 
maxOccurs="unbounded" minOccurs="0" />
       <xsd:element name="getprocessor"    type="Processor" 
maxOccurs="unbounded" minOccurs="0" />
-      <xsd:element name="commitprocessor" type="Processor" 
maxOccurs="unbounded" minOccurs="0" />
-      <xsd:element name="deleteprocessor" type="Processor" 
maxOccurs="unbounded" minOccurs="0" />
+      <xsd:element name="commitprocessor"  type="SingleProcessor" 
maxOccurs="unbounded" minOccurs="0" />
+      <xsd:element name="deleteprocessor"  type="SingleProcessor" 
maxOccurs="unbounded" minOccurs="0" />
 
       <xsd:element ref="specialization" maxOccurs="unbounded" minOccurs="0" />
 
@@ -214,6 +215,12 @@
     <xsd:attribute name="type" type="type_database" />
   </xsd:complexType>
 
+  <xsd:complexType name="SingleProcessor">
+    <xsd:sequence>
+      <xsd:element name="class" type="Class"  maxOccurs="unbounded" 
minOccurs="1" />
+    </xsd:sequence>
+  </xsd:complexType>
+
   <xsd:complexType name="Class">
     <xsd:sequence>
       <xsd:element ref="param" maxOccurs="unbounded" minOccurs="0" />

_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to