registry based persistence
Project: http://git-wip-us.apache.org/repos/asf/incubator-stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-stratos/commit/aebdb087 Tree: http://git-wip-us.apache.org/repos/asf/incubator-stratos/tree/aebdb087 Diff: http://git-wip-us.apache.org/repos/asf/incubator-stratos/diff/aebdb087 Branch: refs/heads/master Commit: aebdb0879b017ab4b722a626521a46a22eaa4bff Parents: 1c2f93c Author: Isuru <[email protected]> Authored: Tue Dec 10 09:44:57 2013 +0530 Committer: Isuru <[email protected]> Committed: Tue Dec 10 09:44:57 2013 +0530 ---------------------------------------------------------------------- .../ClusterIdToCartridgeSubscriptionMap.java | 70 ++++++++++ .../adc/mgt/lookup/LookupDataHolder.java | 116 +++++++++------- ...criptionAliasToCartridgeSubscriptionMap.java | 71 ++++++++++ .../adc/mgt/persistence/PersistenceManager.java | 22 ++- .../RegistryBasedPersistenceManager.java | 102 ++++++++++++-- .../adc/mgt/registry/RegistryManager.java | 138 +++++++++++++++++++ .../adc/mgt/retriever/DataRetrievalManager.java | 89 +++++++----- .../stratos/adc/mgt/utils/Deserializer.java | 52 +++++++ .../stratos/adc/mgt/utils/Serializer.java | 83 +++++++++++ 9 files changed, 642 insertions(+), 101 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/aebdb087/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/lookup/ClusterIdToCartridgeSubscriptionMap.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/lookup/ClusterIdToCartridgeSubscriptionMap.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/lookup/ClusterIdToCartridgeSubscriptionMap.java new file mode 100644 index 0000000..864ffb2 --- /dev/null +++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/lookup/ClusterIdToCartridgeSubscriptionMap.java @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.stratos.adc.mgt.lookup; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.stratos.adc.mgt.subscription.CartridgeSubscription; + +import java.io.Serializable; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +public class ClusterIdToCartridgeSubscriptionMap implements Serializable { + + private static final Log log = LogFactory.getLog(ClusterIdToCartridgeSubscriptionMap.class); + + private Map<String, CartridgeSubscription> clusterItToCartridgeSubscrptionMap; + + public ClusterIdToCartridgeSubscriptionMap () { + clusterItToCartridgeSubscrptionMap = new HashMap<String, CartridgeSubscription>(); + } + + public Map<String, CartridgeSubscription> getSubscriptionAliasToCartridgeSubscriptionMap() { + return clusterItToCartridgeSubscrptionMap; + } + + public void addSubscription(String clusterId, CartridgeSubscription cartridgeSubscription) { + + if(clusterItToCartridgeSubscrptionMap.put(clusterId, cartridgeSubscription) != null) { + log.info("Overwrote the previous CartridgeSubscription value for cluster " + clusterId); + } + } + + public boolean isEmpty () { + return clusterItToCartridgeSubscrptionMap.isEmpty(); + } + + public void removeSubscription (String clusterId) { + + if(clusterItToCartridgeSubscrptionMap.remove(clusterId) == null) { + log.info("No CartridgeSubscription entry found for cluster " + clusterId); + } + } + + public CartridgeSubscription getCartridgeSubscription (String clusterId) { + return clusterItToCartridgeSubscrptionMap.get(clusterId); + } + + public Collection<CartridgeSubscription> getCartridgeSubscriptions () { + return clusterItToCartridgeSubscrptionMap.values(); + } +} http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/aebdb087/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/lookup/LookupDataHolder.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/lookup/LookupDataHolder.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/lookup/LookupDataHolder.java index f283753..5e704db 100644 --- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/lookup/LookupDataHolder.java +++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/lookup/LookupDataHolder.java @@ -23,16 +23,20 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.stratos.adc.mgt.subscription.CartridgeSubscription; -import java.util.*; +import java.io.Serializable; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.locks.ReentrantReadWriteLock; -public class LookupDataHolder { +public class LookupDataHolder implements Serializable { private static final Log log = LogFactory.getLog(LookupDataHolder.class); private Map<Integer, SubscriptionAliasToCartridgeSubscriptionMap> tenantIdToCartridgeSubscriptionCache; - private Map<String, CartridgeSubscription> clusterItToCartridgeSubscrptionMatch; + //private Map<String, CartridgeSubscription> clusterItToCartridgeSubscrptionMap; //private static LookupDataHolder lookupDataHolder; + private ClusterIdToCartridgeSubscriptionMap clusterIdToCartridgeSubscriptionMap; //locks private static volatile ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); @@ -41,7 +45,8 @@ public class LookupDataHolder { public LookupDataHolder () { tenantIdToCartridgeSubscriptionCache = new HashMap<Integer, SubscriptionAliasToCartridgeSubscriptionMap>(); - clusterItToCartridgeSubscrptionMatch = new HashMap<String, CartridgeSubscription>(); + //clusterItToCartridgeSubscrptionMap = new HashMap<String, CartridgeSubscription>(); + clusterIdToCartridgeSubscriptionMap = new ClusterIdToCartridgeSubscriptionMap(); } /*public static LookupDataHolder getInstance () { @@ -77,10 +82,31 @@ public class LookupDataHolder { aliasToSubscriptionMap.addSubscription(subscriptionAlias, cartridgeSubscription); } - if(clusterItToCartridgeSubscrptionMatch.put(cartridgeSubscription.getClusterDomain(), cartridgeSubscription) - != null) { - log.info("Overwrote the CartridgeSubscription value for cluster Id " + - cartridgeSubscription.getClusterDomain()); + clusterIdToCartridgeSubscriptionMap.addSubscription(cartridgeSubscription.getClusterDomain(), cartridgeSubscription); + + } finally { + writeLock.unlock(); + } + } + + public void addCartridgeSubscriptions (int tenantId, SubscriptionAliasToCartridgeSubscriptionMap aliasToSubscriptionMap) { + + } + + private void addSubscriptions (int tenantId, SubscriptionAliasToCartridgeSubscriptionMap aliasToSubscriptionMap) { + + writeLock.lock(); + + try { + if(tenantIdToCartridgeSubscriptionCache.put(tenantId, aliasToSubscriptionMap) != null) { + log.info("Existing SubscriptionAliasToCartridgeSubscriptionMap instance overwritten for tenant " + + tenantId); + } + + Collection<CartridgeSubscription> cartridgeSubscriptions = aliasToSubscriptionMap.getCartridgeSubscriptions(); + for (CartridgeSubscription cartridgeSubscription : cartridgeSubscriptions) { + clusterIdToCartridgeSubscriptionMap.addSubscription(cartridgeSubscription.getCluster().getClusterDomain(), + cartridgeSubscription); } } finally { @@ -110,8 +136,37 @@ public class LookupDataHolder { log.info("No SubscriptionAliasToCartridgeSubscriptionMap entry found for tenant Id " + tenantId); } - if(clusterItToCartridgeSubscrptionMatch.remove(clusterId) != null) { - log.info("No CartridgeSubscription entry found for cluster Id " + clusterId); + clusterIdToCartridgeSubscriptionMap.removeSubscription(clusterId); + + } finally { + writeLock.unlock(); + } + } + + public void removeCartridgeSubscriptions (int tenantId) { + removeSubscriptions(tenantId); + } + + private void removeSubscriptions (int tenantId) { + + writeLock.lock(); + + try { + SubscriptionAliasToCartridgeSubscriptionMap aliasToSubscriptionMap = tenantIdToCartridgeSubscriptionCache. + get(tenantId); + + if(aliasToSubscriptionMap != null) { + //remove the subscriptions referenced by cluster domain for this tenant + Collection<CartridgeSubscription> cartridgeSubscriptions = aliasToSubscriptionMap.getCartridgeSubscriptions(); + + for (CartridgeSubscription cartridgeSubscription : cartridgeSubscriptions) { + clusterIdToCartridgeSubscriptionMap.removeSubscription(cartridgeSubscription.getClusterDomain()); + } + //remove the map for this tenant ID + tenantIdToCartridgeSubscriptionCache.remove(tenantId); + + } else { + log.info("No SubscriptionAliasToCartridgeSubscriptionMap entry found for tenant Id " + tenantId); } } finally { @@ -154,7 +209,7 @@ public class LookupDataHolder { readLock.lock(); try { - return clusterItToCartridgeSubscrptionMatch.get(clusterId); + return clusterIdToCartridgeSubscriptionMap.getCartridgeSubscription(clusterId); } finally { readLock.unlock(); @@ -196,43 +251,4 @@ public class LookupDataHolder { readLock.unlock(); } } - - private class SubscriptionAliasToCartridgeSubscriptionMap { - - private Map<String, CartridgeSubscription> subscriptionAliasToCartridgeSubscriptionMap; - - public SubscriptionAliasToCartridgeSubscriptionMap () { - subscriptionAliasToCartridgeSubscriptionMap = new HashMap<String, CartridgeSubscription>(); - } - - public Map<String, CartridgeSubscription> getSubscriptionAliasToCartridgeSubscriptionMap() { - return subscriptionAliasToCartridgeSubscriptionMap; - } - - public void addSubscription(String subscriptionAlias, CartridgeSubscription cartridgeSubscription) { - - if(subscriptionAliasToCartridgeSubscriptionMap.put(subscriptionAlias, cartridgeSubscription) != null) { - log.info("Overwrote the previous CartridgeSubscription value for subscription alias" + subscriptionAlias); - } - } - - public boolean isEmpty () { - return subscriptionAliasToCartridgeSubscriptionMap.isEmpty(); - } - - public void removeSubscription (String subscriptionAlias) { - - if(subscriptionAliasToCartridgeSubscriptionMap.remove(subscriptionAlias) == null) { - log.info("No CartridgeSubscription entry found for subscription alias " + subscriptionAlias); - } - } - - public CartridgeSubscription getCartridgeSubscription (String cartridgeSubscriptionAlias) { - return subscriptionAliasToCartridgeSubscriptionMap.get(cartridgeSubscriptionAlias); - } - - public Collection<CartridgeSubscription> getCartridgeSubscriptions () { - return subscriptionAliasToCartridgeSubscriptionMap.values(); - } - } } http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/aebdb087/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/lookup/SubscriptionAliasToCartridgeSubscriptionMap.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/lookup/SubscriptionAliasToCartridgeSubscriptionMap.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/lookup/SubscriptionAliasToCartridgeSubscriptionMap.java new file mode 100644 index 0000000..56e9d7d --- /dev/null +++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/lookup/SubscriptionAliasToCartridgeSubscriptionMap.java @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.stratos.adc.mgt.lookup; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.stratos.adc.mgt.subscription.CartridgeSubscription; + +import java.io.Serializable; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +public class SubscriptionAliasToCartridgeSubscriptionMap implements Serializable { + + private static final Log log = LogFactory.getLog(SubscriptionAliasToCartridgeSubscriptionMap.class); + + + private Map<String, CartridgeSubscription> subscriptionAliasToCartridgeSubscriptionMap; + + public SubscriptionAliasToCartridgeSubscriptionMap () { + subscriptionAliasToCartridgeSubscriptionMap = new HashMap<String, CartridgeSubscription>(); + } + + public Map<String, CartridgeSubscription> getSubscriptionAliasToCartridgeSubscriptionMap() { + return subscriptionAliasToCartridgeSubscriptionMap; + } + + public void addSubscription(String subscriptionAlias, CartridgeSubscription cartridgeSubscription) { + + if(subscriptionAliasToCartridgeSubscriptionMap.put(subscriptionAlias, cartridgeSubscription) != null) { + log.info("Overwrote the previous CartridgeSubscription value for subscription alias" + subscriptionAlias); + } + } + + public boolean isEmpty () { + return subscriptionAliasToCartridgeSubscriptionMap.isEmpty(); + } + + public void removeSubscription (String subscriptionAlias) { + + if(subscriptionAliasToCartridgeSubscriptionMap.remove(subscriptionAlias) == null) { + log.info("No CartridgeSubscription entry found for subscription alias " + subscriptionAlias); + } + } + + public CartridgeSubscription getCartridgeSubscription (String cartridgeSubscriptionAlias) { + return subscriptionAliasToCartridgeSubscriptionMap.get(cartridgeSubscriptionAlias); + } + + public Collection<CartridgeSubscription> getCartridgeSubscriptions () { + return subscriptionAliasToCartridgeSubscriptionMap.values(); + } +} http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/aebdb087/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/persistence/PersistenceManager.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/persistence/PersistenceManager.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/persistence/PersistenceManager.java index 1e8936a..b948e84 100644 --- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/persistence/PersistenceManager.java +++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/persistence/PersistenceManager.java @@ -20,13 +20,25 @@ package org.apache.stratos.adc.mgt.persistence; import org.apache.stratos.adc.mgt.exception.PersistenceManagerException; -import org.apache.stratos.adc.mgt.subscription.CartridgeSubscription; - -import java.util.List; +import org.apache.stratos.adc.mgt.lookup.ClusterIdToCartridgeSubscriptionMap; +import org.apache.stratos.adc.mgt.lookup.SubscriptionAliasToCartridgeSubscriptionMap; public abstract class PersistenceManager { - public abstract void persistCartridgeSubscription (CartridgeSubscription cartridgeSubscription) + public abstract void persistCartridgeSubscriptions (int tenantId, SubscriptionAliasToCartridgeSubscriptionMap + aliasToSubscriptionMap) + throws PersistenceManagerException; + + public abstract SubscriptionAliasToCartridgeSubscriptionMap retrieveCartridgeSubscriptions (int tenantId) + throws PersistenceManagerException; + + public abstract void persistCartridgeSubscriptions (String clusterId, ClusterIdToCartridgeSubscriptionMap clusterIdToSubscriptionMap) + throws PersistenceManagerException; + + public abstract ClusterIdToCartridgeSubscriptionMap retrieveCartridgeSubscriptions (String clusterId) + throws PersistenceManagerException; + + /*public abstract void persistCartridgeSubscription (CartridgeSubscription cartridgeSubscription) throws PersistenceManagerException; public abstract void removeCartridgeSubscription (int tenantId, String alias) @@ -41,7 +53,7 @@ public abstract class PersistenceManager { public abstract CartridgeSubscription getCartridgeSubscription (String clusterDomain) throws PersistenceManagerException; - /*public abstract List<CartridgeSubscription> getCartridgeSubscriptions(int tenantId, String cartridgeType) + public abstract List<CartridgeSubscription> getCartridgeSubscriptions(int tenantId, String cartridgeType) throws PersistenceManagerException; public abstract Repository getRepository (int tenantId, String alias) http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/aebdb087/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/persistence/RegistryBasedPersistenceManager.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/persistence/RegistryBasedPersistenceManager.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/persistence/RegistryBasedPersistenceManager.java index e69585c..c796767 100644 --- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/persistence/RegistryBasedPersistenceManager.java +++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/persistence/RegistryBasedPersistenceManager.java @@ -19,35 +19,107 @@ package org.apache.stratos.adc.mgt.persistence; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.stratos.adc.mgt.exception.ADCException; import org.apache.stratos.adc.mgt.exception.PersistenceManagerException; -import org.apache.stratos.adc.mgt.subscription.CartridgeSubscription; - -import java.util.List; +import org.apache.stratos.adc.mgt.lookup.ClusterIdToCartridgeSubscriptionMap; +import org.apache.stratos.adc.mgt.lookup.SubscriptionAliasToCartridgeSubscriptionMap; +import org.apache.stratos.adc.mgt.registry.RegistryManager; +import org.apache.stratos.adc.mgt.utils.Deserializer; +import org.wso2.carbon.registry.core.exceptions.RegistryException; public class RegistryBasedPersistenceManager extends PersistenceManager { - @Override - public void persistCartridgeSubscription(CartridgeSubscription cartridgeSubscription) throws PersistenceManagerException { - //To change body of implemented methods use File | Settings | File Templates. - } + private static final Log log = LogFactory.getLog(RegistryBasedPersistenceManager.class); @Override - public void removeCartridgeSubscription(int tenantId, String alias) throws PersistenceManagerException { - //To change body of implemented methods use File | Settings | File Templates. + public void persistCartridgeSubscriptions(int tenantId, SubscriptionAliasToCartridgeSubscriptionMap aliasToSubscriptionMap) throws PersistenceManagerException { + + try { + RegistryManager.getInstance().persistAliastoSubscriptionMap(tenantId, aliasToSubscriptionMap); + + } catch (RegistryException e) { + throw new PersistenceManagerException(e); + + } catch (ADCException e) { + throw new PersistenceManagerException(e); + } } @Override - public CartridgeSubscription getCartridgeSubscription(int tenantId, String alias) throws PersistenceManagerException { - return null; //To change body of implemented methods use File | Settings | File Templates. + public SubscriptionAliasToCartridgeSubscriptionMap retrieveCartridgeSubscriptions(int tenantId) throws PersistenceManagerException { + + Object aliasToSubscriptionMapObj; + + try { + aliasToSubscriptionMapObj = RegistryManager.getInstance().getAliastoSubscriptionMap(tenantId); + + } catch (ADCException e) { + throw new PersistenceManagerException(e); + } + + if (aliasToSubscriptionMapObj != null) { + try { + Object dataObj = Deserializer + .deserializeFromByteArray((byte[]) aliasToSubscriptionMapObj); + if(dataObj instanceof SubscriptionAliasToCartridgeSubscriptionMap) { + return (SubscriptionAliasToCartridgeSubscriptionMap) dataObj; + } else { + return null; + } + + } catch (Exception e) { + String errorMsg = "Unable to retrieve data from Registry. Hence, any historical data will not get reflected."; + log.warn(errorMsg, e); + } + } + + return null; } @Override - public List<CartridgeSubscription> getCartridgeSubscriptions(int tenantId) throws PersistenceManagerException { - return null; //To change body of implemented methods use File | Settings | File Templates. + public void persistCartridgeSubscriptions(String clusterId, ClusterIdToCartridgeSubscriptionMap clusterIdToSubscriptionMap) throws PersistenceManagerException { + + try { + RegistryManager.getInstance().persistClusterIdToSubscriptionMap(clusterIdToSubscriptionMap); + + } catch (RegistryException e) { + throw new PersistenceManagerException(e); + + } catch (ADCException e) { + throw new PersistenceManagerException(e); + } } @Override - public CartridgeSubscription getCartridgeSubscription(String clusterDomain) throws PersistenceManagerException { - return null; //To change body of implemented methods use File | Settings | File Templates. + public ClusterIdToCartridgeSubscriptionMap retrieveCartridgeSubscriptions(String clusterId) throws PersistenceManagerException { + + Object clusterIdToSubscriptionMapObj; + + try { + clusterIdToSubscriptionMapObj = RegistryManager.getInstance().getClusterIdtoSubscriptionMap(); + + } catch (ADCException e) { + throw new PersistenceManagerException(e); + } + + if (clusterIdToSubscriptionMapObj != null) { + try { + Object dataObj = Deserializer + .deserializeFromByteArray((byte[]) clusterIdToSubscriptionMapObj); + if(dataObj instanceof ClusterIdToCartridgeSubscriptionMap) { + return (ClusterIdToCartridgeSubscriptionMap) dataObj; + } else { + return null; + } + + } catch (Exception e) { + String errorMsg = "Unable to retrieve data from Registry. Hence, any historical data will not get reflected."; + log.warn(errorMsg, e); + } + } + + return null; } } http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/aebdb087/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/registry/RegistryManager.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/registry/RegistryManager.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/registry/RegistryManager.java new file mode 100644 index 0000000..da7fdec --- /dev/null +++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/registry/RegistryManager.java @@ -0,0 +1,138 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.stratos.adc.mgt.registry; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.stratos.adc.mgt.exception.ADCException; +import org.apache.stratos.adc.mgt.internal.DataHolder; +import org.apache.stratos.adc.mgt.lookup.ClusterIdToCartridgeSubscriptionMap; +import org.apache.stratos.adc.mgt.lookup.SubscriptionAliasToCartridgeSubscriptionMap; +import org.apache.stratos.adc.mgt.utils.Serializer; +import org.wso2.carbon.registry.core.Registry; +import org.wso2.carbon.registry.core.Resource; +import org.wso2.carbon.registry.core.exceptions.RegistryException; +import org.wso2.carbon.registry.core.exceptions.ResourceNotFoundException; + +public class RegistryManager { + + private final static Log log = LogFactory.getLog(RegistryManager.class); + private final static String STRATOS_MANAGER_REOSURCE = "/stratos.manager"; + private static Registry registryService; + private static RegistryManager registryManager; + + public static RegistryManager getInstance() { + + registryService = DataHolder.getRegistry(); + + if (registryManager == null) { + synchronized (RegistryManager.class) { + if (registryService == null) { + return registryManager; + } + registryManager = new RegistryManager(); + } + } + return registryManager; + } + + private RegistryManager() { + try { + if (!registryService.resourceExists(STRATOS_MANAGER_REOSURCE)) { + registryService.put(STRATOS_MANAGER_REOSURCE, registryService.newCollection()); + } + } catch (RegistryException e) { + String errorMsg = "Failed to create the registry resource " + STRATOS_MANAGER_REOSURCE; + log.error(errorMsg, e);; + } + } + + public void persistAliastoSubscriptionMap (int tenantId, + SubscriptionAliasToCartridgeSubscriptionMap aliasToSubscriptionMap) + throws RegistryException, ADCException { + + try { + registryService.beginTransaction(); + Resource nodeResource = registryService.newResource(); + nodeResource.setContent(Serializer.serializeAliasToSubscriptionMapToByteArray(aliasToSubscriptionMap)); + registryService.put(STRATOS_MANAGER_REOSURCE + "/subscription/tenant" + Integer.toString(tenantId), + nodeResource); + registryService.commitTransaction(); + + } catch (Exception e) { + String errorMsg = "Failed to persist SubscriptionAliasToCartridgeSubscriptionMap in registry."; + registryService.rollbackTransaction(); + log.error(errorMsg, e); + throw new ADCException(errorMsg, e); + } + } + + public Object getAliastoSubscriptionMap (int tenantId) throws ADCException { + + try { + Resource resource = registryService.get(STRATOS_MANAGER_REOSURCE + "/subscription/tenant" + + Integer.toString(tenantId)); + return resource.getContent(); + + } catch (ResourceNotFoundException ignore) { + return null; + + } catch (RegistryException e) { + String errorMsg = "Failed to retrieve SubscriptionAliasToCartridgeSubscriptionMap from registry."; + log.error(errorMsg, e); + throw new ADCException(errorMsg, e); + } + } + + public void persistClusterIdToSubscriptionMap (ClusterIdToCartridgeSubscriptionMap clusterIdToSubscriptionMap) + throws RegistryException, ADCException { + + try { + registryService.beginTransaction(); + Resource nodeResource = registryService.newResource(); + nodeResource.setContent(Serializer.serializeClusterIdToSubscriptionMapToByteArray(clusterIdToSubscriptionMap)); + registryService.put(STRATOS_MANAGER_REOSURCE + "/subscription/cluster", + nodeResource); + registryService.commitTransaction(); + + } catch (Exception e) { + String errorMsg = "Failed to persist ClusterIdToCartridgeSubscriptionMap in registry."; + registryService.rollbackTransaction(); + log.error(errorMsg, e); + throw new ADCException(errorMsg, e); + } + } + + public Object getClusterIdtoSubscriptionMap () throws ADCException { + + try { + Resource resource = registryService.get(STRATOS_MANAGER_REOSURCE + "/subscription/cluster"); + return resource.getContent(); + + } catch (ResourceNotFoundException ignore) { + return null; + + } catch (RegistryException e) { + String errorMsg = "Failed to retrieve ClusterIdToCartridgeSubscriptionMap from registry."; + log.error(errorMsg, e); + throw new ADCException(errorMsg, e); + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/aebdb087/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/retriever/DataRetrievalManager.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/retriever/DataRetrievalManager.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/retriever/DataRetrievalManager.java index 11093d3..27022c5 100644 --- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/retriever/DataRetrievalManager.java +++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/retriever/DataRetrievalManager.java @@ -19,8 +19,11 @@ package org.apache.stratos.adc.mgt.retriever; +import org.apache.stratos.adc.mgt.exception.ADCException; import org.apache.stratos.adc.mgt.exception.PersistenceManagerException; +import org.apache.stratos.adc.mgt.lookup.ClusterIdToCartridgeSubscriptionMap; import org.apache.stratos.adc.mgt.lookup.LookupDataHolder; +import org.apache.stratos.adc.mgt.lookup.SubscriptionAliasToCartridgeSubscriptionMap; import org.apache.stratos.adc.mgt.persistence.PersistenceManager; import org.apache.stratos.adc.mgt.subscription.CartridgeSubscription; import org.jgroups.logging.Log; @@ -46,46 +49,45 @@ public class DataRetrievalManager { cartridgeSubscriptionUpdateThreadPool = Executors.newCachedThreadPool(); } - public CartridgeSubscription getCartridgeSubscription (int tenantId, String subscriptionAlias) - throws PersistenceManagerException { + public CartridgeSubscription getCartridgeSubscriptionByAlias (int tenantId, String subscriptionAlias) + throws PersistenceManagerException, ADCException { CartridgeSubscription cartridgeSubscription = null; if(lookupDataHolder != null) { - //look in the local cache - cartridgeSubscription = lookupDataHolder.getCartridgeSubscription(tenantId, subscriptionAlias); + cartridgeSubscription = lookupDataHolder.getCartridgeSubscription(subscriptionAlias); } - //if not found in the local cache, look in the Persistence Manager - if (cartridgeSubscription == null) { - persistenceManager.getCartridgeSubscription(tenantId, subscriptionAlias); - } else { - if(log.isDebugEnabled()) { - log.debug("Cartridge subscription entry for tenant Id " + tenantId + ", subscription alias " + - subscriptionAlias + " found in the local cache"); + else { + //look in the persistence manager + SubscriptionAliasToCartridgeSubscriptionMap aliasToSubscriptionMap = + persistenceManager.retrieveCartridgeSubscriptions(tenantId); + + if(aliasToSubscriptionMap != null) { + cartridgeSubscription = aliasToSubscriptionMap.getCartridgeSubscription(subscriptionAlias); + populateLookupDataHolder(aliasToSubscriptionMap); } } return cartridgeSubscription; } - public CartridgeSubscription getCartridgeSubscription (String clusterId) - throws PersistenceManagerException { + public CartridgeSubscription getCartridgeSubscriptionByClusterId (String clusterId) + throws PersistenceManagerException, ADCException { CartridgeSubscription cartridgeSubscription = null; if(lookupDataHolder != null) { - //look in the local cache cartridgeSubscription = lookupDataHolder.getCartridgeSubscription(clusterId); } - //if not found in the local cache, look in the Persistence Manager - if (cartridgeSubscription == null) { - persistenceManager.getCartridgeSubscription(clusterId); - - } else { - if(log.isDebugEnabled()) { - log.debug("Cartridge subscription entry for cluster domain " + clusterId + - " found in the local cache"); + else { + //look in the persistence manager + ClusterIdToCartridgeSubscriptionMap clusterIdToSubscriptionMap = + persistenceManager.retrieveCartridgeSubscriptions(clusterId); + if(clusterIdToSubscriptionMap != null) { + cartridgeSubscription = clusterIdToSubscriptionMap.getCartridgeSubscription(clusterId); + populateLookupDataHolder(clusterIdToSubscriptionMap); } + } return cartridgeSubscription; @@ -101,7 +103,10 @@ public class DataRetrievalManager { } //if not found in the local cache, look in the Persistence Manager if (cartridgeSubscriptionCollection == null) { - persistenceManager.getCartridgeSubscriptions(tenantId); + SubscriptionAliasToCartridgeSubscriptionMap aliasToSubscriptionMap = persistenceManager. + retrieveCartridgeSubscriptions(tenantId); + //populate the LookupDataHolder + populateLookupDataHolder(aliasToSubscriptionMap); } else { if(log.isDebugEnabled()) { @@ -118,29 +123,51 @@ public class DataRetrievalManager { return cartridgeSubscriptionList; } - public void putCartridgeSubscription (CartridgeSubscription cartridgeSubscription) { + private void populateLookupDataHolder (SubscriptionAliasToCartridgeSubscriptionMap aliasToSubscriptionMap) { + + //populate the cache + Collection<CartridgeSubscription> cartridgeSubscriptions = aliasToSubscriptionMap.getCartridgeSubscriptions(); + for (CartridgeSubscription subscription : cartridgeSubscriptions) { + lookupDataHolder.addCartridgeSubscription(subscription.getSubscriber().getTenantId(), + subscription.getAlias(), + subscription); + } + } + + private void populateLookupDataHolder (ClusterIdToCartridgeSubscriptionMap clusterIdToSubscriptionMap) { - cartridgeSubscriptionUpdateThreadPool.submit(new CartridgeSubscriptionUpdater(cartridgeSubscription, + //populate the cache + Collection<CartridgeSubscription> cartridgeSubscriptions = clusterIdToSubscriptionMap.getCartridgeSubscriptions(); + for (CartridgeSubscription subscription : cartridgeSubscriptions) { + lookupDataHolder.addCartridgeSubscription(subscription.getSubscriber().getTenantId(), + subscription.getAlias(), + subscription); + } + } + + public void putCartridgeSubscriptions (SubscriptionAliasToCartridgeSubscriptionMap aliasToSubscriptionMap) { + + cartridgeSubscriptionUpdateThreadPool.submit(new CartridgeSubscriptionUpdater(aliasToSubscriptionMap, lookupDataHolder, persistenceManager)); } private class CartridgeSubscriptionUpdater implements Runnable { - CartridgeSubscription cartridgeSubscription; + SubscriptionAliasToCartridgeSubscriptionMap aliasToSubscriptionMap; LookupDataHolder lookupDataHolder; PersistenceManager persistenceManager; - public CartridgeSubscriptionUpdater (CartridgeSubscription cartridgeSubscription, LookupDataHolder - lookupDataHolder, PersistenceManager persistenceManager) { + public CartridgeSubscriptionUpdater (SubscriptionAliasToCartridgeSubscriptionMap aliasToSubscriptionMap, + LookupDataHolder lookupDataHolder, PersistenceManager persistenceManager) { - this.cartridgeSubscription = cartridgeSubscription; + this.aliasToSubscriptionMap = aliasToSubscriptionMap; this.lookupDataHolder = lookupDataHolder; this.persistenceManager = persistenceManager; } public void run() { - if(lookupDataHolder != null) { + /*if(lookupDataHolder != null) { lookupDataHolder.addCartridgeSubscription(cartridgeSubscription.getSubscriber().getTenantId(), cartridgeSubscription.getAlias(), cartridgeSubscription); } @@ -150,7 +177,7 @@ public class DataRetrievalManager { } catch (PersistenceManagerException e) { String errorMsg = "Error in persisting Cartridge Subscription instance"; log.error(errorMsg, e); - } + }*/ } } http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/aebdb087/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/Deserializer.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/Deserializer.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/Deserializer.java new file mode 100644 index 0000000..95edaf1 --- /dev/null +++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/Deserializer.java @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.stratos.adc.mgt.utils; + +import java.io.ByteArrayInputStream; +import java.io.ObjectInput; +import java.io.ObjectInputStream; + +public class Deserializer { + + + /** + * Deserialize a byte array and retrieve the object. + * @param bytes bytes to be deserialized + * @return the deserialized {@link Object} + * @throws Exception if the deserialization is failed. + */ + public static Object deserializeFromByteArray(byte[] bytes) throws Exception { + + ByteArrayInputStream bis = new ByteArrayInputStream(bytes); + ObjectInput in = null; + try { + in = new ObjectInputStream(bis); + Object o = in.readObject(); + + return o; + + } finally { + bis.close(); + if (in != null) { + in.close(); + } + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/aebdb087/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/Serializer.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/Serializer.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/Serializer.java new file mode 100644 index 0000000..b0b0b77 --- /dev/null +++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/Serializer.java @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.stratos.adc.mgt.utils; + +import org.apache.stratos.adc.mgt.lookup.ClusterIdToCartridgeSubscriptionMap; +import org.apache.stratos.adc.mgt.lookup.SubscriptionAliasToCartridgeSubscriptionMap; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectOutput; +import java.io.ObjectOutputStream; + +public class Serializer { + + /** + * Serialize a SubscriptionAliasToCartridgeSubscriptionMap to a byte array. + * @param aliasToSubscriptionMap + * @return byte[] + * @throws java.io.IOException + */ + public static byte[] serializeAliasToSubscriptionMapToByteArray (SubscriptionAliasToCartridgeSubscriptionMap aliasToSubscriptionMap) + throws IOException { + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutput out = null; + try { + out = new ObjectOutputStream(bos); + out.writeObject(aliasToSubscriptionMap); + + return bos.toByteArray(); + + } finally { + if (out != null) { + out.close(); + } + bos.close(); + } + + } + + /** + * Serialize a ClusterIdToCartridgeSubscriptionMap to a byte array. + * @param clusterIdToSubscriptionMap + * @return byte[] + * @throws java.io.IOException + */ + public static byte[] serializeClusterIdToSubscriptionMapToByteArray (ClusterIdToCartridgeSubscriptionMap clusterIdToSubscriptionMap) + throws IOException { + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutput out = null; + try { + out = new ObjectOutputStream(bos); + out.writeObject(clusterIdToSubscriptionMap); + + return bos.toByteArray(); + + } finally { + if (out != null) { + out.close(); + } + bos.close(); + } + + } +}
