You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by qi...@apache.org on 2008/08/22 09:15:27 UTC
svn commit: r687988 [3/11] - in /harmony/enhanced/classlib/branches/java6:
./ depends/build/ depends/build/platform/ depends/jars/
depends/jars/icu4jni_3.4/ depends/manifests/bcel-5.2/
depends/manifests/bcel-5.2/META-INF/ make/ modules/accessibility/ m...
Modified: harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapAttribute.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapAttribute.java?rev=687988&r1=687987&r2=687988&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapAttribute.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapAttribute.java Fri Aug 22 00:15:00 2008
@@ -20,7 +20,9 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
+import java.util.Vector;
import javax.naming.NameNotFoundException;
import javax.naming.NamingEnumeration;
@@ -44,29 +46,24 @@
private static final long serialVersionUID = -6492847268062616321L;
- /**
- * whether the value of attribute is binary
- */
- private boolean isBinary;
-
private LdapContextImpl context = null;
private static HashSet<String> BINARY_ATTRIBUTE = new HashSet<String>();
static {
- BINARY_ATTRIBUTE.add("photo");
- BINARY_ATTRIBUTE.add("personalSignature");
- BINARY_ATTRIBUTE.add("audio");
- BINARY_ATTRIBUTE.add("jpegPhoto");
- BINARY_ATTRIBUTE.add("javaSerializedData");
- BINARY_ATTRIBUTE.add("thumbnailPhoto");
- BINARY_ATTRIBUTE.add("thumbnailLogo");
- BINARY_ATTRIBUTE.add("userPassword");
- BINARY_ATTRIBUTE.add("userCertificate");
- BINARY_ATTRIBUTE.add("cACertificate");
- BINARY_ATTRIBUTE.add("authorityRevocationList");
- BINARY_ATTRIBUTE.add("certificateRevocationList");
- BINARY_ATTRIBUTE.add("crossCertificatePair");
- BINARY_ATTRIBUTE.add("x500UniqueIdentifier");
+ BINARY_ATTRIBUTE.add("photo".toLowerCase()); //$NON-NLS-1$
+ BINARY_ATTRIBUTE.add("personalSignature".toLowerCase()); //$NON-NLS-1$
+ BINARY_ATTRIBUTE.add("audio".toLowerCase()); //$NON-NLS-1$
+ BINARY_ATTRIBUTE.add("jpegPhoto".toLowerCase()); //$NON-NLS-1$
+ BINARY_ATTRIBUTE.add("javaSerializedData".toLowerCase()); //$NON-NLS-1$
+ BINARY_ATTRIBUTE.add("thumbnailPhoto".toLowerCase()); //$NON-NLS-1$
+ BINARY_ATTRIBUTE.add("thumbnailLogo".toLowerCase()); //$NON-NLS-1$
+ BINARY_ATTRIBUTE.add("userPassword".toLowerCase()); //$NON-NLS-1$
+ BINARY_ATTRIBUTE.add("userCertificate".toLowerCase()); //$NON-NLS-1$
+ BINARY_ATTRIBUTE.add("cACertificate".toLowerCase()); //$NON-NLS-1$
+ BINARY_ATTRIBUTE.add("authorityRevocationList".toLowerCase()); //$NON-NLS-1$
+ BINARY_ATTRIBUTE.add("certificateRevocationList".toLowerCase()); //$NON-NLS-1$
+ BINARY_ATTRIBUTE.add("crossCertificatePair".toLowerCase()); //$NON-NLS-1$
+ BINARY_ATTRIBUTE.add("x500UniqueIdentifier".toLowerCase()); //$NON-NLS-1$
}
/**
@@ -79,7 +76,6 @@
public LdapAttribute(String id, LdapContextImpl ctx) {
super(id, false);
- isBinary = isBinary(id);
context = ctx;
}
@@ -94,9 +90,9 @@
* may never be <code>null</code>
* @throws NamingException
*/
- public LdapAttribute(Attribute attr, LdapContextImpl ctx) throws NamingException {
+ public LdapAttribute(Attribute attr, LdapContextImpl ctx)
+ throws NamingException {
super(attr.getID(), attr.isOrdered());
- isBinary = isBinary(getID());
NamingEnumeration<?> enu = attr.getAll();
while (enu.hasMore()) {
Object value = enu.next();
@@ -109,19 +105,10 @@
public void decodeValues(Object[] vs) {
byte[] type = (byte[]) vs[0];
attrID = Utils.getString(type);
- isBinary = isBinary(attrID);
Collection<byte[]> list = (Collection<byte[]>) vs[1];
- // FIXME: deal with java.naming.ldap.attributes.binary
- if (!isBinary) {
- for (byte[] bs : list) {
- add(Utils.getString(bs));
- }
- } else {
- for (byte[] bs : list) {
- add(bs);
- }
+ for (byte[] bs : list) {
+ add(bs);
}
-
}
public void encodeValues(Object[] vs) {
@@ -130,7 +117,7 @@
List<Object> list = new ArrayList<Object>(this.values.size());
for (Object object : this.values) {
- if (!isBinary && object instanceof String) {
+ if (object instanceof String) {
String str = (String) object;
object = Utils.getBytes(str);
}
@@ -173,7 +160,35 @@
}
- private static boolean isBinary(String name) {
- return BINARY_ATTRIBUTE.contains(name) || name.endsWith(";binary");
+ public void convertValueToString() {
+ // values can't be null
+ if (values.size() == 0) {
+ return;
+ }
+
+ Vector<Object> newValues = new Vector<Object>(values.size());
+ for (Iterator<Object> iter = values.iterator(); iter.hasNext();) {
+ Object value = iter.next();
+ newValues.add(Utils.getString(value));
+ }
+
+ values.clear();
+ values = newValues;
+ }
+
+ public static boolean isBinary(String name, String[] attrs) {
+ if (BINARY_ATTRIBUTE.contains(name.toLowerCase())
+ || name.endsWith(";binary")) { //$NON-NLS-1$
+ return true;
+ }
+
+ if (attrs != null) {
+ for (int i = 0; i < attrs.length; i++) {
+ if (name.equalsIgnoreCase(attrs[i])) {
+ return true;
+ }
+ }
+ }
+ return false;
}
}
Modified: harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapClient.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapClient.java?rev=687988&r1=687987&r2=687988&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapClient.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapClient.java Fri Aug 22 00:15:00 2008
@@ -77,6 +77,8 @@
*/
private Hashtable<Integer, Element> requests = new Hashtable<Integer, Element>();
+ private Hashtable<Integer, Element> batchedSearchRequests = new Hashtable<Integer, Element>();
+
/**
* the max time to wait server response in milli-second
*/
@@ -182,6 +184,11 @@
// get response operation according messageId
Element element = requests.get(Integer
.valueOf(messageId));
+ if (element == null) {
+ element = batchedSearchRequests.get(Integer
+ .valueOf(messageId));
+ }
+
if (element != null) {
return element.response.getResponseOp();
}
@@ -229,20 +236,41 @@
Element element = requests.get(Integer.valueOf(response
.getMessageId()));
+ if (element == null
+ && batchedSearchRequests.contains(Integer.valueOf(response
+ .getMessageId()))) {
+ element = batchedSearchRequests.get(Integer.valueOf(response
+ .getMessageId()));
+ // error occurs when read response
+ if (ex != null) {
+ ((SearchOp) response.getResponseOp()).getSearchResult()
+ .setException(ex);
+ batchedSearchRequests.remove(Integer.valueOf(response
+ .getMessageId()));
+ return;
+ }
+
+ // wait time out
+ if (element.response.getMessageId() != response.getMessageId()) {
+ // ldap.31=Read LDAP response message time out
+ ((SearchOp) response.getResponseOp()).getSearchResult()
+ .setException(
+ new IOException(Messages
+ .getString("ldap.31"))); //$NON-NLS-1$);
+ batchedSearchRequests.remove(Integer.valueOf(response
+ .getMessageId()));
+ return;
+ }
+ }
if (element != null) {
element.response = response;
element.ex = ex;
- // persistent search response
+ // persistent search response || search response
if (element.lock == null) {
-
notifyPersistenSearchListener(element);
} else {
- /*
- * notify the thread which send request and wait for
- * response
- */
if (element.response.getOperationIndex() == LdapASN1Constant.OP_EXTENDED_RESPONSE
&& ((ExtendedOp) element.response.getResponseOp())
.getExtendedRequest().getID().equals(
@@ -254,6 +282,10 @@
isStopped = true;
}
+ /*
+ * notify the thread which send request and wait for
+ * response
+ */
synchronized (element.lock) {
element.lock.notify();
}
@@ -366,7 +398,7 @@
}
}
}
-
+
element = requests.get(messageID);
// wait time out
@@ -394,7 +426,10 @@
}
private LdapMessage doSearchOperation(ASN1Encodable request,
- ASN1Decodable response, Control[] controls) throws IOException {
+ ASN1Decodable response, Control[] controls)
+ throws IOException {
+ int batchSize = ((SearchOp) request).getBatchSize();
+
LdapMessage requestMsg = new LdapMessage(
LdapASN1Constant.OP_SEARCH_REQUEST, request, controls);
@@ -407,9 +442,15 @@
out.write(requestMsg.encode());
out.flush();
LdapMessage responseMsg = waitResponse(messageID, lock);
-
+ int size = 1;
while (responseMsg.getOperationIndex() != LdapASN1Constant.OP_SEARCH_RESULT_DONE) {
+ if (size == batchSize) {
+ batchedSearchRequests.put(messageID, requests
+ .get(messageID));
+ break;
+ }
responseMsg = waitResponse(messageID, lock);
+ ++size;
}
return responseMsg;
Modified: harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapContextImpl.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapContextImpl.java?rev=687988&r1=687987&r2=687988&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapContextImpl.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapContextImpl.java Fri Aug 22 00:15:00 2008
@@ -143,6 +143,10 @@
private List<UnsolicitedNotificationListener> unls;
+ private String[] binaryAttributes;
+
+ private int batchSize = 0;
+
private static final Control NON_CRITICAL_MANAGE_REF_CONTROL = new ManageReferralControl(
Control.NONCRITICAL);
@@ -154,6 +158,8 @@
private static final String LDAP_TYPES_ONLY = "java.naming.ldap.typesOnly"; //$NON-NLS-1$
+ private static final String LDAP_ATTRIBUTES_BINARY = "java.naming.ldap.attributes.binary"; //$NON-NLS-1$
+
/**
* Some properties, such as 'java.naming.security.authentication', changed
* by <code>Context.addToEnvironment</code> or
@@ -205,6 +211,11 @@
doBindOperation(connCtls);
}
+ public LdapContextImpl(LdapContextImpl context, String dn)
+ throws NamingException {
+ this(context.client, context.env, dn);
+ }
+
private void initial(LdapClient ldapClient,
Hashtable<Object, Object> environment, String dn)
throws InvalidNameException {
@@ -798,7 +809,7 @@
searchControls.setReturningAttributes(new String[] {
"namingContexts", "subschemaSubentry", "altServer", });
search = new SearchOp(name.toString(), searchControls, filter);
-
+ search.setBatchSize(0);
try {
client.doOperation(search, requestControls);
} catch (IOException e) {
@@ -849,7 +860,7 @@
throw ex;
}
search = new SearchOp(subschemasubentry, searchControls, filter);
-
+ search.setBatchSize(0);
try {
client.doOperation(search, requestControls);
} catch (IOException e) {
@@ -883,7 +894,6 @@
Hashtable<String, String> schemaDef = (Hashtable<String, String>) schemaTable
.get(schemaType.toLowerCase());
LdapAttribute attribute = (LdapAttribute) as.get(schemaType);
-
String value;
String attrName;
for (int i = 0; i < attribute.size(); i++) {
@@ -894,8 +904,8 @@
}
}
- ldapSchemaCtx = new LdapSchemaContextImpl(this, env, name,
- schemaTable, LdapSchemaContextImpl.SCHEMA_ROOT_LEVEL);
+ ldapSchemaCtx = new LdapSchemaContextImpl(this, env, name, schemaTable,
+ LdapSchemaContextImpl.SCHEMA_ROOT_LEVEL);
return ldapSchemaCtx;
}
@@ -1079,7 +1089,8 @@
filter.setValue("objectClass");
} else {
// only one attribute type and value pair
- if (attributes.size() == 1 && attributes.getAll().next().size() == 1) {
+ if (attributes.size() == 1
+ && attributes.getAll().next().size() == 1) {
filter = new Filter(Filter.EQUALITY_MATCH_FILTER);
Attribute att = attributes.getAll().next();
filter.setValue(new AttributeTypeAndValuePair(att.getID(), att
@@ -1107,33 +1118,10 @@
controls.setReturningAttributes(as);
LdapSearchResult result = doSearch(targetDN, filter, controls);
- List<SearchResult> list = new ArrayList<SearchResult>();
- Map<String, Attributes> entries = result.getEntries();
- Name tempName = new LdapName(contextDn.toString());
- tempName.addAll(name);
- String baseDN = tempName.toString();
- for (String dn : entries.keySet()) {
- SearchResult sr = null;
- if (dn.startsWith("ldap://")) {
- sr = new SearchResult(dn, null, entries.get(dn), false);
- int index = dn.indexOf("/", 7);
- sr.setNameInNamespace(dn.substring(index + 1, dn.length()));
- list.add(sr);
- } else {
- String relativeName = LdapUtils.convertToRelativeName(dn,
- baseDN);
- sr = new SearchResult(relativeName, null, entries.get(dn));
- sr.setNameInNamespace(dn);
- }
- list.add(sr);
- }
-
- if (list.size() == 0 && result.getException() != null) {
+ if (result.isEmpty() && result.getException() != null) {
throw result.getException();
}
-
- return new LdapNamingEnumeration<SearchResult>(list, result
- .getException());
+ return result.toSearchResultEnumeration(targetDN);
}
public NamingEnumeration<SearchResult> search(Name name, String filter,
@@ -1166,33 +1154,10 @@
LdapSearchResult result = doSearch(targetDN, f, searchControls);
- List<SearchResult> list = new ArrayList<SearchResult>();
- Map<String, Attributes> entries = result.getEntries();
- Name tempName = new LdapName(contextDn.toString());
- tempName.addAll(name);
- String baseDN = tempName.toString();
- for (String dn : entries.keySet()) {
- SearchResult sr = null;
- if (dn.startsWith("ldap://")) {
- sr = new SearchResult(dn, null, entries.get(dn), false);
- int index = dn.indexOf("/", 7);
- sr.setNameInNamespace(dn.substring(index + 1, dn.length()));
- list.add(sr);
- } else {
- String relativeName = LdapUtils.convertToRelativeName(dn,
- baseDN);
- sr = new SearchResult(relativeName, null, entries.get(dn));
- sr.setNameInNamespace(dn);
- }
- list.add(sr);
- }
-
- if (list.size() == 0 && result.getException() != null) {
+ if (result.isEmpty() && result.getException() != null) {
throw result.getException();
}
-
- return new LdapNamingEnumeration<SearchResult>(list, result
- .getException());
+ return result.toSearchResultEnumeration(targetDN);
}
public NamingEnumeration<SearchResult> search(Name name, String filter,
@@ -1225,6 +1190,7 @@
LdapSearchResult doSearch(SearchOp op) throws NamingException {
applyEnvChange();
+ op.setBatchSize(batchSize);
if (env.get(LDAP_DEREF_ALIASES) != null) {
String derefAliases = (String) env.get(LDAP_DEREF_ALIASES);
if (derefAliases.equals("always")) {
@@ -1256,6 +1222,8 @@
}
}
+ op.getSearchResult().setBinaryAttributes(binaryAttributes);
+
LdapMessage message = null;
try {
message = client.doOperation(op, requestControls);
@@ -1279,33 +1247,34 @@
LdapResult result = op.getResult();
- op.getSearchResult().setException(
- LdapUtils.getExceptionFromResult(result));
-
- // has error, not deal with referrals
- if (result.getResultCode() != LdapResult.REFERRAL
- && op.getSearchResult().getException() != null) {
- return op.getSearchResult();
- }
+ if (result != null) {
+ op.getSearchResult().setException(
+ LdapUtils.getExceptionFromResult(result));
+
+ // has error, not deal with referrals
+ if (result.getResultCode() != LdapResult.REFERRAL
+ && op.getSearchResult().getException() != null) {
+ return op.getSearchResult();
+ }
- // baseObject is not located at the server
- if (result.getResultCode() == LdapResult.REFERRAL) {
- ReferralException ex = new ReferralExceptionImpl(contextDn
- .toString(), result.getReferrals(), env);
- try {
- if (isFollowReferral(ex)) {
- LdapContextImpl ctx = (LdapContextImpl) getReferralContext(ex);
- return ctx.doSearch(op);
- } else {
- op.getSearchResult().setException(ex);
+ // baseObject is not located at the server
+ if (result.getResultCode() == LdapResult.REFERRAL) {
+ ReferralException ex = new ReferralExceptionImpl(contextDn
+ .toString(), result.getReferrals(), env);
+ try {
+ if (isFollowReferral(ex)) {
+ LdapContextImpl ctx = (LdapContextImpl) getReferralContext(ex);
+ return ctx.doSearch(op);
+ } else {
+ op.getSearchResult().setException(ex);
+ return op.getSearchResult();
+ }
+ } catch (PartialResultException e) {
+ op.getSearchResult().setException(e);
return op.getSearchResult();
}
- } catch (PartialResultException e) {
- op.getSearchResult().setException(e);
- return op.getSearchResult();
}
}
-
// there are SearchResultReference in search result
if (op.getSearchResult().getRefURLs() != null
&& op.getSearchResult().getRefURLs().size() != 0) {
@@ -1399,6 +1368,13 @@
throw new NullPointerException();
}
+ if (s.equals(Context.BATCHSIZE)) {
+ batchSize = Integer.parseInt((String) o);
+ } else if (s.equals(LDAP_ATTRIBUTES_BINARY)) {
+ String value = (String) o;
+ binaryAttributes = value.trim().split(" ");
+ }
+
Object preValue = env.put(s, o);
// if preValue equals o, do nothing
@@ -1594,34 +1570,11 @@
LdapSearchResult result = doSearch(targetDN, filter, controls);
- List<NameClassPair> list = new ArrayList<NameClassPair>();
- Map<String, Attributes> entries = result.getEntries();
- Name tempName = new LdapName(contextDn.toString());
- tempName.addAll(name);
- String baseDN = tempName.toString();
- for (String dn : entries.keySet()) {
- String relativeName = LdapUtils.convertToRelativeName(dn, baseDN);
- Attributes attrs = entries.get(dn);
- Attribute attrClass = attrs.get("javaClassName");
- String className = null;
- if (attrClass != null) {
- className = (String) attrClass.get(0);
- } else {
- className = DirContext.class.getName();
- }
- NameClassPair pair = new NameClassPair(relativeName, className,
- true);
- pair.setNameInNamespace(dn);
- list.add(pair);
- }
-
- // no entries return
- if (list.size() == 0 && result.getException() != null) {
+ if (result.isEmpty() && result.getException() != null) {
throw result.getException();
}
- return new LdapNamingEnumeration<NameClassPair>(list, result
- .getException());
+ return result.toNameClassPairEnumeration(targetDN);
}
protected String getTargetDN(Name name, Name prefix)
@@ -1739,28 +1692,23 @@
* there is only one ldap ns
*/
- NamingEnumeration<NameClassPair> enu = list(name);
-
- List<Binding> bindings = new ArrayList<Binding>();
+ // NamingEnumeration<NameClassPair> enu = list(name);
+ // absolute dn name to list
+ String targetDN = getTargetDN(name, contextDn);
- while (enu.hasMore()) {
- NameClassPair pair = enu.next();
- Object bound = null;
- if (!pair.getClassName().equals(DirContext.class.getName())) {
- bound = lookup(pair.getName());
- } else {
- bound = new LdapContextImpl(this, env, contextDn.toString());
- }
+ // construct one-level search using filter "(objectclass=*)"
+ SearchControls controls = new SearchControls();
+ controls.setSearchScope(SearchControls.ONELEVEL_SCOPE);
+ Filter filter = new Filter(Filter.PRESENT_FILTER);
+ filter.setValue("objectClass");
- Binding binding = new Binding(pair.getName(), bound.getClass()
- .getName(), bound);
- binding.setNameInNamespace(pair.getNameInNamespace());
- bindings.add(binding);
+ LdapSearchResult result = doSearch(targetDN, filter, controls);
+ if (result.isEmpty() && result.getException() != null) {
+ throw result.getException();
}
- // FIXME: deal with exception
- return new LdapNamingEnumeration<Binding>(bindings, null);
+ return result.toBindingEnumeration(this, name);
}
public NamingEnumeration<Binding> listBindings(String s)
@@ -1951,6 +1899,12 @@
throw new NullPointerException();
}
+ if (s.equals(Context.BATCHSIZE)) {
+ batchSize = 0;
+ } else if (s.equals(LDAP_ATTRIBUTES_BINARY)) {
+ binaryAttributes = null;
+ }
+
Object preValue = env.remove(s);
// if s doesn't exist in env
Modified: harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapNamingEnumeration.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapNamingEnumeration.java?rev=687988&r1=687987&r2=687988&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapNamingEnumeration.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapNamingEnumeration.java Fri Aug 22 00:15:00 2008
@@ -17,66 +17,111 @@
package org.apache.harmony.jndi.provider.ldap;
-import java.util.ArrayList;
import java.util.Collection;
+import java.util.LinkedList;
import java.util.NoSuchElementException;
+import javax.naming.CommunicationException;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
+import org.apache.harmony.jndi.internal.nls.Messages;
+
/**
* TODO: dynamic load elements from server
*/
public class LdapNamingEnumeration<T> implements NamingEnumeration<T> {
- private ArrayList<T> values;
-
- private int currentIndex;
+ private LinkedList<T> values;
private NamingException exception;
/**
+ * flag to indicate whether all element have been added
+ */
+ private boolean isFinished;
+
+ /**
+ * max time to wait next element in millisconds
+ */
+ private long timeout = DEFAULT_TIMEOUT;
+
+ private static final long DEFAULT_TIMEOUT = 30000;
+
+ /**
+ * This constructor equals to
+ * <code>LdapNamingEnumeration(Collection<T>, NamingException, true)</code>
+ */
+ public LdapNamingEnumeration(Collection<T> list, NamingException ex) {
+ this(list, ex, true);
+ }
+
+ /**
* <code>list</code> and <code>ex</code> both can be <code>null</code>,
* <code>null</code> of <code>list</code> will be treated as empty List.
*
* @param list
- * All elements to be enumerate
+ * elements added to the enumeration.
* @param ex
- * exception would be thrown when over iterate
+ * exception would be thrown when over iterate.
+ * @param isFinished
+ * if all elements have been added.
*/
- public LdapNamingEnumeration(Collection<T> list, NamingException ex) {
+ public LdapNamingEnumeration(Collection<T> list, NamingException ex,
+ boolean isFinished) {
if (list == null) {
- values = new ArrayList<T>();
+ values = new LinkedList<T>();
} else {
- values = new ArrayList<T>(list);
+ values = new LinkedList<T>(list);
}
exception = ex;
- currentIndex = 0;
+ this.isFinished = isFinished;
}
/**
* release all relative resources, current implementation just set
- * enumeration values to <code>null</code>.
+ * enumeration values to <code>null</code> which indicate the enumeration
+ * is closed.
*/
- public void close() throws NamingException {
+ public void close() {
// no other resources need to release
- values = null;
+ synchronized (values) {
+ values.clear();
+ values = null;
+ }
}
public boolean hasMore() throws NamingException {
+ // has been closed
if (values == null) {
return false;
}
- if (currentIndex < values.size()) {
+ if (!values.isEmpty()) {
return true;
}
- // no elemnts to iterate, release resource first
+
+ synchronized (values) {
+ if (values.isEmpty() && !isFinished) {
+ waitMoreElement();
+ if (!values.isEmpty()) {
+ return true;
+ }
+ }
+ }
+
close();
+
if (exception != null) {
throw exception;
}
+
+ if (!isFinished) {
+ // ldap.31=Read LDAP response message time out
+ throw new CommunicationException(Messages.getString("ldap.31")); //$NON-NLS-1$
+ }
+
return false;
}
@@ -86,11 +131,27 @@
* invoked.
*/
public T next() throws NamingException {
- if (values == null || currentIndex >= values.size()) {
+ if (values == null || (values.isEmpty() && isFinished)) {
throw new NoSuchElementException();
}
- return values.get(currentIndex++);
+ synchronized (values) {
+ if (values.isEmpty() && !isFinished) {
+ waitMoreElement();
+ // wait timeout
+ if (values.isEmpty() && !isFinished) {
+ if (exception != null) {
+ throw exception;
+ }
+ // ldap.31=Read LDAP response message time out
+ throw new CommunicationException(Messages
+ .getString("ldap.31")); //$NON-NLS-1$
+ } else if (values.isEmpty()) {
+ throw new NoSuchElementException();
+ }
+ }
+ return values.poll();
+ }
}
public boolean hasMoreElements() {
@@ -98,26 +159,86 @@
return false;
}
- if (currentIndex < values.size()) {
+ if (!values.isEmpty()) {
return true;
}
+
+ synchronized (values) {
+ if (values.isEmpty() && !isFinished) {
+ waitMoreElement();
+ if (!values.isEmpty()) {
+ return true;
+ }
+ }
+ }
+
return false;
}
public T nextElement() {
- if (values == null || currentIndex >= values.size()) {
+ if (values == null || (values.isEmpty() && isFinished)) {
throw new NoSuchElementException();
}
- return values.get(currentIndex++);
+ synchronized (values) {
+ if (values.isEmpty() && !isFinished) {
+ waitMoreElement();
+ if (values.isEmpty()) {
+ throw new NoSuchElementException();
+ }
+ }
+ return values.poll();
+ }
+ }
+
+ private void waitMoreElement() {
+ try {
+ values.wait(timeout);
+ } catch (InterruptedException e) {
+ // ignore
+ }
}
- protected void setException(NamingException exception) {
+ void setException(NamingException exception) {
this.exception = exception;
}
-
- void add(T pair) {
- values.add(pair);
+
+ void add(T pair, boolean isFinished) {
+ if (values == null) {
+ return;
+ }
+
+ synchronized (values) {
+ values.add(pair);
+ if (isFinished) {
+ this.isFinished = true;
+ }
+ values.notifyAll();
+ }
}
+ void add(Collection<T> list, boolean isFinished) {
+ if (values == null) {
+ return;
+ }
+
+ synchronized (values) {
+ values.addAll(list);
+ if (isFinished) {
+ this.isFinished = true;
+ }
+ values.notifyAll();
+ }
+ }
+
+ boolean isFinished() {
+ return isFinished;
+ }
+
+ void setFinished() {
+ synchronized (values) {
+ isFinished = true;
+ values.notifyAll();
+ }
+ }
}
Modified: harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapSchemaContextImpl.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapSchemaContextImpl.java?rev=687988&r1=687987&r2=687988&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapSchemaContextImpl.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapSchemaContextImpl.java Fri Aug 22 00:15:00 2008
@@ -16,11 +16,13 @@
*/
package org.apache.harmony.jndi.provider.ldap;
+import java.util.ArrayList;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
+import java.util.Map.Entry;
import javax.naming.Binding;
import javax.naming.CompositeName;
@@ -257,7 +259,7 @@
// jndi.2E=The name is null
throw new NullPointerException(Messages.getString("jndi.2E")); //$NON-NLS-1$
}
-
+
if (attributes == null) {
// jndi.13=Non-null attribute is required for modification
throw new NullPointerException(Messages.getString("jndi.13")); //$NON-NLS-1$
@@ -283,7 +285,8 @@
modifyAttributes(name, items);
}
- // Mapping from DirContext's attribute operation code to server's operation code.
+ // Mapping from DirContext's attribute operation code to server's operation
+ // code.
private static final int OperationJndi2Ldap[] = { -1, 0, 2, 1, };
@Override
@@ -291,6 +294,12 @@
throws NamingException {
// First get the old schema.
int size = name.size();
+
+ if (size < 1) {
+ // ldap.38=Can't modify schema root
+ throw new SchemaViolationException(Messages.getString("ldap.38")); //$NON-NLS-1$
+ }
+
Hashtable<String, Object> subSchemaTree = doLookup(name
.getPrefix(size - 1), size - 1);
@@ -366,17 +375,41 @@
ModifyOp op = new ModifyOp(ldapContext.subschemasubentry);
Name modifySchemaName = name.getPrefix(size - 1).addAll(rdn);
BasicAttribute schemaEntry = new LdapAttribute(new BasicAttribute(
- jndi2ldap(modifySchemaName.toString()), schemaLine), ldapContext);
+ jndi2ldap(modifySchemaName.toString()), schemaLine),
+ ldapContext);
op.addModification(OperationJndi2Ldap[DirContext.REMOVE_ATTRIBUTE],
new LdapAttribute(schemaEntry, ldapContext));
BasicAttribute addSchemaEntry = new LdapAttribute(new BasicAttribute(
- jndi2ldap(modifySchemaName.toString()), newSchemaLine), ldapContext);
+ jndi2ldap(modifySchemaName.toString()), newSchemaLine),
+ ldapContext);
op.addModification(OperationJndi2Ldap[DirContext.ADD_ATTRIBUTE],
new LdapAttribute(addSchemaEntry, ldapContext));
doBasicOperation(op);
- subSchemaTree.remove(subSchemaType);
- subSchemaTree.put(subSchemaType, newSchemaLine);
+
+ // Modify the hashtable to reflect the modification.
+ Object subSchema = subSchemaTree.get(subSchemaType);
+ if (subSchema instanceof String) {
+ subSchemaTree.remove(subSchemaType);
+ subSchemaTree.put(subSchemaType, newSchemaLine);
+ } else {
+ /*
+ * Here we can only change the content of subSchemaTable, instead of
+ * change the reference. Because in other ldapSchemaContext, there
+ * may be reference to this table. And they should also reflect the
+ * changes.
+ */
+ Hashtable<String, Object> subSchemaTable = (Hashtable<String, Object>) subSchema;
+ subSchemaTable.clear();
+ Hashtable<String, Object> parsedTable = SchemaParser
+ .parseValue(newSchemaLine);
+ Iterator<Entry<String, Object>> it = parsedTable.entrySet()
+ .iterator();
+ while (it.hasNext()) {
+ Entry<String, Object> entry = it.next();
+ subSchemaTable.put(entry.getKey(), entry.getValue());
+ }
+ }
}
@Override
@@ -458,21 +491,19 @@
Hashtable<String, Object> tempSchema = doLookup(name, size);
- LdapNamingEnumeration<NameClassPair> enumeration = new LdapNamingEnumeration<NameClassPair>(
- null, null);
-
if (size == level - 1) {
- return enumeration;
+ return new LdapNamingEnumeration<NameClassPair>(null, null);
}
Iterator<String> keys = tempSchema.keySet().iterator();
+ List<NameClassPair> list = new ArrayList<NameClassPair>();
while (keys.hasNext()) {
- enumeration.add(new NameClassPair(ldap2jndi(keys.next()), this
- .getClass().getName()));
+ list.add(new NameClassPair(ldap2jndi(keys.next()), this.getClass()
+ .getName()));
}
- return enumeration;
+ return new LdapNamingEnumeration<NameClassPair>(list, null);
}
@Override
@@ -495,21 +526,19 @@
Hashtable<String, Object> tempSchema = doLookup(name, size);
- LdapNamingEnumeration<Binding> enumeration = new LdapNamingEnumeration<Binding>(
- null, null);
-
if (size == level - 1) {
- return enumeration;
+ return new LdapNamingEnumeration<Binding>(null, null);
}
Iterator<String> keys = tempSchema.keySet().iterator();
+ List<Binding> list = new ArrayList<Binding>();
while (keys.hasNext()) {
- enumeration.add(new Binding(ldap2jndi(keys.next()), this.getClass()
+ list.add(new Binding(ldap2jndi(keys.next()), this.getClass()
.getName()));
}
- return enumeration;
+ return new LdapNamingEnumeration<Binding>(list, null);
}
@Override
@@ -579,14 +608,26 @@
@Override
public void rename(Name nOld, Name nNew) throws NamingException {
+ if (nOld == null || nNew == null) {
+ throw new NullPointerException();
+ }
+
+ if (nOld.size() == 0 || nNew.size() == 0) {
+ // ldap.3A=Can't rename empty name
+ throw new InvalidNameException(Messages.getString("ldap.3A")); //$NON-NLS-1$
+ }
+
+ if (nOld.size() > 1 || nNew.size() > 1) {
+ // ldap.3B=Can't rename across contexts
+ throw new InvalidNameException(Messages.getString("ldap.3B")); //$NON-NLS-1$
+ }
// ldap.39=Can't rename schema
throw new SchemaViolationException(Messages.getString("ldap.39")); //$NON-NLS-1$
}
@Override
public void rename(String sOld, String sNew) throws NamingException {
- // ldap.39=Can't rename schema
- throw new SchemaViolationException(Messages.getString("ldap.39")); //$NON-NLS-1$
+ rename(new CompositeName(sOld), new CompositeName(sNew));
}
@Override
@@ -603,8 +644,6 @@
Hashtable<String, Object> subschemaTable = doLookup(name, size);
- LdapNamingEnumeration<SearchResult> enumeration = new LdapNamingEnumeration<SearchResult>(
- null, null);
SearchResult searchResult;
Attributes schemaAttributes;
String schemaName;
@@ -612,6 +651,7 @@
if (level - size > 1) {
keyset = subschemaTable.keySet();
+ List<SearchResult> list = new ArrayList<SearchResult>();
for (Iterator<String> i = keyset.iterator(); i.hasNext();) {
schemaName = ldap2jndi(i.next());
Name tempName = (Name) name.clone();
@@ -622,11 +662,12 @@
attributesToReturn);
searchResult = new SearchResult(ldap2jndi(schemaName), this
.getClass().getName(), null, schemaAttributes);
- enumeration.add(searchResult);
+ list.add(searchResult);
}
}
+ return new LdapNamingEnumeration<SearchResult>(list, null);
}
- return enumeration;
+ return new LdapNamingEnumeration<SearchResult>(null, null);
}
@Override
@@ -690,15 +731,13 @@
}
}
- LdapNamingEnumeration<SearchResult> enumeration = new LdapNamingEnumeration<SearchResult>(
- null, null);
-
iterator = searchResults.iterator();
+ List<SearchResult> list = new ArrayList<SearchResult>();
while (iterator.hasNext()) {
- enumeration.add(iterator.next());
+ list.add(iterator.next());
}
- return enumeration;
+ return new LdapNamingEnumeration<SearchResult>(list, null);
}
@Override
@@ -720,7 +759,7 @@
public NamingEnumeration<SearchResult> search(String name, String filter, SearchControls searchControls) throws NamingException {
return search(new CompositeName(name), filter, searchControls);
}
-
+
protected DirContext getClassDefinition(Attribute objectclassAttr)
throws NamingException {
Hashtable<String, Object> definitionTable = new Hashtable<String, Object>();
Modified: harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapSearchResult.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapSearchResult.java?rev=687988&r1=687987&r2=687988&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapSearchResult.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapSearchResult.java Fri Aug 22 00:15:00 2008
@@ -23,9 +23,17 @@
import java.util.List;
import java.util.Map;
+import javax.naming.Binding;
+import javax.naming.Name;
+import javax.naming.NameClassPair;
+import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
+import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttributes;
+import javax.naming.directory.DirContext;
+import javax.naming.directory.SearchResult;
+import javax.naming.ldap.LdapName;
import org.apache.harmony.jndi.provider.ldap.asn1.LdapASN1Constant;
import org.apache.harmony.jndi.provider.ldap.asn1.Utils;
@@ -34,14 +42,14 @@
public class LdapSearchResult {
/**
- * all search result entries
+ * All search result entries
*/
- private Map<String, Attributes> entries = new HashMap<String, Attributes>();
+ protected HashMap<String, Attributes> entries = new HashMap<String, Attributes>();
/**
* SearchResultReference from server
*/
- private List<String> refURLs;
+ protected List<String> refURLs;
private LdapResult result;
@@ -49,13 +57,62 @@
private String address;
+ private String[] binaryAttributes;
+
+ /**
+ * batch size for this search operation
+ */
+ private int batchSize;
+
+ /**
+ * NamingEnumeration for this LdapSearchResult. One LdapSearchResult
+ * instance can only has one corresponding NamingEnumeration instance.
+ */
+ private LdapNamingEnumeration<Object> enumeration;
+
+ /**
+ * Currently there are three different typs of LdapNamingEnumeration:
+ *
+ * <code>
+ * 1 NameClassPair
+ * 2 Binding
+ * 3 SearchResult
+ * </code>
+ */
+ private int enumerationType;
+
+ private String baseDN;
+
+ private LdapContextImpl context;
+
+ private Name name;
+
+ /**
+ * whether received all search result from server
+ */
+ private boolean isFinished;
+
+ private static int ENUMERATION_NAME_CLASS_PAIR = 1;
+
+ private static int ENUMERATION_BINDING = 2;
+
+ private static int ENUMERATION_SEARCH_RESULT = 3;
+
+ public int getBatchSize() {
+ return batchSize;
+ }
+
+ public void setBatchSize(int batchSize) {
+ this.batchSize = batchSize;
+ }
+
public String getAddress() {
- return address;
- }
+ return address;
+ }
- public void setAddress(String address) {
- this.address = address;
- }
+ public void setAddress(String address) {
+ this.address = address;
+ }
public void decodeSearchResponse(Object[] values) {
ChosenValue chosen = (ChosenValue) values[0];
@@ -75,6 +132,8 @@
protected void decodeDone(Object value) {
result = new LdapResult();
result.decodeValues((Object[]) value);
+ isFinished = true;
+ addToEnumeration();
}
protected void decodeRef(Object value) {
@@ -90,27 +149,32 @@
protected void decodeEntry(Object value) {
Object[] values = (Object[]) value;
- String name = Utils.getString((byte[]) values[0]);
+ String name = Utils.getString(values[0]);
if (address != null) {
- name = address + name;
+ name = address + name;
}
Attributes attrs = null;
-
- if (entries.containsKey(name)) {
- attrs = entries.get(name);
- } else {
- attrs = new BasicAttributes(true);
- entries.put(name, attrs);
+ synchronized (entries) {
+ if (entries.containsKey(name)) {
+ attrs = entries.get(name);
+ } else {
+ attrs = new BasicAttributes(true);
+ entries.put(name, attrs);
+ }
}
Collection<Object[]> list = (Collection<Object[]>) values[1];
for (Object[] objects : list) {
LdapAttribute attr = new LdapAttribute();
attr.decodeValues(objects);
+ if (!LdapAttribute.isBinary(attr.getID(), binaryAttributes)) {
+ attr.convertValueToString();
+ }
attrs.put(attr);
}
+ addToEnumeration();
}
public Map<String, Attributes> getEntries() {
@@ -129,15 +193,140 @@
return ex;
}
- public void setException(NamingException ex) {
- this.ex = ex;
+ public void setException(Exception ex) {
+ if (ex == null) {
+ this.ex = null;
+ return;
+ }
+ if (!(ex instanceof NamingException)) {
+ this.ex = new NamingException(ex.getMessage());
+ this.ex.initCause(ex);
+ } else {
+ this.ex = (NamingException) ex;
+ }
}
public boolean isEmpty() {
- return entries.size() == 0 && refURLs.size() == 0;
+ return entries.size() == 0 && (refURLs == null || refURLs.size() == 0);
}
public void setRefURLs(List<String> refURLs) {
this.refURLs = refURLs;
}
+
+ public String[] getBinaryAttributes() {
+ return binaryAttributes;
+ }
+
+ public void setBinaryAttributes(String[] binaryAttributes) {
+ this.binaryAttributes = binaryAttributes;
+ }
+
+ public NamingEnumeration<NameClassPair> toNameClassPairEnumeration(
+ String baseDN) {
+ enumerationType = ENUMERATION_NAME_CLASS_PAIR;
+ enumeration = new LdapNamingEnumeration<Object>(null, null);
+ this.baseDN = baseDN;
+ addToEnumeration();
+ return (NamingEnumeration) enumeration;
+ }
+
+ public NamingEnumeration<Binding> toBindingEnumeration(
+ LdapContextImpl context, Name name) throws NamingException {
+ enumerationType = ENUMERATION_BINDING;
+ enumeration = new LdapNamingEnumeration<Object>(null, null);
+ this.context = context;
+ this.name = name;
+
+ Name tempName = new LdapName(context.getNameInNamespace());
+ tempName.addAll(name);
+ baseDN = tempName.toString();
+
+ addToEnumeration();
+
+ return (NamingEnumeration) enumeration;
+ }
+
+ public NamingEnumeration<SearchResult> toSearchResultEnumeration(
+ String baseDN) {
+ enumerationType = ENUMERATION_SEARCH_RESULT;
+ enumeration = new LdapNamingEnumeration<Object>(null, null);
+ this.baseDN = baseDN;
+
+ addToEnumeration();
+
+ return (NamingEnumeration) enumeration;
+ }
+
+ private void addToEnumeration() {
+ if (enumeration == null || entries == null || entries.isEmpty()) {
+ return;
+ }
+
+ List<Object> list = new ArrayList<Object>();
+ HashMap<String, Attributes> tempEntries = null;
+
+ synchronized (entries) {
+ tempEntries = (HashMap<String, Attributes>) entries.clone();
+ entries.clear();
+ }
+
+ try {
+ for (String dn : tempEntries.keySet()) {
+ String relativeName = LdapUtils.convertToRelativeName(dn,
+ baseDN);
+ Attributes attrs = tempEntries.get(dn);
+ Attribute attrClass = attrs.get("javaClassName"); //$NON-NLS-1$
+ String className = null;
+ switch (enumerationType) {
+ case 1:
+ if (attrClass != null) {
+ className = (String) attrClass.get(0);
+ } else {
+ className = DirContext.class.getName();
+ }
+ NameClassPair pair = new NameClassPair(relativeName,
+ className, true);
+ pair.setNameInNamespace(dn);
+ list.add(pair);
+ break;
+ case 2:
+ Object bound = null;
+
+ if (attrClass != null) {
+ className = (String) attrClass.get(0);
+ bound = context.lookup(name);
+ } else {
+ className = DirContext.class.getName();
+ bound = new LdapContextImpl(context, baseDN);
+ }
+
+ Binding binding = new Binding(relativeName, className,
+ bound);
+ binding.setNameInNamespace(dn);
+ list.add(binding);
+ break;
+ case 3:
+ SearchResult sr = null;
+ if (dn.startsWith("ldap://")) {
+ sr = new SearchResult(dn, null, attrs, false);
+ int index = dn.indexOf("/", 7);
+ sr.setNameInNamespace(dn.substring(index + 1, dn
+ .length()));
+ } else {
+ sr = new SearchResult(relativeName, null, attrs);
+ sr.setNameInNamespace(dn);
+ }
+ list.add(sr);
+ break;
+ }
+ }
+ } catch (NamingException e) {
+ ex = e;
+ isFinished = true;
+ }
+
+ enumeration.setException(ex);
+ enumeration.add(list, isFinished);
+ }
}
Modified: harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/SearchOp.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/SearchOp.java?rev=687988&r1=687987&r2=687988&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/SearchOp.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/SearchOp.java Fri Aug 22 00:15:00 2008
@@ -43,7 +43,12 @@
private LdapSearchResult result;
+ private int batchSize = 0;
+
public LdapSearchResult getSearchResult() {
+ if (result == null) {
+ result = new LdapSearchResult();
+ }
return result;
}
@@ -146,4 +151,12 @@
this.filter = filter;
}
+ public int getBatchSize() {
+ return batchSize;
+ }
+
+ public void setBatchSize(int batchSize) {
+ this.batchSize = batchSize;
+ }
+
}
Modified: harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/ldapURLContext.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/ldapURLContext.java?rev=687988&r1=687987&r2=687988&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/ldapURLContext.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/ldapURLContext.java Fri Aug 22 00:15:00 2008
@@ -548,22 +548,11 @@
LdapSearchResult result = context.doSearch(dn, filter, controls);
- List<SearchResult> list = new ArrayList<SearchResult>();
- Map<String, Attributes> entries = result.getEntries();
- for (String name : entries.keySet()) {
- String relativeName = convertToRelativeName(dn, name);
- SearchResult sr = new SearchResult(relativeName, null, entries
- .get(name));
- sr.setNameInNamespace(name);
- list.add(sr);
- }
-
- if (list.size() == 0 && result.getException() != null) {
+ if (result.isEmpty() && result.getException() != null) {
throw result.getException();
}
-
- return new LdapNamingEnumeration<SearchResult>(list, result
- .getException());
+
+ return result.toSearchResultEnumeration(dn);
} finally {
if (context != null) {
context.close();
@@ -609,22 +598,11 @@
LdapSearchResult result = context.doSearch(dn, f,
searchControls);
- List<SearchResult> list = new ArrayList<SearchResult>();
- Map<String, Attributes> entries = result.getEntries();
- for (String name : entries.keySet()) {
- String relativeName = convertToRelativeName(dn, name);
- SearchResult sr = new SearchResult(relativeName, null, entries
- .get(name));
- sr.setNameInNamespace(name);
- list.add(sr);
- }
-
- if (list.size() == 0 && result.getException() != null) {
+ if (result.isEmpty() && result.getException() != null) {
throw result.getException();
}
-
- return new LdapNamingEnumeration<SearchResult>(list, result
- .getException());
+
+ return result.toSearchResultEnumeration(dn);
} finally {
if (context != null) {
context.close();
Modified: harmony/enhanced/classlib/branches/java6/modules/jndi/src/test/java/org/apache/harmony/jndi/provider/ldap/LdapAttributeTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/jndi/src/test/java/org/apache/harmony/jndi/provider/ldap/LdapAttributeTest.java?rev=687988&r1=687987&r2=687988&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/jndi/src/test/java/org/apache/harmony/jndi/provider/ldap/LdapAttributeTest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/jndi/src/test/java/org/apache/harmony/jndi/provider/ldap/LdapAttributeTest.java Fri Aug 22 00:15:00 2008
@@ -81,10 +81,19 @@
id = "cn";
values = new Object[] { Utils.getBytes(id), valueList };
la = new LdapAttribute();
- // 'cn' is not binary attribute, should return string value
+ /*
+ * 'cn' is not binary attribute, but LdapAttribute.decodeValues()
+ * doesn't convert values to string, must call convertValueToString() to
+ * do it.
+ */
la.decodeValues(values);
for (int i = 0; i < la.size(); ++i) {
+ assertTrue(la.get() instanceof byte[]);
+ }
+
+ la.convertValueToString();
+ for (int i = 0; i < la.size(); ++i) {
assertTrue(la.get() instanceof String);
}
@@ -98,4 +107,41 @@
assertTrue(la.get() instanceof byte[]);
}
}
+
+ public void test_isBinary() {
+ assertTrue(LdapAttribute.isBinary("photo", null));
+ assertTrue(LdapAttribute.isBinary("Photo", null));
+ assertTrue(LdapAttribute.isBinary("photo", new String[0]));
+ assertTrue(LdapAttribute.isBinary("cn;binary", null));
+ assertTrue(LdapAttribute.isBinary("cn;binary", new String[0]));
+
+ assertFalse(LdapAttribute.isBinary("cn", null));
+ assertFalse(LdapAttribute.isBinary("cn",
+ new String[] { "ou", "person" }));
+ assertTrue(LdapAttribute.isBinary("cn", new String[] { "ou", "person",
+ "cn" }));
+ assertTrue(LdapAttribute.isBinary("cn", new String[] { "ou", "person",
+ "Cn" }));
+ }
+
+ public void test_convertValueToString() throws Exception {
+ LdapAttribute attr = new LdapAttribute();
+
+ // do nothing
+ attr.convertValueToString();
+
+ BasicAttribute basicAttribute = new BasicAttribute("cn");
+ attr = new LdapAttribute(basicAttribute, null);
+
+ // do nothing
+ attr.convertValueToString();
+ attr.add(Utils.getBytes("test"));
+ attr.add(Utils.getBytes("binary"));
+
+ attr.convertValueToString();
+
+ assertEquals(2, attr.size());
+ assertEquals("test", attr.get(0));
+ assertEquals("binary", attr.get(1));
+ }
}
Modified: harmony/enhanced/classlib/branches/java6/modules/jndi/src/test/java/org/apache/harmony/jndi/provider/ldap/LdapContextServerMockedTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/jndi/src/test/java/org/apache/harmony/jndi/provider/ldap/LdapContextServerMockedTest.java?rev=687988&r1=687987&r2=687988&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/jndi/src/test/java/org/apache/harmony/jndi/provider/ldap/LdapContextServerMockedTest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/jndi/src/test/java/org/apache/harmony/jndi/provider/ldap/LdapContextServerMockedTest.java Fri Aug 22 00:15:00 2008
@@ -363,7 +363,7 @@
new EncodableLdapResult(), null) });
context.search("cn=test", null);
-
+
}
public void testReferralFollow() throws Exception {
@@ -446,6 +446,80 @@
}
+ public void testAddToEnvironment_binaryAttributeProp() throws Exception {
+ server.setResponseSeq(new LdapMessage[] { new LdapMessage(
+ LdapASN1Constant.OP_BIND_RESPONSE, new BindResponse(), null) });
+
+ assertNull(env.get(Context.REFERRAL));
+
+ InitialDirContext initialDirContext = new InitialDirContext(env);
+
+ initialDirContext.addToEnvironment(
+ "java.naming.ldap.attributes.binary", "cn");
+ assertEquals("cn", initialDirContext.getEnvironment().get(
+ "java.naming.ldap.attributes.binary"));
+
+ initialDirContext.addToEnvironment(
+ "java.naming.ldap.attributes.binary", "cn ou");
+ assertEquals("cn ou", initialDirContext.getEnvironment().get(
+ "java.naming.ldap.attributes.binary"));
+
+ initialDirContext.addToEnvironment(
+ "java.naming.ldap.attributes.binary", " cn ");
+ assertEquals(" cn ", initialDirContext.getEnvironment().get(
+ "java.naming.ldap.attributes.binary"));
+
+ initialDirContext.addToEnvironment(
+ "java.naming.ldap.attributes.binary", " cn ou ");
+ assertEquals(" cn ou ", initialDirContext.getEnvironment().get(
+ "java.naming.ldap.attributes.binary"));
+
+ try {
+ initialDirContext.addToEnvironment(
+ "java.naming.ldap.attributes.binary", new Object());
+ fail("Should throw ClassCastException");
+ } catch (ClassCastException e) {
+ // expected
+ }
+ }
+
+ public void testAddToEnvironment_batchSizeProp() throws Exception {
+ server.setResponseSeq(new LdapMessage[] { new LdapMessage(
+ LdapASN1Constant.OP_BIND_RESPONSE, new BindResponse(), null) });
+
+ assertNull(env.get(Context.REFERRAL));
+ InitialDirContext initialDirContext = new InitialDirContext(env);
+
+ initialDirContext.addToEnvironment(Context.BATCHSIZE, "4");
+ assertEquals("4", initialDirContext.getEnvironment().get(
+ Context.BATCHSIZE));
+
+ try {
+ initialDirContext.addToEnvironment(Context.BATCHSIZE, "wrong");
+ fail("Should throw NumberFormatException");
+ } catch (NumberFormatException e) {
+ // expected
+ }
+ assertEquals("4", initialDirContext.getEnvironment().get(
+ Context.BATCHSIZE));
+
+ try {
+ initialDirContext.addToEnvironment(Context.BATCHSIZE, "3.3");
+ fail("Should throw NumberFormatException");
+ } catch (NumberFormatException e) {
+ // expected
+ }
+ assertEquals("4", initialDirContext.getEnvironment().get(
+ Context.BATCHSIZE));
+
+ try {
+ initialDirContext.addToEnvironment(Context.BATCHSIZE, new Object());
+ fail("Should throw ClassCastException");
+ } catch (ClassCastException e) {
+ // expected
+ }
+ }
+
public void testReconnect() throws Exception {
Control[] expected = new Control[] { new PagedResultsControl(10,
Control.NONCRITICAL) };
@@ -527,6 +601,12 @@
another.reconnect(null);
}
+ /*
+ * This test would block on RI, that because of difference of inner
+ * implementation between RI and Harmony, It's hard to emulate using
+ * MockServer. If run in real environment, the test will pass both on RI and
+ * Harmony.
+ */
public void testFederation() throws Exception {
server.setResponseSeq(new LdapMessage[] { new LdapMessage(
LdapASN1Constant.OP_BIND_RESPONSE, new BindResponse(), null) });
@@ -559,8 +639,8 @@
assertEquals(1, e.getResolvedName().size());
assertEquals("/", e.getResolvedName().toString());
assertTrue(e.getAltNameCtx() instanceof LdapContext);
- assertEquals(context.getNameInNamespace(), e
- .getAltNameCtx().getNameInNamespace());
+ assertEquals(context.getNameInNamespace(), e.getAltNameCtx()
+ .getNameInNamespace());
assertTrue(e.getResolvedObj() instanceof Reference);
Reference ref = (Reference) e.getResolvedObj();
@@ -571,8 +651,8 @@
assertEquals(1, ref.size());
RefAddr addr = ref.get(0);
assertTrue(addr.getContent() instanceof LdapContext);
- assertEquals(context.getNameInNamespace(),
- ((LdapContext) addr.getContent()).getNameInNamespace());
+ assertEquals(context.getNameInNamespace(), ((LdapContext) addr
+ .getContent()).getNameInNamespace());
assertEquals("nns", addr.getType());
}
@@ -607,8 +687,8 @@
assertEquals(1, e.getResolvedName().size());
assertEquals("/", e.getResolvedName().toString());
assertTrue(e.getAltNameCtx() instanceof LdapContext);
- assertEquals(context.getNameInNamespace(), e
- .getAltNameCtx().getNameInNamespace());
+ assertEquals(context.getNameInNamespace(), e.getAltNameCtx()
+ .getNameInNamespace());
assertTrue(e.getResolvedObj() instanceof Reference);
Reference ref = (Reference) e.getResolvedObj();
@@ -619,11 +699,12 @@
assertEquals(1, ref.size());
RefAddr addr = ref.get(0);
assertTrue(addr.getContent() instanceof LdapContext);
- assertEquals(context.getNameInNamespace(),
- ((LdapContext) addr.getContent()).getNameInNamespace());
+ assertEquals(context.getNameInNamespace(), ((LdapContext) addr
+ .getContent()).getNameInNamespace());
assertEquals("nns", addr.getType());
}
}
+
public void testUnsolicitedNotification() throws Exception {
server.setResponseSeq(new LdapMessage[] { new LdapMessage(
LdapASN1Constant.OP_BIND_RESPONSE, new BindResponse(), null) });
Modified: harmony/enhanced/classlib/branches/java6/modules/jndi/src/test/java/org/apache/harmony/jndi/provider/ldap/LdapSchemaContextTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/jndi/src/test/java/org/apache/harmony/jndi/provider/ldap/LdapSchemaContextTest.java?rev=687988&r1=687987&r2=687988&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/jndi/src/test/java/org/apache/harmony/jndi/provider/ldap/LdapSchemaContextTest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/jndi/src/test/java/org/apache/harmony/jndi/provider/ldap/LdapSchemaContextTest.java Fri Aug 22 00:15:00 2008
@@ -1105,6 +1105,36 @@
}
}
+ public void testModifyAttributes_WatchSubSchema() throws NamingException {
+ // Creates the attributes.
+ Attributes attrs = new BasicAttributes(false); // Ignore case
+ attrs.put("NAME", "ListObjectClass");
+ attrs.put("SUP", "top");
+ attrs.put("NUMERICOID", "1.3.6.1.4.1.42.2.27.4.2.3.1.88.77");
+ attrs.put("DESC", "for test");
+ attrs.put("STRUCTURAL", "fds");
+
+ Attribute must = new BasicAttribute("MUST", "cn");
+ must.add("objectclass");
+ attrs.put(must);
+
+ DirContext dir = schema.createSubcontext(new CompositeName(
+ "ClassDefinition/ListObjectClass"), attrs);
+
+ Attributes newAttrs = new BasicAttributes(false);
+ newAttrs.put("NAME", "Modified");
+ newAttrs.put("SUP", "top");
+ newAttrs.put("NUMERICOID", "1.3.6.1.4.1.42.2.27.4.2.3.1.88.77");
+ newAttrs.put("DESC", "for test");
+ newAttrs.put("STRUCTURAL", "fds");
+
+ schema.modifyAttributes("ClassDefinition/ListObjectClass",
+ DirContext.REPLACE_ATTRIBUTE, newAttrs);
+
+ Attributes subSchemaAttrs = dir.getAttributes("");
+ assertEquals("Modified", subSchemaAttrs.get("NAME").get());
+ }
+
public void testModifyAttributes_Exception() throws NamingException {
Attributes attrs = new BasicAttributes(true); // Ignore case
attrs.put("NUMERICOID", "1.3.6.1.4.1.42.2.27.4.2.3.1.88.11");
@@ -1157,6 +1187,21 @@
} catch (NameNotFoundException e) {
// Expected.
}
+
+ try {
+ schema.modifyAttributes("", new ModificationItem[] {});
+ fail("Should throw SchemaViolationException");
+ } catch (SchemaViolationException e) {
+ // expected
+ }
+
+ try {
+ schema.modifyAttributes(new CompositeName(""),
+ new ModificationItem[] {});
+ fail("Should throw SchemaViolationException");
+ } catch (SchemaViolationException e) {
+ // expected
+ }
}
public void testCreateAndDeleteSubContext() throws NamingException {
@@ -2075,6 +2120,165 @@
assertEquals(2, count);
}
+ public void testRename() throws NamingException {
+ Name name1 = new CompositeName("test1");
+ Name name2 = new CompositeName("/");
+ Name invalidName1 = new CompositeName("");
+ try {
+ schema.rename(name1, name2);
+ fail("Should throw SchemaViolationException");
+ } catch (SchemaViolationException e) {
+ // Expected.
+ }
+
+ try {
+ schema.rename(invalidName1, name2);
+ fail("Should throw InvalidNameException");
+ } catch (InvalidNameException e) {
+ // Expected.
+ }
+
+ try {
+ schema.rename(name2, invalidName1);
+ fail("Should throw InvalidNameException");
+ } catch (InvalidNameException e) {
+ // Expected.
+ }
+
+ try {
+ schema.rename("test1", "test2");
+ fail("Should throw SchemaViolationException");
+ } catch (SchemaViolationException e) {
+ // Expected.
+ }
+
+ try {
+ schema.rename("", "test2");
+ fail("Should throw InvalidNameException");
+ } catch (InvalidNameException e) {
+ // Expected.
+ }
+
+ try {
+ schema.rename("test1", "");
+ fail("Should throw InvalidNameException");
+ } catch (InvalidNameException e) {
+ // Expected.
+ }
+
+ try {
+ schema.rename("classdefinition/javaClass", "test");
+ fail("Should throw InvalidNameException");
+ } catch (InvalidNameException e) {
+ // Expected.
+ }
+
+ try {
+ schema.rename("classdefinition\\javaClass", "test");
+ fail("Should throw SchemaViolationException");
+ } catch (SchemaViolationException e) {
+ // Expected.
+ }
+
+ try {
+ schema.rename(new CompositeName("classdefinition/javaClass"),
+ new CompositeName("test"));
+ fail("Should throw InvalidNameException");
+ } catch (InvalidNameException e) {
+ // Expected.
+ }
+
+ try {
+ schema.rename(new CompositeName("classdefinition\\javaClass"),
+ new CompositeName("test"));
+ fail("Should throw SchemaViolationException");
+ } catch (SchemaViolationException e) {
+ // Expected.
+ }
+
+ try {
+ schema.rename("classdefinition/javaClass", "");
+ fail("Should throw InvalidNameException");
+ } catch (InvalidNameException e) {
+ // Expected.
+ }
+
+ try {
+ schema.rename("", "classdefinition/javaClass");
+ fail("Should throw InvalidNameException");
+ } catch (InvalidNameException e) {
+ // Expected.
+ }
+ }
+
+ public void testRename_Exception() throws NamingException {
+ Name name = new CompositeName("test");
+ Name nullName = null;
+ String nullString = null;
+ try {
+ schema.rename(nullName, name);
+ fail("Should throw NullPointerException");
+ } catch (NullPointerException e) {
+ // Expected.
+ }
+
+ try {
+ schema.rename(name, nullName);
+ fail("Should throw NullPointerException");
+ } catch (NullPointerException e) {
+ // Expected.
+ }
+
+ try {
+ schema.rename(nullName, nullName);
+ fail("Should throw NullPointerException");
+ } catch (NullPointerException e) {
+ // Expected.
+ }
+
+ try {
+ schema.rename(nullString, "test");
+ fail("Should throw NullPointerException");
+ } catch (NullPointerException e) {
+ // Expected.
+ }
+
+ try {
+ schema.rename("test", nullString);
+ fail("Should throw NullPointerException");
+ } catch (NullPointerException e) {
+ // Expected.
+ }
+
+ try {
+ schema.rename(nullString, nullString);
+ fail("Should throw NullPointerException");
+ } catch (NullPointerException e) {
+ // Expected.
+ }
+
+ try {
+ schema.rename("\\", nullString);
+ fail("Should throw InvalidNameException");
+ } catch (InvalidNameException e) {
+ // Expected.
+ }
+
+ try {
+ schema.rename("/", nullString);
+ fail("Should throw NullPointerException");
+ } catch (NullPointerException e) {
+ // Expected.
+ }
+
+ try {
+ schema.rename(null, "");
+ fail("Should throw NullPointerException");
+ } catch (NullPointerException e) {
+ // Expected.
+ }
+ }
+
public void testClassDefinition() throws NamingException {
MockLdapSchemaContext mockSchema = new MockLdapSchemaContext(context,
null, name, schemaTable,
Modified: harmony/enhanced/classlib/branches/java6/modules/lang-management/build.xml
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/lang-management/build.xml?rev=687988&r1=687987&r2=687988&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/lang-management/build.xml (original)
+++ harmony/enhanced/classlib/branches/java6/modules/lang-management/build.xml Fri Aug 22 00:15:00 2008
@@ -106,10 +106,8 @@
</jar>
</target>
- <target name="compile-tests">
- <antcall target="compile-tests-api" />
- <antcall target="compile-tests-impl" />
- </target>
+ <target name="compile-tests"
+ depends="compile-tests-api,compile-tests-impl" />
<target name="compile-tests-api">
<echo message="Compiling LANG-MANAGEMENT API tests" />
@@ -168,10 +166,7 @@
result="${lang-management.exclude.file}"/>
</target>
- <target name="run-tests">
- <antcall target="run-tests-api" />
- <antcall target="run-tests-impl" />
- </target>
+ <target name="run-tests" depends="run-tests-api,run-tests-impl" />
<target name="run-tests-api">
<mkdir dir="${hy.tests.reports}" />
@@ -188,6 +183,10 @@
dir="${basedir}"
jvm="${test.jre.home}/bin/java">
+ <assertions enableSystemAssertions="true">
+ <enable />
+ </assertions>
+
<jvmarg line="${hy.test.vmargs}" />
<classpath>
@@ -226,6 +225,10 @@
dir="${basedir}"
jvm="${test.jre.home}/bin/java">
+ <assertions enableSystemAssertions="true">
+ <enable />
+ </assertions>
+
<jvmarg line="${hy.test.vmargs}" />
<classpath>
Modified: harmony/enhanced/classlib/branches/java6/modules/logging/build.xml
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/logging/build.xml?rev=687988&r1=687987&r2=687988&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/logging/build.xml (original)
+++ harmony/enhanced/classlib/branches/java6/modules/logging/build.xml Fri Aug 22 00:15:00 2008
@@ -178,6 +178,10 @@
dir="${basedir}"
jvm="${test.jre.home}/bin/java">
+ <assertions enableSystemAssertions="true">
+ <enable />
+ </assertions>
+
<jvmarg line="${hy.test.vmargs}" />
<!-- Used by Support_Exec.execJava() -->
<jvmarg value="-Dhy.test.vmargs=${hy.test.vmargs}" />
Modified: harmony/enhanced/classlib/branches/java6/modules/luni/build.xml
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/luni/build.xml?rev=687988&r1=687987&r2=687988&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/luni/build.xml (original)
+++ harmony/enhanced/classlib/branches/java6/modules/luni/build.xml Fri Aug 22 00:15:00 2008
@@ -70,24 +70,12 @@
</fileset>
</copy>
- <antcall target="copy-native-includes-windows" />
- <antcall target="copy-native-includes-unix" />
- </target>
-
- <target name="copy-native-includes-windows" if="is.windows">
<copy todir="${hy.hdk}/include" overwrite="yes">
- <fileset dir="${hy.luni.src.main.native}/include/windows">
+ <fileset dir="${hy.luni.src.main.native}/include/${hy.os.family}">
<include name="jclprots.h" />
</fileset>
</copy>
- </target>
- <target name="copy-native-includes-unix" if="is.unix">
- <copy todir="${hy.hdk}/include" overwrite="yes">
- <fileset dir="${hy.luni.src.main.native}/include/unix">
- <include name="jclprots.h" />
- </fileset>
- </copy>
</target>
<!-- Build native code -->
@@ -170,10 +158,11 @@
</target>
<!-- Overlay OSS packages into their required locations -->
- <target name="overlay-oss" >
+ <target name="overlay-oss" depends="-unzip-oss,-ascii2ebcdic-conversion" />
+
+ <target name="-unzip-oss">
<unzip src="${fdlibm.zip}" dest="${hy.luni.src.main.native}/fdlibm_dist" />
<chmod dir="${hy.luni.src.main.native}/fdlibm_dist" perm="ugo+r" />
- <antcall target="-ascii2ebcdic-conversion" />
</target>
<target name="-ascii2ebcdic-conversion" if="is.zos">
@@ -224,14 +213,13 @@
<!-- internal target for local and global test run sequence -->
<target name="-test-module" depends="build, compile-tests, prepare-exclude, run-tests" />
- <target name="clean">
+ <target name="clean" depends="clean-native-includes" >
<delete file="${hy.jdk}/jre/lib/boot/luni.jar" />
<delete file="${hy.jdk}/jre/lib/boot/luni-src.jar" />
<delete failonerror="false">
<fileset refid="classes" />
</delete>
<delete failonerror="false" dir="bin"/>
- <antcall target="clean-native-includes" />
</target>
<target name="clean-native-includes">
@@ -483,6 +471,10 @@
dir="${basedir}"
jvm="${test.jre.home}/bin/java">
+ <assertions enableSystemAssertions="true">
+ <enable />
+ </assertions>
+
<jvmarg line="${hy.test.vmargs}" />
<!-- Used by Support_Exec.execJava() -->
<jvmarg value="-Dhy.test.vmargs=${hy.test.vmargs}" />
Modified: harmony/enhanced/classlib/branches/java6/modules/luni/src/main/java/java/io/ObjectInputStream.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/luni/src/main/java/java/io/ObjectInputStream.java?rev=687988&r1=687987&r2=687988&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/luni/src/main/java/java/io/ObjectInputStream.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/luni/src/main/java/java/io/ObjectInputStream.java Fri Aug 22 00:15:00 2008
@@ -702,8 +702,7 @@
ObjectStreamClass streamClass = ObjectStreamClass
.lookup(proxyClass);
streamClass.setLoadFields(new ObjectStreamField[0]);
- registerObjectRead(streamClass, Integer.valueOf(nextHandle()),
- false);
+ registerObjectRead(streamClass, nextHandle(), false);
checkedSetSuperClassDesc(streamClass, readClassDesc());
return streamClass;
case TC_REFERENCE:
@@ -1324,7 +1323,7 @@
int index = findStreamSuperclass(superclass, streamClassList,
lastIndex);
if (index == -1) {
- readObjectNoData(object, superclass);
+ readObjectNoData(object, superclass, ObjectStreamClass.lookupStreamClass(superclass));
} else {
for (int j = lastIndex; j <= index; j++) {
readObjectForClass(object, streamClassList.get(j));
@@ -1358,12 +1357,11 @@
return -1;
}
- private void readObjectNoData(Object object, Class<?> cl)
+ private void readObjectNoData(Object object, Class<?> cl, ObjectStreamClass classDesc)
throws ObjectStreamException {
- if (!ObjectStreamClass.isSerializable(cl)) {
+ if (!classDesc.isSerializable()) {
return;
}
- ObjectStreamClass classDesc = ObjectStreamClass.lookupStreamClass(cl);
if (classDesc.hasMethodReadObjectNoData()){
final Method readMethod = classDesc.getMethodReadObjectNoData();
try {
@@ -1501,7 +1499,7 @@
throw new InvalidClassException(Msg.getString("K00d1")); //$NON-NLS-1$
}
- Integer newHandle = Integer.valueOf(nextHandle());
+ Integer newHandle = nextHandle();
// Array size
int size = input.readInt();
@@ -1562,6 +1560,10 @@
// Array of Objects
Object[] objectArray = (Object[]) result;
for (int i = 0; i < size; i++) {
+ // TODO: This place is the opportunity for enhancement
+ // We can implement writing elements through fast-path,
+ // without setting up the context (see readObject()) for
+ // each element with public API
objectArray[i] = readObject();
}
}
@@ -1590,10 +1592,9 @@
ObjectStreamClass classDesc = readClassDesc();
if (classDesc != null) {
- Integer newHandle = Integer.valueOf(nextHandle());
Class<?> localClass = classDesc.forClass();
if (localClass != null) {
- registerObjectRead(localClass, newHandle, unshared);
+ registerObjectRead(localClass, nextHandle(), unshared);
}
return localClass;
}
@@ -1659,7 +1660,7 @@
ClassNotFoundException, IOException {
// read classdesc for Enum first
ObjectStreamClass classDesc = readEnumDesc();
- Integer newHandle = Integer.valueOf(nextHandle());
+ int newHandle = nextHandle();
// read name after class desc
String name;
byte tc = nextTC();
@@ -1705,7 +1706,7 @@
// subclasses during readClassDescriptor()
primitiveData = input;
Integer oldHandle = descriptorHandle;
- descriptorHandle = Integer.valueOf(nextHandle());
+ descriptorHandle = nextHandle();
ObjectStreamClass newClassDesc = readClassDescriptor();
registerObjectRead(newClassDesc, descriptorHandle, unshared);
descriptorHandle = oldHandle;
@@ -1795,8 +1796,7 @@
* descriptors. If called outside of readObject, the descriptorHandle
* might be null.
*/
- descriptorHandle = (null == descriptorHandle ? Integer
- .valueOf(nextHandle()) : descriptorHandle);
+ descriptorHandle = (null == descriptorHandle ? nextHandle() : descriptorHandle);
registerObjectRead(newClassDesc, descriptorHandle, false);
readFieldDescriptors(newClassDesc);
@@ -1817,6 +1817,9 @@
*/
protected Class<?> resolveProxyClass(String[] interfaceNames)
throws IOException, ClassNotFoundException {
+
+ // TODO: This method is opportunity for performance enhancement
+ // We can cache the classloader and recently used interfaces.
ClassLoader loader = VM.getNonBootstrapClassLoader();
Class<?>[] interfaces = new Class<?>[interfaceNames.length];
for (int i = 0; i < interfaceNames.length; i++) {
@@ -1837,8 +1840,8 @@
* @throws IOException
* If an IO exception happened when reading the handle
*/
- private Integer readNewHandle() throws IOException {
- return Integer.valueOf(input.readInt());
+ private int readNewHandle() throws IOException {
+ return input.readInt();
}
private Class<?> resolveConstructorClass(Class<?> objectClass, boolean wasSerializable, boolean wasExternalizable)
@@ -1936,7 +1939,7 @@
throw new InvalidClassException(Msg.getString("K00d1")); //$NON-NLS-1$
}
- Integer newHandle = Integer.valueOf(nextHandle());
+ Integer newHandle = nextHandle();
// Note that these values come from the Stream, and in fact it could be
// that the classes have been changed so that the info below now
@@ -2009,9 +2012,8 @@
if (objectClass != null) {
- ObjectStreamClass desc = ObjectStreamClass.lookupStreamClass(objectClass);
- if (desc.hasMethodReadResolve()){
- Method methodReadResolve = desc.getMethodReadResolve();
+ if (classDesc.hasMethodReadResolve()){
+ Method methodReadResolve = classDesc.getMethodReadResolve();
try {
result = methodReadResolve.invoke(result, (Object[]) null);
} catch (IllegalAccessException iae) {
@@ -2059,8 +2061,7 @@
if (enableResolve) {
result = resolveObject(result);
}
- int newHandle = nextHandle();
- registerObjectRead(result, Integer.valueOf(newHandle), unshared);
+ registerObjectRead(result, nextHandle(), unshared);
return result;
}
@@ -2082,8 +2083,7 @@
if (enableResolve) {
result = resolveObject(result);
}
- int newHandle = nextHandle();
- registerObjectRead(result, Integer.valueOf(newHandle), unshared);
+ registerObjectRead(result, nextHandle(), unshared);
return result;
}
@@ -2427,8 +2427,6 @@
// Use the first non-null ClassLoader on the stack. If null, use
// the system class loader
cls = Class.forName(className, true, callerClassLoader);
- // save the value
- osClass.setClass(cls);
}
}
return cls;