001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017:
018: package org.apache.harmony.luni.internal.net.www;
019:
020: import java.io.File;
021: import java.io.FileInputStream;
022: import java.io.IOException;
023: import java.io.InputStream;
024: import java.net.FileNameMap;
025: import java.security.AccessController;
026: import java.security.PrivilegedAction;
027: import java.util.Properties;
028:
029: /**
030: * Instances of this class map file extensions to MIME content types based on a
031: * default MIME table.
032: *
033: * The default values can be overridden by modifying the contents of the file
034: * "content-types.properties".
035: */
036: public class MimeTable implements FileNameMap {
037:
038: public static final String UNKNOWN = "content/unknown"; //$NON-NLS-1$
039:
040: /**
041: * A hash table containing the mapping between extensions and mime types.
042: */
043: public static final Properties types = new Properties();
044:
045: // Default mapping.
046: static {
047: types.setProperty("text", "text/plain"); //$NON-NLS-1$ //$NON-NLS-2$
048: types.setProperty("txt", "text/plain"); //$NON-NLS-1$ //$NON-NLS-2$
049: types.setProperty("htm", "text/html"); //$NON-NLS-1$ //$NON-NLS-2$
050: types.setProperty("html", "text/html"); //$NON-NLS-1$ //$NON-NLS-2$
051: }
052:
053: /**
054: * Constructs a MIME table using the default values defined in this class.
055: *
056: * It then augments this table by reading pairs of extensions and
057: * corresponding content types from the file "content-types.properties",
058: * which is represented in standard java.util.Properties.load(...) format.
059: */
060: public MimeTable() {
061: InputStream str = AccessController
062: .doPrivileged(new PrivilegedAction<InputStream>() {
063: public InputStream run() {
064: return getContentTypes();
065: }
066: });
067:
068: if (str != null) {
069: try {
070: try {
071: types.load(str);
072: } finally {
073: str.close();
074: }
075: } catch (IOException ex) {
076: // Ignore
077: }
078: }
079: }
080:
081: /**
082: * Answer an InputStream over an external properties file containing the
083: * MIME types.
084: *
085: * Looks in the location specified in the user property, and then in the
086: * expected location.
087: *
088: * @return the InputStream, or null if none.
089: */
090: private InputStream getContentTypes() {
091: // User override?
092: String userTable = System
093: .getProperty("content.types.user.table"); //$NON-NLS-1$
094: if (userTable != null) {
095: try {
096: return new FileInputStream(userTable);
097: } catch (IOException e) {
098: // Ignore invalid values
099: }
100: }
101:
102: // Standard location?
103: String javahome = System.getProperty("java.home"); //$NON-NLS-1$
104: File contentFile = new File(javahome, "lib" //$NON-NLS-1$
105: + File.separator + "content-types.properties"); //$NON-NLS-1$
106: try {
107: return new FileInputStream(contentFile);
108: } catch (IOException e) {
109: // Not found or can't read
110: }
111:
112: return null;
113: }
114:
115: /**
116: * Determines the MIME type for the given filename.
117: *
118: * @param filename
119: * The file whose extension will be mapped.
120: *
121: * @return The mime type associated with the file's extension or null if no
122: * mapping is known.
123: */
124: public String getContentTypeFor(String filename) {
125: if (filename.endsWith("/")) { //$NON-NLS-1$
126: // a directory, return html
127: return (String) types.get("html"); //$NON-NLS-1$
128: }
129: int lastCharInExtension = filename.lastIndexOf('#');
130: if (lastCharInExtension < 0) {
131: lastCharInExtension = filename.length();
132: }
133: int firstCharInExtension = filename.lastIndexOf('.') + 1;
134: String ext = ""; //$NON-NLS-1$
135: if (firstCharInExtension > filename.lastIndexOf('/')) {
136: ext = filename.substring(firstCharInExtension,
137: lastCharInExtension);
138: }
139: return types.getProperty(ext.toLowerCase());
140: }
141: }
|