001/**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.xbean.naming.reference;
018
019import java.util.Enumeration;
020import java.util.Hashtable;
021import java.util.NoSuchElementException;
022import javax.naming.Context;
023import javax.naming.Name;
024import javax.naming.RefAddr;
025import javax.naming.Reference;
026import javax.naming.NamingException;
027import javax.naming.spi.ObjectFactory;
028
029/**
030 * @version $Rev: 355877 $ $Date: 2005-12-10 18:48:27 -0800 (Sat, 10 Dec 2005) $
031 */
032public abstract class SimpleReference extends Reference {
033    private static final Enumeration<RefAddr> EMPTY_ENUMERATION = new Enumeration<RefAddr>() {
034        public boolean hasMoreElements() {
035            return false;
036        }
037
038        public RefAddr nextElement() {
039            throw new NoSuchElementException();
040        }
041    };
042
043    public SimpleReference() {
044        super(null);
045    }
046
047    /**
048     * Gets the actual referenced Object.
049     * @return the referenced object
050     * @throws javax.naming.NamingException on error
051     */
052    public abstract Object getContent() throws NamingException;
053
054    /**
055     * We will atleast return an Object.  Subclasses may want to provide a more specific class.
056     * @return "java.lang.Object"
057     */
058    public String getClassName() {
059        return "java.lang.Object";
060    }
061
062    /**
063     * If the JNDI context does not understand simple references, this method will be called
064     * to obtain the class name of a factory.  This factory in turn understands the simple
065     * reference.  This style is much slower because JNDI will use reflection to load and
066     * create this class.
067     * @return factory class name
068     */
069    public final String getFactoryClassName() {
070        return SimpleObjectFactory.class.getName();
071    }
072
073    //
074    // Disabled methods that we no longer need
075    //
076    public final String getFactoryClassLocation() {
077        return null;
078    }
079
080    public final RefAddr get(String addrType) {
081        return null;
082    }
083
084    public final RefAddr get(int posn) {
085        throw new ArrayIndexOutOfBoundsException(posn);
086    }
087
088    public final Enumeration<RefAddr> getAll() {
089        return EMPTY_ENUMERATION;
090    }
091
092    public final int size() {
093        return 0;
094    }
095
096    public final void add(RefAddr addr) {
097        throw new UnsupportedOperationException("SimpleReference has no addresses so none can be added");
098    }
099
100    public final void add(int posn, RefAddr addr) {
101        throw new UnsupportedOperationException("SimpleReference has no addresses so none can be added");
102    }
103
104    public final Object remove(int posn) {
105        throw new ArrayIndexOutOfBoundsException(posn);
106    }
107
108    public final void clear() {
109    }
110
111    //
112    // Reset the java.lang.Object methods back to default implementations
113    //
114    public boolean equals(Object obj) {
115        return this == obj;
116    }
117
118    public int hashCode() {
119        return System.identityHashCode(this);
120    }
121
122    public String toString() {
123        return getClass().getName() + "@" + Integer.toHexString(hashCode());
124    }
125
126    public Object clone() {
127        throw new UnsupportedOperationException("SimpleReference can not be cloned");
128    }
129
130    /**
131     * Simply calls getContent() on the SimpleReference
132     */
133    public static final class SimpleObjectFactory implements ObjectFactory {
134        public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable environment) throws Exception {
135            if (obj instanceof SimpleReference) {
136                SimpleReference reference = (SimpleReference) obj;
137                return reference.getContent();
138            }
139            return null;
140        }
141    }
142}