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