1 package org
.argeo
.slc
.rpmfactory
.core
;
3 import static org
.freecompany
.redline
.header
.Header
.HeaderTag
.HEADERIMMUTABLE
;
4 import static org
.freecompany
.redline
.header
.Signature
.SignatureTag
.SIGNATURES
;
6 import java
.io
.InputStream
;
7 import java
.nio
.ByteBuffer
;
8 import java
.nio
.channels
.Channels
;
10 import javax
.jcr
.Node
;
11 import javax
.jcr
.Property
;
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
.argeo
.slc
.repo
.NodeIndexer
;
18 import org
.freecompany
.redline
.ChannelWrapper
.Key
;
19 import org
.freecompany
.redline
.ReadableChannelWrapper
;
20 import org
.freecompany
.redline
.header
.AbstractHeader
;
21 import org
.freecompany
.redline
.header
.Format
;
22 import org
.freecompany
.redline
.header
.Header
;
24 /** Indexes an RPM file. */
25 public class RpmIndexer
implements NodeIndexer
, SlcNames
{
28 public Boolean
support(String path
) {
29 return FilenameUtils
.getExtension(path
).equals("rpm");
33 public void index(Node node
) {
35 InputStream in
= node
.getNode(Node
.JCR_CONTENT
)
36 .getProperty(Property
.JCR_DATA
).getBinary().getStream();
37 ReadableChannelWrapper channel
= new ReadableChannelWrapper(
38 Channels
.newChannel(in
));
39 Format format
= readRpmInfo(channel
);
41 node
.addMixin(SlcTypes
.SLC_RPM
);
42 node
.setProperty(SLC_NAME
, readTag(format
, Header
.HeaderTag
.NAME
));
43 String rpmVersion
= readTag(format
, Header
.HeaderTag
.VERSION
);
44 String rpmRelease
= readTag(format
, Header
.HeaderTag
.RELEASE
);
45 node
.setProperty(SLC_RPM_VERSION
, rpmVersion
);
46 node
.setProperty(SLC_RPM_RELEASE
, rpmRelease
);
47 node
.setProperty(SLC_VERSION
, rpmVersion
+ "-" + rpmRelease
);
49 String arch
= readTag(format
, Header
.HeaderTag
.ARCH
);
51 node
.setProperty(SLC_RPM_ARCH
, arch
);
53 String archiveSize
= readTag(format
, Header
.HeaderTag
.ARCHIVESIZE
);
54 if (archiveSize
!= null)
55 node
.setProperty(SLC_RPM_ARCHIVE_SIZE
,
56 Long
.parseLong(archiveSize
));
58 node
.getSession().save();
59 } catch (Exception e
) {
60 throw new SlcException("Cannot index " + node
, e
);
65 @SuppressWarnings("unused")
66 public Format
readRpmInfo(ReadableChannelWrapper channel
) throws Exception
{
67 Format format
= new Format();
69 Key
<Integer
> lead
= channel
.start();
70 format
.getLead().read(channel
);
71 // System.out.println( "Lead ended at '" + in.finish( lead) + "'.");
73 Key
<Integer
> signature
= channel
.start();
74 int count
= format
.getSignature().read(channel
);
75 int expected
= ByteBuffer
76 .wrap((byte[]) format
.getSignature().getEntry(SIGNATURES
)
77 .getValues(), 8, 4).getInt()
79 // System.out.println( "Signature ended at '" + in.finish( signature) +
80 // "' and contained '" + count + "' headers (expected '" + expected +
83 Key
<Integer
> header
= channel
.start();
84 count
= format
.getHeader().read(channel
);
85 expected
= ByteBuffer
.wrap(
86 (byte[]) format
.getHeader().getEntry(HEADERIMMUTABLE
)
87 .getValues(), 8, 4).getInt()
89 // System.out.println( "Header ended at '" + in.finish( header) +
90 // " and contained '" + count + "' headers (expected '" + expected +
96 private String
readTag(Format format
, Header
.HeaderTag tag
) {
97 AbstractHeader
.Entry
<?
> entry
= format
.getHeader().getEntry(tag
);
100 if (entry
.getValues() == null)
102 Object
[] values
= (Object
[]) entry
.getValues();
103 return values
[0].toString().trim();