From d7a8ab10652e336c8a257572467683ed525c4295 Mon Sep 17 00:00:00 2001 From: Derek Hulley Date: Thu, 23 Feb 2006 16:40:53 +0000 Subject: [PATCH] Fixed AR-451: Display both current version of repo and installed version of repo git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@2485 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- config/alfresco/bootstrap/descriptor.xml | 8 + config/alfresco/core-services-context.xml | 1 + config/alfresco/model/systemModel.xml | 4 +- config/alfresco/repository.properties | 1 + .../java/org/alfresco/model/ContentModel.java | 6 + .../repo/admin/patch/PatchServiceImpl.java | 2 +- .../descriptor/DescriptorServiceImpl.java | 157 ++++++++++++++---- .../descriptor/DescriptorServiceTest.java | 2 +- .../repo/descriptor/DescriptorStartupLog.java | 21 ++- .../service/descriptor/DescriptorService.java | 7 +- 10 files changed, 167 insertions(+), 42 deletions(-) diff --git a/config/alfresco/bootstrap/descriptor.xml b/config/alfresco/bootstrap/descriptor.xml index d3a38fe112..ccda4622f8 100644 --- a/config/alfresco/bootstrap/descriptor.xml +++ b/config/alfresco/bootstrap/descriptor.xml @@ -9,4 +9,12 @@ ${version.schema} + + ${version.major} + ${version.minor} + ${version.revision} + ${version.label} + ${version.schema} + + diff --git a/config/alfresco/core-services-context.xml b/config/alfresco/core-services-context.xml index daf5875c01..ecd83f876c 100644 --- a/config/alfresco/core-services-context.xml +++ b/config/alfresco/core-services-context.xml @@ -715,6 +715,7 @@ ${version.label} ${version.schema} ${system.descriptor.childname} + ${system.descriptor.current.childname} diff --git a/config/alfresco/model/systemModel.xml b/config/alfresco/model/systemModel.xml index e4ba3d94bc..bd707a45b7 100644 --- a/config/alfresco/model/systemModel.xml +++ b/config/alfresco/model/systemModel.xml @@ -23,7 +23,7 @@ - Descriptor + Descriptor sys:base @@ -44,7 +44,7 @@ d:int true - 0 + 0 diff --git a/config/alfresco/repository.properties b/config/alfresco/repository.properties index aa3520d251..cd0f73d9d7 100644 --- a/config/alfresco/repository.properties +++ b/config/alfresco/repository.properties @@ -71,6 +71,7 @@ mail.password= system.store=system://system system.descriptor.childname=sys:descriptor +system.descriptor.current.childname=sys:descriptor-current # User config diff --git a/source/java/org/alfresco/model/ContentModel.java b/source/java/org/alfresco/model/ContentModel.java index c5855c46ac..2157a6827d 100644 --- a/source/java/org/alfresco/model/ContentModel.java +++ b/source/java/org/alfresco/model/ContentModel.java @@ -49,6 +49,12 @@ public interface ContentModel static final QName ASPECT_ROOT = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "aspect_root"); static final QName TYPE_STOREROOT = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "store_root"); + // descriptor properties + static final QName PROP_SYS_VERSION_MAJOR = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "versionMajor"); + static final QName PROP_SYS_VERSION_MINOR = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "versionMinor"); + static final QName PROP_SYS_VERSION_REVISION = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "versionRevision"); + static final QName PROP_SYS_VERSION_LABEL = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "versionLabel"); + static final QName PROP_SYS_VERSION_SCHEMA = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "versionSchema"); // // Content Model Definitions diff --git a/source/java/org/alfresco/repo/admin/patch/PatchServiceImpl.java b/source/java/org/alfresco/repo/admin/patch/PatchServiceImpl.java index 9fc862f487..de77be62b7 100644 --- a/source/java/org/alfresco/repo/admin/patch/PatchServiceImpl.java +++ b/source/java/org/alfresco/repo/admin/patch/PatchServiceImpl.java @@ -169,7 +169,7 @@ public class PatchServiceImpl implements PatchService String report = null; boolean success = false; // first check whether the patch is relevant to the repo - Descriptor repoDescriptor = descriptorService.getRepositoryDescriptor(); + Descriptor repoDescriptor = descriptorService.getInstalledRepositoryDescriptor(); boolean applies = applies(repoDescriptor, patch); if (!applies) { diff --git a/source/java/org/alfresco/repo/descriptor/DescriptorServiceImpl.java b/source/java/org/alfresco/repo/descriptor/DescriptorServiceImpl.java index 65ea325cca..62458828ed 100644 --- a/source/java/org/alfresco/repo/descriptor/DescriptorServiceImpl.java +++ b/source/java/org/alfresco/repo/descriptor/DescriptorServiceImpl.java @@ -18,14 +18,16 @@ package org.alfresco.repo.descriptor; import java.io.IOException; import java.io.Serializable; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.model.ContentModel; import org.alfresco.repo.importer.ImporterBootstrap; import org.alfresco.repo.transaction.TransactionUtil; -import org.alfresco.service.cmr.repository.InvalidStoreRefException; +import org.alfresco.repo.transaction.TransactionUtil.TransactionWork; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.StoreRef; @@ -35,6 +37,8 @@ import org.alfresco.service.descriptor.DescriptorService; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; import org.alfresco.service.transaction.TransactionService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationListener; @@ -49,6 +53,8 @@ import org.springframework.core.io.Resource; */ public class DescriptorServiceImpl implements DescriptorService, ApplicationListener, InitializingBean { + private static Log logger = LogFactory.getLog(DescriptorServiceImpl.class); + private Properties serverProperties; private ImporterBootstrap systemBootstrap; @@ -58,7 +64,7 @@ public class DescriptorServiceImpl implements DescriptorService, ApplicationList private TransactionService transactionService; private Descriptor serverDescriptor; - private Descriptor repoDescriptor; + private Descriptor installedRepoDescriptor; @@ -126,9 +132,9 @@ public class DescriptorServiceImpl implements DescriptorService, ApplicationList /* (non-Javadoc) * @see org.alfresco.service.descriptor.DescriptorService#getRepositoryDescriptor() */ - public Descriptor getRepositoryDescriptor() + public Descriptor getInstalledRepositoryDescriptor() { - return repoDescriptor; + return installedRepoDescriptor; } /** @@ -138,15 +144,23 @@ public class DescriptorServiceImpl implements DescriptorService, ApplicationList { if (event instanceof ContextRefreshedEvent) { + // initialise server descriptor + serverDescriptor = createServerDescriptor(); + // initialise the repository descriptor // note: this requires that the repository schema has already been initialised - repoDescriptor = TransactionUtil.executeInUserTransaction(transactionService, new TransactionUtil.TransactionWork() + TransactionWork createDescriptorWork = new TransactionUtil.TransactionWork() { public Descriptor doWork() { - return createRepositoryDescriptor(); + // persist the server descriptor values + updateCurrentRepositoryDescriptor(serverDescriptor); + + // return the repository installed descriptor + return createInstalledRepositoryDescriptor(); } - }); + }; + installedRepoDescriptor = TransactionUtil.executeInUserTransaction(transactionService, createDescriptorWork); } } @@ -155,8 +169,6 @@ public class DescriptorServiceImpl implements DescriptorService, ApplicationList */ public void afterPropertiesSet() throws Exception { - // initialise server descriptor - serverDescriptor = createServerDescriptor(); } /** @@ -174,7 +186,7 @@ public class DescriptorServiceImpl implements DescriptorService, ApplicationList * * @return descriptor */ - private Descriptor createRepositoryDescriptor() + private Descriptor createInstalledRepositoryDescriptor() { // retrieve system descriptor location StoreRef storeRef = systemBootstrap.getStoreRef(); @@ -182,30 +194,117 @@ public class DescriptorServiceImpl implements DescriptorService, ApplicationList String path = systemProperties.getProperty("system.descriptor.childname"); // retrieve system descriptor - NodeRef descriptorRef = null; - try - { - NodeRef rootNode = nodeService.getRootNode(storeRef); - List nodeRefs = searchService.selectNodes(rootNode, "/" + path, null, namespaceService, false); - if (nodeRefs.size() > 0) - { - descriptorRef = nodeRefs.get(0); - } - } - catch(InvalidStoreRefException e) - { - // handle as system descriptor not found - } - + NodeRef descriptorNodeRef = getDescriptorNodeRef(storeRef, path, false); // create appropriate descriptor - if (descriptorRef != null) + if (descriptorNodeRef != null) { - Map properties = nodeService.getProperties(descriptorRef); + Map properties = nodeService.getProperties(descriptorNodeRef); return new RepositoryDescriptor(properties); } + else + { + // descriptor cannot be found + return new UnknownDescriptor(); + } + } + + /** + * Push the current server descriptor properties into persistence. + * + * @param serverDescriptor the current server descriptor + */ + private void updateCurrentRepositoryDescriptor(Descriptor serverDescriptor) + { + // retrieve system descriptor location + StoreRef storeRef = systemBootstrap.getStoreRef(); + Properties systemProperties = systemBootstrap.getConfiguration(); + String path = systemProperties.getProperty("system.descriptor.current.childname"); - // descriptor cannot be found - return new UnknownDescriptor(); + // retrieve system descriptor + NodeRef currentDescriptorNodeRef = getDescriptorNodeRef(storeRef, path, true); + // if the node is missing but it should have been created + if (currentDescriptorNodeRef == null) + { + return; + } + // set the properties + Map properties = new HashMap(17); + properties.put(ContentModel.PROP_SYS_VERSION_MAJOR, serverDescriptor.getVersionMajor()); + properties.put(ContentModel.PROP_SYS_VERSION_MINOR, serverDescriptor.getVersionMinor()); + properties.put(ContentModel.PROP_SYS_VERSION_REVISION, serverDescriptor.getVersionRevision()); + properties.put(ContentModel.PROP_SYS_VERSION_LABEL, serverDescriptor.getVersionLabel()); + properties.put(ContentModel.PROP_SYS_VERSION_SCHEMA, serverDescriptor.getSchema()); + nodeService.setProperties(currentDescriptorNodeRef, properties); + // done + if (logger.isDebugEnabled()) + { + 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. + * @return Returns the node for the path, or null + */ + private NodeRef getDescriptorNodeRef(StoreRef storeRef, String path, boolean create) + { + // check for the store and create if necessary + if (!nodeService.exists(storeRef) && create) + { + storeRef = nodeService.createStore(storeRef.getProtocol(), storeRef.getIdentifier()); + } + + String searchPath = "/" + path; + NodeRef descriptorNodeRef = null; + NodeRef rootNodeRef = nodeService.getRootNode(storeRef); + List nodeRefs = searchService.selectNodes(rootNodeRef, searchPath, null, namespaceService, false); + if (nodeRefs.size() == 1) + { + descriptorNodeRef = nodeRefs.get(0); + } + else if (nodeRefs.size() == 0) + { + } + else if (nodeRefs.size() > 1) + { + if (logger.isDebugEnabled()) + { + 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); + } + // create if necessary + if (create) + { + descriptorNodeRef = nodeService.createNode( + rootNodeRef, + ContentModel.ASSOC_CHILDREN, + QName.createQName(path, namespaceService), + QName.createQName("sys:descriptor", namespaceService)).getChildRef(); + if (logger.isDebugEnabled()) + { + logger.debug("Created missing descriptor node: " + descriptorNodeRef); + } + } + } + return descriptorNodeRef; } /** diff --git a/source/java/org/alfresco/repo/descriptor/DescriptorServiceTest.java b/source/java/org/alfresco/repo/descriptor/DescriptorServiceTest.java index 2f1cdd0cde..06809133b0 100644 --- a/source/java/org/alfresco/repo/descriptor/DescriptorServiceTest.java +++ b/source/java/org/alfresco/repo/descriptor/DescriptorServiceTest.java @@ -88,7 +88,7 @@ public class DescriptorServiceTest extends BaseSpringTest { ServiceRegistry registry = (ServiceRegistry)applicationContext.getBean(ServiceRegistry.SERVICE_REGISTRY); DescriptorService descriptorService = registry.getDescriptorService(); - Descriptor repoDescriptor = descriptorService.getRepositoryDescriptor(); + Descriptor repoDescriptor = descriptorService.getInstalledRepositoryDescriptor(); String major = repoDescriptor.getVersionMajor(); String minor = repoDescriptor.getVersionMinor(); diff --git a/source/java/org/alfresco/repo/descriptor/DescriptorStartupLog.java b/source/java/org/alfresco/repo/descriptor/DescriptorStartupLog.java index afd64b3fc9..8870123bd0 100644 --- a/source/java/org/alfresco/repo/descriptor/DescriptorStartupLog.java +++ b/source/java/org/alfresco/repo/descriptor/DescriptorStartupLog.java @@ -84,15 +84,24 @@ public class DescriptorStartupLog implements ApplicationListener if (logger.isInfoEnabled()) { Descriptor serverDescriptor = descriptorService.getServerDescriptor(); - Descriptor repoDescriptor = descriptorService.getRepositoryDescriptor(); + Descriptor installedRepoDescriptor = descriptorService.getInstalledRepositoryDescriptor(); String serverEdition = serverDescriptor.getEdition(); String serverVersion = serverDescriptor.getVersion(); - String repoVersion = repoDescriptor.getVersion(); - int schemaVersion = repoDescriptor.getSchema(); - logger.info(String.format("Alfresco started (%s) - v%s; repository v%s; schema %d", - serverEdition, serverVersion, repoVersion, schemaVersion)); + int serverSchemaVersion = serverDescriptor.getSchema(); + String installedRepoVersion = installedRepoDescriptor.getVersion(); + int installedSchemaVersion = installedRepoDescriptor.getSchema(); + logger.info( + String.format( + "Alfresco started (%s): " + + "Current version %s schema %d - " + + "Installed version %s schema %d", + serverEdition, + serverVersion, + serverSchemaVersion, + installedRepoVersion, + installedSchemaVersion)); } } } -} +} \ No newline at end of file diff --git a/source/java/org/alfresco/service/descriptor/DescriptorService.java b/source/java/org/alfresco/service/descriptor/DescriptorService.java index 5264827fb4..3096ea7fb3 100644 --- a/source/java/org/alfresco/service/descriptor/DescriptorService.java +++ b/source/java/org/alfresco/service/descriptor/DescriptorService.java @@ -33,10 +33,11 @@ public interface DescriptorService public Descriptor getServerDescriptor(); /** - * Get descriptor for the repository + * Get descriptor for the repository as it was when first installed. The current + * repository descriptor will always be the same as the + * {@link #getServerDescriptor() server descriptor}. * * @return repository descriptor */ - public Descriptor getRepositoryDescriptor(); - + public Descriptor getInstalledRepositoryDescriptor(); }