Fix for ALF-2118:

- Added new method to MimetypeService to retrieve a valid mimetype given any extension, handling case and missing values
 - Updated JUnit tests for MimetypeService methods
 - Fixed callers of MimetypeService to use new method to protect against varying case of file extensions (ALF-2118 root cause)

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@19400 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Kevin Roast
2010-03-19 14:45:29 +00:00
parent 7647f1e449
commit c2ddf8dc14
3 changed files with 52 additions and 14 deletions

View File

@@ -26,16 +26,16 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import org.springframework.extensions.config.Config;
import org.springframework.extensions.config.ConfigElement;
import org.springframework.extensions.config.ConfigLookupContext;
import org.springframework.extensions.config.ConfigService;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.repo.content.encoding.ContentCharsetFinder;
import org.alfresco.service.cmr.repository.MimetypeService;
import org.alfresco.util.PropertyCheck;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.extensions.config.Config;
import org.springframework.extensions.config.ConfigElement;
import org.springframework.extensions.config.ConfigLookupContext;
import org.springframework.extensions.config.ConfigService;
/**
* Provides a bidirectional mapping between well-known mimetypes and
@@ -295,15 +295,28 @@ public class MimetypeMap implements MimetypeService
public String getExtension(String mimetype)
{
String extension = extensionsByMimetype.get(mimetype);
if (extension == null)
{
return EXTENSION_BINARY;
return (extension == null ? EXTENSION_BINARY : extension);
}
else
/**
* Get the mimetype for the specified extension
*
* @param extension a valid file extension
* @return Returns a valid mimetype if found, or {@link #MIMETYPE_BINARY binary} as default.
*/
public String getMimetype(String extension)
{
return extension;
String mimetype = MIMETYPE_BINARY;
if (extension != null)
{
extension = extension.toLowerCase();
if (mimetypesByExtension.containsKey(extension))
{
mimetype = mimetypesByExtension.get(extension);
}
}
return mimetype;
}
public Map<String, String> getDisplaysByExtension()
{
@@ -340,13 +353,12 @@ public class MimetypeMap implements MimetypeService
*/
public String guessMimetype(String filename)
{
filename = filename.toLowerCase();
String mimetype = MIMETYPE_BINARY;
// extract the extension
int index = filename.lastIndexOf('.');
if (index > -1 && (index < filename.length() - 1))
{
String extension = filename.substring(index + 1);
String extension = filename.substring(index + 1).toLowerCase();
if (mimetypesByExtension.containsKey(extension))
{
mimetype = mimetypesByExtension.get(extension);

View File

@@ -80,4 +80,23 @@ public class MimetypeMapTest extends TestCase
assertNotNull("No charset finder", mimetypeService.getContentCharsetFinder());
}
public void testMimetypeFromExtension() throws Exception
{
// test known mimetype
assertEquals("application/msword", mimetypeService.getMimetype("doc"));
// test case insensitivity
assertEquals("application/msword", mimetypeService.getMimetype("DOC"));
// test fallback for unknown and missing
assertEquals(MimetypeMap.MIMETYPE_BINARY, mimetypeService.getMimetype(null));
assertEquals(MimetypeMap.MIMETYPE_BINARY, mimetypeService.getMimetype("unknownext"));
}
public void testGuessMimetypeForFilename() throws Exception
{
assertEquals("application/msword", mimetypeService.guessMimetype("something.doc"));
assertEquals("application/msword", mimetypeService.guessMimetype("SOMETHING.DOC"));
assertEquals(MimetypeMap.MIMETYPE_BINARY, mimetypeService.guessMimetype("noextension"));
assertEquals(MimetypeMap.MIMETYPE_BINARY, mimetypeService.guessMimetype("file.unknownext"));
}
}

View File

@@ -31,7 +31,6 @@ import org.alfresco.service.PublicService;
* This service interface provides support for Mimetypes.
*
* @author Derek Hulley
*
*/
@PublicService
public interface MimetypeService
@@ -41,11 +40,19 @@ public interface MimetypeService
*
* @param mimetype a valid mimetype
* @return Returns the default extension for the mimetype
* @throws AlfrescoRuntimeException if the mimetype doesn't exist
*/
@NotAuditable
public String getExtension(String mimetype);
/**
* Get the mimetype for the specified extension
*
* @param extension a valid file extension
* @return Returns a valid mimetype if found, or null if does not exist
*/
@NotAuditable
public String getMimetype(String extension);
/**
* Get all human readable mimetype descriptions indexed by mimetype extension
*