refactored and bz2 support added
authorClaus Gittinger <cg@exept.de>
Tue, 20 Jan 2004 15:21:33 +0100
changeset 1392 e5290b66715f
parent 1391 530a5924e319
child 1393 bb7048aaf86a
refactored and bz2 support added
Archiver.st
--- a/Archiver.st	Fri Jan 16 15:39:53 2004 +0100
+++ b/Archiver.st	Tue Jan 20 15:21:33 2004 +0100
@@ -22,7 +22,28 @@
 	privateIn:Archiver
 !
 
-Archiver subclass:#GZipArchive
+Archiver subclass:#CompressedFile
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:Archiver
+!
+
+Archiver::CompressedFile subclass:#BZ2Compressed
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:Archiver
+!
+
+Archiver subclass:#CompressedTarArchive
+	instanceVariableNames:'tarArchiver tarFile'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:Archiver
+!
+
+Archiver::CompressedFile subclass:#GZipCompressed
 	instanceVariableNames:''
 	classVariableNames:''
 	poolDictionaries:''
@@ -43,8 +64,15 @@
 	privateIn:Archiver
 !
 
-Archiver subclass:#TarGZipArchive
-	instanceVariableNames:'tarArchiver tarFile'
+Archiver::CompressedTarArchive subclass:#TarBZ2Archive
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:Archiver
+!
+
+Archiver::CompressedTarArchive subclass:#TarGZipArchive
+	instanceVariableNames:''
 	classVariableNames:''
 	poolDictionaries:''
 	privateIn:Archiver
@@ -61,25 +89,58 @@
 !Archiver class methodsFor:'instance creation'!
 
 classForMimeType:aMimeType
+    ^ self classForMimeType:aMimeType fileName:nil
+
+    "
+     self classForMimeType:'application/x-tar'    
+     self classForMimeType:'application/x-foo'    
+     self classForMimeType:'application/x-squeak-archive'   
+     self classForMimeType:'application/java-archive'   
+     'foo.sar' asFilename mimeTypeFromName               
+     'foo.jar' asFilename mimeTypeFromName               
+     'foo.a' asFilename mimeTypeFromName               
+    "
+!
+
+classForMimeType:aMimeType fileName:aFileNameOrNil
     |className|
 
     aMimeType isNil ifTrue:[^ nil].
 
     className := (
             #(
-                ('application/x-tar-compressed'      TarGZipArchive     )
-                ('application/x-tar'                 TarArchive         )
-                ('application/x-gzip-compressed'     GZipArchive        )
-                ('application/x-zip-compressed'      ZipArchive         )
-                ('application/x-squeak-archive'      ZipArchive         )
-                ('application/java-archive'          ZipArchive         )
+                ('application/x-tar-compressed'         CompressedTarArchive    )  "/ abstract - see below
+                ('application/x-tar-gzip-compressed'    TarGZipArchive      ) 
+                ('application/x-tar-bzip2-compressed'   TarBZ2Archive       ) 
+                ('application/x-tar'                    TarArchive          )
+                ('application/x-gzip-compressed'        GZipCompressed      )
+                ('application/x-zip-compressed'         ZipArchive          )
+                ('application/x-bzip2-compressed'       BZ2Compressed       )
+                ('application/x-squeak-archive'         ZipArchive          )
+                ('application/java-archive'             ZipArchive          )
 
-                ('application/x-ar-archive'          ArArchive          )
-                ('application/x-ar-library'          ArArchive          )
-                ('application/library'               ArArchive          )
+                ('application/x-ar-archive'             ArArchive           )
+                ('application/x-ar-library'             ArArchive           )
+                ('application/library'                  ArArchive           )
+
+"/                ('application/x-rpm'                    RPMArchive          )
+"/                ('application/x-rpm-archive'            RPMArchive          )
+"/                ('application/x-redhat packet manager'  RPMArchive          )
             ) detect:[:entry | entry first = aMimeType] ifNone:#(nil nil)
         ) last.
     className isNil ifTrue:[^ nil].
+
+    className = CompressedTarArchive ifTrue:[
+        aFileNameOrNil isNil ifTrue:[
+            className := #TarGZipArchive
+        ] ifFalse:[
+            aFileNameOrNil suffix = 'bz2' ifTrue:[
+                className := #TarBZ2Archive
+            ] ifFalse:[
+                className := #TarGZipArchive
+            ]
+        ].
+    ].
     ^ self privateClassesAt:className.
 
     "
@@ -94,10 +155,11 @@
 !
 
 newFor:aFilename
-    |mimeType archiverClass|
+    |fn mimeType archiverClass|
 
