001    package de.deepamehta.core.model;
002    
003    import org.codehaus.jettison.json.JSONException;
004    import org.codehaus.jettison.json.JSONObject;
005    
006    
007    
008    public class RelatedTopicModel extends TopicModel {
009    
010        // ---------------------------------------------------------------------------------------------- Instance Variables
011    
012        private AssociationModel relatingAssoc;
013    
014        // ---------------------------------------------------------------------------------------------------- Constructors
015    
016        public RelatedTopicModel(long topicId) {
017            super(topicId);
018            this.relatingAssoc = new AssociationModel();
019        }
020    
021        public RelatedTopicModel(long topicId, AssociationModel relatingAssoc) {
022            super(topicId);
023            this.relatingAssoc = relatingAssoc;
024        }
025    
026        public RelatedTopicModel(String topicUri) {
027            super(topicUri, (String) null);     // topicTypeUri=null
028            this.relatingAssoc = new AssociationModel();
029        }
030    
031        public RelatedTopicModel(String topicUri, AssociationModel relatingAssoc) {
032            super(topicUri, (String) null);     // topicTypeUri=null
033            this.relatingAssoc = relatingAssoc;
034        }
035    
036        public RelatedTopicModel(String topicTypeUri, SimpleValue value) {
037            super(topicTypeUri, value);
038            this.relatingAssoc = new AssociationModel();
039        }
040    
041        public RelatedTopicModel(String topicTypeUri, ChildTopicsModel childTopics) {
042            super(topicTypeUri, childTopics);
043            this.relatingAssoc = new AssociationModel();
044        }
045    
046        public RelatedTopicModel(TopicModel topic) {
047            super(topic);
048            this.relatingAssoc = new AssociationModel();
049        }
050    
051        public RelatedTopicModel(TopicModel topic, AssociationModel relatingAssoc) {
052            super(topic);
053            this.relatingAssoc = relatingAssoc;
054        }
055    
056        // -------------------------------------------------------------------------------------------------- Public Methods
057    
058        public AssociationModel getRelatingAssociation() {
059            return relatingAssoc;
060        }
061    
062        // === Serialization ===
063    
064        @Override
065        public JSONObject toJSON() {
066            try {
067                JSONObject o = super.toJSON();
068                // Note: the relating association might be uninitialized and thus not serializable.
069                // This is the case at least for enrichments which have no underlying topics (e.g. timestamps).
070                // ### TODO: remodel enrichments? Don't put them in a child topics model but in a proprietary field?
071                if (relatingAssoc.getRoleModel1() != null) {
072                    o.put("assoc", relatingAssoc.toJSON());
073                }
074                //
075                return o;
076            } catch (Exception e) {
077                throw new RuntimeException("Serialization failed (" + this + ")", e);
078            }
079        }
080    
081        // === Java API ===
082    
083        @Override
084        public RelatedTopicModel clone() {
085            try {
086                return (RelatedTopicModel) super.clone();
087            } catch (Exception e) {
088                throw new RuntimeException("Cloning a RelatedTopicModel failed", e);
089            }
090        }
091    
092        @Override
093        public String toString() {
094            return super.toString() + ", relating " + relatingAssoc;
095        }
096    }