X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.slc.repo%2Fsrc%2Forg%2Fargeo%2Fslc%2Frepo%2FRpmIndexer.java;fp=org.argeo.slc.repo%2Fsrc%2Forg%2Fargeo%2Fslc%2Frepo%2FRpmIndexer.java;h=57b93b8ec26f365a2df7b3ed7ad41072f9572058;hb=b9505fef5ba8186433e903e9de3c73c17bdf6562;hp=0000000000000000000000000000000000000000;hpb=04ef2e4533e909122a560a5cb6499fa62bac82ec;p=gpl%2Fargeo-slc.git diff --git a/org.argeo.slc.repo/src/org/argeo/slc/repo/RpmIndexer.java b/org.argeo.slc.repo/src/org/argeo/slc/repo/RpmIndexer.java new file mode 100644 index 000000000..57b93b8ec --- /dev/null +++ b/org.argeo.slc.repo/src/org/argeo/slc/repo/RpmIndexer.java @@ -0,0 +1,116 @@ +package org.argeo.slc.repo; + +import static org.freecompany.redline.header.Header.HeaderTag.HEADERIMMUTABLE; +import static org.freecompany.redline.header.Signature.SignatureTag.SIGNATURES; + +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.nio.channels.Channels; + +import javax.jcr.Node; +import javax.jcr.Property; +import javax.jcr.nodetype.NodeType; + +import org.apache.commons.io.FilenameUtils; +import org.argeo.slc.SlcException; +import org.argeo.slc.jcr.SlcNames; +import org.argeo.slc.jcr.SlcTypes; +import org.freecompany.redline.ChannelWrapper.Key; +import org.freecompany.redline.ReadableChannelWrapper; +import org.freecompany.redline.header.AbstractHeader; +import org.freecompany.redline.header.Format; +import org.freecompany.redline.header.Header; + +/** Indexes an RPM file. */ +public class RpmIndexer implements NodeIndexer, SlcNames { + private Boolean force = false; + + @Override + public Boolean support(String path) { + return FilenameUtils.getExtension(path).equals("rpm"); + } + + @Override + public void index(Node node) { + try { + if (!support(node.getPath())) + return; + + // Already indexed + if (!force && node.isNodeType(SlcTypes.SLC_RPM)) + return; + + if (!node.isNodeType(NodeType.NT_FILE)) + return; + + InputStream in = node.getNode(Node.JCR_CONTENT) + .getProperty(Property.JCR_DATA).getBinary().getStream(); + ReadableChannelWrapper channel = new ReadableChannelWrapper( + Channels.newChannel(in)); + Format format = readRpmInfo(channel); + + node.addMixin(SlcTypes.SLC_RPM); + node.setProperty(SLC_NAME, readTag(format, Header.HeaderTag.NAME)); + String rpmVersion = readTag(format, Header.HeaderTag.VERSION); + String rpmRelease = readTag(format, Header.HeaderTag.RELEASE); + node.setProperty(SLC_RPM_VERSION, rpmVersion); + node.setProperty(SLC_RPM_RELEASE, rpmRelease); + node.setProperty(SLC_VERSION, rpmVersion + "-" + rpmRelease); + + String arch = readTag(format, Header.HeaderTag.ARCH); + if (arch != null) + node.setProperty(SLC_RPM_ARCH, arch); + + String archiveSize = readTag(format, Header.HeaderTag.ARCHIVESIZE); + if (archiveSize != null) + node.setProperty(SLC_RPM_ARCHIVE_SIZE, + Long.parseLong(archiveSize)); + + node.getSession().save(); + } catch (Exception e) { + throw new SlcException("Cannot index " + node, e); + } + + } + + @SuppressWarnings("unused") + public Format readRpmInfo(ReadableChannelWrapper channel) throws Exception { + Format format = new Format(); + + Key lead = channel.start(); + format.getLead().read(channel); + // System.out.println( "Lead ended at '" + in.finish( lead) + "'."); + + Key signature = channel.start(); + int count = format.getSignature().read(channel); + int expected = ByteBuffer + .wrap((byte[]) format.getSignature().getEntry(SIGNATURES) + .getValues(), 8, 4).getInt() + / -16; + // System.out.println( "Signature ended at '" + in.finish( signature) + + // "' and contained '" + count + "' headers (expected '" + expected + + // "')."); + + Key header = channel.start(); + count = format.getHeader().read(channel); + expected = ByteBuffer.wrap( + (byte[]) format.getHeader().getEntry(HEADERIMMUTABLE) + .getValues(), 8, 4).getInt() + / -16; + // System.out.println( "Header ended at '" + in.finish( header) + + // " and contained '" + count + "' headers (expected '" + expected + + // "')."); + + return format; + } + + private String readTag(Format format, Header.HeaderTag tag) { + AbstractHeader.Entry entry = format.getHeader().getEntry(tag); + if (entry == null) + return null; + if (entry.getValues() == null) + return null; + Object[] values = (Object[]) entry.getValues(); + return values[0].toString().trim(); + } +}