]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/Tool.java
Restructuring for better separation of Tool packages.
[mirror_edk2.git] / Tools / Java / Source / FrameworkTasks / org / tianocore / framework / tasks / Tool.java
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/Tool.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/Tool.java
new file mode 100644 (file)
index 0000000..fbf69e2
--- /dev/null
@@ -0,0 +1,242 @@
+/** @file\r
+This file is to define nested element which is meant for specifying a tool\r
+\r
+Copyright (c) 2006, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+package org.tianocore.framework.tasks;\r
+\r
+import java.io.DataInputStream;\r
+import java.io.DataOutputStream;\r
+import java.io.File;\r
+import java.io.FileInputStream;\r
+import java.io.FileOutputStream;\r
+import java.io.IOException;\r
+import java.util.ArrayList;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.Random;\r
+\r
+import org.apache.tools.ant.BuildException;\r
+import org.tianocore.common.logger.EdkLog;\r
+\r
+/**\r
+ Class Tool is to define an external tool to be used for genffsfile\r
+ **/\r
+public class Tool implements EfiDefine, Section {\r
+\r
+    private String toolName     = "";\r
+    private ToolArg toolArgList = new ToolArg();\r
+    private Input inputFiles = new Input();\r
+    private Input tempInputFile = new Input();\r
+    private String outputPath;\r
+    private String outputFileName ;\r
+    private static Random ran = new Random(9999); \r
+    private List<Section>  gensectList = new ArrayList<Section>();\r
+    /**\r
+     Call extern tool\r
+\r
+     @param     buffer  The buffer to put the result with alignment\r
+     **/\r
+    public void toBuffer (DataOutputStream buffer){\r
+        ///\r
+        /// call extern tool\r
+        ///\r
+        try {\r
+            executeTool ();\r
+        } catch (Exception e) {\r
+            throw new BuildException("Call to executeTool failed!\n" + e.getMessage());\r
+        }\r
+\r
+        ///\r
+        /// check if file exist\r
+        ///\r
+        File outputFile = new File (this.outputFileName);\r
+        if (!outputFile.exists()) {\r
+            throw new BuildException("The file " + outputFile.getPath() + " does not exist!\n");\r
+        }\r
+\r
+        ///\r
+        /// Read output file and write it's cotains to buffer\r
+        ///\r
+        FileInputStream fs = null;\r
+        DataInputStream in = null;\r
+        try {\r
+            fs  = new FileInputStream (outputFile);\r
+            in  = new DataInputStream (fs);\r
+\r
+\r
+            int fileLen = (int)outputFile.length();\r
+            byte[] data  = new byte[fileLen];\r
+            in.read(data);\r
+            buffer.write(data, 0, fileLen);\r
+\r
+            ///\r
+            /// 4 byte alignment\r
+            ///\r
+            while ((fileLen & 0x03) != 0) {\r
+                fileLen++;\r
+                buffer.writeByte(0);\r
+            }\r
+        } catch (Exception e) {\r
+            EdkLog.log(e.getMessage());\r
+            throw new BuildException("Tool call, toBuffer failed!\n");\r
+        } finally {\r
+            try {\r
+                if (in != null) {\r
+                    in.close();\r
+                }\r
+                if (fs != null) {\r
+                    fs.close();\r
+                }\r
+                outputFile.delete(); \r
+            } catch (Exception e) {\r
+                EdkLog.log("WARNING: Cannot close " + outputFile.getPath());\r
+            }\r
+        }\r
+    }\r
+\r
+    ///\r
+    /// execute external tool for genffsfile\r
+    ///\r
+    private void executeTool () {\r
+        String command   = "";\r
+        String argument  = "";\r
+        command          = toolName;\r
+        \r
+        //\r
+        //  Get each section which under the compress {};\r
+        //  And add it is contains to File;\r
+        //\r
+        Section sect;\r
+        try{\r
+            Iterator SectionIter = this.gensectList.iterator();\r
+            while (SectionIter.hasNext()){\r
+                sect = (Section)SectionIter.next();\r
+                //\r
+                // Parse <genSection> element\r
+                //\r
+                File outputFile = File.createTempFile("temp", "sec1", new File(outputPath));\r
+                FileOutputStream bo = new FileOutputStream(outputFile);\r
+                DataOutputStream Do = new DataOutputStream (bo);\r
+                //\r
+                //  Call each section class's toBuffer function.\r
+                //\r
+                try {\r
+                    sect.toBuffer(Do);\r
+                }\r
+                catch (BuildException e) {\r
+                    EdkLog.log(e.getMessage());\r
+                    throw new BuildException ("GenSection failed at Tool!");\r
+                } finally {\r
+                    if (Do != null){\r
+                        Do.close();    \r
+                    }\r
+                    \r
+                } \r
+                this.tempInputFile.insFile(outputFile.getPath());\r
+            }        \r
+        } catch (IOException e){\r
+            throw new BuildException ("Gensection failed at tool!");\r
+        } \r
+\r
+        try {\r
+            this.outputFileName = "Temp" + ran.nextInt();\r
+            argument   = toolArgList + inputFiles.toStringWithSinglepPrefix(" -i ") \r
+                         + tempInputFile.toString(" ")+ " -o " + outputFileName;\r
+            EdkLog.log(this, EdkLog.EDK_VERBOSE, command + " " + argument);\r
+            ///\r
+            /// execute command line\r
+            ///\r
+            Process process = Runtime.getRuntime().exec(command + " " + argument);\r
+            process.waitFor();\r
+            Iterator tempFile = tempInputFile.getNameList().iterator();\r
+            while (tempFile.hasNext()){\r
+                File file = new File((String)tempFile.next());\r
+                if (file.exists()) {\r
+                    file.delete();\r
+                }\r
+            }\r
+        } catch (Exception e) {\r            EdkLog.log(e.getMessage());\r
+            throw new BuildException("Execution of externalTool task failed!\n");\r
+        }\r
+    }\r
+\r
+    /**\r
+     Add method of ANT task/datatype for nested ToolArg type of element\r
+\r
+     @param     toolArg     The ToolArg object containing arguments for the tool\r
+     **/\r
+    public void addConfiguredToolArg (ToolArg toolArg) {\r
+        toolArgList.insert(toolArg);\r
+    }\r
+\r
+    /**\r
+     Get method of ANT task/datatype for attribute "OutputPath"\r
+\r
+     @returns   The name of output path\r
+     **/\r
+    public String getOutputPath() {\r
+        return outputPath;\r
+    }\r
+\r
+    /**\r
+     Set method of ANT task/datatype for attribute "OutputPath"\r
+\r
+     @param     outputPath  The name of output path\r
+     **/\r
+    public void setOutputPath(String outPutPath) {\r
+        this.outputPath = outPutPath;\r
+    }\r
+\r
+    /**\r
+     Get method of ANT task/datatype for attribute "ToolName"\r
+\r
+     @returns   The name of the tool.\r
+     **/\r
+    public String getToolName() {\r
+        return toolName;\r
+    }\r
+\r
+    /**\r
+     Set method of ANT task/datatype for attribute "ToolName"\r
+\r
+     @param     toolName    The name of the tool\r
+     **/\r
+    public void setToolName(String toolName) {\r
+        this.toolName = toolName;\r
+    }\r
+\r
+    /**\r
+     Add method of ANT task/datatype for nested Input type of element\r
+\r
+     @param     file    The Input objec which represents a file\r
+     **/\r
+    public void addConfiguredInput(Input file) {\r
+        inputFiles.insert(file);\r
+    }\r
+    \r
+//    /**\r
+//      addTool\r
+//      \r
+//      This function is to add instance of Tool to list.\r
+//      \r
+//      @param tool             instance of Tool.\r
+//    **/\r
+//    public void addTool(Tool tool){\r
+//        this.toolList.add(tool);\r
+//    }\r
+    \r
+    public void addGenSection(GenSectionTask genSect){\r
+        this.gensectList.add(genSect);\r
+    }    \r
+}\r
+\r
+\r