zhouping
5 years ago
309 changed files with 44161 additions and 0 deletions
@ -0,0 +1,85 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.sun.activation.registries; |
||||||
|
|
||||||
|
import java.io.*; |
||||||
|
import java.util.logging.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* Logging related methods. |
||||||
|
*/ |
||||||
|
public class LogSupport { |
||||||
|
private static boolean debug = false; |
||||||
|
private static Logger logger; |
||||||
|
private static final Level level = Level.FINE; |
||||||
|
|
||||||
|
static { |
||||||
|
try { |
||||||
|
debug = Boolean.getBoolean("javax.activation.debug"); |
||||||
|
} catch (Throwable t) { |
||||||
|
// ignore any errors
|
||||||
|
} |
||||||
|
logger = Logger.getLogger("javax.activation"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Constructor. |
||||||
|
*/ |
||||||
|
private LogSupport() { |
||||||
|
// private constructor, can't create instances
|
||||||
|
} |
||||||
|
|
||||||
|
public static void log(String msg) { |
||||||
|
if (debug) |
||||||
|
System.out.println(msg); |
||||||
|
logger.log(level, msg); |
||||||
|
} |
||||||
|
|
||||||
|
public static void log(String msg, Throwable t) { |
||||||
|
if (debug) |
||||||
|
System.out.println(msg + "; Exception: " + t); |
||||||
|
logger.log(level, msg, t); |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean isLoggable() { |
||||||
|
return debug || logger.isLoggable(level); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,578 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.sun.activation.registries; |
||||||
|
|
||||||
|
import java.io.*; |
||||||
|
import java.util.*; |
||||||
|
|
||||||
|
public class MailcapFile { |
||||||
|
|
||||||
|
/** |
||||||
|
* A Map indexed by MIME type (string) that references |
||||||
|
* a Map of commands for each type. The comand Map |
||||||
|
* is indexed by the command name and references a List of |
||||||
|
* class names (strings) for each command. |
||||||
|
*/ |
||||||
|
private Map type_hash = new HashMap(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Another Map like above, but for fallback entries. |
||||||
|
*/ |
||||||
|
private Map fallback_hash = new HashMap(); |
||||||
|
|
||||||
|
/** |
||||||
|
* A Map indexed by MIME type (string) that references |
||||||
|
* a List of native commands (string) corresponding to the type. |
||||||
|
*/ |
||||||
|
private Map native_commands = new HashMap(); |
||||||
|
|
||||||
|
private static boolean addReverse = false; |
||||||
|
|
||||||
|
static { |
||||||
|
try { |
||||||
|
addReverse = Boolean.getBoolean("javax.activation.addreverse"); |
||||||
|
} catch (Throwable t) { |
||||||
|
// ignore any errors
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* The constructor that takes a filename as an argument. |
||||||
|
* |
||||||
|
* @param new_fname The file name of the mailcap file. |
||||||
|
*/ |
||||||
|
public MailcapFile(String new_fname) throws IOException { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("new MailcapFile: file " + new_fname); |
||||||
|
FileReader reader = null; |
||||||
|
try { |
||||||
|
reader = new FileReader(new_fname); |
||||||
|
parse(new BufferedReader(reader)); |
||||||
|
} finally { |
||||||
|
if (reader != null) { |
||||||
|
try { |
||||||
|
reader.close(); |
||||||
|
} catch (IOException ex) { } |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* The constructor that takes an input stream as an argument. |
||||||
|
* |
||||||
|
* @param is the input stream |
||||||
|
*/ |
||||||
|
public MailcapFile(InputStream is) throws IOException { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("new MailcapFile: InputStream"); |
||||||
|
parse(new BufferedReader(new InputStreamReader(is, "iso-8859-1"))); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Mailcap file default constructor. |
||||||
|
*/ |
||||||
|
public MailcapFile() { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("new MailcapFile: default"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the Map of MailcapEntries based on the MIME type. |
||||||
|
* |
||||||
|
* <p> |
||||||
|
* <strong>Semantics:</strong> First check for the literal mime type, |
||||||
|
* if that fails looks for wildcard <type>/\* and return that. Return the |
||||||
|
* list of all that hit. |
||||||
|
*/ |
||||||
|
public Map getMailcapList(String mime_type) { |
||||||
|
Map search_result = null; |
||||||
|
Map wildcard_result = null; |
||||||
|
|
||||||
|
// first try the literal
|
||||||
|
search_result = (Map)type_hash.get(mime_type); |
||||||
|
|
||||||
|
// ok, now try the wildcard
|
||||||
|
int separator = mime_type.indexOf('/'); |
||||||
|
String subtype = mime_type.substring(separator + 1); |
||||||
|
if (!subtype.equals("*")) { |
||||||
|
String type = mime_type.substring(0, separator + 1) + "*"; |
||||||
|
wildcard_result = (Map)type_hash.get(type); |
||||||
|
|
||||||
|
if (wildcard_result != null) { // damn, we have to merge!!!
|
||||||
|
if (search_result != null) |
||||||
|
search_result = |
||||||
|
mergeResults(search_result, wildcard_result); |
||||||
|
else |
||||||
|
search_result = wildcard_result; |
||||||
|
} |
||||||
|
} |
||||||
|
return search_result; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the Map of fallback MailcapEntries based on the MIME type. |
||||||
|
* |
||||||
|
* <p> |
||||||
|
* <strong>Semantics:</strong> First check for the literal mime type, |
||||||
|
* if that fails looks for wildcard <type>/\* and return that. Return the |
||||||
|
* list of all that hit. |
||||||
|
*/ |
||||||
|
public Map getMailcapFallbackList(String mime_type) { |
||||||
|
Map search_result = null; |
||||||
|
Map wildcard_result = null; |
||||||
|
|
||||||
|
// first try the literal
|
||||||
|
search_result = (Map)fallback_hash.get(mime_type); |
||||||
|
|
||||||
|
// ok, now try the wildcard
|
||||||
|
int separator = mime_type.indexOf('/'); |
||||||
|
String subtype = mime_type.substring(separator + 1); |
||||||
|
if (!subtype.equals("*")) { |
||||||
|
String type = mime_type.substring(0, separator + 1) + "*"; |
||||||
|
wildcard_result = (Map)fallback_hash.get(type); |
||||||
|
|
||||||
|
if (wildcard_result != null) { // damn, we have to merge!!!
|
||||||
|
if (search_result != null) |
||||||
|
search_result = |
||||||
|
mergeResults(search_result, wildcard_result); |
||||||
|
else |
||||||
|
search_result = wildcard_result; |
||||||
|
} |
||||||
|
} |
||||||
|
return search_result; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return all the MIME types known to this mailcap file. |
||||||
|
*/ |
||||||
|
public String[] getMimeTypes() { |
||||||
|
Set types = new HashSet(type_hash.keySet()); |
||||||
|
types.addAll(fallback_hash.keySet()); |
||||||
|
types.addAll(native_commands.keySet()); |
||||||
|
String[] mts = new String[types.size()]; |
||||||
|
mts = (String[])types.toArray(mts); |
||||||
|
return mts; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return all the native comands for the given MIME type. |
||||||
|
*/ |
||||||
|
public String[] getNativeCommands(String mime_type) { |
||||||
|
String[] cmds = null; |
||||||
|
List v = |
||||||
|
(List)native_commands.get(mime_type.toLowerCase(Locale.ENGLISH)); |
||||||
|
if (v != null) { |
||||||
|
cmds = new String[v.size()]; |
||||||
|
cmds = (String[])v.toArray(cmds); |
||||||
|
} |
||||||
|
return cmds; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Merge the first hash into the second. |
||||||
|
* This merge will only effect the hashtable that is |
||||||
|
* returned, we don't want to touch the one passed in since |
||||||
|
* its integrity must be maintained. |
||||||
|
*/ |
||||||
|
private Map mergeResults(Map first, Map second) { |
||||||
|
Iterator verb_enum = second.keySet().iterator(); |
||||||
|
Map clonedHash = new HashMap(first); |
||||||
|
|
||||||
|
// iterate through the verbs in the second map
|
||||||
|
while (verb_enum.hasNext()) { |
||||||
|
String verb = (String)verb_enum.next(); |
||||||
|
List cmdVector = (List)clonedHash.get(verb); |
||||||
|
if (cmdVector == null) { |
||||||
|
clonedHash.put(verb, second.get(verb)); |
||||||
|
} else { |
||||||
|
// merge the two
|
||||||
|
List oldV = (List)second.get(verb); |
||||||
|
cmdVector = new ArrayList(cmdVector); |
||||||
|
cmdVector.addAll(oldV); |
||||||
|
clonedHash.put(verb, cmdVector); |
||||||
|
} |
||||||
|
} |
||||||
|
return clonedHash; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* appendToMailcap: Append to this Mailcap DB, use the mailcap |
||||||
|
* format: |
||||||
|
* Comment == "# <i>comment string</i> |
||||||
|
* Entry == "mimetype; javabeanclass<nl> |
||||||
|
* |
||||||
|
* Example: |
||||||
|
* # this is a comment |
||||||
|
* image/gif jaf.viewers.ImageViewer |
||||||
|
*/ |
||||||
|
public void appendToMailcap(String mail_cap) { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("appendToMailcap: " + mail_cap); |
||||||
|
try { |
||||||
|
parse(new StringReader(mail_cap)); |
||||||
|
} catch (IOException ex) { |
||||||
|
// can't happen
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* parse file into a hash table of MC Type Entry Obj |
||||||
|
*/ |
||||||
|
private void parse(Reader reader) throws IOException { |
||||||
|
BufferedReader buf_reader = new BufferedReader(reader); |
||||||
|
String line = null; |
||||||
|
String continued = null; |
||||||
|
|
||||||
|
while ((line = buf_reader.readLine()) != null) { |
||||||
|
// LogSupport.log("parsing line: " + line);
|
||||||
|
|
||||||
|
line = line.trim(); |
||||||
|
|
||||||
|
try { |
||||||
|
if (line.charAt(0) == '#') |
||||||
|
continue; |
||||||
|
if (line.charAt(line.length() - 1) == '\\') { |
||||||
|
if (continued != null) |
||||||
|
continued += line.substring(0, line.length() - 1); |
||||||
|
else |
||||||
|
continued = line.substring(0, line.length() - 1); |
||||||
|
} else if (continued != null) { |
||||||
|
// handle the two strings
|
||||||
|
continued = continued + line; |
||||||
|
// LogSupport.log("parse: " + continued);
|
||||||
|
try { |
||||||
|
parseLine(continued); |
||||||
|
} catch (MailcapParseException e) { |
||||||
|
//e.printStackTrace();
|
||||||
|
} |
||||||
|
continued = null; |
||||||
|
} |
||||||
|
else { |
||||||
|
// LogSupport.log("parse: " + line);
|
||||||
|
try { |
||||||
|
parseLine(line); |
||||||
|
// LogSupport.log("hash.size = " + type_hash.size());
|
||||||
|
} catch (MailcapParseException e) { |
||||||
|
//e.printStackTrace();
|
||||||
|
} |
||||||
|
} |
||||||
|
} catch (StringIndexOutOfBoundsException e) {} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* A routine to parse individual entries in a Mailcap file. |
||||||
|
* |
||||||
|
* Note that this routine does not handle line continuations. |
||||||
|
* They should have been handled prior to calling this routine. |
||||||
|
*/ |
||||||
|
protected void parseLine(String mailcapEntry) |
||||||
|
throws MailcapParseException, IOException { |
||||||
|
MailcapTokenizer tokenizer = new MailcapTokenizer(mailcapEntry); |
||||||
|
tokenizer.setIsAutoquoting(false); |
||||||
|
|
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("parse: " + mailcapEntry); |
||||||
|
// parse the primary type
|
||||||
|
int currentToken = tokenizer.nextToken(); |
||||||
|
if (currentToken != MailcapTokenizer.STRING_TOKEN) { |
||||||
|
reportParseError(MailcapTokenizer.STRING_TOKEN, currentToken, |
||||||
|
tokenizer.getCurrentTokenValue()); |
||||||
|
} |
||||||
|
String primaryType = |
||||||
|
tokenizer.getCurrentTokenValue().toLowerCase(Locale.ENGLISH); |
||||||
|
String subType = "*"; |
||||||
|
|
||||||
|
// parse the '/' between primary and sub
|
||||||
|
// if it's not present that's ok, we just don't have a subtype
|
||||||
|
currentToken = tokenizer.nextToken(); |
||||||
|
if ((currentToken != MailcapTokenizer.SLASH_TOKEN) && |
||||||
|
(currentToken != MailcapTokenizer.SEMICOLON_TOKEN)) { |
||||||
|
reportParseError(MailcapTokenizer.SLASH_TOKEN, |
||||||
|
MailcapTokenizer.SEMICOLON_TOKEN, currentToken, |
||||||
|
tokenizer.getCurrentTokenValue()); |
||||||
|
} |
||||||
|
|
||||||
|
// only need to look for a sub type if we got a '/'
|
||||||
|
if (currentToken == MailcapTokenizer.SLASH_TOKEN) { |
||||||
|
// parse the sub type
|
||||||
|
currentToken = tokenizer.nextToken(); |
||||||
|
if (currentToken != MailcapTokenizer.STRING_TOKEN) { |
||||||
|
reportParseError(MailcapTokenizer.STRING_TOKEN, |
||||||
|
currentToken, tokenizer.getCurrentTokenValue()); |
||||||
|
} |
||||||
|
subType = |
||||||
|
tokenizer.getCurrentTokenValue().toLowerCase(Locale.ENGLISH); |
||||||
|
|
||||||
|
// get the next token to simplify the next step
|
||||||
|
currentToken = tokenizer.nextToken(); |
||||||
|
} |
||||||
|
|
||||||
|
String mimeType = primaryType + "/" + subType; |
||||||
|
|
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log(" Type: " + mimeType); |
||||||
|
|
||||||
|
// now setup the commands hashtable
|
||||||
|
Map commands = new LinkedHashMap(); // keep commands in order found
|
||||||
|
|
||||||
|
// parse the ';' that separates the type from the parameters
|
||||||
|
if (currentToken != MailcapTokenizer.SEMICOLON_TOKEN) { |
||||||
|
reportParseError(MailcapTokenizer.SEMICOLON_TOKEN, |
||||||
|
currentToken, tokenizer.getCurrentTokenValue()); |
||||||
|
} |
||||||
|
// eat it
|
||||||
|
|
||||||
|
// parse the required view command
|
||||||
|
tokenizer.setIsAutoquoting(true); |
||||||
|
currentToken = tokenizer.nextToken(); |
||||||
|
tokenizer.setIsAutoquoting(false); |
||||||
|
if ((currentToken != MailcapTokenizer.STRING_TOKEN) && |
||||||
|
(currentToken != MailcapTokenizer.SEMICOLON_TOKEN)) { |
||||||
|
reportParseError(MailcapTokenizer.STRING_TOKEN, |
||||||
|
MailcapTokenizer.SEMICOLON_TOKEN, currentToken, |
||||||
|
tokenizer.getCurrentTokenValue()); |
||||||
|
} |
||||||
|
|
||||||
|
if (currentToken == MailcapTokenizer.STRING_TOKEN) { |
||||||
|
// have a native comand, save the entire mailcap entry
|
||||||
|
//String nativeCommand = tokenizer.getCurrentTokenValue();
|
||||||
|
List v = (List)native_commands.get(mimeType); |
||||||
|
if (v == null) { |
||||||
|
v = new ArrayList(); |
||||||
|
v.add(mailcapEntry); |
||||||
|
native_commands.put(mimeType, v); |
||||||
|
} else { |
||||||
|
// XXX - check for duplicates?
|
||||||
|
v.add(mailcapEntry); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// only have to get the next token if the current one isn't a ';'
|
||||||
|
if (currentToken != MailcapTokenizer.SEMICOLON_TOKEN) { |
||||||
|
currentToken = tokenizer.nextToken(); |
||||||
|
} |
||||||
|
|
||||||
|
// look for a ';' which will indicate whether
|
||||||
|
// a parameter list is present or not
|
||||||
|
if (currentToken == MailcapTokenizer.SEMICOLON_TOKEN) { |
||||||
|
boolean isFallback = false; |
||||||
|
do { |
||||||
|
// eat the ';'
|
||||||
|
|
||||||
|
// parse the parameter name
|
||||||
|
currentToken = tokenizer.nextToken(); |
||||||
|
if (currentToken != MailcapTokenizer.STRING_TOKEN) { |
||||||
|
reportParseError(MailcapTokenizer.STRING_TOKEN, |
||||||
|
currentToken, tokenizer.getCurrentTokenValue()); |
||||||
|
} |
||||||
|
String paramName = tokenizer.getCurrentTokenValue(). |
||||||
|
toLowerCase(Locale.ENGLISH); |
||||||
|
|
||||||
|
// parse the '=' which separates the name from the value
|
||||||
|
currentToken = tokenizer.nextToken(); |
||||||
|
if ((currentToken != MailcapTokenizer.EQUALS_TOKEN) && |
||||||
|
(currentToken != MailcapTokenizer.SEMICOLON_TOKEN) && |
||||||
|
(currentToken != MailcapTokenizer.EOI_TOKEN)) { |
||||||
|
reportParseError(MailcapTokenizer.EQUALS_TOKEN, |
||||||
|
MailcapTokenizer.SEMICOLON_TOKEN, |
||||||
|
MailcapTokenizer.EOI_TOKEN, |
||||||
|
currentToken, tokenizer.getCurrentTokenValue()); |
||||||
|
} |
||||||
|
|
||||||
|
// we only have a useful command if it is named
|
||||||
|
if (currentToken == MailcapTokenizer.EQUALS_TOKEN) { |
||||||
|
// eat it
|
||||||
|
|
||||||
|
// parse the parameter value (which is autoquoted)
|
||||||
|
tokenizer.setIsAutoquoting(true); |
||||||
|
currentToken = tokenizer.nextToken(); |
||||||
|
tokenizer.setIsAutoquoting(false); |
||||||
|
if (currentToken != MailcapTokenizer.STRING_TOKEN) { |
||||||
|
reportParseError(MailcapTokenizer.STRING_TOKEN, |
||||||
|
currentToken, tokenizer.getCurrentTokenValue()); |
||||||
|
} |
||||||
|
String paramValue = |
||||||
|
tokenizer.getCurrentTokenValue(); |
||||||
|
|
||||||
|
// add the class to the list iff it is one we care about
|
||||||
|
if (paramName.startsWith("x-java-")) { |
||||||
|
String commandName = paramName.substring(7); |
||||||
|
// 7 == "x-java-".length
|
||||||
|
|
||||||
|
if (commandName.equals("fallback-entry") && |
||||||
|
paramValue.equalsIgnoreCase("true")) { |
||||||
|
isFallback = true; |
||||||
|
} else { |
||||||
|
|
||||||
|
// setup the class entry list
|
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log(" Command: " + commandName + |
||||||
|
", Class: " + paramValue); |
||||||
|
List classes = (List)commands.get(commandName); |
||||||
|
if (classes == null) { |
||||||
|
classes = new ArrayList(); |
||||||
|
commands.put(commandName, classes); |
||||||
|
} |
||||||
|
if (addReverse) |
||||||
|
classes.add(0, paramValue); |
||||||
|
else |
||||||
|
classes.add(paramValue); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// set up the next iteration
|
||||||
|
currentToken = tokenizer.nextToken(); |
||||||
|
} |
||||||
|
} while (currentToken == MailcapTokenizer.SEMICOLON_TOKEN); |
||||||
|
|
||||||
|
Map masterHash = isFallback ? fallback_hash : type_hash; |
||||||
|
Map curcommands = |
||||||
|
(Map)masterHash.get(mimeType); |
||||||
|
if (curcommands == null) { |
||||||
|
masterHash.put(mimeType, commands); |
||||||
|
} else { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("Merging commands for type " + mimeType); |
||||||
|
// have to merge current and new commands
|
||||||
|
// first, merge list of classes for commands already known
|
||||||
|
Iterator cn = curcommands.keySet().iterator(); |
||||||
|
while (cn.hasNext()) { |
||||||
|
String cmdName = (String)cn.next(); |
||||||
|
List ccv = (List)curcommands.get(cmdName); |
||||||
|
List cv = (List)commands.get(cmdName); |
||||||
|
if (cv == null) |
||||||
|
continue; |
||||||
|
// add everything in cv to ccv, if it's not already there
|
||||||
|
Iterator cvn = cv.iterator(); |
||||||
|
while (cvn.hasNext()) { |
||||||
|
String clazz = (String)cvn.next(); |
||||||
|
if (!ccv.contains(clazz)) |
||||||
|
if (addReverse) |
||||||
|
ccv.add(0, clazz); |
||||||
|
else |
||||||
|
ccv.add(clazz); |
||||||
|
} |
||||||
|
} |
||||||
|
// now, add commands not previously known
|
||||||
|
cn = commands.keySet().iterator(); |
||||||
|
while (cn.hasNext()) { |
||||||
|
String cmdName = (String)cn.next(); |
||||||
|
if (curcommands.containsKey(cmdName)) |
||||||
|
continue; |
||||||
|
List cv = (List)commands.get(cmdName); |
||||||
|
curcommands.put(cmdName, cv); |
||||||
|
} |
||||||
|
} |
||||||
|
} else if (currentToken != MailcapTokenizer.EOI_TOKEN) { |
||||||
|
reportParseError(MailcapTokenizer.EOI_TOKEN, |
||||||
|
MailcapTokenizer.SEMICOLON_TOKEN, |
||||||
|
currentToken, tokenizer.getCurrentTokenValue()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
protected static void reportParseError(int expectedToken, int actualToken, |
||||||
|
String actualTokenValue) throws MailcapParseException { |
||||||
|
throw new MailcapParseException("Encountered a " + |
||||||
|
MailcapTokenizer.nameForToken(actualToken) + " token (" + |
||||||
|
actualTokenValue + ") while expecting a " + |
||||||
|
MailcapTokenizer.nameForToken(expectedToken) + " token."); |
||||||
|
} |
||||||
|
|
||||||
|
protected static void reportParseError(int expectedToken, |
||||||
|
int otherExpectedToken, int actualToken, String actualTokenValue) |
||||||
|
throws MailcapParseException { |
||||||
|
throw new MailcapParseException("Encountered a " + |
||||||
|
MailcapTokenizer.nameForToken(actualToken) + " token (" + |
||||||
|
actualTokenValue + ") while expecting a " + |
||||||
|
MailcapTokenizer.nameForToken(expectedToken) + " or a " + |
||||||
|
MailcapTokenizer.nameForToken(otherExpectedToken) + " token."); |
||||||
|
} |
||||||
|
|
||||||
|
protected static void reportParseError(int expectedToken, |
||||||
|
int otherExpectedToken, int anotherExpectedToken, int actualToken, |
||||||
|
String actualTokenValue) throws MailcapParseException { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("PARSE ERROR: " + "Encountered a " + |
||||||
|
MailcapTokenizer.nameForToken(actualToken) + " token (" + |
||||||
|
actualTokenValue + ") while expecting a " + |
||||||
|
MailcapTokenizer.nameForToken(expectedToken) + ", a " + |
||||||
|
MailcapTokenizer.nameForToken(otherExpectedToken) + ", or a " + |
||||||
|
MailcapTokenizer.nameForToken(anotherExpectedToken) + " token."); |
||||||
|
throw new MailcapParseException("Encountered a " + |
||||||
|
MailcapTokenizer.nameForToken(actualToken) + " token (" + |
||||||
|
actualTokenValue + ") while expecting a " + |
||||||
|
MailcapTokenizer.nameForToken(expectedToken) + ", a " + |
||||||
|
MailcapTokenizer.nameForToken(otherExpectedToken) + ", or a " + |
||||||
|
MailcapTokenizer.nameForToken(anotherExpectedToken) + " token."); |
||||||
|
} |
||||||
|
|
||||||
|
/** for debugging |
||||||
|
public static void main(String[] args) throws Exception { |
||||||
|
Map masterHash = new HashMap(); |
||||||
|
for (int i = 0; i < args.length; ++i) { |
||||||
|
System.out.println("Entry " + i + ": " + args[i]); |
||||||
|
parseLine(args[i], masterHash); |
||||||
|
} |
||||||
|
|
||||||
|
Enumeration types = masterHash.keys(); |
||||||
|
while (types.hasMoreElements()) { |
||||||
|
String key = (String)types.nextElement(); |
||||||
|
System.out.println("MIME Type: " + key); |
||||||
|
|
||||||
|
Map commandHash = (Map)masterHash.get(key); |
||||||
|
Enumeration commands = commandHash.keys(); |
||||||
|
while (commands.hasMoreElements()) { |
||||||
|
String command = (String)commands.nextElement(); |
||||||
|
System.out.println(" Command: " + command); |
||||||
|
|
||||||
|
Vector classes = (Vector)commandHash.get(command); |
||||||
|
for (int i = 0; i < classes.size(); ++i) { |
||||||
|
System.out.println(" Class: " + |
||||||
|
(String)classes.elementAt(i)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
System.out.println(""); |
||||||
|
} |
||||||
|
} |
||||||
|
*/ |
||||||
|
} |
@ -0,0 +1,55 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.sun.activation.registries; |
||||||
|
|
||||||
|
/** |
||||||
|
* A class to encapsulate Mailcap parsing related exceptions |
||||||
|
*/ |
||||||
|
public class MailcapParseException extends Exception { |
||||||
|
|
||||||
|
public MailcapParseException() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
public MailcapParseException(String inInfo) { |
||||||
|
super(inInfo); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,337 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.sun.activation.registries; |
||||||
|
|
||||||
|
/** |
||||||
|
* A tokenizer for strings in the form of "foo/bar; prop1=val1; ... ". |
||||||
|
* Useful for parsing MIME content types. |
||||||
|
*/ |
||||||
|
public class MailcapTokenizer { |
||||||
|
|
||||||
|
public static final int UNKNOWN_TOKEN = 0; |
||||||
|
public static final int START_TOKEN = 1; |
||||||
|
public static final int STRING_TOKEN = 2; |
||||||
|
public static final int EOI_TOKEN = 5; |
||||||
|
public static final int SLASH_TOKEN = '/'; |
||||||
|
public static final int SEMICOLON_TOKEN = ';'; |
||||||
|
public static final int EQUALS_TOKEN = '='; |
||||||
|
|
||||||
|
/** |
||||||
|
* Constructor |
||||||
|
* |
||||||
|
* @parameter inputString the string to tokenize |
||||||
|
*/ |
||||||
|
public MailcapTokenizer(String inputString) { |
||||||
|
data = inputString; |
||||||
|
dataIndex = 0; |
||||||
|
dataLength = inputString.length(); |
||||||
|
|
||||||
|
currentToken = START_TOKEN; |
||||||
|
currentTokenValue = ""; |
||||||
|
|
||||||
|
isAutoquoting = false; |
||||||
|
autoquoteChar = ';'; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set whether auto-quoting is on or off. |
||||||
|
* |
||||||
|
* Auto-quoting means that all characters after the first |
||||||
|
* non-whitespace, non-control character up to the auto-quote |
||||||
|
* terminator character or EOI (minus any whitespace immediatley |
||||||
|
* preceeding it) is considered a token. |
||||||
|
* |
||||||
|
* This is required for handling command strings in a mailcap entry. |
||||||
|
*/ |
||||||
|
public void setIsAutoquoting(boolean value) { |
||||||
|
isAutoquoting = value; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Retrieve current token. |
||||||
|
* |
||||||
|
* @returns The current token value |
||||||
|
*/ |
||||||
|
public int getCurrentToken() { |
||||||
|
return currentToken; |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* Get a String that describes the given token. |
||||||
|
*/ |
||||||
|
public static String nameForToken(int token) { |
||||||
|
String name = "really unknown"; |
||||||
|
|
||||||
|
switch(token) { |
||||||
|
case UNKNOWN_TOKEN: |
||||||
|
name = "unknown"; |
||||||
|
break; |
||||||
|
case START_TOKEN: |
||||||
|
name = "start"; |
||||||
|
break; |
||||||
|
case STRING_TOKEN: |
||||||
|
name = "string"; |
||||||
|
break; |
||||||
|
case EOI_TOKEN: |
||||||
|
name = "EOI"; |
||||||
|
break; |
||||||
|
case SLASH_TOKEN: |
||||||
|
name = "'/'"; |
||||||
|
break; |
||||||
|
case SEMICOLON_TOKEN: |
||||||
|
name = "';'"; |
||||||
|
break; |
||||||
|
case EQUALS_TOKEN: |
||||||
|
name = "'='"; |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
return name; |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* Retrieve current token value. |
||||||
|
* |
||||||
|
* @returns A String containing the current token value |
||||||
|
*/ |
||||||
|
public String getCurrentTokenValue() { |
||||||
|
return currentTokenValue; |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* Process the next token. |
||||||
|
* |
||||||
|
* @returns the next token |
||||||
|
*/ |
||||||
|
public int nextToken() { |
||||||
|
if (dataIndex < dataLength) { |
||||||
|
// skip white space
|
||||||
|
while ((dataIndex < dataLength) && |
||||||
|
(isWhiteSpaceChar(data.charAt(dataIndex)))) { |
||||||
|
++dataIndex; |
||||||
|
} |
||||||
|
|
||||||
|
if (dataIndex < dataLength) { |
||||||
|
// examine the current character and see what kind of token we have
|
||||||
|
char c = data.charAt(dataIndex); |
||||||
|
if (isAutoquoting) { |
||||||
|
if (c == ';' || c == '=') { |
||||||
|
currentToken = c; |
||||||
|
currentTokenValue = new Character(c).toString(); |
||||||
|
++dataIndex; |
||||||
|
} else { |
||||||
|
processAutoquoteToken(); |
||||||
|
} |
||||||
|
} else { |
||||||
|
if (isStringTokenChar(c)) { |
||||||
|
processStringToken(); |
||||||
|
} else if ((c == '/') || (c == ';') || (c == '=')) { |
||||||
|
currentToken = c; |
||||||
|
currentTokenValue = new Character(c).toString(); |
||||||
|
++dataIndex; |
||||||
|
} else { |
||||||
|
currentToken = UNKNOWN_TOKEN; |
||||||
|
currentTokenValue = new Character(c).toString(); |
||||||
|
++dataIndex; |
||||||
|
} |
||||||
|
} |
||||||
|
} else { |
||||||
|
currentToken = EOI_TOKEN; |
||||||
|
currentTokenValue = null; |
||||||
|
} |
||||||
|
} else { |
||||||
|
currentToken = EOI_TOKEN; |
||||||
|
currentTokenValue = null; |
||||||
|
} |
||||||
|
|
||||||
|
return currentToken; |
||||||
|
} |
||||||
|
|
||||||
|
private void processStringToken() { |
||||||
|
// capture the initial index
|
||||||
|
int initialIndex = dataIndex; |
||||||
|
|
||||||
|
// skip to 1st non string token character
|
||||||
|
while ((dataIndex < dataLength) && |
||||||
|
isStringTokenChar(data.charAt(dataIndex))) { |
||||||
|
++dataIndex; |
||||||
|
} |
||||||
|
|
||||||
|
currentToken = STRING_TOKEN; |
||||||
|
currentTokenValue = data.substring(initialIndex, dataIndex); |
||||||
|
} |
||||||
|
|
||||||
|
private void processAutoquoteToken() { |
||||||
|
// capture the initial index
|
||||||
|
int initialIndex = dataIndex; |
||||||
|
|
||||||
|
// now skip to the 1st non-escaped autoquote termination character
|
||||||
|
// XXX - doesn't actually consider escaping
|
||||||
|
boolean foundTerminator = false; |
||||||
|
while ((dataIndex < dataLength) && !foundTerminator) { |
||||||
|
char c = data.charAt(dataIndex); |
||||||
|
if (c != autoquoteChar) { |
||||||
|
++dataIndex; |
||||||
|
} else { |
||||||
|
foundTerminator = true; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
currentToken = STRING_TOKEN; |
||||||
|
currentTokenValue = |
||||||
|
fixEscapeSequences(data.substring(initialIndex, dataIndex)); |
||||||
|
} |
||||||
|
|
||||||
|
private static boolean isSpecialChar(char c) { |
||||||
|
boolean lAnswer = false; |
||||||
|
|
||||||
|
switch(c) { |
||||||
|
case '(': |
||||||
|
case ')': |
||||||
|
case '<': |
||||||
|
case '>': |
||||||
|
case '@': |
||||||
|
case ',': |
||||||
|
case ';': |
||||||
|
case ':': |
||||||
|
case '\\': |
||||||
|
case '"': |
||||||
|
case '/': |
||||||
|
case '[': |
||||||
|
case ']': |
||||||
|
case '?': |
||||||
|
case '=': |
||||||
|
lAnswer = true; |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
return lAnswer; |
||||||
|
} |
||||||
|
|
||||||
|
private static boolean isControlChar(char c) { |
||||||
|
return Character.isISOControl(c); |
||||||
|
} |
||||||
|
|
||||||
|
private static boolean isWhiteSpaceChar(char c) { |
||||||
|
return Character.isWhitespace(c); |
||||||
|
} |
||||||
|
|
||||||
|
private static boolean isStringTokenChar(char c) { |
||||||
|
return !isSpecialChar(c) && !isControlChar(c) && !isWhiteSpaceChar(c); |
||||||
|
} |
||||||
|
|
||||||
|
private static String fixEscapeSequences(String inputString) { |
||||||
|
int inputLength = inputString.length(); |
||||||
|
StringBuffer buffer = new StringBuffer(); |
||||||
|
buffer.ensureCapacity(inputLength); |
||||||
|
|
||||||
|
for (int i = 0; i < inputLength; ++i) { |
||||||
|
char currentChar = inputString.charAt(i); |
||||||
|
if (currentChar != '\\') { |
||||||
|
buffer.append(currentChar); |
||||||
|
} else { |
||||||
|
if (i < inputLength - 1) { |
||||||
|
char nextChar = inputString.charAt(i + 1); |
||||||
|
buffer.append(nextChar); |
||||||
|
|
||||||
|
// force a skip over the next character too
|
||||||
|
++i; |
||||||
|
} else { |
||||||
|
buffer.append(currentChar); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return buffer.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
private String data; |
||||||
|
private int dataIndex; |
||||||
|
private int dataLength; |
||||||
|
private int currentToken; |
||||||
|
private String currentTokenValue; |
||||||
|
private boolean isAutoquoting; |
||||||
|
private char autoquoteChar; |
||||||
|
|
||||||
|
/* |
||||||
|
public static void main(String[] args) { |
||||||
|
for (int i = 0; i < args.length; ++i) { |
||||||
|
MailcapTokenizer tokenizer = new MailcapTokenizer(args[i]); |
||||||
|
|
||||||
|
System.out.println("Original: |" + args[i] + "|"); |
||||||
|
|
||||||
|
int currentToken = tokenizer.nextToken(); |
||||||
|
while (currentToken != EOI_TOKEN) { |
||||||
|
switch(currentToken) { |
||||||
|
case UNKNOWN_TOKEN: |
||||||
|
System.out.println(" Unknown Token: |" + tokenizer.getCurrentTokenValue() + "|"); |
||||||
|
break; |
||||||
|
case START_TOKEN: |
||||||
|
System.out.println(" Start Token: |" + tokenizer.getCurrentTokenValue() + "|"); |
||||||
|
break; |
||||||
|
case STRING_TOKEN: |
||||||
|
System.out.println(" String Token: |" + tokenizer.getCurrentTokenValue() + "|"); |
||||||
|
break; |
||||||
|
case EOI_TOKEN: |
||||||
|
System.out.println(" EOI Token: |" + tokenizer.getCurrentTokenValue() + "|"); |
||||||
|
break; |
||||||
|
case SLASH_TOKEN: |
||||||
|
System.out.println(" Slash Token: |" + tokenizer.getCurrentTokenValue() + "|"); |
||||||
|
break; |
||||||
|
case SEMICOLON_TOKEN: |
||||||
|
System.out.println(" Semicolon Token: |" + tokenizer.getCurrentTokenValue() + "|"); |
||||||
|
break; |
||||||
|
case EQUALS_TOKEN: |
||||||
|
System.out.println(" Equals Token: |" + tokenizer.getCurrentTokenValue() + "|"); |
||||||
|
break; |
||||||
|
default: |
||||||
|
System.out.println(" Really Unknown Token: |" + tokenizer.getCurrentTokenValue() + "|"); |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
currentToken = tokenizer.nextToken(); |
||||||
|
} |
||||||
|
|
||||||
|
System.out.println(""); |
||||||
|
} |
||||||
|
} |
||||||
|
*/ |
||||||
|
} |
@ -0,0 +1,65 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.sun.activation.registries; |
||||||
|
|
||||||
|
import java.lang.*; |
||||||
|
|
||||||
|
public class MimeTypeEntry { |
||||||
|
private String type; |
||||||
|
private String extension; |
||||||
|
|
||||||
|
public MimeTypeEntry(String mime_type, String file_ext) { |
||||||
|
type = mime_type; |
||||||
|
extension = file_ext; |
||||||
|
} |
||||||
|
|
||||||
|
public String getMIMEType() { |
||||||
|
return type; |
||||||
|
} |
||||||
|
|
||||||
|
public String getFileExtension() { |
||||||
|
return extension; |
||||||
|
} |
||||||
|
|
||||||
|
public String toString() { |
||||||
|
return "MIMETypeEntry: " + type + ", " + extension; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,332 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.sun.activation.registries; |
||||||
|
|
||||||
|
import java.io.*; |
||||||
|
import java.util.*; |
||||||
|
|
||||||
|
public class MimeTypeFile { |
||||||
|
private String fname = null; |
||||||
|
private Hashtable type_hash = new Hashtable(); |
||||||
|
|
||||||
|
/** |
||||||
|
* The construtor that takes a filename as an argument. |
||||||
|
* |
||||||
|
* @param new_fname The file name of the mime types file. |
||||||
|
*/ |
||||||
|
public MimeTypeFile(String new_fname) throws IOException { |
||||||
|
File mime_file = null; |
||||||
|
FileReader fr = null; |
||||||
|
|
||||||
|
fname = new_fname; // remember the file name
|
||||||
|
|
||||||
|
mime_file = new File(fname); // get a file object
|
||||||
|
|
||||||
|
fr = new FileReader(mime_file); |
||||||
|
|
||||||
|
try { |
||||||
|
parse(new BufferedReader(fr)); |
||||||
|
} finally { |
||||||
|
try { |
||||||
|
fr.close(); // close it
|
||||||
|
} catch (IOException e) { |
||||||
|
// ignore it
|
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public MimeTypeFile(InputStream is) throws IOException { |
||||||
|
parse(new BufferedReader(new InputStreamReader(is, "iso-8859-1"))); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Creates an empty DB. |
||||||
|
*/ |
||||||
|
public MimeTypeFile() { |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* get the MimeTypeEntry based on the file extension |
||||||
|
*/ |
||||||
|
public MimeTypeEntry getMimeTypeEntry(String file_ext) { |
||||||
|
return (MimeTypeEntry)type_hash.get((Object)file_ext); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the MIME type string corresponding to the file extension. |
||||||
|
*/ |
||||||
|
public String getMIMETypeString(String file_ext) { |
||||||
|
MimeTypeEntry entry = this.getMimeTypeEntry(file_ext); |
||||||
|
|
||||||
|
if (entry != null) |
||||||
|
return entry.getMIMEType(); |
||||||
|
else |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Appends string of entries to the types registry, must be valid |
||||||
|
* .mime.types format. |
||||||
|
* A mime.types entry is one of two forms: |
||||||
|
* |
||||||
|
* type/subtype ext1 ext2 ... |
||||||
|
* or |
||||||
|
* type=type/subtype desc="description of type" exts=ext1,ext2,... |
||||||
|
* |
||||||
|
* Example: |
||||||
|
* # this is a test |
||||||
|
* audio/basic au |
||||||
|
* text/plain txt text |
||||||
|
* type=application/postscript exts=ps,eps |
||||||
|
*/ |
||||||
|
public void appendToRegistry(String mime_types) { |
||||||
|
try { |
||||||
|
parse(new BufferedReader(new StringReader(mime_types))); |
||||||
|
} catch (IOException ex) { |
||||||
|
// can't happen
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Parse a stream of mime.types entries. |
||||||
|
*/ |
||||||
|
private void parse(BufferedReader buf_reader) throws IOException { |
||||||
|
String line = null, prev = null; |
||||||
|
|
||||||
|
while ((line = buf_reader.readLine()) != null) { |
||||||
|
if (prev == null) |
||||||
|
prev = line; |
||||||
|
else |
||||||
|
prev += line; |
||||||
|
int end = prev.length(); |
||||||
|
if (prev.length() > 0 && prev.charAt(end - 1) == '\\') { |
||||||
|
prev = prev.substring(0, end - 1); |
||||||
|
continue; |
||||||
|
} |
||||||
|
this.parseEntry(prev); |
||||||
|
prev = null; |
||||||
|
} |
||||||
|
if (prev != null) |
||||||
|
this.parseEntry(prev); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Parse single mime.types entry. |
||||||
|
*/ |
||||||
|
private void parseEntry(String line) { |
||||||
|
String mime_type = null; |
||||||
|
String file_ext = null; |
||||||
|
line = line.trim(); |
||||||
|
|
||||||
|
if (line.length() == 0) // empty line...
|
||||||
|
return; // BAIL!
|
||||||
|
|
||||||
|
// check to see if this is a comment line?
|
||||||
|
if (line.charAt(0) == '#') |
||||||
|
return; // then we are done!
|
||||||
|
|
||||||
|
// is it a new format line or old format?
|
||||||
|
if (line.indexOf('=') > 0) { |
||||||
|
// new format
|
||||||
|
LineTokenizer lt = new LineTokenizer(line); |
||||||
|
while (lt.hasMoreTokens()) { |
||||||
|
String name = lt.nextToken(); |
||||||
|
String value = null; |
||||||
|
if (lt.hasMoreTokens() && lt.nextToken().equals("=") && |
||||||
|
lt.hasMoreTokens()) |
||||||
|
value = lt.nextToken(); |
||||||
|
if (value == null) { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("Bad .mime.types entry: " + line); |
||||||
|
return; |
||||||
|
} |
||||||
|
if (name.equals("type")) |
||||||
|
mime_type = value; |
||||||
|
else if (name.equals("exts")) { |
||||||
|
StringTokenizer st = new StringTokenizer(value, ","); |
||||||
|
while (st.hasMoreTokens()) { |
||||||
|
file_ext = st.nextToken(); |
||||||
|
MimeTypeEntry entry = |
||||||
|
new MimeTypeEntry(mime_type, file_ext); |
||||||
|
type_hash.put(file_ext, entry); |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("Added: " + entry.toString()); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} else { |
||||||
|
// old format
|
||||||
|
// count the tokens
|
||||||
|
StringTokenizer strtok = new StringTokenizer(line); |
||||||
|
int num_tok = strtok.countTokens(); |
||||||
|
|
||||||
|
if (num_tok == 0) // empty line
|
||||||
|
return; |
||||||
|
|
||||||
|
mime_type = strtok.nextToken(); // get the MIME type
|
||||||
|
|
||||||
|
while (strtok.hasMoreTokens()) { |
||||||
|
MimeTypeEntry entry = null; |
||||||
|
|
||||||
|
file_ext = strtok.nextToken(); |
||||||
|
entry = new MimeTypeEntry(mime_type, file_ext); |
||||||
|
type_hash.put(file_ext, entry); |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("Added: " + entry.toString()); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// for debugging
|
||||||
|
/* |
||||||
|
public static void main(String[] argv) throws Exception { |
||||||
|
MimeTypeFile mf = new MimeTypeFile(argv[0]); |
||||||
|
System.out.println("ext " + argv[1] + " type " + |
||||||
|
mf.getMIMETypeString(argv[1])); |
||||||
|
System.exit(0); |
||||||
|
} |
||||||
|
*/ |
||||||
|
} |
||||||
|
|
||||||
|
class LineTokenizer { |
||||||
|
private int currentPosition; |
||||||
|
private int maxPosition; |
||||||
|
private String str; |
||||||
|
private Vector stack = new Vector(); |
||||||
|
private static final String singles = "="; // single character tokens
|
||||||
|
|
||||||
|
/** |
||||||
|
* Constructs a tokenizer for the specified string. |
||||||
|
* <p> |
||||||
|
* |
||||||
|
* @param str a string to be parsed. |
||||||
|
*/ |
||||||
|
public LineTokenizer(String str) { |
||||||
|
currentPosition = 0; |
||||||
|
this.str = str; |
||||||
|
maxPosition = str.length(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Skips white space. |
||||||
|
*/ |
||||||
|
private void skipWhiteSpace() { |
||||||
|
while ((currentPosition < maxPosition) && |
||||||
|
Character.isWhitespace(str.charAt(currentPosition))) { |
||||||
|
currentPosition++; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Tests if there are more tokens available from this tokenizer's string. |
||||||
|
* |
||||||
|
* @return <code>true</code> if there are more tokens available from this |
||||||
|
* tokenizer's string; <code>false</code> otherwise. |
||||||
|
*/ |
||||||
|
public boolean hasMoreTokens() { |
||||||
|
if (stack.size() > 0) |
||||||
|
return true; |
||||||
|
skipWhiteSpace(); |
||||||
|
return (currentPosition < maxPosition); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the next token from this tokenizer. |
||||||
|
* |
||||||
|
* @return the next token from this tokenizer. |
||||||
|
* @exception NoSuchElementException if there are no more tokens in this |
||||||
|
* tokenizer's string. |
||||||
|
*/ |
||||||
|
public String nextToken() { |
||||||
|
int size = stack.size(); |
||||||
|
if (size > 0) { |
||||||
|
String t = (String)stack.elementAt(size - 1); |
||||||
|
stack.removeElementAt(size - 1); |
||||||
|
return t; |
||||||
|
} |
||||||
|
skipWhiteSpace(); |
||||||
|
|
||||||
|
if (currentPosition >= maxPosition) { |
||||||
|
throw new NoSuchElementException(); |
||||||
|
} |
||||||
|
|
||||||
|
int start = currentPosition; |
||||||
|
char c = str.charAt(start); |
||||||
|
if (c == '"') { |
||||||
|
currentPosition++; |
||||||
|
boolean filter = false; |
||||||
|
while (currentPosition < maxPosition) { |
||||||
|
c = str.charAt(currentPosition++); |
||||||
|
if (c == '\\') { |
||||||
|
currentPosition++; |
||||||
|
filter = true; |
||||||
|
} else if (c == '"') { |
||||||
|
String s; |
||||||
|
|
||||||
|
if (filter) { |
||||||
|
StringBuffer sb = new StringBuffer(); |
||||||
|
for (int i = start + 1; i < currentPosition - 1; i++) { |
||||||
|
c = str.charAt(i); |
||||||
|
if (c != '\\') |
||||||
|
sb.append(c); |
||||||
|
} |
||||||
|
s = sb.toString(); |
||||||
|
} else |
||||||
|
s = str.substring(start + 1, currentPosition - 1); |
||||||
|
return s; |
||||||
|
} |
||||||
|
} |
||||||
|
} else if (singles.indexOf(c) >= 0) { |
||||||
|
currentPosition++; |
||||||
|
} else { |
||||||
|
while ((currentPosition < maxPosition) && |
||||||
|
singles.indexOf(str.charAt(currentPosition)) < 0 && |
||||||
|
!Character.isWhitespace(str.charAt(currentPosition))) { |
||||||
|
currentPosition++; |
||||||
|
} |
||||||
|
} |
||||||
|
return str.substring(start, currentPosition); |
||||||
|
} |
||||||
|
|
||||||
|
public void pushToken(String token) { |
||||||
|
stack.addElement(token); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,138 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.sun.activation.viewers; |
||||||
|
|
||||||
|
import java.awt.*; |
||||||
|
import java.io.*; |
||||||
|
import java.beans.*; |
||||||
|
import javax.activation.*; |
||||||
|
|
||||||
|
public class ImageViewer extends Panel implements CommandObject { |
||||||
|
// UI Vars...
|
||||||
|
private ImageViewerCanvas canvas = null; |
||||||
|
|
||||||
|
// File Vars
|
||||||
|
// private InputStream data_ins = null;
|
||||||
|
private Image image = null; |
||||||
|
private DataHandler _dh = null; |
||||||
|
|
||||||
|
private boolean DEBUG = false; |
||||||
|
/** |
||||||
|
* Constructor |
||||||
|
*/ |
||||||
|
public ImageViewer(){ |
||||||
|
|
||||||
|
// create the ImageViewerCanvas
|
||||||
|
canvas = new ImageViewerCanvas(); |
||||||
|
add(canvas); |
||||||
|
} |
||||||
|
/** |
||||||
|
* Set the DataHandler for this CommandObject |
||||||
|
* @param DataHandler the DataHandler |
||||||
|
*/ |
||||||
|
public void setCommandContext(String verb, DataHandler dh) throws IOException{ |
||||||
|
_dh = dh; |
||||||
|
this.setInputStream( _dh.getInputStream() ); |
||||||
|
} |
||||||
|
//--------------------------------------------------------------------
|
||||||
|
|
||||||
|
/** |
||||||
|
* Set the data stream, component to assume it is ready to |
||||||
|
* be read. |
||||||
|
*/ |
||||||
|
private void setInputStream(InputStream ins) throws IOException { |
||||||
|
MediaTracker mt = new MediaTracker(this); |
||||||
|
int bytes_read = 0; |
||||||
|
byte data[] = new byte[1024]; |
||||||
|
ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
||||||
|
|
||||||
|
while((bytes_read = ins.read(data)) >0) |
||||||
|
baos.write(data, 0, bytes_read); |
||||||
|
ins.close(); |
||||||
|
|
||||||
|
// convert the buffer into an image
|
||||||
|
image = getToolkit().createImage(baos.toByteArray()); |
||||||
|
|
||||||
|
mt.addImage(image, 0); |
||||||
|
|
||||||
|
try { |
||||||
|
mt.waitForID(0); |
||||||
|
mt.waitForAll(); |
||||||
|
if(mt.statusID(0, true ) != MediaTracker.COMPLETE){ |
||||||
|
System.out.println("Error occured in image loading = " + |
||||||
|
mt.getErrorsID(0)); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
catch(InterruptedException e) { |
||||||
|
throw new IOException("Error reading image data"); |
||||||
|
} |
||||||
|
|
||||||
|
canvas.setImage(image); |
||||||
|
if(DEBUG) |
||||||
|
System.out.println("calling invalidate"); |
||||||
|
|
||||||
|
} |
||||||
|
//--------------------------------------------------------------------
|
||||||
|
public void addNotify(){ |
||||||
|
super.addNotify(); // call the real one first...
|
||||||
|
this.invalidate(); |
||||||
|
this.validate(); |
||||||
|
this.doLayout(); |
||||||
|
} |
||||||
|
//--------------------------------------------------------------------
|
||||||
|
public Dimension getPreferredSize(){ |
||||||
|
return canvas.getPreferredSize(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,95 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.sun.activation.viewers; |
||||||
|
|
||||||
|
import java.awt.*; |
||||||
|
|
||||||
|
public class ImageViewerCanvas extends Canvas |
||||||
|
{ |
||||||
|
private Image canvas_image = null; |
||||||
|
|
||||||
|
/** |
||||||
|
* The constructor |
||||||
|
*/ |
||||||
|
public ImageViewerCanvas() |
||||||
|
{ |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* set the image |
||||||
|
*/ |
||||||
|
public void setImage(Image new_image) |
||||||
|
{ |
||||||
|
canvas_image = new_image; |
||||||
|
this.invalidate(); |
||||||
|
this.repaint(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* getPreferredSize |
||||||
|
*/ |
||||||
|
public Dimension getPreferredSize() |
||||||
|
{ |
||||||
|
Dimension d = null; |
||||||
|
|
||||||
|
if(canvas_image == null) |
||||||
|
{ |
||||||
|
d = new Dimension(200, 200); |
||||||
|
} |
||||||
|
else |
||||||
|
d = new Dimension(canvas_image.getWidth(this), |
||||||
|
canvas_image.getHeight(this)); |
||||||
|
|
||||||
|
return d; |
||||||
|
} |
||||||
|
/** |
||||||
|
* paint method |
||||||
|
*/ |
||||||
|
public void paint(Graphics g) |
||||||
|
{ |
||||||
|
|
||||||
|
if(canvas_image != null) |
||||||
|
g.drawImage(canvas_image, 0, 0, this); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,203 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.sun.activation.viewers; |
||||||
|
|
||||||
|
import java.awt.*; |
||||||
|
import java.awt.event.*; |
||||||
|
import java.io.*; |
||||||
|
import java.beans.*; |
||||||
|
import javax.activation.*; |
||||||
|
|
||||||
|
public class TextEditor extends Panel implements CommandObject, |
||||||
|
ActionListener { |
||||||
|
// UI Vars...
|
||||||
|
private TextArea text_area = null; |
||||||
|
private GridBagLayout panel_gb = null; |
||||||
|
private Panel button_panel = null; |
||||||
|
private Button save_button = null; |
||||||
|
// File Vars
|
||||||
|
private File text_file = null; |
||||||
|
private String text_buffer = null; |
||||||
|
private InputStream data_ins = null; |
||||||
|
private FileInputStream fis = null; |
||||||
|
|
||||||
|
private DataHandler _dh = null; |
||||||
|
private boolean DEBUG = false; |
||||||
|
/** |
||||||
|
* Constructor |
||||||
|
*/ |
||||||
|
public TextEditor() { |
||||||
|
panel_gb = new GridBagLayout(); |
||||||
|
setLayout(panel_gb); |
||||||
|
|
||||||
|
button_panel = new Panel(); |
||||||
|
// button_panel.setBackground(Color.white);
|
||||||
|
button_panel.setLayout( new FlowLayout() ); |
||||||
|
save_button = new Button("SAVE"); |
||||||
|
button_panel.add(save_button); |
||||||
|
addGridComponent(this, |
||||||
|
button_panel, |
||||||
|
panel_gb, |
||||||
|
0,0, |
||||||
|
1,1, |
||||||
|
1,0); |
||||||
|
|
||||||
|
// create the text area
|
||||||
|
text_area = new TextArea("This is text",24, 80, |
||||||
|
TextArea.SCROLLBARS_VERTICAL_ONLY ); |
||||||
|
// text_area.setBackground(Color.lightGray);
|
||||||
|
text_area.setEditable( true ); |
||||||
|
|
||||||
|
addGridComponent(this, |
||||||
|
text_area, |
||||||
|
panel_gb, |
||||||
|
0,1, |
||||||
|
1,2, |
||||||
|
1,1); |
||||||
|
|
||||||
|
// add listeners
|
||||||
|
save_button.addActionListener( this ); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
/** |
||||||
|
* adds a component to our gridbag layout |
||||||
|
*/ |
||||||
|
private void addGridComponent(Container cont, |
||||||
|
Component comp, |
||||||
|
GridBagLayout mygb, |
||||||
|
int gridx, |
||||||
|
int gridy, |
||||||
|
int gridw, |
||||||
|
int gridh, |
||||||
|
int weightx, |
||||||
|
int weighty) { |
||||||
|
GridBagConstraints c = new GridBagConstraints(); |
||||||
|
c.gridx = gridx; |
||||||
|
c.gridy = gridy; |
||||||
|
c.gridwidth = gridw; |
||||||
|
c.gridheight = gridh; |
||||||
|
c.fill = GridBagConstraints.BOTH; |
||||||
|
c.weighty = weighty; |
||||||
|
c.weightx = weightx; |
||||||
|
c.anchor = GridBagConstraints.CENTER; |
||||||
|
mygb.setConstraints(comp, c); |
||||||
|
cont.add(comp); |
||||||
|
} |
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
public void setCommandContext(String verb, DataHandler dh) throws IOException { |
||||||
|
_dh = dh; |
||||||
|
this.setInputStream( _dh.getInputStream() ); |
||||||
|
|
||||||
|
} |
||||||
|
//--------------------------------------------------------------------
|
||||||
|
|
||||||
|
/** |
||||||
|
* set the data stream, component to assume it is ready to |
||||||
|
* be read. |
||||||
|
*/ |
||||||
|
public void setInputStream(InputStream ins) throws IOException { |
||||||
|
|
||||||
|
byte data[] = new byte[1024]; |
||||||
|
ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
||||||
|
int bytes_read = 0; |
||||||
|
// check that we can actually read
|
||||||
|
|
||||||
|
while((bytes_read = ins.read(data)) >0) |
||||||
|
baos.write(data, 0, bytes_read); |
||||||
|
ins.close(); |
||||||
|
|
||||||
|
|
||||||
|
// convert the buffer into a string
|
||||||
|
// popuplate the buffer
|
||||||
|
text_buffer = baos.toString(); |
||||||
|
|
||||||
|
// place in the text area
|
||||||
|
text_area.setText(text_buffer); |
||||||
|
} |
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
private void performSaveOperation(){ |
||||||
|
OutputStream fos = null; |
||||||
|
try { |
||||||
|
fos = _dh.getOutputStream(); |
||||||
|
} catch (Exception e) {} |
||||||
|
|
||||||
|
String buffer = text_area.getText(); |
||||||
|
|
||||||
|
// make sure we got one
|
||||||
|
if(fos == null) { |
||||||
|
System.out.println("Invalid outputstream in TextEditor!"); |
||||||
|
System.out.println("not saving!"); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
try { |
||||||
|
fos.write( buffer.getBytes() ); |
||||||
|
fos.flush(); // flush it!
|
||||||
|
fos.close(); // close it!
|
||||||
|
} catch(IOException e) |
||||||
|
{ |
||||||
|
System.out.println("TextEditor Save Operation failed with: " + e); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
//--------------------------------------------------------------------
|
||||||
|
public void addNotify() { |
||||||
|
super.addNotify(); |
||||||
|
invalidate(); |
||||||
|
} |
||||||
|
//--------------------------------------------------------------------
|
||||||
|
public Dimension getPreferredSize() { |
||||||
|
return text_area.getMinimumSize(24, 80); |
||||||
|
} |
||||||
|
/////////////////////////////////////////////////////////////////////
|
||||||
|
// for ActionListener
|
||||||
|
public void actionPerformed(ActionEvent evt){ |
||||||
|
if(evt.getSource() == save_button) { // save button pressed!
|
||||||
|
|
||||||
|
// Save ourselves
|
||||||
|
this.performSaveOperation(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,118 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.sun.activation.viewers; |
||||||
|
|
||||||
|
import java.awt.*; |
||||||
|
import java.io.*; |
||||||
|
import java.beans.*; |
||||||
|
import javax.activation.*; |
||||||
|
|
||||||
|
public class TextViewer extends Panel implements CommandObject { |
||||||
|
// UI Vars...
|
||||||
|
private TextArea text_area = null; |
||||||
|
|
||||||
|
// File Vars
|
||||||
|
private File text_file = null; |
||||||
|
private String text_buffer = null; |
||||||
|
|
||||||
|
private DataHandler _dh = null; |
||||||
|
private boolean DEBUG = false; |
||||||
|
/** |
||||||
|
* Constructor |
||||||
|
*/ |
||||||
|
public TextViewer() { |
||||||
|
setLayout( new GridLayout(1,1)); |
||||||
|
// create the text area
|
||||||
|
text_area = new TextArea("", 24, 80, |
||||||
|
TextArea.SCROLLBARS_VERTICAL_ONLY ); |
||||||
|
text_area.setEditable( false ); |
||||||
|
|
||||||
|
add(text_area); |
||||||
|
} |
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
public void setCommandContext(String verb, DataHandler dh) throws IOException { |
||||||
|
_dh = dh; |
||||||
|
this.setInputStream( _dh.getInputStream() ); |
||||||
|
} |
||||||
|
//--------------------------------------------------------------------
|
||||||
|
|
||||||
|
/** |
||||||
|
* set the data stream, component to assume it is ready to |
||||||
|
* be read. |
||||||
|
*/ |
||||||
|
public void setInputStream(InputStream ins) throws IOException { |
||||||
|
|
||||||
|
int bytes_read = 0; |
||||||
|
// check that we can actually read
|
||||||
|
ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
||||||
|
byte data[] = new byte[1024]; |
||||||
|
|
||||||
|
while((bytes_read = ins.read(data)) >0) |
||||||
|
baos.write(data, 0, bytes_read); |
||||||
|
|
||||||
|
ins.close(); |
||||||
|
|
||||||
|
// convert the buffer into a string
|
||||||
|
// popuplate the buffer
|
||||||
|
text_buffer = baos.toString(); |
||||||
|
|
||||||
|
// place in the text area
|
||||||
|
text_area.setText(text_buffer); |
||||||
|
|
||||||
|
} |
||||||
|
//--------------------------------------------------------------------
|
||||||
|
public void addNotify() { |
||||||
|
super.addNotify(); |
||||||
|
invalidate(); |
||||||
|
} |
||||||
|
//--------------------------------------------------------------------
|
||||||
|
public Dimension getPreferredSize() { |
||||||
|
return text_area.getMinimumSize(24, 80); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,263 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.activation; |
||||||
|
|
||||||
|
import java.awt.datatransfer.DataFlavor; |
||||||
|
import java.io.IOException; |
||||||
|
import javax.activation.MimeType; |
||||||
|
|
||||||
|
/** |
||||||
|
* The ActivationDataFlavor class is a special subclass of |
||||||
|
* <code>java.awt.datatransfer.DataFlavor</code>. It allows the JAF to |
||||||
|
* set all three values stored by the DataFlavor class via a new |
||||||
|
* constructor. It also contains improved MIME parsing in the <code>equals |
||||||
|
* </code> method. Except for the improved parsing, its semantics are |
||||||
|
* identical to that of the JDK's DataFlavor class. |
||||||
|
*/ |
||||||
|
|
||||||
|
public class ActivationDataFlavor extends DataFlavor { |
||||||
|
|
||||||
|
/* |
||||||
|
* Raison d'etre: |
||||||
|
* |
||||||
|
* The DataFlavor class included in JDK 1.1 has several limitations |
||||||
|
* including piss poor MIME type parsing, and the limitation of |
||||||
|
* only supporting serialized objects and InputStreams as |
||||||
|
* representation objects. This class 'fixes' that. |
||||||
|
*/ |
||||||
|
|
||||||
|
// I think for now I'll keep copies of all the variables and
|
||||||
|
// then later I may choose try to better coexist with the base
|
||||||
|
// class *sigh*
|
||||||
|
private String mimeType = null; |
||||||
|
private MimeType mimeObject = null; |
||||||
|
private String humanPresentableName = null; |
||||||
|
private Class representationClass = null; |
||||||
|
|
||||||
|
/** |
||||||
|
* Construct a DataFlavor that represents an arbitrary |
||||||
|
* Java object. This constructor is an extension of the |
||||||
|
* JDK's DataFlavor in that it allows the explicit setting |
||||||
|
* of all three DataFlavor attributes. |
||||||
|
* <p> |
||||||
|
* The returned DataFlavor will have the following characteristics: |
||||||
|
* <p> |
||||||
|
* representationClass = representationClass<br> |
||||||
|
* mimeType = mimeType<br> |
||||||
|
* humanName = humanName |
||||||
|
* <p> |
||||||
|
* |
||||||
|
* @param representationClass the class used in this DataFlavor |
||||||
|
* @param mimeType the MIME type of the data represented by this class
|
||||||
|
* @param humanPresentableName the human presentable name of the flavor |
||||||
|
*/ |
||||||
|
public ActivationDataFlavor(Class representationClass, |
||||||
|
String mimeType, String humanPresentableName) { |
||||||
|
super(mimeType, humanPresentableName); // need to call super
|
||||||
|
|
||||||
|
// init private variables:
|
||||||
|
this.mimeType = mimeType; |
||||||
|
this.humanPresentableName = humanPresentableName; |
||||||
|
this.representationClass = representationClass; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Construct a DataFlavor that represents a MimeType. |
||||||
|
* <p> |
||||||
|
* The returned DataFlavor will have the following characteristics: |
||||||
|
* <p> |
||||||
|
* If the mimeType is "application/x-java-serialized-object; |
||||||
|
* class=", the result is the same as calling new |
||||||
|
* DataFlavor(Class.forName()) as above. |
||||||
|
* <p> |
||||||
|
* otherwise: |
||||||
|
* <p> |
||||||
|
* representationClass = InputStream<p> |
||||||
|
* mimeType = mimeType<p> |
||||||
|
* |
||||||
|
* @param representationClass the class used in this DataFlavor |
||||||
|
* @param humanPresentableName the human presentable name of the flavor |
||||||
|
*/ |
||||||
|
public ActivationDataFlavor(Class representationClass, |
||||||
|
String humanPresentableName) { |
||||||
|
super(representationClass, humanPresentableName); |
||||||
|
this.mimeType = super.getMimeType(); |
||||||
|
this.representationClass = representationClass; |
||||||
|
this.humanPresentableName = humanPresentableName; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Construct a DataFlavor that represents a MimeType. |
||||||
|
* <p> |
||||||
|
* The returned DataFlavor will have the following characteristics: |
||||||
|
* <p> |
||||||
|
* If the mimeType is "application/x-java-serialized-object; class=", |
||||||
|
* the result is the same as calling new DataFlavor(Class.forName()) as |
||||||
|
* above, otherwise: |
||||||
|
* <p> |
||||||
|
* representationClass = InputStream<p> |
||||||
|
* mimeType = mimeType |
||||||
|
* |
||||||
|
* @param mimeType the MIME type of the data represented by this class
|
||||||
|
* @param humanPresentableName the human presentable name of the flavor |
||||||
|
*/ |
||||||
|
public ActivationDataFlavor(String mimeType, String humanPresentableName) { |
||||||
|
super(mimeType, humanPresentableName); |
||||||
|
this.mimeType = mimeType; |
||||||
|
try { |
||||||
|
this.representationClass = Class.forName("java.io.InputStream"); |
||||||
|
} catch (ClassNotFoundException ex) { |
||||||
|
// XXX - should never happen, ignore it
|
||||||
|
} |
||||||
|
this.humanPresentableName = humanPresentableName; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the MIME type for this DataFlavor. |
||||||
|
* |
||||||
|
* @return the MIME type |
||||||
|
*/ |
||||||
|
public String getMimeType() { |
||||||
|
return mimeType; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the representation class. |
||||||
|
* |
||||||
|
* @return the representation class
|
||||||
|
*/ |
||||||
|
public Class getRepresentationClass() { |
||||||
|
return representationClass; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the Human Presentable name. |
||||||
|
* |
||||||
|
* @return the human presentable name |
||||||
|
*/ |
||||||
|
public String getHumanPresentableName() { |
||||||
|
return humanPresentableName; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set the human presentable name. |
||||||
|
* |
||||||
|
* @param humanPresentableName the name to set |
||||||
|
*/ |
||||||
|
public void setHumanPresentableName(String humanPresentableName) { |
||||||
|
this.humanPresentableName = humanPresentableName; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Compares the DataFlavor passed in with this DataFlavor; calls |
||||||
|
* the <code>isMimeTypeEqual</code> method. |
||||||
|
* |
||||||
|
* @param dataFlavor the DataFlavor to compare with |
||||||
|
* @return true if the MIME type and representation class
|
||||||
|
* are the same |
||||||
|
*/ |
||||||
|
public boolean equals(DataFlavor dataFlavor) { |
||||||
|
return (isMimeTypeEqual(dataFlavor) && |
||||||
|
dataFlavor.getRepresentationClass() == representationClass); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Is the string representation of the MIME type passed in equivalent |
||||||
|
* to the MIME type of this DataFlavor. <p> |
||||||
|
* |
||||||
|
* ActivationDataFlavor delegates the comparison of MIME types to |
||||||
|
* the MimeType class included as part of the JavaBeans Activation |
||||||
|
* Framework. This provides a more robust comparison than is normally |
||||||
|
* available in the DataFlavor class. |
||||||
|
* |
||||||
|
* @param mimeType the MIME type |
||||||
|
* @return true if the same MIME type |
||||||
|
*/ |
||||||
|
public boolean isMimeTypeEqual(String mimeType) { |
||||||
|
MimeType mt = null; |
||||||
|
try { |
||||||
|
if (mimeObject == null) |
||||||
|
mimeObject = new MimeType(this.mimeType); |
||||||
|
mt = new MimeType(mimeType); |
||||||
|
} catch (MimeTypeParseException e) { |
||||||
|
// something didn't parse, do a crude comparison
|
||||||
|
return this.mimeType.equalsIgnoreCase(mimeType); |
||||||
|
} |
||||||
|
|
||||||
|
return mimeObject.match(mt); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Called on DataFlavor for every MIME Type parameter to allow DataFlavor |
||||||
|
* subclasses to handle special parameters like the text/plain charset |
||||||
|
* parameters, whose values are case insensitive. (MIME type parameter |
||||||
|
* values are supposed to be case sensitive). |
||||||
|
* <p> |
||||||
|
* This method is called for each parameter name/value pair and should |
||||||
|
* return the normalized representation of the parameterValue. |
||||||
|
* This method is never invoked by this implementation. |
||||||
|
* |
||||||
|
* @param parameterName the parameter name |
||||||
|
* @param parameterValue the parameter value |
||||||
|
* @return the normalized parameter value |
||||||
|
* @deprecated |
||||||
|
*/ |
||||||
|
protected String normalizeMimeTypeParameter(String parameterName, |
||||||
|
String parameterValue) { |
||||||
|
return parameterValue; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Called for each MIME type string to give DataFlavor subtypes the |
||||||
|
* opportunity to change how the normalization of MIME types is |
||||||
|
* accomplished. |
||||||
|
* One possible use would be to add default parameter/value pairs in cases |
||||||
|
* where none are present in the MIME type string passed in. |
||||||
|
* This method is never invoked by this implementation. |
||||||
|
* |
||||||
|
* @param mimeType the MIME type |
||||||
|
* @return the normalized MIME type |
||||||
|
* @deprecated |
||||||
|
*/ |
||||||
|
protected String normalizeMimeType(String mimeType) { |
||||||
|
return mimeType; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,245 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.activation; |
||||||
|
|
||||||
|
import java.io.*; |
||||||
|
import java.lang.reflect.InvocationTargetException; |
||||||
|
import java.lang.reflect.Method; |
||||||
|
import java.security.AccessController; |
||||||
|
import java.security.PrivilegedAction; |
||||||
|
|
||||||
|
/** |
||||||
|
* The CommandInfo class is used by CommandMap implementations to |
||||||
|
* describe the results of command requests. It provides the requestor |
||||||
|
* with both the verb requested, as well as an instance of the |
||||||
|
* bean. There is also a method that will return the name of the |
||||||
|
* class that implements the command but <i>it is not guaranteed to |
||||||
|
* return a valid value</i>. The reason for this is to allow CommandMap |
||||||
|
* implmentations that subclass CommandInfo to provide special |
||||||
|
* behavior. For example a CommandMap could dynamically generate |
||||||
|
* JavaBeans. In this case, it might not be possible to create an |
||||||
|
* object with all the correct state information solely from the class
|
||||||
|
* name. |
||||||
|
*/ |
||||||
|
|
||||||
|
public class CommandInfo { |
||||||
|
private String verb; |
||||||
|
private String className; |
||||||
|
|
||||||
|
/** |
||||||
|
* The Constructor for CommandInfo. |
||||||
|
* @param verb The command verb this CommandInfo decribes. |
||||||
|
* @param className The command's fully qualified class name. |
||||||
|
*/ |
||||||
|
public CommandInfo(String verb, String className) { |
||||||
|
this.verb = verb; |
||||||
|
this.className = className; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the command verb. |
||||||
|
* |
||||||
|
* @return the command verb. |
||||||
|
*/ |
||||||
|
public String getCommandName() { |
||||||
|
return verb; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the command's class name. <i>This method MAY return null in |
||||||
|
* cases where a CommandMap subclassed CommandInfo for its |
||||||
|
* own purposes.</i> In other words, it might not be possible to |
||||||
|
* create the correct state in the command by merely knowing |
||||||
|
* its class name. <b>DO NOT DEPEND ON THIS METHOD RETURNING |
||||||
|
* A VALID VALUE!</b> |
||||||
|
* |
||||||
|
* @return The class name of the command, or <i>null</i> |
||||||
|
*/ |
||||||
|
public String getCommandClass() { |
||||||
|
return className; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the instantiated JavaBean component. |
||||||
|
* <p> |
||||||
|
* If the current runtime environment supports |
||||||
|
* {@link java.beans.Beans#instantiate Beans.instantiate}, |
||||||
|
* use it to instantiate the JavaBeans component. Otherwise, use |
||||||
|
* {@link java.lang.Class#forName Class.forName}. |
||||||
|
* <p> |
||||||
|
* The component class needs to be public. |
||||||
|
* On Java SE 9 and newer, if the component class is in a named module, |
||||||
|
* it needs to be in an exported package. |
||||||
|
* <p> |
||||||
|
* If the bean implements the <code>javax.activation.CommandObject</code> |
||||||
|
* interface, call its <code>setCommandContext</code> method. |
||||||
|
* <p> |
||||||
|
* If the DataHandler parameter is null, then the bean is |
||||||
|
* instantiated with no data. NOTE: this may be useful |
||||||
|
* if for some reason the DataHandler that is passed in |
||||||
|
* throws IOExceptions when this method attempts to |
||||||
|
* access its InputStream. It will allow the caller to |
||||||
|
* retrieve a reference to the bean if it can be |
||||||
|
* instantiated. |
||||||
|
* <p> |
||||||
|
* If the bean does NOT implement the CommandObject interface, |
||||||
|
* this method will check if it implements the |
||||||
|
* java.io.Externalizable interface. If it does, the bean's |
||||||
|
* readExternal method will be called if an InputStream |
||||||
|
* can be acquired from the DataHandler.<p> |
||||||
|
* |
||||||
|
* @param dh The DataHandler that describes the data to be |
||||||
|
* passed to the command. |
||||||
|
* @param loader The ClassLoader to be used to instantiate the bean. |
||||||
|
* @return The bean |
||||||
|
* @exception IOException for failures reading data |
||||||
|
* @exception ClassNotFoundException if command object class can't |
||||||
|
* be found |
||||||
|
* @see java.beans.Beans#instantiate |
||||||
|
* @see javax.activation.CommandObject |
||||||
|
*/ |
||||||
|
public Object getCommandObject(DataHandler dh, ClassLoader loader) |
||||||
|
throws IOException, ClassNotFoundException { |
||||||
|
Object new_bean = null; |
||||||
|
|
||||||
|
// try to instantiate the bean
|
||||||
|
new_bean = Beans.instantiate(loader, className); |
||||||
|
|
||||||
|
// if we got one and it is a CommandObject
|
||||||
|
if (new_bean != null) { |
||||||
|
if (new_bean instanceof CommandObject) { |
||||||
|
((CommandObject)new_bean).setCommandContext(verb, dh); |
||||||
|
} else if (new_bean instanceof Externalizable) { |
||||||
|
if (dh != null) { |
||||||
|
InputStream is = dh.getInputStream(); |
||||||
|
if (is != null) { |
||||||
|
((Externalizable)new_bean).readExternal( |
||||||
|
new ObjectInputStream(is)); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return new_bean; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Helper class to invoke Beans.instantiate reflectively or the equivalent |
||||||
|
* with core reflection when module java.desktop is not readable. |
||||||
|
*/ |
||||||
|
private static final class Beans { |
||||||
|
static final Method instantiateMethod; |
||||||
|
|
||||||
|
static { |
||||||
|
Method m; |
||||||
|
try { |
||||||
|
Class<?> c = Class.forName("java.beans.Beans"); |
||||||
|
m = c.getDeclaredMethod("instantiate", ClassLoader.class, String.class); |
||||||
|
} catch (ClassNotFoundException e) { |
||||||
|
m = null; |
||||||
|
} catch (NoSuchMethodException e) { |
||||||
|
m = null; |
||||||
|
} |
||||||
|
instantiateMethod = m; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Equivalent to invoking java.beans.Beans.instantiate(loader, cn) |
||||||
|
*/ |
||||||
|
static Object instantiate(ClassLoader loader, String cn) |
||||||
|
throws IOException, ClassNotFoundException { |
||||||
|
|
||||||
|
Exception exception; |
||||||
|
|
||||||
|
if (instantiateMethod != null) { |
||||||
|
|
||||||
|
// invoke Beans.instantiate
|
||||||
|
try { |
||||||
|
return instantiateMethod.invoke(null, loader, cn); |
||||||
|
} catch (InvocationTargetException e) { |
||||||
|
exception = e; |
||||||
|
} catch (IllegalAccessException e) { |
||||||
|
exception = e; |
||||||
|
} |
||||||
|
|
||||||
|
} else { |
||||||
|
|
||||||
|
SecurityManager security = System.getSecurityManager(); |
||||||
|
if (security != null) { |
||||||
|
// if it's ok with the SecurityManager, it's ok with me.
|
||||||
|
String cname = cn.replace('/', '.'); |
||||||
|
if (cname.startsWith("[")) { |
||||||
|
int b = cname.lastIndexOf('[') + 2; |
||||||
|
if (b > 1 && b < cname.length()) { |
||||||
|
cname = cname.substring(b); |
||||||
|
} |
||||||
|
} |
||||||
|
int i = cname.lastIndexOf('.'); |
||||||
|
if (i != -1) { |
||||||
|
security.checkPackageAccess(cname.substring(0, i)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Beans.instantiate specified to use SCL when loader is null
|
||||||
|
if (loader == null) { |
||||||
|
loader = (ClassLoader) |
||||||
|
AccessController.doPrivileged(new PrivilegedAction() { |
||||||
|
public Object run() { |
||||||
|
ClassLoader cl = null; |
||||||
|
try { |
||||||
|
cl = ClassLoader.getSystemClassLoader(); |
||||||
|
} catch (SecurityException ex) { } |
||||||
|
return cl; |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
Class<?> beanClass = Class.forName(cn, true, loader); |
||||||
|
try { |
||||||
|
return beanClass.newInstance(); |
||||||
|
} catch (Exception ex) { |
||||||
|
throw new ClassNotFoundException(beanClass + ": " + ex, ex); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,249 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.activation; |
||||||
|
|
||||||
|
import java.util.Map; |
||||||
|
import java.util.WeakHashMap; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* The CommandMap class provides an interface to a registry of |
||||||
|
* command objects available in the system. |
||||||
|
* Developers are expected to either use the CommandMap |
||||||
|
* implementation included with this package (MailcapCommandMap) or |
||||||
|
* develop their own. Note that some of the methods in this class are |
||||||
|
* abstract. |
||||||
|
*/ |
||||||
|
public abstract class CommandMap { |
||||||
|
private static CommandMap defaultCommandMap = null; |
||||||
|
private static Map<ClassLoader,CommandMap> map = |
||||||
|
new WeakHashMap<ClassLoader,CommandMap>(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get the default CommandMap. |
||||||
|
* |
||||||
|
* <ul> |
||||||
|
* <li> In cases where a CommandMap instance has been previously set |
||||||
|
* to some value (via <i>setDefaultCommandMap</i>) |
||||||
|
* return the CommandMap. |
||||||
|
* <li> |
||||||
|
* In cases where no CommandMap has been set, the CommandMap |
||||||
|
* creates an instance of <code>MailcapCommandMap</code> and |
||||||
|
* set that to the default, returning its value. |
||||||
|
* |
||||||
|
* </ul> |
||||||
|
* |
||||||
|
* @return the CommandMap |
||||||
|
*/ |
||||||
|
public static synchronized CommandMap getDefaultCommandMap() { |
||||||
|
if (defaultCommandMap != null) |
||||||
|
return defaultCommandMap; |
||||||
|
|
||||||
|
// fetch per-thread-context-class-loader default
|
||||||
|
ClassLoader tccl = SecuritySupport.getContextClassLoader(); |
||||||
|
CommandMap def = map.get(tccl); |
||||||
|
if (def == null) { |
||||||
|
def = new MailcapCommandMap(); |
||||||
|
map.put(tccl, def); |
||||||
|
} |
||||||
|
return def; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set the default CommandMap. Reset the CommandMap to the default by |
||||||
|
* calling this method with <code>null</code>. |
||||||
|
* |
||||||
|
* @param commandMap The new default CommandMap. |
||||||
|
* @exception SecurityException if the caller doesn't have permission |
||||||
|
* to change the default |
||||||
|
*/ |
||||||
|
public static synchronized void setDefaultCommandMap(CommandMap commandMap) { |
||||||
|
SecurityManager security = System.getSecurityManager(); |
||||||
|
if (security != null) { |
||||||
|
try { |
||||||
|
// if it's ok with the SecurityManager, it's ok with me...
|
||||||
|
security.checkSetFactory(); |
||||||
|
} catch (SecurityException ex) { |
||||||
|
// otherwise, we also allow it if this code and the
|
||||||
|
// factory come from the same (non-system) class loader (e.g.,
|
||||||
|
// the JAF classes were loaded with the applet classes).
|
||||||
|
ClassLoader cl = CommandMap.class.getClassLoader(); |
||||||
|
if (cl == null || cl.getParent() == null || |
||||||
|
cl != commandMap.getClass().getClassLoader()) { |
||||||
|
throw ex; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
// remove any per-thread-context-class-loader CommandMap
|
||||||
|
map.remove(SecuritySupport.getContextClassLoader()); |
||||||
|
defaultCommandMap = commandMap; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the preferred command list from a MIME Type. The actual semantics |
||||||
|
* are determined by the implementation of the CommandMap. |
||||||
|
* |
||||||
|
* @param mimeType the MIME type |
||||||
|
* @return the CommandInfo classes that represent the command Beans. |
||||||
|
*/ |
||||||
|
abstract public CommandInfo[] getPreferredCommands(String mimeType); |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the preferred command list from a MIME Type. The actual semantics |
||||||
|
* are determined by the implementation of the CommandMap. <p> |
||||||
|
* |
||||||
|
* The <code>DataSource</code> provides extra information, such as |
||||||
|
* the file name, that a CommandMap implementation may use to further |
||||||
|
* refine the list of commands that are returned. The implementation |
||||||
|
* in this class simply calls the <code>getPreferredCommands</code> |
||||||
|
* method that ignores this argument. |
||||||
|
* |
||||||
|
* @param mimeType the MIME type |
||||||
|
* @param ds a DataSource for the data |
||||||
|
* @return the CommandInfo classes that represent the command Beans. |
||||||
|
* @since JAF 1.1 |
||||||
|
*/ |
||||||
|
public CommandInfo[] getPreferredCommands(String mimeType, DataSource ds) { |
||||||
|
return getPreferredCommands(mimeType); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get all the available commands for this type. This method |
||||||
|
* should return all the possible commands for this MIME type. |
||||||
|
* |
||||||
|
* @param mimeType the MIME type |
||||||
|
* @return the CommandInfo objects representing all the commands. |
||||||
|
*/ |
||||||
|
abstract public CommandInfo[] getAllCommands(String mimeType); |
||||||
|
|
||||||
|
/** |
||||||
|
* Get all the available commands for this type. This method |
||||||
|
* should return all the possible commands for this MIME type. <p> |
||||||
|
* |
||||||
|
* The <code>DataSource</code> provides extra information, such as |
||||||
|
* the file name, that a CommandMap implementation may use to further |
||||||
|
* refine the list of commands that are returned. The implementation |
||||||
|
* in this class simply calls the <code>getAllCommands</code> |
||||||
|
* method that ignores this argument. |
||||||
|
* |
||||||
|
* @param mimeType the MIME type |
||||||
|
* @param ds a DataSource for the data |
||||||
|
* @return the CommandInfo objects representing all the commands. |
||||||
|
* @since JAF 1.1 |
||||||
|
*/ |
||||||
|
public CommandInfo[] getAllCommands(String mimeType, DataSource ds) { |
||||||
|
return getAllCommands(mimeType); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the default command corresponding to the MIME type. |
||||||
|
* |
||||||
|
* @param mimeType the MIME type |
||||||
|
* @param cmdName the command name |
||||||
|
* @return the CommandInfo corresponding to the command. |
||||||
|
*/ |
||||||
|
abstract public CommandInfo getCommand(String mimeType, String cmdName); |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the default command corresponding to the MIME type. <p> |
||||||
|
* |
||||||
|
* The <code>DataSource</code> provides extra information, such as |
||||||
|
* the file name, that a CommandMap implementation may use to further |
||||||
|
* refine the command that is chosen. The implementation |
||||||
|
* in this class simply calls the <code>getCommand</code> |
||||||
|
* method that ignores this argument. |
||||||
|
* |
||||||
|
* @param mimeType the MIME type |
||||||
|
* @param cmdName the command name |
||||||
|
* @param ds a DataSource for the data |
||||||
|
* @return the CommandInfo corresponding to the command. |
||||||
|
* @since JAF 1.1 |
||||||
|
*/ |
||||||
|
public CommandInfo getCommand(String mimeType, String cmdName, |
||||||
|
DataSource ds) { |
||||||
|
return getCommand(mimeType, cmdName); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Locate a DataContentHandler that corresponds to the MIME type. |
||||||
|
* The mechanism and semantics for determining this are determined |
||||||
|
* by the implementation of the particular CommandMap. |
||||||
|
* |
||||||
|
* @param mimeType the MIME type |
||||||
|
* @return the DataContentHandler for the MIME type |
||||||
|
*/ |
||||||
|
abstract public DataContentHandler createDataContentHandler(String |
||||||
|
mimeType); |
||||||
|
|
||||||
|
/** |
||||||
|
* Locate a DataContentHandler that corresponds to the MIME type. |
||||||
|
* The mechanism and semantics for determining this are determined |
||||||
|
* by the implementation of the particular CommandMap. <p> |
||||||
|
* |
||||||
|
* The <code>DataSource</code> provides extra information, such as |
||||||
|
* the file name, that a CommandMap implementation may use to further |
||||||
|
* refine the choice of DataContentHandler. The implementation |
||||||
|
* in this class simply calls the <code>createDataContentHandler</code> |
||||||
|
* method that ignores this argument. |
||||||
|
* |
||||||
|
* @param mimeType the MIME type |
||||||
|
* @param ds a DataSource for the data |
||||||
|
* @return the DataContentHandler for the MIME type |
||||||
|
* @since JAF 1.1 |
||||||
|
*/ |
||||||
|
public DataContentHandler createDataContentHandler(String mimeType, |
||||||
|
DataSource ds) { |
||||||
|
return createDataContentHandler(mimeType); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get all the MIME types known to this command map. |
||||||
|
* If the command map doesn't support this operation, |
||||||
|
* null is returned. |
||||||
|
* |
||||||
|
* @return array of MIME types as strings, or null if not supported |
||||||
|
* @since JAF 1.1 |
||||||
|
*/ |
||||||
|
public String[] getMimeTypes() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,68 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.activation; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
/** |
||||||
|
* JavaBeans components that are Activation Framework aware implement |
||||||
|
* this interface to find out which command verb they're being asked |
||||||
|
* to perform, and to obtain the DataHandler representing the |
||||||
|
* data they should operate on. JavaBeans that don't implement |
||||||
|
* this interface may be used as well. Such commands may obtain |
||||||
|
* the data using the Externalizable interface, or using an |
||||||
|
* application-specific method. |
||||||
|
*/ |
||||||
|
public interface CommandObject { |
||||||
|
|
||||||
|
/** |
||||||
|
* Initialize the Command with the verb it is requested to handle |
||||||
|
* and the DataHandler that describes the data it will |
||||||
|
* operate on. <b>NOTE:</b> it is acceptable for the caller |
||||||
|
* to pass <i>null</i> as the value for <code>DataHandler</code>. |
||||||
|
* |
||||||
|
* @param verb The Command Verb this object refers to. |
||||||
|
* @param dh The DataHandler. |
||||||
|
* @exception IOException for failures accessing data |
||||||
|
*/ |
||||||
|
public void setCommandContext(String verb, DataHandler dh) |
||||||
|
throws IOException; |
||||||
|
} |
@ -0,0 +1,114 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.activation; |
||||||
|
|
||||||
|
import java.awt.datatransfer.DataFlavor; |
||||||
|
import java.awt.datatransfer.UnsupportedFlavorException; |
||||||
|
import java.io.InputStream; |
||||||
|
import java.io.IOException; |
||||||
|
import java.io.OutputStream; |
||||||
|
import javax.activation.DataSource; |
||||||
|
|
||||||
|
/** |
||||||
|
* The DataContentHandler interface is implemented by objects that can |
||||||
|
* be used to extend the capabilities of the DataHandler's implementation |
||||||
|
* of the Transferable interface. Through <code>DataContentHandlers</code> |
||||||
|
* the framework can be extended to convert streams in to objects, and |
||||||
|
* to write objects to streams. <p> |
||||||
|
* |
||||||
|
* Applications don't generally call the methods in DataContentHandlers |
||||||
|
* directly. Instead, an application calls the equivalent methods in |
||||||
|
* DataHandler. The DataHandler will attempt to find an appropriate |
||||||
|
* DataContentHandler that corresponds to its MIME type using the |
||||||
|
* current DataContentHandlerFactory. The DataHandler then calls |
||||||
|
* through to the methods in the DataContentHandler. |
||||||
|
*/ |
||||||
|
|
||||||
|
public interface DataContentHandler { |
||||||
|
/** |
||||||
|
* Returns an array of DataFlavor objects indicating the flavors the |
||||||
|
* data can be provided in. The array should be ordered according to |
||||||
|
* preference for providing the data (from most richly descriptive to |
||||||
|
* least descriptive). |
||||||
|
* |
||||||
|
* @return The DataFlavors. |
||||||
|
*/ |
||||||
|
public DataFlavor[] getTransferDataFlavors(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns an object which represents the data to be transferred. |
||||||
|
* The class of the object returned is defined by the representation class
|
||||||
|
* of the flavor. |
||||||
|
* |
||||||
|
* @param df The DataFlavor representing the requested type. |
||||||
|
* @param ds The DataSource representing the data to be converted. |
||||||
|
* @return The constructed Object. |
||||||
|
* @exception UnsupportedFlavorException if the handler doesn't |
||||||
|
* support the requested flavor |
||||||
|
* @exception IOException if the data can't be accessed |
||||||
|
*/ |
||||||
|
public Object getTransferData(DataFlavor df, DataSource ds) |
||||||
|
throws UnsupportedFlavorException, IOException; |
||||||
|
|
||||||
|
/** |
||||||
|
* Return an object representing the data in its most preferred form. |
||||||
|
* Generally this will be the form described by the first DataFlavor |
||||||
|
* returned by the <code>getTransferDataFlavors</code> method. |
||||||
|
* |
||||||
|
* @param ds The DataSource representing the data to be converted. |
||||||
|
* @return The constructed Object. |
||||||
|
* @exception IOException if the data can't be accessed |
||||||
|
*/ |
||||||
|
public Object getContent(DataSource ds) throws IOException; |
||||||
|
|
||||||
|
/** |
||||||
|
* Convert the object to a byte stream of the specified MIME type |
||||||
|
* and write it to the output stream. |
||||||
|
* |
||||||
|
* @param obj The object to be converted. |
||||||
|
* @param mimeType The requested MIME type of the resulting byte stream. |
||||||
|
* @param os The output stream into which to write the converted |
||||||
|
* byte stream. |
||||||
|
* @exception IOException errors writing to the stream |
||||||
|
*/ |
||||||
|
public void writeTo(Object obj, String mimeType, OutputStream os) |
||||||
|
throws IOException; |
||||||
|
} |
@ -0,0 +1,61 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.activation; |
||||||
|
|
||||||
|
/** |
||||||
|
* This interface defines a factory for <code>DataContentHandlers</code>. An |
||||||
|
* implementation of this interface should map a MIME type into an |
||||||
|
* instance of DataContentHandler. The design pattern for classes implementing |
||||||
|
* this interface is the same as for the ContentHandler mechanism used in |
||||||
|
* <code>java.net.URL</code>. |
||||||
|
*/ |
||||||
|
|
||||||
|
public interface DataContentHandlerFactory { |
||||||
|
|
||||||
|
/** |
||||||
|
* Creates a new DataContentHandler object for the MIME type. |
||||||
|
* |
||||||
|
* @param mimeType the MIME type to create the DataContentHandler for. |
||||||
|
* @return The new <code>DataContentHandler</code>, or <i>null</i> |
||||||
|
* if none are found. |
||||||
|
*/ |
||||||
|
public DataContentHandler createDataContentHandler(String mimeType); |
||||||
|
} |
@ -0,0 +1,912 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.activation; |
||||||
|
|
||||||
|
import java.io.InputStream; |
||||||
|
import java.io.IOException; |
||||||
|
import java.io.OutputStream; |
||||||
|
import java.io.PipedInputStream; |
||||||
|
import java.io.PipedOutputStream; |
||||||
|
import java.io.OutputStreamWriter; |
||||||
|
import java.net.URL; |
||||||
|
import java.awt.datatransfer.Transferable; |
||||||
|
import java.awt.datatransfer.DataFlavor; |
||||||
|
import java.awt.datatransfer.UnsupportedFlavorException; |
||||||
|
|
||||||
|
/** |
||||||
|
* The DataHandler class provides a consistent interface to data |
||||||
|
* available in many different sources and formats. |
||||||
|
* It manages simple stream to string conversions and related operations |
||||||
|
* using DataContentHandlers. |
||||||
|
* It provides access to commands that can operate on the data. |
||||||
|
* The commands are found using a CommandMap. <p> |
||||||
|
* |
||||||
|
* <b>DataHandler and the Transferable Interface</b><p> |
||||||
|
* DataHandler implements the Transferable interface so that data can |
||||||
|
* be used in AWT data transfer operations, such as cut and paste and |
||||||
|
* drag and drop. The implementation of the Transferable interface
|
||||||
|
* relies on the availability of an installed DataContentHandler |
||||||
|
* object corresponding to the MIME type of the data represented in |
||||||
|
* the specific instance of the DataHandler.<p> |
||||||
|
* |
||||||
|
* <b>DataHandler and CommandMaps</b><p> |
||||||
|
* The DataHandler keeps track of the current CommandMap that it uses to |
||||||
|
* service requests for commands (<code>getCommand</code>, |
||||||
|
* <code>getAllCommands</code>, <code>getPreferredCommands</code>). |
||||||
|
* Each instance of a DataHandler may have a CommandMap associated with |
||||||
|
* it using the <code>setCommandMap</code> method. If a CommandMap was |
||||||
|
* not set, DataHandler calls the <code>getDefaultCommandMap</code> |
||||||
|
* method in CommandMap and uses the value it returns. See |
||||||
|
* <i>CommandMap</i> for more information. <p> |
||||||
|
* |
||||||
|
* <b>DataHandler and URLs</b><p> |
||||||
|
* The current DataHandler implementation creates a private |
||||||
|
* instance of URLDataSource when it is constructed with a URL. |
||||||
|
* |
||||||
|
* @see javax.activation.CommandMap |
||||||
|
* @see javax.activation.DataContentHandler |
||||||
|
* @see javax.activation.DataSource |
||||||
|
* @see javax.activation.URLDataSource |
||||||
|
*/ |
||||||
|
|
||||||
|
public class DataHandler implements Transferable { |
||||||
|
|
||||||
|
// Use the datasource to indicate whether we were started via the
|
||||||
|
// DataSource constructor or the object constructor.
|
||||||
|
private DataSource dataSource = null; |
||||||
|
private DataSource objDataSource = null; |
||||||
|
|
||||||
|
// The Object and mimetype from the constructor (if passed in).
|
||||||
|
// object remains null if it was instantiated with a
|
||||||
|
// DataSource.
|
||||||
|
private Object object = null; |
||||||
|
private String objectMimeType = null; |
||||||
|
|
||||||
|
// Keep track of the CommandMap
|
||||||
|
private CommandMap currentCommandMap = null; |
||||||
|
|
||||||
|
// our transfer flavors
|
||||||
|
private static final DataFlavor emptyFlavors[] = new DataFlavor[0]; |
||||||
|
private DataFlavor transferFlavors[] = emptyFlavors; |
||||||
|
|
||||||
|
// our DataContentHandler
|
||||||
|
private DataContentHandler dataContentHandler = null; |
||||||
|
private DataContentHandler factoryDCH = null; |
||||||
|
|
||||||
|
// our DataContentHandlerFactory
|
||||||
|
private static DataContentHandlerFactory factory = null; |
||||||
|
private DataContentHandlerFactory oldFactory = null; |
||||||
|
// the short representation of the ContentType (sans params)
|
||||||
|
private String shortType = null; |
||||||
|
|
||||||
|
/** |
||||||
|
* Create a <code>DataHandler</code> instance referencing the |
||||||
|
* specified DataSource. The data exists in a byte stream form. |
||||||
|
* The DataSource will provide an InputStream to access the data. |
||||||
|
* |
||||||
|
* @param ds the DataSource |
||||||
|
*/ |
||||||
|
public DataHandler(DataSource ds) { |
||||||
|
// save a reference to the incoming DS
|
||||||
|
dataSource = ds; |
||||||
|
oldFactory = factory; // keep track of the factory
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Create a <code>DataHandler</code> instance representing an object |
||||||
|
* of this MIME type. This constructor is |
||||||
|
* used when the application already has an in-memory representation |
||||||
|
* of the data in the form of a Java Object. |
||||||
|
* |
||||||
|
* @param obj the Java Object |
||||||
|
* @param mimeType the MIME type of the object |
||||||
|
*/ |
||||||
|
public DataHandler(Object obj, String mimeType) { |
||||||
|
object = obj; |
||||||
|
objectMimeType = mimeType; |
||||||
|
oldFactory = factory; // keep track of the factory
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Create a <code>DataHandler</code> instance referencing a URL. |
||||||
|
* The DataHandler internally creates a <code>URLDataSource</code> |
||||||
|
* instance to represent the URL. |
||||||
|
* |
||||||
|
* @param url a URL object |
||||||
|
*/ |
||||||
|
public DataHandler(URL url) { |
||||||
|
dataSource = new URLDataSource(url); |
||||||
|
oldFactory = factory; // keep track of the factory
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the CommandMap for this instance of DataHandler. |
||||||
|
*/ |
||||||
|
private synchronized CommandMap getCommandMap() { |
||||||
|
if (currentCommandMap != null) |
||||||
|
return currentCommandMap; |
||||||
|
else |
||||||
|
return CommandMap.getDefaultCommandMap(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the DataSource associated with this instance |
||||||
|
* of DataHandler. |
||||||
|
* <p> |
||||||
|
* For DataHandlers that have been instantiated with a DataSource, |
||||||
|
* this method returns the DataSource that was used to create the |
||||||
|
* DataHandler object. In other cases the DataHandler |
||||||
|
* constructs a DataSource from the data used to construct |
||||||
|
* the DataHandler. DataSources created for DataHandlers <b>not</b> |
||||||
|
* instantiated with a DataSource are cached for performance |
||||||
|
* reasons. |
||||||
|
* |
||||||
|
* @return a valid DataSource object for this DataHandler |
||||||
|
*/ |
||||||
|
public DataSource getDataSource() { |
||||||
|
if (dataSource == null) { |
||||||
|
// create one on the fly
|
||||||
|
if (objDataSource == null) |
||||||
|
objDataSource = new DataHandlerDataSource(this); |
||||||
|
return objDataSource; |
||||||
|
} |
||||||
|
return dataSource; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the name of the data object. If this DataHandler |
||||||
|
* was created with a DataSource, this method calls through |
||||||
|
* to the <code>DataSource.getName</code> method, otherwise it |
||||||
|
* returns <i>null</i>. |
||||||
|
* |
||||||
|
* @return the name of the object |
||||||
|
*/ |
||||||
|
public String getName() { |
||||||
|
if (dataSource != null) |
||||||
|
return dataSource.getName(); |
||||||
|
else |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the MIME type of this object as retrieved from |
||||||
|
* the source object. Note that this is the <i>full</i> |
||||||
|
* type with parameters. |
||||||
|
* |
||||||
|
* @return the MIME type |
||||||
|
*/ |
||||||
|
public String getContentType() { |
||||||
|
if (dataSource != null) // data source case
|
||||||
|
return dataSource.getContentType(); |
||||||
|
else |
||||||
|
return objectMimeType; // obj/type case
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the InputStream for this object. <p> |
||||||
|
* |
||||||
|
* For DataHandlers instantiated with a DataSource, the DataHandler |
||||||
|
* calls the <code>DataSource.getInputStream</code> method and |
||||||
|
* returns the result to the caller. |
||||||
|
* <p> |
||||||
|
* For DataHandlers instantiated with an Object, the DataHandler |
||||||
|
* first attempts to find a DataContentHandler for the Object. If |
||||||
|
* the DataHandler can not find a DataContentHandler for this MIME |
||||||
|
* type, it throws an UnsupportedDataTypeException. If it is |
||||||
|
* successful, it creates a pipe and a thread. The thread uses the |
||||||
|
* DataContentHandler's <code>writeTo</code> method to write the |
||||||
|
* stream data into one end of the pipe. The other end of the pipe |
||||||
|
* is returned to the caller. Because a thread is created to copy |
||||||
|
* the data, IOExceptions that may occur during the copy can not be |
||||||
|
* propagated back to the caller. The result is an empty stream.<p> |
||||||
|
* |
||||||
|
* @return the InputStream representing this data |
||||||
|
* @exception IOException if an I/O error occurs |
||||||
|
* |
||||||
|
* @see javax.activation.DataContentHandler#writeTo |
||||||
|
* @see javax.activation.UnsupportedDataTypeException |
||||||
|
*/ |
||||||
|
public InputStream getInputStream() throws IOException { |
||||||
|
InputStream ins = null; |
||||||
|
|
||||||
|
if (dataSource != null) { |
||||||
|
ins = dataSource.getInputStream(); |
||||||
|
} else { |
||||||
|
DataContentHandler dch = getDataContentHandler(); |
||||||
|
// we won't even try if we can't get a dch
|
||||||
|
if (dch == null) |
||||||
|
throw new UnsupportedDataTypeException( |
||||||
|
"no DCH for MIME type " + getBaseType()); |
||||||
|
|
||||||
|
if (dch instanceof ObjectDataContentHandler) { |
||||||
|
if (((ObjectDataContentHandler)dch).getDCH() == null) |
||||||
|
throw new UnsupportedDataTypeException( |
||||||
|
"no object DCH for MIME type " + getBaseType()); |
||||||
|
} |
||||||
|
// there is none but the default^^^^^^^^^^^^^^^^
|
||||||
|
final DataContentHandler fdch = dch; |
||||||
|
|
||||||
|
// from bill s.
|
||||||
|
// ce n'est pas une pipe!
|
||||||
|
//
|
||||||
|
// NOTE: This block of code needs to throw exceptions, but
|
||||||
|
// can't because it is in another thread!!! ARG!
|
||||||
|
//
|
||||||
|
final PipedOutputStream pos = new PipedOutputStream(); |
||||||
|
PipedInputStream pin = new PipedInputStream(pos); |
||||||
|
new Thread( |
||||||
|
new Runnable() { |
||||||
|
public void run() { |
||||||
|
try { |
||||||
|
fdch.writeTo(object, objectMimeType, pos); |
||||||
|
} catch (IOException e) { |
||||||
|
|
||||||
|
} finally { |
||||||
|
try { |
||||||
|
pos.close(); |
||||||
|
} catch (IOException ie) { } |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
"DataHandler.getInputStream").start(); |
||||||
|
ins = pin; |
||||||
|
} |
||||||
|
|
||||||
|
return ins; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Write the data to an <code>OutputStream</code>.<p> |
||||||
|
* |
||||||
|
* If the DataHandler was created with a DataSource, writeTo |
||||||
|
* retrieves the InputStream and copies the bytes from the |
||||||
|
* InputStream to the OutputStream passed in. |
||||||
|
* <p> |
||||||
|
* If the DataHandler was created with an object, writeTo |
||||||
|
* retrieves the DataContentHandler for the object's type. |
||||||
|
* If the DataContentHandler was found, it calls the |
||||||
|
* <code>writeTo</code> method on the <code>DataContentHandler</code>. |
||||||
|
* |
||||||
|
* @param os the OutputStream to write to |
||||||
|
* @exception IOException if an I/O error occurs |
||||||
|
*/ |
||||||
|
public void writeTo(OutputStream os) throws IOException { |
||||||
|
// for the DataSource case
|
||||||
|
if (dataSource != null) { |
||||||
|
InputStream is = null; |
||||||
|
byte data[] = new byte[8*1024]; |
||||||
|
int bytes_read; |
||||||
|
|
||||||
|
is = dataSource.getInputStream(); |
||||||
|
|
||||||
|
try { |
||||||
|
while ((bytes_read = is.read(data)) > 0) { |
||||||
|
os.write(data, 0, bytes_read); |
||||||
|
} |
||||||
|
} finally { |
||||||
|
is.close(); |
||||||
|
is = null; |
||||||
|
} |
||||||
|
} else { // for the Object case
|
||||||
|
DataContentHandler dch = getDataContentHandler(); |
||||||
|
dch.writeTo(object, objectMimeType, os); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get an OutputStream for this DataHandler to allow overwriting |
||||||
|
* the underlying data. |
||||||
|
* If the DataHandler was created with a DataSource, the |
||||||
|
* DataSource's <code>getOutputStream</code> method is called. |
||||||
|
* Otherwise, <code>null</code> is returned. |
||||||
|
* |
||||||
|
* @return the OutputStream |
||||||
|
* @exception IOException for failures creating the OutputStream |
||||||
|
* |
||||||
|
* @see javax.activation.DataSource#getOutputStream |
||||||
|
* @see javax.activation.URLDataSource |
||||||
|
*/ |
||||||
|
public OutputStream getOutputStream() throws IOException { |
||||||
|
if (dataSource != null) |
||||||
|
return dataSource.getOutputStream(); |
||||||
|
else |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the DataFlavors in which this data is available. <p> |
||||||
|
* |
||||||
|
* Returns an array of DataFlavor objects indicating the flavors |
||||||
|
* the data can be provided in. The array is usually ordered |
||||||
|
* according to preference for providing the data, from most |
||||||
|
* richly descriptive to least richly descriptive.<p> |
||||||
|
* |
||||||
|
* The DataHandler attempts to find a DataContentHandler that |
||||||
|
* corresponds to the MIME type of the data. If one is located, |
||||||
|
* the DataHandler calls the DataContentHandler's |
||||||
|
* <code>getTransferDataFlavors</code> method. <p> |
||||||
|
* |
||||||
|
* If a DataContentHandler can <i>not</i> be located, and if the |
||||||
|
* DataHandler was created with a DataSource (or URL), one |
||||||
|
* DataFlavor is returned that represents this object's MIME type |
||||||
|
* and the <code>java.io.InputStream</code> class. If the |
||||||
|
* DataHandler was created with an object and a MIME type, |
||||||
|
* getTransferDataFlavors returns one DataFlavor that represents |
||||||
|
* this object's MIME type and the object's class. |
||||||
|
* |
||||||
|
* @return an array of data flavors in which this data can be transferred |
||||||
|
* @see javax.activation.DataContentHandler#getTransferDataFlavors |
||||||
|
*/ |
||||||
|
public synchronized DataFlavor[] getTransferDataFlavors() { |
||||||
|
if (factory != oldFactory) // if the factory has changed, clear cache
|
||||||
|
transferFlavors = emptyFlavors; |
||||||
|
|
||||||
|
// if it's not set, set it...
|
||||||
|
if (transferFlavors == emptyFlavors) |
||||||
|
transferFlavors = getDataContentHandler().getTransferDataFlavors(); |
||||||
|
if (transferFlavors == emptyFlavors) |
||||||
|
return transferFlavors; // no need to clone an empty array
|
||||||
|
else |
||||||
|
return transferFlavors.clone(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns whether the specified data flavor is supported |
||||||
|
* for this object.<p> |
||||||
|
* |
||||||
|
* This method iterates through the DataFlavors returned from |
||||||
|
* <code>getTransferDataFlavors</code>, comparing each with |
||||||
|
* the specified flavor. |
||||||
|
* |
||||||
|
* @param flavor the requested flavor for the data |
||||||
|
* @return true if the data flavor is supported |
||||||
|
* @see javax.activation.DataHandler#getTransferDataFlavors |
||||||
|
*/ |
||||||
|
public boolean isDataFlavorSupported(DataFlavor flavor) { |
||||||
|
DataFlavor[] lFlavors = getTransferDataFlavors(); |
||||||
|
|
||||||
|
for (int i = 0; i < lFlavors.length; i++) { |
||||||
|
if (lFlavors[i].equals(flavor)) |
||||||
|
return true; |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns an object that represents the data to be |
||||||
|
* transferred. The class of the object returned is defined by the |
||||||
|
* representation class of the data flavor.<p> |
||||||
|
* |
||||||
|
* <b>For DataHandler's created with DataSources or URLs:</b><p> |
||||||
|
* |
||||||
|
* The DataHandler attempts to locate a DataContentHandler |
||||||
|
* for this MIME type. If one is found, the passed in DataFlavor |
||||||
|
* and the type of the data are passed to its <code>getTransferData</code> |
||||||
|
* method. If the DataHandler fails to locate a DataContentHandler |
||||||
|
* and the flavor specifies this object's MIME type and the |
||||||
|
* <code>java.io.InputStream</code> class, this object's InputStream |
||||||
|
* is returned. |
||||||
|
* Otherwise it throws an UnsupportedFlavorException. <p> |
||||||
|
* |
||||||
|
* <b>For DataHandler's created with Objects:</b><p> |
||||||
|
* |
||||||
|
* The DataHandler attempts to locate a DataContentHandler |
||||||
|
* for this MIME type. If one is found, the passed in DataFlavor |
||||||
|
* and the type of the data are passed to its getTransferData |
||||||
|
* method. If the DataHandler fails to locate a DataContentHandler |
||||||
|
* and the flavor specifies this object's MIME type and its class, |
||||||
|
* this DataHandler's referenced object is returned. |
||||||
|
* Otherwise it throws an UnsupportedFlavorException. |
||||||
|
* |
||||||
|
* @param flavor the requested flavor for the data |
||||||
|
* @return the object |
||||||
|
* @exception UnsupportedFlavorException if the data could not be |
||||||
|
* converted to the requested flavor |
||||||
|
* @exception IOException if an I/O error occurs |
||||||
|
* @see javax.activation.ActivationDataFlavor |
||||||
|
*/ |
||||||
|
public Object getTransferData(DataFlavor flavor) |
||||||
|
throws UnsupportedFlavorException, IOException { |
||||||
|
return getDataContentHandler().getTransferData(flavor, dataSource); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set the CommandMap for use by this DataHandler. |
||||||
|
* Setting it to <code>null</code> causes the CommandMap to revert |
||||||
|
* to the CommandMap returned by the |
||||||
|
* <code>CommandMap.getDefaultCommandMap</code> method. |
||||||
|
* Changing the CommandMap, or setting it to <code>null</code>, |
||||||
|
* clears out any data cached from the previous CommandMap. |
||||||
|
* |
||||||
|
* @param commandMap the CommandMap to use in this DataHandler |
||||||
|
* |
||||||
|
* @see javax.activation.CommandMap#setDefaultCommandMap |
||||||
|
*/ |
||||||
|
public synchronized void setCommandMap(CommandMap commandMap) { |
||||||
|
if (commandMap != currentCommandMap || commandMap == null) { |
||||||
|
// clear cached values...
|
||||||
|
transferFlavors = emptyFlavors; |
||||||
|
dataContentHandler = null; |
||||||
|
|
||||||
|
currentCommandMap = commandMap; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the <i>preferred</i> commands for this type of data. |
||||||
|
* This method calls the <code>getPreferredCommands</code> method |
||||||
|
* in the CommandMap associated with this instance of DataHandler. |
||||||
|
* This method returns an array that represents a subset of |
||||||
|
* available commands. In cases where multiple commands for the |
||||||
|
* MIME type represented by this DataHandler are present, the |
||||||
|
* installed CommandMap chooses the appropriate commands. |
||||||
|
* |
||||||
|
* @return the CommandInfo objects representing the preferred commands |
||||||
|
* |
||||||
|
* @see javax.activation.CommandMap#getPreferredCommands |
||||||
|
*/ |
||||||
|
public CommandInfo[] getPreferredCommands() { |
||||||
|
if (dataSource != null) |
||||||
|
return getCommandMap().getPreferredCommands(getBaseType(), |
||||||
|
dataSource); |
||||||
|
else |
||||||
|
return getCommandMap().getPreferredCommands(getBaseType()); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return all the commands for this type of data. |
||||||
|
* This method returns an array containing all commands |
||||||
|
* for the type of data represented by this DataHandler. The |
||||||
|
* MIME type for the underlying data represented by this DataHandler |
||||||
|
* is used to call through to the <code>getAllCommands</code> method |
||||||
|
* of the CommandMap associated with this DataHandler. |
||||||
|
* |
||||||
|
* @return the CommandInfo objects representing all the commands |
||||||
|
* |
||||||
|
* @see javax.activation.CommandMap#getAllCommands |
||||||
|
*/ |
||||||
|
public CommandInfo[] getAllCommands() { |
||||||
|
if (dataSource != null) |
||||||
|
return getCommandMap().getAllCommands(getBaseType(), dataSource); |
||||||
|
else |
||||||
|
return getCommandMap().getAllCommands(getBaseType()); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the command <i>cmdName</i>. Use the search semantics as |
||||||
|
* defined by the CommandMap installed in this DataHandler. The |
||||||
|
* MIME type for the underlying data represented by this DataHandler |
||||||
|
* is used to call through to the <code>getCommand</code> method |
||||||
|
* of the CommandMap associated with this DataHandler. |
||||||
|
* |
||||||
|
* @param cmdName the command name |
||||||
|
* @return the CommandInfo corresponding to the command |
||||||
|
* |
||||||
|
* @see javax.activation.CommandMap#getCommand |
||||||
|
*/ |
||||||
|
public CommandInfo getCommand(String cmdName) { |
||||||
|
if (dataSource != null) |
||||||
|
return getCommandMap().getCommand(getBaseType(), cmdName, |
||||||
|
dataSource); |
||||||
|
else |
||||||
|
return getCommandMap().getCommand(getBaseType(), cmdName); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the data in its preferred Object form. <p> |
||||||
|
* |
||||||
|
* If the DataHandler was instantiated with an object, return |
||||||
|
* the object. <p> |
||||||
|
* |
||||||
|
* If the DataHandler was instantiated with a DataSource, |
||||||
|
* this method uses a DataContentHandler to return the content |
||||||
|
* object for the data represented by this DataHandler. If no |
||||||
|
* <code>DataContentHandler</code> can be found for the |
||||||
|
* the type of this data, the DataHandler returns an |
||||||
|
* InputStream for the data. |
||||||
|
* |
||||||
|
* @return the content. |
||||||
|
* @exception IOException if an IOException occurs during |
||||||
|
* this operation. |
||||||
|
*/ |
||||||
|
public Object getContent() throws IOException { |
||||||
|
if (object != null) |
||||||
|
return object; |
||||||
|
else |
||||||
|
return getDataContentHandler().getContent(getDataSource()); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* A convenience method that takes a CommandInfo object |
||||||
|
* and instantiates the corresponding command, usually |
||||||
|
* a JavaBean component. |
||||||
|
* <p> |
||||||
|
* This method calls the CommandInfo's <code>getCommandObject</code> |
||||||
|
* method with the <code>ClassLoader</code> used to load |
||||||
|
* the <code>javax.activation.DataHandler</code> class itself. |
||||||
|
* |
||||||
|
* @param cmdinfo the CommandInfo corresponding to a command |
||||||
|
* @return the instantiated command object |
||||||
|
*/ |
||||||
|
public Object getBean(CommandInfo cmdinfo) { |
||||||
|
Object bean = null; |
||||||
|
|
||||||
|
try { |
||||||
|
// make the bean
|
||||||
|
ClassLoader cld = null; |
||||||
|
// First try the "application's" class loader.
|
||||||
|
cld = SecuritySupport.getContextClassLoader(); |
||||||
|
if (cld == null) |
||||||
|
cld = this.getClass().getClassLoader(); |
||||||
|
bean = cmdinfo.getCommandObject(this, cld); |
||||||
|
} catch (IOException e) { |
||||||
|
} catch (ClassNotFoundException e) { } |
||||||
|
|
||||||
|
return bean; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the DataContentHandler for this DataHandler: <p> |
||||||
|
* |
||||||
|
* If a DataContentHandlerFactory is set, use it. |
||||||
|
* Otherwise look for an object to serve DCH in the |
||||||
|
* following order: <p> |
||||||
|
* |
||||||
|
* 1) if a factory is set, use it <p> |
||||||
|
* 2) if a CommandMap is set, use it <p> |
||||||
|
* 3) use the default CommandMap <p> |
||||||
|
* |
||||||
|
* In any case, wrap the real DataContentHandler with one of our own |
||||||
|
* to handle any missing cases, fill in defaults, and to ensure that |
||||||
|
* we always have a non-null DataContentHandler. |
||||||
|
* |
||||||
|
* @return the requested DataContentHandler |
||||||
|
*/ |
||||||
|
private synchronized DataContentHandler getDataContentHandler() { |
||||||
|
|
||||||
|
// make sure the factory didn't change
|
||||||
|
if (factory != oldFactory) { |
||||||
|
oldFactory = factory; |
||||||
|
factoryDCH = null; |
||||||
|
dataContentHandler = null; |
||||||
|
transferFlavors = emptyFlavors; |
||||||
|
} |
||||||
|
|
||||||
|
if (dataContentHandler != null) |
||||||
|
return dataContentHandler; |
||||||
|
|
||||||
|
String simpleMT = getBaseType(); |
||||||
|
|
||||||
|
if (factoryDCH == null && factory != null) |
||||||
|
factoryDCH = factory.createDataContentHandler(simpleMT); |
||||||
|
|
||||||
|
if (factoryDCH != null) |
||||||
|
dataContentHandler = factoryDCH; |
||||||
|
|
||||||
|
if (dataContentHandler == null) { |
||||||
|
if (dataSource != null) |
||||||
|
dataContentHandler = getCommandMap(). |
||||||
|
createDataContentHandler(simpleMT, dataSource); |
||||||
|
else |
||||||
|
dataContentHandler = getCommandMap(). |
||||||
|
createDataContentHandler(simpleMT); |
||||||
|
} |
||||||
|
|
||||||
|
// getDataContentHandler always uses these 'wrapper' handlers
|
||||||
|
// to make sure it returns SOMETHING meaningful...
|
||||||
|
if (dataSource != null) |
||||||
|
dataContentHandler = new DataSourceDataContentHandler( |
||||||
|
dataContentHandler, |
||||||
|
dataSource); |
||||||
|
else |
||||||
|
dataContentHandler = new ObjectDataContentHandler( |
||||||
|
dataContentHandler, |
||||||
|
object, |
||||||
|
objectMimeType); |
||||||
|
return dataContentHandler; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Use the MimeType class to extract the MIME type/subtype, |
||||||
|
* ignoring the parameters. The type is cached. |
||||||
|
*/ |
||||||
|
private synchronized String getBaseType() { |
||||||
|
if (shortType == null) { |
||||||
|
String ct = getContentType(); |
||||||
|
try { |
||||||
|
MimeType mt = new MimeType(ct); |
||||||
|
shortType = mt.getBaseType(); |
||||||
|
} catch (MimeTypeParseException e) { |
||||||
|
shortType = ct; |
||||||
|
} |
||||||
|
} |
||||||
|
return shortType; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets the DataContentHandlerFactory. The DataContentHandlerFactory |
||||||
|
* is called first to find DataContentHandlers. |
||||||
|
* The DataContentHandlerFactory can only be set once. |
||||||
|
* <p> |
||||||
|
* If the DataContentHandlerFactory has already been set, |
||||||
|
* this method throws an Error. |
||||||
|
* |
||||||
|
* @param newFactory the DataContentHandlerFactory |
||||||
|
* @exception Error if the factory has already been defined. |
||||||
|
* |
||||||
|
* @see javax.activation.DataContentHandlerFactory |
||||||
|
*/ |
||||||
|
public static synchronized void setDataContentHandlerFactory( |
||||||
|
DataContentHandlerFactory newFactory) { |
||||||
|
if (factory != null) |
||||||
|
throw new Error("DataContentHandlerFactory already defined"); |
||||||
|
|
||||||
|
SecurityManager security = System.getSecurityManager(); |
||||||
|
if (security != null) { |
||||||
|
try { |
||||||
|
// if it's ok with the SecurityManager, it's ok with me...
|
||||||
|
security.checkSetFactory(); |
||||||
|
} catch (SecurityException ex) { |
||||||
|
// otherwise, we also allow it if this code and the
|
||||||
|
// factory come from the same class loader (e.g.,
|
||||||
|
// the JAF classes were loaded with the applet classes).
|
||||||
|
if (DataHandler.class.getClassLoader() != |
||||||
|
newFactory.getClass().getClassLoader()) |
||||||
|
throw ex; |
||||||
|
} |
||||||
|
} |
||||||
|
factory = newFactory; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* The DataHanderDataSource class implements the |
||||||
|
* DataSource interface when the DataHandler is constructed |
||||||
|
* with an Object and a mimeType string. |
||||||
|
*/ |
||||||
|
class DataHandlerDataSource implements DataSource { |
||||||
|
DataHandler dataHandler = null; |
||||||
|
|
||||||
|
/** |
||||||
|
* The constructor. |
||||||
|
*/ |
||||||
|
public DataHandlerDataSource(DataHandler dh) { |
||||||
|
this.dataHandler = dh; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns an <code>InputStream</code> representing this object. |
||||||
|
* @return the <code>InputStream</code> |
||||||
|
*/ |
||||||
|
public InputStream getInputStream() throws IOException { |
||||||
|
return dataHandler.getInputStream(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the <code>OutputStream</code> for this object. |
||||||
|
* @return the <code>OutputStream</code> |
||||||
|
*/ |
||||||
|
public OutputStream getOutputStream() throws IOException { |
||||||
|
return dataHandler.getOutputStream(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the MIME type of the data represented by this object. |
||||||
|
* @return the MIME type |
||||||
|
*/ |
||||||
|
public String getContentType() { |
||||||
|
return dataHandler.getContentType(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the name of this object. |
||||||
|
* @return the name of this object |
||||||
|
*/ |
||||||
|
public String getName() { |
||||||
|
return dataHandler.getName(); // what else would it be?
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* DataSourceDataContentHandler |
||||||
|
* |
||||||
|
* This is a <i>private</i> DataContentHandler that wraps the real |
||||||
|
* DataContentHandler in the case where the DataHandler was instantiated |
||||||
|
* with a DataSource. |
||||||
|
*/ |
||||||
|
class DataSourceDataContentHandler implements DataContentHandler { |
||||||
|
private DataSource ds = null; |
||||||
|
private DataFlavor transferFlavors[] = null; |
||||||
|
private DataContentHandler dch = null; |
||||||
|
|
||||||
|
/** |
||||||
|
* The constructor. |
||||||
|
*/ |
||||||
|
public DataSourceDataContentHandler(DataContentHandler dch, DataSource ds) { |
||||||
|
this.ds = ds; |
||||||
|
this.dch = dch; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the DataFlavors for this <code>DataContentHandler</code>. |
||||||
|
* @return the DataFlavors |
||||||
|
*/ |
||||||
|
public DataFlavor[] getTransferDataFlavors() { |
||||||
|
|
||||||
|
if (transferFlavors == null) { |
||||||
|
if (dch != null) { // is there a dch?
|
||||||
|
transferFlavors = dch.getTransferDataFlavors(); |
||||||
|
} else { |
||||||
|
transferFlavors = new DataFlavor[1]; |
||||||
|
transferFlavors[0] = |
||||||
|
new ActivationDataFlavor(ds.getContentType(), |
||||||
|
ds.getContentType()); |
||||||
|
} |
||||||
|
} |
||||||
|
return transferFlavors; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the Transfer Data of type DataFlavor from InputStream. |
||||||
|
* @param df the DataFlavor |
||||||
|
* @param ds the DataSource |
||||||
|
* @return the constructed Object |
||||||
|
*/ |
||||||
|
public Object getTransferData(DataFlavor df, DataSource ds) throws |
||||||
|
UnsupportedFlavorException, IOException { |
||||||
|
|
||||||
|
if (dch != null) |
||||||
|
return dch.getTransferData(df, ds); |
||||||
|
else if (df.equals(getTransferDataFlavors()[0])) // only have one now
|
||||||
|
return ds.getInputStream(); |
||||||
|
else |
||||||
|
throw new UnsupportedFlavorException(df); |
||||||
|
} |
||||||
|
|
||||||
|
public Object getContent(DataSource ds) throws IOException { |
||||||
|
|
||||||
|
if (dch != null) |
||||||
|
return dch.getContent(ds); |
||||||
|
else |
||||||
|
return ds.getInputStream(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Write the object to the output stream. |
||||||
|
*/ |
||||||
|
public void writeTo(Object obj, String mimeType, OutputStream os) |
||||||
|
throws IOException { |
||||||
|
if (dch != null) |
||||||
|
dch.writeTo(obj, mimeType, os); |
||||||
|
else |
||||||
|
throw new UnsupportedDataTypeException( |
||||||
|
"no DCH for content type " + ds.getContentType()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* ObjectDataContentHandler |
||||||
|
* |
||||||
|
* This is a <i>private</i> DataContentHandler that wraps the real |
||||||
|
* DataContentHandler in the case where the DataHandler was instantiated |
||||||
|
* with an object. |
||||||
|
*/ |
||||||
|
class ObjectDataContentHandler implements DataContentHandler { |
||||||
|
private DataFlavor transferFlavors[] = null; |
||||||
|
private Object obj; |
||||||
|
private String mimeType; |
||||||
|
private DataContentHandler dch = null; |
||||||
|
|
||||||
|
/** |
||||||
|
* The constructor. |
||||||
|
*/ |
||||||
|
public ObjectDataContentHandler(DataContentHandler dch, |
||||||
|
Object obj, String mimeType) { |
||||||
|
this.obj = obj; |
||||||
|
this.mimeType = mimeType; |
||||||
|
this.dch = dch; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the DataContentHandler for this object. |
||||||
|
* Used only by the DataHandler class. |
||||||
|
*/ |
||||||
|
public DataContentHandler getDCH() { |
||||||
|
return dch; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the DataFlavors for this <code>DataContentHandler</code>. |
||||||
|
* @return the DataFlavors |
||||||
|
*/ |
||||||
|
public synchronized DataFlavor[] getTransferDataFlavors() { |
||||||
|
if (transferFlavors == null) { |
||||||
|
if (dch != null) { |
||||||
|
transferFlavors = dch.getTransferDataFlavors(); |
||||||
|
} else { |
||||||
|
transferFlavors = new DataFlavor[1]; |
||||||
|
transferFlavors[0] = new ActivationDataFlavor(obj.getClass(), |
||||||
|
mimeType, mimeType); |
||||||
|
} |
||||||
|
} |
||||||
|
return transferFlavors; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the Transfer Data of type DataFlavor from InputStream. |
||||||
|
* @param df the DataFlavor |
||||||
|
* @param ds the DataSource |
||||||
|
* @return the constructed Object |
||||||
|
*/ |
||||||
|
public Object getTransferData(DataFlavor df, DataSource ds) |
||||||
|
throws UnsupportedFlavorException, IOException { |
||||||
|
|
||||||
|
if (dch != null) |
||||||
|
return dch.getTransferData(df, ds); |
||||||
|
else if (df.equals(getTransferDataFlavors()[0])) // only have one now
|
||||||
|
return obj; |
||||||
|
else |
||||||
|
throw new UnsupportedFlavorException(df); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public Object getContent(DataSource ds) { |
||||||
|
return obj; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Write the object to the output stream. |
||||||
|
*/ |
||||||
|
public void writeTo(Object obj, String mimeType, OutputStream os) |
||||||
|
throws IOException { |
||||||
|
if (dch != null) |
||||||
|
dch.writeTo(obj, mimeType, os); |
||||||
|
else if (obj instanceof byte[]) |
||||||
|
os.write((byte[])obj); |
||||||
|
else if (obj instanceof String) { |
||||||
|
OutputStreamWriter osw = new OutputStreamWriter(os); |
||||||
|
osw.write((String)obj); |
||||||
|
osw.flush(); |
||||||
|
} else |
||||||
|
throw new UnsupportedDataTypeException( |
||||||
|
"no object DCH for MIME type " + this.mimeType); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,101 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.activation; |
||||||
|
|
||||||
|
import java.io.InputStream; |
||||||
|
import java.io.OutputStream; |
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
/** |
||||||
|
* The DataSource interface provides the JavaBeans Activation Framework |
||||||
|
* with an abstraction of an arbitrary collection of data. It |
||||||
|
* provides a type for that data as well as access |
||||||
|
* to it in the form of <code>InputStreams</code> and |
||||||
|
* <code>OutputStreams</code> where appropriate. |
||||||
|
*/ |
||||||
|
|
||||||
|
public interface DataSource { |
||||||
|
|
||||||
|
/** |
||||||
|
* This method returns an <code>InputStream</code> representing |
||||||
|
* the data and throws the appropriate exception if it can |
||||||
|
* not do so. Note that a new <code>InputStream</code> object must be |
||||||
|
* returned each time this method is called, and the stream must be |
||||||
|
* positioned at the beginning of the data. |
||||||
|
* |
||||||
|
* @return an InputStream |
||||||
|
* @exception IOException for failures creating the InputStream |
||||||
|
*/ |
||||||
|
public InputStream getInputStream() throws IOException; |
||||||
|
|
||||||
|
/** |
||||||
|
* This method returns an <code>OutputStream</code> where the |
||||||
|
* data can be written and throws the appropriate exception if it can |
||||||
|
* not do so. Note that a new <code>OutputStream</code> object must |
||||||
|
* be returned each time this method is called, and the stream must |
||||||
|
* be positioned at the location the data is to be written. |
||||||
|
* |
||||||
|
* @return an OutputStream |
||||||
|
* @exception IOException for failures creating the OutputStream |
||||||
|
*/ |
||||||
|
public OutputStream getOutputStream() throws IOException; |
||||||
|
|
||||||
|
/** |
||||||
|
* This method returns the MIME type of the data in the form of a |
||||||
|
* string. It should always return a valid type. It is suggested |
||||||
|
* that getContentType return "application/octet-stream" if the |
||||||
|
* DataSource implementation can not determine the data type. |
||||||
|
* |
||||||
|
* @return the MIME Type |
||||||
|
*/ |
||||||
|
public String getContentType(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the <i>name</i> of this object where the name of the object |
||||||
|
* is dependant on the nature of the underlying objects. DataSources |
||||||
|
* encapsulating files may choose to return the filename of the object. |
||||||
|
* (Typically this would be the last component of the filename, not an |
||||||
|
* entire pathname.) |
||||||
|
* |
||||||
|
* @return the name of the object. |
||||||
|
*/ |
||||||
|
public String getName(); |
||||||
|
} |
@ -0,0 +1,171 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.activation; |
||||||
|
|
||||||
|
import java.io.InputStream; |
||||||
|
import java.io.OutputStream; |
||||||
|
import java.io.File; |
||||||
|
import java.io.FileDescriptor; |
||||||
|
import java.io.FileNotFoundException; |
||||||
|
import java.io.FileInputStream; |
||||||
|
import java.io.FileOutputStream; |
||||||
|
import java.io.IOException; |
||||||
|
import com.sun.activation.registries.MimeTypeFile; |
||||||
|
|
||||||
|
/** |
||||||
|
* The FileDataSource class implements a simple DataSource object |
||||||
|
* that encapsulates a file. It provides data typing services via |
||||||
|
* a FileTypeMap object. <p> |
||||||
|
* |
||||||
|
* <b>FileDataSource Typing Semantics</b><p> |
||||||
|
* |
||||||
|
* The FileDataSource class delegates data typing of files |
||||||
|
* to an object subclassed from the FileTypeMap class. |
||||||
|
* The <code>setFileTypeMap</code> method can be used to explicitly |
||||||
|
* set the FileTypeMap for an instance of FileDataSource. If no |
||||||
|
* FileTypeMap is set, the FileDataSource will call the FileTypeMap's |
||||||
|
* getDefaultFileTypeMap method to get the System's default FileTypeMap. |
||||||
|
* |
||||||
|
* @see javax.activation.DataSource |
||||||
|
* @see javax.activation.FileTypeMap |
||||||
|
* @see javax.activation.MimetypesFileTypeMap |
||||||
|
*/ |
||||||
|
public class FileDataSource implements DataSource { |
||||||
|
|
||||||
|
// keep track of original 'ref' passed in, non-null
|
||||||
|
// one indicated which was passed in:
|
||||||
|
private File _file = null; |
||||||
|
private FileTypeMap typeMap = null; |
||||||
|
|
||||||
|
/** |
||||||
|
* Creates a FileDataSource from a File object. <i>Note: |
||||||
|
* The file will not actually be opened until a method is |
||||||
|
* called that requires the file to be opened.</i> |
||||||
|
* |
||||||
|
* @param file the file |
||||||
|
*/ |
||||||
|
public FileDataSource(File file) { |
||||||
|
_file = file; // save the file Object...
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Creates a FileDataSource from |
||||||
|
* the specified path name. <i>Note: |
||||||
|
* The file will not actually be opened until a method is |
||||||
|
* called that requires the file to be opened.</i> |
||||||
|
* |
||||||
|
* @param name the system-dependent file name. |
||||||
|
*/ |
||||||
|
public FileDataSource(String name) { |
||||||
|
this(new File(name)); // use the file constructor
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* This method will return an InputStream representing the |
||||||
|
* the data and will throw an IOException if it can |
||||||
|
* not do so. This method will return a new |
||||||
|
* instance of InputStream with each invocation. |
||||||
|
* |
||||||
|
* @return an InputStream |
||||||
|
*/ |
||||||
|
public InputStream getInputStream() throws IOException { |
||||||
|
return new FileInputStream(_file); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* This method will return an OutputStream representing the |
||||||
|
* the data and will throw an IOException if it can |
||||||
|
* not do so. This method will return a new instance of |
||||||
|
* OutputStream with each invocation. |
||||||
|
* |
||||||
|
* @return an OutputStream |
||||||
|
*/ |
||||||
|
public OutputStream getOutputStream() throws IOException { |
||||||
|
return new FileOutputStream(_file); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* This method returns the MIME type of the data in the form of a |
||||||
|
* string. This method uses the currently installed FileTypeMap. If |
||||||
|
* there is no FileTypeMap explictly set, the FileDataSource will |
||||||
|
* call the <code>getDefaultFileTypeMap</code> method on |
||||||
|
* FileTypeMap to acquire a default FileTypeMap. <i>Note: By |
||||||
|
* default, the FileTypeMap used will be a MimetypesFileTypeMap.</i> |
||||||
|
* |
||||||
|
* @return the MIME Type |
||||||
|
* @see javax.activation.FileTypeMap#getDefaultFileTypeMap |
||||||
|
*/ |
||||||
|
public String getContentType() { |
||||||
|
// check to see if the type map is null?
|
||||||
|
if (typeMap == null) |
||||||
|
return FileTypeMap.getDefaultFileTypeMap().getContentType(_file); |
||||||
|
else |
||||||
|
return typeMap.getContentType(_file); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the <i>name</i> of this object. The FileDataSource |
||||||
|
* will return the file name of the object. |
||||||
|
* |
||||||
|
* @return the name of the object. |
||||||
|
* @see javax.activation.DataSource |
||||||
|
*/ |
||||||
|
public String getName() { |
||||||
|
return _file.getName(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the File object that corresponds to this FileDataSource. |
||||||
|
* @return the File object for the file represented by this object. |
||||||
|
*/ |
||||||
|
public File getFile() { |
||||||
|
return _file; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set the FileTypeMap to use with this FileDataSource |
||||||
|
* |
||||||
|
* @param map The FileTypeMap for this object. |
||||||
|
*/ |
||||||
|
public void setFileTypeMap(FileTypeMap map) { |
||||||
|
typeMap = map; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,145 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.activation; |
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.WeakHashMap; |
||||||
|
|
||||||
|
/** |
||||||
|
* The FileTypeMap is an abstract class that provides a data typing |
||||||
|
* interface for files. Implementations of this class will |
||||||
|
* implement the getContentType methods which will derive a content |
||||||
|
* type from a file name or a File object. FileTypeMaps could use any |
||||||
|
* scheme to determine the data type, from examining the file extension |
||||||
|
* of a file (like the MimetypesFileTypeMap) to opening the file and |
||||||
|
* trying to derive its type from the contents of the file. The |
||||||
|
* FileDataSource class uses the default FileTypeMap (a MimetypesFileTypeMap |
||||||
|
* unless changed) to determine the content type of files. |
||||||
|
* |
||||||
|
* @see javax.activation.FileTypeMap |
||||||
|
* @see javax.activation.FileDataSource |
||||||
|
* @see javax.activation.MimetypesFileTypeMap |
||||||
|
*/ |
||||||
|
|
||||||
|
public abstract class FileTypeMap { |
||||||
|
|
||||||
|
private static FileTypeMap defaultMap = null; |
||||||
|
private static Map<ClassLoader,FileTypeMap> map = |
||||||
|
new WeakHashMap<ClassLoader,FileTypeMap>(); |
||||||
|
|
||||||
|
/** |
||||||
|
* The default constructor. |
||||||
|
*/ |
||||||
|
public FileTypeMap() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the type of the file object. This method should |
||||||
|
* always return a valid MIME type. |
||||||
|
* |
||||||
|
* @param file A file to be typed. |
||||||
|
* @return The content type. |
||||||
|
*/ |
||||||
|
abstract public String getContentType(File file); |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the type of the file passed in. This method should |
||||||
|
* always return a valid MIME type. |
||||||
|
* |
||||||
|
* @param filename the pathname of the file. |
||||||
|
* @return The content type. |
||||||
|
*/ |
||||||
|
abstract public String getContentType(String filename); |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets the default FileTypeMap for the system. This instance |
||||||
|
* will be returned to callers of getDefaultFileTypeMap. |
||||||
|
* |
||||||
|
* @param fileTypeMap The FileTypeMap. |
||||||
|
* @exception SecurityException if the caller doesn't have permission |
||||||
|
* to change the default |
||||||
|
*/ |
||||||
|
public static synchronized void setDefaultFileTypeMap(FileTypeMap fileTypeMap) { |
||||||
|
SecurityManager security = System.getSecurityManager(); |
||||||
|
if (security != null) { |
||||||
|
try { |
||||||
|
// if it's ok with the SecurityManager, it's ok with me...
|
||||||
|
security.checkSetFactory(); |
||||||
|
} catch (SecurityException ex) { |
||||||
|
// otherwise, we also allow it if this code and the
|
||||||
|
// factory come from the same (non-system) class loader (e.g.,
|
||||||
|
// the JAF classes were loaded with the applet classes).
|
||||||
|
ClassLoader cl = FileTypeMap.class.getClassLoader(); |
||||||
|
if (cl == null || cl.getParent() == null || |
||||||
|
cl != fileTypeMap.getClass().getClassLoader()) |
||||||
|
throw ex; |
||||||
|
} |
||||||
|
} |
||||||
|
// remove any per-thread-context-class-loader FileTypeMap
|
||||||
|
map.remove(SecuritySupport.getContextClassLoader()); |
||||||
|
defaultMap = fileTypeMap; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the default FileTypeMap for the system. |
||||||
|
* If setDefaultFileTypeMap was called, return |
||||||
|
* that instance, otherwise return an instance of |
||||||
|
* <code>MimetypesFileTypeMap</code>. |
||||||
|
* |
||||||
|
* @return The default FileTypeMap |
||||||
|
* @see javax.activation.FileTypeMap#setDefaultFileTypeMap |
||||||
|
*/ |
||||||
|
public static synchronized FileTypeMap getDefaultFileTypeMap() { |
||||||
|
if (defaultMap != null) |
||||||
|
return defaultMap; |
||||||
|
|
||||||
|
// fetch per-thread-context-class-loader default
|
||||||
|
ClassLoader tccl = SecuritySupport.getContextClassLoader(); |
||||||
|
FileTypeMap def = map.get(tccl); |
||||||
|
if (def == null) { |
||||||
|
def = new MimetypesFileTypeMap(); |
||||||
|
map.put(tccl, def); |
||||||
|
} |
||||||
|
return def; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,737 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.activation; |
||||||
|
|
||||||
|
import java.util.*; |
||||||
|
import java.io.*; |
||||||
|
import java.net.*; |
||||||
|
import java.security.AccessController; |
||||||
|
import java.security.PrivilegedAction; |
||||||
|
import com.sun.activation.registries.MailcapFile; |
||||||
|
import com.sun.activation.registries.LogSupport; |
||||||
|
|
||||||
|
/** |
||||||
|
* MailcapCommandMap extends the CommandMap |
||||||
|
* abstract class. It implements a CommandMap whose configuration |
||||||
|
* is based on mailcap files |
||||||
|
* (<A HREF="http://www.ietf.org/rfc/rfc1524.txt">RFC 1524</A>). |
||||||
|
* The MailcapCommandMap can be configured both programmatically |
||||||
|
* and via configuration files. |
||||||
|
* <p> |
||||||
|
* <b>Mailcap file search order:</b><p> |
||||||
|
* The MailcapCommandMap looks in various places in the user's |
||||||
|
* system for mailcap file entries. When requests are made |
||||||
|
* to search for commands in the MailcapCommandMap, it searches |
||||||
|
* mailcap files in the following order: |
||||||
|
* <ol> |
||||||
|
* <li> Programatically added entries to the MailcapCommandMap instance. |
||||||
|
* <li> The file <code>.mailcap</code> in the user's home directory. |
||||||
|
* <li> The file <code>mailcap</code> in the Java runtime. |
||||||
|
* <li> The file or resources named <code>META-INF/mailcap</code>. |
||||||
|
* <li> The file or resource named <code>META-INF/mailcap.default</code> |
||||||
|
* (usually found only in the <code>activation.jar</code> file). |
||||||
|
* </ol> |
||||||
|
* <p> |
||||||
|
* (The current implementation looks for the <code>mailcap</code> file |
||||||
|
* in the Java runtime in the directory <code><i>java.home</i>/conf</code> |
||||||
|
* if it exists, and otherwise in the directory |
||||||
|
* <code><i>java.home</i>/lib</code>, where <i>java.home</i> is the value |
||||||
|
* of the "java.home" System property. Note that the "conf" directory was |
||||||
|
* introduced in JDK 9.) |
||||||
|
* <p> |
||||||
|
* <b>Mailcap file format:</b><p> |
||||||
|
* |
||||||
|
* Mailcap files must conform to the mailcap |
||||||
|
* file specification (RFC 1524, <i>A User Agent Configuration Mechanism |
||||||
|
* For Multimedia Mail Format Information</i>). |
||||||
|
* The file format consists of entries corresponding to |
||||||
|
* particular MIME types. In general, the specification |
||||||
|
* specifies <i>applications</i> for clients to use when they |
||||||
|
* themselves cannot operate on the specified MIME type. The |
||||||
|
* MailcapCommandMap extends this specification by using a parameter mechanism |
||||||
|
* in mailcap files that allows JavaBeans(tm) components to be specified as |
||||||
|
* corresponding to particular commands for a MIME type.<p> |
||||||
|
* |
||||||
|
* When a mailcap file is |
||||||
|
* parsed, the MailcapCommandMap recognizes certain parameter signatures, |
||||||
|
* specifically those parameter names that begin with <code>x-java-</code>. |
||||||
|
* The MailcapCommandMap uses this signature to find |
||||||
|
* command entries for inclusion into its registries. |
||||||
|
* Parameter names with the form <code>x-java-<name></code> |
||||||
|
* are read by the MailcapCommandMap as identifying a command |
||||||
|
* with the name <i>name</i>. When the <i>name</i> is <code> |
||||||
|
* content-handler</code> the MailcapCommandMap recognizes the class
|
||||||
|
* signified by this parameter as a <i>DataContentHandler</i>. |
||||||
|
* All other commands are handled generically regardless of command |
||||||
|
* name. The command implementation is specified by a fully qualified |
||||||
|
* class name of a JavaBean(tm) component. For example; a command for viewing |
||||||
|
* some data can be specified as: <code>x-java-view=com.foo.ViewBean</code>.<p> |
||||||
|
* |
||||||
|
* When the command name is <code>fallback-entry</code>, the value of |
||||||
|
* the command may be <code>true</code> or <code>false</code>. An |
||||||
|
* entry for a MIME type that includes a parameter of |
||||||
|
* <code>x-java-fallback-entry=true</code> defines fallback commands |
||||||
|
* for that MIME type that will only be used if no non-fallback entry |
||||||
|
* can be found. For example, an entry of the form <code>text/*; ; |
||||||
|
* x-java-fallback-entry=true; x-java-view=com.sun.TextViewer</code> |
||||||
|
* specifies a view command to be used for any text MIME type. This |
||||||
|
* view command would only be used if a non-fallback view command for |
||||||
|
* the MIME type could not be found.<p> |
||||||
|
* |
||||||
|
* MailcapCommandMap aware mailcap files have the |
||||||
|
* following general form:<p> |
||||||
|
* <code> |
||||||
|
* # Comments begin with a '#' and continue to the end of the line.<br> |
||||||
|
* <mime type>; ; <parameter list><br> |
||||||
|
* # Where a parameter list consists of one or more parameters,<br> |
||||||
|
* # where parameters look like: x-java-view=com.sun.TextViewer<br> |
||||||
|
* # and a parameter list looks like: <br> |
||||||
|
* text/plain; ; x-java-view=com.sun.TextViewer; x-java-edit=com.sun.TextEdit |
||||||
|
* <br> |
||||||
|
* # Note that mailcap entries that do not contain 'x-java' parameters<br> |
||||||
|
* # and comply to RFC 1524 are simply ignored:<br> |
||||||
|
* image/gif; /usr/dt/bin/sdtimage %s<br> |
||||||
|
* |
||||||
|
* </code> |
||||||
|
* <p> |
||||||
|
* |
||||||
|
* @author Bart Calder |
||||||
|
* @author Bill Shannon |
||||||
|
*/ |
||||||
|
|
||||||
|
public class MailcapCommandMap extends CommandMap { |
||||||
|
/* |
||||||
|
* We manage a collection of databases, searched in order. |
||||||
|
*/ |
||||||
|
private MailcapFile[] DB; |
||||||
|
private static final int PROG = 0; // programmatically added entries
|
||||||
|
|
||||||
|
private static final String confDir; |
||||||
|
|
||||||
|
static { |
||||||
|
String dir = null; |
||||||
|
try { |
||||||
|
dir = (String)AccessController.doPrivileged( |
||||||
|
new PrivilegedAction() { |
||||||
|
public Object run() { |
||||||
|
String home = System.getProperty("java.home"); |
||||||
|
String newdir = home + File.separator + "conf"; |
||||||
|
File conf = new File(newdir); |
||||||
|
if (conf.exists()) |
||||||
|
return newdir + File.separator; |
||||||
|
else |
||||||
|
return home + File.separator + "lib" + File.separator; |
||||||
|
} |
||||||
|
}); |
||||||
|
} catch (Exception ex) { |
||||||
|
// ignore any exceptions
|
||||||
|
} |
||||||
|
confDir = dir; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* The default Constructor. |
||||||
|
*/ |
||||||
|
public MailcapCommandMap() { |
||||||
|
super(); |
||||||
|
List dbv = new ArrayList(5); // usually 5 or less databases
|
||||||
|
MailcapFile mf = null; |
||||||
|
dbv.add(null); // place holder for PROG entry
|
||||||
|
|
||||||
|
LogSupport.log("MailcapCommandMap: load HOME"); |
||||||
|
try { |
||||||
|
String user_home = System.getProperty("user.home"); |
||||||
|
|
||||||
|
if (user_home != null) { |
||||||
|
String path = user_home + File.separator + ".mailcap"; |
||||||
|
mf = loadFile(path); |
||||||
|
if (mf != null) |
||||||
|
dbv.add(mf); |
||||||
|
} |
||||||
|
} catch (SecurityException ex) {} |
||||||
|
|
||||||
|
LogSupport.log("MailcapCommandMap: load SYS"); |
||||||
|
try { |
||||||
|
// check system's home
|
||||||
|
if (confDir != null) { |
||||||
|
mf = loadFile(confDir + "mailcap"); |
||||||
|
if (mf != null) |
||||||
|
dbv.add(mf); |
||||||
|
} |
||||||
|
} catch (SecurityException ex) {} |
||||||
|
|
||||||
|
LogSupport.log("MailcapCommandMap: load JAR"); |
||||||
|
// load from the app's jar file
|
||||||
|
loadAllResources(dbv, "META-INF/mailcap"); |
||||||
|
|
||||||
|
LogSupport.log("MailcapCommandMap: load DEF"); |
||||||
|
mf = loadResource("/META-INF/mailcap.default"); |
||||||
|
|
||||||
|
if (mf != null) |
||||||
|
dbv.add(mf); |
||||||
|
|
||||||
|
DB = new MailcapFile[dbv.size()]; |
||||||
|
DB = (MailcapFile[])dbv.toArray(DB); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Load from the named resource. |
||||||
|
*/ |
||||||
|
private MailcapFile loadResource(String name) { |
||||||
|
InputStream clis = null; |
||||||
|
try { |
||||||
|
clis = SecuritySupport.getResourceAsStream(this.getClass(), name); |
||||||
|
if (clis != null) { |
||||||
|
MailcapFile mf = new MailcapFile(clis); |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("MailcapCommandMap: successfully loaded " + |
||||||
|
"mailcap file: " + name); |
||||||
|
return mf; |
||||||
|
} else { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("MailcapCommandMap: not loading " + |
||||||
|
"mailcap file: " + name); |
||||||
|
} |
||||||
|
} catch (IOException e) { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("MailcapCommandMap: can't load " + name, e); |
||||||
|
} catch (SecurityException sex) { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("MailcapCommandMap: can't load " + name, sex); |
||||||
|
} finally { |
||||||
|
try { |
||||||
|
if (clis != null) |
||||||
|
clis.close(); |
||||||
|
} catch (IOException ex) { } // ignore it
|
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Load all of the named resource. |
||||||
|
*/ |
||||||
|
private void loadAllResources(List v, String name) { |
||||||
|
boolean anyLoaded = false; |
||||||
|
try { |
||||||
|
URL[] urls; |
||||||
|
ClassLoader cld = null; |
||||||
|
// First try the "application's" class loader.
|
||||||
|
cld = SecuritySupport.getContextClassLoader(); |
||||||
|
if (cld == null) |
||||||
|
cld = this.getClass().getClassLoader(); |
||||||
|
if (cld != null) |
||||||
|
urls = SecuritySupport.getResources(cld, name); |
||||||
|
else |
||||||
|
urls = SecuritySupport.getSystemResources(name); |
||||||
|
if (urls != null) { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("MailcapCommandMap: getResources"); |
||||||
|
for (int i = 0; i < urls.length; i++) { |
||||||
|
URL url = urls[i]; |
||||||
|
InputStream clis = null; |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("MailcapCommandMap: URL " + url); |
||||||
|
try { |
||||||
|
clis = SecuritySupport.openStream(url); |
||||||
|
if (clis != null) { |
||||||
|
v.add(new MailcapFile(clis)); |
||||||
|
anyLoaded = true; |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("MailcapCommandMap: " + |
||||||
|
"successfully loaded " + |
||||||
|
"mailcap file from URL: " + |
||||||
|
url); |
||||||
|
} else { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("MailcapCommandMap: " + |
||||||
|
"not loading mailcap " + |
||||||
|
"file from URL: " + url); |
||||||
|
} |
||||||
|
} catch (IOException ioex) { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("MailcapCommandMap: can't load " + |
||||||
|
url, ioex); |
||||||
|
} catch (SecurityException sex) { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("MailcapCommandMap: can't load " + |
||||||
|
url, sex); |
||||||
|
} finally { |
||||||
|
try { |
||||||
|
if (clis != null) |
||||||
|
clis.close(); |
||||||
|
} catch (IOException cex) { } |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} catch (Exception ex) { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("MailcapCommandMap: can't load " + name, ex); |
||||||
|
} |
||||||
|
|
||||||
|
// if failed to load anything, fall back to old technique, just in case
|
||||||
|
if (!anyLoaded) { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("MailcapCommandMap: !anyLoaded"); |
||||||
|
MailcapFile mf = loadResource("/" + name); |
||||||
|
if (mf != null) |
||||||
|
v.add(mf); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Load from the named file. |
||||||
|
*/ |
||||||
|
private MailcapFile loadFile(String name) { |
||||||
|
MailcapFile mtf = null; |
||||||
|
|
||||||
|
try { |
||||||
|
mtf = new MailcapFile(name); |
||||||
|
} catch (IOException e) { |
||||||
|
// e.printStackTrace();
|
||||||
|
} |
||||||
|
return mtf; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Constructor that allows the caller to specify the path |
||||||
|
* of a <i>mailcap</i> file. |
||||||
|
* |
||||||
|
* @param fileName The name of the <i>mailcap</i> file to open |
||||||
|
* @exception IOException if the file can't be accessed |
||||||
|
*/ |
||||||
|
public MailcapCommandMap(String fileName) throws IOException { |
||||||
|
this(); |
||||||
|
|
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("MailcapCommandMap: load PROG from " + fileName); |
||||||
|
if (DB[PROG] == null) { |
||||||
|
DB[PROG] = new MailcapFile(fileName); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Constructor that allows the caller to specify an <i>InputStream</i> |
||||||
|
* containing a mailcap file. |
||||||
|
* |
||||||
|
* @param is InputStream of the <i>mailcap</i> file to open |
||||||
|
*/ |
||||||
|
public MailcapCommandMap(InputStream is) { |
||||||
|
this(); |
||||||
|
|
||||||
|
LogSupport.log("MailcapCommandMap: load PROG"); |
||||||
|
if (DB[PROG] == null) { |
||||||
|
try { |
||||||
|
DB[PROG] = new MailcapFile(is); |
||||||
|
} catch (IOException ex) { |
||||||
|
// XXX - should throw it
|
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the preferred command list for a MIME Type. The MailcapCommandMap |
||||||
|
* searches the mailcap files as described above under |
||||||
|
* <i>Mailcap file search order</i>.<p> |
||||||
|
* |
||||||
|
* The result of the search is a proper subset of available |
||||||
|
* commands in all mailcap files known to this instance of |
||||||
|
* MailcapCommandMap. The first entry for a particular command |
||||||
|
* is considered the preferred command. |
||||||
|
* |
||||||
|
* @param mimeType the MIME type |
||||||
|
* @return the CommandInfo objects representing the preferred commands. |
||||||
|
*/ |
||||||
|
public synchronized CommandInfo[] getPreferredCommands(String mimeType) { |
||||||
|
List cmdList = new ArrayList(); |
||||||
|
if (mimeType != null) |
||||||
|
mimeType = mimeType.toLowerCase(Locale.ENGLISH); |
||||||
|
|
||||||
|
for (int i = 0; i < DB.length; i++) { |
||||||
|
if (DB[i] == null) |
||||||
|
continue; |
||||||
|
Map cmdMap = DB[i].getMailcapList(mimeType); |
||||||
|
if (cmdMap != null) |
||||||
|
appendPrefCmdsToList(cmdMap, cmdList); |
||||||
|
} |
||||||
|
|
||||||
|
// now add the fallback commands
|
||||||
|
for (int i = 0; i < DB.length; i++) { |
||||||
|
if (DB[i] == null) |
||||||
|
continue; |
||||||
|
Map cmdMap = DB[i].getMailcapFallbackList(mimeType); |
||||||
|
if (cmdMap != null) |
||||||
|
appendPrefCmdsToList(cmdMap, cmdList); |
||||||
|
} |
||||||
|
|
||||||
|
CommandInfo[] cmdInfos = new CommandInfo[cmdList.size()]; |
||||||
|
cmdInfos = (CommandInfo[])cmdList.toArray(cmdInfos); |
||||||
|
|
||||||
|
return cmdInfos; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Put the commands that are in the hash table, into the list. |
||||||
|
*/ |
||||||
|
private void appendPrefCmdsToList(Map cmdHash, List cmdList) { |
||||||
|
Iterator verb_enum = cmdHash.keySet().iterator(); |
||||||
|
|
||||||
|
while (verb_enum.hasNext()) { |
||||||
|
String verb = (String)verb_enum.next(); |
||||||
|
if (!checkForVerb(cmdList, verb)) { |
||||||
|
List cmdList2 = (List)cmdHash.get(verb); // get the list
|
||||||
|
String className = (String)cmdList2.get(0); |
||||||
|
cmdList.add(new CommandInfo(verb, className)); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Check the cmdList to see if this command exists, return |
||||||
|
* true if the verb is there. |
||||||
|
*/ |
||||||
|
private boolean checkForVerb(List cmdList, String verb) { |
||||||
|
Iterator ee = cmdList.iterator(); |
||||||
|
while (ee.hasNext()) { |
||||||
|
String enum_verb = |
||||||
|
(String)((CommandInfo)ee.next()).getCommandName(); |
||||||
|
if (enum_verb.equals(verb)) |
||||||
|
return true; |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get all the available commands in all mailcap files known to |
||||||
|
* this instance of MailcapCommandMap for this MIME type. |
||||||
|
* |
||||||
|
* @param mimeType the MIME type |
||||||
|
* @return the CommandInfo objects representing all the commands. |
||||||
|
*/ |
||||||
|
public synchronized CommandInfo[] getAllCommands(String mimeType) { |
||||||
|
List cmdList = new ArrayList(); |
||||||
|
if (mimeType != null) |
||||||
|
mimeType = mimeType.toLowerCase(Locale.ENGLISH); |
||||||
|
|
||||||
|
for (int i = 0; i < DB.length; i++) { |
||||||
|
if (DB[i] == null) |
||||||
|
continue; |
||||||
|
Map cmdMap = DB[i].getMailcapList(mimeType); |
||||||
|
if (cmdMap != null) |
||||||
|
appendCmdsToList(cmdMap, cmdList); |
||||||
|
} |
||||||
|
|
||||||
|
// now add the fallback commands
|
||||||
|
for (int i = 0; i < DB.length; i++) { |
||||||
|
if (DB[i] == null) |
||||||
|
continue; |
||||||
|
Map cmdMap = DB[i].getMailcapFallbackList(mimeType); |
||||||
|
if (cmdMap != null) |
||||||
|
appendCmdsToList(cmdMap, cmdList); |
||||||
|
} |
||||||
|
|
||||||
|
CommandInfo[] cmdInfos = new CommandInfo[cmdList.size()]; |
||||||
|
cmdInfos = (CommandInfo[])cmdList.toArray(cmdInfos); |
||||||
|
|
||||||
|
return cmdInfos; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Put the commands that are in the hash table, into the list. |
||||||
|
*/ |
||||||
|
private void appendCmdsToList(Map typeHash, List cmdList) { |
||||||
|
Iterator verb_enum = typeHash.keySet().iterator(); |
||||||
|
|
||||||
|
while (verb_enum.hasNext()) { |
||||||
|
String verb = (String)verb_enum.next(); |
||||||
|
List cmdList2 = (List)typeHash.get(verb); |
||||||
|
Iterator cmd_enum = ((List)cmdList2).iterator(); |
||||||
|
|
||||||
|
while (cmd_enum.hasNext()) { |
||||||
|
String cmd = (String)cmd_enum.next(); |
||||||
|
cmdList.add(new CommandInfo(verb, cmd)); |
||||||
|
// cmdList.add(0, new CommandInfo(verb, cmd));
|
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the command corresponding to <code>cmdName</code> for the MIME type. |
||||||
|
* |
||||||
|
* @param mimeType the MIME type |
||||||
|
* @param cmdName the command name |
||||||
|
* @return the CommandInfo object corresponding to the command. |
||||||
|
*/ |
||||||
|
public synchronized CommandInfo getCommand(String mimeType, |
||||||
|
String cmdName) { |
||||||
|
if (mimeType != null) |
||||||
|
mimeType = mimeType.toLowerCase(Locale.ENGLISH); |
||||||
|
|
||||||
|
for (int i = 0; i < DB.length; i++) { |
||||||
|
if (DB[i] == null) |
||||||
|
continue; |
||||||
|
Map cmdMap = DB[i].getMailcapList(mimeType); |
||||||
|
if (cmdMap != null) { |
||||||
|
// get the cmd list for the cmd
|
||||||
|
List v = (List)cmdMap.get(cmdName); |
||||||
|
if (v != null) { |
||||||
|
String cmdClassName = (String)v.get(0); |
||||||
|
|
||||||
|
if (cmdClassName != null) |
||||||
|
return new CommandInfo(cmdName, cmdClassName); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// now try the fallback list
|
||||||
|
for (int i = 0; i < DB.length; i++) { |
||||||
|
if (DB[i] == null) |
||||||
|
continue; |
||||||
|
Map cmdMap = DB[i].getMailcapFallbackList(mimeType); |
||||||
|
if (cmdMap != null) { |
||||||
|
// get the cmd list for the cmd
|
||||||
|
List v = (List)cmdMap.get(cmdName); |
||||||
|
if (v != null) { |
||||||
|
String cmdClassName = (String)v.get(0); |
||||||
|
|
||||||
|
if (cmdClassName != null) |
||||||
|
return new CommandInfo(cmdName, cmdClassName); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Add entries to the registry. Programmatically |
||||||
|
* added entries are searched before other entries.<p> |
||||||
|
* |
||||||
|
* The string that is passed in should be in mailcap |
||||||
|
* format. |
||||||
|
* |
||||||
|
* @param mail_cap a correctly formatted mailcap string |
||||||
|
*/ |
||||||
|
public synchronized void addMailcap(String mail_cap) { |
||||||
|
// check to see if one exists
|
||||||
|
LogSupport.log("MailcapCommandMap: add to PROG"); |
||||||
|
if (DB[PROG] == null) |
||||||
|
DB[PROG] = new MailcapFile(); |
||||||
|
|
||||||
|
DB[PROG].appendToMailcap(mail_cap); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the DataContentHandler for the specified MIME type. |
||||||
|
* |
||||||
|
* @param mimeType the MIME type |
||||||
|
* @return the DataContentHandler |
||||||
|
*/ |
||||||
|
public synchronized DataContentHandler createDataContentHandler( |
||||||
|
String mimeType) { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log( |
||||||
|
"MailcapCommandMap: createDataContentHandler for " + mimeType); |
||||||
|
if (mimeType != null) |
||||||
|
mimeType = mimeType.toLowerCase(Locale.ENGLISH); |
||||||
|
|
||||||
|
for (int i = 0; i < DB.length; i++) { |
||||||
|
if (DB[i] == null) |
||||||
|
continue; |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log(" search DB #" + i); |
||||||
|
Map cmdMap = DB[i].getMailcapList(mimeType); |
||||||
|
if (cmdMap != null) { |
||||||
|
List v = (List)cmdMap.get("content-handler"); |
||||||
|
if (v != null) { |
||||||
|
String name = (String)v.get(0); |
||||||
|
DataContentHandler dch = getDataContentHandler(name); |
||||||
|
if (dch != null) |
||||||
|
return dch; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// now try the fallback entries
|
||||||
|
for (int i = 0; i < DB.length; i++) { |
||||||
|
if (DB[i] == null) |
||||||
|
continue; |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log(" search fallback DB #" + i); |
||||||
|
Map cmdMap = DB[i].getMailcapFallbackList(mimeType); |
||||||
|
if (cmdMap != null) { |
||||||
|
List v = (List)cmdMap.get("content-handler"); |
||||||
|
if (v != null) { |
||||||
|
String name = (String)v.get(0); |
||||||
|
DataContentHandler dch = getDataContentHandler(name); |
||||||
|
if (dch != null) |
||||||
|
return dch; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
private DataContentHandler getDataContentHandler(String name) { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log(" got content-handler"); |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log(" class " + name); |
||||||
|
try { |
||||||
|
ClassLoader cld = null; |
||||||
|
// First try the "application's" class loader.
|
||||||
|
cld = SecuritySupport.getContextClassLoader(); |
||||||
|
if (cld == null) |
||||||
|
cld = this.getClass().getClassLoader(); |
||||||
|
Class cl = null; |
||||||
|
try { |
||||||
|
cl = cld.loadClass(name); |
||||||
|
} catch (Exception ex) { |
||||||
|
// if anything goes wrong, do it the old way
|
||||||
|
cl = Class.forName(name); |
||||||
|
} |
||||||
|
if (cl != null) // XXX - always true?
|
||||||
|
return (DataContentHandler)cl.newInstance(); |
||||||
|
} catch (IllegalAccessException e) { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("Can't load DCH " + name, e); |
||||||
|
} catch (ClassNotFoundException e) { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("Can't load DCH " + name, e); |
||||||
|
} catch (InstantiationException e) { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("Can't load DCH " + name, e); |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get all the MIME types known to this command map. |
||||||
|
* |
||||||
|
* @return array of MIME types as strings |
||||||
|
* @since JAF 1.1 |
||||||
|
*/ |
||||||
|
public synchronized String[] getMimeTypes() { |
||||||
|
List mtList = new ArrayList(); |
||||||
|
|
||||||
|
for (int i = 0; i < DB.length; i++) { |
||||||
|
if (DB[i] == null) |
||||||
|
continue; |
||||||
|
String[] ts = DB[i].getMimeTypes(); |
||||||
|
if (ts != null) { |
||||||
|
for (int j = 0; j < ts.length; j++) { |
||||||
|
// eliminate duplicates
|
||||||
|
if (!mtList.contains(ts[j])) |
||||||
|
mtList.add(ts[j]); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
String[] mts = new String[mtList.size()]; |
||||||
|
mts = (String[])mtList.toArray(mts); |
||||||
|
|
||||||
|
return mts; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the native commands for the given MIME type. |
||||||
|
* Returns an array of strings where each string is |
||||||
|
* an entire mailcap file entry. The application |
||||||
|
* will need to parse the entry to extract the actual |
||||||
|
* command as well as any attributes it needs. See |
||||||
|
* <A HREF="http://www.ietf.org/rfc/rfc1524.txt">RFC 1524</A> |
||||||
|
* for details of the mailcap entry syntax. Only mailcap |
||||||
|
* entries that specify a view command for the specified |
||||||
|
* MIME type are returned. |
||||||
|
* |
||||||
|
* @param mimeType the MIME type |
||||||
|
* @return array of native command entries |
||||||
|
* @since JAF 1.1 |
||||||
|
*/ |
||||||
|
public synchronized String[] getNativeCommands(String mimeType) { |
||||||
|
List cmdList = new ArrayList(); |
||||||
|
if (mimeType != null) |
||||||
|
mimeType = mimeType.toLowerCase(Locale.ENGLISH); |
||||||
|
|
||||||
|
for (int i = 0; i < DB.length; i++) { |
||||||
|
if (DB[i] == null) |
||||||
|
continue; |
||||||
|
String[] cmds = DB[i].getNativeCommands(mimeType); |
||||||
|
if (cmds != null) { |
||||||
|
for (int j = 0; j < cmds.length; j++) { |
||||||
|
// eliminate duplicates
|
||||||
|
if (!cmdList.contains(cmds[j])) |
||||||
|
cmdList.add(cmds[j]); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
String[] cmds = new String[cmdList.size()]; |
||||||
|
cmds = (String[])cmdList.toArray(cmds); |
||||||
|
|
||||||
|
return cmds; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* for debugging... |
||||||
|
* |
||||||
|
public static void main(String[] argv) throws Exception { |
||||||
|
MailcapCommandMap map = new MailcapCommandMap(); |
||||||
|
CommandInfo[] cmdInfo; |
||||||
|
|
||||||
|
cmdInfo = map.getPreferredCommands(argv[0]); |
||||||
|
System.out.println("Preferred Commands:"); |
||||||
|
for (int i = 0; i < cmdInfo.length; i++) |
||||||
|
System.out.println("Command " + cmdInfo[i].getCommandName() + " [" + |
||||||
|
cmdInfo[i].getCommandClass() + "]"); |
||||||
|
cmdInfo = map.getAllCommands(argv[0]); |
||||||
|
System.out.println(); |
||||||
|
System.out.println("All Commands:"); |
||||||
|
for (int i = 0; i < cmdInfo.length; i++) |
||||||
|
System.out.println("Command " + cmdInfo[i].getCommandName() + " [" + |
||||||
|
cmdInfo[i].getCommandClass() + "]"); |
||||||
|
DataContentHandler dch = map.createDataContentHandler(argv[0]); |
||||||
|
if (dch != null) |
||||||
|
System.out.println("DataContentHandler " + |
||||||
|
dch.getClass().toString()); |
||||||
|
System.exit(0); |
||||||
|
} |
||||||
|
*/ |
||||||
|
} |
@ -0,0 +1,359 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.activation; |
||||||
|
|
||||||
|
import java.io.*; |
||||||
|
import java.util.Locale; |
||||||
|
|
||||||
|
/** |
||||||
|
* A Multipurpose Internet Mail Extension (MIME) type, as defined |
||||||
|
* in RFC 2045 and 2046. |
||||||
|
*/ |
||||||
|
public class MimeType implements Externalizable { |
||||||
|
|
||||||
|
private String primaryType; |
||||||
|
private String subType; |
||||||
|
private MimeTypeParameterList parameters; |
||||||
|
|
||||||
|
/** |
||||||
|
* A string that holds all the special chars. |
||||||
|
*/ |
||||||
|
private static final String TSPECIALS = "()<>@,;:/[]?=\\\""; |
||||||
|
|
||||||
|
/** |
||||||
|
* Default constructor. |
||||||
|
*/ |
||||||
|
public MimeType() { |
||||||
|
primaryType = "application"; |
||||||
|
subType = "*"; |
||||||
|
parameters = new MimeTypeParameterList(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Constructor that builds a MimeType from a String. |
||||||
|
* |
||||||
|
* @param rawdata the MIME type string |
||||||
|
* @exception MimeTypeParseException if the MIME type can't be parsed |
||||||
|
*/ |
||||||
|
public MimeType(String rawdata) throws MimeTypeParseException { |
||||||
|
parse(rawdata); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Constructor that builds a MimeType with the given primary and sub type |
||||||
|
* but has an empty parameter list. |
||||||
|
* |
||||||
|
* @param primary the primary MIME type |
||||||
|
* @param sub the MIME sub-type |
||||||
|
* @exception MimeTypeParseException if the primary type or subtype |
||||||
|
* is not a valid token |
||||||
|
*/ |
||||||
|
public MimeType(String primary, String sub) throws MimeTypeParseException { |
||||||
|
// check to see if primary is valid
|
||||||
|
if (isValidToken(primary)) { |
||||||
|
primaryType = primary.toLowerCase(Locale.ENGLISH); |
||||||
|
} else { |
||||||
|
throw new MimeTypeParseException("Primary type is invalid."); |
||||||
|
} |
||||||
|
|
||||||
|
// check to see if sub is valid
|
||||||
|
if (isValidToken(sub)) { |
||||||
|
subType = sub.toLowerCase(Locale.ENGLISH); |
||||||
|
} else { |
||||||
|
throw new MimeTypeParseException("Sub type is invalid."); |
||||||
|
} |
||||||
|
|
||||||
|
parameters = new MimeTypeParameterList(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* A routine for parsing the MIME type out of a String. |
||||||
|
*/ |
||||||
|
private void parse(String rawdata) throws MimeTypeParseException { |
||||||
|
int slashIndex = rawdata.indexOf('/'); |
||||||
|
int semIndex = rawdata.indexOf(';'); |
||||||
|
if ((slashIndex < 0) && (semIndex < 0)) { |
||||||
|
// neither character is present, so treat it
|
||||||
|
// as an error
|
||||||
|
throw new MimeTypeParseException("Unable to find a sub type."); |
||||||
|
} else if ((slashIndex < 0) && (semIndex >= 0)) { |
||||||
|
// we have a ';' (and therefore a parameter list),
|
||||||
|
// but no '/' indicating a sub type is present
|
||||||
|
throw new MimeTypeParseException("Unable to find a sub type."); |
||||||
|
} else if ((slashIndex >= 0) && (semIndex < 0)) { |
||||||
|
// we have a primary and sub type but no parameter list
|
||||||
|
primaryType = rawdata.substring(0, slashIndex).trim(). |
||||||
|
toLowerCase(Locale.ENGLISH); |
||||||
|
subType = rawdata.substring(slashIndex + 1).trim(). |
||||||
|
toLowerCase(Locale.ENGLISH); |
||||||
|
parameters = new MimeTypeParameterList(); |
||||||
|
} else if (slashIndex < semIndex) { |
||||||
|
// we have all three items in the proper sequence
|
||||||
|
primaryType = rawdata.substring(0, slashIndex).trim(). |
||||||
|
toLowerCase(Locale.ENGLISH); |
||||||
|
subType = rawdata.substring(slashIndex + 1, semIndex).trim(). |
||||||
|
toLowerCase(Locale.ENGLISH); |
||||||
|
parameters = new MimeTypeParameterList(rawdata.substring(semIndex)); |
||||||
|
} else { |
||||||
|
// we have a ';' lexically before a '/' which means we
|
||||||
|
// have a primary type and a parameter list but no sub type
|
||||||
|
throw new MimeTypeParseException("Unable to find a sub type."); |
||||||
|
} |
||||||
|
|
||||||
|
// now validate the primary and sub types
|
||||||
|
|
||||||
|
// check to see if primary is valid
|
||||||
|
if (!isValidToken(primaryType)) |
||||||
|
throw new MimeTypeParseException("Primary type is invalid."); |
||||||
|
|
||||||
|
// check to see if sub is valid
|
||||||
|
if (!isValidToken(subType)) |
||||||
|
throw new MimeTypeParseException("Sub type is invalid."); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Retrieve the primary type of this object. |
||||||
|
* |
||||||
|
* @return the primary MIME type |
||||||
|
*/ |
||||||
|
public String getPrimaryType() { |
||||||
|
return primaryType; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set the primary type for this object to the given String. |
||||||
|
* |
||||||
|
* @param primary the primary MIME type |
||||||
|
* @exception MimeTypeParseException if the primary type |
||||||
|
* is not a valid token |
||||||
|
*/ |
||||||
|
public void setPrimaryType(String primary) throws MimeTypeParseException { |
||||||
|
// check to see if primary is valid
|
||||||
|
if (!isValidToken(primaryType)) |
||||||
|
throw new MimeTypeParseException("Primary type is invalid."); |
||||||
|
primaryType = primary.toLowerCase(Locale.ENGLISH); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Retrieve the subtype of this object. |
||||||
|
* |
||||||
|
* @return the MIME subtype |
||||||
|
*/ |
||||||
|
public String getSubType() { |
||||||
|
return subType; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set the subtype for this object to the given String. |
||||||
|
* |
||||||
|
* @param sub the MIME subtype |
||||||
|
* @exception MimeTypeParseException if the subtype |
||||||
|
* is not a valid token |
||||||
|
*/ |
||||||
|
public void setSubType(String sub) throws MimeTypeParseException { |
||||||
|
// check to see if sub is valid
|
||||||
|
if (!isValidToken(subType)) |
||||||
|
throw new MimeTypeParseException("Sub type is invalid."); |
||||||
|
subType = sub.toLowerCase(Locale.ENGLISH); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Retrieve this object's parameter list. |
||||||
|
* |
||||||
|
* @return a MimeTypeParameterList object representing the parameters |
||||||
|
*/ |
||||||
|
public MimeTypeParameterList getParameters() { |
||||||
|
return parameters; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Retrieve the value associated with the given name, or null if there |
||||||
|
* is no current association. |
||||||
|
* |
||||||
|
* @param name the parameter name |
||||||
|
* @return the paramter's value |
||||||
|
*/ |
||||||
|
public String getParameter(String name) { |
||||||
|
return parameters.get(name); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set the value to be associated with the given name, replacing |
||||||
|
* any previous association. |
||||||
|
* |
||||||
|
* @param name the parameter name |
||||||
|
* @param value the paramter's value |
||||||
|
*/ |
||||||
|
public void setParameter(String name, String value) { |
||||||
|
parameters.set(name, value); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Remove any value associated with the given name. |
||||||
|
* |
||||||
|
* @param name the parameter name |
||||||
|
*/ |
||||||
|
public void removeParameter(String name) { |
||||||
|
parameters.remove(name); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the String representation of this object. |
||||||
|
*/ |
||||||
|
public String toString() { |
||||||
|
return getBaseType() + parameters.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return a String representation of this object |
||||||
|
* without the parameter list. |
||||||
|
* |
||||||
|
* @return the MIME type and sub-type |
||||||
|
*/ |
||||||
|
public String getBaseType() { |
||||||
|
return primaryType + "/" + subType; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Determine if the primary and sub type of this object is |
||||||
|
* the same as what is in the given type. |
||||||
|
* |
||||||
|
* @param type the MimeType object to compare with |
||||||
|
* @return true if they match |
||||||
|
*/ |
||||||
|
public boolean match(MimeType type) { |
||||||
|
return primaryType.equals(type.getPrimaryType()) |
||||||
|
&& (subType.equals("*") |
||||||
|
|| type.getSubType().equals("*") |
||||||
|
|| (subType.equals(type.getSubType()))); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Determine if the primary and sub type of this object is |
||||||
|
* the same as the content type described in rawdata. |
||||||
|
* |
||||||
|
* @param rawdata the MIME type string to compare with |
||||||
|
* @return true if they match |
||||||
|
* @exception MimeTypeParseException if the MIME type can't be parsed |
||||||
|
*/ |
||||||
|
public boolean match(String rawdata) throws MimeTypeParseException { |
||||||
|
return match(new MimeType(rawdata)); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* The object implements the writeExternal method to save its contents |
||||||
|
* by calling the methods of DataOutput for its primitive values or |
||||||
|
* calling the writeObject method of ObjectOutput for objects, strings |
||||||
|
* and arrays. |
||||||
|
* |
||||||
|
* @param out the ObjectOutput object to write to |
||||||
|
* @exception IOException Includes any I/O exceptions that may occur |
||||||
|
*/ |
||||||
|
public void writeExternal(ObjectOutput out) throws IOException { |
||||||
|
out.writeUTF(toString()); |
||||||
|
out.flush(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* The object implements the readExternal method to restore its |
||||||
|
* contents by calling the methods of DataInput for primitive |
||||||
|
* types and readObject for objects, strings and arrays. The |
||||||
|
* readExternal method must read the values in the same sequence |
||||||
|
* and with the same types as were written by writeExternal. |
||||||
|
* |
||||||
|
* @param in the ObjectInput object to read from |
||||||
|
* @exception ClassNotFoundException If the class for an object being |
||||||
|
* restored cannot be found. |
||||||
|
*/ |
||||||
|
public void readExternal(ObjectInput in) |
||||||
|
throws IOException, ClassNotFoundException { |
||||||
|
try { |
||||||
|
parse(in.readUTF()); |
||||||
|
} catch (MimeTypeParseException e) { |
||||||
|
throw new IOException(e.toString()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// below here be scary parsing related things
|
||||||
|
|
||||||
|
/** |
||||||
|
* Determine whether or not a given character belongs to a legal token. |
||||||
|
*/ |
||||||
|
private static boolean isTokenChar(char c) { |
||||||
|
return ((c > 040) && (c < 0177)) && (TSPECIALS.indexOf(c) < 0); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Determine whether or not a given string is a legal token. |
||||||
|
*/ |
||||||
|
private boolean isValidToken(String s) { |
||||||
|
int len = s.length(); |
||||||
|
if (len > 0) { |
||||||
|
for (int i = 0; i < len; ++i) { |
||||||
|
char c = s.charAt(i); |
||||||
|
if (!isTokenChar(c)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
return true; |
||||||
|
} else { |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* A simple parser test, |
||||||
|
* for debugging... |
||||||
|
* |
||||||
|
public static void main(String[] args) |
||||||
|
throws MimeTypeParseException, IOException { |
||||||
|
for (int i = 0; i < args.length; ++i) { |
||||||
|
System.out.println("Original: " + args[i]); |
||||||
|
|
||||||
|
MimeType type = new MimeType(args[i]); |
||||||
|
|
||||||
|
System.out.println("Short: " + type.getBaseType()); |
||||||
|
System.out.println("Parsed: " + type.toString()); |
||||||
|
System.out.println(); |
||||||
|
} |
||||||
|
} |
||||||
|
*/ |
||||||
|
} |
@ -0,0 +1,354 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.activation; |
||||||
|
|
||||||
|
import java.util.Hashtable; |
||||||
|
import java.util.Enumeration; |
||||||
|
import java.util.Locale; |
||||||
|
|
||||||
|
/** |
||||||
|
* A parameter list of a MimeType |
||||||
|
* as defined in RFC 2045 and 2046. The Primary type of the |
||||||
|
* object must already be stripped off. |
||||||
|
* |
||||||
|
* @see javax.activation.MimeType |
||||||
|
*/ |
||||||
|
public class MimeTypeParameterList { |
||||||
|
private Hashtable parameters; |
||||||
|
|
||||||
|
/** |
||||||
|
* A string that holds all the special chars. |
||||||
|
*/ |
||||||
|
private static final String TSPECIALS = "()<>@,;:/[]?=\\\""; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Default constructor. |
||||||
|
*/ |
||||||
|
public MimeTypeParameterList() { |
||||||
|
parameters = new Hashtable(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Constructs a new MimeTypeParameterList with the passed in data. |
||||||
|
* |
||||||
|
* @param parameterList an RFC 2045, 2046 compliant parameter list. |
||||||
|
* @exception MimeTypeParseException if the MIME type can't be parsed |
||||||
|
*/ |
||||||
|
public MimeTypeParameterList(String parameterList) |
||||||
|
throws MimeTypeParseException { |
||||||
|
parameters = new Hashtable(); |
||||||
|
|
||||||
|
// now parse rawdata
|
||||||
|
parse(parameterList); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* A routine for parsing the parameter list out of a String. |
||||||
|
* |
||||||
|
* @param parameterList an RFC 2045, 2046 compliant parameter list. |
||||||
|
* @exception MimeTypeParseException if the MIME type can't be parsed |
||||||
|
*/ |
||||||
|
protected void parse(String parameterList) throws MimeTypeParseException { |
||||||
|
if (parameterList == null) |
||||||
|
return; |
||||||
|
|
||||||
|
int length = parameterList.length(); |
||||||
|
if (length <= 0) |
||||||
|
return; |
||||||
|
|
||||||
|
int i; |
||||||
|
char c; |
||||||
|
for (i = skipWhiteSpace(parameterList, 0); |
||||||
|
i < length && (c = parameterList.charAt(i)) == ';'; |
||||||
|
i = skipWhiteSpace(parameterList, i)) { |
||||||
|
int lastIndex; |
||||||
|
String name; |
||||||
|
String value; |
||||||
|
|
||||||
|
// eat the ';'
|
||||||
|
i++; |
||||||
|
|
||||||
|
// now parse the parameter name
|
||||||
|
|
||||||
|
// skip whitespace
|
||||||
|
i = skipWhiteSpace(parameterList, i); |
||||||
|
|
||||||
|
// tolerate trailing semicolon, even though it violates the spec
|
||||||
|
if (i >= length) |
||||||
|
return; |
||||||
|
|
||||||
|
// find the end of the token char run
|
||||||
|
lastIndex = i; |
||||||
|
while ((i < length) && isTokenChar(parameterList.charAt(i))) |
||||||
|
i++; |
||||||
|
|
||||||
|
name = parameterList.substring(lastIndex, i). |
||||||
|
toLowerCase(Locale.ENGLISH); |
||||||
|
|
||||||
|
// now parse the '=' that separates the name from the value
|
||||||
|
i = skipWhiteSpace(parameterList, i); |
||||||
|
|
||||||
|
if (i >= length || parameterList.charAt(i) != '=') |
||||||
|
throw new MimeTypeParseException( |
||||||
|
"Couldn't find the '=' that separates a " + |
||||||
|
"parameter name from its value."); |
||||||
|
|
||||||
|
// eat it and parse the parameter value
|
||||||
|
i++; |
||||||
|
i = skipWhiteSpace(parameterList, i); |
||||||
|
|
||||||
|
if (i >= length) |
||||||
|
throw new MimeTypeParseException( |
||||||
|
"Couldn't find a value for parameter named " + name); |
||||||
|
|
||||||
|
// now find out whether or not we have a quoted value
|
||||||
|
c = parameterList.charAt(i); |
||||||
|
if (c == '"') { |
||||||
|
// yup it's quoted so eat it and capture the quoted string
|
||||||
|
i++; |
||||||
|
if (i >= length) |
||||||
|
throw new MimeTypeParseException( |
||||||
|
"Encountered unterminated quoted parameter value."); |
||||||
|
|
||||||
|
lastIndex = i; |
||||||
|
|
||||||
|
// find the next unescaped quote
|
||||||
|
while (i < length) { |
||||||
|
c = parameterList.charAt(i); |
||||||
|
if (c == '"') |
||||||
|
break; |
||||||
|
if (c == '\\') { |
||||||
|
// found an escape sequence
|
||||||
|
// so skip this and the
|
||||||
|
// next character
|
||||||
|
i++; |
||||||
|
} |
||||||
|
i++; |
||||||
|
} |
||||||
|
if (c != '"') |
||||||
|
throw new MimeTypeParseException( |
||||||
|
"Encountered unterminated quoted parameter value."); |
||||||
|
|
||||||
|
value = unquote(parameterList.substring(lastIndex, i)); |
||||||
|
// eat the quote
|
||||||
|
i++; |
||||||
|
} else if (isTokenChar(c)) { |
||||||
|
// nope it's an ordinary token so it
|
||||||
|
// ends with a non-token char
|
||||||
|
lastIndex = i; |
||||||
|
while (i < length && isTokenChar(parameterList.charAt(i))) |
||||||
|
i++; |
||||||
|
value = parameterList.substring(lastIndex, i); |
||||||
|
} else { |
||||||
|
// it ain't a value
|
||||||
|
throw new MimeTypeParseException( |
||||||
|
"Unexpected character encountered at index " + i); |
||||||
|
} |
||||||
|
|
||||||
|
// now put the data into the hashtable
|
||||||
|
parameters.put(name, value); |
||||||
|
} |
||||||
|
if (i < length) { |
||||||
|
throw new MimeTypeParseException( |
||||||
|
"More characters encountered in input than expected."); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the number of name-value pairs in this list. |
||||||
|
* |
||||||
|
* @return the number of parameters |
||||||
|
*/ |
||||||
|
public int size() { |
||||||
|
return parameters.size(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Determine whether or not this list is empty. |
||||||
|
* |
||||||
|
* @return true if there are no parameters |
||||||
|
*/ |
||||||
|
public boolean isEmpty() { |
||||||
|
return parameters.isEmpty(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Retrieve the value associated with the given name, or null if there |
||||||
|
* is no current association. |
||||||
|
* |
||||||
|
* @param name the parameter name |
||||||
|
* @return the parameter's value |
||||||
|
*/ |
||||||
|
public String get(String name) { |
||||||
|
return (String)parameters.get(name.trim().toLowerCase(Locale.ENGLISH)); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set the value to be associated with the given name, replacing |
||||||
|
* any previous association. |
||||||
|
* |
||||||
|
* @param name the parameter name |
||||||
|
* @param value the parameter's value |
||||||
|
*/ |
||||||
|
public void set(String name, String value) { |
||||||
|
parameters.put(name.trim().toLowerCase(Locale.ENGLISH), value); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Remove any value associated with the given name. |
||||||
|
* |
||||||
|
* @param name the parameter name |
||||||
|
*/ |
||||||
|
public void remove(String name) { |
||||||
|
parameters.remove(name.trim().toLowerCase(Locale.ENGLISH)); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Retrieve an enumeration of all the names in this list. |
||||||
|
* |
||||||
|
* @return an enumeration of all parameter names |
||||||
|
*/ |
||||||
|
public Enumeration getNames() { |
||||||
|
return parameters.keys(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return a string representation of this object. |
||||||
|
*/ |
||||||
|
public String toString() { |
||||||
|
StringBuffer buffer = new StringBuffer(); |
||||||
|
buffer.ensureCapacity(parameters.size() * 16); |
||||||
|
// heuristic: 8 characters per field
|
||||||
|
|
||||||
|
Enumeration keys = parameters.keys(); |
||||||
|
while (keys.hasMoreElements()) { |
||||||
|
String key = (String)keys.nextElement(); |
||||||
|
buffer.append("; "); |
||||||
|
buffer.append(key); |
||||||
|
buffer.append('='); |
||||||
|
buffer.append(quote((String)parameters.get(key))); |
||||||
|
} |
||||||
|
|
||||||
|
return buffer.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
// below here be scary parsing related things
|
||||||
|
|
||||||
|
/** |
||||||
|
* Determine whether or not a given character belongs to a legal token. |
||||||
|
*/ |
||||||
|
private static boolean isTokenChar(char c) { |
||||||
|
return ((c > 040) && (c < 0177)) && (TSPECIALS.indexOf(c) < 0); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* return the index of the first non white space character in |
||||||
|
* rawdata at or after index i. |
||||||
|
*/ |
||||||
|
private static int skipWhiteSpace(String rawdata, int i) { |
||||||
|
int length = rawdata.length(); |
||||||
|
while ((i < length) && Character.isWhitespace(rawdata.charAt(i))) |
||||||
|
i++; |
||||||
|
return i; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* A routine that knows how and when to quote and escape the given value. |
||||||
|
*/ |
||||||
|
private static String quote(String value) { |
||||||
|
boolean needsQuotes = false; |
||||||
|
|
||||||
|
// check to see if we actually have to quote this thing
|
||||||
|
int length = value.length(); |
||||||
|
for (int i = 0; (i < length) && !needsQuotes; i++) { |
||||||
|
needsQuotes = !isTokenChar(value.charAt(i)); |
||||||
|
} |
||||||
|
|
||||||
|
if (needsQuotes) { |
||||||
|
StringBuffer buffer = new StringBuffer(); |
||||||
|
buffer.ensureCapacity((int)(length * 1.5)); |
||||||
|
|
||||||
|
// add the initial quote
|
||||||
|
buffer.append('"'); |
||||||
|
|
||||||
|
// add the properly escaped text
|
||||||
|
for (int i = 0; i < length; ++i) { |
||||||
|
char c = value.charAt(i); |
||||||
|
if ((c == '\\') || (c == '"')) |
||||||
|
buffer.append('\\'); |
||||||
|
buffer.append(c); |
||||||
|
} |
||||||
|
|
||||||
|
// add the closing quote
|
||||||
|
buffer.append('"'); |
||||||
|
|
||||||
|
return buffer.toString(); |
||||||
|
} else { |
||||||
|
return value; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* A routine that knows how to strip the quotes and |
||||||
|
* escape sequences from the given value. |
||||||
|
*/ |
||||||
|
private static String unquote(String value) { |
||||||
|
int valueLength = value.length(); |
||||||
|
StringBuffer buffer = new StringBuffer(); |
||||||
|
buffer.ensureCapacity(valueLength); |
||||||
|
|
||||||
|
boolean escaped = false; |
||||||
|
for (int i = 0; i < valueLength; ++i) { |
||||||
|
char currentChar = value.charAt(i); |
||||||
|
if (!escaped && (currentChar != '\\')) { |
||||||
|
buffer.append(currentChar); |
||||||
|
} else if (escaped) { |
||||||
|
buffer.append(currentChar); |
||||||
|
escaped = false; |
||||||
|
} else { |
||||||
|
escaped = true; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return buffer.toString(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,63 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.activation; |
||||||
|
|
||||||
|
/** |
||||||
|
* A class to encapsulate MimeType parsing related exceptions. |
||||||
|
*/ |
||||||
|
public class MimeTypeParseException extends Exception { |
||||||
|
|
||||||
|
/** |
||||||
|
* Constructs a MimeTypeParseException with no specified detail message. |
||||||
|
*/ |
||||||
|
public MimeTypeParseException() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Constructs a MimeTypeParseException with the specified detail message. |
||||||
|
* |
||||||
|
* @param s the detail message. |
||||||
|
*/ |
||||||
|
public MimeTypeParseException(String s) { |
||||||
|
super(s); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,373 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.activation; |
||||||
|
|
||||||
|
import java.io.*; |
||||||
|
import java.net.*; |
||||||
|
import java.util.*; |
||||||
|
import java.security.AccessController; |
||||||
|
import java.security.PrivilegedAction; |
||||||
|
import com.sun.activation.registries.MimeTypeFile; |
||||||
|
import com.sun.activation.registries.LogSupport; |
||||||
|
|
||||||
|
/** |
||||||
|
* This class extends FileTypeMap and provides data typing of files |
||||||
|
* via their file extension. It uses the <code>.mime.types</code> format. <p> |
||||||
|
* |
||||||
|
* <b>MIME types file search order:</b><p> |
||||||
|
* The MimetypesFileTypeMap looks in various places in the user's |
||||||
|
* system for MIME types file entries. When requests are made |
||||||
|
* to search for MIME types in the MimetypesFileTypeMap, it searches |
||||||
|
* MIME types files in the following order: |
||||||
|
* <ol> |
||||||
|
* <li> Programmatically added entries to the MimetypesFileTypeMap instance. |
||||||
|
* <li> The file <code>.mime.types</code> in the user's home directory. |
||||||
|
* <li> The file <code>mime.types</code> in the Java runtime. |
||||||
|
* <li> The file or resources named <code>META-INF/mime.types</code>. |
||||||
|
* <li> The file or resource named <code>META-INF/mimetypes.default</code> |
||||||
|
* (usually found only in the <code>activation.jar</code> file). |
||||||
|
* </ol> |
||||||
|
* <p> |
||||||
|
* (The current implementation looks for the <code>mime.types</code> file |
||||||
|
* in the Java runtime in the directory <code><i>java.home</i>/conf</code> |
||||||
|
* if it exists, and otherwise in the directory |
||||||
|
* <code><i>java.home</i>/lib</code>, where <i>java.home</i> is the value |
||||||
|
* of the "java.home" System property. Note that the "conf" directory was |
||||||
|
* introduced in JDK 9.) |
||||||
|
* <p> |
||||||
|
* <b>MIME types file format:</b><p> |
||||||
|
* |
||||||
|
* <code> |
||||||
|
* # comments begin with a '#'<br> |
||||||
|
* # the format is <mime type> <space separated file extensions><br> |
||||||
|
* # for example:<br> |
||||||
|
* text/plain txt text TXT<br> |
||||||
|
* # this would map file.txt, file.text, and file.TXT to<br> |
||||||
|
* # the mime type "text/plain"<br> |
||||||
|
* </code> |
||||||
|
* |
||||||
|
* @author Bart Calder |
||||||
|
* @author Bill Shannon |
||||||
|
*/ |
||||||
|
public class MimetypesFileTypeMap extends FileTypeMap { |
||||||
|
/* |
||||||
|
* We manage a collection of databases, searched in order. |
||||||
|
*/ |
||||||
|
private MimeTypeFile[] DB; |
||||||
|
private static final int PROG = 0; // programmatically added entries
|
||||||
|
|
||||||
|
private static final String defaultType = "application/octet-stream"; |
||||||
|
|
||||||
|
private static final String confDir; |
||||||
|
|
||||||
|
static { |
||||||
|
String dir = null; |
||||||
|
try { |
||||||
|
dir = (String)AccessController.doPrivileged( |
||||||
|
new PrivilegedAction() { |
||||||
|
public Object run() { |
||||||
|
String home = System.getProperty("java.home"); |
||||||
|
String newdir = home + File.separator + "conf"; |
||||||
|
File conf = new File(newdir); |
||||||
|
if (conf.exists()) |
||||||
|
return newdir + File.separator; |
||||||
|
else |
||||||
|
return home + File.separator + "lib" + File.separator; |
||||||
|
} |
||||||
|
}); |
||||||
|
} catch (Exception ex) { |
||||||
|
// ignore any exceptions
|
||||||
|
} |
||||||
|
confDir = dir; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* The default constructor. |
||||||
|
*/ |
||||||
|
public MimetypesFileTypeMap() { |
||||||
|
Vector dbv = new Vector(5); // usually 5 or less databases
|
||||||
|
MimeTypeFile mf = null; |
||||||
|
dbv.addElement(null); // place holder for PROG entry
|
||||||
|
|
||||||
|
LogSupport.log("MimetypesFileTypeMap: load HOME"); |
||||||
|
try { |
||||||
|
String user_home = System.getProperty("user.home"); |
||||||
|
|
||||||
|
if (user_home != null) { |
||||||
|
String path = user_home + File.separator + ".mime.types"; |
||||||
|
mf = loadFile(path); |
||||||
|
if (mf != null) |
||||||
|
dbv.addElement(mf); |
||||||
|
} |
||||||
|
} catch (SecurityException ex) {} |
||||||
|
|
||||||
|
LogSupport.log("MimetypesFileTypeMap: load SYS"); |
||||||
|
try { |
||||||
|
// check system's home
|
||||||
|
if (confDir != null) { |
||||||
|
mf = loadFile(confDir + "mime.types"); |
||||||
|
if (mf != null) |
||||||
|
dbv.addElement(mf); |
||||||
|
} |
||||||
|
} catch (SecurityException ex) {} |
||||||
|
|
||||||
|
LogSupport.log("MimetypesFileTypeMap: load JAR"); |
||||||
|
// load from the app's jar file
|
||||||
|
loadAllResources(dbv, "META-INF/mime.types"); |
||||||
|
|
||||||
|
LogSupport.log("MimetypesFileTypeMap: load DEF"); |
||||||
|
mf = loadResource("/META-INF/mimetypes.default"); |
||||||
|
|
||||||
|
if (mf != null) |
||||||
|
dbv.addElement(mf); |
||||||
|
|
||||||
|
DB = new MimeTypeFile[dbv.size()]; |
||||||
|
dbv.copyInto(DB); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Load from the named resource. |
||||||
|
*/ |
||||||
|
private MimeTypeFile loadResource(String name) { |
||||||
|
InputStream clis = null; |
||||||
|
try { |
||||||
|
clis = SecuritySupport.getResourceAsStream(this.getClass(), name); |
||||||
|
if (clis != null) { |
||||||
|
MimeTypeFile mf = new MimeTypeFile(clis); |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("MimetypesFileTypeMap: successfully " + |
||||||
|
"loaded mime types file: " + name); |
||||||
|
return mf; |
||||||
|
} else { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("MimetypesFileTypeMap: not loading " + |
||||||
|
"mime types file: " + name); |
||||||
|
} |
||||||
|
} catch (IOException e) { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("MimetypesFileTypeMap: can't load " + name, e); |
||||||
|
} catch (SecurityException sex) { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("MimetypesFileTypeMap: can't load " + name, sex); |
||||||
|
} finally { |
||||||
|
try { |
||||||
|
if (clis != null) |
||||||
|
clis.close(); |
||||||
|
} catch (IOException ex) { } // ignore it
|
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Load all of the named resource. |
||||||
|
*/ |
||||||
|
private void loadAllResources(Vector v, String name) { |
||||||
|
boolean anyLoaded = false; |
||||||
|
try { |
||||||
|
URL[] urls; |
||||||
|
ClassLoader cld = null; |
||||||
|
// First try the "application's" class loader.
|
||||||
|
cld = SecuritySupport.getContextClassLoader(); |
||||||
|
if (cld == null) |
||||||
|
cld = this.getClass().getClassLoader(); |
||||||
|
if (cld != null) |
||||||
|
urls = SecuritySupport.getResources(cld, name); |
||||||
|
else |
||||||
|
urls = SecuritySupport.getSystemResources(name); |
||||||
|
if (urls != null) { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("MimetypesFileTypeMap: getResources"); |
||||||
|
for (int i = 0; i < urls.length; i++) { |
||||||
|
URL url = urls[i]; |
||||||
|
InputStream clis = null; |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("MimetypesFileTypeMap: URL " + url); |
||||||
|
try { |
||||||
|
clis = SecuritySupport.openStream(url); |
||||||
|
if (clis != null) { |
||||||
|
v.addElement(new MimeTypeFile(clis)); |
||||||
|
anyLoaded = true; |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("MimetypesFileTypeMap: " + |
||||||
|
"successfully loaded " + |
||||||
|
"mime types from URL: " + url); |
||||||
|
} else { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("MimetypesFileTypeMap: " + |
||||||
|
"not loading " + |
||||||
|
"mime types from URL: " + url); |
||||||
|
} |
||||||
|
} catch (IOException ioex) { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("MimetypesFileTypeMap: can't load " + |
||||||
|
url, ioex); |
||||||
|
} catch (SecurityException sex) { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("MimetypesFileTypeMap: can't load " + |
||||||
|
url, sex); |
||||||
|
} finally { |
||||||
|
try { |
||||||
|
if (clis != null) |
||||||
|
clis.close(); |
||||||
|
} catch (IOException cex) { } |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} catch (Exception ex) { |
||||||
|
if (LogSupport.isLoggable()) |
||||||
|
LogSupport.log("MimetypesFileTypeMap: can't load " + name, ex); |
||||||
|
} |
||||||
|
|
||||||
|
// if failed to load anything, fall back to old technique, just in case
|
||||||
|
if (!anyLoaded) { |
||||||
|
LogSupport.log("MimetypesFileTypeMap: !anyLoaded"); |
||||||
|
MimeTypeFile mf = loadResource("/" + name); |
||||||
|
if (mf != null) |
||||||
|
v.addElement(mf); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Load the named file. |
||||||
|
*/ |
||||||
|
private MimeTypeFile loadFile(String name) { |
||||||
|
MimeTypeFile mtf = null; |
||||||
|
|
||||||
|
try { |
||||||
|
mtf = new MimeTypeFile(name); |
||||||
|
} catch (IOException e) { |
||||||
|
// e.printStackTrace();
|
||||||
|
} |
||||||
|
return mtf; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Construct a MimetypesFileTypeMap with programmatic entries |
||||||
|
* added from the named file. |
||||||
|
* |
||||||
|
* @param mimeTypeFileName the file name |
||||||
|
* @exception IOException for errors reading the file |
||||||
|
*/ |
||||||
|
public MimetypesFileTypeMap(String mimeTypeFileName) throws IOException { |
||||||
|
this(); |
||||||
|
DB[PROG] = new MimeTypeFile(mimeTypeFileName); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Construct a MimetypesFileTypeMap with programmatic entries |
||||||
|
* added from the InputStream. |
||||||
|
* |
||||||
|
* @param is the input stream to read from |
||||||
|
*/ |
||||||
|
public MimetypesFileTypeMap(InputStream is) { |
||||||
|
this(); |
||||||
|
try { |
||||||
|
DB[PROG] = new MimeTypeFile(is); |
||||||
|
} catch (IOException ex) { |
||||||
|
// XXX - really should throw it
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Prepend the MIME type values to the registry. |
||||||
|
* |
||||||
|
* @param mime_types A .mime.types formatted string of entries. |
||||||
|
*/ |
||||||
|
public synchronized void addMimeTypes(String mime_types) { |
||||||
|
// check to see if we have created the registry
|
||||||
|
if (DB[PROG] == null) |
||||||
|
DB[PROG] = new MimeTypeFile(); // make one
|
||||||
|
|
||||||
|
DB[PROG].appendToRegistry(mime_types); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the MIME type of the file object. |
||||||
|
* The implementation in this class calls |
||||||
|
* <code>getContentType(f.getName())</code>. |
||||||
|
* |
||||||
|
* @param f the file |
||||||
|
* @return the file's MIME type |
||||||
|
*/ |
||||||
|
public String getContentType(File f) { |
||||||
|
return this.getContentType(f.getName()); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the MIME type based on the specified file name. |
||||||
|
* The MIME type entries are searched as described above under |
||||||
|
* <i>MIME types file search order</i>. |
||||||
|
* If no entry is found, the type "application/octet-stream" is returned. |
||||||
|
* |
||||||
|
* @param filename the file name |
||||||
|
* @return the file's MIME type |
||||||
|
*/ |
||||||
|
public synchronized String getContentType(String filename) { |
||||||
|
int dot_pos = filename.lastIndexOf("."); // period index
|
||||||
|
|
||||||
|
if (dot_pos < 0) |
||||||
|
return defaultType; |
||||||
|
|
||||||
|
String file_ext = filename.substring(dot_pos + 1); |
||||||
|
if (file_ext.length() == 0) |
||||||
|
return defaultType; |
||||||
|
|
||||||
|
for (int i = 0; i < DB.length; i++) { |
||||||
|
if (DB[i] == null) |
||||||
|
continue; |
||||||
|
String result = DB[i].getMIMETypeString(file_ext); |
||||||
|
if (result != null) |
||||||
|
return result; |
||||||
|
} |
||||||
|
return defaultType; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* for debugging... |
||||||
|
* |
||||||
|
public static void main(String[] argv) throws Exception { |
||||||
|
MimetypesFileTypeMap map = new MimetypesFileTypeMap(); |
||||||
|
System.out.println("File " + argv[0] + " has MIME type " + |
||||||
|
map.getContentType(argv[0])); |
||||||
|
System.exit(0); |
||||||
|
} |
||||||
|
*/ |
||||||
|
} |
@ -0,0 +1,144 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.activation; |
||||||
|
|
||||||
|
import java.security.*; |
||||||
|
import java.net.*; |
||||||
|
import java.io.*; |
||||||
|
import java.util.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* Security related methods that only work on J2SE 1.2 and newer. |
||||||
|
*/ |
||||||
|
class SecuritySupport { |
||||||
|
|
||||||
|
private SecuritySupport() { |
||||||
|
// private constructor, can't create an instance
|
||||||
|
} |
||||||
|
|
||||||
|
public static ClassLoader getContextClassLoader() { |
||||||
|
return (ClassLoader) |
||||||
|
AccessController.doPrivileged(new PrivilegedAction() { |
||||||
|
public Object run() { |
||||||
|
ClassLoader cl = null; |
||||||
|
try { |
||||||
|
cl = Thread.currentThread().getContextClassLoader(); |
||||||
|
} catch (SecurityException ex) { } |
||||||
|
return cl; |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
public static InputStream getResourceAsStream(final Class c, |
||||||
|
final String name) throws IOException { |
||||||
|
try { |
||||||
|
return (InputStream) |
||||||
|
AccessController.doPrivileged(new PrivilegedExceptionAction() { |
||||||
|
public Object run() throws IOException { |
||||||
|
return c.getResourceAsStream(name); |
||||||
|
} |
||||||
|
}); |
||||||
|
} catch (PrivilegedActionException e) { |
||||||
|
throw (IOException)e.getException(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static URL[] getResources(final ClassLoader cl, final String name) { |
||||||
|
return (URL[]) |
||||||
|
AccessController.doPrivileged(new PrivilegedAction() { |
||||||
|
public Object run() { |
||||||
|
URL[] ret = null; |
||||||
|
try { |
||||||
|
List v = new ArrayList(); |
||||||
|
Enumeration e = cl.getResources(name); |
||||||
|
while (e != null && e.hasMoreElements()) { |
||||||
|
URL url = (URL)e.nextElement(); |
||||||
|
if (url != null) |
||||||
|
v.add(url); |
||||||
|
} |
||||||
|
if (v.size() > 0) { |
||||||
|
ret = new URL[v.size()]; |
||||||
|
ret = (URL[])v.toArray(ret); |
||||||
|
} |
||||||
|
} catch (IOException ioex) { |
||||||
|
} catch (SecurityException ex) { } |
||||||
|
return ret; |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
public static URL[] getSystemResources(final String name) { |
||||||
|
return (URL[]) |
||||||
|
AccessController.doPrivileged(new PrivilegedAction() { |
||||||
|
public Object run() { |
||||||
|
URL[] ret = null; |
||||||
|
try { |
||||||
|
List v = new ArrayList(); |
||||||
|
Enumeration e = ClassLoader.getSystemResources(name); |
||||||
|
while (e != null && e.hasMoreElements()) { |
||||||
|
URL url = (URL)e.nextElement(); |
||||||
|
if (url != null) |
||||||
|
v.add(url); |
||||||
|
} |
||||||
|
if (v.size() > 0) { |
||||||
|
ret = new URL[v.size()]; |
||||||
|
ret = (URL[])v.toArray(ret); |
||||||
|
} |
||||||
|
} catch (IOException ioex) { |
||||||
|
} catch (SecurityException ex) { } |
||||||
|
return ret; |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
public static InputStream openStream(final URL url) throws IOException { |
||||||
|
try { |
||||||
|
return (InputStream) |
||||||
|
AccessController.doPrivileged(new PrivilegedExceptionAction() { |
||||||
|
public Object run() throws IOException { |
||||||
|
return url.openStream(); |
||||||
|
} |
||||||
|
}); |
||||||
|
} catch (PrivilegedActionException e) { |
||||||
|
throw (IOException)e.getException(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,150 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.activation; |
||||||
|
|
||||||
|
import java.net.URL; |
||||||
|
import java.net.URLConnection; |
||||||
|
import java.io.InputStream; |
||||||
|
import java.io.OutputStream; |
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
/** |
||||||
|
* The URLDataSource class provides an object that wraps a <code>URL</code> |
||||||
|
* object in a DataSource interface. URLDataSource simplifies the handling |
||||||
|
* of data described by URLs within the JavaBeans Activation Framework |
||||||
|
* because this class can be used to create new DataHandlers. <i>NOTE: The |
||||||
|
* DataHandler object creates a URLDataSource internally, |
||||||
|
* when it is constructed with a URL.</i> |
||||||
|
* |
||||||
|
* @see javax.activation.DataSource |
||||||
|
* @see javax.activation.DataHandler |
||||||
|
*/ |
||||||
|
public class URLDataSource implements DataSource { |
||||||
|
private URL url = null; |
||||||
|
private URLConnection url_conn = null; |
||||||
|
|
||||||
|
/** |
||||||
|
* URLDataSource constructor. The URLDataSource class will |
||||||
|
* not open a connection to the URL until a method requiring it |
||||||
|
* to do so is called. |
||||||
|
* |
||||||
|
* @param url The URL to be encapsulated in this object. |
||||||
|
*/ |
||||||
|
public URLDataSource(URL url) { |
||||||
|
this.url = url; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the value of the URL content-type header field. |
||||||
|
* It calls the URL's <code>URLConnection.getContentType</code> method |
||||||
|
* after retrieving a URLConnection object. |
||||||
|
* <i>Note: this method attempts to call the <code>openConnection</code> |
||||||
|
* method on the URL. If this method fails, or if a content type is not |
||||||
|
* returned from the URLConnection, getContentType returns |
||||||
|
* "application/octet-stream" as the content type.</i> |
||||||
|
* |
||||||
|
* @return the content type. |
||||||
|
*/ |
||||||
|
public String getContentType() { |
||||||
|
String type = null; |
||||||
|
|
||||||
|
try { |
||||||
|
if (url_conn == null) |
||||||
|
url_conn = url.openConnection(); |
||||||
|
} catch (IOException e) { } |
||||||
|
|
||||||
|
if (url_conn != null) |
||||||
|
type = url_conn.getContentType(); |
||||||
|
|
||||||
|
if (type == null) |
||||||
|
type = "application/octet-stream"; |
||||||
|
|
||||||
|
return type; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Calls the <code>getFile</code> method on the URL used to |
||||||
|
* instantiate the object. |
||||||
|
* |
||||||
|
* @return the result of calling the URL's getFile method. |
||||||
|
*/ |
||||||
|
public String getName() { |
||||||
|
return url.getFile(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* The getInputStream method from the URL. Calls the |
||||||
|
* <code>openStream</code> method on the URL. |
||||||
|
* |
||||||
|
* @return the InputStream. |
||||||
|
*/ |
||||||
|
public InputStream getInputStream() throws IOException { |
||||||
|
return url.openStream(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* The getOutputStream method from the URL. First an attempt is |
||||||
|
* made to get the URLConnection object for the URL. If that |
||||||
|
* succeeds, the getOutputStream method on the URLConnection |
||||||
|
* is returned. |
||||||
|
* |
||||||
|
* @return the OutputStream. |
||||||
|
*/ |
||||||
|
public OutputStream getOutputStream() throws IOException { |
||||||
|
// get the url connection if it is available
|
||||||
|
url_conn = url.openConnection(); |
||||||
|
|
||||||
|
if (url_conn != null) { |
||||||
|
url_conn.setDoOutput(true); |
||||||
|
return url_conn.getOutputStream(); |
||||||
|
} else |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the URL used to create this DataSource. |
||||||
|
* |
||||||
|
* @return The URL. |
||||||
|
*/ |
||||||
|
public URL getURL() { |
||||||
|
return url; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,70 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.activation; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
/** |
||||||
|
* Signals that the requested operation does not support the |
||||||
|
* requested data type. |
||||||
|
* |
||||||
|
* @see javax.activation.DataHandler |
||||||
|
*/ |
||||||
|
|
||||||
|
public class UnsupportedDataTypeException extends IOException { |
||||||
|
/** |
||||||
|
* Constructs an UnsupportedDataTypeException with no detail |
||||||
|
* message. |
||||||
|
*/ |
||||||
|
public UnsupportedDataTypeException() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Constructs an UnsupportedDataTypeException with the specified |
||||||
|
* message. |
||||||
|
* |
||||||
|
* @param s The detail message. |
||||||
|
*/ |
||||||
|
public UnsupportedDataTypeException(String s) { |
||||||
|
super(s); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,53 @@ |
|||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> |
||||||
|
<HTML> |
||||||
|
<HEAD> |
||||||
|
<!-- |
||||||
|
|
||||||
|
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
|
||||||
|
Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. |
||||||
|
|
||||||
|
The contents of this file are subject to the terms of either the GNU |
||||||
|
General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
may not use this file except in compliance with the License. You can |
||||||
|
obtain a copy of the License at |
||||||
|
https://oss.oracle.com/licenses/CDDL+GPL-1.1 |
||||||
|
or LICENSE.txt. See the License for the specific |
||||||
|
language governing permissions and limitations under the License. |
||||||
|
|
||||||
|
When distributing the software, include this License Header Notice in each |
||||||
|
file and include the License file at LICENSE.txt. |
||||||
|
|
||||||
|
GPL Classpath Exception: |
||||||
|
Oracle designates this particular file as subject to the "Classpath" |
||||||
|
exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
file that accompanied this code. |
||||||
|
|
||||||
|
Modifications: |
||||||
|
If applicable, add the following below the License Header, with the fields |
||||||
|
enclosed by brackets [] replaced by your own identifying information: |
||||||
|
"Portions Copyright [year] [name of copyright owner]" |
||||||
|
|
||||||
|
Contributor(s): |
||||||
|
If you wish your version of this file to be governed by only the CDDL or |
||||||
|
only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
recipient has the option to distribute your version of this file under |
||||||
|
either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
only if the new code is made subject to such option by the copyright |
||||||
|
holder. |
||||||
|
|
||||||
|
--> |
||||||
|
|
||||||
|
</HEAD> |
||||||
|
<BODY BGCOLOR="white"> |
||||||
|
|
||||||
|
The JavaBeans(TM) Activation Framework is used by the JavaMail(TM) |
||||||
|
API to manage MIME data. |
||||||
|
|
||||||
|
</BODY> |
||||||
|
</HTML> |
@ -0,0 +1,91 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 2005-2018 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.annotation; |
||||||
|
import java.lang.annotation.*; |
||||||
|
import static java.lang.annotation.ElementType.*; |
||||||
|
import static java.lang.annotation.RetentionPolicy.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* The <code>Generated</code> annotation is used to mark source code |
||||||
|
* that has been generated. |
||||||
|
* It can also be used to differentiate user written code from generated code |
||||||
|
* in a single file. |
||||||
|
* <p>The <code>value</code> element must have the name of the |
||||||
|
* code generator. The recommended convention is to use the fully qualified |
||||||
|
* name of the code generator in the value field, |
||||||
|
* for example <code>com.company.package.classname</code>.</p> |
||||||
|
* <p>The <code>date</code> element is used to indicate the date the |
||||||
|
* source was generated. |
||||||
|
* The <code>date</code> element must follow the ISO 8601 standard. |
||||||
|
* For example, the <code>date</code> element could have the |
||||||
|
* value <code>2001-07-04T12:08:56.235-0700</code>, |
||||||
|
* which represents 2001-07-04 12:08:56 local time in the U.S. Pacific |
||||||
|
* time zone.</p> |
||||||
|
* <p>The <code>comment</code> element is a place holder for any comments |
||||||
|
* that the code generator may want to include in the generated code.</p> |
||||||
|
* |
||||||
|
* @since 1.6, Common Annotations 1.0 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Documented |
||||||
|
@Retention(SOURCE) |
||||||
|
@Target({PACKAGE, TYPE, ANNOTATION_TYPE, METHOD, CONSTRUCTOR, FIELD, |
||||||
|
LOCAL_VARIABLE, PARAMETER}) |
||||||
|
public @interface Generated { |
||||||
|
/** |
||||||
|
* The value element must have the name of the code generator. |
||||||
|
* The recommended convention is to use the fully qualified name of the |
||||||
|
* code generator. For example: <code>com.acme.generator.CodeGen</code>. |
||||||
|
*/ |
||||||
|
String[] value(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Date when the source was generated. |
||||||
|
*/ |
||||||
|
String date() default ""; |
||||||
|
|
||||||
|
/** |
||||||
|
* A place holder for any comments that the code generator may want to |
||||||
|
* include in the generated code. |
||||||
|
*/ |
||||||
|
String comments() default ""; |
||||||
|
} |
||||||
|
|
@ -0,0 +1,70 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 2009-2018 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.annotation; |
||||||
|
|
||||||
|
import java.lang.annotation.*; |
||||||
|
import static java.lang.annotation.ElementType.*; |
||||||
|
import static java.lang.annotation.RetentionPolicy.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* The <code>ManagedBean</code> annotation marks a POJO (Plain Old Java Object) |
||||||
|
* as a ManagedBean. A ManagedBean supports a small set of basic services |
||||||
|
* such as resource injection, lifecycle callbacks and interceptors. |
||||||
|
* |
||||||
|
* @since Common Annotations 1.1 |
||||||
|
*/ |
||||||
|
@Target(TYPE) |
||||||
|
@Retention(RUNTIME) |
||||||
|
public @interface ManagedBean { |
||||||
|
/** |
||||||
|
* The name of the Managed Bean. Managed Bean names must be unique within a |
||||||
|
* Java EE module. For each named Managed Bean, Java EE containers must make |
||||||
|
* available the following entries in JNDI, using the same naming scheme used |
||||||
|
* for EJB components. |
||||||
|
* <p> |
||||||
|
* In the application namespace: <p> |
||||||
|
* java:app/<module-name>/<bean-name> <p> |
||||||
|
* In the module namespace of the module containing the Managed Bean: |
||||||
|
* <p> java:module/<bean-name> |
||||||
|
* |
||||||
|
*/ |
||||||
|
public String value() default ""; |
||||||
|
} |
@ -0,0 +1,97 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 2005-2018 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.annotation; |
||||||
|
|
||||||
|
import java.lang.annotation.*; |
||||||
|
import static java.lang.annotation.ElementType.*; |
||||||
|
import static java.lang.annotation.RetentionPolicy.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* The <code>PostConstruct</code> annotation is used on a method that |
||||||
|
* needs to be executed after dependency injection is done to perform |
||||||
|
* any initialization. This method must be invoked before the class
|
||||||
|
* is put into service. This annotation must be supported on all classes |
||||||
|
* that support dependency injection. The method annotated with |
||||||
|
* <code>PostConstruct</code> must be invoked even if the class does |
||||||
|
* not request any resources to be injected. Only one |
||||||
|
* method in a given class can be annotated with this annotation. |
||||||
|
* The method on which the <code>PostConstruct</code> annotation is |
||||||
|
* applied must fulfill all of the following criteria: |
||||||
|
* <ul> |
||||||
|
* <li>The method must not have any parameters except in the case of |
||||||
|
* interceptors in which case it takes an <code>InvocationContext</code> |
||||||
|
* object as defined by the Interceptors specification.</li> |
||||||
|
* <li>The method defined on an interceptor class or superclass of an |
||||||
|
* interceptor class must have one of the following signatures: |
||||||
|
* <p> |
||||||
|
* void <METHOD>(InvocationContext) |
||||||
|
* <p> |
||||||
|
* Object <METHOD>(InvocationContext) throws Exception |
||||||
|
* <p> |
||||||
|
* <i>Note: A PostConstruct interceptor method must not throw application |
||||||
|
* exceptions, but it may be declared to throw checked exceptions including |
||||||
|
* the java.lang.Exception if the same interceptor method interposes on |
||||||
|
* business or timeout methods in addition to lifecycle events. If a |
||||||
|
* PostConstruct interceptor method returns a value, it is ignored by |
||||||
|
* the container.</i> |
||||||
|
* </li> |
||||||
|
* <li>The method defined on a non-interceptor class must have the |
||||||
|
* following signature: |
||||||
|
* <p> |
||||||
|
* void <METHOD>() |
||||||
|
* </li> |
||||||
|
* <li>The method on which the <code>PostConstruct</code> annotation |
||||||
|
* is applied may be public, protected, package private or private.</li> |
||||||
|
* <li>The method must not be static except for the application client.</li> |
||||||
|
* <li>The method should not be final.</li> |
||||||
|
* <li>If the method throws an unchecked exception the class must not be put into |
||||||
|
* service except in the case where the exception is handled by an |
||||||
|
* interceptor.</li></ul> |
||||||
|
* |
||||||
|
* @see javax.annotation.PreDestroy |
||||||
|
* @see javax.annotation.Resource |
||||||
|
* @since 1.6, Common Annotations 1.0 |
||||||
|
*/ |
||||||
|
@Documented |
||||||
|
@Retention (RUNTIME) |
||||||
|
@Target(METHOD) |
||||||
|
public @interface PostConstruct { |
||||||
|
} |
@ -0,0 +1,97 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 2005-2018 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.annotation; |
||||||
|
|
||||||
|
import java.lang.annotation.*; |
||||||
|
import static java.lang.annotation.ElementType.*; |
||||||
|
import static java.lang.annotation.RetentionPolicy.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* The <code>PreDestroy</code> annotation is used on a method as a |
||||||
|
* callback notification to signal that the instance is in the |
||||||
|
* process of being removed by the container. The method annotated |
||||||
|
* with <code>PreDestroy</code> is typically used to |
||||||
|
* release resources that it has been holding. This annotation must be |
||||||
|
* supported by all container-managed objects that support the use of |
||||||
|
* the <code>PostConstruct</code> annotation except the Java EE application |
||||||
|
* client. The method on which the <code>PreDestroy</code> annotation |
||||||
|
* is applied must fulfill all of the following criteria: |
||||||
|
* <ul> |
||||||
|
* <li>The method must not have any parameters except in the case of |
||||||
|
* interceptors in which case it takes an <code>InvocationContext</code> |
||||||
|
* object as defined by the Interceptors specification.</li> |
||||||
|
* <li>The method defined on an interceptor class or superclass of an |
||||||
|
* interceptor class must have one of the following signatures: |
||||||
|
* <p> |
||||||
|
* void <METHOD>(InvocationContext) |
||||||
|
* <p> |
||||||
|
* Object <METHOD>(InvocationContext) throws Exception |
||||||
|
* <p> |
||||||
|
* <i>Note: A PreDestroy interceptor method must not throw application |
||||||
|
* exceptions, but it may be declared to throw checked exceptions including |
||||||
|
* the java.lang.Exception if the same interceptor method interposes on |
||||||
|
* business or timeout methods in addition to lifecycle events. If a |
||||||
|
* PreDestroy interceptor method returns a value, it is ignored by |
||||||
|
* the container.</i> |
||||||
|
* </li> |
||||||
|
* <li>The method defined on a non-interceptor class must have the |
||||||
|
* following signature: |
||||||
|
* <p> |
||||||
|
* void <METHOD>() |
||||||
|
* </li> |
||||||
|
* <li>The method on which PreDestroy is applied may be public, protected, |
||||||
|
* package private or private.</li> |
||||||
|
* <li>The method must not be static.</li> |
||||||
|
* <li>The method should not be final.</li> |
||||||
|
* <li>If the method throws an unchecked exception it is ignored by |
||||||
|
* the container.</li> |
||||||
|
* </ul> |
||||||
|
* |
||||||
|
* @see javax.annotation.PostConstruct |
||||||
|
* @see javax.annotation.Resource |
||||||
|
* @since 1.6, Common Annotations 1.0 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Documented |
||||||
|
@Retention (RUNTIME) |
||||||
|
@Target(METHOD) |
||||||
|
public @interface PreDestroy { |
||||||
|
} |
@ -0,0 +1,74 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 2005-2018 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.annotation; |
||||||
|
|
||||||
|
import java.lang.annotation.*; |
||||||
|
import static java.lang.annotation.ElementType.*; |
||||||
|
import static java.lang.annotation.RetentionPolicy.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* The <code>Priority</code> annotation can be applied to classes |
||||||
|
* or parameters to indicate in what order they should be used. |
||||||
|
* The effect of using the <code>Priority</code> annotation in |
||||||
|
* any particular instance is defined by other specifications that |
||||||
|
* define the use of a specific class. |
||||||
|
* <p> |
||||||
|
* For example, the Interceptors specification defines the use of |
||||||
|
* priorities on interceptors to control the order in which |
||||||
|
* interceptors are called.</p> |
||||||
|
* <p> |
||||||
|
* Priority values should generally be non-negative, with negative values |
||||||
|
* reserved for special meanings such as "undefined" or "not specified". |
||||||
|
* A specification that defines use of the <code>Priority</code> annotation may define |
||||||
|
* the range of allowed priorities and any priority values with special |
||||||
|
* meaning.</p> |
||||||
|
* |
||||||
|
* @since Common Annotations 1.2 |
||||||
|
*/ |
||||||
|
@Target({TYPE,PARAMETER}) |
||||||
|
@Retention(RUNTIME) |
||||||
|
@Documented |
||||||
|
public @interface Priority { |
||||||
|
/** |
||||||
|
* The priority value. |
||||||
|
*/ |
||||||
|
int value(); |
||||||
|
} |
@ -0,0 +1,143 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 2005-2018 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.annotation; |
||||||
|
|
||||||
|
import java.lang.annotation.*; |
||||||
|
import static java.lang.annotation.ElementType.*; |
||||||
|
import static java.lang.annotation.RetentionPolicy.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* The <code>Resource</code> annotation marks a resource that is needed |
||||||
|
* by the application. This annotation may be applied to an |
||||||
|
* application component class, or to fields or methods of the |
||||||
|
* component class. When the annotation is applied to a |
||||||
|
* field or method, the container will inject an instance |
||||||
|
* of the requested resource into the application component |
||||||
|
* when the component is initialized. If the annotation is |
||||||
|
* applied to the component class, the annotation declares a |
||||||
|
* resource that the application will look up at runtime. |
||||||
|
* <p> |
||||||
|
* Even though this annotation is not marked <code>Inherited</code>, deployment |
||||||
|
* tools are required to examine all superclasses of any component |
||||||
|
* class to discover all uses of this annotation in all superclasses. |
||||||
|
* All such annotation instances specify resources that are needed |
||||||
|
* by the application component. Note that this annotation may |
||||||
|
* appear on private fields and methods of superclasses; the container |
||||||
|
* is required to perform injection in these cases as well.</p> |
||||||
|
* |
||||||
|
* @since 1.6, Common Annotations 1.0 |
||||||
|
*/ |
||||||
|
@Target({TYPE, FIELD, METHOD}) |
||||||
|
@Retention(RUNTIME) |
||||||
|
@Repeatable(Resources.class) |
||||||
|
public @interface Resource { |
||||||
|
/** |
||||||
|
* The JNDI name of the resource. For field annotations, |
||||||
|
* the default is the field name. For method annotations, |
||||||
|
* the default is the JavaBeans property name corresponding |
||||||
|
* to the method. For class annotations, there is no default |
||||||
|
* and this must be specified. |
||||||
|
*/ |
||||||
|
String name() default ""; |
||||||
|
|
||||||
|
/** |
||||||
|
* The name of the resource that the reference points to. It can |
||||||
|
* link to any compatible resource using the global JNDI names. |
||||||
|
* |
||||||
|
* @since 1.7, Common Annotations 1.1 |
||||||
|
*/ |
||||||
|
|
||||||
|
String lookup() default ""; |
||||||
|
|
||||||
|
/** |
||||||
|
* The Java type of the resource. For field annotations, |
||||||
|
* the default is the type of the field. For method annotations, |
||||||
|
* the default is the type of the JavaBeans property. |
||||||
|
* For class annotations, there is no default and this must be |
||||||
|
* specified. |
||||||
|
*/ |
||||||
|
Class<?> type() default java.lang.Object.class; |
||||||
|
|
||||||
|
/** |
||||||
|
* The two possible authentication types for a resource. |
||||||
|
*/ |
||||||
|
enum AuthenticationType { |
||||||
|
CONTAINER, |
||||||
|
APPLICATION |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* The authentication type to use for this resource. |
||||||
|
* This may be specified for resources representing a |
||||||
|
* connection factory of any supported type, and must |
||||||
|
* not be specified for resources of other types. |
||||||
|
*/ |
||||||
|
AuthenticationType authenticationType() default AuthenticationType.CONTAINER; |
||||||
|
|
||||||
|
/** |
||||||
|
* Indicates whether this resource can be shared between |
||||||
|
* this component and other components. |
||||||
|
* This may be specified for resources representing a |
||||||
|
* connection factory of any supported type, and must |
||||||
|
* not be specified for resources of other types. |
||||||
|
*/ |
||||||
|
boolean shareable() default true; |
||||||
|
|
||||||
|
/** |
||||||
|
* A product-specific name that this resource should be mapped to. |
||||||
|
* The <code>mappedName</code> element provides for mapping the |
||||||
|
* resource reference to the name of a resource known to the |
||||||
|
* applicaiton server. The mapped name could be of any form. |
||||||
|
* <p>Application servers are not required to support any particular |
||||||
|
* form or type of mapped name, nor the ability to use mapped names. |
||||||
|
* The mapped name is product-dependent and often installation-dependent. |
||||||
|
* No use of a mapped name is portable.</p> |
||||||
|
*/ |
||||||
|
String mappedName() default ""; |
||||||
|
|
||||||
|
/** |
||||||
|
* Description of this resource. The description is expected |
||||||
|
* to be in the default language of the system on which the |
||||||
|
* application is deployed. The description can be presented |
||||||
|
* to the Deployer to help in choosing the correct resource. |
||||||
|
*/ |
||||||
|
String description() default ""; |
||||||
|
} |
@ -0,0 +1,61 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 2005-2018 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.annotation; |
||||||
|
import java.lang.annotation.*; |
||||||
|
import static java.lang.annotation.ElementType.*; |
||||||
|
import static java.lang.annotation.RetentionPolicy.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* This class is used to allow multiple resources declarations. |
||||||
|
* |
||||||
|
* @see javax.annotation.Resource |
||||||
|
* @since 1.6, Common Annotations 1.0 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Documented |
||||||
|
@Retention(RUNTIME) |
||||||
|
@Target(TYPE) |
||||||
|
public @interface Resources { |
||||||
|
/** |
||||||
|
* Array used for multiple resource declarations. |
||||||
|
*/ |
||||||
|
Resource[] value(); |
||||||
|
} |
@ -0,0 +1,47 @@ |
|||||||
|
<!-- |
||||||
|
|
||||||
|
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
|
||||||
|
Copyright (c) 2005-2018 Oracle and/or its affiliates. All rights reserved. |
||||||
|
|
||||||
|
The contents of this file are subject to the terms of either the GNU |
||||||
|
General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
may not use this file except in compliance with the License. You can |
||||||
|
obtain a copy of the License at |
||||||
|
https://oss.oracle.com/licenses/CDDL+GPL-1.1 |
||||||
|
or LICENSE.txt. See the License for the specific |
||||||
|
language governing permissions and limitations under the License. |
||||||
|
|
||||||
|
When distributing the software, include this License Header Notice in each |
||||||
|
file and include the License file at LICENSE.txt. |
||||||
|
|
||||||
|
GPL Classpath Exception: |
||||||
|
Oracle designates this particular file as subject to the "Classpath" |
||||||
|
exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
file that accompanied this code. |
||||||
|
|
||||||
|
Modifications: |
||||||
|
If applicable, add the following below the License Header, with the fields |
||||||
|
enclosed by brackets [] replaced by your own identifying information: |
||||||
|
"Portions Copyright [year] [name of copyright owner]" |
||||||
|
|
||||||
|
Contributor(s): |
||||||
|
If you wish your version of this file to be governed by only the CDDL or |
||||||
|
only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
recipient has the option to distribute your version of this file under |
||||||
|
either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
only if the new code is made subject to such option by the copyright |
||||||
|
holder. |
||||||
|
|
||||||
|
--> |
||||||
|
|
||||||
|
<html> |
||||||
|
<body> |
||||||
|
This package defines the common annotations. |
||||||
|
</body> |
||||||
|
</html> |
@ -0,0 +1,61 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 2005-2018 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.annotation.security; |
||||||
|
import java.lang.annotation.*; |
||||||
|
import static java.lang.annotation.ElementType.*; |
||||||
|
import static java.lang.annotation.RetentionPolicy.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* Used by application to declare security roles. It can be |
||||||
|
* specified on a class. The value of the <code>DeclareRoles</code> |
||||||
|
* annotation is a list of security role names. |
||||||
|
* |
||||||
|
* @since Common Annotations 1.0 |
||||||
|
*/ |
||||||
|
@Documented |
||||||
|
@Retention (RUNTIME) |
||||||
|
@Target(TYPE) |
||||||
|
public @interface DeclareRoles { |
||||||
|
/** |
||||||
|
* List of security role names. |
||||||
|
*/ |
||||||
|
String[] value(); |
||||||
|
} |
@ -0,0 +1,58 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 2005-2018 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.annotation.security; |
||||||
|
import java.lang.annotation.*; |
||||||
|
import static java.lang.annotation.ElementType.*; |
||||||
|
import static java.lang.annotation.RetentionPolicy.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* Specifies that no security roles are allowed to invoke the specified |
||||||
|
* method(s). |
||||||
|
* |
||||||
|
* @see javax.annotation.security.RolesAllowed |
||||||
|
* @see javax.annotation.security.PermitAll |
||||||
|
* @since Common Annotations 1.0 |
||||||
|
*/ |
||||||
|
@Documented |
||||||
|
@Retention (RUNTIME) |
||||||
|
@Target({TYPE, METHOD}) |
||||||
|
public @interface DenyAll { |
||||||
|
} |
@ -0,0 +1,66 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 2005-2018 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.annotation.security; |
||||||
|
import java.lang.annotation.*; |
||||||
|
import static java.lang.annotation.ElementType.*; |
||||||
|
import static java.lang.annotation.RetentionPolicy.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* Specifies that all security roles are allowed to invoke the specified |
||||||
|
* method(s) — i.e., that the specified method(s) are "unchecked". |
||||||
|
* It can be specified on a class or on methods. Specifying it on the class
|
||||||
|
* means that it applies to all methods of the class. If specified at the |
||||||
|
* method level, it only affects that method. If the <code>RolesAllowed</code> |
||||||
|
* annotation is specified at the class level and this annotation is |
||||||
|
* applied at the method level, the <code>PermitAll</code> |
||||||
|
* annotation overrides the <code>RolesAllowed</code> annotation for |
||||||
|
* the specified method. |
||||||
|
* |
||||||
|
* @see javax.annotation.security.RolesAllowed |
||||||
|
* @see javax.annotation.security.DenyAll |
||||||
|
* |
||||||
|
* @since Common Annotations 1.0 |
||||||
|
*/ |
||||||
|
@Documented |
||||||
|
@Retention (RUNTIME) |
||||||
|
@Target({TYPE, METHOD}) |
||||||
|
public @interface PermitAll { |
||||||
|
} |
@ -0,0 +1,66 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 2005-2018 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.annotation.security; |
||||||
|
import java.lang.annotation.*; |
||||||
|
import static java.lang.annotation.ElementType.*; |
||||||
|
import static java.lang.annotation.RetentionPolicy.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* Specifies the list of security roles permitted to access method(s) in an |
||||||
|
* application. The value of the <code>RolesAllowed</code> annotation |
||||||
|
* is a list of security role names. |
||||||
|
* This annotation can be specified on a class or on method(s). Specifying it |
||||||
|
* at a class level means that it applies to all the methods in the class. |
||||||
|
* Specifying it on a method means that it is applicable to that method only. |
||||||
|
* If applied at both the class and methods level, the method value overrides |
||||||
|
* the class value if the two conflict. |
||||||
|
* |
||||||
|
* @since Common Annotations 1.0 |
||||||
|
*/ |
||||||
|
@Documented |
||||||
|
@Retention (RUNTIME) |
||||||
|
@Target({TYPE, METHOD}) |
||||||
|
public @interface RolesAllowed { |
||||||
|
/** |
||||||
|
* List of roles that are permitted access. |
||||||
|
*/ |
||||||
|
String[] value(); |
||||||
|
} |
@ -0,0 +1,62 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 2005-2018 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.annotation.security; |
||||||
|
import java.lang.annotation.*; |
||||||
|
import static java.lang.annotation.ElementType.*; |
||||||
|
import static java.lang.annotation.RetentionPolicy.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* Defines the identity of the application during execution. |
||||||
|
* This allows developers to execute an application under a particular role. |
||||||
|
* The role must map to the user / group information in the container's |
||||||
|
* security realm. Its value is the name of a security role. |
||||||
|
* |
||||||
|
* @since Common Annotations 1.0 |
||||||
|
*/ |
||||||
|
@Documented |
||||||
|
@Retention (RUNTIME) |
||||||
|
@Target(TYPE) |
||||||
|
public @interface RunAs { |
||||||
|
/** |
||||||
|
* Name of a security role. |
||||||
|
*/ |
||||||
|
String value(); |
||||||
|
} |
@ -0,0 +1,47 @@ |
|||||||
|
<!-- |
||||||
|
|
||||||
|
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
|
||||||
|
Copyright (c) 2005-2018 Oracle and/or its affiliates. All rights reserved. |
||||||
|
|
||||||
|
The contents of this file are subject to the terms of either the GNU |
||||||
|
General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
may not use this file except in compliance with the License. You can |
||||||
|
obtain a copy of the License at |
||||||
|
https://oss.oracle.com/licenses/CDDL+GPL-1.1 |
||||||
|
or LICENSE.txt. See the License for the specific |
||||||
|
language governing permissions and limitations under the License. |
||||||
|
|
||||||
|
When distributing the software, include this License Header Notice in each |
||||||
|
file and include the License file at LICENSE.txt. |
||||||
|
|
||||||
|
GPL Classpath Exception: |
||||||
|
Oracle designates this particular file as subject to the "Classpath" |
||||||
|
exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
file that accompanied this code. |
||||||
|
|
||||||
|
Modifications: |
||||||
|
If applicable, add the following below the License Header, with the fields |
||||||
|
enclosed by brackets [] replaced by your own identifying information: |
||||||
|
"Portions Copyright [year] [name of copyright owner]" |
||||||
|
|
||||||
|
Contributor(s): |
||||||
|
If you wish your version of this file to be governed by only the CDDL or |
||||||
|
only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
recipient has the option to distribute your version of this file under |
||||||
|
either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
only if the new code is made subject to such option by the copyright |
||||||
|
holder. |
||||||
|
|
||||||
|
--> |
||||||
|
|
||||||
|
<html> |
||||||
|
<body> |
||||||
|
This package contains the security common annotations. |
||||||
|
</body> |
||||||
|
</html> |
@ -0,0 +1,337 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 2009-2018 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.annotation.sql; |
||||||
|
|
||||||
|
import java.lang.annotation.*; |
||||||
|
import java.lang.annotation.Target; |
||||||
|
import java.lang.annotation.Retention; |
||||||
|
import java.lang.annotation.ElementType; |
||||||
|
import java.lang.annotation.RetentionPolicy; |
||||||
|
|
||||||
|
/** |
||||||
|
* Annotation used to define a container <code>DataSource</code> to |
||||||
|
* be registered with JNDI. The <code>DataSource</code> may be configured by |
||||||
|
* setting the annotation elements for commonly used <code>DataSource</code> |
||||||
|
* properties. Additional standard and vendor-specific properties may be |
||||||
|
* specified using the <code>properties</code> element. |
||||||
|
* <p> |
||||||
|
* |
||||||
|
* The data source will be registered under the name specified in the |
||||||
|
* <code>name</code> element. It may be defined to be in any valid |
||||||
|
* Java EE namespace, which will determine the accessibility of |
||||||
|
* the data source from other components. |
||||||
|
* <p> |
||||||
|
* A JDBC driver implementation class of the appropriate type, either |
||||||
|
* <code>DataSource</code>, <code>ConnectionPoolDataSource</code>, or |
||||||
|
* <code>XADataSource</code>, must be indicated by the <code>className</code> |
||||||
|
* element. The availability of the driver class will be assumed at runtime. |
||||||
|
*<p> |
||||||
|
* DataSource properties should not be specified more than once. If |
||||||
|
* the url annotation element contains a DataSource property that was also |
||||||
|
* specified using the corresponding annotation element or was specified in |
||||||
|
* the properties annotation element, the precedence order is undefined |
||||||
|
* and implementation specific: |
||||||
|
* <p> |
||||||
|
* <pre> |
||||||
|
* @DataSourceDefinition(name="java:global/MyApp/MyDataSource", |
||||||
|
* className="org.apache.derby.jdbc.ClientDataSource", |
||||||
|
* url="jdbc:derby://localhost:1527/myDB;user=bill", |
||||||
|
* user="lance", |
||||||
|
* password="secret", |
||||||
|
* databaseName="testDB", |
||||||
|
* serverName="luckydog" |
||||||
|
* )// DO NOT DO THIS!!!
|
||||||
|
* </pre> |
||||||
|
* <p> |
||||||
|
* In the above example, the <code>databaseName</code>, <code>user</code> |
||||||
|
* and <code>serverName</code> properties were specified as part of the |
||||||
|
* <code>url</code> property and using the corresponding |
||||||
|
* annotation elements. This should be avoided. |
||||||
|
* <p> |
||||||
|
* If the <code>properties</code> annotation element is used and contains a |
||||||
|
* DataSource property that was also specified using the corresponding |
||||||
|
* annotation element, the annotation element value takes precedence. |
||||||
|
* For example: |
||||||
|
* <p> |
||||||
|
* <pre> |
||||||
|
* @DataSourceDefinition(name="java:global/MyApp/MyDataSource", |
||||||
|
* className="org.apache.derby.jdbc.ClientDataSource", |
||||||
|
* user="lance", |
||||||
|
* password="secret", |
||||||
|
* databaseName="testDB", |
||||||
|
* serverName="luckydog", |
||||||
|
* properties= {"databaseName=myDB", "databaseProp=doThis"} |
||||||
|
* )// DO NOT DO THIS!!!
|
||||||
|
* </pre> |
||||||
|
* <p> |
||||||
|
* This would result in the following values being used when configuring |
||||||
|
* the DataSource: |
||||||
|
* <ul> |
||||||
|
* <li>serverName=luckydog</li> |
||||||
|
* <li>portNumber=1527</li> |
||||||
|
* <li>databaseName=testDB</li> |
||||||
|
* <li>user=lance</li> |
||||||
|
* <li>password=secret</li> |
||||||
|
* <li>databaseProp=doThis</li> |
||||||
|
* </ul> |
||||||
|
* <p> |
||||||
|
* Vendors are not required to support properties that do not normally |
||||||
|
* apply to a specific data source type. For example, specifying the |
||||||
|
* <code>transactional</code> property to be <code>true</code> but supplying |
||||||
|
* a value for <code>className</code> that implements a data source class
|
||||||
|
* other than <code>XADataSource</code> may not be supported. |
||||||
|
* <p> |
||||||
|
* Vendor-specific properties may be combined with or used to |
||||||
|
* override standard data source properties defined using this annotation. |
||||||
|
* <p> |
||||||
|
* <code>DataSource</code> properties that are specified and are not supported |
||||||
|
* in a given configuration or cannot be mapped to a vendor specific |
||||||
|
* configuration property may be ignored. |
||||||
|
* <p> |
||||||
|
* Examples: |
||||||
|
* <br> |
||||||
|
* <pre> |
||||||
|
* @DataSourceDefinition(name="java:global/MyApp/MyDataSource", |
||||||
|
* className="com.foobar.MyDataSource", |
||||||
|
* portNumber=6689, |
||||||
|
* serverName="myserver.com", |
||||||
|
* user="lance", |
||||||
|
* password="secret" |
||||||
|
* ) |
||||||
|
* |
||||||
|
* </pre> |
||||||
|
* <p> |
||||||
|
* Using a <code>URL</code>: |
||||||
|
* <br> |
||||||
|
* <pre> |
||||||
|
* @DataSourceDefinition(name="java:global/MyApp/MyDataSource", |
||||||
|
* className="org.apache.derby.jdbc.ClientDataSource", |
||||||
|
* url="jdbc:derby://localhost:1527/myDB", |
||||||
|
* user="lance", |
||||||
|
* password="secret" |
||||||
|
* ) |
||||||
|
* </pre> |
||||||
|
* <p> |
||||||
|
* An example lookup of the DataSource from an EJB: |
||||||
|
* <pre> |
||||||
|
* @Stateless |
||||||
|
* public class MyStatelessEJB { |
||||||
|
* @Resource(lookup="java:global/MyApp/myDataSource") |
||||||
|
* DataSource myDB; |
||||||
|
* ... |
||||||
|
* } |
||||||
|
* </pre> |
||||||
|
* <p> |
||||||
|
* @see javax.sql.DataSource |
||||||
|
* @see javax.sql.XADataSource |
||||||
|
* @see javax.sql.ConnectionPoolDataSource |
||||||
|
* @since Common Annotations 1.1 |
||||||
|
*/ |
||||||
|
@Target({ElementType.TYPE}) |
||||||
|
@Retention(RetentionPolicy.RUNTIME) |
||||||
|
@Repeatable(DataSourceDefinitions.class) |
||||||
|
public @interface DataSourceDefinition { |
||||||
|
|
||||||
|
/** |
||||||
|
* JNDI name by which the data source will be registered. |
||||||
|
* @since 1.1 |
||||||
|
*/ |
||||||
|
String name(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Name of a DataSource class that implements |
||||||
|
* <code>javax.sql.DataSource</code> or <code>javax.sql.XADataSource</code> |
||||||
|
* or <code>javax.sql.ConnectionPoolDataSource</code>. |
||||||
|
* @since 1.1 |
||||||
|
*/ |
||||||
|
String className(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Description of this data source |
||||||
|
* @since 1.1 |
||||||
|
*/ |
||||||
|
String description() default ""; |
||||||
|
|
||||||
|
/** |
||||||
|
* A JDBC URL. If the <code>url</code> annotation element contains a |
||||||
|
* DataSource property that was also specified using the corresponding |
||||||
|
* annotation element, the precedence order is undefined and |
||||||
|
* implementation specific. |
||||||
|
* @since 1.1 |
||||||
|
*/ |
||||||
|
String url() default ""; |
||||||
|
|
||||||
|
/** |
||||||
|
* User name to use for connection authentication. |
||||||
|
* @since 1.1 |
||||||
|
*/ |
||||||
|
String user() default ""; |
||||||
|
|
||||||
|
/** |
||||||
|
* Password to use for connection authentication. |
||||||
|
* @since 1.1 |
||||||
|
*/ |
||||||
|
String password() default ""; |
||||||
|
|
||||||
|
/** |
||||||
|
* Name of a database on a server. |
||||||
|
* @since 1.1 |
||||||
|
*/ |
||||||
|
String databaseName() default ""; |
||||||
|
|
||||||
|
/** |
||||||
|
* Port number where a server is listening for requests. |
||||||
|
* @since 1.1 |
||||||
|
*/ |
||||||
|
int portNumber() default -1; |
||||||
|
|
||||||
|
/** |
||||||
|
* Database server name. |
||||||
|
* @since 1.1 |
||||||
|
*/ |
||||||
|
String serverName() default "localhost"; |
||||||
|
|
||||||
|
/** |
||||||
|
* Isolation level for connections. The Isolation level |
||||||
|
* must be one of the following: |
||||||
|
* <p> |
||||||
|
* <ul> |
||||||
|
* <li>Connection.TRANSACTION_NONE, |
||||||
|
* <li>Connection.TRANSACTION_READ_ UNCOMMITTED, |
||||||
|
* <li>Connection.TRANSACTION_READ_COMMITTED, |
||||||
|
* <li>Connection.TRANSACTION_REPEATABLE_READ, |
||||||
|
* <li>Connection.TRANSACTION_SERIALIZABLE |
||||||
|
*</ul> |
||||||
|
* <p> |
||||||
|
* Default is vendor-specific. |
||||||
|
* @since 1.1 |
||||||
|
*/ |
||||||
|
int isolationLevel() default -1; |
||||||
|
|
||||||
|
/** |
||||||
|
* Set to <code>false</code> if connections should not participate |
||||||
|
* in transactions. |
||||||
|
* <p> |
||||||
|
* Default is to enlist in a transaction when one is active or becomes |
||||||
|
* active. |
||||||
|
* @since 1.1 |
||||||
|
*/ |
||||||
|
boolean transactional() default true; |
||||||
|
|
||||||
|
/** |
||||||
|
* Number of connections that should be created when a connection pool |
||||||
|
* is initialized. |
||||||
|
* <p> |
||||||
|
* Default is vendor-specific |
||||||
|
* @since 1.1 |
||||||
|
*/ |
||||||
|
int initialPoolSize() default -1; |
||||||
|
|
||||||
|
/** |
||||||
|
* Maximum number of connections that should be concurrently allocated for a |
||||||
|
* connection pool. |
||||||
|
* <p> |
||||||
|
* Default is vendor-specific. |
||||||
|
* @since 1.1 |
||||||
|
*/ |
||||||
|
int maxPoolSize() default -1; |
||||||
|
|
||||||
|
/** |
||||||
|
* Minimum number of connections that should be allocated for a |
||||||
|
* connection pool. |
||||||
|
* <p> |
||||||
|
* Default is vendor-specific. |
||||||
|
* @since 1.1 |
||||||
|
*/ |
||||||
|
int minPoolSize() default -1; |
||||||
|
|
||||||
|
/** |
||||||
|
* The number of seconds that a physical connection |
||||||
|
* should remain unused in the pool before the |
||||||
|
* connection is closed for a connection pool. |
||||||
|
* <p> |
||||||
|
* Default is vendor-specific |
||||||
|
* @since 1.1 |
||||||
|
*/ |
||||||
|
int maxIdleTime() default -1; |
||||||
|
|
||||||
|
/** |
||||||
|
* The total number of statements that a connection pool should keep open. |
||||||
|
* A value of 0 indicates that the caching of statements is disabled for |
||||||
|
* a connection pool. |
||||||
|
* <p> |
||||||
|
* Default is vendor-specific |
||||||
|
* @since 1.1 |
||||||
|
*/ |
||||||
|
int maxStatements() default -1; |
||||||
|
/** |
||||||
|
* Used to specify vendor-specific properties and less commonly |
||||||
|
* used <code>DataSource</code> properties such as: |
||||||
|
* <p> |
||||||
|
* <ul> |
||||||
|
* <li>dataSourceName |
||||||
|
* <li>networkProtocol |
||||||
|
* <li>propertyCycle |
||||||
|
* <li>roleName |
||||||
|
* </ul> |
||||||
|
* <p> |
||||||
|
* Properties are specified using the format: |
||||||
|
* <i>propertyName=propertyValue</i> with one property per array element. |
||||||
|
* <p> |
||||||
|
* If a DataSource property is specified in the <code>properties</code> |
||||||
|
* element and the annotation element for the property is also |
||||||
|
* specified, the annotation element value takes precedence. |
||||||
|
* @since 1.1 |
||||||
|
*/ |
||||||
|
String[] properties() default {}; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Sets the maximum time in seconds that this data source will wait while |
||||||
|
* attempting to connect to a database. A value of zero specifies that |
||||||
|
* the timeout is the default system timeout if there is one; otherwise, |
||||||
|
* it specifies that there is no timeout. |
||||||
|
* <p> |
||||||
|
* Default is vendor-specific. |
||||||
|
* @since 1.1 |
||||||
|
*/ |
||||||
|
int loginTimeout() default 0; |
||||||
|
} |
@ -0,0 +1,59 @@ |
|||||||
|
/* |
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
||||||
|
* |
||||||
|
* Copyright (c) 2009-2018 Oracle and/or its affiliates. All rights reserved. |
||||||
|
* |
||||||
|
* The contents of this file are subject to the terms of either the GNU |
||||||
|
* General Public License Version 2 only ("GPL") or the Common Development |
||||||
|
* and Distribution License("CDDL") (collectively, the "License"). You |
||||||
|
* may not use this file except in compliance with the License. You can |
||||||
|
* obtain a copy of the License at |
||||||
|
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
|
||||||
|
* or LICENSE.txt. See the License for the specific |
||||||
|
* language governing permissions and limitations under the License. |
||||||
|
* |
||||||
|
* When distributing the software, include this License Header Notice in each |
||||||
|
* file and include the License file at LICENSE.txt. |
||||||
|
* |
||||||
|
* GPL Classpath Exception: |
||||||
|
* Oracle designates this particular file as subject to the "Classpath" |
||||||
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
||||||
|
* file that accompanied this code. |
||||||
|
* |
||||||
|
* Modifications: |
||||||
|
* If applicable, add the following below the License Header, with the fields |
||||||
|
* enclosed by brackets [] replaced by your own identifying information: |
||||||
|
* "Portions Copyright [year] [name of copyright owner]" |
||||||
|
* |
||||||
|
* Contributor(s): |
||||||
|
* If you wish your version of this file to be governed by only the CDDL or |
||||||
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
||||||
|
* elects to include this software in this distribution under the [CDDL or GPL |
||||||
|
* Version 2] license." If you don't indicate a single choice of license, a |
||||||
|
* recipient has the option to distribute your version of this file under |
||||||
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
||||||
|
* its licensees as provided above. However, if you add GPL Version 2 code |
||||||
|
* and therefore, elected the GPL Version 2 license, then the option applies |
||||||
|
* only if the new code is made subject to such option by the copyright |
||||||
|
* holder. |
||||||
|
*/ |
||||||
|
|
||||||
|
package javax.annotation.sql; |
||||||
|
|
||||||
|
import java.lang.annotation.Target; |
||||||
|
import java.lang.annotation.Retention; |
||||||
|
import java.lang.annotation.ElementType; |
||||||
|
import java.lang.annotation.RetentionPolicy; |
||||||
|
|
||||||
|
/** |
||||||
|
* Declares one or more <code>DataSourceDefinition</code> annotations. |
||||||
|
* |
||||||
|
* @see javax.annotation.sql.DataSourceDefinition |
||||||
|
* @since Common Annotations 1.1 |
||||||
|
*/ |
||||||
|
@Target({ElementType.TYPE}) |
||||||
|
@Retention(RetentionPolicy.RUNTIME) |
||||||
|
public @interface DataSourceDefinitions { |
||||||
|
DataSourceDefinition[] value (); |
||||||
|
|
||||||
|
} |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue