You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
udi-wms-java/src/main/java/com/glxp/api/util/gs1/Gs1128Decoder.java

58 lines
1.7 KiB
Java

package com.glxp.api.util.gs1;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;
import java.util.*;
import java.util.function.Function;
/**
* @author guilherme.pacheco
*/
public final class Gs1128Decoder {
private final Collection<AI> ais;
Gs1128Decoder(Collection<AI> ais) {
this.ais = ais;
}
public Map<AI, String> decode(final String barcode) {
validateBarcode(barcode);
String barcodeValue = StringUtils.remove(barcode, Gs1128Utils.PREFIX);
return extract(barcodeValue);
}
private Map<AI, String> extract(String barcode) {
final Iterator<Character> iterator = Gs1128Utils.iterator(barcode);
final Map<AI, String> result = new WeakHashMap<>(4);
StringBuilder builder = new StringBuilder();
while (iterator.hasNext()) {
builder.append(iterator.next());
Optional<Map<AI, String>> mapAi = mapAi(iterator, builder.toString());
if (mapAi.isPresent()) {
result.putAll(mapAi.get());
builder = new StringBuilder();
}
}
return result;
}
private Optional<Map<AI, String>> mapAi(Iterator<Character> iterator, String builder) {
return ais.stream().filter(v -> v.getCode().equals(builder)).findFirst().map(aiValue(iterator));
}
private Function<AI, Map<AI, String>> aiValue(Iterator<Character> iterator) {
return ai -> {
String value = Gs1128Utils.value(ai, iterator);
return Map.of(ai, value);
};
}
private void validateBarcode(String barcode) {
Validate.notBlank(barcode, "Barcode cannot be blank");
Validate.isTrue(StringUtils.startsWith(barcode, Gs1128Utils.PREFIX), "Barcode must start with prefix Gs1-128 \"]C1\"");
}
}