Package Torello.Java.Build
Class DFBuilder
- java.lang.Object
-
- Torello.Java.Build.DFBuilder
-
public abstract class DFBuilder extends java.lang.Object
Can be used by Classes the need to build Data-File(s) for the'data-files/'
directory, or convert those Data-Files to Text for viewing and inspection.
Hi-Lited Source-Code:- View Here: Torello/Java/Build/DFBuilder.java
- Open New Browser-Tab: Torello/Java/Build/DFBuilder.java
File Size: 13,386 Bytes Line Count: 321 '\n' Characters Found
-
-
Constructor Summary
Constructors Constructor Description DFBuilder()
-
Method Summary
Abstract Instance Methods: Generate Data-File(s) & Data Text-File(s) Modifier and Type Method abstract void
buildAll(String dataFileRootDir)
void
buildAllToText(String targetDir)
void
deCompileAllToText(String targetDir)
Abstract Instance Methods: Retrieve Data-File Names Modifier and Type Method abstract Iterable<String>
dataFileNames()
Helper:public static void main Modifier and Type Method boolean
cli(int menuOptions, String[] argv)
Static Method: Generate Data-Files for all Packages Modifier and Type Method static int
buildAll(BuildPackage pkg)
-
-
-
Constructor Detail
-
DFBuilder
public DFBuilder()
-
-
Method Detail
-
dataFileNames
public abstract java.lang.Iterable<java.lang.String> dataFileNames()
Requests a list of Data-File Names that are constructed by this instance.
-
buildAll
public abstract void buildAll(java.lang.String dataFileRootDir) throws java.io.IOException
Requests that this Data-File Builder run and generate all Data-Files that it can build.- Parameters:
dataFileRootDir
- The target directory location for writing the file(s)
Relative Directory Path: This parameter is necessary becase an instance ofDFBuilder
might be invoked from just about anywhere. Thus, it is imperative that the actual root'../data-files/'
directory be passed to this method, to avoid writing the Data-Files into the wrong place.
ThisString
-Parameter'dataFileRootDir'
must be aString
that is a Relative-Path, from the CWD / Current-Working-Directory from whence the current Java-Instance was invoked, to the'../data-files/'
directory where the Data-Files are to be written.- Throws:
java.io.IOException
- If there are any problems while writing the data-file.
-
buildAllToText
public void buildAllToText(java.lang.String targetDir) throws java.io.IOException
Requests that this Data-File Builder generate all Data-Files as Text-Files, so that they may be viewed and inspected.
Default Implementation:
This method is intentaionally not declaredabstract
, so as to allow a user to avoid implementing this at all. Writing Data-Files to Text-Files is important during the debugging phase of a Data-File, but isn't mandatory for using this class.
This default implementation, instead, simply throws theUnsupportedOperationException
, instead.- Parameters:
targetDir
- The target directory location for writing the file(s)
Relative Directory Path: This parameter is necessary becuase an instance ofDFBuilder
might be invoked from just about anywhere. Thus it is imperative to pass the target-directory location to this method.
ThisString
-Parameter'targetDir'
must be aString
that is a Relative-Path, from the CWD / Current-Working-Directory from whence the current Java Instance was invoked, to the directory where the output Text-Files are to be written.- Throws:
java.io.IOException
- If there are any problems reading or writing files to the Operation-System, then this exception throws.java.lang.UnsupportedOperationException
- This method is not declaredabstract
, so that implementations which do not have a need for it can rely-on / fall-back-on this default version - thus avoiding the otherwise-inevitable exception "This class must impleent ---, or be declared abstract."
This implementation throwsUnsupportedOperationException
- Code:
- Exact Method Body:
throw new UnsupportedOperationException();
-
deCompileAllToText
public void deCompileAllToText(java.lang.String targetDir) throws java.io.IOException
Requests that this Data-File Builder convert the existing Data-Files themselves into Text-Files, so that they may be viewed and inspected.
Default Implementation:
This method is intentaionally not declaredabstract
, so as to allow a user to avoid implementing this at all. Writing Data-Files to Text-Files is important during the debugging phase of a Data-File, but isn't mandatory for using this class.
This default implementation, instead, simply throws theUnsupportedOperationException
, instead.- Parameters:
targetDir
- The target directory location for writing the file(s)
Relative Directory Path: This parameter is necessary becuase an instance ofDFBuilder
might be invoked from just about anywhere. Thus it is imperative to pass the target-directory location to this method.
ThisString
-Parameter'targetDir'
must be aString
that is a Relative-Path, from the CWD / Current-Working-Directory from whence the current Java Instance was invoked, to the directory where the output Text-Files are to be written.- Throws:
java.io.IOException
- If there are any problems reading or writing files to the Operation-System, then this exception throws.java.lang.UnsupportedOperationException
- This method is not declaredabstract
, so that implementations which do not have a need for it can rely-on / fall-back-on this default version - thus avoiding the otherwise-inevitable exception "This class must impleent ---, or be declared abstract."
This implementation throwsUnsupportedOperationException
- Code:
- Exact Method Body:
throw new UnsupportedOperationException();
-
buildAll
public static int buildAll(BuildPackage pkg) throws java.io.IOException
Runs / Executes the methodbuildAll(java.lang.String)
on all Class-File(s) found insdie the'data-files/'
directory for a given package. If the package provided to parameter'pkg'
does not have a'data-files/'
directory, then this method exists gracefully- Parameters:
pkg
- Any one of the Configured Project Packages. The relevant fields used by this method areBuildPackage.classPathLocation
andBuildPackage.pkgRootDirectory
. These two fields are concatenated, and that directory is searched for any / all class files that implement thisDFBuilder
interface.- Returns:
- The number of class-files implementing the
DFBuilder
interface. - Throws:
java.io.IOException
- Code:
- Exact Method Body:
String dirName = pkg.classPathLocation + pkg.pkgRootDirectory; File f = new File(dirName); if ((! f.exists()) || (! f.isDirectory())) return 0; String[] fNameArr = FileNode .createRoot(dirName) .loadTree(-1, (File dir, String fName) -> fName.endsWith(".class"), null) .flattenJustFiles(RTC.FULLPATH_ARRAY()); int counter = 0; TOP: for (String classFileName : fNameArr) { // *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** // FileRW.readClass // *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** // Pulls the Class-Name out of the Class-FileName: // 1) Removes the ".class" extension // 2) Removes the leading "data-files/..." directory string stuff from File-Name final String className = StringParse.beforeExtension (StringParse.fromLastFileSeparatorPos(classFileName)); // Runs the FileRW.readClass method & catches the exceptions it throws. final Class<?> c; try { c = FileRW.readClass(classFileName, className); } catch (Exception e) { continue; } // *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** // Make sure class is a DFBuilder instance // *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** Class<?> temp = c; while (true) if (temp == null) continue TOP; else if (temp == Object.class) continue TOP; else if (temp == DFBuilder.class) break; else temp = temp.getSuperclass(); // *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** // Instantiate and call instance buildAll() // *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** final DFBuilder dfb; try { dfb = ((Class<DFBuilder>) c).getDeclaredConstructor().newInstance(); } catch (Exception e) { System.out.println( "Unable to instantiate DFBuilder.\n" + "Do you have a Zero-Argument Public Constructor?\n" + EXCC.toString(e) ); System.exit(1); return -1; // Shut-Up Compiler } counter++; dfb.buildAll(dirName); } return counter;
-
cli
public final boolean cli(int menuOptions, java.lang.String[] argv)
This method is intended to be used by classes that inherit this abstract class. Classes that inheritDFBuilder
may add a method into their implementation, as in the hilited source-code below. This provides a standard Java'Main'
-Method that may be invoked as a CLI: Command Line Interface.
Example:
// The class extending DFBuilder can use this method so that it can be invoked at the // command line. Passing '1' means that only the 'buildAll' was written by the extending // Type. public static void main(String[] argv) { new YourDataFileBuilder().cli(1, argv); }
- Parameters:
menuOptions
- The value passed to this parameter must be one of the values excplicitly named in this set:1, 2, 3, 4, 6
. Any value other than these 5 numbers will force this method to throw anIllegalArgumentException
.
This meaning of these is clearly explained, in the table below:'menuOptions'
Meaning '1' The only method implemented is the buildAll
method. The others, on invokation, will throw theUnsupportedOperationException
'3' 3 => 1 & 2
MethodsbuildAll
andbuildAllToText
are implemented, and may be invoked.
Attempting to calldeCompileAllToText
would cause anUnsupportedOperationException
to throw.'4' 4 => 1 & 3
MethodsbuildAll
anddeCompileAllToText
are implemented, and may be invoked.
Attempting to callbuildAllToText
would cause anUnsupportedOperationException
to throw.'6' 6 ==> 1, 2 & 3
All three methods exported by this class have been implemented, and may be invoked without worry that theUnsupportedOperationException
will throw.argv
- The Command-Line ParameterString[]
-Array. This should just be theargv
-Array that was sent to the actual Java'Main'
-Method that his invoking this helper.- Returns:
TRUE
if and only if the invoked builder method terminated successfully.- Code:
- Exact Method Body:
if ((menuOptions < 1) || (menuOptions > 6) || (menuOptions == 2) || (menuOptions == 5)) throw new IllegalArgumentException( "Parameter 'menuOptions' must be a value in this set: [1, 3, 4, 6]\n" + "These are the only valid values to pass here, but [" + menuOptions + "] was " + "provided, instead." ); if ((argv.length != 1) && (argv.length != 2)) { printManPage(menuOptions); return false; } final boolean twoOK = (menuOptions == 3) || (menuOptions == 6); final boolean threeOK = (menuOptions == 4) || (menuOptions == 6); final String dirName = (argv.length == 2) ? argv[1] : ""; try { switch (argv[0]) { case "1": buildAll(dirName); break; case "2": if (twoOK) buildAllToText(dirName); else printManPage(menuOptions); break; case "3": if (threeOK) deCompileAllToText(dirName); else printManPage(menuOptions); break; } } catch (Exception e) { System.out.println( "This DFBuilder Instance has thrown an Exception while writing a File:\n" + EXCC.toString(e) + '\n' ); return false; } return true;
-
-