package org.distributeme.generator; import net.anotheria.util.StringUtils; import javax.annotation.processing.Filer; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.TypeElement; import javax.tools.FileObject; import javax.tools.StandardLocation; import java.io.IOException; import java.io.PrintWriter; import java.util.Map; /** * Generator for server start script. * * @author lrosenberg * @version $Id: $Id */ public class ServerScriptGenerator extends AbstractGenerator implements Generator{ /** * <p>Constructor for ServerScriptGenerator.</p> * * @param environment a {@link javax.annotation.processing.ProcessingEnvironment} object. */ public ServerScriptGenerator(ProcessingEnvironment environment) { super(environment); } /** * Creates a script name. Takes first parts of the package, one letter each, adds last part of the package, adds class name. * For example this class will produce od-generator-serverscriptgenerator. * @param type * @return */ private String makeTypeName(TypeElement type){ String fullName = type.getQualifiedName().toString().toLowerCase(); int lastDot = fullName.lastIndexOf('.'); if (lastDot == -1) return fullName; String packageName = fullName.substring(0, lastDot); String[] packageParts = StringUtils.tokenize(packageName, '.'); StringBuilder firstPartOfName = new StringBuilder(); for (int i=0; i<packageParts.length; i++){ String token = packageParts[i]; if (token != null && token.length()>0) { if (i==packageParts.length-1){ firstPartOfName.append('-').append(token); }else { firstPartOfName.append(token.charAt(0)); } } } return firstPartOfName.append('-').append(fullName.substring(lastDot+1)).toString(); } /** {@inheritDoc} */ @Override public void generate(TypeElement type, Filer filer, Map<String,String> options) throws IOException{ String relativeName = "scripts/" + makeTypeName(type) + "-server.sh"; FileObject fileObject = filer.createResource(StandardLocation.SOURCE_OUTPUT, "", relativeName); PrintWriter writer = new PrintWriter(fileObject.openWriter()); setWriter(writer); writeString("#!/bin/bash"); emptyline(); if(options.get("includescript") != null){ writeString("source " + options.get("includescript")); emptyline(); } writeString("#jpdaOpts=\"-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=localhost:8101\""); emptyline(); writeString("#release_path=<absolute_path_to_release>"); writeString("#dist=<dist_jar>"); writeString("#lib=<lib_folder>"); writeString("#etc=<etc_folder>"); writeString("#initialMemory=<initial_memory_size>"); writeString("#maxMemory=<max_memory_size>"); writeString("#configuremeEnvironment=<configureme_environment>"); writeString("#user=<restricted_user_name>"); writeString("#outlog=<nohup_stdout_log_file_name>"); writeString("#errlog=<nohup_stdout_log_file_name>"); writeString("#logdir=<log_directory>"); writeString("#tmpdir=<temporary_files_directory>"); writeString("#pidfile=<log_files_directory>"); emptyline(); writeString("if [ -z \"$release_path\" ]; then"); increaseIdent(); writeString("echo 'release_path environment is not set!'"); writeString("exit 1"); decreaseIdent(); writeString("fi"); emptyline(); writeString("if [ -z \"$dist\" ]; then"); increaseIdent(); writeString("echo 'dist environment is not set!'"); writeString("exit 1"); decreaseIdent(); writeString("fi"); emptyline(); writeString("dist=$release_path/$dist"); writeString("lib=$release_path/${lib:=lib}"); writeString("etc=$release_path/${etc:=etc}"); writeString("initialMemory=${initialMemory:=512M}"); writeString("maxMemory=${maxMemory:=512M}"); writeString("configuremeEnvironment=${configuremeEnvironment:=dev}"); writeString("user=${user:=$USER}"); writeString("logdir=$release_path/${logdir:=.}"); writeString("outlog=${outlog:=$logdir/nohup-" + getServerName(type) + "-out.log}"); writeString("errlog=${errlog:=$logdir/nohup-" + getServerName(type) + "-err.log}"); writeString("tmpdir=$release_path/${tmpdir:=/tmp}"); writeString("pidfile=${pidfile:=$tmpdir/"+getServerName(type)+".pid}"); emptyline(); writeString("server='"+getPackageName(type) + "." + getServerName(type) +"'"); emptyline(); writeString("isServerUp() {"); increaseIdent(); writeString("if [ -f \"$pidfile\" ]; then"); increaseIdent(); writeString("pid=`cat \"$pidfile\"`"); writeString("alive=`ps --no-heading $pid 2>/dev/null | wc -l`"); writeString("if [ $alive == 0 ]; then"); increaseIdent(); writeString("rm -f \"$pidfile\""); writeString("return 0"); decreaseIdent(); writeString("else"); writeIncreasedString("return 1"); writeString("fi"); decreaseIdent(); writeString("else"); writeIncreasedString("return 0"); writeString("fi"); decreaseIdent(); writeString("}"); //start method emptyline(); writeString("start() {"); increaseIdent(); writeString("isServerUp"); writeString("running=$?"); writeString("if [ $running == 0 ]; then"); increaseIdent(); writeString("echo -n 'Starting "+getServerName(type)+"... '"); writeString("for file in $(ls $lib); do"); increaseIdent(); writeString("CLASSPATH=$CLASSPATH:$lib/$file"); writeString("rmicodebase=\"$rmicodebase file:$lib/$file\""); decreaseIdent(); writeString("done"); writeString("CLASSPATH=$etc:$dist:$CLASSPATH"); writeString("rmicodebase=\"file:$etc file:$dist $rmicodebase\""); writeString("work_dir=`pwd`"); writeString("cd \"$release_path\""); writeString("sudo -u \"$user\" /bin/bash -c \"nohup java $jpdaOpts -Xmx$maxMemory -Xms$initialMemory -classpath $CLASSPATH -Djava.rmi.server.codebase=\\\"$rmicodebase\\\" -Dpidfile=\\\"$pidfile\\\" -Dconfigureme.defaultEnvironment=$configuremeEnvironment $server 1>>\\\"$outlog\\\" 2>>\\\"$errlog\\\" &\""); writeString("cd \"$work_dir\""); writeString("#Wait for possible starting error"); writeString("sleep 2"); writeString("isServerUp"); writeString("running=$?"); writeString("if [ $running == 1 ]; then"); writeIncreasedString("echo Done"); writeString("else"); writeIncreasedString("echo Failed"); writeString("fi"); decreaseIdent(); writeString("else"); writeIncreasedString("echo "+getServerName(type)+" is already running"); writeString("fi"); decreaseIdent(); writeString("}"); //stop method emptyline(); writeString("stop() {"); increaseIdent(); writeString("isServerUp"); writeString("running=$?"); writeString("if [ $running == 0 ]; then"); writeIncreasedString("echo '"+getServerName(type)+" is not running'"); writeString("else"); increaseIdent(); writeString("echo -n 'Stopping "+getServerName(type)+"... '"); writeString("pid=`cat \"$pidfile\"`"); writeString("kill $pid"); writeString("sleep 2"); writeString("isServerUp"); writeString("running=$?"); writeString("if [ $running == 0 ]; then"); increaseIdent(); writeString("echo Done"); writeString("rm -f \"$pidfile\""); decreaseIdent(); writeString("else"); writeIncreasedString("echo Failed"); writeString("fi"); decreaseIdent(); writeString("fi"); decreaseIdent(); writeString("}"); //status method emptyline(); writeString("status() {"); increaseIdent(); writeString("isServerUp"); writeString("running=$?"); writeString("if [ $running == 1 ]; then"); writeIncreasedString("echo '"+getServerName(type)+" is running'"); writeString("else"); writeIncreasedString("echo '"+getServerName(type)+" is not running'"); writeString("fi"); decreaseIdent(); writeString("}"); //main selector emptyline(); writeString("case $1 in"); increaseIdent(); writeString("start)"); increaseIdent(); writeString("start"); writeString(";;"); decreaseIdent(); writeString("stop)"); increaseIdent(); writeString("stop"); writeString(";;"); decreaseIdent(); writeString("restart)"); increaseIdent(); writeString("stop"); writeString("sleep 1"); writeString("start"); writeString(";;"); decreaseIdent(); writeString("status)"); increaseIdent(); writeString("status"); writeString(";;"); decreaseIdent(); writeString("*)"); writeString("echo $\"Usage: $0 {start|stop|restart|status}\""); writeString("exit 1"); decreaseIdent(); writeString("esac"); emptyline(); writeString("exit 0"); writer.flush(); writer.close(); } }