Author: michiel
Date: 2010-02-15 18:51:03 +0100 (Mon, 15 Feb 2010)
New Revision: 41025

Added:
   mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/util/MimeType.java
Modified:
   
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/datatypes/BinaryDataType.java
   
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/datatypes/resources/datatypes.properties
   
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/datatypes/resources/datatypes_nl.properties
Log:
ported MMB-1910 from trunk

Modified: 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/datatypes/BinaryDataType.java
===================================================================
--- 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/datatypes/BinaryDataType.java
      2010-02-15 17:36:26 UTC (rev 41024)
+++ 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/datatypes/BinaryDataType.java
      2010-02-15 17:51:03 UTC (rev 41025)
@@ -13,6 +13,7 @@
 import org.mmbase.util.SerializableInputStream;
 import org.mmbase.bridge.*;
 import org.mmbase.util.*;
+import org.mmbase.util.magicfile.MagicFile;
 import java.util.Collection;
 import java.io.InputStream;
 import java.util.regex.Pattern;
@@ -31,7 +32,7 @@
 
     private static final long serialVersionUID = 1L;
 
-    protected Pattern validMimeTypes = Pattern.compile(".*");
+    protected MimeTypeRestriction mimeTypeRestriction = new 
MimeTypeRestriction(Pattern.compile(".*"));
 
     /**
      * Constructor for binary field.
@@ -44,7 +45,7 @@
 
     @Override
     protected String castToPresent(Object value, Node node, Field field) {
-        return "BINARY";
+        return getMimeType(value, node, field) + " " + getLength(value) + " 
byte";
     }
 
 
@@ -56,13 +57,15 @@
     }
 
     @Override
-    protected void inheritProperties(BasicDataType origin) {
-        super.inheritProperties(origin);
+    protected void cloneRestrictions(BasicDataType origin) {
+        super.cloneRestrictions(origin);
         if (origin instanceof BinaryDataType) {
-            validMimeTypes = ((BinaryDataType) origin).validMimeTypes;
+            BinaryDataType dataType = (BinaryDataType)origin;
+            mimeTypeRestriction = new 
MimeTypeRestriction(dataType.mimeTypeRestriction);
         }
     }
 
+
     @Override
     public long getLength(Object value) {
         if (value == null) return 0;
@@ -94,22 +97,81 @@
         }
     }
 
+    /**
+     * @since MMBase-1.9.3
+     */
+    public MimeType getMimeType(Object value, Node node, Field field) {
+        if (value == null) return MimeType.OCTETSTREAM;
+        String mt;
+        if (value instanceof byte[]) {
+            byte[] array = (byte[]) value;
+            mt = 
org.mmbase.util.magicfile.MagicFile.getInstance().getMimeType(array);
+        } else if (value instanceof FileItem) {
+            FileItem fi = (FileItem) value;
+            mt = fi.getContentType();
+        } else if (value instanceof SerializableInputStream) {
+            SerializableInputStream sis = (SerializableInputStream) value;
+            mt = sis.getContentType();
+        } else {
+            mt = Casting.toSerializableInputStream(value).getContentType();
+        }
+        if (mt == null || mt.equals(MagicFile.FAILED)) {
+            return MimeType.OCTETSTREAM;
+        } else {
+            return new MimeType(mt);
+        }
+    }
+
     @Override
     protected Collection<LocalizedString> 
validateRequired(Collection<LocalizedString> errors, Object castValue, Object 
value, Node  node, Field field) {
         return requiredRestriction.validate(errors, castValue, node, field);
     }
 
+    @Override
+    protected Collection<LocalizedString> 
validateCastValue(Collection<LocalizedString> errors, Object castValue, Object 
value, Node node, Field field) {
+        errors = super.validateCastValue(errors, castValue, value,  node, 
field);
+        errors = mimeTypeRestriction.validate(errors, castValue, node, field);
+        return errors;
+    }
 
     /**
      * Returns a regular expression which describes wich mime-types are valid 
for blobs with this
      * DataType. This is not yet available as a Restriction, only as a 
property.
      */
     public Pattern getValidMimeTypes() {
-        return validMimeTypes;
+        return mimeTypeRestriction.getValue();
     }
 
     public void setValidMimeTypes(Pattern pattern) {
-        validMimeTypes = pattern;
+        mimeTypeRestriction.setValue(pattern);
     }
 
+    /**
+     * @since MMBase-2.0
+     */
+    protected class MimeTypeRestriction extends AbstractRestriction<Pattern> {
+        private static final long serialVersionUID = 0L;
+
+        MimeTypeRestriction(MimeTypeRestriction source) {
+            super(source);
+        }
+        MimeTypeRestriction(Pattern p) {
+            super("mimetype", p);
+        }
+        @Override
+        protected boolean simpleValid(Object v, Node node, Field field) {
+            if (value == null || value.pattern().equals(".*")) {
+                // avoid depending on mime type, no need, because no 
restriction applies
+                return true;
+            }
+            MimeType s = BinaryDataType.this.getMimeType(v, node, field);
+            boolean res = s == null ? false : 
value.matcher(s.toString()).matches();
+            if (log.isDebugEnabled()) {
+                log.debug("VALIDATING " + v + "->" + s + " with " + getValue() 
+ " -> " + res);
+            }
+            return res;
+        }
+    }
+
+
 }

