View Javadoc
1 /* 2 * Copyright (C) The Apache Software Foundation. All rights reserved. 3 * 4 * This software is published under the terms of the Apache Software License 5 * version 1.1, a copy of which has been included with this distribution in 6 * the LICENSE file. 7 */ 8 package org.apache.avalon.excalibur.naming; 9 10 import java.util.Hashtable; 11 import javax.naming.*; 12 import javax.naming.CompositeName; 13 import javax.naming.Context; 14 import javax.naming.Name; 15 import javax.naming.NameParser; 16 import javax.naming.spi.ResolveResult; 17 18 /*** 19 * Abstract JNDI Context that can be inherited from to 20 * provide a particular type of Context. 21 * 22 * @author <a href="mailto:donaldp@apache.org">Peter Donald</a> 23 * @version $Revision: 1.2 $ 24 */ 25 public abstract class AbstractURLContext 26 extends AbstractContext 27 implements NameParser 28 { 29 protected final String m_scheme; 30 31 public AbstractURLContext( final String scheme, final Hashtable environment ) 32 { 33 super( environment ); 34 m_scheme = scheme; 35 } 36 37 public Name parse( final String name ) 38 throws NamingException 39 { 40 return (new CompositeName().add( name )); 41 } 42 43 protected NameParser getNameParser() 44 throws NamingException 45 { 46 return this; 47 } 48 49 /*** 50 * Helper method to bind 51 */ 52 protected void bind( final Name name, final Object object, final boolean rebind ) 53 throws NamingException 54 { 55 final ResolveResult resolveResult = getBaseURLContext( name, m_environment ); 56 final Context context = (Context)resolveResult.getResolvedObj(); 57 58 try 59 { 60 if( rebind ) 61 { 62 context.rebind( resolveResult.getRemainingName(), object ); 63 } 64 else 65 { 66 context.bind( resolveResult.getRemainingName(), object ); 67 } 68 } 69 finally 70 { 71 context.close(); 72 } 73 } 74 75 /*** 76 * Create a Subcontext. 77 * 78 * @param name the name of subcontext 79 * @return the created context 80 * @exception NamingException if an error occurs (ie context exists, badly formated name etc) 81 */ 82 public Context createSubcontext( final Name name ) 83 throws NamingException 84 { 85 final ResolveResult resolveResult = getBaseURLContext( name, m_environment ); 86 final Context context = (Context)resolveResult.getResolvedObj(); 87 88 try 89 { 90 return context.createSubcontext( resolveResult.getRemainingName() ); 91 } 92 finally 93 { 94 context.close(); 95 } 96 } 97 98 public void destroySubcontext( final Name name ) 99 throws NamingException 100 { 101 final ResolveResult resolveResult = getBaseURLContext( name, m_environment ); 102 final Context context = (Context)resolveResult.getResolvedObj(); 103 104 try 105 { 106 context.destroySubcontext( resolveResult.getRemainingName() ); 107 } 108 finally 109 { 110 context.close(); 111 } 112 } 113 114 public String getNameInNamespace() 115 throws NamingException 116 { 117 return ""; 118 } 119 120 /*** 121 * Enumerates the names bound in the named context. 122 * 123 * @param name the name of the context 124 * @return the enumeration 125 * @exception NamingException if an error occurs 126 */ 127 public NamingEnumeration list( final Name name ) 128 throws NamingException 129 { 130 final ResolveResult resolveResult = getBaseURLContext( name, m_environment ); 131 final Context context = (Context)resolveResult.getResolvedObj(); 132 133 try 134 { 135 return context.list( resolveResult.getRemainingName() ); 136 } 137 finally 138 { 139 context.close(); 140 } 141 } 142 143 /*** 144 * Enumerates the names bound in the named context, along with the objects bound to them. 145 * 146 * @param name the name of the context 147 * @return the enumeration 148 * @exception NamingException if an error occurs 149 */ 150 public NamingEnumeration listBindings( final Name name ) 151 throws NamingException 152 { 153 final ResolveResult resolveResult = getBaseURLContext( name, m_environment ); 154 final Context context = (Context)resolveResult.getResolvedObj(); 155 156 try 157 { 158 return context.listBindings( resolveResult.getRemainingName() ); 159 } 160 finally 161 { 162 context.close(); 163 } 164 } 165 166 /*** 167 * Get the object named. 168 * 169 * @param name the name 170 * @return the object 171 * @exception NamingException if an error occurs (ie object name is inavlid or unbound) 172 */ 173 public Object lookup( final Name name ) 174 throws NamingException 175 { 176 final ResolveResult resolveResult = getBaseURLContext( name, m_environment ); 177 final Context context = (Context)resolveResult.getResolvedObj(); 178 179 try 180 { 181 return context.lookup( resolveResult.getRemainingName() ); 182 } 183 finally 184 { 185 context.close(); 186 } 187 } 188 189 /*** 190 * Unbind a object from a name. 191 * 192 * @param name the name 193 * @exception NamingException if an error occurs 194 */ 195 public void unbind( final Name name ) 196 throws NamingException 197 { 198 final ResolveResult resolveResult = getBaseURLContext( name, m_environment ); 199 final Context context = (Context)resolveResult.getResolvedObj(); 200 201 try 202 { 203 context.unbind( resolveResult.getRemainingName() ); 204 } 205 finally 206 { 207 context.close(); 208 } 209 } 210 211 protected ResolveResult getBaseURLContext( final Name name, final Hashtable environment ) 212 throws NamingException 213 { 214 if( name.isEmpty() ) 215 { 216 throw new InvalidNameException( "Unable to locate URLContext will empty name" ); 217 } 218 219 final String nameString = name.toString(); 220 int index = nameString.indexOf( ':' ); 221 222 if( -1 == index ) 223 { 224 throw new InvalidNameException( "Unable to build URLContext as it does not specify scheme" ); 225 } 226 227 final String scheme = nameString.substring( 0, index ); 228 final int end = getEndIndexOfURLPart( nameString, index + 1 ); 229 final String urlPart = nameString.substring( index + 1, end ); 230 final String namePart = nameString.substring( end ); 231 232 if( !m_scheme.equals( scheme ) ) 233 { 234 throw new InvalidNameException( "Bad Scheme use to build URLContext (" + scheme + "). " + 235 "Expected " + m_scheme ); 236 } 237 238 final Context context = newContext( urlPart ); 239 240 return new ResolveResult( context, new CompositeName( namePart ) ); 241 } 242 243 /*** 244 * Find end index of url part in string. 245 * Default implementation looks for 246 * //.../[name-part] 247 * ///[name-part] 248 * //... (no name part) 249 * [name-part] 250 * 251 * @param name the name 252 * @param index the index where "scheme:" ends 253 * @return the index where url ends 254 * @exception NamingException if an error occurs 255 */ 256 protected int getEndIndexOfURLPart( final String name, final int index ) 257 throws NamingException 258 { 259 int result = 0; 260 261 //does it start with // 262 if( name.startsWith( "//", index ) ) 263 { 264 //does it have .../ following ??? 265 int end = name.indexOf( "/", index + 2 ); 266 267 if( -1 != end ) 268 { 269 result = end; 270 } 271 else 272 { 273 result = name.length(); 274 } 275 } 276 277 return result; 278 } 279 280 /*** 281 * Return a new instance of the base context for a URL. 282 * This must be implemented in particular URLContext. 283 * 284 * @param urlPart the part of url string not including "scheme:" 285 * @return a base URLContext for urlPart 286 * @exception NamingException if an error occurs 287 */ 288 protected abstract Context newContext( String urlPart ) 289 throws NamingException; 290 }

This page was automatically generated by Maven