/**
*
*/
package org.topicquests.topicmap.json.model;
import java.util.*;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
//import org.json.simple.JSONObject;
//import org.json.simple.parser.JSONParser;
import org.topicquests.common.ResultPojo;
import org.topicquests.common.api.ICoreIcons;
import org.topicquests.common.api.INodeTypes;
import org.topicquests.common.api.IResult;
import org.topicquests.common.api.ITopicQuestsOntology;
import org.topicquests.model.TicketPojo;
import org.topicquests.model.api.IEnvironment;
import org.topicquests.model.api.node.INode;
import org.topicquests.model.api.node.INodeModel;
import org.topicquests.model.api.ITicket;
import org.topicquests.persist.json.api.IJSONDocStoreModel;
import org.topicquests.topicmap.json.model.api.IJSONTopicDataProvider;
import org.topicquests.topicmap.json.model.api.IJSONTopicMapOntology;
import org.topicquests.topicmap.json.model.api.ISocialBookmarkLegend;
import org.topicquests.topicmap.json.model.api.ISocialBookmarkModel;
import org.topicquests.model.Node;
import net.minidev.json.JSONObject;
import net.minidev.json.parser.JSONParser;
/**
* @author park
*
*/
public class SocialBookmarkModel implements ISocialBookmarkModel {
private final String TAG_SUFFIX = "_TAG";
private JSONTopicmapEnvironment environment;
private IJSONTopicDataProvider database;
private IJSONDocStoreModel jsonModel;
private INodeModel nodeModel;
private ITicket credentials;
// private JSONParser parser;
private final String
//defined in jsonblobstore-props.xml
TOPIC_INDEX = IJSONTopicMapOntology.TOPIC_INDEX,
CORE_TYPE = IJSONTopicMapOntology.CORE_TYPE;
/**
*
*/
public SocialBookmarkModel(JSONTopicmapEnvironment env) {
environment = env;
database = (IJSONTopicDataProvider)environment.getDataProvider();
nodeModel = database.getNodeModel();
jsonModel = environment.getJSONModel();
// parser = new JSONParser();
//We assume all tags are public, so any credentials will work
credentials = new TicketPojo(ITopicQuestsOntology.SYSTEM_USER);
}
/* (non-Javadoc)
* @see org.topicquests.topicmap.json.model.api.ISocialBookmarkModel#init(org.topicquests.model.api.IEnvironment)
*/
@Override
public IResult init(IEnvironment env) {
// TODO Not used
return null;
}
/* (non-Javadoc)
* @see org.topicquests.topicmap.json.model.api.ISocialBookmarkModel#bookmark(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.util.List)
*/
@Override
public IResult bookmark(String url, String title, String details,
String language, String userId, List<String> tags) {
IResult result = new ResultPojo();
INode theBookmark = null;
//See if the bookmark already exists:
BoolQueryBuilder qba = QueryBuilders.boolQuery();
QueryBuilder qb1 = QueryBuilders.termQuery(ITopicQuestsOntology.INSTANCE_OF_PROPERTY_TYPE, INodeTypes.BOOKMARK_TYPE);
QueryBuilder qb2 = QueryBuilders.termQuery(ITopicQuestsOntology.RESOURCE_URL_PROPERTY, url);
qba.must(qb1);
qba.must(qb2);
environment.logDebug("SocialBookmarkModel.bookmark- "+qba.toString());
IResult r = jsonModel.runQuery(TOPIC_INDEX, qba, 0, -1, CORE_TYPE);
if (r.hasError())
result.addErrorString(r.getErrorString());
environment.logDebug("SocialBookmarkModel.bookmark-1 "+r.getResultObject());
if (r.getResultObject() != null && !((List<String>)r.getResultObject()).isEmpty()) {
List<String>json = (List<String>)r.getResultObject();
System.out.println("BOOKMARKS "+json);
if (json != null && !json.isEmpty()) {
try {
JSONObject jo = (JSONObject)new JSONParser(JSONParser.MODE_JSON_SIMPLE).parse(json.get(0));
theBookmark = new Node(jo);
} catch (Exception e) {
result.addErrorString(e.getMessage());
environment.logError(e.getMessage(), e);
}
}
} else {
String t = title;
if (t == null || t.equals(""))
t = "Bookmark for "+url;
theBookmark = nodeModel.newInstanceNode(INodeTypes.BOOKMARK_TYPE, t, details, language, userId, ICoreIcons.BOOKMARK_SM, ICoreIcons.BOOKMARK, false);
environment.logDebug("SocialBookmarkModel.bookmark-2 "+qba.toString());
database.putNode(theBookmark, true);
}
result.setResultObject(theBookmark);
environment.logDebug("SocialBookmarkModel.bookmark-3 "+theBookmark.toJSON());
INode tag;
INode user;
r = database.getNode(userId, credentials);
if (r.hasError())
result.addErrorString(r.getErrorString());
user = (INode)r.getResultObject();
environment.logDebug("SocialBookmarkModel.bookmark-4 "+theBookmark.toJSON());
String theTuple;
if (tags != null && !tags.isEmpty()) {
Iterator<String>itr = tags.iterator();
r = getOrCreateTag(itr.next(),language,userId);
if (r.hasError())
result.addErrorString(r.getErrorString());
if (r.getResultObject() != null) {
tag = (INode)r.getResultObject();
//NOW time to wire relations
//relateExistingNodes(INode sourceNode, INode targetNode, String relationTypeLocator,
//String userId, String smallImagePath, String largeImagePath, boolean isTransclude, boolean isPrivate);
//Tag/Bookmark
environment.logDebug("SocialBookmarkModel.bookmark-5 "+tag+" "+theBookmark);
r = nodeModel.relateExistingNodes(tag, theBookmark, ISocialBookmarkLegend.TAG_BOOKMARK_RELATION_TYPE, userId, ICoreIcons.RELATION_ICON_SM, ICoreIcons.RELATION_ICON, false, false);
if (r.hasError())
result.addErrorString(r.getErrorString());
theTuple = (String)r.getErrorString();
//Tag/User
environment.logDebug("SocialBookmarkModel.bookmark-6 "+tag+" "+user);
nodeModel.relateExistingNodes(tag, user, ISocialBookmarkLegend.TAG_USER_RELATION_TYPE, userId, ICoreIcons.RELATION_ICON_SM, ICoreIcons.RELATION_ICON, false, false);
if (r.hasError())
result.addErrorString(r.getErrorString());
}
}
//user/bookmark
r = nodeModel.relateExistingNodes(user, theBookmark, ISocialBookmarkLegend.USER_BOOKMARK_RELATIONTYPE, userId, ICoreIcons.RELATION_ICON_SM, ICoreIcons.RELATION_ICON, false, false);
if (r.hasError())
result.addErrorString(r.getErrorString());
return result;
}
/* (non-Javadoc)
* @see org.topicquests.topicmap.json.model.api.ISocialBookmarkModel#formTagLocator(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.util.List)
*/
@Override
public String formTagLocator(String tag) {
String result = tag;
result = result.replaceAll(" ", "_");
return result+TAG_SUFFIX;
}
/**
* <p>Find the {@link INode} for this <code>tag</code>. If it doesn't
* exist, create it.</p>
* @param tag
* @param lang
* @param userId
* @return
*/
private IResult getOrCreateTag(String tag, String lang, String userId) {
String lox = formTagLocator(tag);
IResult result = database.getNode(lox, credentials);
if (result.getResultObject() == null) {
//newInstanceNode(String locator,String typeLocator,String label, String description,
// String lang, String userId, String smallImagePath, String largeImagePath, boolean isPrivate);
INode n = nodeModel.newInstanceNode(lox, INodeTypes.TAG_TYPE, tag, "A tag with the label: "+tag, lang, userId, ICoreIcons.TAG_SM, ICoreIcons.TAG, false);
database.putNode(n, true);
result.setResultObject(n);
}
environment.logDebug("SocialBookmarkModel.getOrCreateTag+ "+result.getResultObject());
return result;
}
}