/* * Copyright (c) 2015, 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.event.publisher.core.internal.util.helper; import org.apache.axiom.om.OMAttribute; import org.apache.axiom.om.OMElement; import org.apache.axis2.deployment.Deployer; import org.apache.axis2.deployment.DeploymentEngine; import org.apache.axis2.deployment.DeploymentException; import org.apache.axis2.deployment.repository.util.DeploymentFileData; import org.apache.axis2.engine.AxisConfiguration; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.core.util.CryptoUtil; import org.wso2.carbon.event.output.adapter.core.EventAdapterUtil; import org.wso2.carbon.event.publisher.core.EventPublisherDeployer; import org.wso2.carbon.event.publisher.core.config.EventPublisherConstants; import org.wso2.carbon.event.publisher.core.exception.EventPublisherConfigurationException; import org.wso2.carbon.event.publisher.core.internal.ds.EventPublisherServiceValueHolder; import org.wso2.carbon.event.publisher.core.internal.util.EventPublisherUtil; import javax.xml.namespace.QName; import java.io.*; import java.util.Iterator; import java.util.List; /** * This class used to do the file system related tasks */ public class EventPublisherConfigurationFilesystemInvoker { private static final Log log = LogFactory.getLog(EventPublisherConfigurationFilesystemInvoker.class); public static void encryptAndSave(OMElement eventAdaptorElement, String fileName) throws EventPublisherConfigurationException { String adaptorType = eventAdaptorElement.getFirstChildWithName(new QName(EventPublisherConstants.EF_CONF_NS, EventPublisherConstants.EF_ELEMENT_TO)).getAttributeValue(new QName(EventPublisherConstants.EF_ATTR_TA_TYPE)); //get Static and Dynamic PropertyLists List<String> encryptedProperties = EventPublisherServiceValueHolder.getCarbonEventPublisherService().getEncryptedProperties(adaptorType); Iterator propertyIter = eventAdaptorElement.getFirstChildWithName(new QName(EventPublisherConstants.EF_CONF_NS, EventPublisherConstants.EF_ELEMENT_TO)).getChildrenWithName(new QName(EventPublisherConstants.EF_ELE_PROPERTY)); if (propertyIter.hasNext()) { while (propertyIter.hasNext()) { OMElement propertyOMElement = (OMElement) propertyIter.next(); String name = propertyOMElement.getAttributeValue( new QName(EventPublisherConstants.EF_ATTR_NAME)); if (encryptedProperties.contains(name.trim())) { OMAttribute encryptedAttribute = propertyOMElement.getAttribute(new QName(EventPublisherConstants.EF_ATTR_ENCRYPTED)); if (encryptedAttribute == null || (!"true".equals(encryptedAttribute.getAttributeValue()))) { String value = propertyOMElement.getText(); try { value = new String(CryptoUtil.getDefaultCryptoUtil().encryptAndBase64Encode(value.getBytes())); propertyOMElement.setText(value); propertyOMElement.addAttribute(EventPublisherConstants.EF_ATTR_ENCRYPTED, "true", null); } catch (Exception e) { log.error("Unable to decrypt the encrypted field: " + name + " for adaptor type: " + adaptorType); propertyOMElement.setText(""); } } } } } EventPublisherConfigurationFilesystemInvoker.save(eventAdaptorElement, fileName); } public static void save(OMElement eventPublisherOMElement, String fileName) throws EventPublisherConfigurationException { EventPublisherConfigurationFilesystemInvoker.save(eventPublisherOMElement.toString(), fileName); } public static void save(String eventPublisher, String fileName) throws EventPublisherConfigurationException { AxisConfiguration axisConfiguration = EventPublisherUtil.getAxisConfiguration(); EventPublisherDeployer eventPublisherDeployer = (EventPublisherDeployer) getDeployer(axisConfiguration, EventPublisherConstants.EF_CONFIG_DIRECTORY); EventPublisherUtil.validateFilePath(fileName); String filePath = getFilePathFromFilename(fileName, axisConfiguration); try { /* save contents to .xml file */ BufferedWriter out = new BufferedWriter(new FileWriter(filePath)); String xmlContent = new XmlFormatter().format(eventPublisher); eventPublisherDeployer.getDeployedEventPublisherFilePaths().add(filePath); out.write(xmlContent); out.close(); log.info("Event Publisher configuration saved in the filesystem : " + new File(filePath).getName()); eventPublisherDeployer.executeManualDeployment(filePath); } catch (IOException e) { eventPublisherDeployer.getDeployedEventPublisherFilePaths().remove(filePath); log.error("Could not save Event Publisher configuration : " + fileName, e); throw new EventPublisherConfigurationException("Error while saving ", e); } } public static void delete(String fileName) throws EventPublisherConfigurationException { try { AxisConfiguration axisConfiguration = EventPublisherUtil.getAxisConfiguration(); EventPublisherUtil.validateFilePath(fileName); String filePath = getFilePathFromFilename(fileName, axisConfiguration); File file = new File(filePath); if (file.exists()) { EventPublisherDeployer deployer = (EventPublisherDeployer) getDeployer(axisConfiguration, EventPublisherConstants.EF_CONFIG_DIRECTORY); deployer.getUndeployedEventPublisherFilePaths().add(filePath); boolean fileDeleted = file.delete(); if (!fileDeleted) { log.error("Could not delete Event Publisher configuration : " + fileName); deployer.getUndeployedEventPublisherFilePaths().remove(filePath); } else { log.info("Event Publisher configuration deleted from the file system : " + fileName); deployer.executeManualUndeployment(filePath); } } } catch (Exception e) { throw new EventPublisherConfigurationException("Error while deleting the Event Publisher : " + e.getMessage(), e); } } public static boolean isEventPublisherConfigurationFileExists(String fileName, AxisConfiguration axisConfiguration) throws EventPublisherConfigurationException{ EventPublisherUtil.validateFilePath(fileName); String filePath = getFilePathFromFilename(fileName, axisConfiguration); File file = new File(filePath); return file.exists(); } public static void reload(String filePath) throws EventPublisherConfigurationException { AxisConfiguration axisConfiguration= EventPublisherUtil.getAxisConfiguration(); EventPublisherDeployer deployer = (EventPublisherDeployer) getDeployer(axisConfiguration, EventPublisherConstants.EF_CONFIG_DIRECTORY); try { deployer.processUndeployment(filePath); deployer.processDeployment(new DeploymentFileData(new File(filePath))); } catch (DeploymentException e) { throw new EventPublisherConfigurationException(e); } } public static String readEventPublisherConfigurationFile(String fileName) throws EventPublisherConfigurationException { BufferedReader bufferedReader = null; StringBuilder stringBuilder = new StringBuilder(); try { AxisConfiguration axisConfiguration = EventPublisherUtil.getAxisConfiguration(); EventPublisherUtil.validateFilePath(fileName); String filePath = getFilePathFromFilename(fileName, axisConfiguration); bufferedReader = new BufferedReader(new FileReader(filePath)); String line; while ((line = bufferedReader.readLine()) != null) { stringBuilder.append(line).append("\n"); } } catch (FileNotFoundException e) { throw new EventPublisherConfigurationException("Event publisher file not found : " + e.getMessage(), e); } catch (IOException e) { throw new EventPublisherConfigurationException("Cannot read the Event Publisher file : " + e.getMessage(), e); } finally { try { if (bufferedReader != null) { bufferedReader.close(); } } catch (IOException e) { log.error("Error occurred when reading the file : " + e.getMessage(), e); } } return stringBuilder.toString().trim(); } private static Deployer getDeployer(AxisConfiguration axisConfig, String endpointDirPath) { // access the deployment engine through axis config DeploymentEngine deploymentEngine = (DeploymentEngine) axisConfig.getConfigurator(); return deploymentEngine.getDeployer(endpointDirPath, "xml"); } private static String getFilePathFromFilename(String filename, AxisConfiguration axisConfiguration) { return new File(EventAdapterUtil.getAxisConfiguration().getRepository().getPath()).getAbsolutePath() + File.separator + EventPublisherConstants.EF_CONFIG_DIRECTORY + File.separator + filename; } }