CustomSearchResult.java revision e1cd6c2bc4addf80537e31f929118ac8f908ea63
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/*
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * CDDL HEADER START
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * The contents of this file are subject to the terms of the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Common Development and Distribution License, Version 1.0 only
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * (the "License"). You may not use this file except in compliance
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * with the License.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * or http://forgerock.org/license/CDDLv1.0.html.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * See the License for the specific language governing permissions
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * and limitations under the License.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * When distributing Covered Code, include this CDDL HEADER in each
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * file and include the License file at legal-notices/CDDLv1_0.txt.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * If applicable, add the following below this CDDL HEADER, with the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * fields enclosed by brackets "[]" replaced with your own identifying
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * information:
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Portions Copyright [yyyy] [name of copyright owner]
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * CDDL HEADER END
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Copyright 2008-2010 Sun Microsystems, Inc.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Portions Copyright 2011-2015 ForgeRock AS
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
828057d90816871c55a24e161757edb11f09e5ddPeter Majorpackage org.opends.guitools.controlpanel.datamodel;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport static org.opends.server.util.StaticUtils.toLowerCase;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.ArrayList;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.Collections;
0fdab8904a8fe223f6934b878769fe45e7651c60Andrew Forrestimport java.util.HashMap;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.List;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.Map;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.SortedSet;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.TreeSet;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.naming.CompositeName;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.naming.Name;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.naming.NamingEnumeration;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.naming.NamingException;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.naming.directory.Attribute;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.naming.directory.Attributes;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.naming.directory.SearchResult;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport org.opends.guitools.controlpanel.util.Utilities;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport org.opends.server.core.DirectoryServer;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport org.opends.server.types.AttributeBuilder;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport org.opends.server.types.AttributeType;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport org.forgerock.opendj.ldap.ByteString;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport org.opends.server.types.DN;
80849398a45dca1fb917716907d6ec99be6222c2Peter Majorimport org.opends.server.types.Entry;
89503929c8983c48e2049c77284b52e79ad37c32jeff.schenkimport org.opends.server.types.ObjectClass;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport org.opends.server.types.OpenDsException;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport org.opends.server.util.LDIFReader;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * This is a commodity class used to wrap the SearchResult class of JNDI.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Basically it retrieves all the attributes and values on the SearchResult and
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * calculates its DN. Using it we avoid having to handle the NamingException
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * exceptions that most of the methods in SearchResult throw.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterpublic class CustomSearchResult implements Comparable<CustomSearchResult>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster{
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private String dn;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private Map<String, List<Object>> attributes;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private SortedSet<String> attrNames;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private String toString;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private int hashCode;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Constructor of an empty search result. This constructor is used by the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * LDAP entry editor which 'build' their own CustomSearchResult. The entry
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * editors use some methods that require CustomSearchResult.
89503929c8983c48e2049c77284b52e79ad37c32jeff.schenk * @param dn the dn of the entry.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public CustomSearchResult(String dn)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster this.dn = dn;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster attributes = new HashMap<String, List<Object>>();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster attrNames = new TreeSet<String>();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster toString = calculateToString();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster hashCode = calculateHashCode();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Constructor of a search result using a SearchResult as basis.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param sr the SearchResult.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param baseDN the base DN of the search that returned the SearchResult.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @throws NamingException if there is an error retrieving the attribute
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * values.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public CustomSearchResult(SearchResult sr, String baseDN)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throws NamingException
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String sName = sr.getName();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Name name;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((baseDN != null) && (baseDN.length() > 0))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((sName != null) && (sName.length() > 0))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster name = new CompositeName(sName);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster name.add(baseDN);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster else {
4a5a82da9bbab0a3ea1701c3ae9334c678d24ca5Mark de Reeper name = Utilities.getJNDIName(baseDN);
4a5a82da9bbab0a3ea1701c3ae9334c678d24ca5Mark de Reeper }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster name = new CompositeName(sName);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster StringBuilder buf = new StringBuilder();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster for (int i=0; i<name.size(); i++)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String n = name.get(i);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((buf.length() != 0) && (n != null) && (n.length() > 0))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster buf.append(",");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((n != null) && (n.length() > 0))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster buf.append(n);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster dn = buf.toString();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster attributes = new HashMap<String, List<Object>>();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster attrNames = new TreeSet<String>();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Attributes attrs = sr.getAttributes();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (attrs != null)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster NamingEnumeration<?> en = attrs.getAll();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster while (en.hasMore()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Attribute attr = (Attribute)en.next();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String attrName = attr.getID();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster attrNames.add(attrName);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List<Object> values = new ArrayList<Object>();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster for (int i=0; i<attr.size(); i++)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Object v = attr.get(i);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!"".equals(v.toString()))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster values.add(v);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster attributes.put(attrName.toLowerCase(), values);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster finally
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster en.close();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster toString = calculateToString();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster hashCode = calculateHashCode();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns the DN of the entry.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return the DN of the entry.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public String getDN() {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return dn;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns the values for a given attribute. It returns an empty Set if
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * the attribute is not defined.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param name the name of the attribute.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return the values for a given attribute. It returns an empty Set if
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * the attribute is not defined.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public List<Object> getAttributeValues(String name) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List<Object> values = attributes.get(name.toLowerCase());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (values == null)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster values = Collections.emptyList();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return values;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns all the attribute names of the entry.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return the attribute names of the entry.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public SortedSet<String> getAttributeNames() {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return attrNames;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /** {@inheritDoc} */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public int compareTo(CustomSearchResult o) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (this.equals(o))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return 0;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return toString().compareTo(o.toString());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Return a new object, copy of the current object.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return a new object, copy of the current object
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public CustomSearchResult duplicate()
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster CustomSearchResult sr = new CustomSearchResult(dn);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sr.attributes = new HashMap<String, List<Object>>(attributes);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sr.attrNames = new TreeSet<String>(attrNames);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sr.toString = toString;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sr.hashCode = hashCode;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return sr;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /** {@inheritDoc} */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public boolean equals(Object o)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (o == this)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (o instanceof CustomSearchResult)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster CustomSearchResult sr = (CustomSearchResult)o;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return getDN().equals(sr.getDN())
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster && getAttributeNames().equals(sr.getAttributeNames())
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster && attrValuesEqual(sr);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private boolean attrValuesEqual(CustomSearchResult sr)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster for (String attrName : getAttributeNames())
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!getAttributeValues(attrName).equals(sr.getAttributeValues(attrName)))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /** {@inheritDoc} */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public String toString() {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return toString;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /** {@inheritDoc} */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public int hashCode() {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return hashCode;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Sets the values for a given attribute name.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param attrName the name of the attribute.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param values the values for the attribute.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void set(String attrName, List<Object> values)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster attrNames.add(attrName);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster attrName = attrName.toLowerCase();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster attributes.put(attrName, values);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster toString = calculateToString();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster hashCode = calculateHashCode();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private String calculateToString()
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return "dn: "+dn+"\nattributes: "+attributes;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private int calculateHashCode()
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return 23 + toString.hashCode();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Gets the Entry object equivalent to this CustomSearchResult.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * The method assumes that the schema in DirectoryServer has been initialized.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return the Entry object equivalent to this CustomSearchResult.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @throws OpenDsException if there is an error parsing the DN or retrieving
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * the attributes definition and objectclasses in the schema of the server.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public Entry getEntry() throws OpenDsException
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DN dn = DN.valueOf(getDN());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Map<ObjectClass,String> objectClasses = new HashMap<ObjectClass,String>();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Map<AttributeType,List<org.opends.server.types.Attribute>> userAttributes =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster new HashMap<AttributeType,List<org.opends.server.types.Attribute>>();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Map<AttributeType,List<org.opends.server.types.Attribute>>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster operationalAttributes =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster new HashMap<AttributeType,List<org.opends.server.types.Attribute>>();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster for (String wholeName : getAttributeNames())
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster final org.opends.server.types.Attribute attribute =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LDIFReader.parseAttrDescription(wholeName);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster final String attrName = attribute.getName();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster final String lowerName = toLowerCase(attrName);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // See if this is an objectclass or an attribute. Then get the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // corresponding definition and add the value to the appropriate hash.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (lowerName.equals("objectclass"))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster for (Object value : getAttributeValues(attrName))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String ocName = value.toString().trim();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String lowerOCName = toLowerCase(ocName);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ObjectClass objectClass =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DirectoryServer.getObjectClass(lowerOCName);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (objectClass == null)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster objectClass = DirectoryServer.getDefaultObjectClass(ocName);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster objectClasses.put(objectClass, ocName);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster else
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster AttributeType attrType = DirectoryServer.getAttributeType(lowerName);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (attrType == null)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster attrType = DirectoryServer.getDefaultAttributeType(attrName);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster AttributeBuilder builder = new AttributeBuilder(attribute, true);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster for (Object value : getAttributeValues(attrName))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ByteString bs;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (value instanceof byte[])
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster bs = ByteString.wrap((byte[])value);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster else
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster bs = ByteString.valueOf(value.toString());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster builder.add(bs);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List<org.opends.server.types.Attribute> attrList =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster new ArrayList<org.opends.server.types.Attribute>(1);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster attrList.add(builder.toAttribute());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (attrType.isOperational())
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster operationalAttributes.put(attrType, attrList);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster else
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster userAttributes.put(attrType, attrList);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return new Entry(dn, objectClasses, userAttributes, operationalAttributes);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster}
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster