001package de.deepamehta.plugins.facets.model;
002
003import de.deepamehta.core.model.ChildTopicsModel;
004import de.deepamehta.core.model.RelatedTopicModel;
005
006import org.codehaus.jettison.json.JSONObject;
007
008import java.util.List;
009
010
011
012/**
013 * A facet value as used in update facet calls.
014 * Used for both, single-valued facets and multiple-valued facets.
015 */
016public class FacetValue extends ChildTopicsModel {
017
018    private String childTypeUri;
019
020    // ---------------------------------------------------------------------------------------------------- Constructors
021
022    public FacetValue(String childTypeUri) {
023        this.childTypeUri = childTypeUri;
024    }
025
026    public FacetValue(JSONObject obj) {
027        super(obj);
028        try {
029            if (size() != 1) {
030                throw new RuntimeException("There are " + size() + " child type entries (expected is 1)");
031            }
032            //
033            this.childTypeUri = iterator().next();
034        } catch (Exception e) {
035            throw new RuntimeException("Parsing FacetValue failed (JSONObject=" + obj + ")", e);
036        }
037    }
038
039    // -------------------------------------------------------------------------------------------------- Public Methods
040
041    // === Single-valued Facets ===
042
043    /**
044     * Accesses a single-valued facet.
045     */
046    public RelatedTopicModel getTopic() {
047        return getTopic(childTypeUri);
048    }
049
050    /**
051     * Accesses a multiple-valued facet.
052     */
053    public List<RelatedTopicModel> getTopics() {
054        return getTopics(childTypeUri);
055    }
056
057    // ---
058
059    /**
060     * Puts a value in a single-valued facet.
061     */
062    public FacetValue put(RelatedTopicModel value) {
063        return (FacetValue) put(childTypeUri, value);
064    }
065
066    // ---
067
068    /**
069     * Convenience method to put a *simple* value in a single-valued facet.
070     */
071    public FacetValue put(Object value) {
072        return (FacetValue) put(childTypeUri, value);
073    }
074
075    /**
076     * Convenience method to put a *composite* value in a single-valued facet.
077     */
078    public FacetValue put(ChildTopicsModel value) {
079        return (FacetValue) put(childTypeUri, value);
080    }
081
082    // ---
083
084    /**
085     * Puts a by-ID topic reference in a single-valued facet.
086     */
087    public FacetValue putRef(long refTopicId) {
088        return (FacetValue) putRef(childTypeUri, refTopicId);
089    }
090
091    /**
092     * Puts a by-URI topic reference in a single-valued facet.
093     */
094    public FacetValue putRef(String refTopicUri) {
095        return (FacetValue) putRef(childTypeUri, refTopicUri);
096    }
097
098    // === Multiple-valued Facets ===
099
100    /**
101     * Sets the values of a multiple-valued facet.
102     */
103    public FacetValue put(List<RelatedTopicModel> values) {
104        return (FacetValue) put(childTypeUri, values);
105    }
106
107    // ---
108
109    /**
110     * Adds a by-ID topic reference to a multiple-valued facet.
111     */
112    public FacetValue addRef(long refTopicId) {
113        return (FacetValue) addRef(childTypeUri, refTopicId);
114    }
115
116    /**
117     * Adds a by-URI topic reference to a multiple-valued facet.
118     */
119    public FacetValue addRef(String refTopicUri) {
120        return (FacetValue) addRef(childTypeUri, refTopicUri);
121    }
122
123    // ---
124
125    /**
126     * Adds a by-ID topic deletion reference to a multiple-valued facet.
127     */
128    public FacetValue addDeletionRef(long refTopicId) {
129        return (FacetValue) addDeletionRef(childTypeUri, refTopicId);
130    }
131}