Changeset 2527
- Timestamp:
- 01/31/13 15:55:57 (11 years ago)
- Location:
- SRUAggregator/trunk
- Files:
-
- 12 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
SRUAggregator/trunk/pom.xml
r2502 r2527 4 4 <groupId>eu.clarin.sru.fcs</groupId> 5 5 <artifactId>aggregator</artifactId> 6 <version>1.0 -SNAPSHOT</version>6 <version>1.0</version> 7 7 <properties> 8 8 <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir> … … 54 54 <artifactId>sru-client</artifactId> 55 55 <version>0.9.0</version> 56 </dependency> 57 <dependency> 58 <groupId>eu.clarin.weblicht</groupId> 59 <artifactId>wlfxb</artifactId> 60 <version>1.2.2</version> 56 61 </dependency> 57 62 </dependencies> -
SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/app/Aggregator.java
r2502 r2527 3 3 import com.google.gson.Gson; 4 4 import com.google.gson.reflect.TypeToken; 5 import eu.clarin.sru.client.SRUClientException;6 import eu.clarin.sru.client.SRUExplainRequest;7 import eu.clarin.sru.client.SRUExplainResponse;8 import eu.clarin.sru.client.SRURecord;9 import eu.clarin.sru.client.SRUSearchRetrieveRequest;10 import eu.clarin.sru.client.SRUSearchRetrieveResponse;11 import eu.clarin.sru.client.SRUSurrogateRecordData;12 import eu.clarin.sru.client.SRUThreadedClient;13 5 import eu.clarin.sru.client.SRUVersion; 14 import eu.clarin.sru.client.fcs.ClarinFCSRecordData;15 import eu.clarin.sru.client.fcs.ClarinFCSRecordParser;16 import eu.clarin.sru.client.fcs.DataView;17 import eu.clarin.sru.client.fcs.DataViewKWIC;18 import eu.clarin.sru.client.fcs.Resource;19 6 import eu.clarin.sru.fcs.aggregator.data.CenterRegistry; 20 7 import eu.clarin.sru.fcs.aggregator.sparam.CorpusTreeModel; … … 23 10 import java.lang.reflect.Type; 24 11 import java.util.ArrayList; 25 import java.util.Arrays;26 import java.util.HashSet;27 12 import java.util.LinkedHashMap; 28 13 import java.util.List; 29 14 import java.util.Map; 30 15 import java.util.Set; 31 import java.util.concurrent.ExecutionException;32 import java.util.concurrent.Future;33 16 import java.util.logging.*; 34 import org.zkoss.zhtml.Filedownload;35 17 import org.zkoss.zk.ui.Component; 36 import org.zkoss.zk.ui.Desktop;37 18 import org.zkoss.zk.ui.Executions; 38 19 import org.zkoss.zk.ui.event.Event; 39 import org.zkoss.zk.ui.event.EventListener;40 20 import org.zkoss.zk.ui.select.SelectorComposer; 41 21 import org.zkoss.zk.ui.select.annotation.Listen; 42 22 import org.zkoss.zk.ui.select.annotation.Wire; 43 import org.zkoss.zul.Auxhead;44 import org.zkoss.zul.Auxheader;45 23 import org.zkoss.zul.Button; 46 import org.zkoss.zul.Checkbox;47 import org.zkoss.zul.Column;48 import org.zkoss.zul.Columns;49 24 import org.zkoss.zul.Combobox; 50 25 import org.zkoss.zul.Comboitem; 51 import org.zkoss.zul.Grid;52 26 import org.zkoss.zul.Groupbox; 53 27 import org.zkoss.zul.Iframe; 54 28 import org.zkoss.zul.Label; 29 import org.zkoss.zul.Menuitem; 55 30 import org.zkoss.zul.Messagebox; 56 import org.zkoss.zul.Row;57 import org.zkoss.zul.Rows;58 import org.zkoss.zul.Separator;59 31 import org.zkoss.zul.Textbox; 60 32 import org.zkoss.zul.Tree; 61 33 import org.zkoss.zul.Treechildren; 62 34 import org.zkoss.zul.Treeitem; 63 import org.zkoss.zul.Vbox;64 35 import org.zkoss.zul.Window; 65 36 import org.zkoss.zul.event.ZulEvents; … … 72 43 public class Aggregator extends SelectorComposer<Component> { 73 44 74 private static final Logger logger = Logger.getLogger("FCS-AGGREGATOR"); 45 private static final Logger logger = Logger.getLogger(Aggregator.class.getName()); 46 75 47 // @Wire 76 48 // private Grid anzeigeGrid; … … 79 51 @Wire 80 52 private Combobox languageSelect; 81 @Wire82 private Button searchButton;83 @Wire84 private Groupbox allCorpora;53 // @Wire 54 // private Button searchButton; 55 // @Wire 56 // private Groupbox allCorpora; 85 57 // @Wire 86 58 // private Comboitem german; … … 89 61 @Wire 90 62 private Window resultsBox; 91 @Wire92 private Button selectAll;93 @Wire94 private Button deselectAll;95 @Wire96 private Window mainWindow;63 // @Wire 64 // private Button selectAll; 65 // @Wire 66 // private Button deselectAll; 67 // @Wire 68 // private Window mainWindow; 97 69 @Wire 98 70 private Combobox maximumRecordsSelect; 99 @Wire100 private Button addForeignEndpoint;71 // @Wire 72 // private Button addForeignEndpoint; 101 73 @Wire 102 74 Combobox foreignEndpointSelect; 103 75 @Wire 104 76 private Tree tree; 77 @Wire 78 private Label searchResultsProgress; 79 105 80 private Map<String, List<String>> xAggregationContext; 81 private SRUVersion version = SRUVersion.VERSION_1_2; 106 82 private SearchResultsController searchResultsController; 107 83 private CenterRegistry registry; … … 109 85 @Override 110 86 public void doAfterCompose(Component comp) throws Exception { 87 111 88 super.doAfterCompose(comp); 112 89 … … 114 91 115 92 languageSelect.setSelectedItem(anyLanguage); 116 searchResultsController = new SearchResultsController(resultsBox);117 // assign it to desktop, so that it can be accessed to be shutdown when the desktop is destroyed118 // TODO the registry/tree also has to be shutdown properly???93 94 searchResultsController = new SearchResultsController(resultsBox, searchResultsProgress); 95 // assign the search controller to desktop, so that it can be accessed to be shutdown when the desktop is destroyed 119 96 Executions.getCurrent().getDesktop().setAttribute(searchResultsController.getClass().getSimpleName(), searchResultsController); 97 // also add it to the list of actice controllers of the web application, so that they can be shutdown when the application stops 98 Set<SearchResultsController> activeControllers = (Set<SearchResultsController>) Executions.getCurrent().getDesktop().getWebApp().getAttribute(WebAppListener.ACTIVE_SEARCH_CONTROLLERS); 99 activeControllers.add(searchResultsController); 120 100 121 101 registry = new CenterRegistry(); … … 158 138 public void onExecuteSearch(Event ev) { 159 139 int maxRecords = Integer.parseInt(maximumRecordsSelect.getValue()); 160 logger.info("Executing Search."); 161 searchResultsController.executeSearch(tree.getSelectedItems(), maxRecords, searchString.getText()); 140 searchResultsController.executeSearch(tree.getSelectedItems(), maxRecords, searchString.getText(), version); 162 141 } 163 142 … … 185 164 @Listen("onClick=#exportResultsCSV") 186 165 public void onExportResultsCSV(Event ev) { 187 188 int i, i2, i3; 189 String temp = ""; 190 boolean somethingToExport = false; 191 192 for (i = 0; i < resultsBox.getChildren().size(); i++) { 193 if (resultsBox.getChildren().get(i) instanceof Grid) { 194 somethingToExport = true; 195 Grid aGrid = (Grid) resultsBox.getChildren().get(i); 196 Rows rows = aGrid.getRows(); 197 198 for (i2 = 0; i2 < rows.getChildren().size(); i2++) { 199 Row r = (Row) rows.getChildren().get(i2); 200 201 for (i3 = 0; i3 < r.getChildren().size(); i3++) { 202 Label l = (Label) r.getChildren().get(i3); 203 temp = temp + "\"" + l.getValue().replace("\"", "QUOTE") + "\""; 204 if (i3 < r.getChildren().size() - 1) { 205 temp = temp + ","; 206 } //if i3 207 } //for i3 208 temp = temp + "\n"; 209 } // for i2 210 } // if grid 211 212 } // for i ... 213 214 if (somethingToExport) { 215 216 Filedownload.save(temp, "text/plain", "ClarinDFederatedContentSearch.csv"); 217 } else { 218 Messagebox.show("Nothing to export!"); 219 } 166 searchResultsController.exportCSV(); 220 167 } 221 168 222 169 @Listen("onClick=#exportResultsTCF") 223 170 public void onExportResultsTCF(Event ev) { 224 225 int i, i2, i3; 226 String temp = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><D-Spin xmlns=\"http://www.dspin.de/data\" version=\"0.4\">\n<MetaData xmlns=\"http://www.dspin.de/data/metadata\">\n"; 227 temp = temp + "<source>CLARIN-D Federated Content Search</source>\n</MetaData>\n <TextCorpus xmlns=\"http://www.dspin.de/data/textcorpus\" lang=\"de\">\n<text>"; 228 229 230 boolean somethingToExport = false; 231 232 for (i = 0; i < resultsBox.getChildren().size(); i++) { 233 if (resultsBox.getChildren().get(i) instanceof Grid) { 234 somethingToExport = true; 235 Grid aGrid = (Grid) resultsBox.getChildren().get(i); 236 Rows rows = aGrid.getRows(); 237 238 for (i2 = 0; i2 < rows.getChildren().size(); i2++) { 239 Row r = (Row) rows.getChildren().get(i2); 240 241 for (i3 = 0; i3 < r.getChildren().size(); i3++) { 242 Label l = (Label) r.getChildren().get(i3); 243 temp = temp + l.getValue() + " "; 244 } //for i3 245 temp = temp + "\n"; 246 } // for i2 247 } // if grid 248 249 } // for i ... 250 251 if (somethingToExport) { 252 temp = temp + "</text>\n</TextCorpus>\n</D-Spin>"; 253 Filedownload.save(temp, "text/tcf+xml", "ClarinDFederatedContentSearch.xml"); 254 } else { 255 Messagebox.show("Nothing to export!"); 256 } 171 searchResultsController.exportTCF(); 257 172 } 258 173 … … 263 178 264 179 private void processParameters() { 180 265 181 String[] paramValue; 266 182 String contextJson = null; 267 183 268 //TODO use them???269 String operationString = null;270 String versionString = null;271 272 184 paramValue = Executions.getCurrent().getParameterMap().get("query"); 273 185 if (paramValue != null) { 274 searchString.setValue(paramValue[0]); 186 searchString.setValue(paramValue[0].trim()); 187 logger.log(Level.INFO, "Received parameter: query[{0}]", searchString.getValue()); 275 188 } 276 189 paramValue = Executions.getCurrent().getParameterMap().get("operation"); 277 190 if (paramValue != null) { 278 operationString = paramValue[0]; 191 String operationString = paramValue[0].trim(); 192 logger.log(Level.INFO, "Received parameter: operation[{0}]", operationString); 279 193 if (!operationString.equals("searchRetrieve")) { 280 logger.severe("Not supported operation: " + operationString); 194 logger.log(Level.SEVERE, "Not supported operation: {0}", operationString); 195 Messagebox.show("CLARIN-D Federated Content Search Aggregator\n\nVersion 0.0.1", "FCS", 0, Messagebox.INFORMATION); 281 196 } 282 197 } 283 198 paramValue = Executions.getCurrent().getParameterMap().get("version"); 284 199 if (paramValue != null) { 285 versionString = paramValue[0]; 200 String versionString = paramValue[0].trim(); 201 logger.log(Level.INFO, "Received parameter: version[{0}]", versionString); 202 if (versionString.equals("1.2")) { 203 version = SRUVersion.VERSION_1_2; 204 } else if (versionString.equals("1.1")) { 205 version = SRUVersion.VERSION_1_1; 206 } else { 207 logger.log(Level.SEVERE, "Not supported SRU version: {0}", versionString); 208 Messagebox.show("SRU Version " + version + " not supported", "FCS", 0, Messagebox.INFORMATION); 209 } 286 210 } 287 211 paramValue = Executions.getCurrent().getParameterMap().get("x-aggregation-context"); 288 212 if (paramValue != null) { 289 contextJson = paramValue[0]; 290 } 291 292 logger.info("query: " + searchString.getValue()); 293 logger.info("operation: " + operationString); 294 logger.info("version: " + versionString); 295 logger.info("x-aggregation-context: " + contextJson); 213 contextJson = paramValue[0].trim(); 214 logger.log(Level.INFO, "Received parameter: x-aggregation-context[{0}]", contextJson); 215 } 296 216 297 217 if (contextJson != null) { … … 299 219 Type mapType = new TypeToken<LinkedHashMap<String, ArrayList<String>>>() { 300 220 }.getType(); 221 try { 301 222 this.xAggregationContext = gson.fromJson(contextJson, mapType); 302 //System.out.println("selectedEndpoints: " + selectedEndpoints); 303 //selectEndpoints(selectedEndpoints); 304 } 305 223 } catch (Exception ex) { 224 logger.log(Level.SEVERE, "Error parsing JSON from x-aggregation-context:\n {0}\n {1}", new String[]{ex.getMessage(), contextJson}); 225 Messagebox.show("Error in x-aggregation-context parameter", "FCS", 0, Messagebox.INFORMATION); 226 } 227 } 306 228 307 229 } -
SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/app/DesktopDestroyedListener.java
r2502 r2527 3 3 4 4 import eu.clarin.sru.fcs.aggregator.sresult.SearchResultsController; 5 import java.util.Set; 5 6 import java.util.logging.Logger; 6 7 import org.zkoss.zk.ui.Desktop; … … 12 13 */ 13 14 public class DesktopDestroyedListener implements DesktopCleanup { 15 16 private static final Logger logger = Logger.getLogger(DesktopCleanup.class.getName()); 14 17 15 18 @Override 16 19 public void cleanup(Desktop desktop) { 17 20 logger.fine("Cleaning up desktop..."); 18 21 Object recordsController = desktop.getAttribute(SearchResultsController.class.getSimpleName()); 22 Set<SearchResultsController> activeControllers = (Set<SearchResultsController>) desktop.getWebApp().getAttribute(WebAppListener.ACTIVE_SEARCH_CONTROLLERS); 19 23 if (recordsController != null) { 20 Logger.getLogger(DesktopDestroyedListener.class.getName()).info("Cleaning up desktop"); 21 ((SearchResultsController) recordsController).shutdown(); 24 SearchResultsController srController = (SearchResultsController) recordsController; 25 srController.shutdown(); 26 activeControllers.remove(srController); 22 27 } 23 28 } -
SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/app/WebAppListener.java
r2508 r2527 1 1 package eu.clarin.sru.fcs.aggregator.app; 2 2 3 3 import eu.clarin.sru.client.SRUClientException; 4 import eu.clarin.sru.client.SRUThreadedClient; 5 import eu.clarin.sru.client.fcs.ClarinFCSRecordParser; 6 import eu.clarin.sru.fcs.aggregator.sresult.SearchResultsController; 7 import java.util.HashSet; 8 import java.util.Set; 9 import java.util.logging.Level; 4 10 import java.util.logging.Logger; 5 11 import org.zkoss.zk.ui.WebApp; 6 12 import org.zkoss.zk.ui.util.WebAppCleanup; 13 import org.zkoss.zk.ui.util.WebAppInit; 7 14 8 15 /** … … 10 17 * @author Yana Panchenko 11 18 */ 12 public class WebAppDestroyedListener implements WebAppCleanup { 19 public class WebAppListener implements WebAppInit, WebAppCleanup { 20 21 public static String ACTIVE_SEARCH_CONTROLLERS = "ACTIVE_SEARCH_CONTROLLERS"; 22 public static String SHARED_SRU_CLIENT = "SHARED_SRU_CLIENT"; 23 private static final Logger logger = Logger.getLogger(WebAppListener.class.getName()); 13 24 14 25 @Override 15 public void cleanup(WebApp wapp) throws Exception { 16 //TODO 17 Logger.getLogger(WebAppDestroyedListener.class.getName()).info("TODO: WebAppDestroyedListener"); 26 public void init(WebApp webapp) throws Exception { 27 28 //int endOfClassesSharedPartOfName = WebAppListener.class.getPackage().getName().lastIndexOf("."); 29 //Logger.getLogger(WebAppListener.class.getPackage().getName().substring(0, endOfClassesSharedPartOfName)).setLevel(Level.FINE); 30 31 logger.info("Aggregator is starting..."); 32 33 Set<SearchResultsController> activeControllers = new HashSet<SearchResultsController>(); 34 webapp.setAttribute(ACTIVE_SEARCH_CONTROLLERS, activeControllers); 35 36 SRUThreadedClient searchClient = new SRUThreadedClient(); 37 try { 38 searchClient.registerRecordParser(new ClarinFCSRecordParser()); 39 webapp.setAttribute(WebAppListener.SHARED_SRU_CLIENT, searchClient); 40 } catch (SRUClientException e) { 41 logger.log(Level.SEVERE, "SRU Client Parser registration failed", e); 42 } 43 } 44 45 @Override 46 public void cleanup(WebApp webapp) throws Exception { 47 logger.info("Aggregator is shutting down..."); 48 49 Set<SearchResultsController> activeControllers = (Set<SearchResultsController>) webapp.getAttribute(ACTIVE_SEARCH_CONTROLLERS); 50 for (SearchResultsController activeController : activeControllers) { 51 activeController.shutdown(); 52 } 53 SRUThreadedClient searchClient = (SRUThreadedClient) webapp.getAttribute(WebAppListener.SHARED_SRU_CLIENT); 54 55 // with shutdown() there are memory leaks when web app stops even if all requests have been processed; 56 // with shutdownNow() there are memory leaks when web app stops only if not all requests have been processed 57 searchClient.shutdownNow(); 18 58 } 19 59 } -
SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/data/CenterRegistry.java
r2502 r2527 7 7 8 8 import eu.clarin.sru.fcs.aggregator.sparam.CorpusTreeNode; 9 import java.io.IOException; 9 10 import java.io.InputStream; 10 11 import java.net.URL; … … 29 30 public class CenterRegistry implements CorpusTreeNode { 30 31 31 private static final Logger logger = Logger.getLogger( "FCS-AGGREGATOR");32 private static final Logger logger = Logger.getLogger(CenterRegistry.class.getName()); 32 33 33 34 private static final String crStartpoint = "http://130.183.206.32/restxml/"; 34 35 35 36 //https://centerregistry-clarin.esc.rzg.mpg.de/restxml/ 36 //http://130.183.206.32/restxml/37 37 38 38 private boolean hasChildrenLoaded = false; … … 51 51 } 52 52 hasChildrenLoaded = true; 53 InputStream is ;53 InputStream is = null; 54 54 URL u; 55 55 NodeList instituteNames; … … 57 57 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 58 58 DocumentBuilder builder; 59 URLConnection urlConn; 59 60 try { 60 61 u = new URL(crStartpoint); 61 URLConnectionurlConn = u.openConnection();62 urlConn = u.openConnection(); 62 63 63 64 //HttpsURLConnection urlConn = (HttpsURLConnection) u.openConnection(); … … 75 76 org.w3c.dom.Document document = builder.parse(is); 76 77 77 is.close();78 78 79 instituteNames = evaluateXPath("//Centername", document); 79 80 institutionsUrls = evaluateXPath("//Center_id_link", document); … … 90 91 91 92 } catch (Exception ex) { 92 logger.log(Level.SEVERE, "Error accessing central repository information", ex); 93 logger.log(Level.SEVERE, "Error accessing central registry information {0} {1}", new String[]{ex.getClass().getName(), ex.getMessage()}); 94 } finally { 95 if (is != null) { 96 try { 97 is.close(); 98 } catch (IOException ex) { 99 logger.log(Level.SEVERE, ex.getMessage()); 100 } 101 } 93 102 } 94 logger. info(String.format("Number of Centers: %s", centers.size()));103 logger.log(Level.FINE, "Number of Centers: {0}", centers.size()); 95 104 96 105 } -
SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/data/Corpus.java
r2502 r2527 27 27 private boolean hasChildrenLoaded = false; 28 28 private Endpoint endpoint; 29 // private String endpointUrl; 29 30 private static final Logger logger = Logger.getLogger(Corpus.class.getName()); 30 31 31 32 public Corpus(Endpoint endpoint) { … … 135 136 corporaResponse = sruClient.scan(corporaRequest); 136 137 } catch (SRUClientException ex) { 137 Logger.getLogger(Endpoint.class.getName()).log(Level.SEVERE, "Error accessing corpora " + value + " at " + endpoint.getUrl(), ex); 138 logger.log(Level.SEVERE, "Error accessing corpora {0} at {1}\n {2} {3}", 139 new String[]{value, endpoint.getUrl(), ex.getClass().getName(), ex.getMessage()}); 138 140 } 139 141 if (corporaResponse != null && corporaResponse.hasTerms()) { … … 147 149 } 148 150 } 151 149 152 } -
SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/data/Endpoint.java
r2502 r2527 23 23 private List<Corpus> corpora; 24 24 private boolean hasChildrenLoaded = false; 25 26 private static final Logger logger = Logger.getLogger(Endpoint.class.getName()); 25 27 26 28 public Endpoint(String url, Institution institution) { … … 63 65 } 64 66 this.hasChildrenLoaded = true; 65 //this.corpora = EndpointY.getCorpora(url);66 67 loadChildCorpora(); 67 68 } … … 80 81 } 81 82 return corpora.get(index); 82 } 83 84 // public static ArrayList<CorpusY> getCorpora(String endpointUrl) { 85 // return getCorpora(endpointUrl, ""); //TODO to be changed to 'root' 86 // } 87 // 88 // public static ArrayList<CorpusY> getCorpora(String endpointUrl, String resourceHandler) { 89 // 90 // ArrayList<CorpusY> corpora = new ArrayList<CorpusY>(); 91 // SRUScanResponse corporaResponse = null; 92 // StringBuilder scanClause = new StringBuilder("fcs.resource"); 93 // if (resourceHandler.length() > 0) { 94 // scanClause.append("="); 95 // } 96 // scanClause.append(resourceHandler); 97 // try { 98 // SRUClient sruClient = new SRUClient(SRUVersion.VERSION_1_2); 99 // SRUScanRequest corporaRequest = new SRUScanRequest(endpointUrl); 100 // corporaRequest.setScanClause(scanClause.toString()); 101 // //TODO extra data? 102 // //corporaRequest.setExtraRequestData("x-cmd-resource-info", "true"); 103 // corporaResponse = sruClient.scan(corporaRequest); 104 // } catch (SRUClientException ex) { 105 // Logger.getLogger(EndpointY.class.getName()).log(Level.SEVERE, "Error accessing corpora at " + endpointUrl + " for " + resourceHandler, ex); 106 // } 107 // if (corporaResponse != null && corporaResponse.hasTerms()) { 108 // for (SRUTerm term : corporaResponse.getTerms()) { 109 // CorpusY c = new CorpusY(endpointUrl); 110 // c.setValue(term.getValue()); 111 // c.setDisplayTerm(term.getDisplayTerm()); 112 // c.setNumberOfRecords(term.getNumberOfRecords()); 113 // corpora.add(c); 114 // } 115 // } 116 // return corpora; 117 // 118 // } 119 83 } 120 84 121 85 private void loadChildCorpora() { … … 132 96 corporaResponse = sruClient.scan(corporaRequest); 133 97 } catch (SRUClientException ex) { 134 Logger.getLogger(Endpoint.class.getName()).log(Level.SEVERE, "Error accessing corpora at " + url, ex);98 logger.log(Level.SEVERE, "Error accessing corpora at {0}\n {1}\n {2}", new String[]{url, ex.getClass().getName(), ex.getMessage()}); 135 99 } 136 100 if (corporaResponse != null && corporaResponse.hasTerms()) { -
SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/data/Institution.java
r2502 r2527 3 3 import eu.clarin.sru.fcs.aggregator.sparam.CorpusTreeNode; 4 4 import eu.clarin.sru.fcs.aggregator.data.CenterRegistry; 5 import java.io.IOException; 5 6 import java.io.InputStream; 6 7 import java.net.URL; … … 24 25 private ArrayList<Endpoint> endpoints; 25 26 private boolean hasChildrenLoaded = false; 26 private static final Logger logger = Logger.getLogger("FCS-AGGREGATOR"); 27 28 private static final Logger logger = Logger.getLogger(Institution.class.getName()); 27 29 28 30 public Institution(String name, String link) { … … 52 54 } 53 55 hasChildrenLoaded = true; 54 InputStream is; 55 URL u; 56 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 57 DocumentBuilder builder; 58 Document doc; 59 56 InputStream is = null; 57 60 58 try { 61 builder = factory.newDocumentBuilder(); 62 u = new URL(link); 59 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 60 DocumentBuilder builder = factory.newDocumentBuilder(); 61 URL u = new URL(link); 63 62 is = u.openStream(); 64 doc = builder.parse(is);63 Document doc = builder.parse(is); 65 64 is.close(); 66 NodeList endpointsUrls = CenterRegistry.evaluateXPath("//WebReference[./Description[text()=\"CQL\"]]/Website", doc); 65 NodeList endpointsUrls = CenterRegistry 66 .evaluateXPath("//WebReference[./Description[text()=\"CQL\"]]/Website", doc); 67 67 68 68 for (int j = 0; j < endpointsUrls.getLength(); j++) { … … 72 72 } 73 73 } catch (Exception ex) { 74 logger.log(Level.SEVERE, String.format("Error accessing endpoints of %s", link), ex); 74 logger.log(Level.SEVERE, "Error accessing endpoint of {0}\n {1}\n {2}", 75 new String[]{link, ex.getClass().getName(), ex.getMessage()}); 76 } finally { 77 if (is != null) { 78 try { 79 is.close(); 80 } catch (IOException ex) { 81 logger.log(Level.SEVERE, null, ex); 82 } 83 } 75 84 } 76 85 } -
SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/data/SearchResult.java
r2502 r2527 6 6 7 7 import eu.clarin.sru.client.SRUSearchRetrieveResponse; 8 import eu.clarin.sru.client.fcs.DataViewKWIC; 9 import java.util.ArrayList; 10 import java.util.List; 8 11 import java.util.concurrent.Future; 9 12 import java.util.logging.Level; … … 23 26 private Future<SRUSearchRetrieveResponse> futureResponse; 24 27 private SRUSearchRetrieveResponse response; 28 private List<DataViewKWIC> dataKWIC = new ArrayList<DataViewKWIC>(); 29 30 private static final Logger logger = Logger.getLogger(SearchResult.class.getName()); 31 32 public List<DataViewKWIC> getDataKWIC() { 33 return dataKWIC; 34 } 35 36 public void addKWIC(DataViewKWIC kw) { 37 this.dataKWIC.add(kw); 38 } 39 25 40 26 41 public SearchResult(Object nodeData) { … … 80 95 } 81 96 } catch (Exception ex) { 82 Logger.getLogger(SearchResult.class.getName()).log(Level.SEVERE, null, ex); 97 logger.log(Level.SEVERE, "Error consuming response from {0} {1}\n {2}\n {3}", 98 new Object[]{endpoint.getUrl(), corpus, ex.getClass().getName(), ex.getMessage()}); 83 99 } 84 100 } -
SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/sresult/SearchResultRecordRenderer.java
r2502 r2527 7 7 import eu.clarin.sru.client.fcs.DataViewKWIC; 8 8 import eu.clarin.sru.client.fcs.Resource; 9 import eu.clarin.sru.fcs.aggregator.data.SearchResult; 9 10 import java.util.ArrayList; 10 11 import java.util.List; 12 import java.util.logging.Level; 11 13 import java.util.logging.Logger; 12 14 import org.zkoss.zul.Cell; … … 21 23 */ 22 24 public class SearchResultRecordRenderer implements RowRenderer { 25 26 private SearchResult searchResult; 27 28 private static final Logger logger = Logger.getLogger(SearchResultRecordRenderer.class.getName()); 29 30 public SearchResultRecordRenderer(SearchResult searchResult) { 31 this.searchResult = searchResult; 32 } 23 33 24 34 @Override … … 27 37 SRURecord record = (SRURecord) data; 28 38 29 Logger.getLogger(this.getClass().getName()).info(30 String.format("schema = %s, identifier = %s, position = %s",39 logger.log(Level.FINE, 40 "schema = {0}, identifier = {1}, position = {2}", 31 41 new Object[]{record.getRecordSchema(), 32 42 record.getRecordIdentifier(), 33 record.getRecordPosition()}) );43 record.getRecordPosition()}); 34 44 35 45 if (record.isRecordSchema(ClarinFCSRecordData.RECORD_SCHEMA)) { 36 46 ClarinFCSRecordData rd = 37 47 (ClarinFCSRecordData) record.getRecordData(); 38 39 40 41 48 42 49 Resource resource = rd.getResource(); 43 50 51 logger.log(Level.FINE, 52 "Resource ref={0}, pid={1}, dataViews={2}", 53 new Object[]{resource.getRef(), resource.getPid(), resource.hasDataViews()}); 44 54 45 55 // if (resource.getRef() != null) { … … 57 67 // If dataviews are assigned directly to the resource: 58 68 if (resource.hasDataViews()) { 59 //zeilen.addAll(dataViews2Rows(resource.getDataViews()));60 69 appendDataView(row, resource.getDataViews()); 61 70 } … … 64 73 if (resource.hasResourceFragments()) { 65 74 for (Resource.ResourceFragment fragment : resource.getResourceFragments()) { 66 Logger.getLogger(this.getClass().getName()).info( 67 String.format("CLARIN-FCS: ResourceFragment: pid=%s, ref=%s", 68 fragment.getPid(), fragment.getRef())); 75 logger.log(Level.FINE, "ResourceFragment: ref={0}, pid={1}, dataViews={2}", 76 new Object[]{fragment.getRef(), fragment.getPid(), fragment.hasDataViews()}); 69 77 if (fragment.hasDataViews()) { 70 //zeilen.addAll(dataViews2Rows(fragment.getDataViews()));71 78 appendDataView(row, fragment.getDataViews()); 72 79 } 73 80 } 74 } //ResourceFragments81 } 75 82 76 83 } else if (record.isRecordSchema(SRUSurrogateRecordData.RECORD_SCHEMA)) { 77 84 SRUSurrogateRecordData r = 78 85 (SRUSurrogateRecordData) record.getRecordData(); 79 Logger.getLogger(this.getClass().getName()).info( 80 String.format("SURROGATE DIAGNOSTIC: uri=%s, message=%s, detail=%s", 81 r.getURI(), r.getMessage(), r.getDetails())); 86 logger.log(Level.INFO, "Surrogate diagnostic: uri={0}, message={1}, detail={2}", 87 new Object[]{r.getURI(), r.getMessage(), r.getDetails()}); 82 88 } else { 83 Logger.getLogger(this.getClass().getName()).info( 84 String.format("UNSUPPORTED SCHEMA: %s", 85 record.getRecordSchema())); 89 logger.log(Level.INFO, "Unsupported schema: {0}", record.getRecordSchema()); 86 90 } 87 91 … … 95 99 if (dataview.isMimeType(DataViewKWIC.TYPE)) { 96 100 DataViewKWIC kw = (DataViewKWIC) dataview; 97 101 this.searchResult.addKWIC(kw); 98 102 99 103 Label toTheLeft = new Label(); 104 toTheLeft.setValue(kw.getLeft()); 105 100 106 toTheLeft.setMultiline(true); 101 toTheLeft.setValue(kw.getLeft());102 107 toTheLeft.setSclass("word-wrap"); 103 108 Cell toTheLeftCell = new Cell(); … … 106 111 toTheLeftCell.setValign("bottom"); 107 112 row.appendChild(toTheLeftCell); 108 //row.appendChild(toTheLeft);113 // row.appendChild(toTheLeft); 109 114 110 115 … … 118 123 lCell.setValign("bottom"); 119 124 row.appendChild(lCell); 120 //row.appendChild(l);125 // row.appendChild(l); 121 126 122 127 Label toTheRight = new Label(); 128 toTheRight.setValue(kw.getRight()); 123 129 toTheRight.setMultiline(true); 124 130 toTheRight.setSclass("word-wrap"); 125 toTheRight.setValue(kw.getRight());126 131 Cell toTheRightCell = new Cell(); 127 132 toTheRightCell.appendChild(toTheRight); 128 133 toTheRightCell.setValign("bottom"); 129 134 row.appendChild(toTheRightCell); 130 //row.appendChild(toTheRight);135 // row.appendChild(toTheRight); 131 136 132 137 } -
SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/sresult/SearchResultsController.java
r2502 r2527 9 9 import eu.clarin.sru.client.fcs.ClarinFCSRecordData; 10 10 import eu.clarin.sru.client.fcs.ClarinFCSRecordParser; 11 import eu.clarin.sru.client.fcs.DataViewKWIC; 12 import eu.clarin.sru.fcs.aggregator.app.WebAppListener; 11 13 import eu.clarin.sru.fcs.aggregator.data.Institution; 12 14 import eu.clarin.sru.fcs.aggregator.data.SearchResult; 13 15 import eu.clarin.sru.fcs.aggregator.sparam.CorpusTreeNodeRenderer; 16 import eu.clarin.weblicht.wlfxb.io.WLDObjector; 17 import eu.clarin.weblicht.wlfxb.io.WLFormatException; 18 import eu.clarin.weblicht.wlfxb.md.xb.MetaData; 19 import eu.clarin.weblicht.wlfxb.tc.xb.TextCorpusStored; 20 import eu.clarin.weblicht.wlfxb.xb.WLData; 21 import java.io.ByteArrayOutputStream; 14 22 import java.util.ArrayList; 15 23 import java.util.List; … … 18 26 import java.util.logging.Level; 19 27 import java.util.logging.Logger; 28 import org.zkoss.zhtml.Filedownload; 20 29 import org.zkoss.zk.ui.Component; 21 30 import org.zkoss.zk.ui.Executions; … … 28 37 import org.zkoss.zul.Label; 29 38 import org.zkoss.zul.ListModel; 39 import org.zkoss.zul.Menuitem; 30 40 import org.zkoss.zul.Messagebox; 31 41 import org.zkoss.zul.SimpleListModel; … … 40 50 public class SearchResultsController { 41 51 42 private static final Logger logger = Logger.getLogger("FCS-AGGREGATOR");43 52 private List<SearchResult> resultsUnprocessed; 44 53 private List<SearchResult> resultsProcessed; … … 47 56 private UpdateResultsThread resultsThread; 48 57 private int currentRequestId = 0; 49 50 public SearchResultsController(Component resultsArea) { 58 private Label progress; 59 60 private static final Logger logger = Logger.getLogger(SearchResultsController.class.getName()); 61 62 public SearchResultsController(Component resultsArea, Label progress) { 51 63 this.resultsArea = resultsArea; 64 this.progress = progress; 52 65 Executions.getCurrent().getDesktop().enableServerPush(true); 53 } 54 55 public void executeSearch(Set<Treeitem> selectedItems, int maxRecords, String searchString) { 66 searchClient = (SRUThreadedClient) Executions.getCurrent().getDesktop().getWebApp().getAttribute(WebAppListener.SHARED_SRU_CLIENT); 67 } 68 69 public void executeSearch(Set<Treeitem> selectedItems, int maxRecords, String searchString, SRUVersion version) { 56 70 57 71 // execute search only if a user selected at least one endpint/corpus … … 72 86 currentRequestId++; 73 87 74 // initialize client75 searchClient = new SRUThreadedClient(SRUVersion.VERSION_1_2);76 try {77 searchClient.registerRecordParser(new ClarinFCSRecordParser());78 } catch (SRUClientException e) {79 logger.log(Level.SEVERE, "SRU Client parser registration failed", e);80 //TODO error page...81 }82 83 88 // clear are where results are to be displayed 84 89 resultsArea.getChildren().clear(); … … 90 95 // finally, send search requests to all the selected by user 91 96 // endpoints/corpora and process the responses 92 sendRequests(selectedItems, maxRecords, searchString );97 sendRequests(selectedItems, maxRecords, searchString, version); 93 98 processResponses(); 94 99 } 95 100 96 private void sendRequests(Set<Treeitem> selectedItems, int maxRecords, String searchString) { 97 101 private void sendRequests(Set<Treeitem> selectedItems, int maxRecords, String searchString, SRUVersion version) { 102 103 logger.log(Level.INFO, "Executing query={0} maxRecords={1}", 104 new Object[]{searchString, maxRecords}); 105 98 106 for (Treeitem selectedItem : selectedItems) { 99 107 Object nodeData = selectedItem.getAttribute(CorpusTreeNodeRenderer.ITEM_DATA); … … 102 110 // if there whole parent corpus/endpoint will be queried 103 111 } else { 104 SearchResult resultsItem = executeRequest(nodeData, searchString, maxRecords );112 SearchResult resultsItem = executeRequest(nodeData, searchString, maxRecords, version); 105 113 resultsUnprocessed.add(resultsItem); 106 114 } … … 108 116 } 109 117 110 private SearchResult executeRequest(Object nodeData, String searchString, int maxRecords ) {118 private SearchResult executeRequest(Object nodeData, String searchString, int maxRecords, SRUVersion version) { 111 119 112 120 SearchResult resultsItem = new SearchResult(nodeData); 113 //Logger.getLogger("FCS-AGGREGATOR").info("Now executing search: " + searchString + " " + endpoint.getUrl() + " " + corpus.getValue() + " " + maxRecords); 121 logger.log(Level.FINE, "Executing search for {0} query={1} maxRecords={2}", 122 new Object[]{nodeData.toString(), searchString, maxRecords}); 114 123 SRUSearchRetrieveRequest searchRequest = new SRUSearchRetrieveRequest(resultsItem.getEndpoint().getUrl()); 124 searchRequest.setVersion(version); 115 125 searchRequest.setMaximumRecords(maxRecords); 116 126 searchRequest.setRecordSchema(ClarinFCSRecordData.RECORD_SCHEMA); … … 123 133 resultsItem.setFutureResponse(futureResponse); 124 134 } catch (SRUClientException ex) { 125 Logger.getLogger(SearchResultsController.class.getName()).log(Level.INFO, resultsItem.getEndpoint().getUrl(), ex); 135 logger.log(Level.SEVERE, "SearchRetrieve failed for {0}\n {1}\n {2}", 136 new String[]{resultsItem.getEndpoint().getUrl(), ex.getClass().getName(), ex.getMessage()}); 126 137 } 127 138 return resultsItem; … … 130 141 131 142 private void processResponses() { 132 processResponses Async();133 //processResponses Sync();134 135 } 136 137 private void processResponsesSync() {138 139 while (!resultsUnprocessed.isEmpty()) {140 SearchResult resultsItem = resultsUnprocessed.remove(0);141 if (!resultsItem.isWaitingForResponse()) {142 resultsItem.consumeResponse();143 // create groupbox with search results item144 Groupbox groupbox = createRecordsGroup(resultsItem);145 // appand this search result only146 resultsArea.appendChild(groupbox);147 resultsProcessed.add(resultsItem);148 } else {149 resultsUnprocessed.add(resultsItem);150 }151 152 }153 }154 155 private void processResponses Async() {143 processResponsesWithAsyncResultsWindowUpdate(); 144 //processResponsesWithSyncResultsWindowUpdate(); 145 146 } 147 148 // private void processResponsesWithSyncResultsWindowUpdate() { 149 // 150 // while (!resultsUnprocessed.isEmpty()) { 151 // SearchResult resultsItem = resultsUnprocessed.remove(0); 152 // if (!resultsItem.isWaitingForResponse()) { 153 // resultsItem.consumeResponse(); 154 // // create groupbox with search results item 155 // Groupbox groupbox = createRecordsGroup(resultsItem); 156 // // appand this search result only 157 // resultsArea.appendChild(groupbox); 158 // resultsProcessed.add(resultsItem); 159 // } else { 160 // resultsUnprocessed.add(resultsItem); 161 // } 162 // 163 // } 164 // } 165 166 private void processResponsesWithAsyncResultsWindowUpdate() { 156 167 resultsThread = new UpdateResultsThread(); 157 168 resultsThread.start(); … … 163 174 public void run() { 164 175 while (!resultsUnprocessed.isEmpty() && !Thread.currentThread().isInterrupted()) { 165 //TODO display progress bar...176 166 177 SearchResult resultsItem = resultsUnprocessed.remove(0); 167 178 if (!resultsItem.isWaitingForResponse()) { … … 182 193 resultsProcessed.add(resultsItem); 183 194 //System.out.println("RECORDS ITEM ADDED"); 195 184 196 } else { 185 197 resultsUnprocessed.add(resultsItem); … … 222 234 if (requestId != currentRequestId) { 223 235 groupbox.detach(); 236 } 237 238 if (resultsUnprocessed.isEmpty()) { 239 progress.setValue(""); 240 } else { 241 progress.setValue("waiting for " + resultsUnprocessed.size() + " responses..."); 224 242 } 225 243 … … 269 287 //c.setLabel("Left"); 270 288 columns.appendChild(c); 289 //c.setHflex("2"); 271 290 c = new Column(); 272 291 //c.setLabel("Hit"); 273 292 c.setHflex("min"); 293 //c.setHflex("1"); 274 294 columns.appendChild(c); 275 295 c = new Column(); 296 //c.setHflex("2"); 276 297 //c.setLabel("Right"); 277 298 columns.appendChild(c); 278 299 grid.appendChild(columns); 279 300 280 301 List<SRURecord> sruRecords = resultsItem.getResponse().getRecords(); 281 302 ListModel lmodel = new SimpleListModel(sruRecords); 282 303 grid.setModel(lmodel); 283 grid.setRowRenderer(new SearchResultRecordRenderer( ));304 grid.setRowRenderer(new SearchResultRecordRenderer(resultsItem)); 284 305 recordsGroup.appendChild(grid); 285 306 } else { // the response was fine, but there are no records … … 290 311 } 291 312 313 public void exportCSV() { 314 315 boolean noResult = true; 316 StringBuilder csv = new StringBuilder(); 317 if (resultsProcessed != null && !resultsProcessed.isEmpty()) { 318 for (SearchResult result : resultsProcessed) { 319 for (DataViewKWIC kwic : result.getDataKWIC()) { 320 csv.append("\""); 321 csv.append(kwic.getLeft().replace("\"", "QUOTE")); 322 csv.append("\""); 323 csv.append(","); 324 csv.append("\""); 325 csv.append(kwic.getKeyword().replace("\"", "QUOTE")); 326 csv.append("\""); 327 csv.append(","); 328 csv.append("\""); 329 csv.append(kwic.getRight().replace("\"", "QUOTE")); 330 csv.append("\""); 331 csv.append("\n"); 332 noResult = false; 333 } 334 } 335 } 336 337 if (noResult) { 338 Messagebox.show("Nothing to export!"); 339 } else { 340 Filedownload.save(csv.toString(), "text/plain", "ClarinDFederatedContentSearch.csv"); 341 } 342 } 343 344 public void exportTCF() { 345 346 boolean noResult = true; 347 StringBuilder text = new StringBuilder(); 348 349 if (resultsProcessed != null && !resultsProcessed.isEmpty()) { 350 for (SearchResult result : resultsProcessed) { 351 for (DataViewKWIC kwic : result.getDataKWIC()) { 352 text.append(kwic.getLeft()); 353 text.append(" "); 354 text.append(kwic.getKeyword()); 355 text.append(" "); 356 text.append(kwic.getRight()); 357 text.append("\n"); 358 noResult = false; 359 } 360 } 361 362 } 363 364 if (noResult) { 365 Messagebox.show("Nothing to export!"); 366 } else { 367 WLData data; 368 MetaData md = new MetaData(); 369 //data.metaData.source = "Tuebingen Uni"; 370 //md.addMetaDataItem("title", "binding test"); 371 //md.addMetaDataItem("author", "Yana"); 372 TextCorpusStored tc = new TextCorpusStored("unknown"); 373 tc.createTextLayer().addText(text.toString()); 374 data = new WLData(md, tc); 375 ByteArrayOutputStream os = new ByteArrayOutputStream(); 376 try { 377 WLDObjector.write(data, os); 378 Filedownload.save(os.toByteArray(), "text/tcf+xml", "ClarinDFederatedContentSearch.xml"); 379 } catch (WLFormatException ex) { 380 logger.log(Level.SEVERE, "Error exporting TCF {0}\n {1}", new String[]{ex.getClass().getName(), ex.getMessage()}); 381 Messagebox.show("Sorry, export error!"); 382 } 383 } 384 } 385 292 386 public void shutdown() { 293 387 terminateProcessingRequestsAndResponses(); … … 295 389 296 390 private void terminateProcessingRequestsAndResponses() { 297 298 if (searchClient != null) {299 searchClient.shutdown();300 }301 391 302 392 if (resultsThread != null) { … … 308 398 } 309 399 } 400 310 401 Logger.getLogger(SearchResultsController.class.getName()).log(Level.INFO, "Search terminated"); 311 402 } -
SRUAggregator/trunk/src/main/webapp/WEB-INF/zk.xml
r2502 r2527 15 15 </listener> 16 16 <listener> 17 <description>WebApp Cleanupcleanup</description>18 <listener-class>eu.clarin.sru.fcs.aggregator.app.WebApp DestroyedListener</listener-class>17 <description>WebApp initialization and cleanup</description> 18 <listener-class>eu.clarin.sru.fcs.aggregator.app.WebAppListener</listener-class> 19 19 </listener> 20 20 -
SRUAggregator/trunk/src/main/webapp/index.zul
r2502 r2527 1 1 <?xml version="1.0" encoding="utf-8"?> 2 2 <?page title="CLARIN-D Federated Content Search"?> 3 <zk title="CLARIN-D Federated Content Search"> 4 3 <zk> 5 4 <window id="mainWindow" contentStyle="background:white;" height="100%" 6 5 apply="eu.clarin.sru.fcs.aggregator.app.Aggregator"> … … 20 19 <hlayout 21 20 style="margin-top:20px;margin-bottom:10px;margin-left:auto;margin-right:auto;width:95%;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;"> 22 <textbox hflex="1" id="searchString" value=" " focus="true"21 <textbox hflex="1" id="searchString" value="Elefant" focus="true" 23 22 style="font-size:16px;margin:5px 0px 5px 10px;color:#0e4071;border: 1px solid #801418;"/> 24 23 … … 163 162 <panel> 164 163 <panelchildren id="resultsPanel" style="overflow: auto"> 165 166 164 <window id="resultsBox" style="overflow:auto;"> 167 165 <iframe src="help.html" width="800px" height="400px"/> 168 166 </window> 167 <label value=" " id="searchResultsProgress" style="border-width:0px;margin-left:5px;"/> 169 168 </panelchildren> 170 169 </panel>
Note: See TracChangeset
for help on using the changeset viewer.