66import com .regnosys .rosetta .RosettaRuntimeModule ;
77import com .regnosys .rosetta .RosettaStandaloneSetup ;
88import com .regnosys .rosetta .builtin .RosettaBuiltinsService ;
9- import com .regnosys .rosetta .common .util .ClassPathUtils ;
10- import com .regnosys .rosetta .common .util .UrlUtils ;
119import com .regnosys .rosetta .generator .external .ExternalGenerator ;
1210import com .regnosys .rosetta .generator .external .ExternalGenerators ;
1311import com .regnosys .rosetta .rosetta .RosettaModel ;
1412import org .apache .commons .cli .*;
15- import org .apache .commons .io .FileUtils ;
1613import org .eclipse .emf .ecore .resource .Resource ;
1714import org .eclipse .emf .ecore .resource .ResourceSet ;
1815import org .eclipse .xtext .resource .XtextResourceSet ;
2219import org .slf4j .LoggerFactory ;
2320
2421import jakarta .inject .Inject ;
25- import java .io .File ;
2622import java .io .IOException ;
2723import java .nio .file .*;
2824import java .util .*;
2925import java .util .stream .Collectors ;
30- import java .util .stream .Stream ;
3126
3227/**
3328 * Command-line interface for generating Python code from Rosetta models.
@@ -92,7 +87,6 @@ public static void main(String[] args) {
9287 if (cmd .hasOption ("s" )) {
9388 String srcDir = cmd .getOptionValue ("s" );
9489 translateFromSourceDir (srcDir , tgtDir );
95- translateFromSourceDir2 (srcDir , tgtDir + "-2" );
9690 } else if (cmd .hasOption ("f" )) {
9791 String srcFile = cmd .getOptionValue ("f" );
9892 translateFromSourceFile (srcFile , tgtDir );
@@ -111,132 +105,79 @@ private static void printUsage(Options options) {
111105 formatter .printHelp ("PythonCodeGeneratorCLI" , options , true );
112106 }
113107
114- private static void translateFromSourceDir (String srcDir , String tgtDir ) {
115- LOGGER . info ( "Reading from directory: {} and writing to: {}" , srcDir , tgtDir );
108+ private static void translateFromSourceDir (String srcDir , String tgtDir ) {
109+ // Find all .rosetta files in a directory
116110 Path srcDirPath = Paths .get (srcDir );
117111 if (!Files .exists (srcDirPath )) {
118- System . err . println ("Source directory does not exist: " + srcDir );
119- return ;
112+ LOGGER . error ("Source directory does not exist: {}" , srcDir );
113+ System . exit ( 1 ) ;
120114 }
121115 if (!Files .isDirectory (srcDirPath )) {
122- System . err . println ("Source directory is not a directory: " + srcDir );
123- return ;
116+ LOGGER . error ("Source directory is not a directory: {}" , srcDir );
117+ System . exit ( 1 ) ;
124118 }
125- List <Path > rosettaFiles = new ArrayList <>();
126- try (Stream <Path > paths = Files .walk (srcDirPath )) {
127- paths .filter (Files ::isRegularFile )
128- .filter (f -> f .getFileName ().toString ().endsWith (".rosetta" ))
129- .forEach (rosettaFiles ::add );
130- } catch (IOException e ) {
131- System .err .println ("Error reading source directory: " + e .getMessage ());
132- return ;
133- }
134- LOGGER .info ("Found {} .rosetta files in directory {}" , rosettaFiles .size (), srcDir );
135- translateRosetta (rosettaFiles , tgtDir );
136- }
137-
138- private static void translateFromSourceDir2 (String srcDir , String tgtDir ) {
139- LOGGER .info ("translateFromSourceDir2 ... Reading from directory: {} and writing to: {}" , srcDir , tgtDir );
140- Path srcDirPath = Paths .get (srcDir );
141- if (!Files .exists (srcDirPath )) {
142- System .err .println ("Source directory does not exist: " + srcDir );
143- return ;
144- }
145- if (!Files .isDirectory (srcDirPath )) {
146- System .err .println ("Source directory is not a directory: " + srcDir );
147- return ;
148- }
149- Injector injector = new PythonRosettaStandaloneSetup ().createInjectorAndDoEMFRegistration ();
150- PythonCodeGenerator pythonCodeGenerator = injector .getInstance (PythonCodeGenerator .class );
151- PythonModelLoader modelLoader = injector .getInstance (PythonModelLoader .class );
152- ResourceSet resourceSet = injector .getInstance (ResourceSet .class );
153-
154- List <Resource > resources = new LinkedList <>();
155-
156- RosettaBuiltinsService builtins = injector .getInstance (RosettaBuiltinsService .class );
157- resources .add (resourceSet .getResource (builtins .basicTypesURI , true ));
158- resources .add (resourceSet .getResource (builtins .annotationsURI , true ));
159119 try {
160- // Find all .rosetta files in the directory and load them from disk
161- Files . walk ( srcDirPath )
162- .filter (path -> path .toString ().endsWith (".rosetta" ))
163- .map ( file -> resourceSet . getResource ( URI . createFileURI ( file . toString ()), true ))
164- . forEach ( resources :: add );
120+ List < Path > rosettaFiles = Files . walk ( srcDirPath )
121+ . filter ( Files :: isRegularFile )
122+ .filter (f -> f . getFileName () .toString ().endsWith (".rosetta" ))
123+ .collect ( Collectors . toList ());
124+ processRosettaFiles ( rosettaFiles , tgtDir );
165125 } catch (IOException e ) {
166- System .err .println ("Error reading source directory: " + e .getMessage ());
167- return ;
168- }
169- LOGGER .info ("translateFromSourceDir2 ... Found {} .rosetta files in directory {}" , resources .size (), srcDir );
170-
171-
172- List <RosettaModel > models = modelLoader .rosettaModels2 (resources );
173- if (models .isEmpty ()) {
174- System .err .println ("No valid Rosetta models found." );
175- return ;
176- }
177- String version = models .get (0 ).getVersion ();
178-
179- LOGGER .info ("translateFromSourceDir2 ... Processing {} models, version: {}" , models .size (), version );
180-
181- Map <String , CharSequence > generatedPython = new HashMap <>();
182- pythonCodeGenerator .beforeAllGenerate (resourceSet , models , version );
183- for (RosettaModel model : models ) {
184- System .out .println ("translateFromSourceDir2 ... processing: " + model .getName ());
185- generatedPython .putAll (pythonCodeGenerator .beforeGenerate (model .eResource (), model , version ));
186- generatedPython .putAll (pythonCodeGenerator .generate (model .eResource (), model , version ));
187- generatedPython .putAll (pythonCodeGenerator .afterGenerate (model .eResource (), model , version ));
126+ LOGGER .error ("Failed to process source directory: {}" , srcDir , e );
188127 }
189- generatedPython .putAll (pythonCodeGenerator .afterAllGenerate (resourceSet , models , version ));
190-
191- writePythonFiles (generatedPython , tgtDir );
192128 }
193-
194-
195- private static void translateFromSourceFile (String srcFile , String tgtDir ) {
196- LOGGER .info ("Reading from file: {} and writing to: {}" , srcFile , tgtDir );
129+ private static void translateFromSourceFile (String srcFile , String tgtDir ) {
197130 Path srcFilePath = Paths .get (srcFile );
198131 if (!Files .exists (srcFilePath )) {
199- System . err . println ("Source file does not exist: " + srcFile );
200- return ;
132+ LOGGER . error ("Source file does not exist: {}" , srcFile );
133+ System . exit ( 1 ) ;
201134 }
202135 if (Files .isDirectory (srcFilePath )) {
203- System . err . println ("Source file is a directory: " + srcFile );
204- return ;
136+ LOGGER . error ("Source file is a directory: {}" , srcFile );
137+ System . exit ( 1 ) ;
205138 }
206- translateRosetta (Collections .singletonList (srcFilePath ), tgtDir );
139+ if (!srcFilePath .toString ().endsWith (".rosetta" )) {
140+ LOGGER .error ("Source file does not end with .rosetta: {}" , srcFile );
141+ System .exit (1 );
142+ }
143+ List <Path > rosettaFiles = List .of (srcFilePath );
144+ processRosettaFiles (rosettaFiles , tgtDir );
207145 }
146+ // Common processing function
147+ private static void processRosettaFiles (List <Path > rosettaFiles , String tgtDir ) {
148+ LOGGER .info ("Processing {} .rosetta files, writing to: {}" , rosettaFiles .size (), tgtDir );
208149
209- private static void translateRosetta (List <Path > rosettaFiles , String tgtDir ) {
210- LOGGER .info ("Cleaning target directory: {}" , tgtDir );
211- File directory = new File (tgtDir );
212- try {
213- if (directory .exists () && directory .isDirectory ()) {
214- FileUtils .cleanDirectory (directory );
215- }
216- } catch (IOException e ) {
217- System .err .println ("Failed to clean the directory: " + e .getMessage ());
218- return ;
150+ if (rosettaFiles .isEmpty ()) {
151+ System .err .println ("No .rosetta files found to process." );
152+ System .exit (1 );
219153 }
220154
221155 Injector injector = new PythonRosettaStandaloneSetup ().createInjectorAndDoEMFRegistration ();
156+ ResourceSet resourceSet = injector .getInstance (ResourceSet .class );
157+ List <Resource > resources = new LinkedList <>();
158+ RosettaBuiltinsService builtins = injector .getInstance (RosettaBuiltinsService .class );
159+ resources .add (resourceSet .getResource (builtins .basicTypesURI , true ));
160+ resources .add (resourceSet .getResource (builtins .annotationsURI , true ));
161+ rosettaFiles .stream ()
162+ .map (path -> resourceSet .getResource (URI .createFileURI (path .toString ()), true ))
163+ .forEach (resources ::add );
164+
222165 PythonCodeGenerator pythonCodeGenerator = injector .getInstance (PythonCodeGenerator .class );
223166 PythonModelLoader modelLoader = injector .getInstance (PythonModelLoader .class );
224167
225- List <Path > staticRosettaFilePaths = ClassPathUtils .findStaticRosettaFilePaths ();
226- List <RosettaModel > models = modelLoader .rosettaModels (staticRosettaFilePaths , rosettaFiles );
168+ List <RosettaModel > models = modelLoader .getRosettaModels (resources );
227169 if (models .isEmpty ()) {
228- System . err . println ("No valid Rosetta models found." );
229- return ;
170+ LOGGER . error ("No valid Rosetta models found." );
171+ System . exit ( 1 ) ;
230172 }
231- XtextResourceSet resourceSet = modelLoader .getResourceSet ();
232- String version = models .get (0 ).getVersion ();
173+ String version = models .getFirst ().getVersion ();
233174
234175 LOGGER .info ("Processing {} models, version: {}" , models .size (), version );
235176
236177 Map <String , CharSequence > generatedPython = new HashMap <>();
237178 pythonCodeGenerator .beforeAllGenerate (resourceSet , models , version );
238179 for (RosettaModel model : models ) {
239- System .out .println ("translateRosetta ... processing : " + model .getName ());
180+ System .out .println ("Processing : " + model .getName ());
240181 generatedPython .putAll (pythonCodeGenerator .beforeGenerate (model .eResource (), model , version ));
241182 generatedPython .putAll (pythonCodeGenerator .generate (model .eResource (), model , version ));
242183 generatedPython .putAll (pythonCodeGenerator .afterGenerate (model .eResource (), model , version ));
@@ -261,27 +202,12 @@ private static void writePythonFiles(Map<String, CharSequence> generatedPython,
261202 }
262203 LOGGER .info ("Wrote {} files to {}" , generatedPython .size (), tgtDir );
263204 }
264-
265205 // --- Helper classes for model loading and Guice setup ---
266206
267207 static class PythonModelLoader {
268208 @ Inject Provider <XtextResourceSet > resourceSetProvider ;
269-
270- public List <RosettaModel > rosettaModels (List <Path > statics , List <Path > sourceFiles ) {
271- XtextResourceSet resourceSet = resourceSetProvider .get ();
272- return Stream .concat (statics .stream (), sourceFiles .stream ())
273- .map (UrlUtils ::toUrl )
274- .map (PythonModelLoader ::url )
275- .map (f -> getResource (resourceSet , f ))
276- .filter (Objects ::nonNull )
277- .map (Resource ::getContents )
278- .flatMap (Collection ::stream )
279- .filter (r -> r instanceof RosettaModel )
280- .map (r -> (RosettaModel ) r )
281- .collect (Collectors .toList ());
282- }
283-
284- public List <RosettaModel > rosettaModels2 (List <Resource > resources ) {
209+
210+ public List <RosettaModel > getRosettaModels (List <Resource > resources ) {
285211 return resources .stream ()
286212 .filter (Objects ::nonNull )
287213 .map (Resource ::getContents )
@@ -343,4 +269,4 @@ public Injector createInjector() {
343269 return Guice .createInjector (new PythonRosettaRuntimeModule ());
344270 }
345271 }
346- }
272+ }
0 commit comments