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 ais; Gs1128Decoder(Collection ais) { this.ais = ais; } public Map decode(final String barcode) { validateBarcode(barcode); String barcodeValue = StringUtils.remove(barcode, Gs1128Utils.PREFIX); return extract(barcodeValue); } private Map extract(String barcode) { final Iterator iterator = Gs1128Utils.iterator(barcode); final Map result = new WeakHashMap<>(4); StringBuilder builder = new StringBuilder(); while (iterator.hasNext()) { builder.append(iterator.next()); Optional> mapAi = mapAi(iterator, builder.toString()); if (mapAi.isPresent()) { result.putAll(mapAi.get()); builder = new StringBuilder(); } } return result; } private Optional> mapAi(Iterator iterator, String builder) { return ais.stream().filter(v -> v.getCode().equals(builder)).findFirst().map(aiValue(iterator)); } private Function> aiValue(Iterator 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\""); } }