EMMA Coverage Report (generated Wed Mar 26 15:19:37 CET 2014)
[all classes][org.jomc.modlet]

COVERAGE SUMMARY FOR SOURCE FILE [ModelContext.java]

nameclass, %method, %block, %line, %
ModelContext.java100% (2/2)97%  (31/32)85%  (799/937)87%  (162.6/186)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class ModelContext$Listener100% (1/1)100% (2/2)55%  (6/11)80%  (4/5)
onLog (Level, String, Throwable): void 100% (1/1)38%  (3/8)67%  (2/3)
ModelContext$Listener (): void 100% (1/1)100% (3/3)100% (2/2)
     
class ModelContext100% (1/1)97%  (29/30)86%  (793/926)88%  (158.6/181)
getAttributeNames (): Set 0%   (0/1)0%   (0/5)0%   (0/1)
setModletSchemaSystemId (String): void 100% (1/1)24%  (10/42)40%  (4/10)
createModelContext (ClassLoader): ModelContext 100% (1/1)79%  (150/190)88%  (19.3/22)
findResources (String): Enumeration 100% (1/1)79%  (42/53)76%  (6.8/9)
getModlets (): Modlets 100% (1/1)85%  (231/273)79%  (38.7/49)
findResource (String): URL 100% (1/1)93%  (42/45)97%  (6.8/7)
<static initializer> 100% (1/1)100% (3/3)100% (1/1)
ModelContext (): void 100% (1/1)100% (14/14)100% (5/5)
ModelContext (ClassLoader): void 100% (1/1)100% (14/14)100% (5/5)
clearAttribute (String): void 100% (1/1)100% (13/13)100% (4/4)
findClass (String): Class 100% (1/1)100% (26/26)100% (7/7)
getAttribute (String): Object 100% (1/1)100% (12/12)100% (3/3)
getAttribute (String, Object): Object 100% (1/1)100% (17/17)100% (6/6)
getClassLoader (): ClassLoader 100% (1/1)100% (14/14)100% (4/4)
getDefaultLogLevel (): Level 100% (1/1)100% (10/10)100% (3/3)
getDefaultModletSchemaSystemId (): String 100% (1/1)100% (8/8)100% (3/3)
getListeners (): List 100% (1/1)100% (11/11)100% (3/3)
getLogLevel (): Level 100% (1/1)100% (27/27)100% (5/5)
getMessage (String, Object []): String 100% (1/1)100% (12/12)100% (1/1)
getMessage (Throwable): String 100% (1/1)100% (19/19)100% (1/1)
getModelContextClassName (): String 100% (1/1)100% (9/9)100% (3/3)
getModletSchemaSystemId (): String 100% (1/1)100% (26/26)100% (5/5)
isLoggable (Level): boolean 100% (1/1)100% (17/17)100% (3/3)
log (Level, String, Throwable): void 100% (1/1)100% (29/29)100% (7/7)
setAttribute (String, Object): Object 100% (1/1)100% (20/20)100% (5/5)
setDefaultLogLevel (Level): void 100% (1/1)100% (3/3)100% (2/2)
setDefaultModletSchemaSystemId (String): void 100% (1/1)100% (3/3)100% (2/2)
setLogLevel (Level): void 100% (1/1)100% (4/4)100% (2/2)
setModelContextClassName (String): void 100% (1/1)100% (3/3)100% (2/2)
setModlets (Modlets): void 100% (1/1)100% (4/4)100% (2/2)

