/*******************************************************************************
* ===========================================================
* Ankush : Big Data Cluster Management Solution
* ===========================================================
*
* (C) Copyright 2014, by Impetus Technologies
*
* This is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License (LGPL v3) as
* published by the Free Software Foundation;
*
* This software 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 this software; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
******************************************************************************/
/**
*
*/
package com.impetus.ankush.common.service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import org.hibernate.envers.AuditReader;
import org.hibernate.envers.AuditReaderFactory;
import org.hibernate.envers.DefaultRevisionEntity;
import org.hibernate.envers.query.AuditEntity;
import org.hibernate.envers.query.AuditQuery;
import com.impetus.ankush.AppStoreWrapper;
import com.impetus.ankush2.constant.Constant;
import com.impetus.ankush.common.domain.Configuration;
import com.impetus.ankush.common.utils.HibernateUtils;
import com.impetus.ankush.common.utils.JsonMapperUtil;
import com.impetus.ankush2.logger.AnkushLogger;
/**
* The Class ConfigurationManager.
*
* @author hokam
*/
public class ConfigurationManager {
/** The configuration manager. */
private GenericManager<Configuration, Long> configurationManager = AppStoreWrapper
.getManager(Constant.Manager.CONFIGURATION, Configuration.class);
/** The log. */
private AnkushLogger LOG = new AnkushLogger(ConfigurationManager.class);
/**
* Save configuration.
*
* @param clusterId
* the cluster id
* @param username
* the username
* @param fileName
* the file name
* @param host
* the host
* @param propertyName
* the property name
* @param propertyValue
* the property value
* @return the configuration
*/
public Configuration saveConfiguration(Long clusterId, String username,
String fileName, String host, String propertyName,
String propertyValue) {
// Get old configuration value if null return the empty object.
Configuration conf = getOldConfiguration(clusterId, host, fileName,
propertyName);
conf.setClusterId(clusterId);
conf.setUsername(username);
conf.setSource(fileName);
conf.setPropertyName(propertyName);
conf.setPropertyValue(propertyValue);
conf.setHost(host);
// saving configuration object.
LOG.debug("Saving Configuration " + conf);
return configurationManager.save(conf);
}
/**
* Save configuration.
*
* @param clusterId
* the cluster id
* @param username
* the username
* @param fileName
* the file name
* @param host
* the host
* @param params
* the params
*/
public void saveConfiguration(Long clusterId, String username,
String fileName, String host, Map params) {
for (Object key : params.keySet()) {
// Get old configuration value if null return the empty object.
Configuration conf = getOldConfiguration(clusterId, host, fileName,
key.toString());
conf.setClusterId(clusterId);
conf.setUsername(username);
conf.setSource(fileName);
conf.setPropertyName(key.toString());
if (params.get(key) != null) {
conf.setPropertyValue(params.get(key).toString());
}
conf.setHost(host);
configurationManager.save(conf);
}
}
/**
* Save configuration.
*
* @param conf
* the conf
* @return the configuration
*/
public Configuration saveConfiguration(Configuration conf) {
// Saving configuration object.
return saveConfiguration(conf.getClusterId(), conf.getUsername(),
conf.getSource(), conf.getHost(), conf.getPropertyName(),
conf.getPropertyValue());
}
/**
* Method to remove the audit trail of the cluster.
*
* @param clusterId
*/
public void removeAuditTrail(Long clusterId) {
try {
// Get entity manager.
EntityManager em = HibernateUtils.getEntityManager();
// Get the transaction
EntityTransaction tc = em.getTransaction();
// begin the transaction
tc.begin();
// build the query.
Query query = em
.createQuery("delete from com.impetus.ankush.common.domain.Configuration_AUD where clusterId=:clusterId");
// setting the cluster id parameter in query.
query.setParameter(
com.impetus.ankush2.constant.Constant.Keys.CLUSTERID,
clusterId);
// execute the query
query.executeUpdate();
// commit the transaction
tc.commit();
} catch (Exception e) {
LOG.error(e.getMessage(), e);
}
}
/**
* Gets the configuration.
*
* @param clusterId
* the cluster id
* @return the configuration
*/
public List getConfiguration(Long clusterId) {
try {
AuditReader reader = AuditReaderFactory.get(HibernateUtils
.getEntityManager());
AuditQuery query = reader.createQuery().forRevisionsOfEntity(
Configuration.class, false, true);
// filter results besed on cluster id.
query.add(AuditEntity.property(
com.impetus.ankush2.constant.Constant.Keys.CLUSTERID).eq(
clusterId));
query.addOrder(AuditEntity.revisionProperty(
com.impetus.ankush2.constant.Constant.Keys.TIMESTAMP)
.desc());
// Getting Result list.
List list = query.getResultList();
// Creating List Object.
List result = new ArrayList();
for (Object object : list) {
Object[] obj = (Object[]) object;
Map map = new HashMap();
// Mapping Revision Entity.
DefaultRevisionEntity ri = (DefaultRevisionEntity) obj[1];
map.putAll(JsonMapperUtil.mapFromObject(obj[0]));
map.put(com.impetus.ankush2.constant.Constant.Keys.DATE,
ri.getRevisionDate());
map.put(com.impetus.ankush2.constant.Constant.Keys.REVISIONID,
ri.getId());
map.put(com.impetus.ankush2.constant.Constant.Keys.TYPE, obj[2]);
result.add(map);
}
return result;
} catch (Exception e) {
LOG.error(e.getMessage(), e);
}
return null;
}
/**
* Method to get old configuration.
*
* @param clusterId
* the cluster id
* @param host
* the host
* @param fileName
* the file name
* @param propertyName
* the property name
* @return the old configuration
*/
public Configuration getOldConfiguration(Long clusterId, String host,
String fileName, String propertyName) {
// props map for fetching the old configuration for the given
// parameters.
Map<String, Object> propsMap = new HashMap<String, Object>();
propsMap.put(com.impetus.ankush2.constant.Constant.Keys.CLUSTERID,
clusterId);
propsMap.put(com.impetus.ankush2.constant.Constant.Keys.HOST, host);
propsMap.put(com.impetus.ankush2.constant.Constant.Keys.SOURCE,
fileName);
propsMap.put(com.impetus.ankush2.constant.Constant.Keys.PROPERTYNAME,
propertyName);
// Getting configuration object from db.
Configuration configuration = configurationManager
.getByPropertyValueGuarded(propsMap);
if (configuration == null) {
configuration = new Configuration();
}
return configuration;
}
/**
* Method to get old configuration.
*
* @param clusterId
* the cluster id
* @param host
* the host
* @param fileName
* the file name
* @param propertyName
* the property name
* @return the old configuration
*/
public void removeOldConfiguration(Long clusterId, String host,
String fileName, String propertyName) {
// props map for fetching the old configuration for the given
// parameters.
Map<String, Object> propsMap = new HashMap<String, Object>();
propsMap.put(com.impetus.ankush2.constant.Constant.Keys.CLUSTERID,
clusterId);
propsMap.put(com.impetus.ankush2.constant.Constant.Keys.HOST, host);
propsMap.put(com.impetus.ankush2.constant.Constant.Keys.SOURCE,
fileName);
propsMap.put(com.impetus.ankush2.constant.Constant.Keys.PROPERTYNAME,
propertyName);
// deleting all configuration related to given inputs.
configurationManager.deleteAllByPropertyValue(propsMap);
}
}