From 78058843191d5cd36d6c2389d2e16fe7534f66e4 Mon Sep 17 00:00:00 2001 From: Adam Retter Date: Fri, 17 Aug 2012 22:51:41 +0000 Subject: [PATCH] [merge] merge of revisions 16954:16957 inclusive from old eXist Subversion repository (https://exist.svn.sourceforge.net/svnroot/exist/trunk/eXist) svn path=/trunk/eXist/; revision=16964 --- collection.xconf.init | 6 ++ .../exquery/restxq/impl/RestXqTrigger.java | 25 ++++++--- .../exquery/restxq/impl/XQueryCompiler.java | 2 +- nbproject/private/config.properties | 2 +- src/org/exist/storage/BrokerPool.java | 24 +++++--- src/org/exist/storage/NativeBroker.java | 56 +++++++++++++++++++ test/src/org/exist/xquery/XPathQueryTest.java | 47 ++++++++-------- 7 files changed, 121 insertions(+), 41 deletions(-) create mode 100644 collection.xconf.init diff --git a/collection.xconf.init b/collection.xconf.init new file mode 100644 index 00000000000..bf8885b25a5 --- /dev/null +++ b/collection.xconf.init @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/extensions/exquery/restxq/src/main/java/org/exist/extensions/exquery/restxq/impl/RestXqTrigger.java b/extensions/exquery/restxq/src/main/java/org/exist/extensions/exquery/restxq/impl/RestXqTrigger.java index 7fdea30903a..50b4f26120a 100644 --- a/extensions/exquery/restxq/src/main/java/org/exist/extensions/exquery/restxq/impl/RestXqTrigger.java +++ b/extensions/exquery/restxq/src/main/java/org/exist/extensions/exquery/restxq/impl/RestXqTrigger.java @@ -29,7 +29,9 @@ import java.util.*; import org.exist.collections.triggers.FilteringTrigger; import org.exist.collections.triggers.TriggerException; +import org.exist.dom.BinaryDocument; import org.exist.dom.DocumentImpl; +import org.exist.dom.DocumentMetadata; import org.exist.storage.DBBroker; import org.exist.storage.txn.Txn; import org.exist.xmldb.XmldbURI; @@ -116,14 +118,23 @@ private void deregisterServices(final DBBroker broker, final XmldbURI xqueryLoca } private List findServices(final DBBroker broker, final DocumentImpl document) throws TriggerException { - try { - final CompiledXQuery compiled = XQueryCompiler.compile(broker, document); - return XQueryInspector.findServices(compiled); - } catch(final RestXqServiceCompilationException rxsce) { - throw new TriggerException(rxsce.getMessage(), rxsce); - } catch(final ExQueryException eqe) { - throw new TriggerException(eqe.getMessage(), eqe); + + //ensure we have a binary document with the correct mimetype + if(document instanceof BinaryDocument) { + final DocumentMetadata metadata = document.getMetadata(); + if(metadata.getMimeType().equals(XQueryCompiler.XQUERY_MIME_TYPE)){ + try { + final CompiledXQuery compiled = XQueryCompiler.compile(broker, document); + return XQueryInspector.findServices(compiled); + } catch(final RestXqServiceCompilationException rxsce) { + throw new TriggerException(rxsce.getMessage(), rxsce); + } catch(final ExQueryException eqe) { + throw new TriggerException(eqe.getMessage(), eqe); + } + } } + + return new ArrayList(); } private RestXqServiceRegistry getRegistry(final DBBroker broker) { diff --git a/extensions/exquery/restxq/src/main/java/org/exist/extensions/exquery/restxq/impl/XQueryCompiler.java b/extensions/exquery/restxq/src/main/java/org/exist/extensions/exquery/restxq/impl/XQueryCompiler.java index b4a2a665203..ed18d26f77e 100644 --- a/extensions/exquery/restxq/src/main/java/org/exist/extensions/exquery/restxq/impl/XQueryCompiler.java +++ b/extensions/exquery/restxq/src/main/java/org/exist/extensions/exquery/restxq/impl/XQueryCompiler.java @@ -49,7 +49,7 @@ */ public class XQueryCompiler { - private final static String XQUERY_MIME_TYPE = "application/xquery"; + public final static String XQUERY_MIME_TYPE = "application/xquery"; public static CompiledXQuery compile(final DBBroker broker, final URI xqueryLocation) throws RestXqServiceCompilationException { diff --git a/nbproject/private/config.properties b/nbproject/private/config.properties index acb911eeaa3..284f1e57c30 100644 --- a/nbproject/private/config.properties +++ b/nbproject/private/config.properties @@ -1 +1 @@ -config=Jetty +config=InteractiveClient diff --git a/src/org/exist/storage/BrokerPool.java b/src/org/exist/storage/BrokerPool.java index 88a556cae7f..de2aa7f3e8c 100644 --- a/src/org/exist/storage/BrokerPool.java +++ b/src/org/exist/storage/BrokerPool.java @@ -35,6 +35,7 @@ import org.exist.collections.Collection; import org.exist.collections.CollectionCache; import org.exist.collections.CollectionConfiguration; +import org.exist.collections.CollectionConfigurationException; import org.exist.collections.CollectionConfigurationManager; import org.exist.collections.triggers.*; import org.exist.config.ConfigurationDocumentTrigger; @@ -896,12 +897,9 @@ protected void initialize() throws EXistException, DatabaseConfigurationExceptio statusReporter.setStatus(SIGNAL_READINESS); - //Get a manager to handle further collections configuration - try { - collectionConfigurationManager = new CollectionConfigurationManager(broker); - } catch (Exception e) { - LOG.error("Found an error while initializing database: " + e.getMessage(), e); - } + //Get a manager to handle further collections configuration + initCollectionConfigurationManager(broker); + //wake-up the plugins manager pluginManager.startUp(broker); @@ -1272,9 +1270,21 @@ public TransactionManager getTransactionManager() { * Returns a manager for accessing the database instance's collection configuration files. * @return The manager */ + @Override public CollectionConfigurationManager getConfigurationManager() { return collectionConfigurationManager; - } + } + + public void initCollectionConfigurationManager(final DBBroker broker) { + if(collectionConfigurationManager == null) { + try { + collectionConfigurationManager = new CollectionConfigurationManager(broker); + } catch(final Exception e) { + LOG.error("Found an error while initializing database: " + e.getMessage(), e); + } + } + } + /** * Returns a cache in which the database instance's collections are stored. diff --git a/src/org/exist/storage/NativeBroker.java b/src/org/exist/storage/NativeBroker.java index a7f73d41052..9f6184ac19f 100644 --- a/src/org/exist/storage/NativeBroker.java +++ b/src/org/exist/storage/NativeBroker.java @@ -50,6 +50,8 @@ import org.exist.collections.Collection.SubCollectionEntry; import org.exist.collections.CollectionCache; import org.exist.collections.CollectionConfiguration; +import org.exist.collections.CollectionConfigurationException; +import org.exist.collections.CollectionConfigurationManager; import org.exist.collections.triggers.CollectionTriggersVisitor; import org.exist.collections.triggers.DocumentTriggersVisitor; import org.exist.collections.triggers.TriggerException; @@ -187,6 +189,8 @@ public class NativeBroker extends DBBroker { public static int OFFSET_COLLECTION_ID = 0; public static int OFFSET_VALUE = OFFSET_COLLECTION_ID + Collection.LENGTH_COLLECTION_ID; //2 + public final static String INIT_COLLECTION_CONFIG = "collection.xconf.init"; + /** the database files */ protected CollectionStore collectionsDb; protected DOMFile domDb; @@ -633,6 +637,38 @@ private Collection createTempCollection(Txn transaction) } } + private final String readInitCollectionConfig() { + final File fInitCollectionConfig = new File(pool.getConfiguration().getExistHome(), INIT_COLLECTION_CONFIG); + if(fInitCollectionConfig.exists() && fInitCollectionConfig.isFile()) { + + InputStream is = null; + try { + final StringBuilder initCollectionConfig = new StringBuilder(); + + is = new FileInputStream(fInitCollectionConfig); + int read = -1; + byte buf[] = new byte[1024]; + while((read = is.read(buf)) != -1) { + initCollectionConfig.append(new String(buf, 0, read)); + } + + return initCollectionConfig.toString(); + } catch(final IOException ioe) { + LOG.error(ioe.getMessage(), ioe); + } finally { + if(is != null) { + try { + is.close(); + } catch(final IOException ioe) { + LOG.warn(ioe.getMessage(), ioe); + } + } + } + + }; + return null; + } + /* (non-Javadoc) * @see org.exist.storage.DBBroker#getOrCreateCollection(org.exist.storage.txn.Txn, org.exist.xmldb.XmldbURI) */ @@ -663,6 +699,26 @@ public Collection getOrCreateCollection(Txn transaction, XmldbURI name) throws P //TODO : acquire lock manually if transaction is null ? saveCollection(transaction, current); + + + //import an initial collection configuration + try { + final String initCollectionConfig = readInitCollectionConfig(); + if(initCollectionConfig != null) { + CollectionConfigurationManager collectionConfigurationManager = pool.getConfigurationManager(); + if(collectionConfigurationManager == null) { + //might not yet have been initialised + pool.initCollectionConfigurationManager(this); + collectionConfigurationManager = pool.getConfigurationManager(); + } + + if(collectionConfigurationManager != null) { + collectionConfigurationManager.addConfiguration(transaction, this, current, initCollectionConfig); + } + } + } catch(final CollectionConfigurationException cce) { + LOG.error("Could not load initial collection configuration for /db: " + cce.getMessage(), cce); + } } for(int i=1;i cl = Class.forName("org.exist.xmldb.DatabaseImpl"); - Database database = (Database) cl.newInstance(); - database.setProperty("create-database", "true"); - DatabaseManager.registerDatabase(database); - - Collection root = - DatabaseManager.getCollection( - uri, - "admin", - ""); - CollectionManagementService service = - (CollectionManagementService) root.getService( - "CollectionManagementService", - "1.0"); - testCollection = service.createCollection("test"); - assertNotNull(testCollection); - } catch (ClassNotFoundException e) { - } catch (InstantiationException e) { - } catch (IllegalAccessException e) { - } catch (XMLDBException e) { - e.printStackTrace(); } + + // initialize driver + Class cl = Class.forName("org.exist.xmldb.DatabaseImpl"); + Database database = (Database) cl.newInstance(); + database.setProperty("create-database", "true"); + DatabaseManager.registerDatabase(database); + + Collection root = + DatabaseManager.getCollection( + uri, + "admin", + ""); + CollectionManagementService service = + (CollectionManagementService) root.getService( + "CollectionManagementService", + "1.0"); + testCollection = service.createCollection("test"); + assertNotNull(testCollection); } private void initServer() { @@ -194,6 +190,7 @@ private void initServer() { } } + @Override protected void tearDown() throws Exception { try { TestUtils.cleanupDB();