/* * Copyright (c) 2006 Stiftung Deutsches Elektronen-Synchroton, * Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY. * * THIS SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "../AS IS" BASIS. * WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSE AND * NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * THE USE OR OTHER DEALINGS IN THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE * IN ANY RESPECT, THE USER ASSUMES THE COST OF ANY NECESSARY SERVICING, REPAIR OR * CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. * NO USE OF ANY SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. * DESY HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, * OR MODIFICATIONS. * THE FULL LICENSE SPECIFYING FOR THE SOFTWARE THE REDISTRIBUTION, MODIFICATION, * USAGE AND OTHER RIGHTS AND OBLIGATIONS IS INCLUDED WITH THE DISTRIBUTION OF THIS * PROJECT IN THE FILE LICENSE.HTML. IF THE LICENSE IS NOT INCLUDED YOU MAY FIND A COPY * AT HTTP://WWW.DESY.DE/LEGAL/LICENSE.HTM */ /** * */ package org.epics.css.dal.directory; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.directory.Attribute; /** * Implementation of Attributes interface, which tries to optimize new Attribute object creation. New instance of * Attribute implementation (SingleValueAttribute) is created only when necessary. Allows direct usage of internal * Map containg attributes as objects. * * @author ikriznar * */ public class Attributes implements javax.naming.directory.Attributes { private static final long serialVersionUID = 4747575955857437856L; protected Map<String, Object> elements; /** * Default constructor. */ public Attributes() { super(); elements = new HashMap<String, Object>(); } /** * Default constructor. */ private Attributes(Map<String, Object> elements) { super(); this.elements = new HashMap<String, Object>(elements); } /* (non-Javadoc) * @see javax.naming.directory.Attributes#isCaseIgnored() */ @Override public boolean isCaseIgnored() { return false; } /* (non-Javadoc) * @see javax.naming.directory.Attributes#size() */ @Override public int size() { return elements.size(); } /* (non-Javadoc) * @see javax.naming.directory.Attributes#get(java.lang.String) */ @Override public Attribute get(String attrID) { Object o = elements.get(attrID); if (o == null) { return null; } if (o instanceof Attribute) { return (Attribute)o; } Attribute a = new SingleValueAttribute(attrID, o); elements.put(attrID, a); return a; } /* (non-Javadoc) * @see javax.naming.directory.Attributes#getAll() */ @Override public NamingEnumeration<?extends Attribute> getAll() { return new NamingEnumeration<Attribute>() { Iterator<String> it = elements.keySet().iterator(); @Override public Attribute nextElement() { return get(it.next()); } @Override public boolean hasMoreElements() { return it.hasNext(); } @Override public void close() throws NamingException { it = null; } @Override public boolean hasMore() throws NamingException { return it.hasNext(); } @Override public Attribute next() throws NamingException { return get(it.next()); } }; } /* (non-Javadoc) * @see javax.naming.directory.Attributes#getIDs() */ @Override public NamingEnumeration<String> getIDs() { return new NamingEnumeration<String>() { Iterator<String> it = elements.keySet().iterator(); @Override public String nextElement() { return it.next(); } @Override public boolean hasMoreElements() { return it.hasNext(); } @Override public void close() throws NamingException { it = null; } @Override public boolean hasMore() throws NamingException { return it.hasNext(); } @Override public String next() throws NamingException { return it.next(); } }; } /* (non-Javadoc) * @see javax.naming.directory.Attributes#put(java.lang.String, java.lang.Object) */ @Override public Attribute put(String attrID, Object val) { Attribute a = get(attrID); elements.put(attrID, val); return a; } public Object putAttributeValue(String attrID, Object val) { Object a = getAttributeValue(attrID); elements.put(attrID, val); return a; } /* (non-Javadoc) * @see javax.naming.directory.Attributes#put(javax.naming.directory.Attribute) */ @Override public Attribute put(Attribute attr) { Attribute a = get(attr.getID()); elements.put(attr.getID(), attr); return a; } /* (non-Javadoc) * @see javax.naming.directory.Attributes#remove(java.lang.String) */ @Override public Attribute remove(String attrID) { Attribute a = get(attrID); elements.remove(attrID); return a; } /* (non-Javadoc) * @see java.lang.Object#clone() */ @Override public Object clone() { return new Attributes(elements); } /** * Return attibute value. * @param id * @return attribute value if exists */ public Object getAttributeValue(String id) { Object o = elements.get(id); if (o instanceof Attribute) { try { return ((Attribute)o).get(); } catch (NamingException n) { return null; } } return o; } } /* __oOo__ */