Esempio n. 1
0
        static int Main(string[] args)
        {
            int errlvl = 0;

            try {
                // Process Command-line Arguments
                if (args.Length != 2)
                {
                    Console.WriteLine();
                    Console.Error.WriteLine("Missing or Invalid Parameter.");
                    Usage();
                    errlvl = 1;
                    return(errlvl);
                }

                string jcdFile    = Path.GetFullPath(args[0]);
                string outputPath = Path.GetFullPath(args[1]);

                JCDParserResults pr        = new JCDParserResults();
                string           java_home = Environment.GetEnvironmentVariable("JAVA_HOME");
                if (java_home == null)
                {
                    java_home = JCDParserResults.JDKToJAVA_HOME(Environment.GetEnvironmentVariable("JDK"));
                }
                pr.ParseJCDFile(jcdFile,
                                Environment.GetEnvironmentVariable("CLASSPATH").ToLower(),
                                java_home.ToLower());
                pr.RemoveDuplicateSourceFiles();
                pr.WriteResults(Path.GetFileNameWithoutExtension(jcdFile), outputPath);
            }
            catch (Exception e) {
                errlvl = 1;
                Console.Error.WriteLine("An error occurred in JCDParser.exe");
                Console.Error.WriteLine(e.ToString());
                Usage();
            }

            return(errlvl);
        }
