/*******************************************************************************
* 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.wink.common.categories;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.ws.rs.core.MultivaluedMap;
import org.apache.wink.common.model.atom.AtomCategory;
/**
* The Atom Publishing Protocol introduces the notion of a "Category Document"
* and the app:categories element. These are used to provide a listing of
* atom:Category elements that may be used with the members of an Atom
* Publishing Protocol collection.
*/
public class Categories {
/**
* The app:categories "scheme" attribute is an IRI that identifies a
* categorization scheme. <h4>NOTE</h4> An atom:category child element that
* has no "scheme" attribute inherits the attribute from its app:categories
* parent.
*/
private String scheme;
/**
* The app:categories element MAY contain an "href" attribute, whose value
* MUST be an IRI reference identifying a Category Document
*/
private String href;
/**
* The app:categories element can contain a "fixed" attribute, with a value
* of either "yes" or "no", indicating whether the list of categories is a
* fixed or an open set. The absence of the "fixed" attribute is equivalent
* to the presence of a "fixed" attribute with a value of "no".
*/
private boolean isFixed;
/**
* List of atom:category elements. <h4>NOTE</h4> An app:categories element
* can contain zero or more atom:category elements from the Atom Syndication
* Format [RFC4287] namespace ("http://www.w3.org/2005/Atom"). An
* atom:category child element that has no "scheme" attribute inherits the
* attribute from its app:categories parent. An atom:category child element
* with an existing "scheme" attribute does not inherit the "scheme" value
* of its app:categories parent element.
*/
private List<AtomCategory> categories;
/**
* Class that will provide Categories Document
*/
private Class<?> handlingClass;
/**
* Instance that will provide Categories Document
*/
private Object handlingInstance;
/**
* Uri parameters for handling Resource
*/
private MultivaluedMap<String, String> templateParams;
/**
* Constructor
*
* @param categories
*/
public Categories(List<AtomCategory> categories) {
this.categories = categories;
isFixed = false;
}
/**
* Constructor
*
* @param categories
*/
public Categories() {
this.categories = new ArrayList<AtomCategory>();
isFixed = false;
}
/**
* When contained within an app:collection element, the app:categories
* element can have an href attribute whose value MUST point to an Atompub
* Categories Document.
*
* @return The href attribute value
*/
public String getHref() {
return href;
}
/**
* Sets the value of the href attribute.
*
* @param href The location of an Atompub Categories Document
*/
public Categories setHref(String href) {
this.href = href;
// Clear previous setting (in case other setHref() was called)
this.handlingClass = null;
this.templateParams = null;
this.handlingInstance = null;
return this;
}
/**
* Set Resource class that will generate Categories Document
*
* @param handlingClass Resource Class
* @param templateParams Map of URI variable names and their values
*/
public void setHref(Class<?> handlingClass, MultivaluedMap<String, String> templateParams) {
this.handlingClass = handlingClass;
this.templateParams = templateParams;
// Clear previous setting (in case other setHref() was called)
this.handlingInstance = null;
this.href = null;
}
/**
* Set Resource that will generate Categories Document
*
* @param handlingInstance Resource instance
* @param templateParams Map of URI variable names and their values
*/
public void setHref(Object handlingInstance, MultivaluedMap<String, String> templateParams) {
this.handlingInstance = handlingInstance;
this.templateParams = templateParams;
// Clear previous setting (in case other setHref() was called)
this.handlingClass = null;
this.href = null;
}
/**
* If an app:categories element is marked as fixed, then the set of
* atom:Category elements is considered to be a closed set. That is, Atom
* Publishing Protocol clients SHOULD only use the atom:Category elements
* listed. The default is false (fixed="no")
*
* @return True if the categories listing is fixed
*/
public boolean isFixed() {
return isFixed;
}
/**
* Sets whether or not this is a fixed listing of categories. If set to
* false, the fixed attribute will be removed from the app:categories
* element.
*
* @param fixed True if the app:categories listing is fixed
*/
public Categories setFixed(boolean fixed) {
isFixed = fixed;
return this;
}
/**
* The app:categories element may specify a default scheme attribute for
* listed atom:Category elements that do not have their own scheme
* attribute.
*
* @return The scheme String
*/
public String getScheme() {
return scheme;
}
/**
* Sets the default scheme for this listing of categories
*
* @param scheme The default scheme used for this listing of categories
*/
public Categories setScheme(String scheme) {
this.scheme = scheme;
return this;
}
/**
* Lists the complete set of categories
*
* @return This app:categories listing of atom:Category elements
*/
public List<AtomCategory> getCategories() {
return Collections.unmodifiableList(categories);
}
/**
* Lists the complete set of categories that use the specified scheme
*
* @param scheme The String of an atom:Category scheme
* @return A listing of atom:Category elements that use the specified scheme
*/
public List<AtomCategory> getCategories(String scheme) {
List<AtomCategory> newcats = new ArrayList<AtomCategory>();
for (AtomCategory cat : categories) {
if (cat.getScheme().endsWith(scheme)) {
newcats.add(cat);
}
}
return Collections.unmodifiableList(newcats);
}
/**
* Add an atom:Category to the listing
*
* @param Category The atom:Category to add to the listing
*/
public Categories addCategory(AtomCategory category) {
categories.add(category);
return this;
}
/**
* Create and add an atom:Category to the listing
*
* @param term The string term
* @return The newly created atom:Category
*/
public AtomCategory addCategory(String term) {
AtomCategory newCategory = new AtomCategory();
newCategory.setTerm(term);
categories.add(newCategory);
return newCategory;
}
/**
* Create an add an atom:Category to the listing
*
* @param scheme The scheme String for the newly created Category
* @param term The string term
* @param label The human readable label for the Category
* @return The newly created atom:Category
*/
public AtomCategory addCategory(String scheme, String term, String label) {
AtomCategory newCategory = new AtomCategory();
newCategory.setScheme(scheme);
newCategory.setTerm(term);
newCategory.setLabel(label);
categories.add(newCategory);
return null;
}
/**
* Returns true if this app:categories listing contains a Category with the
* specified term
*
* @param term The term to look for
* @return True if the term is found
*/
public boolean contains(String term) {
return contains(term, null);
}
/**
* Returns true if this app:categories listing contains a Category with the
* specified term and scheme
*
* @param term The term to look for
* @param scheme The String scheme
* @return True if the term and scheme are found
*/
public boolean contains(String term, String scheme) {
String catscheme = getScheme();
String searchScheme = (scheme != null) ? scheme : catscheme;
for (AtomCategory category : categories) {
String t = category.getTerm();
String s = (category.getScheme() != null) ? category.getScheme() : catscheme;
if (t.equals(term) && ((searchScheme != null) ? searchScheme.equals(s) : s == null))
return true;
}
return false;
}
/**
* Returns true if the href attribute is set
*/
public boolean isOutOfLine() {
boolean answer = false;
if (getHref() != null || handlingClass != null || handlingInstance != null) {
answer = true;
} else {
answer = false;
}
return answer;
}
/**
* Get Categories Document handling Resource class
*
* @return Resource class
*/
public Class<?> getHandlingClass() {
return handlingClass;
}
/**
* Set a list of categories
*
* @param categories
*/
public void setCategories(List<AtomCategory> categories) {
this.categories = categories;
}
/**
* Get handling Bean for Categories Document
*
* @return handlingBean
*/
public Object getHandlingInstance() {
return handlingInstance;
}
/**
* Get Uri Template Variables
*
* @return templateParams
*/
public MultivaluedMap<String, String> getTemplateParameters() {
return templateParams;
}
/**
* Set Uri Template Variables
*
* @param templateParams
*/
public void setTemplateParameters(MultivaluedMap<String, String> templateParams) {
this.templateParams = templateParams;
}
}