Changeset 5039
- Timestamp:
- 04/24/14 09:59:48 (10 years ago)
- Location:
- SRUAggregator/trunk/src/main
- Files:
-
- 4 added
- 1 deleted
- 15 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/app/Aggregator.java
r5035 r5039 71 71 @Wire 72 72 A nextButton; 73 @Wire 74 Label tooltipPrevText; 75 @Wire 76 Label tooltipNextText; 73 77 74 78 @Wire … … 111 115 int maxRecords = searchOptionsComposer.getMaxRecords(); 112 116 String searchLang = searchOptionsComposer.getSearchLang(); 117 //searchOffset = new int[]{1, 0}; 113 118 searchOffset = new int[]{1, 0}; 114 searchResultsComposer.executeSearch(selectedCorpora, maxRecords, searchString.getText(), searchOffset, searchLang); 119 searchOffset[0] = searchOffset[0] + searchOffset[1]; 120 searchOffset[1] = maxRecords; 121 searchResultsComposer.executeSearch(selectedCorpora, searchOffset[0], maxRecords, searchString.getText(), searchLang); 115 122 if (searchLang.equals("anylang")) { 116 123 this.weblichtTcf.setVisible(false); … … 182 189 Executions.getCurrent().sendRedirect(WEBLICHT_URL 183 190 + url, "_blank"); 184 } else {185 Messagebox.show("Sorry, drop-off/WebLicht error!");186 191 } 187 192 } … … 193 198 Executions.getCurrent().sendRedirect(WEBLICHT_URL 194 199 + url, "_blank"); 195 } else {196 Messagebox.show("Sorry, drop-off/WebLicht error!");197 200 } 198 201 } … … 253 256 @Listen("onClick = #srLabel") 254 257 public void onClickSearchResult(Event ev) { 258 setupPrevNextSearchTooltips(); 255 259 this.pagesVisibility.openSearchResult(); 256 260 if (this.searchResultsComposer.hasSearchInProgress()) { … … 261 265 this.controlsVisibility.enableControls2(); 262 266 } 267 263 268 } 264 269 … … 280 285 int maxRecords = searchOptionsComposer.getMaxRecords(); 281 286 String searchLang = searchOptionsComposer.getSearchLang(); 282 searchOffset[0] = searchOffset[0] - 2 * searchOffset[1]; 287 //searchOffset[0] = searchOffset[0] - searchOffset[1]; 288 searchOffset[0] = searchOffset[0] - maxRecords; 283 289 if (searchOffset[0] < 1) { 284 290 searchOffset[0] = 1; 285 searchOffset[1] = 0;286 }287 searchResultsComposer.executeSearch(selectedCorpora, maxRecords, searchString.getText(), searchOffset, searchLang);291 } 292 searchOffset[1] = maxRecords; 293 searchResultsComposer.executeSearch(selectedCorpora, searchOffset[0], maxRecords, searchString.getText(), searchLang); 288 294 if (searchLang.equals("anylang")) { 289 295 this.weblichtTcf.setVisible(false); … … 294 300 } 295 301 } 302 296 303 297 304 @Listen("onClick = #nextButton") … … 312 319 int maxRecords = searchOptionsComposer.getMaxRecords(); 313 320 String searchLang = searchOptionsComposer.getSearchLang(); 314 searchResultsComposer.executeSearch(selectedCorpora, maxRecords, searchString.getText(), searchOffset, searchLang); 321 searchOffset[0] = searchOffset[0] + searchOffset[1]; 322 searchOffset[1] = maxRecords; 323 searchResultsComposer.executeSearch(selectedCorpora, searchOffset[0], maxRecords, searchString.getText(), searchLang); 315 324 if (searchLang.equals("anylang")) { 316 325 this.weblichtTcf.setVisible(false); … … 341 350 LOGGER.log(Level.INFO, "Received parameter: operation[{0}], ", operationString); 342 351 } 352 353 private void setupPrevNextSearchTooltips() { 354 int startHit = searchOffset[0] - searchOptionsComposer.getMaxRecords(); 355 if (startHit < 1) { 356 startHit = 1; 357 } 358 int endHit = searchOffset[0] - 1; 359 tooltipPrevText.setValue("hits " + 360 startHit + "-" + endHit); 361 startHit = searchOffset[0] + searchOffset[1]; 362 endHit = startHit + searchOptionsComposer.getMaxRecords() - 1; 363 tooltipNextText.setValue("hits " + 364 startHit + "-" + endHit); 365 } 343 366 } -
SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/app/SearchOptions.java
r5036 r5039 16 16 import eu.clarin.sru.fcs.aggregator.sopt.CorpusModelLive; 17 17 import eu.clarin.sru.fcs.aggregator.sopt.CorpusRendererCached; 18 import eu.clarin.sru.fcs.aggregator.sopt.CorpusRendererI;19 18 import eu.clarin.sru.fcs.aggregator.sopt.CorpusRendererLive; 20 19 import eu.clarin.sru.fcs.aggregator.sopt.Languages; 21 20 import eu.clarin.sru.fcs.aggregator.cache.ScanCache; 21 import eu.clarin.sru.fcs.aggregator.sopt.CorpusRenderer; 22 import eu.clarin.sru.fcs.aggregator.sopt.Language; 22 23 import eu.clarin.sru.fcs.aggregator.util.SRUCQL; 23 24 import java.lang.reflect.Type; … … 73 74 74 75 private CorpusModelI corporaModel; 75 private CorpusRenderer IcorpusRenderer;76 private CorpusRenderer corpusRenderer; 76 77 77 78 private boolean liveMode = false; … … 135 136 } 136 137 } 138 onSelectAll(null); 137 139 } 138 140 … … 151 153 Treechildren openTreeItems = tree.getTreechildren(); 152 154 for (Treeitem openItem : openTreeItems.getItems()) { 153 corpusRenderer.updateItem(openItem, true); 155 if (openItem.isVisible()) { 156 corpusRenderer.updateItem(openItem, true); 157 } 154 158 } 155 159 } … … 161 165 162 166 DefaultTreeNode<Corpus> node = (DefaultTreeNode<Corpus>) openItem.getValue(); 163 Corpus data = node.getData();164 System.out.println(data);167 //Corpus data = node.getData(); 168 //System.out.println(data); 165 169 166 170 corpusRenderer.updateItem(openItem, false); … … 227 231 DefaultTreeNode<Corpus> node = item.getValue(); 228 232 Corpus corpus = node.getData(); 229 for (String langCode : corpus.getLanguages()) { 230 availableLangs.add(langCode); 231 } 232 } 233 234 List<String> sortedAvailableLanguages = new ArrayList<String>(availableLangs.size()); 235 sortedAvailableLanguages.addAll(availableLangs); 236 Collections.sort(sortedAvailableLanguages); 237 for (String langCode : sortedAvailableLanguages) { 238 String name = this.languages.nameForCode(langCode); 239 if (name != null) { 240 Comboitem item = this.languageSelect.appendItem(name); 241 item.setValue(langCode); 242 } 233 // offer for selection only those langauges 234 // that are unique for a corpus 235 if (corpus.getLanguages().size() == 1) { 236 availableLangs.add(corpus.getLanguages().iterator().next()); 237 } 238 //for (String langCode : corpus.getLanguages()) { 239 // availableLangs.add(langCode); 240 //} 241 } 242 243 //List<String> sortedAvailableLanguages = new ArrayList<String>(availableLangs.size()); 244 //sortedAvailableLanguages.addAll(availableLangs); 245 //Collections.sort(sortedAvailableLanguages); 246 List<Language> sortedLangs = new ArrayList<Language>(availableLangs.size()); 247 for (String langCode : availableLangs) { 248 Language lang = this.languages.langForCode(langCode); 249 if (lang != null) { 250 sortedLangs.add(lang); 251 } 252 } 253 Collections.sort(sortedLangs); 254 for (Language lang : sortedLangs) { 255 Comboitem item = this.languageSelect.appendItem(lang.getNameEn()); 256 item.setValue(lang.getCode()); 243 257 } 244 258 } -
SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/app/SearchResults.java
r5035 r5039 21 21 import org.zkoss.zk.ui.select.annotation.Wire; 22 22 import org.zkoss.zul.Groupbox; 23 import org.zkoss.zul.Label;24 23 import org.zkoss.zul.Messagebox; 25 24 import eu.clarin.sru.client.SRUClientException; 26 import eu.clarin.sru.client.SRURecord;27 25 import eu.clarin.sru.client.SRUSearchRetrieveRequest; 28 26 import eu.clarin.sru.client.SRUSearchRetrieveResponse; … … 31 29 import eu.clarin.sru.fcs.aggregator.sopt.Corpus; 32 30 import eu.clarin.sru.fcs.aggregator.sopt.Languages; 33 import eu.clarin.sru.fcs.aggregator.sresult.Kwic;34 31 import eu.clarin.sru.fcs.aggregator.sresult.SearchResult; 35 import eu.clarin.sru.fcs.aggregator.sresult.SearchResultRecordRenderer; 32 import eu.clarin.sru.fcs.aggregator.sresult.SearchResultContent; 33 import eu.clarin.sru.fcs.aggregator.sresult.SearchResultGroupRenderer; 36 34 import eu.clarin.sru.fcs.aggregator.util.SRUCQL; 37 import eu.clarin.weblicht.wlfxb.io.WLDObjector;38 import eu.clarin.weblicht.wlfxb.io.WLFormatException;39 import eu.clarin.weblicht.wlfxb.md.xb.MetaData;40 import eu.clarin.weblicht.wlfxb.tc.api.MatchedCorpus;41 import eu.clarin.weblicht.wlfxb.tc.api.Token;42 import eu.clarin.weblicht.wlfxb.tc.xb.TextCorpusStored;43 import eu.clarin.weblicht.wlfxb.xb.WLData;44 import java.io.ByteArrayOutputStream;45 35 import java.io.IOException; 46 import java.io.UnsupportedEncodingException;47 36 import java.text.SimpleDateFormat; 48 37 import java.util.Date; 49 import java.util.HashSet;50 38 import java.util.Random; 51 39 import java.util.Timer; … … 53 41 import java.util.concurrent.Future; 54 42 import java.util.concurrent.atomic.AtomicBoolean; 55 import opennlp.tools.tokenize.TokenizerME;56 import opennlp.tools.tokenize.TokenizerModel;57 import org.apache.poi.ss.usermodel.Cell;58 import org.apache.poi.ss.usermodel.CellStyle;59 import org.apache.poi.ss.usermodel.Font;60 import org.apache.poi.ss.usermodel.Row;61 import org.apache.poi.ss.usermodel.Sheet;62 import org.apache.poi.xssf.streaming.SXSSFWorkbook;63 43 import org.zkoss.zhtml.Filedownload; 64 44 import org.zkoss.zk.ui.event.EventListener; 65 import org.zkoss.zul.Column;66 import org.zkoss.zul.Columns;67 import org.zkoss.zul.Grid;68 import org.zkoss.zul.ListModel;69 import org.zkoss.zul.SimpleListModel;70 45 import org.zkoss.zul.Vlayout; 71 46 … … 92 67 private AtomicBoolean hasResults = new AtomicBoolean(false); 93 68 private AtomicBoolean searchInProgress = new AtomicBoolean(false); 94 private int[] searchOffset; 69 //private int[] searchOffset = new int[2]; 70 private int startRecord; 95 71 private int maxRecords; 96 72 private static final String WSPACE_SERVER_URL = "http://egi-cloud21.zam.kfa-juelich.de"; … … 104 80 private static final String DROP_OFF_URL = "http://ws1-clarind.esc.rzg.mpg.de/drop-off/storage/"; 105 81 82 private Groupbox firstNoResultsGb = null; 83 private final Object firstNoResultsGbLoc = new Object(); 84 85 private SearchResultGroupRenderer srItemRenderer; 86 private SearchResultContent srExporter; 87 88 private static final String SEARCH_RESULTS_ENCODING = "UTF-8"; 106 89 107 90 @Override … … 118 101 Set<SearchResults> activeControllers = (Set<SearchResults>) Executions.getCurrent().getDesktop().getWebApp().getAttribute(WebAppListener.ACTIVE_SEARCH_CONTROLLERS); 119 102 activeControllers.add(this); 103 104 srItemRenderer = new SearchResultGroupRenderer(); 105 srExporter = new SearchResultContent(); 120 106 } 121 107 … … 126 112 this.controlsVisibility.disableControls2(); 127 113 resultsBox.getChildren().clear(); 114 synchronized (firstNoResultsGbLoc) { 115 firstNoResultsGb = null; 116 } 128 117 this.searchInProgress.set(false); 129 118 this.hasResults.set(false); 130 119 } 131 120 132 void executeSearch(Map<String, Set<Corpus>> selectedCorpora, int maxRecords, String searchString, int[] searchOffset, String searchLanguage) {121 void executeSearch(Map<String, Set<Corpus>> selectedCorpora, int startRecord, int maxRecords, String searchString, String searchLanguage) { 133 122 134 123 this.controlsVisibility.disableControls1(); … … 142 131 this.hasResults.set(false); 143 132 this.searchInProgress.set(true); 144 this.s earchOffset = searchOffset;133 this.startRecord = startRecord; 145 134 146 135 // terminate previous search requests and corresponding response processing … … 156 145 resultsProcessed = new ArrayList<SearchResult>(); 157 146 resultsUnprocessed = new ArrayList<SearchResult>(); 158 147 synchronized (firstNoResultsGbLoc) { 148 firstNoResultsGb = null; 149 } 150 159 151 // set up timer, so that when it takes too much time to get the response to cancell the request 160 152 timer = new Timer(); … … 173 165 174 166 private SearchResult executeSearch(Corpus corpus, String searchString) { 175 SearchResult resultsItem = new SearchResult(corpus, searchString );167 SearchResult resultsItem = new SearchResult(corpus, searchString, startRecord, startRecord + maxRecords - 1); 176 168 LOGGER.log(Level.INFO, "Executing search for {0} query={1} maxRecords={2}", 177 169 new Object[]{corpus.toString(), searchString, maxRecords}); … … 183 175 //searchRequest.setQuery("%22" + searchString + "%22"); 184 176 searchRequest.setQuery("\"" + searchString + "\""); 185 searchRequest.setStartRecord(searchOffset[0] + searchOffset[1]); 177 //searchRequest.setStartRecord(searchOffset[0] + searchOffset[1]); 178 searchRequest.setStartRecord(this.startRecord); 186 179 if (resultsItem.hasCorpusHandler()) { 187 180 searchRequest.setExtraRequestData(SRUCQL.SEARCH_CORPUS_HANDLE_PARAMETER, resultsItem.getCorpus().getHandle()); … … 233 226 } 234 227 228 235 229 private class UpdateResultsThread extends Thread { 236 230 … … 242 236 if (!resultsItem.isWaitingForResponse()) { 243 237 resultsItem.consumeResponse(); 244 Executions.schedule(resultsBox.getDesktop(), new SearchResults.ResponseListener( resultsItem, currentRequestId), new Event("onDummy"));238 Executions.schedule(resultsBox.getDesktop(), new SearchResults.ResponseListener(srItemRenderer, resultsItem, currentRequestId), new Event("onDummy")); 245 239 // this alternative to Executions.schedule() - sinchronious update - 246 240 // doesn't work: if interrupted here (exception thrown), then … … 273 267 int requestId; 274 268 SearchResult resultsItem; 275 276 public ResponseListener(SearchResult resultsItem, int requestId) { 269 SearchResultGroupRenderer srRenderer; 270 271 public ResponseListener(SearchResultGroupRenderer srRenderer, SearchResult resultsItem, int requestId) { 272 this.srRenderer = srRenderer; 277 273 this.resultsItem = resultsItem; 278 274 this.requestId = requestId; … … 283 279 284 280 // create groupbox with search results item 285 Groupbox groupbox = createRecordsGroup(resultsItem); 286 287 // appand this search result only if it 281 //Groupbox groupbox = createRecordsGroup(resultsItem); 282 Groupbox groupbox = this.srRenderer.createRecordsGroup(resultsItem); 283 284 // append this search result only if it 288 285 // is a result of the current request 289 286 if (requestId == currentRequestId) { 290 resultsBox.appendChild(groupbox); 287 // if the item has results, append it before 288 // the item that has no resuls (if exists): 289 if (groupbox.getAttribute(SearchResultGroupRenderer.NO_RESULTS) == null) { 290 resultsBox.insertBefore(groupbox, firstNoResultsGb); 291 // if there are no results in this item, 292 // append it a the end: 293 } else { 294 resultsBox.appendChild(groupbox); 295 synchronized (firstNoResultsGbLoc) { 296 if (firstNoResultsGb == null) { 297 firstNoResultsGb = groupbox; 298 } 299 } 300 } 301 291 302 } 292 303 … … 295 306 if (requestId != currentRequestId) { 296 307 groupbox.detach(); 308 synchronized (firstNoResultsGbLoc) { 309 firstNoResultsGb = null; 310 } 297 311 } 298 312 … … 302 316 if (last) { 303 317 controlsVisibility.disableProgressMeter(); 304 searchOffset[0] = searchOffset[0] + searchOffset[1];305 searchOffset[1] = maxRecords;306 318 pagesVisibility.openSearchResult(); 307 319 308 if (s earchOffset[0]> 1) {320 if (startRecord > 1) { 309 321 controlsVisibility.enablePrevButton(); 310 322 } … … 321 333 } 322 334 323 private Groupbox createRecordsGroup(SearchResult resultsItem) { 324 325 Groupbox recordsGroup = new Groupbox(); 326 recordsGroup.setMold("3d"); 327 recordsGroup.setSclass("ccsLightBlue"); 328 recordsGroup.setContentStyle("border:0;"); 329 recordsGroup.setStyle("margin:10px;10px;10px;10px;"); 330 recordsGroup.setClosable(true); 331 // create title 332 StringBuilder sb = new StringBuilder(); 333 if (resultsItem.hasCorpusHandler()) { 334 if (resultsItem.getCorpus().getDisplayName() != null) { 335 // sb.append(" "); 336 sb.append(resultsItem.getCorpus().getDisplayName()); 337 sb.append(", "); 338 } 339 } 340 sb.append(resultsItem.getCorpus().getInstitution().getName()); 341 recordsGroup.setTitle(sb.toString()); 342 343 // populate it with records grid or failure message 344 if (resultsItem.getResponse() == null) { // there was an error in response 345 recordsGroup.appendChild(new Label("Sorry, the search failed!")); 346 } else if (resultsItem.getResponse().hasRecords()) { // the response was fine and there >=1 records 347 Grid grid = new Grid(); 348 // grid.setWidth("100%"); 349 // grid.setMold("paging"); 350 // grid.setPageSize(10); 351 Columns columns = new Columns(); 352 Column c; 353 354 c = new Column(); 355 //c.setLabel("Left"); 356 columns.appendChild(c); 357 //c.setHflex("2"); 358 c = new Column(); 359 //c.setLabel("Hit"); 360 c.setHflex("min"); 361 //c.setHflex("1"); 362 columns.appendChild(c); 363 c = new Column(); 364 //c.setHflex("2"); 365 //c.setLabel("Right"); 366 // info column 367 columns.appendChild(c); 368 c = new Column(); 369 c.setHflex("min"); 370 columns.appendChild(c); 371 grid.appendChild(columns); 372 373 List<SRURecord> sruRecords = resultsItem.getResponse().getRecords(); 374 ListModel lmodel = new SimpleListModel(sruRecords); 375 grid.setModel(lmodel); 376 grid.setRowRenderer(new SearchResultRecordRenderer(resultsItem)); 377 recordsGroup.appendChild(grid); 378 grid.setStyle("margin:10px;border:0px;"); 379 } else { // the response was fine, but there are no records 380 recordsGroup.appendChild(new Label("no results")); 381 } 382 return recordsGroup; 383 } 335 384 336 385 337 public void exportTCF() { 386 byte[] bytes = getExportTokenizedTCF();338 byte[] bytes = srExporter.getExportTokenizedTCF(resultsProcessed, searchLanguage, languages); 387 339 if (bytes != null) { 388 340 Filedownload.save(bytes, "text/tcf+xml", "ClarinDFederatedContentSearch.xml"); … … 391 343 392 344 public void exportText() { 393 String text = getExportText().toString();345 String text = srExporter.getExportText(resultsProcessed); 394 346 if (text != null) { 395 347 Filedownload.save(text, "text/plain", "ClarinDFederatedContentSearch.txt"); … … 400 352 void exportExcel() { 401 353 402 byte[] bytes = getExportExcel();354 byte[] bytes = srExporter.getExportExcel(resultsProcessed); 403 355 if (bytes != null) { 404 356 Filedownload.save(bytes, "text/tcf+xml", "ClarinDFederatedContentSearch.xls"); … … 406 358 } 407 359 408 private byte[] getExportExcel() { 409 410 boolean noResult = true; 411 SXSSFWorkbook workbook = null; 412 ByteArrayOutputStream excelStream = new ByteArrayOutputStream(); 413 if (resultsProcessed != null && !resultsProcessed.isEmpty()) { 414 try { 415 String[] headers = new String[] { 416 "LEFT CONTEXT", "KEYWORD", "RIGHT CONTEXT", "PID", "REFERENCE"}; 417 418 workbook = new SXSSFWorkbook(); 419 Sheet sheet = workbook.createSheet(); 420 421 Font boldFont = workbook.createFont(); 422 boldFont.setBoldweight(Font.BOLDWEIGHT_BOLD); 423 424 // Header 425 CellStyle headerStyle = workbook.createCellStyle(); 426 headerStyle.setFont(boldFont); 427 428 Row row = sheet.createRow(0); 429 430 for (int j = 0; j < headers.length; ++j) { 431 Cell cell = row.createCell(j, Cell.CELL_TYPE_STRING); 432 cell.setCellValue(headers[j]); 433 cell.setCellStyle(headerStyle); 434 } 435 436 // Body 437 Cell cell; 438 for (int k = 0; k < resultsProcessed.size(); k++) { 439 SearchResult result = resultsProcessed.get(k); 440 List<Kwic> kwics = result.getKwics(); 441 for (int i = 0; i < kwics.size(); i++) { 442 Kwic kwic = kwics.get(i); 443 row = sheet.createRow(k + i + 1); 444 cell = row.createCell(0, Cell.CELL_TYPE_STRING); 445 cell.setCellValue(kwic.getLeft()); 446 cell = row.createCell(1, Cell.CELL_TYPE_STRING); 447 cell.setCellValue(kwic.getKeyword()); 448 cell = row.createCell(2, Cell.CELL_TYPE_STRING); 449 cell.setCellValue(kwic.getRight()); 450 if (kwic.getPid() != null) { 451 cell = row.createCell(3, Cell.CELL_TYPE_STRING); 452 cell.setCellValue(kwic.getPid()); 453 } 454 if (kwic.getReference() != null) { 455 cell = row.createCell(3, Cell.CELL_TYPE_STRING); 456 cell.setCellValue(kwic.getReference()); 457 } 458 noResult = false; 459 } 460 } 461 workbook.write(excelStream); 462 } catch (IOException ex) { 463 // should not happen 464 Logger.getLogger(SearchResults.class.getName()).log(Level.SEVERE, null, ex); 465 } finally { 466 if (workbook != null) { 467 workbook.dispose(); 468 } 469 } 470 } 471 if (noResult) { 472 Messagebox.show("Nothing to export!"); 473 return null; 474 } else { 475 return excelStream.toByteArray(); 476 } 477 478 } 360 479 361 480 362 void exportPWText(String user, String pass) { 481 363 byte[] bytes = null; 482 364 try { 483 bytes = getExportText().toString().getBytes("UTF-8"); 484 } catch (UnsupportedEncodingException ex) { 365 String text = srExporter.getExportText(resultsProcessed); 366 if (text != null) { 367 bytes = text.getBytes(SEARCH_RESULTS_ENCODING); 368 } 369 } catch (Exception ex) { 485 370 Logger.getLogger(SearchResults.class.getName()).log(Level.SEVERE, null, ex); 486 371 } … … 491 376 492 377 String useWebLichtOnText() { 493 byte[] bytes = null;494 378 String url = null; 495 379 try { 496 bytes = getExportText().toString().getBytes("UTF-8"); 497 } catch (UnsupportedEncodingException ex) { 380 String text = srExporter.getExportText(resultsProcessed); 381 if (text != null) { 382 byte[] bytes = text.getBytes(SEARCH_RESULTS_ENCODING); 383 url = uploadToDropOff(bytes, "text/plan",".txt"); 384 } 385 } catch (Exception ex) { 498 386 Logger.getLogger(SearchResults.class.getName()).log(Level.SEVERE, null, ex); 499 }500 if (bytes != null) {501 url = uploadToDropOff(bytes, "text/plan",".txt");502 387 } 503 388 return url; … … 506 391 String useWebLichtOnToks() { 507 392 String url = null; 508 byte[] bytes = getExportTokenizedTCF();393 byte[] bytes = srExporter.getExportTokenizedTCF(resultsProcessed, searchLanguage, languages); 509 394 if (bytes != null) { 510 395 url = uploadToDropOff(bytes, "text/tcf+xml",".tcf"); … … 514 399 515 400 void exportPWExcel(String user, String pass) { 516 byte[] bytes = getExportExcel();401 byte[] bytes = srExporter.getExportExcel(resultsProcessed); 517 402 if (bytes != null) { 518 403 uploadToPW(user, pass, bytes, "application/vnd.ms-excel",".xls"); … … 522 407 public void exportPWTCF(String user, String pass) { 523 408 524 byte[] bytes = getExportTokenizedTCF();409 byte[] bytes = srExporter.getExportTokenizedTCF(resultsProcessed, searchLanguage, languages); 525 410 if (bytes != null) { 526 411 uploadToPW(user, pass, bytes, "text/tcf+xml",".tcf"); 527 412 } 528 413 } 529 530 private byte[] getExportTCF() { 531 StringBuilder text = new StringBuilder(); 532 Set<String> resultsLangs = new HashSet<String>(); 533 if (resultsProcessed != null && !resultsProcessed.isEmpty()) { 534 for (SearchResult result : resultsProcessed) { 535 resultsLangs.addAll(result.getCorpus().getLanguages()); 536 for (Kwic kwic : result.getKwics()) { 537 text.append(kwic.getLeft()); 538 text.append(" "); 539 text.append(kwic.getKeyword()); 540 text.append(" "); 541 text.append(kwic.getRight()); 542 text.append("\n"); 543 } 544 } 545 546 } 547 ByteArrayOutputStream os = null; 548 if (text.length() == 0) { 549 Messagebox.show("Nothing to export!"); 550 } else { 551 WLData data; 552 MetaData md = new MetaData(); 553 String resultsLang = "unknown"; 554 if (resultsLangs.size() == 1) { 555 resultsLang = resultsLangs.iterator().next(); 556 String code2 = languages.code2ForCode(resultsLang); 557 if (code2 != null) { 558 resultsLang = code2; 559 } 560 } else if (!searchLanguage.equals("anylang")) { 561 String code2 = languages.code2ForCode(searchLanguage); 562 if (code2 == null) { 563 resultsLang = searchLanguage; 564 } else { 565 resultsLang = code2; 566 } 567 } 568 TextCorpusStored tc = new TextCorpusStored(resultsLang); 569 tc.createTextLayer().addText(text.toString()); 570 data = new WLData(md, tc); 571 os = new ByteArrayOutputStream(); 572 try { 573 WLDObjector.write(data, os); 574 } catch (WLFormatException ex) { 575 LOGGER.log(Level.SEVERE, "Error exporting TCF {0} {1}", new String[]{ex.getClass().getName(), ex.getMessage()}); 576 Messagebox.show("Sorry, export error!"); 577 } 578 } 579 if (os == null) { 580 return null; 581 } else { 582 return os.toByteArray(); 583 } 584 } 585 586 587 private byte[] getExportTokenizedTCF() { 588 StringBuilder text = new StringBuilder(); 589 Set<String> resultsLangs = new HashSet<String>(); 590 if (resultsProcessed != null && !resultsProcessed.isEmpty()) { 591 for (SearchResult result : resultsProcessed) { 592 resultsLangs.addAll(result.getCorpus().getLanguages()); 593 for (Kwic kwic : result.getKwics()) { 594 text.append(kwic.getLeft()); 595 text.append(" "); 596 text.append(kwic.getKeyword()); 597 text.append(" "); 598 text.append(kwic.getRight()); 599 text.append("\n"); 600 } 601 } 602 603 } 604 ByteArrayOutputStream os = null; 605 if (text.length() == 0) { 606 Messagebox.show("Nothing to export!"); 607 } else { 608 WLData data; 609 MetaData md = new MetaData(); 610 String resultsLang = "unknown"; 611 if (resultsLangs.size() == 1) { 612 resultsLang = resultsLangs.iterator().next(); 613 String code2 = languages.code2ForCode(resultsLang); 614 if (code2 != null) { 615 resultsLang = code2; 616 } 617 } else if (!searchLanguage.equals("anylang")) { 618 String code2 = languages.code2ForCode(searchLanguage); 619 if (code2 == null) { 620 resultsLang = searchLanguage; 621 } else { 622 resultsLang = code2; 623 } 624 } 625 TextCorpusStored tc = new TextCorpusStored(resultsLang); 626 tc.createTextLayer().addText(text.toString()); 627 addTokensSentencesMatches(tc); 628 data = new WLData(md, tc); 629 os = new ByteArrayOutputStream(); 630 try { 631 WLDObjector.write(data, os); 632 } catch (WLFormatException ex) { 633 LOGGER.log(Level.SEVERE, "Error exporting TCF {0} {1}", new String[]{ex.getClass().getName(), ex.getMessage()}); 634 Messagebox.show("Sorry, export error!"); 635 } 636 } 637 if (os == null) { 638 return null; 639 } else { 640 return os.toByteArray(); 641 } 642 } 643 644 645 private void addTokensSentencesMatches(TextCorpusStored tc) { 646 647 TokenizerModel model = (TokenizerModel) Executions.getCurrent().getDesktop().getWebApp().getAttribute(WebAppListener.DE_TOK_MODEL); 648 649 if (model == null || !tc.getLanguage().equals("de")) { 650 return; 651 } 652 TokenizerME tokenizer = new TokenizerME(model); 653 654 if (resultsProcessed != null && !resultsProcessed.isEmpty()) { 655 tc.createTokensLayer(); 656 tc.createSentencesLayer(); 657 tc.createMatchesLayer("FCS", resultsProcessed.get(0).getSearchString()); 658 for (SearchResult result : resultsProcessed) { 659 MatchedCorpus mCorpus = tc.getMatchesLayer().addCorpus(result.getCorpus().getDisplayName(), result.getCorpus().getHandle()); 660 for (Kwic kwic : result.getKwics()) { 661 List<Token> tokens = new ArrayList<Token>(); 662 addToTcfTokens(tokens, tc, tokenizer.tokenize(kwic.getLeft())); 663 String[] target = tokenizer.tokenize(kwic.getKeyword()); 664 List<Token> targetTokens = addToTcfTokens(tokens, tc, target); 665 addToTcfTokens(tokens, tc, tokenizer.tokenize(kwic.getRight())); 666 tc.getSentencesLayer().addSentence(tokens); 667 List<String> pidAndRef = new ArrayList<String>(); 668 if (kwic.getPid() != null) { 669 pidAndRef.add(kwic.getPid()); 670 } 671 if (kwic.getReference() != null) { 672 pidAndRef.add(kwic.getReference()); 673 } 674 tc.getMatchesLayer().addItem(mCorpus, targetTokens, pidAndRef); 675 } 676 } 677 } 678 } 679 680 681 private List<Token> addToTcfTokens(List<Token> tokens, TextCorpusStored tc, String[] tokenStrings) { 682 List<Token> addedTokens = new ArrayList<Token>(tokenStrings.length); 683 for (String tokenString : tokenStrings) { 684 Token token = tc.getTokensLayer().addToken(tokenString); 685 addedTokens.add(token); 686 tokens.add(token); 687 } 688 return addedTokens; 689 } 690 691 private CharSequence getExportText() { 692 StringBuilder text = new StringBuilder(); 693 //Set<String> resultsLangs = new HashSet<String>(); 694 if (resultsProcessed != null && !resultsProcessed.isEmpty()) { 695 for (SearchResult result : resultsProcessed) { 696 //resultsLangs.addAll(result.getCorpus().getLanguages()); 697 for (Kwic kwic : result.getKwics()) { 698 text.append(kwic.getLeft()); 699 text.append(" "); 700 text.append(kwic.getKeyword()); 701 text.append(" "); 702 text.append(kwic.getRight()); 703 text.append("\n"); 704 } 705 } 706 707 } 708 if (text.length() == 0) { 709 Messagebox.show("Nothing to export!"); 710 return null; 711 } else { 712 return text; 713 } 714 } 414 715 415 716 416 public void exportCSV() { 717 String csv = getExportCSV(";");417 String csv = srExporter.getExportCSV(resultsProcessed, ";"); 718 418 if (csv != null) { 719 419 Filedownload.save(csv.toString(), "text/plain", "ClarinDFederatedContentSearch.csv"); … … 723 423 724 424 public void exportPWCSV(String user, String pass) { 725 String csv = getExportCSV(";"); 425 //String csv = getExportCSV(";"); 426 String csv = srExporter.getExportCSV(resultsProcessed, ";"); 726 427 if (csv != null) { 727 428 uploadToPW(user, pass, csv.getBytes(), "text/csv",".csv"); 728 429 } 729 430 } 730 731 private String getExportCSV(String separator) { 732 733 boolean noResult = true; 734 StringBuilder csv = new StringBuilder(); 735 if (resultsProcessed != null && !resultsProcessed.isEmpty()) { 736 String[] headers = new String[] { 737 "LEFT CONTEXT", "KEYWORD", "RIGHT CONTEXT", "PID", "REFERENCE"}; 738 for (String header : headers) { 739 csv.append("\""); csv.append(header); csv.append("\""); 740 csv.append(separator); 741 } 742 csv.append("\n"); 743 744 for (SearchResult result : resultsProcessed) { 745 for (Kwic kwic : result.getKwics()) { 746 csv.append("\""); csv.append(escapeQuotes(kwic.getLeft())); csv.append("\""); 747 csv.append(separator); 748 csv.append("\""); csv.append(escapeQuotes(kwic.getKeyword())); csv.append("\""); 749 csv.append(separator); 750 csv.append("\""); csv.append(escapeQuotes(kwic.getRight())); csv.append("\""); 751 csv.append(separator); 752 csv.append("\""); 753 if (kwic.getPid() != null) { 754 csv.append(escapeQuotes(kwic.getPid())); 755 } 756 csv.append("\""); 757 csv.append(separator); 758 csv.append("\""); 759 if (kwic.getReference() != null) { 760 csv.append(escapeQuotes(kwic.getReference())); 761 } 762 csv.append("\""); 763 csv.append("\n"); 764 noResult = false; 765 } 766 } 767 } 768 if (noResult) { 769 Messagebox.show("Nothing to export!"); 770 return null; 771 } else { 772 return csv.toString(); 773 } 774 } 775 776 private CharSequence escapeQuotes(String text) { 777 StringBuilder sb = new StringBuilder(); 778 for (int i = 0; i < text.length(); i++) { 779 char ch = text.charAt(i); 780 if (ch == '"') { 781 sb.append('"'); 782 } 783 sb.append(ch); 784 } 785 return sb; 786 } 787 788 private void uploadToPW(String user, String pass, byte[] bytes, String mimeType, String fileExtention) { 431 432 private void uploadToPW(String user, String pass, byte[] bytes, String mimeType, String fileExtention) { 789 433 try { 790 434 Sardine sardine = SardineFactory.begin(); … … 850 494 } 851 495 496 852 497 private void setUpSRUVersion() { 853 498 String[] paramValue = Executions.getCurrent().getParameterMap().get(SRUCQL.VERSION); -
SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/app/WebAppListener.java
r5037 r5039 51 51 private static final String SCAN_DIR_NAME = "scan"; 52 52 private static final TimeUnit CACHE_UPDATE_INTERVAL_UNIT = TimeUnit.HOURS; 53 private static final int CACHE_UPDATE_INTERVAL = 5;54 private static final int CACHE_MAX_DEPTH = 2;53 private static final int CACHE_UPDATE_INTERVAL = 6; 54 private static final int CACHE_MAX_DEPTH = 3; 55 55 private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 56 56 public static final String CORPUS_CRAWLER = "CORPUS_CRAWLER"; … … 72 72 73 73 setUpScanCache(webapp); 74 //setUpScanCacheForReadOnly(webapp); 74 75 75 76 setUpTokenizers(webapp); … … 91 92 92 93 private String getScanDirectory() { 93 File aggregatorDir = new File(System.getProperty("user.home"), "/." + AGGREGATOR_DIR_NAME);94 //File aggregatorDir = new File(System.getProperty("user.home"), "/." + AGGREGATOR_DIR_NAME); 94 95 //File aggregatorDir = new File("/var/www", "/." + AGGREGATOR_DIR_NAME); 96 File aggregatorDir = new File("/data/fcsAggregator"); 95 97 96 98 if (!aggregatorDir.exists()) { 97 aggregatorDir.mkdir(); 99 if (!aggregatorDir.mkdir()) { 100 LOGGER.info("Scan directory does not exist and cannot be created: " 101 + aggregatorDir.getAbsolutePath()); 102 } 98 103 } 99 104 File scanDir = new File(aggregatorDir, SCAN_DIR_NAME); … … 105 110 return scanPath; 106 111 } 112 113 /** 114 * Use this method instead of setUpScanCache() method if it is necessary 115 * to run the application without scan data crawl, given that the scan 116 * data was crawled before and was stored as cache under appropriate 117 * location (useful when testing or when smth is wrong with the endpoint 118 * scan responses). 119 * 120 * @param webapp 121 */ 122 private void setUpScanCacheForReadOnly(WebApp webapp) { 123 ScanCacheFiled scanCacheFiled = new ScanCacheFiled(getScanDirectory()); 124 ScanCache scanCache; 125 LOGGER.info("Start cache read"); 126 try { 127 scanCache = scanCacheFiled.read(); 128 LOGGER.info("Finished cache read, number of root corpora: " + scanCache.getRootCorpora().size()); 129 } catch (Exception e) { 130 LOGGER.log(Level.SEVERE, "Error while reading the scan cache!", e); 131 scanCache = new SimpleInMemScanCache(); 132 } 133 webapp.setAttribute(CORPUS_CACHE, scanCache); 134 } 107 135 108 136 private void setUpScanCache(WebApp webapp) { … … 111 139 CenterRegistryI centerRegistry = new CenterRegistryLive(); 112 140 SRUThreadedClient sruScanClient = (SRUThreadedClient) webapp.getAttribute(WebAppListener.SHARED_SRU_CLIENT); 113 EndpointUrlFilter filter = new EndpointUrlFilter();114 //filter.urlShouldContainAnyOf("leipzig" , ".mpi.nl");141 //EndpointUrlFilter filter = new EndpointUrlFilter(); 142 //filter.urlShouldContainAnyOf("leipzig"); 115 143 //filter.urlShouldContainAnyOf("uni-tuebingen.de"); 116 filter.urlShouldContainAnyOf("uni-tuebingen.de", ".mpi.nl");144 //filter.urlShouldContainAnyOf("uni-tuebingen.de", ".mpi.nl"); 117 145 //filter.urlShouldContainAnyOf("dspin.dwds.de", "lindat."); 118 ScanCrawler scanCrawler = new ScanCrawler(centerRegistry, sruScanClient, filter, CACHE_MAX_DEPTH);119 //ScanCrawler scanCrawler = new ScanCrawler(centerRegistry, sruScanClient, null, CACHE_MAX_DEPTH);146 //ScanCrawler scanCrawler = new ScanCrawler(centerRegistry, sruScanClient, filter, CACHE_MAX_DEPTH); 147 ScanCrawler scanCrawler = new ScanCrawler(centerRegistry, sruScanClient, null, CACHE_MAX_DEPTH); 120 148 ScanCache scanCache; 121 149 … … 191 219 webapp.setAttribute(DE_TOK_MODEL, model); 192 220 } 221 193 222 } -
SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/cache/ScanCacheFiled.java
r5037 r5039 22 22 * Utility for reading/writing scan data (endpoints descriptions) from/to 23 23 * ScanCache from/to local files. 24 * 25 * The data saved in a folder into files has the following format: 26 * inst.txt lists all the centers and the endpoints that have CQL compliant 27 * resources, with each CQL endpoint top resources assigned a number. 28 * Number that represents a resource corresponds to a folder name, inside which 29 * resource info is stored in a file corpus.txt. If a resource has sub-resources, 30 * the folder contains sub-folders, also named by numbers, with their 31 * corresponding corpus.txt files, and so on. 32 * The corpus.txt file contains each piece of info on a separate line. Line 1 33 * is resource endpoint, line 2 - handle, line 3 - display name, line 4 - landing 34 * page, 5 - desription, 6 - languages (multiple languages are separated by | 35 * separator), 7 - number of records. 24 36 * 25 37 * @author yanapanchenko -
SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/cache/ScanCrawler.java
r5037 r5039 1 1 package eu.clarin.sru.fcs.aggregator.cache; 2 2 3 import eu.clarin.sru.client.SRUClientException; 3 4 import eu.clarin.sru.client.SRUScanRequest; 4 5 import eu.clarin.sru.client.SRUScanResponse; … … 10 11 import eu.clarin.sru.fcs.aggregator.sopt.Institution; 11 12 import eu.clarin.sru.fcs.aggregator.util.SRUCQL; 13 import java.util.ArrayList; 12 14 import java.util.List; 15 import java.util.concurrent.ExecutionException; 13 16 import java.util.concurrent.Future; 14 17 import java.util.concurrent.TimeUnit; … … 72 75 } 73 76 74 // TODO: ask Oliver to add API support for the extra info in the 77 78 79 private void addCorpora(SRUThreadedClient sruScanClient, String endpointUrl, 80 Institution institution, int depth, Corpus parentCorpus, ScanCache cache) { 81 82 83 depth++; 84 if (depth > maxDepth) { 85 return; 86 } 87 88 89 List<Corpus> childrenCorpora = doScan(sruScanClient, endpointUrl, institution, parentCorpus); 90 91 //if (childrenCorpora.isEmpty()) { 92 for (Corpus c : childrenCorpora) { 93 // don't add corpus that introduces cyclic references 94 // as of March 2014, there are 2 such endpoints... 95 if (cache.getCorpus(c.getHandle())!= null) { 96 LOGGER.warning("Cyclic reference in corpus " + c.getHandle() + " of endpoint " + endpointUrl); 97 continue; 98 } 99 //Corpus c = createCorpus(institution, endpointUrl, term); 100 //Corpus c = new Corpus(institution, endpointUrl); 101 // c.setHandle(term.getValue()); 102 // c.setDisplayName(term.getDisplayTerm()); 103 // if (term.getNumberOfRecords() > 0) { 104 // c.setNumberOfRecords(term.getNumberOfRecords()); 105 // } 106 // addExtraInfo(c, term); 107 cache.addCorpus(c, parentCorpus); 108 // how not to query default corpus??? 109 addCorpora(sruScanClient, c.getEndpointUrl(), c.getInstitution(), 110 depth, c, cache); 111 } 112 //} else if () { 113 // TODO if diagnistics came back, try simple scan without the 114 // SRUCQLscan.RESOURCE_INFO_PARAMETER 115 // } 116 //else { 117 // if (parentCorpus == null) { // means root 118 // create default root corpus: 119 // Corpus c = new Corpus(institution, endpointUrl); 120 // cache.addCorpus(c); 121 // } 122 // } 123 124 125 // SRUScanResponse response = doScan(sruScanClient, endpointUrl, parentCorpus); 126 // 127 // 128 // if (response != null && response.hasTerms()) { 129 // for (SRUTerm term : response.getTerms()) { 130 // // don't add corpus that introduces cyclic references 131 // // as of March 2014, there are 2 such endpoints... 132 // if (cache.getCorpus(term.getValue())!= null) { 133 // LOGGER.warning("Cyclic reference in corpus " + term.getValue() + " of endpoint " + endpointUrl); 134 // continue; 135 // } 136 // Corpus c = createCorpus(institution, endpointUrl, term); 137 // //Corpus c = new Corpus(institution, endpointUrl); 138 //// c.setHandle(term.getValue()); 139 //// c.setDisplayName(term.getDisplayTerm()); 140 //// if (term.getNumberOfRecords() > 0) { 141 //// c.setNumberOfRecords(term.getNumberOfRecords()); 142 //// } 143 //// addExtraInfo(c, term); 144 // cache.addCorpus(c, parentCorpus); 145 // addCorpora(sruScanClient, c.getEndpointUrl(), c.getInstitution(), 146 // depth, c, cache); 147 // } 148 // //} else if () { 149 // // TODO if diagnistics came back, try simple scan without the 150 // // SRUCQLscan.RESOURCE_INFO_PARAMETER 151 // } else { 152 // if (parentCorpus == null) { // means root 153 // // create default root corpus: 154 // Corpus c = new Corpus(institution, endpointUrl); 155 // cache.addCorpus(c); 156 // } 157 // } 158 159 } 160 161 private static String normalizeHandle(Corpus corpus, boolean root) { 162 if (root) { 163 return Corpus.ROOT_HANDLE; 164 } 165 String handle = corpus.getHandle(); 166 if (Corpus.HANDLE_WITH_SPECIAL_CHARS.matcher(handle).matches()) { 167 //resourceValue = "%22" + resourceValue + "%22"; 168 handle = "\"" + handle + "\""; 169 } 170 return handle; 171 } 172 173 // public static SRUScanResponse doScan(SRUThreadedClient sruScanClient, 174 // String endpointUrl, Corpus parentCorpus) { 175 // 176 // Future<SRUScanResponse> corporaResponse = null; 177 // SRUScanResponse response = null; 178 // try { 179 // SRUScanRequest corporaRequest = new SRUScanRequest(endpointUrl); 180 // StringBuilder scanClause = new StringBuilder(SRUCQL.SCAN_RESOURCE_PARAMETER); 181 // scanClause.append("="); 182 // String normalizedHandle = normalizeHandle(parentCorpus, parentCorpus == null); 183 // scanClause.append(normalizedHandle); 184 // corporaRequest.setScanClause(scanClause.toString()); 185 // corporaRequest.setExtraRequestData(SRUCQL.SCAN_RESOURCE_INFO_PARAMETER, 186 // SRUCQL.SCAN_RESOURCE_INFO_PARAMETER_DEFAULT_VALUE); 187 // corporaResponse = sruScanClient.scan(corporaRequest); 188 // Thread.sleep(5000); 189 // response = corporaResponse.get(600, TimeUnit.SECONDS); 190 // return response; 191 // } catch (TimeoutException ex) { 192 // LOGGER.log(Level.SEVERE, "Timeout scanning corpora {0} at {1} {2} {3}", 193 // new String[]{Corpus.ROOT_HANDLE, endpointUrl, ex.getClass().getName(), ex.getMessage()}); 194 // } catch (Exception ex) { 195 // LOGGER.log(Level.SEVERE, "Error accessing corpora {0} at {1} {2} {3}", 196 // new String[]{Corpus.ROOT_HANDLE, endpointUrl, ex.getClass().getName(), ex.getMessage()}); 197 // } finally { 198 // if (corporaResponse != null && !corporaResponse.isDone()) { 199 // corporaResponse.cancel(true); 200 // } 201 // } 202 // 203 // return response; 204 // } 205 206 207 public static List<Corpus> doScan(SRUThreadedClient sruScanClient, 208 String endpointUrl, Institution institution, Corpus parentCorpus) { 209 210 List<Corpus> corpora = new ArrayList<Corpus>(); 211 Future<SRUScanResponse> corporaResponse = null; 212 SRUScanResponse response = null; 213 try { 214 SRUScanRequest corporaRequest = new SRUScanRequest(endpointUrl); 215 StringBuilder scanClause = new StringBuilder(SRUCQL.SCAN_RESOURCE_PARAMETER); 216 scanClause.append("="); 217 String normalizedHandle = normalizeHandle(parentCorpus, parentCorpus == null); 218 scanClause.append(normalizedHandle); 219 corporaRequest.setScanClause(scanClause.toString()); 220 corporaRequest.setExtraRequestData(SRUCQL.SCAN_RESOURCE_INFO_PARAMETER, 221 SRUCQL.SCAN_RESOURCE_INFO_PARAMETER_DEFAULT_VALUE); 222 corporaResponse = sruScanClient.scan(corporaRequest); 223 Thread.sleep(5000); 224 response = corporaResponse.get(600, TimeUnit.SECONDS); 225 } catch (TimeoutException ex) { 226 LOGGER.log(Level.SEVERE, "Timeout scanning corpora {0} at {1} {2} {3}", 227 new String[]{Corpus.ROOT_HANDLE, endpointUrl, ex.getClass().getName(), ex.getMessage()}); 228 } catch (Exception ex) { 229 LOGGER.log(Level.SEVERE, "Error accessing corpora {0} at {1} {2} {3}", 230 new String[]{Corpus.ROOT_HANDLE, endpointUrl, ex.getClass().getName(), ex.getMessage()}); 231 } finally { 232 if (corporaResponse != null && !corporaResponse.isDone()) { 233 corporaResponse.cancel(true); 234 } 235 } 236 237 238 if (response != null && response.hasTerms()) { 239 for (SRUTerm term : response.getTerms()) { 240 // don't add corpus that introduces cyclic references 241 // as of March 2014, there are 2 such endpoints... 242 //if (cache.getCorpus(term.getValue())!= null) { 243 // LOGGER.warning("Cyclic reference in corpus " + term.getValue() + " of endpoint " + endpointUrl); 244 // continue; 245 //} 246 Corpus c = createCorpus(institution, endpointUrl, term); 247 corpora.add(c); 248 } 249 //} else if () { 250 // TODO if diagnistics came back, try simple scan without the 251 // SRUCQLscan.RESOURCE_INFO_PARAMETER 252 } else { 253 if (parentCorpus == null) { // means root 254 // create default root corpus: 255 Corpus c = new Corpus(institution, endpointUrl); 256 corpora.add(c); 257 } 258 } 259 return corpora; 260 } 261 262 private static Corpus createCorpus(Institution institution, String endpointUrl, SRUTerm term) { 263 Corpus c = new Corpus(institution, endpointUrl); 264 c.setHandle(term.getValue()); 265 c.setDisplayName(term.getDisplayTerm()); 266 if (term.getNumberOfRecords() > 0) { 267 c.setNumberOfRecords(term.getNumberOfRecords()); 268 } 269 addExtraInfo(c, term); 270 return c; 271 } 272 273 // TODO: ask Oliver to add API support for the extra info in the 75 274 // SRU client/server libraries, so that it's not necessary to work 76 275 // with DocumentFragment 77 private void addExtraInfo(Corpus c, SRUTerm term) {276 private static void addExtraInfo(Corpus c, SRUTerm term) { 78 277 79 278 DocumentFragment extraInfo = term.getExtraTermData(); … … 116 315 } 117 316 } 118 119 private void addCorpora(SRUThreadedClient sruScanClient, String endpointUrl,120 Institution institution, int depth, Corpus parentCorpus, ScanCache cache) {121 122 Future<SRUScanResponse> corporaResponse = null;123 124 depth++;125 if (depth > maxDepth) {126 return;127 }128 try {129 boolean root = false;130 if (parentCorpus == null) {131 root = true;132 }133 134 SRUScanRequest corporaRequest = new SRUScanRequest(endpointUrl);135 StringBuilder scanClause = new StringBuilder(SRUCQL.SCAN_RESOURCE_PARAMETER);136 scanClause.append("=");137 String normalizedHandle = normalizeHandle(parentCorpus, root);138 scanClause.append(normalizedHandle);139 corporaRequest.setScanClause(scanClause.toString());140 corporaRequest.setExtraRequestData(SRUCQL.SCAN_RESOURCE_INFO_PARAMETER,141 SRUCQL.SCAN_RESOURCE_INFO_PARAMETER_DEFAULT_VALUE);142 corporaResponse = sruScanClient.scan(corporaRequest);143 Thread.sleep(5000);144 SRUScanResponse response = corporaResponse.get(600, TimeUnit.SECONDS);145 if (response != null && response.hasTerms()) {146 for (SRUTerm term : response.getTerms()) {147 // don't add corpus that introduces cyclic references148 // as of March 2014, there are 2 such endpoints...149 if (cache.getCorpus(term.getValue())!= null) {150 LOGGER.warning("Cyclic reference in corpus " + term.getValue() + " of endpoint " + endpointUrl);151 continue;152 }153 Corpus c = new Corpus(institution, endpointUrl);154 c.setHandle(term.getValue());155 c.setDisplayName(term.getDisplayTerm());156 if (term.getNumberOfRecords() > 0) {157 c.setNumberOfRecords(term.getNumberOfRecords());158 }159 addExtraInfo(c, term);160 cache.addCorpus(c, parentCorpus);161 addCorpora(sruScanClient, c.getEndpointUrl(), c.getInstitution(),162 depth, c, cache);163 }164 //} else if () {165 // TODO if diagnistics came back, try simple scan without the166 // SRUCQLscan.RESOURCE_INFO_PARAMETER167 } else {168 if (root) {169 // create default root corpus:170 Corpus c = new Corpus(institution, endpointUrl);171 cache.addCorpus(c);172 }173 }174 } catch (TimeoutException ex) {175 LOGGER.log(Level.SEVERE, "Timeout scanning corpora {0} at {1} {2} {3}",176 new String[]{Corpus.ROOT_HANDLE, endpointUrl, ex.getClass().getName(), ex.getMessage()});177 } catch (Exception ex) {178 LOGGER.log(Level.SEVERE, "Error accessing corpora {0} at {1} {2} {3}",179 new String[]{Corpus.ROOT_HANDLE, endpointUrl, ex.getClass().getName(), ex.getMessage()});180 } finally {181 if (corporaResponse != null && !corporaResponse.isDone()) {182 corporaResponse.cancel(true);183 }184 }185 }186 187 private String normalizeHandle(Corpus corpus, boolean root) {188 if (root) {189 return Corpus.ROOT_HANDLE;190 }191 String handle = corpus.getHandle();192 if (Corpus.HANDLE_WITH_SPECIAL_CHARS.matcher(handle).matches()) {193 //resourceValue = "%22" + resourceValue + "%22";194 handle = "\"" + handle + "\"";195 }196 return handle;197 }198 317 } -
SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/sopt/CorpusModelLive.java
r5035 r5039 7 7 import eu.clarin.sru.client.SRUThreadedClient; 8 8 import eu.clarin.sru.fcs.aggregator.app.WebAppListener; 9 import eu.clarin.sru.fcs.aggregator.cache.ScanCrawler; 9 10 import static eu.clarin.sru.fcs.aggregator.sopt.Corpus.ROOT_HANDLE; 10 11 import eu.clarin.sru.fcs.aggregator.util.SRUCQL; … … 136 137 137 138 public void loadChildren(Treeitem item) { 139 logger.info("LOADING CHILDREN"); 138 140 // get first child 139 141 Treeitem childTreeitem = (Treeitem) item.getTreechildren().getChildren().get(0); … … 144 146 Corpus childCorpus = childNodeValue.getData(); 145 147 if (childCorpus.isTemporary()) { 148 logger.info("REPLACING TEMP WITH REAL"); 146 149 // remove temporary node 147 150 remove(openedNodeValue, childTreeitem.getIndex()); … … 186 189 187 190 private void initRootChildren(CenterRegistryI startingPoint) { 191 logger.info("INITIALIZING ROOT CHILDREN"); 188 192 for (Institution instit : startingPoint.getCQLInstitutions()) { 189 193 for (Endpoint endp : instit.getEndpoints()) { 190 try {194 //try { 191 195 //TODO: temp for testing, this 3 lines are to be removed: 192 196 //if (//!endp.getUrl().contains("uni-leipzig.de") && … … 196 200 // continue; 197 201 //} 198 199 Future<SRUScanResponse> corporaResponse = null; 200 SRUScanRequest corporaRequest = new SRUScanRequest(endp.getUrl()); 201 StringBuilder scanClause = new StringBuilder(SRUCQL.SCAN_RESOURCE_PARAMETER); 202 scanClause.append("="); 203 scanClause.append(ROOT_HANDLE); 204 corporaRequest.setScanClause(scanClause.toString()); 205 corporaRequest.setExtraRequestData(SRUCQL.SCAN_RESOURCE_INFO_PARAMETER, "true"); 206 corporaResponse = sruClient.scan(corporaRequest); 207 SRUScanResponse response = corporaResponse.get(200, TimeUnit.SECONDS); 208 if (response != null && response.hasTerms()) { 209 for (SRUTerm term : response.getTerms()) { 210 Corpus c = new Corpus(instit, endp.getUrl()); 211 c.setHandle(term.getValue()); 212 c.setDisplayName(term.getDisplayTerm()); 213 c.setNumberOfRecords(term.getNumberOfRecords()); 214 addExtraInfo(c, term); 215 DefaultTreeNode<Corpus> rootChild = createNodeWithTempChildren(c); 216 super.getRoot().add(rootChild); 217 } 218 } else { 219 Corpus endpCorpus = new Corpus(endp.getInstitution(), endp.getUrl()); 220 DefaultTreeNode<Corpus> rootChild = createNodeWithTempChildren(endpCorpus); 202 203 List<Corpus> rootCorpora = ScanCrawler.doScan(sruClient, endp.getUrl(), instit, null); 204 for (Corpus c : rootCorpora) { 205 DefaultTreeNode<Corpus> rootChild = createNodeWithTempChildren(c); 221 206 super.getRoot().add(rootChild); 222 207 } 223 } catch (SRUClientException ex) { 224 logger.log(Level.SEVERE, "Error accessing corpora {0} at {1} {2} {3}", 225 new String[]{ROOT_HANDLE, endp.getUrl(), ex.getClass().getName(), ex.getMessage()}); 226 } catch (InterruptedException ex) { 227 logger.log(Level.SEVERE, "Error accessing corpora {0} at {1} {2} {3}", 228 new String[]{ROOT_HANDLE, endp.getUrl(), ex.getClass().getName(), ex.getMessage()}); 229 } catch (ExecutionException ex) { 230 logger.log(Level.SEVERE, "Error accessing corpora {0} at {1} {2} {3}", 231 new String[]{ROOT_HANDLE, endp.getUrl(), ex.getClass().getName(), ex.getMessage()}); 232 } catch (TimeoutException ex) { 233 logger.log(Level.SEVERE, "Timeout scanning corpora {0} at {1} {2} {3}", 234 new String[]{ROOT_HANDLE, endp.getUrl(), ex.getClass().getName(), ex.getMessage()}); 235 } 236 } 237 238 } 239 } 240 208 // Future<SRUScanResponse> corporaResponse = null; 209 // SRUScanRequest corporaRequest = new SRUScanRequest(endp.getUrl()); 210 // StringBuilder scanClause = new StringBuilder(SRUCQL.SCAN_RESOURCE_PARAMETER); 211 // scanClause.append("="); 212 // scanClause.append(ROOT_HANDLE); 213 // corporaRequest.setScanClause(scanClause.toString()); 214 // corporaRequest.setExtraRequestData(SRUCQL.SCAN_RESOURCE_INFO_PARAMETER, "true"); 215 // corporaResponse = sruClient.scan(corporaRequest); 216 // SRUScanResponse response = corporaResponse.get(200, TimeUnit.SECONDS); 217 // if (response != null && response.hasTerms()) { 218 // for (SRUTerm term : response.getTerms()) { 219 // Corpus c = new Corpus(instit, endp.getUrl()); 220 // c.setHandle(term.getValue()); 221 // c.setDisplayName(term.getDisplayTerm()); 222 // c.setNumberOfRecords(term.getNumberOfRecords()); 223 // addExtraInfo(c, term); 224 // DefaultTreeNode<Corpus> rootChild = createNodeWithTempChildren(c); 225 // super.getRoot().add(rootChild); 226 // } 227 // } else { 228 // Corpus endpCorpus = new Corpus(endp.getInstitution(), endp.getUrl()); 229 // DefaultTreeNode<Corpus> rootChild = createNodeWithTempChildren(endpCorpus); 230 // super.getRoot().add(rootChild); 231 // } 232 // } catch (SRUClientException ex) { 233 // logger.log(Level.SEVERE, "Error accessing corpora {0} at {1} {2} {3}", 234 // new String[]{ROOT_HANDLE, endp.getUrl(), ex.getClass().getName(), ex.getMessage()}); 235 // } catch (InterruptedException ex) { 236 // logger.log(Level.SEVERE, "Error accessing corpora {0} at {1} {2} {3}", 237 // new String[]{ROOT_HANDLE, endp.getUrl(), ex.getClass().getName(), ex.getMessage()}); 238 // } catch (ExecutionException ex) { 239 // logger.log(Level.SEVERE, "Error accessing corpora {0} at {1} {2} {3}", 240 // new String[]{ROOT_HANDLE, endp.getUrl(), ex.getClass().getName(), ex.getMessage()}); 241 // } catch (TimeoutException ex) { 242 // logger.log(Level.SEVERE, "Timeout scanning corpora {0} at {1} {2} {3}", 243 // new String[]{ROOT_HANDLE, endp.getUrl(), ex.getClass().getName(), ex.getMessage()}); 244 // } 245 } 246 247 } 248 } 249 241 250 private Iterable<Corpus> getSubcorpora(Corpus corpus) { 242 243 ArrayList<Corpus> subCorpora = new ArrayList<Corpus>(); 244 try { 245 SRUScanRequest corporaRequest = new SRUScanRequest(corpus.getEndpointUrl()); 246 StringBuilder scanClause = new StringBuilder(SRUCQL.SCAN_RESOURCE_PARAMETER); 247 scanClause.append("="); 248 String resourceValue = corpus.getHandle(); 249 if (corpus.getHandle() == null) { 250 resourceValue = ROOT_HANDLE; 251 } 252 if (Corpus.HANDLE_WITH_SPECIAL_CHARS.matcher(resourceValue).matches()) { 253 resourceValue = "%22" + resourceValue + "%22"; 254 } 255 scanClause.append(resourceValue); 256 corporaRequest.setScanClause(scanClause.toString()); 257 //!!!TODO request doesn't work for scan with resource handle??? 258 //corporaRequest.setExtraRequestData(SRUCQLscan.RESOURCE_INFO_PARAMETER, "true"); 259 Future<SRUScanResponse> corporaResponse = sruClient.scan(corporaRequest); 260 SRUScanResponse response = corporaResponse.get(200, TimeUnit.SECONDS); 261 if (response != null && response.hasTerms()) { 262 for (SRUTerm term : response.getTerms()) { 263 Corpus c = new Corpus(corpus.getInstitution(), corpus.getEndpointUrl()); 264 c.setHandle(term.getValue()); 265 c.setDisplayName(term.getDisplayTerm()); 266 c.setNumberOfRecords(term.getNumberOfRecords()); 267 addExtraInfo(c, term); 268 subCorpora.add(c); 269 } 270 System.out.println("Found " + subCorpora.size() + " children"); 271 } 272 } catch (SRUClientException ex) { 273 logger.log(Level.SEVERE, "Error accessing corpora {0} at {1} {2} {3}", 274 new String[]{corpus.getHandle(), corpus.getEndpointUrl(), ex.getClass().getName(), ex.getMessage()}); 275 } catch (InterruptedException ex) { 276 logger.log(Level.SEVERE, "Error accessing corpora {0} at {1} {2} {3}", 277 new String[]{corpus.getHandle(), corpus.getEndpointUrl(), ex.getClass().getName(), ex.getMessage()}); 278 } catch (ExecutionException ex) { 279 logger.log(Level.SEVERE, "Error accessing corpora {0} at {1} {2} {3}", 280 new String[]{corpus.getHandle(), corpus.getEndpointUrl(), ex.getClass().getName(), ex.getMessage()}); 281 } catch (TimeoutException ex) { 282 logger.log(Level.SEVERE, "Timeout scanning corpora {0} at {1} {2} {3}", 283 new String[]{corpus.getHandle(), corpus.getEndpointUrl(), ex.getClass().getName(), ex.getMessage()}); 284 } 285 286 return subCorpora; 287 } 251 //get rid of institution and endpoint? get get this info from corpus 252 return ScanCrawler.doScan(sruClient, corpus.getEndpointUrl(), corpus.getInstitution(), corpus); 253 } 254 255 // private Iterable<Corpus> getSubcorpora(Corpus corpus) { 256 // logger.info("OBTAINING SUBCORPORA"); 257 // ArrayList<Corpus> subCorpora = new ArrayList<Corpus>(); 258 // try { 259 // 260 // 261 // SRUScanRequest corporaRequest = new SRUScanRequest(corpus.getEndpointUrl()); 262 // StringBuilder scanClause = new StringBuilder(SRUCQL.SCAN_RESOURCE_PARAMETER); 263 // scanClause.append("="); 264 // String resourceValue = corpus.getHandle(); 265 // if (corpus.getHandle() == null) { 266 // resourceValue = ROOT_HANDLE; 267 // } 268 // if (Corpus.HANDLE_WITH_SPECIAL_CHARS.matcher(resourceValue).matches()) { 269 // resourceValue = "%22" + resourceValue + "%22"; 270 // } 271 // scanClause.append(resourceValue); 272 // corporaRequest.setScanClause(scanClause.toString()); 273 // //!!!TODO request doesn't work for scan with resource handle??? 274 // //corporaRequest.setExtraRequestData(SRUCQLscan.RESOURCE_INFO_PARAMETER, "true"); 275 // Future<SRUScanResponse> corporaResponse = sruClient.scan(corporaRequest); 276 // logger.info("BEFORE get " + resourceValue); 277 // SRUScanResponse response = corporaResponse.get(200, TimeUnit.SECONDS); 278 // logger.info("AFTER get " + resourceValue); 279 // if (response != null && response.hasTerms()) { 280 // for (SRUTerm term : response.getTerms()) { 281 // Corpus c = new Corpus(corpus.getInstitution(), corpus.getEndpointUrl()); 282 // c.setHandle(term.getValue()); 283 // c.setDisplayName(term.getDisplayTerm()); 284 // c.setNumberOfRecords(term.getNumberOfRecords()); 285 // addExtraInfo(c, term); 286 // subCorpora.add(c); 287 // } 288 // logger.info("OBTAINED SUBCORPORA " + subCorpora.size()); 289 // } 290 // } catch (SRUClientException ex) { 291 // logger.log(Level.SEVERE, "Error accessing corpora {0} at {1} {2} {3}", 292 // new String[]{corpus.getHandle(), corpus.getEndpointUrl(), ex.getClass().getName(), ex.getMessage()}); 293 // } catch (InterruptedException ex) { 294 // logger.log(Level.SEVERE, "Error accessing corpora {0} at {1} {2} {3}", 295 // new String[]{corpus.getHandle(), corpus.getEndpointUrl(), ex.getClass().getName(), ex.getMessage()}); 296 // } catch (ExecutionException ex) { 297 // logger.log(Level.SEVERE, "Error accessing corpora {0} at {1} {2} {3}", 298 // new String[]{corpus.getHandle(), corpus.getEndpointUrl(), ex.getClass().getName(), ex.getMessage()}); 299 // } catch (TimeoutException ex) { 300 // logger.log(Level.SEVERE, "Timeout scanning corpora {0} at {1} {2} {3}", 301 // new String[]{corpus.getHandle(), corpus.getEndpointUrl(), ex.getClass().getName(), ex.getMessage()}); 302 // } 303 // 304 // return subCorpora; 305 // } 288 306 289 307 private void addExtraInfo(Corpus c, SRUTerm term) { -
SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/sopt/CorpusRenderer.java
r5038 r5039 2 2 3 3 import eu.clarin.sru.fcs.aggregator.app.WebAppListener; 4 import eu.clarin.sru.fcs.aggregator.util.ZKComp; 4 5 import org.zkoss.zk.ui.Component; 5 6 import org.zkoss.zk.ui.Executions; 6 7 import org.zkoss.zk.ui.event.Event; 7 8 import org.zkoss.zk.ui.event.EventListener; 8 import org.zkoss.zk.ui.event.Events;9 9 import org.zkoss.zul.A; 10 10 import org.zkoss.zul.Checkbox; … … 15 15 import org.zkoss.zul.Treechildren; 16 16 import org.zkoss.zul.Treeitem; 17 import org.zkoss.zul.TreeitemRenderer;18 17 import org.zkoss.zul.Treerow; 19 18 20 19 /** 20 * Provides methods to render a corpus tree displaying such information as 21 * corpus name, institution, description, landing page, number of records, 22 * language. Provides functionality for selecting/deselecting a resource in the 23 * rendered corpus tree. 21 24 * 22 25 * @author Yana Panchenko 23 */ 24 /** 25 * The structure of tree 26 * 26 * 27 * The structure of tree: 27 28 * <pre> 28 29 * <treeitem> … … 36 37 * </pre> 37 38 */ 38 public class CorpusRendererCached implements TreeitemRenderer<DefaultTreeNode<Corpus>>, CorpusRendererI { 39 40 private Languages languages; 41 private CorpusModelCached model; 42 43 public CorpusRendererCached(CorpusModelCached model) { 44 languages = (Languages) Executions.getCurrent().getDesktop().getWebApp().getAttribute(WebAppListener.LANGUAGES); 39 public abstract class CorpusRenderer { 40 41 CorpusModelI model; 42 Languages languages; 43 44 public CorpusRenderer(CorpusModelI model) { 45 45 this.model = model; 46 } 47 48 @Override 49 public void render(Treeitem treeItem, DefaultTreeNode<Corpus> treeNode, int index) throws Exception { 50 51 Treerow dataRow = new Treerow(); 52 dataRow.setParent(treeItem); 53 treeItem.setValue(treeNode); 54 treeItem.setOpen(false); 55 Corpus data = treeNode.getData(); 56 addCorpusDataIntoRow(dataRow, data); 57 58 treeItem.addEventListener(Events.ON_OPEN, new EventListener<Event>() { 59 @Override 60 public void onEvent(Event event) throws Exception { 61 62 Treeitem openedTreeitem = (Treeitem) event.getTarget(); 63 //if (openedTreeitem.isOpen()) { 64 // if (model.hasChildren(openedTreeitem)) { 65 // model.loadChildren(openedTreeitem); 66 // openedTreeitem.setOpen(model.hasChildren(openedTreeitem)); 67 // } else { 68 // openedTreeitem.setOpen(false); 69 // } 70 //} 71 72 if (model.isCorpusSelected((DefaultTreeNode<Corpus>) openedTreeitem.getValue())) { 73 selectChildren(openedTreeitem); 74 } 75 } 76 }); 77 78 } 79 80 //TODO check if it's working only on open children??? 81 public void selectChildren(Treeitem openedTreeitem) { 82 83 for (Component comp : openedTreeitem.getChildren()) { 84 if (comp instanceof Treechildren) { 85 Treechildren item = (Treechildren) comp; 86 for (Treeitem childItem : item.getItems()) { 87 updateItem(childItem, true); 88 } 89 break; 90 } 91 } 92 46 this.languages = (Languages) Executions.getCurrent().getDesktop().getWebApp().getAttribute(WebAppListener.LANGUAGES); 93 47 } 94 48 … … 114 68 } 115 69 116 private void updateParentItem(Treeitem item, boolean checked) { 117 118 // if item becomes unselected, unselect it parent 119 if (!checked) { 120 Treeitem parent = item.getParentItem(); 121 if (parent != null) { 122 for (Component comp : parent.getChildren()) { 123 // update the item row 124 if (comp instanceof Treerow) { 125 Treerow row = (Treerow) comp; 126 Checkbox checkbox = (Checkbox) row.getFirstChild().getFirstChild(); 127 DefaultTreeNode<Corpus> node = (DefaultTreeNode<Corpus>) parent.getValue(); 128 checkbox.setChecked(checked); 129 toggleCorpusCheckbox(node.getData(), checkbox, row); 130 updateParentItem(parent, checked); 131 break; 132 } 133 } 134 135 } 136 } 137 } 138 139 private void toggleCorpusCheckbox(Corpus corpus, Checkbox checkbox, Treerow row) { 140 if (checkbox.isChecked()) { 141 row.setZclass("z-treerow z-treerow-seld"); 142 model.addToSelected(corpus); 143 } else { 144 row.setZclass("z-treerow"); 145 model.removeFromSelected(corpus); 146 } 147 } 148 149 private void addCorpusDataIntoRow(Treerow dataRow, Corpus data) { 70 public void selectChildren(Treeitem openedTreeitem) { 71 72 for (Component comp : openedTreeitem.getChildren()) { 73 if (comp instanceof Treechildren) { 74 Treechildren item = (Treechildren) comp; 75 for (Treeitem childItem : item.getItems()) { 76 updateItem(childItem, true); 77 } 78 break; 79 } 80 } 81 } 82 83 protected void addCorpusDataIntoRow(Treerow dataRow, Corpus data) { 150 84 Treecell cell1 = createCellForSelectCorpus(data, dataRow); 151 85 dataRow.appendChild(cell1); … … 194 128 Treeitem eventItem = (Treeitem) dataRow.getParent(); 195 129 DefaultTreeNode<Corpus> eventNode = (DefaultTreeNode<Corpus>) eventItem.getValue(); 196 if (model.is Selected(eventNode)) {130 if (model.isCorpusSelected(eventNode)) { 197 131 checkbox.setChecked(true); 198 132 toggleCorpusCheckbox(eventNode.getData(), checkbox, dataRow); … … 226 160 return cell; 227 161 } 228 162 229 163 private Treecell createCellForCorpusNumberOfRecords(Corpus data) { 230 164 Treecell cell = new Treecell(); … … 245 179 label.setParent(cell); 246 180 } else { 247 248 A link = new A(); 249 link.setTarget("_blank"); 250 link.setHref(data.getLandingPage()); 251 link.setImage("img/go-home.png"); 181 A link = ZKComp.createCorpusHomeLink(data.getLandingPage()); 252 182 link.setParent(cell); 253 183 } … … 278 208 // return cell; 279 209 // } 280 281 private Treecell createCellForCorpusLanguage(Corpus data) { 210 private Treecell createCellForCorpusLanguage(Corpus data) { 282 211 Treecell cell = new Treecell(); 283 212 if (data.getLanguages().isEmpty()) { … … 309 238 label.setParent(langPanel); 310 239 langPanel.setParent(cell); 311 240 312 241 } 313 242 return cell; … … 319 248 int okLength = 125; 320 249 if (data.getDescription().length() > okLength) { 321 String descrStart = // data.getDescription().substring(0, 35) + " ..."; 322 getDisplayedText(data.getDescription(), okLength); 250 String descrStart = getDisplayedText(data.getDescription(), okLength); 323 251 Label label = new Label(descrStart); 324 252 label.setTooltiptext(data.getDescription()); 325 253 label.setParent(cell); 326 254 } else { 327 Label label = new Label(data.getDescription());328 label.setMultiline(true);329 label.setParent(cell);330 331 //ideally should contain html5 <details> element, but only332 //chrome supports it as of now:333 //<details>334 //<summary>First sentence</summary>335 //Rest sentences.336 337 338 255 Label label = new Label(data.getDescription()); 256 label.setMultiline(true); 257 label.setParent(cell); 258 259 //ideally should contain html5 <details> element, but only 260 //chrome supports it as of now: 261 //<details> 262 //<summary>First sentence</summary> 263 //Rest sentences. 264 //</details> 265 266 339 267 } 340 268 } else { … … 353 281 return description.substring(0, dotIndex) + "..."; 354 282 } 283 284 private void toggleCorpusCheckbox(Corpus corpus, Checkbox checkbox, Treerow row) { 285 if (checkbox.isChecked()) { 286 row.setZclass("z-treerow z-treerow-seld"); 287 model.addToSelected(corpus); 288 } else { 289 row.setZclass("z-treerow"); 290 model.removeFromSelected(corpus); 291 } 292 } 293 294 private void updateParentItem(Treeitem item, boolean checked) { 295 296 // if item becomes unselected, unselect it parent 297 if (!checked) { 298 Treeitem parent = item.getParentItem(); 299 if (parent != null) { 300 for (Component comp : parent.getChildren()) { 301 // update the item row 302 if (comp instanceof Treerow) { 303 Treerow row = (Treerow) comp; 304 Checkbox checkbox = (Checkbox) row.getFirstChild().getFirstChild(); 305 DefaultTreeNode<Corpus> node = (DefaultTreeNode<Corpus>) parent.getValue(); 306 checkbox.setChecked(checked); 307 toggleCorpusCheckbox(node.getData(), checkbox, row); 308 updateParentItem(parent, checked); 309 break; 310 } 311 } 312 313 } 314 } 315 } 355 316 } -
SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/sopt/CorpusRendererCached.java
r5037 r5039 1 1 package eu.clarin.sru.fcs.aggregator.sopt; 2 2 3 import eu.clarin.sru.fcs.aggregator.app.WebAppListener;4 import org.zkoss.zk.ui.Component;5 import org.zkoss.zk.ui.Executions;6 3 import org.zkoss.zk.ui.event.Event; 7 4 import org.zkoss.zk.ui.event.EventListener; 8 5 import org.zkoss.zk.ui.event.Events; 9 import org.zkoss.zul.A;10 import org.zkoss.zul.Checkbox;11 6 import org.zkoss.zul.DefaultTreeNode; 12 import org.zkoss.zul.Groupbox;13 import org.zkoss.zul.Label;14 import org.zkoss.zul.Treecell;15 import org.zkoss.zul.Treechildren;16 7 import org.zkoss.zul.Treeitem; 17 8 import org.zkoss.zul.TreeitemRenderer; … … 19 10 20 11 /** 12 * Renders treeitem of corpora tree from corpora cache. I.e. corpora sub-resources 13 * are pre-loaded and the information about them is taken from CorpusModelCached, 14 * which accesses the cache. 21 15 * 22 16 * @author Yana Panchenko 17 * 23 18 */ 24 /** 25 * The structure of tree 26 * 27 * <pre> 28 * <treeitem> 29 * <treerow> 30 * <treecell>...</treecell> 31 * </treerow> 32 * <treechildren> 33 * <treeitem>...</treeitem> 34 * </treechildren> 35 * </treeitem> 36 * </pre> 37 */ 38 public class CorpusRendererCached implements TreeitemRenderer<DefaultTreeNode<Corpus>>, CorpusRendererI { 39 40 private Languages languages; 41 private CorpusModelCached model; 19 public class CorpusRendererCached extends CorpusRenderer 20 implements TreeitemRenderer<DefaultTreeNode<Corpus>> { 42 21 43 22 public CorpusRendererCached(CorpusModelCached model) { 44 languages = (Languages) Executions.getCurrent().getDesktop().getWebApp().getAttribute(WebAppListener.LANGUAGES); 45 this.model = model; 23 super(model); 46 24 } 47 25 … … 59 37 @Override 60 38 public void onEvent(Event event) throws Exception { 61 62 39 Treeitem openedTreeitem = (Treeitem) event.getTarget(); 63 //if (openedTreeitem.isOpen()) {64 // if (model.hasChildren(openedTreeitem)) {65 // model.loadChildren(openedTreeitem);66 // openedTreeitem.setOpen(model.hasChildren(openedTreeitem));67 // } else {68 // openedTreeitem.setOpen(false);69 // }70 //}71 72 40 if (model.isCorpusSelected((DefaultTreeNode<Corpus>) openedTreeitem.getValue())) { 73 41 selectChildren(openedTreeitem); … … 78 46 } 79 47 80 //TODO check if it's working only on open children???81 public void selectChildren(Treeitem openedTreeitem) {82 83 for (Component comp : openedTreeitem.getChildren()) {84 if (comp instanceof Treechildren) {85 Treechildren item = (Treechildren) comp;86 for (Treeitem childItem : item.getItems()) {87 updateItem(childItem, true);88 }89 break;90 }91 }92 93 }94 95 public void updateItem(Treeitem item, boolean select) {96 97 for (Component comp : item.getChildren()) {98 // update the item row99 if (comp instanceof Treerow) {100 Treerow row = (Treerow) comp;101 Checkbox checkbox = (Checkbox) row.getFirstChild().getFirstChild();102 DefaultTreeNode<Corpus> node = (DefaultTreeNode<Corpus>) item.getValue();103 checkbox.setChecked(select);104 toggleCorpusCheckbox(node.getData(), checkbox, row);105 // update the item children106 } else if (comp instanceof Treechildren) {107 Treechildren children = (Treechildren) comp;108 for (Treeitem childItem : children.getItems()) {109 updateItem(childItem, select);110 }111 }112 }113 114 }115 116 private void updateParentItem(Treeitem item, boolean checked) {117 118 // if item becomes unselected, unselect it parent119 if (!checked) {120 Treeitem parent = item.getParentItem();121 if (parent != null) {122 for (Component comp : parent.getChildren()) {123 // update the item row124 if (comp instanceof Treerow) {125 Treerow row = (Treerow) comp;126 Checkbox checkbox = (Checkbox) row.getFirstChild().getFirstChild();127 DefaultTreeNode<Corpus> node = (DefaultTreeNode<Corpus>) parent.getValue();128 checkbox.setChecked(checked);129 toggleCorpusCheckbox(node.getData(), checkbox, row);130 updateParentItem(parent, checked);131 break;132 }133 }134 135 }136 }137 }138 139 private void toggleCorpusCheckbox(Corpus corpus, Checkbox checkbox, Treerow row) {140 if (checkbox.isChecked()) {141 row.setZclass("z-treerow z-treerow-seld");142 model.addToSelected(corpus);143 } else {144 row.setZclass("z-treerow");145 model.removeFromSelected(corpus);146 }147 }148 149 private void addCorpusDataIntoRow(Treerow dataRow, Corpus data) {150 Treecell cell1 = createCellForSelectCorpus(data, dataRow);151 dataRow.appendChild(cell1);152 Treecell cell4 = createCellForHome(data);153 dataRow.appendChild(cell4);154 Treecell cell2 = createCellForCorpusLanguage(data);155 dataRow.appendChild(cell2);156 Treecell cell6 = createCellForCorpusNumberOfRecords(data);157 dataRow.appendChild(cell6);158 Treecell cell5 = createCellForCorpusInstitution(data);159 dataRow.appendChild(cell5);160 Treecell cell3 = createCellForCorpusDescription(data);161 dataRow.appendChild(cell3);162 }163 164 private Treecell createCellForSelectCorpus(Corpus data, Treerow dataRow) {165 Treecell cell = new Treecell();166 Checkbox corpusCheckbox = createCheckboxForSelectCorpus(dataRow);167 corpusCheckbox.setParent(cell);168 if (data.getDisplayName() == null) {169 Label corpusLabel = new Label("");170 corpusLabel.setParent(cell);171 } else {172 String name = data.getDisplayName();173 // TODO: this is temp, before some endpoint174 // fix long names for their resources, that look175 // more like a description176 if (name.length() > 50) {177 int firstWordEnd = name.indexOf(" ");178 if (firstWordEnd > 0) {179 data.setDisplayName(name.substring(0, firstWordEnd));180 if (data.getDescription() == null) {181 data.setDescription(name);182 }183 }184 }185 Label corpusLabel = new Label(data.getDisplayName());186 corpusLabel.setParent(cell);187 }188 return cell;189 }190 191 private Checkbox createCheckboxForSelectCorpus(Treerow dataRow) {192 Checkbox checkbox = new Checkbox();193 checkbox.setValue(dataRow);194 Treeitem eventItem = (Treeitem) dataRow.getParent();195 DefaultTreeNode<Corpus> eventNode = (DefaultTreeNode<Corpus>) eventItem.getValue();196 if (model.isSelected(eventNode)) {197 checkbox.setChecked(true);198 toggleCorpusCheckbox(eventNode.getData(), checkbox, dataRow);199 }200 checkbox.addEventListener("onCheck", new EventListener() {201 @Override202 public void onEvent(Event event) throws Exception {203 Checkbox eventCheckbox = (Checkbox) event.getTarget();204 Treerow eventRow = (Treerow) eventCheckbox.getValue();205 Treeitem eventItem = (Treeitem) eventRow.getParent();206 DefaultTreeNode<Corpus> eventNode = (DefaultTreeNode<Corpus>) eventItem.getValue();207 toggleCorpusCheckbox(eventNode.getData(), eventCheckbox, eventRow);208 updateParentItem(eventItem, eventCheckbox.isChecked());209 for (Treeitem item : eventItem.getTreechildren().getItems()) {210 updateItem(item, eventCheckbox.isChecked());211 }212 }213 });214 return checkbox;215 }216 217 private Treecell createCellForCorpusInstitution(Corpus data) {218 Treecell cell = new Treecell();219 if (data.getInstitution() == null) {220 Label label = new Label("");221 label.setParent(cell);222 } else {223 Label label = new Label(data.getInstitution().getName());224 label.setParent(cell);225 }226 return cell;227 }228 229 private Treecell createCellForCorpusNumberOfRecords(Corpus data) {230 Treecell cell = new Treecell();231 if (data.getNumberOfRecords() == null) {232 Label label = new Label("");233 label.setParent(cell);234 } else {235 Label label = new Label(data.getNumberOfRecords().toString());236 label.setParent(cell);237 }238 return cell;239 }240 241 private Treecell createCellForHome(Corpus data) {242 Treecell cell = new Treecell();243 if (data.getLandingPage() == null) {244 Label label = new Label("");245 label.setParent(cell);246 } else {247 248 A link = new A();249 link.setTarget("_blank");250 link.setHref(data.getLandingPage());251 link.setImage("img/go-home.png");252 link.setParent(cell);253 }254 return cell;255 }256 257 // private Treecell createCellForCorpusLanguage(Corpus data) {258 // Treecell cell = new Treecell();259 // if (!data.getLanguages().isEmpty()) {260 // StringBuilder langs = new StringBuilder();261 // for (String lang : data.getLanguages()) {262 // String langName = languages.nameForCode(lang);263 // if (langName != null) {264 // langs.append(langName);265 // } else {266 // langs.append(lang);267 // }268 // langs.append("\n ");269 //270 // }271 // Label label = new Label(langs.toString());272 // label.setMultiline(true);273 // label.setParent(cell);274 // } else {275 // Label label = new Label("");276 // label.setParent(cell);277 // }278 // return cell;279 // }280 281 private Treecell createCellForCorpusLanguage(Corpus data) {282 Treecell cell = new Treecell();283 if (data.getLanguages().isEmpty()) {284 Label label = new Label("");285 label.setParent(cell);286 } else if (data.getLanguages().size() == 1) {287 Label label = new Label(languages.nameForCode(data.getLanguages().iterator().next()));288 label.setParent(cell);289 } else {290 Groupbox langPanel = new Groupbox();291 langPanel.setMold("3d");292 langPanel.setContentStyle("border:0");293 langPanel.setClosable(true);294 langPanel.setOpen(false);295 langPanel.setTitle("multiple");296 StringBuilder langs = new StringBuilder();297 for (String lang : data.getLanguages()) {298 String langName = languages.nameForCode(lang);299 if (langName != null) {300 langs.append(langName);301 } else {302 langs.append(lang);303 }304 langs.append("\n ");305 306 }307 Label label = new Label(langs.toString());308 label.setMultiline(true);309 label.setParent(langPanel);310 langPanel.setParent(cell);311 312 }313 return cell;314 }315 316 private Treecell createCellForCorpusDescription(Corpus data) {317 Treecell cell = new Treecell();318 if (data.getDescription() != null) {319 int okLength = 125;320 if (data.getDescription().length() > okLength) {321 String descrStart = // data.getDescription().substring(0, 35) + " ...";322 getDisplayedText(data.getDescription(), okLength);323 Label label = new Label(descrStart);324 label.setTooltiptext(data.getDescription());325 label.setParent(cell);326 } else {327 Label label = new Label(data.getDescription());328 label.setMultiline(true);329 label.setParent(cell);330 331 //ideally should contain html5 <details> element, but only332 //chrome supports it as of now:333 //<details>334 //<summary>First sentence</summary>335 //Rest sentences.336 //</details>337 338 339 }340 } else {341 Label label = new Label("");342 label.setParent(cell);343 }344 345 return cell;346 }347 348 private String getDisplayedText(String description, int okLength) {349 int dotIndex = description.indexOf(" ", okLength);350 if (dotIndex < 0 || dotIndex > okLength + 50) {351 dotIndex = okLength;352 }353 return description.substring(0, dotIndex) + "...";354 }355 48 } -
SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/sopt/CorpusRendererLive.java
r3058 r5039 1 1 package eu.clarin.sru.fcs.aggregator.sopt; 2 2 3 import eu.clarin.sru.fcs.aggregator.app.WebAppListener;4 import org.zkoss.zk.ui.Component;5 import org.zkoss.zk.ui.Executions;6 3 import org.zkoss.zk.ui.event.Event; 7 4 import org.zkoss.zk.ui.event.EventListener; 8 5 import org.zkoss.zk.ui.event.Events; 9 import org.zkoss.zul.A;10 import org.zkoss.zul.Checkbox;11 6 import org.zkoss.zul.DefaultTreeNode; 12 import org.zkoss.zul.Label;13 import org.zkoss.zul.Treecell;14 import org.zkoss.zul.Treechildren;15 7 import org.zkoss.zul.Treeitem; 16 8 import org.zkoss.zul.TreeitemRenderer; … … 18 10 19 11 /** 12 * Renders treeitem of corpora tree in a 'live' mode. I.e. corpora sub-resources 13 * are loaded on demand. It is necessary that CorpusModelLive is used with this 14 * renderer. 15 * 16 * TODO: maybe remove the loaded sub-resources from the tree when they are 17 * closed by the user. 20 18 * 21 19 * @author Yana Panchenko 22 20 */ 23 /** 24 * The structure of tree 25 * 26 * <pre> 27 * <treeitem> 28 * <treerow> 29 * <treecell>...</treecell> 30 * </treerow> 31 * <treechildren> 32 * <treeitem>...</treeitem> 33 * </treechildren> 34 * </treeitem> 35 * </pre> 36 */ 37 public class CorpusRendererLive implements TreeitemRenderer<DefaultTreeNode<Corpus>>, CorpusRendererI { 38 39 private Languages languages; 40 private CorpusModelLive model; 21 public class CorpusRendererLive extends CorpusRenderer 22 implements TreeitemRenderer<DefaultTreeNode<Corpus>> { 41 23 42 24 public CorpusRendererLive(CorpusModelLive model) { 43 languages = (Languages) Executions.getCurrent().getDesktop().getWebApp().getAttribute(WebAppListener.LANGUAGES); 44 this.model = model; 25 super(model); 45 26 } 46 27 … … 66 47 if (openedTreeitem.isOpen()) { 67 48 if (model.hasChildren(openedTreeitem)) { 68 model.loadChildren(openedTreeitem);49 ((CorpusModelLive) model).loadChildren(openedTreeitem); 69 50 openedTreeitem.setOpen(model.hasChildren(openedTreeitem)); 70 51 } else { … … 80 61 81 62 } 82 83 //TODO check if it's working only on open children???84 public void selectChildren(Treeitem openedTreeitem) {85 86 for (Component comp : openedTreeitem.getChildren()) {87 if (comp instanceof Treechildren) {88 Treechildren item = (Treechildren) comp;89 for (Treeitem childItem : item.getItems()) {90 updateItem(childItem, true);91 }92 break;93 }94 }95 96 }97 98 public void updateItem(Treeitem item, boolean select) {99 100 for (Component comp : item.getChildren()) {101 // update the item row102 if (comp instanceof Treerow) {103 Treerow row = (Treerow) comp;104 Checkbox checkbox = (Checkbox) row.getFirstChild().getFirstChild();105 DefaultTreeNode<Corpus> node = (DefaultTreeNode<Corpus>) item.getValue();106 checkbox.setChecked(select);107 toggleCorpusCheckbox(node.getData(), checkbox, row);108 // update the item children109 } else if (comp instanceof Treechildren) {110 Treechildren children = (Treechildren) comp;111 for (Treeitem childItem : children.getItems()) {112 updateItem(childItem, select);113 }114 }115 }116 117 }118 119 private void updateParentItem(Treeitem item, boolean checked) {120 121 // if item becomes unselected, unselect it parent122 if (!checked) {123 Treeitem parent = item.getParentItem();124 if (parent != null) {125 for (Component comp : parent.getChildren()) {126 // update the item row127 if (comp instanceof Treerow) {128 Treerow row = (Treerow) comp;129 Checkbox checkbox = (Checkbox) row.getFirstChild().getFirstChild();130 DefaultTreeNode<Corpus> node = (DefaultTreeNode<Corpus>) parent.getValue();131 checkbox.setChecked(checked);132 toggleCorpusCheckbox(node.getData(), checkbox, row);133 updateParentItem(parent, checked);134 break;135 }136 }137 138 }139 }140 }141 142 private void toggleCorpusCheckbox(Corpus corpus, Checkbox checkbox, Treerow row) {143 if (checkbox.isChecked()) {144 row.setZclass("z-treerow z-treerow-seld");145 model.addToSelected(corpus);146 } else {147 row.setZclass("z-treerow");148 model.removeFromSelected(corpus);149 }150 }151 152 private void addCorpusDataIntoRow(Treerow dataRow, Corpus data) {153 Treecell cell1 = createCellForSelectCorpus(data, dataRow);154 dataRow.appendChild(cell1);155 Treecell cell4 = createCellForHome(data);156 dataRow.appendChild(cell4);157 Treecell cell2 = createCellForCorpusLanguage(data);158 dataRow.appendChild(cell2);159 Treecell cell5 = createCellForCorpusInstitution(data);160 dataRow.appendChild(cell5);161 Treecell cell3 = createCellForCorpusDescription(data);162 dataRow.appendChild(cell3);163 }164 165 private Treecell createCellForSelectCorpus(Corpus data, Treerow dataRow) {166 Treecell cell = new Treecell();167 Checkbox corpusCheckbox = createCheckboxForSelectCorpus(dataRow);168 corpusCheckbox.setParent(cell);169 if (data.getDisplayName() == null) {170 Label corpusLabel = new Label("");171 corpusLabel.setParent(cell);172 } else {173 Label corpusLabel = new Label(data.getDisplayName());174 corpusLabel.setParent(cell);175 }176 return cell;177 }178 179 private Checkbox createCheckboxForSelectCorpus(Treerow dataRow) {180 Checkbox checkbox = new Checkbox();181 checkbox.setValue(dataRow);182 Treeitem eventItem = (Treeitem) dataRow.getParent();183 DefaultTreeNode<Corpus> eventNode = (DefaultTreeNode<Corpus>) eventItem.getValue();184 if (model.isSelected(eventNode)) {185 checkbox.setChecked(true);186 toggleCorpusCheckbox(eventNode.getData(), checkbox, dataRow);187 }188 checkbox.addEventListener("onCheck", new EventListener() {189 @Override190 public void onEvent(Event event) throws Exception {191 Checkbox eventCheckbox = (Checkbox) event.getTarget();192 Treerow eventRow = (Treerow) eventCheckbox.getValue();193 Treeitem eventItem = (Treeitem) eventRow.getParent();194 DefaultTreeNode<Corpus> eventNode = (DefaultTreeNode<Corpus>) eventItem.getValue();195 toggleCorpusCheckbox(eventNode.getData(), eventCheckbox, eventRow);196 updateParentItem(eventItem, eventCheckbox.isChecked());197 for (Treeitem item : eventItem.getTreechildren().getItems()) {198 updateItem(item, eventCheckbox.isChecked());199 }200 }201 });202 return checkbox;203 }204 205 private Treecell createCellForCorpusInstitution(Corpus data) {206 Treecell cell = new Treecell();207 if (data.getInstitution() == null) {208 Label label = new Label("");209 label.setParent(cell);210 } else {211 Label label = new Label(data.getInstitution().getName());212 label.setParent(cell);213 }214 return cell;215 }216 217 private Treecell createCellForHome(Corpus data) {218 Treecell cell = new Treecell();219 if (data.getLandingPage() == null) {220 Label label = new Label("");221 label.setParent(cell);222 } else {223 224 A link = new A();225 link.setTarget("_blank");226 link.setHref(data.getLandingPage());227 link.setImage("img/go-home.png");228 link.setParent(cell);229 }230 return cell;231 }232 233 private Treecell createCellForCorpusLanguage(Corpus data) {234 Treecell cell = new Treecell();235 if (!data.getLanguages().isEmpty()) {236 StringBuilder langs = new StringBuilder();237 for (String lang : data.getLanguages()) {238 String langName = languages.nameForCode(lang);239 if (langName != null) {240 langs.append(langName);241 } else {242 langs.append(lang);243 }244 langs.append("\n ");245 246 }247 Label label = new Label(langs.toString());248 label.setMultiline(true);249 label.setParent(cell);250 } else {251 Label label = new Label("");252 label.setParent(cell);253 }254 return cell;255 }256 257 private Treecell createCellForCorpusDescription(Corpus data) {258 Treecell cell = new Treecell();259 if (data.getDescription() != null) {260 //if (data.getDescription().length() > 40) {261 // String descrStart = data.getDescription().substring(0, 35) + " ...";262 // Label label = new Label(descrStart);263 // label.setTooltiptext(data.getDescription());264 // label.setParent(cell);265 //} else {266 Label label = new Label(data.getDescription());267 label.setMultiline(true);268 label.setParent(cell);269 //}270 } else {271 Label label = new Label("");272 label.setParent(cell);273 }274 275 return cell;276 }277 63 } -
SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/sopt/Languages.java
r5035 r5039 17 17 public class Languages { 18 18 19 private Map<String,String> code2Name = new HashMap<String,String>(); 20 private Map<String,String> code22Code = new HashMap<String,String>(); 19 20 private Map<String,Language> code2Lang = new HashMap<String,Language>(); 21 21 22 public static final String LANGUAGES_FILE_PATH = "/lang/ISO-639-2_utf-8.txt"; 22 23 public static final String LANGUAGES_FILE_ENCODING = "UTF-8"; … … 27 28 } 28 29 29 public String nameForCode(String code) { 30 return this.code2Name.get(code); 30 /** 31 * Gets language by its ISO 639 language code. 32 * 33 * @param code ISO 639/1, 639/2T or 639/2B language code 34 * @return language 35 */ 36 public Language langForCode(String code) { 37 return this.code2Lang.get(code); 31 38 } 32 39 33 public String code2ForCode(String code) { 34 return this.code22Code.get(code); 40 /** 41 * Gets language name by the ISO 639 language code. 42 * 43 * @param code ISO 639/1, 639/2T or 639/2B language code 44 * @return language name in English 45 */ 46 public String nameForCode(String code) { 47 if (this.code2Lang.containsKey(code)) { 48 return this.code2Lang.get(code).getNameEn(); 49 } 50 return code; 35 51 } 36 52 53 /** 54 * Gets all known to it ISO 639/1, 639/2T and 639/2B language codes. 55 * 56 * @return language codes 57 */ 37 58 public Set<String> getCodes() { 38 return this.code2 Name.keySet();59 return this.code2Lang.keySet(); 39 60 } 40 61 … … 53 74 String alpha2 = splitted[2]; 54 75 String enName = splitted[3]; 76 Language lang = new Language(alpha2, alpha3t, alpha3b, enName); 55 77 if (!alpha3b.isEmpty()) { 56 this.code2Name.put(alpha3b, enName); 57 this.code22Code.put(alpha3b, alpha2); 78 this.code2Lang.put(alpha3b, lang); 58 79 } 59 80 if (!alpha3t.isEmpty()) { 60 this.code2Name.put(alpha3t, enName); 61 this.code22Code.put(alpha3t, alpha2); 81 this.code2Lang.put(alpha3t, lang); 62 82 } 63 83 if (!alpha2.isEmpty()) { 64 this.code2Name.put(alpha2, enName); 65 this.code22Code.put(alpha2, alpha2); 84 this.code2Lang.put(alpha2, lang); 66 85 } 67 86 } -
SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/sresult/SearchResult.java
r4069 r5039 21 21 private Corpus corpus; 22 22 private String searchString; 23 private int startRecord; 24 private int endRecord; 23 25 private Future<SRUSearchRetrieveResponse> futureResponse; 24 26 private SRUSearchRetrieveResponse response; … … 36 38 } 37 39 38 public SearchResult(Corpus corpus, String searchString ) {40 public SearchResult(Corpus corpus, String searchString, int startRecord , int endRecord) { 39 41 this.corpus = corpus; 40 42 this.searchString = searchString; 43 this.startRecord = startRecord; 44 this.endRecord = endRecord; 45 } 46 47 public int getStartRecord() { 48 return startRecord; 49 } 50 51 public int getEndRecord() { 52 return endRecord; 41 53 } 42 54 -
SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/sresult/SearchResultRecordRenderer.java
r3038 r5039 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.sresult.SearchResult;10 import java.util.ArrayList;11 9 import java.util.List; 12 10 import java.util.logging.Level; … … 17 15 import org.zkoss.zul.A; 18 16 import org.zkoss.zul.Cell; 19 import org.zkoss.zul.Checkbox;20 import org.zkoss.zul.DefaultTreeNode;21 17 import org.zkoss.zul.Hlayout; 22 18 import org.zkoss.zul.Image; 23 19 import org.zkoss.zul.Label; 24 import org.zkoss.zul.Popup;25 20 import org.zkoss.zul.Row; 26 21 import org.zkoss.zul.RowRenderer; 27 import org.zkoss.zul.Treeitem;28 import org.zkoss.zul.Treerow;29 22 import org.zkoss.zul.Vlayout; 30 23 import org.zkoss.zul.Window; … … 194 187 } 195 188 189 190 196 191 } -
SRUAggregator/trunk/src/main/webapp/about-fcs.html
r5038 r5039 22 22 <p style="text-align:left"> 23 23 Currently, 11 centers from Germany, Netherlands and Czech Republic make more than 40 resources available 24 to the linguistic researche s via the common interface,24 to the linguistic researchers via the common interface, 25 25 and this number is growing. 26 26 </p> -
SRUAggregator/trunk/src/main/webapp/help-fcs.html
r5038 r5039 14 14 <h3>Search Options - adjusting search criteria</h3> 15 15 <p style="text-align:left">To select specific corpora based on their name or language and to specify number of search results 16 per corpus per page, click on the 'Search options' link. Here, you can filter resources based on the language,17 select specific resources, set the number of hits per corpus per page.</p>16 (hits) per corpus per page, click on the 'Search options' link. Here, you can filter resources based on the language, 17 select specific resources, set the maximum number of hits.</p> 18 18 <br/> 19 19 <h3>Search Results - inspecting search results</h3> … … 23 23 go to the menu and select either 'Export to Personal Workspace', 'Download' or 'Use WebLicht' menu item. 24 24 This menu appears only after all the results on the page have been loaded. 25 To get the next N records from each corpus, click the 'next' arrow at the bottom of 'Search results' page.25 To get the next hits from each corpus, click the 'next' arrow at the bottom of 'Search results' page. 26 26 </p> 27 27 <br/> … … 30 30 <a target="_blank" href="http://weblicht.sfs.uni-tuebingen.de/weblichtwiki/index.php/FCS_Aggregator"> 31 31 Aggegator wiki page</a>. 32 If you still cannot notfind an answer to your question, or if want to send a feedback,32 If you still cannot find an answer to your question, or if want to send a feedback, 33 33 you can write to Clarin-D helpdesk: 34 34 </p> -
SRUAggregator/trunk/src/main/webapp/index.zul
r5037 r5039 100 100 <progressmeter visible="false" id="pMeter" value="0" width="300px"/> 101 101 <hlayout> 102 <a id="prevButton" visible="false" image="img/arrow_left_blue.png" 102 <a id="prevButton" visible="false" image="img/arrow_left_blue.png" tooltip="tooltipPrev" 103 103 hoverImage="img/arrow_left_green.png" style="margin-right:20px;"/> 104 <a id="nextButton" visible="false" image="img/arrow_right_blue.png" 104 <a id="nextButton" visible="false" image="img/arrow_right_blue.png" tooltip="tooltipNext" 105 105 hoverImage="img/arrow_right_green.png" dir="reverse" 106 106 style="margin-left:20px;"/> … … 159 159 </grid> 160 160 </popup> 161 162 <popup id="tooltipPrev"><label id="tooltipPrevText" value="previous N hits from each resource" style="font-weight:bold"/></popup> 163 <popup id="tooltipNext"><label id="tooltipNextText" value="next N hits from each resource" style="font-weight:bold"/></popup> 161 164 162 165 </window>
Note: See TracChangeset
for help on using the changeset viewer.