提交 086e677c 编写于 作者: L lana

Merge

...@@ -103,7 +103,6 @@ NSDictionary *realmConfigsForRealms(SCDynamicStoreRef store, NSArray *realms) { ...@@ -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); ...@@ -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); ...@@ -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); ...@@ -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);
......
/* /*
* 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; ...@@ -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 { ...@@ -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 { ...@@ -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,7 +526,7 @@ public class PolicyFile extends javax.security.auth.Policy { ...@@ -521,7 +526,7 @@ 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;
...@@ -559,20 +564,18 @@ public class PolicyFile extends javax.security.auth.Policy { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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;
......
/* /*
* 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; ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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;
......
...@@ -263,18 +263,21 @@ function wrapJavaObject(thing) { ...@@ -263,18 +263,21 @@ 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;
},
__call__: function(name) {
if (name == 'toString') {
return instance.toString();
} else {
return undefined; return undefined;
} }
} }
} }
}
// return wrapper for Java Class objects // return wrapper for Java Class objects
...@@ -297,7 +300,7 @@ function wrapJavaObject(thing) { ...@@ -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) { ...@@ -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) { ...@@ -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,31 +342,34 @@ function wrapJavaObject(thing) { ...@@ -334,31 +342,34 @@ 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) { ...@@ -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,6 +407,13 @@ function wrapJavaObject(thing) { ...@@ -400,6 +407,13 @@ function wrapJavaObject(thing) {
} else { } else {
return undefined; return undefined;
} }
},
__call__: function(name) {
if (name == 'toString') {
return array.valueString(true);
} else {
return undefined;
}
} }
} }
} }
...@@ -673,34 +687,33 @@ function wrapHeapSnapshot(heap) { ...@@ -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') { } else {
return function() { return undefined;
return computeDescription(true);
} }
},
__call__: function(name) {
if (name == 'toHtml') {
return computeDescription(true);
} else if (name == 'toString') { } else if (name == 'toString') {
return function() {
return computeDescription(false); return computeDescription(false);
}
} else { } else {
return undefined; return undefined;
} }
}, }
}; };
} }
...@@ -1005,22 +1018,8 @@ function toHtml(obj) { ...@@ -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,9 +1046,20 @@ function toHtml(obj) { ...@@ -1047,9 +1046,20 @@ function toHtml(obj) {
} }
} }
} else { } else {
// JavaScript primitive value // a 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; return obj;
} }
}
} }
/* /*
......
...@@ -79,7 +79,7 @@ bound to a JavaScript variable of the identifier name specified in <span class=" ...@@ -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=" ...@@ -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: ...@@ -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: ...@@ -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. ...@@ -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: ...@@ -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: ...@@ -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. ...@@ -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) {
......
/* /*
* 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 { ...@@ -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 { ...@@ -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
......
/* /*
* 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 { ...@@ -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
......
/* /*
* 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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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.
* *
......
/* /*
* 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.*; ...@@ -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
*/ */
......
/* /*
* 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 { ...@@ -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.
......
/* /*
* 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 { ...@@ -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 { ...@@ -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 { ...@@ -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
......
/* /*
* 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 { ...@@ -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 { ...@@ -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) {
......
...@@ -207,6 +207,8 @@ public class IndexedPropertyDescriptor extends PropertyDescriptor { ...@@ -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 { ...@@ -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 {
......
/* /*
* 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; ...@@ -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 { ...@@ -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
......
/* /*
* 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 { ...@@ -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.
......
/* /*
* 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 { ...@@ -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 { ...@@ -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
......
...@@ -243,6 +243,7 @@ public class PropertyDescriptor extends FeatureDescriptor { ...@@ -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 { ...@@ -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 {
......
/* /*
* 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; ...@@ -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; ...@@ -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; ...@@ -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;
} }
/* /*
* 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; ...@@ -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; ...@@ -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 { ...@@ -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 { ...@@ -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
......
/* /*
* 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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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);
......
/* /*
* 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 { ...@@ -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;
......
...@@ -78,6 +78,7 @@ public class BeanContextChildSupport implements BeanContextChild, BeanContextSer ...@@ -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 ...@@ -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 ...@@ -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;
/** /**
......
/* /*
* 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 { ...@@ -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);
......
/* /*
* 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 ...@@ -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 ...@@ -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>
*/ */
......
/* /*
* 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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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;
......
/* /*
* 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; ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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) {
......
...@@ -39,4 +39,7 @@ package java.net; ...@@ -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;
} }
...@@ -25,10 +25,10 @@ ...@@ -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 { ...@@ -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 { ...@@ -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);
} }
} }
......
/* /*
* 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.*; ...@@ -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
......
/* /*
* 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; ...@@ -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
......
...@@ -326,17 +326,13 @@ public final class Security { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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.
......
...@@ -130,14 +130,17 @@ import java.util.StringTokenizer; ...@@ -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; ...@@ -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; ...@@ -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 { ...@@ -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 { ...@@ -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);
......
...@@ -128,6 +128,7 @@ class ArrayPrefixHelpers { ...@@ -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 { ...@@ -692,6 +693,4 @@ class ArrayPrefixHelpers {
} }
} }
} }
} }
...@@ -1143,6 +1143,7 @@ public class Collections { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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);
} }
} }
...@@ -2965,21 +2972,21 @@ public class Collections { ...@@ -2965,21 +2972,21 @@ public class Collections {
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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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() {
......
...@@ -352,6 +352,7 @@ public interface Comparator<T> { ...@@ -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> { ...@@ -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> { ...@@ -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);
} }
/** /**
......
...@@ -87,12 +87,12 @@ class Comparators { ...@@ -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());
} }
} }
} }
...@@ -38,7 +38,7 @@ package java.util; ...@@ -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; ...@@ -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; ...@@ -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; ...@@ -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; ...@@ -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; ...@@ -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; ...@@ -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> { ...@@ -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> { ...@@ -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> { ...@@ -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> { ...@@ -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> { ...@@ -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> { ...@@ -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> { ...@@ -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> { ...@@ -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> { ...@@ -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> { ...@@ -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> { ...@@ -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> { ...@@ -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> { ...@@ -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> { ...@@ -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>)
......
...@@ -25,6 +25,7 @@ ...@@ -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
...@@ -40,19 +41,19 @@ import java.util.function.DoubleConsumer; ...@@ -40,19 +41,19 @@ import java.util.function.DoubleConsumer;
* }</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 { ...@@ -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 { ...@@ -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;
......
...@@ -626,12 +626,11 @@ import sun.misc.FormattedFloatingDecimal; ...@@ -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; ...@@ -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; ...@@ -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.
* *
......
...@@ -876,13 +876,9 @@ public class HashMap<K,V> ...@@ -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;
} }
/** /**
......
...@@ -928,6 +928,7 @@ public class Hashtable<K,V> ...@@ -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> ...@@ -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
......
...@@ -1339,6 +1339,7 @@ public class IdentityHashMap<K,V> ...@@ -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> ...@@ -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);
......
...@@ -25,6 +25,7 @@ ...@@ -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
...@@ -40,19 +41,19 @@ import java.util.function.IntConsumer; ...@@ -40,19 +41,19 @@ import java.util.function.IntConsumer;
* }</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 { ...@@ -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;
......
...@@ -26,6 +26,7 @@ package java.util; ...@@ -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
...@@ -41,19 +42,19 @@ import java.util.function.LongConsumer; ...@@ -41,19 +42,19 @@ import java.util.function.LongConsumer;
* }</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 { ...@@ -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;
......
...@@ -307,7 +307,7 @@ public final class Optional<T> { ...@@ -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);
} }
......
...@@ -41,14 +41,15 @@ package java.util; ...@@ -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; ...@@ -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; ...@@ -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; ...@@ -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> { ...@@ -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> { ...@@ -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> { ...@@ -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> { ...@@ -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();
} }
...@@ -49,16 +49,17 @@ package java.util; ...@@ -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 {
......
...@@ -1164,12 +1164,13 @@ public class Vector<E> ...@@ -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> ...@@ -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);
......
...@@ -1038,6 +1038,7 @@ public class WeakHashMap<K,V> ...@@ -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> ...@@ -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);
......
...@@ -47,7 +47,7 @@ public class XMLFormatter extends Formatter { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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\"");
......
...@@ -75,11 +75,13 @@ abstract class AbstractPipeline<E_IN, E_OUT, S extends BaseStream<E_OUT, S>> ...@@ -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>> ...@@ -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>> ...@@ -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>> ...@@ -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>> ...@@ -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>> ...@@ -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>> ...@@ -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>> ...@@ -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>> ...@@ -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>> ...@@ -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>> ...@@ -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>> ...@@ -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>> ...@@ -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>> ...@@ -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>> ...@@ -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>> ...@@ -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>> ...@@ -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>> ...@@ -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();
......
...@@ -39,6 +39,7 @@ import java.util.concurrent.atomic.AtomicReference; ...@@ -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, ...@@ -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) {
......
...@@ -73,6 +73,9 @@ import java.util.concurrent.ForkJoinPool; ...@@ -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; ...@@ -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> {
......
...@@ -25,40 +25,45 @@ ...@@ -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; ...@@ -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; ...@@ -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; ...@@ -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; ...@@ -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; ...@@ -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}
* 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 * @return a function which folds a new value into a mutable result container
*/ */
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> { ...@@ -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> { ...@@ -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> { ...@@ -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
} }
} }
...@@ -209,7 +209,7 @@ public class DelegatingStream<T> implements Stream<T> { ...@@ -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);
} }
......
...@@ -147,6 +147,7 @@ abstract class DoublePipeline<E_IN> ...@@ -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> ...@@ -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));
} }
......
...@@ -527,7 +527,7 @@ public interface DoubleStream extends BaseStream<Double, DoubleStream> { ...@@ -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
......
...@@ -246,6 +246,7 @@ final class FindOps { ...@@ -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;
......
...@@ -249,6 +249,7 @@ final class ForEachOps { ...@@ -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 { ...@@ -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;
......
...@@ -150,6 +150,7 @@ abstract class IntPipeline<E_IN> ...@@ -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> ...@@ -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> ...@@ -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> ...@@ -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));
} }
......
...@@ -517,7 +517,7 @@ public interface IntStream extends BaseStream<Integer, IntStream> { ...@@ -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>.
......
...@@ -148,6 +148,7 @@ abstract class LongPipeline<E_IN> ...@@ -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> ...@@ -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> ...@@ -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> ...@@ -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));
} }
......
...@@ -517,7 +517,7 @@ public interface LongStream extends BaseStream<Long, LongStream> { ...@@ -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>.
......
...@@ -274,6 +274,7 @@ final class MatchOps { ...@@ -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;
......
...@@ -60,6 +60,7 @@ final class Nodes { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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) {
......
...@@ -43,7 +43,7 @@ import java.util.function.ObjLongConsumer; ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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());
......
...@@ -170,9 +170,10 @@ abstract class ReferencePipeline<P_IN, P_OUT> ...@@ -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> ...@@ -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> ...@@ -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> ...@@ -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> ...@@ -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> ...@@ -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; }
else {
container = evaluate(ReduceOps.makeRef(collector));
} }
return evaluate(ReduceOps.makeRef(collector)); return collector.characteristics().contains(Collector.Characteristics.IDENTITY_FINISH)
? (R) container
: collector.finisher().apply(container);
} }
@Override @Override
......
...@@ -242,6 +242,7 @@ interface Sink<T> extends Consumer<T> { ...@@ -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> { ...@@ -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> { ...@@ -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> { ...@@ -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) {
......
...@@ -550,6 +550,7 @@ final class SliceOps { ...@@ -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;
......
...@@ -209,7 +209,7 @@ final class SortedOps { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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;
} }
......
...@@ -28,6 +28,7 @@ import java.util.ArrayList; ...@@ -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> ...@@ -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> ...@@ -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> ...@@ -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> ...@@ -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;
......
...@@ -651,12 +651,13 @@ public interface Stream<T> extends BaseStream<T, Stream<T>> { ...@@ -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>> { ...@@ -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);
} }
......
...@@ -25,6 +25,7 @@ ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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;
} }
......
...@@ -25,6 +25,7 @@ ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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;
......
...@@ -547,7 +547,7 @@ ...@@ -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 @@ ...@@ -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.
......
/* /*
* 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 { ...@@ -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();
} }
/* /*
* 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 { ...@@ -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() {
} }
......
/* /*
* 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 { ...@@ -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
......
/* /*
* 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 { ...@@ -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) {
......
/* /*
* 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 { ...@@ -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 { ...@@ -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
*/ */
......
/* /*
* 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; ...@@ -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 */
......
...@@ -149,7 +149,7 @@ public class MetaMessage extends MidiMessage { ...@@ -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 {
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册