1 package org
.argeo
.slc
.rpmfactory
.core
;
3 import static org
.redline_rpm
.header
.Header
.HeaderTag
.HEADERIMMUTABLE
;
4 import static org
.redline_rpm
.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
;
12 import javax
.jcr
.nodetype
.NodeType
;
14 import org
.apache
.commons
.io
.FilenameUtils
;
15 import org
.argeo
.slc
.SlcException
;
16 import org
.argeo
.slc
.SlcNames
;
17 import org
.argeo
.slc
.SlcTypes
;
18 import org
.argeo
.slc
.repo
.NodeIndexer
;
19 import org
.redline_rpm
.ChannelWrapper
.Key
;
20 import org
.redline_rpm
.ReadableChannelWrapper
;
21 import org
.redline_rpm
.header
.AbstractHeader
;
22 import org
.redline_rpm
.header
.Format
;
23 import org
.redline_rpm
.header
.Header
;
25 /** Indexes an RPM file. */
26 public class RpmIndexer
implements NodeIndexer
, SlcNames
{
27 private Boolean force
= false;
30 public Boolean
support(String path
) {
31 return FilenameUtils
.getExtension(path
).equals("rpm");
35 public void index(Node node
) {
37 if (!support(node
.getPath()))
41 if (!force
&& node
.isNodeType(SlcTypes
.SLC_RPM
))
44 if (!node
.isNodeType(NodeType
.NT_FILE
))
47 InputStream in
= node
.getNode(Node
.JCR_CONTENT
)
48 .getProperty(Property
.JCR_DATA
).getBinary().getStream();
49 ReadableChannelWrapper channel
= new ReadableChannelWrapper(
50 Channels
.newChannel(in
));
51 Format format
= readRpmInfo(channel
);
53 node
.addMixin(SlcTypes
.SLC_RPM
);
54 node
.setProperty(SLC_NAME
, readTag(format
, Header
.HeaderTag
.NAME
));
55 String rpmVersion
= readTag(format
, Header
.HeaderTag
.VERSION
);
56 String rpmRelease
= readTag(format
, Header
.HeaderTag
.RELEASE
);
57 node
.setProperty(SLC_RPM_VERSION
, rpmVersion
);
58 node
.setProperty(SLC_RPM_RELEASE
, rpmRelease
);
59 node
.setProperty(SLC_VERSION
, rpmVersion
+ "-" + rpmRelease
);
61 String arch
= readTag(format
, Header
.HeaderTag
.ARCH
);
63 node
.setProperty(SLC_RPM_ARCH
, arch
);
65 String archiveSize
= readTag(format
, Header
.HeaderTag
.ARCHIVESIZE
);
66 if (archiveSize
!= null)
67 node
.setProperty(SLC_RPM_ARCHIVE_SIZE
,
68 Long
.parseLong(archiveSize
));
70 node
.getSession().save();
71 } catch (Exception e
) {
72 throw new SlcException("Cannot index " + node
, e
);
77 @SuppressWarnings("unused")
78 public Format
readRpmInfo(ReadableChannelWrapper channel
) throws Exception
{
79 Format format
= new Format();
81 Key
<Integer
> lead
= channel
.start();
82 format
.getLead().read(channel
);
83 // System.out.println( "Lead ended at '" + in.finish( lead) + "'.");
85 Key
<Integer
> signature
= channel
.start();
86 int count
= format
.getSignature().read(channel
);
87 int expected
= ByteBuffer
88 .wrap((byte[]) format
.getSignature().getEntry(SIGNATURES
)
89 .getValues(), 8, 4).getInt()
91 // System.out.println( "Signature ended at '" + in.finish( signature) +
92 // "' and contained '" + count + "' headers (expected '" + expected +
95 Key
<Integer
> header
= channel
.start();
96 count
= format
.getHeader().read(channel
);
97 expected
= ByteBuffer
.wrap(
98 (byte[]) format
.getHeader().getEntry(HEADERIMMUTABLE
)
99 .getValues(), 8, 4).getInt()
101 // System.out.println( "Header ended at '" + in.finish( header) +
102 // " and contained '" + count + "' headers (expected '" + expected +
108 private String
readTag(Format format
, Header
.HeaderTag tag
) {
109 AbstractHeader
.Entry
<?
> entry
= format
.getHeader().getEntry(tag
);
112 if (entry
.getValues() == null)
114 Object
[] values
= (Object
[]) entry
.getValues();
115 return values
[0].toString().trim();