Author: tolusha
Date: 2011-02-04 04:26:44 -0500 (Fri, 04 Feb 2011)
New Revision: 3917
Added:
kernel/trunk/exo.kernel.commons/src/test/java/org/exoplatform/commons/utils/TestMimeTypeResolver.java
Modified:
kernel/trunk/exo.kernel.commons/src/main/java/org/exoplatform/commons/utils/MimeTypeResolver.java
kernel/trunk/exo.kernel.commons/src/main/resources/org/exoplatform/commons/utils/mimetypes.properties
Log:
EXOJCR-1182: MimeTypeResolver does not work well with IE7
Modified:
kernel/trunk/exo.kernel.commons/src/main/java/org/exoplatform/commons/utils/MimeTypeResolver.java
===================================================================
---
kernel/trunk/exo.kernel.commons/src/main/java/org/exoplatform/commons/utils/MimeTypeResolver.java 2011-02-03
20:40:43 UTC (rev 3916)
+++
kernel/trunk/exo.kernel.commons/src/main/java/org/exoplatform/commons/utils/MimeTypeResolver.java 2011-02-04
09:26:44 UTC (rev 3917)
@@ -20,25 +20,34 @@
import java.io.IOException;
import java.security.PrivilegedExceptionAction;
-import java.util.Iterator;
-import java.util.Properties;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Scanner;
public class MimeTypeResolver
{
+ private Map<String, List<String>> mimeTypes = new HashMap<String,
List<String>>();
- private Properties mimeTypes = new Properties();
+ private Map<String, List<String>> extentions = new HashMap<String,
List<String>>();
private String defaultMimeType = "application/octet-stream";
public MimeTypeResolver()
{
+ Scanner scanner = null;
try
{
SecurityHelper.doPrivilegedIOExceptionAction(new
PrivilegedExceptionAction<Void>()
{
public Void run() throws Exception
{
-
mimeTypes.load(getClass().getResourceAsStream("mimetypes.properties"));
+ Scanner scanner = new
Scanner(getClass().getResourceAsStream("mimetypes.properties"));
+ while (scanner.hasNextLine())
+ {
+ processLine(scanner.nextLine());
+ }
return null;
}
});
@@ -47,18 +56,44 @@
{
throw new InternalError("Unable to load mimetypes: " + e.toString());
}
+ finally
+ {
+ if (scanner != null)
+ {
+ scanner.close();
+ }
+ }
}
+ /**
+ * Returns default MIMEType.
+ *
+ * @return String
+ */
public String getDefaultMimeType()
{
return defaultMimeType;
}
+ /**
+ * Set default MIMEType.
+ *
+ * @param defaultMimeType
+ * String, default MIMEType
+ */
public void setDefaultMimeType(String defaultMimeType)
{
this.defaultMimeType = defaultMimeType;
}
+ /**
+ * Get MIMEType which corresponds to file extension. If file extension is unknown the
default
+ * MIMEType will be returned. If there are more than one MIMETypes for specific
extension the
+ * first occurred in the list will be returned.
+ *
+ * @param filename
+ * @return String MIMEType
+ */
public String getMimeType(String filename)
{
String ext = filename.substring(filename.lastIndexOf(".") + 1);
@@ -66,28 +101,83 @@
{
ext = filename;
}
- return mimeTypes.getProperty(ext.toLowerCase(), defaultMimeType);
+
+ List<String> values = mimeTypes.get(ext);
+ return values == null ? defaultMimeType : values.get(0);
}
+ /**
+ * Get file extension corresponds to MIMEType. If MIMEType is empty or equals
+ * default MIMEType empty string will be returned. If there is no file extension
+ * for specific MIMEType the empty string will be returned also. In case when
+ * there are more than one extension for specific MIMEType the first occurred
+ * extension in the list will be returned if MIMEType ends with this extension
+ * otherwise just first occurred.
+ *
+ * @param mimeType
+ * MIMEType
+ * @return file extension
+ */
public String getExtension(String mimeType)
{
- if (mimeType.equals("") || mimeType.equals(defaultMimeType))
+ if (mimeType.isEmpty() || mimeType.equals(defaultMimeType))
+ {
return "";
- Iterator iterator = mimeTypes.keySet().iterator();
- // if true than this flag define multiple mimetypes for different extensions
- // exists
- String ext = "";
- while (iterator.hasNext())
+ }
+
+ List<String> values = extentions.get(mimeType);
+ if (values == null)
{
- String key = (String)iterator.next();
- String value = (String)mimeTypes.get(key);
- if (value.equals(mimeType) && mimeType.endsWith(key))
- return key;
- if (value.equals(mimeType) && ext.equals(""))
- ext = new String(key);
- else if (value.equals(mimeType) && (!ext.equals("")))
+ return "";
+ }
+
+ String resultExt = "";
+ for (String ext : values)
+ {
+ if (mimeType.endsWith(ext))
+ {
return ext;
+ }
+
+ if (resultExt.isEmpty())
+ {
+ resultExt = new String(ext);
+ }
}
- return ext;
+ return resultExt;
}
+
+ /**
+ * Load MIMEType and corresponding extension.
+ *
+ * @param aLine
+ */
+ protected void processLine(String aLine)
+ {
+ Scanner scanner = new Scanner(aLine);
+ scanner.useDelimiter("=");
+ while (scanner.hasNext())
+ {
+ String ext = scanner.next();
+ String mimetype = scanner.next();
+
+ // add mimetype
+ List<String> values = mimeTypes.get(ext);
+ if (values == null)
+ {
+ values = new ArrayList<String>();
+ mimeTypes.put(ext, values);
+ }
+ values.add(mimetype);
+
+ // add extension
+ values = extentions.get(mimetype);
+ if (values == null)
+ {
+ values = new ArrayList<String>();
+ extentions.put(mimetype, values);
+ }
+ values.add(ext);
+ }
+ }
}
Modified:
kernel/trunk/exo.kernel.commons/src/main/resources/org/exoplatform/commons/utils/mimetypes.properties
===================================================================
---
kernel/trunk/exo.kernel.commons/src/main/resources/org/exoplatform/commons/utils/mimetypes.properties 2011-02-03
20:40:43 UTC (rev 3916)
+++
kernel/trunk/exo.kernel.commons/src/main/resources/org/exoplatform/commons/utils/mimetypes.properties 2011-02-04
09:26:44 UTC (rev 3917)
@@ -42,6 +42,7 @@
iges=model/iges
igs=model/iges
jpeg=image/jpeg
+jpeg=image/pjpeg
jpe=image/jpeg
jpg=image/jpeg
bmp=image/bmp
@@ -55,7 +56,7 @@
mesh=model/mesh
mid=audio/midi
midi=audio/midi
-mif=application/vnd=mif
+mif=application/vnd.mif
mov=video/quicktime
m4v=video/x-m4v
m4a=audio/x-m4a
@@ -77,6 +78,7 @@
pgm=image/x-portable-graymap
pgn=application/x-chess-pgn
png=image/png
+png=image/x-png
pnm=image/x-portable-anymap
ppm=image/x-portable-pixmap
ppt=application/ppt
Added:
kernel/trunk/exo.kernel.commons/src/test/java/org/exoplatform/commons/utils/TestMimeTypeResolver.java
===================================================================
---
kernel/trunk/exo.kernel.commons/src/test/java/org/exoplatform/commons/utils/TestMimeTypeResolver.java
(rev 0)
+++
kernel/trunk/exo.kernel.commons/src/test/java/org/exoplatform/commons/utils/TestMimeTypeResolver.java 2011-02-04
09:26:44 UTC (rev 3917)
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.commons.utils;
+
+import junit.framework.TestCase;
+
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * Date: 3 02 2011
+ *
+ * @author <a href="mailto:anatoliy.bazko@exoplatform.com.ua">Anatoliy
Bazko</a>
+ * @version $Id: TestMimeTypeResolver.java 34360 2010-11-11 11:11:11Z tolusha $
+ */
+public class TestMimeTypeResolver extends TestCase
+{
+
+ private MimeTypeResolver resolver = new MimeTypeResolver();
+
+ public void testGetMimeType()
+ {
+ assertEquals(resolver.getDefaultMimeType(),
resolver.getMimeType("file.unknown-file-extension"));
+ assertEquals(resolver.getDefaultMimeType(),
resolver.getMimeType("unknown-file-extension"));
+ assertEquals(resolver.getDefaultMimeType(), resolver.getMimeType(""));
+
+ // there are two MIMETypes for jpeg extension [image/jpeg, image/pjpeg], check the
first one
+ assertEquals("image/jpeg",
resolver.getMimeType("image.jpeg"));
+ assertEquals("image/jpeg", resolver.getMimeType("jpeg"));
+
+ assertEquals("application/vnd.ms-outlook",
resolver.getMimeType("my.msg"));
+ }
+
+ public void testGetExtension()
+ {
+ assertEquals("jpeg", resolver.getExtension("image/jpeg"));
+ assertEquals("jpeg", resolver.getExtension("image/pjpeg"));
+
+ assertEquals("", resolver.getExtension(""));
+ assertEquals("", resolver.getExtension("unknown-mimetype"));
+ assertEquals("", resolver.getExtension(resolver.getDefaultMimeType()));
+
+ assertEquals("msg",
resolver.getExtension("application/vnd.ms-outlook"));
+
+ // there are two file extension for audio/midi MIMEType [mid, midi]
+ // should be returned "midi" as MIMEType ends with "midi"
+ assertEquals("midi", resolver.getExtension("audio/midi"));
+
+ // there are two file extension for application/x-director MIMEType [dcr, dir]
+ // should be returned "dcr" as first occurred
+ assertEquals("dcr",
resolver.getExtension("application/x-director"));
+ }
+}