/*
* Copyright (c) 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.wso2.carbon.identity.mgt.config;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.impl.builder.StAXOMBuilder;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.identity.mgt.IdentityMgtConfigException;
import org.wso2.carbon.identity.mgt.constants.IdentityMgtConstants;
import org.wso2.carbon.utils.CarbonUtils;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
/**
* This Singleton is used to load and save tenant specific configurations.
*/
public class ConfigBuilder {
private static final String EMAIL_TEMPLATE_PATH = "identity/config/emailTemplate";
private static final Log log = LogFactory.getLog(ConfigBuilder.class);
private static ConfigBuilder instance = null;
private ConfigManager cm = null;
private ConfigBuilder() {
cm = new ConfigManagerImpl();
}
public static ConfigBuilder getInstance() {
if (instance == null) {
instance = new ConfigBuilder();
}
return instance;
}
/**
* Loads the tenant specific configuration.
*
* @param configType
* @param stype
* @param tenantId
* @return
* @throws Exception
*/
public Config loadConfiguration(ConfigType configType, StorageType stype, int tenantId) throws IdentityMgtConfigException {
Config config = null;
switch (stype) {
case REGISTRY:
cm.setReader(new RegistryConfigReader());
switch (configType) {
case EMAIL:
cm.setConfig(new EmailNotificationConfig());
cm.setResourcePath(EMAIL_TEMPLATE_PATH);
config = cm.loadConfig(tenantId);
if (config == null) {
config = loadEmailConfigFile();
}
break;
case CREDENTIALMGT:
break;
default:
throw new IdentityMgtConfigException("Configuration type not supported");
}
break;
case DB:
break;
case FILE:
break;
default:
throw new IdentityMgtConfigException("Configuration storage type not supported");
}
return config;
}
/**
* Save the tenant specific configuration.
*
* @param stype
* @param tenantId
* @param config
* @throws Exception
*/
public void saveConfiguration(StorageType stype, int tenantId, Config config) throws IdentityMgtConfigException {
switch (stype) {
case REGISTRY:
cm.setWriter(new RegistryConfigWriter());
if (config instanceof EmailNotificationConfig) {
cm.setConfig(new EmailNotificationConfig());
cm.setResourcePath(EMAIL_TEMPLATE_PATH);
cm.saveConfig(config, tenantId);
} else {
throw new IdentityMgtConfigException("Configuration type not supported");
}
break;
case DB:
break;
case FILE:
break;
default:
break;
}
}
private Config loadEmailConfigFile() {
String confXml = CarbonUtils.getCarbonConfigDirPath() + File.separator
+ IdentityMgtConstants.EMAIL_CONF_DIRECTORY + File.separator
+ IdentityMgtConstants.EMAIL_ADMIN_CONF_FILE;
Config emailConfig = new EmailNotificationConfig();
File configfile = new File(confXml);
if (!configfile.exists()) {
log.warn("Email Configuration File is not present at: " + confXml);
}
XMLStreamReader parser = null;
InputStream stream = null;
try {
stream = new FileInputStream(configfile);
parser = XMLInputFactory.newInstance()
.createXMLStreamReader(stream);
StAXOMBuilder builder = new StAXOMBuilder(parser);
OMElement documentElement = builder.getDocumentElement();
Iterator iterator = documentElement.getChildElements();
while (iterator.hasNext()) {
OMElement omElement = (OMElement) iterator.next();
String configType = omElement.getAttributeValue(new QName(
"type"));
if (configType != null && configType.trim().length() > 0) {
emailConfig.setProperty(configType, loadEmailConfig(omElement));
}
}
} catch (XMLStreamException | FileNotFoundException e) {
log.warn("Error while loading email config. using default configuration", e);
} finally {
try {
if (parser != null) {
parser.close();
}
} catch (XMLStreamException e) {
log.error("Error while closing XML stream", e);
}
try {
if (stream != null) {
stream.close();
}
} catch (IOException e) {
log.error("Error while closing input stream", e);
}
}
return emailConfig;
}
private String loadEmailConfig(OMElement configElement) {
StringBuilder emailTemplate = new StringBuilder();
Iterator it = configElement.getChildElements();
while (it.hasNext()) {
OMElement element = (OMElement) it.next();
if ("subject".equals(element.getLocalName())) {
emailTemplate.append(element.getText());
} else if ("body".equals(element.getLocalName())) {
emailTemplate.append("|");
emailTemplate.append(element.getText());
} else if ("footer".equals(element.getLocalName())) {
emailTemplate.append("|");
emailTemplate.append(element.getText());
}
}
return emailTemplate.toString();
}
}