| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package javax.naming.ldap; |
| |
| import java.io.IOException; |
| import java.io.ObjectInputStream; |
| import java.io.ObjectOutputStream; |
| import java.util.ArrayList; |
| import java.util.Enumeration; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import javax.naming.InvalidNameException; |
| import javax.naming.Name; |
| |
| import org.apache.harmony.jndi.internal.nls.Messages; |
| import org.apache.harmony.jndi.internal.parser.LdapNameParser; |
| |
| /** |
| * TODO: JavaDoc |
| */ |
| public class LdapName implements Name { |
| |
| private static final long serialVersionUID = -1595520034788997356L; |
| |
| private transient List<Rdn> rdns; |
| |
| private transient String rdnsStr; |
| |
| public LdapName(List<Rdn> rdns) { |
| if (rdns == null) { |
| throw new NullPointerException("rdns " |
| + Messages.getString("ldap.00")); |
| } |
| |
| this.rdns = new ArrayList<Rdn>(rdns); |
| } |
| |
| public LdapName(String name) throws InvalidNameException { |
| rdnsStr = name; |
| LdapNameParser parser = new LdapNameParser(rdnsStr); |
| |
| this.rdns = parser.getList(); |
| } |
| |
| public Name add(int posn, Rdn comp) { |
| if (comp == null) { |
| throw new NullPointerException("comp " |
| + Messages.getString("ldap.00")); |
| } |
| |
| if (posn < 0 || posn > rdns.size()) { |
| throw new IndexOutOfBoundsException(Messages.getString("ldap.05")); |
| } |
| |
| rdns.add(posn, comp); |
| rdnsStr = null; |
| return this; |
| } |
| |
| public Name add(int posn, String comp) throws InvalidNameException { |
| return add(posn, new Rdn(comp)); |
| } |
| |
| public Name add(Rdn comp) { |
| return add(rdns.size(), comp); |
| } |
| |
| public Name add(String comp) throws InvalidNameException { |
| return add(rdns.size(), comp); |
| } |
| |
| public Name addAll(int posn, List<Rdn> suffixRdns) { |
| if (suffixRdns == null) { |
| throw new NullPointerException("suffixRdns " |
| + Messages.getString("ldap.00")); |
| } |
| |
| if (posn < 0 || posn > rdns.size()) { |
| throw new IndexOutOfBoundsException(Messages.getString("ldap.00")); |
| } |
| |
| rdns.addAll(posn, suffixRdns); |
| rdnsStr = null; |
| return this; |
| } |
| |
| public Name addAll(int posn, Name suffix) throws InvalidNameException { |
| if (suffix instanceof LdapName) { |
| return addAll(posn, ((LdapName) suffix).rdns); |
| } |
| List<Rdn> rdns = new ArrayList<Rdn>(); |
| for (Enumeration<?> iter = suffix.getAll(); iter.hasMoreElements();) { |
| rdns.add(new Rdn((String) iter.nextElement())); |
| } |
| return addAll(posn, rdns); |
| } |
| |
| public Name addAll(List<Rdn> suffixRdns) { |
| return addAll(rdns.size(), suffixRdns); |
| } |
| |
| public Name addAll(Name suffix) throws InvalidNameException { |
| return addAll(rdns.size(), suffix); |
| } |
| |
| public Object clone() { |
| try { |
| if (rdnsStr != null) { |
| return new LdapName(rdnsStr); |
| } |
| } catch (InvalidNameException e) { |
| } |
| List<Rdn> lista = new ArrayList<Rdn>(); |
| for (int i = 0; i < rdns.size(); i++) { |
| lista.add(rdns.get(i)); |
| } |
| return new LdapName(lista); |
| } |
| |
| public int compareTo(Object obj) { |
| if (obj == null || !(obj instanceof LdapName)) { |
| throw new ClassCastException("obj " + Messages.getString("ldap.01")); |
| } |
| |
| LdapName ln = (LdapName) obj; |
| |
| Iterator<?> iter = rdns.iterator(); |
| Iterator<?> iter2 = ln.rdns.iterator(); |
| |
| while (iter.hasNext() && iter2.hasNext()) { |
| int c = iter.next().toString().toLowerCase().compareTo( |
| iter2.next().toString().toLowerCase()); |
| |
| if (c != 0) { |
| return c; |
| } |
| } |
| |
| if (iter.hasNext()) |
| return 1; |
| if (iter2.hasNext()) |
| return -1; |
| |
| return 0; |
| } |
| |
| public boolean endsWith(List<Rdn> rdns) { |
| try { |
| Iterator<?> iter = rdns.iterator(); |
| Iterator<?> iter2 = ((LdapName) getSuffix(this.rdns.size() |
| - rdns.size())).rdns.iterator(); |
| |
| while (iter.hasNext()) { |
| if (!((Rdn) iter.next()).equals(iter2.next())) { |
| return false; |
| } |
| } |
| |
| return true; |
| } catch (RuntimeException e) { |
| return false; |
| } |
| } |
| |
| public boolean endsWith(Name n) { |
| try { |
| return n.equals(getSuffix(rdns.size() - n.size())); |
| } catch (RuntimeException e) { |
| return false; |
| } |
| } |
| |
| public boolean equals(Object obj) { |
| if (obj == null || !(obj instanceof LdapName)) { |
| return false; |
| } |
| |
| LdapName ln = (LdapName) obj; |
| |
| if (ln.rdns.size() != rdns.size()) { |
| return false; |
| } |
| |
| Iterator<Rdn> iter = ln.rdns.iterator(); |
| Iterator<Rdn> iter2 = rdns.iterator(); |
| while (iter.hasNext()) { |
| if (!iter.next().equals(iter2.next())) { |
| return false; |
| } |
| } |
| return true; |
| } |
| |
| public String get(int posn) { |
| return getRdn(posn).toString(); |
| } |
| |
| public Enumeration<String> getAll() { |
| final Iterator<Rdn> rdns = getRdns().iterator(); |
| |
| return new Enumeration<String>() { |
| |
| public boolean hasMoreElements() { |
| return rdns.hasNext(); |
| } |
| |
| public String nextElement() { |
| return rdns.next().toString(); |
| } |
| }; |
| } |
| |
| public Name getPrefix(int posn) { |
| if (posn < 0) { |
| throw new IndexOutOfBoundsException(Messages.getString("ldap.02")); |
| } |
| return new LdapName(rdns.subList(0, posn)); |
| } |
| |
| public Rdn getRdn(int posn) { |
| return rdns.get(posn); |
| } |
| |
| public List<Rdn> getRdns() { |
| return rdns; |
| } |
| |
| public Name getSuffix(int posn) { |
| if (posn > rdns.size()) { |
| throw new IndexOutOfBoundsException(Messages.getString("ldap.02")); |
| } |
| |
| return new LdapName(rdns.subList(posn, rdns.size())); |
| } |
| |
| public int hashCode() { |
| int sum = 0; |
| for (Iterator<?> iter = rdns.iterator(); iter.hasNext();) { |
| sum += iter.next().hashCode(); |
| } |
| return sum; |
| } |
| |
| public boolean isEmpty() { |
| return rdns.size() == 0; |
| } |
| |
| public Object remove(int posn) throws InvalidNameException { |
| rdnsStr = null; |
| return rdns.remove(posn).toString(); |
| } |
| |
| public int size() { |
| return rdns.size(); |
| } |
| |
| public boolean startsWith(List<Rdn> rdns) { |
| try { |
| Iterator<?> iter = rdns.iterator(); |
| Iterator<?> iter2 = ((LdapName) getPrefix(rdns.size())).rdns |
| .iterator(); |
| |
| while (iter.hasNext()) { |
| if (!((Rdn) iter.next()).equals(iter2.next())) { |
| return false; |
| } |
| } |
| return true; |
| } catch (RuntimeException e) { |
| return false; |
| } |
| } |
| |
| public boolean startsWith(Name n) { |
| try { |
| return n.equals(getPrefix(n.size())); |
| } catch (RuntimeException e) { |
| return false; |
| } |
| |
| } |
| |
| public String toString() { |
| if (rdnsStr != null) { |
| return rdnsStr; |
| } |
| if (rdns.size() == 0) { |
| return ""; //$NON-NLS-1$ |
| } |
| |
| StringBuilder sb = new StringBuilder(); |
| sb.append(rdns.get(rdns.size() - 1).toString()); |
| for (int i = rdns.size() - 2; i >= 0; i--) { |
| sb.append(','); |
| sb.append(rdns.get(i).toString()); |
| } |
| return sb.toString(); |
| } |
| |
| @SuppressWarnings("unchecked") |
| private void readObject(ObjectInputStream ois) throws IOException, |
| ClassNotFoundException, InvalidNameException { |
| ois.defaultReadObject(); |
| LdapNameParser parser = new LdapNameParser((String) ois.readObject()); |
| this.rdns = parser.getList(); |
| } |
| |
| private void writeObject(ObjectOutputStream oos) throws IOException { |
| oos.defaultWriteObject(); |
| oos.writeObject(this.toString()); |
| } |
| |
| } |