001    package de.deepamehta.plugins.facets.model;
002    
003    import de.deepamehta.core.model.ChildTopicsModel;
004    import de.deepamehta.core.model.RelatedTopicModel;
005    
006    import org.codehaus.jettison.json.JSONObject;
007    
008    import 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     */
016    public 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    }