package org.docear.plugin.services.features.documentretrieval.recommendations;
import javax.ws.rs.core.MultivaluedMap;
import org.docear.plugin.core.DocearController;
import org.docear.plugin.core.logging.DocearLogger;
import org.docear.plugin.services.ServiceController;
import org.docear.plugin.services.features.documentretrieval.DocumentRetrievalController;
import org.docear.plugin.services.features.documentretrieval.model.DocumentEntries;
import org.docear.plugin.services.features.documentretrieval.model.DocumentsModel;
import org.docear.plugin.services.features.documentretrieval.recommendations.actions.ShowRecommendationsAction;
import org.docear.plugin.services.features.documentretrieval.view.ServiceWindowListener;
import org.docear.plugin.services.features.io.DocearServiceResponse;
import org.docear.plugin.services.features.io.DocearServiceResponse.Status;
import org.docear.plugin.services.features.user.DocearUser;
import org.freeplane.core.ui.components.UITools;
import org.freeplane.core.util.LogUtils;
import org.freeplane.features.mode.Controller;
import com.sun.jersey.core.util.StringKeyStringValueIgnoreCaseMultivaluedMap;
public class RecommendationsController extends DocumentRetrievalController {
public final static RecommendationsController getController() {
if (controller == null) {
controller = new RecommendationsController();
}
if (controller instanceof RecommendationsController) {
return (RecommendationsController) controller;
}
else {
controller.closeDocumentView();
new ShowRecommendationsAction().actionPerformed(null);
return (RecommendationsController) controller;
}
}
public void startRecommendationsRequest() {
long lastShowTime = Controller.getCurrentController().getResourceController().getLongProperty("docear.recommendations.last_auto_show", 0);
DocearUser user = ServiceController.getCurrentUser();
if (((System.currentTimeMillis() - lastShowTime) > RECOMMENDATIONS_AUTOSHOW_INTERVAL) && user.isValid() && user.isRecommendationsEnabled()) {
LogUtils.info("automatically requesting recommendations");
UITools.getFrame().addWindowListener(new ServiceWindowListener());
synchronized (AUTO_RECOMMENDATIONS_LOCK) {
AUTO_RECOMMENDATIONS_LOCK = true;
}
new Thread() {
public void run() {
try {
DocumentEntries recommendations = RecommendationsController.getController().getNewDocuments(false);
if (recommendations.getDocumentEntries().isEmpty()) {
setAutoRecommendations(null);
}
else {
setAutoRecommendations(recommendations);
}
Controller.getCurrentController().getResourceController()
.setProperty("docear.recommendations.last_auto_show", Long.toString(System.currentTimeMillis()));
}
catch (Exception e) {
DocearLogger.warn("org.docear.plugin.services.ServiceController.startRecommendationsMode(): " + e.getMessage());
setAutoRecommendations(null);
}
synchronized (AUTO_RECOMMENDATIONS_LOCK) {
AUTO_RECOMMENDATIONS_LOCK = false;
}
}
}.start();
}
else {
setAutoRecommendations(null);
}
}
@Override
protected DocearServiceResponse getRequestResponse(boolean userRequest) {
MultivaluedMap<String, String> params = new StringKeyStringValueIgnoreCaseMultivaluedMap();
if (!userRequest) {
params.add("auto", "true");
}
return ServiceController.getConnectionController().get("/user/" + ServiceController.getCurrentUser().getName() + "/recommendations/documents", params);
}
@Override
public void refreshDocuments() {
initializeRecommendations();
refreshDocuments(null);
}
@Override
public void shutdown() {
}
@Override
public void sendReceiveConfirmation(final DocumentsModel model) {
DocearController.getController().getEventQueue().invoke(new Runnable() {
public void run() {
DocearServiceResponse resp = ServiceController.getConnectionController().put("user/"+ServiceController.getCurrentUser().getName()+"/recommendations/"+ String.valueOf(model.getSetId())+"/", null);
if(resp.getStatus() != Status.OK) {
DocearLogger.info(resp.getContentAsString());
}
}
});
}
}