/*
* Copyright (c) WSO2 Inc. (http://wso2.com) All Rights Reserved.
*
* WSO2 Inc. 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.wso2.carbon.registry.reporting.services;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.core.util.CryptoException;
import org.wso2.carbon.core.util.CryptoUtil;
import org.wso2.carbon.ntask.common.TaskException;
import org.wso2.carbon.ntask.core.TaskInfo;
import org.wso2.carbon.ntask.core.TaskManager;
import org.wso2.carbon.registry.admin.api.reporting.IReportingAdminService;
import org.wso2.carbon.registry.common.beans.ReportConfigurationBean;
import org.wso2.carbon.registry.common.services.RegistryAbstractAdmin;
import org.wso2.carbon.registry.common.utils.CommonUtil;
import org.wso2.carbon.registry.core.Collection;
import org.wso2.carbon.registry.core.Registry;
import org.wso2.carbon.registry.core.RegistryConstants;
import org.wso2.carbon.registry.core.Resource;
import org.wso2.carbon.registry.core.exceptions.RegistryException;
import org.wso2.carbon.registry.core.session.UserRegistry;
import org.wso2.carbon.registry.core.utils.RegistryUtils;
import org.wso2.carbon.registry.reporting.annotation.Property;
import org.wso2.carbon.registry.reporting.internal.ReportingServiceComponent;
import org.wso2.carbon.registry.reporting.utils.ReportingTask;
import org.wso2.carbon.registry.reporting.utils.Utils;
import java.lang.reflect.Method;
import java.util.*;
public class ReportingAdminService extends RegistryAbstractAdmin implements
IReportingAdminService<ReportConfigurationBean> {
public static final String REPORTING_CONFIG_PATH =
"/repository/components/org.wso2.carbon.registry.reporting/configurations/";
private static Log log = LogFactory.getLog(ReportingAdminService.class);
public byte[] getReportBytes(ReportConfigurationBean configuration)
throws Exception {
return Utils.getReportContentStream(
configuration.getReportClass(), configuration.getTemplate(),
configuration.getType(), CommonUtil.attributeArrayToMap(
configuration.getAttributes()), getRootRegistry()).toByteArray();
}
public void scheduleReport(ReportConfigurationBean configuration)
throws Exception {
HashMap<String, String> propertyMap = new HashMap<String, String>(
CommonUtil.attributeArrayToMap(configuration.getAttributes()));
propertyMap.put("reporting.registry.url", configuration.getRegistryURL());
propertyMap.put("reporting.registry.username", configuration.getUsername());
propertyMap.put("reporting.registry.password", configuration.getPassword());
propertyMap.put("reporting.type", configuration.getType());
propertyMap.put("reporting.class", configuration.getReportClass());
propertyMap.put("reporting.template", configuration.getTemplate());
propertyMap.put("reporting.resource.path", configuration.getResourcePath());
String clazz = ReportingTask.class.getName();
TaskManager taskManager = ReportingServiceComponent.getTaskManager(
((UserRegistry) getRootRegistry()).getTenantId());
taskManager.registerTask(new TaskInfo(configuration.getName(), clazz, propertyMap,
new TaskInfo.TriggerInfo(configuration.getCronExpression())));
taskManager.rescheduleTask(configuration.getName());
// Re-adding full configuration properties to report path -REGISTRY-1017
saveReport(configuration);
}
public void stopScheduledReport(String name) throws Exception {
TaskManager taskManager = ReportingServiceComponent.getTaskManager(
((UserRegistry) getRootRegistry()).getTenantId());
taskManager.pauseTask(name);
taskManager.deleteTask(name);
}
public void saveReport(ReportConfigurationBean configuration)
throws RegistryException, CryptoException {
Registry registry = getConfigSystemRegistry();
Resource resource = registry.newResource();
resource.setMediaType("application/vnd.wso2.registry-report");
if (configuration.getName().equals(null) || configuration.getName().equals(""))
{
String msg = "Report name either null or empty";
throw new RegistryException(msg);
}
else
{
if (configuration.getCronExpression() != null) {
resource.setProperty("cronExpression", configuration.getCronExpression());
} else {
resource.setProperty("cronExpression", "");
}
if (configuration.getReportClass() != null) {
resource.setProperty("class", configuration.getReportClass());
} else {
resource.setProperty("class", "");
}
if (configuration.getResourcePath() != null) {
resource.setProperty("resourcePath", configuration.getResourcePath());
} else {
resource.setProperty("resourcePath", "");
}
if (configuration.getTemplate() != null) {
resource.setProperty("template", configuration.getTemplate());
} else {
resource.setProperty("template", "");
}
if (configuration.getType() != null) {
resource.setProperty("type", configuration.getType());
} else {
resource.setProperty("type", "");
}
if (configuration.getRegistryURL() != null) {
resource.setProperty("registry.url", configuration.getRegistryURL());
} else {
resource.setProperty("registry.url", "");
}
if (configuration.getUsername() != null) {
resource.setProperty("registry.username", configuration.getUsername());
} else {
resource.setProperty("registry.username", "");
}
if (configuration.getPassword() != null) {
resource.setProperty("registry.password",
CryptoUtil.getDefaultCryptoUtil().encryptAndBase64Encode(
configuration.getPassword().getBytes()));
} else {
resource.setProperty("registry.password",
CryptoUtil.getDefaultCryptoUtil().encryptAndBase64Encode(
"".getBytes()));
}
for (Map.Entry<String, String> e :
CommonUtil.attributeArrayToMap(configuration.getAttributes()).entrySet()) {
resource.setProperty("attribute." + e.getKey(), e.getValue());
}
registry.put(REPORTING_CONFIG_PATH + configuration.getName(), resource);
}
}
public ReportConfigurationBean[] getSavedReports()
throws RegistryException, CryptoException, TaskException {
Registry registry = getConfigSystemRegistry();
List<ReportConfigurationBean> output = new LinkedList<ReportConfigurationBean>();
if (registry.resourceExists(REPORTING_CONFIG_PATH)) {
Collection collection = (Collection) registry.get(REPORTING_CONFIG_PATH);
String[] children = collection.getChildren();
for (String child : children) {
ReportConfigurationBean bean = getConfigurationBean(child);
Registry rootRegistry1 = getRootRegistry();
if (!rootRegistry1.resourceExists(bean.getTemplate())) {
log.warn("Report template " + bean.getTemplate() + " doesn't exist");
}
try {
RegistryUtils.loadClass(bean.getReportClass());
} catch (ClassNotFoundException e) {
log.warn("Report class not found " + bean.getReportClass());
}
output.add(bean);
}
}
return output.toArray(new ReportConfigurationBean[output.size()]);
}
public ReportConfigurationBean getSavedReport(String name)
throws RegistryException, CryptoException, TaskException {
return getConfigurationBean(
REPORTING_CONFIG_PATH + name);
}
public void deleteSavedReport(String name)
throws RegistryException {
getConfigSystemRegistry().delete(REPORTING_CONFIG_PATH +
RegistryConstants.PATH_SEPARATOR + name);
}
public void copySavedReport(String name, String newName) throws RegistryException{
boolean reportExist = isReportExist(newName);
if (!reportExist)
{
getConfigSystemRegistry().copy(REPORTING_CONFIG_PATH + RegistryConstants.PATH_SEPARATOR +
name, REPORTING_CONFIG_PATH + RegistryConstants.PATH_SEPARATOR + newName);
}
else
{
String msg = "Report name already exist in the registry";
throw new RegistryException(msg);
}
}
private boolean isReportExist(String newName) throws RegistryException{
ReportConfigurationBean retrievedBean[];
try {
retrievedBean = getSavedReports();
} catch (CryptoException e) {
throw new RegistryException(e.getMessage());
} catch (TaskException e) {
throw new RegistryException(e.getMessage());
}
boolean returnVal = false;
if (retrievedBean != null)
{
for (ReportConfigurationBean reportConfigurationBean : retrievedBean) {
if (reportConfigurationBean.getName().equals(newName)) {
returnVal = true;
break;
}
}
}
return returnVal;
}
private ReportConfigurationBean getConfigurationBean(String path)
throws RegistryException, CryptoException, TaskException {
Registry registry = getConfigSystemRegistry();
Resource resource = registry.get(path);
ReportConfigurationBean bean = new ReportConfigurationBean();
String name = RegistryUtils.getResourceName(path);
bean.setName(name);
bean.setCronExpression(resource.getProperty("cronExpression"));
TaskManager taskManager = ReportingServiceComponent.getTaskManager(
((UserRegistry) getRootRegistry()).getTenantId());
bean.setScheduled(taskManager.isTaskScheduled(name));
bean.setReportClass(resource.getProperty("class"));
bean.setResourcePath(resource.getProperty("resourcePath"));
bean.setTemplate(resource.getProperty("template"));
bean.setType(resource.getProperty("type"));
bean.setRegistryURL(resource.getProperty("registry.url"));
bean.setUsername(resource.getProperty("registry.username"));
bean.setPassword(new String(
CryptoUtil.getDefaultCryptoUtil().base64DecodeAndDecrypt(
resource.getProperty("registry.password"))));
Map<String, String> attributes = new HashMap<String, String>();
Properties props = resource.getProperties();
for (Object key : props.keySet()) {
String propKey = (String) key;
if (propKey.startsWith("attribute.")) {
attributes.put(propKey.substring("attribute.".length()),
resource.getProperty(propKey));
}
}
bean.setAttributes(CommonUtil.mapToAttributeArray(attributes));
return bean;
}
public String[] getAttributeNames(String className) throws Exception {
List<String> output = new LinkedList<String>();
Method[] declaredMethods = RegistryUtils.loadClass(className).getDeclaredMethods();
for (Method method : declaredMethods) {
if (method.isAnnotationPresent(Property.class)) {
String name = method.getName();
if (name.startsWith("set")) {
name = name.substring("set".length());
}
output.add(name.substring(0, 1).toLowerCase() + name.substring(1));
}
}
return output.toArray(new String[output.size()]);
}
public String[] getMandatoryAttributeNames(String className) throws Exception {
List<String> output = new LinkedList<String>();
Method[] declaredMethods = RegistryUtils.loadClass(className).getDeclaredMethods();
for (Method method : declaredMethods) {
if (method.isAnnotationPresent(Property.class) &&
method.getAnnotation(Property.class).mandatory()) {
String name = method.getName();
if (name.startsWith("set")) {
name = name.substring("set".length());
}
output.add(name.substring(0, 1).toLowerCase() + name.substring(1));
}
}
return output.toArray(new String[output.size()]);
}
}