View Javadoc

1   /*
2    *  jDTAUS Core Utilities
3    *  Copyright (C) 2005 Christian Schulte <cs@schulte.it>
4    *
5    *  This library is free software; you can redistribute it and/or
6    *  modify it under the terms of the GNU Lesser General Public
7    *  License as published by the Free Software Foundation; either
8    *  version 2.1 of the License, or any later version.
9    *
10   *  This library is distributed in the hope that it will be useful,
11   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13   *  Lesser General Public License for more details.
14   *
15   *  You should have received a copy of the GNU Lesser General Public
16   *  License along with this library; if not, write to the Free Software
17   *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18   *
19   *  $JDTAUS: EntityResolverChain.java 8716 2012-10-02 23:38:43Z schulte $
20   */
21  package org.jdtaus.core.sax.util;
22  
23  import java.io.IOException;
24  import java.util.Locale;
25  import org.jdtaus.core.container.ContainerFactory;
26  import org.jdtaus.core.logging.spi.Logger;
27  import org.xml.sax.EntityResolver;
28  import org.xml.sax.InputSource;
29  import org.xml.sax.SAXException;
30  
31  /**
32   * {@code EntityResolver} implementation backed by a chain of resolvers used
33   * for resolving entities.
34   *
35   * @author <a href="mailto:cs@schulte.it">Christian Schulte</a>
36   * @version $JDTAUS: EntityResolverChain.java 8716 2012-10-02 23:38:43Z schulte $
37   */
38  public final class EntityResolverChain implements EntityResolver
39  {
40      //--EntityResolver----------------------------------------------------------
41  
42      /**
43       * Resolves entities by querying all resolvers of the instance stopping at
44       * the first one not returning {@code null}.
45       *
46       * @param publicId The public identifier of the external entity being
47       * referenced, or {@code null} if none was supplied.
48       * @param systemId The system identifier of the external entity being
49       * referenced.
50       *
51       * @return An {@code InputSource} object describing the new input source, or
52       * {@code null} to request that the parser open a regular URI connection to
53       * the system identifier.
54       *
55       * @throws SAXException Any SAX exception, possibly wrapping another
56       * exception.
57       * @throws IOException A Java-specific IO exception, possibly the result of
58       * creating a new {@code InputStream} or {@code Reader} for the
59       * {@code InputSource}.
60       *
61       * @see EntityResolver#resolveEntity(java.lang.String, java.lang.String)
62       */
63      public InputSource resolveEntity( final String publicId,
64                                        final String systemId )
65          throws SAXException, IOException
66      {
67          InputSource inputSource = null;
68          for ( int i = this.getResolvers().length - 1;
69                i >= 0 && inputSource == null; i-- )
70          {
71              final EntityResolver resolver = this.getResolvers()[i];
72              inputSource = resolver.resolveEntity( publicId, systemId );
73          }
74  
75          return inputSource;
76      }
77  
78      //----------------------------------------------------------EntityResolver--
79      //--EntityResolverChain-----------------------------------------------------
80  
81      /** Chain of resolvers to use. */
82      private EntityResolver[] resolvers;
83  
84      /**
85       * Creates a new {@code EntityResolverChain} instance backed by any
86       * available {@code EntityResolver} implementation in the system.
87       */
88      public EntityResolverChain()
89      {
90          this( null );
91      }
92  
93      /**
94       * Creates a new {@code EntityResolverChain} instance taking an array of
95       * resolvers to use for resolving entities.
96       *
97       * @param resolvers The resolvers to use for resolving entities.
98       */
99      public EntityResolverChain( final EntityResolver[] resolvers )
100     {
101         super();
102 
103         if ( resolvers != null && resolvers.length > 0 )
104         {
105             this.resolvers = resolvers;
106         }
107     }
108 
109     /**
110      * Gets the resolvers of the instance.
111      *
112      * @return the resolvers used for resolving entities.
113      */
114     public EntityResolver[] getResolvers()
115     {
116         if ( this.resolvers == null )
117         {
118             this.resolvers = this.getDefaultResolvers();
119 
120             if ( this.resolvers.length == 0 )
121             {
122                 this.getLogger().warn(
123                     this.getNoEntityResolversMessage( this.getLocale() ) );
124 
125             }
126         }
127 
128         return this.resolvers;
129     }
130 
131     //-----------------------------------------------------EntityResolverChain--
132     //--Dependencies------------------------------------------------------------
133 
134 // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:jdtausDependencies
135     // This section is managed by jdtaus-container-mojo.
136 
137     /**
138      * Gets the configured <code>Logger</code> implementation.
139      *
140      * @return The configured <code>Logger</code> implementation.
141      */
142     private Logger getLogger()
143     {
144         return (Logger) ContainerFactory.getContainer().
145             getDependency( this, "Logger" );
146 
147     }
148 
149     /**
150      * Gets the configured <code>Locale</code> implementation.
151      *
152      * @return The configured <code>Locale</code> implementation.
153      */
154     private Locale getLocale()
155     {
156         return (Locale) ContainerFactory.getContainer().
157             getDependency( this, "Locale" );
158 
159     }
160 
161     /**
162      * Gets the configured <code>DefaultResolvers</code> implementation.
163      *
164      * @return The configured <code>DefaultResolvers</code> implementation.
165      */
166     private EntityResolver[] getDefaultResolvers()
167     {
168         return (EntityResolver[]) ContainerFactory.getContainer().
169             getDependency( this, "DefaultResolvers" );
170 
171     }
172 
173 // </editor-fold>//GEN-END:jdtausDependencies
174 
175     //------------------------------------------------------------Dependencies--
176     //--Messages----------------------------------------------------------------
177 
178 // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:jdtausMessages
179     // This section is managed by jdtaus-container-mojo.
180 
181     /**
182      * Gets the text of message <code>noEntityResolvers</code>.
183      * <blockquote><pre>Keine ''EntityResolver'' gefunden. Java XML-Parser öffnen standardmäßig reguläre - eventuell entfernte - URI-Verbindungen. Sie sollten mindestens eine ''EntityResolver''-Implementierung (z.B. jdtaus-core-entity-resolver-1.13.jar) zur Verfügung stellen.</pre></blockquote>
184      * <blockquote><pre>No entity resolvers found. Standard Java XML parsers fall back to opening regular - possibly remote - URI connections. You should provide at least one ''EntityResolver'' implementation (e.g. jdtaus-core-entity-resolver-1.13.jar).</pre></blockquote>
185      *
186      * @param locale The locale of the message instance to return.
187      *
188      * @return the text of message <code>noEntityResolvers</code>.
189      */
190     private String getNoEntityResolversMessage( final Locale locale )
191     {
192         return ContainerFactory.getContainer().
193             getMessage( this, "noEntityResolvers", locale, null );
194 
195     }
196 
197 // </editor-fold>//GEN-END:jdtausMessages
198 
199     //----------------------------------------------------------------Messages--
200 }