Skip to content

Commit

Permalink
Remove use of Object in headers and store header value as rpm tag v…
Browse files Browse the repository at this point in the history
…alue
  • Loading branch information
dwalluck committed Apr 12, 2024
1 parent ecd1acc commit 7c62c8d
Show file tree
Hide file tree
Showing 7 changed files with 120 additions and 79 deletions.
39 changes: 38 additions & 1 deletion rpm/src/main/java/org/eclipse/packager/rpm/RpmTagValue.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@

package org.eclipse.packager.rpm;

import org.apache.commons.codec.binary.Hex;

import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.Objects;
import java.util.Optional;

public class RpmTagValue {
Expand Down Expand Up @@ -118,8 +123,12 @@ public Optional<Long> asLong() {
return Optional.empty();
}

if (this.value instanceof Integer) {
return Optional.of((Integer.toUnsignedLong((Integer) this.value)));
}

if (this.value instanceof Long) {
return Optional.of(((Long) this.value).longValue());
return Optional.of((Long) this.value);
}

if (this.value instanceof Long[]) {
Expand All @@ -133,4 +142,32 @@ public Optional<Long> asLong() {

return Optional.empty();
}

@Override
public String toString() {
if (this.value instanceof byte[]) {
return Hex.encodeHexString((byte[]) this.value);
}

if (this.value instanceof ByteBuffer) {
ByteBuffer buffer = (ByteBuffer) this.value;
byte[] data;

if (buffer.hasArray()) {
data = buffer.array();
} else {
data = new byte[buffer.remaining()];
buffer.get(data);
}

return Hex.encodeHexString(data);
}

if (this.value instanceof Object[]) {
final Object[] array = (Object[]) this.value;
return array.length == 1 ? Objects.toString(array[0]) : Arrays.toString((Object[]) this.value);
}

return Objects.toString(this.value);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import org.eclipse.packager.rpm.OperatingSystem;
import org.eclipse.packager.rpm.RpmLead;
import org.eclipse.packager.rpm.RpmTag;
import org.eclipse.packager.rpm.RpmTagValue;
import org.eclipse.packager.rpm.RpmVersion;
import org.eclipse.packager.rpm.Type;
import org.eclipse.packager.rpm.header.Header;
Expand Down Expand Up @@ -73,8 +74,8 @@ public void fillFlagsFromHeader(final Header<RpmTag> header, final Function<Stri
Objects.requireNonNull(architectureMapper);
Objects.requireNonNull(operatingSystemMapper);

final Object os = header.get(RpmTag.OS);
final Object arch = header.get(RpmTag.ARCH);
final Object os = ((RpmTagValue) header.get(RpmTag.OS)).getValue();
final Object arch = ((RpmTagValue) header.get(RpmTag.ARCH)).getValue();

if (os instanceof String) {
this.architecture = architectureMapper.apply((String) os).orElse(Architecture.NOARCH).getValue();
Expand Down
90 changes: 47 additions & 43 deletions rpm/src/main/java/org/eclipse/packager/rpm/header/Header.java
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,14 @@ private static final class I18nString {
public I18nString(final String value) {
this.value = value;
}

@Override
public String toString() {
return this.value;
}
}

private final Map<Integer, Object> entries = new LinkedHashMap<>();
private final Map<Integer, HeaderEntry> entries = new LinkedHashMap<>();

private final Charset charset;

Expand Down Expand Up @@ -103,125 +108,125 @@ public void putNull(final T tag) {
public void putByte(final int tag, final byte... value) {
Objects.requireNonNull(value);

this.entries.put(tag, value);
this.entries.put(tag, makeEntry(tag, value));
}

public void putByte(final T tag, final byte... value) {
Objects.requireNonNull(value);

this.entries.put(tag.getValue(), value);
this.entries.put(tag.getValue(), makeEntry(tag.getValue(), value));
}

public void putShort(final int tag, final short... value) {
Objects.requireNonNull(value);

this.entries.put(tag, value);
this.entries.put(tag, makeEntry(tag, value));
}

public void putShort(final T tag, final short... value) {
Objects.requireNonNull(value);

this.entries.put(tag.getValue(), value);
this.entries.put(tag.getValue(), makeEntry(tag.getValue(), value));
}

public void putInt(final int tag, final int... value) {
Objects.requireNonNull(value);

this.entries.put(tag, value);
this.entries.put(tag, makeEntry(tag, value));
}

public void putInt(final T tag, final int... value) {
Objects.requireNonNull(value);

this.entries.put(tag.getValue(), value);
this.entries.put(tag.getValue(), makeEntry(tag.getValue(), value));
}

public void putLong(final int tag, final long... value) {
Objects.requireNonNull(value);

this.entries.put(tag, value);
this.entries.put(tag, makeEntry(tag, value));
}

public void putLong(final T tag, final long... value) {
Objects.requireNonNull(value);

this.entries.put(tag.getValue(), value);
this.entries.put(tag.getValue(), makeEntry(tag.getValue(), value));
}

public void putString(final int tag, final String value) {
Objects.requireNonNull(value);

this.entries.put(tag, value);
this.entries.put(tag, makeEntry(tag, value));
}

public void putString(final T tag, final String value) {
Objects.requireNonNull(value);

this.entries.put(tag.getValue(), value);
this.entries.put(tag.getValue(), makeEntry(tag.getValue(), value));
}

public void putStringOptional(final int tag, final String value) {
if (value == null) {
return;
}

this.entries.put(tag, value);
this.entries.put(tag, makeEntry(tag, value));
}

public void putStringOptional(final T tag, final String value) {
if (value == null) {
return;
}

this.entries.put(tag.getValue(), value);
this.entries.put(tag.getValue(), makeEntry(tag.getValue(), value));
}

public void putStringArray(final int tag, final String... value) {
Objects.requireNonNull(value);

this.entries.put(tag, value);
this.entries.put(tag, makeEntry(tag, value));
}

public void putStringArray(final T tag, final String... value) {
Objects.requireNonNull(value);

this.entries.put(tag.getValue(), value);
this.entries.put(tag.getValue(), makeEntry(tag.getValue(), value));
}

public void putI18nString(final int tag, final String... value) {
Objects.requireNonNull(value);

this.entries.put(tag, Arrays.stream(value).map(v -> new I18nString(v)).toArray(I18nString[]::new));
this.entries.put(tag, makeEntry(tag, Arrays.stream(value).map(I18nString::new).toArray(I18nString[]::new)));
}

public void putI18nString(final T tag, final String... value) {
Objects.requireNonNull(value);

this.entries.put(tag.getValue(), Arrays.stream(value).map(v -> new I18nString(v)).toArray(I18nString[]::new));
this.entries.put(tag.getValue(), makeEntry(tag.getValue(), Arrays.stream(value).map(I18nString::new).toArray(I18nString[]::new)));
}

public void putBlob(final int tag, final byte[] value) {
Objects.requireNonNull(value);

this.entries.put(tag, ByteBuffer.wrap(value));
this.entries.put(tag, makeEntry(tag, ByteBuffer.wrap(value)));
}

public void putBlob(final int tag, final ByteBuffer value) {
Objects.requireNonNull(value);

this.entries.put(tag, value);
this.entries.put(tag, makeEntry(tag, value));
}

public void putBlob(final T tag, final byte[] value) {
Objects.requireNonNull(value);

this.entries.put(tag.getValue(), ByteBuffer.wrap(value));
this.entries.put(tag.getValue(), makeEntry(tag.getValue(), ByteBuffer.wrap(value)));
}

public void putBlob(final T tag, final ByteBuffer value) {
Objects.requireNonNull(value);

this.entries.put(tag.getValue(), value);
this.entries.put(tag.getValue(), makeEntry(tag.getValue(), value));
}

public void putSize(long value, final T intTag, final T longTag) {
Expand Down Expand Up @@ -252,11 +257,11 @@ public void remove(final RpmTag tag) {
}

public Object get(final int tag) {
return this.entries.get(tag);
return this.entries.get(tag).getValue();
}

public Object get(final T tag) {
return this.entries.get(tag.getValue());
return this.entries.get(tag.getValue()).getValue();
}

@Override
Expand All @@ -278,11 +283,11 @@ public HeaderEntry[] makeEntries(Charset charset) {
if (charset == null) {
throw new IllegalArgumentException("'charset' cannot be null");
}
return this.entries.entrySet().stream().map(this::makeEntry).toArray(num -> new HeaderEntry[num]);
return this.entries.entrySet().stream().map(entry -> makeEntry(entry, charset)).toArray(HeaderEntry[]::new);
}

private HeaderEntry makeEntry(final Map.Entry<Integer, Object> entry) {
return makeEntry(entry, charset);
private HeaderEntry makeEntry(final Map.Entry<Integer, HeaderEntry> entry) {
return makeEntry(entry, this.charset);
}

/**
Expand All @@ -298,18 +303,18 @@ public HeaderEntry[] makeEntries() {
return makeEntries(StandardCharsets.UTF_8);
}

private static HeaderEntry makeEntry(final Map.Entry<Integer, Object> entry, final Charset charset) {
final Object val = entry.getValue();
final int tag = entry.getKey();
private static HeaderEntry makeEntry(final Map.Entry<Integer, HeaderEntry> entry, final Charset charset) {
return entry.getValue();
}

if (val instanceof HeaderEntry) {
return (HeaderEntry) val;
}
private static HeaderEntry makeEntry(int tag, Object val) {
return makeEntry(tag, val, StandardCharsets.UTF_8);
}

private static HeaderEntry makeEntry(int tag, Object val, Charset charset) {
// NULL

if (val == null) {
return new HeaderEntry(Type.NULL, tag, 0, null);
return new HeaderEntry(Type.NULL, tag, 0, null, val);
}

// FIXME: CHAR
Expand All @@ -318,7 +323,7 @@ private static HeaderEntry makeEntry(final Map.Entry<Integer, Object> entry, fin

if (val instanceof byte[]) {
final byte[] value = (byte[]) val;
return new HeaderEntry(Type.BYTE, tag, value.length, value);
return new HeaderEntry(Type.BYTE, tag, value.length, value, val);
}

// SHORT
Expand All @@ -332,7 +337,7 @@ private static HeaderEntry makeEntry(final Map.Entry<Integer, Object> entry, fin
buffer.putShort(v);
}

return new HeaderEntry(Type.SHORT, tag, value.length, data);
return new HeaderEntry(Type.SHORT, tag, value.length, data, val);
}

// INT
Expand All @@ -346,7 +351,7 @@ private static HeaderEntry makeEntry(final Map.Entry<Integer, Object> entry, fin
buffer.putInt(v);
}

return new HeaderEntry(Type.INT, tag, value.length, data);
return new HeaderEntry(Type.INT, tag, value.length, data, val);
}

// LONG
Expand All @@ -360,15 +365,15 @@ private static HeaderEntry makeEntry(final Map.Entry<Integer, Object> entry, fin
buffer.putLong(v);
}

return new HeaderEntry(Type.LONG, tag, value.length, data);
return new HeaderEntry(Type.LONG, tag, value.length, data, val);
}

// STRING

if (val instanceof String) {
final String value = (String) val;

return new HeaderEntry(Type.STRING, tag, 1, makeStringData(new ByteArrayOutputStream(), value, charset).toByteArray());
return new HeaderEntry(Type.STRING, tag, 1, makeStringData(new ByteArrayOutputStream(), value, charset).toByteArray(), val);
}

// BLOB
Expand All @@ -382,23 +387,23 @@ private static HeaderEntry makeEntry(final Map.Entry<Integer, Object> entry, fin
data = new byte[value.remaining()];
value.get(data);
}
return new HeaderEntry(Type.BLOB, tag, data.length, data);
return new HeaderEntry(Type.BLOB, tag, data.length, data, val);
}

// STRING_ARRAY

if (val instanceof String[]) {
final String[] value = (String[]) val;

return new HeaderEntry(Type.STRING_ARRAY, tag, value.length, makeStringsData(new ByteArrayOutputStream(), value, charset).toByteArray());
return new HeaderEntry(Type.STRING_ARRAY, tag, value.length, makeStringsData(new ByteArrayOutputStream(), value, charset).toByteArray(), val);
}

// I18N_STRING

if (val instanceof I18nString[]) {
final I18nString[] value = (I18nString[]) val;

return new HeaderEntry(Type.I18N_STRING, tag, value.length, makeStringsData(new ByteArrayOutputStream(), value, charset).toByteArray());
return new HeaderEntry(Type.I18N_STRING, tag, value.length, makeStringsData(new ByteArrayOutputStream(), value, charset).toByteArray(), val);
}

throw new IllegalArgumentException(String.format("Unable to process value type: %s", val.getClass()));
Expand Down Expand Up @@ -493,5 +498,4 @@ public static <E, T extends RpmBaseTag> void putLongFields(final Header<T> heade

header.putLong(tag, values);
}

}
Loading

0 comments on commit 7c62c8d

Please sign in to comment.