You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by ar...@apache.org on 2006/07/12 01:39:48 UTC

svn commit: r421030 - /db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/metadata/RepositoryPersistor.java

Author: arminw
Date: Tue Jul 11 16:39:48 2006
New Revision: 421030

URL: http://svn.apache.org/viewvc?rev=421030&view=rev
Log:
allow to set a custom EntityResolver, if not set use OJB's default EntityResolver - fix for OJB-117

Modified:
    db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/metadata/RepositoryPersistor.java

Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/metadata/RepositoryPersistor.java
URL: http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/metadata/RepositoryPersistor.java?rev=421030&r1=421029&r2=421030&view=diff
==============================================================================
--- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/metadata/RepositoryPersistor.java (original)
+++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/metadata/RepositoryPersistor.java Tue Jul 11 16:39:48 2006
@@ -37,6 +37,7 @@
 import org.apache.ojb.broker.util.logging.Logger;
 import org.apache.ojb.broker.util.logging.LoggerFactory;
 import org.xml.sax.ContentHandler;
+import org.xml.sax.EntityResolver;
 import org.xml.sax.ErrorHandler;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
@@ -55,6 +56,7 @@
     // TODO: Refactoring of the metadata reading/handling?
 
     private static Logger log = LoggerFactory.getLogger(RepositoryPersistor.class);
+    private EntityResolver entityResolver;
 
     public RepositoryPersistor()
     {
@@ -235,7 +237,7 @@
         parser needs a base url to find referenced entities.
         */
         // InputSource source = new InputSource(url.openStream());
-        
+
         String pathName = url.toExternalForm();
 
         log.info("Building repository from :" + pathName);
@@ -246,20 +248,20 @@
         InputStream in = conn.getInputStream();
         source.setByteStream(in);
         try
-		{
+        {
         	return readMetadataFromXML(source, targetRepository);
-		}
+        }
         finally
-		{
-        	try
-			{
-        		in.close();
-			}
-        	catch (IOException x)
-			{
+        {
+            try
+            {
+                in.close();
+            }
+            catch (IOException x)
+            {
                 log.warn("unable to close repository input stream [" + x.getMessage() + "]", x);
-			}
-		}
+            }
+        }
     }
 
     /**
@@ -271,7 +273,7 @@
     {
         // TODO: make this configurable
         boolean validate = false;
-        
+
         // get a xml reader instance:
         SAXParserFactory factory = SAXParserFactory.newInstance();
         log.info("RepositoryPersistor using SAXParserFactory : " + factory.getClass().getName());
@@ -281,11 +283,21 @@
         }
         SAXParser p = factory.newSAXParser();
         XMLReader reader = p.getXMLReader();
+
+        // use extended resolver
+        wrapResolver(reader);
+
         if (validate)
         {
             reader.setErrorHandler(new OJBErrorHandler());
         }
 
+        return createRepository(target, reader, source);
+    }
+
+    private Object createRepository(Class target, XMLReader reader, InputSource source)
+            throws IOException, SAXException
+    {
         Object result;
         if (DescriptorRepository.class.equals(target))
         {
@@ -316,7 +328,7 @@
         return result;
     }
 
-    private URL buildURL(String repositoryFileName) throws MalformedURLException
+    protected URL buildURL(String repositoryFileName) throws MalformedURLException
     {
         //j2ee compliant lookup of resources
         URL url = ClassHelper.getResource(repositoryFileName);
@@ -345,7 +357,115 @@
         return url;
     }
 
+    /**
+     * Override to change handling of specific
+     * {@link org.xml.sax.EntityResolver} implementations.
+     * If no {@link org.xml.sax.EntityResolver} was set with
+     * {@link #setEntityResolver(org.xml.sax.EntityResolver)}, this class
+     * use a default entity resolver implementation
+     * ({@link org.apache.ojb.broker.metadata.RepositoryPersistor.OjbEntityResolver}).
+     *
+     * @param reader The {@link org.xml.sax.XMLReader} used by this class.
+     */
+    protected void wrapResolver(XMLReader reader)
+    {
+        if(getEntityResolver() != null)
+        {
+            reader.setEntityResolver(getEntityResolver());
+        }
+        else
+        {
+            EntityResolver r = reader.getEntityResolver();
+            reader.setEntityResolver(new OjbEntityResolver(r));
+        }
+    }
+
+    /**
+     * Get the custom {@link org.xml.sax.EntityResolver}.
+     *
+     * @return The custom {@link org.xml.sax.EntityResolver} or <em>null</em>
+     * if not set (in this case OJB's entity resolver was used).
+     */
+    public EntityResolver getEntityResolver()
+    {
+        return entityResolver;
+    }
+
+    /**
+     * Set a custom {@link org.xml.sax.EntityResolver}.
+     * If not set OJB's entity resolver was used.
+     *
+     * @param entityResolver
+     */
+    public void setEntityResolver(EntityResolver entityResolver)
+    {
+        this.entityResolver = entityResolver;
+    }
+
+    //===================================================================
+    // inner class
+    //===================================================================
+
+    /**
+     * OJB's default {@link org.xml.sax.EntityResolver} implementation. If possible
+     * the resolver specified in class constructor is used, else the URI is used
+     * to create an {@link org.xml.sax.InputSource}.
+     */
+    class OjbEntityResolver implements EntityResolver
+    {
+        private EntityResolver resolver;
+
+        public OjbEntityResolver(EntityResolver resolver)
+        {
+            this.resolver = resolver;
+        }
+
+        public InputSource resolveEntity(String name, String uri) throws IOException, SAXException
+        {
+            InputSource result = null;
+            if(resolver != null)
+            {
+                try
+                {
+                    result = resolver.resolveEntity(name, uri);
+                }
+                catch(Exception e)
+                {
+                    log.warn("Default EntityResolver " + resolver + " can't resolve resource '" + uri
+                            + "', will use OJB's extended implementation to resolve entity", e);
+                }
+            }
+            if(result == null)
+            {
+                result = internalResolve(name, uri);
+            }
+            return result;
+        }
+
+        InputSource internalResolve(String name, String uri)
+        {
+            //System.out.println("uri: " + uri);
+            InputStream inputStream = ClassLoader.getSystemResourceAsStream(uri.substring(uri.lastIndexOf('/') + 1));
+            if(inputStream != null)
+            {
+                InputSource inputSource = new InputSource(inputStream);
+                inputSource.setSystemId(uri);
+                inputSource.setPublicId(name);
+                return inputSource;
+            }
+            else
+            {
+                return null;
+            }
+        }
+    }
+
+    //===================================================================
     // inner class
+    //===================================================================
+    /**
+     * OJB's simple error handler to log SAX error events.
+     */
     class OJBErrorHandler implements ErrorHandler
     {
         public void warning(SAXParseException exception)



---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org