This commit is contained in:
Lana Steuck 2013-08-07 19:56:20 -07:00
commit 1fa1e6d2ca
180 changed files with 5470 additions and 2593 deletions

View File

@ -103,7 +103,6 @@ NSDictionary *realmConfigsForRealms(SCDynamicStoreRef store, NSArray *realms) {
CFTypeRef realmInfo = SCDynamicStoreCopyValue(store, (CFStringRef) [NSString stringWithFormat:@"Kerberos:%@", realm]); CFTypeRef realmInfo = SCDynamicStoreCopyValue(store, (CFStringRef) [NSString stringWithFormat:@"Kerberos:%@", realm]);
if (CFGetTypeID(realmInfo) != CFDictionaryGetTypeID()) { if (CFGetTypeID(realmInfo) != CFDictionaryGetTypeID()) {
NSLog(@"Unexpected CFType for realm Info: %lu", CFGetTypeID(realmInfo));
return nil; return nil;
} }
@ -140,7 +139,6 @@ JNF_COCOA_ENTER(env);
SCDynamicStoreRef store = SCDynamicStoreCreate(NULL, CFSTR("java"), _SCDynamicStoreCallBack, NULL); SCDynamicStoreRef store = SCDynamicStoreCreate(NULL, CFSTR("java"), _SCDynamicStoreCallBack, NULL);
if (store == NULL) { if (store == NULL) {
NSLog(@"Unable to load SCDynamicStore to install NotificationCallback");
return; return;
} }
@ -171,19 +169,11 @@ JNF_COCOA_ENTER(env);
SCDynamicStoreRef store = SCDynamicStoreCreate(NULL, CFSTR("java-kerberos"), NULL, NULL); SCDynamicStoreRef store = SCDynamicStoreCreate(NULL, CFSTR("java-kerberos"), NULL, NULL);
if (store == NULL) { if (store == NULL) {
NSLog(@"Unable to load SCDynamicStore");
return NULL;
}
// Create the store if it is NULL and set it.
if (store == NULL) {
NSLog(@"Invalid value for SCDynamicStore");
return NULL; return NULL;
} }
CFTypeRef realms = SCDynamicStoreCopyValue(store, (CFStringRef) KERBEROS_DEFAULT_REALMS); CFTypeRef realms = SCDynamicStoreCopyValue(store, (CFStringRef) KERBEROS_DEFAULT_REALMS);
if (realms == NULL || CFGetTypeID(realms) != CFArrayGetTypeID()) { if (realms == NULL || CFGetTypeID(realms) != CFArrayGetTypeID()) {
NSLog(@"Unable to load realm info from SCDynamicStore");
if (realms) CFRelease(realms); if (realms) CFRelease(realms);
CFRelease(store); CFRelease(store);
return NULL; return NULL;
@ -192,7 +182,6 @@ JNF_COCOA_ENTER(env);
CFTypeRef realmMappings = SCDynamicStoreCopyValue(store, (CFStringRef) KERBEROS_DEFAULT_REALM_MAPPINGS); CFTypeRef realmMappings = SCDynamicStoreCopyValue(store, (CFStringRef) KERBEROS_DEFAULT_REALM_MAPPINGS);
if (realmMappings == NULL || CFGetTypeID(realmMappings) != CFArrayGetTypeID()) { if (realmMappings == NULL || CFGetTypeID(realmMappings) != CFArrayGetTypeID()) {
NSLog(@"Unable to load realm mapping info from SCDynamicStore");
if (realmMappings) CFRelease(realmMappings); if (realmMappings) CFRelease(realmMappings);
CFRelease(realms); CFRelease(realms);
CFRelease(store); CFRelease(store);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2013, 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
@ -47,6 +47,10 @@ import javax.security.auth.PrivateCredentialPermission;
import sun.security.util.PropertyExpander; import sun.security.util.PropertyExpander;
import sun.security.provider.PolicyParser.PrincipalEntry;
import sun.security.provider.PolicyParser.GrantEntry;
import sun.security.provider.PolicyParser.PermissionEntry;
/** /**
* This class represents a default implementation for * This class represents a default implementation for
* <code>javax.security.auth.Policy</code>. * <code>javax.security.auth.Policy</code>.
@ -469,7 +473,8 @@ public class PolicyFile extends javax.security.auth.Policy {
* @param policyFile the policy Reader object. * @param policyFile the policy Reader object.
*/ */
private void init(URL policy) { private void init(URL policy) {
PolicyParser pp = new PolicyParser(expandProperties); sun.security.provider.PolicyParser pp =
new sun.security.provider.PolicyParser(expandProperties);
try { try {
InputStreamReader isr InputStreamReader isr
= new InputStreamReader(getInputStream(policy)); = new InputStreamReader(getInputStream(policy));
@ -477,12 +482,12 @@ public class PolicyFile extends javax.security.auth.Policy {
isr.close(); isr.close();
KeyStore keyStore = initKeyStore(policy, pp.getKeyStoreUrl(), KeyStore keyStore = initKeyStore(policy, pp.getKeyStoreUrl(),
pp.getKeyStoreType()); pp.getKeyStoreType());
Enumeration<PolicyParser.GrantEntry> enum_ = pp.grantElements(); Enumeration<GrantEntry> enum_ = pp.grantElements();
while (enum_.hasMoreElements()) { while (enum_.hasMoreElements()) {
PolicyParser.GrantEntry ge = enum_.nextElement(); GrantEntry ge = enum_.nextElement();
addGrantEntry(ge, keyStore); addGrantEntry(ge, keyStore);
} }
} catch (PolicyParser.ParsingException pe) { } catch (sun.security.provider.PolicyParser.ParsingException pe) {
System.err.println(AUTH_POLICY + System.err.println(AUTH_POLICY +
rb.getString(".error.parsing.") + policy); rb.getString(".error.parsing.") + policy);
System.err.println(AUTH_POLICY + System.err.println(AUTH_POLICY +
@ -521,8 +526,8 @@ public class PolicyFile extends javax.security.auth.Policy {
* *
* @return null if signedBy alias is not recognized * @return null if signedBy alias is not recognized
*/ */
CodeSource getCodeSource(PolicyParser.GrantEntry ge, KeyStore keyStore) CodeSource getCodeSource(GrantEntry ge, KeyStore keyStore)
throws java.net.MalformedURLException throws java.net.MalformedURLException
{ {
Certificate[] certs = null; Certificate[] certs = null;
if (ge.signedBy != null) { if (ge.signedBy != null) {
@ -559,20 +564,18 @@ public class PolicyFile extends javax.security.auth.Policy {
/** /**
* Add one policy entry to the vector. * Add one policy entry to the vector.
*/ */
private void addGrantEntry(PolicyParser.GrantEntry ge, private void addGrantEntry(GrantEntry ge, KeyStore keyStore) {
KeyStore keyStore) {
if (debug != null) { if (debug != null) {
debug.println("Adding policy entry: "); debug.println("Adding policy entry: ");
debug.println(" signedBy " + ge.signedBy); debug.println(" signedBy " + ge.signedBy);
debug.println(" codeBase " + ge.codeBase); debug.println(" codeBase " + ge.codeBase);
if (ge.principals != null && ge.principals.size() > 0) { if (ge.principals != null && ge.principals.size() > 0) {
ListIterator<PolicyParser.PrincipalEntry> li = ListIterator<PrincipalEntry> li = ge.principals.listIterator();
ge.principals.listIterator();
while (li.hasNext()) { while (li.hasNext()) {
PolicyParser.PrincipalEntry pppe = li.next(); PrincipalEntry pppe = li.next();
debug.println(" " + pppe.principalClass + debug.println(" " + pppe.getPrincipalClass() +
" " + pppe.principalName); " " + pppe.getPrincipalName());
} }
} }
debug.println(); debug.println();
@ -584,10 +587,9 @@ public class PolicyFile extends javax.security.auth.Policy {
if (codesource == null) return; if (codesource == null) return;
PolicyEntry entry = new PolicyEntry(codesource); PolicyEntry entry = new PolicyEntry(codesource);
Enumeration<PolicyParser.PermissionEntry> enum_ = Enumeration<PermissionEntry> enum_ = ge.permissionElements();
ge.permissionElements();
while (enum_.hasMoreElements()) { while (enum_.hasMoreElements()) {
PolicyParser.PermissionEntry pe = enum_.nextElement(); PermissionEntry pe = enum_.nextElement();
try { try {
// XXX special case PrivateCredentialPermission-SELF // XXX special case PrivateCredentialPermission-SELF
Permission perm; Permission perm;
@ -998,11 +1000,11 @@ public class PolicyFile extends javax.security.auth.Policy {
return true; return true;
} }
ListIterator<PolicyParser.PrincipalEntry> pli = ListIterator<PrincipalEntry> pli =
scs.getPrincipals().listIterator(); scs.getPrincipals().listIterator();
while (pli.hasNext()) { while (pli.hasNext()) {
PolicyParser.PrincipalEntry principal = pli.next(); PrincipalEntry principal = pli.next();
// XXX // XXX
// if the Policy entry's Principal does not contain a // if the Policy entry's Principal does not contain a
@ -1050,30 +1052,29 @@ public class PolicyFile extends javax.security.auth.Policy {
* if (y == 1), it's the principal name. * if (y == 1), it's the principal name.
*/ */
private String[][] getPrincipalInfo private String[][] getPrincipalInfo
(PolicyParser.PrincipalEntry principal, (PrincipalEntry principal, final CodeSource accCs) {
final CodeSource accCs) {
// there are 3 possibilities: // there are 3 possibilities:
// 1) the entry's Principal class and name are not wildcarded // 1) the entry's Principal class and name are not wildcarded
// 2) the entry's Principal name is wildcarded only // 2) the entry's Principal name is wildcarded only
// 3) the entry's Principal class and name are wildcarded // 3) the entry's Principal class and name are wildcarded
if (!principal.principalClass.equals if (!principal.getPrincipalClass().equals
(PolicyParser.PrincipalEntry.WILDCARD_CLASS) && (PrincipalEntry.WILDCARD_CLASS) &&
!principal.principalName.equals !principal.getPrincipalName().equals
(PolicyParser.PrincipalEntry.WILDCARD_NAME)) { (PrincipalEntry.WILDCARD_NAME)) {
// build a PrivateCredentialPermission for the principal // build a PrivateCredentialPermission for the principal
// from the Policy entry // from the Policy entry
String[][] info = new String[1][2]; String[][] info = new String[1][2];
info[0][0] = principal.principalClass; info[0][0] = principal.getPrincipalClass();
info[0][1] = principal.principalName; info[0][1] = principal.getPrincipalName();
return info; return info;
} else if (!principal.principalClass.equals } else if (!principal.getPrincipalClass().equals
(PolicyParser.PrincipalEntry.WILDCARD_CLASS) && (PrincipalEntry.WILDCARD_CLASS) &&
principal.principalName.equals principal.getPrincipalName().equals
(PolicyParser.PrincipalEntry.WILDCARD_NAME)) { (PrincipalEntry.WILDCARD_NAME)) {
// build a PrivateCredentialPermission for all // build a PrivateCredentialPermission for all
// the Subject's principals that are instances of principalClass // the Subject's principals that are instances of principalClass
@ -1088,7 +1089,7 @@ public class PolicyFile extends javax.security.auth.Policy {
// If it doesn't, we should stop here with a ClassCastException. // If it doesn't, we should stop here with a ClassCastException.
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
Class<? extends Principal> pClass = (Class<? extends Principal>) Class<? extends Principal> pClass = (Class<? extends Principal>)
Class.forName(principal.principalClass, false, Class.forName(principal.getPrincipalClass(), false,
ClassLoader.getSystemClassLoader()); ClassLoader.getSystemClassLoader());
principalSet = scs.getSubject().getPrincipals(pClass); principalSet = scs.getSubject().getPrincipals(pClass);
} catch (Exception e) { } catch (Exception e) {
@ -1387,6 +1388,7 @@ public class PolicyFile extends javax.security.auth.Policy {
} }
} }
@SuppressWarnings("deprecation")
class PolicyPermissions extends PermissionCollection { class PolicyPermissions extends PermissionCollection {
private static final long serialVersionUID = -1954188373270545523L; private static final long serialVersionUID = -1954188373270545523L;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2013, 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
@ -33,6 +33,7 @@ import java.security.cert.Certificate;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import javax.security.auth.Subject; import javax.security.auth.Subject;
import sun.security.provider.PolicyParser.PrincipalEntry;
/** /**
* <p> This <code>SubjectCodeSource</code> class contains * <p> This <code>SubjectCodeSource</code> class contains
@ -57,7 +58,7 @@ class SubjectCodeSource extends CodeSource implements java.io.Serializable {
}); });
private Subject subject; private Subject subject;
private LinkedList<PolicyParser.PrincipalEntry> principals; private LinkedList<PrincipalEntry> principals;
private static final Class[] PARAMS = { String.class }; private static final Class[] PARAMS = { String.class };
private static final sun.security.util.Debug debug = private static final sun.security.util.Debug debug =
sun.security.util.Debug.getInstance("auth", "\t[Auth Access]"); sun.security.util.Debug.getInstance("auth", "\t[Auth Access]");
@ -87,14 +88,14 @@ class SubjectCodeSource extends CodeSource implements java.io.Serializable {
* <code>SubjectCodeSource</code> <p> * <code>SubjectCodeSource</code> <p>
*/ */
SubjectCodeSource(Subject subject, SubjectCodeSource(Subject subject,
LinkedList<PolicyParser.PrincipalEntry> principals, LinkedList<PrincipalEntry> principals,
URL url, Certificate[] certs) { URL url, Certificate[] certs) {
super(url, certs); super(url, certs);
this.subject = subject; this.subject = subject;
this.principals = (principals == null ? this.principals = (principals == null ?
new LinkedList<PolicyParser.PrincipalEntry>() : new LinkedList<PrincipalEntry>() :
new LinkedList<PolicyParser.PrincipalEntry>(principals)); new LinkedList<PrincipalEntry>(principals));
sysClassLoader = java.security.AccessController.doPrivileged sysClassLoader = java.security.AccessController.doPrivileged
(new java.security.PrivilegedAction<ClassLoader>() { (new java.security.PrivilegedAction<ClassLoader>() {
public ClassLoader run() { public ClassLoader run() {
@ -114,7 +115,7 @@ class SubjectCodeSource extends CodeSource implements java.io.Serializable {
* <code>SubjectCodeSource</code> as a <code>LinkedList</code> * <code>SubjectCodeSource</code> as a <code>LinkedList</code>
* of <code>PolicyParser.PrincipalEntry</code> objects. * of <code>PolicyParser.PrincipalEntry</code> objects.
*/ */
LinkedList<PolicyParser.PrincipalEntry> getPrincipals() { LinkedList<PrincipalEntry> getPrincipals() {
return principals; return principals;
} }
@ -167,7 +168,7 @@ class SubjectCodeSource extends CodeSource implements java.io.Serializable {
*/ */
public boolean implies(CodeSource codesource) { public boolean implies(CodeSource codesource) {
LinkedList<PolicyParser.PrincipalEntry> subjectList = null; LinkedList<PrincipalEntry> subjectList = null;
if (codesource == null || if (codesource == null ||
!(codesource instanceof SubjectCodeSource) || !(codesource instanceof SubjectCodeSource) ||
@ -197,20 +198,19 @@ class SubjectCodeSource extends CodeSource implements java.io.Serializable {
return false; return false;
} }
ListIterator<PolicyParser.PrincipalEntry> li = ListIterator<PrincipalEntry> li = this.principals.listIterator(0);
this.principals.listIterator(0);
while (li.hasNext()) { while (li.hasNext()) {
PolicyParser.PrincipalEntry pppe = li.next(); PrincipalEntry pppe = li.next();
try { try {
// handle PrincipalComparators // handle PrincipalComparators
Class<?> principalComparator = Class.forName( Class<?> principalComparator = Class.forName(
pppe.principalClass, true, sysClassLoader); pppe.getPrincipalClass(), true, sysClassLoader);
Constructor<?> c = principalComparator.getConstructor(PARAMS); Constructor<?> c = principalComparator.getConstructor(PARAMS);
PrincipalComparator pc = PrincipalComparator pc =
(PrincipalComparator)c.newInstance (PrincipalComparator)c.newInstance
(new Object[] { pppe.principalName }); (new Object[] { pppe.getPrincipalName() });
if (!pc.implies(that.getSubject())) { if (!pc.implies(that.getSubject())) {
if (debug != null) if (debug != null)
@ -236,11 +236,10 @@ class SubjectCodeSource extends CodeSource implements java.io.Serializable {
Iterator<Principal> i = Iterator<Principal> i =
that.getSubject().getPrincipals().iterator(); that.getSubject().getPrincipals().iterator();
subjectList = new LinkedList<PolicyParser.PrincipalEntry>(); subjectList = new LinkedList<PrincipalEntry>();
while (i.hasNext()) { while (i.hasNext()) {
Principal p = i.next(); Principal p = i.next();
PolicyParser.PrincipalEntry spppe = PrincipalEntry spppe = new PrincipalEntry
new PolicyParser.PrincipalEntry
(p.getClass().getName(), p.getName()); (p.getClass().getName(), p.getName());
subjectList.add(spppe); subjectList.add(spppe);
} }
@ -281,23 +280,19 @@ class SubjectCodeSource extends CodeSource implements java.io.Serializable {
* <i>pppe</i> argument. * <i>pppe</i> argument.
*/ */
private boolean subjectListImpliesPrincipalEntry( private boolean subjectListImpliesPrincipalEntry(
LinkedList<PolicyParser.PrincipalEntry> subjectList, LinkedList<PrincipalEntry> subjectList, PrincipalEntry pppe) {
PolicyParser.PrincipalEntry pppe) {
ListIterator<PolicyParser.PrincipalEntry> li = ListIterator<PrincipalEntry> li = subjectList.listIterator(0);
subjectList.listIterator(0);
while (li.hasNext()) { while (li.hasNext()) {
PolicyParser.PrincipalEntry listPppe = li.next(); PrincipalEntry listPppe = li.next();
if (pppe.principalClass.equals if (pppe.getPrincipalClass().equals
(PolicyParser.PrincipalEntry.WILDCARD_CLASS) || (PrincipalEntry.WILDCARD_CLASS) ||
pppe.principalClass.equals pppe.getPrincipalClass().equals(listPppe.getPrincipalClass()))
(listPppe.principalClass)) { {
if (pppe.getPrincipalName().equals
if (pppe.principalName.equals (PrincipalEntry.WILDCARD_NAME) ||
(PolicyParser.PrincipalEntry.WILDCARD_NAME) || pppe.getPrincipalName().equals(listPppe.getPrincipalName()))
pppe.principalName.equals
(listPppe.principalName))
return true; return true;
} }
} }
@ -390,13 +385,12 @@ class SubjectCodeSource extends CodeSource implements java.io.Serializable {
} }
} }
if (principals != null) { if (principals != null) {
ListIterator<PolicyParser.PrincipalEntry> li = ListIterator<PrincipalEntry> li = principals.listIterator();
principals.listIterator();
while (li.hasNext()) { while (li.hasNext()) {
PolicyParser.PrincipalEntry pppe = li.next(); PrincipalEntry pppe = li.next();
returnMe = returnMe + rb.getString("NEWLINE") + returnMe = returnMe + rb.getString("NEWLINE") +
pppe.principalClass + " " + pppe.getPrincipalClass() + " " +
pppe.principalName; pppe.getPrincipalName();
} }
} }
return returnMe; return returnMe;

View File

@ -151,7 +151,7 @@ function JavaClassProto() {
while (tmp != null) { while (tmp != null) {
res[res.length] = tmp; res[res.length] = tmp;
tmp = tmp.superclass; tmp = tmp.superclass;
} }
return res; return res;
} }
@ -263,16 +263,19 @@ function wrapJavaObject(thing) {
if (name == 'class') { if (name == 'class') {
return wrapJavaValue(instance.clazz); return wrapJavaValue(instance.clazz);
} else if (name == 'toString') {
return function() {
return instance.toString();
}
} else if (name == 'wrapped-object') { } else if (name == 'wrapped-object') {
return instance; return instance;
} }
return undefined; return undefined;
} },
__call__: function(name) {
if (name == 'toString') {
return instance.toString();
} else {
return undefined;
}
}
} }
} }
@ -297,7 +300,7 @@ function wrapJavaObject(thing) {
return true; return true;
} }
} }
return theJavaClassProto[name] != undefined; return false;
}, },
__get__ : function(name) { __get__ : function(name) {
for (var i in fields) { for (var i in fields) {
@ -305,7 +308,7 @@ function wrapJavaObject(thing) {
return wrapJavaValue(fields[i].value); return wrapJavaValue(fields[i].value);
} }
} }
return theJavaClassProto[name]; return undefined;
} }
} }
@ -322,7 +325,12 @@ function wrapJavaObject(thing) {
this.name = jclass.name; this.name = jclass.name;
this.fields = jclass.fields; this.fields = jclass.fields;
this['wrapped-object'] = jclass; this['wrapped-object'] = jclass;
this.__proto__ = this.statics; }
for (var i in theJavaClassProto) {
if (typeof theJavaClassProto[i] == 'function') {
JavaClassWrapper.prototype[i] = theJavaClassProto[i];
}
} }
// returns wrapper for Java object arrays // returns wrapper for Java object arrays
@ -334,32 +342,35 @@ function wrapJavaObject(thing) {
__getIds__ : function() { __getIds__ : function() {
var res = new Array(elements.length); var res = new Array(elements.length);
for (var i = 0; i < elements.length; i++) { for (var i = 0; i < elements.length; i++) {
res[i] = i; res[i] = String(i);
} }
return res; return res;
}, },
__has__: function(name) { __has__: function(name) {
return (typeof(name) == 'number' && return (name >= 0 && name < elements.length) ||
name >= 0 && name < elements.length) ||
name == 'length' || name == 'class' || name == 'length' || name == 'class' ||
name == 'toString' || name == 'wrapped-object'; name == 'toString' || name == 'wrapped-object';
}, },
__get__ : function(name) { __get__ : function(name) {
if (typeof(name) == 'number' && if (name >= 0 && name < elements.length) {
name >= 0 && name < elements.length) {
return wrapJavaValue(elements[name]); return wrapJavaValue(elements[name]);
} else if (name == 'length') { } else if (name == 'length') {
return elements.length; return elements.length;
} else if (name == 'class') { } else if (name == 'class') {
return wrapJavaValue(array.clazz); return wrapJavaValue(array.clazz);
} else if (name == 'toString') {
return function() { return array.toString(); }
} else if (name == 'wrapped-object') { } else if (name == 'wrapped-object') {
return array; return array;
} else { } else {
return undefined; return undefined;
} }
} },
__call__: function(name) {
if (name == 'toString') {
return array.toString();
} else {
return undefined;
}
}
} }
} }
@ -373,26 +384,22 @@ function wrapJavaObject(thing) {
__getIds__ : function() { __getIds__ : function() {
var r = new Array(array.length); var r = new Array(array.length);
for (var i = 0; i < array.length; i++) { for (var i = 0; i < array.length; i++) {
r[i] = i; r[i] = String(i);
} }
return r; return r;
}, },
__has__: function(name) { __has__: function(name) {
return (typeof(name) == 'number' && return (name >= 0 && name < array.length) ||
name >= 0 && name < array.length) ||
name == 'length' || name == 'class' || name == 'length' || name == 'class' ||
name == 'toString' || name == 'wrapped-object'; name == 'toString' || name == 'wrapped-object';
}, },
__get__: function(name) { __get__: function(name) {
if (typeof(name) == 'number' && if (name >= 0 && name < array.length) {
name >= 0 && name < array.length) {
return elements[name]; return elements[name];
} }
if (name == 'length') { if (name == 'length') {
return array.length; return array.length;
} else if (name == 'toString') {
return function() { return array.valueString(true); }
} else if (name == 'wrapped-object') { } else if (name == 'wrapped-object') {
return array; return array;
} else if (name == 'class') { } else if (name == 'class') {
@ -400,7 +407,14 @@ function wrapJavaObject(thing) {
} else { } else {
return undefined; return undefined;
} }
} },
__call__: function(name) {
if (name == 'toString') {
return array.valueString(true);
} else {
return undefined;
}
}
} }
} }
return javaObject(thing); return javaObject(thing);
@ -673,34 +687,33 @@ function wrapHeapSnapshot(heap) {
__getIds__ : function() { __getIds__ : function() {
var res = new Array(path.length); var res = new Array(path.length);
for (var i = 0; i < path.length; i++) { for (var i = 0; i < path.length; i++) {
res[i] = i; res[i] = String(i);
} }
return res; return res;
}, },
__has__ : function (name) { __has__ : function (name) {
return (typeof(name) == 'number' && return (name >= 0 && name < path.length) ||
name >= 0 && name < path.length) ||
name == 'length' || name == 'toHtml' || name == 'length' || name == 'toHtml' ||
name == 'toString'; name == 'toString';
}, },
__get__ : function(name) { __get__ : function(name) {
if (typeof(name) == 'number' && if (name >= 0 && name < path.length) {
name >= 0 && name < path.length) {
return path[name]; return path[name];
} else if (name == 'length') { } else if (name == 'length') {
return path.length; return path.length;
} else if (name == 'toHtml') {
return function() {
return computeDescription(true);
}
} else if (name == 'toString') {
return function() {
return computeDescription(false);
}
} else { } else {
return undefined; return undefined;
} }
}, },
__call__: function(name) {
if (name == 'toHtml') {
return computeDescription(true);
} else if (name == 'toString') {
return computeDescription(false);
} else {
return undefined;
}
}
}; };
} }
@ -1005,22 +1018,8 @@ function toHtml(obj) {
return "<a href='/object/" + id + "'>" + return "<a href='/object/" + id + "'>" +
name + "@" + id + "</a>"; name + "@" + id + "</a>";
} }
} else if ((typeof(obj) == 'object') || (obj instanceof JSAdapter)) { } else if (obj instanceof Object) {
if (obj instanceof java.lang.Object) { if (Array.isArray(obj)) {
// script wrapped Java object
obj = wrapIterator(obj);
// special case for enumeration
if (obj instanceof java.util.Enumeration) {
var res = "[ ";
while (obj.hasMoreElements()) {
res += toHtml(obj.nextElement()) + ", ";
}
res += "]";
return res;
} else {
return obj;
}
} else if (obj instanceof Array) {
// script array // script array
var res = "[ "; var res = "[ ";
for (var i in obj) { for (var i in obj) {
@ -1047,8 +1046,19 @@ function toHtml(obj) {
} }
} }
} else { } else {
// JavaScript primitive value // a Java object
return obj; obj = wrapIterator(obj);
// special case for enumeration
if (obj instanceof java.util.Enumeration) {
var res = "[ ";
while (obj.hasMoreElements()) {
res += toHtml(obj.nextElement()) + ", ";
}
res += "]";
return res;
} else {
return obj;
}
} }
} }

View File

@ -79,7 +79,7 @@ bound to a JavaScript variable of the identifier name specified in <span class="
<li>select all Strings of length 100 or more <li>select all Strings of length 100 or more
<pre> <pre>
<code> <code>
select s from java.lang.String s where s.count >= 100 select s from java.lang.String s where s.value.length >= 100
</code> </code>
</pre> </pre>
<li>select all int arrays of length 256 or more <li>select all int arrays of length 256 or more
@ -92,7 +92,7 @@ bound to a JavaScript variable of the identifier name specified in <span class="
<pre> <pre>
<code> <code>
select s.value.toString() from java.lang.String s select s.value.toString() from java.lang.String s
where /java/(s.value.toString()) where /java/.test(s.value.toString())
</code> </code>
</pre> </pre>
<li>show path value of all File objects <li>show path value of all File objects
@ -219,7 +219,6 @@ Examples:
<pre> <pre>
<code> <code>
select heap.findClass("java.lang.System").statics.props select heap.findClass("java.lang.System").statics.props
select heap.findClass("java.lang.System").props
</code> </code>
</pre> </pre>
<li>get number of fields of java.lang.String class <li>get number of fields of java.lang.String class
@ -237,7 +236,7 @@ Examples:
<li>select all classes that have name pattern java.net.* <li>select all classes that have name pattern java.net.*
<pre> <pre>
<code> <code>
select <a href="#filter">filter</a>(heap.classes(), "/java.net./(it.name)") select <a href="#filter">filter</a>(heap.classes(), "/java.net./.test(it.name)")
</code> </code>
</pre> </pre>
</ul> </ul>
@ -536,7 +535,7 @@ refer to the following built-in variables.
Example: print number of classes that have specific name pattern Example: print number of classes that have specific name pattern
<pre> <pre>
<code> <code>
select count(<a href="#classes">heap.classes()</a>, "/java.io./(it.name)") select count(<a href="#classes">heap.classes()</a>, "/java.io./.test(it.name)")
</code> </code>
</pre> </pre>
@ -559,14 +558,14 @@ Examples:
<li>show all classes that have java.io.* name pattern <li>show all classes that have java.io.* name pattern
<pre> <pre>
<code> <code>
select filter(<a href="#classes">heap.classes</a>(), "/java.io./(it.name)") select filter(<a href="#classes">heap.classes</a>(), "/java.io./.test(it.name)")
</code> </code>
</pre> </pre>
<li> show all referrers of URL object where the referrer is not from <li> show all referrers of URL object where the referrer is not from
java.net package java.net package
<pre> <pre>
<code> <code>
select filter(<a href="#referrers">referrers</a>(u), "! /java.net./(<a href="#classof">classof</a>(it).name)") select filter(<a href="#referrers">referrers</a>(u), "! /java.net./.test(<a href="#classof">classof</a>(it).name)")
from java.net.URL u from java.net.URL u
</code> </code>
</pre> </pre>
@ -619,13 +618,13 @@ Examples:
<li>find the maximum length of any String instance <li>find the maximum length of any String instance
<pre> <pre>
<code> <code>
select max(map(heap.objects('java.lang.String', false), 'it.count')) select max(map(heap.objects('java.lang.String', false), 'it.value.length'))
</code> </code>
</pre> </pre>
<li>find string instance that has the maximum length <li>find string instance that has the maximum length
<pre> <pre>
<code> <code>
select max(heap.objects('java.lang.String'), 'lhs.count > rhs.count') select max(heap.objects('java.lang.String'), 'lhs.value.length > rhs.value.length')
</code> </code>
</pre> </pre>
</ul> </ul>
@ -775,7 +774,7 @@ and walk until parent is null using the callback function to map call.
<pre> <pre>
<code> <code>
select <a href="#map">map</a>(<a href="#filter">filter(<a href="#findClass">heap.findClass</a>('java.lang.System').props.table, 'it != null'), select <a href="#map">map</a>(<a href="#filter">filter(<a href="#findClass">heap.findClass</a>('java.lang.System').statics.props.table, 'it != null'),
function (it) { function (it) {
var res = ""; var res = "";
while (it != null) { while (it != null) {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1995, 2006, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1995, 2013, 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
@ -56,7 +56,7 @@ public interface AppletContext {
/** /**
* Returns an <code>Image</code> object that can then be painted on * Returns an <code>Image</code> object that can then be painted on
* the screen. The <code>url</code> argument<code> </code>that is * the screen. The <code>url</code> argument that is
* passed as an argument must specify an absolute URL. * passed as an argument must specify an absolute URL.
* <p> * <p>
* This method always returns immediately, whether or not the image * This method always returns immediately, whether or not the image
@ -157,7 +157,7 @@ public interface AppletContext {
* @param stream stream to be associated with the specified key. If this * @param stream stream to be associated with the specified key. If this
* parameter is <code>null</code>, the specified key is removed * parameter is <code>null</code>, the specified key is removed
* in this applet context. * in this applet context.
* @throws <code>IOException</code> if the stream size exceeds a certain * @throws IOException if the stream size exceeds a certain
* size limit. Size limit is decided by the implementor of this * size limit. Size limit is decided by the implementor of this
* interface. * interface.
* @since 1.4 * @since 1.4

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2000, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2013, 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
@ -68,7 +68,6 @@ public interface AppletInitializer {
* the Applet with its Container during the subsequent invocation of its * the Applet with its Container during the subsequent invocation of its
* addChildren() method. * addChildren() method.
* </ol> * </ol>
* </p>
* *
* @param newAppletBean The newly instantiated JavaBean * @param newAppletBean The newly instantiated JavaBean
* @param bCtxt The BeanContext intended for this Applet, or * @param bCtxt The BeanContext intended for this Applet, or

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1996, 2009, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1996, 2013, 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
@ -62,7 +62,7 @@ public class Beans {
* <p> * <p>
* Instantiate a JavaBean. * Instantiate a JavaBean.
* </p> * </p>
* * @return a JavaBean
* @param cls the class-loader from which we should create * @param cls the class-loader from which we should create
* the bean. If this is null, then the system * the bean. If this is null, then the system
* class-loader is used. * class-loader is used.
@ -82,6 +82,7 @@ public class Beans {
* <p> * <p>
* Instantiate a JavaBean. * Instantiate a JavaBean.
* </p> * </p>
* @return a JavaBean
* *
* @param cls the class-loader from which we should create * @param cls the class-loader from which we should create
* the bean. If this is null, then the system * the bean. If this is null, then the system
@ -137,6 +138,7 @@ public class Beans {
* the JDK appletviewer (for a reference browser environment) and the * the JDK appletviewer (for a reference browser environment) and the
* BDK BeanBox (for a reference bean container). * BDK BeanBox (for a reference bean container).
* *
* @return a JavaBean
* @param cls the class-loader from which we should create * @param cls the class-loader from which we should create
* the bean. If this is null, then the system * the bean. If this is null, then the system
* class-loader is used. * class-loader is used.
@ -361,6 +363,8 @@ public class Beans {
* This method is provided in Beans 1.0 as a hook to allow the * This method is provided in Beans 1.0 as a hook to allow the
* addition of more flexible bean behaviour in the future. * addition of more flexible bean behaviour in the future.
* *
* @return an object representing a specified type view of the
* source object
* @param bean Object from which we want to obtain a view. * @param bean Object from which we want to obtain a view.
* @param targetType The type of view we'd like to get. * @param targetType The type of view we'd like to get.
* *
@ -384,7 +388,6 @@ public class Beans {
return Introspector.isSubclass(bean.getClass(), targetType); return Introspector.isSubclass(bean.getClass(), targetType);
} }
/** /**
* Test if we are in design-mode. * Test if we are in design-mode.
* *

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2006, 2013, 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
@ -61,7 +61,7 @@ import static java.lang.annotation.RetentionPolicy.*;
the {@code getY()} method. Since parameter names are not in the {@code getY()} method. Since parameter names are not in
general available at runtime, without the annotation there would be general available at runtime, without the annotation there would be
no way to know whether the parameters correspond to {@code getX()} no way to know whether the parameters correspond to {@code getX()}
and {@code getY()} or the other way around.</p> and {@code getY()} or the other way around.
@since 1.6 @since 1.6
*/ */

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2000, 2013, 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
@ -382,6 +382,7 @@ public class DefaultPersistenceDelegate extends PersistenceDelegate {
* a class such that no property value depends on the value of * a class such that no property value depends on the value of
* a subsequent property. * a subsequent property.
* *
* @param type the type of the instances
* @param oldInstance The instance to be copied. * @param oldInstance The instance to be copied.
* @param newInstance The instance that is to be modified. * @param newInstance The instance that is to be modified.
* @param out The stream to which any initialization statements should be written. * @param out The stream to which any initialization statements should be written.

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2000, 2009, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2000, 2013, 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
@ -515,6 +515,7 @@ public class EventHandler implements InvocationHandler {
*</pre> *</pre>
*</blockquote> *</blockquote>
* *
* @param <T> the type to create
* @param listenerInterface the listener interface to create a proxy for * @param listenerInterface the listener interface to create a proxy for
* @param target the object that will perform the action * @param target the object that will perform the action
* @param action the name of a (possibly qualified) property or method on * @param action the name of a (possibly qualified) property or method on
@ -570,6 +571,7 @@ public class EventHandler implements InvocationHandler {
*</pre> *</pre>
*</blockquote> *</blockquote>
* *
* @param <T> the type to create
* @param listenerInterface the listener interface to create a proxy for * @param listenerInterface the listener interface to create a proxy for
* @param target the object that will perform the action * @param target the object that will perform the action
* @param action the name of a (possibly qualified) property or method on * @param action the name of a (possibly qualified) property or method on
@ -659,6 +661,7 @@ public class EventHandler implements InvocationHandler {
* </pre> * </pre>
*</blockquote> *</blockquote>
* *
* @param <T> the type to create
* @param listenerInterface the listener interface to create a proxy for * @param listenerInterface the listener interface to create a proxy for
* @param target the object that will perform the action * @param target the object that will perform the action
* @param action the name of a (possibly qualified) property or method on * @param action the name of a (possibly qualified) property or method on

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2000, 2013, 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
@ -139,7 +139,7 @@ public class Expression extends Statement {
* replaces this default value in the same way that any other value * replaces this default value in the same way that any other value
* would, ensuring that expressions are never evaluated more than once. * would, ensuring that expressions are never evaluated more than once.
* <p> * <p>
* See the <code>excecute</code> method for details on how * See the <code>execute</code> method for details on how
* methods are chosen using the dynamic types of the target * methods are chosen using the dynamic types of the target
* and arguments. * and arguments.
* *
@ -147,6 +147,8 @@ public class Expression extends Statement {
* @see #setValue * @see #setValue
* *
* @return The result of applying this method to these arguments. * @return The result of applying this method to these arguments.
* @throws Exception if the method with the specified methodName
* throws an exception
*/ */
public Object getValue() throws Exception { public Object getValue() throws Exception {
if (value == unbound) { if (value == unbound) {

View File

@ -207,6 +207,8 @@ public class IndexedPropertyDescriptor extends PropertyDescriptor {
* Sets the method that should be used to read an indexed property value. * Sets the method that should be used to read an indexed property value.
* *
* @param readMethod The new indexed read method. * @param readMethod The new indexed read method.
* @throws IntrospectionException if an exception occurs during
* introspection.
*/ */
public synchronized void setIndexedReadMethod(Method readMethod) public synchronized void setIndexedReadMethod(Method readMethod)
throws IntrospectionException { throws IntrospectionException {
@ -285,6 +287,8 @@ public class IndexedPropertyDescriptor extends PropertyDescriptor {
* Sets the method that should be used to write an indexed property value. * Sets the method that should be used to write an indexed property value.
* *
* @param writeMethod The new indexed write method. * @param writeMethod The new indexed write method.
* @throws IntrospectionException if an exception occurs during
* introspection.
*/ */
public synchronized void setIndexedWriteMethod(Method writeMethod) public synchronized void setIndexedWriteMethod(Method writeMethod)
throws IntrospectionException { throws IntrospectionException {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1996, 2013, 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
@ -93,8 +93,17 @@ import sun.reflect.misc.ReflectUtil;
public class Introspector { public class Introspector {
// Flags that can be used to control getBeanInfo: // Flags that can be used to control getBeanInfo:
/**
* Flag to indicate to use of all beaninfo.
*/
public final static int USE_ALL_BEANINFO = 1; public final static int USE_ALL_BEANINFO = 1;
/**
* Flag to indicate to ignore immediate beaninfo.
*/
public final static int IGNORE_IMMEDIATE_BEANINFO = 2; public final static int IGNORE_IMMEDIATE_BEANINFO = 2;
/**
* Flag to indicate to ignore all beaninfo.
*/
public final static int IGNORE_ALL_BEANINFO = 3; public final static int IGNORE_ALL_BEANINFO = 3;
// Static Caches to speed up introspection. // Static Caches to speed up introspection.
@ -202,7 +211,7 @@ public class Introspector {
* If the BeanInfo class for a Java Bean has been previously Introspected * If the BeanInfo class for a Java Bean has been previously Introspected
* based on the same arguments, then the BeanInfo class is retrieved * based on the same arguments, then the BeanInfo class is retrieved
* from the BeanInfo cache. * from the BeanInfo cache.
* * @return the BeanInfo for the bean
* @param beanClass The bean class to be analyzed. * @param beanClass The bean class to be analyzed.
* @param stopClass The baseclass at which to stop the analysis. Any * @param stopClass The baseclass at which to stop the analysis. Any
* methods/properties/events in the stopClass or in its baseclasses * methods/properties/events in the stopClass or in its baseclasses

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2000, 2013, 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
@ -197,6 +197,7 @@ public abstract class PersistenceDelegate {
* The default implementation, calls the <code>initialize</code> * The default implementation, calls the <code>initialize</code>
* method of the type's superclass. * method of the type's superclass.
* *
* @param type the type of the instances
* @param oldInstance The instance to be copied. * @param oldInstance The instance to be copied.
* @param newInstance The instance that is to be modified. * @param newInstance The instance that is to be modified.
* @param out The stream to which any initialization statements should be written. * @param out The stream to which any initialization statements should be written.

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1996, 2013, 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
@ -156,7 +156,7 @@ public class PropertyChangeSupport implements Serializable {
* <code>PropertyChangeListenerProxy</code>, perform the cast, and examine * <code>PropertyChangeListenerProxy</code>, perform the cast, and examine
* the parameter. * the parameter.
* *
* <pre> * <pre>{@code
* PropertyChangeListener[] listeners = bean.getPropertyChangeListeners(); * PropertyChangeListener[] listeners = bean.getPropertyChangeListeners();
* for (int i = 0; i < listeners.length; i++) { * for (int i = 0; i < listeners.length; i++) {
* if (listeners[i] instanceof PropertyChangeListenerProxy) { * if (listeners[i] instanceof PropertyChangeListenerProxy) {
@ -168,7 +168,7 @@ public class PropertyChangeSupport implements Serializable {
* } * }
* } * }
* } * }
*</pre> * }</pre>
* *
* @see PropertyChangeListenerProxy * @see PropertyChangeListenerProxy
* @return all of the <code>PropertyChangeListeners</code> added or an * @return all of the <code>PropertyChangeListeners</code> added or an

View File

@ -243,6 +243,7 @@ public class PropertyDescriptor extends FeatureDescriptor {
* Sets the method that should be used to read the property value. * Sets the method that should be used to read the property value.
* *
* @param readMethod The new read method. * @param readMethod The new read method.
* @throws IntrospectionException if the read method is invalid
*/ */
public synchronized void setReadMethod(Method readMethod) public synchronized void setReadMethod(Method readMethod)
throws IntrospectionException { throws IntrospectionException {
@ -313,6 +314,7 @@ public class PropertyDescriptor extends FeatureDescriptor {
* Sets the method that should be used to write the property value. * Sets the method that should be used to write the property value.
* *
* @param writeMethod The new write method. * @param writeMethod The new write method.
* @throws IntrospectionException if the write method is invalid
*/ */
public synchronized void setWriteMethod(Method writeMethod) public synchronized void setWriteMethod(Method writeMethod)
throws IntrospectionException { throws IntrospectionException {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2008, 2013, 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
@ -40,7 +40,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
* A {@code true} value for the "transient" attribute * A {@code true} value for the "transient" attribute
* indicates to encoders derived from {@link Encoder} * indicates to encoders derived from {@link Encoder}
* that this feature should be ignored. * that this feature should be ignored.
* <p/> * <p>
* The {@code Transient} annotation may be be used * The {@code Transient} annotation may be be used
* in any of the methods that are involved * in any of the methods that are involved
* in a {@link FeatureDescriptor} subclass * in a {@link FeatureDescriptor} subclass
@ -49,7 +49,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
* to put the annotation and it is this declaration * to put the annotation and it is this declaration
* that takes precedence in the case of multiple annotations * that takes precedence in the case of multiple annotations
* being defined for the same feature. * being defined for the same feature.
* <p/> * <p>
* To declare a feature non-transient in a class * To declare a feature non-transient in a class
* whose superclass declares it transient, * whose superclass declares it transient,
* use {@code @Transient(false)}. * use {@code @Transient(false)}.
@ -64,5 +64,11 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target({METHOD}) @Target({METHOD})
@Retention(RUNTIME) @Retention(RUNTIME)
public @interface Transient { public @interface Transient {
/**
* Returns whether or not the {@code Introspector} should
* construct artifacts for the annotated method.
* @return whether or not the {@code Introspector} should
* construct artifacts for the annotated method
*/
boolean value() default true; boolean value() default true;
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1996, 2013, 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
@ -42,7 +42,7 @@ import java.util.Map.Entry;
* <p> * <p>
* Here is an example of {@code VetoableChangeSupport} usage that follows * Here is an example of {@code VetoableChangeSupport} usage that follows
* the rules and recommendations laid out in the JavaBeans&trade; specification: * the rules and recommendations laid out in the JavaBeans&trade; specification:
* <pre> * <pre>{@code
* public class MyBean { * public class MyBean {
* private final VetoableChangeSupport vcs = new VetoableChangeSupport(this); * private final VetoableChangeSupport vcs = new VetoableChangeSupport(this);
* *
@ -68,7 +68,7 @@ import java.util.Map.Entry;
* *
* [...] * [...]
* } * }
* </pre> * }</pre>
* <p> * <p>
* A {@code VetoableChangeSupport} instance is thread-safe. * A {@code VetoableChangeSupport} instance is thread-safe.
* <p> * <p>
@ -156,7 +156,7 @@ public class VetoableChangeSupport implements Serializable {
* <code>VetoableChangeListenerProxy</code>, perform the cast, and examine * <code>VetoableChangeListenerProxy</code>, perform the cast, and examine
* the parameter. * the parameter.
* *
* <pre> * <pre>{@code
* VetoableChangeListener[] listeners = bean.getVetoableChangeListeners(); * VetoableChangeListener[] listeners = bean.getVetoableChangeListeners();
* for (int i = 0; i < listeners.length; i++) { * for (int i = 0; i < listeners.length; i++) {
* if (listeners[i] instanceof VetoableChangeListenerProxy) { * if (listeners[i] instanceof VetoableChangeListenerProxy) {
@ -168,7 +168,7 @@ public class VetoableChangeSupport implements Serializable {
* } * }
* } * }
* } * }
*</pre> * }</pre>
* *
* @see VetoableChangeListenerProxy * @see VetoableChangeListenerProxy
* @return all of the <code>VetoableChangeListeners</code> added or an * @return all of the <code>VetoableChangeListeners</code> added or an

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2013, 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
@ -64,10 +64,12 @@ public interface BeanContext extends BeanContextChild, Collection, DesignMode, V
* and is defined by the * and is defined by the
* <code>java.beans.Beans.instantiate()</code> method. * <code>java.beans.Beans.instantiate()</code> method.
* *
* @return a javaBean named as a child of this
* <code>BeanContext</code>
* @param beanName The name of the JavaBean to instantiate * @param beanName The name of the JavaBean to instantiate
* as a child of this <code>BeanContext</code> * as a child of this <code>BeanContext</code>
* @throws <code>IOException</code> * @throws IOException if an IO problem occurs
* @throws <code>ClassNotFoundException</code> if the class identified * @throws ClassNotFoundException if the class identified
* by the beanName parameter is not found * by the beanName parameter is not found
*/ */
Object instantiateChild(String beanName) throws IOException, ClassNotFoundException; Object instantiateChild(String beanName) throws IOException, ClassNotFoundException;
@ -83,7 +85,7 @@ public interface BeanContext extends BeanContextChild, Collection, DesignMode, V
* @return an <code>InputStream</code> for reading the resource, * @return an <code>InputStream</code> for reading the resource,
* or <code>null</code> if the resource could not * or <code>null</code> if the resource could not
* be found. * be found.
* @throws <code>IllegalArgumentException</code> if * @throws IllegalArgumentException if
* the resource is not valid * the resource is not valid
*/ */
InputStream getResourceAsStream(String name, BeanContextChild bcc) throws IllegalArgumentException; InputStream getResourceAsStream(String name, BeanContextChild bcc) throws IllegalArgumentException;
@ -98,7 +100,7 @@ public interface BeanContext extends BeanContextChild, Collection, DesignMode, V
* @param bcc the specified child * @param bcc the specified child
* @return a <code>URL</code> for the named * @return a <code>URL</code> for the named
* resource for the specified child * resource for the specified child
* @throws <code>IllegalArgumentException</code> * @throws IllegalArgumentException
* if the resource is not valid * if the resource is not valid
*/ */
URL getResource(String name, BeanContextChild bcc) throws IllegalArgumentException; URL getResource(String name, BeanContextChild bcc) throws IllegalArgumentException;
@ -109,7 +111,7 @@ public interface BeanContext extends BeanContextChild, Collection, DesignMode, V
* this <code>BeanContext</code> whenever it adds * this <code>BeanContext</code> whenever it adds
* or removes a child <code>Component</code>(s). * or removes a child <code>Component</code>(s).
* *
* @param bcml the <code>BeanContextMembershipListener</code> to be added * @param bcml the BeanContextMembershipListener to be added
*/ */
void addBeanContextMembershipListener(BeanContextMembershipListener bcml); void addBeanContextMembershipListener(BeanContextMembershipListener bcml);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2013, 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
@ -82,7 +82,7 @@ public interface BeanContextChild {
* </p> * </p>
* @param bc The <code>BeanContext</code> with which * @param bc The <code>BeanContext</code> with which
* to associate this <code>BeanContextChild</code>. * to associate this <code>BeanContextChild</code>.
* @throws <code>PropertyVetoException</code> if the * @throws PropertyVetoException if the
* addition of the specified <code>BeanContext</code> is refused. * addition of the specified <code>BeanContext</code> is refused.
*/ */
void setBeanContext(BeanContext bc) throws PropertyVetoException; void setBeanContext(BeanContext bc) throws PropertyVetoException;

View File

@ -78,6 +78,7 @@ public class BeanContextChildSupport implements BeanContextChild, BeanContextSer
* construct a BeanContextChildSupport where the JavaBean component * construct a BeanContextChildSupport where the JavaBean component
* itself implements BeanContextChild, and encapsulates this, delegating * itself implements BeanContextChild, and encapsulates this, delegating
* that interface to this implementation * that interface to this implementation
* @param bcc the underlying bean context child
*/ */
public BeanContextChildSupport(BeanContextChild bcc) { public BeanContextChildSupport(BeanContextChild bcc) {
@ -94,7 +95,7 @@ public class BeanContextChildSupport implements BeanContextChild, BeanContextSer
* this <code>BeanContextChildSupport</code>. * this <code>BeanContextChildSupport</code>.
* @param bc the new value to be assigned to the <code>BeanContext</code> * @param bc the new value to be assigned to the <code>BeanContext</code>
* property * property
* @throws <code>PropertyVetoException</code> if the change is rejected * @throws PropertyVetoException if the change is rejected
*/ */
public synchronized void setBeanContext(BeanContext bc) throws PropertyVetoException { public synchronized void setBeanContext(BeanContext bc) throws PropertyVetoException {
if (bc == beanContext) return; if (bc == beanContext) return;
@ -361,6 +362,9 @@ public class BeanContextChildSupport implements BeanContextChild, BeanContextSer
*/ */
protected VetoableChangeSupport vcSupport; protected VetoableChangeSupport vcSupport;
/**
* The bean context.
*/
protected transient BeanContext beanContext; protected transient BeanContext beanContext;
/** /**

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2013, 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
@ -103,6 +103,7 @@ public class BeanContextMembershipEvent extends BeanContextEvent {
* Is the child specified affected by the event? * Is the child specified affected by the event?
* @return <code>true</code> if affected, <code>false</code> * @return <code>true</code> if affected, <code>false</code>
* if not * if not
* @param child the object to check for being affected
*/ */
public boolean contains(Object child) { public boolean contains(Object child) {
return children.contains(child); return children.contains(child);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1998, 2004, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2013, 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
@ -60,6 +60,7 @@ public interface BeanContextServices extends BeanContext, BeanContextServicesLis
* @param serviceClass the service to add * @param serviceClass the service to add
* @param serviceProvider the <code>BeanContextServiceProvider</code> * @param serviceProvider the <code>BeanContextServiceProvider</code>
* associated with the service * associated with the service
* @return true if the service was successful added, false otherwise
*/ */
boolean addService(Class serviceClass, BeanContextServiceProvider serviceProvider); boolean addService(Class serviceClass, BeanContextServiceProvider serviceProvider);
@ -108,7 +109,7 @@ public interface BeanContextServices extends BeanContext, BeanContextServicesLis
* @param bcsrl the * @param bcsrl the
* <code>BeanContextServiceRevokedListener</code> to notify * <code>BeanContextServiceRevokedListener</code> to notify
* if the service should later become revoked * if the service should later become revoked
* @throws TooManyListenersException * @throws TooManyListenersException if there are too many listeners
* @return a reference to this context's named * @return a reference to this context's named
* Service as requested or <code>null</code> * Service as requested or <code>null</code>
*/ */

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1998, 2009, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2013, 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
@ -603,12 +603,16 @@ public class BeanContextServicesSupport extends BeanContextSupport
serviceProvider = bcsp; serviceProvider = bcsp;
} }
/**
* Returns the service provider.
* @return the service provider
*/
protected BeanContextServiceProvider getServiceProvider() { protected BeanContextServiceProvider getServiceProvider() {
return serviceProvider; return serviceProvider;
} }
/* /**
* fields * The service provider.
*/ */
protected BeanContextServiceProvider serviceProvider; protected BeanContextServiceProvider serviceProvider;
@ -618,6 +622,9 @@ public class BeanContextServicesSupport extends BeanContextSupport
* subclasses can override this method to create new subclasses of * subclasses can override this method to create new subclasses of
* BCSSServiceProvider without having to overrride addService() in * BCSSServiceProvider without having to overrride addService() in
* order to instantiate. * order to instantiate.
* @param sc the class
* @param bcsp the service provider
* @return a service provider without overriding addService()
*/ */
protected BCSSServiceProvider createBCSSServiceProvider(Class sc, BeanContextServiceProvider bcsp) { protected BCSSServiceProvider createBCSSServiceProvider(Class sc, BeanContextServiceProvider bcsp) {
@ -629,7 +636,7 @@ public class BeanContextServicesSupport extends BeanContextSupport
/** /**
* add a BeanContextServicesListener * add a BeanContextServicesListener
* *
* @throws NullPointerException * @throws NullPointerException if the argument is null
*/ */
public void addBeanContextServicesListener(BeanContextServicesListener bcsl) { public void addBeanContextServicesListener(BeanContextServicesListener bcsl) {
@ -660,6 +667,8 @@ public class BeanContextServicesSupport extends BeanContextSupport
/** /**
* add a service * add a service
* @param serviceClass the service class
* @param bcsp the service provider
*/ */
public boolean addService(Class serviceClass, BeanContextServiceProvider bcsp) { public boolean addService(Class serviceClass, BeanContextServiceProvider bcsp) {
@ -668,6 +677,10 @@ public class BeanContextServicesSupport extends BeanContextSupport
/** /**
* add a service * add a service
* @param serviceClass the service class
* @param bcsp the service provider
* @param fireEvent whether or not an event should be fired
* @return true if the service was successfully added
*/ */
protected boolean addService(Class serviceClass, BeanContextServiceProvider bcsp, boolean fireEvent) { protected boolean addService(Class serviceClass, BeanContextServiceProvider bcsp, boolean fireEvent) {
@ -709,6 +722,9 @@ public class BeanContextServicesSupport extends BeanContextSupport
/** /**
* remove a service * remove a service
* @param serviceClass the service class
* @param bcsp the service provider
* @param revokeCurrentServicesNow whether or not to revoke the service
*/ */
public void revokeService(Class serviceClass, BeanContextServiceProvider bcsp, boolean revokeCurrentServicesNow) { public void revokeService(Class serviceClass, BeanContextServiceProvider bcsp, boolean revokeCurrentServicesNow) {
@ -1067,6 +1083,7 @@ public class BeanContextServicesSupport extends BeanContextSupport
/** /**
* Fires a <tt>BeanContextServiceEvent</tt> notifying of a new service. * Fires a <tt>BeanContextServiceEvent</tt> notifying of a new service.
* @param serviceClass the service class
*/ */
protected final void fireServiceAdded(Class serviceClass) { protected final void fireServiceAdded(Class serviceClass) {
BeanContextServiceAvailableEvent bcssae = new BeanContextServiceAvailableEvent(getBeanContextServicesPeer(), serviceClass); BeanContextServiceAvailableEvent bcssae = new BeanContextServiceAvailableEvent(getBeanContextServicesPeer(), serviceClass);
@ -1109,6 +1126,8 @@ public class BeanContextServicesSupport extends BeanContextSupport
* Fires a <tt>BeanContextServiceRevokedEvent</tt> * Fires a <tt>BeanContextServiceRevokedEvent</tt>
* indicating that a particular service is * indicating that a particular service is
* no longer available. * no longer available.
* @param serviceClass the service class
* @param revokeNow whether or not the event should be revoked now
*/ */
protected final void fireServiceRevoked(Class serviceClass, boolean revokeNow) { protected final void fireServiceRevoked(Class serviceClass, boolean revokeNow) {
Object[] copy; Object[] copy;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2004, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2013, 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
@ -62,7 +62,6 @@ import java.util.Map;
/** /**
* This helper class provides a utility implementation of the * This helper class provides a utility implementation of the
* java.beans.beancontext.BeanContext interface. * java.beans.beancontext.BeanContext interface.
* </p>
* <p> * <p>
* Since this class directly implements the BeanContext interface, the class * Since this class directly implements the BeanContext interface, the class
* can, and is intended to be used either by subclassing this implementation, * can, and is intended to be used either by subclassing this implementation,
@ -351,9 +350,8 @@ public class BeanContextSupport extends BeanContextChildSupport
* of Child without having to override add() or the other Collection * of Child without having to override add() or the other Collection
* methods that add children to the set. * methods that add children to the set.
* </p> * </p>
*
* @param targetChild the child to create the Child on behalf of * @param targetChild the child to create the Child on behalf of
* @param peer the peer if the tragetChild and the peer are related by an implementation of BeanContextProxy * @param peer the peer if the tragetChild and the peer are related by an implementation of BeanContextProxy * @return Subtype-specific subclass of Child without overriding collection methods
*/ */
protected BCSChild createBCSChild(Object targetChild, Object peer) { protected BCSChild createBCSChild(Object targetChild, Object peer) {
@ -492,6 +490,7 @@ public class BeanContextSupport extends BeanContextChildSupport
* @param callChildSetBC used to indicate that * @param callChildSetBC used to indicate that
* the child should be notified that it is no * the child should be notified that it is no
* longer nested in this <tt>BeanContext</tt>. * longer nested in this <tt>BeanContext</tt>.
* @return whether or not was present before being removed
*/ */
protected boolean remove(Object targetChild, boolean callChildSetBC) { protected boolean remove(Object targetChild, boolean callChildSetBC) {
@ -580,7 +579,8 @@ public class BeanContextSupport extends BeanContextChildSupport
/** /**
* add Collection to set of Children (Unsupported) * add Collection to set of Children (Unsupported)
* implementations must synchronized on the hierarchy lock and "children" protected field * implementations must synchronized on the hierarchy lock and "children" protected field
* @throws UnsupportedOperationException * @throws UnsupportedOperationException thrown unconditionally by this implementation
* @return this implementation unconditionally throws {@code UnsupportedOperationException}
*/ */
public boolean addAll(Collection c) { public boolean addAll(Collection c) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
@ -589,7 +589,9 @@ public class BeanContextSupport extends BeanContextChildSupport
/** /**
* remove all specified children (Unsupported) * remove all specified children (Unsupported)
* implementations must synchronized on the hierarchy lock and "children" protected field * implementations must synchronized on the hierarchy lock and "children" protected field
* @throws UnsupportedOperationException * @throws UnsupportedOperationException thrown unconditionally by this implementation
* @return this implementation unconditionally throws {@code UnsupportedOperationException}
*/ */
public boolean removeAll(Collection c) { public boolean removeAll(Collection c) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
@ -599,7 +601,8 @@ public class BeanContextSupport extends BeanContextChildSupport
/** /**
* retain only specified children (Unsupported) * retain only specified children (Unsupported)
* implementations must synchronized on the hierarchy lock and "children" protected field * implementations must synchronized on the hierarchy lock and "children" protected field
* @throws UnsupportedOperationException * @throws UnsupportedOperationException thrown unconditionally by this implementation
* @return this implementation unconditionally throws {@code UnsupportedOperationException}
*/ */
public boolean retainAll(Collection c) { public boolean retainAll(Collection c) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
@ -608,7 +611,7 @@ public class BeanContextSupport extends BeanContextChildSupport
/** /**
* clear the children (Unsupported) * clear the children (Unsupported)
* implementations must synchronized on the hierarchy lock and "children" protected field * implementations must synchronized on the hierarchy lock and "children" protected field
* @throws UnsupportedOperationException * @throws UnsupportedOperationException thrown unconditionally by this implementation
*/ */
public void clear() { public void clear() {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
@ -618,7 +621,7 @@ public class BeanContextSupport extends BeanContextChildSupport
* Adds a BeanContextMembershipListener * Adds a BeanContextMembershipListener
* *
* @param bcml the BeanContextMembershipListener to add * @param bcml the BeanContextMembershipListener to add
* @throws NullPointerException * @throws NullPointerException if the argument is null
*/ */
public void addBeanContextMembershipListener(BeanContextMembershipListener bcml) { public void addBeanContextMembershipListener(BeanContextMembershipListener bcml) {
@ -636,7 +639,7 @@ public class BeanContextSupport extends BeanContextChildSupport
* Removes a BeanContextMembershipListener * Removes a BeanContextMembershipListener
* *
* @param bcml the BeanContextMembershipListener to remove * @param bcml the BeanContextMembershipListener to remove
* @throws NullPointerException * @throws NullPointerException if the argument is null
*/ */
public void removeBeanContextMembershipListener(BeanContextMembershipListener bcml) { public void removeBeanContextMembershipListener(BeanContextMembershipListener bcml) {
@ -655,7 +658,7 @@ public class BeanContextSupport extends BeanContextChildSupport
* @param bcc the child object making the request. * @param bcc the child object making the request.
* *
* @return the requested resource as an InputStream * @return the requested resource as an InputStream
* @throws NullPointerException * @throws NullPointerException if the argument is null
*/ */
public InputStream getResourceAsStream(String name, BeanContextChild bcc) { public InputStream getResourceAsStream(String name, BeanContextChild bcc) {
@ -849,6 +852,8 @@ public class BeanContextSupport extends BeanContextChildSupport
* *
* This method should not however be used by subclasses to replace their * This method should not however be used by subclasses to replace their
* own implementation (if any) of writeObject(). * own implementation (if any) of writeObject().
* @param oos the {@code ObjectOutputStream} to use during serialization
* @throws IOException if serialization failed
*/ */
protected void bcsPreSerializationHook(ObjectOutputStream oos) throws IOException { protected void bcsPreSerializationHook(ObjectOutputStream oos) throws IOException {
@ -864,6 +869,9 @@ public class BeanContextSupport extends BeanContextChildSupport
* *
* This method should not however be used by subclasses to replace their * This method should not however be used by subclasses to replace their
* own implementation (if any) of readObject(). * own implementation (if any) of readObject().
* @param ois the {@code ObjectInputStream} to use during deserialization
* @throws IOException if deserialization failed
* @throws ClassNotFoundException if needed classes are not found
*/ */
protected void bcsPreDeserializationHook(ObjectInputStream ois) throws IOException, ClassNotFoundException { protected void bcsPreDeserializationHook(ObjectInputStream ois) throws IOException, ClassNotFoundException {
@ -914,6 +922,8 @@ public class BeanContextSupport extends BeanContextChildSupport
* used by readObject to deserialize a collection. * used by readObject to deserialize a collection.
* @param ois the ObjectInputStream to use * @param ois the ObjectInputStream to use
* @param coll the Collection * @param coll the Collection
* @throws IOException if deserialization failed
* @throws ClassNotFoundException if needed classes are not found
*/ */
protected final void deserialize(ObjectInputStream ois, Collection coll) throws IOException, ClassNotFoundException { protected final void deserialize(ObjectInputStream ois, Collection coll) throws IOException, ClassNotFoundException {
int count = 0; int count = 0;
@ -1005,6 +1015,9 @@ public class BeanContextSupport extends BeanContextChildSupport
* When an instance of this class is used as a delegate for the * When an instance of this class is used as a delegate for the
* implementation of the BeanContext protocols (and its subprotocols) * implementation of the BeanContext protocols (and its subprotocols)
* there exists a 'chicken and egg' problem during deserialization * there exists a 'chicken and egg' problem during deserialization
* @param ois the ObjectInputStream to use
* @throws IOException if deserialization failed
* @throws ClassNotFoundException if needed classes are not found
*/ */
public final void readChildren(ObjectInputStream ois) throws IOException, ClassNotFoundException { public final void readChildren(ObjectInputStream ois) throws IOException, ClassNotFoundException {
@ -1122,6 +1135,7 @@ public class BeanContextSupport extends BeanContextChildSupport
* immediately prior to their being added to the BeanContext. * immediately prior to their being added to the BeanContext.
* </p> * </p>
* *
* @param targetChild the child to create the Child on behalf of
* @return true iff the child may be added to this BeanContext, otherwise false. * @return true iff the child may be added to this BeanContext, otherwise false.
*/ */
@ -1136,6 +1150,7 @@ public class BeanContextSupport extends BeanContextChildSupport
* immediately prior to their being removed from the BeanContext. * immediately prior to their being removed from the BeanContext.
* </p> * </p>
* *
* @param targetChild the child to create the Child on behalf of
* @return true iff the child may be removed from this BeanContext, otherwise false. * @return true iff the child may be removed from this BeanContext, otherwise false.
*/ */
@ -1147,6 +1162,8 @@ public class BeanContextSupport extends BeanContextChildSupport
* subclasses may override this method to simply extend add() semantics * subclasses may override this method to simply extend add() semantics
* after the child has been added and before the event notification has * after the child has been added and before the event notification has
* occurred. The method is called with the child synchronized. * occurred. The method is called with the child synchronized.
* @param child the child
* @param bcsc the BCSChild
*/ */
protected void childJustAddedHook(Object child, BCSChild bcsc) { protected void childJustAddedHook(Object child, BCSChild bcsc) {
@ -1156,6 +1173,8 @@ public class BeanContextSupport extends BeanContextChildSupport
* subclasses may override this method to simply extend remove() semantics * subclasses may override this method to simply extend remove() semantics
* after the child has been removed and before the event notification has * after the child has been removed and before the event notification has
* occurred. The method is called with the child synchronized. * occurred. The method is called with the child synchronized.
* @param child the child
* @param bcsc the BCSChild
*/ */
protected void childJustRemovedHook(Object child, BCSChild bcsc) { protected void childJustRemovedHook(Object child, BCSChild bcsc) {
@ -1254,6 +1273,7 @@ public class BeanContextSupport extends BeanContextChildSupport
/** /**
* Fire a BeanContextshipEvent on the BeanContextMembershipListener interface * Fire a BeanContextshipEvent on the BeanContextMembershipListener interface
* @param bcme the event to fire
*/ */
protected final void fireChildrenAdded(BeanContextMembershipEvent bcme) { protected final void fireChildrenAdded(BeanContextMembershipEvent bcme) {
@ -1267,6 +1287,7 @@ public class BeanContextSupport extends BeanContextChildSupport
/** /**
* Fire a BeanContextshipEvent on the BeanContextMembershipListener interface * Fire a BeanContextshipEvent on the BeanContextMembershipListener interface
* @param bcme the event to fire
*/ */
protected final void fireChildrenRemoved(BeanContextMembershipEvent bcme) { protected final void fireChildrenRemoved(BeanContextMembershipEvent bcme) {

View File

@ -39,4 +39,7 @@ package java.net;
* @since 1.4 * @since 1.4
*/ */
public abstract class SocketAddress implements java.io.Serializable { public abstract class SocketAddress implements java.io.Serializable {
static final long serialVersionUID = 5215720748342549866L;
} }

View File

@ -25,10 +25,10 @@
package java.nio.file; package java.nio.file;
import java.nio.ByteBuffer;
import java.nio.file.attribute.*; import java.nio.file.attribute.*;
import java.nio.file.spi.FileSystemProvider; import java.nio.file.spi.FileSystemProvider;
import java.nio.file.spi.FileTypeDetector; import java.nio.file.spi.FileTypeDetector;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel; import java.nio.channels.FileChannel;
import java.nio.channels.SeekableByteChannel; import java.nio.channels.SeekableByteChannel;
import java.io.Closeable; import java.io.Closeable;
@ -2965,7 +2965,63 @@ public final class Files {
} }
/** /**
* Read all the bytes from a file. The method ensures that the file is * The maximum size of array to allocate.
* Some VMs reserve some header words in an array.
* Attempts to allocate larger arrays may result in
* OutOfMemoryError: Requested array size exceeds VM limit
*/
private static final int MAX_BUFFER_SIZE = Integer.MAX_VALUE - 8;
/**
* Reads all the bytes from an input stream. Uses {@code initialSize} as a hint
* about how many bytes the stream will have.
*
* @param source
* the input stream to read from
* @param initialSize
* the initial size of the byte array to allocate
*
* @return a byte array containing the bytes read from the file
*
* @throws IOException
* if an I/O error occurs reading from the stream
* @throws OutOfMemoryError
* if an array of the required size cannot be allocated
*/
private static byte[] read(InputStream source, int initialSize)
throws IOException
{
int capacity = initialSize;
byte[] buf = new byte[capacity];
int nread = 0;
int n;
for (;;) {
// read to EOF which may read more or less than initialSize (eg: file
// is truncated while we are reading)
while ((n = source.read(buf, nread, capacity - nread)) > 0)
nread += n;
// if last call to source.read() returned -1, we are done
// otherwise, try to read one more byte; if that failed we're done too
if (n < 0 || (n = source.read()) < 0)
break;
// one more byte was read; need to allocate a larger buffer
if (capacity <= MAX_BUFFER_SIZE - capacity) {
capacity = Math.max(capacity << 1, BUFFER_SIZE);
} else {
if (capacity == MAX_BUFFER_SIZE)
throw new OutOfMemoryError("Required array size too large");
capacity = MAX_BUFFER_SIZE;
}
buf = Arrays.copyOf(buf, capacity);
buf[nread++] = (byte)n;
}
return (capacity == nread) ? buf : Arrays.copyOf(buf, nread);
}
/**
* Reads all the bytes from a file. The method ensures that the file is
* closed when all bytes have been read or an I/O error, or other runtime * closed when all bytes have been read or an I/O error, or other runtime
* exception, is thrown. * exception, is thrown.
* *
@ -2989,22 +3045,13 @@ public final class Files {
* method is invoked to check read access to the file. * method is invoked to check read access to the file.
*/ */
public static byte[] readAllBytes(Path path) throws IOException { public static byte[] readAllBytes(Path path) throws IOException {
try (FileChannel fc = FileChannel.open(path)) { try (FileChannel fc = FileChannel.open(path);
InputStream is = Channels.newInputStream(fc)) {
long size = fc.size(); long size = fc.size();
if (size > (long)Integer.MAX_VALUE) if (size > (long)MAX_BUFFER_SIZE)
throw new OutOfMemoryError("Required array size too large"); throw new OutOfMemoryError("Required array size too large");
byte[] arr = new byte[(int)size]; return read(is, (int)size);
ByteBuffer bb = ByteBuffer.wrap(arr);
while (bb.hasRemaining()) {
if (fc.read(bb) < 0) {
// truncated
break;
}
}
int nread = bb.position();
return (nread == size) ? arr : Arrays.copyOf(arr, nread);
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1996, 2002, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1996, 2013, 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
@ -33,15 +33,47 @@ import java.net.*;
* in order to obtain client and server sockets for RMI calls. An * in order to obtain client and server sockets for RMI calls. An
* application may use the <code>setSocketFactory</code> method to * application may use the <code>setSocketFactory</code> method to
* request that the RMI runtime use its socket factory instance * request that the RMI runtime use its socket factory instance
* instead of the default implementation.<p> * instead of the default implementation.
* *
* The default socket factory implementation used goes through a * <p>The default socket factory implementation performs a
* three-tiered approach to creating client sockets. First, a direct * three-tiered approach to creating client sockets. First, a direct
* socket connection to the remote VM is attempted. If that fails * socket connection to the remote VM is attempted. If that fails
* (due to a firewall), the runtime uses HTTP with the explicit port * (due to a firewall), the runtime uses HTTP with the explicit port
* number of the server. If the firewall does not allow this type of * number of the server. If the firewall does not allow this type of
* communication, then HTTP to a cgi-bin script on the server is used * communication, then HTTP to a cgi-bin script on the server is used
* to POST the RMI call.<p> * to POST the RMI call.
*
* <p>The default socket factory implementation creates server sockets that
* are bound to the wildcard address, which accepts requests from all network
* interfaces.
*
* @implNote
* <p>You can use the {@code RMISocketFactory} class to create a server socket that
* is bound to a specific address, restricting the origin of requests. For example,
* the following code implements a socket factory that binds server sockets to the
* loopback address. This restricts RMI to processing requests only from the local host.
*
* <pre>{@code
* class LoopbackSocketFactory extends RMISocketFactory {
* public ServerSocket createServerSocket(int port) throws IOException {
* return new ServerSocket(port, 5, InetAddress.getLoopbackAddress());
* }
*
* public Socket createSocket(String host, int port) throws IOException {
* // just call the default client socket factory
* return RMISocketFactory.getDefaultSocketFactory()
* .createSocket(host, port);
* }
* }
*
* // ...
*
* RMISocketFactory.setSocketFactory(new LoopbackSocketFactory());
* }</pre>
*
* Set the {@code java.rmi.server.hostname} system property
* to a host name (typically {@code localhost}) that resolves to the loopback
* interface to ensure that the generated stubs use the right network interface.
* *
* @author Ann Wollrath * @author Ann Wollrath
* @author Peter Jones * @author Peter Jones

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1996, 2003, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1996, 2013, 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
@ -100,6 +100,26 @@ import sun.rmi.server.UnicastServerRef2;
* </ul> * </ul>
* </ul> * </ul>
* *
* <p>If an object is exported with the
* {@link #exportObject(Remote) exportObject(Remote)}
* or
* {@link #exportObject(Remote, int) exportObject(Remote, port)}
* methods, or if a subclass constructor invokes one of the
* {@link #UnicastRemoteObject()}
* or
* {@link #UnicastRemoteObject(int) UnicastRemoteObject(port)}
* constructors, the object is exported with a server socket created using the
* {@link RMISocketFactory}
* class.
*
* @implNote
* <p>By default, server sockets created by the {@link RMISocketFactory} class
* listen on all network interfaces. See the
* {@link RMISocketFactory} class and the section
* <a href="{@docRoot}/../platform/rmi/spec/rmi-server29.html">RMI Socket Factories</a>
* in the
* <a href="{@docRoot}/../platform/rmi/spec/rmiTOC.html">Java RMI Specification</a>.
*
* @author Ann Wollrath * @author Ann Wollrath
* @author Peter Jones * @author Peter Jones
* @since JDK1.1 * @since JDK1.1

View File

@ -326,17 +326,13 @@ public final class Security {
* *
* <p>A provider cannot be added if it is already installed. * <p>A provider cannot be added if it is already installed.
* *
* <p>First, if there is a security manager, its * <p>If there is a security manager, the
* {@code checkSecurityAccess} * {@link java.lang.SecurityManager#checkSecurityAccess} method is called
* method is called with the string * with the {@code "insertProvider"} permission target name to see if
* {@code "insertProvider."+provider.getName()} * it's ok to add a new provider. If this permission check is denied,
* to see if it's ok to add a new provider. * {@code checkSecurityAccess} is called again with the
* If the default implementation of {@code checkSecurityAccess} * {@code "insertProvider."+provider.getName()} permission target name. If
* is used (i.e., that method is not overriden), then this will result in * both checks are denied, a {@code SecurityException} is thrown.
* a call to the security manager's {@code checkPermission} method
* with a
* {@code SecurityPermission("insertProvider."+provider.getName())}
* permission.
* *
* @param provider the provider to be added. * @param provider the provider to be added.
* *
@ -360,7 +356,7 @@ public final class Security {
public static synchronized int insertProviderAt(Provider provider, public static synchronized int insertProviderAt(Provider provider,
int position) { int position) {
String providerName = provider.getName(); String providerName = provider.getName();
check("insertProvider." + providerName); checkInsertProvider(providerName);
ProviderList list = Providers.getFullProviderList(); ProviderList list = Providers.getFullProviderList();
ProviderList newList = ProviderList.insertAt(list, provider, position - 1); ProviderList newList = ProviderList.insertAt(list, provider, position - 1);
if (list == newList) { if (list == newList) {
@ -373,17 +369,13 @@ public final class Security {
/** /**
* Adds a provider to the next position available. * Adds a provider to the next position available.
* *
* <p>First, if there is a security manager, its * <p>If there is a security manager, the
* {@code checkSecurityAccess} * {@link java.lang.SecurityManager#checkSecurityAccess} method is called
* method is called with the string * with the {@code "insertProvider"} permission target name to see if
* {@code "insertProvider."+provider.getName()} * it's ok to add a new provider. If this permission check is denied,
* to see if it's ok to add a new provider. * {@code checkSecurityAccess} is called again with the
* If the default implementation of {@code checkSecurityAccess} * {@code "insertProvider."+provider.getName()} permission target name. If
* is used (i.e., that method is not overriden), then this will result in * both checks are denied, a {@code SecurityException} is thrown.
* a call to the security manager's {@code checkPermission} method
* with a
* {@code SecurityPermission("insertProvider."+provider.getName())}
* permission.
* *
* @param provider the provider to be added. * @param provider the provider to be added.
* *
@ -863,6 +855,23 @@ public final class Security {
} }
} }
private static void checkInsertProvider(String name) {
SecurityManager security = System.getSecurityManager();
if (security != null) {
try {
security.checkSecurityAccess("insertProvider");
} catch (SecurityException se1) {
try {
security.checkSecurityAccess("insertProvider." + name);
} catch (SecurityException se2) {
// throw first exception, but add second to suppressed
se1.addSuppressed(se2);
throw se1;
}
}
}
}
/* /*
* Returns all providers who satisfy the specified * Returns all providers who satisfy the specified
* criterion. * criterion.

View File

@ -130,14 +130,17 @@ import java.util.StringTokenizer;
* </tr> * </tr>
* *
* <tr> * <tr>
* <td>insertProvider.{provider name}</td> * <td>insertProvider</td>
* <td>Addition of a new provider, with the specified name</td> * <td>Addition of a new provider</td>
* <td>This would allow somebody to introduce a possibly * <td>This would allow somebody to introduce a possibly
* malicious provider (e.g., one that discloses the private keys passed * malicious provider (e.g., one that discloses the private keys passed
* to it) as the highest-priority provider. This would be possible * to it) as the highest-priority provider. This would be possible
* because the Security object (which manages the installed providers) * because the Security object (which manages the installed providers)
* currently does not check the integrity or authenticity of a provider * currently does not check the integrity or authenticity of a provider
* before attaching it.</td> * before attaching it. The "insertProvider" permission subsumes the
* "insertProvider.{provider name}" permission (see the section below for
* more information).
* </td>
* </tr> * </tr>
* *
* <tr> * <tr>
@ -186,9 +189,10 @@ import java.util.StringTokenizer;
* </table> * </table>
* *
* <P> * <P>
* The following permissions are associated with classes that have been * The following permissions have been superseded by newer permissions or are
* deprecated: {@link Identity}, {@link IdentityScope}, {@link Signer}. Use of * associated with classes that have been deprecated: {@link Identity},
* them is discouraged. See the applicable classes for more information. * {@link IdentityScope}, {@link Signer}. Use of them is discouraged. See the
* applicable classes for more information.
* <P> * <P>
* *
* <table border=1 cellpadding=5 summary="target name,what the permission allows, and associated risks"> * <table border=1 cellpadding=5 summary="target name,what the permission allows, and associated risks">
@ -199,6 +203,23 @@ import java.util.StringTokenizer;
* </tr> * </tr>
* *
* <tr> * <tr>
* <td>insertProvider.{provider name}</td>
* <td>Addition of a new provider, with the specified name</td>
* <td>Use of this permission is discouraged from further use because it is
* possible to circumvent the name restrictions by overriding the
* {@link java.security.Provider#getName} method. Also, there is an equivalent
* level of risk associated with granting code permission to insert a provider
* with a specific name, or any name it chooses. Users should use the
* "insertProvider" permission instead.
* <p>This would allow somebody to introduce a possibly
* malicious provider (e.g., one that discloses the private keys passed
* to it) as the highest-priority provider. This would be possible
* because the Security object (which manages the installed providers)
* currently does not check the integrity or authenticity of a provider
* before attaching it.</td>
* </tr>
*
* <tr>
* <td>setSystemScope</td> * <td>setSystemScope</td>
* <td>Setting of the system identity scope</td> * <td>Setting of the system identity scope</td>
* <td>This would allow an attacker to configure the system identity scope with * <td>This would allow an attacker to configure the system identity scope with
@ -306,7 +327,6 @@ public final class SecurityPermission extends BasicPermission {
* @throws NullPointerException if {@code name} is {@code null}. * @throws NullPointerException if {@code name} is {@code null}.
* @throws IllegalArgumentException if {@code name} is empty. * @throws IllegalArgumentException if {@code name} is empty.
*/ */
public SecurityPermission(String name) public SecurityPermission(String name)
{ {
super(name); super(name);
@ -323,7 +343,6 @@ public final class SecurityPermission extends BasicPermission {
* @throws NullPointerException if {@code name} is {@code null}. * @throws NullPointerException if {@code name} is {@code null}.
* @throws IllegalArgumentException if {@code name} is empty. * @throws IllegalArgumentException if {@code name} is empty.
*/ */
public SecurityPermission(String name, String actions) public SecurityPermission(String name, String actions)
{ {
super(name, actions); super(name, actions);

View File

@ -128,6 +128,7 @@ class ArrayPrefixHelpers {
this.lo = lo; this.hi = hi; this.lo = lo; this.hi = hi;
} }
@SuppressWarnings("unchecked")
public final void compute() { public final void compute() {
final BinaryOperator<T> fn; final BinaryOperator<T> fn;
final T[] a; final T[] a;
@ -692,6 +693,4 @@ class ArrayPrefixHelpers {
} }
} }
} }
}
}

View File

@ -1143,6 +1143,7 @@ public class Collections {
public boolean removeIf(Predicate<? super E> filter) { public boolean removeIf(Predicate<? super E> filter) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
@SuppressWarnings("unchecked")
@Override @Override
public Spliterator<E> spliterator() { public Spliterator<E> spliterator() {
return (Spliterator<E>)c.spliterator(); return (Spliterator<E>)c.spliterator();
@ -1900,7 +1901,7 @@ public class Collections {
private static final long serialVersionUID = -2239321462712562324L; private static final long serialVersionUID = -2239321462712562324L;
EmptyNavigableMap() { super(new TreeMap()); } EmptyNavigableMap() { super(new TreeMap<K,V>()); }
@Override @Override
public NavigableSet<K> navigableKeySet() public NavigableSet<K> navigableKeySet()
@ -1928,46 +1929,52 @@ public class Collections {
public K ceilingKey(K key) { return nm.ceilingKey(key); } public K ceilingKey(K key) { return nm.ceilingKey(key); }
public K higherKey(K key) { return nm.higherKey(key); } public K higherKey(K key) { return nm.higherKey(key); }
@SuppressWarnings("unchecked")
public Entry<K, V> lowerEntry(K key) { public Entry<K, V> lowerEntry(K key) {
Entry<K,V> lower = (Entry<K, V>) nm.lowerEntry(key); Entry<K,V> lower = (Entry<K, V>) nm.lowerEntry(key);
return (null != lower) return (null != lower)
? new UnmodifiableEntrySet.UnmodifiableEntry(lower) ? new UnmodifiableEntrySet.UnmodifiableEntry<>(lower)
: null; : null;
} }
@SuppressWarnings("unchecked")
public Entry<K, V> floorEntry(K key) { public Entry<K, V> floorEntry(K key) {
Entry<K,V> floor = (Entry<K, V>) nm.floorEntry(key); Entry<K,V> floor = (Entry<K, V>) nm.floorEntry(key);
return (null != floor) return (null != floor)
? new UnmodifiableEntrySet.UnmodifiableEntry(floor) ? new UnmodifiableEntrySet.UnmodifiableEntry<>(floor)
: null; : null;
} }
@SuppressWarnings("unchecked")
public Entry<K, V> ceilingEntry(K key) { public Entry<K, V> ceilingEntry(K key) {
Entry<K,V> ceiling = (Entry<K, V>) nm.ceilingEntry(key); Entry<K,V> ceiling = (Entry<K, V>) nm.ceilingEntry(key);
return (null != ceiling) return (null != ceiling)
? new UnmodifiableEntrySet.UnmodifiableEntry(ceiling) ? new UnmodifiableEntrySet.UnmodifiableEntry<>(ceiling)
: null; : null;
} }
@SuppressWarnings("unchecked")
public Entry<K, V> higherEntry(K key) { public Entry<K, V> higherEntry(K key) {
Entry<K,V> higher = (Entry<K, V>) nm.higherEntry(key); Entry<K,V> higher = (Entry<K, V>) nm.higherEntry(key);
return (null != higher) return (null != higher)
? new UnmodifiableEntrySet.UnmodifiableEntry(higher) ? new UnmodifiableEntrySet.UnmodifiableEntry<>(higher)
: null; : null;
} }
@SuppressWarnings("unchecked")
public Entry<K, V> firstEntry() { public Entry<K, V> firstEntry() {
Entry<K,V> first = (Entry<K, V>) nm.firstEntry(); Entry<K,V> first = (Entry<K, V>) nm.firstEntry();
return (null != first) return (null != first)
? new UnmodifiableEntrySet.UnmodifiableEntry(first) ? new UnmodifiableEntrySet.UnmodifiableEntry<>(first)
: null; : null;
} }
@SuppressWarnings("unchecked")
public Entry<K, V> lastEntry() { public Entry<K, V> lastEntry() {
Entry<K,V> last = (Entry<K, V>) nm.lastEntry(); Entry<K,V> last = (Entry<K, V>) nm.lastEntry();
return (null != last) return (null != last)
? new UnmodifiableEntrySet.UnmodifiableEntry(last) ? new UnmodifiableEntrySet.UnmodifiableEntry<>(last)
: null; : null;
} }
@ -2360,7 +2367,7 @@ public class Collections {
} }
public NavigableSet<E> tailSet(E fromElement) { public NavigableSet<E> tailSet(E fromElement) {
synchronized (mutex) { synchronized (mutex) {
return new SynchronizedNavigableSet(ns.tailSet(fromElement, true), mutex); return new SynchronizedNavigableSet<>(ns.tailSet(fromElement, true), mutex);
} }
} }
@ -2925,7 +2932,7 @@ public class Collections {
public NavigableMap<K, V> descendingMap() { public NavigableMap<K, V> descendingMap() {
synchronized (mutex) { synchronized (mutex) {
return return
new SynchronizedNavigableMap(nm.descendingMap(), mutex); new SynchronizedNavigableMap<>(nm.descendingMap(), mutex);
} }
} }
@ -2935,13 +2942,13 @@ public class Collections {
public NavigableSet<K> navigableKeySet() { public NavigableSet<K> navigableKeySet() {
synchronized (mutex) { synchronized (mutex) {
return new SynchronizedNavigableSet(nm.navigableKeySet(), mutex); return new SynchronizedNavigableSet<>(nm.navigableKeySet(), mutex);
} }
} }
public NavigableSet<K> descendingKeySet() { public NavigableSet<K> descendingKeySet() {
synchronized (mutex) { synchronized (mutex) {
return new SynchronizedNavigableSet(nm.descendingKeySet(), mutex); return new SynchronizedNavigableSet<>(nm.descendingKeySet(), mutex);
} }
} }
@ -2959,27 +2966,27 @@ public class Collections {
} }
public SortedMap<K,V> tailMap(K fromKey) { public SortedMap<K,V> tailMap(K fromKey) {
synchronized (mutex) { synchronized (mutex) {
return new SynchronizedNavigableMap<>(nm.tailMap(fromKey, true),mutex); return new SynchronizedNavigableMap<>(nm.tailMap(fromKey, true),mutex);
} }
} }
public NavigableMap<K, V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) { public NavigableMap<K, V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
synchronized (mutex) { synchronized (mutex) {
return new SynchronizedNavigableMap( return new SynchronizedNavigableMap<>(
nm.subMap(fromKey, fromInclusive, toKey, toInclusive), mutex); nm.subMap(fromKey, fromInclusive, toKey, toInclusive), mutex);
} }
} }
public NavigableMap<K, V> headMap(K toKey, boolean inclusive) { public NavigableMap<K, V> headMap(K toKey, boolean inclusive) {
synchronized (mutex) { synchronized (mutex) {
return new SynchronizedNavigableMap( return new SynchronizedNavigableMap<>(
nm.headMap(toKey, inclusive), mutex); nm.headMap(toKey, inclusive), mutex);
} }
} }
public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) { public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) {
synchronized (mutex) { synchronized (mutex) {
return new SynchronizedNavigableMap( return new SynchronizedNavigableMap<>(
nm.tailMap(fromKey, inclusive), mutex); nm.tailMap(fromKey, inclusive), mutex);
} }
} }
@ -4081,7 +4088,7 @@ public class Collections {
public Entry<K, V> lowerEntry(K key) { public Entry<K, V> lowerEntry(K key) {
Entry<K,V> lower = nm.lowerEntry(key); Entry<K,V> lower = nm.lowerEntry(key);
return (null != lower) return (null != lower)
? new CheckedMap.CheckedEntrySet.CheckedEntry(lower, valueType) ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(lower, valueType)
: null; : null;
} }
@ -4090,7 +4097,7 @@ public class Collections {
public Entry<K, V> floorEntry(K key) { public Entry<K, V> floorEntry(K key) {
Entry<K,V> floor = nm.floorEntry(key); Entry<K,V> floor = nm.floorEntry(key);
return (null != floor) return (null != floor)
? new CheckedMap.CheckedEntrySet.CheckedEntry(floor, valueType) ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(floor, valueType)
: null; : null;
} }
@ -4099,7 +4106,7 @@ public class Collections {
public Entry<K, V> ceilingEntry(K key) { public Entry<K, V> ceilingEntry(K key) {
Entry<K,V> ceiling = nm.ceilingEntry(key); Entry<K,V> ceiling = nm.ceilingEntry(key);
return (null != ceiling) return (null != ceiling)
? new CheckedMap.CheckedEntrySet.CheckedEntry(ceiling, valueType) ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(ceiling, valueType)
: null; : null;
} }
@ -4108,7 +4115,7 @@ public class Collections {
public Entry<K, V> higherEntry(K key) { public Entry<K, V> higherEntry(K key) {
Entry<K,V> higher = nm.higherEntry(key); Entry<K,V> higher = nm.higherEntry(key);
return (null != higher) return (null != higher)
? new CheckedMap.CheckedEntrySet.CheckedEntry(higher, valueType) ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(higher, valueType)
: null; : null;
} }
@ -4117,14 +4124,14 @@ public class Collections {
public Entry<K, V> firstEntry() { public Entry<K, V> firstEntry() {
Entry<K,V> first = nm.firstEntry(); Entry<K,V> first = nm.firstEntry();
return (null != first) return (null != first)
? new CheckedMap.CheckedEntrySet.CheckedEntry(first, valueType) ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(first, valueType)
: null; : null;
} }
public Entry<K, V> lastEntry() { public Entry<K, V> lastEntry() {
Entry<K,V> last = nm.lastEntry(); Entry<K,V> last = nm.lastEntry();
return (null != last) return (null != last)
? new CheckedMap.CheckedEntrySet.CheckedEntry(last, valueType) ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(last, valueType)
: null; : null;
} }
@ -4132,14 +4139,14 @@ public class Collections {
Entry<K,V> entry = nm.pollFirstEntry(); Entry<K,V> entry = nm.pollFirstEntry();
return (null == entry) return (null == entry)
? null ? null
: new CheckedMap.CheckedEntrySet.CheckedEntry(entry, valueType); : new CheckedMap.CheckedEntrySet.CheckedEntry<>(entry, valueType);
} }
public Entry<K, V> pollLastEntry() { public Entry<K, V> pollLastEntry() {
Entry<K,V> entry = nm.pollLastEntry(); Entry<K,V> entry = nm.pollLastEntry();
return (null == entry) return (null == entry)
? null ? null
: new CheckedMap.CheckedEntrySet.CheckedEntry(entry, valueType); : new CheckedMap.CheckedEntrySet.CheckedEntry<>(entry, valueType);
} }
public NavigableMap<K, V> descendingMap() { public NavigableMap<K, V> descendingMap() {

View File

@ -352,6 +352,7 @@ public interface Comparator<T> {
* @see Comparable * @see Comparable
* @since 1.8 * @since 1.8
*/ */
@SuppressWarnings("unchecked")
public static <T extends Comparable<? super T>> Comparator<T> naturalOrder() { public static <T extends Comparable<? super T>> Comparator<T> naturalOrder() {
return (Comparator<T>) Comparators.NaturalOrderComparator.INSTANCE; return (Comparator<T>) Comparators.NaturalOrderComparator.INSTANCE;
} }
@ -374,7 +375,7 @@ public interface Comparator<T> {
* @since 1.8 * @since 1.8
*/ */
public static <T> Comparator<T> nullsFirst(Comparator<? super T> comparator) { public static <T> Comparator<T> nullsFirst(Comparator<? super T> comparator) {
return new Comparators.NullComparator(true, comparator); return new Comparators.NullComparator<>(true, comparator);
} }
/** /**
@ -395,7 +396,7 @@ public interface Comparator<T> {
* @since 1.8 * @since 1.8
*/ */
public static <T> Comparator<T> nullsLast(Comparator<? super T> comparator) { public static <T> Comparator<T> nullsLast(Comparator<? super T> comparator) {
return new Comparators.NullComparator(false, comparator); return new Comparators.NullComparator<>(false, comparator);
} }
/** /**

View File

@ -87,12 +87,12 @@ class Comparators {
@Override @Override
public Comparator<T> thenComparing(Comparator<? super T> other) { public Comparator<T> thenComparing(Comparator<? super T> other) {
Objects.requireNonNull(other); Objects.requireNonNull(other);
return new NullComparator(nullFirst, real == null ? other : real.thenComparing(other)); return new NullComparator<>(nullFirst, real == null ? other : real.thenComparing(other));
} }
@Override @Override
public Comparator<T> reversed() { public Comparator<T> reversed() {
return new NullComparator(!nullFirst, real == null ? null : real.reversed()); return new NullComparator<>(!nullFirst, real == null ? null : real.reversed());
} }
} }
} }

View File

@ -38,7 +38,7 @@ package java.util;
/** /**
* A linear collection that supports element insertion and removal at * A linear collection that supports element insertion and removal at
* both ends. The name <i>deque</i> is short for "double ended queue" * both ends. The name <i>deque</i> is short for "double ended queue"
* and is usually pronounced "deck". Most <tt>Deque</tt> * and is usually pronounced "deck". Most {@code Deque}
* implementations place no fixed limits on the number of elements * implementations place no fixed limits on the number of elements
* they may contain, but this interface supports capacity-restricted * they may contain, but this interface supports capacity-restricted
* deques as well as those with no fixed size limit. * deques as well as those with no fixed size limit.
@ -47,10 +47,10 @@ package java.util;
* ends of the deque. Methods are provided to insert, remove, and * ends of the deque. Methods are provided to insert, remove, and
* examine the element. Each of these methods exists in two forms: * examine the element. Each of these methods exists in two forms:
* one throws an exception if the operation fails, the other returns a * one throws an exception if the operation fails, the other returns a
* special value (either <tt>null</tt> or <tt>false</tt>, depending on * special value (either {@code null} or {@code false}, depending on
* the operation). The latter form of the insert operation is * the operation). The latter form of the insert operation is
* designed specifically for use with capacity-restricted * designed specifically for use with capacity-restricted
* <tt>Deque</tt> implementations; in most implementations, insert * {@code Deque} implementations; in most implementations, insert
* operations cannot fail. * operations cannot fail.
* *
* <p>The twelve methods described above are summarized in the * <p>The twelve methods described above are summarized in the
@ -58,6 +58,7 @@ package java.util;
* *
* <p> * <p>
* <table BORDER CELLPADDING=3 CELLSPACING=1> * <table BORDER CELLPADDING=3 CELLSPACING=1>
* <caption>Summary of Deque methods</caption>
* <tr> * <tr>
* <td></td> * <td></td>
* <td ALIGN=CENTER COLSPAN = 2> <b>First Element (Head)</b></td> * <td ALIGN=CENTER COLSPAN = 2> <b>First Element (Head)</b></td>
@ -72,38 +73,39 @@ package java.util;
* </tr> * </tr>
* <tr> * <tr>
* <td><b>Insert</b></td> * <td><b>Insert</b></td>
* <td>{@link #addFirst addFirst(e)}</td> * <td>{@link Deque#addFirst addFirst(e)}</td>
* <td>{@link #offerFirst offerFirst(e)}</td> * <td>{@link Deque#offerFirst offerFirst(e)}</td>
* <td>{@link #addLast addLast(e)}</td> * <td>{@link Deque#addLast addLast(e)}</td>
* <td>{@link #offerLast offerLast(e)}</td> * <td>{@link Deque#offerLast offerLast(e)}</td>
* </tr> * </tr>
* <tr> * <tr>
* <td><b>Remove</b></td> * <td><b>Remove</b></td>
* <td>{@link #removeFirst removeFirst()}</td> * <td>{@link Deque#removeFirst removeFirst()}</td>
* <td>{@link #pollFirst pollFirst()}</td> * <td>{@link Deque#pollFirst pollFirst()}</td>
* <td>{@link #removeLast removeLast()}</td> * <td>{@link Deque#removeLast removeLast()}</td>
* <td>{@link #pollLast pollLast()}</td> * <td>{@link Deque#pollLast pollLast()}</td>
* </tr> * </tr>
* <tr> * <tr>
* <td><b>Examine</b></td> * <td><b>Examine</b></td>
* <td>{@link #getFirst getFirst()}</td> * <td>{@link Deque#getFirst getFirst()}</td>
* <td>{@link #peekFirst peekFirst()}</td> * <td>{@link Deque#peekFirst peekFirst()}</td>
* <td>{@link #getLast getLast()}</td> * <td>{@link Deque#getLast getLast()}</td>
* <td>{@link #peekLast peekLast()}</td> * <td>{@link Deque#peekLast peekLast()}</td>
* </tr> * </tr>
* </table> * </table>
* *
* <p>This interface extends the {@link Queue} interface. When a deque is * <p>This interface extends the {@link Queue} interface. When a deque is
* used as a queue, FIFO (First-In-First-Out) behavior results. Elements are * used as a queue, FIFO (First-In-First-Out) behavior results. Elements are
* added at the end of the deque and removed from the beginning. The methods * added at the end of the deque and removed from the beginning. The methods
* inherited from the <tt>Queue</tt> interface are precisely equivalent to * inherited from the {@code Queue} interface are precisely equivalent to
* <tt>Deque</tt> methods as indicated in the following table: * {@code Deque} methods as indicated in the following table:
* *
* <p> * <p>
* <table BORDER CELLPADDING=3 CELLSPACING=1> * <table BORDER CELLPADDING=3 CELLSPACING=1>
* <caption>Comparison of Queue and Deque methods</caption>
* <tr> * <tr>
* <td ALIGN=CENTER> <b><tt>Queue</tt> Method</b></td> * <td ALIGN=CENTER> <b>{@code Queue} Method</b></td>
* <td ALIGN=CENTER> <b>Equivalent <tt>Deque</tt> Method</b></td> * <td ALIGN=CENTER> <b>Equivalent {@code Deque} Method</b></td>
* </tr> * </tr>
* <tr> * <tr>
* <td>{@link java.util.Queue#add add(e)}</td> * <td>{@link java.util.Queue#add add(e)}</td>
@ -135,13 +137,14 @@ package java.util;
* interface should be used in preference to the legacy {@link Stack} class. * interface should be used in preference to the legacy {@link Stack} class.
* When a deque is used as a stack, elements are pushed and popped from the * When a deque is used as a stack, elements are pushed and popped from the
* beginning of the deque. Stack methods are precisely equivalent to * beginning of the deque. Stack methods are precisely equivalent to
* <tt>Deque</tt> methods as indicated in the table below: * {@code Deque} methods as indicated in the table below:
* *
* <p> * <p>
* <table BORDER CELLPADDING=3 CELLSPACING=1> * <table BORDER CELLPADDING=3 CELLSPACING=1>
* <caption>Comparison of Stack and Deque methods</caption>
* <tr> * <tr>
* <td ALIGN=CENTER> <b>Stack Method</b></td> * <td ALIGN=CENTER> <b>Stack Method</b></td>
* <td ALIGN=CENTER> <b>Equivalent <tt>Deque</tt> Method</b></td> * <td ALIGN=CENTER> <b>Equivalent {@code Deque} Method</b></td>
* </tr> * </tr>
* <tr> * <tr>
* <td>{@link #push push(e)}</td> * <td>{@link #push push(e)}</td>
@ -168,18 +171,18 @@ package java.util;
* <p>Unlike the {@link List} interface, this interface does not * <p>Unlike the {@link List} interface, this interface does not
* provide support for indexed access to elements. * provide support for indexed access to elements.
* *
* <p>While <tt>Deque</tt> implementations are not strictly required * <p>While {@code Deque} implementations are not strictly required
* to prohibit the insertion of null elements, they are strongly * to prohibit the insertion of null elements, they are strongly
* encouraged to do so. Users of any <tt>Deque</tt> implementations * encouraged to do so. Users of any {@code Deque} implementations
* that do allow null elements are strongly encouraged <i>not</i> to * that do allow null elements are strongly encouraged <i>not</i> to
* take advantage of the ability to insert nulls. This is so because * take advantage of the ability to insert nulls. This is so because
* <tt>null</tt> is used as a special return value by various methods * {@code null} is used as a special return value by various methods
* to indicated that the deque is empty. * to indicated that the deque is empty.
* *
* <p><tt>Deque</tt> implementations generally do not define * <p>{@code Deque} implementations generally do not define
* element-based versions of the <tt>equals</tt> and <tt>hashCode</tt> * element-based versions of the {@code equals} and {@code hashCode}
* methods, but instead inherit the identity-based versions from class * methods, but instead inherit the identity-based versions from class
* <tt>Object</tt>. * {@code Object}.
* *
* <p>This interface is a member of the <a * <p>This interface is a member of the <a
* href="{@docRoot}/../technotes/guides/collections/index.html"> Java Collections * href="{@docRoot}/../technotes/guides/collections/index.html"> Java Collections
@ -190,13 +193,13 @@ package java.util;
* @since 1.6 * @since 1.6
* @param <E> the type of elements held in this collection * @param <E> the type of elements held in this collection
*/ */
public interface Deque<E> extends Queue<E> { public interface Deque<E> extends Queue<E> {
/** /**
* Inserts the specified element at the front of this deque if it is * Inserts the specified element at the front of this deque if it is
* possible to do so immediately without violating capacity restrictions. * possible to do so immediately without violating capacity restrictions,
* When using a capacity-restricted deque, it is generally preferable to * throwing an {@code IllegalStateException} if no space is currently
* use method {@link #offerFirst}. * available. When using a capacity-restricted deque, it is generally
* preferable to use method {@link #offerFirst}.
* *
* @param e the element to add * @param e the element to add
* @throws IllegalStateException if the element cannot be added at this * @throws IllegalStateException if the element cannot be added at this
@ -212,9 +215,10 @@ public interface Deque<E> extends Queue<E> {
/** /**
* Inserts the specified element at the end of this deque if it is * Inserts the specified element at the end of this deque if it is
* possible to do so immediately without violating capacity restrictions. * possible to do so immediately without violating capacity restrictions,
* When using a capacity-restricted deque, it is generally preferable to * throwing an {@code IllegalStateException} if no space is currently
* use method {@link #offerLast}. * available. When using a capacity-restricted deque, it is generally
* preferable to use method {@link #offerLast}.
* *
* <p>This method is equivalent to {@link #add}. * <p>This method is equivalent to {@link #add}.
* *
@ -237,8 +241,8 @@ public interface Deque<E> extends Queue<E> {
* which can fail to insert an element only by throwing an exception. * which can fail to insert an element only by throwing an exception.
* *
* @param e the element to add * @param e the element to add
* @return <tt>true</tt> if the element was added to this deque, else * @return {@code true} if the element was added to this deque, else
* <tt>false</tt> * {@code false}
* @throws ClassCastException if the class of the specified element * @throws ClassCastException if the class of the specified element
* prevents it from being added to this deque * prevents it from being added to this deque
* @throws NullPointerException if the specified element is null and this * @throws NullPointerException if the specified element is null and this
@ -255,8 +259,8 @@ public interface Deque<E> extends Queue<E> {
* which can fail to insert an element only by throwing an exception. * which can fail to insert an element only by throwing an exception.
* *
* @param e the element to add * @param e the element to add
* @return <tt>true</tt> if the element was added to this deque, else * @return {@code true} if the element was added to this deque, else
* <tt>false</tt> * {@code false}
* @throws ClassCastException if the class of the specified element * @throws ClassCastException if the class of the specified element
* prevents it from being added to this deque * prevents it from being added to this deque
* @throws NullPointerException if the specified element is null and this * @throws NullPointerException if the specified element is null and this
@ -288,17 +292,17 @@ public interface Deque<E> extends Queue<E> {
/** /**
* Retrieves and removes the first element of this deque, * Retrieves and removes the first element of this deque,
* or returns <tt>null</tt> if this deque is empty. * or returns {@code null} if this deque is empty.
* *
* @return the head of this deque, or <tt>null</tt> if this deque is empty * @return the head of this deque, or {@code null} if this deque is empty
*/ */
E pollFirst(); E pollFirst();
/** /**
* Retrieves and removes the last element of this deque, * Retrieves and removes the last element of this deque,
* or returns <tt>null</tt> if this deque is empty. * or returns {@code null} if this deque is empty.
* *
* @return the tail of this deque, or <tt>null</tt> if this deque is empty * @return the tail of this deque, or {@code null} if this deque is empty
*/ */
E pollLast(); E pollLast();
@ -325,31 +329,31 @@ public interface Deque<E> extends Queue<E> {
/** /**
* Retrieves, but does not remove, the first element of this deque, * Retrieves, but does not remove, the first element of this deque,
* or returns <tt>null</tt> if this deque is empty. * or returns {@code null} if this deque is empty.
* *
* @return the head of this deque, or <tt>null</tt> if this deque is empty * @return the head of this deque, or {@code null} if this deque is empty
*/ */
E peekFirst(); E peekFirst();
/** /**
* Retrieves, but does not remove, the last element of this deque, * Retrieves, but does not remove, the last element of this deque,
* or returns <tt>null</tt> if this deque is empty. * or returns {@code null} if this deque is empty.
* *
* @return the tail of this deque, or <tt>null</tt> if this deque is empty * @return the tail of this deque, or {@code null} if this deque is empty
*/ */
E peekLast(); E peekLast();
/** /**
* Removes the first occurrence of the specified element from this deque. * Removes the first occurrence of the specified element from this deque.
* If the deque does not contain the element, it is unchanged. * If the deque does not contain the element, it is unchanged.
* More formally, removes the first element <tt>e</tt> such that * More formally, removes the first element {@code e} such that
* <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt> * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>
* (if such an element exists). * (if such an element exists).
* Returns <tt>true</tt> if this deque contained the specified element * Returns {@code true} if this deque contained the specified element
* (or equivalently, if this deque changed as a result of the call). * (or equivalently, if this deque changed as a result of the call).
* *
* @param o element to be removed from this deque, if present * @param o element to be removed from this deque, if present
* @return <tt>true</tt> if an element was removed as a result of this call * @return {@code true} if an element was removed as a result of this call
* @throws ClassCastException if the class of the specified element * @throws ClassCastException if the class of the specified element
* is incompatible with this deque * is incompatible with this deque
* (<a href="Collection.html#optional-restrictions">optional</a>) * (<a href="Collection.html#optional-restrictions">optional</a>)
@ -362,14 +366,14 @@ public interface Deque<E> extends Queue<E> {
/** /**
* Removes the last occurrence of the specified element from this deque. * Removes the last occurrence of the specified element from this deque.
* If the deque does not contain the element, it is unchanged. * If the deque does not contain the element, it is unchanged.
* More formally, removes the last element <tt>e</tt> such that * More formally, removes the last element {@code e} such that
* <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt> * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>
* (if such an element exists). * (if such an element exists).
* Returns <tt>true</tt> if this deque contained the specified element * Returns {@code true} if this deque contained the specified element
* (or equivalently, if this deque changed as a result of the call). * (or equivalently, if this deque changed as a result of the call).
* *
* @param o element to be removed from this deque, if present * @param o element to be removed from this deque, if present
* @return <tt>true</tt> if an element was removed as a result of this call * @return {@code true} if an element was removed as a result of this call
* @throws ClassCastException if the class of the specified element * @throws ClassCastException if the class of the specified element
* is incompatible with this deque * is incompatible with this deque
* (<a href="Collection.html#optional-restrictions">optional</a>) * (<a href="Collection.html#optional-restrictions">optional</a>)
@ -385,15 +389,15 @@ public interface Deque<E> extends Queue<E> {
* Inserts the specified element into the queue represented by this deque * Inserts the specified element into the queue represented by this deque
* (in other words, at the tail of this deque) if it is possible to do so * (in other words, at the tail of this deque) if it is possible to do so
* immediately without violating capacity restrictions, returning * immediately without violating capacity restrictions, returning
* <tt>true</tt> upon success and throwing an * {@code true} upon success and throwing an
* <tt>IllegalStateException</tt> if no space is currently available. * {@code IllegalStateException} if no space is currently available.
* When using a capacity-restricted deque, it is generally preferable to * When using a capacity-restricted deque, it is generally preferable to
* use {@link #offer(Object) offer}. * use {@link #offer(Object) offer}.
* *
* <p>This method is equivalent to {@link #addLast}. * <p>This method is equivalent to {@link #addLast}.
* *
* @param e the element to add * @param e the element to add
* @return <tt>true</tt> (as specified by {@link Collection#add}) * @return {@code true} (as specified by {@link Collection#add})
* @throws IllegalStateException if the element cannot be added at this * @throws IllegalStateException if the element cannot be added at this
* time due to capacity restrictions * time due to capacity restrictions
* @throws ClassCastException if the class of the specified element * @throws ClassCastException if the class of the specified element
@ -409,7 +413,7 @@ public interface Deque<E> extends Queue<E> {
* Inserts the specified element into the queue represented by this deque * Inserts the specified element into the queue represented by this deque
* (in other words, at the tail of this deque) if it is possible to do so * (in other words, at the tail of this deque) if it is possible to do so
* immediately without violating capacity restrictions, returning * immediately without violating capacity restrictions, returning
* <tt>true</tt> upon success and <tt>false</tt> if no space is currently * {@code true} upon success and {@code false} if no space is currently
* available. When using a capacity-restricted deque, this method is * available. When using a capacity-restricted deque, this method is
* generally preferable to the {@link #add} method, which can fail to * generally preferable to the {@link #add} method, which can fail to
* insert an element only by throwing an exception. * insert an element only by throwing an exception.
@ -417,8 +421,8 @@ public interface Deque<E> extends Queue<E> {
* <p>This method is equivalent to {@link #offerLast}. * <p>This method is equivalent to {@link #offerLast}.
* *
* @param e the element to add * @param e the element to add
* @return <tt>true</tt> if the element was added to this deque, else * @return {@code true} if the element was added to this deque, else
* <tt>false</tt> * {@code false}
* @throws ClassCastException if the class of the specified element * @throws ClassCastException if the class of the specified element
* prevents it from being added to this deque * prevents it from being added to this deque
* @throws NullPointerException if the specified element is null and this * @throws NullPointerException if the specified element is null and this
@ -444,11 +448,11 @@ public interface Deque<E> extends Queue<E> {
/** /**
* Retrieves and removes the head of the queue represented by this deque * Retrieves and removes the head of the queue represented by this deque
* (in other words, the first element of this deque), or returns * (in other words, the first element of this deque), or returns
* <tt>null</tt> if this deque is empty. * {@code null} if this deque is empty.
* *
* <p>This method is equivalent to {@link #pollFirst()}. * <p>This method is equivalent to {@link #pollFirst()}.
* *
* @return the first element of this deque, or <tt>null</tt> if * @return the first element of this deque, or {@code null} if
* this deque is empty * this deque is empty
*/ */
E poll(); E poll();
@ -469,12 +473,12 @@ public interface Deque<E> extends Queue<E> {
/** /**
* Retrieves, but does not remove, the head of the queue represented by * Retrieves, but does not remove, the head of the queue represented by
* this deque (in other words, the first element of this deque), or * this deque (in other words, the first element of this deque), or
* returns <tt>null</tt> if this deque is empty. * returns {@code null} if this deque is empty.
* *
* <p>This method is equivalent to {@link #peekFirst()}. * <p>This method is equivalent to {@link #peekFirst()}.
* *
* @return the head of the queue represented by this deque, or * @return the head of the queue represented by this deque, or
* <tt>null</tt> if this deque is empty * {@code null} if this deque is empty
*/ */
E peek(); E peek();
@ -484,9 +488,8 @@ public interface Deque<E> extends Queue<E> {
/** /**
* Pushes an element onto the stack represented by this deque (in other * Pushes an element onto the stack represented by this deque (in other
* words, at the head of this deque) if it is possible to do so * words, at the head of this deque) if it is possible to do so
* immediately without violating capacity restrictions, returning * immediately without violating capacity restrictions, throwing an
* <tt>true</tt> upon success and throwing an * {@code IllegalStateException} if no space is currently available.
* <tt>IllegalStateException</tt> if no space is currently available.
* *
* <p>This method is equivalent to {@link #addFirst}. * <p>This method is equivalent to {@link #addFirst}.
* *
@ -520,16 +523,16 @@ public interface Deque<E> extends Queue<E> {
/** /**
* Removes the first occurrence of the specified element from this deque. * Removes the first occurrence of the specified element from this deque.
* If the deque does not contain the element, it is unchanged. * If the deque does not contain the element, it is unchanged.
* More formally, removes the first element <tt>e</tt> such that * More formally, removes the first element {@code e} such that
* <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt> * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>
* (if such an element exists). * (if such an element exists).
* Returns <tt>true</tt> if this deque contained the specified element * Returns {@code true} if this deque contained the specified element
* (or equivalently, if this deque changed as a result of the call). * (or equivalently, if this deque changed as a result of the call).
* *
* <p>This method is equivalent to {@link #removeFirstOccurrence}. * <p>This method is equivalent to {@link #removeFirstOccurrence(Object)}.
* *
* @param o element to be removed from this deque, if present * @param o element to be removed from this deque, if present
* @return <tt>true</tt> if an element was removed as a result of this call * @return {@code true} if an element was removed as a result of this call
* @throws ClassCastException if the class of the specified element * @throws ClassCastException if the class of the specified element
* is incompatible with this deque * is incompatible with this deque
* (<a href="Collection.html#optional-restrictions">optional</a>) * (<a href="Collection.html#optional-restrictions">optional</a>)
@ -540,13 +543,13 @@ public interface Deque<E> extends Queue<E> {
boolean remove(Object o); boolean remove(Object o);
/** /**
* Returns <tt>true</tt> if this deque contains the specified element. * Returns {@code true} if this deque contains the specified element.
* More formally, returns <tt>true</tt> if and only if this deque contains * More formally, returns {@code true} if and only if this deque contains
* at least one element <tt>e</tt> such that * at least one element {@code e} such that
* <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>. * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>.
* *
* @param o element whose presence in this deque is to be tested * @param o element whose presence in this deque is to be tested
* @return <tt>true</tt> if this deque contains the specified element * @return {@code true} if this deque contains the specified element
* @throws ClassCastException if the type of the specified element * @throws ClassCastException if the type of the specified element
* is incompatible with this deque * is incompatible with this deque
* (<a href="Collection.html#optional-restrictions">optional</a>) * (<a href="Collection.html#optional-restrictions">optional</a>)

View File

@ -25,6 +25,7 @@
package java.util; package java.util;
import java.util.function.DoubleConsumer; import java.util.function.DoubleConsumer;
import java.util.stream.Collector;
/** /**
* A state object for collecting statistics such as count, min, max, sum, and * A state object for collecting statistics such as count, min, max, sum, and
@ -35,24 +36,24 @@ import java.util.function.DoubleConsumer;
* summary statistics on a stream of doubles with: * summary statistics on a stream of doubles with:
* <pre> {@code * <pre> {@code
* DoubleSummaryStatistics stats = doubleStream.collect(DoubleSummaryStatistics::new, * DoubleSummaryStatistics stats = doubleStream.collect(DoubleSummaryStatistics::new,
* DoubleSummaryStatistics::accept, * DoubleSummaryStatistics::accept,
* DoubleSummaryStatistics::combine); * DoubleSummaryStatistics::combine);
* }</pre> * }</pre>
* *
* <p>{@code DoubleSummaryStatistics} can be used as a * <p>{@code DoubleSummaryStatistics} can be used as a
* {@linkplain java.util.stream.Stream#reduce(java.util.function.BinaryOperator) reduction} * {@linkplain java.util.stream.Stream#collect(Collector) reduction}
* target for a {@linkplain java.util.stream.Stream stream}. For example: * target for a {@linkplain java.util.stream.Stream stream}. For example:
* *
* <pre> {@code * <pre> {@code
* DoubleSummaryStatistics stats = people.stream() * DoubleSummaryStatistics stats = people.stream()
* .collect(Collectors.toDoubleSummaryStatistics(Person::getWeight)); * .collect(Collectors.summarizingDouble(Person::getWeight));
*}</pre> *}</pre>
* *
* This computes, in a single pass, the count of people, as well as the minimum, * This computes, in a single pass, the count of people, as well as the minimum,
* maximum, sum, and average of their weights. * maximum, sum, and average of their weights.
* *
* @implNote This implementation is not thread safe. However, it is safe to use * @implNote This implementation is not thread safe. However, it is safe to use
* {@link java.util.stream.Collectors#toDoubleSummaryStatistics(java.util.function.ToDoubleFunction) * {@link java.util.stream.Collectors#summarizingDouble(java.util.function.ToDoubleFunction)
* Collectors.toDoubleStatistics()} on a parallel stream, because the parallel * Collectors.toDoubleStatistics()} on a parallel stream, because the parallel
* implementation of {@link java.util.stream.Stream#collect Stream.collect()} * implementation of {@link java.util.stream.Stream#collect Stream.collect()}
* provides the necessary partitioning, isolation, and merging of results for * provides the necessary partitioning, isolation, and merging of results for
@ -152,7 +153,7 @@ public class DoubleSummaryStatistics implements DoubleConsumer {
} }
/** /**
* Returns the average of values recorded, or zero if no values have been * Returns the arithmetic mean of values recorded, or zero if no values have been
* recorded. The average returned can vary depending upon the order in * recorded. The average returned can vary depending upon the order in
* which values are recorded. This is due to accumulated rounding error in * which values are recorded. This is due to accumulated rounding error in
* addition of values of differing magnitudes. Values sorted by increasing * addition of values of differing magnitudes. Values sorted by increasing
@ -160,7 +161,7 @@ public class DoubleSummaryStatistics implements DoubleConsumer {
* value is a {@code NaN} or the sum is at any point a {@code NaN} then the * value is a {@code NaN} or the sum is at any point a {@code NaN} then the
* average will be {@code NaN}. * average will be {@code NaN}.
* *
* @return the average of values, or zero if none * @return the arithmetic mean of values, or zero if none
*/ */
public final double getAverage() { public final double getAverage() {
return getCount() > 0 ? getSum() / getCount() : 0.0d; return getCount() > 0 ? getSum() / getCount() : 0.0d;

View File

@ -626,12 +626,11 @@ import sun.misc.FormattedFloatingDecimal;
* <p> For general argument types, the precision is the maximum number of * <p> For general argument types, the precision is the maximum number of
* characters to be written to the output. * characters to be written to the output.
* *
* <p> For the floating-point conversions {@code 'e'}, {@code 'E'}, and * <p> For the floating-point conversions {@code 'a'}, {@code 'A'}, {@code 'e'},
* {@code 'f'} the precision is the number of digits after the decimal * {@code 'E'}, and {@code 'f'} the precision is the number of digits after the
* separator. If the conversion is {@code 'g'} or {@code 'G'}, then the * radix point. If the conversion is {@code 'g'} or {@code 'G'}, then the
* precision is the total number of digits in the resulting magnitude after * precision is the total number of digits in the resulting magnitude after
* rounding. If the conversion is {@code 'a'} or {@code 'A'}, then the * rounding.
* precision must not be specified.
* *
* <p> For character, integral, and date/time argument types and the percent * <p> For character, integral, and date/time argument types and the percent
* and line separator conversions, the precision is not applicable; if a * and line separator conversions, the precision is not applicable; if a
@ -1297,14 +1296,21 @@ import sun.misc.FormattedFloatingDecimal;
* of the significand as a fraction. The exponent is represented by * of the significand as a fraction. The exponent is represented by
* {@code 'p'} (<tt>'&#92;u0070'</tt>) followed by a decimal string of the * {@code 'p'} (<tt>'&#92;u0070'</tt>) followed by a decimal string of the
* unbiased exponent as if produced by invoking {@link * unbiased exponent as if produced by invoking {@link
* Integer#toString(int) Integer.toString} on the exponent value. * Integer#toString(int) Integer.toString} on the exponent value. If the
* precision is specified, the value is rounded to the given number of
* hexadecimal digits.
* *
* <li> If <i>m</i> is a {@code double} value with a subnormal * <li> If <i>m</i> is a {@code double} value with a subnormal
* representation then the significand is represented by the characters * representation then, unless the precision is specified to be in the range
* {@code '0x0.'} followed by the hexadecimal representation of the rest * 1 through 12, inclusive, the significand is represented by the characters
* of the significand as a fraction. The exponent is represented by * {@code '0x0.'} followed by the hexadecimal representation of the rest of
* {@code 'p-1022'}. Note that there must be at least one nonzero digit * the significand as a fraction, and the exponent represented by
* in a subnormal significand. * {@code 'p-1022'}. If the precision is in the interval
* [1,&nbsp;12], the subnormal value is normalized such that it
* begins with the characters {@code '0x1.'}, rounded to the number of
* hexadecimal digits of precision, and the exponent adjusted
* accordingly. Note that there must be at least one nonzero digit in a
* subnormal significand.
* *
* </ul> * </ul>
* *
@ -1367,7 +1373,7 @@ import sun.misc.FormattedFloatingDecimal;
* {@code 1}. * {@code 1}.
* *
* <p> If the conversion is {@code 'a'} or {@code 'A'}, then the precision * <p> If the conversion is {@code 'a'} or {@code 'A'}, then the precision
* is the number of hexadecimal digits after the decimal separator. If the * is the number of hexadecimal digits after the radix point. If the
* precision is not provided, then all of the digits as returned by {@link * precision is not provided, then all of the digits as returned by {@link
* Double#toHexString(double)} will be output. * Double#toHexString(double)} will be output.
* *

View File

@ -876,13 +876,9 @@ public class HashMap<K,V>
private static int roundUpToPowerOf2(int number) { private static int roundUpToPowerOf2(int number) {
// assert number >= 0 : "number must be non-negative"; // assert number >= 0 : "number must be non-negative";
int rounded = number >= MAXIMUM_CAPACITY return number >= MAXIMUM_CAPACITY
? MAXIMUM_CAPACITY ? MAXIMUM_CAPACITY
: (rounded = Integer.highestOneBit(number)) != 0 : (number > 1) ? Integer.highestOneBit((number - 1) << 1) : 1;
? (Integer.bitCount(number) > 1) ? rounded << 1 : rounded
: 1;
return rounded;
} }
/** /**

View File

@ -928,6 +928,7 @@ public class Hashtable<K,V>
return (null == result) ? defaultValue : result; return (null == result) ? defaultValue : result;
} }
@SuppressWarnings("unchecked")
@Override @Override
public synchronized void forEach(BiConsumer<? super K, ? super V> action) { public synchronized void forEach(BiConsumer<? super K, ? super V> action) {
Objects.requireNonNull(action); // explicit check required in case Objects.requireNonNull(action); // explicit check required in case
@ -947,6 +948,7 @@ public class Hashtable<K,V>
} }
} }
@SuppressWarnings("unchecked")
@Override @Override
public synchronized void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) { public synchronized void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
Objects.requireNonNull(function); // explicit check required in case Objects.requireNonNull(function); // explicit check required in case

View File

@ -1339,6 +1339,7 @@ public class IdentityHashMap<K,V>
tab[i + 1] = value; tab[i + 1] = value;
} }
@SuppressWarnings("unchecked")
@Override @Override
public void forEach(BiConsumer<? super K, ? super V> action) { public void forEach(BiConsumer<? super K, ? super V> action) {
Objects.requireNonNull(action); Objects.requireNonNull(action);
@ -1357,6 +1358,7 @@ public class IdentityHashMap<K,V>
} }
} }
@SuppressWarnings("unchecked")
@Override @Override
public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) { public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
Objects.requireNonNull(function); Objects.requireNonNull(function);

View File

@ -25,6 +25,7 @@
package java.util; package java.util;
import java.util.function.IntConsumer; import java.util.function.IntConsumer;
import java.util.stream.Collector;
/** /**
* A state object for collecting statistics such as count, min, max, sum, and * A state object for collecting statistics such as count, min, max, sum, and
@ -35,24 +36,24 @@ import java.util.function.IntConsumer;
* summary statistics on a stream of ints with: * summary statistics on a stream of ints with:
* <pre> {@code * <pre> {@code
* IntSummaryStatistics stats = intStream.collect(IntSummaryStatistics::new, * IntSummaryStatistics stats = intStream.collect(IntSummaryStatistics::new,
* IntSummaryStatistics::accept, * IntSummaryStatistics::accept,
* IntSummaryStatistics::combine); * IntSummaryStatistics::combine);
* }</pre> * }</pre>
* *
* <p>{@code IntSummaryStatistics} can be used as a * <p>{@code IntSummaryStatistics} can be used as a
* {@linkplain java.util.stream.Stream#reduce(java.util.function.BinaryOperator) reduction} * {@linkplain java.util.stream.Stream#collect(Collector) reduction}
* target for a {@linkplain java.util.stream.Stream stream}. For example: * target for a {@linkplain java.util.stream.Stream stream}. For example:
* *
* <pre> {@code * <pre> {@code
* IntSummaryStatistics stats = people.stream() * IntSummaryStatistics stats = people.stream()
* .collect(Collectors.toIntSummaryStatistics(Person::getDependents)); * .collect(Collectors.summarizingInt(Person::getDependents));
*}</pre> *}</pre>
* *
* This computes, in a single pass, the count of people, as well as the minimum, * This computes, in a single pass, the count of people, as well as the minimum,
* maximum, sum, and average of their number of dependents. * maximum, sum, and average of their number of dependents.
* *
* @implNote This implementation is not thread safe. However, it is safe to use * @implNote This implementation is not thread safe. However, it is safe to use
* {@link java.util.stream.Collectors#toIntSummaryStatistics(java.util.function.ToIntFunction) * {@link java.util.stream.Collectors#summarizingInt(java.util.function.ToIntFunction)
* Collectors.toIntStatistics()} on a parallel stream, because the parallel * Collectors.toIntStatistics()} on a parallel stream, because the parallel
* implementation of {@link java.util.stream.Stream#collect Stream.collect()} * implementation of {@link java.util.stream.Stream#collect Stream.collect()}
* provides the necessary partitioning, isolation, and merging of results for * provides the necessary partitioning, isolation, and merging of results for
@ -140,10 +141,10 @@ public class IntSummaryStatistics implements IntConsumer {
} }
/** /**
* Returns the average of values recorded, or zero if no values have been * Returns the arithmetic mean of values recorded, or zero if no values have been
* recorded. * recorded.
* *
* @return the average of values, or zero if none * @return the arithmetic mean of values, or zero if none
*/ */
public final double getAverage() { public final double getAverage() {
return getCount() > 0 ? (double) getSum() / getCount() : 0.0d; return getCount() > 0 ? (double) getSum() / getCount() : 0.0d;

View File

@ -26,6 +26,7 @@ package java.util;
import java.util.function.IntConsumer; import java.util.function.IntConsumer;
import java.util.function.LongConsumer; import java.util.function.LongConsumer;
import java.util.stream.Collector;
/** /**
* A state object for collecting statistics such as count, min, max, sum, and * A state object for collecting statistics such as count, min, max, sum, and
@ -36,24 +37,24 @@ import java.util.function.LongConsumer;
* summary statistics on a stream of longs with: * summary statistics on a stream of longs with:
* <pre> {@code * <pre> {@code
* LongSummaryStatistics stats = longStream.collect(LongSummaryStatistics::new, * LongSummaryStatistics stats = longStream.collect(LongSummaryStatistics::new,
* LongSummaryStatistics::accept, * LongSummaryStatistics::accept,
* LongSummaryStatistics::combine); * LongSummaryStatistics::combine);
* }</pre> * }</pre>
* *
* <p>{@code LongSummaryStatistics} can be used as a * <p>{@code LongSummaryStatistics} can be used as a
* {@linkplain java.util.stream.Stream#reduce(java.util.function.BinaryOperator) reduction} * {@linkplain java.util.stream.Stream#collect(Collector)} reduction}
* target for a {@linkplain java.util.stream.Stream stream}. For example: * target for a {@linkplain java.util.stream.Stream stream}. For example:
* *
* <pre> {@code * <pre> {@code
* LongSummaryStatistics stats = people.stream() * LongSummaryStatistics stats = people.stream()
* .collect(Collectors.toLongSummaryStatistics(Person::getAge)); * .collect(Collectors.summarizingLong(Person::getAge));
*}</pre> *}</pre>
* *
* This computes, in a single pass, the count of people, as well as the minimum, * This computes, in a single pass, the count of people, as well as the minimum,
* maximum, sum, and average of their ages in milliseconds. * maximum, sum, and average of their ages.
* *
* @implNote This implementation is not thread safe. However, it is safe to use * @implNote This implementation is not thread safe. However, it is safe to use
* {@link java.util.stream.Collectors#toLongSummaryStatistics(java.util.function.ToLongFunction) * {@link java.util.stream.Collectors#summarizingLong(java.util.function.ToLongFunction)
* Collectors.toLongStatistics()} on a parallel stream, because the parallel * Collectors.toLongStatistics()} on a parallel stream, because the parallel
* implementation of {@link java.util.stream.Stream#collect Stream.collect()} * implementation of {@link java.util.stream.Stream#collect Stream.collect()}
* provides the necessary partitioning, isolation, and merging of results for * provides the necessary partitioning, isolation, and merging of results for
@ -152,10 +153,10 @@ public class LongSummaryStatistics implements LongConsumer, IntConsumer {
} }
/** /**
* Returns the average of values recorded, or zero if no values have been * Returns the arithmetic mean of values recorded, or zero if no values have been
* recorded. * recorded.
* *
* @return The average of values, or zero if none * @return The arithmetic mean of values, or zero if none
*/ */
public final double getAverage() { public final double getAverage() {
return getCount() > 0 ? (double) getSum() / getCount() : 0.0d; return getCount() > 0 ? (double) getSum() / getCount() : 0.0d;

View File

@ -307,7 +307,7 @@ public final class Optional<T> {
return false; return false;
} }
Optional other = (Optional) obj; Optional<?> other = (Optional<?>) obj;
return Objects.equals(value, other.value); return Objects.equals(value, other.value);
} }

View File

@ -41,14 +41,15 @@ package java.util;
* queues provide additional insertion, extraction, and inspection * queues provide additional insertion, extraction, and inspection
* operations. Each of these methods exists in two forms: one throws * operations. Each of these methods exists in two forms: one throws
* an exception if the operation fails, the other returns a special * an exception if the operation fails, the other returns a special
* value (either <tt>null</tt> or <tt>false</tt>, depending on the * value (either {@code null} or {@code false}, depending on the
* operation). The latter form of the insert operation is designed * operation). The latter form of the insert operation is designed
* specifically for use with capacity-restricted <tt>Queue</tt> * specifically for use with capacity-restricted {@code Queue}
* implementations; in most implementations, insert operations cannot * implementations; in most implementations, insert operations cannot
* fail. * fail.
* *
* <p> * <p>
* <table BORDER CELLPADDING=3 CELLSPACING=1> * <table BORDER CELLPADDING=3 CELLSPACING=1>
* <caption>Summary of Queue methods</caption>
* <tr> * <tr>
* <td></td> * <td></td>
* <td ALIGN=CENTER><em>Throws exception</em></td> * <td ALIGN=CENTER><em>Throws exception</em></td>
@ -56,18 +57,18 @@ package java.util;
* </tr> * </tr>
* <tr> * <tr>
* <td><b>Insert</b></td> * <td><b>Insert</b></td>
* <td>{@link #add add(e)}</td> * <td>{@link Queue#add add(e)}</td>
* <td>{@link #offer offer(e)}</td> * <td>{@link Queue#offer offer(e)}</td>
* </tr> * </tr>
* <tr> * <tr>
* <td><b>Remove</b></td> * <td><b>Remove</b></td>
* <td>{@link #remove remove()}</td> * <td>{@link Queue#remove remove()}</td>
* <td>{@link #poll poll()}</td> * <td>{@link Queue#poll poll()}</td>
* </tr> * </tr>
* <tr> * <tr>
* <td><b>Examine</b></td> * <td><b>Examine</b></td>
* <td>{@link #element element()}</td> * <td>{@link Queue#element element()}</td>
* <td>{@link #peek peek()}</td> * <td>{@link Queue#peek peek()}</td>
* </tr> * </tr>
* </table> * </table>
* *
@ -79,15 +80,15 @@ package java.util;
* Whatever the ordering used, the <em>head</em> of the queue is that * Whatever the ordering used, the <em>head</em> of the queue is that
* element which would be removed by a call to {@link #remove() } or * element which would be removed by a call to {@link #remove() } or
* {@link #poll()}. In a FIFO queue, all new elements are inserted at * {@link #poll()}. In a FIFO queue, all new elements are inserted at
* the <em> tail</em> of the queue. Other kinds of queues may use * the <em>tail</em> of the queue. Other kinds of queues may use
* different placement rules. Every <tt>Queue</tt> implementation * different placement rules. Every {@code Queue} implementation
* must specify its ordering properties. * must specify its ordering properties.
* *
* <p>The {@link #offer offer} method inserts an element if possible, * <p>The {@link #offer offer} method inserts an element if possible,
* otherwise returning <tt>false</tt>. This differs from the {@link * otherwise returning {@code false}. This differs from the {@link
* java.util.Collection#add Collection.add} method, which can fail to * java.util.Collection#add Collection.add} method, which can fail to
* add an element only by throwing an unchecked exception. The * add an element only by throwing an unchecked exception. The
* <tt>offer</tt> method is designed for use when failure is a normal, * {@code offer} method is designed for use when failure is a normal,
* rather than exceptional occurrence, for example, in fixed-capacity * rather than exceptional occurrence, for example, in fixed-capacity
* (or &quot;bounded&quot;) queues. * (or &quot;bounded&quot;) queues.
* *
@ -95,32 +96,32 @@ package java.util;
* return the head of the queue. * return the head of the queue.
* Exactly which element is removed from the queue is a * Exactly which element is removed from the queue is a
* function of the queue's ordering policy, which differs from * function of the queue's ordering policy, which differs from
* implementation to implementation. The <tt>remove()</tt> and * implementation to implementation. The {@code remove()} and
* <tt>poll()</tt> methods differ only in their behavior when the * {@code poll()} methods differ only in their behavior when the
* queue is empty: the <tt>remove()</tt> method throws an exception, * queue is empty: the {@code remove()} method throws an exception,
* while the <tt>poll()</tt> method returns <tt>null</tt>. * while the {@code poll()} method returns {@code null}.
* *
* <p>The {@link #element()} and {@link #peek()} methods return, but do * <p>The {@link #element()} and {@link #peek()} methods return, but do
* not remove, the head of the queue. * not remove, the head of the queue.
* *
* <p>The <tt>Queue</tt> interface does not define the <i>blocking queue * <p>The {@code Queue} interface does not define the <i>blocking queue
* methods</i>, which are common in concurrent programming. These methods, * methods</i>, which are common in concurrent programming. These methods,
* which wait for elements to appear or for space to become available, are * which wait for elements to appear or for space to become available, are
* defined in the {@link java.util.concurrent.BlockingQueue} interface, which * defined in the {@link java.util.concurrent.BlockingQueue} interface, which
* extends this interface. * extends this interface.
* *
* <p><tt>Queue</tt> implementations generally do not allow insertion * <p>{@code Queue} implementations generally do not allow insertion
* of <tt>null</tt> elements, although some implementations, such as * of {@code null} elements, although some implementations, such as
* {@link LinkedList}, do not prohibit insertion of <tt>null</tt>. * {@link LinkedList}, do not prohibit insertion of {@code null}.
* Even in the implementations that permit it, <tt>null</tt> should * Even in the implementations that permit it, {@code null} should
* not be inserted into a <tt>Queue</tt>, as <tt>null</tt> is also * not be inserted into a {@code Queue}, as {@code null} is also
* used as a special return value by the <tt>poll</tt> method to * used as a special return value by the {@code poll} method to
* indicate that the queue contains no elements. * indicate that the queue contains no elements.
* *
* <p><tt>Queue</tt> implementations generally do not define * <p>{@code Queue} implementations generally do not define
* element-based versions of methods <tt>equals</tt> and * element-based versions of methods {@code equals} and
* <tt>hashCode</tt> but instead inherit the identity based versions * {@code hashCode} but instead inherit the identity based versions
* from class <tt>Object</tt>, because element-based equality is not * from class {@code Object}, because element-based equality is not
* always well-defined for queues with the same elements but different * always well-defined for queues with the same elements but different
* ordering properties. * ordering properties.
* *
@ -145,11 +146,11 @@ public interface Queue<E> extends Collection<E> {
/** /**
* Inserts the specified element into this queue if it is possible to do so * Inserts the specified element into this queue if it is possible to do so
* immediately without violating capacity restrictions, returning * immediately without violating capacity restrictions, returning
* <tt>true</tt> upon success and throwing an <tt>IllegalStateException</tt> * {@code true} upon success and throwing an {@code IllegalStateException}
* if no space is currently available. * if no space is currently available.
* *
* @param e the element to add * @param e the element to add
* @return <tt>true</tt> (as specified by {@link Collection#add}) * @return {@code true} (as specified by {@link Collection#add})
* @throws IllegalStateException if the element cannot be added at this * @throws IllegalStateException if the element cannot be added at this
* time due to capacity restrictions * time due to capacity restrictions
* @throws ClassCastException if the class of the specified element * @throws ClassCastException if the class of the specified element
@ -169,8 +170,8 @@ public interface Queue<E> extends Collection<E> {
* by throwing an exception. * by throwing an exception.
* *
* @param e the element to add * @param e the element to add
* @return <tt>true</tt> if the element was added to this queue, else * @return {@code true} if the element was added to this queue, else
* <tt>false</tt> * {@code false}
* @throws ClassCastException if the class of the specified element * @throws ClassCastException if the class of the specified element
* prevents it from being added to this queue * prevents it from being added to this queue
* @throws NullPointerException if the specified element is null and * @throws NullPointerException if the specified element is null and
@ -192,9 +193,9 @@ public interface Queue<E> extends Collection<E> {
/** /**
* Retrieves and removes the head of this queue, * Retrieves and removes the head of this queue,
* or returns <tt>null</tt> if this queue is empty. * or returns {@code null} if this queue is empty.
* *
* @return the head of this queue, or <tt>null</tt> if this queue is empty * @return the head of this queue, or {@code null} if this queue is empty
*/ */
E poll(); E poll();
@ -210,9 +211,9 @@ public interface Queue<E> extends Collection<E> {
/** /**
* Retrieves, but does not remove, the head of this queue, * Retrieves, but does not remove, the head of this queue,
* or returns <tt>null</tt> if this queue is empty. * or returns {@code null} if this queue is empty.
* *
* @return the head of this queue, or <tt>null</tt> if this queue is empty * @return the head of this queue, or {@code null} if this queue is empty
*/ */
E peek(); E peek();
} }

View File

@ -49,16 +49,17 @@ package java.util;
* <p> * <p>
* A {@code StringJoiner} may be employed to create formatted output from a * A {@code StringJoiner} may be employed to create formatted output from a
* {@link java.util.stream.Stream} using * {@link java.util.stream.Stream} using
* {@link java.util.stream.Collectors#toStringJoiner}. For example: * {@link java.util.stream.Collectors#joining(CharSequence)}. For example:
* *
* <pre> {@code * <pre> {@code
* List<Integer> numbers = Arrays.asList(1, 2, 3, 4); * List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
* String commaSeparatedNumbers = numbers.stream() * String commaSeparatedNumbers = numbers.stream()
* .map(i -> i.toString()) * .map(i -> i.toString())
* .collect(Collectors.toStringJoiner(", ")).toString(); * .collect(Collectors.joining(", "));
* }</pre> * }</pre>
* *
* @see java.util.stream.Collectors#toStringJoiner * @see java.util.stream.Collectors#joining(CharSequence)
* @see java.util.stream.Collectors#joining(CharSequence, CharSequence, CharSequence)
* @since 1.8 * @since 1.8
*/ */
public final class StringJoiner { public final class StringJoiner {

View File

@ -1164,12 +1164,13 @@ public class Vector<E>
if (i >= size) { if (i >= size) {
return; return;
} }
final Object[] elementData = Vector.this.elementData; @SuppressWarnings("unchecked")
final E[] elementData = (E[]) Vector.this.elementData;
if (i >= elementData.length) { if (i >= elementData.length) {
throw new ConcurrentModificationException(); throw new ConcurrentModificationException();
} }
while (i != size && modCount == expectedModCount) { while (i != size && modCount == expectedModCount) {
action.accept((E) elementData[i++]); action.accept(elementData[i++]);
} }
// update once at end of iteration to reduce heap write traffic // update once at end of iteration to reduce heap write traffic
cursor = i; cursor = i;
@ -1311,8 +1312,8 @@ public class Vector<E>
modCount++; modCount++;
} }
@Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override
public synchronized void sort(Comparator<? super E> c) { public synchronized void sort(Comparator<? super E> c) {
final int expectedModCount = modCount; final int expectedModCount = modCount;
Arrays.sort((E[]) elementData, 0, elementCount, c); Arrays.sort((E[]) elementData, 0, elementCount, c);

View File

@ -1038,6 +1038,7 @@ public class WeakHashMap<K,V>
} }
} }
@SuppressWarnings("unchecked")
@Override @Override
public void forEach(BiConsumer<? super K, ? super V> action) { public void forEach(BiConsumer<? super K, ? super V> action) {
Objects.requireNonNull(action); Objects.requireNonNull(action);
@ -1059,6 +1060,7 @@ public class WeakHashMap<K,V>
} }
} }
@SuppressWarnings("unchecked")
@Override @Override
public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) { public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
Objects.requireNonNull(function); Objects.requireNonNull(function);

View File

@ -0,0 +1,760 @@
/*
* 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.
*/
/*
* This file is available under and governed by the GNU General Public
* License version 2 only, as published by the Free Software Foundation.
* However, the following notice accompanied the original version of this
* file:
*
* Written by Doug Lea with assistance from members of JCP JSR-166
* Expert Group and released to the public domain, as explained at
* http://creativecommons.org/publicdomain/zero/1.0/
*/
package java.util.concurrent;
import java.util.function.Supplier;
import java.util.function.Consumer;
import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.function.BiFunction;
import java.util.concurrent.Executor;
/**
* A stage of a possibly asynchronous computation, that performs an
* action or computes a value when another CompletionStage completes.
* A stage completes upon termination of its computation, but this may
* in turn trigger other dependent stages. The functionality defined
* in this interface takes only a few basic forms, which expand out to
* a larger set of methods to capture a range of usage styles: <ul>
*
* <li>The computation performed by a stage may be expressed as a
* Function, Consumer, or Runnable (using methods with names including
* <em>apply</em>, <em>accept</em>, or <em>run</em>, respectively)
* depending on whether it requires arguments and/or produces results.
* For example, {@code stage.thenApply(x -> square(x)).thenAccept(x ->
* System.out.print(x)).thenRun(() -> System.out.println())}. An
* additional form (<em>compose</em>) applies functions of stages
* themselves, rather than their results. </li>
*
* <li> One stage's execution may be triggered by completion of a
* single stage, or both of two stages, or either of two stages.
* Dependencies on a single stage are arranged using methods with
* prefix <em>then</em>. Those triggered by completion of
* <em>both</em> of two stages may <em>combine</em> their results or
* effects, using correspondingly named methods. Those triggered by
* <em>either</em> of two stages make no guarantees about which of the
* results or effects are used for the dependent stage's
* computation.</li>
*
* <li> Dependencies among stages control the triggering of
* computations, but do not otherwise guarantee any particular
* ordering. Additionally, execution of a new stage's computations may
* be arranged in any of three ways: default execution, default
* asynchronous execution (using methods with suffix <em>async</em>
* that employ the stage's default asynchronous execution facility),
* or custom (via a supplied {@link Executor}). The execution
* properties of default and async modes are specified by
* CompletionStage implementations, not this interface. Methods with
* explicit Executor arguments may have arbitrary execution
* properties, and might not even support concurrent execution, but
* are arranged for processing in a way that accommodates asynchrony.
*
* <li> Two method forms support processing whether the triggering
* stage completed normally or exceptionally: Method {@link
* #whenComplete whenComplete} allows injection of an action
* regardless of outcome, otherwise preserving the outcome in its
* completion. Method {@link #handle handle} additionally allows the
* stage to compute a replacement result that may enable further
* processing by other dependent stages. In all other cases, if a
* stage's computation terminates abruptly with an (unchecked)
* exception or error, then all dependent stages requiring its
* completion complete exceptionally as well, with a {@link
* CompletionException} holding the exception as its cause. If a
* stage is dependent on <em>both</em> of two stages, and both
* complete exceptionally, then the CompletionException may correspond
* to either one of these exceptions. If a stage is dependent on
* <em>either</em> of two others, and only one of them completes
* exceptionally, no guarantees are made about whether the dependent
* stage completes normally or exceptionally. In the case of method
* {@code whenComplete}, when the supplied action itself encounters an
* exception, then the stage exceptionally completes with this
* exception if not already completed exceptionally.</li>
*
* </ul>
*
* <p>All methods adhere to the above triggering, execution, and
* exceptional completion specifications (which are not repeated in
* individual method specifications). Additionally, while arguments
* used to pass a completion result (that is, for parameters of type
* {@code T}) for methods accepting them may be null, passing a null
* value for any other parameter will result in a {@link
* NullPointerException} being thrown.
*
* <p>This interface does not define methods for initially creating,
* forcibly completing normally or exceptionally, probing completion
* status or results, or awaiting completion of a stage.
* Implementations of CompletionStage may provide means of achieving
* such effects, as appropriate. Method {@link #toCompletableFuture}
* enables interoperability among different implementations of this
* interface by providing a common conversion type.
*
* @author Doug Lea
* @since 1.8
*/
public interface CompletionStage<T> {
/**
* Returns a new CompletionStage that, when this stage completes
* normally, is executed with this stage's result as the argument
* to the supplied function.
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param fn the function to use to compute the value of
* the returned CompletionStage
* @param <U> the function's return type
* @return the new CompletionStage
*/
public <U> CompletionStage<U> thenApply(Function<? super T,? extends U> fn);
/**
* Returns a new CompletionStage that, when this stage completes
* normally, is executed using this stage's default asynchronous
* execution facility, with this stage's result as the argument to
* the supplied function.
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param fn the function to use to compute the value of
* the returned CompletionStage
* @param <U> the function's return type
* @return the new CompletionStage
*/
public <U> CompletionStage<U> thenApplyAsync
(Function<? super T,? extends U> fn);
/**
* Returns a new CompletionStage that, when this stage completes
* normally, is executed using the supplied Executor, with this
* stage's result as the argument to the supplied function.
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param fn the function to use to compute the value of
* the returned CompletionStage
* @param executor the executor to use for asynchronous execution
* @param <U> the function's return type
* @return the new CompletionStage
*/
public <U> CompletionStage<U> thenApplyAsync
(Function<? super T,? extends U> fn,
Executor executor);
/**
* Returns a new CompletionStage that, when this stage completes
* normally, is executed with this stage's result as the argument
* to the supplied action.
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param action the action to perform before completing the
* returned CompletionStage
* @return the new CompletionStage
*/
public CompletionStage<Void> thenAccept(Consumer<? super T> action);
/**
* Returns a new CompletionStage that, when this stage completes
* normally, is executed using this stage's default asynchronous
* execution facility, with this stage's result as the argument to
* the supplied action.
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param action the action to perform before completing the
* returned CompletionStage
* @return the new CompletionStage
*/
public CompletionStage<Void> thenAcceptAsync(Consumer<? super T> action);
/**
* Returns a new CompletionStage that, when this stage completes
* normally, is executed using the supplied Executor, with this
* stage's result as the argument to the supplied action.
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param action the action to perform before completing the
* returned CompletionStage
* @param executor the executor to use for asynchronous execution
* @return the new CompletionStage
*/
public CompletionStage<Void> thenAcceptAsync(Consumer<? super T> action,
Executor executor);
/**
* Returns a new CompletionStage that, when this stage completes
* normally, executes the given action.
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param action the action to perform before completing the
* returned CompletionStage
* @return the new CompletionStage
*/
public CompletionStage<Void> thenRun(Runnable action);
/**
* Returns a new CompletionStage that, when this stage completes
* normally, executes the given action using this stage's default
* asynchronous execution facility.
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param action the action to perform before completing the
* returned CompletionStage
* @return the new CompletionStage
*/
public CompletionStage<Void> thenRunAsync(Runnable action);
/**
* Returns a new CompletionStage that, when this stage completes
* normally, executes the given action using the supplied Executor.
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param action the action to perform before completing the
* returned CompletionStage
* @param executor the executor to use for asynchronous execution
* @return the new CompletionStage
*/
public CompletionStage<Void> thenRunAsync(Runnable action,
Executor executor);
/**
* Returns a new CompletionStage that, when this and the other
* given stage both complete normally, is executed with the two
* results as arguments to the supplied function.
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param other the other CompletionStage
* @param fn the function to use to compute the value of
* the returned CompletionStage
* @param <U> the type of the other CompletionStage's result
* @param <V> the function's return type
* @return the new CompletionStage
*/
public <U,V> CompletionStage<V> thenCombine
(CompletionStage<? extends U> other,
BiFunction<? super T,? super U,? extends V> fn);
/**
* Returns a new CompletionStage that, when this and the other
* given stage complete normally, is executed using this stage's
* default asynchronous execution facility, with the two results
* as arguments to the supplied function.
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param other the other CompletionStage
* @param fn the function to use to compute the value of
* the returned CompletionStage
* @param <U> the type of the other CompletionStage's result
* @param <V> the function's return type
* @return the new CompletionStage
*/
public <U,V> CompletionStage<V> thenCombineAsync
(CompletionStage<? extends U> other,
BiFunction<? super T,? super U,? extends V> fn);
/**
* Returns a new CompletionStage that, when this and the other
* given stage complete normally, is executed using the supplied
* executor, with the two results as arguments to the supplied
* function.
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param other the other CompletionStage
* @param fn the function to use to compute the value of
* the returned CompletionStage
* @param executor the executor to use for asynchronous execution
* @param <U> the type of the other CompletionStage's result
* @param <V> the function's return type
* @return the new CompletionStage
*/
public <U,V> CompletionStage<V> thenCombineAsync
(CompletionStage<? extends U> other,
BiFunction<? super T,? super U,? extends V> fn,
Executor executor);
/**
* Returns a new CompletionStage that, when this and the other
* given stage both complete normally, is executed with the two
* results as arguments to the supplied action.
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param other the other CompletionStage
* @param action the action to perform before completing the
* returned CompletionStage
* @param <U> the type of the other CompletionStage's result
* @return the new CompletionStage
*/
public <U> CompletionStage<Void> thenAcceptBoth
(CompletionStage<? extends U> other,
BiConsumer<? super T, ? super U> action);
/**
* Returns a new CompletionStage that, when this and the other
* given stage complete normally, is executed using this stage's
* default asynchronous execution facility, with the two results
* as arguments to the supplied action.
*
* @param other the other CompletionStage
* @param action the action to perform before completing the
* returned CompletionStage
* @param <U> the type of the other CompletionStage's result
* @return the new CompletionStage
*/
public <U> CompletionStage<Void> thenAcceptBothAsync
(CompletionStage<? extends U> other,
BiConsumer<? super T, ? super U> action);
/**
* Returns a new CompletionStage that, when this and the other
* given stage complete normally, is executed using the supplied
* executor, with the two results as arguments to the supplied
* function.
*
* @param other the other CompletionStage
* @param action the action to perform before completing the
* returned CompletionStage
* @param executor the executor to use for asynchronous execution
* @param <U> the type of the other CompletionStage's result
* @return the new CompletionStage
*/
public <U> CompletionStage<Void> thenAcceptBothAsync
(CompletionStage<? extends U> other,
BiConsumer<? super T, ? super U> action,
Executor executor);
/**
* Returns a new CompletionStage that, when this and the other
* given stage both complete normally, executes the given action.
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param other the other CompletionStage
* @param action the action to perform before completing the
* returned CompletionStage
* @return the new CompletionStage
*/
public CompletionStage<Void> runAfterBoth(CompletionStage<?> other,
Runnable action);
/**
* Returns a new CompletionStage that, when this and the other
* given stage complete normally, executes the given action using
* this stage's default asynchronous execution facility.
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param other the other CompletionStage
* @param action the action to perform before completing the
* returned CompletionStage
* @return the new CompletionStage
*/
public CompletionStage<Void> runAfterBothAsync(CompletionStage<?> other,
Runnable action);
/**
* Returns a new CompletionStage that, when this and the other
* given stage complete normally, executes the given action using
* the supplied executor
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param other the other CompletionStage
* @param action the action to perform before completing the
* returned CompletionStage
* @param executor the executor to use for asynchronous execution
* @return the new CompletionStage
*/
public CompletionStage<Void> runAfterBothAsync(CompletionStage<?> other,
Runnable action,
Executor executor);
/**
* Returns a new CompletionStage that, when either this or the
* other given stage complete normally, is executed with the
* corresponding result as argument to the supplied function.
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param other the other CompletionStage
* @param fn the function to use to compute the value of
* the returned CompletionStage
* @param <U> the function's return type
* @return the new CompletionStage
*/
public <U> CompletionStage<U> applyToEither
(CompletionStage<? extends T> other,
Function<? super T, U> fn);
/**
* Returns a new CompletionStage that, when either this or the
* other given stage complete normally, is executed using this
* stage's default asynchronous execution facility, with the
* corresponding result as argument to the supplied function.
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param other the other CompletionStage
* @param fn the function to use to compute the value of
* the returned CompletionStage
* @param <U> the function's return type
* @return the new CompletionStage
*/
public <U> CompletionStage<U> applyToEitherAsync
(CompletionStage<? extends T> other,
Function<? super T, U> fn);
/**
* Returns a new CompletionStage that, when either this or the
* other given stage complete normally, is executed using the
* supplied executor, with the corresponding result as argument to
* the supplied function.
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param other the other CompletionStage
* @param fn the function to use to compute the value of
* the returned CompletionStage
* @param executor the executor to use for asynchronous execution
* @param <U> the function's return type
* @return the new CompletionStage
*/
public <U> CompletionStage<U> applyToEitherAsync
(CompletionStage<? extends T> other,
Function<? super T, U> fn,
Executor executor);
/**
* Returns a new CompletionStage that, when either this or the
* other given stage complete normally, is executed with the
* corresponding result as argument to the supplied action.
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param other the other CompletionStage
* @param action the action to perform before completing the
* returned CompletionStage
* @return the new CompletionStage
*/
public CompletionStage<Void> acceptEither
(CompletionStage<? extends T> other,
Consumer<? super T> action);
/**
* Returns a new CompletionStage that, when either this or the
* other given stage complete normally, is executed using this
* stage's default asynchronous execution facility, with the
* corresponding result as argument to the supplied action.
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param other the other CompletionStage
* @param action the action to perform before completing the
* returned CompletionStage
* @return the new CompletionStage
*/
public CompletionStage<Void> acceptEitherAsync
(CompletionStage<? extends T> other,
Consumer<? super T> action);
/**
* Returns a new CompletionStage that, when either this or the
* other given stage complete normally, is executed using the
* supplied executor, with the corresponding result as argument to
* the supplied function.
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param other the other CompletionStage
* @param action the action to perform before completing the
* returned CompletionStage
* @param executor the executor to use for asynchronous execution
* @return the new CompletionStage
*/
public CompletionStage<Void> acceptEitherAsync
(CompletionStage<? extends T> other,
Consumer<? super T> action,
Executor executor);
/**
* Returns a new CompletionStage that, when either this or the
* other given stage complete normally, executes the given action.
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param other the other CompletionStage
* @param action the action to perform before completing the
* returned CompletionStage
* @return the new CompletionStage
*/
public CompletionStage<Void> runAfterEither(CompletionStage<?> other,
Runnable action);
/**
* Returns a new CompletionStage that, when either this or the
* other given stage complete normally, executes the given action
* using this stage's default asynchronous execution facility.
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param other the other CompletionStage
* @param action the action to perform before completing the
* returned CompletionStage
* @return the new CompletionStage
*/
public CompletionStage<Void> runAfterEitherAsync
(CompletionStage<?> other,
Runnable action);
/**
* Returns a new CompletionStage that, when either this or the
* other given stage complete normally, executes the given action
* using supplied executor.
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param other the other CompletionStage
* @param action the action to perform before completing the
* returned CompletionStage
* @param executor the executor to use for asynchronous execution
* @return the new CompletionStage
*/
public CompletionStage<Void> runAfterEitherAsync
(CompletionStage<?> other,
Runnable action,
Executor executor);
/**
* Returns a new CompletionStage that, when this stage completes
* normally, is executed with this stage as the argument
* to the supplied function.
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param fn the function returning a new CompletionStage
* @param <U> the type of the returned CompletionStage's result
* @return the CompletionStage
*/
public <U> CompletionStage<U> thenCompose
(Function<? super T, ? extends CompletionStage<U>> fn);
/**
* Returns a new CompletionStage that, when this stage completes
* normally, is executed using this stage's default asynchronous
* execution facility, with this stage as the argument to the
* supplied function.
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param fn the function returning a new CompletionStage
* @param <U> the type of the returned CompletionStage's result
* @return the CompletionStage
*/
public <U> CompletionStage<U> thenComposeAsync
(Function<? super T, ? extends CompletionStage<U>> fn);
/**
* Returns a new CompletionStage that, when this stage completes
* normally, is executed using the supplied Executor, with this
* stage's result as the argument to the supplied function.
*
* See the {@link CompletionStage} documentation for rules
* covering exceptional completion.
*
* @param fn the function returning a new CompletionStage
* @param executor the executor to use for asynchronous execution
* @param <U> the type of the returned CompletionStage's result
* @return the CompletionStage
*/
public <U> CompletionStage<U> thenComposeAsync
(Function<? super T, ? extends CompletionStage<U>> fn,
Executor executor);
/**
* Returns a new CompletionStage that, when this stage completes
* exceptionally, is executed with this stage's exception as the
* argument to the supplied function. Otherwise, if this stage
* completes normally, then the returned stage also completes
* normally with the same value.
*
* @param fn the function to use to compute the value of the
* returned CompletionStage if this CompletionStage completed
* exceptionally
* @return the new CompletionStage
*/
public CompletionStage<T> exceptionally
(Function<Throwable, ? extends T> fn);
/**
* Returns a new CompletionStage with the same result or exception
* as this stage, and when this stage completes, executes the
* given action with the result (or {@code null} if none) and the
* exception (or {@code null} if none) of this stage.
*
* @param action the action to perform
* @return the new CompletionStage
*/
public CompletionStage<T> whenComplete
(BiConsumer<? super T, ? super Throwable> action);
/**
* Returns a new CompletionStage with the same result or exception
* as this stage, and when this stage completes, executes the
* given action executes the given action using this stage's
* default asynchronous execution facility, with the result (or
* {@code null} if none) and the exception (or {@code null} if
* none) of this stage as arguments.
*
* @param action the action to perform
* @return the new CompletionStage
*/
public CompletionStage<T> whenCompleteAsync
(BiConsumer<? super T, ? super Throwable> action);
/**
* Returns a new CompletionStage with the same result or exception
* as this stage, and when this stage completes, executes using
* the supplied Executor, the given action with the result (or
* {@code null} if none) and the exception (or {@code null} if
* none) of this stage as arguments.
*
* @param action the action to perform
* @param executor the executor to use for asynchronous execution
* @return the new CompletionStage
*/
public CompletionStage<T> whenCompleteAsync
(BiConsumer<? super T, ? super Throwable> action,
Executor executor);
/**
* Returns a new CompletionStage that, when this stage completes
* either normally or exceptionally, is executed with this stage's
* result and exception as arguments to the supplied function.
* The given function is invoked with the result (or {@code null}
* if none) and the exception (or {@code null} if none) of this
* stage when complete as arguments.
*
* @param fn the function to use to compute the value of the
* returned CompletionStage
* @param <U> the function's return type
* @return the new CompletionStage
*/
public <U> CompletionStage<U> handle
(BiFunction<? super T, Throwable, ? extends U> fn);
/**
* Returns a new CompletionStage that, when this stage completes
* either normally or exceptionally, is executed using this stage's
* default asynchronous execution facility, with this stage's
* result and exception as arguments to the supplied function.
* The given function is invoked with the result (or {@code null}
* if none) and the exception (or {@code null} if none) of this
* stage when complete as arguments.
*
* @param fn the function to use to compute the value of the
* returned CompletionStage
* @param <U> the function's return type
* @return the new CompletionStage
*/
public <U> CompletionStage<U> handleAsync
(BiFunction<? super T, Throwable, ? extends U> fn);
/**
* Returns a new CompletionStage that, when this stage completes
* either normally or exceptionally, is executed using the
* supplied executor, with this stage's result and exception as
* arguments to the supplied function. The given function is
* invoked with the result (or {@code null} if none) and the
* exception (or {@code null} if none) of this stage when complete
* as arguments.
*
* @param fn the function to use to compute the value of the
* returned CompletionStage
* @param executor the executor to use for asynchronous execution
* @param <U> the function's return type
* @return the new CompletionStage
*/
public <U> CompletionStage<U> handleAsync
(BiFunction<? super T, Throwable, ? extends U> fn,
Executor executor);
/**
* Returns a {@link CompletableFuture} maintaining the same
* completion properties as this stage. If this stage is already a
* CompletableFuture, this method may return this stage itself.
* Otherwise, invocation of this method may be equivalent in
* effect to {@code thenApply(x -> x)}, but returning an instance
* of type {@code CompletableFuture}. A CompletionStage
* implementation that does not choose to interoperate with others
* may throw {@code UnsupportedOperationException}.
*
* @return the CompletableFuture
* @throws UnsupportedOperationException if this implementation
* does not interoperate with CompletableFuture
*/
public CompletableFuture<T> toCompletableFuture();
}

View File

@ -47,7 +47,7 @@ public class XMLFormatter extends Formatter {
private LogManager manager = LogManager.getLogManager(); private LogManager manager = LogManager.getLogManager();
// Append a two digit number. // Append a two digit number.
private void a2(StringBuffer sb, int x) { private void a2(StringBuilder sb, int x) {
if (x < 10) { if (x < 10) {
sb.append('0'); sb.append('0');
} }
@ -55,25 +55,26 @@ public class XMLFormatter extends Formatter {
} }
// Append the time and date in ISO 8601 format // Append the time and date in ISO 8601 format
private void appendISO8601(StringBuffer sb, long millis) { private void appendISO8601(StringBuilder sb, long millis) {
Date date = new Date(millis); GregorianCalendar cal = new GregorianCalendar();
sb.append(date.getYear() + 1900); cal.setTimeInMillis(millis);
sb.append(cal.get(Calendar.YEAR) + 1900);
sb.append('-'); sb.append('-');
a2(sb, date.getMonth() + 1); a2(sb, cal.get(Calendar.MONTH) + 1);
sb.append('-'); sb.append('-');
a2(sb, date.getDate()); a2(sb, cal.get(Calendar.DAY_OF_MONTH));
sb.append('T'); sb.append('T');
a2(sb, date.getHours()); a2(sb, cal.get(Calendar.HOUR_OF_DAY));
sb.append(':'); sb.append(':');
a2(sb, date.getMinutes()); a2(sb, cal.get(Calendar.MINUTE));
sb.append(':'); sb.append(':');
a2(sb, date.getSeconds()); a2(sb, cal.get(Calendar.SECOND));
} }
// Append to the given StringBuffer an escaped version of the // Append to the given StringBuilder an escaped version of the
// given text string where XML special characters have been escaped. // given text string where XML special characters have been escaped.
// For a null string we append "<null>" // For a null string we append "<null>"
private void escape(StringBuffer sb, String text) { private void escape(StringBuilder sb, String text) {
if (text == null) { if (text == null) {
text = "<null>"; text = "<null>";
} }
@ -102,7 +103,7 @@ public class XMLFormatter extends Formatter {
* @return a formatted log record * @return a formatted log record
*/ */
public String format(LogRecord record) { public String format(LogRecord record) {
StringBuffer sb = new StringBuffer(500); StringBuilder sb = new StringBuilder(500);
sb.append("<record>\n"); sb.append("<record>\n");
sb.append(" <date>"); sb.append(" <date>");
@ -224,7 +225,7 @@ public class XMLFormatter extends Formatter {
* @return a valid XML string * @return a valid XML string
*/ */
public String getHead(Handler h) { public String getHead(Handler h) {
StringBuffer sb = new StringBuffer(); StringBuilder sb = new StringBuilder();
String encoding; String encoding;
sb.append("<?xml version=\"1.0\""); sb.append("<?xml version=\"1.0\"");

View File

@ -75,11 +75,13 @@ abstract class AbstractPipeline<E_IN, E_OUT, S extends BaseStream<E_OUT, S>>
* Backlink to the head of the pipeline chain (self if this is the source * Backlink to the head of the pipeline chain (self if this is the source
* stage). * stage).
*/ */
@SuppressWarnings("rawtypes")
private final AbstractPipeline sourceStage; private final AbstractPipeline sourceStage;
/** /**
* The "upstream" pipeline, or null if this is the source stage. * The "upstream" pipeline, or null if this is the source stage.
*/ */
@SuppressWarnings("rawtypes")
private final AbstractPipeline previousStage; private final AbstractPipeline previousStage;
/** /**
@ -92,6 +94,7 @@ abstract class AbstractPipeline<E_IN, E_OUT, S extends BaseStream<E_OUT, S>>
* The next stage in the pipeline, or null if this is the last stage. * The next stage in the pipeline, or null if this is the last stage.
* Effectively final at the point of linking to the next pipeline. * Effectively final at the point of linking to the next pipeline.
*/ */
@SuppressWarnings("rawtypes")
private AbstractPipeline nextStage; private AbstractPipeline nextStage;
/** /**
@ -222,8 +225,8 @@ abstract class AbstractPipeline<E_IN, E_OUT, S extends BaseStream<E_OUT, S>>
linkedOrConsumed = true; linkedOrConsumed = true;
return isParallel() return isParallel()
? (R) terminalOp.evaluateParallel(this, sourceSpliterator(terminalOp.getOpFlags())) ? terminalOp.evaluateParallel(this, sourceSpliterator(terminalOp.getOpFlags()))
: (R) terminalOp.evaluateSequential(this, sourceSpliterator(terminalOp.getOpFlags())); : terminalOp.evaluateSequential(this, sourceSpliterator(terminalOp.getOpFlags()));
} }
/** /**
@ -232,6 +235,7 @@ abstract class AbstractPipeline<E_IN, E_OUT, S extends BaseStream<E_OUT, S>>
* @param generator the array generator to be used to create array instances * @param generator the array generator to be used to create array instances
* @return a flat array-backed Node that holds the collected output elements * @return a flat array-backed Node that holds the collected output elements
*/ */
@SuppressWarnings("unchecked")
final Node<E_OUT> evaluateToArrayNode(IntFunction<E_OUT[]> generator) { final Node<E_OUT> evaluateToArrayNode(IntFunction<E_OUT[]> generator) {
if (linkedOrConsumed) if (linkedOrConsumed)
throw new IllegalStateException("stream has already been operated upon"); throw new IllegalStateException("stream has already been operated upon");
@ -256,6 +260,7 @@ abstract class AbstractPipeline<E_IN, E_OUT, S extends BaseStream<E_OUT, S>>
* @throws IllegalStateException if this pipeline stage is not the source * @throws IllegalStateException if this pipeline stage is not the source
* stage. * stage.
*/ */
@SuppressWarnings("unchecked")
final Spliterator<E_OUT> sourceStageSpliterator() { final Spliterator<E_OUT> sourceStageSpliterator() {
if (this != sourceStage) if (this != sourceStage)
throw new IllegalStateException(); throw new IllegalStateException();
@ -265,11 +270,13 @@ abstract class AbstractPipeline<E_IN, E_OUT, S extends BaseStream<E_OUT, S>>
linkedOrConsumed = true; linkedOrConsumed = true;
if (sourceStage.sourceSpliterator != null) { if (sourceStage.sourceSpliterator != null) {
@SuppressWarnings("unchecked")
Spliterator<E_OUT> s = sourceStage.sourceSpliterator; Spliterator<E_OUT> s = sourceStage.sourceSpliterator;
sourceStage.sourceSpliterator = null; sourceStage.sourceSpliterator = null;
return s; return s;
} }
else if (sourceStage.sourceSupplier != null) { else if (sourceStage.sourceSupplier != null) {
@SuppressWarnings("unchecked")
Spliterator<E_OUT> s = (Spliterator<E_OUT>) sourceStage.sourceSupplier.get(); Spliterator<E_OUT> s = (Spliterator<E_OUT>) sourceStage.sourceSupplier.get();
sourceStage.sourceSupplier = null; sourceStage.sourceSupplier = null;
return s; return s;
@ -282,12 +289,14 @@ abstract class AbstractPipeline<E_IN, E_OUT, S extends BaseStream<E_OUT, S>>
// BaseStream // BaseStream
@Override @Override
@SuppressWarnings("unchecked")
public final S sequential() { public final S sequential() {
sourceStage.parallel = false; sourceStage.parallel = false;
return (S) this; return (S) this;
} }
@Override @Override
@SuppressWarnings("unchecked")
public final S parallel() { public final S parallel() {
sourceStage.parallel = true; sourceStage.parallel = true;
return (S) this; return (S) this;
@ -295,6 +304,7 @@ abstract class AbstractPipeline<E_IN, E_OUT, S extends BaseStream<E_OUT, S>>
// Primitive specialization use co-variant overrides, hence is not final // Primitive specialization use co-variant overrides, hence is not final
@Override @Override
@SuppressWarnings("unchecked")
public Spliterator<E_OUT> spliterator() { public Spliterator<E_OUT> spliterator() {
if (linkedOrConsumed) if (linkedOrConsumed)
throw new IllegalStateException("stream has already been operated upon"); throw new IllegalStateException("stream has already been operated upon");
@ -302,12 +312,14 @@ abstract class AbstractPipeline<E_IN, E_OUT, S extends BaseStream<E_OUT, S>>
if (this == sourceStage) { if (this == sourceStage) {
if (sourceStage.sourceSpliterator != null) { if (sourceStage.sourceSpliterator != null) {
Spliterator<E_OUT> s = sourceStage.sourceSpliterator; @SuppressWarnings("unchecked")
Spliterator<E_OUT> s = (Spliterator<E_OUT>) sourceStage.sourceSpliterator;
sourceStage.sourceSpliterator = null; sourceStage.sourceSpliterator = null;
return s; return s;
} }
else if (sourceStage.sourceSupplier != null) { else if (sourceStage.sourceSupplier != null) {
Supplier<Spliterator<E_OUT>> s = sourceStage.sourceSupplier; @SuppressWarnings("unchecked")
Supplier<Spliterator<E_OUT>> s = (Supplier<Spliterator<E_OUT>>) sourceStage.sourceSupplier;
sourceStage.sourceSupplier = null; sourceStage.sourceSupplier = null;
return lazySpliterator(s); return lazySpliterator(s);
} }
@ -349,10 +361,11 @@ abstract class AbstractPipeline<E_IN, E_OUT, S extends BaseStream<E_OUT, S>>
* @param terminalFlags Operation flags for the terminal operation * @param terminalFlags Operation flags for the terminal operation
*/ */
private void parallelPrepare(int terminalFlags) { private void parallelPrepare(int terminalFlags) {
@SuppressWarnings("rawtypes")
AbstractPipeline backPropagationHead = sourceStage; AbstractPipeline backPropagationHead = sourceStage;
if (sourceStage.sourceAnyStateful) { if (sourceStage.sourceAnyStateful) {
int depth = 1; int depth = 1;
for (AbstractPipeline u = sourceStage, p = sourceStage.nextStage; for ( @SuppressWarnings("rawtypes") AbstractPipeline u = sourceStage, p = sourceStage.nextStage;
p != null; p != null;
u = p, p = p.nextStage) { u = p, p = p.nextStage) {
int thisOpFlags = p.sourceOrOpFlags; int thisOpFlags = p.sourceOrOpFlags;
@ -383,7 +396,7 @@ abstract class AbstractPipeline<E_IN, E_OUT, S extends BaseStream<E_OUT, S>>
// Apply the upstream terminal flags // Apply the upstream terminal flags
if (terminalFlags != 0) { if (terminalFlags != 0) {
int upstreamTerminalFlags = terminalFlags & StreamOpFlag.UPSTREAM_TERMINAL_OP_MASK; int upstreamTerminalFlags = terminalFlags & StreamOpFlag.UPSTREAM_TERMINAL_OP_MASK;
for (AbstractPipeline p = backPropagationHead; p.nextStage != null; p = p.nextStage) { for ( @SuppressWarnings("rawtypes") AbstractPipeline p = backPropagationHead; p.nextStage != null; p = p.nextStage) {
p.combinedFlags = StreamOpFlag.combineOpFlags(upstreamTerminalFlags, p.combinedFlags); p.combinedFlags = StreamOpFlag.combineOpFlags(upstreamTerminalFlags, p.combinedFlags);
} }
@ -398,6 +411,7 @@ abstract class AbstractPipeline<E_IN, E_OUT, S extends BaseStream<E_OUT, S>>
* of all computations up to and including the most recent stateful * of all computations up to and including the most recent stateful
* operation. * operation.
*/ */
@SuppressWarnings("unchecked")
private Spliterator<?> sourceSpliterator(int terminalFlags) { private Spliterator<?> sourceSpliterator(int terminalFlags) {
// Get the source spliterator of the pipeline // Get the source spliterator of the pipeline
Spliterator<?> spliterator = null; Spliterator<?> spliterator = null;
@ -421,7 +435,7 @@ abstract class AbstractPipeline<E_IN, E_OUT, S extends BaseStream<E_OUT, S>>
// Adapt the source spliterator, evaluating each stateful op // Adapt the source spliterator, evaluating each stateful op
// in the pipeline up to and including this pipeline stage // in the pipeline up to and including this pipeline stage
for (AbstractPipeline u = sourceStage, p = sourceStage.nextStage, e = this; for ( @SuppressWarnings("rawtypes") AbstractPipeline u = sourceStage, p = sourceStage.nextStage, e = this;
u != e; u != e;
u = p, p = p.nextStage) { u = p, p = p.nextStage) {
@ -442,6 +456,7 @@ abstract class AbstractPipeline<E_IN, E_OUT, S extends BaseStream<E_OUT, S>>
@Override @Override
final StreamShape getSourceShape() { final StreamShape getSourceShape() {
@SuppressWarnings("rawtypes")
AbstractPipeline p = AbstractPipeline.this; AbstractPipeline p = AbstractPipeline.this;
while (p.depth > 0) { while (p.depth > 0) {
p = p.previousStage; p = p.previousStage;
@ -475,7 +490,9 @@ abstract class AbstractPipeline<E_IN, E_OUT, S extends BaseStream<E_OUT, S>>
} }
@Override @Override
@SuppressWarnings("unchecked")
final <P_IN> void copyIntoWithCancel(Sink<P_IN> wrappedSink, Spliterator<P_IN> spliterator) { final <P_IN> void copyIntoWithCancel(Sink<P_IN> wrappedSink, Spliterator<P_IN> spliterator) {
@SuppressWarnings({"rawtypes","unchecked"})
AbstractPipeline p = AbstractPipeline.this; AbstractPipeline p = AbstractPipeline.this;
while (p.depth > 0) { while (p.depth > 0) {
p = p.previousStage; p = p.previousStage;
@ -495,16 +512,18 @@ abstract class AbstractPipeline<E_IN, E_OUT, S extends BaseStream<E_OUT, S>>
} }
@Override @Override
@SuppressWarnings("unchecked")
final <P_IN> Sink<P_IN> wrapSink(Sink<E_OUT> sink) { final <P_IN> Sink<P_IN> wrapSink(Sink<E_OUT> sink) {
Objects.requireNonNull(sink); Objects.requireNonNull(sink);
for (AbstractPipeline p=AbstractPipeline.this; p.depth > 0; p=p.previousStage) { for ( @SuppressWarnings("rawtypes") AbstractPipeline p=AbstractPipeline.this; p.depth > 0; p=p.previousStage) {
sink = p.opWrapSink(p.previousStage.combinedFlags, sink); sink = p.opWrapSink(p.previousStage.combinedFlags, sink);
} }
return (Sink<P_IN>) sink; return (Sink<P_IN>) sink;
} }
@Override @Override
@SuppressWarnings("unchecked")
final <P_IN> Spliterator<E_OUT> wrapSpliterator(Spliterator<P_IN> sourceSpliterator) { final <P_IN> Spliterator<E_OUT> wrapSpliterator(Spliterator<P_IN> sourceSpliterator) {
if (depth == 0) { if (depth == 0) {
return (Spliterator<E_OUT>) sourceSpliterator; return (Spliterator<E_OUT>) sourceSpliterator;
@ -591,16 +610,19 @@ abstract class AbstractPipeline<E_IN, E_OUT, S extends BaseStream<E_OUT, S>>
/** /**
* Make a node builder compatible with this stream shape. * Make a node builder compatible with this stream shape.
* *
* @param exactSizeIfKnown if {@literal >=0}, then a node builder will be created that * @param exactSizeIfKnown if {@literal >=0}, then a node builder will be
* has a fixed capacity of at most sizeIfKnown elements. If {@literal < 0}, * created that has a fixed capacity of at most sizeIfKnown elements. If
* then the node builder has an unfixed capacity. A fixed capacity node * {@literal < 0}, then the node builder has an unfixed capacity. A fixed
* builder will throw exceptions if an element is added after builder has * capacity node builder will throw exceptions if an element is added after
* reached capacity, or is built before the builder has reached capacity. * builder has reached capacity, or is built before the builder has reached
* capacity.
*
* @param generator the array generator to be used to create instances of a * @param generator the array generator to be used to create instances of a
* T[] array. For implementations supporting primitive nodes, this parameter * T[] array. For implementations supporting primitive nodes, this parameter
* may be ignored. * may be ignored.
* @return a node builder * @return a node builder
*/ */
@Override
abstract Node.Builder<E_OUT> makeNodeBuilder(long exactSizeIfKnown, abstract Node.Builder<E_OUT> makeNodeBuilder(long exactSizeIfKnown,
IntFunction<E_OUT[]> generator); IntFunction<E_OUT[]> generator);
@ -679,6 +701,7 @@ abstract class AbstractPipeline<E_IN, E_OUT, S extends BaseStream<E_OUT, S>>
* @param spliterator the source {@code Spliterator} * @param spliterator the source {@code Spliterator}
* @return a {@code Spliterator} describing the result of the evaluation * @return a {@code Spliterator} describing the result of the evaluation
*/ */
@SuppressWarnings("unchecked")
<P_IN> Spliterator<E_OUT> opEvaluateParallelLazy(PipelineHelper<E_OUT> helper, <P_IN> Spliterator<E_OUT> opEvaluateParallelLazy(PipelineHelper<E_OUT> helper,
Spliterator<P_IN> spliterator) { Spliterator<P_IN> spliterator) {
return opEvaluateParallel(helper, spliterator, i -> (E_OUT[]) new Object[i]).spliterator(); return opEvaluateParallel(helper, spliterator, i -> (E_OUT[]) new Object[i]).spliterator();

View File

@ -39,6 +39,7 @@ import java.util.concurrent.atomic.AtomicReference;
* @param <K> type of child and sibling tasks * @param <K> type of child and sibling tasks
* @since 1.8 * @since 1.8
*/ */
@SuppressWarnings("serial")
abstract class AbstractShortCircuitTask<P_IN, P_OUT, R, abstract class AbstractShortCircuitTask<P_IN, P_OUT, R,
K extends AbstractShortCircuitTask<P_IN, P_OUT, R, K>> K extends AbstractShortCircuitTask<P_IN, P_OUT, R, K>>
extends AbstractTask<P_IN, P_OUT, R, K> { extends AbstractTask<P_IN, P_OUT, R, K> {
@ -219,7 +220,8 @@ abstract class AbstractShortCircuitTask<P_IN, P_OUT, R,
*/ */
protected void cancelLaterNodes() { protected void cancelLaterNodes() {
// Go up the tree, cancel right siblings of this node and all parents // Go up the tree, cancel right siblings of this node and all parents
for (K parent = getParent(), node = (K) this; parent != null; for (@SuppressWarnings("unchecked") K parent = getParent(), node = (K) this;
parent != null;
node = parent, parent = parent.getParent()) { node = parent, parent = parent.getParent()) {
// If node is a left child of parent, then has a right sibling // If node is a left child of parent, then has a right sibling
if (parent.leftChild == node) { if (parent.leftChild == node) {

View File

@ -73,6 +73,9 @@ import java.util.concurrent.ForkJoinPool;
* } * }
* }</pre> * }</pre>
* *
* <p>Serialization is not supported as there is no intention to serialize
* tasks managed by stream ops.
*
* @param <P_IN> Type of elements input to the pipeline * @param <P_IN> Type of elements input to the pipeline
* @param <P_OUT> Type of elements output from the pipeline * @param <P_OUT> Type of elements output from the pipeline
* @param <R> Type of intermediate result, which may be different from operation * @param <R> Type of intermediate result, which may be different from operation
@ -80,6 +83,7 @@ import java.util.concurrent.ForkJoinPool;
* @param <K> Type of parent, child and sibling tasks * @param <K> Type of parent, child and sibling tasks
* @since 1.8 * @since 1.8
*/ */
@SuppressWarnings("serial")
abstract class AbstractTask<P_IN, P_OUT, R, abstract class AbstractTask<P_IN, P_OUT, R,
K extends AbstractTask<P_IN, P_OUT, R, K>> K extends AbstractTask<P_IN, P_OUT, R, K>>
extends CountedCompleter<R> { extends CountedCompleter<R> {

View File

@ -25,40 +25,45 @@
package java.util.stream; package java.util.stream;
import java.util.Collections; import java.util.Collections;
import java.util.EnumSet;
import java.util.Set; import java.util.Set;
import java.util.function.BiFunction; import java.util.function.BiConsumer;
import java.util.function.BinaryOperator; import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier; import java.util.function.Supplier;
/** /**
* A <a href="package-summary.html#Reduction">reduction operation</a> that * A <a href="package-summary.html#Reduction">reduction operation</a> that
* supports folding input elements into a cumulative result. The result may be * folds input elements into a mutable result container, optionally transforming
* a value or may be a mutable result container. Examples of operations * the accumulated result into a final representation after all input elements
* accumulating results into a mutable result container include: accumulating * have been processed.
* input elements into a {@code Collection}; concatenating strings into a *
* {@code StringBuilder}; computing summary information about elements such as * <p>Examples of mutable reduction operations include:
* sum, min, max, or average; computing "pivot table" summaries such as "maximum * accumulating elements into a {@code Collection}; concatenating
* valued transaction by seller", etc. Reduction operations can be performed * strings using a {@code StringBuilder}; computing summary information about
* either sequentially or in parallel. * elements such as sum, min, max, or average; computing "pivot table" summaries
* such as "maximum valued transaction by seller", etc. Reduction operations
* can be performed either sequentially or in parallel.
* *
* <p>The following are examples of using the predefined {@code Collector} * <p>The following are examples of using the predefined {@code Collector}
* implementations in {@link Collectors} with the {@code Stream} API to perform * implementations in {@link Collectors} with the {@code Stream} API to perform
* mutable reduction tasks: * mutable reduction tasks:
* <pre>{@code * <pre>{@code
* // Accumulate elements into a List * // Accumulate names into a List
* List<String> list = stream.collect(Collectors.toList()); * List<String> list = people.stream().map(Person::getName).collect(Collectors.toList());
* *
* // Accumulate elements into a TreeSet * // Accumulate names into a TreeSet
* Set<String> list = stream.collect(Collectors.toCollection(TreeSet::new)); * Set<String> list = people.stream().map(Person::getName).collect(Collectors.toCollection(TreeSet::new));
* *
* // Convert elements to strings and concatenate them, separated by commas * // Convert elements to strings and concatenate them, separated by commas
* String joined = stream.map(Object::toString) * String joined = things.stream()
* .collect(Collectors.toStringJoiner(", ")) * .map(Object::toString)
* .toString(); * .collect(Collectors.joining(", "));
* *
* // Find highest-paid employee * // Find highest-paid employee
* Employee highestPaid = employees.stream() * Employee highestPaid = employees.stream()
* .collect(Collectors.maxBy(Comparators.comparing(Employee::getSalary))); * .collect(Collectors.maxBy(Comparators.comparing(Employee::getSalary)))
* .get();
* *
* // Group employees by department * // Group employees by department
* Map<Department, List<Employee>> byDept * Map<Department, List<Employee>> byDept
@ -66,7 +71,7 @@ import java.util.function.Supplier;
* .collect(Collectors.groupingBy(Employee::getDepartment)); * .collect(Collectors.groupingBy(Employee::getDepartment));
* *
* // Find highest-paid employee by department * // Find highest-paid employee by department
* Map<Department, Employee> highestPaidByDept * Map<Department, Optional<Employee>> highestPaidByDept
* = employees.stream() * = employees.stream()
* .collect(Collectors.groupingBy(Employee::getDepartment, * .collect(Collectors.groupingBy(Employee::getDepartment,
* Collectors.maxBy(Comparators.comparing(Employee::getSalary)))); * Collectors.maxBy(Comparators.comparing(Employee::getSalary))));
@ -74,43 +79,42 @@ import java.util.function.Supplier;
* // Partition students into passing and failing * // Partition students into passing and failing
* Map<Boolean, List<Student>> passingFailing = * Map<Boolean, List<Student>> passingFailing =
* students.stream() * students.stream()
* .collect(Collectors.partitioningBy(s -> s.getGrade() >= PASS_THRESHOLD); * .collect(Collectors.partitioningBy(s -> s.getGrade() >= PASS_THRESHOLD));
* *
* }</pre> * }</pre>
* *
* <p>A {@code Collector} is specified by three functions that work together to * <p>A {@code Collector} is specified by four functions that work together to
* manage a result or result container. They are: creation of an initial * accumulate entries into a mutable result container, and optionally perform
* result, incorporating a new data element into a result, and combining two * a final transform on the result. They are: creation of a new result container,
* results into one. The last function -- combining two results into one -- is * incorporating a new data element into a result container, combining two
* used during parallel operations, where subsets of the input are accumulated * result containers into one, and performing a final transform on the container.
* in parallel, and then the subresults merged into a combined result. The * The combiner function is used during parallel operations, where
* result may be a mutable container or a value. If the result is mutable, the * subsets of the input are accumulated into separate result
* accumulation and combination functions may either mutate their left argument * containers, and then the subresults merged into a combined result. The
* and return that (such as adding elements to a collection), or return a new * combiner function may merge one set of subresults into the other and return
* result, in which case it should not perform any mutation. * that, or it may return a new object to describe the combined results.
* *
* <p>Collectors also have a set of characteristics, including * <p>Collectors also have a set of characteristics, such as
* {@link Characteristics#CONCURRENT} and * {@link Characteristics#CONCURRENT}. These characteristics provide
* {@link Characteristics#STRICTLY_MUTATIVE}. These characteristics provide
* hints that can be used by a reduction implementation to provide better * hints that can be used by a reduction implementation to provide better
* performance. * performance.
* *
* <p>Libraries that implement reduction based on {@code Collector}, such as * <p>Libraries that implement reduction based on {@code Collector}, such as
* {@link Stream#collect(Collector)}, must adhere to the following constraints: * {@link Stream#collect(Collector)}, must adhere to the following constraints:
* <ul> * <ul>
* <li>The first argument passed to the accumulator function, and both * <li>The first argument passed to the accumulator function, both
* arguments passed to the combiner function, must be the result of a * arguments passed to the combiner function, and the argument passed to the
* previous invocation of {@link #resultSupplier()}, {@link #accumulator()}, * finisher function must be the result of a previous invocation of the
* or {@link #combiner()}.</li> * result supplier, accumulator, or combiner functions.</li>
* <li>The implementation should not do anything with the result of any of * <li>The implementation should not do anything with the result of any of
* the result supplier, accumulator, or combiner functions other than to * the result supplier, accumulator, or combiner functions other than to
* pass them again to the accumulator or combiner functions, or return them * pass them again to the accumulator, combiner, or finisher functions,
* to the caller of the reduction operation.</li> * or return them to the caller of the reduction operation.</li>
* <li>If a result is passed to the accumulator or combiner function, and * <li>If a result is passed to the combiner or finisher
* the same object is not returned from that function, it is never used * function, and the same object is not returned from that function, it is
* again.</li> * never used again.</li>
* <li>Once a result is passed to the combiner function, it is never passed * <li>Once a result is passed to the combiner or finisher function, it
* to the accumulator function again.</li> * is never passed to the accumulator function again.</li>
* <li>For non-concurrent collectors, any result returned from the result * <li>For non-concurrent collectors, any result returned from the result
* supplier, accumulator, or combiner functions must be serially * supplier, accumulator, or combiner functions must be serially
* thread-confined. This enables collection to occur in parallel without * thread-confined. This enables collection to occur in parallel without
@ -132,11 +136,10 @@ import java.util.function.Supplier;
* Performing a reduction operation with a {@code Collector} should produce a * Performing a reduction operation with a {@code Collector} should produce a
* result equivalent to: * result equivalent to:
* <pre>{@code * <pre>{@code
* BiFunction<R,T,R> accumulator = collector.accumulator(); * R container = collector.supplier().get();
* R result = collector.resultSupplier().get();
* for (T t : data) * for (T t : data)
* result = accumulator.apply(result, t); * collector.accumulator().accept(container, t);
* return result; * return collector.finisher().apply(container);
* }</pre> * }</pre>
* *
* <p>However, the library is free to partition the input, perform the reduction * <p>However, the library is free to partition the input, perform the reduction
@ -149,7 +152,7 @@ import java.util.function.Supplier;
* is accumulating elements into a {@code TreeSet}. In this case, the {@code * is accumulating elements into a {@code TreeSet}. In this case, the {@code
* resultSupplier()} function is {@code () -> new Treeset<T>()}, the * resultSupplier()} function is {@code () -> new Treeset<T>()}, the
* {@code accumulator} function is * {@code accumulator} function is
* {@code (set, element) -> { set.add(element); return set; }}, and the combiner * {@code (set, element) -> set.add(element) }, and the combiner
* function is {@code (left, right) -> { left.addAll(right); return left; }}. * function is {@code (left, right) -> { left.addAll(right); return left; }}.
* (This behavior is implemented by * (This behavior is implemented by
* {@code Collectors.toCollection(TreeSet::new)}). * {@code Collectors.toCollection(TreeSet::new)}).
@ -159,51 +162,49 @@ import java.util.function.Supplier;
* @see Stream#collect(Collector) * @see Stream#collect(Collector)
* @see Collectors * @see Collectors
* *
* @param <T> the type of input element to the collect operation * @param <T> the type of input elements to the reduction operation
* @param <R> the result type of the collect operation * @param <A> the mutable accumulation type of the reduction operation (often
* hidden as an implementation detail)
* @param <R> the result type of the reduction operation
* @since 1.8 * @since 1.8
*/ */
public interface Collector<T, R> { public interface Collector<T, A, R> {
/** /**
* A function that creates and returns a new result that represents * A function that creates and returns a new mutable result container.
* "no values". If the accumulator or combiner functions may mutate their
* arguments, this must be a new, empty result container.
* *
* @return a function which, when invoked, returns a result representing * @return a function which returns a new, mutable result container
* "no values"
*/ */
Supplier<R> resultSupplier(); Supplier<A> supplier();
/** /**
* A function that folds a new value into a cumulative result. The result * A function that folds a new value into a mutable result container.
* may be a mutable result container or a value. The accumulator function
* may modify a mutable container and return it, or create a new result and
* return that, but if it returns a new result object, it must not modify
* any of its arguments.
* *
* <p>If the collector has the {@link Characteristics#STRICTLY_MUTATIVE} * @return a function which folds a new value into a mutable result container
* characteristic, then the accumulator function <em>must</em> always return
* its first argument, after possibly mutating its state.
*
* @return a function which folds a new value into a cumulative result
*/ */
BiFunction<R, T, R> accumulator(); BiConsumer<A, T> accumulator();
/** /**
* A function that accepts two partial results and merges them. The * A function that accepts two partial results and merges them. The
* combiner function may fold state from one argument into the other and * combiner function may fold state from one argument into the other and
* return that, or may return a new result object, but if it returns * return that, or may return a new result object.
* a new result object, it must not modify the state of either of its
* arguments.
*
* <p>If the collector has the {@link Characteristics#STRICTLY_MUTATIVE}
* characteristic, then the combiner function <em>must</em> always return
* its first argument, after possibly mutating its state.
* *
* @return a function which combines two partial results into a cumulative * @return a function which combines two partial results into a cumulative
* result * result
*/ */
BinaryOperator<R> combiner(); BinaryOperator<A> combiner();
/**
* Perform the final transformation from the intermediate accumulation type
* {@code A} to the final result representation {@code R}.
*
* <p>If the characteristic {@code IDENTITY_TRANSFORM} is
* set, this function may be presumed to be an identity transform with an
* unchecked cast from {@code A} to {@code R}.
*
* @return a function which transforms the intermediate result to the final
* result
*/
Function<A, R> finisher();
/** /**
* Returns a {@code Set} of {@code Collector.Characteristics} indicating * Returns a {@code Set} of {@code Collector.Characteristics} indicating
@ -213,6 +214,62 @@ public interface Collector<T, R> {
*/ */
Set<Characteristics> characteristics(); Set<Characteristics> characteristics();
/**
* Returns a new {@code Collector} described by the given {@code supplier},
* {@code accumulator}, and {@code combiner} functions. The resulting
* {@code Collector} has the {@code Collector.Characteristics.IDENTITY_FINISH}
* characteristic.
*
* @param supplier The supplier function for the new collector
* @param accumulator The accumulator function for the new collector
* @param combiner The combiner function for the new collector
* @param characteristics The collector characteristics for the new
* collector
* @param <T> The type of input elements for the new collector
* @param <R> The type of intermediate accumulation result, and final result,
* for the new collector
* @return the new {@code Collector}
*/
public static<T, R> Collector<T, R, R> of(Supplier<R> supplier,
BiConsumer<R, T> accumulator,
BinaryOperator<R> combiner,
Characteristics... characteristics) {
Set<Characteristics> cs = (characteristics.length == 0)
? Collectors.CH_ID
: Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_FINISH,
characteristics));
return new Collectors.CollectorImpl<>(supplier, accumulator, combiner, cs);
}
/**
* Returns a new {@code Collector} described by the given {@code supplier},
* {@code accumulator}, {@code combiner}, and {@code finisher} functions.
*
* @param supplier The supplier function for the new collector
* @param accumulator The accumulator function for the new collector
* @param combiner The combiner function for the new collector
* @param finisher The finisher function for the new collector
* @param characteristics The collector characteristics for the new
* collector
* @param <T> The type of input elements for the new collector
* @param <A> The intermediate accumulation type of the new collector
* @param <R> The final result type of the new collector
* @return the new {@code Collector}
*/
public static<T, A, R> Collector<T, A, R> of(Supplier<A> supplier,
BiConsumer<A, T> accumulator,
BinaryOperator<A> combiner,
Function<A, R> finisher,
Characteristics... characteristics) {
Set<Characteristics> cs = Collectors.CH_NOID;
if (characteristics.length > 0) {
cs = EnumSet.noneOf(Characteristics.class);
Collections.addAll(cs, characteristics);
cs = Collections.unmodifiableSet(cs);
}
return new Collectors.CollectorImpl<>(supplier, accumulator, combiner, finisher, cs);
}
/** /**
* Characteristics indicating properties of a {@code Collector}, which can * Characteristics indicating properties of a {@code Collector}, which can
* be used to optimize reduction implementations. * be used to optimize reduction implementations.
@ -222,8 +279,7 @@ public interface Collector<T, R> {
* Indicates that this collector is <em>concurrent</em>, meaning that * Indicates that this collector is <em>concurrent</em>, meaning that
* the result container can support the accumulator function being * the result container can support the accumulator function being
* called concurrently with the same result container from multiple * called concurrently with the same result container from multiple
* threads. Concurrent collectors must also always have the * threads.
* {@code STRICTLY_MUTATIVE} characteristic.
* *
* <p>If a {@code CONCURRENT} collector is not also {@code UNORDERED}, * <p>If a {@code CONCURRENT} collector is not also {@code UNORDERED},
* then it should only be evaluated concurrently if applied to an * then it should only be evaluated concurrently if applied to an
@ -238,12 +294,10 @@ public interface Collector<T, R> {
UNORDERED, UNORDERED,
/** /**
* Indicates that this collector operates by strict mutation of its * Indicates that the finisher function is the identity function and
* result container. This means that the {@link #accumulator()} and * can be elided. If set, it must be the case that an unchecked cast
* {@link #combiner()} functions will always modify the state of and * from A to R will succeed.
* return their first argument, rather than returning a different result
* container.
*/ */
STRICTLY_MUTATIVE IDENTITY_FINISH
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -209,7 +209,7 @@ public class DelegatingStream<T> implements Stream<T> {
} }
@Override @Override
public <R> R collect(Collector<? super T, R> collector) { public <R, A> R collect(Collector<? super T, A, ? extends R> collector) {
return delegate.collect(collector); return delegate.collect(collector);
} }

View File

@ -147,6 +147,7 @@ abstract class DoublePipeline<E_IN>
} }
@Override @Override
@SuppressWarnings("unchecked")
final Spliterator.OfDouble lazySpliterator(Supplier<? extends Spliterator<Double>> supplier) { final Spliterator.OfDouble lazySpliterator(Supplier<? extends Spliterator<Double>> supplier) {
return new StreamSpliterators.DelegatingSpliterator.OfDouble((Supplier<Spliterator.OfDouble>) supplier); return new StreamSpliterators.DelegatingSpliterator.OfDouble((Supplier<Spliterator.OfDouble>) supplier);
} }
@ -209,6 +210,7 @@ abstract class DoublePipeline<E_IN>
Sink<Double> opWrapSink(int flags, Sink<U> sink) { Sink<Double> opWrapSink(int flags, Sink<U> sink) {
return new Sink.ChainedDouble(sink) { return new Sink.ChainedDouble(sink) {
@Override @Override
@SuppressWarnings("unchecked")
public void accept(double t) { public void accept(double t) {
downstream.accept(mapper.apply(t)); downstream.accept(mapper.apply(t));
} }

View File

@ -527,7 +527,7 @@ public interface DoubleStream extends BaseStream<Double, DoubleStream> {
long count(); long count();
/** /**
* Returns an {@code OptionalDouble} describing the average of elements of * Returns an {@code OptionalDouble} describing the arithmetic mean of elements of
* this stream, or an empty optional if this stream is empty. The average * this stream, or an empty optional if this stream is empty. The average
* returned can vary depending upon the order in which elements are * returned can vary depending upon the order in which elements are
* encountered. This is due to accumulated rounding error in addition of * encountered. This is due to accumulated rounding error in addition of

View File

@ -246,6 +246,7 @@ final class FindOps {
* @param <P_OUT> Output element type from the stream pipeline * @param <P_OUT> Output element type from the stream pipeline
* @param <O> Result type from the find operation * @param <O> Result type from the find operation
*/ */
@SuppressWarnings("serial")
private static final class FindTask<P_IN, P_OUT, O> private static final class FindTask<P_IN, P_OUT, O>
extends AbstractShortCircuitTask<P_IN, P_OUT, O, FindTask<P_IN, P_OUT, O>> { extends AbstractShortCircuitTask<P_IN, P_OUT, O, FindTask<P_IN, P_OUT, O>> {
private final FindOp<P_OUT, O> op; private final FindOp<P_OUT, O> op;

View File

@ -249,6 +249,7 @@ final class ForEachOps {
} }
/** A {@code ForkJoinTask} for performing a parallel for-each operation */ /** A {@code ForkJoinTask} for performing a parallel for-each operation */
@SuppressWarnings("serial")
static final class ForEachTask<S, T> extends CountedCompleter<Void> { static final class ForEachTask<S, T> extends CountedCompleter<Void> {
private Spliterator<S> spliterator; private Spliterator<S> spliterator;
private final Sink<S> sink; private final Sink<S> sink;
@ -314,6 +315,7 @@ final class ForEachOps {
* A {@code ForkJoinTask} for performing a parallel for-each operation * A {@code ForkJoinTask} for performing a parallel for-each operation
* which visits the elements in encounter order * which visits the elements in encounter order
*/ */
@SuppressWarnings("serial")
static final class ForEachOrderedTask<S, T> extends CountedCompleter<Void> { static final class ForEachOrderedTask<S, T> extends CountedCompleter<Void> {
private final PipelineHelper<T> helper; private final PipelineHelper<T> helper;
private Spliterator<S> spliterator; private Spliterator<S> spliterator;

View File

@ -150,6 +150,7 @@ abstract class IntPipeline<E_IN>
} }
@Override @Override
@SuppressWarnings("unchecked")
final Spliterator.OfInt lazySpliterator(Supplier<? extends Spliterator<Integer>> supplier) { final Spliterator.OfInt lazySpliterator(Supplier<? extends Spliterator<Integer>> supplier) {
return new StreamSpliterators.DelegatingSpliterator.OfInt((Supplier<Spliterator.OfInt>) supplier); return new StreamSpliterators.DelegatingSpliterator.OfInt((Supplier<Spliterator.OfInt>) supplier);
} }
@ -190,6 +191,7 @@ abstract class IntPipeline<E_IN>
Sink<Integer> opWrapSink(int flags, Sink<Long> sink) { Sink<Integer> opWrapSink(int flags, Sink<Long> sink) {
return new Sink.ChainedInt(sink) { return new Sink.ChainedInt(sink) {
@Override @Override
@SuppressWarnings("unchecked")
public void accept(int t) { public void accept(int t) {
downstream.accept((long) t); downstream.accept((long) t);
} }
@ -206,6 +208,7 @@ abstract class IntPipeline<E_IN>
Sink<Integer> opWrapSink(int flags, Sink<Double> sink) { Sink<Integer> opWrapSink(int flags, Sink<Double> sink) {
return new Sink.ChainedInt(sink) { return new Sink.ChainedInt(sink) {
@Override @Override
@SuppressWarnings("unchecked")
public void accept(int t) { public void accept(int t) {
downstream.accept((double) t); downstream.accept((double) t);
} }
@ -245,6 +248,7 @@ abstract class IntPipeline<E_IN>
Sink<Integer> opWrapSink(int flags, Sink<U> sink) { Sink<Integer> opWrapSink(int flags, Sink<U> sink) {
return new Sink.ChainedInt(sink) { return new Sink.ChainedInt(sink) {
@Override @Override
@SuppressWarnings("unchecked")
public void accept(int t) { public void accept(int t) {
downstream.accept(mapper.apply(t)); downstream.accept(mapper.apply(t));
} }

View File

@ -517,7 +517,7 @@ public interface IntStream extends BaseStream<Integer, IntStream> {
long count(); long count();
/** /**
* Returns an {@code OptionalDouble} describing the average of elements of * Returns an {@code OptionalDouble} describing the arithmetic mean of elements of
* this stream, or an empty optional if this stream is empty. This is a * this stream, or an empty optional if this stream is empty. This is a
* special case of a * special case of a
* <a href="package-summary.html#MutableReduction">reduction</a>. * <a href="package-summary.html#MutableReduction">reduction</a>.

View File

@ -148,6 +148,7 @@ abstract class LongPipeline<E_IN>
} }
@Override @Override
@SuppressWarnings("unchecked")
final Spliterator.OfLong lazySpliterator(Supplier<? extends Spliterator<Long>> supplier) { final Spliterator.OfLong lazySpliterator(Supplier<? extends Spliterator<Long>> supplier) {
return new StreamSpliterators.DelegatingSpliterator.OfLong((Supplier<Spliterator.OfLong>) supplier); return new StreamSpliterators.DelegatingSpliterator.OfLong((Supplier<Spliterator.OfLong>) supplier);
} }
@ -209,6 +210,7 @@ abstract class LongPipeline<E_IN>
Sink<Long> opWrapSink(int flags, Sink<Long> sink) { Sink<Long> opWrapSink(int flags, Sink<Long> sink) {
return new Sink.ChainedLong(sink) { return new Sink.ChainedLong(sink) {
@Override @Override
@SuppressWarnings("unchecked")
public void accept(long t) { public void accept(long t) {
downstream.accept(mapper.applyAsLong(t)); downstream.accept(mapper.applyAsLong(t));
} }
@ -226,6 +228,7 @@ abstract class LongPipeline<E_IN>
Sink<Long> opWrapSink(int flags, Sink<U> sink) { Sink<Long> opWrapSink(int flags, Sink<U> sink) {
return new Sink.ChainedLong(sink) { return new Sink.ChainedLong(sink) {
@Override @Override
@SuppressWarnings("unchecked")
public void accept(long t) { public void accept(long t) {
downstream.accept(mapper.apply(t)); downstream.accept(mapper.apply(t));
} }
@ -243,6 +246,7 @@ abstract class LongPipeline<E_IN>
Sink<Long> opWrapSink(int flags, Sink<Integer> sink) { Sink<Long> opWrapSink(int flags, Sink<Integer> sink) {
return new Sink.ChainedLong(sink) { return new Sink.ChainedLong(sink) {
@Override @Override
@SuppressWarnings("unchecked")
public void accept(long t) { public void accept(long t) {
downstream.accept(mapper.applyAsInt(t)); downstream.accept(mapper.applyAsInt(t));
} }

View File

@ -517,7 +517,7 @@ public interface LongStream extends BaseStream<Long, LongStream> {
long count(); long count();
/** /**
* Returns an {@code OptionalDouble} describing the average of elements of * Returns an {@code OptionalDouble} describing the arithmetic mean of elements of
* this stream, or an empty optional if this stream is empty. This is a * this stream, or an empty optional if this stream is empty. This is a
* special case of a * special case of a
* <a href="package-summary.html#MutableReduction">reduction</a>. * <a href="package-summary.html#MutableReduction">reduction</a>.

View File

@ -274,6 +274,7 @@ final class MatchOps {
* @param <P_IN> the type of source elements for the pipeline * @param <P_IN> the type of source elements for the pipeline
* @param <P_OUT> the type of output elements for the pipeline * @param <P_OUT> the type of output elements for the pipeline
*/ */
@SuppressWarnings("serial")
private static final class MatchTask<P_IN, P_OUT> private static final class MatchTask<P_IN, P_OUT>
extends AbstractShortCircuitTask<P_IN, P_OUT, Boolean, MatchTask<P_IN, P_OUT>> { extends AbstractShortCircuitTask<P_IN, P_OUT, Boolean, MatchTask<P_IN, P_OUT>> {
private final MatchOp<P_OUT> op; private final MatchOp<P_OUT> op;

View File

@ -60,6 +60,7 @@ final class Nodes {
*/ */
static final long MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; static final long MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
@SuppressWarnings("raw")
private static final Node EMPTY_NODE = new EmptyNode.OfRef(); private static final Node EMPTY_NODE = new EmptyNode.OfRef();
private static final Node.OfInt EMPTY_INT_NODE = new EmptyNode.OfInt(); private static final Node.OfInt EMPTY_INT_NODE = new EmptyNode.OfInt();
private static final Node.OfLong EMPTY_LONG_NODE = new EmptyNode.OfLong(); private static final Node.OfLong EMPTY_LONG_NODE = new EmptyNode.OfLong();
@ -1786,6 +1787,10 @@ final class Nodes {
} }
} }
/*
* This and subclasses are not intended to be serializable
*/
@SuppressWarnings("serial")
private static abstract class SizedCollectorTask<P_IN, P_OUT, T_SINK extends Sink<P_OUT>, private static abstract class SizedCollectorTask<P_IN, P_OUT, T_SINK extends Sink<P_OUT>,
K extends SizedCollectorTask<P_IN, P_OUT, T_SINK, K>> K extends SizedCollectorTask<P_IN, P_OUT, T_SINK, K>>
extends CountedCompleter<Void> extends CountedCompleter<Void>
@ -1855,6 +1860,7 @@ final class Nodes {
fence = (int) offset + (int) length; fence = (int) offset + (int) length;
} }
@SuppressWarnings("serial")
static final class OfRef<P_IN, P_OUT> static final class OfRef<P_IN, P_OUT>
extends SizedCollectorTask<P_IN, P_OUT, Sink<P_OUT>, OfRef<P_IN, P_OUT>> extends SizedCollectorTask<P_IN, P_OUT, Sink<P_OUT>, OfRef<P_IN, P_OUT>>
implements Sink<P_OUT> { implements Sink<P_OUT> {
@ -1886,6 +1892,7 @@ final class Nodes {
} }
} }
@SuppressWarnings("serial")
static final class OfInt<P_IN> static final class OfInt<P_IN>
extends SizedCollectorTask<P_IN, Integer, Sink.OfInt, OfInt<P_IN>> extends SizedCollectorTask<P_IN, Integer, Sink.OfInt, OfInt<P_IN>>
implements Sink.OfInt { implements Sink.OfInt {
@ -1917,6 +1924,7 @@ final class Nodes {
} }
} }
@SuppressWarnings("serial")
static final class OfLong<P_IN> static final class OfLong<P_IN>
extends SizedCollectorTask<P_IN, Long, Sink.OfLong, OfLong<P_IN>> extends SizedCollectorTask<P_IN, Long, Sink.OfLong, OfLong<P_IN>>
implements Sink.OfLong { implements Sink.OfLong {
@ -1948,6 +1956,7 @@ final class Nodes {
} }
} }
@SuppressWarnings("serial")
static final class OfDouble<P_IN> static final class OfDouble<P_IN>
extends SizedCollectorTask<P_IN, Double, Sink.OfDouble, OfDouble<P_IN>> extends SizedCollectorTask<P_IN, Double, Sink.OfDouble, OfDouble<P_IN>>
implements Sink.OfDouble { implements Sink.OfDouble {
@ -1980,6 +1989,7 @@ final class Nodes {
} }
} }
@SuppressWarnings("serial")
private static abstract class ToArrayTask<T, T_NODE extends Node<T>, private static abstract class ToArrayTask<T, T_NODE extends Node<T>,
K extends ToArrayTask<T, T_NODE, K>> K extends ToArrayTask<T, T_NODE, K>>
extends CountedCompleter<Void> { extends CountedCompleter<Void> {
@ -2025,6 +2035,7 @@ final class Nodes {
} }
} }
@SuppressWarnings("serial")
private static final class OfRef<T> private static final class OfRef<T>
extends ToArrayTask<T, Node<T>, OfRef<T>> { extends ToArrayTask<T, Node<T>, OfRef<T>> {
private final T[] array; private final T[] array;
@ -2050,6 +2061,7 @@ final class Nodes {
} }
} }
@SuppressWarnings("serial")
private static class OfPrimitive<T, T_CONS, T_ARR, private static class OfPrimitive<T, T_CONS, T_ARR,
T_SPLITR extends Spliterator.OfPrimitive<T, T_CONS, T_SPLITR>, T_SPLITR extends Spliterator.OfPrimitive<T, T_CONS, T_SPLITR>,
T_NODE extends Node.OfPrimitive<T, T_CONS, T_ARR, T_SPLITR, T_NODE>> T_NODE extends Node.OfPrimitive<T, T_CONS, T_ARR, T_SPLITR, T_NODE>>
@ -2077,6 +2089,7 @@ final class Nodes {
} }
} }
@SuppressWarnings("serial")
private static final class OfInt private static final class OfInt
extends OfPrimitive<Integer, IntConsumer, int[], Spliterator.OfInt, Node.OfInt> { extends OfPrimitive<Integer, IntConsumer, int[], Spliterator.OfInt, Node.OfInt> {
private OfInt(Node.OfInt node, int[] array, int offset) { private OfInt(Node.OfInt node, int[] array, int offset) {
@ -2084,6 +2097,7 @@ final class Nodes {
} }
} }
@SuppressWarnings("serial")
private static final class OfLong private static final class OfLong
extends OfPrimitive<Long, LongConsumer, long[], Spliterator.OfLong, Node.OfLong> { extends OfPrimitive<Long, LongConsumer, long[], Spliterator.OfLong, Node.OfLong> {
private OfLong(Node.OfLong node, long[] array, int offset) { private OfLong(Node.OfLong node, long[] array, int offset) {
@ -2091,6 +2105,7 @@ final class Nodes {
} }
} }
@SuppressWarnings("serial")
private static final class OfDouble private static final class OfDouble
extends OfPrimitive<Double, DoubleConsumer, double[], Spliterator.OfDouble, Node.OfDouble> { extends OfPrimitive<Double, DoubleConsumer, double[], Spliterator.OfDouble, Node.OfDouble> {
private OfDouble(Node.OfDouble node, double[] array, int offset) { private OfDouble(Node.OfDouble node, double[] array, int offset) {
@ -2099,6 +2114,7 @@ final class Nodes {
} }
} }
@SuppressWarnings("serial")
private static class CollectorTask<P_IN, P_OUT, T_NODE extends Node<P_OUT>, T_BUILDER extends Node.Builder<P_OUT>> private static class CollectorTask<P_IN, P_OUT, T_NODE extends Node<P_OUT>, T_BUILDER extends Node.Builder<P_OUT>>
extends AbstractTask<P_IN, P_OUT, T_NODE, CollectorTask<P_IN, P_OUT, T_NODE, T_BUILDER>> { extends AbstractTask<P_IN, P_OUT, T_NODE, CollectorTask<P_IN, P_OUT, T_NODE, T_BUILDER>> {
protected final PipelineHelper<P_OUT> helper; protected final PipelineHelper<P_OUT> helper;
@ -2135,12 +2151,13 @@ final class Nodes {
} }
@Override @Override
public void onCompletion(CountedCompleter caller) { public void onCompletion(CountedCompleter<?> caller) {
if (!isLeaf()) if (!isLeaf())
setLocalResult(concFactory.apply(leftChild.getLocalResult(), rightChild.getLocalResult())); setLocalResult(concFactory.apply(leftChild.getLocalResult(), rightChild.getLocalResult()));
super.onCompletion(caller); super.onCompletion(caller);
} }
@SuppressWarnings("serial")
private static final class OfRef<P_IN, P_OUT> private static final class OfRef<P_IN, P_OUT>
extends CollectorTask<P_IN, P_OUT, Node<P_OUT>, Node.Builder<P_OUT>> { extends CollectorTask<P_IN, P_OUT, Node<P_OUT>, Node.Builder<P_OUT>> {
OfRef(PipelineHelper<P_OUT> helper, OfRef(PipelineHelper<P_OUT> helper,
@ -2150,6 +2167,7 @@ final class Nodes {
} }
} }
@SuppressWarnings("serial")
private static final class OfInt<P_IN> private static final class OfInt<P_IN>
extends CollectorTask<P_IN, Integer, Node.OfInt, Node.Builder.OfInt> { extends CollectorTask<P_IN, Integer, Node.OfInt, Node.Builder.OfInt> {
OfInt(PipelineHelper<Integer> helper, Spliterator<P_IN> spliterator) { OfInt(PipelineHelper<Integer> helper, Spliterator<P_IN> spliterator) {
@ -2157,6 +2175,7 @@ final class Nodes {
} }
} }
@SuppressWarnings("serial")
private static final class OfLong<P_IN> private static final class OfLong<P_IN>
extends CollectorTask<P_IN, Long, Node.OfLong, Node.Builder.OfLong> { extends CollectorTask<P_IN, Long, Node.OfLong, Node.Builder.OfLong> {
OfLong(PipelineHelper<Long> helper, Spliterator<P_IN> spliterator) { OfLong(PipelineHelper<Long> helper, Spliterator<P_IN> spliterator) {
@ -2164,6 +2183,7 @@ final class Nodes {
} }
} }
@SuppressWarnings("serial")
private static final class OfDouble<P_IN> private static final class OfDouble<P_IN>
extends CollectorTask<P_IN, Double, Node.OfDouble, Node.Builder.OfDouble> { extends CollectorTask<P_IN, Double, Node.OfDouble, Node.Builder.OfDouble> {
OfDouble(PipelineHelper<Double> helper, Spliterator<P_IN> spliterator) { OfDouble(PipelineHelper<Double> helper, Spliterator<P_IN> spliterator) {

View File

@ -43,7 +43,7 @@ import java.util.function.ObjLongConsumer;
import java.util.function.Supplier; import java.util.function.Supplier;
/** /**
* Factory for the creating instances of {@code TerminalOp) that implement * Factory for creating instances of {@code TerminalOp} that implement
* reductions. * reductions.
* *
* @since 1.8 * @since 1.8
@ -148,17 +148,17 @@ final class ReduceOps {
* reference values. * reference values.
* *
* @param <T> the type of the input elements * @param <T> the type of the input elements
* @param <R> the type of the result * @param <I> the type of the intermediate reduction result
* @param collector a {@code Collector} defining the reduction * @param collector a {@code Collector} defining the reduction
* @return a {@code ReduceOp} implementing the reduction * @return a {@code ReduceOp} implementing the reduction
*/ */
public static <T,R> TerminalOp<T, R> public static <T, I> TerminalOp<T, I>
makeRef(Collector<? super T,R> collector) { makeRef(Collector<? super T, I, ?> collector) {
Supplier<R> supplier = Objects.requireNonNull(collector).resultSupplier(); Supplier<I> supplier = Objects.requireNonNull(collector).supplier();
BiFunction<R, ? super T, R> accumulator = collector.accumulator(); BiConsumer<I, ? super T> accumulator = collector.accumulator();
BinaryOperator<R> combiner = collector.combiner(); BinaryOperator<I> combiner = collector.combiner();
class ReducingSink extends Box<R> class ReducingSink extends Box<I>
implements AccumulatingSink<T, R, ReducingSink> { implements AccumulatingSink<T, I, ReducingSink> {
@Override @Override
public void begin(long size) { public void begin(long size) {
state = supplier.get(); state = supplier.get();
@ -166,9 +166,7 @@ final class ReduceOps {
@Override @Override
public void accept(T t) { public void accept(T t) {
R newResult = accumulator.apply(state, t); accumulator.accept(state, t);
if (state != newResult)
state = newResult;
} }
@Override @Override
@ -176,7 +174,7 @@ final class ReduceOps {
state = combiner.apply(state, other.state); state = combiner.apply(state, other.state);
} }
} }
return new ReduceOp<T, R, ReducingSink>(StreamShape.REFERENCE) { return new ReduceOp<T, I, ReducingSink>(StreamShape.REFERENCE) {
@Override @Override
public ReducingSink makeSink() { public ReducingSink makeSink() {
return new ReducingSink(); return new ReducingSink();
@ -720,6 +718,7 @@ final class ReduceOps {
/** /**
* A {@code ForkJoinTask} for performing a parallel reduce operation. * A {@code ForkJoinTask} for performing a parallel reduce operation.
*/ */
@SuppressWarnings("serial")
private static final class ReduceTask<P_IN, P_OUT, R, private static final class ReduceTask<P_IN, P_OUT, R,
S extends AccumulatingSink<P_OUT, R, S>> S extends AccumulatingSink<P_OUT, R, S>>
extends AbstractTask<P_IN, P_OUT, S, ReduceTask<P_IN, P_OUT, R, S>> { extends AbstractTask<P_IN, P_OUT, S, ReduceTask<P_IN, P_OUT, R, S>> {
@ -749,7 +748,7 @@ final class ReduceOps {
} }
@Override @Override
public void onCompletion(CountedCompleter caller) { public void onCompletion(CountedCompleter<?> caller) {
if (!isLeaf()) { if (!isLeaf()) {
S leftResult = leftChild.getLocalResult(); S leftResult = leftChild.getLocalResult();
leftResult.combine(rightChild.getLocalResult()); leftResult.combine(rightChild.getLocalResult());

View File

@ -170,9 +170,10 @@ abstract class ReferencePipeline<P_IN, P_OUT>
} }
@Override @Override
@SuppressWarnings("unchecked")
public void accept(P_OUT u) { public void accept(P_OUT u) {
if (predicate.test(u)) if (predicate.test(u))
downstream.accept(u); downstream.accept((Object) u);
} }
}; };
} }
@ -180,6 +181,7 @@ abstract class ReferencePipeline<P_IN, P_OUT>
} }
@Override @Override
@SuppressWarnings("unchecked")
public final <R> Stream<R> map(Function<? super P_OUT, ? extends R> mapper) { public final <R> Stream<R> map(Function<? super P_OUT, ? extends R> mapper) {
Objects.requireNonNull(mapper); Objects.requireNonNull(mapper);
return new StatelessOp<P_OUT, R>(this, StreamShape.REFERENCE, return new StatelessOp<P_OUT, R>(this, StreamShape.REFERENCE,
@ -262,6 +264,7 @@ abstract class ReferencePipeline<P_IN, P_OUT>
} }
@Override @Override
@SuppressWarnings("unchecked")
public void accept(P_OUT u) { public void accept(P_OUT u) {
// We can do better that this too; optimize for depth=0 case and just grab spliterator and forEach it // We can do better that this too; optimize for depth=0 case and just grab spliterator and forEach it
Stream<? extends R> result = mapper.apply(u); Stream<? extends R> result = mapper.apply(u);
@ -363,6 +366,7 @@ abstract class ReferencePipeline<P_IN, P_OUT>
Sink<P_OUT> opWrapSink(int flags, Sink<P_OUT> sink) { Sink<P_OUT> opWrapSink(int flags, Sink<P_OUT> sink) {
return new Sink.ChainedReference<P_OUT>(sink) { return new Sink.ChainedReference<P_OUT>(sink) {
@Override @Override
@SuppressWarnings("unchecked")
public void accept(P_OUT u) { public void accept(P_OUT u) {
tee.accept(u); tee.accept(u);
downstream.accept(u); downstream.accept(u);
@ -439,6 +443,7 @@ abstract class ReferencePipeline<P_IN, P_OUT>
// The runtime type of U is never checked for equality with the component type of the runtime type of A[]. // The runtime type of U is never checked for equality with the component type of the runtime type of A[].
// Runtime checking will be performed when an element is stored in A[], thus if A is not a // Runtime checking will be performed when an element is stored in A[], thus if A is not a
// super type of U an ArrayStoreException will be thrown. // super type of U an ArrayStoreException will be thrown.
@SuppressWarnings("rawtypes")
IntFunction rawGenerator = (IntFunction) generator; IntFunction rawGenerator = (IntFunction) generator;
return (A[]) Nodes.flatten(evaluateToArrayNode(rawGenerator), rawGenerator) return (A[]) Nodes.flatten(evaluateToArrayNode(rawGenerator), rawGenerator)
.asArray(rawGenerator); .asArray(rawGenerator);
@ -490,16 +495,21 @@ abstract class ReferencePipeline<P_IN, P_OUT>
} }
@Override @Override
public final <R> R collect(Collector<? super P_OUT, R> collector) { public final <R, A> R collect(Collector<? super P_OUT, A, ? extends R> collector) {
A container;
if (isParallel() if (isParallel()
&& (collector.characteristics().contains(Collector.Characteristics.CONCURRENT)) && (collector.characteristics().contains(Collector.Characteristics.CONCURRENT))
&& (!isOrdered() || collector.characteristics().contains(Collector.Characteristics.UNORDERED))) { && (!isOrdered() || collector.characteristics().contains(Collector.Characteristics.UNORDERED))) {
R container = collector.resultSupplier().get(); container = collector.supplier().get();
BiFunction<R, ? super P_OUT, R> accumulator = collector.accumulator(); BiConsumer<A, ? super P_OUT> accumulator = collector.accumulator();
forEach(u -> accumulator.apply(container, u)); forEach(u -> accumulator.accept(container, u));
return container;
} }
return evaluate(ReduceOps.makeRef(collector)); else {
container = evaluate(ReduceOps.makeRef(collector));
}
return collector.characteristics().contains(Collector.Characteristics.IDENTITY_FINISH)
? (R) container
: collector.finisher().apply(container);
} }
@Override @Override

View File

@ -242,6 +242,7 @@ interface Sink<T> extends Consumer<T> {
* {@code accept()} method on the downstream {@code Sink}. * {@code accept()} method on the downstream {@code Sink}.
*/ */
static abstract class ChainedReference<T> implements Sink<T> { static abstract class ChainedReference<T> implements Sink<T> {
@SuppressWarnings("rawtypes")
protected final Sink downstream; protected final Sink downstream;
public ChainedReference(Sink downstream) { public ChainedReference(Sink downstream) {
@ -274,6 +275,7 @@ interface Sink<T> extends Consumer<T> {
* {@code accept()} method on the downstream {@code Sink}. * {@code accept()} method on the downstream {@code Sink}.
*/ */
static abstract class ChainedInt implements Sink.OfInt { static abstract class ChainedInt implements Sink.OfInt {
@SuppressWarnings("rawtypes")
protected final Sink downstream; protected final Sink downstream;
public ChainedInt(Sink downstream) { public ChainedInt(Sink downstream) {
@ -306,6 +308,7 @@ interface Sink<T> extends Consumer<T> {
* {@code accept()} method on the downstream {@code Sink}. * {@code accept()} method on the downstream {@code Sink}.
*/ */
static abstract class ChainedLong implements Sink.OfLong { static abstract class ChainedLong implements Sink.OfLong {
@SuppressWarnings("rawtypes")
protected final Sink downstream; protected final Sink downstream;
public ChainedLong(Sink downstream) { public ChainedLong(Sink downstream) {
@ -338,6 +341,7 @@ interface Sink<T> extends Consumer<T> {
* {@code accept()} method on the downstream {@code Sink}. * {@code accept()} method on the downstream {@code Sink}.
*/ */
static abstract class ChainedDouble implements Sink.OfDouble { static abstract class ChainedDouble implements Sink.OfDouble {
@SuppressWarnings("rawtypes")
protected final Sink downstream; protected final Sink downstream;
public ChainedDouble(Sink downstream) { public ChainedDouble(Sink downstream) {

View File

@ -550,6 +550,7 @@ final class SliceOps {
* @param <P_IN> Input element type to the stream pipeline * @param <P_IN> Input element type to the stream pipeline
* @param <P_OUT> Output element type from the stream pipeline * @param <P_OUT> Output element type from the stream pipeline
*/ */
@SuppressWarnings("serial")
private static final class SliceTask<P_IN, P_OUT> private static final class SliceTask<P_IN, P_OUT>
extends AbstractShortCircuitTask<P_IN, P_OUT, Node<P_OUT>, SliceTask<P_IN, P_OUT>> { extends AbstractShortCircuitTask<P_IN, P_OUT, Node<P_OUT>, SliceTask<P_IN, P_OUT>> {
private final AbstractPipeline<P_OUT, P_OUT, ?> op; private final AbstractPipeline<P_OUT, P_OUT, ?> op;

View File

@ -209,7 +209,7 @@ final class SortedOps {
} }
@Override @Override
public Sink<Long> opWrapSink(int flags, Sink sink) { public Sink<Long> opWrapSink(int flags, Sink<Long> sink) {
Objects.requireNonNull(sink); Objects.requireNonNull(sink);
if (StreamOpFlag.SORTED.isKnown(flags)) if (StreamOpFlag.SORTED.isKnown(flags))
@ -248,7 +248,7 @@ final class SortedOps {
} }
@Override @Override
public Sink<Double> opWrapSink(int flags, Sink sink) { public Sink<Double> opWrapSink(int flags, Sink<Double> sink) {
Objects.requireNonNull(sink); Objects.requireNonNull(sink);
if (StreamOpFlag.SORTED.isKnown(flags)) if (StreamOpFlag.SORTED.isKnown(flags))
@ -285,7 +285,7 @@ final class SortedOps {
private T[] array; private T[] array;
private int offset; private int offset;
SizedRefSortingSink(Sink sink, Comparator<? super T> comparator) { SizedRefSortingSink(Sink<T> sink, Comparator<? super T> comparator) {
super(sink); super(sink);
this.comparator = comparator; this.comparator = comparator;
} }
@ -324,7 +324,7 @@ final class SortedOps {
private final Comparator<? super T> comparator; private final Comparator<? super T> comparator;
private ArrayList<T> list; private ArrayList<T> list;
RefSortingSink(Sink sink, Comparator<? super T> comparator) { RefSortingSink(Sink<T> sink, Comparator<? super T> comparator) {
super(sink); super(sink);
this.comparator = comparator; this.comparator = comparator;
} }

View File

@ -28,6 +28,7 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.PrimitiveIterator; import java.util.PrimitiveIterator;
import java.util.Spliterator; import java.util.Spliterator;
import java.util.Spliterators; import java.util.Spliterators;
@ -317,6 +318,8 @@ class SpinedBuffer<E>
@Override @Override
public boolean tryAdvance(Consumer<? super E> consumer) { public boolean tryAdvance(Consumer<? super E> consumer) {
Objects.requireNonNull(consumer);
if (splSpineIndex < lastSpineIndex if (splSpineIndex < lastSpineIndex
|| (splSpineIndex == lastSpineIndex && splElementIndex < lastSpineElementFence)) { || (splSpineIndex == lastSpineIndex && splElementIndex < lastSpineElementFence)) {
consumer.accept(splChunk[splElementIndex++]); consumer.accept(splChunk[splElementIndex++]);
@ -334,6 +337,8 @@ class SpinedBuffer<E>
@Override @Override
public void forEachRemaining(Consumer<? super E> consumer) { public void forEachRemaining(Consumer<? super E> consumer) {
Objects.requireNonNull(consumer);
if (splSpineIndex < lastSpineIndex if (splSpineIndex < lastSpineIndex
|| (splSpineIndex == lastSpineIndex && splElementIndex < lastSpineElementFence)) { || (splSpineIndex == lastSpineIndex && splElementIndex < lastSpineElementFence)) {
int i = splElementIndex; int i = splElementIndex;
@ -634,6 +639,8 @@ class SpinedBuffer<E>
@Override @Override
public boolean tryAdvance(T_CONS consumer) { public boolean tryAdvance(T_CONS consumer) {
Objects.requireNonNull(consumer);
if (splSpineIndex < lastSpineIndex if (splSpineIndex < lastSpineIndex
|| (splSpineIndex == lastSpineIndex && splElementIndex < lastSpineElementFence)) { || (splSpineIndex == lastSpineIndex && splElementIndex < lastSpineElementFence)) {
arrayForOne(splChunk, splElementIndex++, consumer); arrayForOne(splChunk, splElementIndex++, consumer);
@ -651,6 +658,8 @@ class SpinedBuffer<E>
@Override @Override
public void forEachRemaining(T_CONS consumer) { public void forEachRemaining(T_CONS consumer) {
Objects.requireNonNull(consumer);
if (splSpineIndex < lastSpineIndex if (splSpineIndex < lastSpineIndex
|| (splSpineIndex == lastSpineIndex && splElementIndex < lastSpineElementFence)) { || (splSpineIndex == lastSpineIndex && splElementIndex < lastSpineElementFence)) {
int i = splElementIndex; int i = splElementIndex;

View File

@ -651,12 +651,13 @@ public interface Stream<T> extends BaseStream<T, Stream<T>> {
* }</pre> * }</pre>
* *
* @param <R> the type of the result * @param <R> the type of the result
* @param <A> the intermediate accumulation type of the {@code Collector}
* @param collector the {@code Collector} describing the reduction * @param collector the {@code Collector} describing the reduction
* @return the result of the reduction * @return the result of the reduction
* @see #collect(Supplier, BiConsumer, BiConsumer) * @see #collect(Supplier, BiConsumer, BiConsumer)
* @see Collectors * @see Collectors
*/ */
<R> R collect(Collector<? super T, R> collector); <R, A> R collect(Collector<? super T, A, ? extends R> collector);
/** /**
* Returns the minimum element of this stream according to the provided * Returns the minimum element of this stream according to the provided
@ -827,6 +828,7 @@ public interface Stream<T> extends BaseStream<T, Stream<T>> {
* @return the new stream * @return the new stream
*/ */
@SafeVarargs @SafeVarargs
@SuppressWarnings("varargs") // Creating a stream from an array is safe
public static<T> Stream<T> of(T... values) { public static<T> Stream<T> of(T... values) {
return Arrays.stream(values); return Arrays.stream(values);
} }

View File

@ -25,6 +25,7 @@
package java.util.stream; package java.util.stream;
import java.util.Comparator; import java.util.Comparator;
import java.util.Objects;
import java.util.Spliterator; import java.util.Spliterator;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
import java.util.function.BooleanSupplier; import java.util.function.BooleanSupplier;
@ -294,6 +295,7 @@ class StreamSpliterators {
@Override @Override
public boolean tryAdvance(Consumer<? super P_OUT> consumer) { public boolean tryAdvance(Consumer<? super P_OUT> consumer) {
Objects.requireNonNull(consumer);
boolean hasNext = doAdvance(); boolean hasNext = doAdvance();
if (hasNext) if (hasNext)
consumer.accept(buffer.get(nextToConsume)); consumer.accept(buffer.get(nextToConsume));
@ -303,6 +305,7 @@ class StreamSpliterators {
@Override @Override
public void forEachRemaining(Consumer<? super P_OUT> consumer) { public void forEachRemaining(Consumer<? super P_OUT> consumer) {
if (buffer == null && !finished) { if (buffer == null && !finished) {
Objects.requireNonNull(consumer);
init(); init();
ph.wrapAndCopyInto((Sink<P_OUT>) consumer::accept, spliterator); ph.wrapAndCopyInto((Sink<P_OUT>) consumer::accept, spliterator);
@ -350,6 +353,7 @@ class StreamSpliterators {
@Override @Override
public boolean tryAdvance(IntConsumer consumer) { public boolean tryAdvance(IntConsumer consumer) {
Objects.requireNonNull(consumer);
boolean hasNext = doAdvance(); boolean hasNext = doAdvance();
if (hasNext) if (hasNext)
consumer.accept(buffer.get(nextToConsume)); consumer.accept(buffer.get(nextToConsume));
@ -359,6 +363,7 @@ class StreamSpliterators {
@Override @Override
public void forEachRemaining(IntConsumer consumer) { public void forEachRemaining(IntConsumer consumer) {
if (buffer == null && !finished) { if (buffer == null && !finished) {
Objects.requireNonNull(consumer);
init(); init();
ph.wrapAndCopyInto((Sink.OfInt) consumer::accept, spliterator); ph.wrapAndCopyInto((Sink.OfInt) consumer::accept, spliterator);
@ -406,6 +411,7 @@ class StreamSpliterators {
@Override @Override
public boolean tryAdvance(LongConsumer consumer) { public boolean tryAdvance(LongConsumer consumer) {
Objects.requireNonNull(consumer);
boolean hasNext = doAdvance(); boolean hasNext = doAdvance();
if (hasNext) if (hasNext)
consumer.accept(buffer.get(nextToConsume)); consumer.accept(buffer.get(nextToConsume));
@ -415,6 +421,7 @@ class StreamSpliterators {
@Override @Override
public void forEachRemaining(LongConsumer consumer) { public void forEachRemaining(LongConsumer consumer) {
if (buffer == null && !finished) { if (buffer == null && !finished) {
Objects.requireNonNull(consumer);
init(); init();
ph.wrapAndCopyInto((Sink.OfLong) consumer::accept, spliterator); ph.wrapAndCopyInto((Sink.OfLong) consumer::accept, spliterator);
@ -462,6 +469,7 @@ class StreamSpliterators {
@Override @Override
public boolean tryAdvance(DoubleConsumer consumer) { public boolean tryAdvance(DoubleConsumer consumer) {
Objects.requireNonNull(consumer);
boolean hasNext = doAdvance(); boolean hasNext = doAdvance();
if (hasNext) if (hasNext)
consumer.accept(buffer.get(nextToConsume)); consumer.accept(buffer.get(nextToConsume));
@ -471,6 +479,7 @@ class StreamSpliterators {
@Override @Override
public void forEachRemaining(DoubleConsumer consumer) { public void forEachRemaining(DoubleConsumer consumer) {
if (buffer == null && !finished) { if (buffer == null && !finished) {
Objects.requireNonNull(consumer);
init(); init();
ph.wrapAndCopyInto((Sink.OfDouble) consumer::accept, spliterator); ph.wrapAndCopyInto((Sink.OfDouble) consumer::accept, spliterator);
@ -696,6 +705,8 @@ class StreamSpliterators {
@Override @Override
public boolean tryAdvance(Consumer<? super T> action) { public boolean tryAdvance(Consumer<? super T> action) {
Objects.requireNonNull(action);
if (sliceOrigin >= fence) if (sliceOrigin >= fence)
return false; return false;
@ -713,6 +724,8 @@ class StreamSpliterators {
@Override @Override
public void forEachRemaining(Consumer<? super T> action) { public void forEachRemaining(Consumer<? super T> action) {
Objects.requireNonNull(action);
if (sliceOrigin >= fence) if (sliceOrigin >= fence)
return; return;
@ -754,6 +767,8 @@ class StreamSpliterators {
@Override @Override
public boolean tryAdvance(T_CONS action) { public boolean tryAdvance(T_CONS action) {
Objects.requireNonNull(action);
if (sliceOrigin >= fence) if (sliceOrigin >= fence)
return false; return false;
@ -771,6 +786,8 @@ class StreamSpliterators {
@Override @Override
public void forEachRemaining(T_CONS action) { public void forEachRemaining(T_CONS action) {
Objects.requireNonNull(action);
if (sliceOrigin >= fence) if (sliceOrigin >= fence)
return; return;
@ -895,7 +912,8 @@ class StreamSpliterators {
this.permits = new AtomicLong(limit >= 0 ? skip + limit : skip); this.permits = new AtomicLong(limit >= 0 ? skip + limit : skip);
} }
UnorderedSliceSpliterator(T_SPLITR s, UnorderedSliceSpliterator parent) { UnorderedSliceSpliterator(T_SPLITR s,
UnorderedSliceSpliterator<T, T_SPLITR> parent) {
this.s = s; this.s = s;
this.unlimited = parent.unlimited; this.unlimited = parent.unlimited;
this.permits = parent.permits; this.permits = parent.permits;
@ -974,7 +992,7 @@ class StreamSpliterators {
super(s, skip, limit); super(s, skip, limit);
} }
OfRef(Spliterator<T> s, OfRef parent) { OfRef(Spliterator<T> s, OfRef<T> parent) {
super(s, parent); super(s, parent);
} }
@ -985,6 +1003,8 @@ class StreamSpliterators {
@Override @Override
public boolean tryAdvance(Consumer<? super T> action) { public boolean tryAdvance(Consumer<? super T> action) {
Objects.requireNonNull(action);
while (permitStatus() != PermitStatus.NO_MORE) { while (permitStatus() != PermitStatus.NO_MORE) {
if (!s.tryAdvance(this)) if (!s.tryAdvance(this))
return false; return false;
@ -999,6 +1019,8 @@ class StreamSpliterators {
@Override @Override
public void forEachRemaining(Consumer<? super T> action) { public void forEachRemaining(Consumer<? super T> action) {
Objects.requireNonNull(action);
ArrayBuffer.OfRef<T> sb = null; ArrayBuffer.OfRef<T> sb = null;
PermitStatus permitStatus; PermitStatus permitStatus;
while ((permitStatus = permitStatus()) != PermitStatus.NO_MORE) { while ((permitStatus = permitStatus()) != PermitStatus.NO_MORE) {
@ -1051,6 +1073,8 @@ class StreamSpliterators {
@Override @Override
public boolean tryAdvance(T_CONS action) { public boolean tryAdvance(T_CONS action) {
Objects.requireNonNull(action);
while (permitStatus() != PermitStatus.NO_MORE) { while (permitStatus() != PermitStatus.NO_MORE) {
if (!s.tryAdvance((T_CONS) this)) if (!s.tryAdvance((T_CONS) this))
return false; return false;
@ -1066,6 +1090,8 @@ class StreamSpliterators {
@Override @Override
public void forEachRemaining(T_CONS action) { public void forEachRemaining(T_CONS action) {
Objects.requireNonNull(action);
T_BUFF sb = null; T_BUFF sb = null;
PermitStatus permitStatus; PermitStatus permitStatus;
while ((permitStatus = permitStatus()) != PermitStatus.NO_MORE) { while ((permitStatus = permitStatus()) != PermitStatus.NO_MORE) {
@ -1237,6 +1263,8 @@ class StreamSpliterators {
@Override @Override
public boolean tryAdvance(Consumer<? super T> action) { public boolean tryAdvance(Consumer<? super T> action) {
Objects.requireNonNull(action);
action.accept(s.get()); action.accept(s.get());
return true; return true;
} }
@ -1260,6 +1288,8 @@ class StreamSpliterators {
@Override @Override
public boolean tryAdvance(IntConsumer action) { public boolean tryAdvance(IntConsumer action) {
Objects.requireNonNull(action);
action.accept(s.getAsInt()); action.accept(s.getAsInt());
return true; return true;
} }
@ -1283,6 +1313,8 @@ class StreamSpliterators {
@Override @Override
public boolean tryAdvance(LongConsumer action) { public boolean tryAdvance(LongConsumer action) {
Objects.requireNonNull(action);
action.accept(s.getAsLong()); action.accept(s.getAsLong());
return true; return true;
} }
@ -1306,6 +1338,8 @@ class StreamSpliterators {
@Override @Override
public boolean tryAdvance(DoubleConsumer action) { public boolean tryAdvance(DoubleConsumer action) {
Objects.requireNonNull(action);
action.accept(s.getAsDouble()); action.accept(s.getAsDouble());
return true; return true;
} }

View File

@ -25,6 +25,7 @@
package java.util.stream; package java.util.stream;
import java.util.Comparator; import java.util.Comparator;
import java.util.Objects;
import java.util.Spliterator; import java.util.Spliterator;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.DoubleConsumer; import java.util.function.DoubleConsumer;
@ -80,6 +81,8 @@ final class Streams {
@Override @Override
public boolean tryAdvance(IntConsumer consumer) { public boolean tryAdvance(IntConsumer consumer) {
Objects.requireNonNull(consumer);
final int i = from; final int i = from;
if (i < upTo) { if (i < upTo) {
from++; from++;
@ -96,6 +99,8 @@ final class Streams {
@Override @Override
public void forEachRemaining(IntConsumer consumer) { public void forEachRemaining(IntConsumer consumer) {
Objects.requireNonNull(consumer);
int i = from; int i = from;
final int hUpTo = upTo; final int hUpTo = upTo;
int hLast = last; int hLast = last;
@ -199,6 +204,8 @@ final class Streams {
@Override @Override
public boolean tryAdvance(LongConsumer consumer) { public boolean tryAdvance(LongConsumer consumer) {
Objects.requireNonNull(consumer);
final long i = from; final long i = from;
if (i < upTo) { if (i < upTo) {
from++; from++;
@ -215,6 +222,8 @@ final class Streams {
@Override @Override
public void forEachRemaining(LongConsumer consumer) { public void forEachRemaining(LongConsumer consumer) {
Objects.requireNonNull(consumer);
long i = from; long i = from;
final long hUpTo = upTo; final long hUpTo = upTo;
int hLast = last; int hLast = last;
@ -388,6 +397,8 @@ final class Streams {
@Override @Override
public boolean tryAdvance(Consumer<? super T> action) { public boolean tryAdvance(Consumer<? super T> action) {
Objects.requireNonNull(action);
if (count == -2) { if (count == -2) {
action.accept(first); action.accept(first);
count = -1; count = -1;
@ -400,6 +411,8 @@ final class Streams {
@Override @Override
public void forEachRemaining(Consumer<? super T> action) { public void forEachRemaining(Consumer<? super T> action) {
Objects.requireNonNull(action);
if (count == -2) { if (count == -2) {
action.accept(first); action.accept(first);
count = -1; count = -1;
@ -475,6 +488,8 @@ final class Streams {
@Override @Override
public boolean tryAdvance(IntConsumer action) { public boolean tryAdvance(IntConsumer action) {
Objects.requireNonNull(action);
if (count == -2) { if (count == -2) {
action.accept(first); action.accept(first);
count = -1; count = -1;
@ -487,6 +502,8 @@ final class Streams {
@Override @Override
public void forEachRemaining(IntConsumer action) { public void forEachRemaining(IntConsumer action) {
Objects.requireNonNull(action);
if (count == -2) { if (count == -2) {
action.accept(first); action.accept(first);
count = -1; count = -1;
@ -562,6 +579,8 @@ final class Streams {
@Override @Override
public boolean tryAdvance(LongConsumer action) { public boolean tryAdvance(LongConsumer action) {
Objects.requireNonNull(action);
if (count == -2) { if (count == -2) {
action.accept(first); action.accept(first);
count = -1; count = -1;
@ -574,6 +593,8 @@ final class Streams {
@Override @Override
public void forEachRemaining(LongConsumer action) { public void forEachRemaining(LongConsumer action) {
Objects.requireNonNull(action);
if (count == -2) { if (count == -2) {
action.accept(first); action.accept(first);
count = -1; count = -1;
@ -649,6 +670,8 @@ final class Streams {
@Override @Override
public boolean tryAdvance(DoubleConsumer action) { public boolean tryAdvance(DoubleConsumer action) {
Objects.requireNonNull(action);
if (count == -2) { if (count == -2) {
action.accept(first); action.accept(first);
count = -1; count = -1;
@ -661,6 +684,8 @@ final class Streams {
@Override @Override
public void forEachRemaining(DoubleConsumer action) { public void forEachRemaining(DoubleConsumer action) {
Objects.requireNonNull(action);
if (count == -2) { if (count == -2) {
action.accept(first); action.accept(first);
count = -1; count = -1;

View File

@ -547,7 +547,7 @@
* List<String> l = new ArrayList(Arrays.asList("one", "two")); * List<String> l = new ArrayList(Arrays.asList("one", "two"));
* Stream<String> sl = l.stream(); * Stream<String> sl = l.stream();
* l.add("three"); * l.add("three");
* String s = sl.collect(toStringJoiner(" ")).toString(); * String s = sl.collect(joining(" "));
* }</pre> * }</pre>
* First a list is created consisting of two strings: "one"; and "two". Then a stream is created from that list. * First a list is created consisting of two strings: "one"; and "two". Then a stream is created from that list.
* Next the list is modified by adding a third string: "three". Finally the elements of the stream are collected * Next the list is modified by adding a third string: "three". Finally the elements of the stream are collected
@ -557,7 +557,7 @@
* <pre>{@code * <pre>{@code
* List<String> l = new ArrayList(Arrays.asList("one", "two")); * List<String> l = new ArrayList(Arrays.asList("one", "two"));
* Stream<String> sl = l.stream(); * Stream<String> sl = l.stream();
* String s = sl.peek(s -> l.add("BAD LAMBDA")).collect(toStringJoiner(" ")).toString(); * String s = sl.peek(s -> l.add("BAD LAMBDA")).collect(joining(" "));
* }</pre> * }</pre>
* then a {@code ConcurrentModificationException} will be thrown since the {@code peek} operation will attempt * then a {@code ConcurrentModificationException} will be thrown since the {@code peek} operation will attempt
* to add the string "BAD LAMBDA" to the list after the terminal operation has commenced. * to add the string "BAD LAMBDA" to the list after the terminal operation has commenced.

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 1999, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2013, 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
@ -45,6 +45,7 @@ public interface Accessible {
* of an object that implements Accessible, and that subclass * of an object that implements Accessible, and that subclass
* is not Accessible, the developer should override the * is not Accessible, the developer should override the
* getAccessibleContext method to return null. * getAccessibleContext method to return null.
* @return the AccessibleContext associated with this object
*/ */
public AccessibleContext getAccessibleContext(); public AccessibleContext getAccessibleContext();
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2002, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2013, 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
@ -53,6 +53,9 @@ public abstract class AccessibleBundle {
private final String defaultResourceBundleName private final String defaultResourceBundleName
= "com.sun.accessibility.internal.resources.accessibility"; = "com.sun.accessibility.internal.resources.accessibility";
/**
* Construct an {@code AccessibleBundle}.
*/
public AccessibleBundle() { public AccessibleBundle() {
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2001, 2006, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2001, 2013, 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
@ -60,7 +60,7 @@ public interface AccessibleExtendedTable extends AccessibleTable {
*/ */
public int getAccessibleColumn(int index); public int getAccessibleColumn(int index);
/* /**
* Returns the index at a row and column in the table. * Returns the index at a row and column in the table.
* *
* @param r zero-based row of the table * @param r zero-based row of the table

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2006, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2013, 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
@ -163,6 +163,7 @@ public class AccessibleRelationSet {
/** /**
* Returns the number of relations in the relation set. * Returns the number of relations in the relation set.
* @return the number of relations in the relation set
*/ */
public int size() { public int size() {
if (relations == null) { if (relations == null) {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2006, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2013, 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
@ -90,6 +90,8 @@ public interface AccessibleTable {
* Returns the number of rows occupied by the Accessible at * Returns the number of rows occupied by the Accessible at
* a specified row and column in the table. * a specified row and column in the table.
* *
* @param r zero-based row of the table
* @param c zero-based column of the table
* @return the number of rows occupied by the Accessible at a * @return the number of rows occupied by the Accessible at a
* given specified (row, column) * given specified (row, column)
*/ */
@ -99,6 +101,8 @@ public interface AccessibleTable {
* Returns the number of columns occupied by the Accessible at * Returns the number of columns occupied by the Accessible at
* a specified row and column in the table. * a specified row and column in the table.
* *
* @param r zero-based row of the table
* @param c zero-based column of the table
* @return the number of columns occupied by the Accessible at a * @return the number of columns occupied by the Accessible at a
* given specified row and column * given specified row and column
*/ */

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2006, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2013, 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
@ -71,8 +71,8 @@ public interface AccessibleTableModelChange {
public static final int DELETE = -1; public static final int DELETE = -1;
/** /**
* Returns the type of event * Returns the type of event.
* * @return the type of event
* @see #INSERT * @see #INSERT
* @see #UPDATE * @see #UPDATE
* @see #DELETE * @see #DELETE
@ -81,21 +81,25 @@ public interface AccessibleTableModelChange {
/** /**
* Returns the first row that changed. * Returns the first row that changed.
* @return the first row that changed
*/ */
public int getFirstRow(); public int getFirstRow();
/** /**
* Returns the last row that changed. * Returns the last row that changed.
* @return the last row that changed
*/ */
public int getLastRow(); public int getLastRow();
/** /**
* Returns the first column that changed. * Returns the first column that changed.
* @return the first column that changed
*/ */
public int getFirstColumn(); public int getFirstColumn();
/** /**
* Returns the last column that changed. * Returns the last column that changed.
* @return the last column that changed
*/ */
public int getLastColumn(); public int getLastColumn();
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2013, 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
@ -49,7 +49,7 @@ package javax.accessibility;
*/ */
public class AccessibleTextSequence { public class AccessibleTextSequence {
/* The start index of the text sequence */ /** The start index of the text sequence */
public int startIndex; public int startIndex;
/** The end index of the text sequence */ /** The end index of the text sequence */

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 1999, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2013, 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
@ -60,6 +60,7 @@ public interface AccessibleValue {
/** /**
* Set the value of this object as a Number. * Set the value of this object as a Number.
* *
* @param n the number to use for the value
* @return True if the value was set; else False * @return True if the value was set; else False
* @see #getCurrentAccessibleValue * @see #getCurrentAccessibleValue
*/ */

View File

@ -260,7 +260,7 @@ public class RelationNotification extends Notification {
super(notifType, sourceObj, sequence, timeStamp, message); super(notifType, sourceObj, sequence, timeStamp, message);
if (!isValidBasic(notifType,sourceObj,id,typeName) || !isValidCreate(notifType)) { if (!isValidBasicStrict(notifType,sourceObj,id,typeName) || !isValidCreate(notifType)) {
throw new IllegalArgumentException("Invalid parameter."); throw new IllegalArgumentException("Invalid parameter.");
} }
@ -310,7 +310,7 @@ public class RelationNotification extends Notification {
super(notifType, sourceObj, sequence, timeStamp, message); super(notifType, sourceObj, sequence, timeStamp, message);
if (!isValidBasic(notifType,sourceObj,id,typeName) || !isValidUpdate(notifType,name,newValue,oldValue)) { if (!isValidBasicStrict(notifType,sourceObj,id,typeName) || !isValidUpdate(notifType,name,newValue,oldValue)) {
throw new IllegalArgumentException("Invalid parameter."); throw new IllegalArgumentException("Invalid parameter.");
} }
@ -457,14 +457,26 @@ public class RelationNotification extends Notification {
// - no role old value (for role update) // - no role old value (for role update)
// - no role new value (for role update) // - no role new value (for role update)
// Despite the fact, that validation in constructor of RelationNotification prohibit
// creation of the class instance with null sourceObj its possible to set it to null later
// by public setSource() method.
// So we should relax validation rules to preserve serialization behavior compatibility.
private boolean isValidBasicStrict(String notifType, Object sourceObj, String id, String typeName){
if (sourceObj == null) {
return false;
}
return isValidBasic(notifType,sourceObj,id,typeName);
}
private boolean isValidBasic(String notifType, Object sourceObj, String id, String typeName){ private boolean isValidBasic(String notifType, Object sourceObj, String id, String typeName){
if (notifType == null || sourceObj == null || if (notifType == null || id == null || typeName == null) {
id == null || typeName == null) {
return false; return false;
} }
if (!(sourceObj instanceof RelationService) && if (sourceObj != null && (
!(sourceObj instanceof ObjectName)) { !(sourceObj instanceof RelationService) &&
!(sourceObj instanceof ObjectName))) {
return false; return false;
} }

View File

@ -149,7 +149,7 @@ public class MetaMessage extends MidiMessage {
* @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</code>
* byte array * byte array
* @throws <code>InvalidMidiDataException</code> if the * @throws InvalidMidiDataException if the
* parameter values do not specify a 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 {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2013, 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
@ -86,13 +86,13 @@ import java.util.List;
* To detect if a MidiDevice represents a hardware MIDI port, the * To detect if a MidiDevice represents a hardware MIDI port, the
* following programming technique can be used: * following programming technique can be used:
* *
* <pre> * <pre>{@code
* MidiDevice device = ...; * MidiDevice device = ...;
* if ( ! (device instanceof Sequencer) && ! (device instanceof Synthesizer)) { * if ( ! (device instanceof Sequencer) && ! (device instanceof Synthesizer)) {
* // we're now sure that device represents a MIDI port * // we're now sure that device represents a MIDI port
* // ... * // ...
* } * }
* </pre> * }</pre>
* *
* <p> * <p>
* A <code>MidiDevice</code> includes a <code>{@link MidiDevice.Info}</code> object * A <code>MidiDevice</code> includes a <code>{@link MidiDevice.Info}</code> object

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2010, 2013, 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
@ -33,7 +33,9 @@ package javax.sound.midi;
* @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
*/ */
public MidiDevice getMidiDevice(); public MidiDevice getMidiDevice();
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2010, 2013, 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
@ -35,7 +35,9 @@ package javax.sound.midi;
*/ */
public interface MidiDeviceTransmitter extends Transmitter { 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
*/ */
public MidiDevice getMidiDevice(); public MidiDevice getMidiDevice();
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2013, 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
@ -50,6 +50,7 @@ import java.util.Map;
* be used in implementations: * be used in implementations:
* *
* <table border=1> * <table border=1>
<caption>MIDI File Format Properties</caption>
* <tr> * <tr>
* <th>Property key</th> * <th>Property key</th>
* <th>Value type</th> * <th>Value type</th>

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1998, 2002, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2013, 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
@ -55,7 +55,7 @@ package javax.sound.midi;
* processing MIDI data that originated outside Java Sound and now * processing MIDI data that originated outside Java Sound and now
* is encoded as signed bytes, the bytes can * is encoded as signed bytes, the bytes can
* can be converted to integers using this conversion: * can be converted to integers using this conversion:
* <center><code>int i = (int)(byte & 0xFF)</code></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 can be expressed directly as an integer, using (for example) decimal or * it can be expressed directly as an integer, using (for example) decimal or
@ -118,6 +118,10 @@ public abstract class MidiMessage implements Cloneable {
* method is called by concrete subclasses, which should * method is called by concrete subclasses, which should
* ensure that the data array specifies a complete, valid MIDI * ensure that the data array specifies a complete, valid MIDI
* message. * message.
*
* @param data the data bytes in the MIDI message
* @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
*/ */
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)) {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2013, 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
@ -80,6 +80,7 @@ import com.sun.media.sound.MidiDeviceTransmitterEnvelope;
* consider them: * consider them:
* *
* <table border=0> * <table border=0>
* <caption>MIDI System Property Keys</caption>
* <tr> * <tr>
* <th>Property Key</th> * <th>Property Key</th>
* <th>Interface</th> * <th>Interface</th>
@ -425,6 +426,8 @@ public class MidiSystem {
* it is used to identify the default sequencer. * it is used to identify the default sequencer.
* For details, refer to the {@link MidiSystem class description}. * For details, refer to the {@link MidiSystem class description}.
* *
* @param connected whether or not the returned {@code Sequencer}
* is connected to the default {@code Synthesizer}
* @return the default sequencer * @return the default sequencer
* @throws MidiUnavailableException if the sequencer is not * @throws MidiUnavailableException if the sequencer is not
* available due to resource restrictions, * available due to resource restrictions,

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1998, 2005, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2013, 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
@ -283,7 +283,7 @@ public class ShortMessage extends MidiMessage {
/** /**
* 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 * @param status the MIDI status byte
* @throws <code>InvalidMidiDataException</code> if <code>status</code> does not * @throws InvalidMidiDataException if <code>status</code> does not
* specify a valid MIDI status byte for a message that requires no data bytes. * 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)
@ -307,7 +307,7 @@ public class ShortMessage extends MidiMessage {
* @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 <code>InvalidMidiDataException</code> if the * @throws InvalidMidiDataException if the
* the status byte, or all data bytes belonging to the message, do * the status byte, or all data bytes belonging to the message, do
* not specify a valid MIDI message. * not specify a valid MIDI message.
* @see #setMessage(int, int, int, int) * @see #setMessage(int, int, int, int)
@ -357,7 +357,7 @@ public class ShortMessage extends MidiMessage {
* @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 <code>InvalidMidiDataException</code> if the * @throws InvalidMidiDataException if the
* status byte or all data bytes belonging to the message, do * status byte or all data bytes belonging to the message, do
* not specify a valid MIDI message * not specify a valid MIDI message
* *
@ -397,6 +397,7 @@ public class ShortMessage extends MidiMessage {
* Obtains the MIDI command associated with this event. This method * Obtains the MIDI command associated with this event. This method
* assumes that the event is a MIDI channel message; if not, the return * assumes that the event is a MIDI channel message; if not, the return
* value will not be meaningful. * value will not be meaningful.
* @return the MIDI command associated with this event
* @see #setMessage(int, int, int, int) * @see #setMessage(int, int, int, int)
*/ */
public int getCommand() { public int getCommand() {
@ -450,7 +451,7 @@ public class ShortMessage extends MidiMessage {
* status byte value. * status 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 <code>InvalidMidiDataException</code> if the * @throws InvalidMidiDataException if the
* <code>status</code> argument does not represent the status byte for any * <code>status</code> argument does not represent the status byte for any
* short message * short message
*/ */

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2006, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2013, 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
@ -170,7 +170,7 @@ public interface Synthesizer extends MidiDevice {
* already had been), <code>false</code> if the instrument could not be * already had been), <code>false</code> if the instrument could not be
* loaded (for example, if the synthesizer has insufficient * loaded (for example, if the synthesizer has insufficient
* memory to load it) * memory to load it)
* @throws <code>IllegalArgumentException</code> if this * @throws IllegalArgumentException if this
* <code>Synthesizer</code> doesn't support the specified instrument's * <code>Synthesizer</code> doesn't support the specified instrument's
* soundbank * soundbank
* @see #unloadInstrument * @see #unloadInstrument
@ -186,7 +186,7 @@ public interface Synthesizer extends MidiDevice {
/** /**
* Unloads a particular instrument. * Unloads a particular instrument.
* @param instrument instrument to unload * @param instrument instrument to unload
* @throws <code>IllegalArgumentException</code> if this * @throws IllegalArgumentException if this
* <code>Synthesizer</code> doesn't support the specified instrument's * <code>Synthesizer</code> doesn't support the specified instrument's
* soundbank * soundbank
* @see #loadInstrument * @see #loadInstrument
@ -214,10 +214,10 @@ public interface Synthesizer extends MidiDevice {
* of the old instrument, it should be loaded into the synthesizer * of the old instrument, it should be loaded into the synthesizer
* @return <code>true</code> if the instrument succeessfully remapped, * @return <code>true</code> if the instrument succeessfully remapped,
* <code>false</code> if feature is not implemented by synthesizer * <code>false</code> if feature is not implemented by synthesizer
* @throws <code>IllegalArgumentException</code> if instrument * @throws IllegalArgumentException if instrument
* <code>from</code> or instrument <code>to</code> aren't supported by * <code>from</code> or instrument <code>to</code> aren't supported by
* synthesizer or if instrument <code>to</code> is not loaded * synthesizer or if instrument <code>to</code> is not loaded
* @throws <code>NullPointerException</code> if <code>from</code> or * @throws NullPointerException if <code>from</code> or
* <code>to</code> parameters have null value * <code>to</code> parameters have null value
* @see #loadInstrument * @see #loadInstrument
* @see #loadInstruments * @see #loadInstruments

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1998, 2002, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2013, 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
@ -204,6 +204,7 @@ public class SysexMessage extends MidiMessage {
* @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
* @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) ) {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2006, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2013, 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
@ -211,10 +211,11 @@ public class Track {
/** /**
* 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 * @param index the location of the desired event in the event vector
* @throws <code>ArrayIndexOutOfBoundsException</code> if the * @throws ArrayIndexOutOfBoundsException if the
* specified index is negative or not less than the current size of * specified index is negative or not less than the current size of
* this track. * this track.
* @see #size * @see #size
* @return the event at the specified index
*/ */
public MidiEvent get(int index) throws ArrayIndexOutOfBoundsException { public MidiEvent get(int index) throws ArrayIndexOutOfBoundsException {
try { try {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2013, 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,7 @@ import java.util.Map;
* be used in implementations: * be used in implementations:
* *
* <table border=1> * <table border=1>
* <caption>Audio File Format Property Keys</caption>
* <tr> * <tr>
* <th>Property key</th> * <th>Property key</th>
* <th>Value type</th> * <th>Value type</th>

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2013, 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
@ -85,6 +85,7 @@ import java.util.Map;
* service providers should use, if applicable: * service providers should use, if applicable:
* *
* <table border=0> * <table border=0>
* <caption>Audio Format Property Keys</caption>
* <tr> * <tr>
* <th>Property key</th> * <th>Property key</th>
* <th>Value type</th> * <th>Value type</th>

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