1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * this work for additional information regarding copyright ownership. 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (the "License"); you may not use this file except in compliance with 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the License. You may obtain a copy of the License at 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.apache.harmony.luni.internal.net.www; 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.File; 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.FileInputStream; 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.IOException; 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.InputStream; 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.net.FileNameMap; 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.AccessController; 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.PrivilegedAction; 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Properties; 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Instances of this class map file extensions to MIME content types based on a 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * default MIME table. 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The default values can be overridden by modifying the contents of the file 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "content-types.properties". 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class MimeTable implements FileNameMap { 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static final String UNKNOWN = "content/unknown"; //$NON-NLS-1$ 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * A hash table containing the mapping between extensions and mime types. 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static final Properties types = new Properties(); 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Default mapping. 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static { 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project types.setProperty("text", "text/plain"); //$NON-NLS-1$ //$NON-NLS-2$ 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project types.setProperty("txt", "text/plain"); //$NON-NLS-1$ //$NON-NLS-2$ 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project types.setProperty("htm", "text/html"); //$NON-NLS-1$ //$NON-NLS-2$ 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project types.setProperty("html", "text/html"); //$NON-NLS-1$ //$NON-NLS-2$ 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 543819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * Constructs a MIME table using the default values defined in this class. 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * It then augments this table by reading pairs of extensions and 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * corresponding content types from the file "content-types.properties", 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * which is represented in standard java.util.Properties.load(...) format. 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public MimeTable() { 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project InputStream str = AccessController 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .doPrivileged(new PrivilegedAction<InputStream>() { 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public InputStream run() { 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return getContentTypes(); 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project }); 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (str != null) { 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project types.load(str); 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } finally { 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str.close(); 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (IOException ex) { 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Ignore 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Answer an InputStream over an external properties file containing the 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * MIME types. 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Looks in the location specified in the user property, and then in the 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected location. 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the InputStream, or null if none. 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private InputStream getContentTypes() { 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // User override? 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String userTable = System.getProperty("content.types.user.table"); //$NON-NLS-1$ 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (userTable != null) { 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return new FileInputStream(userTable); 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (IOException e) { 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Ignore invalid values 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Standard location? 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String javahome = System.getProperty("java.home"); //$NON-NLS-1$ 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project File contentFile = new File(javahome, "lib" //$NON-NLS-1$ 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project + File.separator + "content-types.properties"); //$NON-NLS-1$ 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return new FileInputStream(contentFile); 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (IOException e) { 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Not found or can't read 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return null; 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Determines the MIME type for the given filename. 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param filename 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The file whose extension will be mapped. 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return The mime type associated with the file's extension or null if no 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mapping is known. 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String getContentTypeFor(String filename) { 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (filename.endsWith("/")) { //$NON-NLS-1$ 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // a directory, return html 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (String) types.get("html"); //$NON-NLS-1$ 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int lastCharInExtension = filename.lastIndexOf('#'); 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (lastCharInExtension < 0) { 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project lastCharInExtension = filename.length(); 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int firstCharInExtension = filename.lastIndexOf('.') + 1; 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String ext = ""; //$NON-NLS-1$ 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (firstCharInExtension > filename.lastIndexOf('/')) { 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ext = filename.substring(firstCharInExtension, lastCharInExtension); 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return types.getProperty(ext.toLowerCase()); 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 140