1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 package org.jomc.modlet;
32
33 import java.security.AccessController;
34 import java.security.PrivilegedAction;
35 import java.text.MessageFormat;
36 import java.util.Locale;
37 import java.util.ResourceBundle;
38
39
40
41
42
43
44
45
46 public abstract class ModelContextFactory
47 {
48
49
50
51
52 private static final String DEFAULT_MODEL_CONTEXT_FACTORY_CLASS_NAME = "org.jomc.modlet.DefaultModelContextFactory";
53
54
55
56
57 private static final String MODEL_CONTEXT_FACTORY_CLASS_NAME_PROPERTY =
58 "org.jomc.modlet.ModelContextFactory";
59
60
61
62
63 protected ModelContextFactory()
64 {
65 super();
66 }
67
68
69
70
71
72
73
74
75
76
77
78
79
80 public static ModelContextFactory newInstance() throws ModelContextFactoryError
81 {
82 return newInstance( AccessController.doPrivileged( new PrivilegedAction<String>()
83 {
84
85 public String run()
86 {
87 return System.getProperty( MODEL_CONTEXT_FACTORY_CLASS_NAME_PROPERTY,
88 DEFAULT_MODEL_CONTEXT_FACTORY_CLASS_NAME );
89
90 }
91
92 } ) );
93 }
94
95
96
97
98
99
100
101
102
103
104
105 public static ModelContextFactory newInstance( final String factoryClassName ) throws ModelContextFactoryError
106 {
107 if ( factoryClassName == null )
108 {
109 throw new NullPointerException( "factoryClassName" );
110 }
111
112 try
113 {
114 final Class<?> factoryClass = Class.forName( factoryClassName );
115
116 if ( !ModelContextFactory.class.isAssignableFrom( factoryClass ) )
117 {
118 throw new ModelContextFactoryError( getMessage( "illegalFactory", factoryClassName,
119 ModelContextFactory.class.getName() ) );
120
121 }
122
123 return factoryClass.asSubclass( ModelContextFactory.class ).newInstance();
124 }
125 catch ( final ClassNotFoundException e )
126 {
127 throw new ModelContextFactoryError( getMessage( "classNotFound", factoryClassName ), e );
128 }
129 catch ( final InstantiationException e )
130 {
131 final String message = getMessage( e );
132 throw new ModelContextFactoryError( getMessage( "instantiationException", factoryClassName,
133 message != null ? " " + message : "" ), e );
134
135 }
136 catch ( final IllegalAccessException e )
137 {
138 final String message = getMessage( e );
139 throw new ModelContextFactoryError( getMessage( "accessDenied", factoryClassName,
140 message != null ? " " + message : "" ), e );
141
142 }
143 }
144
145
146
147
148
149
150 public abstract ModelContext newModelContext();
151
152
153
154
155
156
157
158
159
160 public abstract ModelContext newModelContext( final ClassLoader classLoader );
161
162 private static String getMessage( final String key, final Object... args )
163 {
164 return MessageFormat.format( ResourceBundle.getBundle( ModelContextFactory.class.getName().replace( '.', '/' ),
165 Locale.getDefault() ).getString( key ), args );
166
167 }
168
169 private static String getMessage( final Throwable t )
170 {
171 return t != null
172 ? t.getMessage() != null && t.getMessage().trim().length() > 0
173 ? t.getMessage()
174 : getMessage( t.getCause() )
175 : null;
176
177 }
178
179 }