/*******************************************************************************
* Copyright (c) 2015 IBH SYSTEMS GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBH SYSTEMS GmbH - initial API and implementation
*******************************************************************************/
package org.eclipse.packagedrone.utils.deb;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import java.util.Map;
import java.util.zip.GZIPInputStream;
import org.apache.commons.compress.archivers.ArchiveEntry;
import org.apache.commons.compress.archivers.ar.ArArchiveInputStream;
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
import org.eclipse.packagedrone.utils.Strings;
import org.eclipse.packagedrone.utils.deb.internal.BinarySectionPackagesFile;
public final class Packages
{
private Packages ()
{
}
public static Map<String, String> parseControlFile ( final File packageFile ) throws IOException, ParserException
{
try ( final ArArchiveInputStream in = new ArArchiveInputStream ( new FileInputStream ( packageFile ) ) )
{
ArchiveEntry ar;
while ( ( ar = in.getNextEntry () ) != null )
{
if ( !ar.getName ().equals ( "control.tar.gz" ) )
{
continue;
}
try ( final TarArchiveInputStream inputStream = new TarArchiveInputStream ( new GZIPInputStream ( in ) ) )
{
TarArchiveEntry te;
while ( ( te = inputStream.getNextTarEntry () ) != null )
{
String name = te.getName ();
if ( name.startsWith ( "./" ) )
{
name = name.substring ( 2 );
}
if ( !name.equals ( "control" ) )
{
continue;
}
return parseControlFile ( inputStream );
}
}
}
}
return null;
}
public static Map<String, String> parseControlFile ( final InputStream inputStream ) throws IOException, ParserException
{
return ControlFileParser.parse ( inputStream );
}
public static List<Map<String, String>> parseStatusFile ( final InputStream inputStream ) throws IOException, ParserException
{
return ControlFileParser.parseMulti ( inputStream );
}
public static void writeBinaryPackageValues ( final PrintWriter writer, final Map<String, String> values ) throws IOException
{
new ControlFileWriter ( writer, BinarySectionPackagesFile.FORMATTERS ).writeEntries ( values );
}
private static MessageDigest MD5;
static
{
try
{
MD5 = MessageDigest.getInstance ( "MD5" );
}
catch ( final NoSuchAlgorithmException e )
{
throw new RuntimeException ( e );
}
}
public static String makeDescriptionMd5 ( final String string )
{
if ( string == null )
{
return null;
}
final StringBuilder sb = new StringBuilder ();
try
{
FieldFormatter.MULTI.appendValue ( string, sb );
sb.append ( '\n' );
}
catch ( final IOException e )
{
// this will never ever happen
}
final String result = sb.toString ();
final byte[] data = MD5.digest ( result.getBytes ( StandardCharsets.UTF_8 ) );
return Strings.hex ( data );
}
}