Skip to content

Commit 128a9ed

Browse files
authored
Enhance type safety when getting tag values (#63)
This removes all uses of `ReadableHeader::getValue` which returns `Object` and replaces them with methods that return specific types. This simplifies the code and eliminates the need for the caller to cast the result. The method `RpmBaseTag::getDataType` was added to store the tag's data type. The tag's data type is checked when the various `ReadableHeader` methods are called.
1 parent 8bffa06 commit 128a9ed

27 files changed

+712
-535
lines changed

rpm/src/main/java/org/eclipse/packager/rpm/ReadableHeader.java

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,22 @@
1313

1414
package org.eclipse.packager.rpm;
1515

16-
import java.util.Optional;
16+
import java.util.List;
1717

1818
public interface ReadableHeader<T extends RpmBaseTag> {
19-
/**
20-
* Get the value from a header structure
21-
*
22-
* @param tag the tag
23-
* @return the optional value
24-
*/
25-
public Optional<Object> getValue(T tag);
19+
boolean hasTag(T tag);
20+
21+
String getString(T tag);
22+
23+
Integer getInteger(T tag);
24+
25+
Long getLong(T tag);
26+
27+
List<String> getStringList(T tag);
28+
29+
List<Integer> getIntegerList(T tag);
30+
31+
List<Long> getLongList(T tag);
32+
33+
byte[] getByteArray(T tag);
2634
}

rpm/src/main/java/org/eclipse/packager/rpm/RpmBaseTag.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,12 @@ public interface RpmBaseTag {
2323
*
2424
* @return the key value
2525
*/
26-
public Integer getValue();
26+
Integer getValue();
27+
28+
/**
29+
* Get the data type of the tag.
30+
*
31+
* @return the class representing the data type of this tag
32+
*/
33+
Class<?> getDataType();
2734
}

rpm/src/main/java/org/eclipse/packager/rpm/RpmSignatureTag.java

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,31 +17,39 @@
1717
import java.util.Map;
1818

1919
public enum RpmSignatureTag implements RpmBaseTag {
20-
PUBKEYS(266),
21-
DSAHEADER(267),
22-
RSAHEADER(268),
23-
SHA1HEADER(269),
24-
LONGARCHIVESIZE(271),
25-
SHA256HEADER(273),
26-
27-
SIZE(1000),
28-
PGP(1002),
29-
MD5(1004),
30-
PAYLOAD_SIZE(1007),
31-
LONGSIZE(5009);
20+
PUBKEYS(266, String[].class),
21+
DSAHEADER(267, byte[].class),
22+
RSAHEADER(268, byte[].class),
23+
SHA1HEADER(269, String.class),
24+
LONGARCHIVESIZE(271, Long.class),
25+
SHA256HEADER(273, String.class),
26+
27+
SIZE(1000, Integer.class),
28+
PGP(1002, byte[].class),
29+
MD5(1004, byte[].class),
30+
PAYLOAD_SIZE(1007, Integer.class),
31+
LONGSIZE(5009, Long.class);
3232

3333
private final Integer value;
3434

35-
RpmSignatureTag(final Integer value) {
35+
private final Class<?> dataType;
36+
37+
<T> RpmSignatureTag(final Integer value, final Class<T> dataType) {
3638
this.value = value;
39+
this.dataType = dataType;
3740
}
3841

3942
@Override
4043
public Integer getValue() {
4144
return this.value;
4245
}
4346

44-
private final static Map<Integer, RpmSignatureTag> all = new HashMap<>(RpmSignatureTag.values().length);
47+
@Override
48+
public Class<?> getDataType() {
49+
return this.dataType;
50+
}
51+
52+
private static final Map<Integer, RpmSignatureTag> all = new HashMap<>(RpmSignatureTag.values().length);
4553

4654
static {
4755
for (final RpmSignatureTag tag : values()) {
@@ -52,4 +60,10 @@ public Integer getValue() {
5260
public static RpmSignatureTag find(final Integer value) {
5361
return all.get(value);
5462
}
63+
64+
@Override
65+
public String toString() {
66+
RpmSignatureTag tag = find(this.value);
67+
return dataType.getSimpleName() + " " + (tag != null ? tag.name() + "(" + this.value + ")" : "UNKNOWN(" + this.value + ")");
68+
}
5569
}

rpm/src/main/java/org/eclipse/packager/rpm/RpmTag.java

Lines changed: 109 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -17,114 +17,121 @@
1717
import java.util.Map;
1818

1919
public enum RpmTag implements RpmBaseTag {
20-
NAME(1000),
21-
VERSION(1001),
22-
RELEASE(1002),
23-
EPOCH(1003),
24-
SUMMARY(1004),
25-
DESCRIPTION(1005),
26-
BUILDTIME(1006),
27-
BUILDHOST(1007),
28-
SIZE(1009),
29-
DISTRIBUTION(1010),
30-
VENDOR(1011),
31-
LICENSE(1014),
32-
PACKAGER(1015),
33-
GROUP(1016),
34-
URL(1020),
35-
OS(1021),
36-
ARCH(1022),
37-
PREINSTALL_SCRIPT(1023),
38-
POSTINSTALL_SCRIPT(1024),
39-
PREREMOVE_SCRIPT(1025),
40-
POSTREMOVE_SCRIPT(1026),
41-
FILE_SIZES(1028),
42-
FILE_MODES(1030),
43-
FILE_RDEVS(1033),
44-
FILE_MTIMES(1034),
45-
FILE_DIGESTS(1035),
46-
FILE_LINKTO(1036),
47-
FILE_FLAGS(1037),
48-
FILE_USERNAME(1039),
49-
FILE_GROUPNAME(1040),
50-
SOURCE_PACKAGE(1044),
51-
FILE_VERIFYFLAGS(1045),
52-
ARCHIVE_SIZE(1046),
53-
PROVIDE_NAME(1047),
54-
REQUIRE_FLAGS(1048),
55-
REQUIRE_NAME(1049),
56-
REQUIRE_VERSION(1050),
57-
CONFLICT_FLAGS(1053),
58-
CONFLICT_NAME(1054),
59-
CONFLICT_VERSION(1055),
60-
RPMVERSION(1064),
61-
TRIGGER_SCRIPTS(1065),
62-
TRIGGER_NAME(1066),
63-
TRIGGER_VERSION(1067),
64-
TRIGGER_FLAGS(1068),
65-
TRIGGER_INDEX(1069),
66-
VERIFY_SCRIPT(1079),
67-
CHANGELOG_TIMESTAMP(1080),
68-
CHANGELOG_AUTHOR(1081),
69-
CHANGELOG_TEXT(1082),
70-
PREINSTALL_SCRIPT_PROG(1085),
71-
POSTINSTALL_SCRIPT_PROG(1086),
72-
PREREMOVE_SCRIPT_PROG(1087),
73-
POSTREMOVE_SCRIPT_PROG(1088),
74-
VERIFY_SCRIPT_PROG(1091),
75-
TRIGGERSCRIPT_PROG(1092),
76-
OBSOLETE_NAME(1090),
77-
FILE_DEVICES(1095),
78-
FILE_INODES(1096),
79-
FILE_LANGS(1097),
80-
PREFIXES(1098),
81-
PROVIDE_FLAGS(1112),
82-
PROVIDE_VERSION(1113),
83-
OBSOLETE_FLAGS(1114),
84-
OBSOLETE_VERSION(1115),
85-
DIR_INDEXES(1116),
86-
BASENAMES(1117),
87-
DIRNAMES(1118),
88-
OPTFLAGS(1122),
89-
PAYLOAD_FORMAT(1124),
90-
PAYLOAD_CODING(1125),
91-
PAYLOAD_FLAGS(1126),
92-
PLATFORM(1132),
93-
PRETRANSACTION_SCRIPT(1151),
94-
POSTTRANSACTION_SCRIPT(1152),
95-
PRETRANSACTION_SCRIPT_PROG(1153),
96-
POSTTRANSACTION_SCRIPT_PROG(1154),
97-
LONGSIZE(5009),
98-
FILE_DIGESTALGO(5011),
99-
RECOMMEND_NAME(5046),
100-
RECOMMEND_VERSION(5047),
101-
RECOMMEND_FLAGS(5048),
102-
SUGGEST_NAME(5049),
103-
SUGGEST_VERSION(5050),
104-
SUGGEST_FLAGS(5051),
105-
SUPPLEMENT_NAME(5052),
106-
SUPPLEMENT_VERSION(5053),
107-
SUPPLEMENT_FLAGS(5054),
108-
ENHANCE_NAME(5055),
109-
ENHANCE_VERSION(5056),
110-
ENHANCE_FLAGS(5057),
20+
NAME(1000, String.class),
21+
VERSION(1001, String.class),
22+
RELEASE(1002, String.class),
23+
EPOCH(1003, Integer.class),
24+
SUMMARY(1004, String[].class),
25+
DESCRIPTION(1005, String[].class),
26+
BUILDTIME(1006, Integer.class),
27+
BUILDHOST(1007, String.class),
28+
SIZE(1009, Integer.class),
29+
DISTRIBUTION(1010, String.class),
30+
VENDOR(1011, String.class),
31+
LICENSE(1014, String.class),
32+
PACKAGER(1015, String.class),
33+
GROUP(1016, String[].class),
34+
URL(1020, String.class),
35+
OS(1021, String.class),
36+
ARCH(1022, String.class),
37+
PREINSTALL_SCRIPT(1023, String.class),
38+
POSTINSTALL_SCRIPT(1024, String.class),
39+
PREREMOVE_SCRIPT(1025, String.class),
40+
POSTREMOVE_SCRIPT(1026, String.class),
41+
FILE_SIZES(1028, Integer[].class),
42+
FILE_MODES(1030, Short[].class),
43+
FILE_RDEVS(1033, Short[].class),
44+
FILE_MTIMES(1034, Integer[].class),
45+
FILE_DIGESTS(1035, String[].class),
46+
FILE_LINKTO(1036, String[].class),
47+
FILE_FLAGS(1037, Integer[].class),
48+
FILE_USERNAME(1039, String[].class),
49+
FILE_GROUPNAME(1040, String[].class),
50+
SOURCE_PACKAGE(1044, String.class),
51+
FILE_VERIFYFLAGS(1045, Integer[].class),
52+
ARCHIVE_SIZE(1046, Integer.class),
53+
PROVIDE_NAME(1047, String[].class),
54+
REQUIRE_FLAGS(1048, Integer[].class),
55+
REQUIRE_NAME(1049, String[].class),
56+
REQUIRE_VERSION(1050, String[].class),
57+
CONFLICT_FLAGS(1053, Integer[].class),
58+
CONFLICT_NAME(1054, String[].class),
59+
CONFLICT_VERSION(1055, String[].class),
60+
RPMVERSION(1064, String.class),
61+
TRIGGER_SCRIPTS(1065, String[].class),
62+
TRIGGER_NAME(1066, String[].class),
63+
TRIGGER_VERSION(1067, String[].class),
64+
TRIGGER_FLAGS(1068, Integer[].class),
65+
TRIGGER_INDEX(1069, Integer[].class),
66+
VERIFY_SCRIPT(1079, String.class),
67+
CHANGELOG_TIMESTAMP(1080, Integer[].class),
68+
CHANGELOG_AUTHOR(1081, String[].class),
69+
CHANGELOG_TEXT(1082, String[].class),
70+
PREINSTALL_SCRIPT_PROG(1085, String[].class),
71+
POSTINSTALL_SCRIPT_PROG(1086, String[].class),
72+
PREREMOVE_SCRIPT_PROG(1087, String[].class),
73+
POSTREMOVE_SCRIPT_PROG(1088, String[].class),
74+
OBSOLETE_NAME(1090, String[].class),
75+
VERIFY_SCRIPT_PROG(1091, String[].class),
76+
TRIGGERSCRIPT_PROG(1092, String[].class),
77+
FILE_DEVICES(1095, Integer[].class),
78+
FILE_INODES(1096, Integer[].class),
79+
FILE_LANGS(1097, String[].class),
80+
PREFIXES(1098, String[].class),
81+
PROVIDE_FLAGS(1112, Integer[].class),
82+
PROVIDE_VERSION(1113, String[].class),
83+
OBSOLETE_FLAGS(1114, Integer[].class),
84+
OBSOLETE_VERSION(1115, String[].class),
85+
DIR_INDEXES(1116, Integer.class),
86+
BASENAMES(1117, String[].class),
87+
DIRNAMES(1118, String[].class),
88+
OPTFLAGS(1122, String.class),
89+
PAYLOAD_FORMAT(1124, String.class),
90+
PAYLOAD_CODING(1125, String.class),
91+
PAYLOAD_FLAGS(1126, String.class),
92+
PLATFORM(1132, String.class),
93+
PRETRANSACTION_SCRIPT(1151, String.class),
94+
POSTTRANSACTION_SCRIPT(1152, String.class),
95+
PRETRANSACTION_SCRIPT_PROG(1153, String[].class),
96+
POSTTRANSACTION_SCRIPT_PROG(1154, String[].class),
97+
LONGSIZE(5009, Long.class),
98+
FILE_DIGESTALGO(5011, Integer.class),
99+
RECOMMEND_NAME(5046, String[].class),
100+
RECOMMEND_VERSION(5047, String[].class),
101+
RECOMMEND_FLAGS(5048, Integer[].class),
102+
SUGGEST_NAME(5049, String[].class),
103+
SUGGEST_VERSION(5050, String[].class),
104+
SUGGEST_FLAGS(5051, Integer[].class),
105+
SUPPLEMENT_NAME(5052, String[].class),
106+
SUPPLEMENT_VERSION(5053, String[].class),
107+
SUPPLEMENT_FLAGS(5054, Integer[].class),
108+
ENHANCE_NAME(5055, String[].class),
109+
ENHANCE_VERSION(5056, String[].class),
110+
ENHANCE_FLAGS(5057, Integer[].class),
111111

112-
PAYLOAD_DIGEST(5092),
113-
PAYLOAD_DIGEST_ALGO(5093),
114-
PAYLOAD_DIGEST_ALT(5097);
112+
PAYLOAD_DIGEST(5092, String[].class),
113+
PAYLOAD_DIGEST_ALGO(5093, Integer.class),
114+
PAYLOAD_DIGEST_ALT(5097, String[].class);
115115

116116
private final Integer value;
117117

118-
RpmTag(final Integer value) {
118+
private final Class<?> dataType;
119+
120+
<T> RpmTag(final Integer value, Class<T> dataType) {
119121
this.value = value;
122+
this.dataType = dataType;
120123
}
121124

122125
@Override
123126
public Integer getValue() {
124127
return this.value;
125128
}
126129

127-
private final static Map<Integer, RpmTag> all = new HashMap<>(RpmTag.values().length);
130+
public Class<?> getDataType() {
131+
return this.dataType;
132+
}
133+
134+
private static final Map<Integer, RpmTag> all = new HashMap<>(RpmTag.values().length);
128135

129136
static {
130137
for (final RpmTag tag : values()) {
@@ -135,4 +142,10 @@ public Integer getValue() {
135142
public static RpmTag find(final Integer value) {
136143
return all.get(value);
137144
}
145+
146+
@Override
147+
public String toString() {
148+
RpmTag tag = find(this.value);
149+
return dataType.getSimpleName() + " " + (tag != null ? tag.name() + "(" + this.value + ")" : "UNKNOWN(" + this.value + ")");
150+
}
138151
}

0 commit comments

Comments
 (0)