/*
* Copyright 2010 kk-electronic a/s.
*
* This file is part of KKPortal.
*
* KKPortal is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KKPortal is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with KKPortal. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.kk_electronic.gwt.rebind;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import com.google.gwt.core.ext.Generator;
import com.google.gwt.core.ext.GeneratorContext;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.NotFoundException;
import com.google.gwt.core.ext.typeinfo.TypeOracle;
import com.google.gwt.user.rebind.ClassSourceFileComposerFactory;
import com.google.gwt.user.rebind.SourceWriter;
public class VersionGenerator extends Generator {
private String packageName;
private String className;
private TypeOracle typeOracle;
@Override
public String generate(TreeLogger logger, GeneratorContext context,
String typeName) throws UnableToCompleteException {
try {
typeOracle = context.getTypeOracle();
JClassType classType = typeOracle.getType(typeName);
packageName = classType.getPackage().getName();
className = classType.getSimpleSourceName() + "Impl";
generateClass(logger, context);
} catch (NotFoundException e) {
logger.log(TreeLogger.ERROR, "Exception during ModuleRegistry creation.", e);
throw new UnableToCompleteException();
}
return packageName + "." + className;
}
private void generateClass(TreeLogger logger, GeneratorContext context) {
PrintWriter printWriter = context.tryCreate(logger, packageName, className);
if (printWriter == null){
return;
}
ClassSourceFileComposerFactory composer = new ClassSourceFileComposerFactory(packageName,className);
composer.addImplementedInterface(Version.class.getCanonicalName());
SourceWriter sourceWriter = composer.createSourceWriter(context,printWriter);
writeGetSHA1(sourceWriter);
writeGetTag(sourceWriter);
sourceWriter.outdent();
sourceWriter.println("}");
context.commit(logger, printWriter);
}
private void writeGetSHA1(SourceWriter sourceWriter) {
sourceWriter.println("public String getSHA1(){");
sourceWriter.indent();
sourceWriter.print("return \"");
String result = executeCommand("git rev-parse HEAD");
if (result != null){
sourceWriter.print(escape(result));
}
sourceWriter.println("\";");
sourceWriter.outdent();
sourceWriter.println("}");
}
private void writeGetTag(SourceWriter sourceWriter) {
sourceWriter.println("public String getTag(){");
sourceWriter.indent();
sourceWriter.print("return \"");
String result = executeCommand("git describe --tags --always HEAD");
if (result != null){
sourceWriter.print(escape(result));
}
sourceWriter.println("\";");
sourceWriter.outdent();
sourceWriter.println("}");
}
private String executeCommand(String command){
Process child;
try {
child = Runtime.getRuntime().exec(command);
BufferedReader r = new BufferedReader(new InputStreamReader(child.getInputStream()));
return r.readLine();
} catch (IOException e) {
return e.toString();
}
}
}