/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.cxf.jaxrs.impl; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Locale; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Variant; import javax.ws.rs.core.Variant.VariantListBuilder; public class VariantListBuilderImpl extends VariantListBuilder { private List<String> encodings = new ArrayList<>(); private List<Locale> languages = new ArrayList<>(); private List<MediaType> mediaTypes = new ArrayList<>(); private List<Variant> variants = new ArrayList<>(); public VariantListBuilderImpl() { } @Override public VariantListBuilder add() { addVariants(); resetMeta(); return this; } @Override public List<Variant> build() { List<Variant> vs = new ArrayList<>(variants); reset(); return vs; } @Override public VariantListBuilder encodings(String... encs) { encodings.addAll(Arrays.asList(encs)); return this; } @Override public VariantListBuilder mediaTypes(MediaType... types) { mediaTypes.addAll(Arrays.asList(types)); return this; } private void reset() { variants.clear(); resetMeta(); } private void resetMeta() { mediaTypes.clear(); languages.clear(); encodings.clear(); } private void addVariants() { if (!mediaTypes.isEmpty()) { handleMediaTypes(); } else if (!languages.isEmpty()) { handleLanguages(null); } else if (!encodings.isEmpty()) { for (String enc : encodings) { variants.add(new Variant(null, (Locale)null, enc)); } } } private void handleMediaTypes() { for (MediaType type : mediaTypes) { if (!languages.isEmpty()) { handleLanguages(type); } else if (!encodings.isEmpty()) { for (String enc : encodings) { variants.add(new Variant(type, (Locale)null, enc)); } } else { variants.add(new Variant(type, (Locale)null, null)); } } } private void handleLanguages(MediaType type) { for (Locale lang : languages) { if (!encodings.isEmpty()) { for (String enc : encodings) { variants.add(new Variant(type, lang, enc)); } } else { variants.add(new Variant(type, lang, null)); } } } @Override public VariantListBuilder languages(Locale... ls) { languages.addAll(Arrays.asList(ls)); return this; } }