/******************************************************************************* * Copyright (c) 2012-2016 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.everrest.core.impl; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Variant; import javax.ws.rs.core.Variant.VariantListBuilder; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Locale; import static com.google.common.base.Preconditions.checkState; /** * See {@link VariantListBuilder}. */ public class VariantListBuilderImpl extends VariantListBuilder { /** Languages. */ private final List<Locale> languages; /** Encodings. */ private final List<String> encodings; /** Media Types. */ private final List<MediaType> mediaTypes; /** List of {@link Variant}. */ private List<Variant> variants; public VariantListBuilderImpl() { languages = new ArrayList<>(); encodings = new ArrayList<>(); mediaTypes = new ArrayList<>(); } @Override public VariantListBuilder add() { checkState(!(mediaTypes.isEmpty() && languages.isEmpty() && encodings.isEmpty()), "At least one media type, language or encoding must be set"); if (variants == null) { variants = new ArrayList<>(); } Iterator<MediaType> mediaTypesIterator = mediaTypes.iterator(); do { MediaType mediaType = mediaTypesIterator.hasNext() ? mediaTypesIterator.next() : null; Iterator<Locale> languagesIterator = languages.iterator(); do { Locale language = languagesIterator.hasNext() ? languagesIterator.next() : null; Iterator<String> encodingsIterator = encodings.iterator(); do { String encoding = encodingsIterator.hasNext() ? encodingsIterator.next() : null; variants.add(new Variant(mediaType, language, encoding)); } while (encodingsIterator.hasNext()); } while (languagesIterator.hasNext()); } while (mediaTypesIterator.hasNext()); clearAll(); return this; } @Override public List<Variant> build() { if (mediaTypes.isEmpty() && languages.isEmpty() && encodings.isEmpty()) { if (variants == null) { variants = new ArrayList<>(); } } else { add(); } return variants; } @Override public VariantListBuilder encodings(String... encodings) { if (encodings != null) { Collections.addAll(this.encodings, encodings); } return this; } @Override public VariantListBuilder languages(Locale... languages) { if (languages != null) { Collections.addAll(this.languages, languages); } return this; } @Override public VariantListBuilder mediaTypes(MediaType... mediaTypes) { if (mediaTypes != null) { Collections.addAll(this.mediaTypes, mediaTypes); } return this; } /** Reset builder to default state. */ private void clearAll() { mediaTypes.clear(); languages.clear(); encodings.clear(); } }