1/*
2 *   Copyright (C) Christian Schulte, 2005-206
3 *   All rights reserved.
4 *
5 *   Redistribution and use in source and binary forms, with or without
6 *   modification, are permitted provided that the following conditions
7 *   are met:
8 *
9 *     o Redistributions of source code must retain the above copyright
10 *       notice, this list of conditions and the following disclaimer.
11 *
12 *     o Redistributions in binary form must reproduce the above copyright
13 *       notice, this list of conditions and the following disclaimer in
14 *       the documentation and/or other materials provided with the
15 *       distribution.
16 *
17 *   THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
18 *   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
19 *   AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
20 *   THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT,
21 *   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 *   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 *   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 *   $JOMC: ModelContext.java 4931 2014-03-24 19:08:21Z schulte $
29 *
30 */
31package org.jomc.modlet;
32 
33import java.io.IOException;
34import java.lang.reflect.Constructor;
35import java.lang.reflect.InvocationTargetException;
36import java.net.URI;
37import java.net.URL;
38import java.text.MessageFormat;
39import java.util.Collections;
40import java.util.Enumeration;
41import java.util.HashMap;
42import java.util.LinkedList;
43import java.util.List;
44import java.util.Locale;
45import java.util.Map;
46import java.util.ResourceBundle;
47import java.util.Set;
48import java.util.logging.Level;
49import javax.xml.bind.JAXBContext;
50import javax.xml.bind.JAXBException;
51import javax.xml.bind.Marshaller;
52import javax.xml.bind.Unmarshaller;
53import javax.xml.bind.util.JAXBSource;
54import javax.xml.transform.Source;
55import javax.xml.validation.Validator;
56import org.w3c.dom.ls.LSResourceResolver;
57import org.xml.sax.EntityResolver;
58import org.xml.sax.SAXException;
59 
60/**
61 * Model context interface.
62 * <p><b>Use Cases:</b><br/><ul>
63 * <li>{@link #createContext(java.lang.String) }</li>
64 * <li>{@link #createContext(java.net.URI) }</li>
65 * <li>{@link #createEntityResolver(java.lang.String) }</li>
66 * <li>{@link #createEntityResolver(java.net.URI) }</li>
67 * <li>{@link #createMarshaller(java.lang.String) }</li>
68 * <li>{@link #createMarshaller(java.net.URI) }</li>
69 * <li>{@link #createResourceResolver(java.lang.String) }</li>
70 * <li>{@link #createResourceResolver(java.net.URI) }</li>
71 * <li>{@link #createSchema(java.lang.String) }</li>
72 * <li>{@link #createSchema(java.net.URI) }</li>
73 * <li>{@link #createUnmarshaller(java.lang.String) }</li>
74 * <li>{@link #createUnmarshaller(java.net.URI) }</li>
75 * <li>{@link #findModel(java.lang.String) }</li>
76 * <li>{@link #findModel(org.jomc.modlet.Model) }</li>
77 * <li>{@link #processModel(org.jomc.modlet.Model) }</li>
78 * <li>{@link #validateModel(org.jomc.modlet.Model) }</li>
79 * <li>{@link #validateModel(java.lang.String, javax.xml.transform.Source) }</li>
80 * </ul>
81 *
82 * @author <a href="mailto:cs@schulte.it">Christian Schulte</a>
83 * @version $JOMC: ModelContext.java 4931 2014-03-24 19:08:21Z schulte $
84 *
85 * @see ModelContextFactory
86 */
87public abstract class ModelContext
88{
89 
90    /** Listener interface. */
91    public abstract static class Listener
92    {
93 
94        /** Creates a new {@code Listener} instance. */
95        public Listener()
96        {
97            super();
98        }
99 
100        /**
101         * Gets called on logging.
102         *
103         * @param level The level of the event.
104         * @param message The message of the event or {@code null}.
105         * @param t The throwable of the event or {@code null}.
106         *
107         * @throws NullPointerException if {@code level} is {@code null}.
108         */
109        public void onLog( final Level level, final String message, final Throwable t )
110        {
111            if ( level == null )
112            {
113                throw new NullPointerException( "level" );
114            }
115        }
116 
117    }
118 
119    /**
120     * Default {@code http://jomc.org/modlet} namespace schema system id.
121     * @see #getDefaultModletSchemaSystemId()
122     */
123    private static final String DEFAULT_MODLET_SCHEMA_SYSTEM_ID =
124        "http://xml.jomc.org/modlet/jomc-modlet-1.3.xsd";
125 
126    /**
127     * Log level events are logged at by default.
128     * @see #getDefaultLogLevel()
129     */
130    private static final Level DEFAULT_LOG_LEVEL = Level.WARNING;
131 
132    /** Default log level. */
133    private static volatile Level defaultLogLevel;
134 
135    /** Default {@code http://jomc.org/model/modlet} namespace schema system id. */
136    private static volatile String defaultModletSchemaSystemId;
137 
138    /** Class name of the {@code ModelContext} implementation. */
139    @Deprecated
140    private static volatile String modelContextClassName;
141 
142    /** The attributes of the instance. */
143    private final Map<String, Object> attributes = new HashMap<String, Object>();
144 
145    /** The class loader of the instance. */
146    private ClassLoader classLoader;
147 
148    /**
149     * Flag indicating the {@code classLoader} field is initialized.
150     * @since 1.2
151     */
152    private boolean classLoaderSet;
153 
154    /** The listeners of the instance. */
155    private List<Listener> listeners;
156 
157    /** Log level of the instance. */
158    private Level logLevel;
159 
160    /** The {@code Modlets} of the instance. */
161    private Modlets modlets;
162 
163    /** Modlet namespace schema system id of the instance. */
164    private String modletSchemaSystemId;
165 
166    /**
167     * Creates a new {@code ModelContext} instance.
168     * @since 1.2
169     */
170    public ModelContext()
171    {
172        super();
173        this.classLoader = null;
174        this.classLoaderSet = false;
175    }
176 
177    /**
178     * Creates a new {@code ModelContext} instance taking a class loader.
179     *
180     * @param classLoader The class loader of the context.
181     *
182     * @see #getClassLoader()
183     */
184    public ModelContext( final ClassLoader classLoader )
185    {
186        super();
187        this.classLoader = classLoader;
188        this.classLoaderSet = true;
189    }
190 
191    /**
192     * Gets a set holding the names of all attributes of the context.
193     *
194     * @return An unmodifiable set holding the names of all attributes of the context.
195     *
196     * @see #clearAttribute(java.lang.String)
197     * @see #getAttribute(java.lang.String)
198     * @see #getAttribute(java.lang.String, java.lang.Object)
199     * @see #setAttribute(java.lang.String, java.lang.Object)
200     * @since 1.2
201     */
202    public Set<String> getAttributeNames()
203    {
204        return Collections.unmodifiableSet( this.attributes.keySet() );
205    }
206 
207    /**
208     * Gets an attribute of the context.
209     *
210     * @param name The name of the attribute to get.
211     *
212     * @return The value of the attribute with name {@code name}; {@code null} if no attribute matching {@code name} is
213     * found.
214     *
215     * @throws NullPointerException if {@code name} is {@code null}.
216     *
217     * @see #getAttribute(java.lang.String, java.lang.Object)
218     * @see #setAttribute(java.lang.String, java.lang.Object)
219     * @see #clearAttribute(java.lang.String)
220     */
221    public Object getAttribute( final String name )
222    {
223        if ( name == null )
224        {
225            throw new NullPointerException( "name" );
226        }
227 
228        return this.attributes.get( name );
229    }
230 
231    /**
232     * Gets an attribute of the context.
233     *
234     * @param name The name of the attribute to get.
235     * @param def The value to return if no attribute matching {@code name} is found.
236     *
237     * @return The value of the attribute with name {@code name}; {@code def} if no such attribute is found.
238     *
239     * @throws NullPointerException if {@code name} is {@code null}.
240     *
241     * @see #getAttribute(java.lang.String)
242     * @see #setAttribute(java.lang.String, java.lang.Object)
243     * @see #clearAttribute(java.lang.String)
244     */
245    public Object getAttribute( final String name, final Object def )
246    {
247        if ( name == null )
248        {
249            throw new NullPointerException( "name" );
250        }
251 
252        Object value = this.getAttribute( name );
253 
254        if ( value == null )
255        {
256            value = def;
257        }
258 
259        return value;
260    }
261 
262    /**
263     * Sets an attribute in the context.
264     *
265     * @param name The name of the attribute to set.
266     * @param value The value of the attribute to set.
267     *
268     * @return The previous value of the attribute with name {@code name}; {@code null} if no such value is found.
269     *
270     * @throws NullPointerException if {@code name} or {@code value} is {@code null}.
271     *
272     * @see #getAttribute(java.lang.String)
273     * @see #getAttribute(java.lang.String, java.lang.Object)
274     * @see #clearAttribute(java.lang.String)
275     */
276    public Object setAttribute( final String name, final Object value )
277    {
278        if ( name == null )
279        {
280            throw new NullPointerException( "name" );
281        }
282        if ( value == null )
283        {
284            throw new NullPointerException( "value" );
285        }
286 
287        return this.attributes.put( name, value );
288    }
289 
290    /**
291     * Removes an attribute from the context.
292     *
293     * @param name The name of the attribute to remove.
294     *
295     * @throws NullPointerException if {@code name} is {@code null}.
296     *
297     * @see #getAttribute(java.lang.String)
298     * @see #getAttribute(java.lang.String, java.lang.Object)
299     * @see #setAttribute(java.lang.String, java.lang.Object)
300     */
301    public void clearAttribute( final String name )
302    {
303        if ( name == null )
304        {
305            throw new NullPointerException( "name" );
306        }
307 
308        this.attributes.remove( name );
309    }
310 
311    /**
312     * Gets the class loader of the context.
313     *
314     * @return The class loader of the context or {@code null}, indicating the bootstrap class loader.
315     *
316     * @see #findClass(java.lang.String)
317     * @see #findResource(java.lang.String)
318     * @see #findResources(java.lang.String)
319     */
320    public ClassLoader getClassLoader()
321    {
322        if ( !this.classLoaderSet )
323        {
324            this.classLoader = this.getClass().getClassLoader();
325            this.classLoaderSet = true;
326        }
327 
328        return this.classLoader;
329    }
330 
331    /**
332     * Gets the listeners of the context.
333     * <p>This accessor method returns a reference to the live list, not a snapshot. Therefore any modification you make
334     * to the returned list will be present inside the object. This is why there is no {@code set} method for the
335     * listeners property.</p>
336     *
337     * @return The list of listeners of the context.
338     *
339     * @see #log(java.util.logging.Level, java.lang.String, java.lang.Throwable)
340     */
341    public List<Listener> getListeners()
342    {
343        if ( this.listeners == null )
344        {
345            this.listeners = new LinkedList<Listener>();
346        }
347 
348        return this.listeners;
349    }
350 
351    /**
352     * Gets the default {@code http://jomc.org/modlet} namespace schema system id.
353     * <p>The default {@code http://jomc.org/modlet} namespace schema system id is controlled by system property
354     * {@code org.jomc.modlet.ModelContext.defaultModletSchemaSystemId} holding a system id URI.
355     * If that property is not set, the {@code http://xml.jomc.org/modlet/jomc-modlet-1.3.xsd} default is
356     * returned.</p>
357     *
358     * @return The default system id of the {@code http://jomc.org/modlet} namespace schema.
359     *
360     * @see #setDefaultModletSchemaSystemId(java.lang.String)
361     */
362    public static String getDefaultModletSchemaSystemId()
363    {
364        if ( defaultModletSchemaSystemId == null )
365        {
366            defaultModletSchemaSystemId = System.getProperty(
367                "org.jomc.modlet.ModelContext.defaultModletSchemaSystemId", DEFAULT_MODLET_SCHEMA_SYSTEM_ID );
368 
369        }
370 
371        return defaultModletSchemaSystemId;
372    }
373 
374    /**
375     * Sets the default {@code http://jomc.org/modlet} namespace schema system id.
376     *
377     * @param value The new default {@code http://jomc.org/modlet} namespace schema system id or {@code null}.
378     *
379     * @see #getDefaultModletSchemaSystemId()
380     */
381    public static void setDefaultModletSchemaSystemId( final String value )
382    {
383        defaultModletSchemaSystemId = value;
384    }
385 
386    /**
387     * Gets the {@code http://jomc.org/modlet} namespace schema system id of the context.
388     *
389     * @return The {@code http://jomc.org/modlet} namespace schema system id of the context.
390     *
391     * @see #getDefaultModletSchemaSystemId()
392     * @see #setModletSchemaSystemId(java.lang.String)
393     */
394    public final String getModletSchemaSystemId()
395    {
396        if ( this.modletSchemaSystemId == null )
397        {
398            this.modletSchemaSystemId = getDefaultModletSchemaSystemId();
399 
400            if ( this.isLoggable( Level.CONFIG ) )
401            {
402                this.log( Level.CONFIG,
403                          getMessage( "defaultModletSchemaSystemIdInfo", this.modletSchemaSystemId ), null );
404 
405            }
406        }
407 
408        return this.modletSchemaSystemId;
409    }
410 
411    /**
412     * Sets the {@code http://jomc.org/modlet} namespace schema system id of the context.
413     *
414     * @param value The new {@code http://jomc.org/modlet} namespace schema system id or {@code null}.
415     *
416     * @see #getModletSchemaSystemId()
417     */
418    public final void setModletSchemaSystemId( final String value )
419    {
420        final String oldModletSchemaSystemId = this.getModletSchemaSystemId();
421        this.modletSchemaSystemId = value;
422 
423        if ( this.modlets != null )
424        {
425            for ( int i = 0, s0 = this.modlets.getModlet().size(); i < s0; i++ )
426            {
427                final Modlet m = this.modlets.getModlet().get( i );
428 
429                if ( m.getSchemas() != null )
430                {
431                    final Schema s = m.getSchemas().getSchemaBySystemId( oldModletSchemaSystemId );
432 
433                    if ( s != null )
434                    {
435                        s.setSystemId( value );
436                    }
437                }
438            }
439        }
440    }
441 
442    /**
443     * Gets the default log level events are logged at.
444     * <p>The default log level is controlled by system property
445     * {@code org.jomc.modlet.ModelContext.defaultLogLevel} holding the log level to log events at by default.
446     * If that property is not set, the {@code WARNING} default is returned.</p>
447     *
448     * @return The log level events are logged at by default.
449     *
450     * @see #getLogLevel()
451     * @see Level#parse(java.lang.String)
452     */
453    public static Level getDefaultLogLevel()
454    {
455        if ( defaultLogLevel == null )
456        {
457            defaultLogLevel = Level.parse( System.getProperty(
458                "org.jomc.modlet.ModelContext.defaultLogLevel", DEFAULT_LOG_LEVEL.getName() ) );
459 
460        }
461 
462        return defaultLogLevel;
463    }
464 
465    /**
466     * Sets the default log level events are logged at.
467     *
468     * @param value The new default level events are logged at or {@code null}.
469     *
470     * @see #getDefaultLogLevel()
471     */
472    public static void setDefaultLogLevel( final Level value )
473    {
474        defaultLogLevel = value;
475    }
476 
477    /**
478     * Gets the log level of the context.
479     *
480     * @return The log level of the context.
481     *
482     * @see #getDefaultLogLevel()
483     * @see #setLogLevel(java.util.logging.Level)
484     * @see #isLoggable(java.util.logging.Level)
485     */
486    public final Level getLogLevel()
487    {
488        if ( this.logLevel == null )
489        {
490            this.logLevel = getDefaultLogLevel();
491 
492            if ( this.isLoggable( Level.CONFIG ) )
493            {
494                this.log( Level.CONFIG, getMessage( "defaultLogLevelInfo", this.logLevel.getLocalizedName() ), null );
495            }
496        }
497 
498        return this.logLevel;
499    }
500 
501    /**
502     * Sets the log level of the context.
503     *
504     * @param value The new log level of the context or {@code null}.
505     *
506     * @see #getLogLevel()
507     * @see #isLoggable(java.util.logging.Level)
508     */
509    public final void setLogLevel( final Level value )
510    {
511        this.logLevel = value;
512    }
513 
514    /**
515     * Checks if a message at a given level is provided to the listeners of the context.
516     *
517     * @param level The level to test.
518     *
519     * @return {@code true}, if messages at {@code level} are provided to the listeners of the context; {@code false},
520     * if messages at {@code level} are not provided to the listeners of the context.
521     *
522     * @throws NullPointerException if {@code level} is {@code null}.
523     *
524     * @see #getLogLevel()
525     * @see #setLogLevel(java.util.logging.Level)
526     */
527    public boolean isLoggable( final Level level )
528    {
529        if ( level == null )
530        {
531            throw new NullPointerException( "level" );
532        }
533 
534        return level.intValue() >= this.getLogLevel().intValue();
535    }
536 
537    /**
538     * Notifies all listeners of the context.
539     *
540     * @param level The level of the event.
541     * @param message The message of the event or {@code null}.
542     * @param throwable The throwable of the event {@code null}.
543     *
544     * @throws NullPointerException if {@code level} is {@code null}.
545     *
546     * @see #getListeners()
547     * @see #isLoggable(java.util.logging.Level)
548     */
549    public void log( final Level level, final String message, final Throwable throwable )
550    {
551        if ( level == null )
552        {
553            throw new NullPointerException( "level" );
554        }
555 
556        if ( this.isLoggable( level ) )
557        {
558            for ( Listener l : this.getListeners() )
559            {
560                l.onLog( level, message, throwable );
561            }
562        }
563    }
564 
565    /**
566     * Gets the {@code Modlets} of the context.
567     * <p>If no {@code Modlets} have been set using the {@code setModlets} method, this method calls the
568     * {@code findModlets} method and the {@code processModlets} method to initialize the {@code Modlets} of the
569     * context.</p>
570     * <p>This accessor method returns a reference to the live list, not a snapshot. Therefore any modification you make
571     * to the returned list will be present inside the object.</p>
572     *
573     * @return The {@code Modlets} of the context.
574     *
575     * @throws ModelException if getting the {@code Modlets} of the context fails.
576     *
577     * @see #setModlets(org.jomc.modlet.Modlets)
578     * @see #findModlets(org.jomc.modlet.Modlets)
579     * @see #processModlets(org.jomc.modlet.Modlets)
580     */
581    public final Modlets getModlets() throws ModelException
582    {
583        try
584        {
585            if ( this.modlets == null )
586            {
587                final Modlet modlet = new Modlet();
588                modlet.setModel( ModletObject.MODEL_PUBLIC_ID );
589                modlet.setName( getMessage( "projectName" ) );
590                modlet.setVendor( getMessage( "projectVendor" ) );
591                modlet.setVersion( getMessage( "projectVersion" ) );
592                modlet.setSchemas( new Schemas() );
593 
594                final Schema schema = new Schema();
595                schema.setPublicId( ModletObject.MODEL_PUBLIC_ID );
596                schema.setSystemId( this.getModletSchemaSystemId() );
597                schema.setContextId( ModletObject.class.getPackage().getName() );
598                schema.setClasspathId( ModletObject.class.getPackage().getName().replace( '.', '/' )
599                                           + "/jomc-modlet-1.3.xsd" );
600 
601                modlet.getSchemas().getSchema().add( schema );
602 
603                this.modlets = new Modlets();
604                this.modlets.getModlet().add( modlet );
605 
606                long t0 = System.currentTimeMillis();
607                final Modlets provided = this.findModlets( this.modlets );
608 
609                if ( this.isLoggable( Level.FINE ) )
610                {
611                    this.log( Level.FINE, getMessage( "findModletsReport",
612                                                      provided != null ? provided.getModlet().size() : 0,
613                                                      System.currentTimeMillis() - t0 ), null );
614 
615                }
616 
617                if ( provided != null )
618                {
619                    this.modlets = provided;
620                }
621 
622                t0 = System.currentTimeMillis();
623                final Modlets processed = this.processModlets( this.modlets );
624 
625                if ( this.isLoggable( Level.FINE ) )
626                {
627                    this.log( Level.FINE, getMessage( "processModletsReport",
628                                                      processed != null ? processed.getModlet().size() : 0,
629                                                      System.currentTimeMillis() - t0 ), null );
630                }
631 
632                if ( processed != null )
633                {
634                    this.modlets = processed;
635                }
636 
637                t0 = System.currentTimeMillis();
638                final javax.xml.validation.Schema modletSchema = this.createSchema( ModletObject.MODEL_PUBLIC_ID );
639                final Validator validator = modletSchema.newValidator();
640                validator.validate( new JAXBSource( this.createContext( ModletObject.MODEL_PUBLIC_ID ),
641                                                    new ObjectFactory().createModlets( this.modlets ) ) );
642 
643                if ( this.isLoggable( Level.FINE ) )
644                {
645                    this.log( Level.FINE, getMessage( "validateModletsReport",
646                                                      this.modlets.getModlet().size(),
647                                                      System.currentTimeMillis() - t0 ), null );
648                }
649            }
650 
651            return this.modlets;
652        }
653        catch ( final IOException e )
654        {
655            this.modlets = null;
656            throw new ModelException( getMessage( e ), e );
657        }
658        catch ( final JAXBException e )
659        {
660            this.modlets = null;
661            String message = getMessage( e );
662            if ( message == null && e.getLinkedException() != null )
663            {
664                message = getMessage( e.getLinkedException() );
665            }
666 
667            throw new ModelException( message, e );
668        }
669        catch ( final SAXException e )
670        {
671            this.modlets = null;
672            String message = getMessage( e );
673            if ( message == null && e.getException() != null )
674            {
675                message = getMessage( e.getException() );
676            }
677 
678            throw new ModelException( message, e );
679        }
680    }
681 
682    /**
683     * Sets the {@code Modlets} of the context.
684     *
685     * @param value The new {@code Modlets} of the context or {@code null}.
686     *
687     * @see #getModlets()
688     */
689    public final void setModlets( final Modlets value )
690    {
691        this.modlets = value;
692    }
693 
694    /**
695     * Searches the context for a class with a given name.
696     *
697     * @param name The name of the class to search.
698     *
699     * @return A class object of the class with name {@code name} or {@code null}, if no such class is found.
700     *
701     * @throws NullPointerException if {@code name} is {@code null}.
702     * @throws ModelException if searching fails.
703     *
704     * @see #getClassLoader()
705     */
706    public Class<?> findClass( final String name ) throws ModelException
707    {
708        if ( name == null )
709        {
710            throw new NullPointerException( "name" );
711        }
712 
713        try
714        {
715            return Class.forName( name, false, this.getClassLoader() );
716        }
717        catch ( final ClassNotFoundException e )
718        {
719            if ( this.isLoggable( Level.FINE ) )
720            {
721                this.log( Level.FINE, getMessage( e ), e );
722            }
723 
724            return null;
725        }
726    }
727 
728    /**
729     * Searches the context for a resource with a given name.
730     *
731     * @param name The name of the resource to search.
732     *
733     * @return An URL object for reading the resource or {@code null}, if no such resource is found.
734     *
735     * @throws NullPointerException if {@code name} is {@code null}.
736     * @throws ModelException if searching fails.
737     *
738     * @see #getClassLoader()
739     */
740    public URL findResource( final String name ) throws ModelException
741    {
742        if ( name == null )
743        {
744            throw new NullPointerException( "name" );
745        }
746 
747        final long t0 = System.currentTimeMillis();
748        final URL resource = this.getClassLoader() == null
749                                 ? ClassLoader.getSystemResource( name )
750                                 : this.getClassLoader().getResource( name );
751 
752        if ( this.isLoggable( Level.FINE ) )
753        {
754            this.log( Level.FINE, getMessage( "resourcesReport", name, System.currentTimeMillis() - t0 ), null );
755        }
756 
757        return resource;
758    }
759 
760    /**
761     * Searches the context for resources with a given name.
762     *
763     * @param name The name of the resources to search.
764     *
765     * @return An enumeration of URL objects for reading the resources. If no resources are found, the enumeration will
766     * be empty.
767     *
768     * @throws NullPointerException if {@code name} is {@code null}.
769     * @throws ModelException if searching fails.
770     *
771     * @see #getClassLoader()
772     */
773    public Enumeration<URL> findResources( final String name ) throws ModelException
774    {
775        if ( name == null )
776        {
777            throw new NullPointerException( "name" );
778        }
779 
780        try
781        {
782            final long t0 = System.currentTimeMillis();
783            final Enumeration<URL> resources = this.getClassLoader() == null
784                                                   ? ClassLoader.getSystemResources( name )
785                                                   : this.getClassLoader().getResources( name );
786 
787            if ( this.isLoggable( Level.FINE ) )
788            {
789                this.log( Level.FINE, getMessage( "resourcesReport", name, System.currentTimeMillis() - t0 ), null );
790            }
791 
792            return resources;
793        }
794        catch ( final IOException e )
795        {
796            throw new ModelException( getMessage( e ), e );
797        }
798    }
799 
800    /**
801     * Searches the context for {@code Modlets}.
802     *
803     * @return The {@code Modlets} found in the context or {@code null}.
804     *
805     * @throws ModelException if searching {@code Modlets} fails.
806     *
807     * @see ModletProvider META-INF/services/org.jomc.modlet.ModletProvider
808     * @see #getModlets()
809     * @deprecated As of JOMC 1.6, replaced by {@link #findModlets(org.jomc.modlet.Modlets)}. This method will be
810     * removed in JOMC 2.0.
811     */
812    @Deprecated
813    public abstract Modlets findModlets() throws ModelException;
814 
815    /**
816     * Searches the context for {@code Modlets}.
817     *
818     * @param modlets The {@code Modlets} currently being searched.
819     *
820     * @return The {@code Modlets} found in the context or {@code null}.
821     *
822     * @throws NullPointerException if {@code modlets} is {@code null}.
823     * @throws ModelException if searching {@code Modlets} fails.
824     *
825     * @see ModletProvider META-INF/services/org.jomc.modlet.ModletProvider
826     * @see #getModlets()
827     * @since 1.6
828     */
829    public abstract Modlets findModlets( Modlets modlets ) throws ModelException;
830 
831    /**
832     * Processes a list of {@code Modlet}s.
833     *
834     * @param modlets The {@code Modlets} currently being processed.
835     *
836     * @return The processed {@code Modlets} or {@code null}.
837     *
838     * @throws NullPointerException if {@code modlets} is {@code null}.
839     * @throws ModelException if processing {@code Modlets} fails.
840     *
841     * @see ModletProcessor META-INF/services/org.jomc.modlet.ModletProcessor
842     * @see #getModlets()
843     * @since 1.6
844     */
845    public abstract Modlets processModlets( Modlets modlets ) throws ModelException;
846 
847    /**
848     * Creates a new {@code Model} instance.
849     *
850     * @param model The identifier of the {@code Model} to create.
851     *
852     * @return A new instance of the {@code Model} identified by {@code model}.
853     *
854     * @throws NullPointerException if {@code model} is {@code null}.
855     * @throws ModelException if creating a new {@code Model} instance fails.
856     *
857     * @see #createServiceObject(org.jomc.modlet.Service, java.lang.Class) createServiceObject( <i>service</i>, ModelProvider.class )
858     * @see ModletObject#MODEL_PUBLIC_ID
859     */
860    public abstract Model findModel( String model ) throws ModelException;
861 
862    /**
863     * Populates a given {@code Model} instance.
864     *
865     * @param model The {@code Model} to populate.
866     *
867     * @return The populated model.
868     *
869     * @throws NullPointerException if {@code model} is {@code null}.
870     * @throws ModelException if populating {@code model} fails.
871     *
872     * @see #createServiceObject(org.jomc.modlet.Service, java.lang.Class) createServiceObject( <i>service</i>, ModelProvider.class )
873     *
874     * @since 1.2
875     */
876    public abstract Model findModel( Model model ) throws ModelException;
877 
878    /**
879     * Gets the name of the class providing the default {@code ModelContext} implementation.
880     * <p>The name of the class providing the default {@code ModelContext} implementation returned by method
881     * {@link #createModelContext(java.lang.ClassLoader)} is controlled by system property
882     * {@code org.jomc.modlet.ModelContext.className}. If that property is not set, the name of the
883     * {@link org.jomc.modlet.DefaultModelContext} class is returned.</p>
884     *
885     * @return The name of the class providing the default {@code ModelContext} implementation.
886     *
887     * @see #setModelContextClassName(java.lang.String)
888     *
889     * @deprecated As of JOMC 1.2, replaced by class {@link ModelContextFactory}. This method will be removed in version
890     * 2.0.
891     */
892    @Deprecated
893    public static String getModelContextClassName()
894    {
895        if ( modelContextClassName == null )
896        {
897            modelContextClassName = System.getProperty( "org.jomc.modlet.ModelContext.className",
898                                                        DefaultModelContext.class.getName() );
899 
900        }
901 
902        return modelContextClassName;
903    }
904 
905    /**
906     * Sets the name of the class providing the default {@code ModelContext} implementation.
907     *
908     * @param value The new name of the class providing the default {@code ModelContext} implementation or {@code null}.
909     *
910     * @see #getModelContextClassName()
911     *
912     * @deprecated As of JOMC 1.2, replaced by class {@link ModelContextFactory}. This method will be removed in version
913     * 2.0.
914     */
915    @Deprecated
916    public static void setModelContextClassName( final String value )
917    {
918        modelContextClassName = value;
919    }
920 
921    /**
922     * Creates a new default {@code ModelContext} instance.
923     *
924     * @param classLoader The class loader to create a new default {@code ModelContext} instance with or {@code null},
925     * to create a new context using the platform's bootstrap class loader.
926     *
927     * @return A new {@code ModelContext} instance.
928     *
929     * @throws ModelException if creating a new {@code ModelContext} instance fails.
930     *
931     * @see #getModelContextClassName()
932     *
933     * @deprecated As of JOMC 1.2, replaced by method {@link ModelContextFactory#newModelContext(java.lang.ClassLoader)}.
934     * This method will be removed in version 2.0.
935     */
936    public static ModelContext createModelContext( final ClassLoader classLoader ) throws ModelException
937    {
938        if ( getModelContextClassName().equals( DefaultModelContext.class.getName() ) )
939        {
940            return new DefaultModelContext( classLoader );
941        }
942 
943        try
944        {
945            final Class<?> clazz = Class.forName( getModelContextClassName(), false, classLoader );
946 
947            if ( !ModelContext.class.isAssignableFrom( clazz ) )
948            {
949                throw new ModelException( getMessage( "illegalContextImplementation", getModelContextClassName(),
950                                                      ModelContext.class.getName() ) );
951 
952            }
953 
954            final Constructor<? extends ModelContext> ctor =
955                clazz.asSubclass( ModelContext.class ).getDeclaredConstructor( ClassLoader.class );
956 
957            return ctor.newInstance( classLoader );
958        }
959        catch ( final ClassNotFoundException e )
960        {
961            throw new ModelException( getMessage( "contextClassNotFound", getModelContextClassName() ), e );
962        }
963        catch ( final NoSuchMethodException e )
964        {
965            throw new ModelException( getMessage( "contextConstructorNotFound", getModelContextClassName() ), e );
966        }
967        catch ( final InstantiationException e )
968        {
969            final String message = getMessage( e );
970            throw new ModelException( getMessage( "contextInstantiationException", getModelContextClassName(),
971                                                  message != null ? " " + message : "" ), e );
972 
973        }
974        catch ( final IllegalAccessException e )
975        {
976            final String message = getMessage( e );
977            throw new ModelException( getMessage( "contextConstructorAccessDenied", getModelContextClassName(),
978                                                  message != null ? " " + message : "" ), e );
979 
980        }
981        catch ( final InvocationTargetException e )
982        {
983            String message = getMessage( e );
984            if ( message == null && e.getTargetException() != null )
985            {
986                message = getMessage( e.getTargetException() );
987            }
988 
989            throw new ModelException( getMessage( "contextConstructorException", getModelContextClassName(),
990                                                  message != null ? " " + message : "" ), e );
991 
992        }
993    }
994 
995    /**
996     * Creates a new service object.
997     *
998     * @param <T> The type of the service.
999     * @param service The service to create a new object of.
1000     * @param type The class of the type of the service.
1001     *
1002     * @return An new service object for {@code service}.
1003     *
1004     * @throws NullPointerException if {@code service} or {@code type} is {@code null}.
1005     * @throws ModelException if creating the service object fails.
1006     *
1007     * @see ModelProvider
1008     * @see ModelProcessor
1009     * @see ModelValidator
1010     *
1011     * @since 1.2
1012     */
1013    public abstract <T> T createServiceObject( final Service service, final Class<T> type ) throws ModelException;
1014 
1015    /**
1016     * Creates a new SAX entity resolver instance of a given model.
1017     *
1018     * @param model The identifier of the model to create a new SAX entity resolver of.
1019     *
1020     * @return A new SAX entity resolver instance of the model identified by {@code model}.
1021     *
1022     * @throws NullPointerException if {@code model} is {@code null}.
1023     * @throws ModelException if creating a new SAX entity resolver instance fails.
1024     *
1025     * @see ModletObject#MODEL_PUBLIC_ID
1026     */
1027    public abstract EntityResolver createEntityResolver( String model ) throws ModelException;
1028 
1029    /**
1030     * Creates a new SAX entity resolver instance for a given public identifier URI.
1031     *
1032     * @param publicId The public identifier URI to create a new SAX entity resolver for.
1033     *
1034     * @return A new SAX entity resolver instance for the public identifier URI {@code publicId}.
1035     *
1036     * @throws NullPointerException if {@code publicId} is {@code null}.
1037     * @throws ModelException if creating a new SAX entity resolver instance fails.
1038     *
1039     * @see ModletObject#PUBLIC_ID
1040     * @since 1.2
1041     */
1042    public abstract EntityResolver createEntityResolver( URI publicId ) throws ModelException;
1043 
1044    /**
1045     * Creates a new L/S resource resolver instance of a given model.
1046     *
1047     * @param model The identifier of the model to create a new L/S resource resolver of.
1048     *
1049     * @return A new L/S resource resolver instance of the model identified by {@code model}.
1050     *
1051     * @throws NullPointerException if {@code model} is {@code null}.
1052     * @throws ModelException if creating a new L/S resource resolver instance fails.
1053     *
1054     * @see ModletObject#MODEL_PUBLIC_ID
1055     */
1056    public abstract LSResourceResolver createResourceResolver( String model ) throws ModelException;
1057 
1058    /**
1059     * Creates a new L/S resource resolver instance for a given public identifier URI.
1060     *
1061     * @param publicId The public identifier URI to create a new L/S resource resolver for.
1062     *
1063     * @return A new L/S resource resolver instance for the public identifier URI {@code publicId}.
1064     *
1065     * @throws NullPointerException if {@code publicId} is {@code null}.
1066     * @throws ModelException if creating a new L/S resource resolver instance fails.
1067     *
1068     * @see ModletObject#PUBLIC_ID
1069     * @since 1.2
1070     */
1071    public abstract LSResourceResolver createResourceResolver( URI publicId ) throws ModelException;
1072 
1073    /**
1074     * Creates a new JAXP schema instance of a given model.
1075     *
1076     * @param model The identifier of the model to create a new JAXP schema instance of.
1077     *
1078     * @return A new JAXP schema instance of the model identified by {@code model}.
1079     *
1080     * @throws NullPointerException if {@code model} is {@code null}.
1081     * @throws ModelException if creating a new JAXP schema instance fails.
1082     *
1083     * @see ModletObject#MODEL_PUBLIC_ID
1084     */
1085    public abstract javax.xml.validation.Schema createSchema( String model ) throws ModelException;
1086 
1087    /**
1088     * Creates a new JAXP schema instance for a given public identifier URI.
1089     *
1090     * @param publicId The public identifier URI to create a new JAXP schema instance for.
1091     *
1092     * @return A new JAXP schema instance for the public identifier URI {@code publicId}.
1093     *
1094     * @throws NullPointerException if {@code publicId} is {@code null}.
1095     * @throws ModelException if creating a new JAXP schema instance fails.
1096     *
1097     * @see ModletObject#PUBLIC_ID
1098     * @since 1.2
1099     */
1100    public abstract javax.xml.validation.Schema createSchema( URI publicId ) throws ModelException;
1101 
1102    /**
1103     * Creates a new JAXB context instance of a given model.
1104     *
1105     * @param model The identifier of the model to create a new JAXB context instance of.
1106     *
1107     * @return A new JAXB context instance of the model identified by {@code model}.
1108     *
1109     * @throws NullPointerException if {@code model} is {@code null}.
1110     * @throws ModelException if creating a new JAXB context instance fails.
1111     *
1112     * @see ModletObject#MODEL_PUBLIC_ID
1113     */
1114    public abstract JAXBContext createContext( String model ) throws ModelException;
1115 
1116    /**
1117     * Creates a new JAXB context instance for a given public identifier URI.
1118     *
1119     * @param publicId The public identifier URI to create a new JAXB context instance for.
1120     *
1121     * @return A new JAXB context instance for the public identifier URI {@code publicId}.
1122     *
1123     * @throws NullPointerException if {@code publicId} is {@code null}.
1124     * @throws ModelException if creating a new JAXB context instance fails.
1125     *
1126     * @see ModletObject#PUBLIC_ID
1127     * @since 1.2
1128     */
1129    public abstract JAXBContext createContext( URI publicId ) throws ModelException;
1130 
1131    /**
1132     * Creates a new JAXB marshaller instance of a given model.
1133     *
1134     * @param model The identifier of the model to create a new JAXB marshaller instance of.
1135     *
1136     * @return A new JAXB marshaller instance of the model identified by {@code model}.
1137     *
1138     * @throws NullPointerException if {@code model} is {@code null}.
1139     * @throws ModelException if creating a new JAXB marshaller instance fails.
1140     *
1141     * @see ModletObject#MODEL_PUBLIC_ID
1142     */
1143    public abstract Marshaller createMarshaller( String model ) throws ModelException;
1144 
1145    /**
1146     * Creates a new JAXB marshaller instance for a given public identifier URI.
1147     *
1148     * @param publicId The public identifier URI to create a new JAXB marshaller instance for.
1149     *
1150     * @return A new JAXB marshaller instance for the public identifier URI {@code publicId}.
1151     *
1152     * @throws NullPointerException if {@code publicId} is {@code null}.
1153     * @throws ModelException if creating a new JAXB marshaller instance fails.
1154     *
1155     * @see ModletObject#PUBLIC_ID
1156     * @since 1.2
1157     */
1158    public abstract Marshaller createMarshaller( URI publicId ) throws ModelException;
1159 
1160    /**
1161     * Creates a new JAXB unmarshaller instance of a given model.
1162     *
1163     * @param model The identifier of the model to create a new JAXB unmarshaller instance of.
1164     *
1165     * @return A new JAXB unmarshaller instance of the model identified by {@code model}.
1166     *
1167     * @throws NullPointerException if {@code model} is {@code null}.
1168     * @throws ModelException if creating a new JAXB unmarshaller instance fails.
1169     *
1170     * @see ModletObject#MODEL_PUBLIC_ID
1171     */
1172    public abstract Unmarshaller createUnmarshaller( String model ) throws ModelException;
1173 
1174    /**
1175     * Creates a new JAXB unmarshaller instance for a given given public identifier URI.
1176     *
1177     * @param publicId The public identifier URI to create a new JAXB unmarshaller instance for.
1178     *
1179     * @return A new JAXB unmarshaller instance for the public identifier URI {@code publicId}.
1180     *
1181     * @throws NullPointerException if {@code publicId} is {@code null}.
1182     * @throws ModelException if creating a new JAXB unmarshaller instance fails.
1183     *
1184     * @see ModletObject#PUBLIC_ID
1185     * @since 1.2
1186     */
1187    public abstract Unmarshaller createUnmarshaller( URI publicId ) throws ModelException;
1188 
1189    /**
1190     * Processes a {@code Model}.
1191     *
1192     * @param model The {@code Model} to process.
1193     *
1194     * @return The processed {@code Model}.
1195     *
1196     * @throws NullPointerException if {@code model} is {@code null}.
1197     * @throws ModelException if processing {@code model} fails.
1198     *
1199     * @see #createServiceObject(org.jomc.modlet.Service, java.lang.Class) createServiceObject( <i>service</i>, ModelProcessor.class )
1200     */
1201    public abstract Model processModel( Model model ) throws ModelException;
1202 
1203    /**
1204     * Validates a given {@code Model}.
1205     *
1206     * @param model The {@code Model} to validate.
1207     *
1208     * @return Validation report.
1209     *
1210     * @throws NullPointerException if {@code model} is {@code null}.
1211     * @throws ModelException if validating the modules fails.
1212     *
1213     * @see #createServiceObject(org.jomc.modlet.Service, java.lang.Class) createServiceObject( <i>service</i>, ModelValidator.class )
1214     * @see ModelValidationReport#isModelValid()
1215     */
1216    public abstract ModelValidationReport validateModel( Model model ) throws ModelException;
1217 
1218    /**
1219     * Validates a given model.
1220     *
1221     * @param model The identifier of the {@code Model} to use for validating {@code source}.
1222     * @param source A source providing the model to validate.
1223     *
1224     * @return Validation report.
1225     *
1226     * @throws NullPointerException if {@code model} or {@code source} is {@code null}.
1227     * @throws ModelException if validating the model fails.
1228     *
1229     * @see #createSchema(java.lang.String)
1230     * @see ModelValidationReport#isModelValid()
1231     * @see ModletObject#MODEL_PUBLIC_ID
1232     */
1233    public abstract ModelValidationReport validateModel( String model, Source source ) throws ModelException;
1234 
1235    private static String getMessage( final String key, final Object... args )
1236    {
1237        return MessageFormat.format( ResourceBundle.getBundle(
1238            ModelContext.class.getName().replace( '.', '/' ), Locale.getDefault() ).getString( key ), args );
1239 
1240    }
1241 
1242    private static String getMessage( final Throwable t )
1243    {
1244        return t != null
1245               ? t.getMessage() != null && t.getMessage().trim().length() > 0
1246                 ? t.getMessage()
1247                 : getMessage( t.getCause() )
1248               : null;
1249 
1250    }
1251 
1252}

[all classes][org.jomc.modlet]
EMMA 2.1.5320 (stable) (C) Vladimir Roubtsov