From 2f551e5e7dfd19e9b1f06c6a52017a8397a14223 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Mon, 25 Mar 2013 17:54:01 +0000 Subject: [PATCH] Fix some merge errors: removing clustering references not valid in community. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@48571 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../extension/hazelcastConfig.xml.sample | 192 ------------------ config/alfresco/hazelcast/hazelcast-ec2.xml | 183 ----------------- config/alfresco/hazelcast/hazelcast-tcp.xml | 180 ---------------- config/alfresco/hazelcast/hazelcast-udp.xml | 179 ---------------- config/alfresco/repository.properties | 19 -- config/alfresco/webdav-context.xml | 33 +-- .../cluster/HazelcastConfigFactoryBean.java | 172 ---------------- .../HazelcastConfigFactoryBeanTest.java | 69 ------- .../cluster/HazelcastInstanceFactory.java | 139 ------------- .../repo/webdav/LockStoreFactoryImpl.java | 79 ------- .../cluster-test/placeholder-test.xml | 166 --------------- 11 files changed, 1 insertion(+), 1410 deletions(-) diff --git a/config/alfresco/extension/hazelcastConfig.xml.sample b/config/alfresco/extension/hazelcastConfig.xml.sample index 5cd2991026..e69de29bb2 100644 --- a/config/alfresco/extension/hazelcastConfig.xml.sample +++ b/config/alfresco/extension/hazelcastConfig.xml.sample @@ -1,192 +0,0 @@ - - - - dev - dev-pass - - - 5701 - - - 224.2.2.3 - 54327 - - - 127.0.0.1 - - - - 192.168.56.1 - - - - PBEWithMD5AndDES - - thesalt - - thepass - - 19 - - - - RSA/NONE/PKCS1PADDING - - thekeypass - - local - - JKS - - thestorepass - - keystore - - - - 16 - 64 - 60 - - - - 0 - - 0 - - - - 1 - - NONE - - 0 - - 25 - - - hz.ADD_NEW_ENTRY - - - - - - 1 - - NONE - - 0 - - 25 - - - hz.ADD_NEW_ENTRY - - - - \ No newline at end of file diff --git a/config/alfresco/hazelcast/hazelcast-ec2.xml b/config/alfresco/hazelcast/hazelcast-ec2.xml index b4a3f8b7bd..e69de29bb2 100644 --- a/config/alfresco/hazelcast/hazelcast-ec2.xml +++ b/config/alfresco/hazelcast/hazelcast-ec2.xml @@ -1,183 +0,0 @@ - - - - ${alfresco.cluster.name} - ${alfresco.hazelcast.password} - - - 5701 - - - 224.2.2.3 - 54327 - - - 127.0.0.1 - - - ${alfresco.hazelcast.ec2.accesskey} - ${alfresco.hazelcast.ec2.secretkey} - - ${alfresco.hazelcast.ec2.region} - - ${alfresco.hazelcast.ec2.securitygroup} - ${alfresco.hazelcast.ec2.tagkey} - ${alfresco.hazelcast.ec2.tagvalue} - - - - 10.10.1.* - - - - PBEWithMD5AndDES - - thesalt - - thepass - - 19 - - - - RSA/NONE/PKCS1PADDING - - thekeypass - - local - - JKS - - thestorepass - - keystore - - - - 16 - 64 - 60 - - - - 0 - - default - - - - 1 - - 0 - - 0 - - NONE - - 0 - - 25 - - hz.ADD_NEW_ENTRY - - - - - 1 - ${alfresco.hazelcast.conccurrentuser.timeToLive} - 0 - LRU - 0 - 25 - hz.ADD_NEW_ENTRY - 15 - - - - - - - - log4j - false - false - false - - - \ No newline at end of file diff --git a/config/alfresco/hazelcast/hazelcast-tcp.xml b/config/alfresco/hazelcast/hazelcast-tcp.xml index 8fa5a13238..e69de29bb2 100644 --- a/config/alfresco/hazelcast/hazelcast-tcp.xml +++ b/config/alfresco/hazelcast/hazelcast-tcp.xml @@ -1,180 +0,0 @@ - - - - ${alfresco.cluster.name} - ${alfresco.hazelcast.password} - - - 5701 - - - 224.2.2.3 - 54327 - - - ${alfresco.hazelcast.tcp.config} - 127.0.0.1 - - - my-access-key - my-secret-key - - us-west-1 - - hazelcast-sg - type - hz-nodes - - - - 10.10.1.* - - - - PBEWithMD5AndDES - - thesalt - - thepass - - 19 - - - - RSA/NONE/PKCS1PADDING - - thekeypass - - local - - JKS - - thestorepass - - keystore - - - - 16 - 64 - 60 - - - - 0 - - default - - - - 1 - - 0 - - 0 - - NONE - - 0 - - 25 - - hz.ADD_NEW_ENTRY - - - - - 1 - ${alfresco.hazelcast.conccurrentuser.timeToLive} - 0 - LRU - 0 - 25 - hz.ADD_NEW_ENTRY - 15 - - - - - - - - log4j - - \ No newline at end of file diff --git a/config/alfresco/hazelcast/hazelcast-udp.xml b/config/alfresco/hazelcast/hazelcast-udp.xml index 4b6765eda9..e69de29bb2 100644 --- a/config/alfresco/hazelcast/hazelcast-udp.xml +++ b/config/alfresco/hazelcast/hazelcast-udp.xml @@ -1,179 +0,0 @@ - - - - ${alfresco.cluster.name} - ${alfresco.hazelcast.password} - - - 5701 - - - 224.2.2.3 - 54327 - - - 127.0.0.1 - - - my-access-key - my-secret-key - - us-west-1 - - hazelcast-sg - type - hz-nodes - - - - 10.10.1.* - - - - PBEWithMD5AndDES - - thesalt - - thepass - - 19 - - - - RSA/NONE/PKCS1PADDING - - thekeypass - - local - - JKS - - thestorepass - - keystore - - - - 16 - 64 - 60 - - - - 0 - - default - - - - 1 - - 0 - - 0 - - NONE - - 0 - - 25 - - hz.ADD_NEW_ENTRY - - - - - 1 - ${alfresco.hazelcast.conccurrentuser.timeToLive} - 0 - LRU - 0 - 25 - hz.ADD_NEW_ENTRY - 15 - - - - - - - - log4j - - \ No newline at end of file diff --git a/config/alfresco/repository.properties b/config/alfresco/repository.properties index 13ad3ae078..5a71f920c6 100644 --- a/config/alfresco/repository.properties +++ b/config/alfresco/repository.properties @@ -141,25 +141,6 @@ index.reindexMissingContent.cronExpression=* * * * * ? 2099 system.bootstrap.config_check.strict=true -# Hazelcast clustering configuration -# Password to join the cluster -alfresco.hazelcast.password=alfrescocluster -# Protocol used for member discovery (tcp, ec2, udp) -alfresco.hazelcast.protocol=tcp -# Location of the Hazelcast configuration file -alfresco.hazelcast.configLocation=classpath:alfresco/hazelcast/hazelcast-${alfresco.hazelcast.protocol}.xml -# XML elements to incorporate into Hazelcast config, in particular -# hostnames to use for membership discovery -alfresco.hazelcast.tcp.config=localhost -# Amazon Web Services - EC2 discovery -alfresco.hazelcast.ec2.accesskey=my-access-key -alfresco.hazelcast.ec2.secretkey=my-secret-key -alfresco.hazelcast.ec2.region=us-east-1 -# Only instances belonging to this group will be discovered, default will try all running instances -alfresco.hazelcast.ec2.securitygroup= -alfresco.hazelcast.ec2.tagkey=type -alfresco.hazelcast.ec2.tagvalue=hz-nodes - # Time to live for concurrent user credentials alfresco.conccurrentusers.timeToLive=300 diff --git a/config/alfresco/webdav-context.xml b/config/alfresco/webdav-context.xml index a45954e5ae..3a721d3fac 100644 --- a/config/alfresco/webdav-context.xml +++ b/config/alfresco/webdav-context.xml @@ -25,38 +25,7 @@ - - - - - - - - - - - ${alfresco.cluster.name} - ${alfresco.hazelcast.password} - ${alfresco.hazelcast.specify.interface} - ${alfresco.hazelcast.bind.interface} - - ${alfresco.hazelcast.tcp.config} - - ${alfresco.hazelcast.ec2.accesskey} - ${alfresco.hazelcast.ec2.secretkey} - ${alfresco.hazelcast.ec2.region} - ${alfresco.hazelcast.ec2.securitygroup} - ${alfresco.hazelcast.ec2.tagkey} - ${alfresco.hazelcast.ec2.tagvalue} - - ${alfresco.conccurrentusers.timeToLive} - - - - - - - + \ No newline at end of file diff --git a/source/java/org/alfresco/repo/cluster/HazelcastConfigFactoryBean.java b/source/java/org/alfresco/repo/cluster/HazelcastConfigFactoryBean.java index 405535583c..e69de29bb2 100644 --- a/source/java/org/alfresco/repo/cluster/HazelcastConfigFactoryBean.java +++ b/source/java/org/alfresco/repo/cluster/HazelcastConfigFactoryBean.java @@ -1,172 +0,0 @@ -/* - * Copyright (C) 2005-2012 Alfresco Software Limited. - * - * This file is part of Alfresco - * - * Alfresco is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Alfresco is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Alfresco. If not, see . - */ -package org.alfresco.repo.cluster; - -import java.io.IOException; -import java.io.InputStream; -import java.io.StringWriter; -import java.util.Properties; -import java.util.regex.Pattern; - -import org.apache.commons.io.IOUtils; -import org.springframework.beans.factory.FactoryBean; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.io.Resource; - -import com.hazelcast.config.Config; -import com.hazelcast.config.InMemoryXmlConfig; - -/** - * FactoryBean used to create Hazelcast {@link Config} objects. A configuration file is supplied - * in the form of a Spring {@link Resource} and a set of {@link Properties} can also be provided. The - * XML file is processed so that property placeholders of the form ${property.name} are substitued for - * the corresponding property value before the XML is parsed into the Hazelcast configuration object. - * - * @author Matt Ward - */ -public class HazelcastConfigFactoryBean implements InitializingBean, FactoryBean -{ - private static final String PLACEHOLDER_END = "}"; - private static final String PLACEHOLDER_START = "${"; - private Resource configFile; - private Config config; - private Properties properties; - - - /** - * Set the Hazelcast XML configuration file to use. This will be merged with the supplied - * Properties and parsed to produce a final {@link Config} object. - * @param configFile the configFile to set - */ - public void setConfigFile(Resource configFile) - { - this.configFile = configFile; - } - - /** - * Used to supply the set of Properties that the configuration file can reference. - * - * @param properties the properties to set - */ - public void setProperties(Properties properties) - { - this.properties = properties; - } - - /** - * Spring {@link InitializingBean} lifecycle method. Substitutes property placeholders for their - * corresponding values and creates a {@link Config Hazelcast configuration} with the post-processed - * XML file - ready for the {@link #getObject()} factory method to be used to retrieve it. - */ - @Override - public void afterPropertiesSet() throws Exception - { - if (configFile == null) - { - throw new IllegalArgumentException("No configuration file specified."); - } - if (properties == null) - { - properties = new Properties(); - } - - // These configXML strings will be large and are therefore intended - // to be thrown away. We only want to keep the final Config object. - String rawConfigXML = getConfigFileContents(); - String configXML = substituteProperties(rawConfigXML); - config = new InMemoryXmlConfig(configXML); - } - - /** - * For the method parameter text, replaces all occurrences of placeholders having - * the form ${property.name} with the value of the property having the key "property.name". The - * properties are supplied using {@link #setProperties(Properties)}. - * - * @param text The String to apply property substitutions to. - * @return String after substitutions have been applied. - */ - private String substituteProperties(String text) - { - for (String propName : properties.stringPropertyNames()) - { - String propValue = properties.getProperty(propName); - String quotedPropName = Pattern.quote(PLACEHOLDER_START + propName + PLACEHOLDER_END); - text = text.replaceAll(quotedPropName, propValue); - } - - return text; - } - - /** - * Opens the configFile {@link Resource} and reads the contents into a String. - * - * @return the contents of the configFile resource. - */ - private String getConfigFileContents() - { - StringWriter writer = new StringWriter(); - InputStream inputStream = null; - try - { - inputStream = configFile.getInputStream(); - IOUtils.copy(inputStream, writer, "UTF-8"); - return writer.toString(); - } - catch (IOException e) - { - throw new RuntimeException("Couldn't read configuration: " + configFile, e); - } - finally - { - try - { - if (inputStream != null) - { - inputStream.close(); - } - } - catch (IOException e) - { - throw new RuntimeException("Couldn't close stream", e); - } - } - } - - /** - * FactoryBean's factory method. Returns the config with the property key/value - * substitutions in place. - */ - @Override - public Config getObject() throws Exception - { - return config; - } - - @Override - public Class getObjectType() - { - return Config.class; - } - - @Override - public boolean isSingleton() - { - return true; - } -} diff --git a/source/java/org/alfresco/repo/cluster/HazelcastConfigFactoryBeanTest.java b/source/java/org/alfresco/repo/cluster/HazelcastConfigFactoryBeanTest.java index 5a897852cf..e69de29bb2 100644 --- a/source/java/org/alfresco/repo/cluster/HazelcastConfigFactoryBeanTest.java +++ b/source/java/org/alfresco/repo/cluster/HazelcastConfigFactoryBeanTest.java @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2005-2012 Alfresco Software Limited. - * - * This file is part of Alfresco - * - * Alfresco is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Alfresco is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Alfresco. If not, see . - */ -package org.alfresco.repo.cluster; - -import static org.junit.Assert.assertEquals; - -import java.util.Properties; - -import org.junit.Before; -import org.junit.Test; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; - -import com.hazelcast.config.Config; - -/** - * Tests for the HazelcastConfigFactoryBean class. - * - * @author Matt Ward - */ -public class HazelcastConfigFactoryBeanTest -{ - private HazelcastConfigFactoryBean configFactory; - private Resource resource; - private Properties properties; - - @Before - public void setUp() throws Exception - { - configFactory = new HazelcastConfigFactoryBean(); - resource = new ClassPathResource("cluster-test/placeholder-test.xml"); - configFactory.setConfigFile(resource); - - properties = new Properties(); - properties.setProperty("alfresco.hazelcast.password", "let-me-in"); - properties.setProperty("alfresco.cluster.name", "cluster-name"); - configFactory.setProperties(properties); - - // Trigger the spring post-bean creation lifecycle method - configFactory.afterPropertiesSet(); - } - - - @Test - public void testConfigHasNewPropertyValues() throws Exception - { - // Invoke the factory method. - Config config = configFactory.getObject(); - - assertEquals("let-me-in", config.getGroupConfig().getPassword()); - assertEquals("cluster-name", config.getGroupConfig().getName()); - } -} diff --git a/source/java/org/alfresco/repo/cluster/HazelcastInstanceFactory.java b/source/java/org/alfresco/repo/cluster/HazelcastInstanceFactory.java index 92652f389c..e69de29bb2 100644 --- a/source/java/org/alfresco/repo/cluster/HazelcastInstanceFactory.java +++ b/source/java/org/alfresco/repo/cluster/HazelcastInstanceFactory.java @@ -1,139 +0,0 @@ -/* - * Copyright (C) 2005-2013 Alfresco Software Limited. - * - * This file is part of Alfresco - * - * Alfresco is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Alfresco is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Alfresco. If not, see . - */ -package org.alfresco.repo.cluster; - -import java.util.concurrent.locks.ReentrantReadWriteLock; - -import org.alfresco.util.PropertyCheck; - -import com.hazelcast.config.Config; -import com.hazelcast.core.Hazelcast; -import com.hazelcast.core.HazelcastInstance; - -/** - * Provides a way of lazily creating HazelcastInstances for a given configuration. - * The HazelcastInstance will not be created until {@link #getInstance()} is called. - *

