+++ /dev/null
-/** @file\r
- Java class FrameworkPkg is used to do package related operations.\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
-package org.tianocore.packaging;\r
-\r
-import java.io.*;\r
-import java.util.Enumeration;\r
-import java.util.LinkedList;\r
-import java.util.List;\r
-import java.util.jar.*;\r
-import org.apache.xmlbeans.*;\r
-\r
-import org.tianocore.PackageListDocument;\r
-\r
-/**\r
- This class deals with package related operations\r
- \r
- @since PackageEditor 1.0\r
-**/\r
-public class FrameworkPkg {\r
-\r
- private String pkg = null;\r
-\r
- private JarFile jf = null;\r
-\r
- ///\r
- /// where the package will be extracted to\r
- /// \r
- private String wkDir = null;\r
-\r
- private String bName = null;\r
-\r
- private String pVer = null;\r
-\r
- private String pGuid = null;\r
-\r
- ///\r
- /// current WORKSPACE location\r
- ///\r
- private String wkSpace = null;\r
-\r
- private File dbFile = null;\r
-\r
- private DbFileContents dfc = null;\r
-\r
- ///\r
- /// relative path of FrameworkDatabase.db file\r
- ///\r
- final static String dbConfigFile = "Tools" + System.getProperty("file.separator") + "Conf"\r
- + System.getProperty("file.separator") + "FrameworkDatabase.db";\r
-\r
-\r
- public FrameworkPkg() {\r
-\r
- }\r
-\r
- public FrameworkPkg(String package_name, String work_space) {\r
- pkg = package_name;\r
- wkSpace = work_space;\r
- }\r
-\r
- /**\r
- install package (*.fdp file) to dir\r
- \r
- @param dir Destination directory\r
- @retval <0> Install successfully\r
- @return int\r
- @throws IOException\r
- @throws XmlException Xml file exception\r
- @throws DirSame One package already installed to dir\r
- @throws BasePkgNotInstalled Some package must be installed first\r
- @throws VerNotEqual At least one package info with same base name but version different\r
- @throws GuidNotEqual At least one package info with same base name and version but guid different\r
- @throws SameAll At least one package info with same base name, version and guid same\r
- **/\r
- public int install(final String dir) throws IOException, XmlException, DirSame, BasePkgNotInstalled, VerNotEqual,\r
- GuidNotEqual, SameAll {\r
- wkDir = dir;\r
- pre_install();\r
- extract(wkDir);\r
- post_install();\r
- return 0;\r
- }\r
-\r
- public int uninstall() {\r
-\r
- return 0;\r
- }\r
-\r
- /**\r
- Check package info. against Frameworkdatabase.db\r
- \r
- @throws IOException\r
- @throws XmlException Xml file exception\r
- @throws DirSame One package already installed to dir\r
- @throws BasePkgNotInstalled Some package must be installed first\r
- @throws VerNotEqual At least one package info with same base name but version different\r
- @throws GuidNotEqual At least one package info with same base name and version but guid different\r
- @throws SameAll At least one package info with same base name, version and guid same\r
- **/\r
- protected void pre_install() throws IOException, XmlException, DirSame, BasePkgNotInstalled, VerNotEqual,\r
- GuidNotEqual, SameAll {\r
-\r
- jf = new JarFile(pkg);\r
-\r
- ManifestContents manFile = new ManifestContents(getManifestInputStream(jf));\r
-\r
- String baseName = manFile.getBaseName();\r
- String pkgVersion = manFile.getVersion();\r
- String pkgGuid = manFile.getGuid();\r
- bName = baseName;\r
- pVer = pkgVersion;\r
- pGuid = pkgGuid;\r
-\r
- if (dbFile == null) {\r
- dbFile = new File(wkSpace + System.getProperty("file.separator") + dbConfigFile);\r
- }\r
- //\r
- // the db file should exist if base packages have been installed\r
- //\r
- if (!dbFile.exists()) {\r
- throw new BasePkgNotInstalled();\r
- }\r
-\r
- if (dfc == null) {\r
- dfc = new DbFileContents(dbFile);\r
- }\r
- if (dfc.checkDir(wkDir) != 0) {\r
- throw new DirSame();\r
- }\r
- \r
- //\r
- // Get database info into lists\r
- //\r
- List<PackageListDocument.PackageList.Package> lpSameBase = new LinkedList<PackageListDocument.PackageList.Package>();\r
- List<PackageListDocument.PackageList.Package> lpSameVersion = new LinkedList<PackageListDocument.PackageList.Package>();\r
- int i = dfc.query(baseName, pkgVersion, pkgGuid, lpSameBase, lpSameVersion);\r
-\r
- //\r
- // throw various kind of exceptions according to query return value.\r
- //\r
- if (i == DbFileContents.VERSION_NOT_EQUAL) {\r
-\r
- jf.close();\r
- throw new VerNotEqual(lpSameBase);\r
- }\r
- if (i == DbFileContents.GUID_NOT_EQUAL) {\r
-\r
- jf.close();\r
- throw new GuidNotEqual(lpSameVersion);\r
- }\r
- if (i == DbFileContents.SAME_ALL) {\r
- jf.close();\r
- throw new SameAll(lpSameVersion);\r
- }\r
-\r
- }\r
-\r
- /**\r
- Add package info into db file.\r
- \r
- @throws IOException\r
- @throws XmlException\r
- **/\r
- protected void post_install() throws IOException, XmlException {\r
-\r
- dfc.addNewPkgInfo(bName, pVer, pGuid, wkDir.substring(wkSpace.length() + 1));\r
-\r
- }\r
-\r
- /**\r
- Extract package to dir\r
- \r
- @param dir Destination directory\r
- @throws DirSame\r
- @throws IOException\r
- **/\r
- private void extract(String dir) throws DirSame, IOException {\r
-\r
- new File(dir).mkdirs();\r
- dir += System.getProperty("file.separator");\r
- try {\r
- for (Enumeration e = jf.entries(); e.hasMoreElements();) {\r
- JarEntry je = (JarEntry) e.nextElement();\r
- \r
- //\r
- // jar entry contains directory only, make these directories\r
- //\r
- if (je.isDirectory()) {\r
- new File(dir + je.getName()).mkdirs();\r
- continue;\r
- }\r
- \r
- //\r
- // jar entry contains relative path and file name, make relative directories\r
- // under destination dir\r
- //\r
- int index = je.getName().lastIndexOf(System.getProperty("file.separator"));\r
- if (index != -1) {\r
- String dirPath = je.getName().substring(0, index);\r
- new File(dir + dirPath).mkdirs();\r
- }\r
- \r
- if (je != null) {\r
- //\r
- // Get an input stream for this entry.\r
- //\r
- InputStream entryStream = jf.getInputStream(je);\r
-\r
- try {\r
- //\r
- // Create the output file (clobbering the file if it exists).\r
- //\r
- FileOutputStream file = new FileOutputStream(dir + je.getName());\r
-\r
- try {\r
-\r
- byte[] buffer = new byte[1024];\r
- int bytesRead;\r
- //\r
- // Read the entry data and write it to the output file.\r
- //\r
- while ((bytesRead = entryStream.read(buffer)) != -1) {\r
- file.write(buffer, 0, bytesRead);\r
- }\r
-\r
- System.out.println(je.getName() + " extracted.");\r
- } finally {\r
- file.close();\r
- }\r
- } finally {\r
- entryStream.close();\r
- }\r
- }\r
-\r
- }\r
-\r
- } finally {\r
- jf.close();\r
-\r
- }\r
-\r
- }\r
-\r
- public String getBName() {\r
- return bName;\r
- }\r
-\r
- public void setBName(String name) {\r
- bName = name;\r
- }\r
-\r
- public File getDbFile() {\r
- return dbFile;\r
- }\r
-\r
- public void setDbFile(File dbFile) {\r
- this.dbFile = dbFile;\r
- }\r
-\r
- public DbFileContents getDfc() {\r
- return dfc;\r
- }\r
-\r
- public void setDfc(DbFileContents dfc) {\r
- this.dfc = dfc;\r
- }\r
-\r
- public String getPGuid() {\r
- return pGuid;\r
- }\r
-\r
- public void setPGuid(String guid) {\r
- pGuid = guid;\r
- }\r
-\r
- public String getPVer() {\r
- return pVer;\r
- }\r
-\r
- public void setPVer(String ver) {\r
- pVer = ver;\r
- }\r
-\r
- public String getWkDir() {\r
- return wkDir;\r
- }\r
-\r
- public void setWkDir(String wkDir) {\r
- this.wkDir = wkDir;\r
- }\r
-\r
- public String getWkSpace() {\r
- return wkSpace;\r
- }\r
-\r
- public void setWkSpace(String wkSpace) {\r
- this.wkSpace = wkSpace;\r
- }\r
-\r
- public JarFile getJf() {\r
- return jf;\r
- }\r
-\r
- public void setJf(JarFile jf) {\r
- this.jf = jf;\r
- }\r
-\r
- public String getPkg() {\r
- return pkg;\r
- }\r
-\r
- public void setPkg(String pkg) {\r
- this.pkg = pkg;\r
- }\r
-\r
- /**\r
- Get the input stream of FDPManifest.xml file from jar entry\r
- \r
- @param jf The Jar file that contains FDPManifest.xml file\r
- @return InputStream\r
- @throws IOException\r
- **/\r
- protected InputStream getManifestInputStream(JarFile jf) throws IOException {\r
- JarEntry je = null;\r
- for (Enumeration e = jf.entries(); e.hasMoreElements();) {\r
- je = (JarEntry) e.nextElement();\r
- if (je.getName().contains("FDPManifest.xml"))\r
- return jf.getInputStream(je);\r
- }\r
-\r
- return null;\r
- }\r
-\r
-}\r
-\r
-\r
-/**\r
- Various Exception classes for what happened when database info and package info\r
- are compared.\r
- \r
- @since PackageEditor 1.0\r
-**/\r
-class DirSame extends Exception {\r
- final static long serialVersionUID = 0;\r
-}\r
-\r
-class BasePkgNotInstalled extends Exception {\r
- final static long serialVersionUID = 0;\r
-}\r
-\r
-class VerNotEqual extends Exception {\r
- final static long serialVersionUID = 0;\r
-\r
- //private String version = null;\r
- List<PackageListDocument.PackageList.Package> lppSameBase = null;\r
-\r
- VerNotEqual(List<PackageListDocument.PackageList.Package> ver) {\r
- lppSameBase = ver;\r
- }\r
-\r
- public List<PackageListDocument.PackageList.Package> getVersion() {\r
- return lppSameBase;\r
- }\r
-}\r
-\r
-class GuidNotEqual extends Exception {\r
- final static long serialVersionUID = 0;\r
-\r
- private List<PackageListDocument.PackageList.Package> lppSameVer = null;\r
-\r
- GuidNotEqual(List<PackageListDocument.PackageList.Package> ver) {\r
- lppSameVer = ver;\r
- }\r
-\r
- public List<PackageListDocument.PackageList.Package> getGuid() {\r
- return lppSameVer;\r
- }\r
-}\r
-\r
-class SameAll extends Exception {\r
- final static long serialVersionUID = 0;\r
-\r
- private List<PackageListDocument.PackageList.Package> version = null;\r
-\r
- SameAll(List<PackageListDocument.PackageList.Package> ver) {\r
- version = ver;\r
- }\r
-\r
- public List<PackageListDocument.PackageList.Package> getVersion() {\r
- return version;\r
- }\r
-}\r