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 <cs@schulte.it>, 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: ObjectManagerFactory.java 5061 2015-05-31 13:20:40Z schulte $
32   *
33   */
34  // </editor-fold>
35  // SECTION-END
36  package org.jomc;
37  
38  // SECTION-START[Documentation]
39  // <editor-fold defaultstate="collapsed" desc=" Generated Documentation ">
40  /**
41   * Factory for the {@code ObjectManager} singleton.
42   *
43   * <dl>
44   *   <dt><b>Identifier:</b></dt><dd>org.jomc.ObjectManagerFactory</dd>
45   *   <dt><b>Name:</b></dt><dd>JOMC ⁑ API</dd>
46   *   <dt><b>Abstract:</b></dt><dd>Yes</dd>
47   *   <dt><b>Final:</b></dt><dd>Yes</dd>
48   *   <dt><b>Stateless:</b></dt><dd>No</dd>
49   * </dl>
50   *
51   * @author <a href="mailto:cs@schulte.it">Christian Schulte</a> 1.0
52   * @version 1.0
53   */
54  // </editor-fold>
55  // SECTION-END
56  // SECTION-START[Annotations]
57  // <editor-fold defaultstate="collapsed" desc=" Generated Annotations ">
58  @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.9", comments = "See http://www.jomc.org/jomc/1.9/jomc-tools-1.9" )
59  // </editor-fold>
60  // SECTION-END
61  public abstract class ObjectManagerFactory
62  {
63      // SECTION-START[ObjectManagerFactory]
64  
65      /**
66       * Constant for the name of the class providing the default {@code getObjectManager()} method.
67       */
68      private static final String DEFAULT_FACTORY_CLASSNAME = "org.jomc.ri.DefaultObjectManager";
69  
70      /**
71       * Constant for the name of the class providing the default {@code ObjectManager} implementation.
72       */
73      private static final String DEFAULT_IMPLEMENTATION_CLASSNAME = "org.jomc.ri.DefaultObjectManager";
74  
75      /**
76       * Constant for the name of the system property holding the {@code getObjectManager()} method's class name.
77       */
78      private static final String SYS_FACTORY_CLASSNAME = "org.jomc.ObjectManagerFactory";
79  
80      /**
81       * Constant for the name of the system property holding the {@code ObjectManager} implementation class name.
82       */
83      private static final String SYS_IMPLEMENTATION_CLASSNAME = "org.jomc.ObjectManager";
84  
85      /**
86       * Gets the {@code ObjectManager} singleton instance.
87       * <p>
88       * This method is controlled by system property {@code org.jomc.ObjectManagerFactory} providing the name of a
89       * class declaring a <blockquote>{@code public static ObjectManager getObjectManager( ClassLoader )}</blockquote>
90       * method called by this method to get the instance to return.
91       * </p>
92       * <p>
93       * <b>Note:</b><br/>
94       * The {@code newObjectManager} method should be used by {@code getObjectManager} implementors to retrieve a new
95       * {@code ObjectManager} implementation.
96       * </p>
97       *
98       * @param classLoader The class loader to use for getting the singleton instance; {@code null} to use the platform's
99       * bootstrap class loader.
100      *
101      * @return The {@code ObjectManager} singleton instance.
102      *
103      * @see #newObjectManager(java.lang.ClassLoader)
104      *
105      * @throws ObjectManagementException if getting the singleton instance fails.
106      */
107     public static ObjectManager getObjectManager( final ClassLoader classLoader )
108     {
109         try
110         {
111             return (ObjectManager) Class.forName( System.getProperty(
112                 SYS_FACTORY_CLASSNAME, DEFAULT_FACTORY_CLASSNAME ), false, classLoader ).
113                 getMethod( "getObjectManager", ClassLoader.class ).invoke( null, classLoader );
114 
115         }
116         catch ( final Exception e )
117         {
118             throw new ObjectManagementException( getMessage( e ), e );
119         }
120     }
121 
122     /**
123      * Creates a new {@code ObjectManager} instance.
124      * <p>
125      * The object manager implementation returned by this method is controlled by system property
126      * {@code org.jomc.ObjectManager} providing the name of the {@code ObjectManager} implementation class to return
127      * a new instance of.
128      * </p>
129      *
130      * @param classLoader The class loader to use for creating the instance; {@code null} to use the platform's
131      * bootstrap class loader.
132      *
133      * @return A new {@code ObjectManager} instance.
134      *
135      * @throws ObjectManagementException if creating a new {@code ObjectManager} instance fails.
136      */
137     public static ObjectManager newObjectManager( final ClassLoader classLoader )
138     {
139         try
140         {
141             return Class.forName( System.getProperty(
142                 SYS_IMPLEMENTATION_CLASSNAME, DEFAULT_IMPLEMENTATION_CLASSNAME ), false, classLoader ).
143                 asSubclass( ObjectManager.class ).newInstance();
144 
145         }
146         catch ( final Exception e )
147         {
148             throw new ObjectManagementException( getMessage( e ), e );
149         }
150     }
151 
152     private static String getMessage( final Throwable t )
153     {
154         return t != null
155                    ? t.getMessage() != null && t.getMessage().trim().length() > 0
156                          ? t.getMessage()
157                          : getMessage( t.getCause() )
158                    : null;
159 
160     }
161 
162     // SECTION-END
163     // SECTION-START[Constructors]
164     // <editor-fold defaultstate="collapsed" desc=" Generated Constructors ">
165     /** Creates a new {@code ObjectManagerFactory} instance. */
166     @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.9", comments = "See http://www.jomc.org/jomc/1.9/jomc-tools-1.9" )
167     public ObjectManagerFactory()
168     {
169         // SECTION-START[Default Constructor]
170         super();
171         // SECTION-END
172     }
173     // </editor-fold>
174     // SECTION-END
175     // SECTION-START[Dependencies]
176     // SECTION-END
177     // SECTION-START[Properties]
178     // SECTION-END
179     // SECTION-START[Messages]
180     // SECTION-END
181 
182 }