View Javadoc

1   // SECTION-START[License Header]
2   // <editor-fold defaultstate="collapsed" desc=" Generated License ">
3   /*
4    *   Java Object Management and Configuration
5    *   Copyright (C) Christian Schulte, 2005-206
6    *   All rights reserved.
7    *
8    *   Redistribution and use in source and binary forms, with or without
9    *   modification, are permitted provided that the following conditions
10   *   are met:
11   *
12   *     o Redistributions of source code must retain the above copyright
13   *       notice, this list of conditions and the following disclaimer.
14   *
15   *     o Redistributions in binary form must reproduce the above copyright
16   *       notice, this list of conditions and the following disclaimer in
17   *       the documentation and/or other materials provided with the
18   *       distribution.
19   *
20   *   THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
21   *   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
22   *   AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
23   *   THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT,
24   *   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25   *   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26   *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27   *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28   *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29   *   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30   *
31   *   $JOMC: DefaultLocator.java 4381 2012-03-04 19:29:29Z schulte2005 $
32   *
33   */
34  // </editor-fold>
35  // SECTION-END
36  package org.jomc.ri;
37  
38  import java.io.IOException;
39  import java.net.URI;
40  import java.util.Locale;
41  import javax.naming.Context;
42  import javax.naming.InitialContext;
43  import javax.naming.NamingException;
44  import javax.rmi.PortableRemoteObject;
45  import org.jomc.spi.Locator;
46  
47  // SECTION-START[Documentation]
48  // <editor-fold defaultstate="collapsed" desc=" Generated Documentation ">
49  /**
50   * Default {@code Locator} implementation.
51   *
52   * <dl>
53   *   <dt><b>Identifier:</b></dt><dd>org.jomc.ri.DefaultLocator</dd>
54   *   <dt><b>Name:</b></dt><dd>JOMC RI</dd>
55   *   <dt><b>Abstract:</b></dt><dd>No</dd>
56   *   <dt><b>Final:</b></dt><dd>No</dd>
57   *   <dt><b>Stateless:</b></dt><dd>No</dd>
58   * </dl>
59   *
60   * @author <a href="mailto:schulte2005@users.sourceforge.net">Christian Schulte</a> 1.0
61   * @version 1.0
62   */
63  // </editor-fold>
64  // SECTION-END
65  // SECTION-START[Annotations]
66  // <editor-fold defaultstate="collapsed" desc=" Generated Annotations ">
67  @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.2.2", comments = "See http://jomc.sourceforge.net/jomc/1.2/jomc-tools-1.2.2" )
68  // </editor-fold>
69  // SECTION-END
70  public class DefaultLocator implements Locator
71  {
72      // SECTION-START[DefaultLocator]
73  
74      /** Constant for the {@code 'jndi'} URI scheme. */
75      private static final String JNDI_URI_SCHEME = "jndi";
76  
77      /** Constant for the {@code 'jndi+rmi'} URI scheme. */
78      private static final String JNDI_RMI_URI_SCHEME = "jndi+rmi";
79  
80      /** URI schemes supported by this {@code Locator} implementation. */
81      private static final String[] SUPPORTED_URI_SCHEMES =
82      {
83          JNDI_URI_SCHEME, JNDI_RMI_URI_SCHEME
84      };
85  
86      /** The JNDI context of the instance. */
87      private Context jndiContext;
88  
89      /**
90       * Gets a flag indicating support for a given location URI.
91       *
92       * @param location The location URI to test support for.
93       *
94       * @return {@code true}, if {@code location} is supported by this implementation; {@code false}, else.
95       *
96       * @throws NullPointerException if {@code location} is {@code null}.
97       */
98      public boolean isLocationSupported( final URI location )
99      {
100         if ( location == null )
101         {
102             throw new NullPointerException( "location" );
103         }
104 
105         for ( int i = SUPPORTED_URI_SCHEMES.length - 1; i >= 0; i-- )
106         {
107             if ( SUPPORTED_URI_SCHEMES[i].equals( location.getScheme() ) )
108             {
109                 return true;
110             }
111         }
112 
113         return false;
114     }
115 
116     /**
117      * Gets the JNDI context of the instance.
118      *
119      * @return The JNDI context of the instance.
120      *
121      * @throws NamingException if getting the context fails.
122      */
123     public Context getJndiContext() throws NamingException
124     {
125         if ( this.jndiContext == null )
126         {
127             this.jndiContext = new InitialContext();
128         }
129 
130         return this.jndiContext;
131     }
132 
133     /**
134      * Gets the JNDI name for a given location.
135      *
136      * @param location The location to get a JNDI name for.
137      *
138      * @return The JNDI name for {@code location}.
139      *
140      * @throws NullPointerException if {@code location} is {@code null}.
141      */
142     public String getJndiName( final URI location )
143     {
144         if ( location == null )
145         {
146             throw new NullPointerException( "location" );
147         }
148 
149         String name = location.getSchemeSpecificPart();
150         if ( name == null || name.replace( '/', ' ' ).trim().length() == 0 )
151         {
152             name = "";
153         }
154         if ( location.getFragment() != null )
155         {
156             name += '#' + location.getFragment();
157         }
158 
159         return name;
160     }
161 
162     public <T> T getObject( final Class<T> specification, final URI location ) throws IOException
163     {
164         if ( specification == null )
165         {
166             throw new NullPointerException( "specification" );
167         }
168         if ( location == null )
169         {
170             throw new NullPointerException( "location" );
171         }
172 
173         T object = null;
174 
175         try
176         {
177             final String scheme = location.getScheme();
178             if ( !this.isLocationSupported( location ) )
179             {
180                 throw new IOException( getUnsupportedUriSchemeMessage( Locale.getDefault(), location.getScheme() ) );
181             }
182 
183             final Object jndiObject = this.getJndiContext().lookup( this.getJndiName( location ) );
184 
185             if ( JNDI_URI_SCHEME.equals( scheme ) )
186             {
187                 object = (T) jndiObject;
188             }
189             else if ( JNDI_RMI_URI_SCHEME.equals( scheme ) )
190             {
191                 object = (T) PortableRemoteObject.narrow( jndiObject, specification );
192             }
193 
194             return object;
195         }
196         catch ( final NamingException e )
197         {
198             // JDK: As of JDK 6, "new IOException( message, cause )".
199             throw (IOException) new IOException( getMessage( e ) ).initCause( e );
200         }
201         catch ( final ClassCastException e )
202         {
203             // JDK: As of JDK 6, "new IOException( message, cause )".
204             throw (IOException) new IOException( getIllegalObjectMessage(
205                 Locale.getDefault(), object != null ? object.toString() : null,
206                 specification.getName() ) ).initCause( e );
207 
208         }
209     }
210 
211     private static String getMessage( final Throwable t )
212     {
213         return t != null ? t.getMessage() != null ? t.getMessage() : getMessage( t.getCause() ) : null;
214     }
215 
216     // SECTION-END
217     // SECTION-START[Constructors]
218     // <editor-fold defaultstate="collapsed" desc=" Generated Constructors ">
219     /** Creates a new {@code DefaultLocator} instance. */
220     @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.2.2", comments = "See http://jomc.sourceforge.net/jomc/1.2/jomc-tools-1.2.2" )
221     public DefaultLocator()
222     {
223         // SECTION-START[Default Constructor]
224         super();
225         // SECTION-END
226     }
227     // </editor-fold>
228     // SECTION-END
229     // SECTION-START[Dependencies]
230     // SECTION-END
231     // SECTION-START[Properties]
232     // SECTION-END
233     // SECTION-START[Messages]
234     // <editor-fold defaultstate="collapsed" desc=" Generated Messages ">
235     /**
236      * Gets the text of the {@code <illegalObjectMessage>} message.
237      * <p><dl>
238      *   <dt><b>Languages:</b></dt>
239      *     <dd>English (default)</dd>
240      *     <dd>Deutsch</dd>
241      *   <dt><b>Final:</b></dt><dd>No</dd>
242      * </dl></p>
243      * @param locale The locale of the message to return.
244      * @param objectInfo Format argument.
245      * @param classInfo Format argument.
246      * @return The text of the {@code <illegalObjectMessage>} message for {@code locale}.
247      * @throws org.jomc.ObjectManagementException if getting the message instance fails.
248      */
249     @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.2.2", comments = "See http://jomc.sourceforge.net/jomc/1.2/jomc-tools-1.2.2" )
250     private static String getIllegalObjectMessage( final java.util.Locale locale, final java.lang.String objectInfo, final java.lang.String classInfo )
251     {
252         java.io.BufferedReader reader = null;
253         boolean suppressExceptionOnClose = true;
254 
255         try
256         {
257             final String message = java.text.MessageFormat.format( java.util.ResourceBundle.getBundle( "org/jomc/ri/DefaultLocator", locale ).getString( "illegalObjectMessage" ), objectInfo, classInfo, (Object) null );
258             final java.lang.StringBuilder builder = new java.lang.StringBuilder( message.length() );
259             reader = new java.io.BufferedReader( new java.io.StringReader( message ) );
260             final String lineSeparator = System.getProperty( "line.separator", "\n" );
261 
262             String line;
263             while ( ( line = reader.readLine() ) != null )
264             {
265                 builder.append( lineSeparator ).append( line );
266             }
267 
268             suppressExceptionOnClose = false;
269             return builder.length() > 0 ? builder.substring( lineSeparator.length() ) : "";
270         }
271         catch( final java.lang.ClassCastException e )
272         {
273             throw new org.jomc.ObjectManagementException( e.getMessage(), e );
274         }
275         catch( final java.lang.IllegalArgumentException e )
276         {
277             throw new org.jomc.ObjectManagementException( e.getMessage(), e );
278         }
279         catch( final java.util.MissingResourceException e )
280         {
281             throw new org.jomc.ObjectManagementException( e.getMessage(), e );
282         }
283         catch( final java.io.IOException e )
284         {
285             throw new org.jomc.ObjectManagementException( e.getMessage(), e );
286         }
287         finally
288         {
289             try
290             {
291                 if( reader != null )
292                 {
293                     reader.close();
294                 }
295             }
296             catch( final java.io.IOException e )
297             {
298                 if( !suppressExceptionOnClose )
299                 {
300                     throw new org.jomc.ObjectManagementException( e.getMessage(), e );
301                 }
302             }
303         }
304     }
305     /**
306      * Gets the text of the {@code <unsupportedUriSchemeMessage>} message.
307      * <p><dl>
308      *   <dt><b>Languages:</b></dt>
309      *     <dd>English (default)</dd>
310      *     <dd>Deutsch</dd>
311      *   <dt><b>Final:</b></dt><dd>No</dd>
312      * </dl></p>
313      * @param locale The locale of the message to return.
314      * @param schemeInfo Format argument.
315      * @return The text of the {@code <unsupportedUriSchemeMessage>} message for {@code locale}.
316      * @throws org.jomc.ObjectManagementException if getting the message instance fails.
317      */
318     @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.2.2", comments = "See http://jomc.sourceforge.net/jomc/1.2/jomc-tools-1.2.2" )
319     private static String getUnsupportedUriSchemeMessage( final java.util.Locale locale, final java.lang.String schemeInfo )
320     {
321         java.io.BufferedReader reader = null;
322         boolean suppressExceptionOnClose = true;
323 
324         try
325         {
326             final String message = java.text.MessageFormat.format( java.util.ResourceBundle.getBundle( "org/jomc/ri/DefaultLocator", locale ).getString( "unsupportedUriSchemeMessage" ), schemeInfo, (Object) null );
327             final java.lang.StringBuilder builder = new java.lang.StringBuilder( message.length() );
328             reader = new java.io.BufferedReader( new java.io.StringReader( message ) );
329             final String lineSeparator = System.getProperty( "line.separator", "\n" );
330 
331             String line;
332             while ( ( line = reader.readLine() ) != null )
333             {
334                 builder.append( lineSeparator ).append( line );
335             }
336 
337             suppressExceptionOnClose = false;
338             return builder.length() > 0 ? builder.substring( lineSeparator.length() ) : "";
339         }
340         catch( final java.lang.ClassCastException e )
341         {
342             throw new org.jomc.ObjectManagementException( e.getMessage(), e );
343         }
344         catch( final java.lang.IllegalArgumentException e )
345         {
346             throw new org.jomc.ObjectManagementException( e.getMessage(), e );
347         }
348         catch( final java.util.MissingResourceException e )
349         {
350             throw new org.jomc.ObjectManagementException( e.getMessage(), e );
351         }
352         catch( final java.io.IOException e )
353         {
354             throw new org.jomc.ObjectManagementException( e.getMessage(), e );
355         }
356         finally
357         {
358             try
359             {
360                 if( reader != null )
361                 {
362                     reader.close();
363                 }
364             }
365             catch( final java.io.IOException e )
366             {
367                 if( !suppressExceptionOnClose )
368                 {
369                     throw new org.jomc.ObjectManagementException( e.getMessage(), e );
370                 }
371             }
372         }
373     }
374     // </editor-fold>
375     // SECTION-END
376 }