Go to the documentation of this file.00001 package org.ros.model.compilers;
00002
00003 import java.net.URI;
00004 import java.io.BufferedReader;
00005 import java.io.File;
00006 import java.io.IOException;
00007 import java.io.InputStreamReader;
00008 import java.net.URISyntaxException;
00009
00010
00011
00012 import org.eclipse.epsilon.egl.EglFileGeneratingTemplateFactory;
00013 import org.eclipse.epsilon.egl.EglTemplateFactoryModuleAdapter;
00014 import org.eclipse.epsilon.eol.IEolExecutableModule;
00015 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
00016 import org.eclipse.epsilon.emc.emf.EmfModel;
00017 import org.eclipse.epsilon.eol.exceptions.models.EolModelLoadingException;
00018 import org.eclipse.epsilon.commons.util.StringProperties;
00019
00020
00021
00022 import org.eclipse.epsilon.eol.dt.ExtensionPointToolNativeTypeDelegate;
00023 import org.best_of_robotics.transform.ros.to.cplusplus.tools.CHModToolNativeTypeDelegate;
00024 import org.best_of_robotics.transform.ros.to.cplusplus.tools.ConfigFileCreatorNativeTypeDelegate;
00025
00026
00027
00028
00029
00030 public class M2CStandalone {
00031 static String output_package = "";
00032 static String input_package = "";
00033 static String model_path = "";
00034 static String language = "";
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 protected static EmfModel createEmfModel(String name, String model, String metamodel, boolean readOnLoad, boolean storeOnDisposal) throws EolModelLoadingException, URISyntaxException {
00052 EmfModel emfModel = new EmfModel();
00053 StringProperties properties = new StringProperties();
00054 properties.put(EmfModel.PROPERTY_NAME, name);
00055 properties.put(EmfModel.PROPERTY_FILE_BASED_METAMODEL_URI, "file:/" + new File(metamodel).getAbsolutePath());
00056 properties.put(EmfModel.PROPERTY_MODEL_URI, "file:/" + new File(model).getAbsolutePath());
00057 properties.put(EmfModel.PROPERTY_IS_METAMODEL_FILE_BASED, "true");
00058 properties.put(EmfModel.PROPERTY_READONLOAD, readOnLoad + "");
00059 properties.put(EmfModel.PROPERTY_STOREONDISPOSAL, storeOnDisposal + "");
00060 emfModel.load(properties, null);
00061 return emfModel;
00062 }
00063
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090 public static String findPackageURI(String packagename)
00091 {
00092 String cmd = "rospack find " + packagename;
00093 Runtime run = Runtime.getRuntime();
00094 Process pr;
00095 try {
00096 pr = run.exec(cmd);
00097 pr.waitFor();
00098 BufferedReader buf = new BufferedReader(new InputStreamReader(pr.getInputStream()));
00099 return buf.readLine();
00100 } catch (IOException e) {
00101
00102 e.printStackTrace();
00103 } catch (InterruptedException e) {
00104
00105 e.printStackTrace();
00106 }
00107 return "";
00108 }
00109
00110 public static void parseArgs(String [] args)
00111 {
00112
00113
00114 for (int i=0; i < args.length; i+=2) {
00115 switch (args[i].charAt(0)) {
00116 case '-':
00117 if (args[i].charAt(1) == 'o') {
00118 output_package = args[i+1];
00119 break;
00120 }
00121 if (args[i].charAt(1) == 'p') {
00122 input_package = args[i+1];
00123 break;
00124 }
00125 if (args[i].charAt(1) == 'l') {
00126 language = args[i+1];
00127 break;
00128 }
00129 break;
00130 default:
00131 model_path = args[i];
00132 break;
00133 }
00134 }
00135 if(model_path == "" || output_package == "")
00136 {
00137 System.out.println("Usage: rosrun bride_compilers m2t -o brics_test [-l language] [-p brics_test] model/brics_test.ros_package");
00138 return;
00139 }
00140
00141 }
00142
00143
00144
00145
00146 public static void main(String[] args) {
00147
00148 parseArgs(args);
00149 System.out.println("InputPackage: " + input_package);
00150 System.out.println("OutputPackage: " + output_package);
00151 System.out.println("ModelPath: " + model_path);
00152 System.out.println("Language: " + language);
00153 if(model_path != "" && output_package != "")
00154 {
00155 try {
00156
00157 String model_uri = findPackageURI(input_package) + "/" + model_path;
00158 System.out.println("Will use model from " + model_uri);
00159
00160
00161 String ext_type = model_uri.substring(model_uri.lastIndexOf('.')+1, model_uri.length());
00162 System.out.println("File extension is " + ext_type);
00163 String templ_type = "";
00164 if(ext_type.compareTo("ros_package") == 0)
00165 {
00166 templ_type = "package";
00167 if(language.compareTo("cpp") != 0 && language.compareTo("python") != 0)
00168 {
00169 language = "cpp";
00170 }
00171 }
00172 if(ext_type.compareTo("ros_coordinator") == 0)
00173 {
00174 templ_type = "coordinator";
00175 language = "python";
00176 }
00177 if(ext_type.compareTo("ros_system") == 0)
00178 templ_type = "system";
00179 if(templ_type == "")
00180 {
00181 System.out.println("File Extension unknown.");
00182 return;
00183 }
00184
00185
00186 String template_uri = findPackageURI("bride_templates") + "/" + language + "/" + templ_type + "/package.egl";
00187 System.out.println("Will use template from " + template_uri);
00188
00189
00190 String output_uri = findPackageURI(output_package);
00191 System.out.println("Will generate code to " + output_uri);
00192
00193
00194 EglFileGeneratingTemplateFactory eglTemplateFactory = new EglFileGeneratingTemplateFactory();
00195 IEolExecutableModule module = new EglTemplateFactoryModuleAdapter(eglTemplateFactory);
00196 System.out.println("Parsing template files...");
00197 eglTemplateFactory.setOutputRoot(output_uri);
00198 module.parse(new File(template_uri));
00199
00200 System.out.println("Creating final model out of dsl and specific model...");
00201 EmfModel model = createEmfModel("Model", model_uri, findPackageURI("bride_compilers")+"/bin/models/ros.ecore", true, false);
00202
00203 module.getContext().getNativeTypeDelegates().add(new CHModToolNativeTypeDelegate());
00204 module.getContext().getNativeTypeDelegates().add(new ConfigFileCreatorNativeTypeDelegate());
00205
00206 System.out.println("Adding model to template egl engine...");
00207 module.getContext().getModelRepository().addModel(model);
00208
00209 Object result = new Object();
00210 try {
00211 System.out.println("Executing engine...");
00212 result = module.execute();
00213 } catch (EolRuntimeException e) {
00214 e.printStackTrace();
00215 }
00216 System.out.println(result);
00217 System.out.println("Done.");
00218 } catch (Throwable t) {
00219 System.err.println("An unexpected error occured");
00220 t.printStackTrace();
00221 }
00222 }
00223 }
00224
00225 }