/*******************************************************************************
* Copyright (c) 2006-2010 eBay Inc. 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
*******************************************************************************/
package org.ebayopensource.turmeric.tools.codegen.builders;
import java.io.IOException;
import java.io.Writer;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.io.File;
import org.ebayopensource.turmeric.runtime.common.impl.utils.LogManager;
import org.ebayopensource.turmeric.tools.codegen.CodeGenContext;
import org.ebayopensource.turmeric.tools.codegen.ConfigHelper;
import org.ebayopensource.turmeric.tools.codegen.InputOptions;
import org.ebayopensource.turmeric.tools.codegen.SourceGenerator;
import org.ebayopensource.turmeric.tools.codegen.exception.CodeGenFailedException;
import org.ebayopensource.turmeric.tools.codegen.util.CodeGenUtil;
import org.ebayopensource.turmeric.common.config.ServiceSecurityConfig;
import org.ebayopensource.turmeric.runtime.codegen.common.ServiceCodeGenDefType;
/**
* Security Policy generator.
*
* Generates either default security policy based on template or
* spcified by the user as input in the xml file.
*
*
* @author rmandapati
*/
public class SecurityPolicyConfigGenerator implements SourceGenerator {
private static final String SECURITY_POLICY_CONFIG_TEMPLATE =
"org/ebayopensource/turmeric/tools/codegen/template/security-policy.tpt";
private static final String GEN_SECURITY_POLICY_CONFIG_DIR = "META-INF/soa/services/config";
private static final String SECURITY_POLICY_CONFIG_FILE_NAME = "SecurityPolicy.xml";
private static Logger s_logger = LogManager.getInstance(SecurityPolicyConfigGenerator.class);
private static SecurityPolicyConfigGenerator s_securityPolicyGenerator =
new SecurityPolicyConfigGenerator();
private Logger getLogger() {
return s_logger;
}
private SecurityPolicyConfigGenerator() {}
public static SecurityPolicyConfigGenerator getInstance() {
return s_securityPolicyGenerator;
}
public boolean continueOnError() {
return false;
}
public void generate(CodeGenContext codeGenCtx) throws CodeGenFailedException {
InputOptions inputOptions = codeGenCtx.getInputOptions();
ServiceCodeGenDefType svcCodeGenDef = inputOptions.getSvcCodeGenDefType();
// If Security Policy info specified in the XML
if (svcCodeGenDef != null &&
svcCodeGenDef.getSecurityPolicyInfo() != null &&
svcCodeGenDef.getSecurityPolicyInfo().getSecurityCfg() != null) {
ServiceSecurityConfig serviceSecurityCfg =
svcCodeGenDef.getSecurityPolicyInfo().getSecurityCfg();
createSecurityPolicyFile(codeGenCtx, serviceSecurityCfg);
}
else {
// get Security policy template content
String templateContent = null;
try {
templateContent = CodeGenUtil.getTemplateContent(SECURITY_POLICY_CONFIG_TEMPLATE);
} catch (Exception ex) {
throw new CodeGenFailedException(
"Failed to read : " + SECURITY_POLICY_CONFIG_TEMPLATE, ex);
}
createDefaultSecurityPolicyFile(templateContent, codeGenCtx);
}
}
private void createSecurityPolicyFile(
CodeGenContext codeGenCtx,
ServiceSecurityConfig serviceSecurityConfig) throws CodeGenFailedException {
try {
InputOptions inputOptions = codeGenCtx.getInputOptions();
String destFolderPath =
CodeGenUtil.genDestFolderPath(
codeGenCtx.getMetaSrcDestLocation(),
inputOptions.getServiceAdminName(),
GEN_SECURITY_POLICY_CONFIG_DIR);
ConfigHelper.generateSecurityPolicyXml(
serviceSecurityConfig,
destFolderPath,
SECURITY_POLICY_CONFIG_FILE_NAME);
getLogger().log(Level.INFO,
"Successfully generated " + SECURITY_POLICY_CONFIG_FILE_NAME);
} catch (Exception ex) {
String errMsg = "Failed to generate " + SECURITY_POLICY_CONFIG_FILE_NAME;
getLogger().log(Level.SEVERE, errMsg, ex);
throw new CodeGenFailedException(errMsg , ex);
}
}
private void createDefaultSecurityPolicyFile(
String fileContent,
CodeGenContext codeGenCtx) throws CodeGenFailedException {
Writer fileWriter = null;
InputOptions inputOptions = codeGenCtx.getInputOptions();
String destFolderPath =
CodeGenUtil.genDestFolderPath(
codeGenCtx.getMetaSrcDestLocation(),
inputOptions.getServiceAdminName(),
GEN_SECURITY_POLICY_CONFIG_DIR);
try {
fileWriter = CodeGenUtil.getFileWriter(destFolderPath, SECURITY_POLICY_CONFIG_FILE_NAME);
fileWriter.write(fileContent);
getLogger().log(Level.INFO,
"File " + SECURITY_POLICY_CONFIG_FILE_NAME + "generated under " + destFolderPath);
}
catch (IOException ioEx) {
String errMsg = "Failed to create : " + SECURITY_POLICY_CONFIG_FILE_NAME;
getLogger().log(Level.SEVERE, errMsg, ioEx);
throw new CodeGenFailedException(errMsg, ioEx);
}
finally {
CodeGenUtil.closeQuietly(fileWriter);
}
}
public String getFilePath(String serviceAdminName, String interfaceName) {
String filePath = CodeGenUtil.toOSFilePath(GEN_SECURITY_POLICY_CONFIG_DIR)+ serviceAdminName + File.separatorChar + SECURITY_POLICY_CONFIG_FILE_NAME ;
return filePath;
}
}