Esempio n. 2
0
        public void ParseJCDFile(string jcdFile, string classpath, string java_home)
        {
            // load file
            XmlDocument doc = new XmlDocument();

            doc.Load(new XmlTextReader(jcdFile));

            // target
            XmlNode targetNode = doc[en.jcd][en.target];

            if (target == null && targetNode != null)
            {
                // only set once in top-level package
                target = ((XmlElement)targetNode).GetAttribute("name");
            }

            // java_home
            XmlNode jdkNode = doc[en.jcd][en.jdk];

            if (jdkNode != null)
            {
                java_home = JCDParserResults.JDKToJAVA_HOME(((XmlElement)jdkNode).GetAttribute("version"));
            }
            XmlNode java_homeNode = doc[en.jcd][en.java_home];

            if (java_homeNode != null)
            {
                java_home = ((XmlElement)java_homeNode).GetAttribute("path");
            }
            java_home = java_home.ToLower();
            // only set once in top-level package
            if (component_java_home == null)
            {
                component_java_home = java_home;
            }

            // classpath
            XmlNode classpathParentNode = doc[en.jcd][en.classpath];

            if (classpathParentNode != null)
            {
                classpath = "";
                XmlNodeList classpathNodes = classpathParentNode.ChildNodes;
                foreach (XmlNode classpathNode in classpathNodes)
                {
                    if (classpathNode.LocalName == en.path)
                    {
                        classpath += ((XmlElement)classpathNode).GetAttribute("value") + ";";
                    }
                }
                classpath = classpath.TrimEnd(new char[] { ';' });
                classpath = Environment.ExpandEnvironmentVariables(classpath);
            }
            classpath = classpath.ToLower();

            // services
            XmlNode servicesParentNode = doc[en.jcd][en.services];

            if (servicesParentNode != null)
            {
                foreach (XmlNode serviceNode in servicesParentNode.ChildNodes)
                {
                    if (serviceNode.LocalName == en.service)
                    {
                        ServiceEntry e                       = new ServiceEntry();
                        XmlNode      taskJdkNode             = serviceNode[en.jdk];
                        XmlNode      taskJava_HomeNode       = serviceNode[en.java_home];
                        XmlNode      taskClasspathParentNode = serviceNode[en.classpath];

                        if (taskJava_HomeNode != null)
                        {
                            e.java_home = ((XmlElement)taskJava_HomeNode).GetAttribute("path");
                        }
                        else if (taskJdkNode != null)
                        {
                            e.java_home = JCDParserResults.JDKToJAVA_HOME(((XmlElement)taskJdkNode).GetAttribute("version"));
                        }
                        else
                        {
                            e.java_home = java_home;
                        }

                        e.classpath = classpath;
                        if (taskClasspathParentNode != null)
                        {
                            XmlNodeList classpathNodes = taskClasspathParentNode.ChildNodes;

                            e.classpath = "";
                            foreach (XmlNode classpathNode in classpathNodes)
                            {
                                if (classpathNode.LocalName == en.path)
                                {
                                    e.classpath += ((XmlElement)classpathNode).GetAttribute("value") + ";";
                                }
                            }
                            e.classpath = e.classpath.TrimEnd(new char[] { ';' });
                            e.classpath = Environment.ExpandEnvironmentVariables(e.classpath);
                        }

                        e.service = ((XmlElement)serviceNode).GetAttribute("name");
                        e.version = ((XmlElement)serviceNode).GetAttribute("version");

                        serviceList.Add(e);
                    }
                }
            }

            // compilation tasks
            XmlNode complistParentNode = doc[en.jcd][en.complist];

            if (complistParentNode != null)
            {
                XmlNodeList complistTaskNodes = complistParentNode.ChildNodes;
                foreach (XmlNode complistTaskNode in complistTaskNodes)
                {
                    if (complistTaskNode.NodeType == XmlNodeType.Comment)
                    {
                        continue;
                    }
                    string taskTool = complistTaskNode.LocalName;

                    XmlNode taskJdkNode   = complistTaskNode[en.jdk];
                    string  taskJava_Home = (taskJdkNode != null) ?
                                            JCDParserResults.JDKToJAVA_HOME(((XmlElement)taskJdkNode).GetAttribute("version")) :
                                            java_home;
                    XmlNode taskJava_HomeNode = complistTaskNode[en.java_home];
                    taskJava_Home = (taskJava_HomeNode != null) ?
                                    ((XmlElement)taskJava_HomeNode).GetAttribute("path") :
                                    taskJava_Home;

                    XmlNode taskClasspathParentNode = complistTaskNode[en.classpath];
                    string  taskClasspath           = classpath;
                    if (taskClasspathParentNode != null)
                    {
                        taskClasspath = "";
                        XmlNodeList classpathNodes = taskClasspathParentNode.ChildNodes;
                        foreach (XmlNode classpathNode in classpathNodes)
                        {
                            if (classpathNode.LocalName == en.path)
                            {
                                taskClasspath += ((XmlElement)classpathNode).GetAttribute("value") + ";";
                            }
                        }
                        taskClasspath = taskClasspath.TrimEnd(new char[] { ';' });
                        taskClasspath = Environment.ExpandEnvironmentVariables(taskClasspath);
                    }
                    Complist.ComplistKey ck       = new Complist.ComplistKey(taskTool, taskJava_Home, taskClasspath);
                    Complist             complist = null;
                    foreach (Complist cl in complists)
                    {
                        if (cl.complistKey.Equals(ck))
                        {
                            complist = cl;
                        }
                    }
                    if (complist == null)
                    {
                        complist = new Complist(ck);
                        complists.Add(complist);
                    }
                    XmlNodeList complistFileNodes = complistTaskNode.ChildNodes;
                    foreach (XmlNode complistFileNode in complistFileNodes)
                    {
                        if (complistFileNode.LocalName != en.file)
                        {
                            continue;
                        }
                        string filename = DepackageFilename(((XmlElement)complistFileNode).GetAttribute("name"));
                        complist.files.Add(filename);
                    }
                }
            }

            // nested packages
            XmlNode nestedPackageParentNode = doc[en.jcd][en.nestedPackages];

            if (nestedPackageParentNode != null)
            {
                XmlNodeList nestedPackageNodes = nestedPackageParentNode.ChildNodes;
                foreach (XmlNode nestedPackageNode in nestedPackageNodes)
                {
                    if (nestedPackageNode.LocalName != en.package)
                    {
                        continue;
                    }
                    string packageDescriptorName = ((XmlElement)nestedPackageNode).GetAttribute("descriptor");
                    //check if the package descriptor is in the same directory as the parent
                    string packageDirectory = Path.Combine(Path.GetPathRoot(jcdFile), Path.GetDirectoryName(jcdFile));
                    string packageFileName  = Path.Combine(packageDirectory, packageDescriptorName);
                    //if not, check in sibling pkg directory
                    if (!File.Exists(packageFileName))
                    {
                        int lastDirectoryPos = packageDirectory.LastIndexOfAny(new char[] { '\\', '/' });
                        if (lastDirectoryPos > -1)
                        {
                            string packageDirectoryParent = packageDirectory.Substring(0, lastDirectoryPos + 1);
                            packageDirectory = Path.Combine(packageDirectoryParent, "pkg");
                            packageFileName  = Path.Combine(packageDirectory, packageDescriptorName);
                        }
                    }
                    if (!File.Exists(packageFileName))
                    {
                        throw new Exception("Package descriptor, " + packageDescriptorName + ", not found");
                    }
                    this.ParseJCDFile(packageFileName, classpath, java_home);
                }
            }

            XmlNode jarIncludesNode = doc[en.jcd][en.jarIncludes];

            if (jarIncludesNode != null)
            {
                // product files
                XmlNode productFilesParentNode = jarIncludesNode[en.productFiles];
                if (productFilesParentNode != null)
                {
                    XmlNodeList productFileNodes = productFilesParentNode.ChildNodes;
                    foreach (XmlNode productFileNode in productFileNodes)
                    {
                        if (productFileNode.LocalName == en.file)
                        {
                            CopyEntry ce       = new CopyEntry();
                            string    filename = DepackageFilename(((XmlElement)productFileNode).GetAttribute("name"));
                            ce.from = "%BuildPath%\\" + Path.GetExtension(filename).TrimStart(new char[] { '.' }) + Path.DirectorySeparatorChar + filename;
                            XmlNode packageNode = productFileNode[en.package];
                            if (packageNode != null)
                            {
                                string packagePath = ((XmlElement)packageNode).GetAttribute("name");
                                ce.to = packagePath.Replace('.', '\\');
                            }
                            copyList.Add(ce);
                        }
                        else if (productFileNode.LocalName == en.manifest)
                        {
                            XmlElement manifestFileNode = (XmlElement)productFileNode[en.file];
                            string     filename         = DepackageFilename(manifestFileNode.GetAttribute("name"));
                            manifest = "%BuildPath%\\" + Path.GetExtension(filename).TrimStart(new char[] { '.' }) + Path.DirectorySeparatorChar + filename;
                        }
                    }
                }

                // library files
                XmlNodeList libraryNodes = jarIncludesNode.ChildNodes;
                foreach (XmlNode libraryNode in libraryNodes)
                {
                    if (libraryNode.LocalName != en.library)
                    {
                        continue;
                    }
                    string      libraryPath = libraryNode[en.path].GetAttribute("value");
                    XmlNodeList fileNodes   = libraryNode.ChildNodes;
                    foreach (XmlNode fileNode in fileNodes)
                    {
                        if (fileNode.LocalName != en.file)
                        {
                            continue;
                        }
                        CopyEntry ce       = new CopyEntry();
                        string    filename = ((XmlElement)fileNode).GetAttribute("name");
                        ce.from = Path.Combine(libraryPath, filename);
                        ce.to   = Path.GetDirectoryName(filename);
                        copyList.Add(ce);
                    }
                }
            }

            // packageSteps
            XmlNode packageStepsParentNode = doc[en.jcd][en.packageSteps];

            if (packageStepsParentNode != null)
            {
                XmlNodeList packageSteps = packageStepsParentNode.ChildNodes;
                foreach (XmlNode packageStep in packageSteps)
                {
                    string packageStepName = ((XmlElement)packageStep).GetAttribute("name");
                    packageStepList.Add(packageStepName);
                }
            }
        }