1818import java .io .File ;
1919import java .io .FilenameFilter ;
2020import java .io .IOException ;
21+ import java .net .MalformedURLException ;
22+ import java .net .URISyntaxException ;
2123import java .net .URL ;
2224import java .net .URLClassLoader ;
2325import java .util .HashMap ;
3436
3537/**
3638 * @author Markus Michael Geipel
37- *
39+ *
3840 */
3941public final class Flux {
4042 public static final String MODULES_DIR = "modules" ;
43+
44+ private static final String JAR_FILE_EXTENSION = ".jar" ;
45+ private static final String CLASS_FILE_EXTENSION = ".class" ;
46+
4147 private static final Pattern VAR_PATTERN = Pattern .compile ("([^=]*)=(.*)" );
4248 private static final String SCRIPT_HOME = "FLUX_DIR" ;
4349
50+ private static final String MODULES_DIR_ARG = "-modules=" ;
51+
4452 private Flux () {
4553 // no instances
4654 }
@@ -49,34 +57,27 @@ private Flux() {
4957 * @param args
5058 * @throws IOException
5159 * @throws RecognitionException
60+ * @throws URISyntaxException
5261 */
5362 public static void main (final String [] args ) throws IOException , RecognitionException {
5463
55- final File modulesDir = new File (MODULES_DIR );
56- if (modulesDir .exists ()) {
57- final FilenameFilter filter = new FilenameFilter () {
58- @ Override
59- public boolean accept (final File dir , final String name ) {
60- return name .endsWith (".jar" ) || name .endsWith (".class" );
61- }
62- };
63- final List <URL > moduleURLs = new LinkedList <URL >();
64- for (File file : modulesDir .listFiles (filter )) {
65- moduleURLs .add (file .getAbsoluteFile ().toURI ().toURL ());
66- }
67- final URLClassLoader moduleLoader = new URLClassLoader (moduleURLs .toArray (new URL [0 ]), Thread
68- .currentThread ().getContextClassLoader ());
69- Thread .currentThread ().setContextClassLoader (moduleLoader );
64+ loadModules (getModulesDir (args ));
65+
66+ final int fileArg ;
67+ if (args .length > 0 && args [0 ].startsWith (MODULES_DIR_ARG )) {
68+ fileArg = 1 ;
69+ } else {
70+ fileArg = 0 ;
7071 }
7172
72- if (args .length < 1 ) {
73+ if (args .length < ( fileArg + 1 ) ) {
7374 FluxProgramm .printHelp (System .out );
7475 System .exit (2 );
7576 } else {
7677
77- final File fluxFile = new File (args [0 ]);
78+ final File fluxFile = new File (args [fileArg ]);
7879 if (!fluxFile .exists ()) {
79- System .err .println ("File not found: " + args [0 ]);
80+ System .err .println ("File not found: " + args [fileArg ]);
8081 System .exit (1 );
8182 return ;
8283 }
@@ -85,7 +86,10 @@ public boolean accept(final File dir, final String name) {
8586 final Map <String , String > vars = new HashMap <String , String >();
8687 vars .put (SCRIPT_HOME , fluxFile .getAbsoluteFile ().getParent () + System .getProperty ("file.separator" ));
8788
88- for (int i = 1 ; i < args .length ; ++i ) {
89+ for (int i = fileArg + 1 ; i < args .length ; ++i ) {
90+ if (args [i ].startsWith (MODULES_DIR_ARG )) {
91+ continue ;
92+ }
8993 final Matcher matcher = VAR_PATTERN .matcher (args [i ]);
9094 if (!matcher .find ()) {
9195 FluxProgramm .printHelp (System .err );
@@ -96,9 +100,48 @@ public boolean accept(final File dir, final String name) {
96100
97101 // run parser and builder
98102 FluxCompiler .compile (ResourceUtil .getStream (fluxFile ), vars ).start ();
103+ }
104+ }
99105
106+ private static File getModulesDir (final String [] args ) {
107+ File modulesDir = new File (MODULES_DIR );
108+
109+ File programDir = null ;
110+ try {
111+ programDir = new File (Flux .class .getProtectionDomain ().getCodeSource ().getLocation ().toURI ());
112+ } catch (final URISyntaxException e ) {
113+ // Ignore the programDir, if it is not available
114+ }
115+ if (programDir != null ) {
116+ if (programDir .getName ().endsWith (JAR_FILE_EXTENSION )) {
117+ programDir = programDir .getParentFile ();
118+ }
119+ modulesDir = new File (programDir , MODULES_DIR );
120+ }
121+
122+ if (args .length > 0 && args [0 ].startsWith (MODULES_DIR_ARG )) {
123+ modulesDir = new File (args [0 ].substring (MODULES_DIR_ARG .length ()));
100124 }
125+
126+ return modulesDir ;
101127 }
102128
129+ private static void loadModules (final File modulesDir ) throws MalformedURLException {
130+ if (modulesDir .exists ()) {
131+ final FilenameFilter filter = new FilenameFilter () {
132+ @ Override
133+ public boolean accept (final File dir , final String name ) {
134+ return name .endsWith (JAR_FILE_EXTENSION ) || name .endsWith (CLASS_FILE_EXTENSION );
135+ }
136+ };
137+ final List <URL > moduleURLs = new LinkedList <URL >();
138+ for (final File file : modulesDir .listFiles (filter )) {
139+ moduleURLs .add (file .getAbsoluteFile ().toURI ().toURL ());
140+ }
141+ final URLClassLoader moduleLoader = new URLClassLoader (moduleURLs .toArray (new URL [0 ]), Thread
142+ .currentThread ().getContextClassLoader ());
143+ Thread .currentThread ().setContextClassLoader (moduleLoader );
144+ }
145+ }
103146
104147}
0 commit comments