151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage sun.net.www; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.*; 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Calendar; 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Date; 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.text.SimpleDateFormat; 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.net.URL; 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.net.FileNameMap; 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Hashtable; 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Enumeration; 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Properties; 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.StringTokenizer; 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class MimeTable implements FileNameMap { 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** Keyed by content type, returns MimeEntries */ 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private Hashtable<String, MimeEntry> entries 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski = new Hashtable<String, MimeEntry>(); 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** Keyed by file extension (with the .), returns MimeEntries */ 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private Hashtable<String, MimeEntry> extensionMap 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski = new Hashtable<String, MimeEntry>(); 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Will be reset if in the platform-specific data file 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static String tempFileTemplate; 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static { 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski java.security.AccessController.doPrivileged( 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new java.security.PrivilegedAction<Void>() { 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Void run() { 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski tempFileTemplate = 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.getProperty("content.types.temp.file.template", 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "/tmp/%s"); 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski mailcapLocations = new String[] { 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.getProperty("user.mailcap"), 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.getProperty("user.home") + "/.mailcap", 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "/etc/mailcap", 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "/usr/etc/mailcap", 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "/usr/local/etc/mailcap", 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.getProperty("hotjava.home", 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "/usr/local/hotjava") 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski + "/lib/mailcap", 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski }; 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski }); 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static final String filePreamble = "sun.net.www MIME content-types table"; 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static final String fileMagic = "#" + filePreamble; 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski MimeTable() { 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski load(); 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static class DefaultInstanceHolder { 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static final MimeTable defaultInstance = getDefaultInstance(); 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static MimeTable getDefaultInstance() { 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return java.security.AccessController.doPrivileged( 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new java.security.PrivilegedAction<MimeTable>() { 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public MimeTable run() { 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski MimeTable instance = new MimeTable(); 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski URLConnection.setFileNameMap(instance); 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return instance; 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski }); 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Get the single instance of this class. First use will load the 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * table from a data file. 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static MimeTable getDefaultTable() { 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return DefaultInstanceHolder.defaultInstance; 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static FileNameMap loadTable() { 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski MimeTable mt = getDefaultTable(); 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (FileNameMap)mt; 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public synchronized int getSize() { 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return entries.size(); 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public synchronized String getContentTypeFor(String fileName) { 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski MimeEntry entry = findByFileName(fileName); 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (entry != null) { 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return entry.getType(); 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public synchronized void add(MimeEntry m) { 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski entries.put(m.getType(), m); 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String exts[] = m.getExtensions(); 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (exts == null) { 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return; 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (int i = 0; i < exts.length; i++) { 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski extensionMap.put(exts[i], m); 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public synchronized MimeEntry remove(String type) { 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski MimeEntry entry = entries.get(type); 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return remove(entry); 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public synchronized MimeEntry remove(MimeEntry entry) { 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String[] extensionKeys = entry.getExtensions(); 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (extensionKeys != null) { 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (int i = 0; i < extensionKeys.length; i++) { 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski extensionMap.remove(extensionKeys[i]); 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return entries.remove(entry.getType()); 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public synchronized MimeEntry find(String type) { 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski MimeEntry entry = entries.get(type); 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (entry == null) { 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // try a wildcard lookup 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Enumeration<MimeEntry> e = entries.elements(); 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (e.hasMoreElements()) { 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski MimeEntry wild = e.nextElement(); 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (wild.matches(type)) { 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return wild; 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return entry; 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Locate a MimeEntry by the file extension that has been associated 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * with it. Parses general file names, and URLs. 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public MimeEntry findByFileName(String fname) { 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String ext = ""; 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int i = fname.lastIndexOf('#'); 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (i > 0) { 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski fname = fname.substring(0, i - 1); 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski i = fname.lastIndexOf('.'); 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // REMIND: OS specific delimters appear here 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski i = Math.max(i, fname.lastIndexOf('/')); 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski i = Math.max(i, fname.lastIndexOf('?')); 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (i != -1 && fname.charAt(i) == '.') { 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ext = fname.substring(i).toLowerCase(); 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return findByExt(ext); 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Locate a MimeEntry by the file extension that has been associated 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * with it. 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public synchronized MimeEntry findByExt(String fileExtension) { 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return extensionMap.get(fileExtension); 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public synchronized MimeEntry findByDescription(String description) { 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Enumeration<MimeEntry> e = elements(); 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (e.hasMoreElements()) { 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski MimeEntry entry = e.nextElement(); 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (description.equals(entry.getDescription())) { 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return entry; 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // We failed, now try treating description as type 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return find(description); 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String getTempFileTemplate() { 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return tempFileTemplate; 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public synchronized Enumeration<MimeEntry> elements() { 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return entries.elements(); 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // For backward compatibility -- mailcap format files 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // This is not currently used, but may in the future when we add ability 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // to read BOTH the properties format and the mailcap format. 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected static String[] mailcapLocations; 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public synchronized void load() { 23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Properties entries = new Properties(); 23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski File file = null; 23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski InputStream is; 23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // First try to load the user-specific table, if it exists 23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String userTablePath = 23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.getProperty("content.types.user.table"); 23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (userTablePath != null) { 23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski file = new File(userTablePath); 23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!file.exists()) { 24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // No user-table, try to load the default built-in table. 24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski file = new File(System.getProperty("java.home") + 24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski File.separator + 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "lib" + 24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski File.separator + 24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "content-types.properties"); 24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski else { 24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // No user table, try to load the default built-in table. 25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski file = new File(System.getProperty("java.home") + 25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski File.separator + 25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "lib" + 25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski File.separator + 25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "content-types.properties"); 25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski is = new BufferedInputStream(new FileInputStream(file)); 25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski entries.load(is); 25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski is.close(); 26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski catch (IOException e) { 26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println("Warning: default mime table not found: " + 26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski file.getPath()); 26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return; 26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski parse(entries); 26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski void parse(Properties entries) { 27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // first, strip out the platform-specific temp file template 27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String tempFileTemplate = (String)entries.get("temp.file.template"); 27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (tempFileTemplate != null) { 27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski entries.remove("temp.file.template"); 27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.tempFileTemplate = tempFileTemplate; 27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // now, parse the mime-type spec's 27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Enumeration<?> types = entries.propertyNames(); 27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (types.hasMoreElements()) { 28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String type = (String)types.nextElement(); 28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String attrs = entries.getProperty(type); 28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski parse(type, attrs); 28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Table format: 28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // <entry> ::= <table_tag> | <type_entry> 29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // <table_tag> ::= <table_format_version> | <temp_file_template> 29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // <type_entry> ::= <type_subtype_pair> '=' <type_attrs_list> 29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // <type_subtype_pair> ::= <type> '/' <subtype> 29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // <type_attrs_list> ::= <attr_value_pair> [ ';' <attr_value_pair> ]* 29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // | [ <attr_value_pair> ]+ 29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // <attr_value_pair> ::= <attr_name> '=' <attr_value> 30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // <attr_name> ::= 'description' | 'action' | 'application' 30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // | 'file_extensions' | 'icon' 30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // <attr_value> ::= <legal_char>* 30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Embedded ';' in an <attr_value> are quoted with leading '\' . 30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Interpretation of <attr_value> depends on the <attr_name> it is 31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // associated with. 31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski void parse(String type, String attrs) { 31451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski MimeEntry newEntry = new MimeEntry(type); 31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // REMIND handle embedded ';' and '|' and literal '"' 31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski StringTokenizer tokenizer = new StringTokenizer(attrs, ";"); 31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (tokenizer.hasMoreTokens()) { 31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String pair = tokenizer.nextToken(); 32051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski parse(pair, newEntry); 32151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski add(newEntry); 32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 32551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski void parse(String pair, MimeEntry entry) { 32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // REMIND add exception handling... 32851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String name = null; 32951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String value = null; 33051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 33151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean gotName = false; 33251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski StringTokenizer tokenizer = new StringTokenizer(pair, "="); 33351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (tokenizer.hasMoreTokens()) { 33451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (gotName) { 33551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski value = tokenizer.nextToken().trim(); 33651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 33751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski else { 33851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski name = tokenizer.nextToken().trim(); 33951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski gotName = true; 34051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 34151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 34251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 34351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski fill(entry, name, value); 34451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 34551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 34651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski void fill(MimeEntry entry, String name, String value) { 34751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if ("description".equalsIgnoreCase(name)) { 34851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski entry.setDescription(value); 34951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 35051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski else if ("action".equalsIgnoreCase(name)) { 35151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski entry.setAction(getActionCode(value)); 35251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 35351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski else if ("application".equalsIgnoreCase(name)) { 35451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski entry.setCommand(value); 35551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 35651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski else if ("icon".equalsIgnoreCase(name)) { 35751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski entry.setImageFileName(value); 35851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 35951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski else if ("file_extensions".equalsIgnoreCase(name)) { 36051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski entry.setExtensions(value); 36151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 36251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 36351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // else illegal name exception 36451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 36551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 36651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String[] getExtensions(String list) { 36751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski StringTokenizer tokenizer = new StringTokenizer(list, ","); 36851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int n = tokenizer.countTokens(); 36951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String[] extensions = new String[n]; 37051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (int i = 0; i < n; i++) { 37151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski extensions[i] = tokenizer.nextToken(); 37251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 37351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 37451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return extensions; 37551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 37651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 37751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int getActionCode(String action) { 37851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (int i = 0; i < MimeEntry.actionKeywords.length; i++) { 37951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (action.equalsIgnoreCase(MimeEntry.actionKeywords[i])) { 38051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return i; 38151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 38251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 38351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 38451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return MimeEntry.UNKNOWN; 38551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 38651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 38751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public synchronized boolean save(String filename) { 38851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (filename == null) { 38951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski filename = System.getProperty("user.home" + 39051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski File.separator + 39151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "lib" + 39251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski File.separator + 39351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "content-types.properties"); 39451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 39551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 39651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return saveAsProperties(new File(filename)); 39751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 39851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 39951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Properties getAsProperties() { 40051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Properties properties = new Properties(); 40151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Enumeration<MimeEntry> e = elements(); 40251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (e.hasMoreElements()) { 40351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski MimeEntry entry = e.nextElement(); 40451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski properties.put(entry.getType(), entry.toProperty()); 40551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 40651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 40751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return properties; 40851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 40951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 41051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected boolean saveAsProperties(File file) { 41151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski FileOutputStream os = null; 41251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 41351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski os = new FileOutputStream(file); 41451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Properties properties = getAsProperties(); 41551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski properties.put("temp.file.template", tempFileTemplate); 41651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String tag; 41751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String user = System.getProperty("user.name"); 41851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (user != null) { 41951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski tag = "; customized for " + user; 42051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski properties.save(os, filePreamble + tag); 42151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 42251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski else { 42351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski properties.save(os, filePreamble); 42451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 42551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 42651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski catch (IOException e) { 42751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski e.printStackTrace(); 42851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 42951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 43051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski finally { 43151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (os != null) { 43251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { os.close(); } catch (IOException e) {} 43351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 43451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 43551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 43651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return true; 43751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 43851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 43951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Debugging utilities 44051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 44151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void list(PrintStream out) { 44251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Enumeration keys = entries.keys(); 44351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (keys.hasMoreElements()) { 44451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String key = (String)keys.nextElement(); 44551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski MimeEntry entry = (MimeEntry)entries.get(key); 44651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski out.println(key + ": " + entry); 44751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 44851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 44951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 45051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static void main(String[] args) { 45151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski MimeTable testTable = MimeTable.getDefaultTable(); 45251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 45351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Enumeration e = testTable.elements(); 45451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (e.hasMoreElements()) { 45551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski MimeEntry entry = (MimeEntry)e.nextElement(); 45651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.out.println(entry); 45751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 45851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 45951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski testTable.save(File.separator + "tmp" + 46051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski File.separator + "mime_table.save"); 46151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 46251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 46351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 464