/* Copyright (C) 2004 - 2008 Versant Inc. http://www.db4o.com
This file is part of the sharpen open source java to c# translator.
sharpen is free software; you can redistribute it and/or modify it under
the terms of version 2 of the GNU General Public License as published
by the Free Software Foundation and as clarified by db4objects' GPL
interpretation policy, available at
http://www.db4o.com/about/company/legalpolicies/gplinterpretation/
Alternatively you can write to db4objects, Inc., 1900 S Norfolk Street,
Suite 350, San Mateo, CA 94403, USA.
sharpen 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 General Public License
for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
package sharpen.core;
import java.io.Console;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Properties;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import sharpen.core.framework.ConsoleProgressMonitor;
import sharpen.core.io.IO;
public class SharpenApplication {
private SharpenCommandLine _args;
private static final int HELP_SIZE =27;
public void start(String[] args) throws Exception {
try {
_args = SharpenCommandLine.parse(args);
if(_args.help==true){
displayHelp();
return;
}
System.err.println("Configuration Class: " + _args.configurationClass);
System.err.println("Configuration Class: " +_args.runtimeTypeName);
Configuration config = ConfigurationFactory.newExternalConfiguration(_args.configurationClass, _args.runtimeTypeName, newProgressMonitor());
if(config == null)
config = ConfigurationFactory.newConfiguration(_args.configurationClass, _args.runtimeTypeName);
Sharpen.getDefault().configuration(config);
safeRun();
} catch (Exception x) {
System.err.println("ERROR: " + x.getMessage());
x.printStackTrace();
throw x;
}
}
void displayHelp()
{
Properties prop = new Properties();
InputStream input = null;
try {
String filename = "sharpen.properties";
input = SharpenApplication.class.getClassLoader().getResourceAsStream(filename);
if(input==null){
System.out.println("Unable to find " + filename);
return;
}
prop.load(input);
System.out.println("**************Help Start**************************");
//get the property value and print it out
System.out.println(prop.getProperty("111"));
System.out.println();
System.out.println(prop.getProperty("222"));
System.out.println();
System.out.println("Valid command line options are as following. PRESS ENTER TO PROCEED");
Console console = System.console();
for (int i = 1; i <= HELP_SIZE; i++){
String key= Integer.toString(i);
System.out.println();
System.out.println(prop.getProperty(key));
if(i%5 ==0){
console.readLine();
}
}
System.out.println("**************Help End**************************");
} catch (IOException ex) {
ex.printStackTrace();
} finally{
if(input!=null){
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
void safeRun() throws Exception {
long startTime = System.currentTimeMillis();
try {
convert();
} finally {
System.out.println(
"Conversion finished in " + (System.currentTimeMillis()-startTime) + "ms.");
}
}
private void convert() throws CoreException, IOException, InterruptedException {
JavaProjectCmd project = setUpJavaProject();
convertTo(project);
}
private String resetTargetFolder(JavaProjectCmd project) throws IOException {
return deleteTargetProject(project);
}
private void convertTo(JavaProjectCmd project)
throws IOException, CoreException, InterruptedException {
List<String> units = sortedByName(project.getAllCompilationUnits());
String targetFolder =resetTargetFolder(project);
SharpenConversionBatch converter = new SharpenConversionBatch(getConfiguration());
converter.setContinueOnError(_args.continueOnError);
converter.setProgressMonitor(newProgressMonitor());
converter.setTargetProject(targetFolder);
converter.setsourceFiles(units);
converter.setsourcePathEntries(project.getSourceFolder());
converter.setclassPathEntries(project.getclassPath());
converter.run();
}
private String deleteTargetProject(JavaProjectCmd project) throws IOException
{
String target = project.getProjectPath() + "/" + project.getProjectName() + SharpenConstants.SHARPENED_PROJECT_SUFFIX;
File targetfile = new File(target);
if (targetfile.exists()) {
delete(targetfile);
}
return target;
}
private void delete(File f) throws IOException {
if (f.isDirectory()) {
for (File c : f.listFiles())
delete(c);
}
if (!f.delete())
throw new FileNotFoundException("Failed to delete file: " + f);
}
private Configuration getConfiguration() throws IOException {
final Configuration configuration = Sharpen.getDefault().configuration();
ods("Pascal case mode: " + _args.pascalCase);
configuration.setNamingStrategy(_args.pascalCase.getNamingStrategy());
if (_args.indentWithSpaces) {
ods("Using spaces for indentation.");
StringBuilder indent = new StringBuilder(_args.indentSize);
for (int i = 0; i < _args.indentSize; i++) {
indent.append(' ');
}
configuration.setIndentString(indent.toString());
}
if (_args.maxColumns != 0) {
configuration.setMaxColumns(_args.maxColumns);
}
if (_args.nativeTypeSystem) {
ods("Native type system mode on.");
configuration.enableNativeTypeSystem();
}
if (_args.nativeInterfaces) {
ods("Native interfaces mode on.");
configuration.enableNativeInterfaces();
}
if (_args.separateInterfaceConstants) {
ods("Separating interface constants to their own classes.");
configuration.enableSeparateInterfaceConstants();
}
if (_args.organizeUsings) {
ods("Organize usings mode on.");
configuration.enableOrganizeUsings();
}
if (_args.paramCountFileNames) {
ods("Generic parameter count appended to file names.");
configuration.enableParamCountFileNames();
}
if (_args.junitConversion) {
ods("JUnit conversion mode on.");
configuration.enableJUnitConversion();
}
if (this._args.flatNamespaceDirectoryStructure) {
ods("Flat namespace directory structure mode on.");
configuration.enableFlatNamespaceDirectoryStructure();
}
if (_args.sharpenNamespace != null) {
ods("Sharpen namespace: " + _args.sharpenNamespace);
configuration.setSharpenNamespace(_args.sharpenNamespace);
}
if (_args.headerFile != null) {
ods("Header file: " + _args.headerFile);
configuration.setHeader(IO.readFile(new File(_args.headerFile)));
}
if (_args.xmldoc != null) {
ods("Xml documentation: " + _args.xmldoc);
configuration.setDocumentationOverlay(new XmlDocumentationOverlay(_args.xmldoc));
}
configuration.mapEventAdds(_args.eventAddMappings);
configuration.mapEvents(_args.eventMappings);
configuration.mapNamespaces(_args.namespaceMappings);
configuration.mapMembers(_args.memberMappings);
configuration.conditionalCompilation(_args.conditionalCompilation);
for (String fullyQualifiedType : _args.fullyQualifiedTypes) {
configuration.addFullyQualifiedTypeName(fullyQualifiedType);
}
for (String typeName : _args.partialTypes) {
configuration.addPartialType(typeName);
}
for (Configuration.NameMapping mapping : _args.typeMappings) {
configuration.mapType(mapping.from, mapping.to);
}
return configuration;
}
private List<String> sortedByName(List<String> units) {
Collections.sort(units, new Comparator<String>() {
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
return units;
}
private IProgressMonitor newProgressMonitor() {
return new ConsoleProgressMonitor();
}
JavaProjectCmd setUpJavaProject() throws CoreException {
ods("project: " + _args.project);
JavaProjectCmd jpCmd = new JavaProjectCmd();
jpCmd.setProjectName(_args.project);
jpCmd.setProjectPath(_args.projectPath);
jpCmd.setSourceFolder(_args.sourceFolders);
jpCmd.setclassPath(_args.classpath);
return jpCmd;
}
private static void ods(String message) {
System.out.println(message);
}
}