-    mimeType := aFilename asFilename mimeTypeFromName.
-    archiverClass := self classForMimeType:mimeType.
+    fn := aFilename asFilename.
+    mimeType := fn mimeTypeFromName.
+    archiverClass := self classForMimeType:mimeType fileName:fn.
     archiverClass isNil ifTrue:[^ nil].
     ^ archiverClass with:aFilename
 !
@@ -119,8 +181,7 @@
 !
 
 gzipArchive
-
-    ^ GZipArchive
+    ^ GZipCompressed
 !
 
 tarArchive
@@ -577,43 +638,56 @@
     ^ item
 ! !
 
-!Archiver::GZipArchive class methodsFor:'command strings'!
+!Archiver::CompressedFile class methodsFor:'command strings'!
 
-gunzipCommand
-    ^ 'gunzip'
+compressCommand
+    self subclassResponsibility
 !
 
-gzipCommand
-    ^ 'gzip'
+uncompressCommand
+    self subclassResponsibility
 ! !
 
-!Archiver::GZipArchive class methodsFor:'queries'!
+!Archiver::CompressedFile class methodsFor:'queries'!
 
 canViewFile
 
     ^ true
-!
-
-hasTitleLine
-
-    ^ true
 ! !
 
-!Archiver::GZipArchive methodsFor:'actions'!
+!Archiver::CompressedFile methodsFor:'actions'!
+
+compressFile:aFile to:newFile
+    | cmd directory|
+
+    directory := newFile directory.
+    (directory exists) ifFalse:[
+        DialogBox warn:'cannot compress to non-existing directory ', directory asString.
+    ].
+    (directory isDirectory) ifFalse:[
+        DialogBox warn:'cannot compress to non-directory ', directory asString.
+    ].
+
+    cmd := self getCommandToCompress:aFile asNew:newFile.
+    self executeCommand:cmd directory:directory.
+    newFile exists ifTrue:[
+        self fileName:newFile.
+    ].
+!
 
 extractFiles:aColOfFilesOrNil to:aDirectory
-    self unzipTo:aDirectory
+    self uncompressTo:aDirectory
 !
 
-unzipTo:aDirectory
+uncompressTo:aDirectory
     | cmd file newFile|
 
-    (aDirectory exists not) ifTrue:[
-        DialogBox warn:'cant unzip to not existing directory ', aDirectory asString.
+    (aDirectory exists) ifFalse:[
+        DialogBox warn:'cannot uncompress to non-existing directory ', aDirectory asString.
         ^ self
     ].
-    (aDirectory isDirectory not) ifTrue:[
-        DialogBox warn:'cant unzip to file ', aDirectory asString.
+    (aDirectory isDirectory) ifFalse:[
+        DialogBox warn:'cannot uncompress to file ', aDirectory asString.
         ^ self
     ].
     file := newFile := self fileName.
@@ -621,29 +695,191 @@
         newFile := aDirectory construct:(file baseName).
         file copyTo:newFile.
     ].
-    cmd := self getCommandToGunzip:newFile.
+    cmd := self getCommandToUncompress:newFile.
     self executeCommand:cmd directory:aDirectory. 
+! !
+
+!Archiver::CompressedFile methodsFor:'actions private'!
+
+synchronize
+    |gzipArchiver|
+
+    gzipArchiver := Archiver::BZ2Compressed with:nil.
+    gzipArchiver compressFile:(tarArchiver fileName) to:(self fileName).
+! !
+
+!Archiver::CompressedFile methodsFor:'columns'!
+
+columns
+    self subclassResponsibility
+!
+
+isValidOutputLine:line
+    ^ line endsWith:self fileName withoutSuffix baseName.
+! !
+
+!Archiver::CompressedFile methodsFor:'command strings'!
+
+getCommandToCompress:aFile asNew:newFile
+    ^ '%1 -c %2 > %3' 
+        bindWith:self class compressCommand
+        with:aFile asString 
+        with:newFile asString
+!
+
+getCommandToListFiles:dummyArg
+    ^ 'gzip -l "' , self fileName baseName , '"'
+!
+
+getCommandToUncompress:aFileName 
+    ^ '%1 %2' 
+        bindWith:self class uncompressCommand
+        with:aFileName baseName
+! !
+
+!Archiver::BZ2Compressed class methodsFor:'command strings'!
+
+compressCommand
+    ^ 'bzip2'
+!
+
+uncompressCommand
+    ^ 'bunzip2'
+! !
+
+!Archiver::BZ2Compressed methodsFor:'columns'!
+
+columns
+    ^ #(      
+         #(#fileName        1)
+    ) 
+!
+
+isValidOutputLine:line
+    ^ true
+! !
+
+!Archiver::BZ2Compressed methodsFor:'command strings'!
+
+getCommandToListFiles:dummyArg
+    ^ 'echo ' , self fileName withoutSuffix baseName
+"/    ^ 'bzip2 -t -v "' , self fileName baseName , '"'
+! !
+
+!Archiver::CompressedTarArchive class methodsFor:'queries'!
+
+canAddFiles
+    ^ Archiver tarArchive canAddFiles
+!
+
+canRemoveFiles
+    ^ Archiver tarArchive canRemoveFiles
+!
+
+canViewFile
+    ^ Archiver tarArchive canViewFile
 !
 
