/* * Copyright (c) 2005-2014, WSO2 Inc. (http://www.wso2.org) 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.apache.synapse.transport.dynamicconfigurations; import org.apache.axiom.om.OMElement; import org.apache.axis2.description.Parameter; import org.apache.axis2.description.ParameterInclude; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import javax.xml.namespace.QName; /** * Abstract class to use as Profile Reloader Subscribers. FileUpdateNotificationHandler will notify * this once the event is triggered. */ public abstract class DynamicProfileReloader { private static final Log log = LogFactory.getLog(DynamicProfileReloader.class); /* XML parameter name for dynamic profiles in Axis2 config */ private final String PROFILE_CONFIG_NAME = "dynamicSSLProfilesConfig"; /* XML element name for dynamic profiles configuration path in Axis2 config */ private final String PATH_CONFIG_NAME = "filePath"; /* XML element name for dynamic profiles file read interval in Axis2 config */ private final String INTERVAL_CONFIG_NAME = "fileReadInterval"; private boolean invokedFromSchedule = true; private long lastUpdatedtime; private String filePath; public abstract void notifyFileUpdate(boolean isScheduled); protected FileUpdateNotificationHandler fileUpdateNotificationHandler; /** * Returns Last Updated Time of the File * @return Long time in milliseconds */ public long getLastUpdatedtime() { return this.lastUpdatedtime; } /** * Returns File Path of the dynamic SSL profiles * * @return String file path */ public String getFilePath() { return this.filePath; } /** * Set file path * * @param filePath String file path */ public void setFilePath(String filePath) { this.filePath = filePath; } /** * Set Last Updated time of the file * * @param lastUpdatedtime Long time in milliseconds */ public void setLastUpdatedtime(long lastUpdatedtime) { this.lastUpdatedtime = lastUpdatedtime; } /** * Check whether the file is invoked from scheduled task * * @return true if invoked from schedule, false otherwise */ public boolean isInvokedFromSchedule() { return invokedFromSchedule; } /** * Set whether the file is invoked from schedule * * @param invokedFromSchedule true if invoked from schedule, false otherwise */ public void setInvokedFromSchedule(boolean invokedFromSchedule) { this.invokedFromSchedule = invokedFromSchedule; } /** * Set the configuration file path from custom SSL config * * @param transportOut TransportOutDescription of the configuration * @return File Path String */ protected String extractConfigurationFilePath(ParameterInclude transportOut) { String path = null; Parameter profileParam = transportOut.getParameter(PROFILE_CONFIG_NAME); //No Separate configuration file configured. Therefore using Axis2 Configuration if (profileParam != null) { OMElement profileParamElem = profileParam.getParameterElement(); path = profileParamElem.getFirstChildWithName(new QName(PATH_CONFIG_NAME)).getText(); } return path; } /** * Set SSL Profile configuration loading interval from Axis2 config * * @param transportOut TransportOutDescription of the configuration * @return Long value of the interval in milliseconds */ protected long extractSleepInterval(ParameterInclude transportOut) { long fileReadInterval = -1; Parameter profileParam = transportOut.getParameter(PROFILE_CONFIG_NAME); //No Separate configuration file configured. Therefore using Axis2 Configuration if (profileParam != null) { OMElement profileParamElem = profileParam.getParameterElement(); String interval = profileParamElem.getFirstChildWithName(new QName(INTERVAL_CONFIG_NAME)).getText(); if (interval != null) { fileReadInterval = Long.parseLong(interval); } } return fileReadInterval; } /** * Register this Profile Loader in FileUpdateNotificationHandler for notifications * * @param transportDescription Transport In/Out Description of the configuration */ protected boolean registerListener(ParameterInclude transportDescription) { boolean notificationHandlerStarted = false; long configurationLoadingInterval = extractSleepInterval(transportDescription); String filePath = extractConfigurationFilePath(transportDescription); //Create File Update Notification Handler only if file path is configured if (filePath != null) { fileUpdateNotificationHandler = new FileUpdateNotificationHandler(configurationLoadingInterval); setFilePath(filePath); setLastUpdatedtime(System.currentTimeMillis()); fileUpdateNotificationHandler.registerListener(this); notificationHandlerStarted = true; } else { if (log.isDebugEnabled()) { log.debug("Configuration File path is not configured and SSL Profiles will not be loaded " + "dynamically in " + this.getClass().getName()); } } return notificationHandlerStarted; } /** * Get actual class name from comprehensive class name * * @param completeClassName complete class name String * @return instance name String */ public String getClassName(String completeClassName) { String absoluteClassName = null; if (completeClassName != null) { absoluteClassName = completeClassName.substring(completeClassName.lastIndexOf(".") + 1); } return absoluteClassName; } }