/*******************************************************************************
* 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.File;
import java.io.IOException;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.ebayopensource.turmeric.runtime.common.impl.utils.LogManager;
import org.ebayopensource.turmeric.tools.codegen.CodeGenContext;
import org.ebayopensource.turmeric.tools.codegen.JTypeTable;
import org.ebayopensource.turmeric.tools.codegen.SourceGenerator;
import org.ebayopensource.turmeric.tools.codegen.exception.CodeGenFailedException;
import org.ebayopensource.turmeric.tools.codegen.external.JavaXmlBinder;
import org.ebayopensource.turmeric.tools.codegen.external.JavaXmlBindingFactory;
import org.ebayopensource.turmeric.tools.codegen.util.CodeGenUtil;
/**
* Generates XML schema for types (input/output) referred by an interface
*
*
* @author rmandapati
*/
public class XMLSchemaGenerator implements SourceGenerator {
private static final String DEST_SCHEMA_DIR = "META-INF/soa/common/schema";
private static final String SCHEMA_FILE_SUFFIX = "Schema.xsd";
private static Logger s_logger = LogManager.getInstance(XMLSchemaGenerator.class);
private static XMLSchemaGenerator s_xsdGenerator = new XMLSchemaGenerator();
private XMLSchemaGenerator() {}
public static XMLSchemaGenerator getInstance() {
return s_xsdGenerator;
}
private Logger getLogger() {
return s_logger;
}
public boolean continueOnError() {
return false;
}
public void generate(CodeGenContext codeGenCtx) throws CodeGenFailedException {
generateSchema(codeGenCtx);
}
private void generateSchema(CodeGenContext codeGenCtx)
throws CodeGenFailedException {
JTypeTable jTypeTable = codeGenCtx.getJTypeTable();
if (isSchemeGenRequired(jTypeTable.getTypesReferred())) {
String svcName = codeGenCtx.getServiceAdminName();
String destLocation =
destFolderPath(codeGenCtx.getMetaSrcDestLocation(), svcName);
String schemaFileName =
CodeGenUtil.makeFirstLetterUpper(svcName) + SCHEMA_FILE_SUFFIX;
String schemaFilePath = CodeGenUtil.toOSFilePath(destLocation) + schemaFileName;
deleteFile(schemaFilePath);
JavaXmlBinder javaXmlBinder = JavaXmlBindingFactory.getInstance();
javaXmlBinder.generateSchema(
codeGenCtx,
jTypeTable.getTypesReferred(),
schemaFileName,
destLocation);
getLogger().log(Level.INFO, "Successfully generated schema for service");
}
}
private boolean isSchemeGenRequired(Set<Class<?>> typesReferred) {
return (typesReferred != null && !typesReferred.isEmpty());
}
public static String getSchemaFileDir(CodeGenContext codeGenCtx) throws CodeGenFailedException {
String svcName = codeGenCtx.getServiceAdminName();
String destLocation = destFolderPath(codeGenCtx.getMetaSrcDestLocation(), svcName);
return destLocation;
}
private static String destFolderPath(String destLoc, String serviceName)
throws CodeGenFailedException {
String destFolderPath =
CodeGenUtil.genDestFolderPath(
destLoc,
serviceName,
DEST_SCHEMA_DIR);
try {
CodeGenUtil.createDir(destFolderPath);
} catch (IOException ioEx) {
throw new CodeGenFailedException(ioEx.getMessage(), ioEx);
}
return destFolderPath;
}
private void deleteFile(String filePath) {
File file = new File(filePath);
try {
CodeGenUtil.deleteFile(file);
} catch (IOException ioEx) {
//NOPMD
}
}
public String getFilePath(String serviceAdminName, String interfaceName) {
String filePath = CodeGenUtil.toOSFilePath(DEST_SCHEMA_DIR)+ serviceAdminName + File.separatorChar + SCHEMA_FILE_SUFFIX ;
return filePath;
}
}