001 /* 002 * Jpkg - Java library and tools for operating system package creation. 003 * 004 * Copyright (c) 2007 Three Rings Design, Inc. 005 * All rights reserved. 006 * 007 * Redistribution and use in source and binary forms, with or without 008 * modification, are permitted provided that the following conditions 009 * are met: 010 * 1. Redistributions of source code must retain the above copyright 011 * notice, this list of conditions and the following disclaimer. 012 * 2. Redistributions in binary form must reproduce the above copyright 013 * notice, this list of conditions and the following disclaimer in the 014 * documentation and/or other materials provided with the distribution. 015 * 3. Neither the name of the copyright owner nor the names of contributors 016 * may be used to endorse or promote products derived from this software 017 * without specific prior written permission. 018 * 019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 020 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 021 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 022 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 023 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 024 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 025 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 026 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 027 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 028 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 029 * POSSIBILITY OF SUCH DAMAGE. 030 */ 031 package com.threerings.jpkg.debian; 032 033 import java.io.File; 034 import java.io.IOException; 035 036 import com.threerings.jpkg.PackageBuilder; 037 import com.threerings.jpkg.PackageBuilderException; 038 import com.threerings.jpkg.PackageTarFile; 039 import com.threerings.jpkg.ar.Archive; 040 import com.threerings.jpkg.ar.ArchiveEntry; 041 import com.threerings.jpkg.ar.ArchiveException; 042 import com.threerings.jpkg.ar.ArchiveStringEntry; 043 044 /** 045 * Creates Debian package files. 046 */ 047 public class DebianPackageBuilder 048 implements PackageBuilder 049 { 050 public DebianPackageBuilder (PackageInfo info) 051 { 052 _info = info; 053 } 054 055 // from PackageBuilder 056 public void write (File dest, File destroot) 057 throws PackageBuilderException, IOException 058 { 059 if (dest == null) throw new IllegalArgumentException("The destination cannot be null."); 060 if (destroot == null) throw new IllegalArgumentException("The destroot cannot be null."); 061 062 PackageTarFile dataTar = null; 063 try { 064 // create the temporary data.tar.gz file in the destination location, which we assume 065 // has enough available space to construct both the data.tar.gz and the package. 066 dataTar = new PackageTarFile(dest.getParentFile(), _info.getPermissionsMap()); 067 dataTar.addDirectory(destroot); 068 dataTar.close(); 069 070 // Overwrite any file at the destination location. 071 if (dest.exists()) { 072 if (!dest.delete()) { 073 throw new PackageBuilderException( 074 "Unable to overwrite existing package destination. path=[" + dest.getAbsolutePath() + "]."); 075 } 076 } 077 078 // create the ar(1) archive which is the package itself 079 try { 080 final Archive archive = new Archive(dest); 081 082 // add the standard header to the package 083 final ArchiveEntry entry = new ArchiveStringEntry(DEB_AR_MAGIC_CONTENTS, DEB_AR_MAGIC_FILE); 084 archive.appendEntry(entry); 085 086 // add the control.tar.gz file to the package 087 final ControlFile control = new ControlFile(_info, dataTar); 088 archive.appendEntry(control); 089 090 // add the data.tar.gz file to the package 091 archive.appendEntry(dataTar); 092 093 } catch (final ArchiveException ae) { 094 throw new PackageBuilderException(ae); 095 096 } catch (final ScriptDataTooLargeException sdtle) { 097 throw new PackageBuilderException(sdtle); 098 } 099 100 } finally { 101 dataTar.delete(); 102 } 103 } 104 105 /** Data used for the package magic file. */ 106 private static final String DEB_AR_MAGIC_FILE = "debian-binary"; 107 private static final String DEB_AR_MAGIC_CONTENTS = "2.0\n"; 108 109 /** The meta information used to create this package. */ 110 private final PackageInfo _info; 111 }