This commit is contained in:
Lana Steuck 2014-08-28 14:54:07 -07:00
commit 1ced265b7d
391 changed files with 13873 additions and 8874 deletions

View file

@ -164,15 +164,15 @@ $(foreach R, $(JAVAX_SOUND_RULES), $(eval $(call addto_meta-inf_services, $R)))
################################################################################ ################################################################################
ifneq ($(OPENJDK_TARGET_OS), macosx) ifneq ($(OPENJDK_TARGET_OS), macosx)
OPENJDK_TARGET_OS_FLAVORMAP_PROPERTIES = $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/classes/sun/awt/datatransfer/flavormap.properties OPENJDK_TARGET_OS_FLAVORMAP_PROPERTIES = $(JDK_TOPDIR)/src/java.desktop/$(OPENJDK_TARGET_OS_API_DIR)/classes/sun/datatransfer/resources/flavormap.properties
else else
OPENJDK_TARGET_OS_FLAVORMAP_PROPERTIES = $(JDK_TOPDIR)/src/macosx/classes/sun/awt/datatransfer/flavormap.properties OPENJDK_TARGET_OS_FLAVORMAP_PROPERTIES = $(JDK_TOPDIR)/src/java.desktop/macosx/classes/sun/datatransfer/resources/flavormap.properties
endif endif
$(JDK_OUTPUTDIR)/classes/sun/awt/datatransfer/flavormap.properties: $(OPENJDK_TARGET_OS_FLAVORMAP_PROPERTIES) $(JDK_OUTPUTDIR)/classes/sun/datatransfer/resources/flavormap.properties: $(OPENJDK_TARGET_OS_FLAVORMAP_PROPERTIES)
$(install-file) $(install-file)
COPY_EXTRA += $(JDK_OUTPUTDIR)/classes/sun/awt/datatransfer/flavormap.properties COPY_EXTRA += $(JDK_OUTPUTDIR)/classes/sun/datatransfer/resources/flavormap.properties
################################################################################ ################################################################################

View file

@ -101,6 +101,9 @@ TOOL_TZDB = $(JAVA_SMALL) -cp $(JDK_OUTPUTDIR)/btclasses \
TOOL_BLACKLISTED_CERTS = $(JAVA_SMALL) -cp $(JDK_OUTPUTDIR)/btclasses \ TOOL_BLACKLISTED_CERTS = $(JAVA_SMALL) -cp $(JDK_OUTPUTDIR)/btclasses \
build.tools.blacklistedcertsconverter.BlacklistedCertsConverter build.tools.blacklistedcertsconverter.BlacklistedCertsConverter
TOOL_MAKEJAVASECURITY = $(JAVA_SMALL) -cp $(JDK_OUTPUTDIR)/btclasses \
build.tools.makejavasecurity.MakeJavaSecurity
# TODO: There are references to the jdwpgen.jar in jdk/make/netbeans/jdwpgen/build.xml # TODO: There are references to the jdwpgen.jar in jdk/make/netbeans/jdwpgen/build.xml
# and nbproject/project.properties in the same dir. Needs to be looked at. # and nbproject/project.properties in the same dir. Needs to be looked at.
@ -136,9 +139,6 @@ TOOL_GENMODULESXML = $(JAVA_SMALL) -Xbootclasspath/p:$(INTERIM_LANGTOOLS_JAR) \
-cp "$(JDK_OUTPUTDIR)/btclasses$(PATH_SEP)$(JDK_OUTPUTDIR)" \ -cp "$(JDK_OUTPUTDIR)/btclasses$(PATH_SEP)$(JDK_OUTPUTDIR)" \
build.tools.module.GenerateModulesXml build.tools.module.GenerateModulesXml
TOOL_ADDTORESTRICTEDPKGS = $(JAVA_SMALL) -cp $(JDK_OUTPUTDIR)/btclasses \
build.tools.addtorestrictedpkgs.AddToRestrictedPkgs
########################################################################################## ##########################################################################################
# Tools needed on solaris because OBJCOPY is broken. # Tools needed on solaris because OBJCOPY is broken.

View file

@ -62,25 +62,18 @@ GENDATA += $(GENDATA_CURDATA)
########################################################################################## ##########################################################################################
PROPS_SRC := $(JDK_TOPDIR)/src/java.base/share/conf/security/java.security-$(OPENJDK_TARGET_OS) GENDATA_JAVA_SECURITY_SRC := $(JDK_TOPDIR)/src/java.base/share/conf/security/java.security
PROPS_DST := $(JDK_OUTPUTDIR)/lib/security/java.security GENDATA_JAVA_SECURITY := $(JDK_OUTPUTDIR)/lib/security/java.security
# Optionally set this variable to a file to add extra restricted packages. # RESTRICTED_PKGS_SRC is optionally set in custom extension for this makefile
ifneq ($(RESTRICTED_PKGS_SRC), )
$(PROPS_DST): $(PROPS_SRC) $(RESTRICTED_PKGS_SRC) $(GENDATA_JAVA_SECURITY): $(BUILD_TOOLS) $(GENDATA_JAVA_SECURITY_SRC) $(RESTRICTED_PKGS_SRC)
$(ECHO) "Generating java.security"
$(MKDIR) -p $(@D) $(MKDIR) -p $(@D)
$(TOOL_ADDTORESTRICTEDPKGS) $(PROPS_SRC) $@.tmp `$(CAT) $(RESTRICTED_PKGS_SRC) | $(TR) "\n" " "` $(TOOL_MAKEJAVASECURITY) $(GENDATA_JAVA_SECURITY_SRC) $@ $(OPENJDK_TARGET_OS) \
$(MV) $@.tmp $@ $(RESTRICTED_PKGS_SRC) || exit 1
else GENDATA += $(GENDATA_JAVA_SECURITY)
$(PROPS_DST): $(PROPS_SRC)
$(call install-file)
endif
GENDATA += $(PROPS_DST)
########################################################################################## ##########################################################################################

View file

@ -1,5 +1,5 @@
# #
# Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
# #
# This code is free software; you can redistribute it and/or modify it # This code is free software; you can redistribute it and/or modify it
@ -34,7 +34,8 @@ LOCALE_FILES := $(shell $(FIND) $(JDK_TOPDIR)/src/*/share/classes \
-name "TimeZoneNames_*.java" -o -name "TimeZoneNames_*.properties" -o \ -name "TimeZoneNames_*.java" -o -name "TimeZoneNames_*.properties" -o \
-name "LocaleNames_*.java" -o -name "LocaleNames_*.properties" -o \ -name "LocaleNames_*.java" -o -name "LocaleNames_*.properties" -o \
-name "CurrencyNames_*.java" -o -name "CurrencyNames_*.properties" -o \ -name "CurrencyNames_*.java" -o -name "CurrencyNames_*.properties" -o \
-name "CalendarData_*.java" -o -name "CalendarData_*.properties") -name "CalendarData_*.java" -o -name "CalendarData_*.properties" -o \
-name "BreakIteratorInfo_*.java" -o -name "BreakIteratorRules_*.java")
# Then translate the locale files into for example: FormatData_sv # Then translate the locale files into for example: FormatData_sv
LOCALE_RESOURCES := $(sort $(subst .properties,,$(subst .java,,$(notdir $(LOCALE_FILES))))) LOCALE_RESOURCES := $(sort $(subst .properties,,$(subst .java,,$(notdir $(LOCALE_FILES)))))
@ -86,6 +87,12 @@ $(eval $(call CaptureLocale,FormatData))
#sun.text.resources.CollationData #sun.text.resources.CollationData
$(eval $(call CaptureLocale,CollationData)) $(eval $(call CaptureLocale,CollationData))
#sun.text.resources.BreakIteratorInfo
$(eval $(call CaptureLocale,BreakIteratorInfo))
#sun.text.resources.BreakIteratorRules
$(eval $(call CaptureLocale,BreakIteratorRules))
#sun.util.resources.TimeZoneNames #sun.util.resources.TimeZoneNames
$(eval $(call CaptureLocale,TimeZoneNames)) $(eval $(call CaptureLocale,TimeZoneNames))

View file

@ -973,7 +973,6 @@ ifndef BUILD_HEADLESS_ONLY
# #
ifeq ($(OPENJDK_TARGET_OS), macosx) ifeq ($(OPENJDK_TARGET_OS), macosx)
LIBSPLASHSCREEN_CFLAGS += -F/System/Library/Frameworks/JavaVM.framework/Frameworks
LIBSPLASHSCREEN_CFLAGS += -DWITH_MACOSX LIBSPLASHSCREEN_CFLAGS += -DWITH_MACOSX
LIBSPLASHSCREEN_CFLAGS += -I$(JDK_TOPDIR)/src/java.desktop/macosx/native/libosxapp LIBSPLASHSCREEN_CFLAGS += -I$(JDK_TOPDIR)/src/java.desktop/macosx/native/libosxapp

View file

@ -1,105 +0,0 @@
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package build.tools.addtorestrictedpkgs;
import java.io.*;
/**
* Adds additional packages to the package.access and package.definition
* security properties.
*/
public class AddToRestrictedPkgs {
private static final String PKG_ACC = "package.access";
private static final String PKG_DEF = "package.definition";
private static final int PKG_ACC_INDENT = 15;
private static final int PKG_DEF_INDENT = 19;
public static void main(String[] args) throws Exception {
if (args.length < 3) {
System.err.println("Usage: java AddToRestrictedPkgs " +
"[input java.security file name] " +
"[output java.security file name] " +
"[packages ...]");
System.exit(1);
}
try (FileReader fr = new FileReader(args[0]);
BufferedReader br = new BufferedReader(fr);
FileWriter fw = new FileWriter(args[1]);
BufferedWriter bw = new BufferedWriter(fw))
{
// parse the file line-by-line, looking for pkg access properties
String line = br.readLine();
while (line != null) {
if (line.startsWith(PKG_ACC)) {
writePackages(br, bw, line, PKG_ACC_INDENT, args);
} else if (line.startsWith(PKG_DEF)) {
writePackages(br, bw, line, PKG_DEF_INDENT, args);
} else {
writeLine(bw, line);
}
line = br.readLine();
}
bw.flush();
}
}
private static void writePackages(BufferedReader br, BufferedWriter bw,
String line, int numSpaces,
String[] args) throws IOException {
// parse property until EOL, not including line breaks
while (line.endsWith("\\")) {
writeLine(bw, line);
line = br.readLine();
}
// append comma and line-break to last package
writeLine(bw, line + ",\\");
// add new packages, one per line
for (int i = 2; i < args.length - 1; i++) {
indent(bw, numSpaces);
writeLine(bw, args[i] + ",\\");
}
indent(bw, numSpaces);
writeLine(bw, args[args.length - 1]);
}
private static void writeLine(BufferedWriter bw, String line)
throws IOException
{
bw.write(line);
bw.newLine();
}
private static void indent(BufferedWriter bw, int numSpaces)
throws IOException
{
for (int i = 0; i < numSpaces; i++) {
bw.append(' ');
}
}
}

View file

@ -0,0 +1,168 @@
/*
* Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package build.tools.makejavasecurity;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;
/**
* Builds the java.security file, including
*
* 1. Adds additional packages to the package.access and
* package.definition security properties.
* 2. Filter out platform-unrelated parts
*
* In order to easily maintain platform-related entries, every item
* (including the last line) in package.access and package.definition
* MUST end with ',\'. A blank line MUST exist after the last line.
*/
public class MakeJavaSecurity {
private static final String PKG_ACC = "package.access";
private static final String PKG_DEF = "package.definition";
private static final int PKG_ACC_INDENT = 15;
private static final int PKG_DEF_INDENT = 19;
public static void main(String[] args) throws Exception {
if (args.length < 3) {
System.err.println("Usage: java MakeJavaSecurity " +
"[input java.security file name] " +
"[output java.security file name] " +
"[openjdk target os] " +
"[more restricted packages file name?]");
System.exit(1);
}
// more restricted packages
List<String> extraLines;
if (args.length == 4) {
extraLines = Files.readAllLines(Paths.get(args[3]));
} else {
extraLines = Collections.emptyList();
}
List<String> lines = new ArrayList<>();
// read raw java.security and add more restricted packages
try (FileReader fr = new FileReader(args[0]);
BufferedReader br = new BufferedReader(fr)) {
// looking for pkg access properties
String line = br.readLine();
while (line != null) {
if (line.startsWith(PKG_ACC)) {
addPackages(br, lines, line, PKG_ACC_INDENT, extraLines);
} else if (line.startsWith(PKG_DEF)) {
addPackages(br, lines, line, PKG_DEF_INDENT, extraLines);
} else {
lines.add(line);
}
line = br.readLine();
}
}
// Filter out platform-unrelated ones. We only support
// #ifdef, #ifndef, and #endif.
int mode = 0; // 0: out of block, 1: in match, 2: in non-match
Iterator<String> iter = lines.iterator();
while (iter.hasNext()) {
String line = iter.next();
if (line.startsWith("#endif")) {
mode = 0;
iter.remove();
} else if (line.startsWith("#ifdef ")) {
mode = line.endsWith(args[2])?1:2;
iter.remove();
} else if (line.startsWith("#ifndef ")) {
mode = line.endsWith(args[2])?2:1;
iter.remove();
} else {
if (mode == 2) iter.remove();
}
}
// Update .tbd to .1, .2, etc.
Map<String,Integer> count = new HashMap<>();
for (int i=0; i<lines.size(); i++) {
String line = lines.get(i);
int index = line.indexOf(".tbd");
if (index >= 0) {
String prefix = line.substring(0, index);
int n = count.getOrDefault(prefix, 1);
count.put(prefix, n+1);
lines.set(i, prefix + "." + n + line.substring(index+4));
}
}
// Clean up the last line of PKG_ACC and PKG_DEF blocks.
// Not really necessary since a blank line follows.
boolean inBlock = false;
for (int i=0; i<lines.size(); i++) {
String line = lines.get(i);
if (line.startsWith(PKG_ACC) || line.startsWith(PKG_DEF)) {
inBlock = true;
}
if (inBlock) {
if (line.isEmpty()) {
String lastLine = lines.get(i-1);
lines.set(i-1, lastLine.substring(0, lastLine.length()-2));
inBlock = false;
}
}
}
Files.write(Paths.get(args[1]), lines);
}
private static void addPackages(BufferedReader br, List<String> lines,
String line, int numSpaces,
List<String> args) throws IOException {
// parse property until EOL, not including line breaks
boolean first = true;
while (!line.isEmpty()) {
if (!line.startsWith("#")) {
if (!line.endsWith(",\\") ||
(!first && line.contains("="))) {
throw new IOException("Invalid line: " + line);
}
}
lines.add(line);
line = br.readLine();
first = false;
}
// add new packages, one per line
for (String arg: args) {
if (arg.startsWith("#")) {
lines.add(arg);
} else {
lines.add(String.format("%"+numSpaces+"s", "") + arg + ",\\");
}
}
lines.add(line);
}
}

View file

@ -1 +0,0 @@
string=This is Java 2D! (Default)

View file

@ -1 +0,0 @@
string=This is Java 2D! (German) \u00f6 \u00df \u00dc

View file

@ -1 +0,0 @@
string=This is Java 2D! (English) A B C

View file

@ -1 +0,0 @@
string=This is Java 2D! (English in Great Britain) \u0075 \u006b Z

View file

@ -1 +0,0 @@
string=Java 2D\u3067\u3059\u3002(\u30C7\u30D5\u30A9\u30EB\u30C8)

View file

@ -1 +0,0 @@
string=This is Java 2D! (Korean)

View file

@ -1 +0,0 @@
string=\u8FD9\u662F Java 2D! (\u9ED8\u8BA4\u503C)

View file

@ -1,5 +0,0 @@
en US
en GB
ko KO
ab KO
de DE

View file

@ -1322,7 +1322,7 @@ public final class Class<T> implements java.io.Serializable,
// (for anonymous classes): 1 or more digits. // (for anonymous classes): 1 or more digits.
// Since getSimpleBinaryName() will strip the binary name of // Since getSimpleBinaryName() will strip the binary name of
// the immediatly enclosing class, we are now looking at a // the immediately enclosing class, we are now looking at a
// string that matches the regular expression "\$[0-9]*" // string that matches the regular expression "\$[0-9]*"
// followed by a simple name (considering the simple of an // followed by a simple name (considering the simple of an
// anonymous class to be the empty string). // anonymous class to be the empty string).

View file

@ -205,7 +205,7 @@ public abstract class ClassLoader {
} }
/** /**
* Registers the given class loader type as parallel capabale. * Registers the given class loader type as parallel capable.
* Returns {@code true} is successfully registered; {@code false} if * Returns {@code true} is successfully registered; {@code false} if
* loader's super class is not registered. * loader's super class is not registered.
*/ */
@ -832,7 +832,7 @@ public abstract class ClassLoader {
{ {
int len = b.remaining(); int len = b.remaining();
// Use byte[] if not a direct ByteBufer: // Use byte[] if not a direct ByteBuffer:
if (!b.isDirect()) { if (!b.isDirect()) {
if (b.hasArray()) { if (b.hasArray()) {
return defineClass(name, b.array(), return defineClass(name, b.array(),

View file

@ -196,19 +196,19 @@ class StringCoding {
static char[] decode(Charset cs, byte[] ba, int off, int len) { static char[] decode(Charset cs, byte[] ba, int off, int len) {
// (1)We never cache the "external" cs, the only benefit of creating // (1)We never cache the "external" cs, the only benefit of creating
// an additional StringDe/Encoder object to wrap it is to share the // an additional StringDe/Encoder object to wrap it is to share the
// de/encode() method. These SD/E objects are short-lifed, the young-gen // de/encode() method. These SD/E objects are short-lived, the young-gen
// gc should be able to take care of them well. But the best approash // gc should be able to take care of them well. But the best approach
// is still not to generate them if not really necessary. // is still not to generate them if not really necessary.
// (2)The defensive copy of the input byte/char[] has a big performance // (2)The defensive copy of the input byte/char[] has a big performance
// impact, as well as the outgoing result byte/char[]. Need to do the // impact, as well as the outgoing result byte/char[]. Need to do the
// optimization check of (sm==null && classLoader0==null) for both. // optimization check of (sm==null && classLoader0==null) for both.
// (3)getClass().getClassLoader0() is expensive // (3)getClass().getClassLoader0() is expensive
// (4)There might be a timing gap in isTrusted setting. getClassLoader0() // (4)There might be a timing gap in isTrusted setting. getClassLoader0()
// is only chcked (and then isTrusted gets set) when (SM==null). It is // is only checked (and then isTrusted gets set) when (SM==null). It is
// possible that the SM==null for now but then SM is NOT null later // possible that the SM==null for now but then SM is NOT null later
// when safeTrim() is invoked...the "safe" way to do is to redundant // when safeTrim() is invoked...the "safe" way to do is to redundant
// check (... && (isTrusted || SM == null || getClassLoader0())) in trim // check (... && (isTrusted || SM == null || getClassLoader0())) in trim
// but it then can be argued that the SM is null when the opertaion // but it then can be argued that the SM is null when the operation
// is started... // is started...
CharsetDecoder cd = cs.newDecoder(); CharsetDecoder cd = cs.newDecoder();
int en = scale(len, cd.maxCharsPerByte()); int en = scale(len, cd.maxCharsPerByte());

View file

@ -1193,7 +1193,7 @@ public final class System {
// Setup Java signal handlers for HUP, TERM, and INT (where available). // Setup Java signal handlers for HUP, TERM, and INT (where available).
Terminator.setup(); Terminator.setup();
// Initialize any miscellenous operating system settings that need to be // Initialize any miscellaneous operating system settings that need to be
// set for the class libraries. Currently this is no-op everywhere except // set for the class libraries. Currently this is no-op everywhere except
// for Windows where the process-wide error mode is set before the java.io // for Windows where the process-wide error mode is set before the java.io
// classes are used. // classes are used.

View file

@ -139,7 +139,7 @@ public class Throwable implements Serializable {
* {@linkplain #setStackTrace(StackTraceElement[]) Setting the * {@linkplain #setStackTrace(StackTraceElement[]) Setting the
* stack trace} to a one-element array containing this sentinel * stack trace} to a one-element array containing this sentinel
* value indicates future attempts to set the stack trace will be * value indicates future attempts to set the stack trace will be
* ignored. The sentinal is equal to the result of calling:<br> * ignored. The sentinel is equal to the result of calling:<br>
* {@code new StackTraceElement("", "", null, Integer.MIN_VALUE)} * {@code new StackTraceElement("", "", null, Integer.MIN_VALUE)}
*/ */
public static final StackTraceElement STACK_TRACE_ELEMENT_SENTINEL = public static final StackTraceElement STACK_TRACE_ELEMENT_SENTINEL =

View file

@ -98,7 +98,7 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*;
private final String implMethodClassName; // Name of type containing implementation "CC" private final String implMethodClassName; // Name of type containing implementation "CC"
private final String implMethodName; // Name of implementation method "impl" private final String implMethodName; // Name of implementation method "impl"
private final String implMethodDesc; // Type descriptor for implementation methods "(I)Ljava/lang/String;" private final String implMethodDesc; // Type descriptor for implementation methods "(I)Ljava/lang/String;"
private final Class<?> implMethodReturnClass; // class for implementaion method return type "Ljava/lang/String;" private final Class<?> implMethodReturnClass; // class for implementation method return type "Ljava/lang/String;"
private final MethodType constructorType; // Generated class constructor type "(CC)void" private final MethodType constructorType; // Generated class constructor type "(CC)void"
private final ClassWriter cw; // ASM class writer private final ClassWriter cw; // ASM class writer
private final String[] argNames; // Generated names for the constructor arguments private final String[] argNames; // Generated names for the constructor arguments

View file

@ -209,7 +209,7 @@ class InvokerBytecodeGenerator {
throw new InternalError("observed CP placeholder twice: " + cpPlaceholder); throw new InternalError("observed CP placeholder twice: " + cpPlaceholder);
} }
// insert placeholder in CP and remember the patch // insert placeholder in CP and remember the patch
int index = cw.newConst((Object) cpPlaceholder); // TODO check if aready in the constant pool int index = cw.newConst((Object) cpPlaceholder); // TODO check if already in the constant pool
cpPatches.put(cpPlaceholder, new CpPatch(index, cpPlaceholder, arg)); cpPatches.put(cpPlaceholder, new CpPatch(index, cpPlaceholder, arg));
return cpPlaceholder; return cpPlaceholder;
} }

View file

@ -37,7 +37,7 @@ import static java.lang.invoke.LambdaForm.*;
* @author jrose * @author jrose
*/ */
class Invokers { class Invokers {
// exact type (sans leading taget MH) for the outgoing call // exact type (sans leading target MH) for the outgoing call
private final MethodType targetType; private final MethodType targetType;
// FIXME: Get rid of the invokers that are not useful. // FIXME: Get rid of the invokers that are not useful.

View file

@ -59,7 +59,7 @@ import java.util.Objects;
* and properly use the named member. * and properly use the named member.
* <p> * <p>
* When resolved, a member name's internal implementation may include references to JVM metadata. * When resolved, a member name's internal implementation may include references to JVM metadata.
* This representation is stateless and only decriptive. * This representation is stateless and only descriptive.
* It provides no private information and no capability to use the member. * It provides no private information and no capability to use the member.
* <p> * <p>
* By contrast, a {@linkplain java.lang.reflect.Method} contains fuller information * By contrast, a {@linkplain java.lang.reflect.Method} contains fuller information

View file

@ -679,7 +679,7 @@ public abstract class MethodHandle {
* This method provides the crucial behavioral difference between * This method provides the crucial behavioral difference between
* {@link #invokeExact invokeExact} and plain, inexact {@link #invoke invoke}. * {@link #invokeExact invokeExact} and plain, inexact {@link #invoke invoke}.
* The two methods * The two methods
* perform the same steps when the caller's type descriptor exactly m atches * perform the same steps when the caller's type descriptor exactly matches
* the callee's, but when the types differ, plain {@link #invoke invoke} * the callee's, but when the types differ, plain {@link #invoke invoke}
* also calls {@code asType} (or some internal equivalent) in order * also calls {@code asType} (or some internal equivalent) in order
* to match up the caller's and callee's types. * to match up the caller's and callee's types.

View file

@ -621,7 +621,7 @@ import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP;
} }
/** /**
* The LambaForm shape for catchException combinator is the following: * The LambdaForm shape for catchException combinator is the following:
* <blockquote><pre>{@code * <blockquote><pre>{@code
* guardWithCatch=Lambda(a0:L,a1:L,a2:L)=>{ * guardWithCatch=Lambda(a0:L,a1:L,a2:L)=>{
* t3:L=BoundMethodHandle$Species_LLLLL.argL0(a0:L); * t3:L=BoundMethodHandle$Species_LLLLL.argL0(a0:L);
@ -702,7 +702,7 @@ import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP;
MethodType type = target.type(); MethodType type = target.type();
LambdaForm form = makeGuardWithCatchForm(type.basicType()); LambdaForm form = makeGuardWithCatchForm(type.basicType());
// Prepare auxiliary method handles used during LambdaForm interpreation. // Prepare auxiliary method handles used during LambdaForm interpretation.
// Box arguments and wrap them into Object[]: ValueConversions.array(). // Box arguments and wrap them into Object[]: ValueConversions.array().
MethodType varargsType = type.changeReturnType(Object[].class); MethodType varargsType = type.changeReturnType(Object[].class);
MethodHandle collectArgs = ValueConversions.varargsArray(type.parameterCount()) MethodHandle collectArgs = ValueConversions.varargsArray(type.parameterCount())

View file

@ -509,7 +509,7 @@ class MethodHandleNatives {
/** /**
* Is this method a caller-sensitive method? * Is this method a caller-sensitive method?
* I.e., does it call Reflection.getCallerClass or a similer method * I.e., does it call Reflection.getCallerClass or a similar method
* to ask about the identity of its caller? * to ask about the identity of its caller?
*/ */
static boolean isCallerSensitive(MemberName mem) { static boolean isCallerSensitive(MemberName mem) {

View file

@ -78,7 +78,7 @@ public class AccessibleObject implements AnnotatedElement {
* object is a {@link Constructor} object for the class {@link * object is a {@link Constructor} object for the class {@link
* java.lang.Class}). In the event of such a SecurityException, the * java.lang.Class}). In the event of such a SecurityException, the
* accessibility of objects is set to {@code flag} for array elements * accessibility of objects is set to {@code flag} for array elements
* upto (and excluding) the element for which the exception occurred; the * up to (and excluding) the element for which the exception occurred; the
* accessibility of elements beyond (and including) the element for which * accessibility of elements beyond (and including) the element for which
* the exception occurred is unchanged. * the exception occurred is unchanged.
* *

View file

@ -544,15 +544,33 @@ public final class Constructor<T> extends Executable {
*/ */
@Override @Override
public AnnotatedType getAnnotatedReceiverType() { public AnnotatedType getAnnotatedReceiverType() {
if (getDeclaringClass().getEnclosingClass() == null) Class<?> thisDeclClass = getDeclaringClass();
return super.getAnnotatedReceiverType(); Class<?> enclosingClass = thisDeclClass.getEnclosingClass();
if (enclosingClass == null) {
// A Constructor for a top-level class
return null;
}
Class<?> outerDeclaringClass = thisDeclClass.getDeclaringClass();
if (outerDeclaringClass == null) {
// A constructor for a local or anonymous class
return null;
}
// Either static nested or inner class
if (Modifier.isStatic(thisDeclClass.getModifiers())) {
// static nested
return null;
}
// A Constructor for an inner class
return TypeAnnotationParser.buildAnnotatedType(getTypeAnnotationBytes0(), return TypeAnnotationParser.buildAnnotatedType(getTypeAnnotationBytes0(),
sun.misc.SharedSecrets.getJavaLangAccess(). sun.misc.SharedSecrets.getJavaLangAccess().
getConstantPool(getDeclaringClass()), getConstantPool(thisDeclClass),
this, this,
getDeclaringClass(), thisDeclClass,
getDeclaringClass().getEnclosingClass(), enclosingClass,
TypeAnnotation.TypeAnnotationTarget.METHOD_RECEIVER); TypeAnnotation.TypeAnnotationTarget.METHOD_RECEIVER);
} }
} }

View file

@ -585,21 +585,24 @@ public abstract class Executable extends AccessibleObject
/** /**
* Returns an {@code AnnotatedType} object that represents the use of a * Returns an {@code AnnotatedType} object that represents the use of a
* type to specify the receiver type of the method/constructor represented * type to specify the receiver type of the method/constructor represented
* by this Executable object. The receiver type of a method/constructor is * by this {@code Executable} object.
* available only if the method/constructor has a <em>receiver
* parameter</em> (JLS 8.4.1).
* *
* If this {@code Executable} object represents a constructor or instance * The receiver type of a method/constructor is available only if the
* method that does not have a receiver parameter, or has a receiver * method/constructor has a receiver parameter (JLS 8.4.1). If this {@code
* parameter with no annotations on its type, then the return value is an * Executable} object <em>represents an instance method or represents a
* {@code AnnotatedType} object representing an element with no * constructor of an inner member class</em>, and the
* method/constructor <em>either</em> has no receiver parameter or has a
* receiver parameter with no annotations on its type, then the return
* value is an {@code AnnotatedType} object representing an element with no
* annotations. * annotations.
* *
* If this {@code Executable} object represents a static method, then the * If this {@code Executable} object represents a static method or
* return value is null. * represents a constructor of a top level, static member, local, or
* anoymous class, then the return value is null.
* *
* @return an object representing the receiver type of the method or * @return an object representing the receiver type of the method or
* constructor represented by this {@code Executable} * constructor represented by this {@code Executable} or {@code null} if
* this {@code Executable} can not have a receiver parameter
*/ */
public AnnotatedType getAnnotatedReceiverType() { public AnnotatedType getAnnotatedReceiverType() {
if (Modifier.isStatic(this.getModifiers())) if (Modifier.isStatic(this.getModifiers()))

View file

@ -173,7 +173,7 @@ public final class Parameter implements AnnotatedElement {
* a name. * a name.
*/ */
public String getName() { public String getName() {
// Note: empty strings as paramete names are now outlawed. // Note: empty strings as parameter names are now outlawed.
// The .equals("") is for compatibility with current JVM // The .equals("") is for compatibility with current JVM
// behavior. It may be removed at some point. // behavior. It may be removed at some point.
if(name == null || name.equals("")) if(name == null || name.equals(""))

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -39,15 +39,16 @@ import sun.security.jca.GetInstance.Instance;
* *
* <p>A cryptographically strong random number * <p>A cryptographically strong random number
* minimally complies with the statistical random number generator tests * minimally complies with the statistical random number generator tests
* specified in <a href="http://csrc.nist.gov/cryptval/140-2.htm"> * specified in
* <a href="http://csrc.nist.gov/publications/fips/fips140-2/fips1402.pdf">
* <i>FIPS 140-2, Security Requirements for Cryptographic Modules</i></a>, * <i>FIPS 140-2, Security Requirements for Cryptographic Modules</i></a>,
* section 4.9.1. * section 4.9.1.
* Additionally, SecureRandom must produce non-deterministic output. * Additionally, SecureRandom must produce non-deterministic output.
* Therefore any seed material passed to a SecureRandom object must be * Therefore any seed material passed to a SecureRandom object must be
* unpredictable, and all SecureRandom output sequences must be * unpredictable, and all SecureRandom output sequences must be
* cryptographically strong, as described in * cryptographically strong, as described in
* <a href="http://www.ietf.org/rfc/rfc1750.txt"> * <a href="http://tools.ietf.org/html/rfc4086">
* <i>RFC 1750: Randomness Recommendations for Security</i></a>. * <i>RFC 4086: Randomness Requirements for Security</i></a>.
* *
* <p>A caller obtains a SecureRandom instance via the * <p>A caller obtains a SecureRandom instance via the
* no-argument constructor or one of the {@code getInstance} methods: * no-argument constructor or one of the {@code getInstance} methods:

View file

@ -388,19 +388,21 @@ public final class Duration
Matcher matcher = PATTERN.matcher(text); Matcher matcher = PATTERN.matcher(text);
if (matcher.matches()) { if (matcher.matches()) {
// check for letter T but no time sections // check for letter T but no time sections
if ("T".equals(matcher.group(3)) == false) { if (!charMatch(text, matcher.start(3), matcher.end(3), 'T')) {
boolean negate = "-".equals(matcher.group(1)); boolean negate = charMatch(text, matcher.start(1), matcher.end(1), '-');
String dayMatch = matcher.group(2);
String hourMatch = matcher.group(4); int dayStart = matcher.start(2), dayEnd = matcher.end(2);
String minuteMatch = matcher.group(5); int hourStart = matcher.start(4), hourEnd = matcher.end(4);
String secondMatch = matcher.group(6); int minuteStart = matcher.start(5), minuteEnd = matcher.end(5);
String fractionMatch = matcher.group(7); int secondStart = matcher.start(6), secondEnd = matcher.end(6);
if (dayMatch != null || hourMatch != null || minuteMatch != null || secondMatch != null) { int fractionStart = matcher.start(7), fractionEnd = matcher.end(7);
long daysAsSecs = parseNumber(text, dayMatch, SECONDS_PER_DAY, "days");
long hoursAsSecs = parseNumber(text, hourMatch, SECONDS_PER_HOUR, "hours"); if (dayStart >= 0 || hourStart >= 0 || minuteStart >= 0 || secondStart >= 0) {
long minsAsSecs = parseNumber(text, minuteMatch, SECONDS_PER_MINUTE, "minutes"); long daysAsSecs = parseNumber(text, dayStart, dayEnd, SECONDS_PER_DAY, "days");
long seconds = parseNumber(text, secondMatch, 1, "seconds"); long hoursAsSecs = parseNumber(text, hourStart, hourEnd, SECONDS_PER_HOUR, "hours");
int nanos = parseFraction(text, fractionMatch, seconds < 0 ? -1 : 1); long minsAsSecs = parseNumber(text, minuteStart, minuteEnd, SECONDS_PER_MINUTE, "minutes");
long seconds = parseNumber(text, secondStart, secondEnd, 1, "seconds");
int nanos = parseFraction(text, fractionStart, fractionEnd, seconds < 0 ? -1 : 1);
try { try {
return create(negate, daysAsSecs, hoursAsSecs, minsAsSecs, seconds, nanos); return create(negate, daysAsSecs, hoursAsSecs, minsAsSecs, seconds, nanos);
} catch (ArithmeticException ex) { } catch (ArithmeticException ex) {
@ -412,27 +414,37 @@ public final class Duration
throw new DateTimeParseException("Text cannot be parsed to a Duration", text, 0); throw new DateTimeParseException("Text cannot be parsed to a Duration", text, 0);
} }
private static long parseNumber(CharSequence text, String parsed, int multiplier, String errorText) { private static boolean charMatch(CharSequence text, int start, int end, char c) {
return (start >= 0 && end == start + 1 && text.charAt(start) == c);
}
private static long parseNumber(CharSequence text, int start, int end, int multiplier, String errorText) {
// regex limits to [-+]?[0-9]+ // regex limits to [-+]?[0-9]+
if (parsed == null) { if (start < 0 || end < 0) {
return 0; return 0;
} }
try { try {
long val = Long.parseLong(parsed); long val = Long.parseLong(text, 10, start, end);
return Math.multiplyExact(val, multiplier); return Math.multiplyExact(val, multiplier);
} catch (NumberFormatException | ArithmeticException ex) { } catch (NumberFormatException | ArithmeticException ex) {
throw (DateTimeParseException) new DateTimeParseException("Text cannot be parsed to a Duration: " + errorText, text, 0).initCause(ex); throw (DateTimeParseException) new DateTimeParseException("Text cannot be parsed to a Duration: " + errorText, text, 0).initCause(ex);
} }
} }
private static int parseFraction(CharSequence text, String parsed, int negate) { private static int parseFraction(CharSequence text, int start, int end, int negate) {
// regex limits to [0-9]{0,9} // regex limits to [0-9]{0,9}
if (parsed == null || parsed.length() == 0) { if (start < 0 || end < 0 || end - start == 0) {
return 0; return 0;
} }
try { try {
parsed = (parsed + "000000000").substring(0, 9); int fraction = Integer.parseInt(text, 10, start, end);
return Integer.parseInt(parsed) * negate;
// for number strings smaller than 9 digits, interpret as if there
// were trailing zeros
for (int i = end - start; i < 9; i++) {
fraction *= 10;
}
return fraction * negate;
} catch (NumberFormatException | ArithmeticException ex) { } catch (NumberFormatException | ArithmeticException ex) {
throw (DateTimeParseException) new DateTimeParseException("Text cannot be parsed to a Duration: fraction", text, 0).initCause(ex); throw (DateTimeParseException) new DateTimeParseException("Text cannot be parsed to a Duration: fraction", text, 0).initCause(ex);
} }

View file

@ -329,17 +329,17 @@ public final class Period
Objects.requireNonNull(text, "text"); Objects.requireNonNull(text, "text");
Matcher matcher = PATTERN.matcher(text); Matcher matcher = PATTERN.matcher(text);
if (matcher.matches()) { if (matcher.matches()) {
int negate = ("-".equals(matcher.group(1)) ? -1 : 1); int negate = (charMatch(text, matcher.start(1), matcher.end(1), '-') ? -1 : 1);
String yearMatch = matcher.group(2); int yearStart = matcher.start(2), yearEnd = matcher.end(2);
String monthMatch = matcher.group(3); int monthStart = matcher.start(3), monthEnd = matcher.end(3);
String weekMatch = matcher.group(4); int weekStart = matcher.start(4), weekEnd = matcher.end(4);
String dayMatch = matcher.group(5); int dayStart = matcher.start(5), dayEnd = matcher.end(5);
if (yearMatch != null || monthMatch != null || dayMatch != null || weekMatch != null) { if (yearStart >= 0 || monthStart >= 0 || weekStart >= 0 || dayStart >= 0) {
try { try {
int years = parseNumber(text, yearMatch, negate); int years = parseNumber(text, yearStart, yearEnd, negate);
int months = parseNumber(text, monthMatch, negate); int months = parseNumber(text, monthStart, monthEnd, negate);
int weeks = parseNumber(text, weekMatch, negate); int weeks = parseNumber(text, weekStart, weekEnd, negate);
int days = parseNumber(text, dayMatch, negate); int days = parseNumber(text, dayStart, dayEnd, negate);
days = Math.addExact(days, Math.multiplyExact(weeks, 7)); days = Math.addExact(days, Math.multiplyExact(weeks, 7));
return create(years, months, days); return create(years, months, days);
} catch (NumberFormatException ex) { } catch (NumberFormatException ex) {
@ -350,11 +350,15 @@ public final class Period
throw new DateTimeParseException("Text cannot be parsed to a Period", text, 0); throw new DateTimeParseException("Text cannot be parsed to a Period", text, 0);
} }
private static int parseNumber(CharSequence text, String str, int negate) { private static boolean charMatch(CharSequence text, int start, int end, char c) {
if (str == null) { return (start >= 0 && end == start + 1 && text.charAt(start) == c);
}
private static int parseNumber(CharSequence text, int start, int end, int negate) {
if (start < 0 || end < 0) {
return 0; return 0;
} }
int val = Integer.parseInt(str); int val = Integer.parseInt(text, 10, start, end);
try { try {
return Math.multiplyExact(val, negate); return Math.multiplyExact(val, negate);
} catch (ArithmeticException ex) { } catch (ArithmeticException ex) {

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -38,20 +38,20 @@ import sun.util.calendar.LocalGregorianCalendar;
import sun.util.calendar.ZoneInfo; import sun.util.calendar.ZoneInfo;
/** /**
* <code>JapaneseImperialCalendar</code> implements a Japanese * {@code JapaneseImperialCalendar} implements a Japanese
* calendar system in which the imperial era-based year numbering is * calendar system in which the imperial era-based year numbering is
* supported from the Meiji era. The following are the eras supported * supported from the Meiji era. The following are the eras supported
* by this calendar system. * by this calendar system.
* <pre><tt> * <pre>{@code
* ERA value Era name Since (in Gregorian) * ERA value Era name Since (in Gregorian)
* ------------------------------------------------------ * ------------------------------------------------------
* 0 N/A N/A * 0 N/A N/A
* 1 Meiji 1868-01-01 midnight local time * 1 Meiji 1868-01-01T00:00:00 local time
* 2 Taisho 1912-07-30 midnight local time * 2 Taisho 1912-07-30T00:00:00 local time
* 3 Showa 1926-12-25 midnight local time * 3 Showa 1926-12-25T00:00:00 local time
* 4 Heisei 1989-01-08 midnight local time * 4 Heisei 1989-01-08T00:00:00 local time
* ------------------------------------------------------ * ------------------------------------------------------
* </tt></pre> * }</pre>
* *
* <p><code>ERA</code> value 0 specifies the years before Meiji and * <p><code>ERA</code> value 0 specifies the years before Meiji and
* the Gregorian year values are used. Unlike {@link * the Gregorian year values are used. Unlike {@link
@ -63,6 +63,31 @@ import sun.util.calendar.ZoneInfo;
* with time differences for applying the era transitions. This * with time differences for applying the era transitions. This
* calendar implementation assumes local time for all transitions. * calendar implementation assumes local time for all transitions.
* *
* <p>A new era can be specified using property
* jdk.calendar.japanese.supplemental.era. The new era is added to the
* predefined eras. The syntax of the property is as follows.
* <p><pre>
* {@code name=<name>,abbr=<abbr>,since=<time['u']>}
* </pre>
* where
* <dl>
* <dt>{@code <name>:}<dd>the full name of the new era (non-ASCII characters allowed)
* <dt>{@code <abbr>:}<dd>the abbreviation of the new era (non-ASCII characters allowed)
* <dt>{@code <time['u']>:}<dd>the start time of the new era represented by
* milliseconds from 1970-01-01T00:00:00 local time or UTC if {@code 'u'} is
* appended to the milliseconds value. (ASCII digits only)
* </dl>
*
* <p>If the given era is invalid, such as the since value before the
* beginning of the last predefined era, the given era will be
* ignored.
*
* <p>The following is an example of the property usage.
* <p><pre>
* java -Djdk.calendar.japanese.supplemental.era="name=NewEra,abbr=N,since=253374307200000"
* </pre>
* The property specifies an era change to NewEra at 9999-02-11T00:00:00 local time.
*
* @author Masayoshi Okutsu * @author Masayoshi Okutsu
* @since 1.6 * @since 1.6
*/ */
@ -102,7 +127,6 @@ class JapaneseImperialCalendar extends Calendar {
public static final int HEISEI = 4; public static final int HEISEI = 4;
private static final int EPOCH_OFFSET = 719163; // Fixed date of January 1, 1970 (Gregorian) private static final int EPOCH_OFFSET = 719163; // Fixed date of January 1, 1970 (Gregorian)
private static final int EPOCH_YEAR = 1970;
// Useful millisecond constants. Although ONE_DAY and ONE_WEEK can fit // Useful millisecond constants. Although ONE_DAY and ONE_WEEK can fit
// into ints, they must be longs in order to prevent arithmetic overflow // into ints, they must be longs in order to prevent arithmetic overflow
@ -111,7 +135,6 @@ class JapaneseImperialCalendar extends Calendar {
private static final int ONE_MINUTE = 60*ONE_SECOND; private static final int ONE_MINUTE = 60*ONE_SECOND;
private static final int ONE_HOUR = 60*ONE_MINUTE; private static final int ONE_HOUR = 60*ONE_MINUTE;
private static final long ONE_DAY = 24*ONE_HOUR; private static final long ONE_DAY = 24*ONE_HOUR;
private static final long ONE_WEEK = 7*ONE_DAY;
// Reference to the sun.util.calendar.LocalGregorianCalendar instance (singleton). // Reference to the sun.util.calendar.LocalGregorianCalendar instance (singleton).
private static final LocalGregorianCalendar jcal private static final LocalGregorianCalendar jcal
@ -217,6 +240,7 @@ class JapaneseImperialCalendar extends Calendar {
}; };
// Proclaim serialization compatibility with JDK 1.6 // Proclaim serialization compatibility with JDK 1.6
@SuppressWarnings("FieldNameHidesFieldInSuperclass")
private static final long serialVersionUID = -3364572813905467929L; private static final long serialVersionUID = -3364572813905467929L;
static { static {
@ -340,6 +364,7 @@ class JapaneseImperialCalendar extends Calendar {
* <code>false</code> otherwise. * <code>false</code> otherwise.
* @see Calendar#compareTo(Calendar) * @see Calendar#compareTo(Calendar)
*/ */
@Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
return obj instanceof JapaneseImperialCalendar && return obj instanceof JapaneseImperialCalendar &&
super.equals(obj); super.equals(obj);
@ -349,6 +374,7 @@ class JapaneseImperialCalendar extends Calendar {
* Generates the hash code for this * Generates the hash code for this
* <code>JapaneseImperialCalendar</code> object. * <code>JapaneseImperialCalendar</code> object.
*/ */
@Override
public int hashCode() { public int hashCode() {
return super.hashCode() ^ jdate.hashCode(); return super.hashCode() ^ jdate.hashCode();
} }
@ -381,6 +407,7 @@ class JapaneseImperialCalendar extends Calendar {
* or if any calendar fields have out-of-range values in * or if any calendar fields have out-of-range values in
* non-lenient mode. * non-lenient mode.
*/ */
@Override
public void add(int field, int amount) { public void add(int field, int amount) {
// If amount == 0, do nothing even the given field is out of // If amount == 0, do nothing even the given field is out of
// range. This is tested by JCK. // range. This is tested by JCK.
@ -509,6 +536,7 @@ class JapaneseImperialCalendar extends Calendar {
} }
} }
@Override
public void roll(int field, boolean up) { public void roll(int field, boolean up) {
roll(field, up ? +1 : -1); roll(field, up ? +1 : -1);
} }
@ -533,6 +561,7 @@ class JapaneseImperialCalendar extends Calendar {
* @see #add(int,int) * @see #add(int,int)
* @see #set(int,int) * @see #set(int,int)
*/ */
@Override
public void roll(int field, int amount) { public void roll(int field, int amount) {
// If amount == 0, do nothing even the given field is out of // If amount == 0, do nothing even the given field is out of
// range. This is tested by JCK. // range. This is tested by JCK.

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -24,6 +24,9 @@
*/ */
package java.util; package java.util;
import sun.misc.JavaLangAccess;
import sun.misc.SharedSecrets;
/** /**
* {@code StringJoiner} is used to construct a sequence of characters separated * {@code StringJoiner} is used to construct a sequence of characters separated
* by a delimiter and optionally starting with a supplied prefix * by a delimiter and optionally starting with a supplied prefix
@ -67,22 +70,24 @@ public final class StringJoiner {
private final String delimiter; private final String delimiter;
private final String suffix; private final String suffix;
/* /** Contains all the string components added so far. */
* StringBuilder value -- at any time, the characters constructed from the private String[] elts;
* prefix, the added element separated by the delimiter, but without the
* suffix, so that we can more easily add elements without having to jigger
* the suffix each time.
*/
private StringBuilder value;
/* /** The number of string components added so far. */
* By default, the string consisting of prefix+suffix, returned by private int size;
* toString(), or properties of value, when no elements have yet been added,
* i.e. when it is empty. This may be overridden by the user to be some /** Total length in chars so far, excluding prefix and suffix. */
* other value including the empty String. private int len;
/**
* When overriden by the user to be non-null via {@link setEmptyValue}, the
* string returned by toString() when no elements have yet been added.
* When null, prefix + suffix is used as the empty value.
*/ */
private String emptyValue; private String emptyValue;
private static final JavaLangAccess jla = SharedSecrets.getJavaLangAccess();
/** /**
* Constructs a {@code StringJoiner} with no characters in it, with no * Constructs a {@code StringJoiner} with no characters in it, with no
* {@code prefix} or {@code suffix}, and a copy of the supplied * {@code prefix} or {@code suffix}, and a copy of the supplied
@ -125,7 +130,6 @@ public final class StringJoiner {
this.prefix = prefix.toString(); this.prefix = prefix.toString();
this.delimiter = delimiter.toString(); this.delimiter = delimiter.toString();
this.suffix = suffix.toString(); this.suffix = suffix.toString();
this.emptyValue = this.prefix + this.suffix;
} }
/** /**
@ -148,29 +152,44 @@ public final class StringJoiner {
return this; return this;
} }
private static int getChars(String s, char[] chars, int start) {
int len = s.length();
s.getChars(0, len, chars, start);
return len;
}
/** /**
* Returns the current value, consisting of the {@code prefix}, the values * Returns the current value, consisting of the {@code prefix}, the values
* added so far separated by the {@code delimiter}, and the {@code suffix}, * added so far separated by the {@code delimiter}, and the {@code suffix},
* unless no elements have been added in which case, the * unless no elements have been added in which case, the
* {@code prefix + suffix} or the {@code emptyValue} characters are returned * {@code prefix + suffix} or the {@code emptyValue} characters are returned.
* *
* @return the string representation of this {@code StringJoiner} * @return the string representation of this {@code StringJoiner}
*/ */
@Override @Override
public String toString() { public String toString() {
if (value == null) { final String[] elts = this.elts;
if (elts == null && emptyValue != null) {
return emptyValue; return emptyValue;
} else { }
if (suffix.equals("")) { final int size = this.size;
return value.toString(); final int addLen = prefix.length() + suffix.length();
} else { if (addLen == 0) {
int initialLength = value.length(); compactElts();
String result = value.append(suffix).toString(); return size == 0 ? "" : elts[0];
// reset value to pre-append initialLength }
value.setLength(initialLength); final String delimiter = this.delimiter;
return result; final char[] chars = new char[len + addLen];
int k = getChars(prefix, chars, 0);
if (size > 0) {
k += getChars(elts[0], chars, k);
for (int i = 1; i < size; i++) {
k += getChars(delimiter, chars, k);
k += getChars(elts[i], chars, k);
} }
} }
k += getChars(suffix, chars, k);
return jla.newStringUnsafe(chars);
} }
/** /**
@ -182,7 +201,16 @@ public final class StringJoiner {
* @return a reference to this {@code StringJoiner} * @return a reference to this {@code StringJoiner}
*/ */
public StringJoiner add(CharSequence newElement) { public StringJoiner add(CharSequence newElement) {
prepareBuilder().append(newElement); final String elt = String.valueOf(newElement);
if (elts == null) {
elts = new String[8];
} else {
if (size == elts.length)
elts = Arrays.copyOf(elts, 2 * size);
len += delimiter.length();
}
len += elt.length();
elts[size++] = elt;
return this; return this;
} }
@ -207,24 +235,25 @@ public final class StringJoiner {
*/ */
public StringJoiner merge(StringJoiner other) { public StringJoiner merge(StringJoiner other) {
Objects.requireNonNull(other); Objects.requireNonNull(other);
if (other.value != null) { if (other.elts == null) {
final int length = other.value.length(); return this;
// lock the length so that we can seize the data to be appended
// before initiate copying to avoid interference, especially when
// merge 'this'
StringBuilder builder = prepareBuilder();
builder.append(other.value, other.prefix.length(), length);
} }
return this; other.compactElts();
return add(other.elts[0]);
} }
private StringBuilder prepareBuilder() { private void compactElts() {
if (value != null) { if (size > 1) {
value.append(delimiter); final char[] chars = new char[len];
} else { int i = 1, k = getChars(elts[0], chars, 0);
value = new StringBuilder().append(prefix); do {
k += getChars(delimiter, chars, k);
k += getChars(elts[i], chars, k);
elts[i] = null;
} while (++i < size);
size = 1;
elts[0] = jla.newStringUnsafe(chars);
} }
return value;
} }
/** /**
@ -238,10 +267,7 @@ public final class StringJoiner {
* @return the length of the current value of {@code StringJoiner} * @return the length of the current value of {@code StringJoiner}
*/ */
public int length() { public int length() {
// Remember that we never actually append the suffix unless we return return (size == 0 && emptyValue != null) ? emptyValue.length() :
// the full (present) value or some sub-string or length of it, so that len + prefix.length() + suffix.length();
// we can add on more if we need to.
return (value != null ? value.length() + suffix.length() :
emptyValue.length());
} }
} }

View file

@ -182,21 +182,20 @@ public final class Subject implements java.io.Serializable {
* {@code AuthPermission("modifyPublicCredentials")}. * {@code AuthPermission("modifyPublicCredentials")}.
* To modify the private credential Set, the caller must have * To modify the private credential Set, the caller must have
* {@code AuthPermission("modifyPrivateCredentials")}. * {@code AuthPermission("modifyPrivateCredentials")}.
* <p>
* *
* @param readOnly true if the {@code Subject} is to be read-only, * @param readOnly true if the {@code Subject} is to be read-only,
* and false otherwise. <p> * and false otherwise.
* *
* @param principals the {@code Set} of Principals * @param principals the {@code Set} of Principals
* to be associated with this {@code Subject}. <p> * to be associated with this {@code Subject}.
* *
* @param pubCredentials the {@code Set} of public credentials * @param pubCredentials the {@code Set} of public credentials
* to be associated with this {@code Subject}. <p> * to be associated with this {@code Subject}.
* *
* @param privCredentials the {@code Set} of private credentials * @param privCredentials the {@code Set} of private credentials
* to be associated with this {@code Subject}. * to be associated with this {@code Subject}.
* *
* @exception NullPointerException if the specified * @throws NullPointerException if the specified
* {@code principals}, {@code pubCredentials}, * {@code principals}, {@code pubCredentials},
* or {@code privCredentials} are {@code null}, * or {@code privCredentials} are {@code null},
* or a null value exists within any of these three * or a null value exists within any of these three
@ -233,10 +232,11 @@ public final class Subject implements java.io.Serializable {
* Also, once a {@code Subject} is read-only, * Also, once a {@code Subject} is read-only,
* it can not be reset to being writable again. * it can not be reset to being writable again.
* *
* <p> * @throws SecurityException if a security manager is installed and the
* * caller does not have an
* @exception SecurityException if the caller does not have permission * {@link AuthPermission#AuthPermission(String)
* to set this {@code Subject} to be read-only. * AuthPermission("setReadOnly")} permission to set this
* {@code Subject} to be read-only.
*/ */
public void setReadOnly() { public void setReadOnly() {
java.lang.SecurityManager sm = System.getSecurityManager(); java.lang.SecurityManager sm = System.getSecurityManager();
@ -250,8 +250,6 @@ public final class Subject implements java.io.Serializable {
/** /**
* Query whether this {@code Subject} is read-only. * Query whether this {@code Subject} is read-only.
* *
* <p>
*
* @return true if this {@code Subject} is read-only, false otherwise. * @return true if this {@code Subject} is read-only, false otherwise.
*/ */
public boolean isReadOnly() { public boolean isReadOnly() {
@ -267,8 +265,6 @@ public final class Subject implements java.io.Serializable {
* In this situation, the most recent {@code Subject} associated * In this situation, the most recent {@code Subject} associated
* with the {@code AccessControlContext} is returned. * with the {@code AccessControlContext} is returned.
* *
* <p>
*
* @param acc the {@code AccessControlContext} from which to retrieve * @param acc the {@code AccessControlContext} from which to retrieve
* the {@code Subject}. * the {@code Subject}.
* *
@ -277,10 +273,13 @@ public final class Subject implements java.io.Serializable {
* if no {@code Subject} is associated * if no {@code Subject} is associated
* with the provided {@code AccessControlContext}. * with the provided {@code AccessControlContext}.
* *
* @exception SecurityException if the caller does not have permission * @throws SecurityException if a security manager is installed and the
* to get the {@code Subject}. <p> * caller does not have an
* {@link AuthPermission#AuthPermission(String)
* AuthPermission("getSubject")} permission to get the
* {@code Subject}.
* *
* @exception NullPointerException if the provided * @throws NullPointerException if the provided
* {@code AccessControlContext} is {@code null}. * {@code AccessControlContext} is {@code null}.
*/ */
public static Subject getSubject(final AccessControlContext acc) { public static Subject getSubject(final AccessControlContext acc) {
@ -321,26 +320,27 @@ public final class Subject implements java.io.Serializable {
* passing it the provided {@code PrivilegedAction}, * passing it the provided {@code PrivilegedAction},
* as well as the newly constructed {@code AccessControlContext}. * as well as the newly constructed {@code AccessControlContext}.
* *
* <p>
*
* @param subject the {@code Subject} that the specified * @param subject the {@code Subject} that the specified
* {@code action} will run as. This parameter * {@code action} will run as. This parameter
* may be {@code null}. <p> * may be {@code null}.
* *
* @param <T> the type of the value returned by the PrivilegedAction's * @param <T> the type of the value returned by the PrivilegedAction's
* {@code run} method. * {@code run} method.
* *
* @param action the code to be run as the specified * @param action the code to be run as the specified
* {@code Subject}. <p> * {@code Subject}.
* *
* @return the value returned by the PrivilegedAction's * @return the value returned by the PrivilegedAction's
* {@code run} method. * {@code run} method.
* *
* @exception NullPointerException if the {@code PrivilegedAction} * @throws NullPointerException if the {@code PrivilegedAction}
* is {@code null}. <p> * is {@code null}.
* *
* @exception SecurityException if the caller does not have permission * @throws SecurityException if a security manager is installed and the
* to invoke this method. * caller does not have an
* {@link AuthPermission#AuthPermission(String)
* AuthPermission("doAs")} permission to invoke this
* method.
*/ */
public static <T> T doAs(final Subject subject, public static <T> T doAs(final Subject subject,
final java.security.PrivilegedAction<T> action) { final java.security.PrivilegedAction<T> action) {
@ -377,31 +377,32 @@ public final class Subject implements java.io.Serializable {
* passing it the provided {@code PrivilegedExceptionAction}, * passing it the provided {@code PrivilegedExceptionAction},
* as well as the newly constructed {@code AccessControlContext}. * as well as the newly constructed {@code AccessControlContext}.
* *
* <p>
*
* @param subject the {@code Subject} that the specified * @param subject the {@code Subject} that the specified
* {@code action} will run as. This parameter * {@code action} will run as. This parameter
* may be {@code null}. <p> * may be {@code null}.
* *
* @param <T> the type of the value returned by the * @param <T> the type of the value returned by the
* PrivilegedExceptionAction's {@code run} method. * PrivilegedExceptionAction's {@code run} method.
* *
* @param action the code to be run as the specified * @param action the code to be run as the specified
* {@code Subject}. <p> * {@code Subject}.
* *
* @return the value returned by the * @return the value returned by the
* PrivilegedExceptionAction's {@code run} method. * PrivilegedExceptionAction's {@code run} method.
* *
* @exception PrivilegedActionException if the * @throws PrivilegedActionException if the
* {@code PrivilegedExceptionAction.run} * {@code PrivilegedExceptionAction.run}
* method throws a checked exception. <p> * method throws a checked exception.
* *
* @exception NullPointerException if the specified * @throws NullPointerException if the specified
* {@code PrivilegedExceptionAction} is * {@code PrivilegedExceptionAction} is
* {@code null}. <p> * {@code null}.
* *
* @exception SecurityException if the caller does not have permission * @throws SecurityException if a security manager is installed and the
* to invoke this method. * caller does not have an
* {@link AuthPermission#AuthPermission(String)
* AuthPermission("doAs")} permission to invoke this
* method.
*/ */
public static <T> T doAs(final Subject subject, public static <T> T doAs(final Subject subject,
final java.security.PrivilegedExceptionAction<T> action) final java.security.PrivilegedExceptionAction<T> action)
@ -435,29 +436,30 @@ public final class Subject implements java.io.Serializable {
* this method instantiates a new {@code AccessControlContext} * this method instantiates a new {@code AccessControlContext}
* with an empty collection of ProtectionDomains. * with an empty collection of ProtectionDomains.
* *
* <p>
*
* @param subject the {@code Subject} that the specified * @param subject the {@code Subject} that the specified
* {@code action} will run as. This parameter * {@code action} will run as. This parameter
* may be {@code null}. <p> * may be {@code null}.
* *
* @param <T> the type of the value returned by the PrivilegedAction's * @param <T> the type of the value returned by the PrivilegedAction's
* {@code run} method. * {@code run} method.
* *
* @param action the code to be run as the specified * @param action the code to be run as the specified
* {@code Subject}. <p> * {@code Subject}.
* *
* @param acc the {@code AccessControlContext} to be tied to the * @param acc the {@code AccessControlContext} to be tied to the
* specified <i>subject</i> and <i>action</i>. <p> * specified <i>subject</i> and <i>action</i>.
* *
* @return the value returned by the PrivilegedAction's * @return the value returned by the PrivilegedAction's
* {@code run} method. * {@code run} method.
* *
* @exception NullPointerException if the {@code PrivilegedAction} * @throws NullPointerException if the {@code PrivilegedAction}
* is {@code null}. <p> * is {@code null}.
* *
* @exception SecurityException if the caller does not have permission * @throws SecurityException if a security manager is installed and the
* to invoke this method. * caller does not have a
* {@link AuthPermission#AuthPermission(String)
* AuthPermission("doAsPrivileged")} permission to invoke
* this method.
*/ */
public static <T> T doAsPrivileged(final Subject subject, public static <T> T doAsPrivileged(final Subject subject,
final java.security.PrivilegedAction<T> action, final java.security.PrivilegedAction<T> action,
@ -495,34 +497,35 @@ public final class Subject implements java.io.Serializable {
* this method instantiates a new {@code AccessControlContext} * this method instantiates a new {@code AccessControlContext}
* with an empty collection of ProtectionDomains. * with an empty collection of ProtectionDomains.
* *
* <p>
*
* @param subject the {@code Subject} that the specified * @param subject the {@code Subject} that the specified
* {@code action} will run as. This parameter * {@code action} will run as. This parameter
* may be {@code null}. <p> * may be {@code null}.
* *
* @param <T> the type of the value returned by the * @param <T> the type of the value returned by the
* PrivilegedExceptionAction's {@code run} method. * PrivilegedExceptionAction's {@code run} method.
* *
* @param action the code to be run as the specified * @param action the code to be run as the specified
* {@code Subject}. <p> * {@code Subject}.
* *
* @param acc the {@code AccessControlContext} to be tied to the * @param acc the {@code AccessControlContext} to be tied to the
* specified <i>subject</i> and <i>action</i>. <p> * specified <i>subject</i> and <i>action</i>.
* *
* @return the value returned by the * @return the value returned by the
* PrivilegedExceptionAction's {@code run} method. * PrivilegedExceptionAction's {@code run} method.
* *
* @exception PrivilegedActionException if the * @throws PrivilegedActionException if the
* {@code PrivilegedExceptionAction.run} * {@code PrivilegedExceptionAction.run}
* method throws a checked exception. <p> * method throws a checked exception.
* *
* @exception NullPointerException if the specified * @throws NullPointerException if the specified
* {@code PrivilegedExceptionAction} is * {@code PrivilegedExceptionAction} is
* {@code null}. <p> * {@code null}.
* *
* @exception SecurityException if the caller does not have permission * @throws SecurityException if a security manager is installed and the
* to invoke this method. * caller does not have a
* {@link AuthPermission#AuthPermission(String)
* AuthPermission("doAsPrivileged")} permission to invoke
* this method.
*/ */
public static <T> T doAsPrivileged(final Subject subject, public static <T> T doAsPrivileged(final Subject subject,
final java.security.PrivilegedExceptionAction<T> action, final java.security.PrivilegedExceptionAction<T> action,
@ -577,9 +580,12 @@ public final class Subject implements java.io.Serializable {
* to the returned {@code Set} affects the internal * to the returned {@code Set} affects the internal
* {@code Principal} {@code Set} as well. * {@code Principal} {@code Set} as well.
* *
* <p> * <p> If a security manager is installed, the caller must have a
* {@link AuthPermission#AuthPermission(String)
* AuthPermission("modifyPrincipals")} permission to modify
* the returned set, or a {@code SecurityException} will be thrown.
* *
* @return The {@code Set} of Principals associated with this * @return the {@code Set} of Principals associated with this
* {@code Subject}. * {@code Subject}.
*/ */
public Set<Principal> getPrincipals() { public Set<Principal> getPrincipals() {
@ -600,8 +606,6 @@ public final class Subject implements java.io.Serializable {
* Modifications to the returned {@code Set} * Modifications to the returned {@code Set}
* will not affect the internal {@code Principal} {@code Set}. * will not affect the internal {@code Principal} {@code Set}.
* *
* <p>
*
* @param <T> the type of the class modeled by {@code c} * @param <T> the type of the class modeled by {@code c}
* *
* @param c the returned {@code Set} of Principals will all be * @param c the returned {@code Set} of Principals will all be
@ -610,8 +614,8 @@ public final class Subject implements java.io.Serializable {
* @return a {@code Set} of Principals that are instances of the * @return a {@code Set} of Principals that are instances of the
* specified {@code Class}. * specified {@code Class}.
* *
* @exception NullPointerException if the specified {@code Class} * @throws NullPointerException if the specified {@code Class}
* is {@code null}. * is {@code null}.
*/ */
public <T extends Principal> Set<T> getPrincipals(Class<T> c) { public <T extends Principal> Set<T> getPrincipals(Class<T> c) {
@ -632,9 +636,12 @@ public final class Subject implements java.io.Serializable {
* to the returned {@code Set} affects the internal public * to the returned {@code Set} affects the internal public
* Credential {@code Set} as well. * Credential {@code Set} as well.
* *
* <p> * <p> If a security manager is installed, the caller must have a
* {@link AuthPermission#AuthPermission(String)
* AuthPermission("modifyPublicCredentials")} permission to modify
* the returned set, or a {@code SecurityException} will be thrown.
* *
* @return A {@code Set} of public credentials held by this * @return a {@code Set} of public credentials held by this
* {@code Subject}. * {@code Subject}.
*/ */
public Set<Object> getPublicCredentials() { public Set<Object> getPublicCredentials() {
@ -653,20 +660,18 @@ public final class Subject implements java.io.Serializable {
* to the returned {@code Set} affects the internal private * to the returned {@code Set} affects the internal private
* Credential {@code Set} as well. * Credential {@code Set} as well.
* *
* <p> A caller requires permissions to access the Credentials * <p> If a security manager is installed, the caller must have a
* in the returned {@code Set}, or to modify the * {@link AuthPermission#AuthPermission(String)
* {@code Set} itself. A {@code SecurityException} * AuthPermission("modifyPrivateCredentials")} permission to modify
* is thrown if the caller does not have the proper permissions. * the returned set, or a {@code SecurityException} will be thrown.
* *
* <p> While iterating through the {@code Set}, * <p> While iterating through the {@code Set},
* a {@code SecurityException} is thrown * a {@code SecurityException} is thrown if a security manager is installed
* if the caller does not have permission to access a * and the caller does not have a {@link PrivateCredentialPermission}
* particular Credential. The {@code Iterator} * to access a particular Credential. The {@code Iterator}
* is nevertheless advanced to next element in the {@code Set}. * is nevertheless advanced to the next element in the {@code Set}.
* *
* <p> * @return a {@code Set} of private credentials held by this
*
* @return A {@code Set} of private credentials held by this
* {@code Subject}. * {@code Subject}.
*/ */
public Set<Object> getPrivateCredentials() { public Set<Object> getPrivateCredentials() {
@ -695,8 +700,6 @@ public final class Subject implements java.io.Serializable {
* Modifications to the returned {@code Set} * Modifications to the returned {@code Set}
* will not affect the internal public Credential {@code Set}. * will not affect the internal public Credential {@code Set}.
* *
* <p>
*
* @param <T> the type of the class modeled by {@code c} * @param <T> the type of the class modeled by {@code c}
* *
* @param c the returned {@code Set} of public credentials will all be * @param c the returned {@code Set} of public credentials will all be
@ -705,7 +708,7 @@ public final class Subject implements java.io.Serializable {
* @return a {@code Set} of public credentials that are instances * @return a {@code Set} of public credentials that are instances
* of the specified {@code Class}. * of the specified {@code Class}.
* *
* @exception NullPointerException if the specified {@code Class} * @throws NullPointerException if the specified {@code Class}
* is {@code null}. * is {@code null}.
*/ */
public <T> Set<T> getPublicCredentials(Class<T> c) { public <T> Set<T> getPublicCredentials(Class<T> c) {
@ -723,9 +726,9 @@ public final class Subject implements java.io.Serializable {
* {@code Subject} that are instances or subclasses of the specified * {@code Subject} that are instances or subclasses of the specified
* {@code Class}. * {@code Class}.
* *
* <p> The caller must have permission to access all of the * <p> If a security manager is installed, the caller must have a
* requested Credentials, or a {@code SecurityException} * {@link PrivateCredentialPermission} to access all of the requested
* will be thrown. * Credentials, or a {@code SecurityException} will be thrown.
* *
* <p> The returned {@code Set} is not backed by this Subject's * <p> The returned {@code Set} is not backed by this Subject's
* internal private Credential {@code Set}. A new * internal private Credential {@code Set}. A new
@ -733,8 +736,6 @@ public final class Subject implements java.io.Serializable {
* Modifications to the returned {@code Set} * Modifications to the returned {@code Set}
* will not affect the internal private Credential {@code Set}. * will not affect the internal private Credential {@code Set}.
* *
* <p>
*
* @param <T> the type of the class modeled by {@code c} * @param <T> the type of the class modeled by {@code c}
* *
* @param c the returned {@code Set} of private credentials will all be * @param c the returned {@code Set} of private credentials will all be
@ -743,7 +744,7 @@ public final class Subject implements java.io.Serializable {
* @return a {@code Set} of private credentials that are instances * @return a {@code Set} of private credentials that are instances
* of the specified {@code Class}. * of the specified {@code Class}.
* *
* @exception NullPointerException if the specified {@code Class} * @throws NullPointerException if the specified {@code Class}
* is {@code null}. * is {@code null}.
*/ */
public <T> Set<T> getPrivateCredentials(Class<T> c) { public <T> Set<T> getPrivateCredentials(Class<T> c) {
@ -772,19 +773,18 @@ public final class Subject implements java.io.Serializable {
* equal if their {@code Principal} and {@code Credential} * equal if their {@code Principal} and {@code Credential}
* Sets are equal. * Sets are equal.
* *
* <p>
*
* @param o Object to be compared for equality with this * @param o Object to be compared for equality with this
* {@code Subject}. * {@code Subject}.
* *
* @return true if the specified Object is equal to this * @return true if the specified Object is equal to this
* {@code Subject}. * {@code Subject}.
* *
* @exception SecurityException if the caller does not have permission * @throws SecurityException if a security manager is installed and the
* to access the private credentials for this {@code Subject}, * caller does not have a {@link PrivateCredentialPermission}
* or if the caller does not have permission to access the * permission to access the private credentials for this
* private credentials for the provided {@code Subject}. * {@code Subject} or the provided {@code Subject}.
*/ */
@Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (o == null) { if (o == null) {
@ -834,10 +834,9 @@ public final class Subject implements java.io.Serializable {
/** /**
* Return the String representation of this {@code Subject}. * Return the String representation of this {@code Subject}.
* *
* <p>
*
* @return the String representation of this {@code Subject}. * @return the String representation of this {@code Subject}.
*/ */
@Override
public String toString() { public String toString() {
return toString(true); return toString(true);
} }
@ -895,13 +894,13 @@ public final class Subject implements java.io.Serializable {
/** /**
* Returns a hashcode for this {@code Subject}. * Returns a hashcode for this {@code Subject}.
* *
* <p>
*
* @return a hashcode for this {@code Subject}. * @return a hashcode for this {@code Subject}.
* *
* @exception SecurityException if the caller does not have permission * @throws SecurityException if a security manager is installed and the
* to access this Subject's private credentials. * caller does not have a {@link PrivateCredentialPermission}
* permission to access this Subject's private credentials.
*/ */
@Override
public int hashCode() { public int hashCode() {
/** /**
@ -996,7 +995,7 @@ public final class Subject implements java.io.Serializable {
* *
* @param coll A {@code Collection} to be tested for null references * @param coll A {@code Collection} to be tested for null references
* *
* @exception NullPointerException if the specified collection is either * @throws NullPointerException if the specified collection is either
* {@code null} or contains a {@code null} element * {@code null} or contains a {@code null} element
*/ */
private static void collectionNullClean(Collection<?> coll) { private static void collectionNullClean(Collection<?> coll) {
@ -1546,7 +1545,7 @@ public final class Subject implements java.io.Serializable {
} }
} }
static class AuthPermissionHolder { static final class AuthPermissionHolder {
static final AuthPermission DO_AS_PERMISSION = static final AuthPermission DO_AS_PERMISSION =
new AuthPermission("doAs"); new AuthPermission("doAs");

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -41,20 +41,15 @@ import java.util.TimeZone;
* <code>CalendarDate</code>. * <code>CalendarDate</code>.
* *
* <p>The following era names are defined in this release. * <p>The following era names are defined in this release.
* <!-- TODO: use HTML table --> * <pre>{@code
* <pre><tt>
* Calendar system Era name Since (in Gregorian) * Calendar system Era name Since (in Gregorian)
* ----------------------------------------------------------------------- * -----------------------------------------------------------------------
* Japanese calendar Meiji 1868-01-01 midnight local time * Japanese calendar Meiji 1868-01-01T00:00:00 local time
* Taisho 1912-07-30 midnight local time * Taisho 1912-07-30T00:00:00 local time
* Showa 1926-12-26 midnight local time * Showa 1926-12-25T00:00:00 local time
* Heisei 1989-01-08 midnight local time * Heisei 1989-01-08T00:00:00 local time
* Julian calendar BeforeCommonEra -292275055-05-16T16:47:04.192Z
* CommonEra 0000-12-30 midnight local time
* Taiwanese calendar MinGuo 1911-01-01 midnight local time
* Thai Buddhist calendar BuddhistEra -543-01-01 midnight local time
* ----------------------------------------------------------------------- * -----------------------------------------------------------------------
* </tt></pre> * }</pre>
* *
* @author Masayoshi Okutsu * @author Masayoshi Okutsu
* @since 1.5 * @since 1.5

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -25,11 +25,7 @@
package sun.util.calendar; package sun.util.calendar;
import java.io.IOException; import java.security.AccessController;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.StringTokenizer;
import java.util.TimeZone; import java.util.TimeZone;
/** /**
@ -39,6 +35,28 @@ import java.util.TimeZone;
*/ */
public class LocalGregorianCalendar extends BaseCalendar { public class LocalGregorianCalendar extends BaseCalendar {
private static final Era[] JAPANESE_ERAS = {
new Era("Meiji", "M", -3218832000000L, true),
new Era("Taisho", "T", -1812153600000L, true),
new Era("Showa", "S", -1357603200000L, true),
new Era("Heisei", "H", 600220800000L, true),
};
private static boolean isValidEra(Era newEra, Era[] eras) {
Era last = eras[eras.length - 1];
if (last.getSinceDate().getYear() >= newEra.getSinceDate().getYear()) {
return false;
}
// The new era name should be unique. Its abbr may not.
String newName = newEra.getName();
for (Era era : eras) {
if (era.getName().equals(newName)) {
return false;
}
}
return true;
}
private String name; private String name;
private Era[] eras; private Era[] eras;
@ -118,58 +136,70 @@ public class LocalGregorianCalendar extends BaseCalendar {
} }
static LocalGregorianCalendar getLocalGregorianCalendar(String name) { static LocalGregorianCalendar getLocalGregorianCalendar(String name) {
Properties calendarProps; // Only the Japanese calendar is supported.
try { if (!"japanese".equals(name)) {
calendarProps = CalendarSystem.getCalendarProperties();
} catch (IOException | IllegalArgumentException e) {
throw new InternalError(e);
}
// Parse calendar.*.eras
String props = calendarProps.getProperty("calendar." + name + ".eras");
if (props == null) {
return null; return null;
} }
List<Era> eras = new ArrayList<>();
StringTokenizer eraTokens = new StringTokenizer(props, ";");
while (eraTokens.hasMoreTokens()) {
String items = eraTokens.nextToken().trim();
StringTokenizer itemTokens = new StringTokenizer(items, ",");
String eraName = null;
boolean localTime = true;
long since = 0;
String abbr = null;
while (itemTokens.hasMoreTokens()) { // Append an era to the predefined eras if it's given by the property.
String item = itemTokens.nextToken(); String prop = AccessController.doPrivileged(
int index = item.indexOf('='); new sun.security.action.GetPropertyAction("jdk.calendar.japanese.supplemental.era"));
// it must be in the key=value form. if (prop != null) {
if (index == -1) { Era era = parseEraEntry(prop);
return null; if (era != null) {
} if (isValidEra(era, JAPANESE_ERAS)) {
String key = item.substring(0, index); int length = JAPANESE_ERAS.length;
String value = item.substring(index + 1); Era[] eras = new Era[length + 1];
if ("name".equals(key)) { System.arraycopy(JAPANESE_ERAS, 0, eras, 0, length);
eraName = value; eras[length] = era;
} else if ("since".equals(key)) { return new LocalGregorianCalendar(name, eras);
if (value.endsWith("u")) {
localTime = false;
since = Long.parseLong(value.substring(0, value.length() - 1));
} else {
since = Long.parseLong(value);
}
} else if ("abbr".equals(key)) {
abbr = value;
} else {
throw new RuntimeException("Unknown key word: " + key);
} }
} }
Era era = new Era(eraName, abbr, since, localTime);
eras.add(era);
} }
Era[] eraArray = new Era[eras.size()]; return new LocalGregorianCalendar(name, JAPANESE_ERAS);
eras.toArray(eraArray); }
return new LocalGregorianCalendar(name, eraArray); private static Era parseEraEntry(String entry) {
String[] keyValuePairs = entry.split(",");
String eraName = null;
boolean localTime = true;
long since = 0;
String abbr = null;
for (String item : keyValuePairs) {
String[] keyvalue = item.split("=");
if (keyvalue.length != 2) {
return null;
}
String key = keyvalue[0].trim();
String value = keyvalue[1].trim();
switch (key) {
case "name":
eraName = value;
break;
case "since":
if (value.endsWith("u")) {
localTime = false;
value = value.substring(0, value.length() - 1);
}
try {
since = Long.parseLong(value);
} catch (NumberFormatException e) {
return null;
}
break;
case "abbr":
abbr = value;
break;
default:
return null;
}
}
if (eraName == null || eraName.isEmpty()
|| abbr == null || abbr.isEmpty()) {
return null;
}
return new Era(eraName, abbr, since, localTime);
} }
private LocalGregorianCalendar(String name, Era[] eras) { private LocalGregorianCalendar(String name, Era[] eras) {
@ -262,9 +292,8 @@ public class LocalGregorianCalendar extends BaseCalendar {
} }
private boolean validateEra(Era era) { private boolean validateEra(Era era) {
// Validate the era for (Era era1 : eras) {
for (int i = 0; i < eras.length; i++) { if (era == era1) {
if (era == eras[i]) {
return true; return true;
} }
} }
@ -333,6 +362,7 @@ public class LocalGregorianCalendar extends BaseCalendar {
} }
if (i >= 0) { if (i >= 0) {
ldate.setLocalEra(era); ldate.setLocalEra(era);
@SuppressWarnings("null")
int y = ldate.getNormalizedYear() - era.getSinceDate().getYear() + 1; int y = ldate.getNormalizedYear() - era.getSinceDate().getYear() + 1;
ldate.setLocalYear(y); ldate.setLocalYear(y);
} else { } else {

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -30,6 +30,7 @@ import java.security.AccessController;
import java.security.PrivilegedAction; import java.security.PrivilegedAction;
import java.text.spi.BreakIteratorProvider; import java.text.spi.BreakIteratorProvider;
import java.text.spi.CollatorProvider; import java.text.spi.CollatorProvider;
import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.Locale; import java.util.Locale;
import java.util.ResourceBundle; import java.util.ResourceBundle;
@ -102,6 +103,9 @@ public class CLDRLocaleProviderAdapter extends JRELocaleProviderAdapter {
@Override @Override
protected Set<String> createLanguageTagSet(String category) { protected Set<String> createLanguageTagSet(String category) {
ResourceBundle rb = ResourceBundle.getBundle("sun.util.cldr.CLDRLocaleDataMetaInfo", Locale.ROOT); ResourceBundle rb = ResourceBundle.getBundle("sun.util.cldr.CLDRLocaleDataMetaInfo", Locale.ROOT);
if (rb.containsKey(category)) {
return Collections.emptySet();
}
String supportedLocaleString = rb.getString(category); String supportedLocaleString = rb.getString(category);
Set<String> tagset = new HashSet<>(); Set<String> tagset = new HashSet<>();
StringTokenizer tokens = new StringTokenizer(supportedLocaleString); StringTokenizer tokens = new StringTokenizer(supportedLocaleString);

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -34,6 +34,7 @@ import java.text.spi.DateFormatProvider;
import java.text.spi.DateFormatSymbolsProvider; import java.text.spi.DateFormatSymbolsProvider;
import java.text.spi.DecimalFormatSymbolsProvider; import java.text.spi.DecimalFormatSymbolsProvider;
import java.text.spi.NumberFormatProvider; import java.text.spi.NumberFormatProvider;
import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.Locale; import java.util.Locale;
import java.util.Set; import java.util.Set;
@ -356,6 +357,9 @@ public class JRELocaleProviderAdapter extends LocaleProviderAdapter implements R
protected Set<String> createLanguageTagSet(String category) { protected Set<String> createLanguageTagSet(String category) {
String supportedLocaleString = LocaleDataMetaInfo.getSupportedLocaleString(category); String supportedLocaleString = LocaleDataMetaInfo.getSupportedLocaleString(category);
if (supportedLocaleString == null) {
return Collections.emptySet();
}
Set<String> tagset = new HashSet<>(); Set<String> tagset = new HashSet<>();
StringTokenizer tokens = new StringTokenizer(supportedLocaleString); StringTokenizer tokens = new StringTokenizer(supportedLocaleString);
while (tokens.hasMoreTokens()) { while (tokens.hasMoreTokens()) {

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -57,6 +57,12 @@ public class LocaleDataMetaInfo {
resourceNameToLocales.put("CollationData", resourceNameToLocales.put("CollationData",
" #CollationData_ENLocales# | #CollationData_NonENLocales# "); " #CollationData_ENLocales# | #CollationData_NonENLocales# ");
resourceNameToLocales.put("BreakIteratorInfo",
" #BreakIteratorInfo_ENLocales# | #BreakIteratorInfo_NonENLocales# ");
resourceNameToLocales.put("BreakIteratorRules",
" #BreakIteratorRules_ENLocales# | #BreakIteratorRules_NonENLocales# ");
resourceNameToLocales.put("TimeZoneNames", resourceNameToLocales.put("TimeZoneNames",
" #TimeZoneNames_ENLocales# | #TimeZoneNames_NonENLocales# "); " #TimeZoneNames_ENLocales# | #TimeZoneNames_NonENLocales# ");

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -295,7 +295,7 @@ public abstract class LocaleProviderAdapter {
* A utility method for implementing the default LocaleServiceProvider.isSupportedLocale * A utility method for implementing the default LocaleServiceProvider.isSupportedLocale
* for the JRE, CLDR, and FALLBACK adapters. * for the JRE, CLDR, and FALLBACK adapters.
*/ */
static boolean isSupportedLocale(Locale locale, LocaleProviderAdapter.Type type, Set<String> langtags) { public static boolean isSupportedLocale(Locale locale, LocaleProviderAdapter.Type type, Set<String> langtags) {
assert type == Type.JRE || type == Type.CLDR || type == Type.FALLBACK; assert type == Type.JRE || type == Type.CLDR || type == Type.FALLBACK;
if (Locale.ROOT.equals(locale)) { if (Locale.ROOT.equals(locale)) {
return true; return true;

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -48,8 +48,11 @@ import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.MissingResourceException; import java.util.MissingResourceException;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import java.util.Set;
import sun.util.locale.provider.JRELocaleProviderAdapter;
import sun.util.locale.provider.LocaleDataMetaInfo; import sun.util.locale.provider.LocaleDataMetaInfo;
import sun.util.locale.provider.LocaleProviderAdapter; import sun.util.locale.provider.LocaleProviderAdapter;
import static sun.util.locale.provider.LocaleProviderAdapter.Type.CLDR;
import static sun.util.locale.provider.LocaleProviderAdapter.Type.JRE; import static sun.util.locale.provider.LocaleProviderAdapter.Type.JRE;
/** /**
@ -204,35 +207,23 @@ public class LocaleData {
@Override @Override
public List<Locale> getCandidateLocales(String baseName, Locale locale) { public List<Locale> getCandidateLocales(String baseName, Locale locale) {
List<Locale> candidates = super.getCandidateLocales(baseName, locale); List<Locale> candidates = super.getCandidateLocales(baseName, locale);
/* Get the locale string list from LocaleDataMetaInfo class. */ // Weed out Locales which are known to have no resource bundles
String localeString = LocaleDataMetaInfo.getSupportedLocaleString(baseName); int lastDot = baseName.lastIndexOf('.');
String category = (lastDot >= 0) ? baseName.substring(lastDot + 1) : baseName;
if (localeString != null && localeString.length() != 0) { LocaleProviderAdapter.Type type = baseName.contains(DOTCLDR) ? CLDR : JRE;
for (Iterator<Locale> l = candidates.iterator(); l.hasNext();) { LocaleProviderAdapter adapter = LocaleProviderAdapter.forType(type);
Locale loc = l.next(); Set<String> langtags = ((JRELocaleProviderAdapter)adapter).getLanguageTagSet(category);
String lstr; if (!langtags.isEmpty()) {
if (loc.getScript().length() > 0) { for (Iterator<Locale> itr = candidates.iterator(); itr.hasNext();) {
lstr = loc.toLanguageTag().replace('-', '_'); if (!LocaleProviderAdapter.isSupportedLocale(itr.next(), type, langtags)) {
} else { itr.remove();
lstr = loc.toString();
int idx = lstr.indexOf("_#");
if (idx >= 0) {
lstr = lstr.substring(0, idx);
}
}
/* Every locale string in the locale string list returned from
the above getSupportedLocaleString is enclosed
within two white spaces so that we could check some locale
such as "en".
*/
if (lstr.length() != 0 && localeString.indexOf(" " + lstr + " ") == -1) {
l.remove();
} }
} }
} }
// Force fallback to Locale.ENGLISH for CLDR time zone names support // Force fallback to Locale.ENGLISH for CLDR time zone names support
if (locale.getLanguage() != "en" if (locale.getLanguage() != "en"
&& baseName.contains(CLDR) && baseName.endsWith("TimeZoneNames")) { && type == CLDR && category.equals("TimeZoneNames")) {
candidates.add(candidates.size() - 1, Locale.ENGLISH); candidates.add(candidates.size() - 1, Locale.ENGLISH);
} }
return candidates; return candidates;
@ -254,7 +245,7 @@ public class LocaleData {
return null; return null;
} }
private static final String CLDR = ".cldr"; private static final String DOTCLDR = ".cldr";
/** /**
* Changes baseName to its per-language package name and * Changes baseName to its per-language package name and
@ -275,8 +266,8 @@ public class LocaleData {
assert JRE.getUtilResourcesPackage().length() assert JRE.getUtilResourcesPackage().length()
== JRE.getTextResourcesPackage().length(); == JRE.getTextResourcesPackage().length();
int index = JRE.getUtilResourcesPackage().length(); int index = JRE.getUtilResourcesPackage().length();
if (baseName.indexOf(CLDR, index) > 0) { if (baseName.indexOf(DOTCLDR, index) > 0) {
index += CLDR.length(); index += DOTCLDR.length();
} }
newBaseName = baseName.substring(0, index + 1) + lang newBaseName = baseName.substring(0, index + 1) + lang
+ baseName.substring(index); + baseName.substring(index);

View file

@ -1,4 +1,4 @@
# Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
# #
# This code is free software; you can redistribute it and/or modify it # This code is free software; you can redistribute it and/or modify it
@ -22,37 +22,6 @@
# questions. # questions.
# #
#
# Japanese imperial calendar
#
# Meiji since 1868-01-01 00:00:00 local time (Gregorian)
# Taisho since 1912-07-30 00:00:00 local time (Gregorian)
# Showa since 1926-12-25 00:00:00 local time (Gregorian)
# Heisei since 1989-01-08 00:00:00 local time (Gregorian)
calendar.japanese.type: LocalGregorianCalendar
calendar.japanese.eras: \
name=Meiji,abbr=M,since=-3218832000000; \
name=Taisho,abbr=T,since=-1812153600000; \
name=Showa,abbr=S,since=-1357603200000; \
name=Heisei,abbr=H,since=600220800000
#
# Taiwanese calendar
# Minguo since 1911-01-01 00:00:00 local time (Gregorian)
calendar.taiwanese.type: LocalGregorianCalendar
calendar.taiwanese.eras: \
name=MinGuo,since=-1830384000000
#
# Thai Buddhist calendar
# Buddhist Era since -542-01-01 00:00:00 local time (Gregorian)
calendar.thai-buddhist.type: LocalGregorianCalendar
calendar.thai-buddhist.eras: \
name=BuddhistEra,abbr=B.E.,since=-79302585600000
calendar.thai-buddhist.year-boundary: \
day1=4-1,since=-79302585600000; \
day1=1-1,since=-915148800000
# #
# Hijrah calendars # Hijrah calendars
# #

View file

@ -65,16 +65,25 @@
# #
# List of providers and their preference orders (see above): # List of providers and their preference orders (see above):
# #
security.provider.1=sun.security.provider.Sun #ifdef solaris
security.provider.2=sun.security.rsa.SunRsaSign security.provider.tbd=com.oracle.security.ucrypto.UcryptoProvider ${java.home}/lib/security/ucrypto-solaris.cfg
security.provider.3=sun.security.ec.SunEC security.provider.tbd=sun.security.pkcs11.SunPKCS11 ${java.home}/lib/security/sunpkcs11-solaris.cfg
security.provider.4=com.sun.net.ssl.internal.ssl.Provider #endif
security.provider.5=com.sun.crypto.provider.SunJCE security.provider.tbd=sun.security.provider.Sun
security.provider.6=sun.security.jgss.SunProvider security.provider.tbd=sun.security.rsa.SunRsaSign
security.provider.7=com.sun.security.sasl.Provider security.provider.tbd=sun.security.ec.SunEC
security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI security.provider.tbd=com.sun.net.ssl.internal.ssl.Provider
security.provider.9=sun.security.smartcardio.SunPCSC security.provider.tbd=com.sun.crypto.provider.SunJCE
security.provider.10=sun.security.mscapi.SunMSCAPI security.provider.tbd=sun.security.jgss.SunProvider
security.provider.tbd=com.sun.security.sasl.Provider
security.provider.tbd=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.tbd=sun.security.smartcardio.SunPCSC
#ifdef windows
security.provider.tbd=sun.security.mscapi.SunMSCAPI
#endif
#ifdef macosx
security.provider.tbd=apple.security.AppleProvider
#endif
# #
# Sun Provider SecureRandom seed source. # Sun Provider SecureRandom seed source.
@ -127,7 +136,12 @@ securerandom.source=file:/dev/random
# This is a comma-separated list of algorithm and/or algorithm:provider # This is a comma-separated list of algorithm and/or algorithm:provider
# entries. # entries.
# #
#ifdef windows
securerandom.strongAlgorithms=Windows-PRNG:SunMSCAPI,SHA1PRNG:SUN securerandom.strongAlgorithms=Windows-PRNG:SunMSCAPI,SHA1PRNG:SUN
#endif
#ifndef windows
securerandom.strongAlgorithms=NativePRNGBlocking:SUN
#endif
# #
# Class to instantiate as the javax.security.auth.login.Configuration # Class to instantiate as the javax.security.auth.login.Configuration
@ -212,7 +226,9 @@ package.access=sun.,\
jdk.nashorn.internal.,\ jdk.nashorn.internal.,\
jdk.nashorn.tools.,\ jdk.nashorn.tools.,\
com.sun.activation.registries.,\ com.sun.activation.registries.,\
com.sun.java.accessibility. #ifdef macosx
apple.,\
#endif
# #
# List of comma-separated packages that start with or equal this string # List of comma-separated packages that start with or equal this string
@ -259,7 +275,9 @@ package.definition=sun.,\
jdk.nashorn.internal.,\ jdk.nashorn.internal.,\
jdk.nashorn.tools.,\ jdk.nashorn.tools.,\
com.sun.activation.registries.,\ com.sun.activation.registries.,\
com.sun.java.accessibility. #ifdef macosx
apple.,\
#endif
# #
# Determines whether this properties file can be appended to # Determines whether this properties file can be appended to

View file

@ -1,496 +0,0 @@
#
# This is the "master security properties file".
#
# An alternate java.security properties file may be specified
# from the command line via the system property
#
# -Djava.security.properties=<URL>
#
# This properties file appends to the master security properties file.
# If both properties files specify values for the same key, the value
# from the command-line properties file is selected, as it is the last
# one loaded.
#
# Also, if you specify
#
# -Djava.security.properties==<URL> (2 equals),
#
# then that properties file completely overrides the master security
# properties file.
#
# To disable the ability to specify an additional properties file from
# the command line, set the key security.overridePropertiesFile
# to false in the master security properties file. It is set to true
# by default.
# In this file, various security properties are set for use by
# java.security classes. This is where users can statically register
# Cryptography Package Providers ("providers" for short). The term
# "provider" refers to a package or set of packages that supply a
# concrete implementation of a subset of the cryptography aspects of
# the Java Security API. A provider may, for example, implement one or
# more digital signature algorithms or message digest algorithms.
#
# Each provider must implement a subclass of the Provider class.
# To register a provider in this master security properties file,
# specify the Provider subclass name and priority in the format
#
# security.provider.<n>=<className>
#
# This declares a provider, and specifies its preference
# order n. The preference order is the order in which providers are
# searched for requested algorithms (when no specific provider is
# requested). The order is 1-based; 1 is the most preferred, followed
# by 2, and so on.
#
# <className> must specify the subclass of the Provider class whose
# constructor sets the values of various properties that are required
# for the Java Security API to look up the algorithms or other
# facilities implemented by the provider.
#
# There must be at least one provider specification in java.security.
# There is a default provider that comes standard with the JDK. It
# is called the "SUN" provider, and its Provider subclass
# named Sun appears in the sun.security.provider package. Thus, the
# "SUN" provider is registered via the following:
#
# security.provider.1=sun.security.provider.Sun
#
# (The number 1 is used for the default provider.)
#
# Note: Providers can be dynamically registered instead by calls to
# either the addProvider or insertProviderAt method in the Security
# class.
#
# List of providers and their preference orders (see above):
#
security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=sun.security.ec.SunEC
security.provider.4=com.sun.net.ssl.internal.ssl.Provider
security.provider.5=com.sun.crypto.provider.SunJCE
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider
security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.9=sun.security.smartcardio.SunPCSC
#
# Sun Provider SecureRandom seed source.
#
# Select the primary source of seed data for the "SHA1PRNG" and
# "NativePRNG" SecureRandom implementations in the "Sun" provider.
# (Other SecureRandom implementations might also use this property.)
#
# On Unix-like systems (for example, Solaris/Linux/MacOS), the
# "NativePRNG" and "SHA1PRNG" implementations obtains seed data from
# special device files such as file:/dev/random.
#
# On Windows systems, specifying the URLs "file:/dev/random" or
# "file:/dev/urandom" will enable the native Microsoft CryptoAPI seeding
# mechanism for SHA1PRNG.
#
# By default, an attempt is made to use the entropy gathering device
# specified by the "securerandom.source" Security property. If an
# exception occurs while accessing the specified URL:
#
# SHA1PRNG:
# the traditional system/thread activity algorithm will be used.
#
# NativePRNG:
# a default value of /dev/random will be used. If neither
# are available, the implementation will be disabled.
# "file" is the only currently supported protocol type.
#
# The entropy gathering device can also be specified with the System
# property "java.security.egd". For example:
#
# % java -Djava.security.egd=file:/dev/random MainClass
#
# Specifying this System property will override the
# "securerandom.source" Security property.
#
# In addition, if "file:/dev/random" or "file:/dev/urandom" is
# specified, the "NativePRNG" implementation will be more preferred than
# SHA1PRNG in the Sun provider.
#
securerandom.source=file:/dev/random
#
# A list of known strong SecureRandom implementations.
#
# To help guide applications in selecting a suitable strong
# java.security.SecureRandom implementation, Java distributions should
# indicate a list of known strong implementations using the property.
#
# This is a comma-separated list of algorithm and/or algorithm:provider
# entries.
#
securerandom.strongAlgorithms=NativePRNGBlocking:SUN
#
# Class to instantiate as the javax.security.auth.login.Configuration
# provider.
#
login.configuration.provider=sun.security.provider.ConfigFile
#
# Default login configuration file
#
#login.config.url.1=file:${user.home}/.java.login.config
#
# Class to instantiate as the system Policy. This is the name of the class
# that will be used as the Policy object.
#
policy.provider=sun.security.provider.PolicyFile
# The default is to have a single system-wide policy file,
# and a policy file in the user's home directory.
policy.url.1=file:${java.home}/lib/security/java.policy
policy.url.2=file:${user.home}/.java.policy
# whether or not we expand properties in the policy file
# if this is set to false, properties (${...}) will not be expanded in policy
# files.
policy.expandProperties=true
# whether or not we allow an extra policy to be passed on the command line
# with -Djava.security.policy=somefile. Comment out this line to disable
# this feature.
policy.allowSystemProperty=true
# whether or not we look into the IdentityScope for trusted Identities
# when encountering a 1.1 signed JAR file. If the identity is found
# and is trusted, we grant it AllPermission.
policy.ignoreIdentityScope=false
#
# Default keystore type.
#
keystore.type=jks
#
# List of comma-separated packages that start with or equal this string
# will cause a security exception to be thrown when
# passed to checkPackageAccess unless the
# corresponding RuntimePermission ("accessClassInPackage."+package) has
# been granted.
package.access=sun.,\
com.sun.xml.internal.,\
com.sun.imageio.,\
com.sun.istack.internal.,\
com.sun.jmx.,\
com.sun.media.sound.,\
com.sun.naming.internal.,\
com.sun.proxy.,\
com.sun.corba.se.,\
com.sun.org.apache.bcel.internal.,\
com.sun.org.apache.regexp.internal.,\
com.sun.org.apache.xerces.internal.,\
com.sun.org.apache.xpath.internal.,\
com.sun.org.apache.xalan.internal.extensions.,\
com.sun.org.apache.xalan.internal.lib.,\
com.sun.org.apache.xalan.internal.res.,\
com.sun.org.apache.xalan.internal.templates.,\
com.sun.org.apache.xalan.internal.utils.,\
com.sun.org.apache.xalan.internal.xslt.,\
com.sun.org.apache.xalan.internal.xsltc.cmdline.,\
com.sun.org.apache.xalan.internal.xsltc.compiler.,\
com.sun.org.apache.xalan.internal.xsltc.trax.,\
com.sun.org.apache.xalan.internal.xsltc.util.,\
com.sun.org.apache.xml.internal.res.,\
com.sun.org.apache.xml.internal.security.,\
com.sun.org.apache.xml.internal.serializer.utils.,\
com.sun.org.apache.xml.internal.utils.,\
com.sun.org.glassfish.,\
com.oracle.xmlns.internal.,\
com.oracle.webservices.internal.,\
org.jcp.xml.dsig.internal.,\
jdk.internal.,\
jdk.nashorn.internal.,\
jdk.nashorn.tools.
#
# List of comma-separated packages that start with or equal this string
# will cause a security exception to be thrown when
# passed to checkPackageDefinition unless the
# corresponding RuntimePermission ("defineClassInPackage."+package) has
# been granted.
#
# by default, none of the class loaders supplied with the JDK call
# checkPackageDefinition.
#
package.definition=sun.,\
com.sun.xml.internal.,\
com.sun.imageio.,\
com.sun.istack.internal.,\
com.sun.jmx.,\
com.sun.media.sound.,\
com.sun.naming.internal.,\
com.sun.proxy.,\
com.sun.corba.se.,\
com.sun.org.apache.bcel.internal.,\
com.sun.org.apache.regexp.internal.,\
com.sun.org.apache.xerces.internal.,\
com.sun.org.apache.xpath.internal.,\
com.sun.org.apache.xalan.internal.extensions.,\
com.sun.org.apache.xalan.internal.lib.,\
com.sun.org.apache.xalan.internal.res.,\
com.sun.org.apache.xalan.internal.templates.,\
com.sun.org.apache.xalan.internal.utils.,\
com.sun.org.apache.xalan.internal.xslt.,\
com.sun.org.apache.xalan.internal.xsltc.cmdline.,\
com.sun.org.apache.xalan.internal.xsltc.compiler.,\
com.sun.org.apache.xalan.internal.xsltc.trax.,\
com.sun.org.apache.xalan.internal.xsltc.util.,\
com.sun.org.apache.xml.internal.res.,\
com.sun.org.apache.xml.internal.security.,\
com.sun.org.apache.xml.internal.serializer.utils.,\
com.sun.org.apache.xml.internal.utils.,\
com.sun.org.glassfish.,\
com.oracle.xmlns.internal.,\
com.oracle.webservices.internal.,\
org.jcp.xml.dsig.internal.,\
jdk.internal.,\
jdk.nashorn.internal.,\
jdk.nashorn.tools.
#
# Determines whether this properties file can be appended to
# or overridden on the command line via -Djava.security.properties
#
security.overridePropertiesFile=true
#
# Determines the default key and trust manager factory algorithms for
# the javax.net.ssl package.
#
ssl.KeyManagerFactory.algorithm=SunX509
ssl.TrustManagerFactory.algorithm=PKIX
#
# The Java-level namelookup cache policy for successful lookups:
#
# any negative value: caching forever
# any positive value: the number of seconds to cache an address for
# zero: do not cache
#
# default value is forever (FOREVER). For security reasons, this
# caching is made forever when a security manager is set. When a security
# manager is not set, the default behavior in this implementation
# is to cache for 30 seconds.
#
# NOTE: setting this to anything other than the default value can have
# serious security implications. Do not set it unless
# you are sure you are not exposed to DNS spoofing attack.
#
#networkaddress.cache.ttl=-1
# The Java-level namelookup cache policy for failed lookups:
#
# any negative value: cache forever
# any positive value: the number of seconds to cache negative lookup results
# zero: do not cache
#
# In some Microsoft Windows networking environments that employ
# the WINS name service in addition to DNS, name service lookups
# that fail may take a noticeably long time to return (approx. 5 seconds).
# For this reason the default caching policy is to maintain these
# results for 10 seconds.
#
#
networkaddress.cache.negative.ttl=10
#
# Properties to configure OCSP for certificate revocation checking
#
# Enable OCSP
#
# By default, OCSP is not used for certificate revocation checking.
# This property enables the use of OCSP when set to the value "true".
#
# NOTE: SocketPermission is required to connect to an OCSP responder.
#
# Example,
# ocsp.enable=true
#
# Location of the OCSP responder
#
# By default, the location of the OCSP responder is determined implicitly
# from the certificate being validated. This property explicitly specifies
# the location of the OCSP responder. The property is used when the
# Authority Information Access extension (defined in RFC 3280) is absent
# from the certificate or when it requires overriding.
#
# Example,
# ocsp.responderURL=http://ocsp.example.net:80
#
# Subject name of the OCSP responder's certificate
#
# By default, the certificate of the OCSP responder is that of the issuer
# of the certificate being validated. This property identifies the certificate
# of the OCSP responder when the default does not apply. Its value is a string
# distinguished name (defined in RFC 2253) which identifies a certificate in
# the set of certificates supplied during cert path validation. In cases where
# the subject name alone is not sufficient to uniquely identify the certificate
# then both the "ocsp.responderCertIssuerName" and
# "ocsp.responderCertSerialNumber" properties must be used instead. When this
# property is set then those two properties are ignored.
#
# Example,
# ocsp.responderCertSubjectName="CN=OCSP Responder, O=XYZ Corp"
#
# Issuer name of the OCSP responder's certificate
#
# By default, the certificate of the OCSP responder is that of the issuer
# of the certificate being validated. This property identifies the certificate
# of the OCSP responder when the default does not apply. Its value is a string
# distinguished name (defined in RFC 2253) which identifies a certificate in
# the set of certificates supplied during cert path validation. When this
# property is set then the "ocsp.responderCertSerialNumber" property must also
# be set. When the "ocsp.responderCertSubjectName" property is set then this
# property is ignored.
#
# Example,
# ocsp.responderCertIssuerName="CN=Enterprise CA, O=XYZ Corp"
#
# Serial number of the OCSP responder's certificate
#
# By default, the certificate of the OCSP responder is that of the issuer
# of the certificate being validated. This property identifies the certificate
# of the OCSP responder when the default does not apply. Its value is a string
# of hexadecimal digits (colon or space separators may be present) which
# identifies a certificate in the set of certificates supplied during cert path
# validation. When this property is set then the "ocsp.responderCertIssuerName"
# property must also be set. When the "ocsp.responderCertSubjectName" property
# is set then this property is ignored.
#
# Example,
# ocsp.responderCertSerialNumber=2A:FF:00
#
# Policy for failed Kerberos KDC lookups:
#
# When a KDC is unavailable (network error, service failure, etc), it is
# put inside a blacklist and accessed less often for future requests. The
# value (case-insensitive) for this policy can be:
#
# tryLast
# KDCs in the blacklist are always tried after those not on the list.
#
# tryLess[:max_retries,timeout]
# KDCs in the blacklist are still tried by their order in the configuration,
# but with smaller max_retries and timeout values. max_retries and timeout
# are optional numerical parameters (default 1 and 5000, which means once
# and 5 seconds). Please notes that if any of the values defined here is
# more than what is defined in krb5.conf, it will be ignored.
#
# Whenever a KDC is detected as available, it is removed from the blacklist.
# The blacklist is reset when krb5.conf is reloaded. You can add
# refreshKrb5Config=true to a JAAS configuration file so that krb5.conf is
# reloaded whenever a JAAS authentication is attempted.
#
# Example,
# krb5.kdc.bad.policy = tryLast
# krb5.kdc.bad.policy = tryLess:2,2000
krb5.kdc.bad.policy = tryLast
# Algorithm restrictions for certification path (CertPath) processing
#
# In some environments, certain algorithms or key lengths may be undesirable
# for certification path building and validation. For example, "MD2" is
# generally no longer considered to be a secure hash algorithm. This section
# describes the mechanism for disabling algorithms based on algorithm name
# and/or key length. This includes algorithms used in certificates, as well
# as revocation information such as CRLs and signed OCSP Responses.
#
# The syntax of the disabled algorithm string is described as this Java
# BNF-style:
# DisabledAlgorithms:
# " DisabledAlgorithm { , DisabledAlgorithm } "
#
# DisabledAlgorithm:
# AlgorithmName [Constraint]
#
# AlgorithmName:
# (see below)
#
# Constraint:
# KeySizeConstraint
#
# KeySizeConstraint:
# keySize Operator DecimalInteger
#
# Operator:
# <= | < | == | != | >= | >
#
# DecimalInteger:
# DecimalDigits
#
# DecimalDigits:
# DecimalDigit {DecimalDigit}
#
# DecimalDigit: one of
# 1 2 3 4 5 6 7 8 9 0
#
# The "AlgorithmName" is the standard algorithm name of the disabled
# algorithm. See "Java Cryptography Architecture Standard Algorithm Name
# Documentation" for information about Standard Algorithm Names. Matching
# is performed using a case-insensitive sub-element matching rule. (For
# example, in "SHA1withECDSA" the sub-elements are "SHA1" for hashing and
# "ECDSA" for signatures.) If the assertion "AlgorithmName" is a
# sub-element of the certificate algorithm name, the algorithm will be
# rejected during certification path building and validation. For example,
# the assertion algorithm name "DSA" will disable all certificate algorithms
# that rely on DSA, such as NONEwithDSA, SHA1withDSA. However, the assertion
# will not disable algorithms related to "ECDSA".
#
# A "Constraint" provides further guidance for the algorithm being specified.
# The "KeySizeConstraint" requires a key of a valid size range if the
# "AlgorithmName" is of a key algorithm. The "DecimalInteger" indicates the
# key size specified in number of bits. For example, "RSA keySize <= 1024"
# indicates that any RSA key with key size less than or equal to 1024 bits
# should be disabled, and "RSA keySize < 1024, RSA keySize > 2048" indicates
# that any RSA key with key size less than 1024 or greater than 2048 should
# be disabled. Note that the "KeySizeConstraint" only makes sense to key
# algorithms.
#
# Note: This property is currently used by Oracle's PKIX implementation. It
# is not guaranteed to be examined and used by other implementations.
#
# Example:
# jdk.certpath.disabledAlgorithms=MD2, DSA, RSA keySize < 2048
#
#
jdk.certpath.disabledAlgorithms=MD2, MD5, RSA keySize < 1024
# Algorithm restrictions for Secure Socket Layer/Transport Layer Security
# (SSL/TLS) processing
#
# In some environments, certain algorithms or key lengths may be undesirable
# when using SSL/TLS. This section describes the mechanism for disabling
# algorithms during SSL/TLS security parameters negotiation, including cipher
# suites selection, peer authentication and key exchange mechanisms.
#
# For PKI-based peer authentication and key exchange mechanisms, this list
# of disabled algorithms will also be checked during certification path
# building and validation, including algorithms used in certificates, as
# well as revocation information such as CRLs and signed OCSP Responses.
# This is in addition to the jdk.certpath.disabledAlgorithms property above.
#
# See the specification of "jdk.certpath.disabledAlgorithms" for the
# syntax of the disabled algorithm string.
#
# Note: This property is currently used by Oracle's JSSE implementation.
# It is not guaranteed to be examined and used by other implementations.
#
# Example:
# jdk.tls.disabledAlgorithms=MD5, SHA1, DSA, RSA keySize < 2048

View file

@ -1,496 +0,0 @@
#
# This is the "master security properties file".
#
# An alternate java.security properties file may be specified
# from the command line via the system property
#
# -Djava.security.properties=<URL>
#
# This properties file appends to the master security properties file.
# If both properties files specify values for the same key, the value
# from the command-line properties file is selected, as it is the last
# one loaded.
#
# Also, if you specify
#
# -Djava.security.properties==<URL> (2 equals),
#
# then that properties file completely overrides the master security
# properties file.
#
# To disable the ability to specify an additional properties file from
# the command line, set the key security.overridePropertiesFile
# to false in the master security properties file. It is set to true
# by default.
# In this file, various security properties are set for use by
# java.security classes. This is where users can statically register
# Cryptography Package Providers ("providers" for short). The term
# "provider" refers to a package or set of packages that supply a
# concrete implementation of a subset of the cryptography aspects of
# the Java Security API. A provider may, for example, implement one or
# more digital signature algorithms or message digest algorithms.
#
# Each provider must implement a subclass of the Provider class.
# To register a provider in this master security properties file,
# specify the Provider subclass name and priority in the format
#
# security.provider.<n>=<className>
#
# This declares a provider, and specifies its preference
# order n. The preference order is the order in which providers are
# searched for requested algorithms (when no specific provider is
# requested). The order is 1-based; 1 is the most preferred, followed
# by 2, and so on.
#
# <className> must specify the subclass of the Provider class whose
# constructor sets the values of various properties that are required
# for the Java Security API to look up the algorithms or other
# facilities implemented by the provider.
#
# There must be at least one provider specification in java.security.
# There is a default provider that comes standard with the JDK. It
# is called the "SUN" provider, and its Provider subclass
# named Sun appears in the sun.security.provider package. Thus, the
# "SUN" provider is registered via the following:
#
# security.provider.1=sun.security.provider.Sun
#
# (The number 1 is used for the default provider.)
#
# Note: Providers can be dynamically registered instead by calls to
# either the addProvider or insertProviderAt method in the Security
# class.
#
# List of providers and their preference orders (see above):
#
security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=sun.security.ec.SunEC
security.provider.4=com.sun.net.ssl.internal.ssl.Provider
security.provider.5=com.sun.crypto.provider.SunJCE
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider
security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.9=sun.security.smartcardio.SunPCSC
#
# Sun Provider SecureRandom seed source.
#
# Select the primary source of seed data for the "SHA1PRNG" and
# "NativePRNG" SecureRandom implementations in the "Sun" provider.
# (Other SecureRandom implementations might also use this property.)
#
# On Unix-like systems (for example, Solaris/Linux/MacOS), the
# "NativePRNG" and "SHA1PRNG" implementations obtains seed data from
# special device files such as file:/dev/random.
#
# On Windows systems, specifying the URLs "file:/dev/random" or
# "file:/dev/urandom" will enable the native Microsoft CryptoAPI seeding
# mechanism for SHA1PRNG.
#
# By default, an attempt is made to use the entropy gathering device
# specified by the "securerandom.source" Security property. If an
# exception occurs while accessing the specified URL:
#
# SHA1PRNG:
# the traditional system/thread activity algorithm will be used.
#
# NativePRNG:
# a default value of /dev/random will be used. If neither
# are available, the implementation will be disabled.
# "file" is the only currently supported protocol type.
#
# The entropy gathering device can also be specified with the System
# property "java.security.egd". For example:
#
# % java -Djava.security.egd=file:/dev/random MainClass
#
# Specifying this System property will override the
# "securerandom.source" Security property.
#
# In addition, if "file:/dev/random" or "file:/dev/urandom" is
# specified, the "NativePRNG" implementation will be more preferred than
# SHA1PRNG in the Sun provider.
#
securerandom.source=file:/dev/random
#
# A list of known strong SecureRandom implementations.
#
# To help guide applications in selecting a suitable strong
# java.security.SecureRandom implementation, Java distributions should
# indicate a list of known strong implementations using the property.
#
# This is a comma-separated list of algorithm and/or algorithm:provider
# entries.
#
securerandom.strongAlgorithms=NativePRNGBlocking:SUN
#
# Class to instantiate as the javax.security.auth.login.Configuration
# provider.
#
login.configuration.provider=sun.security.provider.ConfigFile
#
# Default login configuration file
#
#login.config.url.1=file:${user.home}/.java.login.config
#
# Class to instantiate as the system Policy. This is the name of the class
# that will be used as the Policy object.
#
policy.provider=sun.security.provider.PolicyFile
# The default is to have a single system-wide policy file,
# and a policy file in the user's home directory.
policy.url.1=file:${java.home}/lib/security/java.policy
policy.url.2=file:${user.home}/.java.policy
# whether or not we expand properties in the policy file
# if this is set to false, properties (${...}) will not be expanded in policy
# files.
policy.expandProperties=true
# whether or not we allow an extra policy to be passed on the command line
# with -Djava.security.policy=somefile. Comment out this line to disable
# this feature.
policy.allowSystemProperty=true
# whether or not we look into the IdentityScope for trusted Identities
# when encountering a 1.1 signed JAR file. If the identity is found
# and is trusted, we grant it AllPermission.
policy.ignoreIdentityScope=false
#
# Default keystore type.
#
keystore.type=jks
#
# List of comma-separated packages that start with or equal this string
# will cause a security exception to be thrown when
# passed to checkPackageAccess unless the
# corresponding RuntimePermission ("accessClassInPackage."+package) has
# been granted.
package.access=sun.,\
com.sun.xml.internal.,\
com.sun.imageio.,\
com.sun.istack.internal.,\
com.sun.jmx.,\
com.sun.media.sound.,\
com.sun.naming.internal.,\
com.sun.proxy.,\
com.sun.corba.se.,\
com.sun.org.apache.bcel.internal.,\
com.sun.org.apache.regexp.internal.,\
com.sun.org.apache.xerces.internal.,\
com.sun.org.apache.xpath.internal.,\
com.sun.org.apache.xalan.internal.extensions.,\
com.sun.org.apache.xalan.internal.lib.,\
com.sun.org.apache.xalan.internal.res.,\
com.sun.org.apache.xalan.internal.templates.,\
com.sun.org.apache.xalan.internal.utils.,\
com.sun.org.apache.xalan.internal.xslt.,\
com.sun.org.apache.xalan.internal.xsltc.cmdline.,\
com.sun.org.apache.xalan.internal.xsltc.compiler.,\
com.sun.org.apache.xalan.internal.xsltc.trax.,\
com.sun.org.apache.xalan.internal.xsltc.util.,\
com.sun.org.apache.xml.internal.res.,\
com.sun.org.apache.xml.internal.security.,\
com.sun.org.apache.xml.internal.serializer.utils.,\
com.sun.org.apache.xml.internal.utils.,\
com.sun.org.glassfish.,\
com.oracle.xmlns.internal.,\
com.oracle.webservices.internal.,\
org.jcp.xml.dsig.internal.,\
jdk.internal.,\
jdk.nashorn.internal.,\
jdk.nashorn.tools.,\
com.sun.activation.registries.
#
# List of comma-separated packages that start with or equal this string
# will cause a security exception to be thrown when
# passed to checkPackageDefinition unless the
# corresponding RuntimePermission ("defineClassInPackage."+package) has
# been granted.
#
# by default, none of the class loaders supplied with the JDK call
# checkPackageDefinition.
#
package.definition=sun.,\
com.sun.xml.internal.,\
com.sun.imageio.,\
com.sun.istack.internal.,\
com.sun.jmx.,\
com.sun.media.sound.,\
com.sun.naming.internal.,\
com.sun.proxy.,\
com.sun.corba.se.,\
com.sun.org.apache.bcel.internal.,\
com.sun.org.apache.regexp.internal.,\
com.sun.org.apache.xerces.internal.,\
com.sun.org.apache.xpath.internal.,\
com.sun.org.apache.xalan.internal.extensions.,\
com.sun.org.apache.xalan.internal.lib.,\
com.sun.org.apache.xalan.internal.res.,\
com.sun.org.apache.xalan.internal.templates.,\
com.sun.org.apache.xalan.internal.utils.,\
com.sun.org.apache.xalan.internal.xslt.,\
com.sun.org.apache.xalan.internal.xsltc.cmdline.,\
com.sun.org.apache.xalan.internal.xsltc.compiler.,\
com.sun.org.apache.xalan.internal.xsltc.trax.,\
com.sun.org.apache.xalan.internal.xsltc.util.,\
com.sun.org.apache.xml.internal.res.,\
com.sun.org.apache.xml.internal.security.,\
com.sun.org.apache.xml.internal.serializer.utils.,\
com.sun.org.apache.xml.internal.utils.,\
com.sun.org.glassfish.,\
com.oracle.xmlns.internal.,\
com.oracle.webservices.internal.,\
org.jcp.xml.dsig.internal.,\
jdk.internal.,\
jdk.nashorn.internal.,\
jdk.nashorn.tools.,\
com.sun.activation.registries.
#
# Determines whether this properties file can be appended to
# or overridden on the command line via -Djava.security.properties
#
security.overridePropertiesFile=true
#
# Determines the default key and trust manager factory algorithms for
# the javax.net.ssl package.
#
ssl.KeyManagerFactory.algorithm=SunX509
ssl.TrustManagerFactory.algorithm=PKIX
#
# The Java-level namelookup cache policy for successful lookups:
#
# any negative value: caching forever
# any positive value: the number of seconds to cache an address for
# zero: do not cache
#
# default value is forever (FOREVER). For security reasons, this
# caching is made forever when a security manager is set. When a security
# manager is not set, the default behavior in this implementation
# is to cache for 30 seconds.
#
# NOTE: setting this to anything other than the default value can have
# serious security implications. Do not set it unless
# you are sure you are not exposed to DNS spoofing attack.
#
#networkaddress.cache.ttl=-1
# The Java-level namelookup cache policy for failed lookups:
#
# any negative value: cache forever
# any positive value: the number of seconds to cache negative lookup results
# zero: do not cache
#
# In some Microsoft Windows networking environments that employ
# the WINS name service in addition to DNS, name service lookups
# that fail may take a noticeably long time to return (approx. 5 seconds).
# For this reason the default caching policy is to maintain these
# results for 10 seconds.
#
#
networkaddress.cache.negative.ttl=10
#
# Properties to configure OCSP for certificate revocation checking
#
# Enable OCSP
#
# By default, OCSP is not used for certificate revocation checking.
# This property enables the use of OCSP when set to the value "true".
#
# NOTE: SocketPermission is required to connect to an OCSP responder.
#
# Example,
# ocsp.enable=true
#
# Location of the OCSP responder
#
# By default, the location of the OCSP responder is determined implicitly
# from the certificate being validated. This property explicitly specifies
# the location of the OCSP responder. The property is used when the
# Authority Information Access extension (defined in RFC 3280) is absent
# from the certificate or when it requires overriding.
#
# Example,
# ocsp.responderURL=http://ocsp.example.net:80
#
# Subject name of the OCSP responder's certificate
#
# By default, the certificate of the OCSP responder is that of the issuer
# of the certificate being validated. This property identifies the certificate
# of the OCSP responder when the default does not apply. Its value is a string
# distinguished name (defined in RFC 2253) which identifies a certificate in
# the set of certificates supplied during cert path validation. In cases where
# the subject name alone is not sufficient to uniquely identify the certificate
# then both the "ocsp.responderCertIssuerName" and
# "ocsp.responderCertSerialNumber" properties must be used instead. When this
# property is set then those two properties are ignored.
#
# Example,
# ocsp.responderCertSubjectName="CN=OCSP Responder, O=XYZ Corp"
#
# Issuer name of the OCSP responder's certificate
#
# By default, the certificate of the OCSP responder is that of the issuer
# of the certificate being validated. This property identifies the certificate
# of the OCSP responder when the default does not apply. Its value is a string
# distinguished name (defined in RFC 2253) which identifies a certificate in
# the set of certificates supplied during cert path validation. When this
# property is set then the "ocsp.responderCertSerialNumber" property must also
# be set. When the "ocsp.responderCertSubjectName" property is set then this
# property is ignored.
#
# Example,
# ocsp.responderCertIssuerName="CN=Enterprise CA, O=XYZ Corp"
#
# Serial number of the OCSP responder's certificate
#
# By default, the certificate of the OCSP responder is that of the issuer
# of the certificate being validated. This property identifies the certificate
# of the OCSP responder when the default does not apply. Its value is a string
# of hexadecimal digits (colon or space separators may be present) which
# identifies a certificate in the set of certificates supplied during cert path
# validation. When this property is set then the "ocsp.responderCertIssuerName"
# property must also be set. When the "ocsp.responderCertSubjectName" property
# is set then this property is ignored.
#
# Example,
# ocsp.responderCertSerialNumber=2A:FF:00
#
# Policy for failed Kerberos KDC lookups:
#
# When a KDC is unavailable (network error, service failure, etc), it is
# put inside a blacklist and accessed less often for future requests. The
# value (case-insensitive) for this policy can be:
#
# tryLast
# KDCs in the blacklist are always tried after those not on the list.
#
# tryLess[:max_retries,timeout]
# KDCs in the blacklist are still tried by their order in the configuration,
# but with smaller max_retries and timeout values. max_retries and timeout
# are optional numerical parameters (default 1 and 5000, which means once
# and 5 seconds). Please notes that if any of the values defined here is
# more than what is defined in krb5.conf, it will be ignored.
#
# Whenever a KDC is detected as available, it is removed from the blacklist.
# The blacklist is reset when krb5.conf is reloaded. You can add
# refreshKrb5Config=true to a JAAS configuration file so that krb5.conf is
# reloaded whenever a JAAS authentication is attempted.
#
# Example,
# krb5.kdc.bad.policy = tryLast
# krb5.kdc.bad.policy = tryLess:2,2000
krb5.kdc.bad.policy = tryLast
# Algorithm restrictions for certification path (CertPath) processing
#
# In some environments, certain algorithms or key lengths may be undesirable
# for certification path building and validation. For example, "MD2" is
# generally no longer considered to be a secure hash algorithm. This section
# describes the mechanism for disabling algorithms based on algorithm name
# and/or key length. This includes algorithms used in certificates, as well
# as revocation information such as CRLs and signed OCSP Responses.
#
# The syntax of the disabled algorithm string is described as this Java
# BNF-style:
# DisabledAlgorithms:
# " DisabledAlgorithm { , DisabledAlgorithm } "
#
# DisabledAlgorithm:
# AlgorithmName [Constraint]
#
# AlgorithmName:
# (see below)
#
# Constraint:
# KeySizeConstraint
#
# KeySizeConstraint:
# keySize Operator DecimalInteger
#
# Operator:
# <= | < | == | != | >= | >
#
# DecimalInteger:
# DecimalDigits
#
# DecimalDigits:
# DecimalDigit {DecimalDigit}
#
# DecimalDigit: one of
# 1 2 3 4 5 6 7 8 9 0
#
# The "AlgorithmName" is the standard algorithm name of the disabled
# algorithm. See "Java Cryptography Architecture Standard Algorithm Name
# Documentation" for information about Standard Algorithm Names. Matching
# is performed using a case-insensitive sub-element matching rule. (For
# example, in "SHA1withECDSA" the sub-elements are "SHA1" for hashing and
# "ECDSA" for signatures.) If the assertion "AlgorithmName" is a
# sub-element of the certificate algorithm name, the algorithm will be
# rejected during certification path building and validation. For example,
# the assertion algorithm name "DSA" will disable all certificate algorithms
# that rely on DSA, such as NONEwithDSA, SHA1withDSA. However, the assertion
# will not disable algorithms related to "ECDSA".
#
# A "Constraint" provides further guidance for the algorithm being specified.
# The "KeySizeConstraint" requires a key of a valid size range if the
# "AlgorithmName" is of a key algorithm. The "DecimalInteger" indicates the
# key size specified in number of bits. For example, "RSA keySize <= 1024"
# indicates that any RSA key with key size less than or equal to 1024 bits
# should be disabled, and "RSA keySize < 1024, RSA keySize > 2048" indicates
# that any RSA key with key size less than 1024 or greater than 2048 should
# be disabled. Note that the "KeySizeConstraint" only makes sense to key
# algorithms.
#
# Note: This property is currently used by Oracle's PKIX implementation. It
# is not guaranteed to be examined and used by other implementations.
#
# Example:
# jdk.certpath.disabledAlgorithms=MD2, DSA, RSA keySize < 2048
#
#
jdk.certpath.disabledAlgorithms=MD2, MD5, RSA keySize < 1024
# Algorithm restrictions for Secure Socket Layer/Transport Layer Security
# (SSL/TLS) processing
#
# In some environments, certain algorithms or key lengths may be undesirable
# when using SSL/TLS. This section describes the mechanism for disabling
# algorithms during SSL/TLS security parameters negotiation, including cipher
# suites selection, peer authentication and key exchange mechanisms.
#
# For PKI-based peer authentication and key exchange mechanisms, this list
# of disabled algorithms will also be checked during certification path
# building and validation, including algorithms used in certificates, as
# well as revocation information such as CRLs and signed OCSP Responses.
# This is in addition to the jdk.certpath.disabledAlgorithms property above.
#
# See the specification of "jdk.certpath.disabledAlgorithms" for the
# syntax of the disabled algorithm string.
#
# Note: This property is currently used by Oracle's JSSE implementation.
# It is not guaranteed to be examined and used by other implementations.
#
# Example:
# jdk.tls.disabledAlgorithms=MD5, SHA1, DSA, RSA keySize < 2048

View file

@ -1,499 +0,0 @@
#
# This is the "master security properties file".
#
# An alternate java.security properties file may be specified
# from the command line via the system property
#
# -Djava.security.properties=<URL>
#
# This properties file appends to the master security properties file.
# If both properties files specify values for the same key, the value
# from the command-line properties file is selected, as it is the last
# one loaded.
#
# Also, if you specify
#
# -Djava.security.properties==<URL> (2 equals),
#
# then that properties file completely overrides the master security
# properties file.
#
# To disable the ability to specify an additional properties file from
# the command line, set the key security.overridePropertiesFile
# to false in the master security properties file. It is set to true
# by default.
# In this file, various security properties are set for use by
# java.security classes. This is where users can statically register
# Cryptography Package Providers ("providers" for short). The term
# "provider" refers to a package or set of packages that supply a
# concrete implementation of a subset of the cryptography aspects of
# the Java Security API. A provider may, for example, implement one or
# more digital signature algorithms or message digest algorithms.
#
# Each provider must implement a subclass of the Provider class.
# To register a provider in this master security properties file,
# specify the Provider subclass name and priority in the format
#
# security.provider.<n>=<className>
#
# This declares a provider, and specifies its preference
# order n. The preference order is the order in which providers are
# searched for requested algorithms (when no specific provider is
# requested). The order is 1-based; 1 is the most preferred, followed
# by 2, and so on.
#
# <className> must specify the subclass of the Provider class whose
# constructor sets the values of various properties that are required
# for the Java Security API to look up the algorithms or other
# facilities implemented by the provider.
#
# There must be at least one provider specification in java.security.
# There is a default provider that comes standard with the JDK. It
# is called the "SUN" provider, and its Provider subclass
# named Sun appears in the sun.security.provider package. Thus, the
# "SUN" provider is registered via the following:
#
# security.provider.1=sun.security.provider.Sun
#
# (The number 1 is used for the default provider.)
#
# Note: Providers can be dynamically registered instead by calls to
# either the addProvider or insertProviderAt method in the Security
# class.
#
# List of providers and their preference orders (see above):
#
security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=sun.security.ec.SunEC
security.provider.4=com.sun.net.ssl.internal.ssl.Provider
security.provider.5=com.sun.crypto.provider.SunJCE
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider
security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.9=sun.security.smartcardio.SunPCSC
security.provider.10=apple.security.AppleProvider
#
# Sun Provider SecureRandom seed source.
#
# Select the primary source of seed data for the "SHA1PRNG" and
# "NativePRNG" SecureRandom implementations in the "Sun" provider.
# (Other SecureRandom implementations might also use this property.)
#
# On Unix-like systems (for example, Solaris/Linux/MacOS), the
# "NativePRNG" and "SHA1PRNG" implementations obtains seed data from
# special device files such as file:/dev/random.
#
# On Windows systems, specifying the URLs "file:/dev/random" or
# "file:/dev/urandom" will enable the native Microsoft CryptoAPI seeding
# mechanism for SHA1PRNG.
#
# By default, an attempt is made to use the entropy gathering device
# specified by the "securerandom.source" Security property. If an
# exception occurs while accessing the specified URL:
#
# SHA1PRNG:
# the traditional system/thread activity algorithm will be used.
#
# NativePRNG:
# a default value of /dev/random will be used. If neither
# are available, the implementation will be disabled.
# "file" is the only currently supported protocol type.
#
# The entropy gathering device can also be specified with the System
# property "java.security.egd". For example:
#
# % java -Djava.security.egd=file:/dev/random MainClass
#
# Specifying this System property will override the
# "securerandom.source" Security property.
#
# In addition, if "file:/dev/random" or "file:/dev/urandom" is
# specified, the "NativePRNG" implementation will be more preferred than
# SHA1PRNG in the Sun provider.
#
securerandom.source=file:/dev/random
#
# A list of known strong SecureRandom implementations.
#
# To help guide applications in selecting a suitable strong
# java.security.SecureRandom implementation, Java distributions should
# indicate a list of known strong implementations using the property.
#
# This is a comma-separated list of algorithm and/or algorithm:provider
# entries.
#
securerandom.strongAlgorithms=NativePRNGBlocking:SUN
#
# Class to instantiate as the javax.security.auth.login.Configuration
# provider.
#
login.configuration.provider=sun.security.provider.ConfigFile
#
# Default login configuration file
#
#login.config.url.1=file:${user.home}/.java.login.config
#
# Class to instantiate as the system Policy. This is the name of the class
# that will be used as the Policy object.
#
policy.provider=sun.security.provider.PolicyFile
# The default is to have a single system-wide policy file,
# and a policy file in the user's home directory.
policy.url.1=file:${java.home}/lib/security/java.policy
policy.url.2=file:${user.home}/.java.policy
# whether or not we expand properties in the policy file
# if this is set to false, properties (${...}) will not be expanded in policy
# files.
policy.expandProperties=true
# whether or not we allow an extra policy to be passed on the command line
# with -Djava.security.policy=somefile. Comment out this line to disable
# this feature.
policy.allowSystemProperty=true
# whether or not we look into the IdentityScope for trusted Identities
# when encountering a 1.1 signed JAR file. If the identity is found
# and is trusted, we grant it AllPermission.
policy.ignoreIdentityScope=false
#
# Default keystore type.
#
keystore.type=jks
#
# List of comma-separated packages that start with or equal this string
# will cause a security exception to be thrown when
# passed to checkPackageAccess unless the
# corresponding RuntimePermission ("accessClassInPackage."+package) has
# been granted.
package.access=sun.,\
com.sun.xml.internal.,\
com.sun.imageio.,\
com.sun.istack.internal.,\
com.sun.jmx.,\
com.sun.media.sound.,\
com.sun.naming.internal.,\
com.sun.proxy.,\
com.sun.corba.se.,\
com.sun.org.apache.bcel.internal.,\
com.sun.org.apache.regexp.internal.,\
com.sun.org.apache.xerces.internal.,\
com.sun.org.apache.xpath.internal.,\
com.sun.org.apache.xalan.internal.extensions.,\
com.sun.org.apache.xalan.internal.lib.,\
com.sun.org.apache.xalan.internal.res.,\
com.sun.org.apache.xalan.internal.templates.,\
com.sun.org.apache.xalan.internal.utils.,\
com.sun.org.apache.xalan.internal.xslt.,\
com.sun.org.apache.xalan.internal.xsltc.cmdline.,\
com.sun.org.apache.xalan.internal.xsltc.compiler.,\
com.sun.org.apache.xalan.internal.xsltc.trax.,\
com.sun.org.apache.xalan.internal.xsltc.util.,\
com.sun.org.apache.xml.internal.res.,\
com.sun.org.apache.xml.internal.security.,\
com.sun.org.apache.xml.internal.serializer.utils.,\
com.sun.org.apache.xml.internal.utils.,\
com.sun.org.glassfish.,\
com.oracle.xmlns.internal.,\
com.oracle.webservices.internal.,\
org.jcp.xml.dsig.internal.,\
jdk.internal.,\
jdk.nashorn.internal.,\
jdk.nashorn.tools.,\
com.sun.activation.registries.,\
apple.
#
# List of comma-separated packages that start with or equal this string
# will cause a security exception to be thrown when
# passed to checkPackageDefinition unless the
# corresponding RuntimePermission ("defineClassInPackage."+package) has
# been granted.
#
# by default, none of the class loaders supplied with the JDK call
# checkPackageDefinition.
#
package.definition=sun.,\
com.sun.xml.internal.,\
com.sun.imageio.,\
com.sun.istack.internal.,\
com.sun.jmx.,\
com.sun.media.sound.,\
com.sun.naming.internal.,\
com.sun.proxy.,\
com.sun.corba.se.,\
com.sun.org.apache.bcel.internal.,\
com.sun.org.apache.regexp.internal.,\
com.sun.org.apache.xerces.internal.,\
com.sun.org.apache.xpath.internal.,\
com.sun.org.apache.xalan.internal.extensions.,\
com.sun.org.apache.xalan.internal.lib.,\
com.sun.org.apache.xalan.internal.res.,\
com.sun.org.apache.xalan.internal.templates.,\
com.sun.org.apache.xalan.internal.utils.,\
com.sun.org.apache.xalan.internal.xslt.,\
com.sun.org.apache.xalan.internal.xsltc.cmdline.,\
com.sun.org.apache.xalan.internal.xsltc.compiler.,\
com.sun.org.apache.xalan.internal.xsltc.trax.,\
com.sun.org.apache.xalan.internal.xsltc.util.,\
com.sun.org.apache.xml.internal.res.,\
com.sun.org.apache.xml.internal.security.,\
com.sun.org.apache.xml.internal.serializer.utils.,\
com.sun.org.apache.xml.internal.utils.,\
com.sun.org.glassfish.,\
com.oracle.xmlns.internal.,\
com.oracle.webservices.internal.,\
org.jcp.xml.dsig.internal.,\
jdk.internal.,\
jdk.nashorn.internal.,\
jdk.nashorn.tools.,\
com.sun.activation.registries.,\
apple.
#
# Determines whether this properties file can be appended to
# or overridden on the command line via -Djava.security.properties
#
security.overridePropertiesFile=true
#
# Determines the default key and trust manager factory algorithms for
# the javax.net.ssl package.
#
ssl.KeyManagerFactory.algorithm=SunX509
ssl.TrustManagerFactory.algorithm=PKIX
#
# The Java-level namelookup cache policy for successful lookups:
#
# any negative value: caching forever
# any positive value: the number of seconds to cache an address for
# zero: do not cache
#
# default value is forever (FOREVER). For security reasons, this
# caching is made forever when a security manager is set. When a security
# manager is not set, the default behavior in this implementation
# is to cache for 30 seconds.
#
# NOTE: setting this to anything other than the default value can have
# serious security implications. Do not set it unless
# you are sure you are not exposed to DNS spoofing attack.
#
#networkaddress.cache.ttl=-1
# The Java-level namelookup cache policy for failed lookups:
#
# any negative value: cache forever
# any positive value: the number of seconds to cache negative lookup results
# zero: do not cache
#
# In some Microsoft Windows networking environments that employ
# the WINS name service in addition to DNS, name service lookups
# that fail may take a noticeably long time to return (approx. 5 seconds).
# For this reason the default caching policy is to maintain these
# results for 10 seconds.
#
#
networkaddress.cache.negative.ttl=10
#
# Properties to configure OCSP for certificate revocation checking
#
# Enable OCSP
#
# By default, OCSP is not used for certificate revocation checking.
# This property enables the use of OCSP when set to the value "true".
#
# NOTE: SocketPermission is required to connect to an OCSP responder.
#
# Example,
# ocsp.enable=true
#
# Location of the OCSP responder
#
# By default, the location of the OCSP responder is determined implicitly
# from the certificate being validated. This property explicitly specifies
# the location of the OCSP responder. The property is used when the
# Authority Information Access extension (defined in RFC 3280) is absent
# from the certificate or when it requires overriding.
#
# Example,
# ocsp.responderURL=http://ocsp.example.net:80
#
# Subject name of the OCSP responder's certificate
#
# By default, the certificate of the OCSP responder is that of the issuer
# of the certificate being validated. This property identifies the certificate
# of the OCSP responder when the default does not apply. Its value is a string
# distinguished name (defined in RFC 2253) which identifies a certificate in
# the set of certificates supplied during cert path validation. In cases where
# the subject name alone is not sufficient to uniquely identify the certificate
# then both the "ocsp.responderCertIssuerName" and
# "ocsp.responderCertSerialNumber" properties must be used instead. When this
# property is set then those two properties are ignored.
#
# Example,
# ocsp.responderCertSubjectName="CN=OCSP Responder, O=XYZ Corp"
#
# Issuer name of the OCSP responder's certificate
#
# By default, the certificate of the OCSP responder is that of the issuer
# of the certificate being validated. This property identifies the certificate
# of the OCSP responder when the default does not apply. Its value is a string
# distinguished name (defined in RFC 2253) which identifies a certificate in
# the set of certificates supplied during cert path validation. When this
# property is set then the "ocsp.responderCertSerialNumber" property must also
# be set. When the "ocsp.responderCertSubjectName" property is set then this
# property is ignored.
#
# Example,
# ocsp.responderCertIssuerName="CN=Enterprise CA, O=XYZ Corp"
#
# Serial number of the OCSP responder's certificate
#
# By default, the certificate of the OCSP responder is that of the issuer
# of the certificate being validated. This property identifies the certificate
# of the OCSP responder when the default does not apply. Its value is a string
# of hexadecimal digits (colon or space separators may be present) which
# identifies a certificate in the set of certificates supplied during cert path
# validation. When this property is set then the "ocsp.responderCertIssuerName"
# property must also be set. When the "ocsp.responderCertSubjectName" property
# is set then this property is ignored.
#
# Example,
# ocsp.responderCertSerialNumber=2A:FF:00
#
# Policy for failed Kerberos KDC lookups:
#
# When a KDC is unavailable (network error, service failure, etc), it is
# put inside a blacklist and accessed less often for future requests. The
# value (case-insensitive) for this policy can be:
#
# tryLast
# KDCs in the blacklist are always tried after those not on the list.
#
# tryLess[:max_retries,timeout]
# KDCs in the blacklist are still tried by their order in the configuration,
# but with smaller max_retries and timeout values. max_retries and timeout
# are optional numerical parameters (default 1 and 5000, which means once
# and 5 seconds). Please notes that if any of the values defined here is
# more than what is defined in krb5.conf, it will be ignored.
#
# Whenever a KDC is detected as available, it is removed from the blacklist.
# The blacklist is reset when krb5.conf is reloaded. You can add
# refreshKrb5Config=true to a JAAS configuration file so that krb5.conf is
# reloaded whenever a JAAS authentication is attempted.
#
# Example,
# krb5.kdc.bad.policy = tryLast
# krb5.kdc.bad.policy = tryLess:2,2000
krb5.kdc.bad.policy = tryLast
# Algorithm restrictions for certification path (CertPath) processing
#
# In some environments, certain algorithms or key lengths may be undesirable
# for certification path building and validation. For example, "MD2" is
# generally no longer considered to be a secure hash algorithm. This section
# describes the mechanism for disabling algorithms based on algorithm name
# and/or key length. This includes algorithms used in certificates, as well
# as revocation information such as CRLs and signed OCSP Responses.
#
# The syntax of the disabled algorithm string is described as this Java
# BNF-style:
# DisabledAlgorithms:
# " DisabledAlgorithm { , DisabledAlgorithm } "
#
# DisabledAlgorithm:
# AlgorithmName [Constraint]
#
# AlgorithmName:
# (see below)
#
# Constraint:
# KeySizeConstraint
#
# KeySizeConstraint:
# keySize Operator DecimalInteger
#
# Operator:
# <= | < | == | != | >= | >
#
# DecimalInteger:
# DecimalDigits
#
# DecimalDigits:
# DecimalDigit {DecimalDigit}
#
# DecimalDigit: one of
# 1 2 3 4 5 6 7 8 9 0
#
# The "AlgorithmName" is the standard algorithm name of the disabled
# algorithm. See "Java Cryptography Architecture Standard Algorithm Name
# Documentation" for information about Standard Algorithm Names. Matching
# is performed using a case-insensitive sub-element matching rule. (For
# example, in "SHA1withECDSA" the sub-elements are "SHA1" for hashing and
# "ECDSA" for signatures.) If the assertion "AlgorithmName" is a
# sub-element of the certificate algorithm name, the algorithm will be
# rejected during certification path building and validation. For example,
# the assertion algorithm name "DSA" will disable all certificate algorithms
# that rely on DSA, such as NONEwithDSA, SHA1withDSA. However, the assertion
# will not disable algorithms related to "ECDSA".
#
# A "Constraint" provides further guidance for the algorithm being specified.
# The "KeySizeConstraint" requires a key of a valid size range if the
# "AlgorithmName" is of a key algorithm. The "DecimalInteger" indicates the
# key size specified in number of bits. For example, "RSA keySize <= 1024"
# indicates that any RSA key with key size less than or equal to 1024 bits
# should be disabled, and "RSA keySize < 1024, RSA keySize > 2048" indicates
# that any RSA key with key size less than 1024 or greater than 2048 should
# be disabled. Note that the "KeySizeConstraint" only makes sense to key
# algorithms.
#
# Note: This property is currently used by Oracle's PKIX implementation. It
# is not guaranteed to be examined and used by other implementations.
#
# Example:
# jdk.certpath.disabledAlgorithms=MD2, DSA, RSA keySize < 2048
#
#
jdk.certpath.disabledAlgorithms=MD2, MD5, RSA keySize < 1024
# Algorithm restrictions for Secure Socket Layer/Transport Layer Security
# (SSL/TLS) processing
#
# In some environments, certain algorithms or key lengths may be undesirable
# when using SSL/TLS. This section describes the mechanism for disabling
# algorithms during SSL/TLS security parameters negotiation, including cipher
# suites selection, peer authentication and key exchange mechanisms.
#
# For PKI-based peer authentication and key exchange mechanisms, this list
# of disabled algorithms will also be checked during certification path
# building and validation, including algorithms used in certificates, as
# well as revocation information such as CRLs and signed OCSP Responses.
# This is in addition to the jdk.certpath.disabledAlgorithms property above.
#
# See the specification of "jdk.certpath.disabledAlgorithms" for the
# syntax of the disabled algorithm string.
#
# Note: This property is currently used by Oracle's JSSE implementation.
# It is not guaranteed to be examined and used by other implementations.
#
# Example:
# jdk.tls.disabledAlgorithms=MD5, SHA1, DSA, RSA keySize < 2048

View file

@ -1,498 +0,0 @@
#
# This is the "master security properties file".
#
# An alternate java.security properties file may be specified
# from the command line via the system property
#
# -Djava.security.properties=<URL>
#
# This properties file appends to the master security properties file.
# If both properties files specify values for the same key, the value
# from the command-line properties file is selected, as it is the last
# one loaded.
#
# Also, if you specify
#
# -Djava.security.properties==<URL> (2 equals),
#
# then that properties file completely overrides the master security
# properties file.
#
# To disable the ability to specify an additional properties file from
# the command line, set the key security.overridePropertiesFile
# to false in the master security properties file. It is set to true
# by default.
# In this file, various security properties are set for use by
# java.security classes. This is where users can statically register
# Cryptography Package Providers ("providers" for short). The term
# "provider" refers to a package or set of packages that supply a
# concrete implementation of a subset of the cryptography aspects of
# the Java Security API. A provider may, for example, implement one or
# more digital signature algorithms or message digest algorithms.
#
# Each provider must implement a subclass of the Provider class.
# To register a provider in this master security properties file,
# specify the Provider subclass name and priority in the format
#
# security.provider.<n>=<className>
#
# This declares a provider, and specifies its preference
# order n. The preference order is the order in which providers are
# searched for requested algorithms (when no specific provider is
# requested). The order is 1-based; 1 is the most preferred, followed
# by 2, and so on.
#
# <className> must specify the subclass of the Provider class whose
# constructor sets the values of various properties that are required
# for the Java Security API to look up the algorithms or other
# facilities implemented by the provider.
#
# There must be at least one provider specification in java.security.
# There is a default provider that comes standard with the JDK. It
# is called the "SUN" provider, and its Provider subclass
# named Sun appears in the sun.security.provider package. Thus, the
# "SUN" provider is registered via the following:
#
# security.provider.1=sun.security.provider.Sun
#
# (The number 1 is used for the default provider.)
#
# Note: Providers can be dynamically registered instead by calls to
# either the addProvider or insertProviderAt method in the Security
# class.
#
# List of providers and their preference orders (see above):
#
security.provider.1=com.oracle.security.ucrypto.UcryptoProvider ${java.home}/lib/security/ucrypto-solaris.cfg
security.provider.2=sun.security.pkcs11.SunPKCS11 ${java.home}/lib/security/sunpkcs11-solaris.cfg
security.provider.3=sun.security.provider.Sun
security.provider.4=sun.security.rsa.SunRsaSign
security.provider.5=sun.security.ec.SunEC
security.provider.6=com.sun.net.ssl.internal.ssl.Provider
security.provider.7=com.sun.crypto.provider.SunJCE
security.provider.8=sun.security.jgss.SunProvider
security.provider.9=com.sun.security.sasl.Provider
security.provider.10=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.11=sun.security.smartcardio.SunPCSC
#
# Sun Provider SecureRandom seed source.
#
# Select the primary source of seed data for the "SHA1PRNG" and
# "NativePRNG" SecureRandom implementations in the "Sun" provider.
# (Other SecureRandom implementations might also use this property.)
#
# On Unix-like systems (for example, Solaris/Linux/MacOS), the
# "NativePRNG" and "SHA1PRNG" implementations obtains seed data from
# special device files such as file:/dev/random.
#
# On Windows systems, specifying the URLs "file:/dev/random" or
# "file:/dev/urandom" will enable the native Microsoft CryptoAPI seeding
# mechanism for SHA1PRNG.
#
# By default, an attempt is made to use the entropy gathering device
# specified by the "securerandom.source" Security property. If an
# exception occurs while accessing the specified URL:
#
# SHA1PRNG:
# the traditional system/thread activity algorithm will be used.
#
# NativePRNG:
# a default value of /dev/random will be used. If neither
# are available, the implementation will be disabled.
# "file" is the only currently supported protocol type.
#
# The entropy gathering device can also be specified with the System
# property "java.security.egd". For example:
#
# % java -Djava.security.egd=file:/dev/random MainClass
#
# Specifying this System property will override the
# "securerandom.source" Security property.
#
# In addition, if "file:/dev/random" or "file:/dev/urandom" is
# specified, the "NativePRNG" implementation will be more preferred than
# SHA1PRNG in the Sun provider.
#
securerandom.source=file:/dev/random
#
# A list of known strong SecureRandom implementations.
#
# To help guide applications in selecting a suitable strong
# java.security.SecureRandom implementation, Java distributions should
# indicate a list of known strong implementations using the property.
#
# This is a comma-separated list of algorithm and/or algorithm:provider
# entries.
#
securerandom.strongAlgorithms=NativePRNGBlocking:SUN
#
# Class to instantiate as the javax.security.auth.login.Configuration
# provider.
#
login.configuration.provider=sun.security.provider.ConfigFile
#
# Default login configuration file
#
#login.config.url.1=file:${user.home}/.java.login.config
#
# Class to instantiate as the system Policy. This is the name of the class
# that will be used as the Policy object.
#
policy.provider=sun.security.provider.PolicyFile
# The default is to have a single system-wide policy file,
# and a policy file in the user's home directory.
policy.url.1=file:${java.home}/lib/security/java.policy
policy.url.2=file:${user.home}/.java.policy
# whether or not we expand properties in the policy file
# if this is set to false, properties (${...}) will not be expanded in policy
# files.
policy.expandProperties=true
# whether or not we allow an extra policy to be passed on the command line
# with -Djava.security.policy=somefile. Comment out this line to disable
# this feature.
policy.allowSystemProperty=true
# whether or not we look into the IdentityScope for trusted Identities
# when encountering a 1.1 signed JAR file. If the identity is found
# and is trusted, we grant it AllPermission.
policy.ignoreIdentityScope=false
#
# Default keystore type.
#
keystore.type=jks
#
# List of comma-separated packages that start with or equal this string
# will cause a security exception to be thrown when
# passed to checkPackageAccess unless the
# corresponding RuntimePermission ("accessClassInPackage."+package) has
# been granted.
package.access=sun.,\
com.sun.xml.internal.,\
com.sun.imageio.,\
com.sun.istack.internal.,\
com.sun.jmx.,\
com.sun.media.sound.,\
com.sun.naming.internal.,\
com.sun.proxy.,\
com.sun.corba.se.,\
com.sun.org.apache.bcel.internal.,\
com.sun.org.apache.regexp.internal.,\
com.sun.org.apache.xerces.internal.,\
com.sun.org.apache.xpath.internal.,\
com.sun.org.apache.xalan.internal.extensions.,\
com.sun.org.apache.xalan.internal.lib.,\
com.sun.org.apache.xalan.internal.res.,\
com.sun.org.apache.xalan.internal.templates.,\
com.sun.org.apache.xalan.internal.utils.,\
com.sun.org.apache.xalan.internal.xslt.,\
com.sun.org.apache.xalan.internal.xsltc.cmdline.,\
com.sun.org.apache.xalan.internal.xsltc.compiler.,\
com.sun.org.apache.xalan.internal.xsltc.trax.,\
com.sun.org.apache.xalan.internal.xsltc.util.,\
com.sun.org.apache.xml.internal.res.,\
com.sun.org.apache.xml.internal.security.,\
com.sun.org.apache.xml.internal.serializer.utils.,\
com.sun.org.apache.xml.internal.utils.,\
com.sun.org.glassfish.,\
com.oracle.xmlns.internal.,\
com.oracle.webservices.internal.,\
org.jcp.xml.dsig.internal.,\
jdk.internal.,\
jdk.nashorn.internal.,\
jdk.nashorn.tools.,\
com.sun.activation.registries.
#
# List of comma-separated packages that start with or equal this string
# will cause a security exception to be thrown when
# passed to checkPackageDefinition unless the
# corresponding RuntimePermission ("defineClassInPackage."+package) has
# been granted.
#
# by default, none of the class loaders supplied with the JDK call
# checkPackageDefinition.
#
package.definition=sun.,\
com.sun.xml.internal.,\
com.sun.imageio.,\
com.sun.istack.internal.,\
com.sun.jmx.,\
com.sun.media.sound.,\
com.sun.naming.internal.,\
com.sun.proxy.,\
com.sun.corba.se.,\
com.sun.org.apache.bcel.internal.,\
com.sun.org.apache.regexp.internal.,\
com.sun.org.apache.xerces.internal.,\
com.sun.org.apache.xpath.internal.,\
com.sun.org.apache.xalan.internal.extensions.,\
com.sun.org.apache.xalan.internal.lib.,\
com.sun.org.apache.xalan.internal.res.,\
com.sun.org.apache.xalan.internal.templates.,\
com.sun.org.apache.xalan.internal.utils.,\
com.sun.org.apache.xalan.internal.xslt.,\
com.sun.org.apache.xalan.internal.xsltc.cmdline.,\
com.sun.org.apache.xalan.internal.xsltc.compiler.,\
com.sun.org.apache.xalan.internal.xsltc.trax.,\
com.sun.org.apache.xalan.internal.xsltc.util.,\
com.sun.org.apache.xml.internal.res.,\
com.sun.org.apache.xml.internal.security.,\
com.sun.org.apache.xml.internal.serializer.utils.,\
com.sun.org.apache.xml.internal.utils.,\
com.sun.org.glassfish.,\
com.oracle.xmlns.internal.,\
com.oracle.webservices.internal.,\
org.jcp.xml.dsig.internal.,\
jdk.internal.,\
jdk.nashorn.internal.,\
jdk.nashorn.tools.,\
com.sun.activation.registries.
#
# Determines whether this properties file can be appended to
# or overridden on the command line via -Djava.security.properties
#
security.overridePropertiesFile=true
#
# Determines the default key and trust manager factory algorithms for
# the javax.net.ssl package.
#
ssl.KeyManagerFactory.algorithm=SunX509
ssl.TrustManagerFactory.algorithm=PKIX
#
# The Java-level namelookup cache policy for successful lookups:
#
# any negative value: caching forever
# any positive value: the number of seconds to cache an address for
# zero: do not cache
#
# default value is forever (FOREVER). For security reasons, this
# caching is made forever when a security manager is set. When a security
# manager is not set, the default behavior in this implementation
# is to cache for 30 seconds.
#
# NOTE: setting this to anything other than the default value can have
# serious security implications. Do not set it unless
# you are sure you are not exposed to DNS spoofing attack.
#
#networkaddress.cache.ttl=-1
# The Java-level namelookup cache policy for failed lookups:
#
# any negative value: cache forever
# any positive value: the number of seconds to cache negative lookup results
# zero: do not cache
#
# In some Microsoft Windows networking environments that employ
# the WINS name service in addition to DNS, name service lookups
# that fail may take a noticeably long time to return (approx. 5 seconds).
# For this reason the default caching policy is to maintain these
# results for 10 seconds.
#
#
networkaddress.cache.negative.ttl=10
#
# Properties to configure OCSP for certificate revocation checking
#
# Enable OCSP
#
# By default, OCSP is not used for certificate revocation checking.
# This property enables the use of OCSP when set to the value "true".
#
# NOTE: SocketPermission is required to connect to an OCSP responder.
#
# Example,
# ocsp.enable=true
#
# Location of the OCSP responder
#
# By default, the location of the OCSP responder is determined implicitly
# from the certificate being validated. This property explicitly specifies
# the location of the OCSP responder. The property is used when the
# Authority Information Access extension (defined in RFC 3280) is absent
# from the certificate or when it requires overriding.
#
# Example,
# ocsp.responderURL=http://ocsp.example.net:80
#
# Subject name of the OCSP responder's certificate
#
# By default, the certificate of the OCSP responder is that of the issuer
# of the certificate being validated. This property identifies the certificate
# of the OCSP responder when the default does not apply. Its value is a string
# distinguished name (defined in RFC 2253) which identifies a certificate in
# the set of certificates supplied during cert path validation. In cases where
# the subject name alone is not sufficient to uniquely identify the certificate
# then both the "ocsp.responderCertIssuerName" and
# "ocsp.responderCertSerialNumber" properties must be used instead. When this
# property is set then those two properties are ignored.
#
# Example,
# ocsp.responderCertSubjectName="CN=OCSP Responder, O=XYZ Corp"
#
# Issuer name of the OCSP responder's certificate
#
# By default, the certificate of the OCSP responder is that of the issuer
# of the certificate being validated. This property identifies the certificate
# of the OCSP responder when the default does not apply. Its value is a string
# distinguished name (defined in RFC 2253) which identifies a certificate in
# the set of certificates supplied during cert path validation. When this
# property is set then the "ocsp.responderCertSerialNumber" property must also
# be set. When the "ocsp.responderCertSubjectName" property is set then this
# property is ignored.
#
# Example,
# ocsp.responderCertIssuerName="CN=Enterprise CA, O=XYZ Corp"
#
# Serial number of the OCSP responder's certificate
#
# By default, the certificate of the OCSP responder is that of the issuer
# of the certificate being validated. This property identifies the certificate
# of the OCSP responder when the default does not apply. Its value is a string
# of hexadecimal digits (colon or space separators may be present) which
# identifies a certificate in the set of certificates supplied during cert path
# validation. When this property is set then the "ocsp.responderCertIssuerName"
# property must also be set. When the "ocsp.responderCertSubjectName" property
# is set then this property is ignored.
#
# Example,
# ocsp.responderCertSerialNumber=2A:FF:00
#
# Policy for failed Kerberos KDC lookups:
#
# When a KDC is unavailable (network error, service failure, etc), it is
# put inside a blacklist and accessed less often for future requests. The
# value (case-insensitive) for this policy can be:
#
# tryLast
# KDCs in the blacklist are always tried after those not on the list.
#
# tryLess[:max_retries,timeout]
# KDCs in the blacklist are still tried by their order in the configuration,
# but with smaller max_retries and timeout values. max_retries and timeout
# are optional numerical parameters (default 1 and 5000, which means once
# and 5 seconds). Please notes that if any of the values defined here is
# more than what is defined in krb5.conf, it will be ignored.
#
# Whenever a KDC is detected as available, it is removed from the blacklist.
# The blacklist is reset when krb5.conf is reloaded. You can add
# refreshKrb5Config=true to a JAAS configuration file so that krb5.conf is
# reloaded whenever a JAAS authentication is attempted.
#
# Example,
# krb5.kdc.bad.policy = tryLast
# krb5.kdc.bad.policy = tryLess:2,2000
krb5.kdc.bad.policy = tryLast
# Algorithm restrictions for certification path (CertPath) processing
#
# In some environments, certain algorithms or key lengths may be undesirable
# for certification path building and validation. For example, "MD2" is
# generally no longer considered to be a secure hash algorithm. This section
# describes the mechanism for disabling algorithms based on algorithm name
# and/or key length. This includes algorithms used in certificates, as well
# as revocation information such as CRLs and signed OCSP Responses.
#
# The syntax of the disabled algorithm string is described as this Java
# BNF-style:
# DisabledAlgorithms:
# " DisabledAlgorithm { , DisabledAlgorithm } "
#
# DisabledAlgorithm:
# AlgorithmName [Constraint]
#
# AlgorithmName:
# (see below)
#
# Constraint:
# KeySizeConstraint
#
# KeySizeConstraint:
# keySize Operator DecimalInteger
#
# Operator:
# <= | < | == | != | >= | >
#
# DecimalInteger:
# DecimalDigits
#
# DecimalDigits:
# DecimalDigit {DecimalDigit}
#
# DecimalDigit: one of
# 1 2 3 4 5 6 7 8 9 0
#
# The "AlgorithmName" is the standard algorithm name of the disabled
# algorithm. See "Java Cryptography Architecture Standard Algorithm Name
# Documentation" for information about Standard Algorithm Names. Matching
# is performed using a case-insensitive sub-element matching rule. (For
# example, in "SHA1withECDSA" the sub-elements are "SHA1" for hashing and
# "ECDSA" for signatures.) If the assertion "AlgorithmName" is a
# sub-element of the certificate algorithm name, the algorithm will be
# rejected during certification path building and validation. For example,
# the assertion algorithm name "DSA" will disable all certificate algorithms
# that rely on DSA, such as NONEwithDSA, SHA1withDSA. However, the assertion
# will not disable algorithms related to "ECDSA".
#
# A "Constraint" provides further guidance for the algorithm being specified.
# The "KeySizeConstraint" requires a key of a valid size range if the
# "AlgorithmName" is of a key algorithm. The "DecimalInteger" indicates the
# key size specified in number of bits. For example, "RSA keySize <= 1024"
# indicates that any RSA key with key size less than or equal to 1024 bits
# should be disabled, and "RSA keySize < 1024, RSA keySize > 2048" indicates
# that any RSA key with key size less than 1024 or greater than 2048 should
# be disabled. Note that the "KeySizeConstraint" only makes sense to key
# algorithms.
#
# Note: This property is currently used by Oracle's PKIX implementation. It
# is not guaranteed to be examined and used by other implementations.
#
# Example:
# jdk.certpath.disabledAlgorithms=MD2, DSA, RSA keySize < 2048
#
#
jdk.certpath.disabledAlgorithms=MD2, MD5, RSA keySize < 1024
# Algorithm restrictions for Secure Socket Layer/Transport Layer Security
# (SSL/TLS) processing
#
# In some environments, certain algorithms or key lengths may be undesirable
# when using SSL/TLS. This section describes the mechanism for disabling
# algorithms during SSL/TLS security parameters negotiation, including cipher
# suites selection, peer authentication and key exchange mechanisms.
#
# For PKI-based peer authentication and key exchange mechanisms, this list
# of disabled algorithms will also be checked during certification path
# building and validation, including algorithms used in certificates, as
# well as revocation information such as CRLs and signed OCSP Responses.
# This is in addition to the jdk.certpath.disabledAlgorithms property above.
#
# See the specification of "jdk.certpath.disabledAlgorithms" for the
# syntax of the disabled algorithm string.
#
# Note: This property is currently used by Oracle's JSSE implementation.
# It is not guaranteed to be examined and used by other implementations.
#
# Example:
# jdk.tls.disabledAlgorithms=MD5, SHA1, DSA, RSA keySize < 2048

View file

@ -599,9 +599,9 @@ Java_java_lang_UNIXProcess_forkAndExec(JNIEnv *env,
*/ */
assert(prog != NULL && argBlock != NULL); assert(prog != NULL && argBlock != NULL);
if ((phelperpath = getBytes(env, helperpath)) == NULL) goto Catch; if ((phelperpath = getBytes(env, helperpath)) == NULL) goto Catch;
if ((pprog = getBytes(env, prog)) == NULL) goto Catch; if ((pprog = getBytes(env, prog)) == NULL) goto Catch;
if ((pargBlock = getBytes(env, argBlock)) == NULL) goto Catch; if ((pargBlock = getBytes(env, argBlock)) == NULL) goto Catch;
if ((c->argv = NEW(const char *, argc + 3)) == NULL) goto Catch; if ((c->argv = NEW(const char *, argc + 3)) == NULL) goto Catch;
c->argv[0] = pprog; c->argv[0] = pprog;
c->argc = argc + 2; c->argc = argc + 2;
initVectorFromBlock(c->argv+1, pargBlock, argc); initVectorFromBlock(c->argv+1, pargBlock, argc);
@ -690,10 +690,11 @@ Java_java_lang_UNIXProcess_forkAndExec(JNIEnv *env,
closeSafely(childenv[0]); closeSafely(childenv[0]);
closeSafely(childenv[1]); closeSafely(childenv[1]);
releaseBytes(env, prog, pprog); releaseBytes(env, helperpath, phelperpath);
releaseBytes(env, argBlock, pargBlock); releaseBytes(env, prog, pprog);
releaseBytes(env, envBlock, penvBlock); releaseBytes(env, argBlock, pargBlock);
releaseBytes(env, dir, c->pdir); releaseBytes(env, envBlock, penvBlock);
releaseBytes(env, dir, c->pdir);
free(c->argv); free(c->argv);
free(c->envv); free(c->envv);

View file

@ -114,7 +114,7 @@ public final class JRSUIControl {
changes.putAll(other.changes); changes.putAll(other.changes);
} }
protected synchronized final void finalize() throws Throwable { protected synchronized void finalize() throws Throwable {
if (cfDictionaryPtr == 0) return; if (cfDictionaryPtr == 0) return;
disposeCFDictionary(cfDictionaryPtr); disposeCFDictionary(cfDictionaryPtr);
cfDictionaryPtr = 0; cfDictionaryPtr = 0;

View file

@ -938,7 +938,11 @@ public class AquaInternalFrameUI extends BasicInternalFrameUI implements SwingCo
final Point pt = new Point(); final Point pt = new Point();
final Component c = getComponentToForwardTo(e, pt); final Component c = getComponentToForwardTo(e, pt);
if (c == null) return; if (c == null) return;
c.dispatchEvent(new MouseWheelEvent(c, e.getID(), e.getWhen(), e.getModifiers(), pt.x, pt.y, e.getClickCount(), e.isPopupTrigger(), e.getScrollType(), e.getScrollAmount(), e.getWheelRotation())); c.dispatchEvent(new MouseWheelEvent(c, e.getID(), e.getWhen(),
e.getModifiers(), pt.x, pt.y, e.getXOnScreen(), e.getYOnScreen(),
e.getClickCount(), e.isPopupTrigger(), e.getScrollType(),
e.getScrollAmount(), e.getWheelRotation(),
e.getPreciseWheelRotation()));
} }
public void componentResized(final ComponentEvent e) { public void componentResized(final ComponentEvent e) {

View file

@ -3307,7 +3307,7 @@ public class AquaTabbedPaneCopyFromBasicUI extends TabbedPaneUI implements Swing
pane.repaint(); pane.repaint();
} else if (name == "indexForTitle") { } else if (name == "indexForTitle") {
calculatedBaseline = false; calculatedBaseline = false;
updateHtmlViews((Integer) e.getNewValue()); updateHtmlViews((Integer) e.getNewValue(), false);
} else if (name == "tabLayoutPolicy") { } else if (name == "tabLayoutPolicy") {
AquaTabbedPaneCopyFromBasicUI.this.uninstallUI(pane); AquaTabbedPaneCopyFromBasicUI.this.uninstallUI(pane);
AquaTabbedPaneCopyFromBasicUI.this.installUI(pane); AquaTabbedPaneCopyFromBasicUI.this.installUI(pane);
@ -3345,7 +3345,7 @@ public class AquaTabbedPaneCopyFromBasicUI extends TabbedPaneUI implements Swing
calculatedBaseline = false; calculatedBaseline = false;
} else if (name == "indexForNullComponent") { } else if (name == "indexForNullComponent") {
isRunsDirty = true; isRunsDirty = true;
updateHtmlViews((Integer) e.getNewValue()); updateHtmlViews((Integer) e.getNewValue(), true);
} else if (name == "font") { } else if (name == "font") {
calculatedBaseline = false; calculatedBaseline = false;
} }
@ -3464,10 +3464,10 @@ public class AquaTabbedPaneCopyFromBasicUI extends TabbedPaneUI implements Swing
return; return;
} }
isRunsDirty = true; isRunsDirty = true;
updateHtmlViews(tp.indexOfComponent(child)); updateHtmlViews(tp.indexOfComponent(child), true);
} }
private void updateHtmlViews(int index) { private void updateHtmlViews(int index, boolean inserted) {
final String title = tabPane.getTitleAt(index); final String title = tabPane.getTitleAt(index);
final boolean isHTML = BasicHTML.isHTMLString(title); final boolean isHTML = BasicHTML.isHTMLString(title);
if (isHTML) { if (isHTML) {
@ -3475,16 +3475,24 @@ public class AquaTabbedPaneCopyFromBasicUI extends TabbedPaneUI implements Swing
htmlViews = createHTMLVector(); htmlViews = createHTMLVector();
} else { // Vector already exists } else { // Vector already exists
final View v = BasicHTML.createHTMLView(tabPane, title); final View v = BasicHTML.createHTMLView(tabPane, title);
htmlViews.insertElementAt(v, index); setHtmlView(v, inserted, index);
} }
} else { // Not HTML } else { // Not HTML
if (htmlViews != null) { // Add placeholder if (htmlViews != null) { // Add placeholder
htmlViews.insertElementAt(null, index); setHtmlView(null, inserted, index);
} // else nada! } // else nada!
} }
updateMnemonics(); updateMnemonics();
} }
private void setHtmlView(View v, boolean inserted, int index) {
if (inserted || index >= htmlViews.size()) {
htmlViews.insertElementAt(v, index);
} else {
htmlViews.setElementAt(v, index);
}
}
public void componentRemoved(final ContainerEvent e) { public void componentRemoved(final ContainerEvent e) {
final JTabbedPane tp = (JTabbedPane)e.getContainer(); final JTabbedPane tp = (JTabbedPane)e.getContainer();
final Component child = e.getChild(); final Component child = e.getChild();

View file

@ -43,7 +43,7 @@ import sun.awt.HeadlessToolkit;
import sun.awt.util.ThreadGroupUtils; import sun.awt.util.ThreadGroupUtils;
import sun.lwawt.macosx.*; import sun.lwawt.macosx.*;
public class CFontManager extends SunFontManager { public final class CFontManager extends SunFontManager {
private FontConfigManager fcManager = null; private FontConfigManager fcManager = null;
private static Hashtable<String, Font2D> genericFonts = new Hashtable<String, Font2D>(); private static Hashtable<String, Font2D> genericFonts = new Hashtable<String, Font2D>();
@ -61,20 +61,14 @@ public class CFontManager extends SunFontManager {
return new CFontConfiguration(this, preferLocaleFonts, preferPropFonts); return new CFontConfiguration(this, preferLocaleFonts, preferPropFonts);
} }
private static String[] defaultPlatformFont = null;
/* /*
* Returns an array of two strings. The first element is the * Returns an array of two strings. The first element is the
* name of the font. The second element is the file name. * name of the font. The second element is the file name.
*/ */
@Override @Override
public synchronized String[] getDefaultPlatformFont() { protected String[] getDefaultPlatformFont() {
if (defaultPlatformFont == null) { return new String[]{"Lucida Grande",
defaultPlatformFont = new String[2]; "/System/Library/Fonts/LucidaGrande.ttc"};
defaultPlatformFont[0] = "Lucida Grande";
defaultPlatformFont[1] = "/System/Library/Fonts/LucidaGrande.ttc";
}
return defaultPlatformFont;
} }
// This is a way to register any kind of Font2D, not just files and composites. // This is a way to register any kind of Font2D, not just files and composites.

View file

@ -1233,11 +1233,13 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent>
delegate, me.getID(), me.getWhen(), delegate, me.getID(), me.getWhen(),
me.getModifiers(), me.getModifiers(),
me.getX(), me.getY(), me.getX(), me.getY(),
me.getXOnScreen(), me.getYOnScreen(),
me.getClickCount(), me.getClickCount(),
me.isPopupTrigger(), me.isPopupTrigger(),
me.getScrollType(), me.getScrollType(),
me.getScrollAmount(), me.getScrollAmount(),
me.getWheelRotation()); me.getWheelRotation(),
me.getPreciseWheelRotation());
} else if (e instanceof MouseEvent) { } else if (e instanceof MouseEvent) {
MouseEvent me = (MouseEvent) e; MouseEvent me = (MouseEvent) e;

View file

@ -105,6 +105,8 @@ public class LWWindowPeer
private final SecurityWarningWindow warningWindow; private final SecurityWarningWindow warningWindow;
private volatile boolean targetFocusable;
/** /**
* Current modal blocker or null. * Current modal blocker or null.
* *
@ -240,13 +242,12 @@ public class LWWindowPeer
if (!visible && warningWindow != null) { if (!visible && warningWindow != null) {
warningWindow.setVisible(false, false); warningWindow.setVisible(false, false);
} }
updateFocusableWindowState();
super.setVisibleImpl(visible); super.setVisibleImpl(visible);
// TODO: update graphicsConfig, see 4868278 // TODO: update graphicsConfig, see 4868278
platformWindow.setVisible(visible); platformWindow.setVisible(visible);
if (isSimpleWindow()) { if (isSimpleWindow()) {
KeyboardFocusManagerPeer kfmPeer = LWKeyboardFocusManagerPeer.getInstance(); KeyboardFocusManagerPeer kfmPeer = LWKeyboardFocusManagerPeer.getInstance();
if (visible) { if (visible) {
if (!getTarget().isAutoRequestFocus()) { if (!getTarget().isAutoRequestFocus()) {
return; return;
@ -397,6 +398,7 @@ public class LWWindowPeer
@Override @Override
public void updateFocusableWindowState() { public void updateFocusableWindowState() {
targetFocusable = getTarget().isFocusableWindow();
platformWindow.updateFocusableWindowState(); platformWindow.updateFocusableWindowState();
} }
@ -1220,13 +1222,13 @@ public class LWWindowPeer
} }
private boolean isFocusableWindow() { private boolean isFocusableWindow() {
boolean focusable = getTarget().isFocusableWindow(); boolean focusable = targetFocusable;
if (isSimpleWindow()) { if (isSimpleWindow()) {
LWWindowPeer ownerPeer = getOwnerFrameDialog(this); LWWindowPeer ownerPeer = getOwnerFrameDialog(this);
if (ownerPeer == null) { if (ownerPeer == null) {
return false; return false;
} }
return focusable && ownerPeer.getTarget().isFocusableWindow(); return focusable && ownerPeer.targetFocusable;
} }
return focusable; return focusable;
} }

View file

@ -38,7 +38,8 @@ public class CEmbeddedFrame extends EmbeddedFrame {
private CPlatformResponder responder; private CPlatformResponder responder;
private static final Object classLock = new Object(); private static final Object classLock = new Object();
private static volatile CEmbeddedFrame focusedWindow; private static volatile CEmbeddedFrame globalFocusedWindow;
private CEmbeddedFrame browserWindowFocusedApplet;
private boolean parentWindowActive = true; private boolean parentWindowActive = true;
public CEmbeddedFrame() { public CEmbeddedFrame() {
@ -111,10 +112,10 @@ public class CEmbeddedFrame extends EmbeddedFrame {
synchronized (classLock) { synchronized (classLock) {
// In some cases an applet may not receive the focus lost event // In some cases an applet may not receive the focus lost event
// from the parent window (see 8012330) // from the parent window (see 8012330)
focusedWindow = (focused) ? this globalFocusedWindow = (focused) ? this
: ((focusedWindow == this) ? null : focusedWindow); : ((globalFocusedWindow == this) ? null : globalFocusedWindow);
} }
if (focusedWindow == this) { if (globalFocusedWindow == this) {
// see bug 8010925 // see bug 8010925
// we can't put this to handleWindowFocusEvent because // we can't put this to handleWindowFocusEvent because
// it won't be invoced if focuse is moved to a html element // it won't be invoced if focuse is moved to a html element
@ -145,9 +146,23 @@ public class CEmbeddedFrame extends EmbeddedFrame {
// non-focused applet. This method can be called from different threads. // non-focused applet. This method can be called from different threads.
public void handleWindowFocusEvent(boolean parentWindowActive) { public void handleWindowFocusEvent(boolean parentWindowActive) {
this.parentWindowActive = parentWindowActive; this.parentWindowActive = parentWindowActive;
// If several applets are running in different browser's windows, it is necessary to
// detect the switching between the parent windows and update globalFocusedWindow accordingly.
synchronized (classLock) {
if (!parentWindowActive) {
this.browserWindowFocusedApplet = globalFocusedWindow;
}
if (parentWindowActive && globalFocusedWindow != this && isParentWindowChanged()) {
// It looks like we have switched to another browser window, let's restore focus to
// the previously focused applet in this window. If no applets were focused in the
// window, we will set focus to the first applet in the window.
globalFocusedWindow = (this.browserWindowFocusedApplet != null) ? this.browserWindowFocusedApplet
: this;
}
}
// ignore focus "lost" native request as it may mistakenly // ignore focus "lost" native request as it may mistakenly
// deactivate active window (see 8001161) // deactivate active window (see 8001161)
if (focusedWindow == this && parentWindowActive) { if (globalFocusedWindow == this && parentWindowActive) {
responder.handleWindowFocusEvent(parentWindowActive, null); responder.handleWindowFocusEvent(parentWindowActive, null);
} }
} }
@ -155,4 +170,10 @@ public class CEmbeddedFrame extends EmbeddedFrame {
public boolean isParentWindowActive() { public boolean isParentWindowActive() {
return parentWindowActive; return parentWindowActive;
} }
private boolean isParentWindowChanged() {
// If globalFocusedWindow is located at inactive parent window or null, we have swithed to
// another window.
return globalFocusedWindow != null ? !globalFocusedWindow.isParentWindowActive() : true;
}
} }

View file

@ -54,11 +54,11 @@ public final class NSPrintInfo implements PrintJobAttribute, PrintRequestAttribu
return "" + fNSPrintInfo; return "" + fNSPrintInfo;
} }
public final Class<? extends Attribute> getCategory() { public Class<? extends Attribute> getCategory() {
return NSPrintInfo.class; return NSPrintInfo.class;
} }
public final String getName() { public String getName() {
return "nsPrintInfo"; return "nsPrintInfo";
} }
} }

View file

@ -1108,7 +1108,10 @@ static NSObject *sAttributeNamesLOCK = nil;
JNIEnv *env = [ThreadUtilities getJNIEnv]; JNIEnv *env = [ThreadUtilities getJNIEnv];
id value = nil; id value = nil;
NSWindow* hostWindow = [[self->fView window] retain];
jobject focused = JNFCallStaticObjectMethod(env, jm_getFocusOwner, fComponent); // AWT_THREADING Safe (AWTRunLoop) jobject focused = JNFCallStaticObjectMethod(env, jm_getFocusOwner, fComponent); // AWT_THREADING Safe (AWTRunLoop)
[hostWindow release];
if (focused != NULL) { if (focused != NULL) {
if (JNFIsInstanceOf(env, focused, &sjc_Accessible)) { if (JNFIsInstanceOf(env, focused, &sjc_Accessible)) {
value = [JavaComponentAccessibility createWithAccessible:focused withEnv:env withView:fView]; value = [JavaComponentAccessibility createWithAccessible:focused withEnv:env withView:fView];

View file

@ -68,7 +68,7 @@ public final class FFT {
calc(fftFrameSize, data, sign, w); calc(fftFrameSize, data, sign, w);
} }
private final static double[] computeTwiddleFactors(int fftFrameSize, private static double[] computeTwiddleFactors(int fftFrameSize,
int sign) { int sign) {
int imax = (int) (Math.log(fftFrameSize) / Math.log(2.)); int imax = (int) (Math.log(fftFrameSize) / Math.log(2.));
@ -122,7 +122,7 @@ public final class FFT {
return warray; return warray;
} }
private final static void calc(int fftFrameSize, double[] data, int sign, private static void calc(int fftFrameSize, double[] data, int sign,
double[] w) { double[] w) {
final int fftFrameSize2 = fftFrameSize << 1; final int fftFrameSize2 = fftFrameSize << 1;
@ -139,7 +139,7 @@ public final class FFT {
} }
private final static void calcF2E(int fftFrameSize, double[] data, int i, private static void calcF2E(int fftFrameSize, double[] data, int i,
int nstep, double[] w) { int nstep, double[] w) {
int jmax = nstep; int jmax = nstep;
for (int n = 0; n < jmax; n += 2) { for (int n = 0; n < jmax; n += 2) {
@ -163,7 +163,7 @@ public final class FFT {
// Perform Factor-4 Decomposition with 3 * complex operators and 8 +/- // Perform Factor-4 Decomposition with 3 * complex operators and 8 +/-
// complex operators // complex operators
private final static void calcF4F(int fftFrameSize, double[] data, int i, private static void calcF4F(int fftFrameSize, double[] data, int i,
int nstep, double[] w) { int nstep, double[] w) {
final int fftFrameSize2 = fftFrameSize << 1; // 2*fftFrameSize; final int fftFrameSize2 = fftFrameSize << 1; // 2*fftFrameSize;
// Factor-4 Decomposition // Factor-4 Decomposition
@ -331,7 +331,7 @@ public final class FFT {
// Perform Factor-4 Decomposition with 3 * complex operators and 8 +/- // Perform Factor-4 Decomposition with 3 * complex operators and 8 +/-
// complex operators // complex operators
private final static void calcF4I(int fftFrameSize, double[] data, int i, private static void calcF4I(int fftFrameSize, double[] data, int i,
int nstep, double[] w) { int nstep, double[] w) {
final int fftFrameSize2 = fftFrameSize << 1; // 2*fftFrameSize; final int fftFrameSize2 = fftFrameSize << 1; // 2*fftFrameSize;
// Factor-4 Decomposition // Factor-4 Decomposition
@ -499,7 +499,7 @@ public final class FFT {
// Perform Factor-4 Decomposition with 3 * complex operators and 8 +/- // Perform Factor-4 Decomposition with 3 * complex operators and 8 +/-
// complex operators // complex operators
private final static void calcF4FE(int fftFrameSize, double[] data, int i, private static void calcF4FE(int fftFrameSize, double[] data, int i,
int nstep, double[] w) { int nstep, double[] w) {
final int fftFrameSize2 = fftFrameSize << 1; // 2*fftFrameSize; final int fftFrameSize2 = fftFrameSize << 1; // 2*fftFrameSize;
// Factor-4 Decomposition // Factor-4 Decomposition
@ -593,7 +593,7 @@ public final class FFT {
// Perform Factor-4 Decomposition with 3 * complex operators and 8 +/- // Perform Factor-4 Decomposition with 3 * complex operators and 8 +/-
// complex operators // complex operators
private final static void calcF4IE(int fftFrameSize, double[] data, int i, private static void calcF4IE(int fftFrameSize, double[] data, int i,
int nstep, double[] w) { int nstep, double[] w) {
final int fftFrameSize2 = fftFrameSize << 1; // 2*fftFrameSize; final int fftFrameSize2 = fftFrameSize << 1; // 2*fftFrameSize;
// Factor-4 Decomposition // Factor-4 Decomposition
@ -685,7 +685,7 @@ public final class FFT {
} }
private final void bitreversal(double[] data) { private void bitreversal(double[] data) {
if (fftFrameSize < 4) if (fftFrameSize < 4)
return; return;

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -25,6 +25,8 @@
package com.sun.media.sound; package com.sun.media.sound;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -176,11 +178,11 @@ public final class JDK13Services {
&& !Sequencer.class.equals(typeClass)) { && !Sequencer.class.equals(typeClass)) {
return null; return null;
} }
String value; String name = typeClass.getName();
String propertyName = typeClass.getName(); String value = AccessController.doPrivileged(
value = JSSecurityManager.getProperty(propertyName); (PrivilegedAction<String>) () -> System.getProperty(name));
if (value == null) { if (value == null) {
value = getProperties().getProperty(propertyName); value = getProperties().getProperty(name);
} }
if ("".equals(value)) { if ("".equals(value)) {
value = null; value = null;

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -73,33 +73,6 @@ final class JSSecurityManager {
} }
} }
static String getProperty(final String propertyName) {
String propertyValue;
if (hasSecurityManager()) {
if(Printer.debug) Printer.debug("using JDK 1.2 security to get property");
try{
PrivilegedAction<String> action = new PrivilegedAction<String>() {
public String run() {
try {
return System.getProperty(propertyName);
} catch (Throwable t) {
return null;
}
}
};
propertyValue = AccessController.doPrivileged(action);
} catch( Exception e ) {
if(Printer.debug) Printer.debug("not using JDK 1.2 security to get properties");
propertyValue = System.getProperty(propertyName);
}
} else {
if(Printer.debug) Printer.debug("not using JDK 1.2 security to get properties");
propertyValue = System.getProperty(propertyName);
}
return propertyValue;
}
/** Load properties from a file. /** Load properties from a file.
This method tries to load properties from the filename give into This method tries to load properties from the filename give into
the passed properties object. the passed properties object.

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -74,17 +74,6 @@ final class Platform {
// intel is little-endian. sparc is big-endian. // intel is little-endian. sparc is big-endian.
private static boolean bigEndian; private static boolean bigEndian;
// this is the value of the "java.home" system property. i am looking it up here
// for use when trying to load the soundbank, just so
// that all the privileged code is localized in this file....
private static String javahome;
// this is the value of the "java.class.path" system property
private static String classpath;
static { static {
if(Printer.trace)Printer.trace(">> Platform.java: static"); if(Printer.trace)Printer.trace(">> Platform.java: static");
@ -129,26 +118,6 @@ final class Platform {
return signed8; return signed8;
} }
/**
* Obtain javahome.
* $$kk: 04.16.99: this is *bad*!!
*/
static String getJavahome() {
return javahome;
}
/**
* Obtain classpath.
* $$jb: 04.21.99: this is *bad* too!!
*/
static String getClasspath() {
return classpath;
}
// PRIVATE METHODS // PRIVATE METHODS
/** /**
@ -157,21 +126,13 @@ final class Platform {
private static void loadLibraries() { private static void loadLibraries() {
if(Printer.trace)Printer.trace(">>Platform.loadLibraries"); if(Printer.trace)Printer.trace(">>Platform.loadLibraries");
try { // load the main library
// load the main library AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
AccessController.doPrivileged(new PrivilegedAction<Void>() { System.loadLibrary(libNameMain);
@Override return null;
public Void run() { });
System.loadLibrary(libNameMain); // just for the heck of it...
return null; loadedLibs |= LIB_MAIN;
}
});
// just for the heck of it...
loadedLibs |= LIB_MAIN;
} catch (SecurityException e) {
if(Printer.err)Printer.err("Security exception loading main native library. JavaSound requires access to these resources.");
throw(e);
}
// now try to load extra libs. They are defined at compile time in the Makefile // now try to load extra libs. They are defined at compile time in the Makefile
// with the define EXTRA_SOUND_JNI_LIBS // with the define EXTRA_SOUND_JNI_LIBS
@ -181,12 +142,9 @@ final class Platform {
while (st.hasMoreTokens()) { while (st.hasMoreTokens()) {
final String lib = st.nextToken(); final String lib = st.nextToken();
try { try {
AccessController.doPrivileged(new PrivilegedAction<Void>() { AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
@Override System.loadLibrary(lib);
public Void run() { return null;
System.loadLibrary(lib);
return null;
}
}); });
if (lib.equals(libNameALSA)) { if (lib.equals(libNameALSA)) {
@ -239,7 +197,5 @@ final class Platform {
// $$fb 2002-03-06: implement check for endianness in native. Facilitates porting ! // $$fb 2002-03-06: implement check for endianness in native. Facilitates porting !
bigEndian = nIsBigEndian(); bigEndian = nIsBigEndian();
signed8 = nIsSigned8(); // Solaris on Sparc: signed, all others unsigned signed8 = nIsSigned8(); // Solaris on Sparc: signed, all others unsigned
javahome = JSSecurityManager.getProperty("java.home");
classpath = JSSecurityManager.getProperty("java.class.path");
} }
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -39,21 +39,20 @@ public final class RIFFReader extends InputStream {
private long filepointer = 0; private long filepointer = 0;
private final String fourcc; private final String fourcc;
private String riff_type = null; private String riff_type = null;
private long ckSize = 0; private long ckSize = Integer.MAX_VALUE;
private InputStream stream; private InputStream stream;
private long avail; private long avail = Integer.MAX_VALUE;
private RIFFReader lastiterator = null; private RIFFReader lastiterator = null;
public RIFFReader(InputStream stream) throws IOException { public RIFFReader(InputStream stream) throws IOException {
if (stream instanceof RIFFReader) if (stream instanceof RIFFReader) {
root = ((RIFFReader)stream).root; root = ((RIFFReader) stream).root;
else } else {
root = this; root = this;
}
this.stream = stream; this.stream = stream;
avail = Integer.MAX_VALUE;
ckSize = Integer.MAX_VALUE;
// Check for RIFF null paddings, // Check for RIFF null paddings,
int b; int b;
@ -76,10 +75,12 @@ public final class RIFFReader extends InputStream {
readFully(fourcc, 1, 3); readFully(fourcc, 1, 3);
this.fourcc = new String(fourcc, "ascii"); this.fourcc = new String(fourcc, "ascii");
ckSize = readUnsignedInt(); ckSize = readUnsignedInt();
avail = ckSize;
avail = this.ckSize;
if (getFormat().equals("RIFF") || getFormat().equals("LIST")) { if (getFormat().equals("RIFF") || getFormat().equals("LIST")) {
if (avail > Integer.MAX_VALUE) {
throw new RIFFInvalidDataException("Chunk size too big");
}
byte[] format = new byte[4]; byte[] format = new byte[4];
readFully(format); readFully(format);
this.riff_type = new String(format, "ascii"); this.riff_type = new String(format, "ascii");
@ -118,19 +119,23 @@ public final class RIFFReader extends InputStream {
} }
public int read() throws IOException { public int read() throws IOException {
if (avail == 0) if (avail == 0) {
return -1; return -1;
}
int b = stream.read(); int b = stream.read();
if (b == -1) if (b == -1) {
avail = 0;
return -1; return -1;
}
avail--; avail--;
filepointer++; filepointer++;
return b; return b;
} }
public int read(byte[] b, int offset, int len) throws IOException { public int read(byte[] b, int offset, int len) throws IOException {
if (avail == 0) if (avail == 0) {
return -1; return -1;
}
if (len > avail) { if (len > avail) {
int rlen = stream.read(b, offset, (int)avail); int rlen = stream.read(b, offset, (int)avail);
if (rlen != -1) if (rlen != -1)
@ -139,19 +144,21 @@ public final class RIFFReader extends InputStream {
return rlen; return rlen;
} else { } else {
int ret = stream.read(b, offset, len); int ret = stream.read(b, offset, len);
if (ret == -1) if (ret == -1) {
avail = 0;
return -1; return -1;
}
avail -= ret; avail -= ret;
filepointer += ret; filepointer += ret;
return ret; return ret;
} }
} }
public final void readFully(byte b[]) throws IOException { public void readFully(byte b[]) throws IOException {
readFully(b, 0, b.length); readFully(b, 0, b.length);
} }
public final void readFully(byte b[], int off, int len) throws IOException { public void readFully(byte b[], int off, int len) throws IOException {
if (len < 0) if (len < 0)
throw new IndexOutOfBoundsException(); throw new IndexOutOfBoundsException();
while (len > 0) { while (len > 0) {
@ -165,7 +172,7 @@ public final class RIFFReader extends InputStream {
} }
} }
public final long skipBytes(long n) throws IOException { public long skipBytes(long n) throws IOException {
if (n < 0) if (n < 0)
return 0; return 0;
long skipped = 0; long skipped = 0;
@ -191,8 +198,10 @@ public final class RIFFReader extends InputStream {
return len; return len;
} else { } else {
long ret = stream.skip(n); long ret = stream.skip(n);
if (ret == -1) if (ret == -1) {
avail = 0;
return -1; return -1;
}
avail -= ret; avail -= ret;
filepointer += ret; filepointer += ret;
return ret; return ret;
@ -210,8 +219,13 @@ public final class RIFFReader extends InputStream {
} }
// Read ASCII chars from stream // Read ASCII chars from stream
public String readString(int len) throws IOException { public String readString(final int len) throws IOException {
byte[] buff = new byte[len]; final byte[] buff;
try {
buff = new byte[len];
} catch (final OutOfMemoryError oom) {
throw new IOException("Length too big", oom);
}
readFully(buff); readFully(buff);
for (int i = 0; i < buff.length; i++) { for (int i = 0; i < buff.length; i++) {
if (buff[i] == 0) { if (buff[i] == 0) {

View file

@ -276,6 +276,9 @@ public final class SF2Soundbank implements Soundbank {
count--; count--;
} }
if (presets_bagNdx.isEmpty()) {
throw new RIFFInvalidDataException();
}
int offset = presets_bagNdx.get(0); int offset = presets_bagNdx.get(0);
// Offset should be 0 (but just case) // Offset should be 0 (but just case)
for (int i = 0; i < offset; i++) { for (int i = 0; i < offset; i++) {
@ -360,6 +363,9 @@ public final class SF2Soundbank implements Soundbank {
count--; count--;
} }
if (instruments_bagNdx.isEmpty()) {
throw new RIFFInvalidDataException();
}
int offset = instruments_bagNdx.get(0); int offset = instruments_bagNdx.get(0);
// Offset should be 0 (but just case) // Offset should be 0 (but just case)
for (int i = 0; i < offset; i++) { for (int i = 0; i < offset; i++) {
@ -401,6 +407,9 @@ public final class SF2Soundbank implements Soundbank {
modulator.amount = chunk.readShort(); modulator.amount = chunk.readShort();
modulator.amountSourceOperator = chunk.readUnsignedShort(); modulator.amountSourceOperator = chunk.readUnsignedShort();
modulator.transportOperator = chunk.readUnsignedShort(); modulator.transportOperator = chunk.readUnsignedShort();
if (i < 0 || i >= instruments_splits_gen.size()) {
throw new RIFFInvalidDataException();
}
SF2LayerRegion split = instruments_splits_gen.get(i); SF2LayerRegion split = instruments_splits_gen.get(i);
if (split != null) if (split != null)
split.modulators.add(modulator); split.modulators.add(modulator);
@ -424,7 +433,8 @@ public final class SF2Soundbank implements Soundbank {
sample.name = chunk.readString(20); sample.name = chunk.readString(20);
long start = chunk.readUnsignedInt(); long start = chunk.readUnsignedInt();
long end = chunk.readUnsignedInt(); long end = chunk.readUnsignedInt();
sample.data = sampleData.subbuffer(start * 2, end * 2, true); if (sampleData != null)
sample.data = sampleData.subbuffer(start * 2, end * 2, true);
if (sampleData24 != null) if (sampleData24 != null)
sample.data24 = sampleData24.subbuffer(start, end, true); sample.data24 = sampleData24.subbuffer(start, end, true);
/* /*
@ -462,6 +472,9 @@ public final class SF2Soundbank implements Soundbank {
int sampleid = split.generators.get( int sampleid = split.generators.get(
SF2LayerRegion.GENERATOR_SAMPLEID); SF2LayerRegion.GENERATOR_SAMPLEID);
split.generators.remove(SF2LayerRegion.GENERATOR_SAMPLEID); split.generators.remove(SF2LayerRegion.GENERATOR_SAMPLEID);
if (sampleid < 0 || sampleid >= samples.size()) {
throw new RIFFInvalidDataException();
}
split.sample = samples.get(sampleid); split.sample = samples.get(sampleid);
} else { } else {
globalsplit = split; globalsplit = split;
@ -488,6 +501,9 @@ public final class SF2Soundbank implements Soundbank {
int instrumentid = split.generators.get( int instrumentid = split.generators.get(
SF2InstrumentRegion.GENERATOR_INSTRUMENT); SF2InstrumentRegion.GENERATOR_INSTRUMENT);
split.generators.remove(SF2LayerRegion.GENERATOR_INSTRUMENT); split.generators.remove(SF2LayerRegion.GENERATOR_INSTRUMENT);
if (instrumentid < 0 || instrumentid >= layers.size()) {
throw new RIFFInvalidDataException();
}
split.layer = layers.get(instrumentid); split.layer = layers.get(instrumentid);
} else { } else {
globalsplit = split; globalsplit = split;

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any * or visit www.oracle.com if you need additional information or have any
* questions. * questions.
*/ */
package com.sun.media.sound; package com.sun.media.sound;
import java.io.File; import java.io.File;
@ -39,14 +40,14 @@ import javax.sound.midi.Receiver;
import javax.sound.midi.Sequence; import javax.sound.midi.Sequence;
import javax.sound.midi.Track; import javax.sound.midi.Track;
import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFileFormat.Type;
import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.UnsupportedAudioFileException; import javax.sound.sampled.UnsupportedAudioFileException;
import javax.sound.sampled.AudioFileFormat.Type;
import javax.sound.sampled.spi.AudioFileReader; import javax.sound.sampled.spi.AudioFileReader;
/** /**
* MIDI File Audio Renderer/Reader * MIDI File Audio Renderer/Reader.
* *
* @author Karl Helgason * @author Karl Helgason
*/ */
@ -109,6 +110,9 @@ public final class SoftMidiAudioFileReader extends AudioFileReader {
if (divtype == Sequence.PPQ) { if (divtype == Sequence.PPQ) {
if (((MetaMessage) msg).getType() == 0x51) { if (((MetaMessage) msg).getType() == 0x51) {
byte[] data = ((MetaMessage) msg).getData(); byte[] data = ((MetaMessage) msg).getData();
if (data.length < 3) {
throw new UnsupportedAudioFileException();
}
mpq = ((data[0] & 0xff) << 16) mpq = ((data[0] & 0xff) << 16)
| ((data[1] & 0xff) << 8) | (data[2] & 0xff); | ((data[1] & 0xff) << 8) | (data[2] & 0xff);
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2008, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -28,6 +28,7 @@ package com.sun.media.sound;
import java.io.BufferedInputStream; import java.io.BufferedInputStream;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@ -732,31 +733,28 @@ public final class SoftSynthesizer implements AudioSynthesizer,
* Save generated soundbank to disk for faster future use. * Save generated soundbank to disk for faster future use.
*/ */
OutputStream out = AccessController OutputStream out = AccessController
.doPrivileged(new PrivilegedAction<OutputStream>() { .doPrivileged((PrivilegedAction<OutputStream>) () -> {
public OutputStream run() { try {
try { File userhome = new File(System
File userhome = new File(System .getProperty("user.home"), ".gervill");
.getProperty("user.home"), if (!userhome.exists()) {
".gervill"); userhome.mkdirs();
if (!userhome.exists())
userhome.mkdirs();
File emg_soundbank_file = new File(
userhome, "soundbank-emg.sf2");
if (emg_soundbank_file.exists())
return null;
return new FileOutputStream(
emg_soundbank_file);
} catch (IOException e) {
} catch (SecurityException e) {
} }
return null; File emg_soundbank_file = new File(
userhome, "soundbank-emg.sf2");
if (emg_soundbank_file.exists()) {
return null;
}
return new FileOutputStream(emg_soundbank_file);
} catch (final FileNotFoundException ignored) {
} }
return null;
}); });
if (out != null) { if (out != null) {
try { try {
((SF2Soundbank) defaultSoundBank).save(out); ((SF2Soundbank) defaultSoundBank).save(out);
out.close(); out.close();
} catch (IOException e) { } catch (final IOException ignored) {
} }
} }
} }
@ -846,26 +844,24 @@ public final class SoftSynthesizer implements AudioSynthesizer,
private Properties getStoredProperties() { private Properties getStoredProperties() {
return AccessController return AccessController
.doPrivileged(new PrivilegedAction<Properties>() { .doPrivileged((PrivilegedAction<Properties>) () -> {
public Properties run() { Properties p = new Properties();
Properties p = new Properties(); String notePath = "/com/sun/media/sound/softsynthesizer";
String notePath = "/com/sun/media/sound/softsynthesizer"; try {
try { Preferences prefroot = Preferences.userRoot();
Preferences prefroot = Preferences.userRoot(); if (prefroot.nodeExists(notePath)) {
if (prefroot.nodeExists(notePath)) { Preferences prefs = prefroot.node(notePath);
Preferences prefs = prefroot.node(notePath); String[] prefs_keys = prefs.keys();
String[] prefs_keys = prefs.keys(); for (String prefs_key : prefs_keys) {
for (String prefs_key : prefs_keys) { String val = prefs.get(prefs_key, null);
String val = prefs.get(prefs_key, null); if (val != null) {
if (val != null) p.setProperty(prefs_key, val);
p.setProperty(prefs_key, val);
} }
} }
} catch (BackingStoreException e) {
} catch (SecurityException e) {
} }
return p; } catch (final BackingStoreException ignored) {
} }
return p;
}); });
} }
@ -1044,7 +1040,6 @@ public final class SoftSynthesizer implements AudioSynthesizer,
return; return;
} }
synchronized (control_mutex) { synchronized (control_mutex) {
Throwable causeException = null;
try { try {
if (line != null) { if (line != null) {
// can throw IllegalArgumentException // can throw IllegalArgumentException
@ -1117,24 +1112,17 @@ public final class SoftSynthesizer implements AudioSynthesizer,
weakstream.sourceDataLine = sourceDataLine; weakstream.sourceDataLine = sourceDataLine;
} }
} catch (LineUnavailableException e) { } catch (final LineUnavailableException | SecurityException
causeException = e; | IllegalArgumentException e) {
} catch (IllegalArgumentException e) { if (isOpen()) {
causeException = e;
} catch (SecurityException e) {
causeException = e;
}
if (causeException != null) {
if (isOpen())
close(); close();
}
// am: need MidiUnavailableException(Throwable) ctor! // am: need MidiUnavailableException(Throwable) ctor!
MidiUnavailableException ex = new MidiUnavailableException( MidiUnavailableException ex = new MidiUnavailableException(
"Can not open line"); "Can not open line");
ex.initCause(causeException); ex.initCause(e);
throw ex; throw ex;
} }
} }
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -25,27 +25,25 @@
package com.sun.media.sound; package com.sun.media.sound;
import java.io.BufferedInputStream;
import java.io.DataInputStream; import java.io.DataInputStream;
import java.io.EOFException;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.InputStream;
import java.io.IOException; import java.io.IOException;
import java.io.EOFException; import java.io.InputStream;
import java.io.BufferedInputStream;
import java.net.URL; import java.net.URL;
import javax.sound.midi.MidiFileFormat;
import javax.sound.midi.InvalidMidiDataException; import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MetaMessage; import javax.sound.midi.MetaMessage;
import javax.sound.midi.MidiEvent; import javax.sound.midi.MidiEvent;
import javax.sound.midi.MidiFileFormat;
import javax.sound.midi.MidiMessage; import javax.sound.midi.MidiMessage;
import javax.sound.midi.Sequence; import javax.sound.midi.Sequence;
import javax.sound.midi.SysexMessage; import javax.sound.midi.SysexMessage;
import javax.sound.midi.Track; import javax.sound.midi.Track;
import javax.sound.midi.spi.MidiFileReader; import javax.sound.midi.spi.MidiFileReader;
/** /**
* MIDI file reader. * MIDI file reader.
* *
@ -53,19 +51,23 @@ import javax.sound.midi.spi.MidiFileReader;
* @author Jan Borgersen * @author Jan Borgersen
* @author Florian Bomers * @author Florian Bomers
*/ */
public final class StandardMidiFileReader extends MidiFileReader { public final class StandardMidiFileReader extends MidiFileReader {
private static final int MThd_MAGIC = 0x4d546864; // 'MThd' private static final int MThd_MAGIC = 0x4d546864; // 'MThd'
private static final int bisBufferSize = 1024; // buffer size in buffered input streams private static final int bisBufferSize = 1024; // buffer size in buffered input streams
public MidiFileFormat getMidiFileFormat(InputStream stream) throws InvalidMidiDataException, IOException { public MidiFileFormat getMidiFileFormat(InputStream stream)
throws InvalidMidiDataException, IOException {
return getMidiFileFormatFromStream(stream, MidiFileFormat.UNKNOWN_LENGTH, null); return getMidiFileFormatFromStream(stream, MidiFileFormat.UNKNOWN_LENGTH, null);
} }
// $$fb 2002-04-17: part of fix for 4635286: MidiSystem.getMidiFileFormat() returns format having invalid length // $$fb 2002-04-17: part of fix for 4635286: MidiSystem.getMidiFileFormat()
private MidiFileFormat getMidiFileFormatFromStream(InputStream stream, int fileLength, SMFParser smfParser) throws InvalidMidiDataException, IOException { // returns format having invalid length
private MidiFileFormat getMidiFileFormatFromStream(InputStream stream,
int fileLength,
SMFParser smfParser)
throws InvalidMidiDataException, IOException{
int maxReadLength = 16; int maxReadLength = 16;
int duration = MidiFileFormat.UNKNOWN_LENGTH; int duration = MidiFileFormat.UNKNOWN_LENGTH;
DataInputStream dis; DataInputStream dis;
@ -230,7 +232,7 @@ public final class StandardMidiFileReader extends MidiFileReader {
//============================================================================================================= //=============================================================================================================
/** /**
* State variables during parsing of a MIDI file * State variables during parsing of a MIDI file.
*/ */
final class SMFParser { final class SMFParser {
private static final int MTrk_MAGIC = 0x4d54726b; // 'MTrk' private static final int MTrk_MAGIC = 0x4d54726b; // 'MTrk'
@ -297,7 +299,11 @@ final class SMFParser {
} }
} }
// now read track in a byte array // now read track in a byte array
trackData = new byte[trackLength]; try {
trackData = new byte[trackLength];
} catch (final OutOfMemoryError oom) {
throw new IOException("Track length too big", oom);
}
try { try {
// $$fb 2003-08-20: fix for 4910986: MIDI file parser breaks up on http connection // $$fb 2003-08-20: fix for 4910986: MIDI file parser breaks up on http connection
stream.readFully(trackData); stream.readFully(trackData);
@ -386,8 +392,13 @@ final class SMFParser {
// meta // meta
int metaType = readUnsigned(); int metaType = readUnsigned();
int metaLength = (int) readVarInt(); int metaLength = (int) readVarInt();
final byte[] metaData;
try {
metaData = new byte[metaLength];
} catch (final OutOfMemoryError oom) {
throw new IOException("Meta length too big", oom);
}
byte[] metaData = new byte[metaLength];
read(metaData); read(metaData);
MetaMessage metaMessage = new MetaMessage(); MetaMessage metaMessage = new MetaMessage();
@ -413,5 +424,4 @@ final class SMFParser {
throw new EOFException("invalid MIDI file"); throw new EOFException("invalid MIDI file");
} }
} }
} }

View file

@ -25,7 +25,7 @@
package java.awt.datatransfer; package java.awt.datatransfer;
import java.awt.EventQueue; import sun.datatransfer.DataFlavorUtil;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
@ -130,7 +130,8 @@ public class Clipboard {
this.contents = contents; this.contents = contents;
if (oldOwner != null && oldOwner != owner) { if (oldOwner != null && oldOwner != owner) {
EventQueue.invokeLater(() -> oldOwner.lostOwnership(Clipboard.this, oldContents)); DataFlavorUtil.getDesktopService().invokeOnEventThread(() ->
oldOwner.lostOwnership(Clipboard.this, oldContents));
} }
fireFlavorsChanged(); fireFlavorsChanged();
} }
@ -324,7 +325,7 @@ public class Clipboard {
return; return;
} }
flavorListeners.forEach(listener -> flavorListeners.forEach(listener ->
EventQueue.invokeLater(() -> DataFlavorUtil.getDesktopService().invokeOnEventThread(() ->
listener.flavorsChanged(new FlavorEvent(Clipboard.this)))); listener.flavorsChanged(new FlavorEvent(Clipboard.this))));
} }

View file

@ -25,7 +25,7 @@
package java.awt.datatransfer; package java.awt.datatransfer;
import sun.awt.datatransfer.DataTransferer; import sun.datatransfer.DataFlavorUtil;
import sun.reflect.misc.ReflectUtil; import sun.reflect.misc.ReflectUtil;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
@ -44,7 +44,6 @@ import java.nio.ByteBuffer;
import java.nio.CharBuffer; import java.nio.CharBuffer;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator;
import java.util.Objects; import java.util.Objects;
import static sun.security.util.SecurityConstants.GET_CLASSLOADER_PERMISSION; import static sun.security.util.SecurityConstants.GET_CLASSLOADER_PERMISSION;
@ -582,12 +581,12 @@ public class DataFlavor implements Externalizable, Cloneable {
} else { } else {
params += representationClass.getName(); params += representationClass.getName();
} }
if (DataTransferer.isFlavorCharsetTextType(this) && if (DataFlavorUtil.isFlavorCharsetTextType(this) &&
(isRepresentationClassInputStream() || (isRepresentationClassInputStream() ||
isRepresentationClassByteBuffer() || isRepresentationClassByteBuffer() ||
byte[].class.equals(representationClass))) byte[].class.equals(representationClass)))
{ {
params += ";charset=" + DataTransferer.getTextCharset(this); params += ";charset=" + DataFlavorUtil.getTextCharset(this);
} }
return params; return params;
} }
@ -609,13 +608,8 @@ public class DataFlavor implements Externalizable, Cloneable {
* @since 1.3 * @since 1.3
*/ */
public static final DataFlavor getTextPlainUnicodeFlavor() { public static final DataFlavor getTextPlainUnicodeFlavor() {
String encoding = null;
DataTransferer transferer = DataTransferer.getInstance();
if (transferer != null) {
encoding = transferer.getDefaultUnicodeEncoding();
}
return new DataFlavor( return new DataFlavor(
"text/plain;charset="+encoding "text/plain;charset=" + DataFlavorUtil.getDesktopService().getDefaultUnicodeEncoding()
+";class=java.io.InputStream", "Plain Text"); +";class=java.io.InputStream", "Plain Text");
} }
@ -741,12 +735,8 @@ public class DataFlavor implements Externalizable, Cloneable {
return null; return null;
} }
if (textFlavorComparator == null) {
textFlavorComparator = new TextFlavorComparator();
}
DataFlavor bestFlavor = Collections.max(Arrays.asList(availableFlavors), DataFlavor bestFlavor = Collections.max(Arrays.asList(availableFlavors),
textFlavorComparator); DataFlavorUtil.getTextFlavorComparator());
if (!bestFlavor.isFlavorTextType()) { if (!bestFlavor.isFlavorTextType()) {
return null; return null;
@ -755,46 +745,6 @@ public class DataFlavor implements Externalizable, Cloneable {
return bestFlavor; return bestFlavor;
} }
private static Comparator<DataFlavor> textFlavorComparator;
static class TextFlavorComparator
extends DataTransferer.DataFlavorComparator {
/**
* Compares two <code>DataFlavor</code> objects. Returns a negative
* integer, zero, or a positive integer as the first
* <code>DataFlavor</code> is worse than, equal to, or better than the
* second.
* <p>
* <code>DataFlavor</code>s are ordered according to the rules outlined
* for <code>selectBestTextFlavor</code>.
*
* @param flavor1 the first <code>DataFlavor</code> to be compared
* @param flavor2 the second <code>DataFlavor</code> to be compared
* @return a negative integer, zero, or a positive integer as the first
* argument is worse, equal to, or better than the second
* @throws ClassCastException if either of the arguments is not an
* instance of <code>DataFlavor</code>
* @throws NullPointerException if either of the arguments is
* <code>null</code>
*
* @see #selectBestTextFlavor
*/
public int compare(DataFlavor flavor1, DataFlavor flavor2) {
if (flavor1.isFlavorTextType()) {
if (flavor2.isFlavorTextType()) {
return super.compare(flavor1, flavor2);
} else {
return 1;
}
} else if (flavor2.isFlavorTextType()) {
return -1;
} else {
return 0;
}
}
}
/** /**
* Gets a Reader for a text flavor, decoded, if necessary, for the expected * Gets a Reader for a text flavor, decoded, if necessary, for the expected
* charset (encoding). The supported representation classes are * charset (encoding). The supported representation classes are
@ -1015,13 +965,13 @@ public class DataFlavor implements Externalizable, Cloneable {
} }
if ("text".equals(getPrimaryType())) { if ("text".equals(getPrimaryType())) {
if (DataTransferer.doesSubtypeSupportCharset(this) if (DataFlavorUtil.doesSubtypeSupportCharset(this)
&& representationClass != null && representationClass != null
&& !isStandardTextRepresentationClass()) { && !isStandardTextRepresentationClass()) {
String thisCharset = String thisCharset =
DataTransferer.canonicalName(this.getParameter("charset")); DataFlavorUtil.canonicalName(this.getParameter("charset"));
String thatCharset = String thatCharset =
DataTransferer.canonicalName(that.getParameter("charset")); DataFlavorUtil.canonicalName(that.getParameter("charset"));
if (!Objects.equals(thisCharset, thatCharset)) { if (!Objects.equals(thisCharset, thatCharset)) {
return false; return false;
} }
@ -1088,10 +1038,10 @@ public class DataFlavor implements Externalizable, Cloneable {
// subTypes is '*', regardless of the other subType. // subTypes is '*', regardless of the other subType.
if ("text".equals(primaryType)) { if ("text".equals(primaryType)) {
if (DataTransferer.doesSubtypeSupportCharset(this) if (DataFlavorUtil.doesSubtypeSupportCharset(this)
&& representationClass != null && representationClass != null
&& !isStandardTextRepresentationClass()) { && !isStandardTextRepresentationClass()) {
String charset = DataTransferer.canonicalName(getParameter("charset")); String charset = DataFlavorUtil.canonicalName(getParameter("charset"));
if (charset != null) { if (charset != null) {
total += charset.hashCode(); total += charset.hashCode();
} }
@ -1280,9 +1230,8 @@ public class DataFlavor implements Externalizable, Cloneable {
* Returns true if the representation class is <code>Remote</code>. * Returns true if the representation class is <code>Remote</code>.
* @return true if the representation class is <code>Remote</code> * @return true if the representation class is <code>Remote</code>
*/ */
public boolean isRepresentationClassRemote() { public boolean isRepresentationClassRemote() {
return DataTransferer.isRemote(representationClass); return DataFlavorUtil.RMI.isRemote(representationClass);
} }
/** /**
@ -1356,8 +1305,8 @@ public class DataFlavor implements Externalizable, Cloneable {
* @since 1.4 * @since 1.4
*/ */
public boolean isFlavorTextType() { public boolean isFlavorTextType() {
return (DataTransferer.isFlavorCharsetTextType(this) || return (DataFlavorUtil.isFlavorCharsetTextType(this) ||
DataTransferer.isFlavorNoncharsetTextType(this)); DataFlavorUtil.isFlavorNoncharsetTextType(this));
} }
/** /**

View file

@ -25,22 +25,15 @@
package java.awt.datatransfer; package java.awt.datatransfer;
import java.awt.Toolkit; import sun.datatransfer.DataFlavorUtil;
import sun.datatransfer.DesktopDatatransferService;
import java.io.BufferedInputStream;
import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.net.URL; import java.io.InputStreamReader;
import java.net.MalformedURLException; import java.lang.ref.SoftReference;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
@ -48,12 +41,8 @@ import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Properties;
import java.util.Set; import java.util.Set;
import sun.awt.AppContext;
import sun.awt.datatransfer.DataTransferer;
/** /**
* The SystemFlavorMap is a configurable map between "natives" (Strings), which * The SystemFlavorMap is a configurable map between "natives" (Strings), which
* correspond to platform-specific data formats, and "flavors" (DataFlavors), * correspond to platform-specific data formats, and "flavors" (DataFlavors),
@ -73,13 +62,6 @@ public final class SystemFlavorMap implements FlavorMap, FlavorTable {
private static final Object FLAVOR_MAP_KEY = new Object(); private static final Object FLAVOR_MAP_KEY = new Object();
/**
* Copied from java.util.Properties.
*/
private static final String keyValueSeparators = "=: \t\r\n\f";
private static final String strictKeyValueSeparators = "=:";
private static final String whiteSpaceChars = " \t\r\n\f";
/** /**
* The list of valid, decoded text flavor representation classes, in order * The list of valid, decoded text flavor representation classes, in order
* from best to worst. * from best to worst.
@ -198,16 +180,11 @@ public final class SystemFlavorMap implements FlavorMap, FlavorTable {
/** /**
* Returns the default FlavorMap for this thread's ClassLoader. * Returns the default FlavorMap for this thread's ClassLoader.
*
* @return the default FlavorMap for this thread's ClassLoader * @return the default FlavorMap for this thread's ClassLoader
*/ */
public static FlavorMap getDefaultFlavorMap() { public static FlavorMap getDefaultFlavorMap() {
AppContext context = AppContext.getAppContext(); return DataFlavorUtil.getDesktopService().getFlavorMap(SystemFlavorMap::new);
FlavorMap fm = (FlavorMap) context.get(FLAVOR_MAP_KEY);
if (fm == null) {
fm = new SystemFlavorMap();
context.put(FLAVOR_MAP_KEY, fm);
}
return fm;
} }
private SystemFlavorMap() { private SystemFlavorMap() {
@ -223,7 +200,7 @@ public final class SystemFlavorMap implements FlavorMap, FlavorTable {
} }
isMapInitialized = true; isMapInitialized = true;
InputStream is = SystemFlavorMap.class.getResourceAsStream("/sun/awt/datatransfer/flavormap.properties"); InputStream is = SystemFlavorMap.class.getResourceAsStream("/sun/datatransfer/resources/flavormap.properties");
if (is == null) { if (is == null) {
throw new InternalError("Default flavor mapping not found"); throw new InternalError("Default flavor mapping not found");
} }
@ -238,22 +215,25 @@ public final class SystemFlavorMap implements FlavorMap, FlavorTable {
line = line.substring(0, line.length() - 1) + reader.readLine().trim(); line = line.substring(0, line.length() - 1) + reader.readLine().trim();
} }
int delimiterPosition = line.indexOf('='); int delimiterPosition = line.indexOf('=');
String key = line.substring(0, delimiterPosition).replace("\\ ", " "); String key = line.substring(0, delimiterPosition).replaceAll("\\ ", " ");
String[] values = line.substring(delimiterPosition + 1, line.length()).split(","); String[] values = line.substring(delimiterPosition + 1, line.length()).split(",");
for (String value : values) { for (String value : values) {
try { try {
value = loadConvert(value);
MimeType mime = new MimeType(value); MimeType mime = new MimeType(value);
if ("text".equals(mime.getPrimaryType())) { if ("text".equals(mime.getPrimaryType())) {
String charset = mime.getParameter("charset"); String charset = mime.getParameter("charset");
if (DataTransferer.doesSubtypeSupportCharset(mime.getSubType(), charset)) if (DataFlavorUtil.doesSubtypeSupportCharset(mime.getSubType(), charset))
{ {
// We need to store the charset and eoln // We need to store the charset and eoln
// parameters, if any, so that the // parameters, if any, so that the
// DataTransferer will have this information // DataTransferer will have this information
// for conversion into the native format. // for conversion into the native format.
DataTransferer transferer = DataTransferer.getInstance(); DesktopDatatransferService desktopService =
if (transferer != null) { DataFlavorUtil.getDesktopService();
transferer.registerTextFlavorProperties(key, charset, if (desktopService.isDesktopPresent()) {
desktopService.registerTextFlavorProperties(
key, charset,
mime.getParameter("eoln"), mime.getParameter("eoln"),
mime.getParameter("terminators")); mime.getParameter("terminators"));
} }
@ -305,6 +285,63 @@ public final class SystemFlavorMap implements FlavorMap, FlavorTable {
} }
} }
// Copied from java.util.Properties
private static String loadConvert(String theString) {
char aChar;
int len = theString.length();
StringBuilder outBuffer = new StringBuilder(len);
for (int x = 0; x < len; ) {
aChar = theString.charAt(x++);
if (aChar == '\\') {
aChar = theString.charAt(x++);
if (aChar == 'u') {
// Read the xxxx
int value = 0;
for (int i = 0; i < 4; i++) {
aChar = theString.charAt(x++);
switch (aChar) {
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9': {
value = (value << 4) + aChar - '0';
break;
}
case 'a': case 'b': case 'c':
case 'd': case 'e': case 'f': {
value = (value << 4) + 10 + aChar - 'a';
break;
}
case 'A': case 'B': case 'C':
case 'D': case 'E': case 'F': {
value = (value << 4) + 10 + aChar - 'A';
break;
}
default: {
throw new IllegalArgumentException(
"Malformed \\uxxxx encoding.");
}
}
}
outBuffer.append((char)value);
} else {
if (aChar == 't') {
aChar = '\t';
} else if (aChar == 'r') {
aChar = '\r';
} else if (aChar == 'n') {
aChar = '\n';
} else if (aChar == 'f') {
aChar = '\f';
}
outBuffer.append(aChar);
}
} else {
outBuffer.append(aChar);
}
}
return outBuffer.toString();
}
/** /**
* Stores the listed object under the specified hash key in map. Unlike a * Stores the listed object under the specified hash key in map. Unlike a
* standard map, the listed object will not replace any object already at * standard map, the listed object will not replace any object already at
@ -332,10 +369,10 @@ public final class SystemFlavorMap implements FlavorMap, FlavorTable {
LinkedHashSet<DataFlavor> flavors = getNativeToFlavor().get(nat); LinkedHashSet<DataFlavor> flavors = getNativeToFlavor().get(nat);
if (nat != null && !disabledMappingGenerationKeys.contains(nat)) { if (nat != null && !disabledMappingGenerationKeys.contains(nat)) {
DataTransferer transferer = DataTransferer.getInstance(); DesktopDatatransferService desktopService = DataFlavorUtil.getDesktopService();
if (transferer != null) { if (desktopService.isDesktopPresent()) {
LinkedHashSet<DataFlavor> platformFlavors = LinkedHashSet<DataFlavor> platformFlavors =
transferer.getPlatformMappingsForNative(nat); desktopService.getPlatformMappingsForNative(nat);
if (!platformFlavors.isEmpty()) { if (!platformFlavors.isEmpty()) {
if (flavors != null) { if (flavors != null) {
// Prepending the platform-specific mappings ensures // Prepending the platform-specific mappings ensures
@ -395,10 +432,10 @@ public final class SystemFlavorMap implements FlavorMap, FlavorTable {
LinkedHashSet<String> natives = getFlavorToNative().get(flav); LinkedHashSet<String> natives = getFlavorToNative().get(flav);
if (flav != null && !disabledMappingGenerationKeys.contains(flav)) { if (flav != null && !disabledMappingGenerationKeys.contains(flav)) {
DataTransferer transferer = DataTransferer.getInstance(); DesktopDatatransferService desktopService = DataFlavorUtil.getDesktopService();
if (transferer != null) { if (desktopService.isDesktopPresent()) {
LinkedHashSet<String> platformNatives = LinkedHashSet<String> platformNatives =
transferer.getPlatformMappingsForFlavor(flav); desktopService.getPlatformMappingsForFlavor(flav);
if (!platformNatives.isEmpty()) { if (!platformNatives.isEmpty()) {
if (natives != null) { if (natives != null) {
// Prepend the platform-specific mappings to ensure // Prepend the platform-specific mappings to ensure
@ -474,7 +511,7 @@ public final class SystemFlavorMap implements FlavorMap, FlavorTable {
// In this case we shouldn't synthesize a native for this flavor, // In this case we shouldn't synthesize a native for this flavor,
// since its mappings were explicitly specified. // since its mappings were explicitly specified.
retval = flavorToNativeLookup(flav, false); retval = flavorToNativeLookup(flav, false);
} else if (DataTransferer.isFlavorCharsetTextType(flav)) { } else if (DataFlavorUtil.isFlavorCharsetTextType(flav)) {
retval = new LinkedHashSet<>(0); retval = new LinkedHashSet<>(0);
// For text/* flavors, flavor-to-native mappings specified in // For text/* flavors, flavor-to-native mappings specified in
@ -502,7 +539,7 @@ public final class SystemFlavorMap implements FlavorMap, FlavorTable {
// addUnencodedNativeForFlavor(), so they have lower priority. // addUnencodedNativeForFlavor(), so they have lower priority.
retval.addAll(flavorToNativeLookup(flav, false)); retval.addAll(flavorToNativeLookup(flav, false));
} }
} else if (DataTransferer.isFlavorNoncharsetTextType(flav)) { } else if (DataFlavorUtil.isFlavorNoncharsetTextType(flav)) {
retval = getTextTypeToNative().get(flav.mimeType.getBaseType()); retval = getTextTypeToNative().get(flav.mimeType.getBaseType());
if (retval == null || retval.isEmpty()) { if (retval == null || retval.isEmpty()) {
@ -602,7 +639,7 @@ public final class SystemFlavorMap implements FlavorMap, FlavorTable {
// on load from flavormap.properties. // on load from flavormap.properties.
} }
if (DataTransferer.doesSubtypeSupportCharset(subType, null)) { if (DataFlavorUtil.doesSubtypeSupportCharset(subType, null)) {
if (TEXT_PLAIN_BASE_TYPE.equals(baseType)) if (TEXT_PLAIN_BASE_TYPE.equals(baseType))
{ {
returnValue.add(DataFlavor.stringFlavor); returnValue.add(DataFlavor.stringFlavor);
@ -624,7 +661,7 @@ public final class SystemFlavorMap implements FlavorMap, FlavorTable {
} }
} }
for (String charset : DataTransferer.standardEncodings()) { for (String charset : DataFlavorUtil.standardEncodings()) {
for (String encodedTextClass : ENCODED_TEXT_CLASSES) { for (String encodedTextClass : ENCODED_TEXT_CLASSES) {
final String mimeType = final String mimeType =

View file

@ -1811,7 +1811,7 @@ public final class TextLayout implements Cloneable {
* should be logical or visual counterparts. They are not * should be logical or visual counterparts. They are not
* checked for validity. * checked for validity.
*/ */
private final TextHitInfo getStrongHit(TextHitInfo hit1, TextHitInfo hit2) { private TextHitInfo getStrongHit(TextHitInfo hit1, TextHitInfo hit2) {
// right now we're using the following rule for strong hits: // right now we're using the following rule for strong hits:
// A hit on a character with a lower level // A hit on a character with a lower level

View file

@ -544,7 +544,7 @@ public class PropertyChangeSupport implements Serializable {
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
public final PropertyChangeListener extract(PropertyChangeListener listener) { public PropertyChangeListener extract(PropertyChangeListener listener) {
while (listener instanceof PropertyChangeListenerProxy) { while (listener instanceof PropertyChangeListenerProxy) {
listener = ((PropertyChangeListenerProxy) listener).getListener(); listener = ((PropertyChangeListenerProxy) listener).getListener();
} }

View file

@ -533,7 +533,7 @@ public class VetoableChangeSupport implements Serializable {
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
public final VetoableChangeListener extract(VetoableChangeListener listener) { public VetoableChangeListener extract(VetoableChangeListener listener) {
while (listener instanceof VetoableChangeListenerProxy) { while (listener instanceof VetoableChangeListenerProxy) {
listener = ((VetoableChangeListenerProxy) listener).getListener(); listener = ((VetoableChangeListenerProxy) listener).getListener();
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2002, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -27,38 +27,35 @@ package javax.sound.midi;
import java.util.EventListener; import java.util.EventListener;
/** /**
* The <code>ControllerEventListener</code> interface should be implemented * The {@code ControllerEventListener} interface should be implemented by
* by classes whose instances need to be notified when a <code>Sequencer</code> * classes whose instances need to be notified when a {@link Sequencer} has
* has processed a requested type of MIDI control-change event. * processed a requested type of MIDI control-change event. To register a
* To register a <code>ControllerEventListener</code> object to receive such * {@code ControllerEventListener} object to receive such notifications, invoke
* notifications, invoke the * the
* {@link Sequencer#addControllerEventListener(ControllerEventListener, int[]) * {@link Sequencer#addControllerEventListener(ControllerEventListener, int[])
* addControllerEventListener} method of <code>Sequencer</code>, * addControllerEventListener} method of {@code Sequencer}, specifying the types
* specifying the types of MIDI controllers about which you are interested in * of MIDI controllers about which you are interested in getting control-change
* getting control-change notifications. * notifications.
*
* @see MidiChannel#controlChange(int, int)
* *
* @author Kara Kytle * @author Kara Kytle
* @see MidiChannel#controlChange(int, int)
*/ */
public interface ControllerEventListener extends EventListener { public interface ControllerEventListener extends EventListener {
/** /**
* Invoked when a <code>Sequencer</code> has encountered and processed * Invoked when a {@link Sequencer} has encountered and processed a
* a control-change event of interest to this listener. The event passed * control-change event of interest to this listener. The event passed in is
* in is a <code>ShortMessage</code> whose first data byte indicates * a {@code ShortMessage} whose first data byte indicates the controller
* the controller number and whose second data byte is the value to which * number and whose second data byte is the value to which the controller
* the controller was set. * was set.
*
* @param event the control-change event that the sequencer encountered in
* the sequence it is processing
* *
* @param event the control-change event that the sequencer encountered in
* the sequence it is processing
* @see Sequencer#addControllerEventListener(ControllerEventListener, int[]) * @see Sequencer#addControllerEventListener(ControllerEventListener, int[])
* @see MidiChannel#controlChange(int, int) * @see MidiChannel#controlChange(int, int)
* @see ShortMessage#getData1 * @see ShortMessage#getData1
* @see ShortMessage#getData2 * @see ShortMessage#getData2
*/ */
public void controlChange(ShortMessage event); void controlChange(ShortMessage event);
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2004, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -25,49 +25,41 @@
package javax.sound.midi; package javax.sound.midi;
import java.net.URL;
/** /**
* An instrument is a sound-synthesis algorithm with certain parameter * An instrument is a sound-synthesis algorithm with certain parameter settings,
* settings, usually designed to emulate a specific real-world * usually designed to emulate a specific real-world musical instrument or to
* musical instrument or to achieve a specific sort of sound effect. * achieve a specific sort of sound effect. Instruments are typically stored in
* Instruments are typically stored in collections called soundbanks. * collections called soundbanks. Before the instrument can be used to play
* Before the instrument can be used to play notes, it must first be loaded * notes, it must first be loaded onto a synthesizer, and then it must be
* onto a synthesizer, and then it must be selected for use on * selected for use on one or more channels, via a program-change command. MIDI
* one or more channels, via a program-change command. MIDI notes * notes that are subsequently received on those channels will be played using
* that are subsequently received on those channels will be played using
* the sound of the selected instrument. * the sound of the selected instrument.
* *
* @author Kara Kytle
* @see Soundbank * @see Soundbank
* @see Soundbank#getInstruments * @see Soundbank#getInstruments
* @see Patch * @see Patch
* @see Synthesizer#loadInstrument(Instrument) * @see Synthesizer#loadInstrument(Instrument)
* @see MidiChannel#programChange(int, int) * @see MidiChannel#programChange(int, int)
* @author Kara Kytle
*/ */
public abstract class Instrument extends SoundbankResource { public abstract class Instrument extends SoundbankResource {
/** /**
* Instrument patch * Instrument patch.
*/ */
private final Patch patch; private final Patch patch;
/** /**
* Constructs a new MIDI instrument from the specified <code>Patch</code>. * Constructs a new MIDI instrument from the specified {@code Patch}. When a
* When a subsequent request is made to load the * subsequent request is made to load the instrument, the sound bank will
* instrument, the sound bank will search its contents for this instrument's <code>Patch</code>, * search its contents for this instrument's {@code Patch}, and the
* and the instrument will be loaded into the synthesizer at the * instrument will be loaded into the synthesizer at the bank and program
* bank and program location indicated by the <code>Patch</code> object. * location indicated by the {@code Patch} object.
* @param soundbank sound bank containing the instrument
* @param patch the patch of this instrument
* @param name the name of this instrument
* @param dataClass the class used to represent the sample's data.
* *
* @param soundbank sound bank containing the instrument
* @param patch the patch of this instrument
* @param name the name of this instrument
* @param dataClass the class used to represent the sample's data
* @see Synthesizer#loadInstrument(Instrument) * @see Synthesizer#loadInstrument(Instrument)
*/ */
protected Instrument(Soundbank soundbank, Patch patch, String name, Class<?> dataClass) { protected Instrument(Soundbank soundbank, Patch patch, String name, Class<?> dataClass) {
@ -76,10 +68,10 @@ public abstract class Instrument extends SoundbankResource {
this.patch = patch; this.patch = patch;
} }
/** /**
* Obtains the <code>Patch</code> object that indicates the bank and program * Obtains the {@code Patch} object that indicates the bank and program
* numbers where this instrument is to be stored in the synthesizer. * numbers where this instrument is to be stored in the synthesizer.
*
* @return this instrument's patch * @return this instrument's patch
*/ */
public Patch getPatch() { public Patch getPatch() {

View file

@ -25,25 +25,25 @@
package javax.sound.midi; package javax.sound.midi;
/** /**
* An <code>InvalidMidiDataException</code> indicates that inappropriate MIDI * An {@code InvalidMidiDataException} indicates that inappropriate MIDI data
* data was encountered. This often means that the data is invalid in and of * was encountered. This often means that the data is invalid in and of itself,
* itself, from the perspective of the MIDI specification. An example would * from the perspective of the MIDI specification. An example would be an
* be an undefined status byte. However, the exception might simply * undefined status byte. However, the exception might simply mean that the data
* mean that the data was invalid in the context it was used, or that * was invalid in the context it was used, or that the object to which the data
* the object to which the data was given was unable to parse or use it. * was given was unable to parse or use it. For example, a file reader might not
* For example, a file reader might not be able to parse a Type 2 MIDI file, even * be able to parse a Type 2 MIDI file, even though that format is defined in
* though that format is defined in the MIDI specification. * the MIDI specification.
* *
* @author Kara Kytle * @author Kara Kytle
*/ */
public class InvalidMidiDataException extends Exception { public class InvalidMidiDataException extends Exception {
private static final long serialVersionUID = 2780771756789932067L; private static final long serialVersionUID = 2780771756789932067L;
/** /**
* Constructs an <code>InvalidMidiDataException</code> with * Constructs an {@code InvalidMidiDataException} with {@code null} for its
* <code>null</code> for its error detail message. * error detail message.
*/ */
public InvalidMidiDataException() { public InvalidMidiDataException() {
@ -51,10 +51,10 @@ public class InvalidMidiDataException extends Exception {
} }
/** /**
* Constructs an <code>InvalidMidiDataException</code> with the * Constructs an {@code InvalidMidiDataException} with the specified detail
* specified detail message. * message.
* *
* @param message the string to display as an error detail message * @param message the string to display as an error detail message
*/ */
public InvalidMidiDataException(String message) { public InvalidMidiDataException(String message) {

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2002, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -27,24 +27,23 @@ package javax.sound.midi;
import java.util.EventListener; import java.util.EventListener;
/** /**
* The <code>MetaEventListener</code> interface should be implemented * The {@code MetaEventListener} interface should be implemented by classes
* by classes whose instances need to be notified when a <code>{@link Sequencer}</code> * whose instances need to be notified when a {@link Sequencer} has processed a
* has processed a <code>{@link MetaMessage}</code>. * {@link MetaMessage}. To register a {@code MetaEventListener} object to
* To register a <code>MetaEventListener</code> object to receive such * receive such notifications, pass it as the argument to the
* notifications, pass it as the argument to the * {@link Sequencer#addMetaEventListener(MetaEventListener)
* <code>{@link Sequencer#addMetaEventListener(MetaEventListener) addMetaEventListener}</code> * addMetaEventListener} method of {@code Sequencer}.
* method of <code>Sequencer</code>.
* *
* @author Kara Kytle * @author Kara Kytle
*/ */
public interface MetaEventListener extends EventListener { public interface MetaEventListener extends EventListener {
/** /**
* Invoked when a <code>{@link Sequencer}</code> has encountered and processed * Invoked when a {@link Sequencer} has encountered and processed a
* a <code>MetaMessage</code> in the <code>{@link Sequence}</code> it is processing. * {@code MetaMessage} in the {@code Sequence} it is processing.
* @param meta the meta-message that the sequencer encountered *
* @param meta the meta-message that the sequencer encountered
*/ */
public void meta(MetaMessage meta); void meta(MetaMessage meta);
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -25,65 +25,54 @@
package javax.sound.midi; package javax.sound.midi;
/** /**
* A <code>MetaMessage</code> is a <code>{@link MidiMessage}</code> that is not meaningful to synthesizers, but * A {@code MetaMessage} is a {@link MidiMessage} that is not meaningful to
* that can be stored in a MIDI file and interpreted by a sequencer program. * synthesizers, but that can be stored in a MIDI file and interpreted by a
* (See the discussion in the <code>MidiMessage</code> * sequencer program. (See the discussion in the {@code MidiMessage} class
* class description.) The Standard MIDI Files specification defines * description.) The Standard MIDI Files specification defines various types of
* various types of meta-events, such as sequence number, lyric, cue point, * meta-events, such as sequence number, lyric, cue point, and set tempo. There
* and set tempo. There are also meta-events * are also meta-events for such information as lyrics, copyrights, tempo
* for such information as lyrics, copyrights, tempo indications, time and key * indications, time and key signatures, markers, etc. For more information, see
* signatures, markers, etc. For more information, see the Standard MIDI Files 1.0 * the Standard MIDI Files 1.0 specification, which is part of the Complete MIDI
* specification, which is part of the Complete MIDI 1.0 Detailed Specification * 1.0 Detailed Specification published by the MIDI Manufacturer's Association
* published by the MIDI Manufacturer's Association
* (<a href = http://www.midi.org>http://www.midi.org</a>). * (<a href = http://www.midi.org>http://www.midi.org</a>).
*
* <p> * <p>
* When data is being transported using MIDI wire protocol, * When data is being transported using MIDI wire protocol, a
* a <code>{@link ShortMessage}</code> with the status value <code>0xFF</code> represents * {@link ShortMessage} with the status value {@code 0xFF} represents a system
* a system reset message. In MIDI files, this same status value denotes a <code>MetaMessage</code>. * reset message. In MIDI files, this same status value denotes a
* The types of meta-message are distinguished from each other by the first byte * {@code MetaMessage}. The types of meta-message are distinguished from each
* that follows the status byte <code>0xFF</code>. The subsequent bytes are data * other by the first byte that follows the status byte {@code 0xFF}. The
* bytes. As with system exclusive messages, there are an arbitrary number of * subsequent bytes are data bytes. As with system exclusive messages, there are
* data bytes, depending on the type of <code>MetaMessage</code>. * an arbitrary number of data bytes, depending on the type of
* * {@code MetaMessage}.
* @see MetaEventListener
* *
* @author David Rivas * @author David Rivas
* @author Kara Kytle * @author Kara Kytle
* @see MetaEventListener
*/ */
public class MetaMessage extends MidiMessage { public class MetaMessage extends MidiMessage {
// Status byte defines
/** /**
* Status byte for <code>MetaMessage</code> (0xFF, or 255), which is used * Status byte for {@code MetaMessage} (0xFF, or 255), which is used in MIDI
* in MIDI files. It has the same value as SYSTEM_RESET, which * files. It has the same value as SYSTEM_RESET, which is used in the
* is used in the real-time "MIDI wire" protocol. * real-time "MIDI wire" protocol.
*
* @see MidiMessage#getStatus * @see MidiMessage#getStatus
*/ */
public static final int META = 0xFF; // 255 public static final int META = 0xFF; // 255
// Instance variables
/** /**
* The length of the actual message in the data array. * The length of the actual message in the data array. This is used to
* This is used to determine how many bytes of the data array * determine how many bytes of the data array is the message, and how many
* is the message, and how many are the status byte, the * are the status byte, the type byte, and the variable-length-int
* type byte, and the variable-length-int describing the * describing the length of the message.
* length of the message.
*/ */
private int dataLength = 0; private int dataLength = 0;
/** /**
* Constructs a new <code>MetaMessage</code>. The contents of * Constructs a new {@code MetaMessage}. The contents of the message are not
* the message are not set here; use * set here; use {@link #setMessage(int, byte[], int) setMessage} to set
* {@link #setMessage(int, byte[], int) setMessage} * them subsequently.
* to set them subsequently.
*/ */
public MetaMessage() { public MetaMessage() {
// Default meta message data: just the META status byte value // Default meta message data: just the META status byte value
@ -91,17 +80,17 @@ public class MetaMessage extends MidiMessage {
} }
/** /**
* Constructs a new {@code MetaMessage} and sets the message parameters. * Constructs a new {@code MetaMessage} and sets the message parameters. The
* The contents of the message can be changed by using * contents of the message can be changed by using the {@code setMessage}
* the {@code setMessage} method. * method.
* *
* @param type meta-message type (must be less than 128) * @param type meta-message type (must be less than 128)
* @param data the data bytes in the MIDI message * @param data the data bytes in the MIDI message
* @param length an amount of bytes in the {@code data} byte array; * @param length an amount of bytes in the {@code data} byte array; it
* it should be non-negative and less than or equal to * should be non-negative and less than or equal to
* {@code data.length} * {@code data.length}
* @throws InvalidMidiDataException if the parameter values do not specify * @throws InvalidMidiDataException if the parameter values do not specify a
* a valid MIDI meta message * valid MIDI meta message
* @see #setMessage(int, byte[], int) * @see #setMessage(int, byte[], int)
* @see #getType() * @see #getType()
* @see #getData() * @see #getData()
@ -113,12 +102,11 @@ public class MetaMessage extends MidiMessage {
setMessage(type, data, length); // can throw InvalidMidiDataException setMessage(type, data, length); // can throw InvalidMidiDataException
} }
/** /**
* Constructs a new <code>MetaMessage</code>. * Constructs a new {@code MetaMessage}.
* @param data an array of bytes containing the complete message. *
* The message data may be changed using the <code>setMessage</code> * @param data an array of bytes containing the complete message. The
* method. * message data may be changed using the {@code setMessage} method.
* @see #setMessage * @see #setMessage
*/ */
protected MetaMessage(byte[] data) { protected MetaMessage(byte[] data) {
@ -133,24 +121,24 @@ public class MetaMessage extends MidiMessage {
} }
} }
/** /**
* Sets the message parameters for a <code>MetaMessage</code>. * Sets the message parameters for a {@code MetaMessage}. Since only one
* Since only one status byte value, <code>0xFF</code>, is allowed for meta-messages, * status byte value, {@code 0xFF}, is allowed for meta-messages, it does
* it does not need to be specified here. Calls to <code>{@link MidiMessage#getStatus getStatus}</code> return * not need to be specified here. Calls to
* <code>0xFF</code> for all meta-messages. * {@link MidiMessage#getStatus getStatus} return {@code 0xFF} for all
* meta-messages.
* <p> * <p>
* The <code>type</code> argument should be a valid value for the byte that * The {@code type} argument should be a valid value for the byte that
* follows the status byte in the <code>MetaMessage</code>. The <code>data</code> argument * follows the status byte in the {@code MetaMessage}. The {@code data}
* should contain all the subsequent bytes of the <code>MetaMessage</code>. In other words, * argument should contain all the subsequent bytes of the
* the byte that specifies the type of <code>MetaMessage</code> is not considered a data byte. * {@code MetaMessage}. In other words, the byte that specifies the type of
* {@code MetaMessage} is not considered a data byte.
* *
* @param type meta-message type (must be less than 128) * @param type meta-message type (must be less than 128)
* @param data the data bytes in the MIDI message * @param data the data bytes in the MIDI message
* @param length the number of bytes in the <code>data</code> * @param length the number of bytes in the {@code data} byte array
* byte array * @throws InvalidMidiDataException if the parameter values do not specify a
* @throws InvalidMidiDataException if the * valid MIDI meta message
* parameter values do not specify a valid MIDI meta message
*/ */
public void setMessage(int type, byte[] data, int length) throws InvalidMidiDataException { public void setMessage(int type, byte[] data, int length) throws InvalidMidiDataException {
@ -172,10 +160,10 @@ public class MetaMessage extends MidiMessage {
} }
} }
/** /**
* Obtains the type of the <code>MetaMessage</code>. * Obtains the type of the {@code MetaMessage}.
* @return an integer representing the <code>MetaMessage</code> type *
* @return an integer representing the {@code MetaMessage} type
*/ */
public int getType() { public int getType() {
if (length>=2) { if (length>=2) {
@ -184,16 +172,15 @@ public class MetaMessage extends MidiMessage {
return 0; return 0;
} }
/** /**
* Obtains a copy of the data for the meta message. The returned * Obtains a copy of the data for the meta message. The returned array of
* array of bytes does not include the status byte or the message * bytes does not include the status byte or the message length data. The
* length data. The length of the data for the meta message is * length of the data for the meta message is the length of the array. Note
* the length of the array. Note that the length of the entire * that the length of the entire message includes the status byte and the
* message includes the status byte and the meta message type * meta message type byte, and therefore may be longer than the returned
* byte, and therefore may be longer than the returned array. * array.
* @return array containing the meta message data. *
* @return array containing the meta message data
* @see MidiMessage#getLength * @see MidiMessage#getLength
*/ */
public byte[] getData() { public byte[] getData() {
@ -202,10 +189,10 @@ public class MetaMessage extends MidiMessage {
return returnedArray; return returnedArray;
} }
/** /**
* Creates a new object of the same class and with the same contents * Creates a new object of the same class and with the same contents as this
* as this object. * object.
*
* @return a clone of this instance * @return a clone of this instance
*/ */
public Object clone() { public Object clone() {
@ -240,5 +227,4 @@ public class MetaMessage extends MidiMessage {
} }
data[off] = (byte) (value & mask); data[off] = (byte) (value & mask);
} }
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1998, 2004, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -25,513 +25,450 @@
package javax.sound.midi; package javax.sound.midi;
/** /**
* A <code>MidiChannel</code> object represents a single MIDI channel. * A {@code MidiChannel} object represents a single MIDI channel. Generally,
* Generally, each <code>MidiChannel</code> method processes a like-named MIDI * each {@code MidiChannel} method processes a like-named MIDI "channel voice"
* "channel voice" or "channel mode" message as defined by the MIDI specification. However, * or "channel mode" message as defined by the MIDI specification. However,
* <code>MidiChannel</code> adds some "get" methods that retrieve the value * {@code MidiChannel} adds some "get" methods that retrieve the value most
* most recently set by one of the standard MIDI channel messages. Similarly, * recently set by one of the standard MIDI channel messages. Similarly, methods
* methods for per-channel solo and mute have been added. * for per-channel solo and mute have been added.
* <p> * <p>
* A <code>{@link Synthesizer}</code> object has a collection * A {@link Synthesizer} object has a collection of {@code MidiChannels},
* of <code>MidiChannels</code>, usually one for each of the 16 channels * usually one for each of the 16 channels prescribed by the MIDI 1.0
* prescribed by the MIDI 1.0 specification. The <code>Synthesizer</code> * specification. The {@code Synthesizer} generates sound when its
* generates sound when its <code>MidiChannels</code> receive * {@code MidiChannels} receive {@code noteOn} messages.
* <code>noteOn</code> messages.
* <p> * <p>
* See the MIDI 1.0 Specification for more information about the prescribed * See the MIDI 1.0 Specification for more information about the prescribed
* behavior of the MIDI channel messages, which are not exhaustively * behavior of the MIDI channel messages, which are not exhaustively documented
* documented here. The specification is titled <code>MIDI Reference: * here. The specification is titled
* The Complete MIDI 1.0 Detailed Specification</code>, and is published by * {@code MIDI Reference: The Complete MIDI 1.0 Detailed Specification}, and is
* the MIDI Manufacturer's Association (<a href = http://www.midi.org> * published by the MIDI Manufacturer's Association
* http://www.midi.org</a>). * (<a href = http://www.midi.org>http://www.midi.org</a>).
* <p> * <p>
* MIDI was originally a protocol for reporting the gestures of a keyboard * MIDI was originally a protocol for reporting the gestures of a keyboard
* musician. This genesis is visible in the <code>MidiChannel</code> API, which * musician. This genesis is visible in the {@code MidiChannel} API, which
* preserves such MIDI concepts as key number, key velocity, and key pressure. * preserves such MIDI concepts as key number, key velocity, and key pressure.
* It should be understood that the MIDI data does not necessarily originate * It should be understood that the MIDI data does not necessarily originate
* with a keyboard player (the source could be a different kind of musician, or * with a keyboard player (the source could be a different kind of musician, or
* software). Some devices might generate constant values for velocity * software). Some devices might generate constant values for velocity and
* and pressure, regardless of how the note was performed. * pressure, regardless of how the note was performed. Also, the MIDI
* Also, the MIDI specification often leaves it up to the * specification often leaves it up to the synthesizer to use the data in the
* synthesizer to use the data in the way the implementor sees fit. For * way the implementor sees fit. For example, velocity data need not always be
* example, velocity data need not always be mapped to volume and/or brightness. * mapped to volume and/or brightness.
*
* @see Synthesizer#getChannels
* *
* @author David Rivas * @author David Rivas
* @author Kara Kytle * @author Kara Kytle
* @see Synthesizer#getChannels
*/ */
public interface MidiChannel { public interface MidiChannel {
/** /**
* Starts the specified note sounding. The key-down velocity * Starts the specified note sounding. The key-down velocity usually
* usually controls the note's volume and/or brightness. * controls the note's volume and/or brightness. If {@code velocity} is
* If <code>velocity</code> is zero, this method instead acts like * zero, this method instead acts like {@link #noteOff(int)}, terminating
* {@link #noteOff(int)}, terminating the note. * the note.
*
* @param noteNumber the MIDI note number, from 0 to 127 (60 = Middle C)
* @param velocity the speed with which the key was depressed
* *
* @param noteNumber the MIDI note number, from 0 to 127 (60 = Middle C)
* @param velocity the speed with which the key was depressed
* @see #noteOff(int, int) * @see #noteOff(int, int)
*/ */
public void noteOn(int noteNumber, int velocity); void noteOn(int noteNumber, int velocity);
/** /**
* Turns the specified note off. The key-up velocity, if not ignored, can * Turns the specified note off. The key-up velocity, if not ignored, can be
* be used to affect how quickly the note decays. * used to affect how quickly the note decays. In any case, the note might
* In any case, the note might not die away instantaneously; its decay * not die away instantaneously; its decay rate is determined by the
* rate is determined by the internals of the <code>Instrument</code>. * internals of the {@code Instrument}. If the Hold Pedal (a controller; see
* If the Hold Pedal (a controller; see * {@link #controlChange(int, int) controlChange}) is down, the effect of
* {@link #controlChange(int, int) controlChange}) * this method is deferred until the pedal is released.
* is down, the effect of this method is deferred until the pedal is
* released.
*
*
* @param noteNumber the MIDI note number, from 0 to 127 (60 = Middle C)
* @param velocity the speed with which the key was released
* *
* @param noteNumber the MIDI note number, from 0 to 127 (60 = Middle C)
* @param velocity the speed with which the key was released
* @see #noteOff(int) * @see #noteOff(int)
* @see #noteOn * @see #noteOn
* @see #allNotesOff * @see #allNotesOff
* @see #allSoundOff * @see #allSoundOff
*/ */
public void noteOff(int noteNumber, int velocity); void noteOff(int noteNumber, int velocity);
/** /**
* Turns the specified note off. * Turns the specified note off.
* *
* @param noteNumber the MIDI note number, from 0 to 127 (60 = Middle C) * @param noteNumber the MIDI note number, from 0 to 127 (60 = Middle C)
*
* @see #noteOff(int, int) * @see #noteOff(int, int)
*/ */
public void noteOff(int noteNumber); void noteOff(int noteNumber);
/** /**
* Reacts to a change in the specified note's key pressure. * Reacts to a change in the specified note's key pressure. Polyphonic key
* Polyphonic key pressure * pressure allows a keyboard player to press multiple keys simultaneously,
* allows a keyboard player to press multiple keys simultaneously, each * each with a different amount of pressure. The pressure, if not ignored,
* with a different amount of pressure. The pressure, if not ignored, * is typically used to vary such features as the volume, brightness, or
* is typically used to vary such features as the volume, brightness, * vibrato of the note.
* or vibrato of the note. * <p>
* * It is possible that the underlying synthesizer does not support this MIDI
* It is possible that the underlying synthesizer * message. In order to verify that {@code setPolyPressure} was successful,
* does not support this MIDI message. In order * use {@code getPolyPressure}.
* to verify that <code>setPolyPressure</code>
* was successful, use <code>getPolyPressure</code>.
*
* @param noteNumber the MIDI note number, from 0 to 127 (60 = Middle C)
* @param pressure value for the specified key, from 0 to 127 (127 =
* maximum pressure)
* *
* @param noteNumber the MIDI note number, from 0 to 127 (60 = Middle C)
* @param pressure value for the specified key, from 0 to 127
* (127 = maximum pressure)
* @see #getPolyPressure(int) * @see #getPolyPressure(int)
*/ */
public void setPolyPressure(int noteNumber, int pressure); void setPolyPressure(int noteNumber, int pressure);
/** /**
* Obtains the pressure with which the specified key is being depressed. * Obtains the pressure with which the specified key is being depressed.
* <p>
* If the device does not support setting poly pressure, this method always
* returns 0. Calling {@code setPolyPressure} will have no effect then.
* *
* @param noteNumber the MIDI note number, from 0 to 127 (60 = Middle C) * @param noteNumber the MIDI note number, from 0 to 127 (60 = Middle C)
*
* If the device does not support setting poly pressure,
* this method always returns 0. Calling
* <code>setPolyPressure</code> will have no effect then.
*
* @return the amount of pressure for that note, from 0 to 127 * @return the amount of pressure for that note, from 0 to 127
* (127 = maximum pressure) * (127 = maximum pressure)
*
* @see #setPolyPressure(int, int) * @see #setPolyPressure(int, int)
*/ */
public int getPolyPressure(int noteNumber); int getPolyPressure(int noteNumber);
/** /**
* Reacts to a change in the keyboard pressure. Channel * Reacts to a change in the keyboard pressure. Channel pressure indicates
* pressure indicates how hard the keyboard player is depressing * how hard the keyboard player is depressing the entire keyboard. This can
* the entire keyboard. This can be the maximum or * be the maximum or average of the per-key pressure-sensor values, as set
* average of the per-key pressure-sensor values, as set by * by {@code setPolyPressure}. More commonly, it is a measurement of a
* <code>setPolyPressure</code>. More commonly, it is a measurement of * single sensor on a device that doesn't implement polyphonic key pressure.
* a single sensor on a device that doesn't implement polyphonic key * Pressure can be used to control various aspects of the sound, as
* pressure. Pressure can be used to control various aspects of the sound, * described under {@link #setPolyPressure(int, int) setPolyPressure}.
* as described under {@link #setPolyPressure(int, int) setPolyPressure}. * <p>
* It is possible that the underlying synthesizer does not support this MIDI
* message. In order to verify that {@code setChannelPressure} was
* successful, use {@code getChannelPressure}.
* *
* It is possible that the underlying synthesizer * @param pressure the pressure with which the keyboard is being depressed,
* does not support this MIDI message. In order * from 0 to 127 (127 = maximum pressure)
* to verify that <code>setChannelPressure</code>
* was successful, use <code>getChannelPressure</code>.
*
* @param pressure the pressure with which the keyboard is being depressed,
* from 0 to 127 (127 = maximum pressure)
* @see #setPolyPressure(int, int) * @see #setPolyPressure(int, int)
* @see #getChannelPressure * @see #getChannelPressure
*/ */
public void setChannelPressure(int pressure); void setChannelPressure(int pressure);
/** /**
* Obtains the channel's keyboard pressure. * Obtains the channel's keyboard pressure.
* If the device does not support setting channel pressure, * <p>
* this method always returns 0. Calling * If the device does not support setting channel pressure, this method
* <code>setChannelPressure</code> will have no effect then. * always returns 0. Calling {@code setChannelPressure} will have no effect
* * then.
* @return the amount of pressure for that note,
* from 0 to 127 (127 = maximum pressure)
* *
* @return the amount of pressure for that note, from 0 to 127
* (127 = maximum pressure)
* @see #setChannelPressure(int) * @see #setChannelPressure(int)
*/ */
public int getChannelPressure(); int getChannelPressure();
/** /**
* Reacts to a change in the specified controller's value. A controller * Reacts to a change in the specified controller's value. A controller is
* is some control other than a keyboard key, such as a * some control other than a keyboard key, such as a switch, slider, pedal,
* switch, slider, pedal, wheel, or breath-pressure sensor. * wheel, or breath-pressure sensor. The MIDI 1.0 Specification provides
* The MIDI 1.0 Specification provides standard numbers for typical * standard numbers for typical controllers on MIDI devices, and describes
* controllers on MIDI devices, and describes the intended effect * the intended effect for some of the controllers. The way in which an
* for some of the controllers. * {@code Instrument} reacts to a controller change may be specific to the
* The way in which an * {@code Instrument}.
* <code>Instrument</code> reacts to a controller change may be
* specific to the <code>Instrument</code>.
* <p> * <p>
* The MIDI 1.0 Specification defines both 7-bit controllers * The MIDI 1.0 Specification defines both 7-bit controllers and 14-bit
* and 14-bit controllers. Continuous controllers, such * controllers. Continuous controllers, such as wheels and sliders,
* as wheels and sliders, typically have 14 bits (two MIDI bytes), * typically have 14 bits (two MIDI bytes), while discrete controllers, such
* while discrete controllers, such as switches, typically have 7 bits * as switches, typically have 7 bits (one MIDI byte). Refer to the
* (one MIDI byte). Refer to the specification to see the * specification to see the expected resolution for each type of control.
* expected resolution for each type of control.
* <p> * <p>
* Controllers 64 through 95 (0x40 - 0x5F) allow 7-bit precision. * Controllers 64 through 95 (0x40 - 0x5F) allow 7-bit precision. The value
* The value of a 7-bit controller is set completely by the * of a 7-bit controller is set completely by the {@code value} argument. An
* <code>value</code> argument. An additional set of controllers * additional set of controllers provide 14-bit precision by using two
* provide 14-bit precision by using two controller numbers, one * controller numbers, one for the most significant 7 bits and another for
* for the most significant 7 bits and another for the least significant * the least significant 7 bits. Controller numbers 0 through 31
* 7 bits. Controller numbers 0 through 31 (0x00 - 0x1F) control the * (0x00 - 0x1F) control the most significant 7 bits of 14-bit controllers;
* most significant 7 bits of 14-bit controllers; controller numbers * controller numbers 32 through 63 (0x20 - 0x3F) control the least
* 32 through 63 (0x20 - 0x3F) control the least significant 7 bits of * significant 7 bits of these controllers. For example, controller number 7
* these controllers. For example, controller number 7 (0x07) controls * (0x07) controls the upper 7 bits of the channel volume controller, and
* the upper 7 bits of the channel volume controller, and controller * controller number 39 (0x27) controls the lower 7 bits. The value of a
* number 39 (0x27) controls the lower 7 bits. * 14-bit controller is determined by the interaction of the two halves.
* The value of a 14-bit controller is determined * When the most significant 7 bits of a controller are set (using
* by the interaction of the two halves. When the most significant 7 bits * controller numbers 0 through 31), the lower 7 bits are automatically set
* of a controller are set (using controller numbers 0 through 31), the * to 0. The corresponding controller number for the lower 7 bits may then
* lower 7 bits are automatically set to 0. The corresponding controller * be used to further modulate the controller value.
* number for the lower 7 bits may then be used to further modulate the * <p>
* controller value. * It is possible that the underlying synthesizer does not support a
* * specific controller message. In order to verify that a call to
* It is possible that the underlying synthesizer * {@code controlChange} was successful, use {@code getController}.
* does not support a specific controller message. In order
* to verify that a call to <code>controlChange</code>
* was successful, use <code>getController</code>.
*
* @param controller the controller number (0 to 127; see the MIDI
* 1.0 Specification for the interpretation)
* @param value the value to which the specified controller is changed (0 to 127)
* *
* @param controller the controller number (0 to 127; see the MIDI 1.0
* Specification for the interpretation)
* @param value the value to which the specified controller is changed
* (0 to 127)
* @see #getController(int) * @see #getController(int)
*/ */
public void controlChange(int controller, int value); void controlChange(int controller, int value);
/** /**
* Obtains the current value of the specified controller. The return * Obtains the current value of the specified controller. The return value
* value is represented with 7 bits. For 14-bit controllers, the MSB and * is represented with 7 bits. For 14-bit controllers, the MSB and LSB
* LSB controller value needs to be obtained separately. For example, * controller value needs to be obtained separately. For example, the 14-bit
* the 14-bit value of the volume controller can be calculated by * value of the volume controller can be calculated by multiplying the value
* multiplying the value of controller 7 (0x07, channel volume MSB) * of controller 7 (0x07, channel volume MSB) with 128 and adding the value
* with 128 and adding the * of controller 39 (0x27, channel volume LSB).
* value of controller 39 (0x27, channel volume LSB). * <p>
* * If the device does not support setting a specific controller, this method
* If the device does not support setting a specific controller, * returns 0 for that controller. Calling {@code controlChange} will have no
* this method returns 0 for that controller. * effect then.
* Calling <code>controlChange</code> will have no effect then.
*
* @param controller the number of the controller whose value is desired.
* The allowed range is 0-127; see the MIDI
* 1.0 Specification for the interpretation.
* *
* @param controller the number of the controller whose value is desired.
* The allowed range is 0-127; see the MIDI 1.0 Specification for
* the interpretation.
* @return the current value of the specified controller (0 to 127) * @return the current value of the specified controller (0 to 127)
*
* @see #controlChange(int, int) * @see #controlChange(int, int)
*/ */
public int getController(int controller); int getController(int controller);
/** /**
* Changes a program (patch). This selects a specific * Changes a program (patch). This selects a specific instrument from the
* instrument from the currently selected bank of instruments. * currently selected bank of instruments.
* <p> * <p>
* The MIDI specification does not * The MIDI specification does not dictate whether notes that are already
* dictate whether notes that are already sounding should switch * sounding should switch to the new instrument (timbre) or continue with
* to the new instrument (timbre) or continue with their original timbre * their original timbre until terminated by a note-off.
* until terminated by a note-off.
* <p> * <p>
* The program number is zero-based (expressed from 0 to 127). * The program number is zero-based (expressed from 0 to 127). Note that
* Note that MIDI hardware displays and literature about MIDI * MIDI hardware displays and literature about MIDI typically use the range
* typically use the range 1 to 128 instead. * 1 to 128 instead.
* * <p>
* It is possible that the underlying synthesizer * It is possible that the underlying synthesizer does not support a
* does not support a specific program. In order * specific program. In order to verify that a call to {@code programChange}
* to verify that a call to <code>programChange</code> * was successful, use {@code getProgram}.
* was successful, use <code>getProgram</code>.
*
* @param program the program number to switch to (0 to 127)
* *
* @param program the program number to switch to (0 to 127)
* @see #programChange(int, int) * @see #programChange(int, int)
* @see #getProgram() * @see #getProgram()
*/ */
public void programChange(int program); void programChange(int program);
/** /**
* Changes the program using bank and program (patch) numbers. * Changes the program using bank and program (patch) numbers.
* * <p>
* It is possible that the underlying synthesizer * It is possible that the underlying synthesizer does not support a
* does not support a specific bank, or program. In order * specific bank, or program. In order to verify that a call to
* to verify that a call to <code>programChange</code> * {@code programChange} was successful, use {@code getProgram} and
* was successful, use <code>getProgram</code> and * {@code getController}. Since banks are changed by way of control changes,
* <code>getController</code>. * you can verify the current bank with the following statement:
* Since banks are changed by way of control changes,
* you can verify the current bank with the following
* statement:
* <pre> * <pre>
* int bank = (getController(0) * 128) * int bank = (getController(0) * 128) + getController(32);
* + getController(32);
* </pre> * </pre>
* *
* @param bank the bank number to switch to (0 to 16383) * @param bank the bank number to switch to (0 to 16383)
* @param program the program (patch) to use in the specified bank (0 to 127) * @param program the program (patch) to use in the specified bank
* (0 to 127)
* @see #programChange(int) * @see #programChange(int)
* @see #getProgram() * @see #getProgram()
*/ */
public void programChange(int bank, int program); void programChange(int bank, int program);
/** /**
* Obtains the current program number for this channel. * Obtains the current program number for this channel.
*
* @return the program number of the currently selected patch * @return the program number of the currently selected patch
* @see Patch#getProgram * @see Patch#getProgram
* @see Synthesizer#loadInstrument * @see Synthesizer#loadInstrument
* @see #programChange(int) * @see #programChange(int)
*/ */
public int getProgram(); int getProgram();
/** /**
* Changes the pitch offset for all notes on this channel. * Changes the pitch offset for all notes on this channel. This affects all
* This affects all currently sounding notes as well as subsequent ones. * currently sounding notes as well as subsequent ones. (For pitch bend to
* (For pitch bend to cease, the value needs to be reset to the * cease, the value needs to be reset to the center position.)
* center position.) * <p>
* <p> The MIDI specification * The MIDI specification stipulates that pitch bend be a 14-bit value,
* stipulates that pitch bend be a 14-bit value, where zero * where zero is maximum downward bend, 16383 is maximum upward bend, and
* is maximum downward bend, 16383 is maximum upward bend, and * 8192 is the center (no pitch bend). The actual amount of pitch change is
* 8192 is the center (no pitch bend). The actual * not specified; it can be changed by a pitch-bend sensitivity setting.
* amount of pitch change is not specified; it can be changed by * However, the General MIDI specification says that the default range
* a pitch-bend sensitivity setting. However, the General MIDI * should be two semitones up and down from center.
* specification says that the default range should be two semitones * <p>
* up and down from center. * It is possible that the underlying synthesizer does not support this MIDI
* * message. In order to verify that {@code setPitchBend} was successful, use
* It is possible that the underlying synthesizer * {@code getPitchBend}.
* does not support this MIDI message. In order
* to verify that <code>setPitchBend</code>
* was successful, use <code>getPitchBend</code>.
*
* @param bend the amount of pitch change, as a nonnegative 14-bit value
* (8192 = no bend)
* *
* @param bend the amount of pitch change, as a nonnegative 14-bit value
* (8192 = no bend)
* @see #getPitchBend * @see #getPitchBend
*/ */
public void setPitchBend(int bend); void setPitchBend(int bend);
/** /**
* Obtains the upward or downward pitch offset for this channel. * Obtains the upward or downward pitch offset for this channel. If the
* If the device does not support setting pitch bend, * device does not support setting pitch bend, this method always returns
* this method always returns 8192. Calling * 8192. Calling {@code setPitchBend} will have no effect then.
* <code>setPitchBend</code> will have no effect then.
* *
* @return bend amount, as a nonnegative 14-bit value (8192 = no bend) * @return bend amount, as a nonnegative 14-bit value (8192 = no bend)
*
* @see #setPitchBend(int) * @see #setPitchBend(int)
*/ */
public int getPitchBend(); int getPitchBend();
/** /**
* Resets all the implemented controllers to their default values. * Resets all the implemented controllers to their default values.
* *
* @see #controlChange(int, int) * @see #controlChange(int, int)
*/ */
public void resetAllControllers(); void resetAllControllers();
/** /**
* Turns off all notes that are currently sounding on this channel. * Turns off all notes that are currently sounding on this channel. The
* The notes might not die away instantaneously; their decay * notes might not die away instantaneously; their decay rate is determined
* rate is determined by the internals of the <code>Instrument</code>. * by the internals of the {@code Instrument}. If the Hold Pedal controller
* If the Hold Pedal controller (see * (see {@link #controlChange(int, int) controlChange}) is down, the effect
* {@link #controlChange(int, int) controlChange}) * of this method is deferred until the pedal is released.
* is down, the effect of this method is deferred until the pedal is
* released.
* *
* @see #allSoundOff * @see #allSoundOff
* @see #noteOff(int) * @see #noteOff(int)
*/ */
public void allNotesOff(); void allNotesOff();
/** /**
* Immediately turns off all sounding notes on this channel, ignoring the * Immediately turns off all sounding notes on this channel, ignoring the
* state of the Hold Pedal and the internal decay rate of the current * state of the Hold Pedal and the internal decay rate of the current
* <code>Instrument</code>. * {@code Instrument}.
* *
* @see #allNotesOff * @see #allNotesOff
*/ */
public void allSoundOff(); void allSoundOff();
/** /**
* Turns local control on or off. The default is for local control * Turns local control on or off. The default is for local control to be on.
* to be on. The "on" setting means that if a device is capable * The "on" setting means that if a device is capable of both synthesizing
* of both synthesizing sound and transmitting MIDI messages, * sound and transmitting MIDI messages, it will synthesize sound in
* it will synthesize sound in response to the note-on and * response to the note-on and note-off messages that it itself transmits.
* note-off messages that it itself transmits. It will also respond * It will also respond to messages received from other transmitting
* to messages received from other transmitting devices. * devices. The "off" setting means that the synthesizer will ignore its own
* The "off" setting means that the synthesizer will ignore its * transmitted MIDI messages, but not those received from other devices.
* own transmitted MIDI messages, but not those received from other devices.
*
* It is possible that the underlying synthesizer
* does not support local control. In order
* to verify that a call to <code>localControl</code>
* was successful, check the return value.
*
* @param on <code>true</code> to turn local control on, <code>false</code>
* to turn local control off
* @return the new local-control value, or false
* if local control is not supported
*
*/
public boolean localControl(boolean on);
/**
* Turns mono mode on or off. In mono mode, the channel synthesizes
* only one note at a time. In poly mode (identical to mono mode off),
* the channel can synthesize multiple notes simultaneously.
* The default is mono off (poly mode on).
* <p> * <p>
* "Mono" is short for the word "monophonic," which in this context * It is possible that the underlying synthesizer does not support local
* is opposed to the word "polyphonic" and refers to a single synthesizer * control. In order to verify that a call to {@code localControl} was
* voice per MIDI channel. It * successful, check the return value.
* has nothing to do with how many audio channels there might be
* (as in "monophonic" versus "stereophonic" recordings).
* *
* It is possible that the underlying synthesizer * @param on {@code true} to turn local control on, {@code false} to turn
* does not support mono mode. In order * local control off
* to verify that a call to <code>setMono</code> * @return the new local-control value, or false if local control is not
* was successful, use <code>getMono</code>. * supported
* */
* @param on <code>true</code> to turn mono mode on, <code>false</code> to boolean localControl(boolean on);
* turn it off (which means turning poly mode on).
/**
* Turns mono mode on or off. In mono mode, the channel synthesizes only one
* note at a time. In poly mode (identical to mono mode off), the channel
* can synthesize multiple notes simultaneously. The default is mono off
* (poly mode on).
* <p>
* "Mono" is short for the word "monophonic," which in this context is
* opposed to the word "polyphonic" and refers to a single synthesizer voice
* per MIDI channel. It has nothing to do with how many audio channels there
* might be (as in "monophonic" versus "stereophonic" recordings).
* <p>
* It is possible that the underlying synthesizer does not support mono
* mode. In order to verify that a call to {@code setMono} was successful,
* use {@code getMono}.
* *
* @param on {@code true} to turn mono mode on, {@code false} to turn it
* off (which means turning poly mode on)
* @see #getMono * @see #getMono
* @see VoiceStatus * @see VoiceStatus
*/ */
public void setMono(boolean on); void setMono(boolean on);
/** /**
* Obtains the current mono/poly mode. * Obtains the current mono/poly mode. Synthesizers that do not allow
* Synthesizers that do not allow changing mono/poly mode * changing mono/poly mode will always return the same value, regardless of
* will always return the same value, regardless * calls to {@code setMono}.
* of calls to <code>setMono</code>.
* @return <code>true</code> if mono mode is on, otherwise
* <code>false</code> (meaning poly mode is on).
* *
* @return {@code true} if mono mode is on, otherwise {@code false} (meaning
* poly mode is on)
* @see #setMono(boolean) * @see #setMono(boolean)
*/ */
public boolean getMono(); boolean getMono();
/** /**
* Turns omni mode on or off. In omni mode, the channel responds * Turns omni mode on or off. In omni mode, the channel responds to messages
* to messages sent on all channels. When omni is off, the channel * sent on all channels. When omni is off, the channel responds only to
* responds only to messages sent on its channel number. * messages sent on its channel number. The default is omni off.
* The default is omni off. * <p>
* * It is possible that the underlying synthesizer does not support omni
* It is possible that the underlying synthesizer * mode. In order to verify that {@code setOmni} was successful, use
* does not support omni mode. In order * {@code getOmni}.
* to verify that <code>setOmni</code>
* was successful, use <code>getOmni</code>.
*
* @param on <code>true</code> to turn omni mode on, <code>false</code> to
* turn it off.
* *
* @param on {@code true} to turn omni mode on, {@code false} to turn it
* off
* @see #getOmni * @see #getOmni
* @see VoiceStatus * @see VoiceStatus
*/ */
public void setOmni(boolean on); void setOmni(boolean on);
/** /**
* Obtains the current omni mode. * Obtains the current omni mode. Synthesizers that do not allow changing
* Synthesizers that do not allow changing the omni mode * the omni mode will always return the same value, regardless of calls to
* will always return the same value, regardless * {@code setOmni}.
* of calls to <code>setOmni</code>.
* @return <code>true</code> if omni mode is on, otherwise
* <code>false</code> (meaning omni mode is off).
* *
* @return {@code true} if omni mode is on, otherwise {@code false} (meaning
* omni mode is off)
* @see #setOmni(boolean) * @see #setOmni(boolean)
*/ */
public boolean getOmni(); boolean getOmni();
/** /**
* Sets the mute state for this channel. A value of * Sets the mute state for this channel. A value of {@code true} means the
* <code>true</code> means the channel is to be muted, <code>false</code> * channel is to be muted, {@code false} means the channel can sound (if
* means the channel can sound (if other channels are not soloed). * other channels are not soloed).
* <p> * <p>
* Unlike {@link #allSoundOff()}, this method * Unlike {@link #allSoundOff()}, this method applies to only a specific
* applies to only a specific channel, not to all channels. Further, it * channel, not to all channels. Further, it silences not only currently
* silences not only currently sounding notes, but also subsequently * sounding notes, but also subsequently received notes.
* received notes. * <p>
* * It is possible that the underlying synthesizer does not support muting
* It is possible that the underlying synthesizer * channels. In order to verify that a call to {@code setMute} was
* does not support muting channels. In order * successful, use {@code getMute}.
* to verify that a call to <code>setMute</code>
* was successful, use <code>getMute</code>.
*
* @param mute the new mute state
* *
* @param mute the new mute state
* @see #getMute * @see #getMute
* @see #setSolo(boolean) * @see #setSolo(boolean)
*/ */
public void setMute(boolean mute); void setMute(boolean mute);
/** /**
* Obtains the current mute state for this channel. * Obtains the current mute state for this channel. If the underlying
* If the underlying synthesizer does not support * synthesizer does not support muting this channel, this method always
* muting this channel, this method always returns * returns {@code false}.
* <code>false</code>.
*
* @return <code>true</code> the channel is muted,
* or <code>false</code> if not
* *
* @return {@code true} the channel is muted, or {@code false} if not
* @see #setMute(boolean) * @see #setMute(boolean)
*/ */
public boolean getMute(); boolean getMute();
/** /**
* Sets the solo state for this channel. * Sets the solo state for this channel. If {@code solo} is {@code true}
* If <code>solo</code> is <code>true</code> only this channel * only this channel and other soloed channels will sound. If {@code solo}
* and other soloed channels will sound. If <code>solo</code> * is {@code false} then only other soloed channels will sound, unless no
* is <code>false</code> then only other soloed channels will * channels are soloed, in which case all unmuted channels will sound.
* sound, unless no channels are soloed, in which case all * <p>
* unmuted channels will sound. * It is possible that the underlying synthesizer does not support solo
* channels. In order to verify that a call to {@code setSolo} was
* successful, use {@code getSolo}.
* *
* It is possible that the underlying synthesizer * @param soloState new solo state for the channel
* does not support solo channels. In order
* to verify that a call to <code>setSolo</code>
* was successful, use <code>getSolo</code>.
*
* @param soloState new solo state for the channel
* @see #getSolo() * @see #getSolo()
*/ */
public void setSolo(boolean soloState); void setSolo(boolean soloState);
/** /**
* Obtains the current solo state for this channel. * Obtains the current solo state for this channel. If the underlying
* If the underlying synthesizer does not support * synthesizer does not support solo on this channel, this method always
* solo on this channel, this method always returns * returns {@code false}.
* <code>false</code>.
*
* @return <code>true</code> the channel is solo,
* or <code>false</code> if not
* *
* @return {@code true} the channel is solo, or {@code false} if not
* @see #setSolo(boolean) * @see #setSolo(boolean)
*/ */
public boolean getSolo(); boolean getSolo();
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -27,64 +27,52 @@ package javax.sound.midi;
import java.util.List; import java.util.List;
/** /**
* <code>MidiDevice</code> is the base interface for all MIDI devices. * {@code MidiDevice} is the base interface for all MIDI devices. Common devices
* Common devices include synthesizers, sequencers, MIDI input ports, and MIDI * include synthesizers, sequencers, MIDI input ports, and MIDI output ports.
* output ports. * <p>
* * A {@code MidiDevice} can be a transmitter or a receiver of MIDI events, or
* <p>A <code>MidiDevice</code> can be a transmitter or a receiver of * both. Therefore, it can provide {@link Transmitter} or {@link Receiver}
* MIDI events, or both. Therefore, it can provide {@link Transmitter} * instances (or both). Typically, MIDI IN ports provide transmitters, MIDI OUT
* or {@link Receiver} instances (or both). Typically, MIDI IN ports * ports and synthesizers provide receivers. A Sequencer typically provides
* provide transmitters, MIDI OUT ports and synthesizers provide * transmitters for playback and receivers for recording.
* receivers. A Sequencer typically provides transmitters for playback * <p>
* and receivers for recording. * A {@code MidiDevice} can be opened and closed explicitly as well as
* * implicitly. Explicit opening is accomplished by calling {@link #open},
* <p>A <code>MidiDevice</code> can be opened and closed explicitly as * explicit closing is done by calling {@link #close} on the {@code MidiDevice}
* well as implicitly. Explicit opening is accomplished by calling * instance. If an application opens a {@code MidiDevice} explicitly, it has to
* {@link #open}, explicit closing is done by calling {@link * close it explicitly to free system resources and enable the application to
* #close} on the <code>MidiDevice</code> instance. * exit cleanly. Implicit opening is done by calling
* If an application opens a <code>MidiDevice</code> * {@link MidiSystem#getReceiver} and {@link MidiSystem#getTransmitter}. The
* explicitly, it has to close it explicitly to free system resources * {@code MidiDevice} used by {@code MidiSystem.getReceiver} and
* and enable the application to exit cleanly. Implicit opening is * {@code MidiSystem.getTransmitter} is implementation-dependant unless the
* done by calling {@link javax.sound.midi.MidiSystem#getReceiver * properties {@code javax.sound.midi.Receiver} and
* MidiSystem.getReceiver} and {@link * {@code javax.sound.midi.Transmitter} are used (see the description of
* javax.sound.midi.MidiSystem#getTransmitter * properties to select default providers in {@link MidiSystem}). A
* MidiSystem.getTransmitter}. The <code>MidiDevice</code> used by * {@code MidiDevice} that was opened implicitly, is closed implicitly by
* <code>MidiSystem.getReceiver</code> and * closing the {@code Receiver} or {@code Transmitter} that resulted in opening
* <code>MidiSystem.getTransmitter</code> is implementation-dependant * it. If more than one implicitly opening {@code Receiver} or
* unless the properties <code>javax.sound.midi.Receiver</code> * {@code Transmitter} were obtained by the application, the device is closed
* and <code>javax.sound.midi.Transmitter</code> are used (see the * after the last {@code Receiver} or {@code Transmitter} has been closed. On
* description of properties to select default providers in * the other hand, calling {@code getReceiver} or {@code getTransmitter} on the
* {@link javax.sound.midi.MidiSystem}). A <code>MidiDevice</code> * device instance directly does not open the device implicitly. Closing these
* that was opened implicitly, is closed implicitly by closing the * {@code Transmitter}s and {@code Receiver}s does not close the device
* <code>Receiver</code> or <code>Transmitter</code> that resulted in * implicitly. To use a device with {@code Receiver}s or {@code Transmitter}s
* opening it. If more than one implicitly opening * obtained this way, the device has to be opened and closed explicitly.
* <code>Receiver</code> or <code>Transmitter</code> were obtained by * <p>
* the application, the device is closed after the last * If implicit and explicit opening and closing are mixed on the same
* <code>Receiver</code> or <code>Transmitter</code> has been * {@code MidiDevice} instance, the following rules apply:
* closed. On the other hand, calling <code>getReceiver</code> or
* <code>getTransmitter</code> on the device instance directly does
* not open the device implicitly. Closing these
* <code>Transmitter</code>s and <code>Receiver</code>s does not close
* the device implicitly. To use a device with <code>Receiver</code>s
* or <code>Transmitter</code>s obtained this way, the device has to
* be opened and closed explicitly.
*
* <p>If implicit and explicit opening and closing are mixed on the
* same <code>MidiDevice</code> instance, the following rules apply:
* *
* <ul> * <ul>
* <li>After an explicit open (either before or after implicit * <li>After an explicit open (either before or after implicit opens), the
* opens), the device will not be closed by implicit closing. The only * device will not be closed by implicit closing. The only way to close an
* way to close an explicitly opened device is an explicit close.</li> * explicitly opened device is an explicit close.</li>
* * <li>An explicit close always closes the device, even if it also has been
* <li>An explicit close always closes the device, even if it also has * opened implicitly. A subsequent implicit close has no further effect.</li>
* been opened implicitly. A subsequent implicit close has no further
* effect.</li>
* </ul> * </ul>
* *
* To detect if a MidiDevice represents a hardware MIDI port, the * To detect if a MidiDevice represents a hardware MIDI port, the following
* following programming technique can be used: * programming technique can be used:
* *
* <pre>{@code * <pre>{@code
* MidiDevice device = ...; * MidiDevice device = ...;
@ -95,193 +83,171 @@ import java.util.List;
* }</pre> * }</pre>
* *
* <p> * <p>
* A <code>MidiDevice</code> includes a <code>{@link MidiDevice.Info}</code> object * A {@code MidiDevice} includes a {@link Info} object to provide manufacturer
* to provide manufacturer information and so on. * information and so on.
* *
* @author Kara Kytle
* @author Florian Bomers
* @see Synthesizer * @see Synthesizer
* @see Sequencer * @see Sequencer
* @see Receiver * @see Receiver
* @see Transmitter * @see Transmitter
*
* @author Kara Kytle
* @author Florian Bomers
*/ */
public interface MidiDevice extends AutoCloseable { public interface MidiDevice extends AutoCloseable {
/** /**
* Obtains information about the device, including its Java class and * Obtains information about the device, including its Java class and
* <code>Strings</code> containing its name, vendor, and description. * {@code Strings} containing its name, vendor, and description.
* *
* @return device info * @return device info
*/ */
public Info getDeviceInfo(); Info getDeviceInfo();
/** /**
* Opens the device, indicating that it should now acquire any * Opens the device, indicating that it should now acquire any system
* system resources it requires and become operational. * resources it requires and become operational.
*
* <p>An application opening a device explicitly with this call
* has to close the device by calling {@link #close}. This is
* necessary to release system resources and allow applications to
* exit cleanly.
*
* <p> * <p>
* Note that some devices, once closed, cannot be reopened. Attempts * An application opening a device explicitly with this call has to close
* to reopen such a device will always result in a MidiUnavailableException. * the device by calling {@link #close}. This is necessary to release system
* * resources and allow applications to exit cleanly.
* @throws MidiUnavailableException thrown if the device cannot be * <p>
* opened due to resource restrictions. * Note that some devices, once closed, cannot be reopened. Attempts to
* @throws SecurityException thrown if the device cannot be * reopen such a device will always result in a MidiUnavailableException.
* opened due to security restrictions.
* *
* @throws MidiUnavailableException thrown if the device cannot be opened
* due to resource restrictions
* @throws SecurityException thrown if the device cannot be opened due to
* security restrictions
* @see #close * @see #close
* @see #isOpen * @see #isOpen
*/ */
public void open() throws MidiUnavailableException; void open() throws MidiUnavailableException;
/** /**
* Closes the device, indicating that the device should now release * Closes the device, indicating that the device should now release any
* any system resources it is using. * system resources it is using.
* * <p>
* <p>All <code>Receiver</code> and <code>Transmitter</code> instances * All {@code Receiver} and {@code Transmitter} instances open from this
* open from this device are closed. This includes instances retrieved * device are closed. This includes instances retrieved via
* via <code>MidiSystem</code>. * {@code MidiSystem}.
* *
* @see #open * @see #open
* @see #isOpen * @see #isOpen
*/ */
public void close(); void close();
/** /**
* Reports whether the device is open. * Reports whether the device is open.
* *
* @return <code>true</code> if the device is open, otherwise * @return {@code true} if the device is open, otherwise {@code false}
* <code>false</code>
* @see #open * @see #open
* @see #close * @see #close
*/ */
public boolean isOpen(); boolean isOpen();
/** /**
* Obtains the current time-stamp of the device, in microseconds. * Obtains the current time-stamp of the device, in microseconds. If a
* If a device supports time-stamps, it should start counting at * device supports time-stamps, it should start counting at 0 when the
* 0 when the device is opened and continue incrementing its * device is opened and continue incrementing its time-stamp in microseconds
* time-stamp in microseconds until the device is closed. * until the device is closed. If it does not support time-stamps, it should
* If it does not support time-stamps, it should always return * always return -1.
* -1.
* @return the current time-stamp of the device in microseconds,
* or -1 if time-stamping is not supported by the device.
*/
public long getMicrosecondPosition();
/**
* Obtains the maximum number of MIDI IN connections available on this
* MIDI device for receiving MIDI data.
* @return maximum number of MIDI IN connections,
* or -1 if an unlimited number of connections is available.
*/
public int getMaxReceivers();
/**
* Obtains the maximum number of MIDI OUT connections available on this
* MIDI device for transmitting MIDI data.
* @return maximum number of MIDI OUT connections,
* or -1 if an unlimited number of connections is available.
*/
public int getMaxTransmitters();
/**
* Obtains a MIDI IN receiver through which the MIDI device may receive
* MIDI data. The returned receiver must be closed when the application
* has finished using it.
* *
* <p>Usually the returned receiver implements * @return the current time-stamp of the device in microseconds, or -1 if
* the {@code MidiDeviceReceiver} interface. * time-stamping is not supported by the device
*/
long getMicrosecondPosition();
/**
* Obtains the maximum number of MIDI IN connections available on this MIDI
* device for receiving MIDI data.
* *
* <p>Obtaining a <code>Receiver</code> with this method does not * @return maximum number of MIDI IN connections, or -1 if an unlimited
* open the device. To be able to use the device, it has to be * number of connections is available
* opened explicitly by calling {@link #open}. Also, closing the */
* <code>Receiver</code> does not close the device. It has to be int getMaxReceivers();
* closed explicitly by calling {@link #close}.
/**
* Obtains the maximum number of MIDI OUT connections available on this MIDI
* device for transmitting MIDI data.
* *
* @return a receiver for the device. * @return maximum number of MIDI OUT connections, or -1 if an unlimited
* number of connections is available
*/
int getMaxTransmitters();
/**
* Obtains a MIDI IN receiver through which the MIDI device may receive MIDI
* data. The returned receiver must be closed when the application has
* finished using it.
* <p>
* Usually the returned receiver implements the {@code MidiDeviceReceiver}
* interface.
* <p>
* Obtaining a {@code Receiver} with this method does not open the device.
* To be able to use the device, it has to be opened explicitly by calling
* {@link #open}. Also, closing the {@code Receiver} does not close the
* device. It has to be closed explicitly by calling {@link #close}.
*
* @return a receiver for the device
* @throws MidiUnavailableException thrown if a receiver is not available * @throws MidiUnavailableException thrown if a receiver is not available
* due to resource restrictions * due to resource restrictions
* @see Receiver#close() * @see Receiver#close()
*/ */
public Receiver getReceiver() throws MidiUnavailableException; Receiver getReceiver() throws MidiUnavailableException;
/** /**
* Returns all currently active, non-closed receivers * Returns all currently active, non-closed receivers connected with this
* connected with this MidiDevice. * MidiDevice. A receiver can be removed from the device by closing it.
* A receiver can be removed * <p>
* from the device by closing it. * Usually the returned receivers implement the {@code MidiDeviceReceiver}
* * interface.
* <p>Usually the returned receivers implement
* the {@code MidiDeviceReceiver} interface.
* *
* @return an unmodifiable list of the open receivers * @return an unmodifiable list of the open receivers
* @since 1.5 * @since 1.5
*/ */
List<Receiver> getReceivers(); List<Receiver> getReceivers();
/** /**
* Obtains a MIDI OUT connection from which the MIDI device will transmit * Obtains a MIDI OUT connection from which the MIDI device will transmit
* MIDI data The returned transmitter must be closed when the application * MIDI data. The returned transmitter must be closed when the application
* has finished using it. * has finished using it.
* <p>
* Usually the returned transmitter implements the
* {@code MidiDeviceTransmitter} interface.
* <p>
* Obtaining a {@code Transmitter} with this method does not open the
* device. To be able to use the device, it has to be opened explicitly by
* calling {@link #open}. Also, closing the {@code Transmitter} does not
* close the device. It has to be closed explicitly by calling
* {@link #close}.
* *
* <p>Usually the returned transmitter implements * @return a MIDI OUT transmitter for the device
* the {@code MidiDeviceTransmitter} interface.
*
* <p>Obtaining a <code>Transmitter</code> with this method does not
* open the device. To be able to use the device, it has to be
* opened explicitly by calling {@link #open}. Also, closing the
* <code>Transmitter</code> does not close the device. It has to be
* closed explicitly by calling {@link #close}.
*
* @return a MIDI OUT transmitter for the device.
* @throws MidiUnavailableException thrown if a transmitter is not available * @throws MidiUnavailableException thrown if a transmitter is not available
* due to resource restrictions * due to resource restrictions
* @see Transmitter#close() * @see Transmitter#close()
*/ */
public Transmitter getTransmitter() throws MidiUnavailableException; Transmitter getTransmitter() throws MidiUnavailableException;
/** /**
* Returns all currently active, non-closed transmitters * Returns all currently active, non-closed transmitters connected with this
* connected with this MidiDevice. * MidiDevice. A transmitter can be removed from the device by closing it.
* A transmitter can be removed * <p>
* from the device by closing it. * Usually the returned transmitters implement the
* * {@code MidiDeviceTransmitter} interface.
* <p>Usually the returned transmitters implement
* the {@code MidiDeviceTransmitter} interface.
* *
* @return an unmodifiable list of the open transmitters * @return an unmodifiable list of the open transmitters
* @since 1.5 * @since 1.5
*/ */
List<Transmitter> getTransmitters(); List<Transmitter> getTransmitters();
/** /**
* A <code>MidiDevice.Info</code> object contains assorted * A {@code MidiDevice.Info} object contains assorted data about a
* data about a <code>{@link MidiDevice}</code>, including its * {@link MidiDevice}, including its name, the company who created it, and
* name, the company who created it, and descriptive text. * descriptive text.
* *
* @see MidiDevice#getDeviceInfo * @see MidiDevice#getDeviceInfo
*/ */
public static class Info { class Info {
/** /**
* The device's name. * The device's name.
@ -303,16 +269,16 @@ public interface MidiDevice extends AutoCloseable {
*/ */
private String version; private String version;
/** /**
* Constructs a device info object. * Constructs a device info object.
* *
* @param name the name of the device * @param name the name of the device
* @param vendor the name of the company who provides the device * @param vendor the name of the company who provides the device
* @param description a description of the device * @param description a description of the device
* @param version version information for the device * @param version version information for the device
*/ */
protected Info(String name, String vendor, String description, String version) { protected Info(String name, String vendor, String description,
String version) {
this.name = name; this.name = name;
this.vendor = vendor; this.vendor = vendor;
@ -320,20 +286,18 @@ public interface MidiDevice extends AutoCloseable {
this.version = version; this.version = version;
} }
/** /**
* Reports whether two objects are equal. * Reports whether two objects are equal. Returns {@code true} if the
* Returns <code>true</code> if the objects are identical. * objects are identical.
* @param obj the reference object with which to compare this *
* object * @param obj the reference object with which to compare this object
* @return <code>true</code> if this object is the same as the * @return {@code true} if this object is the same as the {@code obj}
* <code>obj</code> argument; <code>false</code> otherwise * argument; {@code false} otherwise
*/ */
public final boolean equals(Object obj) { public final boolean equals(Object obj) {
return super.equals(obj); return super.equals(obj);
} }
/** /**
* Finalizes the hashcode method. * Finalizes the hashcode method.
*/ */
@ -341,7 +305,6 @@ public interface MidiDevice extends AutoCloseable {
return super.hashCode(); return super.hashCode();
} }
/** /**
* Obtains the name of the device. * Obtains the name of the device.
* *
@ -351,43 +314,40 @@ public interface MidiDevice extends AutoCloseable {
return name; return name;
} }
/** /**
* Obtains the name of the company who supplies the device. * Obtains the name of the company who supplies the device.
*
* @return device the vendor's name * @return device the vendor's name
*/ */
public final String getVendor() { public final String getVendor() {
return vendor; return vendor;
} }
/** /**
* Obtains the description of the device. * Obtains the description of the device.
*
* @return a description of the device * @return a description of the device
*/ */
public final String getDescription() { public final String getDescription() {
return description; return description;
} }
/** /**
* Obtains the version of the device. * Obtains the version of the device.
*
* @return textual version information for the device. * @return textual version information for the device.
*/ */
public final String getVersion() { public final String getVersion() {
return version; return version;
} }
/** /**
* Provides a string representation of the device information. * Provides a string representation of the device information.
*
* @return a description of the info object * @return a description of the info object
*/ */
public final String toString() { public final String toString() {
return name; return name;
} }
} // class Info } // class Info
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -26,16 +26,18 @@
package javax.sound.midi; package javax.sound.midi;
/** /**
* <p>{@code MidiDeviceReceiver} is a {@code Receiver} which represents * {@code MidiDeviceReceiver} is a {@code Receiver} which represents a MIDI
* a MIDI input connector of a {@code MidiDevice} * input connector of a {@code MidiDevice} (see
* (see {@link MidiDevice#getReceiver()}). * {@link MidiDevice#getReceiver()}).
* *
* @since 1.7 * @since 1.7
*/ */
public interface MidiDeviceReceiver extends Receiver { public interface MidiDeviceReceiver extends Receiver {
/** /**
* Obtains a MidiDevice object which is an owner of this Receiver. * Obtains a MidiDevice object which is an owner of this Receiver.
*
* @return a MidiDevice object which is an owner of this Receiver * @return a MidiDevice object which is an owner of this Receiver
*/ */
public MidiDevice getMidiDevice(); MidiDevice getMidiDevice();
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -25,11 +25,10 @@
package javax.sound.midi; package javax.sound.midi;
/** /**
* <p>{@code MidiDeviceTransmitter} is a {@code Transmitter} which represents * {@code MidiDeviceTransmitter} is a {@code Transmitter} which represents a
* a MIDI input connector of a {@code MidiDevice} * MIDI input connector of a {@code MidiDevice} (see
* (see {@link MidiDevice#getTransmitter()}). * {@link MidiDevice#getTransmitter()}).
* *
* @since 1.7 * @since 1.7
*/ */
@ -37,7 +36,8 @@ public interface MidiDeviceTransmitter extends Transmitter {
/** /**
* Obtains a MidiDevice object which is an owner of this Transmitter. * Obtains a MidiDevice object which is an owner of this Transmitter.
*
* @return a MidiDevice object which is an owner of this Transmitter * @return a MidiDevice object which is an owner of this Transmitter
*/ */
public MidiDevice getMidiDevice(); MidiDevice getMidiDevice();
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2002, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -26,41 +26,35 @@
package javax.sound.midi; package javax.sound.midi;
/** /**
* MIDI events contain a MIDI message and a corresponding time-stamp * MIDI events contain a MIDI message and a corresponding time-stamp expressed
* expressed in ticks, and can represent the MIDI event information * in ticks, and can represent the MIDI event information stored in a MIDI file
* stored in a MIDI file or a <code>{@link Sequence}</code> object. The * or a {@link Sequence} object. The duration of a tick is specified by the
* duration of a tick is specified by the timing information contained * timing information contained in the MIDI file or {@code Sequence} object.
* in the MIDI file or <code>Sequence</code> object.
* <p> * <p>
* In Java Sound, <code>MidiEvent</code> objects are typically contained in a * In Java Sound, {@code MidiEvent} objects are typically contained in a
* <code>{@link Track}</code>, and <code>Tracks</code> are likewise * {@link Track}, and {@code Tracks} are likewise contained in a
* contained in a <code>Sequence</code>. * {@code Sequence}.
*
* *
* @author David Rivas * @author David Rivas
* @author Kara Kytle * @author Kara Kytle
*/ */
public class MidiEvent { public class MidiEvent {
// Instance variables
/** /**
* The MIDI message for this event. * The MIDI message for this event.
*/ */
private final MidiMessage message; private final MidiMessage message;
/** /**
* The tick value for this event. * The tick value for this event.
*/ */
private long tick; private long tick;
/** /**
* Constructs a new <code>MidiEvent</code>. * Constructs a new {@code MidiEvent}.
* @param message the MIDI message contained in the event *
* @param tick the time-stamp for the event, in MIDI ticks * @param message the MIDI message contained in the event
* @param tick the time-stamp for the event, in MIDI ticks
*/ */
public MidiEvent(MidiMessage message, long tick) { public MidiEvent(MidiMessage message, long tick) {
@ -70,24 +64,25 @@ public class MidiEvent {
/** /**
* Obtains the MIDI message contained in the event. * Obtains the MIDI message contained in the event.
*
* @return the MIDI message * @return the MIDI message
*/ */
public MidiMessage getMessage() { public MidiMessage getMessage() {
return message; return message;
} }
/** /**
* Sets the time-stamp for the event, in MIDI ticks * Sets the time-stamp for the event, in MIDI ticks.
* @param tick the new time-stamp, in MIDI ticks *
* @param tick the new time-stamp, in MIDI ticks
*/ */
public void setTick(long tick) { public void setTick(long tick) {
this.tick = tick; this.tick = tick;
} }
/** /**
* Obtains the time-stamp for the event, in MIDI ticks * Obtains the time-stamp for the event, in MIDI ticks.
*
* @return the time-stamp for the event, in MIDI ticks * @return the time-stamp for the event, in MIDI ticks
*/ */
public long getTick() { public long getTick() {

View file

@ -25,29 +25,23 @@
package javax.sound.midi; package javax.sound.midi;
import java.io.InputStream;
import java.io.IOException;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
/** /**
* A <code>MidiFileFormat</code> object encapsulates a MIDI file's * A {@code MidiFileFormat} object encapsulates a MIDI file's type, as well as
* type, as well as its length and timing information. * its length and timing information.
* * <p>
* <p>A <code>MidiFileFormat</code> object can * A {@code MidiFileFormat} object can include a set of properties. A property
* include a set of properties. A property is a pair of key and value: * is a pair of key and value: the key is of type {@code String}, the associated
* the key is of type <code>String</code>, the associated property * property value is an arbitrary object. Properties specify additional
* value is an arbitrary object. * informational meta data (like a author, or copyright). Properties are
* Properties specify additional informational * optional information, and file reader and file writer implementations are not
* meta data (like a author, or copyright). * required to provide or recognize properties.
* Properties are optional information, and file reader and file * <p>
* writer implementations are not required to provide or * The following table lists some common properties that should be used in
* recognize properties. * implementations:
*
* <p>The following table lists some common properties that should
* be used in implementations:
* *
* <table border=1> * <table border=1>
<caption>MIDI File Format Properties</caption> <caption>MIDI File Format Properties</caption>
@ -83,24 +77,21 @@ import java.util.Map;
* </tr> * </tr>
* </table> * </table>
* *
* @see MidiSystem#getMidiFileFormat(java.io.File)
* @see Sequencer#setSequence(java.io.InputStream stream)
*
* @author Kara Kytle * @author Kara Kytle
* @author Florian Bomers * @author Florian Bomers
* @see MidiSystem#getMidiFileFormat(java.io.File)
* @see Sequencer#setSequence(java.io.InputStream stream)
*/ */
public class MidiFileFormat { public class MidiFileFormat {
/** /**
* Represents unknown length. * Represents unknown length.
*
* @see #getByteLength * @see #getByteLength
* @see #getMicrosecondLength * @see #getMicrosecondLength
*/ */
public static final int UNKNOWN_LENGTH = -1; public static final int UNKNOWN_LENGTH = -1;
/** /**
* The type of MIDI file. * The type of MIDI file.
*/ */
@ -132,19 +123,22 @@ public class MidiFileFormat {
*/ */
protected long microsecondLength; protected long microsecondLength;
/**
/** The set of properties */ * The set of properties.
*/
private HashMap<String, Object> properties; private HashMap<String, Object> properties;
/** /**
* Constructs a <code>MidiFileFormat</code>. * Constructs a {@code MidiFileFormat}.
* *
* @param type the MIDI file type (0, 1, or 2) * @param type the MIDI file type (0, 1, or 2)
* @param divisionType the timing division type (PPQ or one of the SMPTE types) * @param divisionType the timing division type (PPQ or one of the SMPTE
* @param resolution the timing resolution * types)
* @param bytes the length of the MIDI file in bytes, or UNKNOWN_LENGTH if not known * @param resolution the timing resolution
* @param microseconds the duration of the file in microseconds, or UNKNOWN_LENGTH if not known * @param bytes the length of the MIDI file in bytes, or UNKNOWN_LENGTH if
* not known
* @param microseconds the duration of the file in microseconds, or
* UNKNOWN_LENGTH if not known
* @see #UNKNOWN_LENGTH * @see #UNKNOWN_LENGTH
* @see Sequence#PPQ * @see Sequence#PPQ
* @see Sequence#SMPTE_24 * @see Sequence#SMPTE_24
@ -162,21 +156,18 @@ public class MidiFileFormat {
this.properties = null; this.properties = null;
} }
/** /**
* Construct a <code>MidiFileFormat</code> with a set of properties. * Construct a {@code MidiFileFormat} with a set of properties.
*
* @param type the MIDI file type (0, 1, or 2)
* @param divisionType the timing division type
* (PPQ or one of the SMPTE types)
* @param resolution the timing resolution
* @param bytes the length of the MIDI file in bytes,
* or UNKNOWN_LENGTH if not known
* @param microseconds the duration of the file in microseconds,
* or UNKNOWN_LENGTH if not known
* @param properties a <code>Map&lt;String,Object&gt;</code> object
* with properties
* *
* @param type the MIDI file type (0, 1, or 2)
* @param divisionType the timing division type (PPQ or one of the SMPTE
* types)
* @param resolution the timing resolution
* @param bytes the length of the MIDI file in bytes, or UNKNOWN_LENGTH if
* not known
* @param microseconds the duration of the file in microseconds, or
* UNKNOWN_LENGTH if not known
* @param properties a {@code Map<String,Object>} object with properties
* @see #UNKNOWN_LENGTH * @see #UNKNOWN_LENGTH
* @see Sequence#PPQ * @see Sequence#PPQ
* @see Sequence#SMPTE_24 * @see Sequence#SMPTE_24
@ -192,10 +183,9 @@ public class MidiFileFormat {
this.properties = new HashMap<String, Object>(properties); this.properties = new HashMap<String, Object>(properties);
} }
/** /**
* Obtains the MIDI file type. * Obtains the MIDI file type.
*
* @return the file's type (0, 1, or 2) * @return the file's type (0, 1, or 2)
*/ */
public int getType() { public int getType() {
@ -206,7 +196,6 @@ public class MidiFileFormat {
* Obtains the timing division type for the MIDI file. * Obtains the timing division type for the MIDI file.
* *
* @return the division type (PPQ or one of the SMPTE types) * @return the division type (PPQ or one of the SMPTE types)
*
* @see Sequence#Sequence(float, int) * @see Sequence#Sequence(float, int)
* @see Sequence#PPQ * @see Sequence#PPQ
* @see Sequence#SMPTE_24 * @see Sequence#SMPTE_24
@ -219,11 +208,10 @@ public class MidiFileFormat {
return divisionType; return divisionType;
} }
/** /**
* Obtains the timing resolution for the MIDI file. * Obtains the timing resolution for the MIDI file. If the division type is
* If the division type is PPQ, the resolution is specified in ticks per beat. * PPQ, the resolution is specified in ticks per beat. For SMTPE timing, the
* For SMTPE timing, the resolution is specified in ticks per frame. * resolution is specified in ticks per frame.
* *
* @return the number of ticks per beat (PPQ) or per frame (SMPTE) * @return the number of ticks per beat (PPQ) or per frame (SMPTE)
* @see #getDivisionType * @see #getDivisionType
@ -233,9 +221,9 @@ public class MidiFileFormat {
return resolution; return resolution;
} }
/** /**
* Obtains the length of the MIDI file, expressed in 8-bit bytes. * Obtains the length of the MIDI file, expressed in 8-bit bytes.
*
* @return the number of bytes in the file, or UNKNOWN_LENGTH if not known * @return the number of bytes in the file, or UNKNOWN_LENGTH if not known
* @see #UNKNOWN_LENGTH * @see #UNKNOWN_LENGTH
*/ */
@ -245,7 +233,9 @@ public class MidiFileFormat {
/** /**
* Obtains the length of the MIDI file, expressed in microseconds. * Obtains the length of the MIDI file, expressed in microseconds.
* @return the file's duration in microseconds, or UNKNOWN_LENGTH if not known *
* @return the file's duration in microseconds, or UNKNOWN_LENGTH if not
* known
* @see Sequence#getMicrosecondLength() * @see Sequence#getMicrosecondLength()
* @see #getByteLength * @see #getByteLength
* @see #UNKNOWN_LENGTH * @see #UNKNOWN_LENGTH
@ -255,14 +245,11 @@ public class MidiFileFormat {
} }
/** /**
* Obtain an unmodifiable map of properties. * Obtain an unmodifiable map of properties. The concept of properties is
* The concept of properties is further explained in * further explained in the {@link MidiFileFormat class description}.
* the {@link MidiFileFormat class description}.
*
* @return a <code>Map&lt;String,Object&gt;</code> object containing
* all properties. If no properties are recognized, an empty map is
* returned.
* *
* @return a {@code Map<String,Object>} object containing all properties. If
* no properties are recognized, an empty map is returned.
* @see #getProperty(String) * @see #getProperty(String)
* @since 1.5 * @since 1.5
*/ */
@ -277,20 +264,16 @@ public class MidiFileFormat {
return Collections.unmodifiableMap(ret); return Collections.unmodifiableMap(ret);
} }
/** /**
* Obtain the property value specified by the key. * Obtain the property value specified by the key. The concept of properties
* The concept of properties is further explained in * is further explained in the {@link MidiFileFormat class description}.
* the {@link MidiFileFormat class description}. * <p>
* * If the specified property is not defined for a particular file format,
* <p>If the specified property is not defined for a * this method returns {@code null}.
* particular file format, this method returns
* <code>null</code>.
*
* @param key the key of the desired property
* @return the value of the property with the specified key,
* or <code>null</code> if the property does not exist.
* *
* @param key the key of the desired property
* @return the value of the property with the specified key, or {@code null}
* if the property does not exist
* @see #properties() * @see #properties()
* @since 1.5 * @since 1.5
*/ */
@ -300,6 +283,4 @@ public class MidiFileFormat {
} }
return properties.get(key); return properties.get(key);
} }
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -26,83 +26,76 @@
package javax.sound.midi; package javax.sound.midi;
/** /**
* <code>MidiMessage</code> is the base class for MIDI messages. They include * {@code MidiMessage} is the base class for MIDI messages. They include not
* not only the standard MIDI messages that a synthesizer can respond to, but also * only the standard MIDI messages that a synthesizer can respond to, but also
* "meta-events" that can be used by sequencer programs. There are meta-events * "meta-events" that can be used by sequencer programs. There are meta-events
* for such information as lyrics, copyrights, tempo indications, time and key * for such information as lyrics, copyrights, tempo indications, time and key
* signatures, markers, etc. For more information, see the Standard MIDI Files 1.0 * signatures, markers, etc. For more information, see the Standard MIDI Files
* specification, which is part of the Complete MIDI 1.0 Detailed Specification * 1.0 specification, which is part of the Complete MIDI 1.0 Detailed
* published by the MIDI Manufacturer's Association * Specification published by the MIDI Manufacturer's Association
* (<a href = http://www.midi.org>http://www.midi.org</a>). * (<a href = http://www.midi.org>http://www.midi.org</a>).
* <p> * <p>
* The base <code>MidiMessage</code> class provides access to three types of * The base {@code MidiMessage} class provides access to three types of
* information about a MIDI message: * information about a MIDI message:
* <ul> * <ul>
* <li>The messages's status byte</li> * <li>The messages's status byte</li>
* <li>The total length of the message in bytes (the status byte plus any data bytes)</li> * <li>The total length of the message in bytes (the status byte plus any data
* bytes)</li>
* <li>A byte array containing the complete message</li> * <li>A byte array containing the complete message</li>
* </ul> * </ul>
* *
* <code>MidiMessage</code> includes methods to get, but not set, these values. * {@code MidiMessage} includes methods to get, but not set, these values.
* Setting them is a subclass responsibility. * Setting them is a subclass responsibility.
* <p> * <p>
* <a name="integersVsBytes"></a> * <a name="integersVsBytes"></a> The MIDI standard expresses MIDI data in
* The MIDI standard expresses MIDI data in bytes. However, because * bytes. However, because Java<sup>TM</sup> uses signed bytes, the Java Sound
* Java<sup>TM</sup> uses signed bytes, the Java Sound API uses integers * API uses integers instead of bytes when expressing MIDI data. For example,
* instead of bytes when expressing MIDI data. For example, the * the {@link #getStatus()} method of {@code MidiMessage} returns MIDI status
* {@link #getStatus()} method of * bytes as integers. If you are processing MIDI data that originated outside
* <code>MidiMessage</code> returns MIDI status bytes as integers. If you are * Java Sound and now is encoded as signed bytes, the bytes can can be
* processing MIDI data that originated outside Java Sound and now * converted to integers using this conversion:
* is encoded as signed bytes, the bytes can *
* can be converted to integers using this conversion:
* <center>{@code int i = (int)(byte & 0xFF)}</center> * <center>{@code int i = (int)(byte & 0xFF)}</center>
* <p> * <p>
* If you simply need to pass a known MIDI byte value as a method parameter, * If you simply need to pass a known MIDI byte value as a method parameter, it
* it can be expressed directly as an integer, using (for example) decimal or * can be expressed directly as an integer, using (for example) decimal or
* hexadecimal notation. For instance, to pass the "active sensing" status byte * hexadecimal notation. For instance, to pass the "active sensing" status byte
* as the first argument to ShortMessage's * as the first argument to ShortMessage's
* {@link ShortMessage#setMessage(int) setMessage(int)} * {@link ShortMessage#setMessage(int) setMessage(int)} method, you can express
* method, you can express it as 254 or 0xFE. * it as 254 or 0xFE.
*
* @see Track
* @see Sequence
* @see Receiver
* *
* @author David Rivas * @author David Rivas
* @author Kara Kytle * @author Kara Kytle
* @see Track
* @see Sequence
* @see Receiver
*/ */
public abstract class MidiMessage implements Cloneable { public abstract class MidiMessage implements Cloneable {
// Instance variables
/** /**
* The MIDI message data. The first byte is the status * The MIDI message data. The first byte is the status byte for the message;
* byte for the message; subsequent bytes up to the length * subsequent bytes up to the length of the message are data bytes for this
* of the message are data bytes for this message. * message.
*
* @see #getLength * @see #getLength
*/ */
protected byte[] data; protected byte[] data;
/** /**
* The number of bytes in the MIDI message, including the * The number of bytes in the MIDI message, including the status byte and
* status byte and any data bytes. * any data bytes.
*
* @see #getLength * @see #getLength
*/ */
protected int length = 0; protected int length = 0;
/** /**
* Constructs a new <code>MidiMessage</code>. This protected * Constructs a new {@code MidiMessage}. This protected constructor is
* constructor is called by concrete subclasses, which should * called by concrete subclasses, which should ensure that the data array
* ensure that the data array specifies a complete, valid MIDI * specifies a complete, valid MIDI message.
* message.
*
* @param data an array of bytes containing the complete message.
* The message data may be changed using the <code>setMessage</code>
* method.
* *
* @param data an array of bytes containing the complete message. The
* message data may be changed using the {@code setMessage} method.
* @see #setMessage * @see #setMessage
*/ */
protected MidiMessage(byte[] data) { protected MidiMessage(byte[] data) {
@ -112,20 +105,21 @@ public abstract class MidiMessage implements Cloneable {
} }
} }
/** /**
* Sets the data for the MIDI message. This protected * Sets the data for the MIDI message. This protected method is called by
* method is called by concrete subclasses, which should * concrete subclasses, which should ensure that the data array specifies a
* ensure that the data array specifies a complete, valid MIDI * complete, valid MIDI message.
* message.
* *
* @param data the data bytes in the MIDI message * @param data the data bytes in the MIDI message
* @param length the number of bytes in the data byte array * @param length the number of bytes in the data byte array
* @throws InvalidMidiDataException if the parameter values do not specify a valid MIDI meta message * @throws InvalidMidiDataException if the parameter values do not specify a
* valid MIDI meta message
*/ */
protected void setMessage(byte[] data, int length) throws InvalidMidiDataException { protected void setMessage(byte[] data, int length)
throws InvalidMidiDataException {
if (length < 0 || (length > 0 && length > data.length)) { if (length < 0 || (length > 0 && length > data.length)) {
throw new IndexOutOfBoundsException("length out of bounds: "+length); throw new IndexOutOfBoundsException(
"length out of bounds: " + length);
} }
this.length = length; this.length = length;
@ -135,16 +129,14 @@ public abstract class MidiMessage implements Cloneable {
System.arraycopy(data, 0, this.data, 0, length); System.arraycopy(data, 0, this.data, 0, length);
} }
/** /**
* Obtains the MIDI message data. The first byte of the returned byte * Obtains the MIDI message data. The first byte of the returned byte array
* array is the status byte of the message. Any subsequent bytes up to * is the status byte of the message. Any subsequent bytes up to the length
* the length of the message are data bytes. The byte array may have a * of the message are data bytes. The byte array may have a length which is
* length which is greater than that of the actual message; the total * greater than that of the actual message; the total length of the message
* length of the message in bytes is reported by the <code>{@link #getLength}</code> * in bytes is reported by the {@link #getLength} method.
* method.
* *
* @return the byte array containing the complete <code>MidiMessage</code> data * @return the byte array containing the complete {@code MidiMessage} data
*/ */
public byte[] getMessage() { public byte[] getMessage() {
byte[] returnedArray = new byte[length]; byte[] returnedArray = new byte[length];
@ -152,12 +144,11 @@ public abstract class MidiMessage implements Cloneable {
return returnedArray; return returnedArray;
} }
/** /**
* Obtains the status byte for the MIDI message. The status "byte" is * Obtains the status byte for the MIDI message. The status "byte" is
* represented as an integer; see the * represented as an integer; see the
* <a href="#integersVsBytes">discussion</a> in the * <a href="#integersVsBytes">discussion</a> in the {@code MidiMessage}
* <code>MidiMessage</code> class description. * class description.
* *
* @return the integer representation of this event's status byte * @return the integer representation of this event's status byte
*/ */
@ -168,13 +159,11 @@ public abstract class MidiMessage implements Cloneable {
return 0; return 0;
} }
/** /**
* Obtains the total length of the MIDI message in bytes. A * Obtains the total length of the MIDI message in bytes. A MIDI message
* MIDI message consists of one status byte and zero or more * consists of one status byte and zero or more data bytes. The return value
* data bytes. The return value ranges from 1 for system real-time messages, * ranges from 1 for system real-time messages, to 2 or 3 for channel
* to 2 or 3 for channel messages, to any value for meta and system * messages, to any value for meta and system exclusive messages.
* exclusive messages.
* *
* @return the length of the message in bytes * @return the length of the message in bytes
*/ */
@ -182,11 +171,11 @@ public abstract class MidiMessage implements Cloneable {
return length; return length;
} }
/** /**
* Creates a new object of the same class and with the same contents * Creates a new object of the same class and with the same contents as this
* as this object. * object.
* @return a clone of this instance. *
* @return a clone of this instance
*/ */
public abstract Object clone(); public abstract Object clone();
} }

View file

@ -25,39 +25,37 @@
package javax.sound.midi; package javax.sound.midi;
/** /**
* A <code>MidiUnavailableException</code> is thrown when a requested MIDI * A {@code MidiUnavailableException} is thrown when a requested MIDI component
* component cannot be opened or created because it is unavailable. This often * cannot be opened or created because it is unavailable. This often occurs when
* occurs when a device is in use by another application. More generally, it * a device is in use by another application. More generally, it can occur when
* can occur when there is a finite number of a certain kind of resource that can * there is a finite number of a certain kind of resource that can be used for
* be used for some purpose, and all of them are already in use (perhaps all by * some purpose, and all of them are already in use (perhaps all by this
* this application). For an example of the latter case, see the * application). For an example of the latter case, see the
* {@link Transmitter#setReceiver(Receiver) setReceiver} method of * {@link Transmitter#setReceiver(Receiver) setReceiver} method of
* <code>Transmitter</code>. * {@code Transmitter}.
* *
* @author Kara Kytle * @author Kara Kytle
*/ */
public class MidiUnavailableException extends Exception { public class MidiUnavailableException extends Exception {
private static final long serialVersionUID = 6093809578628944323L; private static final long serialVersionUID = 6093809578628944323L;
/** /**
* Constructs a <code>MidiUnavailableException</code> that has * Constructs a {@code MidiUnavailableException} that has {@code null} as
* <code>null</code> as its error detail message. * its error detail message.
*/ */
public MidiUnavailableException() { public MidiUnavailableException() {
super(); super();
} }
/** /**
* Constructs a <code>MidiUnavailableException</code> with the * Constructs a {@code MidiUnavailableException} with the specified detail
* specified detail message. * message.
* *
* @param message the string to display as an error detail message * @param message the string to display as an error detail message
*/ */
public MidiUnavailableException(String message) { public MidiUnavailableException(final String message) {
super(message); super(message);
} }
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2002, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -25,88 +25,77 @@
package javax.sound.midi; package javax.sound.midi;
/** /**
* A <code>Patch</code> object represents a location, on a MIDI * A {@code Patch} object represents a location, on a MIDI synthesizer, into
* synthesizer, into which a single instrument is stored (loaded). * which a single instrument is stored (loaded). Every {@code Instrument} object
* Every <code>Instrument</code> object has its own <code>Patch</code> * has its own {@code Patch} object that specifies the memory location into
* object that specifies the memory location * which that instrument should be loaded. The location is specified abstractly
* into which that instrument should be loaded. The * by a bank index and a program number (not by any scheme that directly refers
* location is specified abstractly by a bank index and a program number (not by * to a specific address or offset in RAM). This is a hierarchical indexing
* any scheme that directly refers to a specific address or offset in RAM). * scheme: MIDI provides for up to 16384 banks, each of which contains up to 128
* This is a hierarchical indexing scheme: MIDI provides for up to 16384 banks, * program locations. For example, a minimal sort of synthesizer might have only
* each of which contains up to 128 program locations. For example, a * one bank of instruments, and only 32 instruments (programs) in that bank.
* minimal sort of synthesizer might have only one bank of instruments, and
* only 32 instruments (programs) in that bank.
* <p> * <p>
* To select what instrument should play the notes on a particular MIDI * To select what instrument should play the notes on a particular MIDI channel,
* channel, two kinds of MIDI message are used that specify a patch location: * two kinds of MIDI message are used that specify a patch location: a
* a bank-select command, and a program-change channel command. The Java Sound * bank-select command, and a program-change channel command. The Java Sound
* equivalent is the * equivalent is the
* {@link MidiChannel#programChange(int, int) programChange(int, int)} * {@link MidiChannel#programChange(int, int) programChange(int, int)} method of
* method of <code>MidiChannel</code>. * {@code MidiChannel}.
* *
* @author Kara Kytle
* @see Instrument * @see Instrument
* @see Instrument#getPatch() * @see Instrument#getPatch()
* @see MidiChannel#programChange(int, int) * @see MidiChannel#programChange(int, int)
* @see Synthesizer#loadInstruments(Soundbank, Patch[]) * @see Synthesizer#loadInstruments(Soundbank, Patch[])
* @see Soundbank * @see Soundbank
* @see Sequence#getPatchList() * @see Sequence#getPatchList()
*
* @author Kara Kytle
*/ */
public class Patch { public class Patch {
/** /**
* Bank index * Bank index.
*/ */
private final int bank; private final int bank;
/** /**
* Program change number * Program change number.
*/ */
private final int program; private final int program;
/** /**
* Constructs a new patch object from the specified bank and program * Constructs a new patch object from the specified bank and program
* numbers. * numbers.
* @param bank the bank index (in the range from 0 to 16383) *
* @param program the program index (in the range from 0 to 127) * @param bank the bank index (in the range from 0 to 16383)
* @param program the program index (in the range from 0 to 127)
*/ */
public Patch(int bank, int program) { public Patch(int bank, int program) {
this.bank = bank; this.bank = bank;
this.program = program; this.program = program;
} }
/** /**
* Returns the number of the bank that contains the instrument * Returns the number of the bank that contains the instrument whose
* whose location this <code>Patch</code> specifies. * location this {@code Patch} specifies.
*
* @return the bank number, whose range is from 0 to 16383 * @return the bank number, whose range is from 0 to 16383
* @see MidiChannel#programChange(int, int) * @see MidiChannel#programChange(int, int)
*/ */
public int getBank() { public int getBank() {
return bank; return bank;
} }
/** /**
* Returns the index, within * Returns the index, within a bank, of the instrument whose location this
* a bank, of the instrument whose location this <code>Patch</code> specifies. * {@code Patch} specifies.
* @return the instrument's program number, whose range is from 0 to 127
* *
* @return the instrument's program number, whose range is from 0 to 127
* @see MidiChannel#getProgram * @see MidiChannel#getProgram
* @see MidiChannel#programChange(int) * @see MidiChannel#programChange(int)
* @see MidiChannel#programChange(int, int) * @see MidiChannel#programChange(int, int)
*/ */
public int getProgram() { public int getProgram() {
return program; return program;
} }
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -25,50 +25,46 @@
package javax.sound.midi; package javax.sound.midi;
/** /**
* A <code>Receiver</code> receives <code>{@link MidiEvent}</code> objects and * A {@code Receiver} receives {@link MidiEvent} objects and typically does
* typically does something useful in response, such as interpreting them to * something useful in response, such as interpreting them to generate sound or
* generate sound or raw MIDI output. Common MIDI receivers include * raw MIDI output. Common MIDI receivers include synthesizers and MIDI Out
* synthesizers and MIDI Out ports. * ports.
* *
* @author Kara Kytle
* @see MidiDevice * @see MidiDevice
* @see Synthesizer * @see Synthesizer
* @see Transmitter * @see Transmitter
*
* @author Kara Kytle
*/ */
public interface Receiver extends AutoCloseable { public interface Receiver extends AutoCloseable {
//$$fb 2002-04-12: fix for 4662090: Contradiction in Receiver specification //$$fb 2002-04-12: fix for 4662090: Contradiction in Receiver specification
/** /**
* Sends a MIDI message and time-stamp to this receiver. * Sends a MIDI message and time-stamp to this receiver. If time-stamping is
* If time-stamping is not supported by this receiver, the time-stamp * not supported by this receiver, the time-stamp value should be -1.
* value should be -1. *
* @param message the MIDI message to send * @param message the MIDI message to send
* @param timeStamp the time-stamp for the message, in microseconds. * @param timeStamp the time-stamp for the message, in microseconds
* @throws IllegalStateException if the receiver is closed * @throws IllegalStateException if the receiver is closed
*/ */
public void send(MidiMessage message, long timeStamp); void send(MidiMessage message, long timeStamp);
/** /**
* Indicates that the application has finished using the receiver, and * Indicates that the application has finished using the receiver, and that
* that limited resources it requires may be released or made available. * limited resources it requires may be released or made available.
* * <p>
* <p>If the creation of this <code>Receiver</code> resulted in * If the creation of this {@code Receiver} resulted in implicitly opening
* implicitly opening the underlying device, the device is * the underlying device, the device is implicitly closed by this method.
* implicitly closed by this method. This is true unless the device is * This is true unless the device is kept open by other {@code Receiver} or
* kept open by other <code>Receiver</code> or <code>Transmitter</code> * {@code Transmitter} instances that opened the device implicitly, and
* instances that opened the device implicitly, and unless the device * unless the device has been opened explicitly. If the device this
* has been opened explicitly. If the device this * {@code Receiver} is retrieved from is closed explicitly by calling
* <code>Receiver</code> is retrieved from is closed explicitly by * {@link MidiDevice#close MidiDevice.close}, the {@code Receiver} is
* calling {@link MidiDevice#close MidiDevice.close}, the * closed, too. For a detailed description of open/close behaviour see the
* <code>Receiver</code> is closed, too. For a detailed * class description of {@link MidiDevice MidiDevice}.
* description of open/close behaviour see the class description
* of {@link javax.sound.midi.MidiDevice MidiDevice}.
* *
* @see javax.sound.midi.MidiSystem#getReceiver * @see javax.sound.midi.MidiSystem#getReceiver
*/ */
public void close(); void close();
} }

View file

@ -26,72 +26,77 @@
package javax.sound.midi; package javax.sound.midi;
import java.util.Vector; import java.util.Vector;
import com.sun.media.sound.MidiUtils;
/** /**
* A <code>Sequence</code> is a data structure containing musical * A {@code Sequence} is a data structure containing musical information (often
* information (often an entire song or composition) that can be played * an entire song or composition) that can be played back by a {@link Sequencer}
* back by a <code>{@link Sequencer}</code> object. Specifically, the * object. Specifically, the {@code Sequence} contains timing information and
* <code>Sequence</code> contains timing * one or more tracks. Each {@link Track track} consists of a series of MIDI
* information and one or more tracks. Each <code>{@link Track track}</code> consists of a * events (such as note-ons, note-offs, program changes, and meta-events). The
* series of MIDI events (such as note-ons, note-offs, program changes, and meta-events). * sequence's timing information specifies the type of unit that is used to
* The sequence's timing information specifies the type of unit that is used * time-stamp the events in the sequence.
* to time-stamp the events in the sequence.
* <p> * <p>
* A <code>Sequence</code> can be created from a MIDI file by reading the file * A {@code Sequence} can be created from a MIDI file by reading the file into
* into an input stream and invoking one of the <code>getSequence</code> methods of * an input stream and invoking one of the {@code getSequence} methods of
* {@link MidiSystem}. A sequence can also be built from scratch by adding new * {@link MidiSystem}. A sequence can also be built from scratch by adding new
* <code>Tracks</code> to an empty <code>Sequence</code>, and adding * {@code Tracks} to an empty {@code Sequence}, and adding {@link MidiEvent}
* <code>{@link MidiEvent}</code> objects to these <code>Tracks</code>. * objects to these {@code Tracks}.
* *
* @author Kara Kytle
* @see Sequencer#setSequence(java.io.InputStream stream) * @see Sequencer#setSequence(java.io.InputStream stream)
* @see Sequencer#setSequence(Sequence sequence) * @see Sequencer#setSequence(Sequence sequence)
* @see Track#add(MidiEvent) * @see Track#add(MidiEvent)
* @see MidiFileFormat * @see MidiFileFormat
*
* @author Kara Kytle
*/ */
public class Sequence { public class Sequence {
// Timing types // Timing types
/** /**
* The tempo-based timing type, for which the resolution is expressed in pulses (ticks) per quarter note. * The tempo-based timing type, for which the resolution is expressed in
* pulses (ticks) per quarter note.
*
* @see #Sequence(float, int) * @see #Sequence(float, int)
*/ */
public static final float PPQ = 0.0f; public static final float PPQ = 0.0f;
/** /**
* The SMPTE-based timing type with 24 frames per second (resolution is expressed in ticks per frame). * The SMPTE-based timing type with 24 frames per second (resolution is
* expressed in ticks per frame).
*
* @see #Sequence(float, int) * @see #Sequence(float, int)
*/ */
public static final float SMPTE_24 = 24.0f; public static final float SMPTE_24 = 24.0f;
/** /**
* The SMPTE-based timing type with 25 frames per second (resolution is expressed in ticks per frame). * The SMPTE-based timing type with 25 frames per second (resolution is
* expressed in ticks per frame).
*
* @see #Sequence(float, int) * @see #Sequence(float, int)
*/ */
public static final float SMPTE_25 = 25.0f; public static final float SMPTE_25 = 25.0f;
/** /**
* The SMPTE-based timing type with 29.97 frames per second (resolution is expressed in ticks per frame). * The SMPTE-based timing type with 29.97 frames per second (resolution is
* expressed in ticks per frame).
*
* @see #Sequence(float, int) * @see #Sequence(float, int)
*/ */
public static final float SMPTE_30DROP = 29.97f; public static final float SMPTE_30DROP = 29.97f;
/** /**
* The SMPTE-based timing type with 30 frames per second (resolution is expressed in ticks per frame). * The SMPTE-based timing type with 30 frames per second (resolution is
* expressed in ticks per frame).
*
* @see #Sequence(float, int) * @see #Sequence(float, int)
*/ */
public static final float SMPTE_30 = 30.0f; public static final float SMPTE_30 = 30.0f;
// Variables // Variables
/** /**
* The timing division type of the sequence. * The timing division type of the sequence.
*
* @see #PPQ * @see #PPQ
* @see #SMPTE_24 * @see #SMPTE_24
* @see #SMPTE_25 * @see #SMPTE_25
@ -103,33 +108,33 @@ public class Sequence {
/** /**
* The timing resolution of the sequence. * The timing resolution of the sequence.
*
* @see #getResolution * @see #getResolution
*/ */
protected int resolution; protected int resolution;
/** /**
* The MIDI tracks in this sequence. * The MIDI tracks in this sequence.
*
* @see #getTracks * @see #getTracks
*/ */
protected Vector<Track> tracks = new Vector<Track>(); protected Vector<Track> tracks = new Vector<Track>();
/** /**
* Constructs a new MIDI sequence with the specified timing division * Constructs a new MIDI sequence with the specified timing division type
* type and timing resolution. The division type must be one of the * and timing resolution. The division type must be one of the recognized
* recognized MIDI timing types. For tempo-based timing, * MIDI timing types. For tempo-based timing, {@code divisionType} is PPQ
* <code>divisionType</code> is PPQ (pulses per quarter note) and * (pulses per quarter note) and the resolution is specified in ticks per
* the resolution is specified in ticks per beat. For SMTPE timing, * beat. For SMTPE timing, {@code divisionType} specifies the number of
* <code>divisionType</code> specifies the number of frames per * frames per second and the resolution is specified in ticks per frame. The
* second and the resolution is specified in ticks per frame. * sequence will contain no initial tracks. Tracks may be added to or
* The sequence will contain no initial tracks. Tracks may be * removed from the sequence using {@link #createTrack} and
* added to or removed from the sequence using <code>{@link #createTrack}</code> * {@link #deleteTrack}.
* and <code>{@link #deleteTrack}</code>.
*
* @param divisionType the timing division type (PPQ or one of the SMPTE types)
* @param resolution the timing resolution
* @throws InvalidMidiDataException if <code>divisionType</code> is not valid
* *
* @param divisionType the timing division type (PPQ or one of the SMPTE
* types)
* @param resolution the timing resolution
* @throws InvalidMidiDataException if {@code divisionType} is not valid
* @see #PPQ * @see #PPQ
* @see #SMPTE_24 * @see #SMPTE_24
* @see #SMPTE_25 * @see #SMPTE_25
@ -156,27 +161,25 @@ public class Sequence {
this.resolution = resolution; this.resolution = resolution;
} }
/** /**
* Constructs a new MIDI sequence with the specified timing division * Constructs a new MIDI sequence with the specified timing division type,
* type, timing resolution, and number of tracks. The division type must be one of the * timing resolution, and number of tracks. The division type must be one of
* recognized MIDI timing types. For tempo-based timing, * the recognized MIDI timing types. For tempo-based timing,
* <code>divisionType</code> is PPQ (pulses per quarter note) and * {@code divisionType} is PPQ (pulses per quarter note) and the resolution
* the resolution is specified in ticks per beat. For SMTPE timing, * is specified in ticks per beat. For SMTPE timing, {@code divisionType}
* <code>divisionType</code> specifies the number of frames per * specifies the number of frames per second and the resolution is specified
* second and the resolution is specified in ticks per frame. * in ticks per frame. The sequence will be initialized with the number of
* The sequence will be initialized with the number of tracks specified by * tracks specified by {@code numTracks}. These tracks are initially empty
* <code>numTracks</code>. These tracks are initially empty (i.e. * (i.e. they contain only the meta-event End of Track). The tracks may be
* they contain only the meta-event End of Track). * retrieved for editing using the {@link #getTracks} method. Additional
* The tracks may be retrieved for editing using the <code>{@link #getTracks}</code> * tracks may be added, or existing tracks removed, using
* method. Additional tracks may be added, or existing tracks removed, * {@link #createTrack} and {@link #deleteTrack}.
* using <code>{@link #createTrack}</code> and <code>{@link #deleteTrack}</code>.
*
* @param divisionType the timing division type (PPQ or one of the SMPTE types)
* @param resolution the timing resolution
* @param numTracks the initial number of tracks in the sequence.
* @throws InvalidMidiDataException if <code>divisionType</code> is not valid
* *
* @param divisionType the timing division type (PPQ or one of the SMPTE
* types)
* @param resolution the timing resolution
* @param numTracks the initial number of tracks in the sequence
* @throws InvalidMidiDataException if {@code divisionType} is not valid
* @see #PPQ * @see #PPQ
* @see #SMPTE_24 * @see #SMPTE_24
* @see #SMPTE_25 * @see #SMPTE_25
@ -206,11 +209,10 @@ public class Sequence {
} }
} }
/** /**
* Obtains the timing division type for this sequence. * Obtains the timing division type for this sequence.
* @return the division type (PPQ or one of the SMPTE types)
* *
* @return the division type (PPQ or one of the SMPTE types)
* @see #PPQ * @see #PPQ
* @see #SMPTE_24 * @see #SMPTE_24
* @see #SMPTE_25 * @see #SMPTE_25
@ -223,11 +225,10 @@ public class Sequence {
return divisionType; return divisionType;
} }
/** /**
* Obtains the timing resolution for this sequence. * Obtains the timing resolution for this sequence. If the sequence's
* If the sequence's division type is PPQ, the resolution is specified in ticks per beat. * division type is PPQ, the resolution is specified in ticks per beat. For
* For SMTPE timing, the resolution is specified in ticks per frame. * SMTPE timing, the resolution is specified in ticks per frame.
* *
* @return the number of ticks per beat (PPQ) or per frame (SMPTE) * @return the number of ticks per beat (PPQ) or per frame (SMPTE)
* @see #getDivisionType * @see #getDivisionType
@ -238,13 +239,13 @@ public class Sequence {
return resolution; return resolution;
} }
/** /**
* Creates a new, initially empty track as part of this sequence. * Creates a new, initially empty track as part of this sequence. The track
* The track initially contains the meta-event End of Track. * initially contains the meta-event End of Track. The newly created track
* The newly created track is returned. All tracks in the sequence * is returned. All tracks in the sequence may be retrieved using
* may be retrieved using <code>{@link #getTracks}</code>. Tracks may be * {@link #getTracks}. Tracks may be removed from the sequence using
* removed from the sequence using <code>{@link #deleteTrack}</code>. * {@link #deleteTrack}.
*
* @return the newly created track * @return the newly created track
*/ */
public Track createTrack() { public Track createTrack() {
@ -255,13 +256,12 @@ public class Sequence {
return track; return track;
} }
/** /**
* Removes the specified track from the sequence. * Removes the specified track from the sequence.
* @param track the track to remove
* @return <code>true</code> if the track existed in the track and was removed,
* otherwise <code>false</code>.
* *
* @param track the track to remove
* @return {@code true} if the track existed in the track and was removed,
* otherwise {@code false}
* @see #createTrack * @see #createTrack
* @see #getTracks * @see #getTracks
*/ */
@ -273,12 +273,11 @@ public class Sequence {
} }
} }
/** /**
* Obtains an array containing all the tracks in this sequence. * Obtains an array containing all the tracks in this sequence. If the
* If the sequence contains no tracks, an array of length 0 is returned. * sequence contains no tracks, an array of length 0 is returned.
* @return the array of tracks
* *
* @return the array of tracks
* @see #createTrack * @see #createTrack
* @see #deleteTrack * @see #deleteTrack
*/ */
@ -287,22 +286,20 @@ public class Sequence {
return tracks.toArray(new Track[tracks.size()]); return tracks.toArray(new Track[tracks.size()]);
} }
/** /**
* Obtains the duration of this sequence, expressed in microseconds. * Obtains the duration of this sequence, expressed in microseconds.
* @return this sequence's duration in microseconds. *
* @return this sequence's duration in microseconds
*/ */
public long getMicrosecondLength() { public long getMicrosecondLength() {
return com.sun.media.sound.MidiUtils.tick2microsecond(this, getTickLength(), null); return com.sun.media.sound.MidiUtils.tick2microsecond(this, getTickLength(), null);
} }
/** /**
* Obtains the duration of this sequence, expressed in MIDI ticks. * Obtains the duration of this sequence, expressed in MIDI ticks.
* *
* @return this sequence's length in ticks * @return this sequence's length in ticks
*
* @see #getMicrosecondLength * @see #getMicrosecondLength
*/ */
public long getTickLength() { public long getTickLength() {
@ -321,15 +318,12 @@ public class Sequence {
} }
} }
/** /**
* Obtains a list of patches referenced in this sequence. * Obtains a list of patches referenced in this sequence. This patch list
* This patch list may be used to load the required * may be used to load the required {@link Instrument} objects into a
* <code>{@link Instrument}</code> objects * {@link Synthesizer}.
* into a <code>{@link Synthesizer}</code>.
*
* @return an array of <code>{@link Patch}</code> objects used in this sequence
* *
* @return an array of {@link Patch} objects used in this sequence
* @see Synthesizer#loadInstruments(Soundbank, Patch[]) * @see Synthesizer#loadInstruments(Soundbank, Patch[])
*/ */
public Patch[] getPatchList() { public Patch[] getPatchList() {

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -26,156 +26,158 @@
package javax.sound.midi; package javax.sound.midi;
/** /**
* A <code>ShortMessage</code> contains a MIDI message that has at most * A {@code ShortMessage} contains a MIDI message that has at most two data
* two data bytes following its status byte. The types of MIDI message * bytes following its status byte. The types of MIDI message that satisfy this
* that satisfy this criterion are channel voice, channel mode, system common, * criterion are channel voice, channel mode, system common, and system
* and system real-time--in other words, everything except system exclusive * real-time--in other words, everything except system exclusive and
* and meta-events. The <code>ShortMessage</code> class provides methods * meta-events. The {@code ShortMessage} class provides methods for getting and
* for getting and setting the contents of the MIDI message. * setting the contents of the MIDI message.
* <p> * <p>
* A number of <code>ShortMessage</code> methods have integer parameters by which * A number of {@code ShortMessage} methods have integer parameters by which you
* you specify a MIDI status or data byte. If you know the numeric value, you * specify a MIDI status or data byte. If you know the numeric value, you can
* can express it directly. For system common and system real-time messages, * express it directly. For system common and system real-time messages, you can
* you can often use the corresponding fields of <code>ShortMessage</code>, such as * often use the corresponding fields of {@code ShortMessage}, such as
* {@link #SYSTEM_RESET SYSTEM_RESET}. For channel messages, * {@link #SYSTEM_RESET SYSTEM_RESET}. For channel messages, the upper four bits
* the upper four bits of the status byte are specified by a command value and * of the status byte are specified by a command value and the lower four bits
* the lower four bits are specified by a MIDI channel number. To * are specified by a MIDI channel number. To convert incoming MIDI data bytes
* convert incoming MIDI data bytes that are in the form of Java's signed bytes, * that are in the form of Java's signed bytes, you can use the
* you can use the <A HREF="MidiMessage.html#integersVsBytes">conversion code</A> * <a href="MidiMessage.html#integersVsBytes">conversion code</a> given in the
* given in the <code>{@link MidiMessage}</code> class description. * {@link MidiMessage} class description.
*
* @see SysexMessage
* @see MetaMessage
* *
* @author David Rivas * @author David Rivas
* @author Kara Kytle * @author Kara Kytle
* @author Florian Bomers * @author Florian Bomers
* @see SysexMessage
* @see MetaMessage
*/ */
public class ShortMessage extends MidiMessage { public class ShortMessage extends MidiMessage {
// Status byte defines // Status byte defines
// System common messages // System common messages
/** /**
* Status byte for MIDI Time Code Quarter Frame message (0xF1, or 241). * Status byte for MIDI Time Code Quarter Frame message (0xF1, or 241).
*
* @see MidiMessage#getStatus * @see MidiMessage#getStatus
*/ */
public static final int MIDI_TIME_CODE = 0xF1; // 241 public static final int MIDI_TIME_CODE = 0xF1; // 241
/** /**
* Status byte for Song Position Pointer message (0xF2, or 242). * Status byte for Song Position Pointer message (0xF2, or 242).
*
* @see MidiMessage#getStatus * @see MidiMessage#getStatus
*/ */
public static final int SONG_POSITION_POINTER = 0xF2; // 242 public static final int SONG_POSITION_POINTER = 0xF2; // 242
/** /**
* Status byte for MIDI Song Select message (0xF3, or 243). * Status byte for MIDI Song Select message (0xF3, or 243).
*
* @see MidiMessage#getStatus * @see MidiMessage#getStatus
*/ */
public static final int SONG_SELECT = 0xF3; // 243 public static final int SONG_SELECT = 0xF3; // 243
/** /**
* Status byte for Tune Request message (0xF6, or 246). * Status byte for Tune Request message (0xF6, or 246).
*
* @see MidiMessage#getStatus * @see MidiMessage#getStatus
*/ */
public static final int TUNE_REQUEST = 0xF6; // 246 public static final int TUNE_REQUEST = 0xF6; // 246
/** /**
* Status byte for End of System Exclusive message (0xF7, or 247). * Status byte for End of System Exclusive message (0xF7, or 247).
*
* @see MidiMessage#getStatus * @see MidiMessage#getStatus
*/ */
public static final int END_OF_EXCLUSIVE = 0xF7; // 247 public static final int END_OF_EXCLUSIVE = 0xF7; // 247
// System real-time messages // System real-time messages
/** /**
* Status byte for Timing Clock message (0xF8, or 248). * Status byte for Timing Clock message (0xF8, or 248).
*
* @see MidiMessage#getStatus * @see MidiMessage#getStatus
*/ */
public static final int TIMING_CLOCK = 0xF8; // 248 public static final int TIMING_CLOCK = 0xF8; // 248
/** /**
* Status byte for Start message (0xFA, or 250). * Status byte for Start message (0xFA, or 250).
*
* @see MidiMessage#getStatus * @see MidiMessage#getStatus
*/ */
public static final int START = 0xFA; // 250 public static final int START = 0xFA; // 250
/** /**
* Status byte for Continue message (0xFB, or 251). * Status byte for Continue message (0xFB, or 251).
*
* @see MidiMessage#getStatus * @see MidiMessage#getStatus
*/ */
public static final int CONTINUE = 0xFB; // 251 public static final int CONTINUE = 0xFB; // 251
/** /**
* Status byte for Stop message (0xFC, or 252). * Status byte for Stop message (0xFC, or 252).
*
* @see MidiMessage#getStatus * @see MidiMessage#getStatus
*/ */
public static final int STOP = 0xFC; //252 public static final int STOP = 0xFC; //252
/** /**
* Status byte for Active Sensing message (0xFE, or 254). * Status byte for Active Sensing message (0xFE, or 254).
*
* @see MidiMessage#getStatus * @see MidiMessage#getStatus
*/ */
public static final int ACTIVE_SENSING = 0xFE; // 254 public static final int ACTIVE_SENSING = 0xFE; // 254
/** /**
* Status byte for System Reset message (0xFF, or 255). * Status byte for System Reset message (0xFF, or 255).
*
* @see MidiMessage#getStatus * @see MidiMessage#getStatus
*/ */
public static final int SYSTEM_RESET = 0xFF; // 255 public static final int SYSTEM_RESET = 0xFF; // 255
// Channel voice message upper nibble defines // Channel voice message upper nibble defines
/** /**
* Command value for Note Off message (0x80, or 128) * Command value for Note Off message (0x80, or 128).
*/ */
public static final int NOTE_OFF = 0x80; // 128 public static final int NOTE_OFF = 0x80; // 128
/** /**
* Command value for Note On message (0x90, or 144) * Command value for Note On message (0x90, or 144).
*/ */
public static final int NOTE_ON = 0x90; // 144 public static final int NOTE_ON = 0x90; // 144
/** /**
* Command value for Polyphonic Key Pressure (Aftertouch) message (0xA0, or 160) * Command value for Polyphonic Key Pressure (Aftertouch) message (0xA0, or
* 160).
*/ */
public static final int POLY_PRESSURE = 0xA0; // 160 public static final int POLY_PRESSURE = 0xA0; // 160
/** /**
* Command value for Control Change message (0xB0, or 176) * Command value for Control Change message (0xB0, or 176).
*/ */
public static final int CONTROL_CHANGE = 0xB0; // 176 public static final int CONTROL_CHANGE = 0xB0; // 176
/** /**
* Command value for Program Change message (0xC0, or 192) * Command value for Program Change message (0xC0, or 192).
*/ */
public static final int PROGRAM_CHANGE = 0xC0; // 192 public static final int PROGRAM_CHANGE = 0xC0; // 192
/** /**
* Command value for Channel Pressure (Aftertouch) message (0xD0, or 208) * Command value for Channel Pressure (Aftertouch) message (0xD0, or 208).
*/ */
public static final int CHANNEL_PRESSURE = 0xD0; // 208 public static final int CHANNEL_PRESSURE = 0xD0; // 208
/** /**
* Command value for Pitch Bend message (0xE0, or 224) * Command value for Pitch Bend message (0xE0, or 224).
*/ */
public static final int PITCH_BEND = 0xE0; // 224 public static final int PITCH_BEND = 0xE0; // 224
// Instance variables
/** /**
* Constructs a new <code>ShortMessage</code>. The * Constructs a new {@code ShortMessage}. The contents of the new message
* contents of the new message are guaranteed to specify * are guaranteed to specify a valid MIDI message. Subsequently, you may set
* a valid MIDI message. Subsequently, you may set the * the contents of the message using one of the {@code setMessage} methods.
* contents of the message using one of the <code>setMessage</code> *
* methods.
* @see #setMessage * @see #setMessage
*/ */
public ShortMessage() { public ShortMessage() {
@ -188,14 +190,13 @@ public class ShortMessage extends MidiMessage {
} }
/** /**
* Constructs a new {@code ShortMessage} which represents a MIDI * Constructs a new {@code ShortMessage} which represents a MIDI message
* message that takes no data bytes. * that takes no data bytes. The contents of the message can be changed by
* The contents of the message can be changed by using one of * using one of the {@code setMessage} methods.
* the {@code setMessage} methods.
* *
* @param status the MIDI status byte * @param status the MIDI status byte
* @throws InvalidMidiDataException if {@code status} does not specify * @throws InvalidMidiDataException if {@code status} does not specify a
* a valid MIDI status byte for a message that requires no data bytes * valid MIDI status byte for a message that requires no data bytes
* @see #setMessage(int) * @see #setMessage(int)
* @see #setMessage(int, int, int) * @see #setMessage(int, int, int)
* @see #setMessage(int, int, int, int) * @see #setMessage(int, int, int, int)
@ -210,16 +211,15 @@ public class ShortMessage extends MidiMessage {
/** /**
* Constructs a new {@code ShortMessage} which represents a MIDI message * Constructs a new {@code ShortMessage} which represents a MIDI message
* that takes up to two data bytes. If the message only takes one data byte, * that takes up to two data bytes. If the message only takes one data byte,
* the second data byte is ignored. If the message does not take * the second data byte is ignored. If the message does not take any data
* any data bytes, both data bytes are ignored. * bytes, both data bytes are ignored. The contents of the message can be
* The contents of the message can be changed by using one of * changed by using one of the {@code setMessage} methods.
* the {@code setMessage} methods.
* *
* @param status the MIDI status byte * @param status the MIDI status byte
* @param data1 the first data byte * @param data1 the first data byte
* @param data2 the second data byte * @param data2 the second data byte
* @throws InvalidMidiDataException if the status byte or all data bytes * @throws InvalidMidiDataException if the status byte or all data bytes
* belonging to the message do not specify a valid MIDI message * belonging to the message do not specify a valid MIDI message
* @see #setMessage(int) * @see #setMessage(int)
* @see #setMessage(int, int, int) * @see #setMessage(int, int, int)
* @see #setMessage(int, int, int, int) * @see #setMessage(int, int, int, int)
@ -235,20 +235,19 @@ public class ShortMessage extends MidiMessage {
} }
/** /**
* Constructs a new {@code ShortMessage} which represents a channel * Constructs a new {@code ShortMessage} which represents a channel MIDI
* MIDI message that takes up to two data bytes. If the message only takes * message that takes up to two data bytes. If the message only takes one
* one data byte, the second data byte is ignored. If the message does not * data byte, the second data byte is ignored. If the message does not take
* take any data bytes, both data bytes are ignored. * any data bytes, both data bytes are ignored. The contents of the message
* The contents of the message can be changed by using one of * can be changed by using one of the {@code setMessage} methods.
* the {@code setMessage} methods.
* *
* @param command the MIDI command represented by this message * @param command the MIDI command represented by this message
* @param channel the channel associated with the message * @param channel the channel associated with the message
* @param data1 the first data byte * @param data1 the first data byte
* @param data2 the second data byte * @param data2 the second data byte
* @throws InvalidMidiDataException if the command value, channel value * @throws InvalidMidiDataException if the command value, channel value or
* or all data bytes belonging to the message do not specify * all data bytes belonging to the message do not specify a valid
* a valid MIDI message * MIDI message
* @see #setMessage(int) * @see #setMessage(int)
* @see #setMessage(int, int, int) * @see #setMessage(int, int, int)
* @see #setMessage(int, int, int, int) * @see #setMessage(int, int, int, int)
@ -264,12 +263,11 @@ public class ShortMessage extends MidiMessage {
setMessage(command, channel, data1, data2); setMessage(command, channel, data1, data2);
} }
/** /**
* Constructs a new <code>ShortMessage</code>. * Constructs a new {@code ShortMessage}.
* @param data an array of bytes containing the complete message. *
* The message data may be changed using the <code>setMessage</code> * @param data an array of bytes containing the complete message. The
* method. * message data may be changed using the {@code setMessage} method.
* @see #setMessage * @see #setMessage
*/ */
// $$fb this should throw an Exception in case of an illegal message! // $$fb this should throw an Exception in case of an illegal message!
@ -279,12 +277,12 @@ public class ShortMessage extends MidiMessage {
super(data); super(data);
} }
/** /**
* Sets the parameters for a MIDI message that takes no data bytes. * Sets the parameters for a MIDI message that takes no data bytes.
* @param status the MIDI status byte *
* @throws InvalidMidiDataException if <code>status</code> does not * @param status the MIDI status byte
* specify a valid MIDI status byte for a message that requires no data bytes. * @throws InvalidMidiDataException if {@code status} does not specify a
* valid MIDI status byte for a message that requires no data bytes
* @see #setMessage(int, int, int) * @see #setMessage(int, int, int)
* @see #setMessage(int, int, int, int) * @see #setMessage(int, int, int, int)
*/ */
@ -297,19 +295,17 @@ public class ShortMessage extends MidiMessage {
setMessage(status, 0, 0); setMessage(status, 0, 0);
} }
/** /**
* Sets the parameters for a MIDI message that takes one or two data * Sets the parameters for a MIDI message that takes one or two data bytes.
* bytes. If the message takes only one data byte, the second data * If the message takes only one data byte, the second data byte is ignored;
* byte is ignored; if the message does not take any data bytes, both * if the message does not take any data bytes, both data bytes are ignored.
* data bytes are ignored.
* *
* @param status the MIDI status byte * @param status the MIDI status byte
* @param data1 the first data byte * @param data1 the first data byte
* @param data2 the second data byte * @param data2 the second data byte
* @throws InvalidMidiDataException if the * @throws InvalidMidiDataException if the the status byte, or all data
* the status byte, or all data bytes belonging to the message, do * bytes belonging to the message, do not specify a valid MIDI
* not specify a valid MIDI message. * message
* @see #setMessage(int, int, int, int) * @see #setMessage(int, int, int, int)
* @see #setMessage(int) * @see #setMessage(int)
*/ */
@ -345,22 +341,18 @@ public class ShortMessage extends MidiMessage {
} }
} }
/** /**
* Sets the short message parameters for a channel message * Sets the short message parameters for a channel message which takes up to
* which takes up to two data bytes. If the message only * two data bytes. If the message only takes one data byte, the second data
* takes one data byte, the second data byte is ignored; if * byte is ignored; if the message does not take any data bytes, both data
* the message does not take any data bytes, both data bytes * bytes are ignored.
* are ignored.
*
* @param command the MIDI command represented by this message
* @param channel the channel associated with the message
* @param data1 the first data byte
* @param data2 the second data byte
* @throws InvalidMidiDataException if the
* status byte or all data bytes belonging to the message, do
* not specify a valid MIDI message
* *
* @param command the MIDI command represented by this message
* @param channel the channel associated with the message
* @param data1 the first data byte
* @param data2 the second data byte
* @throws InvalidMidiDataException if the status byte or all data bytes
* belonging to the message, do not specify a valid MIDI message
* @see #setMessage(int, int, int) * @see #setMessage(int, int, int)
* @see #setMessage(int) * @see #setMessage(int)
* @see #getCommand * @see #getCommand
@ -379,12 +371,12 @@ public class ShortMessage extends MidiMessage {
setMessage((command & 0xF0) | (channel & 0x0F), data1, data2); setMessage((command & 0xF0) | (channel & 0x0F), data1, data2);
} }
/** /**
* Obtains the MIDI channel associated with this event. This method * Obtains the MIDI channel associated with this event. This method assumes
* assumes that the event is a MIDI channel message; if not, the return * that the event is a MIDI channel message; if not, the return value will
* value will not be meaningful. * not be meaningful.
* @return MIDI channel associated with the message. *
* @return MIDI channel associated with the message
* @see #setMessage(int, int, int, int) * @see #setMessage(int, int, int, int)
*/ */
public int getChannel() { public int getChannel() {
@ -392,11 +384,11 @@ public class ShortMessage extends MidiMessage {
return (getStatus() & 0x0F); return (getStatus() & 0x0F);
} }
/** /**
* Obtains the MIDI command associated with this event. This method * Obtains the MIDI command associated with this event. This method assumes
* assumes that the event is a MIDI channel message; if not, the return * that the event is a MIDI channel message; if not, the return value will
* value will not be meaningful. * not be meaningful.
*
* @return the MIDI command associated with this event * @return the MIDI command associated with this event
* @see #setMessage(int, int, int, int) * @see #setMessage(int, int, int, int)
*/ */
@ -405,10 +397,10 @@ public class ShortMessage extends MidiMessage {
return (getStatus() & 0xF0); return (getStatus() & 0xF0);
} }
/** /**
* Obtains the first data byte in the message. * Obtains the first data byte in the message.
* @return the value of the <code>data1</code> field *
* @return the value of the {@code data1} field
* @see #setMessage(int, int, int) * @see #setMessage(int, int, int)
*/ */
public int getData1() { public int getData1() {
@ -418,10 +410,10 @@ public class ShortMessage extends MidiMessage {
return 0; return 0;
} }
/** /**
* Obtains the second data byte in the message. * Obtains the second data byte in the message.
* @return the value of the <code>data2</code> field *
* @return the value of the {@code data2} field
* @see #setMessage(int, int, int) * @see #setMessage(int, int, int)
*/ */
public int getData2() { public int getData2() {
@ -431,11 +423,11 @@ public class ShortMessage extends MidiMessage {
return 0; return 0;
} }
/** /**
* Creates a new object of the same class and with the same contents * Creates a new object of the same class and with the same contents as this
* as this object. * object.
* @return a clone of this instance. *
* @return a clone of this instance
*/ */
public Object clone() { public Object clone() {
byte[] newData = new byte[length]; byte[] newData = new byte[length];
@ -445,15 +437,15 @@ public class ShortMessage extends MidiMessage {
return msg; return msg;
} }
/** /**
* Retrieves the number of data bytes associated with a particular * Retrieves the number of data bytes associated with a particular status
* status byte value. * byte value.
* @param status status byte value, which must represent a short MIDI message *
* @param status status byte value, which must represent a short MIDI
* message
* @return data length in bytes (0, 1, or 2) * @return data length in bytes (0, 1, or 2)
* @throws InvalidMidiDataException if the * @throws InvalidMidiDataException if the {@code status} argument does not
* <code>status</code> argument does not represent the status byte for any * represent the status byte for any short message
* short message
*/ */
protected final int getDataLength(int status) throws InvalidMidiDataException { protected final int getDataLength(int status) throws InvalidMidiDataException {
// system common and system real-time messages // system common and system real-time messages

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -25,109 +25,101 @@
package javax.sound.midi; package javax.sound.midi;
import java.net.URL;
/** /**
* A <code>Soundbank</code> contains a set of <code>Instruments</code> * A {@code Soundbank} contains a set of {@code Instruments} that can be loaded
* that can be loaded into a <code>Synthesizer</code>. * into a {@code Synthesizer}. Note that a Java Sound {@code Soundbank} is
* Note that a Java Sound <code>Soundbank</code> is different from a MIDI bank. * different from a MIDI bank. MIDI permits up to 16383 banks, each containing
* MIDI permits up to 16383 banks, each containing up to 128 instruments * up to 128 instruments (also sometimes called programs, patches, or timbres).
* (also sometimes called programs, patches, or timbres). * However, a {@code Soundbank} can contain 16383 times 128 instruments, because
* However, a <code>Soundbank</code> can contain 16383 times 128 instruments, * the instruments within a {@code Soundbank} are indexed by both a MIDI program
* because the instruments within a <code>Soundbank</code> are indexed by both * number and a MIDI bank number (via a {@code Patch} object). Thus, a
* a MIDI program number and a MIDI bank number (via a <code>Patch</code> * {@code Soundbank} can be thought of as a collection of MIDI banks.
* object). Thus, a <code>Soundbank</code> can be thought of as a collection
* of MIDI banks.
* <p> * <p>
* <code>Soundbank</code> includes methods that return <code>String</code> * {@code Soundbank} includes methods that return {@code String} objects
* objects containing the sound bank's name, manufacturer, version number, and * containing the sound bank's name, manufacturer, version number, and
* description. The precise content and format of these strings is left * description. The precise content and format of these strings is left to the
* to the implementor. * implementor.
* <p> * <p>
* Different synthesizers use a variety of synthesis techniques. A common * Different synthesizers use a variety of synthesis techniques. A common one is
* one is wavetable synthesis, in which a segment of recorded sound is * wavetable synthesis, in which a segment of recorded sound is played back,
* played back, often with looping and pitch change. The Downloadable Sound * often with looping and pitch change. The Downloadable Sound (DLS) format uses
* (DLS) format uses segments of recorded sound, as does the Headspace Engine. * segments of recorded sound, as does the Headspace Engine. {@code Soundbanks}
* <code>Soundbanks</code> and <code>Instruments</code> that are based on * and {@code Instruments} that are based on wavetable synthesis (or other uses
* wavetable synthesis (or other uses of stored sound recordings) should * of stored sound recordings) should typically implement the
* typically implement the <code>getResources()</code> * {@code getResources()} method to provide access to these recorded segments.
* method to provide access to these recorded segments. This is optional, * This is optional, however; the method can return an zero-length array if the
* however; the method can return an zero-length array if the synthesis technique * synthesis technique doesn't use sampled sound (FM synthesis and physical
* doesn't use sampled sound (FM synthesis and physical modeling are examples * modeling are examples of such techniques), or if it does but the implementor
* of such techniques), or if it does but the implementor chooses not to make the * chooses not to make the samples accessible.
* samples accessible.
* *
* @author David Rivas
* @author Kara Kytle
* @see Synthesizer#getDefaultSoundbank * @see Synthesizer#getDefaultSoundbank
* @see Synthesizer#isSoundbankSupported * @see Synthesizer#isSoundbankSupported
* @see Synthesizer#loadInstruments(Soundbank, Patch[]) * @see Synthesizer#loadInstruments(Soundbank, Patch[])
* @see Patch * @see Patch
* @see Instrument * @see Instrument
* @see SoundbankResource * @see SoundbankResource
*
* @author David Rivas
* @author Kara Kytle
*/ */
public interface Soundbank { public interface Soundbank {
/** /**
* Obtains the name of the sound bank. * Obtains the name of the sound bank.
* @return a <code>String</code> naming the sound bank *
* @return a {@code String} naming the sound bank
*/ */
public String getName(); String getName();
/** /**
* Obtains the version string for the sound bank. * Obtains the version string for the sound bank.
* @return a <code>String</code> that indicates the sound bank's version *
* @return a {@code String} that indicates the sound bank's version
*/ */
public String getVersion(); String getVersion();
/** /**
* Obtains a <code>string</code> naming the company that provides the * Obtains a {@code string} naming the company that provides the sound bank.
* sound bank *
* @return the vendor string * @return the vendor string
*/ */
public String getVendor(); String getVendor();
/** /**
* Obtains a textual description of the sound bank, suitable for display. * Obtains a textual description of the sound bank, suitable for display.
* @return a <code>String</code> that describes the sound bank *
* @return a {@code String} that describes the sound bank
*/ */
public String getDescription(); String getDescription();
/** /**
* Extracts a list of non-Instrument resources contained in the sound bank. * Extracts a list of non-Instrument resources contained in the sound bank.
* @return an array of resources, excluding instruments. If the sound bank contains *
* no resources (other than instruments), returns an array of length 0. * @return an array of resources, excluding instruments. If the sound bank
* contains no resources (other than instruments), returns an array
* of length 0.
*/ */
public SoundbankResource[] getResources(); SoundbankResource[] getResources();
/** /**
* Obtains a list of instruments contained in this sound bank. * Obtains a list of instruments contained in this sound bank.
* @return an array of the <code>Instruments</code> in this
* <code>SoundBank</code>
* If the sound bank contains no instruments, returns an array of length 0.
* *
* @return an array of the {@code Instruments} in this {@code SoundBank}. If
* the sound bank contains no instruments, returns an array of
* length 0.
* @see Synthesizer#getLoadedInstruments * @see Synthesizer#getLoadedInstruments
* @see #getInstrument(Patch) * @see #getInstrument(Patch)
*/ */
public Instrument[] getInstruments(); Instrument[] getInstruments();
/** /**
* Obtains an <code>Instrument</code> from the given <code>Patch</code>. * Obtains an {@code Instrument} from the given {@code Patch}.
* @param patch a <code>Patch</code> object specifying the bank index
* and program change number
* @return the requested instrument, or <code>null</code> if the
* sound bank doesn't contain that instrument
* *
* @param patch a {@code Patch} object specifying the bank index and
* program change number
* @return the requested instrument, or {@code null} if the sound bank
* doesn't contain that instrument
* @see #getInstruments * @see #getInstruments
* @see Synthesizer#loadInstruments(Soundbank, Patch[]) * @see Synthesizer#loadInstruments(Soundbank, Patch[])
*/ */
public Instrument getInstrument(Patch patch); Instrument getInstrument(Patch patch);
} }

View file

@ -25,81 +25,72 @@
package javax.sound.midi; package javax.sound.midi;
import javax.sound.sampled.AudioInputStream;
/** /**
* A <code>SoundbankResource</code> represents any audio resource stored * A {@code SoundbankResource} represents any audio resource stored in a
* in a <code>{@link Soundbank}</code>. Common soundbank resources include: * {@link Soundbank}. Common soundbank resources include:
* <ul> * <ul>
* <li>Instruments. An instrument may be specified in a variety of * <li>Instruments. An instrument may be specified in a variety of ways.
* ways. However, all soundbanks have some mechanism for defining * However, all soundbanks have some mechanism for defining instruments. In
* instruments. In doing so, they may reference other resources * doing so, they may reference other resources stored in the soundbank. Each
* stored in the soundbank. Each instrument has a <code>Patch</code> * instrument has a {@code Patch} which specifies the MIDI program and bank by
* which specifies the MIDI program and bank by which it may be * which it may be referenced in MIDI messages. Instrument information may be
* referenced in MIDI messages. Instrument information may be * stored in {@link Instrument} objects.</li>
* stored in <code>{@link Instrument}</code> objects. * <li>Audio samples. A sample typically is a sampled audio waveform which
* <li>Audio samples. A sample typically is a sampled audio waveform * contains a short sound recording whose duration is a fraction of a second, or
* which contains a short sound recording whose duration is a fraction of * at most a few seconds. These audio samples may be used by a
* a second, or at most a few seconds. These audio samples may be * {@link Synthesizer} to synthesize sound in response to MIDI commands, or
* used by a <code>{@link Synthesizer}</code> to synthesize sound in response to MIDI * extracted for use by an application. (The terminology reflects musicians' use
* commands, or extracted for use by an application. * of the word "sample" to refer collectively to a series of contiguous audio
* (The terminology reflects musicians' use of the word "sample" to refer * samples or frames, rather than to a single, instantaneous sample.) The data
* collectively to a series of contiguous audio samples or frames, rather than * class for an audio sample will be an object that encapsulates the audio
* to a single, instantaneous sample.) * sample data itself and information about how to interpret it (the format of
* The data class for an audio sample will be an object * the audio data), such as an {@link AudioInputStream}.</li>
* that encapsulates the audio sample data itself and information * <li>Embedded sequences. A sound bank may contain built-in song data stored in
* about how to interpret it (the format of the audio data), such * a data object such as a {@link Sequence}.</li>
* as an <code>{@link javax.sound.sampled.AudioInputStream}</code>. </li>
* <li>Embedded sequences. A sound bank may contain built-in
* song data stored in a data object such as a <code>{@link Sequence}</code>.
* </ul> * </ul>
* <p> * Synthesizers that use wavetable synthesis or related techniques play back the
* Synthesizers that use wavetable synthesis or related * audio in a sample when synthesizing notes, often when emulating the
* techniques play back the audio in a sample when * real-world instrument that was originally recorded. However, there is not
* synthesizing notes, often when emulating the real-world instrument that * necessarily a one-to-one correspondence between the {@code Instruments} and
* was originally recorded. However, there is not necessarily a one-to-one * samples in a {@code Soundbank}. A single {@code Instrument} can use multiple
* correspondence between the <code>Instruments</code> and samples * SoundbankResources (typically for notes of dissimilar pitch or brightness).
* in a <code>Soundbank</code>. A single <code>Instrument</code> can use * Also, more than one {@code Instrument} can use the same sample.
* multiple SoundbankResources (typically for notes of dissimilar pitch or
* brightness). Also, more than one <code>Instrument</code> can use the same
* sample.
* *
* @author Kara Kytle * @author Kara Kytle
*/ */
public abstract class SoundbankResource { public abstract class SoundbankResource {
/** /**
* The sound bank that contains the <code>SoundbankResources</code> * The sound bank that contains the {@code SoundbankResources}.
*/ */
private final Soundbank soundBank; private final Soundbank soundBank;
/** /**
* The name of the <code>SoundbankResource</code> * The name of the {@code SoundbankResource}.
*/ */
private final String name; private final String name;
/** /**
* The class used to represent the sample's data. * The class used to represent the sample's data.
*/ */
private final Class<?> dataClass; private final Class<?> dataClass;
/** /**
* The wavetable index. * The wavetable index.
*/ */
//private final int index; //private final int index;
/** /**
* Constructs a new <code>SoundbankResource</code> from the given sound bank * Constructs a new {@code SoundbankResource} from the given sound bank and
* and wavetable index. (Setting the <code>SoundbankResource's</code> name, * wavetable index. (Setting the {@code SoundbankResource's} name, sampled
* sampled audio data, and instruments is a subclass responsibility.) * audio data, and instruments is a subclass responsibility.)
* @param soundBank the sound bank containing this <code>SoundbankResource</code>
* @param name the name of the sample
* @param dataClass the class used to represent the sample's data
* *
* @param soundBank the sound bank containing this
* {@code SoundbankResource}
* @param name the name of the sample
* @param dataClass the class used to represent the sample's data
* @see #getSoundbank * @see #getSoundbank
* @see #getName * @see #getName
* @see #getDataClass * @see #getDataClass
@ -112,65 +103,65 @@ public abstract class SoundbankResource {
this.dataClass = dataClass; this.dataClass = dataClass;
} }
/** /**
* Obtains the sound bank that contains this <code>SoundbankResource</code>. * Obtains the sound bank that contains this {@code SoundbankResource}.
* @return the sound bank in which this <code>SoundbankResource</code> is stored *
* @return the sound bank in which this {@code SoundbankResource} is stored
*/ */
public Soundbank getSoundbank() { public Soundbank getSoundbank() {
return soundBank; return soundBank;
} }
/** /**
* Obtains the name of the resource. This should generally be a string * Obtains the name of the resource. This should generally be a string
* descriptive of the resource. * descriptive of the resource.
*
* @return the instrument's name * @return the instrument's name
*/ */
public String getName() { public String getName() {
return name; return name;
} }
/** /**
* Obtains the class used by this sample to represent its data. * Obtains the class used by this sample to represent its data. The object
* The object returned by <code>getData</code> will be of this * returned by {@code getData} will be of this class. If this
* class. If this <code>SoundbankResource</code> object does not support * {@code SoundbankResource} object does not support direct access to its
* direct access to its data, returns <code>null</code>. * data, returns {@code null}.
* @return the class used to represent the sample's data, or *
* null if the data is not accessible * @return the class used to represent the sample's data, or null if the
* data is not accessible
*/ */
public Class<?> getDataClass() { public Class<?> getDataClass() {
return dataClass; return dataClass;
} }
/** /**
* Obtains the sampled audio that is stored in this <code>SoundbankResource</code>. * Obtains the sampled audio that is stored in this
* The type of object returned depends on the implementation of the * {@code SoundbankResource}. The type of object returned depends on the
* concrete class, and may be queried using <code>getDataClass</code>. * implementation of the concrete class, and may be queried using
* {@code getDataClass}.
*
* @return an object containing the sampled audio data * @return an object containing the sampled audio data
* @see #getDataClass * @see #getDataClass
*/ */
public abstract Object getData(); public abstract Object getData();
/** /**
* Obtains the index of this <code>SoundbankResource</code> into the * Obtains the index of this {@code SoundbankResource} into the
* <code>Soundbank's</code> set of <code>SoundbankResources</code>. * {@code Soundbank's} set of {@code SoundbankResources}.
*
* @return the wavetable index * @return the wavetable index
*/ */
//public int getIndex() { //public int getIndex() {
// return index; // return index;
//} //}
/** /**
* Obtains a list of the instruments in the sound bank that use the * Obtains a list of the instruments in the sound bank that use the
* <code>SoundbankResource</code> for sound synthesis. * {@code SoundbankResource} for sound synthesis.
* @return an array of <code>Instruments</code> that reference this
* <code>SoundbankResource</code>
* *
* @return an array of {@code Instruments} that reference this
* {@code SoundbankResource}
* @see Instrument#getSamples * @see Instrument#getSamples
*/ */
//public abstract Instrument[] getInstruments(); //public abstract Instrument[] getInstruments();

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -25,46 +25,43 @@
package javax.sound.midi; package javax.sound.midi;
import javax.sound.sampled.Control;
/** /**
* A <code>Synthesizer</code> generates sound. This usually happens when one of * A {@code Synthesizer} generates sound. This usually happens when one of the
* the <code>Synthesizer</code>'s {@link MidiChannel} objects receives a * {@code Synthesizer}'s {@link MidiChannel} objects receives a
* {@link MidiChannel#noteOn(int, int) noteOn} message, either * {@link MidiChannel#noteOn(int, int) noteOn} message, either directly or via
* directly or via the <code>Synthesizer</code> object. * the {@code Synthesizer} object. Many {@code Synthesizer}s support
* Many <code>Synthesizer</code>s support <code>Receivers</code>, through which * {@code Receivers}, through which MIDI events can be delivered to the
* MIDI events can be delivered to the <code>Synthesizer</code>. * {@code Synthesizer}. In such cases, the {@code Synthesizer} typically
* In such cases, the <code>Synthesizer</code> typically responds by sending * responds by sending a corresponding message to the appropriate
* a corresponding message to the appropriate <code>MidiChannel</code>, or by * {@code MidiChannel}, or by processing the event itself if the event isn't one
* processing the event itself if the event isn't one of the MIDI channel * of the MIDI channel messages.
* messages.
* <p> * <p>
* The <code>Synthesizer</code> interface includes methods for loading and * The {@code Synthesizer} interface includes methods for loading and unloading
* unloading instruments from soundbanks. An instrument is a specification for synthesizing a * instruments from soundbanks. An instrument is a specification for
* certain type of sound, whether that sound emulates a traditional instrument or is * synthesizing a certain type of sound, whether that sound emulates a
* some kind of sound effect or other imaginary sound. A soundbank is a collection of instruments, organized * traditional instrument or is some kind of sound effect or other imaginary
* by bank and program number (via the instrument's <code>Patch</code> object). * sound. A soundbank is a collection of instruments, organized by bank and
* Different <code>Synthesizer</code> classes might implement different sound-synthesis * program number (via the instrument's {@code Patch} object). Different
* techniques, meaning that some instruments and not others might be compatible with a * {@code Synthesizer} classes might implement different sound-synthesis
* given synthesizer. * techniques, meaning that some instruments and not others might be compatible
* Also, synthesizers may have a limited amount of memory for instruments, meaning * with a given synthesizer. Also, synthesizers may have a limited amount of
* that not every soundbank and instrument can be used by every synthesizer, even if * memory for instruments, meaning that not every soundbank and instrument can
* the synthesis technique is compatible. * be used by every synthesizer, even if the synthesis technique is compatible.
* To see whether the instruments from * To see whether the instruments from a certain soundbank can be played by a
* a certain soundbank can be played by a given synthesizer, invoke the * given synthesizer, invoke the
* {@link #isSoundbankSupported(Soundbank) isSoundbankSupported} method of * {@link #isSoundbankSupported(Soundbank) isSoundbankSupported}
* <code>Synthesizer</code>. * method of {@code Synthesizer}.
* <p> * <p>
* "Loading" an instrument means that that instrument becomes available for * "Loading" an instrument means that that instrument becomes available for
* synthesizing notes. The instrument is loaded into the bank and * synthesizing notes. The instrument is loaded into the bank and program
* program location specified by its <code>Patch</code> object. Loading does * location specified by its {@code Patch} object. Loading does not necessarily
* not necessarily mean that subsequently played notes will immediately have * mean that subsequently played notes will immediately have the sound of this
* the sound of this newly loaded instrument. For the instrument to play notes, * newly loaded instrument. For the instrument to play notes, one of the
* one of the synthesizer's <code>MidiChannel</code> objects must receive (or have received) * synthesizer's {@code MidiChannel} objects must receive (or have received) a
* a program-change message that causes that particular instrument's * program-change message that causes that particular instrument's bank and
* bank and program number to be selected. * program number to be selected.
* *
* @author Kara Kytle
* @see MidiSystem#getSynthesizer * @see MidiSystem#getSynthesizer
* @see Soundbank * @see Soundbank
* @see Instrument * @see Instrument
@ -72,107 +69,103 @@ import javax.sound.sampled.Control;
* @see Receiver * @see Receiver
* @see Transmitter * @see Transmitter
* @see MidiDevice * @see MidiDevice
*
* @author Kara Kytle
*/ */
public interface Synthesizer extends MidiDevice { public interface Synthesizer extends MidiDevice {
// SYNTHESIZER METHODS // SYNTHESIZER METHODS
/** /**
* Obtains the maximum number of notes that this synthesizer can sound simultaneously. * Obtains the maximum number of notes that this synthesizer can sound
* simultaneously.
*
* @return the maximum number of simultaneous notes * @return the maximum number of simultaneous notes
* @see #getVoiceStatus * @see #getVoiceStatus
*/ */
public int getMaxPolyphony(); int getMaxPolyphony();
/** /**
* Obtains the processing latency incurred by this synthesizer, expressed in * Obtains the processing latency incurred by this synthesizer, expressed in
* microseconds. This latency measures the worst-case delay between the * microseconds. This latency measures the worst-case delay between the time
* time a MIDI message is delivered to the synthesizer and the time that the * a MIDI message is delivered to the synthesizer and the time that the
* synthesizer actually produces the corresponding result. * synthesizer actually produces the corresponding result.
* <p> * <p>
* Although the latency is expressed in microseconds, a synthesizer's actual measured * Although the latency is expressed in microseconds, a synthesizer's actual
* delay may vary over a wider range than this resolution suggests. For example, * measured delay may vary over a wider range than this resolution suggests.
* a synthesizer might have a worst-case delay of a few milliseconds or more. * For example, a synthesizer might have a worst-case delay of a few
* milliseconds or more.
* *
* @return the worst-case delay, in microseconds * @return the worst-case delay, in microseconds
*/ */
public long getLatency(); long getLatency();
/** /**
* Obtains the set of MIDI channels controlled by this synthesizer. Each * Obtains the set of MIDI channels controlled by this synthesizer. Each
* non-null element in the returned array is a <code>MidiChannel</code> that * non-null element in the returned array is a {@code MidiChannel} that
* receives the MIDI messages sent on that channel number. * receives the MIDI messages sent on that channel number.
* <p> * <p>
* The MIDI 1.0 specification provides for 16 channels, so this * The MIDI 1.0 specification provides for 16 channels, so this method
* method returns an array of at least 16 elements. However, if this synthesizer * returns an array of at least 16 elements. However, if this synthesizer
* doesn't make use of all 16 channels, some of the elements of the array * doesn't make use of all 16 channels, some of the elements of the array
* might be <code>null</code>, so you should check each element * might be {@code null}, so you should check each element before using it.
* before using it. *
* @return an array of the <code>MidiChannel</code> objects managed by this * @return an array of the {@code MidiChannel} objects managed by this
* <code>Synthesizer</code>. Some of the array elements may be <code>null</code>. * {@code Synthesizer}. Some of the array elements may be
* {@code null}.
*/ */
public MidiChannel[] getChannels(); MidiChannel[] getChannels();
/** /**
* Obtains the current status of the voices produced by this synthesizer. * Obtains the current status of the voices produced by this synthesizer. If
* If this class of <code>Synthesizer</code> does not provide voice * this class of {@code Synthesizer} does not provide voice information, the
* information, the returned array will always be of length 0. Otherwise, * returned array will always be of length 0. Otherwise, its length is
* its length is always equal to the total number of voices, as returned by * always equal to the total number of voices, as returned by
* <code>getMaxPolyphony()</code>. (See the <code>VoiceStatus</code> class * {@code getMaxPolyphony()}. (See the {@code VoiceStatus} class description
* description for an explanation of synthesizer voices.) * for an explanation of synthesizer voices.)
* *
* @return an array of <code>VoiceStatus</code> objects that supply * @return an array of {@code VoiceStatus} objects that supply information
* information about the corresponding synthesizer voices * about the corresponding synthesizer voices
* @see #getMaxPolyphony * @see #getMaxPolyphony
* @see VoiceStatus * @see VoiceStatus
*/ */
public VoiceStatus[] getVoiceStatus(); VoiceStatus[] getVoiceStatus();
/** /**
* Informs the caller whether this synthesizer is capable of loading * Informs the caller whether this synthesizer is capable of loading
* instruments from the specified soundbank. * instruments from the specified soundbank. If the soundbank is
* If the soundbank is unsupported, any attempts to load instruments from * unsupported, any attempts to load instruments from it will result in an
* it will result in an <code>IllegalArgumentException</code>. * {@code IllegalArgumentException}.
* @param soundbank soundbank for which support is queried *
* @return <code>true</code> if the soundbank is supported, otherwise <code>false</code> * @param soundbank soundbank for which support is queried
* @return {@code true} if the soundbank is supported, otherwise
* {@code false}
* @see #loadInstruments * @see #loadInstruments
* @see #loadAllInstruments * @see #loadAllInstruments
* @see #unloadInstruments * @see #unloadInstruments
* @see #unloadAllInstruments * @see #unloadAllInstruments
* @see #getDefaultSoundbank * @see #getDefaultSoundbank
*/ */
public boolean isSoundbankSupported(Soundbank soundbank); boolean isSoundbankSupported(Soundbank soundbank);
/** /**
* Makes a particular instrument available for synthesis. This instrument * Makes a particular instrument available for synthesis. This instrument is
* is loaded into the patch location specified by its <code>Patch</code> * loaded into the patch location specified by its {@code Patch} object, so
* object, so that if a program-change message is * that if a program-change message is received (or has been received) that
* received (or has been received) that causes that patch to be selected, * causes that patch to be selected, subsequent notes will be played using
* subsequent notes will be played using the sound of * the sound of {@code instrument}. If the specified instrument is already
* <code>instrument</code>. If the specified instrument is already loaded, * loaded, this method does nothing and returns {@code true}.
* this method does nothing and returns <code>true</code>.
* <p> * <p>
* The instrument must be part of a soundbank * The instrument must be part of a soundbank that this {@code Synthesizer}
* that this <code>Synthesizer</code> supports. (To make sure, you can use * supports. (To make sure, you can use the {@code getSoundbank} method of
* the <code>getSoundbank</code> method of <code>Instrument</code> and the * {@code Instrument} and the {@code isSoundbankSupported} method of
* <code>isSoundbankSupported</code> method of <code>Synthesizer</code>.) * {@code Synthesizer}.)
* @param instrument instrument to load *
* @return <code>true</code> if the instrument is successfully loaded (or * @param instrument instrument to load
* already had been), <code>false</code> if the instrument could not be * @return {@code true} if the instrument is successfully loaded (or already
* loaded (for example, if the synthesizer has insufficient * had been), {@code false} if the instrument could not be loaded
* memory to load it) * (for example, if the synthesizer has insufficient memory to load
* @throws IllegalArgumentException if this * it)
* <code>Synthesizer</code> doesn't support the specified instrument's * @throws IllegalArgumentException if this {@code Synthesizer} doesn't
* soundbank * support the specified instrument's soundbank
* @see #unloadInstrument * @see #unloadInstrument
* @see #loadInstruments * @see #loadInstruments
* @see #loadAllInstruments * @see #loadAllInstruments
@ -180,138 +173,139 @@ public interface Synthesizer extends MidiDevice {
* @see SoundbankResource#getSoundbank * @see SoundbankResource#getSoundbank
* @see MidiChannel#programChange(int, int) * @see MidiChannel#programChange(int, int)
*/ */
public boolean loadInstrument(Instrument instrument); boolean loadInstrument(Instrument instrument);
/** /**
* Unloads a particular instrument. * Unloads a particular instrument.
* @param instrument instrument to unload *
* @throws IllegalArgumentException if this * @param instrument instrument to unload
* <code>Synthesizer</code> doesn't support the specified instrument's * @throws IllegalArgumentException if this {@code Synthesizer} doesn't
* soundbank * support the specified instrument's soundbank
* @see #loadInstrument * @see #loadInstrument
* @see #unloadInstruments * @see #unloadInstruments
* @see #unloadAllInstruments * @see #unloadAllInstruments
* @see #getLoadedInstruments * @see #getLoadedInstruments
* @see #remapInstrument * @see #remapInstrument
*/ */
public void unloadInstrument(Instrument instrument); void unloadInstrument(Instrument instrument);
/** /**
* Remaps an instrument. Instrument <code>to</code> takes the * Remaps an instrument. Instrument {@code to} takes the place of instrument
* place of instrument <code>from</code>.<br> * {@code from}.
* For example, if <code>from</code> was located at bank number 2, * <br>
* program number 11, remapping causes that bank and program location * For example, if {@code from} was located at bank number 2, program number
* to be occupied instead by <code>to</code>.<br> * 11, remapping causes that bank and program location to be occupied
* If the function succeeds, instrument <code>from</code> is unloaded. * instead by {@code to}.
* <p>To cancel the remapping reload instrument <code>from</code> by * <br>
* invoking one of {@link #loadInstrument}, {@link #loadInstruments} * If the function succeeds, instrument {@code from} is unloaded.
* or {@link #loadAllInstruments}. * <p>
* To cancel the remapping reload instrument {@code from} by invoking one of
* {@link #loadInstrument}, {@link #loadInstruments} or
* {@link #loadAllInstruments}.
* *
* @param from the <code>Instrument</code> object to be replaced * @param from the {@code Instrument} object to be replaced
* @param to the <code>Instrument</code> object to be used in place * @param to the {@code Instrument} object to be used in place of the old
* of the old instrument, it should be loaded into the synthesizer * instrument, it should be loaded into the synthesizer
* @return <code>true</code> if the instrument successfully remapped, * @return {@code true} if the instrument successfully remapped,
* <code>false</code> if feature is not implemented by synthesizer * {@code false} if feature is not implemented by synthesizer
* @throws IllegalArgumentException if instrument * @throws IllegalArgumentException if instrument {@code from} or instrument
* <code>from</code> or instrument <code>to</code> aren't supported by * {@code to} aren't supported by synthesizer or if instrument
* synthesizer or if instrument <code>to</code> is not loaded * {@code to} is not loaded
* @throws NullPointerException if <code>from</code> or * @throws NullPointerException if {@code from} or {@code to} parameters
* <code>to</code> parameters have null value * have null value
* @see #loadInstrument * @see #loadInstrument
* @see #loadInstruments * @see #loadInstruments
* @see #loadAllInstruments * @see #loadAllInstruments
*/ */
public boolean remapInstrument(Instrument from, Instrument to); boolean remapInstrument(Instrument from, Instrument to);
/** /**
* Obtains the default soundbank for the synthesizer, if one exists. * Obtains the default soundbank for the synthesizer, if one exists. (Some
* (Some synthesizers provide a default or built-in soundbank.) * synthesizers provide a default or built-in soundbank.) If a synthesizer
* If a synthesizer doesn't have a default soundbank, instruments must * doesn't have a default soundbank, instruments must be loaded explicitly
* be loaded explicitly from an external soundbank. * from an external soundbank.
* @return default soundbank, or <code>null</code> if one does not exist. *
* @return default soundbank, or {@code null} if one does not exist
* @see #isSoundbankSupported * @see #isSoundbankSupported
*/ */
public Soundbank getDefaultSoundbank(); Soundbank getDefaultSoundbank();
/** /**
* Obtains a list of instruments that come with the synthesizer. These * Obtains a list of instruments that come with the synthesizer. These
* instruments might be built into the synthesizer, or they might be * instruments might be built into the synthesizer, or they might be part of
* part of a default soundbank provided with the synthesizer, etc. * a default soundbank provided with the synthesizer, etc.
* <p> * <p>
* Note that you don't use this method to find out which instruments are * Note that you don't use this method to find out which instruments are
* currently loaded onto the synthesizer; for that purpose, you use * currently loaded onto the synthesizer; for that purpose, you use
* <code>getLoadedInstruments()</code>. * {@code getLoadedInstruments()}. Nor does the method indicate all the
* Nor does the method indicate all the instruments that can be loaded onto * instruments that can be loaded onto the synthesizer; it only indicates
* the synthesizer; it only indicates the subset that come with the synthesizer. * the subset that come with the synthesizer. To learn whether another
* To learn whether another instrument can be loaded, you can invoke * instrument can be loaded, you can invoke {@code isSoundbankSupported()},
* <code>isSoundbankSupported()</code>, and if the instrument's * and if the instrument's {@code Soundbank} is supported, you can try
* <code>Soundbank</code> is supported, you can try loading the instrument. * loading the instrument.
* *
* @return list of available instruments. If the synthesizer * @return list of available instruments. If the synthesizer has no
* has no instruments coming with it, an array of length 0 is returned. * instruments coming with it, an array of length 0 is returned.
* @see #getLoadedInstruments * @see #getLoadedInstruments
* @see #isSoundbankSupported(Soundbank) * @see #isSoundbankSupported(Soundbank)
* @see #loadInstrument * @see #loadInstrument
*/ */
public Instrument[] getAvailableInstruments(); Instrument[] getAvailableInstruments();
/** /**
* Obtains a list of the instruments that are currently loaded onto this * Obtains a list of the instruments that are currently loaded onto this
* <code>Synthesizer</code>. * {@code Synthesizer}.
*
* @return a list of currently loaded instruments * @return a list of currently loaded instruments
* @see #loadInstrument * @see #loadInstrument
* @see #getAvailableInstruments * @see #getAvailableInstruments
* @see Soundbank#getInstruments * @see Soundbank#getInstruments
*/ */
public Instrument[] getLoadedInstruments(); Instrument[] getLoadedInstruments();
/** /**
* Loads onto the <code>Synthesizer</code> all instruments contained * Loads onto the {@code Synthesizer} all instruments contained in the
* in the specified <code>Soundbank</code>. * specified {@code Soundbank}.
* @param soundbank the <code>Soundbank</code> whose are instruments are *
* to be loaded * @param soundbank the {@code Soundbank} whose are instruments are to be
* @return <code>true</code> if the instruments are all successfully loaded (or * loaded
* already had been), <code>false</code> if any instrument could not be * @return {@code true} if the instruments are all successfully loaded (or
* loaded (for example, if the <code>Synthesizer</code> had insufficient memory) * already had been), {@code false} if any instrument could not be
* loaded (for example, if the {@code Synthesizer} had insufficient
* memory)
* @throws IllegalArgumentException if the requested soundbank is * @throws IllegalArgumentException if the requested soundbank is
* incompatible with this synthesizer. * incompatible with this synthesizer
* @see #isSoundbankSupported * @see #isSoundbankSupported
* @see #loadInstrument * @see #loadInstrument
* @see #loadInstruments * @see #loadInstruments
*/ */
public boolean loadAllInstruments(Soundbank soundbank); boolean loadAllInstruments(Soundbank soundbank);
/** /**
* Unloads all instruments contained in the specified <code>Soundbank</code>. * Unloads all instruments contained in the specified {@code Soundbank}.
* @param soundbank soundbank containing instruments to unload *
* @throws IllegalArgumentException thrown if the soundbank is not supported. * @param soundbank soundbank containing instruments to unload
* @throws IllegalArgumentException thrown if the soundbank is not supported
* @see #isSoundbankSupported * @see #isSoundbankSupported
* @see #unloadInstrument * @see #unloadInstrument
* @see #unloadInstruments * @see #unloadInstruments
*/ */
public void unloadAllInstruments(Soundbank soundbank); void unloadAllInstruments(Soundbank soundbank);
/** /**
* Loads the instruments referenced by the specified patches, from the * Loads the instruments referenced by the specified patches, from the
* specified <code>Soundbank</code>. Each of the <code>Patch</code> objects * specified {@code Soundbank}. Each of the {@code Patch} objects indicates
* indicates a bank and program number; the <code>Instrument</code> that * a bank and program number; the {@code Instrument} that has the matching
* has the matching <code>Patch</code> is loaded into that bank and program * {@code Patch} is loaded into that bank and program location.
* location. *
* @param soundbank the <code>Soundbank</code> containing the instruments to load * @param soundbank the {@code Soundbank} containing the instruments to
* @param patchList list of patches for which instruments should be loaded * load
* @return <code>true</code> if the instruments are all successfully loaded (or * @param patchList list of patches for which instruments should be loaded
* already had been), <code>false</code> if any instrument could not be * @return {@code true} if the instruments are all successfully loaded (or
* loaded (for example, if the <code>Synthesizer</code> had insufficient memory) * already had been), {@code false} if any instrument could not be
* @throws IllegalArgumentException thrown if the soundbank is not supported. * loaded (for example, if the {@code Synthesizer} had insufficient
* memory)
* @throws IllegalArgumentException thrown if the soundbank is not supported
* @see #isSoundbankSupported * @see #isSoundbankSupported
* @see Instrument#getPatch * @see Instrument#getPatch
* @see #loadAllInstruments * @see #loadAllInstruments
@ -319,76 +313,76 @@ public interface Synthesizer extends MidiDevice {
* @see Soundbank#getInstrument(Patch) * @see Soundbank#getInstrument(Patch)
* @see Sequence#getPatchList() * @see Sequence#getPatchList()
*/ */
public boolean loadInstruments(Soundbank soundbank, Patch[] patchList); boolean loadInstruments(Soundbank soundbank, Patch[] patchList);
/** /**
* Unloads the instruments referenced by the specified patches, from the MIDI sound bank specified. * Unloads the instruments referenced by the specified patches, from the
* @param soundbank soundbank containing instruments to unload * MIDI sound bank specified.
* @param patchList list of patches for which instruments should be unloaded
* @throws IllegalArgumentException thrown if the soundbank is not supported.
* *
* @param soundbank soundbank containing instruments to unload
* @param patchList list of patches for which instruments should be
* unloaded
* @throws IllegalArgumentException thrown if the soundbank is not supported
* @see #unloadInstrument * @see #unloadInstrument
* @see #unloadAllInstruments * @see #unloadAllInstruments
* @see #isSoundbankSupported * @see #isSoundbankSupported
* @see Instrument#getPatch * @see Instrument#getPatch
* @see #loadInstruments * @see #loadInstruments
*/ */
public void unloadInstruments(Soundbank soundbank, Patch[] patchList); void unloadInstruments(Soundbank soundbank, Patch[] patchList);
// RECEIVER METHODS // RECEIVER METHODS
/** /**
* Obtains the name of the receiver. * Obtains the name of the receiver.
*
* @return receiver name * @return receiver name
*/ */
// public abstract String getName(); // abstract String getName();
/** /**
* Opens the receiver. * Opens the receiver.
*
* @throws MidiUnavailableException if the receiver is cannot be opened, * @throws MidiUnavailableException if the receiver is cannot be opened,
* usually because the MIDI device is in use by another application. * usually because the MIDI device is in use by another application.
* @throws SecurityException if the receiver cannot be opened due to security * @throws SecurityException if the receiver cannot be opened due to
* restrictions. * security restrictions
*/ */
// public abstract void open() throws MidiUnavailableException, SecurityException; // abstract void open() throws MidiUnavailableException, SecurityException;
/** /**
* Closes the receiver. * Closes the receiver.
*/ */
// public abstract void close(); // abstract void close();
/** /**
* Sends a MIDI event to the receiver. * Sends a MIDI event to the receiver.
* @param event event to send. *
* @throws IllegalStateException if the receiver is not open. * @param event event to send
* @throws IllegalStateException if the receiver is not open
*/ */
// public void send(MidiEvent event) throws IllegalStateException { // void send(MidiEvent event) throws IllegalStateException {
// //
// } // }
/** /**
* Obtains the set of controls supported by the * Obtains the set of controls supported by the element. If no controls are
* element. If no controls are supported, returns an * supported, returns an array of length 0.
* array of length 0. *
* @return set of controls * @return set of controls
*/ */
// $$kk: 03.04.99: josh bloch recommends getting rid of this: // $$kk: 03.04.99: josh bloch recommends getting rid of this:
// what can you really do with a set of untyped controls?? // what can you really do with a set of untyped controls??
// $$kk: 03.05.99: i am putting this back in. for one thing, // $$kk: 03.05.99: i am putting this back in. for one thing,
// you can check the length and know whether you should keep // you can check the length and know whether you should keep
// looking.... // looking....
// public Control[] getControls(); // Control[] getControls();
/** /**
* Obtains the specified control. * Obtains the specified control.
* @param controlClass class of the requested control *
* @return requested control object, or null if the * @param controlClass class of the requested control
* control is not supported. * @return requested control object, or null if the control is not supported
*/ */
// public Control getControl(Class controlClass); // Control getControl(Class controlClass);
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -26,47 +26,47 @@
package javax.sound.midi; package javax.sound.midi;
/** /**
* A <code>SysexMessage</code> object represents a MIDI system exclusive message. * A {@code SysexMessage} object represents a MIDI system exclusive message.
* <p> * <p>
* When a system exclusive message is read from a MIDI file, it always has * When a system exclusive message is read from a MIDI file, it always has a
* a defined length. Data from a system exclusive message from a MIDI file * defined length. Data from a system exclusive message from a MIDI file should
* should be stored in the data array of a <code>SysexMessage</code> as * be stored in the data array of a {@code SysexMessage} as follows: the system
* follows: the system exclusive message status byte (0xF0 or 0xF7), all * exclusive message status byte (0xF0 or 0xF7), all message data bytes, and
* message data bytes, and finally the end-of-exclusive flag (0xF7). * finally the end-of-exclusive flag (0xF7). The length reported by the
* The length reported by the <code>SysexMessage</code> object is therefore * {@code SysexMessage} object is therefore the length of the system exclusive
* the length of the system exclusive data plus two: one byte for the status * data plus two: one byte for the status byte and one for the end-of-exclusive
* byte and one for the end-of-exclusive flag. * flag.
* <p> * <p>
* As dictated by the Standard MIDI Files specification, two status byte values are legal * As dictated by the Standard MIDI Files specification, two status byte values
* for a <code>SysexMessage</code> read from a MIDI file: * are legal for a {@code SysexMessage} read from a MIDI file:
* <ul> * <ul>
* <li>0xF0: System Exclusive message (same as in MIDI wire protocol)</li> * <li>0xF0: System Exclusive message (same as in MIDI wire protocol)</li>
* <li>0xF7: Special System Exclusive message</li> * <li>0xF7: Special System Exclusive message</li>
* </ul> * </ul>
* <p> * When Java Sound is used to handle system exclusive data that is being
* When Java Sound is used to handle system exclusive data that is being received * received using MIDI wire protocol, it should place the data in one or more
* using MIDI wire protocol, it should place the data in one or more * {@code SysexMessages}. In this case, the length of the system exclusive data
* <code>SysexMessages</code>. In this case, the length of the system exclusive data
* is not known in advance; the end of the system exclusive data is marked by an * is not known in advance; the end of the system exclusive data is marked by an
* end-of-exclusive flag (0xF7) in the MIDI wire byte stream. * end-of-exclusive flag (0xF7) in the MIDI wire byte stream.
* <ul> * <ul>
* <li>0xF0: System Exclusive message (same as in MIDI wire protocol)</li> * <li>0xF0: System Exclusive message (same as in MIDI wire protocol)</li>
* <li>0xF7: End of Exclusive (EOX)</li> * <li>0xF7: End of Exclusive (EOX)</li>
* </ul> * </ul>
* The first <code>SysexMessage</code> object containing data for a particular system * The first {@code SysexMessage} object containing data for a particular system
* exclusive message should have the status value 0xF0. If this message contains all * exclusive message should have the status value 0xF0. If this message contains
* the system exclusive data * all the system exclusive data for the message, it should end with the status
* for the message, it should end with the status byte 0xF7 (EOX). * byte 0xF7 (EOX). Otherwise, additional system exclusive data should be sent
* Otherwise, additional system exclusive data should be sent in one or more * in one or more {@code SysexMessages} with a status value of 0xF7. The
* <code>SysexMessages</code> with a status value of 0xF7. The <code>SysexMessage</code> * {@code SysexMessage} containing the last of the data for the system exclusive
* containing the last of the data for the system exclusive message should end with the * message should end with the value 0xF7 (EOX) to mark the end of the system
* value 0xF7 (EOX) to mark the end of the system exclusive message. * exclusive message.
* <p> * <p>
* If system exclusive data from <code>SysexMessages</code> objects is being transmitted * If system exclusive data from {@code SysexMessages} objects is being
* using MIDI wire protocol, only the initial 0xF0 status byte, the system exclusive * transmitted using MIDI wire protocol, only the initial 0xF0 status byte, the
* data itself, and the final 0xF7 (EOX) byte should be propagated; any 0xF7 status * system exclusive data itself, and the final 0xF7 (EOX) byte should be
* bytes used to indicate that a <code>SysexMessage</code> contains continuing system * propagated; any 0xF7 status bytes used to indicate that a
* exclusive data should not be propagated via MIDI wire protocol. * {@code SysexMessage} contains continuing system exclusive data should not be
* propagated via MIDI wire protocol.
* *
* @author David Rivas * @author David Rivas
* @author Kara Kytle * @author Kara Kytle
@ -74,43 +74,36 @@ package javax.sound.midi;
*/ */
public class SysexMessage extends MidiMessage { public class SysexMessage extends MidiMessage {
// Status byte defines // Status byte defines
/** /**
* Status byte for System Exclusive message (0xF0, or 240). * Status byte for System Exclusive message (0xF0, or 240).
*
* @see MidiMessage#getStatus * @see MidiMessage#getStatus
*/ */
public static final int SYSTEM_EXCLUSIVE = 0xF0; // 240 public static final int SYSTEM_EXCLUSIVE = 0xF0; // 240
/** /**
* Status byte for Special System Exclusive message (0xF7, or 247), which is used * Status byte for Special System Exclusive message (0xF7, or 247), which is
* in MIDI files. It has the same value as END_OF_EXCLUSIVE, which * used in MIDI files. It has the same value as END_OF_EXCLUSIVE, which is
* is used in the real-time "MIDI wire" protocol. * used in the real-time "MIDI wire" protocol.
*
* @see MidiMessage#getStatus * @see MidiMessage#getStatus
*/ */
public static final int SPECIAL_SYSTEM_EXCLUSIVE = 0xF7; // 247 public static final int SPECIAL_SYSTEM_EXCLUSIVE = 0xF7; // 247
/**
// Instance variables * The data bytes for this system exclusive message. These are initialized
* to {@code null} and are set explicitly by
* {@link #setMessage(int, byte[], int, long) setMessage}.
/*
* The data bytes for this system exclusive message. These are
* initialized to <code>null</code> and are set explicitly
* by {@link #setMessage(int, byte[], int, long) setMessage}.
*/ */
//protected byte[] data = null; //protected byte[] data = null;
/** /**
* Constructs a new <code>SysexMessage</code>. The * Constructs a new {@code SysexMessage}. The contents of the new message
* contents of the new message are guaranteed to specify * are guaranteed to specify a valid MIDI message. Subsequently, you may set
* a valid MIDI message. Subsequently, you may set the * the contents of the message using one of the {@code setMessage} methods.
* contents of the message using one of the <code>setMessage</code> *
* methods.
* @see #setMessage * @see #setMessage
*/ */
public SysexMessage() { public SysexMessage() {
@ -121,18 +114,17 @@ public class SysexMessage extends MidiMessage {
} }
/** /**
* Constructs a new {@code SysexMessage} and sets the data for * Constructs a new {@code SysexMessage} and sets the data for the message.
* the message. The first byte of the data array must be a valid system * The first byte of the data array must be a valid system exclusive status
* exclusive status byte (0xF0 or 0xF7). * byte (0xF0 or 0xF7). The contents of the message can be changed by using
* The contents of the message can be changed by using one of * one of the {@code setMessage} methods.
* the {@code setMessage} methods.
* *
* @param data the system exclusive message data including the status byte * @param data the system exclusive message data including the status byte
* @param length the length of the valid message data in the array, * @param length the length of the valid message data in the array,
* including the status byte; it should be non-negative and less than * including the status byte; it should be non-negative and less
* or equal to {@code data.length} * than or equal to {@code data.length}
* @throws InvalidMidiDataException if the parameter values * @throws InvalidMidiDataException if the parameter values do not specify a
* do not specify a valid MIDI meta message. * valid MIDI meta message.
* @see #setMessage(byte[], int) * @see #setMessage(byte[], int)
* @see #setMessage(int, byte[], int) * @see #setMessage(int, byte[], int)
* @see #getData() * @see #getData()
@ -146,17 +138,17 @@ public class SysexMessage extends MidiMessage {
/** /**
* Constructs a new {@code SysexMessage} and sets the data for the message. * Constructs a new {@code SysexMessage} and sets the data for the message.
* The contents of the message can be changed by using one of * The contents of the message can be changed by using one of the
* the {@code setMessage} methods. * {@code setMessage} methods.
* *
* @param status the status byte for the message; it must be a valid system * @param status the status byte for the message; it must be a valid system
* exclusive status byte (0xF0 or 0xF7) * exclusive status byte (0xF0 or 0xF7)
* @param data the system exclusive message data (without the status byte) * @param data the system exclusive message data (without the status byte)
* @param length the length of the valid message data in the array; * @param length the length of the valid message data in the array; it
* it should be non-negative and less than or equal to * should be non-negative and less than or equal to
* {@code data.length} * {@code data.length}
* @throws InvalidMidiDataException if the parameter values * @throws InvalidMidiDataException if the parameter values do not specify a
* do not specify a valid MIDI meta message. * valid MIDI meta message
* @see #setMessage(byte[], int) * @see #setMessage(byte[], int)
* @see #setMessage(int, byte[], int) * @see #setMessage(int, byte[], int)
* @see #getData() * @see #getData()
@ -168,26 +160,24 @@ public class SysexMessage extends MidiMessage {
setMessage(status, data, length); setMessage(status, data, length);
} }
/** /**
* Constructs a new <code>SysexMessage</code>. * Constructs a new {@code SysexMessage}.
* @param data an array of bytes containing the complete message. *
* The message data may be changed using the <code>setMessage</code> * @param data an array of bytes containing the complete message. The
* method. * message data may be changed using the {@code setMessage} method.
* @see #setMessage * @see #setMessage
*/ */
protected SysexMessage(byte[] data) { protected SysexMessage(byte[] data) {
super(data); super(data);
} }
/** /**
* Sets the data for the system exclusive message. The * Sets the data for the system exclusive message. The first byte of the
* first byte of the data array must be a valid system * data array must be a valid system exclusive status byte (0xF0 or 0xF7).
* exclusive status byte (0xF0 or 0xF7). *
* @param data the system exclusive message data * @param data the system exclusive message data
* @param length the length of the valid message data in * @param length the length of the valid message data in the array,
* the array, including the status byte. * including the status byte
*/ */
public void setMessage(byte[] data, int length) throws InvalidMidiDataException { public void setMessage(byte[] data, int length) throws InvalidMidiDataException {
int status = (data[0] & 0xFF); int status = (data[0] & 0xFF);
@ -197,14 +187,14 @@ public class SysexMessage extends MidiMessage {
super.setMessage(data, length); super.setMessage(data, length);
} }
/** /**
* Sets the data for the system exclusive message. * Sets the data for the system exclusive message.
* @param status the status byte for the message (0xF0 or 0xF7) *
* @param data the system exclusive message data * @param status the status byte for the message (0xF0 or 0xF7)
* @param length the length of the valid message data in * @param data the system exclusive message data
* the array * @param length the length of the valid message data in the array
* @throws InvalidMidiDataException if the status byte is invalid for a sysex message * @throws InvalidMidiDataException if the status byte is invalid for a
* sysex message
*/ */
public void setMessage(int status, byte[] data, int length) throws InvalidMidiDataException { public void setMessage(int status, byte[] data, int length) throws InvalidMidiDataException {
if ( (status != 0xF0) && (status != 0xF7) ) { if ( (status != 0xF0) && (status != 0xF7) ) {
@ -225,11 +215,11 @@ public class SysexMessage extends MidiMessage {
} }
} }
/** /**
* Obtains a copy of the data for the system exclusive message. * Obtains a copy of the data for the system exclusive message. The returned
* The returned array of bytes does not include the status byte. * array of bytes does not include the status byte.
* @return array containing the system exclusive message data. *
* @return array containing the system exclusive message data
*/ */
public byte[] getData() { public byte[] getData() {
byte[] returnedArray = new byte[length - 1]; byte[] returnedArray = new byte[length - 1];
@ -237,10 +227,10 @@ public class SysexMessage extends MidiMessage {
return returnedArray; return returnedArray;
} }
/** /**
* Creates a new object of the same class and with the same contents * Creates a new object of the same class and with the same contents as this
* as this object. * object.
*
* @return a clone of this instance * @return a clone of this instance
*/ */
public Object clone() { public Object clone() {

View file

@ -25,41 +25,40 @@
package javax.sound.midi; package javax.sound.midi;
import java.util.Vector;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import com.sun.media.sound.MidiUtils; import com.sun.media.sound.MidiUtils;
/** /**
* A MIDI track is an independent stream of MIDI events (time-stamped MIDI * A MIDI track is an independent stream of MIDI events (time-stamped MIDI data)
* data) that can be stored along with other tracks in a standard MIDI file. * that can be stored along with other tracks in a standard MIDI file. The MIDI
* The MIDI specification allows only 16 channels of MIDI data, but tracks * specification allows only 16 channels of MIDI data, but tracks are a way to
* are a way to get around this limitation. A MIDI file can contain any number * get around this limitation. A MIDI file can contain any number of tracks,
* of tracks, each containing its own stream of up to 16 channels of MIDI data. * each containing its own stream of up to 16 channels of MIDI data.
* <p> * <p>
* A <code>Track</code> occupies a middle level in the hierarchy of data played * A {@code Track} occupies a middle level in the hierarchy of data played by a
* by a <code>{@link Sequencer}</code>: sequencers play sequences, which contain tracks, * {@link Sequencer}: sequencers play sequences, which contain tracks, which
* which contain MIDI events. A sequencer may provide controls that mute * contain MIDI events. A sequencer may provide controls that mute or solo
* or solo individual tracks. * individual tracks.
* <p> * <p>
* The timing information and resolution for a track is controlled by and stored * The timing information and resolution for a track is controlled by and stored
* in the sequence containing the track. A given <code>Track</code> * in the sequence containing the track. A given {@code Track} is considered to
* is considered to belong to the particular <code>{@link Sequence}</code> that * belong to the particular {@link Sequence} that maintains its timing. For this
* maintains its timing. For this reason, a new (empty) track is created by calling the * reason, a new (empty) track is created by calling the
* <code>{@link Sequence#createTrack}</code> method, rather than by directly invoking a * {@link Sequence#createTrack} method, rather than by directly invoking a
* <code>Track</code> constructor. * {@code Track} constructor.
* <p> * <p>
* The <code>Track</code> class provides methods to edit the track by adding * The {@code Track} class provides methods to edit the track by adding or
* or removing <code>MidiEvent</code> objects from it. These operations keep * removing {@code MidiEvent} objects from it. These operations keep the event
* the event list in the correct time order. Methods are also * list in the correct time order. Methods are also included to obtain the
* included to obtain the track's size, in terms of either the number of events * track's size, in terms of either the number of events it contains or its
* it contains or its duration in ticks. * duration in ticks.
*
* @see Sequencer#setTrackMute
* @see Sequencer#setTrackSolo
* *
* @author Kara Kytle * @author Kara Kytle
* @author Florian Bomers * @author Florian Bomers
* @see Sequencer#setTrackMute
* @see Sequencer#setTrackSolo
*/ */
public class Track { public class Track {
@ -73,10 +72,9 @@ public class Track {
private MidiEvent eotEvent; private MidiEvent eotEvent;
/** /**
* Package-private constructor. Constructs a new, empty Track object, * Package-private constructor. Constructs a new, empty Track object, which
* which initially contains one event, the meta-event End of Track. * initially contains one event, the meta-event End of Track.
*/ */
Track() { Track() {
// start with the end of track event // start with the end of track event
@ -87,14 +85,14 @@ public class Track {
} }
/** /**
* Adds a new event to the track. However, if the event is already * Adds a new event to the track. However, if the event is already contained
* contained in the track, it is not added again. The list of events * in the track, it is not added again. The list of events is kept in time
* is kept in time order, meaning that this event inserted at the * order, meaning that this event inserted at the appropriate place in the
* appropriate place in the list, not necessarily at the end. * list, not necessarily at the end.
* *
* @param event the event to add * @param event the event to add
* @return <code>true</code> if the event did not already exist in the * @return {@code true} if the event did not already exist in the track and
* track and was added, otherwise <code>false</code> * was added, otherwise {@code false}
*/ */
public boolean add(MidiEvent event) { public boolean add(MidiEvent event) {
if (event == null) { if (event == null) {
@ -176,12 +174,12 @@ public class Track {
return false; return false;
} }
/** /**
* Removes the specified event from the track. * Removes the specified event from the track.
* @param event the event to remove *
* @return <code>true</code> if the event existed in the track and was removed, * @param event the event to remove
* otherwise <code>false</code> * @return {@code true} if the event existed in the track and was removed,
* otherwise {@code false}
*/ */
public boolean remove(MidiEvent event) { public boolean remove(MidiEvent event) {
@ -207,15 +205,14 @@ public class Track {
return false; return false;
} }
/** /**
* Obtains the event at the specified index. * Obtains the event at the specified index.
* @param index the location of the desired event in the event vector *
* @throws ArrayIndexOutOfBoundsException if the * @param index the location of the desired event in the event vector
* specified index is negative or not less than the current size of
* this track.
* @see #size
* @return the event at the specified index * @return the event at the specified index
* @throws ArrayIndexOutOfBoundsException if the specified index is negative
* or not less than the current size of this track
* @see #size
*/ */
public MidiEvent get(int index) throws ArrayIndexOutOfBoundsException { public MidiEvent get(int index) throws ArrayIndexOutOfBoundsException {
try { try {
@ -227,9 +224,9 @@ public class Track {
} }
} }
/** /**
* Obtains the number of events in this track. * Obtains the number of events in this track.
*
* @return the size of the track's event vector * @return the size of the track's event vector
*/ */
public int size() { public int size() {
@ -238,12 +235,12 @@ public class Track {
} }
} }
/** /**
* Obtains the length of the track, expressed in MIDI ticks. (The * Obtains the length of the track, expressed in MIDI ticks. (The duration
* duration of a tick in seconds is determined by the timing resolution * of a tick in seconds is determined by the timing resolution of the
* of the <code>Sequence</code> containing this track, and also by * {@code Sequence} containing this track, and also by the tempo of the
* the tempo of the music as set by the sequencer.) * music as set by the sequencer.)
*
* @return the duration, in ticks * @return the duration, in ticks
* @see Sequence#Sequence(float, int) * @see Sequence#Sequence(float, int)
* @see Sequencer#setTempoInBPM(float) * @see Sequencer#setTempoInBPM(float)
@ -271,5 +268,4 @@ public class Track {
throw new InvalidMidiDataException("cannot modify end of track message"); throw new InvalidMidiDataException("cannot modify end of track message");
} }
} }
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -25,52 +25,49 @@
package javax.sound.midi; package javax.sound.midi;
/** /**
* A <code>Transmitter</code> sends <code>{@link MidiEvent}</code> objects to one or more * A {@code Transmitter} sends {@link MidiEvent} objects to one or more
* <code>{@link Receiver Receivers}</code>. Common MIDI transmitters include sequencers * {@link Receiver Receivers}. Common MIDI transmitters include sequencers and
* and MIDI input ports. * MIDI input ports.
*
* @see Receiver
* *
* @author Kara Kytle * @author Kara Kytle
* @see Receiver
*/ */
public interface Transmitter extends AutoCloseable { public interface Transmitter extends AutoCloseable {
/** /**
* Sets the receiver to which this transmitter will deliver MIDI messages. * Sets the receiver to which this transmitter will deliver MIDI messages.
* If a receiver is currently set, it is replaced with this one. * If a receiver is currently set, it is replaced with this one.
* @param receiver the desired receiver. *
* @param receiver the desired receiver
*/ */
public void setReceiver(Receiver receiver); void setReceiver(Receiver receiver);
/** /**
* Obtains the current receiver to which this transmitter will deliver MIDI messages. * Obtains the current receiver to which this transmitter will deliver MIDI
* @return the current receiver. If no receiver is currently set, * messages.
* returns <code>null</code> *
* @return the current receiver. If no receiver is currently set, returns
* {@code null}.
*/ */
public Receiver getReceiver(); Receiver getReceiver();
/** /**
* Indicates that the application has finished using the transmitter, and * Indicates that the application has finished using the transmitter, and
* that limited resources it requires may be released or made available. * that limited resources it requires may be released or made available.
* * <p>
* <p>If the creation of this <code>Transmitter</code> resulted in * If the creation of this {@code Transmitter} resulted in implicitly
* implicitly opening the underlying device, the device is * opening the underlying device, the device is implicitly closed by this
* implicitly closed by this method. This is true unless the device is * method. This is true unless the device is kept open by other
* kept open by other <code>Receiver</code> or <code>Transmitter</code> * {@code Receiver} or {@code Transmitter} instances that opened the device
* instances that opened the device implicitly, and unless the device * implicitly, and unless the device has been opened explicitly. If the
* has been opened explicitly. If the device this * device this {@code Transmitter} is retrieved from is closed explicitly by
* <code>Transmitter</code> is retrieved from is closed explicitly * calling {@link MidiDevice#close MidiDevice.close}, the
* by calling {@link MidiDevice#close MidiDevice.close}, the * {@code Transmitter} is closed, too. For a detailed description of
* <code>Transmitter</code> is closed, too. For a detailed * open/close behaviour see the class description of
* description of open/close behaviour see the class description * {@link MidiDevice MidiDevice}.
* of {@link javax.sound.midi.MidiDevice MidiDevice}.
* *
* @see javax.sound.midi.MidiSystem#getTransmitter * @see javax.sound.midi.MidiSystem#getTransmitter
*/ */
public void close(); void close();
} }

Some files were not shown because too many files have changed in this diff Show more