Update of /var/cvs/src/org/mmbase/datatypes/handlers/html
In directory james.mmbase.org:/tmp/cvs-serv19140/html

Modified Files:
        AbstractHtmlHandler.java 
Log Message:
  MMB-1560


See also: http://cvs.mmbase.org/viewcvs/src/org/mmbase/datatypes/handlers/html
See also: http://www.mmbase.org/jira/browse/MMB-1560


Index: AbstractHtmlHandler.java
===================================================================
RCS file: 
/var/cvs/src/org/mmbase/datatypes/handlers/html/AbstractHtmlHandler.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- AbstractHtmlHandler.java    28 Jul 2008 16:47:31 -0000      1.1
+++ AbstractHtmlHandler.java    17 Apr 2009 15:43:39 -0000      1.2
@@ -11,9 +11,14 @@
 package org.mmbase.datatypes.handlers.html;
 
 import org.mmbase.datatypes.handlers.*;
+import org.mmbase.datatypes.DataType;
 import org.mmbase.bridge.*;
 import org.mmbase.util.transformers.Xml;
 import org.mmbase.util.transformers.CharTransformer;
+import org.mmbase.util.logging.*;
+import org.mmbase.util.*;
+
+import java.util.*;
 
 /**
  * Handlers can be associated to DataTypes, but different Handler can be 
associated with different
@@ -21,20 +26,21 @@
  * post and things like that.
  *
  * @author Michiel Meeuwissen
- * @version $Id: AbstractHtmlHandler.java,v 1.1 2008/07/28 16:47:31 michiel 
Exp $
+ * @version $Id: AbstractHtmlHandler.java,v 1.2 2009/04/17 15:43:39 michiel 
Exp $
  * @since MMBase-1.9.1
  */
 
 public abstract class AbstractHtmlHandler  extends AbstractHandler<String> {
+    private static final Logger log = 
Logging.getLoggerInstance(AbstractHtmlHandler.class);
 
     protected static final CharTransformer XML = new Xml(Xml.ESCAPE);
 
     protected void appendClasses(StringBuilder buf, Node node, Field field) {
         buf.append("mm_validate");
         if (field instanceof org.mmbase.bridge.util.DataTypeField) {
-            buf.append(" mm_dt_").append(field.getDataType().getName());
+            buf.append(" mm_dthandler 
mm_dt_").append(field.getDataType().getName());
         } else {
-            buf.append(" mm_f_").append(field.getName()).append(" 
mm_nm_").append(field.getNodeManager().getName());
+            buf.append(" mm_dthandler mm_f_").append(field.getName()).append(" 
mm_nm_").append(field.getNodeManager().getName());
         }
         if (node != null) buf.append(" mm_n_").append(node.getNumber());
     }
@@ -44,7 +50,73 @@
         buf.append("id=\"").append(id(request.getName(field))).append("\" ");
     }
 
+    protected String prefixError(String s)  {
+        String prefix = "_";
+        return "mm_check_" + prefix + (prefix.length() != 0 ? "_" : "") + s;
+    }
 
-
+    public String check(Request request, Node node, Field field, boolean 
errors) {
+        Object fieldValue = request.getValue(field);
+        final DataType<Object> dt = field.getDataType();
+        if (fieldValue == null) {
+            log.debug("Field value not found in context, using existing value 
");
+            fieldValue = getFieldValue(request, node, field, node == null);
+        } else if (fieldValue.equals("") && ! field.isRequired()) {
+            log.debug("Field value found in context is empty, interpreting as 
null");
+            fieldValue = null;
+        }
+        if (log.isDebugEnabled()) {
+            log.debug("Value for field " + field + ": " + fieldValue + " and 
node " + node);
+        }
+        Collection<LocalizedString> col = dt.validate(fieldValue, node, field);
+        if (col.size() == 0) {
+            // do actually set the field, because some datatypes need 
cross-field checking
+            // also in an mm:form, you can simply commit.
+            if (node != null && ! field.isReadOnly()) {
+                String fieldName = field.getName();
+                Object oldValue = node.getValue(fieldName);
+                if (fieldValue == null ? oldValue != null : ! 
fieldValue.equals(oldValue)) {
+                    try {
+                        if(log.isDebugEnabled()) {
+                            log.debug("Setting " + fieldName + " to " + 
(fieldValue == null ? "" : fieldValue.getClass().getName()) + " " + fieldValue);
+                        }
+                        if ("".equals(fieldValue) && 
interpretEmptyAsNull(field)) {
+                            setValue(node, fieldName,  null);
+                        } else {
+                            setValue(node, fieldName,  fieldValue);
+                        }
+                    } catch (Throwable t) {
+                        // may throw exception like 'You cannot change the 
field"
+                    }
+                } else {
+                    if (log.isDebugEnabled()) {
+                        log.debug("not Setting " + fieldName + " to " + 
fieldValue + " because already has that value");
+                    }
+                }
+            }
+            if (errors && ! field.isReadOnly()) {
+                return "<div id=\"" + prefixError(field.getName()) + "\" 
class=\"mm_check_noerror\"> </div>";
+            } else {
+                return "";
+            }
+        } else {
+            request.invalidate();
+            if (errors && ! field.isReadOnly()) {
+                StringBuilder show = new StringBuilder("<div id=\"");
+                show.append(request.getName(field));
+                show.append("\" class=\"mm_check_error\">");
+                Locale locale = request.getLocale();
+                for (LocalizedString error : col) {
+                    show.append("<span class='" + error.getKey() + "'>");
+                    Xml.XMLEscape(error.get(locale), show);
+                    show.append("</span>");
+                }
+                show.append("</div>");
+                return show.toString();
+            } else {
+                return "";
+            }
+        }
+    }
 
 }
_______________________________________________
Cvs mailing list
Cvs@lists.mmbase.org
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to