package org.distributeme.generator.ws;
import org.distributeme.generator.AbstractGenerator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.Marker;
import org.slf4j.MarkerFactory;
import javax.annotation.processing.Filer;
import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.Element;
import javax.lang.model.element.PackageElement;
import javax.tools.FileObject;
import javax.tools.StandardLocation;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
/**
* <p>WSStructureGenerator class.</p>
*
* @author another
* @version $Id: $Id
*/
public class WSStructureGenerator extends AbstractGenerator {
private static final Marker FATAL = MarkerFactory.getMarker("FATAL");
private static final Logger LOGGER = LoggerFactory.getLogger(WSStructureGenerator.class.getName());
private final Filer filer;
/**
* <p>Constructor for WSStructureGenerator.</p>
*
* @param environment a {@link javax.annotation.processing.ProcessingEnvironment} object.
*/
protected WSStructureGenerator(ProcessingEnvironment environment) {
super(environment);
this.filer = environment.getFiler();
}
/**
* <p>createXmlFile.</p>
*
* @param serviceName a {@link java.lang.String} object.
* @param relativePath a {@link java.lang.String} object.
* @param fileName a {@link java.lang.String} object.
* @return a {@link java.io.PrintWriter} object.
*/
protected final PrintWriter createXmlFile(String serviceName, String relativePath, String fileName) {
return createTextFile(serviceName, relativePath, fileName, "xml");
}
/**
* <p>createTextFile.</p>
*
* @param serviceName a {@link java.lang.String} object.
* @param relativePath a {@link java.lang.String} object.
* @param pkg a {@link java.lang.String} object.
* @param fileName a {@link java.lang.String} object.
* @param extension a {@link java.lang.String} object.
* @return a {@link java.io.PrintWriter} object.
*/
protected final PrintWriter createTextFile(String serviceName, String relativePath, String pkg, String fileName, String extension) {
return createTextFile(serviceName, relativePath + File.separator + packageToFolderPath(pkg), fileName, extension);
}
/**
* <p>createTextFile.</p>
*
* @param serviceName a {@link java.lang.String} object.
* @param relativePath a {@link java.lang.String} object.
* @param fileName a {@link java.lang.String} object.
* @param extension a {@link java.lang.String} object.
* @return a {@link java.io.PrintWriter} object.
*/
protected final PrintWriter createTextFile(String serviceName, String relativePath, String fileName, String extension) {
try {
String url = ".." + File.separator + "ws" + File.separator + serviceName + File.separator;
url += relativePath + File.separator;
url += fileName + "." + extension;
FileObject fileObject = filer.createResource(StandardLocation.SOURCE_OUTPUT, "", url);
return new PrintWriter(fileObject.openWriter());
} catch (IOException e) {
String exceptionMessage = "Generation error. Create text file failure: ";
LOGGER.error(FATAL, exceptionMessage + e.getMessage(), e);
throw new RuntimeException(exceptionMessage, e);
}
}
/**
* <p>createSourceFile.</p>
*
* @param serviceName a {@link java.lang.String} object.
* @param pkg a {@link java.lang.String} object.
* @param fileName a {@link java.lang.String} object.
* @return a {@link java.io.PrintWriter} object.
*/
protected final PrintWriter createSourceFile(String serviceName, String pkg, String fileName) {
try {
String url = pkg.replace(".", File.separator) + File.separator;
url += fileName + ".java";
FileObject fileObject = filer.createResource(StandardLocation.SOURCE_OUTPUT, "", url);
return new PrintWriter(fileObject.openWriter());
} catch (IOException e) {
String exceptionMessage = "Generation error. Create text file failure: ";
LOGGER.error(FATAL, exceptionMessage + e.getMessage(), e);
throw new RuntimeException(exceptionMessage, e);
}
}
/**
* <p>closeWriter.</p>
*
* @param writer a {@link java.io.PrintWriter} object.
*/
protected static final void closeWriter(PrintWriter writer) {
if (writer != null) {
writer.flush();
writer.close();
}
}
/**
* <p>closeOutputStream.</p>
*
* @param os a {@link java.io.OutputStream} object.
*/
protected static final void closeOutputStream(OutputStream os) {
if (os != null) {
try {
os.flush();
os.close();
} catch (IOException e) {
String exceptionMessage = "Generation error: ";
LOGGER.error(FATAL, exceptionMessage + e.getMessage(), e);
throw new RuntimeException(exceptionMessage, e);
}
}
}
/**
* <p>getWSProxyPackage.</p>
*
* @param type a {@link javax.lang.model.element.Element} object.
* @return a {@link java.lang.String} object.
*/
protected final String getWSProxyPackage(Element type) {
PackageElement packageElement = getPackageOf(type);
return packageElement + ".generated.ws";
}
/**
* <p>getWSProxySimpleName.</p>
*
* @param type a {@link javax.lang.model.element.Element} object.
* @return a {@link java.lang.String} object.
*/
protected static final String getWSProxySimpleName(Element type) {
return type.getSimpleName().toString() + "WebSkeleton";
}
/**
* <p>getWSProxyName.</p>
*
* @param type a {@link javax.lang.model.element.Element} object.
* @return a {@link java.lang.String} object.
*/
protected final String getWSProxyName(Element type) {
return getWSProxyPackage(type) + "." + getWSProxySimpleName(type);
}
/**
* <p>packageToFolderPath.</p>
*
* @param pkg a {@link java.lang.String} object.
* @return a {@link java.lang.String} object.
*/
protected static final String packageToFolderPath(String pkg) {
return pkg.replace(".", File.separator);
}
/**
* <p>getMetaInfDir.</p>
*
* @return a {@link java.lang.String} object.
*/
protected static final String getMetaInfDir() {
return "META-INF";
}
/**
* <p>getWebInfDir.</p>
*
* @return a {@link java.lang.String} object.
*/
protected static final String getWebInfDir() {
return "WEB-INF";
}
/**
* <p>getWebInfLibDir.</p>
*
* @return a {@link java.lang.String} object.
*/
protected static final String getWebInfLibDir() {
return getWebInfDir() + File.separator + "lib";
}
/**
* <p>getWebInfClassesDir.</p>
*
* @return a {@link java.lang.String} object.
*/
protected static final String getWebInfClassesDir() {
return getWebInfDir() + File.separator + "classes";
}
}