package eu.europeana.cloud.service.commons.urls; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; public class UrlBuilder { private Map<UrlPart, String> parts; private Set<ValuedUrlPart> partsToInclude = new HashSet<>(); UrlBuilder(Map<UrlPart, String> parts) { partsToInclude = new HashSet<>(); partsToInclude.add(new ValuedUrlPart(UrlPart.CONTEXT, true)); this.parts = parts; } public UrlBuilder clear() { partsToInclude = new HashSet<>(); partsToInclude.add(new ValuedUrlPart(UrlPart.CONTEXT, true)); return this; } public UrlBuilder withCloudID() { partsToInclude.add(new ValuedUrlPart(UrlPart.RECORDS, true)); return this; } public UrlBuilder withRepresentation() { partsToInclude.add(new ValuedUrlPart(UrlPart.REPRESENTATIONS, true)); return this; } public UrlBuilder withVersion() { partsToInclude.add(new ValuedUrlPart(UrlPart.VERSIONS, true)); return this; } public UrlBuilder withVersionWithoutValue() { partsToInclude.add(new ValuedUrlPart(UrlPart.VERSIONS, false)); return this; } public UrlBuilder withDataProvider() { partsToInclude.add(new ValuedUrlPart(UrlPart.DATA_PROVIDERS, true)); return this; } public UrlBuilder withDataSet() { partsToInclude.add(new ValuedUrlPart(UrlPart.DATA_SETS, true)); return this; } public UrlBuilder withDataSetWithoutValue() { partsToInclude.add(new ValuedUrlPart(UrlPart.DATA_SETS, false)); return this; } public String build() throws UrlBuilderException { String result = ""; for (Map.Entry<UrlPart, String> entry : parts.entrySet()) { ValuedUrlPart key = new ValuedUrlPart(entry.getKey(), true); String value = entry.getValue(); if (shouldBeIncludedInResult(entry.getKey())) { ValuedUrlPart currentPart = removeFromPartsToInclude(entry.getKey()); // if (currentPart.isAddValue()) { if (value != null) { if("".equals(key.getPart().getValue())){ result += "/" + value; }else{ result += "/" + key.getPart().getValue() + "/" + value; } } else { throw new UrlBuilderException("Value for: " + key + " is empty"); } } else { result += "/" + key.getPart().getValue(); } } } if (partsToInclude.size() > 0) { String errorMessage = createErrorMessage(partsToInclude); throw new UrlBuilderException("Missing parts for given request: " + errorMessage); } return result; } private boolean shouldBeIncludedInResult(UrlPart urlPart) { Iterator<ValuedUrlPart> it = partsToInclude.iterator(); while (it.hasNext()) { if (it.next().getPart().equals(urlPart)) { return true; } } return false; } private ValuedUrlPart removeFromPartsToInclude(UrlPart urlPart) { Iterator<ValuedUrlPart> it = partsToInclude.iterator(); while (it.hasNext()) { ValuedUrlPart currentPart = it.next(); if (currentPart.getPart().equals(urlPart)) { it.remove(); return currentPart; } } return null; } private String createErrorMessage(Set<ValuedUrlPart> leftParts){ String result = ""; for (ValuedUrlPart leftPart : leftParts) { result += leftPart.getPart() + " "; } return result; } } /** * Stores url part with information if value of this part should be displayed */ class ValuedUrlPart { private UrlPart part; private boolean addValue; public ValuedUrlPart(UrlPart part, boolean addValue) { this.part = part; this.addValue = addValue; } public UrlPart getPart() { return part; } public boolean isAddValue() { return addValue; } }