⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rpmpackagegenerator.java

📁 JDesktop Integration Components (JDIC)
💻 JAVA
字号:
/* * Copyright 2003 Contributors. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * *   - Redistributions of source code must retain the above copyright notice, *     this list of conditions and the following disclaimer. *   - Redistributions in binary form must reproduce the above copyright *     notice, this list of conditions and the following disclaimer in the *     documentation and/or other materials provided with the distribution. *   - The names of its contributors may not be used to endorse or promote products *     derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Contributor(s): * */package org.jdesktop.jdic.packager.impl;import java.io.IOException;import java.io.File;import java.io.PrintWriter;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileWriter;import java.io.InputStreamReader;/** * Concrete implementation of interface PackageGenerator for rpm packages  * generating on Linux. * <pre> * The steps to create installable packages are briefly as below: *   1. Set macros _topdir to the dir whitch general user has write permissions. *   2. Create spec file in _topdir/SPECS to define the process of building rpm package. *   3. launch rpmbuild -bb <spec> to actually build the rpm package, the target package * would be put at _topdir/RPMS/i386 * </pre> */public class RpmPackageGenerator implements PackageGenerator {    private String homePath;    private String topPath;    private String buildPath;    private String rpmsPath;    private String specsPath;     public RpmPackageGenerator() {        homePath = System.getProperty("user.home");        topPath = homePath + "/.rpm/";        buildPath = homePath + "/.rpm/BUILD/";        rpmsPath = homePath + "/.rpm/RPMS/";        specsPath = homePath + "/.rpm/SPECS/";    }        /*     * Generates the package according to the generated .spec file.     */    public void generatePackage(JnlpPackageInfo pkgInfo) throws IOException {        File spec = null;        BufferedReader in = null;        String[] cmdArray = new String[3];        try {            setTopdir(pkgInfo);                    spec = createSpec(pkgInfo);            String rpmVersion = getRpmVersion();            if (rpmVersion != null && rpmVersion.compareToIgnoreCase("4.0") >= 0)                 cmdArray[0] = "rpmbuild";            else                cmdArray[0] = "rpm";            cmdArray[1] = "-bb";            cmdArray[2] = spec.getAbsolutePath();            Process p = Runtime.getRuntime().exec(cmdArray);             in = new BufferedReader(                                    new InputStreamReader(p.getErrorStream()));            String line;            while((line = in.readLine()) != null) {                System.out.println(line);            }        } finally {            if(in != null)                 in.close();            /* delete the .rpmmacros file we created in the home directory */                        File macros = new File(homePath + "/.rpmmacros");            if (macros.exists()) {                if (!macros.delete())                    System.out.println("Cannot delete ~/.rpmmacros");            }        }                   }    private String getRpmVersion() throws IOException {        String[] cmdArray = {"rpm", "--version"};        BufferedReader in = null;        try {            Process p = Runtime.getRuntime().exec(cmdArray);            in = new BufferedReader(                                    new InputStreamReader(p.getInputStream()));            String line = in.readLine();            if (line != null) {                line = line.trim();                return line.substring(line.lastIndexOf(" ")).trim();            }            else                return null;        } finally {            if(in != null)                 in.close();        }    }        private File createSpec(JnlpPackageInfo pkgInfo) throws IOException {        int i = 0;		PrintWriter pw = null;        String appName = pkgInfo.getPackageName();        String dest = pkgInfo.getOutputDirPath();        	if (dest == null) {            dest = System.getProperty("user.dir");            File destDir = new File(dest);            if (!destDir.canWrite())                 throw new IOException("Cannot write to the current dir, please specify the PackagePath property");        }/*      String installationPath = pkgInfo.getUniqueTmpDirPath() + "/"; */        String installationPath = "/tmp/.jnlp/" + appName + "/";        String resourcePath = pkgInfo.getResourceDirPath() + "/";        String description = pkgInfo.getLocalizedJnlpInfo(JnlpConstants.LOCALES[0], JnlpConstants.JNLP_FIELD_DESCRIPTION);        String release = pkgInfo.getRelease();        String version = pkgInfo.getVersion();        String license = "NONE";        String licensePath = pkgInfo.getLicenseDirPath();        boolean hasLicense = false;        if (licensePath != null) {        	hasLicense = true;        	license = "License files are located at /usr/share/doc/packages/" + appName + "/License";        }        String group = "System Environment/Base";        boolean shortcut = pkgInfo.getShortcutEnabled();        boolean association = pkgInfo.getAssociationEnabled();        boolean result = false;	boolean systemCacheEnabled = pkgInfo.getSystemCacheEnabled();	        try {            /* create spec file in the SPECS directory of topdir */            File spec = new File(specsPath + appName + ".spec");            pw = new PrintWriter(new BufferedWriter(new FileWriter(spec)));            /* create the header of the spec file */            String input = new String();            input  = "Summary: " + description + "\n";	    for(i=1; i<10; i++) {	        if((description = pkgInfo.getLocalizedJnlpInfo(JnlpConstants.LOCALES[i], JnlpConstants.JNLP_FIELD_DESCRIPTION)) != null) {		    input += "Summary(" + JnlpConstants.LOCALES[i] + "): " + description + "\n";		}	    }             input += "name: " + appName + "\n";            input += "Release: " + release + "\n";            input += "Version: " + version + "\n";            input += "License: " + license + "\n";            input += "Group: " + group + "\n";            input += "BuildRoot: " + buildPath + "\n";            input += "\n";            pw.println(input);            /* create description */	    description = pkgInfo.getLocalizedJnlpInfo(JnlpConstants.LOCALES[0], JnlpConstants.JNLP_FIELD_DESCRIPTION);	    input = "%description\n";            input += description + "\n";            input += "\n";	    for(i=1; i<10; i++) {	        if((description = pkgInfo.getLocalizedJnlpInfo(JnlpConstants.LOCALES[i], JnlpConstants.JNLP_FIELD_DESCRIPTION)) != null) {		    input += "%description -l " + JnlpConstants.LOCALES[i] + "\n";		    input += description + "\n";		}	    } 	    pw.println(input);        /* copy files to install path in BuildRoot */        try {	    FileOperUtility.copyLocalFile(pkgInfo.getResourceDirPath(), buildPath + installationPath);	    if (hasLicense) 	    	FileOperUtility.copyLocalFile(licensePath, buildPath + File.separator + "License");	} catch (IOException ioE) {            throw new IOException("Cannot copy resource files to BuildRoot: " + ioE.getMessage());	}	     	    /* create pre install script */    input = "%pre\n";	String[] checkScript;	checkScript = JnlpUtility.javawsCheckScript();	for(i=0; i<checkScript.length; i++) {	    input += checkScript[i] + "\n";	}	input += "echo preinstall finished\n";	pw.println(input);			/* create post install script */			input = "%post\n";			input += "JNLP_ASSOCIATION=`grep '^[^#]*application/x-java-jnlp-file' /etc/mailcap`\n";			input += "JAVAWS_PATH=`echo $JNLP_ASSOCIATION | awk -F\\; '{print $2}' | awk '{print $1}'`\n";			input += "echo JAVAWS_PATH: $JAVAWS_PATH\n";			input += "$JAVAWS_PATH ";			if (systemCacheEnabled) 			    input += "-system ";			input += "-silent -import ";			if (shortcut)				input += "-shortcut ";			if (association)				input += "-association ";			input += "-codebase "				+ "file://"				+ installationPath				+ " "				+ installationPath				+ "/"				+ pkgInfo.getJnlpFileName()				+ "\n";			input += "\n";			pw.println(input);			/* create pre uninstall script */		    input = "%preun\n";		    for(i=0; i<checkScript.length; i++) {                input += checkScript[i] + "\n";	        }			pw.println(input);			/* create postuninstall script */			input = "%postun\n";			input += "JNLP_ASSOCIATION=`grep '^[^#]*application/x-java-jnlp-file' /etc/mailcap`\n";			input += "JAVAWS_PATH=`echo $JNLP_ASSOCIATION | awk -F\\; '{print $2}' | awk '{print $1}'`\n";			input += "\n";			input += "$JAVAWS_PATH ";			if (systemCacheEnabled) 			    input += "-system ";			input += "-silent -uninstall "			      + pkgInfo.getJnlpFileHref()			      + "\n";			input += "\n";			pw.println(input);			/* create clean script */			input = "%clean\n";			input += "mv " + "`find " + rpmsPath + " -name \"*.rpm\"` " + dest + "\n";			input += "cd " + topPath + "\n";			input += "cd ..\n";			input += "rm -rf " + topPath + "\n";			input += "\n";			pw.println(input);			/* create the files list */			input = "%files\n";			input += installationPath + "\n";			if (hasLicense)			    input += "%doc License\n";			pw.println(input);			pw.close();			return spec;		} finally {            if (pw != null)			    pw.close();	    }    }        private void setTopdir(JnlpPackageInfo pkgInfo) throws IOException {        PrintWriter pw = null;        try {            boolean result = false;            /* create topdir in users home directory */             File buildDir = new File(buildPath);            result = buildDir.mkdirs();            if(result == false) {                result = buildDir.exists();                if(result == false)                    throw new IOException("Cannot create BUILD dir in $HOME directory");            }            File installDir = new File(buildPath + pkgInfo.getUniqueTmpDirPath() + "/");            result = installDir.mkdirs();            if(result == false) {                result = installDir.exists();                if(result == false)                    throw new IOException("Cannot create install dir in BuildRoot");            }            File rpmsDir = new File(rpmsPath);            result = rpmsDir.mkdirs();            if(result == false) {                result = rpmsDir.exists();                if(result == false)                    throw new IOException("Cannot create RPMS dir in $HOME directory");            }            File specsDir = new File(specsPath);            result = specsDir.mkdirs();            if(result == false) {                result = specsDir.exists();                if(result == false)                    throw new IOException("Cannot create SPECS dir in $HOME directory");            }            /* modify the .rpmmacros to specify _topdir macros */            pw = new PrintWriter(                                 new BufferedWriter(new FileWriter(homePath + "/.rpmmacros")));            pw.println("%_topdir " + topPath);            pw.close();        } finally {            if(pw != null)                pw.close();        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -