001: // Copyright © 2002-2007 Canoo Engineering AG, Switzerland.
002: package com.canoo.webtest.engine;
003:
004: import java.util.HashMap;
005: import java.util.Map;
006:
007: /**
008: * Contains mapping between mime types and preferred extension.
009: * This is used when saving received content to determine file extension from the received mime type.
010: * @author Marc Guillemot
011: * @author Paul King
012: */
013: public class MimeMap {
014:
015: // Defaults - all of them are "well-known" types,
016:
017: private static final Map DEFAULT_MAP = new HashMap(101);
018: public static final String EXCEL_MIME_TYPE = "application/vnd.ms-excel";
019: public static final String UNKNOWN_BINARY_MIME_TYPE = "application/octet-stream";
020:
021: static {
022: DEFAULT_MAP.put("application/java", "class");
023: DEFAULT_MAP.put("application/mac-binhex40", "hqx");
024: DEFAULT_MAP.put("application/octet-stream", "bin");
025: DEFAULT_MAP.put("application/oda", "oda");
026: DEFAULT_MAP.put("application/pdf", "pdf");
027: DEFAULT_MAP.put("application/vnd.ms-excel", "xls");
028: DEFAULT_MAP.put("application/postscript", "ps");
029: DEFAULT_MAP.put("application/rtf", "rtf");
030: DEFAULT_MAP.put("application/xhtml+xml", "html");
031: DEFAULT_MAP.put("application/xml", "xml");
032: DEFAULT_MAP.put("application/x-bcpio", "bcpio");
033: DEFAULT_MAP.put("application/x-compress", "Z");
034: DEFAULT_MAP.put("application/x-cpio", "cpio");
035: DEFAULT_MAP.put("application/x-csh", "csh");
036: DEFAULT_MAP.put("application/x-dvi", "dvi");
037: DEFAULT_MAP.put("application/x-gtar", "gtar");
038: DEFAULT_MAP.put("application/x-gzip", "gz");
039: DEFAULT_MAP.put("application/x-hdf", "hdf");
040: DEFAULT_MAP.put("application/x-javascript", "js");
041: DEFAULT_MAP.put("application/x-latex", "latex");
042: DEFAULT_MAP.put("application/x-mif", "mif");
043: DEFAULT_MAP.put("application/x-netcdf", "cdf");
044: DEFAULT_MAP.put("application/x-postscript", "ps");
045: DEFAULT_MAP.put("application/x-sh", "sh");
046: DEFAULT_MAP.put("application/x-shar", "shar");
047: DEFAULT_MAP.put("application/x-shockwave-flash", "swf");
048: DEFAULT_MAP.put("application/x-sv4cpio", "sv4cpio");
049: DEFAULT_MAP.put("application/x-sv4crc", "sv4crc");
050: DEFAULT_MAP.put("application/x-tar", "tar");
051: DEFAULT_MAP.put("application/x-tcl", "tcl");
052: DEFAULT_MAP.put("application/x-tex", "tex");
053: DEFAULT_MAP.put("application/x-texinfo", "texinfo");
054: DEFAULT_MAP.put("application/x-troff", "t");
055: DEFAULT_MAP.put("application/x-troff-man", "man");
056: DEFAULT_MAP.put("application/x-troff-me", "me");
057: DEFAULT_MAP.put("application/x-ustar", "ustar");
058: DEFAULT_MAP.put("application/x-wais-source", "ms");
059: DEFAULT_MAP.put("application/x-x509-ca-cert", "cer");
060: DEFAULT_MAP.put("application/zip", "zip");
061: DEFAULT_MAP.put("audio/basic", "au");
062: DEFAULT_MAP.put("audio/x-aiff", "aif");
063: DEFAULT_MAP.put("audio/x-aiff", "aifc");
064: DEFAULT_MAP.put("audio/x-aiff", "aiff");
065: DEFAULT_MAP.put("audio/x-wav", "wav");
066: DEFAULT_MAP.put("text/html", "html");
067: DEFAULT_MAP.put("text/xhtml", "html");
068: DEFAULT_MAP.put("text/xml", "xml");
069: DEFAULT_MAP.put("text/javascript", "js");
070: DEFAULT_MAP.put("image/gif", "gif");
071: DEFAULT_MAP.put("image/ief", "ief");
072: DEFAULT_MAP.put("image/jpeg", "jpg");
073: DEFAULT_MAP.put("image/tiff", "tif");
074: DEFAULT_MAP.put("image/x-cmu-raster", "ras");
075: DEFAULT_MAP.put("image/x-portable-anymap", "pnm");
076: DEFAULT_MAP.put("image/x-portable-bitmap", "pbm");
077: DEFAULT_MAP.put("image/x-portable-graymap", "pgm");
078: DEFAULT_MAP.put("image/x-portable-pixmap", "ppm");
079: DEFAULT_MAP.put("image/x-rgb", "rgb");
080: DEFAULT_MAP.put("image/x-xbitmap", "xbm");
081: DEFAULT_MAP.put("image/x-xpixmap", "xpm");
082: DEFAULT_MAP.put("image/x-xwindowdump", "xwd");
083: DEFAULT_MAP.put("text/css", "css");
084: // text/plain not needed (see default for text below)
085: DEFAULT_MAP.put("text/richtext", "rtx");
086: DEFAULT_MAP.put("text/tab-separated-values", "tsv");
087: DEFAULT_MAP.put("text/x-java", "java");
088: DEFAULT_MAP.put("text/x-setext", "etx");
089: DEFAULT_MAP.put("video/mpeg", "mpeg");
090: DEFAULT_MAP.put("video/mpeg2", "mpv2");
091: DEFAULT_MAP.put("video/quicktime", "mov");
092: DEFAULT_MAP.put("video/x-msvideo", "avi");
093: DEFAULT_MAP.put("video/x-rad-screenplay", "avx");
094: DEFAULT_MAP.put("video/x-sgi-movie", "movie");
095: DEFAULT_MAP.put("x-world/x-vrml", "wrl");
096: }
097:
098: // Mime Types should roughly be consistent with HtmlUnit
099: public static String getExtension(final String contentType) {
100: if (DEFAULT_MAP.containsKey(contentType)) {
101: return (String) DEFAULT_MAP.get(contentType);
102: }
103: if (contentType.matches("application/.*xhtml\\+xml")) {
104: return "html";
105: }
106: if (contentType.matches("application/.*\\+xml")) {
107: return "xml";
108: }
109: if (contentType.startsWith("text/")) {
110: return "txt";
111: }
112: return "unknown";
113: }
114:
115: /**
116: * HtmlUnit doesn't guess contentType of Excel files from the file system.
117: * Should probably be moved to htmlunit.
118: */
119: public static String adjustMimeTypeIfNeeded(
120: final String contentType, final String responseFileName) {
121: if (UNKNOWN_BINARY_MIME_TYPE.equals(contentType)) {
122: if (responseFileName != null
123: && responseFileName.endsWith(".xls")) {
124: return EXCEL_MIME_TYPE;
125: }
126: }
127: return contentType;
128: }
129: }
|