1 package org
.argeo
.slc
.repo
;
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
.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
;
23 /** Indexes an RPM file. */
24 public class RpmIndexer
implements NodeIndexer
, SlcNames
{
27 public Boolean
support(String path
) {
28 return FilenameUtils
.getExtension(path
).equals("rpm");
32 public void index(Node node
) {
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
);
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
);
48 String arch
= readTag(format
, Header
.HeaderTag
.ARCH
);
50 node
.setProperty(SLC_RPM_ARCH
, arch
);
52 String archiveSize
= readTag(format
, Header
.HeaderTag
.ARCHIVESIZE
);
53 if (archiveSize
!= null)
54 node
.setProperty(SLC_RPM_ARCHIVE_SIZE
,
55 Long
.parseLong(archiveSize
));
57 node
.getSession().save();
58 } catch (Exception e
) {
59 throw new SlcException("Cannot index " + node
, e
);
64 @SuppressWarnings("unused")
65 public Format
readRpmInfo(ReadableChannelWrapper channel
) throws Exception
{
66 Format format
= new Format();
68 Key
<Integer
> lead
= channel
.start();
69 format
.getLead().read(channel
);
70 // System.out.println( "Lead ended at '" + in.finish( lead) + "'.");
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()
78 // System.out.println( "Signature ended at '" + in.finish( signature) +
79 // "' and contained '" + count + "' headers (expected '" + expected +
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()
88 // System.out.println( "Header ended at '" + in.finish( header) +
89 // " and contained '" + count + "' headers (expected '" + expected +
95 private String
readTag(Format format
, Header
.HeaderTag tag
) {
96 AbstractHeader
.Entry
<?
> entry
= format
.getHeader().getEntry(tag
);
99 if (entry
.getValues() == null)
101 Object
[] values
= (Object
[]) entry
.getValues();
102 return values
[0].toString().trim();