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();
}