]> git.argeo.org Git - gpl/argeo-slc.git/blob - runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RpmIndexer.java
a91081d1762447e4a1b22cd53ef6db759baf18f7
[gpl/argeo-slc.git] / runtime / org.argeo.slc.repo / src / main / java / org / argeo / slc / repo / RpmIndexer.java
1 package org.argeo.slc.repo;
2
3 import static org.freecompany.redline.header.Header.HeaderTag.HEADERIMMUTABLE;
4 import static org.freecompany.redline.header.Signature.SignatureTag.SIGNATURES;
5
6 import java.io.InputStream;
7 import java.nio.ByteBuffer;
8 import java.nio.channels.Channels;
9
10 import javax.jcr.Node;
11 import javax.jcr.Property;
12
13 import org.apache.commons.io.FilenameUtils;
14 import org.argeo.slc.SlcException;
15 import org.argeo.slc.jcr.SlcNames;
16 import org.argeo.slc.jcr.SlcTypes;
17 import org.freecompany.redline.ChannelWrapper.Key;
18 import org.freecompany.redline.ReadableChannelWrapper;
19 import org.freecompany.redline.header.AbstractHeader;
20 import org.freecompany.redline.header.Format;
21 import org.freecompany.redline.header.Header;
22
23 /** Indexes an RPM file. */
24 public class RpmIndexer implements NodeIndexer, SlcNames {
25
26 @Override
27 public Boolean support(String path) {
28 return FilenameUtils.getExtension(path).equals("rpm");
29 }
30
31 @Override
32 public void index(Node node) {
33 try {
34 InputStream in = node.getNode(Node.JCR_CONTENT)
35 .getProperty(Property.JCR_DATA).getBinary().getStream();
36 ReadableChannelWrapper channel = new ReadableChannelWrapper(
37 Channels.newChannel(in));
38 Format format = readRpmInfo(channel);
39
40 node.addMixin(SlcTypes.SLC_RPM);
41 node.setProperty(SLC_NAME, readTag(format, Header.HeaderTag.NAME));
42 String rpmVersion = readTag(format, Header.HeaderTag.VERSION);
43 String rpmRelease = readTag(format, Header.HeaderTag.RELEASE);
44 node.setProperty(SLC_RPM_VERSION, rpmVersion);
45 node.setProperty(SLC_RPM_RELEASE, rpmRelease);
46 node.setProperty(SLC_VERSION, rpmVersion + "-" + rpmRelease);
47
48 String arch = readTag(format, Header.HeaderTag.ARCH);
49 if (arch != null)
50 node.setProperty(SLC_RPM_ARCH, arch);
51
52 String archiveSize = readTag(format, Header.HeaderTag.ARCHIVESIZE);
53 if (archiveSize != null)
54 node.setProperty(SLC_RPM_ARCHIVE_SIZE,
55 Long.parseLong(archiveSize));
56
57 node.getSession().save();
58 } catch (Exception e) {
59 throw new SlcException("Cannot index " + node, e);
60 }
61
62 }
63
64 @SuppressWarnings("unused")
65 public Format readRpmInfo(ReadableChannelWrapper channel) throws Exception {
66 Format format = new Format();
67
68 Key<Integer> lead = channel.start();
69 format.getLead().read(channel);
70 // System.out.println( "Lead ended at '" + in.finish( lead) + "'.");
71
72 Key<Integer> signature = channel.start();
73 int count = format.getSignature().read(channel);
74 int expected = ByteBuffer
75 .wrap((byte[]) format.getSignature().getEntry(SIGNATURES)
76 .getValues(), 8, 4).getInt()
77 / -16;
78 // System.out.println( "Signature ended at '" + in.finish( signature) +
79 // "' and contained '" + count + "' headers (expected '" + expected +
80 // "').");
81
82 Key<Integer> header = channel.start();
83 count = format.getHeader().read(channel);
84 expected = ByteBuffer.wrap(
85 (byte[]) format.getHeader().getEntry(HEADERIMMUTABLE)
86 .getValues(), 8, 4).getInt()
87 / -16;
88 // System.out.println( "Header ended at '" + in.finish( header) +
89 // " and contained '" + count + "' headers (expected '" + expected +
90 // "').");
91
92 return format;
93 }
94
95 private String readTag(Format format, Header.HeaderTag tag) {
96 AbstractHeader.Entry<?> entry = format.getHeader().getEntry(tag);
97 if (entry == null)
98 return null;
99 if (entry.getValues() == null)
100 return null;
101 Object[] values = (Object[]) entry.getValues();
102 return values[0].toString().trim();
103 }
104 }