-zipFile:aFile to:newFile
-    | cmd directory|
+compressorClass
+    self subclassResponsibility
+! !
+
+!Archiver::CompressedTarArchive methodsFor:'accessing'!
+
+fileName:aFile
+    |tempDir file compressor suffix tarFilename|
 
-    directory := newFile directory.
-    (directory exists) ifFalse:[
-        DialogBox warn:'cannot gzip to non-existing directory ', directory asString.
+    super fileName:aFile.
+    " unzip file in tempDirectory and do all the things with tar file "
+    tempDir := self temporaryDirectory.
+    compressor := (self class compressorClass) with:(self fileName).
+    compressor uncompressTo:tempDir.
+    suffix := self fileName suffix.
+    file := self fileName withoutSuffix.
+    tarFilename := file baseName.
+    file suffix ~= 'tar' ifTrue:[
+        tarFilename := tarFilename , '.tar'
     ].
-    (directory isDirectory) ifFalse:[
-        DialogBox warn:'cannot gzip to non-directory ', directory asString.
-    ].
-
-    cmd := self getCommandToGZip:aFile asNew:newFile.
-    self executeCommand:cmd directory:directory.
-    newFile exists ifTrue:[
-        self fileName:newFile.
-    ].
+    tarFile := self temporaryDirectory construct:tarFilename.
+    tarArchiver := Archiver::TarArchive with:tarFile.
 ! !
 
-!Archiver::GZipArchive methodsFor:'columns'!
+!Archiver::CompressedTarArchive methodsFor:'actions'!
+
+addFilesToArchive:colOfFiles
+    self setCommandOptions.
+    tarArchiver addFilesToArchive:colOfFiles.
+    "/ synchronize the tar archive under temporary file with archiv file position
+    self synchronize.
+!
+
+extractFiles:aColOfFiles to:aDirectory
+    self setCommandOptions.
+    tarArchiver extractFiles:aColOfFiles to:aDirectory.
+!
+
+extractFiles:aColOfFiles withoutDirectoryTo:aDirectory
+    self setCommandOptions.
+    tarArchiver extractFiles:aColOfFiles withoutDirectoryTo:aDirectory.
+!
+
+listFiles:aColOfFiles
+    self setCommandOptions.
+    tarArchiver listFiles:aColOfFiles.
+!
+
+removeFilesFromArchive:aColOfFiles
+    self setCommandOptions.
+    tarArchiver removeFilesFromArchive:aColOfFiles.
+    self synchronize.
+! !
+
+!Archiver::CompressedTarArchive methodsFor:'actions private'!
+
+setCommandOptions
+    tarArchiver outStream:(self outStream).
+    tarArchiver errorStream:(self errorStream).
+    tarArchiver synchron:(self synchron).
+!
+
+synchronize
+    self subclassResponsibility
+! !
+
+!Archiver::CompressedTarArchive methodsFor:'columns'!
+
+columns
+    ^ tarArchiver columns
+!
+
+isValidOutputLine:line
+    ^ tarArchiver isValidOutputLine:line
+! !
+
+!Archiver::CompressedTarArchive methodsFor:'initialization & release'!
+
+release
+    super release.
+    tarArchiver release.
+! !
+
+!Archiver::GZipCompressed class methodsFor:'command strings'!
+
+compressCommand
+    ^ 'gzip'
+!
+
+uncompressCommand
+    ^ 'gunzip'
+! !
+
+!Archiver::GZipCompressed class methodsFor:'queries'!
+
+hasTitleLine
+    ^ true
+! !
+
+!Archiver::GZipCompressed methodsFor:'columns'!
 
 columns
 
@@ -663,20 +899,7 @@
     ^ line endsWith:self fileName withoutSuffix baseName.
 ! !
 
-!Archiver::GZipArchive methodsFor:'command strings'!
-
-getCommandToGZip:aFile asNew:newFile
-    ^ '%1 -c %2 > %3' 
-        bindWith:self class gzipCommand
-        with:aFile asString 
-        with:newFile asString
-!
-
-getCommandToGunzip:aFileName 
-    ^ '%1 %2' 
-        bindWith:self class gunzipCommand
-        with:aFileName baseName
-!
+!Archiver::GZipCompressed methodsFor:'command strings'!
 
 getCommandToListFiles:dummyArg
     ^ 'gzip -l "' , self fileName baseName , '"'
@@ -864,6 +1087,36 @@
     ^ stream contents
 ! !
 
+!Archiver::TarBZ2Archive class methodsFor:'queries'!
+
+canAddFiles
+
+    ^ Archiver tarArchive canAddFiles
+!
+
+canRemoveFiles
+
+    ^ Archiver tarArchive canRemoveFiles
+!
+
+canViewFile
+
+    ^ Archiver tarArchive canViewFile
+!
+
+compressorClass
+    ^ Archiver::BZ2Compressed
+! !
+
+!Archiver::TarBZ2Archive methodsFor:'actions private'!
+
+synchronize
+    |gzipArchiver|
+
+    gzipArchiver := Archiver::BZ2Compressed with:nil.
+    gzipArchiver compressFile:(tarArchiver fileName) to:(self fileName).
+! !
+
 !Archiver::TarGZipArchive class methodsFor:'queries'!
 
 canAddFiles
@@ -879,96 +1132,19 @@
 canViewFile
 
     ^ Archiver tarArchive canViewFile
-! !
-
-!Archiver::TarGZipArchive methodsFor:'accessing'!
-
-fileName:aFile
-
-    | tempDir file gzipArchiver suffix|
-
-    super fileName:aFile.
-    " unzip file in tempDirectory and do all the things with tar file "
-    tempDir := self temporaryDirectory.
-    gzipArchiver := Archiver::GZipArchive with:(self fileName).
-    gzipArchiver unzipTo:tempDir.
-    suffix := self fileName suffix.
-    file := self fileName withoutSuffix.
-    file := file baseName.
-    suffix = 'tgz' ifTrue:[
-        file := file , '.tar'
-    ].
-    tarFile := self temporaryDirectory construct:file.
-    tarArchiver := Archiver::TarArchive with:tarFile.
-! !
-
-!Archiver::TarGZipArchive methodsFor:'actions'!
-
-addFilesToArchive:colOfFiles
-
-    self setCommandOptions.
-    tarArchiver addFilesToArchive:colOfFiles.
-    "/ synchronize the tar archive under temporary file with archiv file position
-    self synchronize.
 !
 
-extractFiles:aColOfFiles to:aDirectory
-
-    self setCommandOptions.
-    tarArchiver extractFiles:aColOfFiles to:aDirectory.
-!
-
-extractFiles:aColOfFiles withoutDirectoryTo:aDirectory
-
-    self setCommandOptions.
-    tarArchiver extractFiles:aColOfFiles withoutDirectoryTo:aDirectory.
-!
-
-listFiles:aColOfFiles
-    self setCommandOptions.
-    tarArchiver listFiles:aColOfFiles.
-!
-
-removeFilesFromArchive:aColOfFiles
-
-    self setCommandOptions.
-    tarArchiver removeFilesFromArchive:aColOfFiles.
-    self synchronize.
+compressorClass
+    ^ Archiver::GZipCompressed
 ! !
 
 !Archiver::TarGZipArchive methodsFor:'actions private'!
 
-setCommandOptions
-
-    tarArchiver outStream:(self outStream).
-    tarArchiver errorStream:(self errorStream).
-    tarArchiver synchron:(self synchron).
-!
-
 synchronize
-
     |gzipArchiver|
 
-    gzipArchiver := Archiver::GZipArchive with:nil.
-    gzipArchiver zipFile:(tarArchiver fileName) to:(self fileName).
-! !
-
-!Archiver::TarGZipArchive methodsFor:'columns'!
-
-columns
-    ^ tarArchiver columns
-!
-
-isValidOutputLine:line
-    ^ tarArchiver isValidOutputLine:line
-! !
-
-!Archiver::TarGZipArchive methodsFor:'initialization & release'!
-
-release
-
-    super release.
-    tarArchiver release.
+    gzipArchiver := Archiver::GZipCompressed with:nil.
+    gzipArchiver compressFile:(tarArchiver fileName) to:(self fileName).
 ! !
 
 !Archiver::ZipArchive class methodsFor:'command strings'!
@@ -1100,5 +1276,5 @@
 !Archiver class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic2/Archiver.st,v 1.22 2004-01-08 11:03:21 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic2/Archiver.st,v 1.23 2004-01-20 14:21:33 cg Exp $'
 ! !