From 15fcd079971094f508d63b3970e35f360b752686 Mon Sep 17 00:00:00 2001 From: Derek Hulley Date: Mon, 1 Sep 2008 13:26:52 +0000 Subject: [PATCH] Merged V2.9 to HEAD 9848: Merged V2.2 to V2.9 9610: Fixed ETWOTWO-548 10232: Merged V2.2 to V2.9 10231: Merged V2.1 to V2.2 10229: Merged V2.1-A to V2.1 10227: https://issues.alfresco.com/jira/browse/ADB-106 10530: Merged V2.2 to V2.9 9847: Applied patch for ETWOTWO-542 (supplied by Peter Monks) 9897: Fix for ETWOTWO-302: Alphabetise advanced workflow names 9901: Fixed ETWOTWO-426: V2.2 upgrade problems with MySQL 5.0.51 9902: Fix for ETWOTWO-438: Versionable aspect and add-content permissions 9905: Fix ETWOTWO-560 9912: Increased test wait iterations from 10 (10s) to 100 (100s). 9919: Part fix for ACT-3574: Added close for schema bootstrap connection git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@10612 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../AlfrescoSchemaUpdate-2.2-ACL.sql | 2 +- .../upgrade-2-move-qnames.sql | 6 +- .../org/alfresco/repo/avm/AVMInterpreter.java | 6 +- source/java/org/alfresco/repo/avm/Issuer.java | 63 ++-- .../org/alfresco/repo/avm/OrphanReaper.java | 156 +++++---- .../descriptor/DescriptorServiceImpl.java | 285 ++++++++++------ .../DictionaryRepositoryBootstrap.java | 2 +- .../repo/domain/schema/SchemaBootstrap.java | 14 +- .../repo/importer/ImporterBootstrap.java | 2 +- .../repo/rule/RuleServiceCoverageTest.java | 2 +- .../alfresco/repo/rule/RuleServiceImpl.java | 7 +- .../search/impl/lucene/ADMLuceneTest.java | 180 +++++++++- .../search/impl/lucene/LuceneQueryParser.java | 316 ++++++++++++------ 13 files changed, 720 insertions(+), 321 deletions(-) diff --git a/config/alfresco/dbscripts/upgrade/2.2/org.hibernate.dialect.MySQLInnoDBDialect/AlfrescoSchemaUpdate-2.2-ACL.sql b/config/alfresco/dbscripts/upgrade/2.2/org.hibernate.dialect.MySQLInnoDBDialect/AlfrescoSchemaUpdate-2.2-ACL.sql index f7869b0d8c..5063db87bf 100644 --- a/config/alfresco/dbscripts/upgrade/2.2/org.hibernate.dialect.MySQLInnoDBDialect/AlfrescoSchemaUpdate-2.2-ACL.sql +++ b/config/alfresco/dbscripts/upgrade/2.2/org.hibernate.dialect.MySQLInnoDBDialect/AlfrescoSchemaUpdate-2.2-ACL.sql @@ -139,7 +139,7 @@ UPDATE alf_acl_member mem -- Remove duplicate aces the mysql way (as you can not use the deleted table in the where clause ...) CREATE TABLE tmp_to_delete SELECT ace.id FROM alf_acl_member mem RIGHT OUTER JOIN alf_access_control_entry ace ON mem.ace_id = ace.id WHERE mem.ace_id IS NULL; -DELETE FROM alf_access_control_entry USING alf_access_control_entry JOIN tmp_to_delete t ON alf_access_control_entry.id = t.id; +DELETE FROM ace USING alf_access_control_entry ace JOIN tmp_to_delete t ON ace.id = t.id; DROP TABLE tmp_to_delete; -- Add constraint for duplicate acls diff --git a/config/alfresco/dbscripts/upgrade/2.2/org.hibernate.dialect.MySQLInnoDBDialect/upgrade-2-move-qnames.sql b/config/alfresco/dbscripts/upgrade/2.2/org.hibernate.dialect.MySQLInnoDBDialect/upgrade-2-move-qnames.sql index 54345cf85a..40df8d8156 100644 --- a/config/alfresco/dbscripts/upgrade/2.2/org.hibernate.dialect.MySQLInnoDBDialect/upgrade-2-move-qnames.sql +++ b/config/alfresco/dbscripts/upgrade/2.2/org.hibernate.dialect.MySQLInnoDBDialect/upgrade-2-move-qnames.sql @@ -198,9 +198,9 @@ INSERT INTO t_dup_aspects (node_id, qname_id) HAVING count(*) > 1 ); -DELETE FROM alf_node_aspects na - USING alf_node_aspects na - JOIN t_dup_aspects t ON (t.node_id = na.node_id AND t.qname_id = na.qname_id); +DELETE FROM na + USING alf_node_aspects na + JOIN t_dup_aspects t ON (t.node_id = na.node_id AND t.qname_id = na.qname_id); INSERT INTO alf_node_aspects (node_id, qname_id) ( SELECT diff --git a/source/java/org/alfresco/repo/avm/AVMInterpreter.java b/source/java/org/alfresco/repo/avm/AVMInterpreter.java index 9f4491d722..0290072327 100644 --- a/source/java/org/alfresco/repo/avm/AVMInterpreter.java +++ b/source/java/org/alfresco/repo/avm/AVMInterpreter.java @@ -558,9 +558,9 @@ public class AVMInterpreter for (AVMNodeDescriptor node : history) { out.println(node); - out.println("Version: " + desc.getVersionID()); - out.println("Owner: " + desc.getOwner()); - out.println("Mod Time: " + new Date(desc.getModDate())); + out.println("Version: " + node.getVersionID()); + out.println("Owner: " + node.getOwner()); + out.println("Mod Time: " + new Date(node.getModDate())); } } /* diff --git a/source/java/org/alfresco/repo/avm/Issuer.java b/source/java/org/alfresco/repo/avm/Issuer.java index 8ef2f72d56..ef787c70f7 100644 --- a/source/java/org/alfresco/repo/avm/Issuer.java +++ b/source/java/org/alfresco/repo/avm/Issuer.java @@ -28,6 +28,7 @@ import org.alfresco.service.transaction.TransactionService; /** * This is a helper class that knows how to issue identifiers. + * * @author britt */ public class Issuer @@ -81,41 +82,45 @@ public class Issuer public void init() { - fTxnService.getRetryingTransactionHelper().doInTransaction( - new RetryingTransactionCallback() + if (!fTxnService.isReadOnly()) { - public Object execute() + fTxnService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback() { - IssuerID issuerID = fIDDAO.get(fName); - Long id = fIssuerDAO.getIssuerValue(fName); - if (issuerID == null || id == null || id >= issuerID.getNext()) + public Object execute() { - if (id == null) + IssuerID issuerID = fIDDAO.get(fName); + Long id = fIssuerDAO.getIssuerValue(fName); + if (issuerID == null || id == null || id >= issuerID.getNext()) { - id = 0L; - } - else - { - id = id + 1L; - } - if (issuerID == null) - { - issuerID = new IssuerIDImpl(fName, id); - fIDDAO.save(issuerID); - } - else - { - issuerID.setNext(id); + if (id == null) + { + id = 0L; + } + else + { + id = id + 1L; + } + if (issuerID == null) + { + issuerID = new IssuerIDImpl(fName, id); + fIDDAO.save(issuerID); + } + else + { + issuerID.setNext(id); + } } + return null; } - return null; - } - }); + }); + } } /** * Set the name of this issuer. For Spring. - * @param name The name to set. + * + * @param name + * The name to set. */ public void setName(String name) { @@ -124,6 +129,7 @@ public class Issuer /** * Issue the next number. + * * @return A serial number. */ public synchronized long issue() @@ -153,13 +159,14 @@ public class Issuer public long fLast; - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see java.lang.Runnable#run() */ public void run() { - fTxnService.getRetryingTransactionHelper().doInTransaction( - new RetryingTransactionCallback() + fTxnService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback() { public Object execute() { diff --git a/source/java/org/alfresco/repo/avm/OrphanReaper.java b/source/java/org/alfresco/repo/avm/OrphanReaper.java index 736eb0cb6a..29aec69fb1 100644 --- a/source/java/org/alfresco/repo/avm/OrphanReaper.java +++ b/source/java/org/alfresco/repo/avm/OrphanReaper.java @@ -35,8 +35,9 @@ import org.hibernate.SessionFactory; import org.springframework.orm.hibernate3.HibernateTemplate; /** - * This is the background thread for reaping no longer referenced nodes - * in the AVM repository. These orphans arise from purge operations. + * This is the background thread for reaping no longer referenced nodes in the AVM repository. These orphans arise from + * purge operations. + * * @author britt */ public class OrphanReaper @@ -68,7 +69,8 @@ public class OrphanReaper { // Do nothing. } - } while (fActive); + } + while (fActive); } finally { @@ -79,48 +81,47 @@ public class OrphanReaper } } - private Log fgLogger = LogFactory.getLog(OrphanReaper.class); + private Log fgLogger = LogFactory.getLog(OrphanReaper.class); /** * The Transaction Service */ private TransactionService fTransactionService; - + /** * The Session Factory */ private SessionFactory fSessionFactory; - + /** * Active base sleep interval. */ private long fActiveBaseSleep; - + /** * Batch size. */ private int fBatchSize; - + /** - * Whether we are currently active, ie have - * work queued up. + * Whether we are currently active, ie have work queued up. */ private boolean fActive; - + /** * The maximum length of the queue. */ private int fQueueLength; - + /** * The linked list containing ids of nodes that are purgable. */ private LinkedList fPurgeQueue; - + private boolean fDone = false; - + private boolean fRunning = false; - + /** * Create one with default parameters. */ @@ -131,21 +132,25 @@ public class OrphanReaper fQueueLength = 1000; fActive = false; } - + // Setters for configuration. - + /** * Set the active base sleep interval. - * @param interval The interval to set in ms. + * + * @param interval + * The interval to set in ms. */ public void setActiveBaseSleep(long interval) { fActiveBaseSleep = interval; } - + /** * Set the batch size. - * @param size The batch size to set. + * + * @param size + * The batch size to set. */ public void setBatchSize(int size) { @@ -154,90 +159,92 @@ public class OrphanReaper /** * Set the transaction service. - * @param transactionService The service. + * + * @param transactionService + * The service. */ public void setTransactionService(TransactionService transactionService) { fTransactionService = transactionService; } - + /** * Set the hibernate session factory. (For Spring.) + * * @param sessionFactory */ public void setSessionFactory(SessionFactory sessionFactory) { fSessionFactory = sessionFactory; } - + /** * Set the maximum size of the queue of purgeable nodes. - * @param queueLength The max length. + * + * @param queueLength + * The max length. */ public void setMaxQueueLength(int queueLength) { fQueueLength = queueLength; } - + /** * Start things up after configuration is complete. */ -// public void init() -// { -// fThread = new Thread(this); -// fThread.start(); -// } - + // public void init() + // { + // fThread = new Thread(this); + // fThread.start(); + // } /** - * Shutdown the reaper. This needs to be called when - * the application shuts down. + * Shutdown the reaper. This needs to be called when the application shuts down. */ public void shutDown() { fDone = true; } - + /** - * Sit in a loop, periodically querying for orphans. When orphans - * are found, unhook them in bite sized batches. + * Sit in a loop, periodically querying for orphans. When orphans are found, unhook them in bite sized batches. */ -// public void run() -// { -// while (!fDone) -// { -// synchronized (this) -// { -// try -// { -// wait(fActive? fActiveBaseSleep : fInactiveBaseSleep); -// } -// catch (InterruptedException ie) -// { -// // Do nothing. -// } -// doBatch(); -// } -// } -// } - + // public void run() + // { + // while (!fDone) + // { + // synchronized (this) + // { + // try + // { + // wait(fActive? fActiveBaseSleep : fInactiveBaseSleep); + // } + // catch (InterruptedException ie) + // { + // // Do nothing. + // } + // doBatch(); + // } + // } + // } /** - * This is really for debugging and testing. Allows another thread to - * mark the orphan reaper busy so that it can monitor for it's being done. + * This is really for debugging and testing. Allows another thread to mark the orphan reaper busy so that it can + * monitor for it's being done. */ public void activate() { fActive = true; } - + /** * See if the reaper is actively reaping. + * * @return Whether this is actively reaping. */ public boolean isActive() { return fActive; } - + /** * Do a batch of cleanup work. */ @@ -245,8 +252,7 @@ public class OrphanReaper { class TxnWork implements RetryingTransactionCallback { - public Object execute() - throws Exception + public Object execute() throws Exception { if (fPurgeQueue == null) { @@ -309,29 +315,28 @@ public class OrphanReaper // Get rid of all properties belonging to this node. // AVMDAOs.Instance().fAVMNodePropertyDAO.deleteAll(node); // Get rid of all aspects belonging to this node. -// AVMDAOs.Instance().fAVMAspectNameDAO.delete(node); + // AVMDAOs.Instance().fAVMAspectNameDAO.delete(node); // Get rid of ACL. DbAccessControlList acl = node.getAcl(); node.setAcl(null); // Unused acls will be garbage collected // Many acls will be shared // Extra work for directories. - if (node.getType() == AVMNodeType.PLAIN_DIRECTORY || - node.getType() == AVMNodeType.LAYERED_DIRECTORY) + if (node.getType() == AVMNodeType.PLAIN_DIRECTORY || node.getType() == AVMNodeType.LAYERED_DIRECTORY) { // First get rid of all child entries for the node. AVMDAOs.Instance().fChildEntryDAO.deleteByParent(node); } // This is not on, since content urls can be shared. -// else if (node.getType() == AVMNodeType.PLAIN_FILE) -// { -// PlainFileNode file = (PlainFileNode)node; -// String url = file.getContentData(null).getContentUrl(); -// if (url != null) -// { -// RawServices.Instance().getContentStore().delete(url); -// } -// } + // else if (node.getType() == AVMNodeType.PLAIN_FILE) + // { + // PlainFileNode file = (PlainFileNode)node; + // String url = file.getContentData(null).getContentUrl(); + // if (url != null) + // { + // RawServices.Instance().getContentStore().delete(url); + // } + // } AVMDAOs.Instance().fAVMNodeDAO.delete(node); } return null; @@ -339,7 +344,10 @@ public class OrphanReaper } try { - fTransactionService.getRetryingTransactionHelper().doInTransaction(new TxnWork()); + if (!fTransactionService.isReadOnly()) + { + fTransactionService.getRetryingTransactionHelper().doInTransaction(new TxnWork()); + } } catch (Exception e) { diff --git a/source/java/org/alfresco/repo/descriptor/DescriptorServiceImpl.java b/source/java/org/alfresco/repo/descriptor/DescriptorServiceImpl.java index b2b9f8d97e..8d0d86475a 100644 --- a/source/java/org/alfresco/repo/descriptor/DescriptorServiceImpl.java +++ b/source/java/org/alfresco/repo/descriptor/DescriptorServiceImpl.java @@ -57,7 +57,6 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationEvent; import org.springframework.core.io.Resource; - /** * Implementation of Descriptor Service * @@ -66,51 +65,59 @@ import org.springframework.core.io.Resource; public class DescriptorServiceImpl extends AbstractLifecycleBean implements DescriptorService, InitializingBean { private static Log logger = LogFactory.getLog(DescriptorServiceImpl.class); - + private Properties serverProperties; - + private ImporterBootstrap systemBootstrap; + private NamespaceService namespaceService; + private NodeService nodeService; + private SearchService searchService; + private TransactionService transactionService; + private LicenseService licenseService = null; private Descriptor serverDescriptor; + private Descriptor installedRepoDescriptor; - /** * Sets the server descriptor from a resource file * - * @param descriptorResource resource containing server descriptor meta-data + * @param descriptorResource + * resource containing server descriptor meta-data * @throws IOException */ - public void setDescriptor(Resource descriptorResource) - throws IOException + public void setDescriptor(Resource descriptorResource) throws IOException { this.serverProperties = new Properties(); this.serverProperties.load(descriptorResource.getInputStream()); } /** - * @param systemBootstrap system bootstrap + * @param systemBootstrap + * system bootstrap */ public void setSystemBootstrap(ImporterBootstrap systemBootstrap) { this.systemBootstrap = systemBootstrap; } - + /** - * @param transactionService transaction service + * @param transactionService + * transaction service */ public void setTransactionService(TransactionService transactionService) { this.transactionService = transactionService; } - + /** - * @param namespaceService namespace service + * @param namespaceService + * namespace service */ public void setNamespaceService(NamespaceService namespaceService) { @@ -118,22 +125,26 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc } /** - * @param nodeService node service + * @param nodeService + * node service */ public void setNodeService(NodeService nodeService) { this.nodeService = nodeService; } - + /** - * @param searchService search service + * @param searchService + * search service */ public void setSearchService(SearchService searchService) { this.searchService = searchService; } - - /* (non-Javadoc) + + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.DescriptorService#getDescriptor() */ public Descriptor getServerDescriptor() @@ -141,7 +152,9 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return serverDescriptor; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.DescriptorService#getRepositoryDescriptor() */ public Descriptor getInstalledRepositoryDescriptor() @@ -149,7 +162,9 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return installedRepoDescriptor; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.DescriptorService#getLicenseDescriptor() */ public LicenseDescriptor getLicenseDescriptor() @@ -168,10 +183,10 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc { // initialise license service (if installed) initialiseLicenseService(); - + // verify license, but only if license component is installed licenseService.verifyLicense(); - + // persist the server descriptor values updateCurrentRepositoryDescriptor(serverDescriptor); @@ -179,18 +194,18 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return createInstalledRepositoryDescriptor(); } }; - installedRepoDescriptor = transactionService.getRetryingTransactionHelper().doInTransaction(createDescriptorWork); + installedRepoDescriptor = transactionService.getRetryingTransactionHelper().doInTransaction(createDescriptorWork, transactionService.isReadOnly(), false); } @Override protected void onShutdown(ApplicationEvent event) { - if (this.licenseService != null) - { - this.licenseService.shutdown(); - } + if (this.licenseService != null) + { + this.licenseService.shutdown(); + } } - + /** * Initialise Descriptors */ @@ -203,17 +218,17 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc /** * Create server descriptor * - * @return descriptor + * @return descriptor */ private Descriptor createServerDescriptor() { return new ServerDescriptor(); } - + /** * Create repository descriptor * - * @return descriptor + * @return descriptor */ private Descriptor createInstalledRepositoryDescriptor() { @@ -236,11 +251,12 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return new UnknownDescriptor(); } } - + /** * Push the current server descriptor properties into persistence. * - * @param serverDescriptor the current server descriptor + * @param serverDescriptor + * the current server descriptor */ private void updateCurrentRepositoryDescriptor(Descriptor serverDescriptor) { @@ -257,27 +273,29 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return; } // set the properties - nodeService.setProperty(currentDescriptorNodeRef, ContentModel.PROP_SYS_VERSION_MAJOR, serverDescriptor.getVersionMajor()); - nodeService.setProperty(currentDescriptorNodeRef, ContentModel.PROP_SYS_VERSION_MINOR, serverDescriptor.getVersionMinor()); - nodeService.setProperty(currentDescriptorNodeRef, ContentModel.PROP_SYS_VERSION_REVISION, serverDescriptor.getVersionRevision()); - nodeService.setProperty(currentDescriptorNodeRef, ContentModel.PROP_SYS_VERSION_LABEL, serverDescriptor.getVersionLabel()); - nodeService.setProperty(currentDescriptorNodeRef, ContentModel.PROP_SYS_VERSION_BUILD, serverDescriptor.getVersionBuild()); - nodeService.setProperty(currentDescriptorNodeRef, ContentModel.PROP_SYS_VERSION_SCHEMA, serverDescriptor.getSchema()); - + if (!transactionService.isReadOnly()) + { + nodeService.setProperty(currentDescriptorNodeRef, ContentModel.PROP_SYS_VERSION_MAJOR, serverDescriptor.getVersionMajor()); + nodeService.setProperty(currentDescriptorNodeRef, ContentModel.PROP_SYS_VERSION_MINOR, serverDescriptor.getVersionMinor()); + nodeService.setProperty(currentDescriptorNodeRef, ContentModel.PROP_SYS_VERSION_REVISION, serverDescriptor.getVersionRevision()); + nodeService.setProperty(currentDescriptorNodeRef, ContentModel.PROP_SYS_VERSION_LABEL, serverDescriptor.getVersionLabel()); + nodeService.setProperty(currentDescriptorNodeRef, ContentModel.PROP_SYS_VERSION_BUILD, serverDescriptor.getVersionBuild()); + nodeService.setProperty(currentDescriptorNodeRef, ContentModel.PROP_SYS_VERSION_SCHEMA, serverDescriptor.getSchema()); + } // done if (logger.isDebugEnabled()) { - logger.debug("Updated current repository descriptor properties: \n" + - " node: " + currentDescriptorNodeRef + "\n" + - " descriptor: " + serverDescriptor); + logger.debug("Updated current repository descriptor properties: \n" + " node: " + currentDescriptorNodeRef + "\n" + " descriptor: " + serverDescriptor); } } - + /** - * - * @param storeRef the store to search - * @param path the path below the root node to search - * @param create true if the node must be created if missing. No properties will be set. + * @param storeRef + * the store to search + * @param path + * the path below the root node to search + * @param create + * true if the node must be created if missing. No properties will be set. * @return Returns the node for the path, or null */ private NodeRef getDescriptorNodeRef(StoreRef storeRef, String path, boolean create) @@ -301,33 +319,26 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc { if (logger.isDebugEnabled()) { - logger.debug("Multiple descriptors: \n" + - " store: " + storeRef + "\n" + - " path: " + searchPath); + logger.debug("Multiple descriptors: \n" + " store: " + storeRef + "\n" + " path: " + searchPath); } // get the first one descriptorNodeRef = nodeRefs.get(0); } } - + if (descriptorNodeRef == null) { if (logger.isDebugEnabled()) { - logger.debug("Descriptor not found: \n" + - " store: " + storeRef + "\n" + - " path: " + searchPath); + logger.debug("Descriptor not found: \n" + " store: " + storeRef + "\n" + " path: " + searchPath); } // create if necessary if (create) { storeRef = nodeService.createStore(storeRef.getProtocol(), storeRef.getIdentifier()); - NodeRef rootNodeRef = nodeService.getRootNode(storeRef); - descriptorNodeRef = nodeService.createNode( - rootNodeRef, - ContentModel.ASSOC_CHILDREN, - QName.createQName(path, namespaceService), + NodeRef rootNodeRef = nodeService.getRootNode(storeRef); + descriptorNodeRef = nodeService.createNode(rootNodeRef, ContentModel.ASSOC_CHILDREN, QName.createQName(path, namespaceService), QName.createQName("sys:descriptor", namespaceService)).getChildRef(); if (logger.isDebugEnabled()) { @@ -337,7 +348,7 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc } return descriptorNodeRef; } - + /** * Initialise License Service */ @@ -346,10 +357,10 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc try { // NOTE: We could tie in the License Component via Spring configuration, but then it could - // be declaratively taken out in an installed environment. + // be declaratively taken out in an installed environment. Class licenseComponentClass = Class.forName("org.alfresco.license.LicenseComponent"); - Constructor constructor = licenseComponentClass.getConstructor(new Class[] { ApplicationContext.class} ); - licenseService = (LicenseService)constructor.newInstance(new Object[] { getApplicationContext() }); + Constructor constructor = licenseComponentClass.getConstructor(new Class[] { ApplicationContext.class }); + licenseService = (LicenseService) constructor.newInstance(new Object[] { getApplicationContext() }); } catch (ClassNotFoundException e) { @@ -386,14 +397,18 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc */ private class NOOPLicenseService implements LicenseService { - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.alfresco.service.license.LicenseService#verify() */ public void verifyLicense() throws LicenseException { } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.alfresco.service.license.LicenseService#getLicense() */ public LicenseDescriptor getLicense() throws LicenseException @@ -405,15 +420,17 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc { } } - + /** * Unknown descriptor * * @author David Caruana - */ + */ private class UnknownDescriptor implements Descriptor { - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getVersionMajor() */ public String getVersionMajor() @@ -421,7 +438,9 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return "Unknown"; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getVersionMinor() */ public String getVersionMinor() @@ -429,7 +448,9 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return "Unknown"; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getVersionRevision() */ public String getVersionRevision() @@ -437,7 +458,9 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return "Unknown"; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getVersionLabel() */ public String getVersionLabel() @@ -445,20 +468,24 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return "Unknown"; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getVersionBuild() */ public String getVersionBuild() { return "Unknown"; } - + public VersionNumber getVersionNumber() { return new VersionNumber("1.0.0"); } - - /* (non-Javadoc) + + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getVersion() */ public String getVersion() @@ -466,7 +493,9 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return "Unknown (pre 1.0.0 RC2)"; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getEdition() */ public String getEdition() @@ -476,6 +505,7 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc /* * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getSchema() */ public int getSchema() @@ -483,7 +513,9 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return 0; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getDescriptorKeys() */ public String[] getDescriptorKeys() @@ -491,7 +523,9 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return new String[0]; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getDescriptor(java.lang.String) */ public String getDescriptor(String key) @@ -499,10 +533,9 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return null; } } - + /** - * Base class for Descriptor implementations, provides a - * default getVersion() implementation. + * Base class for Descriptor implementations, provides a default getVersion() implementation. * * @author gavinc */ @@ -525,7 +558,7 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc } return this.versionNumber; } - + public String getVersion() { if (this.strVersion == null) @@ -576,11 +609,12 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc } return this.strVersion; } - + /** * Returns the int representation of the given schema string * - * @param schemaStr The schema number as a string + * @param schemaStr + * The schema number as a string * @return The schema number as an int */ protected int getSchema(String schemaStr) @@ -604,25 +638,28 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc } } } - + /** * Repository Descriptor whose meta-data is retrieved from the repository store */ private class RepositoryDescriptor extends BaseDescriptor { private Map properties; - + /** * Construct * - * @param properties system descriptor properties + * @param properties + * system descriptor properties */ private RepositoryDescriptor(Map properties) { this.properties = properties; } - - /* (non-Javadoc) + + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getVersionMajor() */ public String getVersionMajor() @@ -630,7 +667,9 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return getDescriptor("sys:versionMajor"); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getVersionMinor() */ public String getVersionMinor() @@ -638,7 +677,9 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return getDescriptor("sys:versionMinor"); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getVersionRevision() */ public String getVersionRevision() @@ -646,7 +687,9 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return getDescriptor("sys:versionRevision"); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getVersionLabel() */ public String getVersionLabel() @@ -654,7 +697,9 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return getDescriptor("sys:versionLabel"); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getVersionBuild() */ public String getVersionBuild() @@ -662,16 +707,19 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return getDescriptor("sys:versionBuild"); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getEdition() */ public String getEdition() { return null; } - + /* * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getSchema() */ public int getSchema() @@ -679,7 +727,9 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return getSchema(getDescriptor("sys:versionSchema")); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getDescriptorKeys() */ public String[] getDescriptorKeys() @@ -689,7 +739,9 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return keys; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getDescriptor(java.lang.String) */ public String getDescriptor(String key) @@ -704,13 +756,15 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return strValue; } } - + /** - * Server Descriptor whose meta-data is retrieved from run-time environment + * Server Descriptor whose meta-data is retrieved from run-time environment */ private class ServerDescriptor extends BaseDescriptor { - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getVersionMajor() */ public String getVersionMajor() @@ -718,7 +772,9 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return serverProperties.getProperty("version.major"); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getVersionMinor() */ public String getVersionMinor() @@ -726,7 +782,9 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return serverProperties.getProperty("version.minor"); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getVersionRevision() */ public String getVersionRevision() @@ -734,15 +792,19 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return serverProperties.getProperty("version.revision"); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getVersionLabel() */ public String getVersionLabel() { return serverProperties.getProperty("version.label"); } - - /* (non-Javadoc) + + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getVersionBuild() */ public String getVersionBuild() @@ -750,7 +812,9 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return serverProperties.getProperty("version.build"); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getEdition() */ public String getEdition() @@ -760,6 +824,7 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc /* * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getSchema() */ public int getSchema() @@ -767,7 +832,9 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return getSchema(serverProperties.getProperty("version.schema")); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getDescriptorKeys() */ public String[] getDescriptorKeys() @@ -777,7 +844,9 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return keys; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.alfresco.service.descriptor.Descriptor#getDescriptor(java.lang.String) */ public String getDescriptor(String key) diff --git a/source/java/org/alfresco/repo/dictionary/DictionaryRepositoryBootstrap.java b/source/java/org/alfresco/repo/dictionary/DictionaryRepositoryBootstrap.java index 1bed401b29..457c5bab1c 100644 --- a/source/java/org/alfresco/repo/dictionary/DictionaryRepositoryBootstrap.java +++ b/source/java/org/alfresco/repo/dictionary/DictionaryRepositoryBootstrap.java @@ -209,7 +209,7 @@ public class DictionaryRepositoryBootstrap extends AbstractLifecycleBean impleme return (Object)null; } - }); + }, transactionService.isReadOnly(), false); } public void destroy() diff --git a/source/java/org/alfresco/repo/domain/schema/SchemaBootstrap.java b/source/java/org/alfresco/repo/domain/schema/SchemaBootstrap.java index 6f51190349..7a55e720a6 100644 --- a/source/java/org/alfresco/repo/domain/schema/SchemaBootstrap.java +++ b/source/java/org/alfresco/repo/domain/schema/SchemaBootstrap.java @@ -971,10 +971,11 @@ public class SchemaBootstrap extends AbstractLifecycleBean { // do everything in a transaction Session session = getSessionFactory().openSession(); + Connection connection = null; try { // make sure that we AUTO-COMMIT - Connection connection = session.connection(); + connection = session.connection(); connection.setAutoCommit(true); Configuration cfg = localSessionFactory.getConfiguration(); @@ -1080,6 +1081,17 @@ public class SchemaBootstrap extends AbstractLifecycleBean } finally { + try + { + if (connection != null) + { + connection.close(); + } + } + catch (Throwable e) + { + logger.warn("Error closing DB connection: " + e.getMessage()); + } // Remove the connection reference from the threadlocal boostrap SchemaBootstrapConnectionProvider.setBootstrapConnection(null); diff --git a/source/java/org/alfresco/repo/importer/ImporterBootstrap.java b/source/java/org/alfresco/repo/importer/ImporterBootstrap.java index e1c7fdca67..0f496919f5 100644 --- a/source/java/org/alfresco/repo/importer/ImporterBootstrap.java +++ b/source/java/org/alfresco/repo/importer/ImporterBootstrap.java @@ -329,7 +329,7 @@ public class ImporterBootstrap extends AbstractLifecycleBean }; try { - transactionService.getRetryingTransactionHelper().doInTransaction(doImportCallback); + transactionService.getRetryingTransactionHelper().doInTransaction(doImportCallback, transactionService.isReadOnly(), false); } catch(Throwable e) { diff --git a/source/java/org/alfresco/repo/rule/RuleServiceCoverageTest.java b/source/java/org/alfresco/repo/rule/RuleServiceCoverageTest.java index a45762ce62..9eda94ba6a 100644 --- a/source/java/org/alfresco/repo/rule/RuleServiceCoverageTest.java +++ b/source/java/org/alfresco/repo/rule/RuleServiceCoverageTest.java @@ -288,7 +288,7 @@ public class RuleServiceCoverageTest extends TestCase ActionServiceImplTest.postAsyncActionTest( this.transactionService, 1000, - 10, + 100, new AsyncTest() { public boolean executeTest() diff --git a/source/java/org/alfresco/repo/rule/RuleServiceImpl.java b/source/java/org/alfresco/repo/rule/RuleServiceImpl.java index d37c1713d6..fece58333a 100644 --- a/source/java/org/alfresco/repo/rule/RuleServiceImpl.java +++ b/source/java/org/alfresco/repo/rule/RuleServiceImpl.java @@ -355,7 +355,12 @@ public class RuleServiceImpl implements RuleService, RuntimeRuleService { List rules = new ArrayList(); - if (this.runtimeNodeService.exists(nodeRef) == true && checkNodeType(nodeRef) == true) + // Extra check of CONSUMER permission was added to rule selection, + // to prevent Access Denied Exception due to the bug: + // https://issues.alfresco.com/browse/ETWOTWO-438 + + if (this.runtimeNodeService.exists(nodeRef) == true && checkNodeType(nodeRef) == true && + permissionService.hasPermission(nodeRef, PermissionService.CONSUMER) == AccessStatus.ALLOWED) { if (includeInherited == true && this.runtimeNodeService.hasAspect(nodeRef, RuleModel.ASPECT_IGNORE_INHERITED_RULES) == false) { diff --git a/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneTest.java b/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneTest.java index 59cc6baf6e..8db48b693b 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneTest.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneTest.java @@ -289,7 +289,9 @@ public class ADMLuceneTest extends TestCase testProperties.put(QName.createQName(TEST_NAMESPACE, "long-ista"), Long.valueOf(2)); testProperties.put(QName.createQName(TEST_NAMESPACE, "float-ista"), Float.valueOf(3.4f)); testProperties.put(QName.createQName(TEST_NAMESPACE, "double-ista"), Double.valueOf(5.6)); - testDate = new Date(new Date().getTime() - 10000); + testDate = new Date(((new Date().getTime() - 10000))); + //testDate = new Date(((new Date().getTime() - 10000)/1000*1000)+668); + //System.out.println(testDate.getTime()); testProperties.put(QName.createQName(TEST_NAMESPACE, "date-ista"), testDate); testProperties.put(QName.createQName(TEST_NAMESPACE, "datetime-ista"), testDate); testProperties.put(QName.createQName(TEST_NAMESPACE, "boolean-ista"), Boolean.valueOf(true)); @@ -2440,21 +2442,53 @@ public class ADMLuceneTest extends TestCase assertNotNull(results.getRow(0).getValue(qname)); results.close(); + qname = QName.createQName(TEST_NAMESPACE, "int-ista"); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":[A TO 2]", null, null); + assertEquals(1, results.length()); + assertNotNull(results.getRow(0).getValue(qname)); + results.close(); + qname = QName.createQName(TEST_NAMESPACE, "int-ista"); results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":[0 TO 2]", null, null); assertEquals(1, results.length()); assertNotNull(results.getRow(0).getValue(qname)); results.close(); + + qname = QName.createQName(TEST_NAMESPACE, "int-ista"); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":[0 TO A]", null, null); + assertEquals(1, results.length()); + assertNotNull(results.getRow(0).getValue(qname)); + results.close(); + qname = QName.createQName(TEST_NAMESPACE, "int-ista"); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":{A TO 1}", null, null); + assertEquals(0, results.length()); + results.close(); + qname = QName.createQName(TEST_NAMESPACE, "int-ista"); results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":{0 TO 1}", null, null); assertEquals(0, results.length()); results.close(); + + qname = QName.createQName(TEST_NAMESPACE, "int-ista"); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":{0 TO A}", null, null); + assertEquals(1, results.length()); + results.close(); + qname = QName.createQName(TEST_NAMESPACE, "int-ista"); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":{A TO 2}", null, null); + assertEquals(1, results.length()); + results.close(); + qname = QName.createQName(TEST_NAMESPACE, "int-ista"); results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":{1 TO 2}", null, null); assertEquals(0, results.length()); results.close(); + + qname = QName.createQName(TEST_NAMESPACE, "int-ista"); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":{1 TO A}", null, null); + assertEquals(0, results.length()); + results.close(); qname = QName.createQName(TEST_NAMESPACE, "long-ista"); results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":\"2\"", null, null); @@ -2480,21 +2514,53 @@ public class ADMLuceneTest extends TestCase assertNotNull(results.getRow(0).getValue(qname)); results.close(); + qname = QName.createQName(TEST_NAMESPACE, "long-ista"); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":[A TO 2]", null, null); + assertEquals(1, results.length()); + assertNotNull(results.getRow(0).getValue(qname)); + results.close(); + qname = QName.createQName(TEST_NAMESPACE, "long-ista"); results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":[0 TO 2]", null, null); assertEquals(1, results.length()); assertNotNull(results.getRow(0).getValue(qname)); results.close(); + + qname = QName.createQName(TEST_NAMESPACE, "long-ista"); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":[0 TO A]", null, null); + assertEquals(1, results.length()); + assertNotNull(results.getRow(0).getValue(qname)); + results.close(); + qname = QName.createQName(TEST_NAMESPACE, "long-ista"); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":{A TO 2}", null, null); + assertEquals(0, results.length()); + results.close(); + qname = QName.createQName(TEST_NAMESPACE, "long-ista"); results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":{0 TO 2}", null, null); assertEquals(0, results.length()); results.close(); + + qname = QName.createQName(TEST_NAMESPACE, "long-ista"); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":{0 TO A}", null, null); + assertEquals(1, results.length()); + results.close(); + qname = QName.createQName(TEST_NAMESPACE, "long-ista"); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":{A TO 3}", null, null); + assertEquals(1, results.length()); + results.close(); + qname = QName.createQName(TEST_NAMESPACE, "long-ista"); results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":{2 TO 3}", null, null); assertEquals(0, results.length()); results.close(); + + qname = QName.createQName(TEST_NAMESPACE, "long-ista"); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":{2 TO A}", null, null); + assertEquals(0, results.length()); + results.close(); qname = QName.createQName(TEST_NAMESPACE, "float-ista"); results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":\"3.4\"", null, null); @@ -2502,22 +2568,58 @@ public class ADMLuceneTest extends TestCase assertNotNull(results.getRow(0).getValue(qname)); results.close(); + qname = QName.createQName(TEST_NAMESPACE, "float-ista"); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":[A TO 4]", null, null); + assertEquals(1, results.length()); + assertNotNull(results.getRow(0).getValue(qname)); + results.close(); + qname = QName.createQName(TEST_NAMESPACE, "float-ista"); results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":[3 TO 4]", null, null); assertEquals(1, results.length()); assertNotNull(results.getRow(0).getValue(qname)); results.close(); + + qname = QName.createQName(TEST_NAMESPACE, "float-ista"); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":[3 TO A]", null, null); + assertEquals(1, results.length()); + assertNotNull(results.getRow(0).getValue(qname)); + results.close(); + qname = QName.createQName(TEST_NAMESPACE, "float-ista"); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":[A TO 3.4]", null, null); + assertEquals(1, results.length()); + assertNotNull(results.getRow(0).getValue(qname)); + results.close(); + qname = QName.createQName(TEST_NAMESPACE, "float-ista"); results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":[3.3 TO 3.4]", null, null); assertEquals(1, results.length()); assertNotNull(results.getRow(0).getValue(qname)); results.close(); + + qname = QName.createQName(TEST_NAMESPACE, "float-ista"); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":[3.3 TO A]", null, null); + assertEquals(1, results.length()); + assertNotNull(results.getRow(0).getValue(qname)); + results.close(); qname = QName.createQName(TEST_NAMESPACE, "float-ista"); - results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":{3.3 TO 3.4}", null, null); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":{A TO 3.4}", null, null); assertEquals(0, results.length()); results.close(); + + qname = QName.createQName(TEST_NAMESPACE, "float-ista"); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":[3.3 TO 3.4]", null, null); + assertEquals(1, results.length()); + assertNotNull(results.getRow(0).getValue(qname)); + results.close(); + + qname = QName.createQName(TEST_NAMESPACE, "float-ista"); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":[3.3 TO A]", null, null); + assertEquals(1, results.length()); + assertNotNull(results.getRow(0).getValue(qname)); + results.close(); qname = QName.createQName(TEST_NAMESPACE, "float-ista"); results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":\"3.40\"", null, null); @@ -2553,21 +2655,53 @@ public class ADMLuceneTest extends TestCase assertEquals(1, results.length()); results.close(); + qname = QName.createQName(TEST_NAMESPACE, "double-ista"); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":[A TO 5.7]", null, null); + assertEquals(1, results.length()); + assertNotNull(results.getRow(0).getValue(qname)); + results.close(); + qname = QName.createQName(TEST_NAMESPACE, "double-ista"); results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":[5.5 TO 5.7]", null, null); assertEquals(1, results.length()); assertNotNull(results.getRow(0).getValue(qname)); results.close(); + + qname = QName.createQName(TEST_NAMESPACE, "double-ista"); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":[5.5 TO A]", null, null); + assertEquals(1, results.length()); + assertNotNull(results.getRow(0).getValue(qname)); + results.close(); + qname = QName.createQName(TEST_NAMESPACE, "double-ista"); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":{A TO 5.6}", null, null); + assertEquals(0, results.length()); + results.close(); + qname = QName.createQName(TEST_NAMESPACE, "double-ista"); results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":{5.5 TO 5.6}", null, null); assertEquals(0, results.length()); results.close(); + + qname = QName.createQName(TEST_NAMESPACE, "double-ista"); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":{5.5 TO A}", null, null); + assertEquals(1, results.length()); + results.close(); + qname = QName.createQName(TEST_NAMESPACE, "double-ista"); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":{A TO 5.7}", null, null); + assertEquals(1, results.length()); + results.close(); + qname = QName.createQName(TEST_NAMESPACE, "double-ista"); results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":{5.6 TO 5.7}", null, null); assertEquals(0, results.length()); results.close(); + + qname = QName.createQName(TEST_NAMESPACE, "double-ista"); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname) + ":{5.6 TO A}", null, null); + assertEquals(0, results.length()); + results.close(); // Dates @@ -2605,11 +2739,35 @@ public class ADMLuceneTest extends TestCase null, null); assertEquals(1, results.length()); results.close(); + + sDate = df.format(date); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(QName.createQName(TEST_NAMESPACE, "date-ista")) + ":[MIN TO " + sDate + "]", + null, null); + assertEquals(1, results.length()); + results.close(); + + sDate = df.format(date); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(QName.createQName(TEST_NAMESPACE, "date-ista")) + ":[" + sDate + " TO MAX]", + null, null); + assertEquals(1, results.length()); + results.close(); sDate = CachingDateFormat.getDateFormat().format(date); results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(QName.createQName(TEST_NAMESPACE, "datetime-ista")) + ":[" + sDate + " TO " + sDate + "]", null, null); - assertEquals(usesDateTimeAnalyser ? 0 : 1, results.length(), results.length()); + assertEquals(usesDateTimeAnalyser ? 0 : 1, results.length()); + results.close(); + + sDate = CachingDateFormat.getDateFormat().format(date); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", + "\\@" + escapeQName(QName.createQName(TEST_NAMESPACE, "datetime-ista")) + ":[MIN TO " + sDate + "]", null, null); + assertEquals(1, results.length()); + results.close(); + + sDate = CachingDateFormat.getDateFormat().format(date); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", + "\\@" + escapeQName(QName.createQName(TEST_NAMESPACE, "datetime-ista")) + ":[" + sDate + " TO MAX]", null, null); + assertEquals(usesDateTimeAnalyser ? 0 : 1, results.length()); results.close(); if (usesDateTimeAnalyser) @@ -4026,6 +4184,22 @@ public class ADMLuceneTest extends TestCase assertNotNull(results.getRow(0).getValue(qname)); results.close(); + // Open ended ranges + + qname = QName.createQName("{namespace}property-1"); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname)+":[v TO w]", null, null); + assertEquals(2, results.length()); + results.close(); + + qname = QName.createQName("{namespace}property-1"); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname)+":[v TO \uFFFF]", null, null); + assertEquals(2, results.length()); + results.close(); + + qname = QName.createQName("{namespace}property-1"); + results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "\\@" + escapeQName(qname)+":[\u0000 TO w]", null, null); + assertEquals(2, results.length()); + results.close(); } /** diff --git a/source/java/org/alfresco/repo/search/impl/lucene/LuceneQueryParser.java b/source/java/org/alfresco/repo/search/impl/lucene/LuceneQueryParser.java index 0b8733949c..50d2ec8511 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/LuceneQueryParser.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/LuceneQueryParser.java @@ -69,12 +69,11 @@ import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.Term; import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.BooleanQuery; +import org.apache.lucene.search.ConstantScoreRangeQuery; import org.apache.lucene.search.MultiPhraseQuery; import org.apache.lucene.search.PhraseQuery; import org.apache.lucene.search.Query; -import org.apache.lucene.search.RangeQuery; import org.apache.lucene.search.TermQuery; -import org.apache.lucene.search.WildcardQuery; import org.apache.lucene.search.WildcardTermEnum; import org.apache.lucene.search.BooleanClause.Occur; import org.saxpath.SAXPathException; @@ -1154,7 +1153,29 @@ public class LuceneQueryParser extends QueryParser } catch (java.text.ParseException e) { - return new TermQuery(new Term("NO_TOKENS", "__")); + SimpleDateFormat oldDf = CachingDateFormat.getDateFormat(); + try + { + Date date = oldDf.parse(part1); + start.setTime(date); + start.set(Calendar.MILLISECOND, 0); + } + catch (java.text.ParseException ee) + { + if (part1.equalsIgnoreCase("min")) + { + start.set(Calendar.YEAR, start.getMinimum(Calendar.YEAR)); + start.set(Calendar.DAY_OF_YEAR, start.getMinimum(Calendar.DAY_OF_YEAR)); + start.set(Calendar.HOUR_OF_DAY, start.getMinimum(Calendar.HOUR_OF_DAY)); + start.set(Calendar.MINUTE, start.getMinimum(Calendar.MINUTE)); + start.set(Calendar.SECOND, start.getMinimum(Calendar.SECOND)); + start.set(Calendar.MILLISECOND, start.getMinimum(Calendar.MILLISECOND)); + } + else + { + return new TermQuery(new Term("NO_TOKENS", "__")); + } + } } try { @@ -1163,25 +1184,66 @@ public class LuceneQueryParser extends QueryParser } catch (java.text.ParseException e) { - return new TermQuery(new Term("NO_TOKENS", "__")); + SimpleDateFormat oldDf = CachingDateFormat.getDateFormat(); + try + { + Date date = oldDf.parse(part2); + end.setTime(date); + end.set(Calendar.MILLISECOND, 0); + } + catch (java.text.ParseException ee) + { + if (part1.equalsIgnoreCase("max")) + { + end.set(Calendar.YEAR, start.getMaximum(Calendar.YEAR)); + end.set(Calendar.DAY_OF_YEAR, start.getMaximum(Calendar.DAY_OF_YEAR)); + end.set(Calendar.HOUR_OF_DAY, start.getMaximum(Calendar.HOUR_OF_DAY)); + end.set(Calendar.MINUTE, start.getMaximum(Calendar.MINUTE)); + end.set(Calendar.SECOND, start.getMaximum(Calendar.SECOND)); + end.set(Calendar.MILLISECOND, start.getMaximum(Calendar.MILLISECOND)); + } + else + { + return new TermQuery(new Term("NO_TOKENS", "__")); + } + } } // Build a composite query for all the bits - return buildDateTimeRange(field, start, end, inclusive); + Query rq = buildDateTimeRange(field, start, end, inclusive); + return rq; } else { - return new RangeQuery(new Term(fieldName, getToken(fieldName, part1)), new Term(fieldName, getToken(fieldName, part2)), inclusive); + String first = getToken(fieldName, part1); + String last = getToken(fieldName, part2); + return new ConstantScoreRangeQuery(field, first, last, inclusive, inclusive); } } + else if (propertyDef.getDataType().getName().equals(DataTypeDefinition.TEXT) + || propertyDef.getDataType().getName().equals(DataTypeDefinition.CONTENT) || propertyDef.getDataType().getName().equals(DataTypeDefinition.ANY)) + { + if (lowercaseExpandedTerms) + { + part1 = part1.toLowerCase(); + part2 = part2.toLowerCase(); + } + return new ConstantScoreRangeQuery(field, part1.equals("\u0000") ? null : part1, part2.equals("\uFFFF") ? null : part2, inclusive, inclusive); + } } - return new RangeQuery(new Term(fieldName, getToken(fieldName, part1)), new Term(fieldName, getToken(fieldName, part2)), inclusive); - + String first = getToken(fieldName, part1); + String last = getToken(fieldName, part2); + return new ConstantScoreRangeQuery(field, first, last, inclusive, inclusive); } else { - return super.getRangeQuery(field, part1, part2, inclusive); + if (lowercaseExpandedTerms) + { + part1 = part1.toLowerCase(); + part2 = part2.toLowerCase(); + } + return new ConstantScoreRangeQuery(field, part1, part2, inclusive, inclusive); } } @@ -1228,8 +1290,8 @@ public class LuceneQueryParser extends QueryParser else { // only ms - part = new RangeQuery(new Term(field, build3SF("MS", start.get(Calendar.MILLISECOND))), new Term(field, build3SF("MS", end - .get(Calendar.MILLISECOND))), inclusive); + part = new ConstantScoreRangeQuery(field, build3SF("MS", start.get(Calendar.MILLISECOND)), build3SF("MS", end.get(Calendar.MILLISECOND)), + inclusive, inclusive); query.add(part, Occur.MUST); } } @@ -1248,8 +1310,7 @@ public class LuceneQueryParser extends QueryParser if ((end.get(Calendar.SECOND) - start.get(Calendar.SECOND)) > 1) { - subPart = new RangeQuery(new Term(field, build2SF("SE", start.get(Calendar.SECOND))), - new Term(field, build2SF("SE", end.get(Calendar.SECOND))), false); + subPart = new ConstantScoreRangeQuery(field, build2SF("SE", start.get(Calendar.SECOND)), build2SF("SE", end.get(Calendar.SECOND)), false, false); subQuery.add(subPart, Occur.SHOULD); } @@ -1284,8 +1345,7 @@ public class LuceneQueryParser extends QueryParser if ((end.get(Calendar.MINUTE) - start.get(Calendar.MINUTE)) > 1) { - subPart = new RangeQuery(new Term(field, build2SF("MI", start.get(Calendar.MINUTE))), new Term(field, build2SF("MI", end.get(Calendar.MINUTE))), - false); + subPart = new ConstantScoreRangeQuery(field, build2SF("MI", start.get(Calendar.MINUTE)), build2SF("MI", end.get(Calendar.MINUTE)), false, false); subQuery.add(subPart, Occur.SHOULD); } @@ -1322,8 +1382,8 @@ public class LuceneQueryParser extends QueryParser if ((end.get(Calendar.HOUR_OF_DAY) - start.get(Calendar.HOUR_OF_DAY)) > 1) { - subPart = new RangeQuery(new Term(field, build2SF("HO", start.get(Calendar.HOUR_OF_DAY))), new Term(field, - build2SF("HO", end.get(Calendar.HOUR_OF_DAY))), false); + subPart = new ConstantScoreRangeQuery(field, build2SF("HO", start.get(Calendar.HOUR_OF_DAY)), build2SF("HO", end.get(Calendar.HOUR_OF_DAY)), false, + false); subQuery.add(subPart, Occur.SHOULD); } @@ -1360,8 +1420,7 @@ public class LuceneQueryParser extends QueryParser if ((end.get(Calendar.DAY_OF_MONTH) - start.get(Calendar.DAY_OF_MONTH)) > 1) { - subPart = new RangeQuery(new Term(field, build2SF("DA", start.get(Calendar.DAY_OF_MONTH))), - new Term(field, build2SF("DA", end.get(Calendar.DAY_OF_MONTH))), false); + subPart = new ConstantScoreRangeQuery(field, build2SF("DA", start.get(Calendar.DAY_OF_MONTH)), build2SF("DA", end.get(Calendar.DAY_OF_MONTH)), false, false); subQuery.add(subPart, Occur.SHOULD); } @@ -1399,7 +1458,7 @@ public class LuceneQueryParser extends QueryParser if ((end.get(Calendar.MONTH) - start.get(Calendar.MONTH)) > 1) { - subPart = new RangeQuery(new Term(field, build2SF("MO", start.get(Calendar.MONTH))), new Term(field, build2SF("MO", end.get(Calendar.MONTH))), false); + subPart = new ConstantScoreRangeQuery(field, build2SF("MO", start.get(Calendar.MONTH)), build2SF("MO", end.get(Calendar.MONTH)), false, false); subQuery.add(subPart, Occur.SHOULD); } @@ -1436,7 +1495,7 @@ public class LuceneQueryParser extends QueryParser if ((end.get(Calendar.YEAR) - start.get(Calendar.YEAR)) > 1) { - subPart = new RangeQuery(new Term(field, "YE" + start.get(Calendar.YEAR)), new Term(field, "YE" + end.get(Calendar.YEAR)), false); + subPart = new ConstantScoreRangeQuery(field, "YE" + start.get(Calendar.YEAR), "YE" + end.get(Calendar.YEAR), false, false); subQuery.add(subPart, Occur.SHOULD); } @@ -1486,9 +1545,16 @@ public class LuceneQueryParser extends QueryParser } else if (padField == Calendar.MONTH) { - part = new RangeQuery(new Term(field, build2SF("MO", (cal.get(Calendar.MONTH) + 1))), new Term(field, "MO11"), true); - range.add(part, Occur.MUST); - break; + if (cal.get(Calendar.MONTH) < cal.getMaximum(Calendar.MONTH)) + { + part = new ConstantScoreRangeQuery(field, build2SF("MO", (cal.get(Calendar.MONTH) + 1)), "MO" + cal.getMaximum(Calendar.MONTH), true, true); + range.add(part, Occur.MUST); + break; + } + else + { + return null; + } } else { @@ -1509,9 +1575,16 @@ public class LuceneQueryParser extends QueryParser } else if (padField == Calendar.DAY_OF_MONTH) { - part = new RangeQuery(new Term(field, build2SF("DA", (cal.get(Calendar.DAY_OF_MONTH) + 1))), new Term(field, "DA31"), true); - range.add(part, Occur.MUST); - break; + if (cal.get(Calendar.DAY_OF_MONTH) < cal.getMaximum(Calendar.DAY_OF_MONTH)) + { + part = new ConstantScoreRangeQuery(field, build2SF("DA", (cal.get(Calendar.DAY_OF_MONTH) + 1)), "DA" + cal.getMaximum(Calendar.DAY_OF_MONTH), true, true); + range.add(part, Occur.MUST); + break; + } + else + { + return null; + } } else { @@ -1532,9 +1605,16 @@ public class LuceneQueryParser extends QueryParser } else if (padField == Calendar.HOUR_OF_DAY) { - part = new RangeQuery(new Term(field, build2SF("HO", (cal.get(Calendar.HOUR_OF_DAY) + 1))), new Term(field, "HO23"), true); - range.add(part, Occur.MUST); - break; + if (cal.get(Calendar.HOUR_OF_DAY) < cal.getMaximum(Calendar.HOUR_OF_DAY)) + { + part = new ConstantScoreRangeQuery(field, build2SF("HO", (cal.get(Calendar.HOUR_OF_DAY) + 1)), "HO" + cal.getMaximum(Calendar.HOUR_OF_DAY), true, true); + range.add(part, Occur.MUST); + break; + } + else + { + return null; + } } else { @@ -1555,9 +1635,16 @@ public class LuceneQueryParser extends QueryParser } else if (padField == Calendar.MINUTE) { - part = new RangeQuery(new Term(field, build2SF("MI", (cal.get(Calendar.MINUTE) + 1))), new Term(field, "MI59"), true); - range.add(part, Occur.MUST); - break; + if (cal.get(Calendar.MINUTE) < cal.getMaximum(Calendar.MINUTE)) + { + part = new ConstantScoreRangeQuery(field, build2SF("MI", (cal.get(Calendar.MINUTE) + 1)), "MI" + cal.getMaximum(Calendar.MINUTE), true, true); + range.add(part, Occur.MUST); + break; + } + else + { + return null; + } } else { @@ -1578,9 +1665,17 @@ public class LuceneQueryParser extends QueryParser } else if (padField == Calendar.SECOND) { - part = new RangeQuery(new Term(field, build2SF("SE", (cal.get(Calendar.SECOND) + 1))), new Term(field, "SE59"), true); - range.add(part, Occur.MUST); - break; + if (cal.get(Calendar.SECOND) < cal.getMaximum(Calendar.SECOND)) + { + part = new ConstantScoreRangeQuery(field, build2SF("SE", (cal.get(Calendar.SECOND) + 1)), "SE" + cal.getMaximum(Calendar.SECOND), true, true); + range.add(part, Occur.MUST); + break; + } + else + { + return null; + } + } else { @@ -1588,15 +1683,14 @@ public class LuceneQueryParser extends QueryParser range.add(part, Occur.MUST); } default: - if ((ms > 0) && (ms < 999)) + if ((ms > 0) && (ms <= cal.getMaximum(Calendar.MILLISECOND))) { - part = new RangeQuery(new Term(field, build3SF("MS", ms)), new Term(field, "MS999"), true); + part = new ConstantScoreRangeQuery(field, build3SF("MS", ms), "MS" + cal.getMaximum(Calendar.MILLISECOND), true, true); range.add(part, Occur.MUST); } - else if (ms == 1000) + else { - // exclude - range.add(new TermQuery(new Term("NO_TOKENS", "__")), Occur.MUST); + return null; } } @@ -1633,12 +1727,19 @@ public class LuceneQueryParser extends QueryParser return null; } } - + if (padField == Calendar.MONTH) { - part = new RangeQuery(new Term(field, "MO00"), new Term(field, build2SF("MO", (cal.get(Calendar.MONTH) - 1))), true); - range.add(part, Occur.MUST); - break; + if (cal.get(Calendar.MONTH) > cal.getMinimum(Calendar.MONTH)) + { + part = new ConstantScoreRangeQuery(field, build2SF("MO", cal.getMinimum(Calendar.MONTH)), build2SF("MO", (cal.get(Calendar.MONTH) - 1)), true, true); + range.add(part, Occur.MUST); + break; + } + else + { + return null; + } } else { @@ -1646,20 +1747,27 @@ public class LuceneQueryParser extends QueryParser range.add(part, Occur.MUST); } case Calendar.DAY_OF_MONTH: - if ((cal.get(Calendar.DAY_OF_MONTH) == 1) && (cal.get(Calendar.HOUR_OF_DAY) == 0) && (cal.get(Calendar.MINUTE) == 0) && (cal.get(Calendar.SECOND) == 0) - && (ms == 0)) + if ((cal.get(Calendar.DAY_OF_MONTH) == 1) && (cal.get(Calendar.HOUR_OF_DAY) == 0) && (cal.get(Calendar.MINUTE) == 0) && (cal.get(Calendar.SECOND) == 0) && (ms == 0)) { if (padField == Calendar.DAY_OF_MONTH) { return null; } } - + if (padField == Calendar.DAY_OF_MONTH) { - part = new RangeQuery(new Term(field, "DA00"), new Term(field, build2SF("DA", (cal.get(Calendar.DAY_OF_MONTH) - 1))), true); - range.add(part, Occur.MUST); - break; + if (cal.get(Calendar.DAY_OF_MONTH) > cal.getMinimum(Calendar.DAY_OF_MONTH)) + { + part = new ConstantScoreRangeQuery(field, build2SF("DA", cal.getMinimum(Calendar.DAY_OF_MONTH)), build2SF("DA", (cal.get(Calendar.DAY_OF_MONTH) - 1)), true, + true); + range.add(part, Occur.MUST); + break; + } + else + { + return null; + } } else { @@ -1667,20 +1775,26 @@ public class LuceneQueryParser extends QueryParser range.add(part, Occur.MUST); } case Calendar.HOUR_OF_DAY: - if ((cal.get(Calendar.HOUR_OF_DAY) == 0) && (cal.get(Calendar.MINUTE) == 0) && (cal.get(Calendar.SECOND) == 0) - && (ms == 0)) + if ((cal.get(Calendar.HOUR_OF_DAY) == 0) && (cal.get(Calendar.MINUTE) == 0) && (cal.get(Calendar.SECOND) == 0) && (ms == 0)) { if (padField == Calendar.HOUR_OF_DAY) { return null; } } - + if (padField == Calendar.HOUR_OF_DAY) { - part = new RangeQuery(new Term(field, "HO00"), new Term(field, build2SF("HO", (cal.get(Calendar.HOUR_OF_DAY) - 1))), true); - range.add(part, Occur.MUST); - break; + if (cal.get(Calendar.HOUR_OF_DAY) > cal.getMinimum(Calendar.HOUR_OF_DAY)) + { + part = new ConstantScoreRangeQuery(field, build2SF("HO", cal.getMinimum(Calendar.HOUR_OF_DAY)), build2SF("HO", (cal.get(Calendar.HOUR_OF_DAY) - 1)), true, true); + range.add(part, Occur.MUST); + break; + } + else + { + return null; + } } else { @@ -1688,20 +1802,26 @@ public class LuceneQueryParser extends QueryParser range.add(part, Occur.MUST); } case Calendar.MINUTE: - if ((cal.get(Calendar.MINUTE) == 0) && (cal.get(Calendar.SECOND) == 0) - && (ms == 0)) + if ((cal.get(Calendar.MINUTE) == 0) && (cal.get(Calendar.SECOND) == 0) && (ms == 0)) { if (padField == Calendar.MINUTE) { return null; } } - + if (padField == Calendar.MINUTE) { - part = new RangeQuery(new Term(field, "MI00"), new Term(field, build2SF("MI", (cal.get(Calendar.MINUTE) - 1))), true); - range.add(part, Occur.MUST); - break; + if (cal.get(Calendar.MINUTE) > cal.getMinimum(Calendar.MINUTE)) + { + part = new ConstantScoreRangeQuery(field, build2SF("MI", cal.getMinimum(Calendar.MINUTE)), build2SF("MI", (cal.get(Calendar.MINUTE) - 1)), true, true); + range.add(part, Occur.MUST); + break; + } + else + { + return null; + } } else { @@ -1709,20 +1829,26 @@ public class LuceneQueryParser extends QueryParser range.add(part, Occur.MUST); } case Calendar.SECOND: - if ((cal.get(Calendar.SECOND) == 0) - && (ms == 0)) + if ((cal.get(Calendar.SECOND) == 0) && (ms == 0)) { if (padField == Calendar.SECOND) { return null; } } - + if (padField == Calendar.SECOND) { - part = new RangeQuery(new Term(field, "SE00"), new Term(field, build2SF("SE", (cal.get(Calendar.SECOND) - 1))), true); - range.add(part, Occur.MUST); - break; + if (cal.get(Calendar.SECOND) > cal.getMinimum(Calendar.SECOND)) + { + part = new ConstantScoreRangeQuery(field, build2SF("SE", cal.getMinimum(Calendar.SECOND)), build2SF("SE", (cal.get(Calendar.SECOND) - 1)), true, true); + range.add(part, Occur.MUST); + break; + } + else + { + return null; + } } else { @@ -1730,15 +1856,14 @@ public class LuceneQueryParser extends QueryParser range.add(part, Occur.MUST); } default: - if ((ms >= 0) && (ms < 999)) + if ((ms >= cal.getMinimum(Calendar.MILLISECOND)) && (ms < cal.getMaximum(Calendar.MILLISECOND))) { - part = new RangeQuery(new Term(field, "MS000"), new Term(field, build3SF("MS", ms)), true); + part = new ConstantScoreRangeQuery(field, build3SF("MS", cal.getMinimum(Calendar.MILLISECOND)), build3SF("MS", ms), true, true); range.add(part, Occur.MUST); } - else if (ms == -1) + else { - // exclude - range.add(new TermQuery(new Term("NO_TOKENS", "__")), Occur.MUST); + return null; } } @@ -1822,7 +1947,7 @@ public class LuceneQueryParser extends QueryParser return fieldName; } - private String getToken(String field, String value) + private String getToken(String field, String value) throws ParseException { TokenStream source = analyzer.tokenStream(field, new StringReader(value)); org.apache.lucene.analysis.Token t; @@ -1850,8 +1975,8 @@ public class LuceneQueryParser extends QueryParser { } - return tokenised; + return tokenised; } @Override @@ -2208,33 +2333,32 @@ public class LuceneQueryParser extends QueryParser } } - public static void main(String[] args) throws ParseException + public static void main(String[] args) throws ParseException, java.text.ParseException { Query query; Calendar start = Calendar.getInstance(); Calendar end = Calendar.getInstance(); SimpleDateFormat df = CachingDateFormat.getDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", false); - try - { - Date date = df.parse("2007-10-15T11:21:03.312"); - start.setTime(date); - } - catch (java.text.ParseException e) - { - query = new TermQuery(new Term("NO_TOKENS", "__")); - } - try - { - Date date = df.parse("2007-10-15T11:21:03.645"); - end.setTime(date); - } - catch (java.text.ParseException e) - { - query = new TermQuery(new Term("NO_TOKENS", "__")); - } + + Date date = df.parse("2007-11-30T22:58:58.998"); + System.out.println(date); + start.setTime(date); + System.out.println(start); + + date = df.parse("2008-01-01T03:00:01.002"); + System.out.println(date); + end.setTime(date); + System.out.println(end); + + // start.set(Calendar.YEAR, start.getMinimum(Calendar.YEAR)); + // start.set(Calendar.DAY_OF_YEAR, start.getMinimum(Calendar.DAY_OF_YEAR)); + // start.set(Calendar.HOUR_OF_DAY, start.getMinimum(Calendar.HOUR_OF_DAY)); + // start.set(Calendar.MINUTE, start.getMinimum(Calendar.MINUTE)); + // start.set(Calendar.SECOND, start.getMinimum(Calendar.SECOND)); + // start.set(Calendar.MILLISECOND, start.getMinimum(Calendar.MILLISECOND)); LuceneQueryParser lqp = new LuceneQueryParser(null, null); - query = lqp.buildDateTimeRange("TEST", start, end, true); + query = lqp.buildDateTimeRange("TEST", start, end, false); System.out.println("Query is " + query); } }