summaryrefslogtreecommitdiff
path: root/Tools/Java/Source/DbTools/src
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/Java/Source/DbTools/src')
-rw-r--r--Tools/Java/Source/DbTools/src/org/tianocore/DbTools/DbCmds.java501
-rw-r--r--Tools/Java/Source/DbTools/src/org/tianocore/DbTools/DbTool.java24
-rw-r--r--Tools/Java/Source/DbTools/src/org/tianocore/DbTools/UpdateDb.java557
3 files changed, 1082 insertions, 0 deletions
diff --git a/Tools/Java/Source/DbTools/src/org/tianocore/DbTools/DbCmds.java b/Tools/Java/Source/DbTools/src/org/tianocore/DbTools/DbCmds.java
new file mode 100644
index 0000000000..502be2499b
--- /dev/null
+++ b/Tools/Java/Source/DbTools/src/org/tianocore/DbTools/DbCmds.java
@@ -0,0 +1,501 @@
+// @file
+// DbCmds command-line interface to the classes that
+// update the FrameworkDatabase.db file based on WORKSPACE Contents
+//
+// Copyright (c) 2006, Intel Corporation All rights reserved.
+//
+// This program and the accompanying materials are licensed and made
+// available under the terms and conditions of the BSD License which
+// accompanies this distribution. The full text of the license may
+// be found at http://opensource.org/licenses/bsd-license.php
+//
+// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+//
+// This program is the command line interface to the CombineMsa class, which
+// will take the following arguments:
+//
+// Input:
+// -t, --test Test the Workspace against the FrameworkDatabase.db file
+// Returns 0 if valid, returns 1 if failed
+//
+// -f, --fix Fix the FrameworkDatabase.db file, so that it matches the
+// the contents of the WORKSPACE
+// Returns 0 if valid, returns 1 if failed
+//
+// -v [-v] Verbose Flag - sum of these will be used to set different
+// levels of verbosity
+//
+// -i Interactive, when used with -f or --fix, will query the user
+// regarding adds and deletes of packages and platforms from
+// the database.
+//
+// -a, --add Add an SPD or FPD file to the FrameworkDatabase.db file. The
+// SPD/FPD file must exist, or the command will fail.
+// Returns 0 if valid, returns 1 if failed
+//
+// -r, --del Remove an SPD or FPD file from the FrameworkDatabase.db file.
+// If the SPD/FPD file exists, the user will be queried to
+// remove it from the directory tree. For SPD files, the user
+// will also be presented with a list of Modules in the SPD
+// file, with the query to remove the modules as well as the
+// SPD file.
+// Returns 0 if valid, returns 1 if failed
+//
+// -u Display the UiName for all Packages and Platforms currently in
+// the FrameworkDatabase.db file.
+// Returns 0 if valid, returns 1 if failed
+//
+// -c Display a CSV listing of Type (SPD|FPD) UiName and Filename of
+// every entry in the FrameworkDatabase.db file.
+// Returns 0 if valid, returns 1 if failed
+//
+// No Options Display a list of Type (Package|Platfrom) and Filename of every
+// entry in the FrameworkDatabase.db file.
+// Returns 0 if valid, returns 1 if failed
+//
+// -h, -?, --help Displays this usage and exits.
+// Returns 0 if valid, returns 1 if failed
+//
+//
+// Output:
+// Displayed information
+//
+// Modifies - OPTIONAL
+// FrameworkDatabase.db
+//
+
+package org.tianocore.DbTools;
+
+import java.io.*;
+
+public class DbCmds {
+
+ protected enum Cmd {
+ SHOW_CSV, SHOW_PLATFORMS, SHOW_PACKAGES, FIX_DB, TEST_DB, FIND_SOMETHING, SHOW_FAR, ADD_SOMETHING,
+ DELETE_SOMETHING
+ }
+
+ private int DEBUG = 0;
+
+ private static final String copyright = "Copyright (c) 2006, Intel Corporation All rights reserved.";
+
+ private static final String version = "Version 0.1";
+
+ private static final String Specification = "FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052";
+
+ private int VERBOSE = 0;
+
+ public boolean INTERACTIVE = false;
+
+ private String workspace = System.getenv("WORKSPACE");
+
+ private final String frameworkDatabase = workspace + File.separator + "Tools" + File.separator + "Conf"
+ + File.separator + "FrameworkDatabase.db";
+
+ private final int ESUCCESS = 0;
+
+ private final int EFAILURE = 1;
+
+ private final int MIN_VERBOSE = 0;
+
+ private final int MED_VERBOSE = 1;
+
+ private final int MAX_VERBOSE = 2;
+
+ private final static int FOUND = 1;
+
+ private final static int NOTFOUND = 0;
+
+ private boolean TEST = false;
+
+ private int result = ESUCCESS;
+
+ private Cmd commandToCall;
+
+ private boolean isPlatform = false;
+
+ private boolean isPackage = false;
+
+ private boolean isFar = false;
+
+ private boolean QUIET = false;
+
+ private String commandArgs = "";
+
+ private String whatToFind = "";
+
+ public int DbUpdateCmdLine(String[] args) {
+
+ if (testFile(frameworkDatabase) == NOTFOUND) {
+ System.out.println("ERROR: E000 Invalid Workspace!");
+ System.out.println("The environment variable, WORKSPACE, does not point to a valid workspace");
+ System.out.println("DbUpdate Aborted!");
+ System.err.flush();
+ System.exit(EFAILURE);
+ }
+ result = parseCmdLine(args);
+ if (result == ESUCCESS) {
+ if (DEBUG > 2)
+ System.out.println("Parse Succeeded!");
+ if (VERBOSE > MAX_VERBOSE)
+ System.out.println("WORKSPACE: " + workspace);
+ if (DEBUG > 1)
+ System.out.println("Command to call: " + commandToCall.toString());
+ result = processCmdLine(commandToCall);
+ } else {
+ if (QUIET == false) {
+ System.out.println("Invalid Arguments");
+ outputUsage();
+ result = EFAILURE;
+ }
+ }
+ if (DEBUG > 2)
+ System.out.println(" Result: " + result);
+
+ return result;
+ }
+
+ private int processCmdLine(Cmd cmdCode) {
+ UpdateDb dbUp = new UpdateDb();
+ int res = ESUCCESS;
+ switch (cmdCode) {
+ case SHOW_CSV:
+ // display current Database contents in CSV format
+ // Modifies: NOTHING
+ if ((DEBUG > 3) || (VERBOSE > MED_VERBOSE))
+ System.out.println("Display contents of the FrameworkDatabase.db file in CSV format.");
+ result = dbUp.getCsvEntries(frameworkDatabase, VERBOSE);
+ break;
+ case FIX_DB:
+ // Automatically make the database match the contents of the workspace
+ // Modifies: FrameworkDatabase.db
+ if ((VERBOSE > MIN_VERBOSE) && (QUIET == false)) {
+ if (TEST == false)
+ System.out.println("Adjusting the FrameworkDatabase to match the contents of the WORKSPACE: "
+ + workspace);
+ if (TEST)
+ System.out.println("Verify the FrameworkDatabase matches the contents of the WORKSPACE: "
+ + workspace);
+ }
+ if ((DEBUG > 3) || (VERBOSE > MED_VERBOSE))
+ System.out.println("Scan the Workspace and update the FrameworkDatabase.db file.");
+ result = dbUp.fixDatabase(workspace, VERBOSE, INTERACTIVE, TEST, QUIET);
+
+ break;
+ case ADD_SOMETHING:
+ // Add a Platform, package or FAR to the workspace.
+ // Modifies: FrameworkDatabase.db
+ if (((DEBUG > 3) || (VERBOSE > MED_VERBOSE)) && (isPlatform))
+ System.out.println("Add Platform " + commandArgs + " to the FrameworkDatabase.db file");
+ else if (((DEBUG > 3) || (VERBOSE > MED_VERBOSE)) && (isPackage))
+ System.out.println("Add Package " + commandArgs + " to the FrameworkDatabase.db file");
+ else if (((DEBUG > 3) || (VERBOSE > MED_VERBOSE)) && (isFar))
+ System.out.println("Add Framework Archive " + commandArgs + " to the FrameworkDatabase.db file");
+ result = dbUp.addItem(frameworkDatabase, commandArgs, VERBOSE, INTERACTIVE);
+ break;
+ case DELETE_SOMETHING:
+ // Remove a platform, package or FAR from the workspace
+ // Modifies: FrameworkDatabase.db, AND Filesystem
+ if (((DEBUG > 3) || (VERBOSE > MED_VERBOSE)) && (isPlatform))
+ System.out.println("Removing Platform " + commandArgs + " from the FrameworkDatabase.db file");
+ else if (((DEBUG > 3) || (VERBOSE > MED_VERBOSE)) && (isPackage))
+ System.out.println("Removing Package " + commandArgs + " from the FrameworkDatabase.db file");
+ else if (((DEBUG > 3) || (VERBOSE > MED_VERBOSE)) && (isFar))
+ System.out.println("Removing Framework Archive " + commandArgs + " from the FrameworkDatabase.db file");
+ result = dbUp.addItem(workspace, commandArgs, VERBOSE, INTERACTIVE);
+ break;
+ case FIND_SOMETHING:
+ // Find something in the workspace
+ // Modifies: NOTHING
+ if ((DEBUG > 3) || (VERBOSE > MED_VERBOSE))
+ System.out.println("Finding " + whatToFind + " " + commandArgs + " in the Workspace");
+ result = dbUp.findItem(workspace, VERBOSE, whatToFind, commandArgs);
+ break;
+ case SHOW_FAR:
+ // Display FAR information for all SPDs in the workspace
+ // Modifies: NOTHING
+ if ((DEBUG > 3) || (VERBOSE > MED_VERBOSE))
+ System.out.println("Display Framework Archives in the Workspace");
+ result = dbUp.findFars(workspace, VERBOSE);
+ break;
+ case SHOW_PACKAGES:
+ // Display SPD information for all SPDs in the workspace
+ // Modifies: NOTHING
+ if ((DEBUG > 3) || (VERBOSE > MED_VERBOSE))
+ System.out.println("Display Packages in the Workspace");
+ result = dbUp.findSpds(workspace, VERBOSE);
+ break;
+ case SHOW_PLATFORMS:
+ // Display FPD information for all SPDs in the workspace
+ // Modifies: NOTHING
+ if ((DEBUG > 3) || (VERBOSE > MED_VERBOSE))
+ System.out.println("Display Platforms in the Workspace");
+ result = dbUp.findFpds(workspace, VERBOSE);
+ break;
+ default:
+ // ERROR IF WE GET HERE!
+ if ((DEBUG > 3) || (VERBOSE > MAX_VERBOSE))
+ System.out.println("We could not process the following: " + commandToCall.toString());
+ else if (QUIET == false)
+ outputUsage();
+ result = EFAILURE;
+ break;
+ }
+ return res;
+ }
+
+ private int parseCmdLine(String[] args) {
+
+ // Default is to fix the database.
+ commandToCall = Cmd.FIX_DB;
+ if (args.length == NOTFOUND) {
+ if ((DEBUG > 3) || (VERBOSE > MAX_VERBOSE))
+ System.out.println("NO ARGUMENTS! " + commandToCall.toString());
+ return (ESUCCESS);
+ }
+
+ for (int i = 0; i < args.length; i++)
+ if (args[i].toLowerCase().contentEquals("-q"))
+ QUIET = true;
+
+ for (int i = 0; i < args.length; i++) {
+ String arg = args[i].trim();
+ // This is the list of valid options
+ if (!((arg.toLowerCase().startsWith("-t")) || (arg.toLowerCase().startsWith("--t"))
+ || (arg.toLowerCase().startsWith("-q")) || (arg.toLowerCase().startsWith("-i"))
+ || (arg.toLowerCase().startsWith("-f")) || (arg.toLowerCase().startsWith("--f"))
+ || (arg.toLowerCase().startsWith("-c")) || (arg.toLowerCase().startsWith("--c"))
+ || (arg.toLowerCase().startsWith("-a")) || (arg.toLowerCase().startsWith("--a"))
+ || (arg.toLowerCase().startsWith("-r")) || (arg.toLowerCase().startsWith("--d"))
+ || (arg.toLowerCase().startsWith("-v")) || (arg.toLowerCase().startsWith("--c"))
+ || (arg.toLowerCase().startsWith("--p")) || (arg.toLowerCase().startsWith("-h"))
+ || (arg.toLowerCase().startsWith("--h")) || (arg.toLowerCase().startsWith("/h")) || (arg
+ .toLowerCase()
+ .startsWith("-?")))) {
+ // This is the fall through, we got something we did not know how to
+ // process!
+ if (args[i].startsWith("-")) {
+ System.out.println("ERROR: E1004 Unknown Option: " + arg);
+ System.out.println("Try running with -h or --help");
+ } else {
+ System.out.println("ERROR: E1005 Unknown Argument: " + arg);
+ System.out.println("Try running with -h or --help");
+ }
+ System.out.println("Program Aborted!");
+ System.err.flush();
+ System.exit(EFAILURE);
+ }
+ if ((arg.toLowerCase().contentEquals("-t")) || (arg.toLowerCase().contains("--test"))) {
+ // Test Workspace, do not fix.
+ TEST = true;
+ }
+ if (arg.toLowerCase().contentEquals("-q")) {
+ QUIET = true;
+ }
+ if (arg.toLowerCase().contentEquals("-i")) {
+ INTERACTIVE = true;
+ }
+ if ((arg.toLowerCase().contentEquals("-f")) || (arg.toLowerCase().contains("--fix"))) {
+ // Non-interactive fix of the database
+ commandToCall = Cmd.FIX_DB;
+ }
+ if ((arg.toLowerCase().contentEquals("-c")) || (arg.toLowerCase().contains("--csv"))) {
+ // Dump database in CSV format
+ commandToCall = Cmd.SHOW_CSV;
+ }
+ if ((arg.toLowerCase().trim().contentEquals("-a")) || (arg.toLowerCase().contains("--add"))) {
+ i++;
+ if (args[i].startsWith("-")) {
+ System.out.println("ERROR: E002 Missing Argument!");
+ System.out
+ .println("The add function requires an argument, either a package name or a platform name!");
+ System.out.println("DbUpdate Aborted!");
+ System.err.flush();
+ System.exit(EFAILURE);
+ }
+ commandToCall = Cmd.ADD_SOMETHING;
+ commandArgs = args[i];
+ setArgType(commandArgs);
+ }
+ if ((arg.toLowerCase().trim().contentEquals("-r")) || (arg.toLowerCase().contains("--del"))) {
+ i++;
+ if (args[i].startsWith("-")) {
+ System.out.println("ERROR: E002 Missing Argument!");
+ System.out
+ .println("The remove function requires an argument, either a package name or a platform name!");
+ System.out.println("DbUpdate Aborted!");
+ System.err.flush();
+ System.exit(EFAILURE);
+ }
+ commandToCall = Cmd.DELETE_SOMETHING;
+ commandArgs = args[i];
+ setArgType(commandArgs);
+ }
+ if (arg.toLowerCase().contains("--find")) {
+ commandToCall = Cmd.FIND_SOMETHING;
+ i++;
+ if (args[i].toLowerCase().contains("--lib"))
+ whatToFind = "LIBRARY";
+ else if (args[i].toLowerCase().contains("--guid"))
+ whatToFind = "GUID";
+ else if (args[i].toLowerCase().contains("--ppi"))
+ whatToFind = "PPI";
+ else if (args[i].toLowerCase().contains("--prot"))
+ whatToFind = "PROTOCOL";
+ else if (args[i].toLowerCase().contains("--pcd"))
+ whatToFind = "PCD";
+ else if (args[i].startsWith("-")) {
+ System.out.println("ERROR: E001 Invalid Argument");
+ System.out.println("The find function takes either a qualifier of --guid, --ppi,");
+ System.out.println(" --proto, --pcd, or the string to search for.");
+ System.err.flush();
+ System.exit(EFAILURE);
+ } else
+ commandArgs = args[i];
+
+ if (!whatToFind.contentEquals("")) {
+ i++;
+ if (args[i].startsWith("-")) {
+ System.out.println("ERROR: E001 Invalid Argument");
+ System.out.println("The find function qualifier (--guid, --ppi, --proto, --pcd)");
+ System.out.println(" must be followed by the string to search for.");
+ System.err.flush();
+ System.exit(EFAILURE);
+ } else
+ commandArgs = args[i];
+ }
+
+ }
+ if (arg.trim().contentEquals("-v")) {
+ VERBOSE++;
+ }
+ if (arg.toLowerCase().contains("--lib")) {
+ whatToFind = "LIBRARY";
+ }
+ if (arg.toLowerCase().contains("--guid")) {
+ whatToFind = "GUID";
+ }
+ if (arg.toLowerCase().contains("--ppi")) {
+ whatToFind = "PPI";
+ }
+ if (arg.toLowerCase().contains("--prot")) {
+ whatToFind = "PROTOCOL";
+ }
+ if (arg.toLowerCase().contains("--pcd")) {
+ whatToFind = "PCD";
+ }
+ if (arg.toLowerCase().contentEquals("-d") || arg.trim().toLowerCase().contains("--debug")) {
+ if ((i + 1 == args.length) || (args[i + 1].trim().startsWith("-"))) {
+ DEBUG = 1;
+ } else if (i + 1 < args.length) {
+ String pattern = "^\\d+";
+ if (args[i + 1].trim().matches(pattern)) {
+ i++;
+ DEBUG = Integer.parseInt(args[i]);
+ } else
+ DEBUG = 1;
+ }
+ }
+ if (arg.trim().contentEquals("-V")) {
+ System.out.println("DbTools, " + version);
+ System.out.println(copyright);
+ System.out.println(Specification);
+ System.err.flush();
+ System.exit(ESUCCESS);
+ }
+ if (arg.toLowerCase().trim().startsWith("--pack")) {
+ commandToCall = Cmd.SHOW_PACKAGES;
+ }
+ if (arg.toLowerCase().trim().startsWith("--far")) {
+ commandToCall = Cmd.SHOW_FAR;
+ }
+ if (arg.toLowerCase().trim().startsWith("--plat")) {
+ commandToCall = Cmd.SHOW_PLATFORMS;
+ }
+ if ((arg.toLowerCase().contentEquals("-h")) || (arg.toLowerCase().contentEquals("-?"))
+ || (arg.toLowerCase().startsWith("/h")) || (arg.toLowerCase().contentEquals("--help"))) {
+ outputUsage();
+ System.exit(EFAILURE);
+ }
+
+ }
+ return ESUCCESS;
+ }
+
+ private int testFile(String Filename) {
+ File tFile = new File(Filename);
+ if (DEBUG > 4)
+ System.out.println("File is located: " + tFile.getPath());
+ if (tFile.exists())
+ return FOUND;
+ else
+ return NOTFOUND;
+ }
+
+ private void setArgType(String argv) {
+ if (argv.trim().toLowerCase().contains(".spd"))
+ isPackage = true;
+ if (argv.trim().toLowerCase().contains(".fpd"))
+ isPlatform = true;
+ if (argv.trim().toLowerCase().contains(".far"))
+ isFar = true;
+ }
+
+ public String getArgType() {
+ String argt = "UNKNOWN";
+ if (isPackage)
+ argt = "SPD";
+ if (isFar)
+ argt = "FAR";
+ if (isPlatform)
+ argt = "FPD";
+ return argt;
+ }
+
+ private static void outputUsage() {
+
+ System.out.println("DbTool, " + version);
+ System.out.println(copyright);
+ System.out.println("Usage:");
+ System.out.println(" DbTool [-v] [-t] [-q] [-V] [--package] [--platform] [-h | -? | --help]");
+ System.out.println(" where:");
+ System.out.println(" -h | -? | --help OPTIONAL - This Help Text");
+ System.out
+ .println(" -t | --test OPTIONAL - Test the FrameworkDatabase Contents against the WORKSPACE");
+ System.out
+ .println(" -q OPTIONAL - Quiet mode - pass or fail only on return value, nothing is printed");
+ System.out
+ .println(" -f | --fix OPTIONAL - Automatically fix (non-interactive) the Database file to match the WORKSPACE.");
+ System.out
+ .println(" -v OPTIONAL - Verbose, print information messages. Adding more -v arguments increases verbosity.");
+ System.out.println(" --package OPTIONAL - Show all Packages installed in the WORKSPACE.");
+ System.out.println(" --platforms OPTIONAL - Show all Platforms installed in the WORKSPACE.");
+ System.out.println(" -V OPTIONAL - Display Verision information and exit.");
+ //
+ // TODO: Implement the following options.
+ //
+ /**
+ System.out.println("");
+ System.out.println(" =================== Options below this line have not been implemented in this release ===================");
+ System.out
+ .println(" -i OPTIONAL - Force interactive on commands that modify the WORKSPACE");
+ System.out
+ .println(" --far OPTIONAL - Show all Framework Archives installed in the WORKSPACE.");
+ System.out
+ .println(" --find [qualifier] value OPTIONAL - Search the WORKSPACE for value, with one and only one optional Qualifier.");
+ System.out.println(" qualifiers: --guid Find a GUID by Guid C Name");
+ System.out.println(" --prot Find a Protocol or ProtocolNotify by C Name");
+ System.out.println(" --ppi Find a PPI or PpiNotify by C Name");
+ System.out.println(" --pcd Find a PCD entry by C Name");
+ System.out.println(" --lib Find information about a Library Class");
+ System.out
+ .println(" -c OPTIONAL - Print a comma separated value listing of TYPE,UiName,Filename");
+ System.out
+ .println(" -a, --add value OPTIONAL - Add a value (package, platform or far) to the database");
+ System.out
+ .println(" -r, --del value OPTIONAL - Remove a value (package, platform or far) from the database");
+ System.out.println("");
+ */
+ }
+}
diff --git a/Tools/Java/Source/DbTools/src/org/tianocore/DbTools/DbTool.java b/Tools/Java/Source/DbTools/src/org/tianocore/DbTools/DbTool.java
new file mode 100644
index 0000000000..5e502b710c
--- /dev/null
+++ b/Tools/Java/Source/DbTools/src/org/tianocore/DbTools/DbTool.java
@@ -0,0 +1,24 @@
+// @file
+// DbUpdate wrapper
+//
+// Copyright (c) 2006, Intel Corporation All rights reserved.
+//
+// This program and the accompanying materials are licensed and made
+// available under the terms and conditions of the BSD License which
+// accompanies this distribution. The full text of the license may
+// be found at http://opensource.org/licenses/bsd-license.php
+//
+// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+//
+
+package org.tianocore.DbTools;
+
+public class DbTool {
+
+ public static void main(String[] args) {
+ if (new DbCmds().DbUpdateCmdLine(args) != 0)
+ System.exit(1);
+ System.exit(0);
+ }
+}
diff --git a/Tools/Java/Source/DbTools/src/org/tianocore/DbTools/UpdateDb.java b/Tools/Java/Source/DbTools/src/org/tianocore/DbTools/UpdateDb.java
new file mode 100644
index 0000000000..ad581c93a6
--- /dev/null
+++ b/Tools/Java/Source/DbTools/src/org/tianocore/DbTools/UpdateDb.java
@@ -0,0 +1,557 @@
+// @file
+// This Class processes multiple MSA files and merges them into a single,
+// merged MSA file. It will optionally add the merged MSA file into a package.
+//
+//
+// Copyright (c) 2006, Intel Corporation All rights reserved.
+//
+// This program and the accompanying materials are licensed and made
+// available under the terms and conditions of the BSD License which
+// accompanies this distribution. The full text of the license may
+// be found at http://opensource.org/licenses/bsd-license.php
+//
+// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+//
+//
+
+package org.tianocore.DbTools;
+
+import java.io.*;
+import java.util.*;
+// import java.sql.Time;
+
+// import java.lang.*;
+// import java.lang.ExceptionInInitializerError;
+
+// import org.apache.xmlbeans.*;
+import org.apache.xmlbeans.XmlCursor;
+// import org.apache.xmlbeans.XmlObject;
+import org.apache.xmlbeans.XmlOptions;
+// import org.apache.xmlbeans.XmlException;
+import org.tianocore.*;
+
+// import org.tianocore.*;
+// FrameworkDatabase.db Schema Elements
+import org.tianocore.FrameworkDatabaseDocument.*;
+import org.tianocore.FdbHeaderDocument.*;
+import org.tianocore.PackageListDocument.*;
+import org.tianocore.PlatformListDocument.*;
+import org.tianocore.FarListDocument.*;
+
+// FAR Schema Elements
+// import org.tianocore.FrameworkArchiveManifestDocument.*;
+// import org.tianocore.FarHeaderDocument.*;
+// import org.tianocore.FarPackageDocument.*;
+// import org.tianocore.FarPlatformDocument.*;
+
+// FPD Schema Elements
+import org.tianocore.PlatformSurfaceAreaDocument.*;
+import org.tianocore.PlatformHeaderDocument.*;
+
+// import org.tianocore.FrameworkModulesDocument.*;
+// import org.tianocore.DynamicPcdBuildDefinitionsDocument.*;
+
+// SPD Schema Elements
+// import org.tianocore.PackageSurfaceAreaDocument.*;
+// import org.tianocore.SpdHeaderDocument.*;
+// import org.tianocore.LibraryClassDeclarationsDocument.*;
+// import org.tianocore.GuidDeclarationsDocument.*;
+// import org.tianocore.ProtocolDeclarationsDocument.*;
+// import org.tianocore.PpiDeclarationsDocument.*;
+// import org.tianocore.PcdDeclarationsDocument.*;
+
+// MSA Schema Elements
+// import org.tianocore.ModuleSurfaceAreaDocument.*;
+// import org.tianocore.MsaHeaderDocument.*;
+// import org.tianocore.LicenseDocument.*;
+// import org.tianocore.LibraryClassDefinitionsDocument.*;
+// import org.tianocore.PackageDependenciesDocument.*;
+// import org.tianocore.ProtocolsDocument.*;
+// import org.tianocore.PPIsDocument.*;
+// import org.tianocore.PcdCodedDocument.*;
+
+public class UpdateDb {
+
+ private final int DEBUG = 0;
+
+ private final int PASS = 0;
+
+ private final int FAIL = 1;
+
+ private int dCtr = 0;
+
+ private int lCtr = 0;
+
+ // Future implementations
+ // private XmlCursor cursor = null;
+
+ // FrameworkDatabase Component Elements
+ // private FrameworkDatabaseDocument fdbDoc = null;
+
+ // private FrameworkDatabase fdbInstance = null;
+
+ // private FdbHeader fdbHeader = null;
+
+ // private PackageList fdbPackageList = null;
+
+ // private ArrayList<String> packageList = new ArrayList<String>();
+
+ // private PlatformList fdbPlatformList = null;
+
+ // private ArrayList<String> platformList = new ArrayList<String>();
+
+ // private FarList fdbFarList = null;
+
+ // private ArrayList<String> farList = new ArrayList<String>();
+
+ private ArrayList<String> spdList = new ArrayList<String>();
+
+ private ArrayList<String> fpdList = new ArrayList<String>();
+
+ // Platform Components
+ // private PlatformSurfaceAreaDocument fpdDoc = null;
+
+ // private PlatformSurfaceArea fpd = null;
+
+ // private PlatformHeader fpdHeader = null;
+
+ private boolean wasModified = false;
+
+ private int VERBOSE = 0;
+
+ // The combineMsaFiles routine is the primary routine for creating a
+ // Merged MSA file.
+
+ public UpdateDb() {
+ init();
+ }
+
+ private void init() {
+
+ }
+
+ public int getAllEntries(String dbFilename, int VERBOSE_FLAG) {
+ System.out.println("Function not yet implemented!");
+ return FAIL;
+ }
+
+ public int getCsvEntries(String dbFilename, int VERBOSE_FLAG) {
+ System.out.println("Function not yet implemented!");
+ return FAIL;
+ }
+
+ public int fixDatabase(String workspace, int VERBOSE_FLAG, boolean INTERACTIVE, boolean TEST, boolean QUIET) {
+ int result = PASS;
+ String dbFile = workspace + File.separator + "Tools" + File.separator + "Conf" + File.separator
+ + "FrameworkDatabase.db";
+ String dbBak = dbFile + ".bak";
+
+ try {
+ // Make a backup file for frameworkDatabase
+ if (VERBOSE_FLAG > 3)
+ System.out.println("Creating Backup file: " + dbBak);
+ copyFile(dbFile, dbBak);
+ } catch (IOException e) {
+ System.out.println("Error: Cannot make backup file " + dbBak);
+ return FAIL;
+ }
+
+ // Datebase update for SPD and FPD files
+ result = fixDB(workspace, dbFile, VERBOSE_FLAG, TEST, QUIET);
+ if ((result == 0) && (TEST) && (QUIET == false))
+ System.out.println("Workspace is consistent with current database!");
+ return PASS;
+ }
+
+ public int addItem(String dbFilename, String item, int VERBOSE_FLAG, boolean INTERACTIVE) {
+ System.out.println("Function not yet implemented!");
+ return FAIL;
+ }
+
+ public int delItem(String workspace, String item, int VERBOSE_FLAG, boolean INTERACTIVE) {
+ System.out.println("Function not yet implemented!");
+ return FAIL;
+ }
+
+ public int findItem(String workspace, int VERBOSE_FLAG, String findWhat, String item) {
+ System.out.println("Function not yet implemented!");
+ return FAIL;
+ }
+
+ public int findFars(String workspace, int VERBOSE_FLAG) {
+ System.out.println("Function not yet implemented!");
+ return FAIL;
+ }
+
+ public int findSpds(String workspace, int VERBOSE_FLAG) {
+ System.out.println("The following Package (SPD) files are in the workspace!");
+ File wsDir = new File(workspace);
+ findSPDFiles(wsDir, workspace, VERBOSE);
+ for (int i = 0; i < spdList.size(); i++) {
+ System.out.println(" " + spdList.get(i).trim());
+ // TODO: get the PackageName from the file
+ }
+ return FAIL;
+ }
+
+ public int findFpds(String workspace, int VERBOSE_FLAG) {
+ System.out.println("The following Platform (FPD) files are in the workspace!");
+ File wsDir = new File(workspace);
+ findFPDFiles(wsDir, workspace, VERBOSE);
+ for (int i = 0; i < fpdList.size(); i++) {
+ System.out.println(" " + fpdList.get(i).trim());
+ // TODO: get the PlatformName from the file
+ }
+ return FAIL;
+ }
+
+ // copy from source file to destination file
+ private int copyFile(String src, String dst) throws IOException {
+ try {
+ File srcFile = new File(src);
+ FileReader fileReader = new FileReader(srcFile);
+ BufferedReader reader = new BufferedReader(fileReader);
+
+ File dstFile = new File(dst);
+ FileWriter fileWriter = new FileWriter(dstFile);
+ BufferedWriter writer = new BufferedWriter(fileWriter);
+
+ String line = null;
+ while ((line = reader.readLine()) != null) {
+ writer.write(line);
+ writer.newLine();
+ }
+
+ reader.close();
+ writer.close();
+ } catch (IOException e) {
+ System.out.println("I/O Exception during file copy: " + e);
+ }
+
+ return PASS;
+ }
+
+ private int fixDB(String workspace, String dbFile, int VERBOSE, boolean TEST, boolean QUIET) {
+ File wsDir = new File(workspace);
+ int retValue = PASS;
+ // Find all .spd and .fpd files in workspace and put them in spdList and fpdList
+ if (VERBOSE > 0)
+ System.out.println("SPD File Search ");
+ findSPDFiles(wsDir, workspace, VERBOSE);
+ dCtr = 0;
+ lCtr = 0;
+ if (VERBOSE > 0) {
+ System.out.println(" ");
+ System.out.println("FPD File Search ");
+ }
+ findFPDFiles(wsDir, workspace, VERBOSE);
+ if (VERBOSE > 0)
+ System.out.println(" ");
+
+ try {
+ // check database file for possible update
+ retValue = checkDBForUpdate(workspace, dbFile, VERBOSE, TEST, QUIET);
+ } catch (IOException e) {
+ if (QUIET == false)
+ System.out.println("Error: Updating " + dbFile + " file.");
+ return FAIL;
+ }
+
+ if ((VERBOSE > 0) && (TEST) && (wasModified)) {
+ System.out.println("FRAMEWORK Database does NOT match the contents of the WORKSPACE");
+ retValue = FAIL;
+ }
+ if ((VERBOSE > 0) && (wasModified == false) && (QUIET == false))
+ System.out.println("FRAMEWORK Database matches the contents of the WORKSPACE");
+
+ return retValue;
+ }
+
+ private void findSPDFiles(File dir, String workspace, int VERBOSE) {
+ String str;
+
+ if (dir.isDirectory()) {
+ dCtr++;
+ String[] subdir = dir.list();
+ if (dCtr >= 10) {
+ if (VERBOSE > 2)
+ System.out.print(".");
+ dCtr = 0;
+ lCtr++;
+ }
+ if (lCtr > 79) {
+ if (VERBOSE > 2)
+ System.out.println(" ");
+ lCtr = 0;
+ dCtr = 0;
+ }
+
+ for (int i = 0; i < subdir.length; i++) {
+ findSPDFiles(new File(dir, subdir[i]), workspace, VERBOSE);
+ }
+ } else {
+ if (dir.toString().toLowerCase().endsWith(".spd")) {
+ str = dir.getPath().replace('\\', '/');
+ workspace = workspace.replace('\\', '/');
+ str = strStrip(str, workspace + "/");
+ spdList.add(str.toString());
+ if (VERBOSE == 2)
+ System.out.println(" " + str);
+ if (VERBOSE > 2)
+ System.out.print("+");
+ lCtr++;
+ }
+ }
+
+ }
+
+ private void findFPDFiles(File dir, String workspace, int VERBOSE) {
+ String str;
+
+ if (dir.isDirectory()) {
+ String[] subdir = dir.list();
+ if (dCtr >= 10) {
+ if (VERBOSE > 2)
+ System.out.print(".");
+ dCtr = 0;
+ lCtr++;
+ }
+ if (lCtr > 79) {
+ if (VERBOSE > 2)
+ System.out.println(" ");
+ lCtr = 0;
+ dCtr = 0;
+ }
+
+ for (int i = 0; i < subdir.length; i++) {
+ findFPDFiles(new File(dir, subdir[i]), workspace, VERBOSE);
+ }
+ } else {
+ if (dir.toString().toLowerCase().endsWith(".fpd")) {
+ str = dir.getPath().replace('\\', '/');
+ workspace = workspace.replace('\\', '/');
+ str = strStrip(str, workspace + "/");
+ fpdList.add(str.toString());
+ if (VERBOSE == 2)
+ System.out.println(" " + str);
+ if (VERBOSE > 2)
+ System.out.print("+");
+ lCtr++;
+ }
+ }
+ }
+
+ private int checkDBForUpdate(String workspace, String dbFileName, int VERBOSE, boolean TEST, boolean QUIET)
+ throws IOException {
+ int SpdFlag = 0;
+ int FpdFlag = 0;
+ String SpdFile = null;
+ String SpdFullFile = null;
+ String FpdFile = null;
+ String FpdFullFile = null;
+
+ String tmpDbFile = dbFileName + ".tmp";
+ String newSpd = null;
+ String newFpd = null;
+
+ FileReader fileReader = new FileReader(dbFileName);
+ BufferedReader reader = new BufferedReader(fileReader);
+
+ FileWriter fileWriter = new FileWriter(tmpDbFile);
+ BufferedWriter writer = new BufferedWriter(fileWriter);
+
+ String line = null;
+ try {
+ while ((line = reader.readLine()) != null) {
+ if (line.indexOf("Added the following") >= 0) {
+ wasModified = true;
+ continue;
+ }
+ //
+ // Process for .spd files
+ //
+ if (line.indexOf("<PackageList") >= 0) {
+ SpdFlag = 1;
+ } else {
+ if (line.indexOf("</PackageList") >= 0) {
+ SpdFlag = 2;
+ }
+ }
+ if (SpdFlag == 1 && line.indexOf("Filename") >= 0) {
+ SpdFile = strStrip(line, "<Filename>");
+ SpdFile = strStrip(SpdFile, "</Filename>");
+ SpdFile = SpdFile.trim();
+ SpdFullFile = workspace + File.separator + SpdFile;
+ if (!(new File(SpdFullFile)).exists()) {
+ if (VERBOSE > 0)
+ System.out.println("WARNING: Removing SPD file: " + SpdFile
+ + "from the DB, as it does not exist!");
+ wasModified = true;
+ continue;
+ }
+ // Don't add files that are already in the database
+ spdList.remove(SpdFile);
+ }
+ if (SpdFlag == 2) {
+ int cflag = 0;
+ for (int i = 0; i < spdList.size(); i++) {
+ newSpd = spdList.get(i);
+ newSpd = newSpd.trim();
+ if (newSpd.length() > 0) {
+ if (cflag == 0) {
+ Calendar c = Calendar.getInstance();
+ if (TEST == false)
+ writer.write(" <!-- Adding the following SPD files " + c.getTime() + " -->\n");
+ }
+ if (VERBOSE > 0)
+ System.out.println(" Adding SPD file: " + newSpd);
+ if (TEST == false)
+ writer.write(" <Filename>" + newSpd + "</Filename>\n");
+ cflag++;
+ wasModified = true;
+ }
+ }
+ SpdFlag++;
+ }
+ //
+ // Process for .fpd files
+ //
+ if (line.indexOf("<PlatformList") >= 0) {
+ FpdFlag = 1;
+ } else {
+ if (line.indexOf("</PlatformList") >= 0) {
+ FpdFlag = 2;
+ }
+ }
+ if (FpdFlag == 1 && line.indexOf("Filename") >= 0) {
+ FpdFile = strStrip(line, "<Filename>");
+ FpdFile = strStrip(FpdFile, "</Filename>");
+ FpdFile = FpdFile.trim();
+ FpdFullFile = workspace + File.separator + FpdFile;
+ if (!(new File(FpdFullFile)).exists()) {
+ if (VERBOSE > 0)
+ System.out.println("WARNING: Removing FPD file: " + FpdFile
+ + " from the DB, as it does not exist!");
+ wasModified = true;
+ continue;
+ }
+ // Don't add files that are already in the database
+ fpdList.remove(FpdFile);
+ }
+ if (FpdFlag == 2) {
+ int cflag = 0;
+ for (int i = 0; i < fpdList.size(); i++) {
+ newFpd = fpdList.get(i);
+ newFpd = newFpd.trim();
+ if (newFpd.length() > 0) {
+ if (cflag == 0) {
+ Calendar c = Calendar.getInstance();
+ if (TEST == false)
+ writer.write(" <!-- Adding the following FPD files " + c.getTime() + " -->\n");
+ }
+ if (VERBOSE > 0)
+ System.out.println(" Adding FPD file: " + newFpd);
+ if (TEST == false)
+ writer.write(" <Filename>" + newFpd + "</Filename>\n");
+ cflag++;
+ wasModified = true;
+ }
+ }
+ FpdFlag++;
+ }
+
+ if (DEBUG > 2) {
+ System.out.println(line);
+ }
+ if (TEST == false) {
+ writer.write(line);
+ writer.newLine();
+ }
+ }
+ reader.close();
+ writer.close();
+
+ } catch (IOException e) {
+ System.out.println("ERROR I/O Exception occured! " + e);
+ System.exit(FAIL);
+ }
+
+ if (wasModified) {
+ if ((VERBOSE > 0) && (QUIET == false))
+ System.out.println("FrameworkDatabase has been UPDATED for this Workspace!\n");
+ if (TEST == false)
+ copyFile(tmpDbFile, dbFileName);
+ } else {
+ if ((VERBOSE > 0) && (QUIET == false))
+ System.out.println("FrameworkDatabase correct for this Workspace!\n");
+ }
+
+ if (TEST == false) {
+ File tmpFile = new File(tmpDbFile);
+ if (tmpFile.exists()) {
+ tmpFile.delete();
+ }
+ }
+
+ return PASS;
+ }
+
+ static String strStrip(String str, String pattern) {
+ int ps = 0;
+ int pe = 0;
+ StringBuffer result = new StringBuffer();
+
+ while ((pe = str.indexOf(pattern, ps)) >= 0) {
+ result.append(str.substring(ps, pe));
+ ps = pe + pattern.length();
+ }
+ result.append(str.substring(ps));
+ return result.toString();
+ }
+
+ private String checkDuplicateStrings(String aString, ArrayList<String> aList) {
+ // This routine checks a string against an array.
+ // If the string is found, it will return an empty string.
+ // If the string is not found, it adds the string to the array, and
+ // returns the string to the caller.
+ for (int lctr = 0; lctr < aList.size(); lctr++) {
+ if (DEBUG > 8)
+ System.out.println("Comparing: \n" + aString.replace(" ", "").replace("\n", "") + "\nTo: \n"
+ + aList.get(lctr).replace(" ", "").replace("\n", "").toString().trim());
+ if (aString.replace(" ", "").replace("\n", "").contains(
+ aList.get(lctr).replace(" ", "").replace("\n", "")
+ .toString().trim())) {
+ if ((DEBUG > 3) || (VERBOSE > 3))
+ System.out.println("Found a duplicate String, skipping!");
+ return "";
+ }
+ }
+ if ((DEBUG > 3) || (VERBOSE > 3))
+ System.out.println("Returning UNIQUE String!\n " + aString);
+ aList.add(aString);
+ return aString;
+ }
+
+ private static class XmlConfig {
+ public static XmlCursor setupXmlCursor(XmlCursor cursor) {
+ String uri = "http://www.TianoCore.org/2006/Edk2.0";
+ cursor.push();
+ cursor.toNextToken();
+ cursor.insertNamespace("", uri);
+ cursor.insertNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
+ cursor.pop();
+ return cursor;
+
+ }
+
+ public static XmlOptions setupXmlOptions() {
+ XmlOptions options = new XmlOptions();
+ options.setCharacterEncoding("UTF-8");
+ options.setSavePrettyPrint();
+ options.setSavePrettyPrintIndent(2);
+ return options;
+ }
+
+ }
+}