Modified: 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/datatypes/resources/datatypes.properties
===================================================================
--- 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/datatypes/resources/datatypes.properties
   2010-02-15 17:36:26 UTC (rev 41024)
+++ 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/datatypes/resources/datatypes.properties
   2010-02-15 17:51:03 UTC (rev 41025)
@@ -3,7 +3,6 @@
 binary.maxLength.error=The value must be no more than ${CONSTRAINTVALUE} bytes 
long.
 boolean.required.error=A value is required.
 boolean.unique.error=The value '${VALUE}' already exists - it should be unique.
-boolean.value.error=The checkbox must be checked
 datetime.required.error=A value is required.
 datetime.unique.error=The value '${VALUE}' already exists - it should be 
unique.
 datetime.minInclusive.error=The value '${VALUE}' may not be earlier than the 
minimum value ${CONSTRAINTVALUE}
@@ -83,3 +82,5 @@
 
 decimal.scale.error=Too many decimal places indicated
 decimal.precision.error=Maximal precision is only ${CONSTRAINTVALUE}
+
+binary.mimetype.error=The mimetype of value '${VALUE}' does not match 
'${CONSTRAINTVALUE}'.
\ No newline at end of file

Modified: 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/datatypes/resources/datatypes_nl.properties
===================================================================
--- 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/datatypes/resources/datatypes_nl.properties
        2010-02-15 17:36:26 UTC (rev 41024)
+++ 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/datatypes/resources/datatypes_nl.properties
        2010-02-15 17:51:03 UTC (rev 41025)
@@ -4,7 +4,6 @@
 binary.maxLength.error=De waarde moet minder lang zijn dan ${CONSTRAINTVALUE}
 boolean.required.error=Een waarde is verplicht
 boolean.unique.error=De waarde '${VALUE}' bestaat al - het moet uniek zijn
-boolean.value.error=Je moet dit aanvinken
 datetime.required.error=Een waarde is verplicht
 datetime.unique.error=De waarde '${VALUE}' bestaat al - het moet uniek zijn
 datetime.minInclusive.error=De waarde '${VALUE}' is voor ${CONSTRAINTVALUE}
@@ -80,3 +79,5 @@
 
 decimal.scale.error=Te veel cijfers achter de komma
 decimal.precision.error=Het maximaal aantal cijfers is ${CONSTRAINTVALUE}
+
+binary.mimetype.error=Het bestandstype van '${VALUE}' correspondeert niet met 
'${CONSTRAINTVALUE}'.
\ No newline at end of file

Added: 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/util/MimeType.java
===================================================================
--- mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/util/MimeType.java 
                        (rev 0)
+++ mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/util/MimeType.java 
2010-02-15 17:51:03 UTC (rev 41025)
@@ -0,0 +1,78 @@
+/*
+
+This software is OSI Certified Open Source Software.
+OSI Certified is a certification mark of the Open Source Initiative.
+
+The license (Mozilla version 1.0) can be read at the MMBase site.
+See http://www.MMBase.org/license
+
+*/
+package org.mmbase.util;
+
+/**
+ *
+ * @author Michiel Meeuwissen
+ * @since MMBase-2.0
+ */
+
+public class MimeType implements java.io.Serializable {
+    private static final long serialVersionUID = 0L;
+
+    public static final String STAR = "*";
+    public static final MimeType ANY = new MimeType(STAR, STAR);
+    public static final MimeType OCTETSTREAM = new MimeType("application", 
"octet-stream");
+
+    private final String type;
+    private final String subType;
+
+
+    public MimeType(String s) {
+        if (s != null && s.length() > 0) {
+            String[] m = s.split("/", 2);
+            type = m[0];
+            if (m.length > 1) {
+                subType = m[1];
+            } else {
+                subType = STAR;
+            }
+        } else {
+            type = STAR;
+            subType = STAR;
+        }
+    }
+    public MimeType(String t, String s) {
+        type = t;
+        subType = s;
+    }
+
+    public String getType() {
+        return type;
+    }
+    public String getSubType() {
+        return subType;
+    }
+
+    public String toString() {
+        return type + "/" + subType;
+    }
+
+    public boolean matches(MimeType mt) {
+        return
+            (type.equals(STAR) || mt.type.equals(STAR) || 
type.equals(mt.type)) &&
+            (subType.equals(STAR) || mt.subType.equals(STAR) || 
subType.equals(mt.subType));
+    }
+    @Override
+    public int hashCode() {
+        return type.hashCode()  + 13 * subType.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o instanceof MimeType) {
+            MimeType m = (MimeType) o;
+            return m.type.equals(type) && m.subType.equals(subType);
+        } else {
+            return false;
+        }
+    }
+}

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

Reply via email to