package org.evolved.core.shared; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.net.ssl.SSLContext; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.StatusLine; import org.apache.http.client.HttpClient; import org.apache.http.client.config.CookieSpecs; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPut; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.io.EmptyInputStream; import org.apache.http.ssl.SSLContextBuilder; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.openedit.Data; import org.openedit.OpenEditException; import org.openedit.data.BaseSearcher; import org.openedit.data.PropertyDetail; import org.openedit.data.PropertyDetails; import org.openedit.data.Searcher; import org.openedit.hittracker.HitTracker; import org.openedit.hittracker.SearchQuery; import org.openedit.users.User; public class RemoteEntermediaSearcher extends BaseSearcher implements Searcher { protected HttpClient fieldHttpClient; private static final Log log = LogFactory.getLog(RemoteEntermediaSearcher.class); protected PropertyDetails fieldPropertyDetails; public HttpClient getSharedClient() { if (fieldHttpClient == null) { try { SSLContext sslContext; sslContext = SSLContextBuilder.create().useProtocol("TLSv1.2").build(); RequestConfig globalConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.DEFAULT).setConnectTimeout(15 * 1000).setSocketTimeout(120 * 1000).build(); fieldHttpClient = HttpClients.custom().useSystemProperties().setDefaultRequestConfig(globalConfig).setSSLContext(sslContext).build(); } catch (Throwable e) { throw new OpenEditException(e); } } return fieldHttpClient; } @Override public void reIndexAll() throws OpenEditException { // TODO Auto-generated method stub } @Override public SearchQuery createSearchQuery() { // TODO Auto-generated method stub return new SearchQuery(); } @Override public HitTracker search(SearchQuery inQuery) { RemoteHitTracker tracker = new RemoteHitTracker(); tracker.setSearchQuery(inQuery); tracker.setSearcher(this); tracker.setBaseUrl(getHost()); tracker.setEntermediaKey(getKey()); tracker.setRemoteSearchtype(getRemoteSearchType()); // return tracker; } @Override public Object searchById(String inId) { HttpGet post = new HttpGet(getHost() + "/services/lists/data/" + getRemoteSearchType() + "/" + inId + "?entermedia.key=" + getKey()); post.addHeader("entermedia.key", getKey()); try { HttpResponse response = getSharedClient().execute(post); StatusLine sl = response.getStatusLine(); int status = sl.getStatusCode(); if (status >= 400) { throw new OpenEditException("error from server " + status + " " + sl.getReasonPhrase()); } HttpEntity entity = response.getEntity(); JSONObject json = null; JSONParser parser = new JSONParser(); String charset = "utf-8"; if (entity.getContentEncoding() != null) { charset = entity.getContentEncoding().getValue(); } InputStream content = entity.getContent(); //String contents = IOUtils.toString(content, "UTF-8"); if (content instanceof EmptyInputStream) { return null; } InputStreamReader reader = new InputStreamReader(content, charset); json = (JSONObject) parser.parse(reader); JSONObject data = (JSONObject) json.get("data"); RemoteData rdata = new RemoteData((Map) data); return rdata; } catch (Exception e) { throw new OpenEditException(e); } } private String getRemoteSearchType() { return super.getPropertyDetails().getSettingValue("searchtype"); } private String getKey() { return super.getPropertyDetails().getSettingValue("key"); } private String getHost() { return super.getPropertyDetails().getSettingValue("host"); } @Override public String getIndexId() { // TODO Auto-generated method stub return null; } @Override public void clearIndex() { // TODO Auto-generated method stub } @Override public void deleteAll(User inUser) { HitTracker hits = getAllHits(); for (Iterator iterator = hits.iterator(); iterator.hasNext();) { Data hit = (Data) iterator.next(); delete(hit, inUser); } } @Override public void delete(Data inData, User inUser) { HttpDelete post = new HttpDelete(getHost() + "/services/lists/data/" + getRemoteSearchType() + "/" + inData.getId() + "?entermedia.key=" + getKey()); post.addHeader("entermedia.key", getKey()); try { HttpResponse response = getSharedClient().execute(post); StatusLine sl = response.getStatusLine(); int status = sl.getStatusCode(); if (status >= 400) { throw new OpenEditException("error from server " + status + " " + sl.getReasonPhrase()); } } catch (Exception e) { throw new OpenEditException(e); } } @Override public void saveData(Data inData, User inUser) { RemoteData rdata = (RemoteData) inData; HttpPut post = new HttpPut(getHost() + "/services/lists/data/" + getRemoteSearchType() + "/" + inData.getId() + "?entermedia.key=" + getKey()); post.addHeader("entermedia.key", getKey()); JSONObject hitdata = rdata.getJson(); StringEntity params = new StringEntity(hitdata.toJSONString(), "UTF-8"); post.setEntity(params); log.info(hitdata.toJSONString()); try { HttpResponse response = getSharedClient().execute(post); StatusLine sl = response.getStatusLine(); int status = sl.getStatusCode(); if (status >= 400) { throw new OpenEditException("error from server " + status + " " + sl.getReasonPhrase()); } } catch (Exception e) { throw new OpenEditException(e); } } @Override public void saveAllData(Collection inAll, User inUser) { for (Iterator iterator = inAll.iterator(); iterator.hasNext();) { Data data = (Data) iterator.next(); saveData(data); } } // @Override // public List getProperties() // { // ArrayList properties = new ArrayList(); // for (Iterator iterator = getPropertyDetails().iterator(); iterator.hasNext();) // { // properties.add(iterator.next()); // // } // return properties; // } // // @Override // public PropertyDetails getPropertyDetails() // { // // // // HttpGet post = new HttpGet(getHost() + "/services/settings/datamanager/table/details/" + getRemoteSearchType() ); // post.addHeader("entermedia.key", getKey()); // try // { // HttpResponse response = getSharedClient().execute(post); // StatusLine sl = response.getStatusLine(); // int status = sl.getStatusCode(); // if (status >= 400) // { // throw new OpenEditException("error from server " + status + " " + sl.getReasonPhrase()); // } // // InputStream content = response.getEntity().getContent(); // //String contents = IOUtils.toString(content, "UTF-8"); // if (content instanceof EmptyInputStream) // { // return null; // } // InputStreamReader reader = new InputStreamReader(content, "UTF-8"); // JSONParser parser = new JSONParser(); // // JSONObject json = (JSONObject) parser.parse(reader); // // JSONObject data = (JSONObject) json.get("data"); // // JSONArray details = (JSONArray) data.get("details"); // // PropertyDetails proplist = new PropertyDetails(); // // for (Iterator iterator = details.iterator(); iterator.hasNext();) // { // JSONObject prop = (JSONObject) iterator.next(); // PropertyDetail detail = new PropertyDetail(); // detail.setId((String) prop.get("id")); // for (Iterator iterator2 = prop.keySet().iterator(); iterator2.hasNext();) // { // String key = (String) iterator2.next(); // String val = (String) prop.get(key); // detail.setProperty(key, val); // // } // proplist.add(detail); // } // return proplist; // // } // catch (Exception e) // { // throw new OpenEditException(e); // } // // // } }