You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
yacy_search_server/source/net/yacy/interaction/Interaction.java

711 lines
18 KiB

package net.yacy.interaction;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import net.yacy.cora.document.UTF8;
import net.yacy.cora.lod.JenaTripleStore;
import net.yacy.cora.protocol.HeaderFramework;
import net.yacy.cora.protocol.RequestHeader;
import net.yacy.cora.protocol.http.HTTPClient;
import net.yacy.kelondro.blob.Tables.Row;
import net.yacy.kelondro.data.meta.DigestURI;
import net.yacy.kelondro.index.RowSpaceExceededException;
import net.yacy.kelondro.logging.Log;
import net.yacy.peers.Seed;
import net.yacy.search.Switchboard;
import org.apache.http.entity.mime.content.ContentBody;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.StmtIterator;
import de.anomic.data.UserDB;
public class Interaction {
// public static String GetInteractionData (String url) {
//
//
// // Fetch information from external sciencenet server
//
// // TODO: Use internal database
//
// Log.logInfo("INTERACTION", "GetInteractionData: "+url);
// try {
// return (UTF8.String(new HTTPClient().GETbytes("http://sciencenet.kit.edu/GetDomainInfoJSON?DomainURL="+url)));
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// return "";
// }
//
// }
public static String GetLoggedOnUser (RequestHeader requestHeader) {
UserDB.Entry entry = null;
String result = "anonymous";
entry = Switchboard.getSwitchboard().userDB.proxyAuth((requestHeader.get(RequestHeader.AUTHORIZATION, "xxxxxx")));
if(entry != null){
}else{
entry=Switchboard.getSwitchboard().userDB.cookieAuth(requestHeader.getHeaderCookies());
if(entry == null){
entry=Switchboard.getSwitchboard().userDB.ipAuth((requestHeader.get(HeaderFramework.CONNECTION_PROP_CLIENTIP, "xxxxxx")));
if(entry != null){
}
}
}
//identified via userDB
if(entry != null){
return entry.getUserName();
}else if(Switchboard.getSwitchboard().verifyAuthentication(requestHeader)){
return "staticadmin";
}
return "";
}
public static Set<String> GetUsers() {
Set<String> res = new HashSet<String>();
UserDB.Entry entry = null;
final Iterator<UserDB.Entry> it = Switchboard.getSwitchboard().userDB.iterator(true);
while (it.hasNext()) {
entry = it.next();
if (entry == null) {
continue;
}
res.add (entry.getUserName());
}
return res;
}
public static String GetDomain (String url) {
String domain = url;
try {
DigestURI uri = new DigestURI (url);
domain = uri.getHost();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return domain;
}
// public static boolean IsInBookmarks (String domain) {
//
//
// // TODO: Check if this bookmark exists
//
// Boolean result = false;
//
// DigestURI uri;
// try {
// uri = new DigestURI (domain);
//
// Bookmark b = Switchboard.getSwitchboard().bookmarksDB.getBookmark(UTF8.String(uri.hash()));
//
// if (!(b == null)) {
// result = true;
// }
//
//
// } catch (MalformedURLException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
// return result;
//
// }
// public static boolean SaveDomainVote (String domain, String vote) {
//
//
// // TODO: Check if this bookmark exists
//
// Boolean result = false;
//
// DigestURI uri;
// try {
// uri = new DigestURI (domain);
//
// Bookmark b = Switchboard.getSwitchboard().bookmarksDB.getBookmark(UTF8.String(uri.hash()));
//
// if (!(b == null)) {
// b.addTag(vote);
// Switchboard.getSwitchboard().bookmarksDB.saveBookmark(b);
// } else {
// Bookmark b2 = Switchboard.getSwitchboard().bookmarksDB.createBookmark(domain, "admin");
//
// b2.addTag(vote);
//
// Switchboard.getSwitchboard().bookmarksDB.saveBookmark(b2);
// }
//
//
// } catch (MalformedURLException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
// return result;
//
// }
// public static boolean DomainWhite (String domain, String username) {
//
//
// // Add userinteraction
//
// Boolean result = false;
//
//// Bookmark b = Interaction.Suggest(domain, username);
////
//// //
//
// return result;
//
// }
// public static Usercontribution DoUsercontribution(String domain, String uc,
// String username) {
//
// final Switchboard sb = Switchboard.getSwitchboard();
//
// Boolean existing = false;
//
// if (username == "") {
// username = "anonymous";
// }
//
// Usercontribution result = null;
//
// if (!existing) {
//
// Boolean reject = false;
//
//
//
//
// // count elements
// Iterator<String> it = sb.usercontributionsDB.getFeedbackitemsIterator(true);
//
// int count = 0;
// while(it.hasNext()) {
// it.next();
// count++;
// }
//
//
// if (count > 500) {
// if (username.equals("crawlbot")) {
// reject = true;
// }
//
// }
//
// if (!reject) {
//
// try {
//
// Usercontribution new_uc = Switchboard.getSwitchboard().usercontributionsDB
// .createUsercontribution(UUID.randomUUID().toString(),
// username);
// if (username.equals("anonymous")) {
// new_uc.setPublic(true);
// } else {
// new_uc.setPublic(false);
// }
//
// new_uc.setProperty(Usercontribution.feedbackitem_TITLE, username);
// new_uc.setProperty(Usercontribution.feedbackitem_DESCRIPTION, uc);
// new_uc.setProperty(Usercontribution.feedbackitem_TARGET, new DigestURI(domain).toNormalform(false, false));
//
// Switchboard.getSwitchboard().usercontributionsDB
// .saveUsercontribution(new_uc);
//
// result = new_uc;
//
// } catch (MalformedURLException e) {
//
// }
// }
//
// }
//
// return result;
//
// }
//public static String GetURLHash (String url) {
//
//
// // TODO: Check if this bookmark exists
//
// String result = "";
//
// DigestURI uri;
// try {
// uri = new DigestURI (url);
//
// result = UTF8.String(uri.hash());
//
//
//
// } catch (MalformedURLException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
// return result;
//
// }
public static String Suggest (String url, String username) {
final Switchboard sb = Switchboard.getSwitchboard();
if (username == "") {
username = "anonymous";
}
Boolean processlocal = false;
if (!sb.getConfig("interaction.suggest.accumulationpeer", "").equals("")) {
if (sb.getConfig("interaction.suggest.accumulationpeer", "").equals(sb.peers.myName())) {
// Our peer is meant to process the suggestion.
processlocal = true;
} else {
// Forward suggestion to other peer
Log.logInfo("INTERACTION", "Forwarding suggestion to "+sb.getConfig("interaction.suggest.accumulationpeer", "")+": " + url);
try {
Seed host = sb.peers.lookupByName(sb.getConfig("interaction.suggest.accumulationpeer", ""));
return (UTF8.String(new HTTPClient().POSTbytes(
"http://"+host.getPublicAddress()+"/interaction/Suggest.json"
+ "?url=" + url + "&username=" + username,
new HashMap<String, ContentBody>(), false)));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
if (processlocal) {
final String date = String.valueOf(System.currentTimeMillis());
final Map<String, byte[]> map = new HashMap<String, byte[]>();
map.put("url", url.getBytes());
map.put("username", username.getBytes());
map.put("status", "new".getBytes());
map.put("timestamp_creation", date.getBytes());
try {
sb.tables.insert("suggestion", map);
} catch (final IOException e) {
Log.logException(e);
} catch (RowSpaceExceededException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// TODO: Remove the following part for future use
Log.logInfo("INTERACTION", "Forwarding suggestion to bk: " + url);
try {
String reply = (UTF8.String(new HTTPClient().POSTbytes(
"http://hwiki.fzk.de/jss/SiteBookmark?suggestUrl=" + url+"&username="+username,
new HashMap<String, ContentBody>(), false)));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return "";
}
public static String Feedback(String url, String comment, String from, String peer) {
final Switchboard sb = Switchboard.getSwitchboard();
if (peer == "") {
peer = sb.peers.myName();
}
Boolean processlocal = false;
if (!sb.getConfig("interaction.feedback.accumulationpeer", "").equals("")) {
if (sb.getConfig("interaction.feedback.accumulationpeer", "").equals(sb.peers.myName())) {
// Our peer is meant to process the feedback.
processlocal = true;
} else {
// Forward feedback to other peer
Log.logInfo("INTERACTION", "Forwarding feedback to "+sb.getConfig("interaction.feedback.accumulationpeer", "")+": " + url + ": "
+ comment);
try {
Seed host = sb.peers.lookupByName(sb.getConfig("interaction.feedback.accumulationpeer", ""));
return (UTF8.String(new HTTPClient().POSTbytes(
"http://"+host.getPublicAddress()+"/interaction/Feedback.json"
+ "?url=" + url + "&comment=" + comment
+ "&from=" + from + "&peer=" + peer,
new HashMap<String, ContentBody>(), false)));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "";
}
}
}
if (processlocal) {
final String date = String.valueOf(System.currentTimeMillis());
final Map<String, byte[]> map = new HashMap<String, byte[]>();
map.put("url", url.getBytes());
map.put("username", from.getBytes());
map.put("peer", peer.getBytes());
map.put("status", "new".getBytes());
map.put("comment", comment.getBytes());
map.put("timestamp_creation", date.getBytes());
try {
sb.tables.insert("feedback", map);
} catch (final IOException e) {
Log.logException(e);
} catch (RowSpaceExceededException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// TODO: Remove the following part for future use
try {
return (UTF8.String(new HTTPClient().POSTbytes(
"http://sciencenet.kit.edu/Feedback?Url=" + url + "&Comment=" + comment
+ "&From=" + from + "&Peer=" + peer,
new HashMap<String, ContentBody>(), false)));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "";
}
}
return "";
}
public static String Contribution(String url, String value, String username, String peer) {
return Tableentry(url, "comment", value, username, peer);
}
public static String GetTableentry(String url, String type, String username, String peer) {
final Switchboard sb = Switchboard.getSwitchboard();
String retvalue = "";
try {
Iterator<Row> it = sb.tables.iterator(username+"_contribution", "url", url.getBytes());
Log.logInfo ("TABLE", "GET "+username+" / "+url+" - "+type+" ...");
it = sb.tables.orderBy(it, -1, "timestamp_creation").iterator();
while (it.hasNext()) {
Row r = it.next();
if (r.get("type", "").equals (type)) {
retvalue = r.get("value", "");
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.logInfo ("TABLE", "GET "+username+" / "+url+" - "+type+" - "+retvalue);
return retvalue;
}
public static String Tableentry(String url, String type, String comment, String from, String peer) {
final Switchboard sb = Switchboard.getSwitchboard();
if (peer == "") {
peer = sb.peers.myName();
}
Boolean processlocal = false;
Log.logInfo ("TABLE", "PUT "+from+" / "+url+" - "+type+" - "+comment);
if (!sb.getConfig("interaction.contribution.accumulationpeer", "").equals("")) {
if (sb.getConfig("interaction.contribution.accumulationpeer", "").equals(sb.peers.myName())) {
// Our peer is meant to process the feedback.
processlocal = true;
} else {
// Forward feedback to other peer
Log.logInfo("INTERACTION", "Forwarding contribution to "+sb.getConfig("interaction.contribution.accumulationpeer", "")+": " + url + ": "
+ comment);
try {
Seed host = sb.peers.lookupByName(sb.getConfig("interaction.contribution.accumulationpeer", ""));
return (UTF8.String(new HTTPClient().POSTbytes(
"http://"+host.getPublicAddress()+"/interaction/Contribution.json"
+ "?url=" + url + "&comment=" + comment
+ "&from=" + from + "&peer=" + peer,
new HashMap<String, ContentBody>(), false)));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "";
}
}
} else {
// No forward defined
processlocal = true;
}
if (processlocal) {
final String date = String.valueOf(System.currentTimeMillis());
final Map<String, byte[]> map = new HashMap<String, byte[]>();
map.put("url", url.getBytes());
map.put("username", from.getBytes());
map.put("peer", peer.getBytes());
map.put("status", "new".getBytes());
map.put("type", type.getBytes());
map.put("value", comment.getBytes());
map.put("timestamp_creation", date.getBytes());
try {
sb.tables.insert(from+"_contribution", map);
} catch (final IOException e) {
Log.logException(e);
} catch (RowSpaceExceededException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return "";
}
public static String Triple(String url, String s, String p, String o) {
return Triple (url, s, p, o, "");
}
public static String Triple(String url, String s, String p, String o, String username) {
if (username != "") {
username = "/"+username;
}
Resource r = JenaTripleStore.getResource(s+username);
Property pr = JenaTripleStore.getProperty(p);
JenaTripleStore.model.removeAll(r, pr, (Resource) null);
r.addProperty(pr, o);
Log.logInfo ("TRIPLElSTORE", "PUT "+username+" / "+s+" - "+p+" - "+o);
return "";
}
public static String TripleGet(String s, String p) {
return TripleGet (s, p, "");
}
public static String TripleGet(String s, String p, String username) {
if (username != "") {
username = "/"+username;
}
Resource r = JenaTripleStore.getResource(s+username);
Property pr = JenaTripleStore.getProperty(p);
StmtIterator iter = JenaTripleStore.model.listStatements(r, pr, (Resource) null);
Log.logInfo ("TRIPLESTORE", "GET "+username+" / "+s+" - "+p+" ... ");
while (iter.hasNext()) {
String obj = iter.nextStatement().getObject().toString();
Log.logInfo ("TRIPLESTORE", "GET "+username+" / "+s+" - "+p+" - "+obj);
return (obj);
}
return "";
}
public static String GetContribution(String url) {
final Switchboard sb = Switchboard.getSwitchboard();
// Boolean processlocal = false;
//
// if (!sb.getConfig("interaction.contribution.accumulationpeer", "").equals("")) {
//
// if (sb.getConfig("interaction.contribution.accumulationpeer", "").equals(sb.peers.myName())) {
//
// // Our peer is meant to process the feedback.
// processlocal = true;
//
// } else {
//
// // Forward feedback to other peer
// Log.logInfo("INTERACTION", "Fetching contribution from "+sb.getConfig("interaction.contribution.accumulationpeer", "")+": " + url);
//
// try {
//
// Seed host = sb.peers.lookupByName(sb.getConfig("interaction.contribution.accumulationpeer", ""));
//
// return (UTF8.String(new HTTPClient().POSTbytes(
// "http://"+host.getPublicAddress()+"/interaction/Contribution.json"
// + "?url=" + url + "&comment=" + comment
// + "&from=" + from + "&peer=" + peer,
// new HashMap<String, ContentBody>(), false)));
//
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
//
// return "";
// }
// }
// } else {
// // No forward defined
// processlocal = true;
// }
//
// if (processlocal) {
//
// final String date = String.valueOf(System.currentTimeMillis());
//
// final Map<String, byte[]> map = new HashMap<String, byte[]>();
//
// map.put("url", url.getBytes());
// map.put("username", from.getBytes());
// map.put("peer", peer.getBytes());
// map.put("status", "new".getBytes());
// map.put("comment", comment.getBytes());
// map.put("timestamp_creation", date.getBytes());
//
// try {
// sb.tables.insert("contribution", map);
// } catch (final IOException e) {
// Log.logException(e);
// } catch (RowSpaceExceededException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
return "";
}
//public static void Usertracking(String url) {
//
// final Switchboard sb = Switchboard.getSwitchboard();
//
// Log.logInfo("INTERACTION", "Usertracking "+url);
//
//
// // TOUCH: HIT +1 TO THE DOMAIN ENTRY
//
// try {
// sb.addToIndex(new DigestURI(new DigestURI(url).getHost()), null, null);
// sb.addToIndex(new DigestURI(url), null, null);
// } catch (MalformedURLException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (Failure e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
//}
}