- * An intermediary class such as this is required in order to avoid starting - * Hazelcast instances when clustering is not configured/required. Otherwise - * simply by defining a HazelcastInstance bean clustering would spring into life. - *

- * Please note this class provides non-static access deliberately, and should be - * injected into any clients that require its services. - * - * @author Matt Ward - */ -public class HazelcastInstanceFactory -{ - private Config config; - private HazelcastInstance hazelcastInstance; - /** Guards {@link #config} and {@link #hazelcastInstance} */ - private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(); - - public HazelcastInstance getInstance() - { - rwLock.readLock().lock(); - try - { - if (hazelcastInstance != null) - { - return hazelcastInstance; - } - } - finally - { - rwLock.readLock().unlock(); - } - - // hazelcastInstance is null, so create it. - rwLock.writeLock().lock(); - try - { - // Double check condition hasn't changed in between locks. - if (hazelcastInstance == null) - { - hazelcastInstance = Hazelcast.newHazelcastInstance(config); - } - return hazelcastInstance; - } - finally - { - rwLock.writeLock().unlock(); - } - } - - /** - * Checks whether hazelcast has been given a valid cluster name. If so, - * then clustering is considered enabled. This condition should be checked - * before calling {@link #getInstance()}. - * - * @return true if clustering is enabled, false otherwise. - */ - public boolean isClusteringEnabled() - { - rwLock.readLock().lock(); - try - { - String clusterName = config.getGroupConfig().getName(); - return (PropertyCheck.isValidPropertyString(clusterName)); - } - finally - { - rwLock.readLock().unlock(); - } - } - - /** - * Retrieve the name of the cluster for the configuration used by this factory. - * - * @return String - the cluster name. - */ - public String getClusterName() - { - rwLock.readLock().lock(); - try - { - String clusterName = config.getGroupConfig().getName(); - return clusterName; - } - finally - { - rwLock.readLock().unlock(); - } - } - - /** - * Sets the Hazelcast configuration that will be used by this factory when - * creating the HazelcastInstance. - * - * @param config Hazelcast configuration - */ - public void setConfig(Config config) - { - rwLock.writeLock().lock(); - try - { - this.config = config; - } - finally - { - rwLock.writeLock().unlock(); - } - } -} diff --git a/source/java/org/alfresco/repo/webdav/LockStoreFactoryImpl.java b/source/java/org/alfresco/repo/webdav/LockStoreFactoryImpl.java index 351e406b7c..e69de29bb2 100644 --- a/source/java/org/alfresco/repo/webdav/LockStoreFactoryImpl.java +++ b/source/java/org/alfresco/repo/webdav/LockStoreFactoryImpl.java @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2005-2013 Alfresco Software Limited. - * - * This file is part of Alfresco - * - * Alfresco is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Alfresco is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Alfresco. If not, see . - */ -package org.alfresco.repo.webdav; - -import java.util.concurrent.ConcurrentMap; - -import org.alfresco.repo.cluster.HazelcastInstanceFactory; -import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.util.PropertyCheck; - -import com.hazelcast.core.HazelcastInstance; - - -/** - * Default implementation of the {@link LockStoreFactory} interface. Creates {@link LockStore}s - * backed by a Hazelcast distributed Map if the clusterName property is set, - * otherwise it creates a non-clustered {@link SimpleLockStore}. - * - * @see LockStoreFactory - * @see LockStoreImpl - * @author Matt Ward - */ -public class LockStoreFactoryImpl implements LockStoreFactory -{ - private static final String HAZELCAST_MAP_NAME = "webdav-locks"; - private HazelcastInstanceFactory hazelcastInstanceFactory; - private String clusterName; - - /** - * This method should be used sparingly and the created {@link LockStore}s should be - * retained (this factory does not cache instances of them). - */ - @Override - public synchronized LockStore createLockStore() - { - if (!PropertyCheck.isValidPropertyString(clusterName)) - { - return new SimpleLockStore(); - } - else - { - HazelcastInstance instance = hazelcastInstanceFactory.getInstance(); - ConcurrentMap map = instance.getMap(HAZELCAST_MAP_NAME); - return new LockStoreImpl(map); - } - } - - /** - * @param hazelcastInstanceFactory the factory that will create a HazelcastInstance if required. - */ - public synchronized void setHazelcastInstanceFactory(HazelcastInstanceFactory hazelcastInstanceFactory) - { - this.hazelcastInstanceFactory = hazelcastInstanceFactory; - } - - /** - * @param clusterName the clusterName to set - */ - public synchronized void setClusterName(String clusterName) - { - this.clusterName = clusterName; - } -} diff --git a/source/test-resources/cluster-test/placeholder-test.xml b/source/test-resources/cluster-test/placeholder-test.xml index 9bbcaab1a7..e69de29bb2 100644 --- a/source/test-resources/cluster-test/placeholder-test.xml +++ b/source/test-resources/cluster-test/placeholder-test.xml @@ -1,166 +0,0 @@ - - - - - ${alfresco.cluster.name} - ${alfresco.hazelcast.password} - - - 5701 - - - 224.2.2.3 - 54327 - - - 127.0.0.1 - - - my-access-key - my-secret-key - - us-west-1 - - hazelcast-sg - type - hz-nodes - - - - 10.10.1.* - - - - PBEWithMD5AndDES - - thesalt - - thepass - - 19 - - - - RSA/NONE/PKCS1PADDING - - thekeypass - - local - - JKS - - thestorepass - - keystore - - - - 16 - 64 - 60 - - - - 0 - - default - - - - 1 - - 0 - - 0 - - NONE - - 0 - - 25 - - hz.ADD_NEW_ENTRY - - - - - - \ No newline at end of file