/* * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package flex2.compiler.util; import java.util.*; /** * Map MIME types to file extensions * * @author Clement Wong */ public final class MimeMappings { public static final String MXML = "text/mxml"; public static final String AS = "text/as"; public static final String FXG = "text/fxg"; public static final String ABC = "application/x-actionscript-bytecode"; public static final String CSS = "text/css"; public static final String PROPERTIES = "text/properties"; public static final String JPEG = "image/jpeg"; public static final String JPG = "image/jpg"; public static final String PNG = "image/png"; public static final String GIF = "image/gif"; public static final String SVG = "image/svg"; public static final String SVG_XML = "image/svg-xml"; public static final String MP3 = "audio/mpeg"; public static final String FLASH = "application/x-shockwave-flash"; public static final String XML = "text/xml"; public static final String TTF = "application/x-font-truetype"; public static final String TTC = "application/x-font-truetype-collection"; public static final String OTF = "application/x-font-opentype"; public static final String FONT = "application/x-font"; public static final String DFONT = "application/x-dfont"; public static final String PBJ = "application/x-pbj"; public static final String TIFF = "image/tiff"; public static final String SKIN = "skin"; public MimeMappings() { mimeMappings = new HashMap<String, Object>(); set(MXML, ".mxml"); set(AS, ".as"); set(FXG, ".fxg"); set(ABC, ".abc"); set(CSS, ".css"); set(PROPERTIES, ".properties"); set(JPEG, new String[] { ".jpg", ".jpeg" }); set(JPG, new String[] { ".jpg", ".jpeg" }); set(PNG, ".png"); set(GIF, ".gif"); set(SVG, new String[] { ".svg", ".svgz" }); set(MP3, ".mp3"); set(FLASH, ".swf"); set(XML, ".xml"); set(TTF, ".ttf"); set(TTC, ".ttc"); set(OTF, ".otf"); set(DFONT, ".dfont"); set(PBJ, ".pbj"); set(TIFF, new String[] { ".tiff", ".tif" }); } /** * String->{String,String[]} */ private Map<String, Object> mimeMappings; /** * set file extensions. existing file extensions will be overriden. * * @param mimeType * @param extensions */ public void set(String mimeType, String[] extensions) { mimeMappings.put(mimeType, extensions); } /** * set file extensions. existing file extensions will be overriden. * * @param mimeType * @param extension */ public void set(String mimeType, String extension) { mimeMappings.put(mimeType, extension); } /** * add file extensions. keep the existing file extensions. * * @param mimeType * @param extensions */ public void add(String mimeType, String[] extensions) { if (extensions == null) { return; } Object value = mimeMappings.get(mimeType); String[] a = null; if (value instanceof String[]) { String[] old = (String[]) value; a = new String[old.length + extensions.length]; System.arraycopy(old, 0, a, 0, old.length); System.arraycopy(extensions, 0, a, a.length, extensions.length); } else if (value instanceof String) { a = new String[1 + extensions.length]; a[0] = (String) value; System.arraycopy(extensions, 0, a, 1, extensions.length); } else { a = new String[extensions.length]; System.arraycopy(extensions, 0, a, 0, extensions.length); } mimeMappings.put(mimeType, a); } /** * add file extension. keep the existing file extensions. * * @param mimeType * @param extensions */ public void add(String mimeType, String extension) { if (extension == null) { return; } Object value = mimeMappings.get(mimeType); String[] a = null; if (value instanceof String[]) { String[] old = (String[]) value; a = new String[old.length + 1]; System.arraycopy(old, 0, a, 0, old.length); a[a.length - 1] = extension; mimeMappings.put(mimeType, a); } else if (value instanceof String) { a = new String[2]; a[0] = (String) value; a[1] = extension; mimeMappings.put(mimeType, a); } else { mimeMappings.put(mimeType, extension); } } /** * remove file extensions. * * @param mimeType */ public void remove(String mimeType) { mimeMappings.remove(mimeType); } /** * find a MIME type based on the specified name. * * @param name * @return */ public String findMimeType(String name) { for (Iterator<String> i = mimeMappings.keySet().iterator(); i.hasNext();) { String mimeType = i.next(); Object value = mimeMappings.get(mimeType); if (value instanceof String[]) { String[] extensions = (String[]) value; for (int j = 0, size = extensions.length; j < size; j++) { int nlen = name.length(); int elen = extensions[j].length(); if (nlen > elen && name.regionMatches(true, nlen - elen, extensions[j], 0, elen)) { return mimeType; } } } else if (value instanceof String) { int nlen = name.length(); int elen = ((String) value).length(); if (nlen > elen && name.regionMatches(true, nlen - elen, (String) value, 0, elen)) { return mimeType; } } } return null; } /** * find a file extension based on the specified MIME type. * * @param mimeType * @return */ public String findExtension(String mimeType) { Object value = mimeMappings.get(mimeType); if (value instanceof String[]) { // C: should really return a list of extensions... return ((String[]) value)[0]; } else if (value instanceof String) { return (String) value; } else { return null; } } // By default, the static methods use ThreacLocal. if the ThreadLocal isn't available, // the methods will use the static version... private static MimeMappings statics = new MimeMappings(); public static String getMimeType(String name) { // AJH skip threading safety for now //MimeMappings mappings = ThreadLocalToolkit.getMimeMappings(); //if (mappings == null) //{ // synchronized(statics) // { return statics.findMimeType(name); // } //} //else //{ // return mappings.findMimeType(name); //} } public static String getExtension(String mimeType) { // AJH skip threading safety for now //MimeMappings mappings = ThreadLocalToolkit.getMimeMappings(); //if (mappings == null) //{ // synchronized(statics) // { return statics.findExtension(mimeType); // } //} //else //{ // return mappings.findExtension(mimeType); //} } }