/**
* Copyright (c) 2009, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* Licensed 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.wso2.carbon.mediation.initializer.configurations;
import org.wso2.carbon.registry.core.session.UserRegistry;
import org.wso2.carbon.registry.core.exceptions.RegistryException;
import org.wso2.carbon.registry.core.Resource;
import org.wso2.carbon.registry.core.RegistryConstants;
import org.wso2.carbon.mediation.initializer.ServiceBusConstants;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.util.List;
import java.util.ArrayList;
/**
* This class is to hold the information about multiple configurations.
*/
public class ConfigurationTracker {
public static final Log log = LogFactory.getLog(ConfigurationTracker.class);
public static final String CONFIGURATION_TRACKER = "configurationTracker";
/** Registry */
private UserRegistry registry = null;
/** The current configuration which is active */
private ConfigurationInformation currentConfig = null;
public ConfigurationTracker(UserRegistry configRegistry) {
this.registry = configRegistry;
}
public String getCurrentConfigurationName() {
return currentConfig.getName();
}
public synchronized void create(String configurationName, String description)
throws RegistryException {
if (!registry.resourceExists(ServiceBusConstants.ESB_CONFIGURATIONS)) {
init();
}
try {
registry.beginTransaction();
// add the default configuration
Resource r = registry.newResource();
r.setProperty(ServiceBusConstants.DESCRIPTION, description);
r.setProperty(ServiceBusConstants.ACTIVE, "false");
r.setProperty(ServiceBusConstants.CREATED, "false");
registry.put(ServiceBusConstants.ESB_CONFIGURATIONS + RegistryConstants.PATH_SEPARATOR
+ configurationName, r);
registry.commitTransaction();
} catch (Exception e) {
rollbackTransaction(e);
}
}
private void rollbackTransaction(Exception e) throws RegistryException {
log.error("Error occurred accessing registry", e);
registry.rollbackTransaction();
}
public synchronized void activate(String configurationName)
throws RegistryException {
currentConfig.setActive(false);
updateConfiguration(currentConfig);
ConfigurationInformation newConfigurationInfo =
loadConfigurationInfo(configurationName);
newConfigurationInfo.setActive(true);
updateConfiguration(newConfigurationInfo);
currentConfig = newConfigurationInfo;
currentConfig.setCreated(true);
}
public void delete(String configurationName)
throws RegistryException {
try {
registry.beginTransaction();
String resourceName = ServiceBusConstants.ESB_CONFIGURATIONS +
RegistryConstants.PATH_SEPARATOR + configurationName;
if (registry.resourceExists(resourceName)) {
registry.delete(resourceName);
}
registry.commitTransaction();
} catch (Exception e) {
rollbackTransaction(e);
}
}
public List<ConfigurationInformation> getConfigurationList() throws RegistryException {
if (!registry.resourceExists(ServiceBusConstants.ESB_CONFIGURATIONS)) {
init();
}
List<ConfigurationInformation> configList = new ArrayList<ConfigurationInformation>();
Resource resource = registry.get(ServiceBusConstants.ESB_CONFIGURATIONS);
if (resource instanceof org.wso2.carbon.registry.core.Collection) {
org.wso2.carbon.registry.core.Collection c =
(org.wso2.carbon.registry.core.Collection) resource;
for (String rName : c.getChildren()) {
Resource r = registry.get(rName);
String description = r.getProperty(ServiceBusConstants.DESCRIPTION);
String name = rName.substring(ServiceBusConstants.ESB_CONFIGURATIONS.length() + 2);
String active = r.getProperty(ServiceBusConstants.ACTIVE);
String created = r.getProperty(ServiceBusConstants.CREATED);
ConfigurationInformation config = new ConfigurationInformation(name);
config.setDescription(description);
if (active != null &&
(active.equalsIgnoreCase("TRUE") || active.equals("FALSE"))) {
config.setActive(Boolean.parseBoolean(active));
}
config.setCreated(Boolean.parseBoolean(created));
configList.add(config);
}
}
return configList;
}
public boolean isConfigurationCreated(String name) throws RegistryException {
Resource resource = registry.get(ServiceBusConstants.ESB_CONFIGURATIONS +
RegistryConstants.PATH_SEPARATOR + name);
String created = resource.getProperty(ServiceBusConstants.CREATED);
if (created != null) {
if (created.equalsIgnoreCase("FALSE")) {
return false;
} else if (created.equalsIgnoreCase("TRUE")) {
return true;
}
}
return false;
}
public boolean isConfigurationExists(String name) throws RegistryException {
return registry.resourceExists(ServiceBusConstants.ESB_CONFIGURATIONS +
RegistryConstants.PATH_SEPARATOR + name);
}
public void init() throws RegistryException {
// if the configutation information is not in the registry create one
if (!registry.resourceExists(ServiceBusConstants.ESB_CONFIGURATIONS)) {
createConfigurationsCollection();
persistConfiguration("default");
}
List<ConfigurationInformation> configurationInformations = getConfigurationList();
for (ConfigurationInformation info : configurationInformations) {
if (info.isActive()) {
currentConfig = info;
}
}
if (currentConfig == null) {
currentConfig = configurationInformations.get(0);
log.warn("No Current configurations found. Activating the :" + currentConfig.getName());
}
}
public void update(String name, boolean created) throws RegistryException {
ConfigurationInformation configurationInformation = loadConfigurationInfo(name);
configurationInformation.setCreated(created);
updateConfiguration(configurationInformation);
}
public ConfigurationInformation getConfigurationInformation(String name)
throws RegistryException {
return loadConfigurationInfo(name);
}
private void createConfigurationsCollection() throws RegistryException {
try {
registry.beginTransaction();
org.wso2.carbon.registry.core.Collection c = registry.newCollection();
// add the collection
registry.put(ServiceBusConstants.ESB_CONFIGURATIONS, c);
registry.commitTransaction();
} catch (Exception e) {
rollbackTransaction(e);
}
}
private void updateConfiguration(ConfigurationInformation configurationInformation)
throws RegistryException {
try {
registry.beginTransaction();
Resource r = registry.get(ServiceBusConstants.ESB_CONFIGURATIONS +
RegistryConstants.PATH_SEPARATOR + configurationInformation.getName());
r.setProperty(ServiceBusConstants.DESCRIPTION,
configurationInformation.getDescription());
r.setProperty(ServiceBusConstants.ACTIVE,
Boolean.toString(configurationInformation.isActive()));
r.setProperty(ServiceBusConstants.CREATED,
Boolean.toString(configurationInformation.isCreated()));
registry.delete(ServiceBusConstants.ESB_CONFIGURATIONS +
RegistryConstants.PATH_SEPARATOR + configurationInformation.getName());
registry.put(ServiceBusConstants.ESB_CONFIGURATIONS +
RegistryConstants.PATH_SEPARATOR + configurationInformation.getName(), r);
registry.commitTransaction();
} catch (Exception e) {
rollbackTransaction(e);
}
}
private void persistConfiguration(String configName) throws RegistryException {
registry.beginTransaction();
try {
// add the default configuration
Resource r = registry.newResource();
r.setProperty(ServiceBusConstants.DESCRIPTION, "Default Configuration");
r.setProperty(ServiceBusConstants.ACTIVE, "true");
r.setProperty(ServiceBusConstants.CREATED, "true");
registry.put(ServiceBusConstants.ESB_CONFIGURATIONS +
RegistryConstants.PATH_SEPARATOR + configName, r);
registry.commitTransaction();
} catch (Exception e) {
rollbackTransaction(e);
}
}
private ConfigurationInformation loadConfigurationInfo(String configName)
throws RegistryException {
ConfigurationInformation configurationInformation = null;
try {
registry.beginTransaction();
Resource r = registry.get(ServiceBusConstants.ESB_CONFIGURATIONS +
RegistryConstants.PATH_SEPARATOR + configName);
String description = r.getProperty(ServiceBusConstants.DESCRIPTION);
String active = r.getProperty(ServiceBusConstants.ACTIVE);
String created = r.getProperty(ServiceBusConstants.CREATED);
configurationInformation =
new ConfigurationInformation(configName);
configurationInformation.setActive(Boolean.parseBoolean(active));
configurationInformation.setCreated(Boolean.parseBoolean(created));
configurationInformation.setDescription(description);
registry.commitTransaction();
} catch (Exception e) {
rollbackTransaction(e);
}
return configurationInformation;
}
}