Changeset 6131 for SRUAggregator


Ignore:
Timestamp:
04/07/15 20:38:40 (9 years ago)
Author:
emanuel.dima@uni-tuebingen.de
Message:
  1. beta-33: support for slow endpoints; POST external searches; UI errors for corner cases
Location:
SRUAggregator/trunk
Files:
1 added
16 edited

Legend:

Unmodified
Added
Removed
  • SRUAggregator/trunk/aggregator.yml

    r6129 r6131  
    1212    #  - http://dspin.dwds.de:8088/ddc-sru/dta/
    1313
    14   AGGREGATOR_FILE_PATH: /data/fcsAggregator/fcsAggregatorCorpora.json
    15   AGGREGATOR_FILE_PATH_BACKUP: /data/fcsAggregator/fcsAggregatorCorpora.backup.json
    16   # AGGREGATOR_FILE_PATH: /Users/edima/fcsAggregatorCorpora.json
    17   # AGGREGATOR_FILE_PATH_BACKUP: /Users/edima/fcsAggregatorCorpora.backup.json
    18   SCAN_MAX_DEPTH: 3 # recommended 3
     14  # AGGREGATOR_FILE_PATH: /data/fcsAggregator/fcsAggregatorCorpora.json
     15  # AGGREGATOR_FILE_PATH_BACKUP: /data/fcsAggregator/fcsAggregatorCorpora.backup.json
     16  AGGREGATOR_FILE_PATH: /Users/edima/fcsAggregatorCorpora.json
     17  AGGREGATOR_FILE_PATH_BACKUP: /Users/edima/fcsAggregatorCorpora.backup.json
     18  SCAN_MAX_DEPTH: 1 # recommended 3
    1919  SCAN_TASK_INITIAL_DELAY: 0
    2020  SCAN_TASK_INTERVAL: 12
     
    2323  SCAN_MAX_CONCURRENT_REQUESTS_PER_ENDPOINT: 4  # @depth2: 1=361s; 2=225s; 4=207s
    2424  SEARCH_MAX_CONCURRENT_REQUESTS_PER_ENDPOINT: 4
     25  SEARCH_MAX_CONCURRENT_REQUESTS_PER_SLOW_ENDPOINT: 2
     26  slowEndpoints:
     27    - http://cqlservlet.mpi.nl/
    2528
    2629  ENDPOINTS_SCAN_TIMEOUT_MS: 60000
     
    4144# use the simple server factory, run on a single port
    4245server:
    43   applicationContextPath: /Aggregator-testing
     46  applicationContextPath: /Aggregator
    4447  type: simple
    4548  connector:
  • SRUAggregator/trunk/pom.xml

    r6130 r6131  
    88        <groupId>eu.clarin.sru.fcs</groupId>
    99        <artifactId>aggregator</artifactId>
    10         <version>2.0.0-beta-32</version>
     10        <version>2.0.0-beta-33</version>
    1111        <name>FCS Aggregator</name>
    1212
  • SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/app/Aggregator.java

    r6123 r6131  
    88import com.optimaize.langdetect.profiles.LanguageProfileReader;
    99import com.optimaize.langdetect.text.*;
     10import eu.clarin.sru.client.SRUThreadedClient;
    1011import eu.clarin.sru.fcs.aggregator.search.Search;
    1112import eu.clarin.sru.fcs.aggregator.scan.ScanCrawlTask;
     
    1415import eu.clarin.sru.client.fcs.ClarinFCSClientBuilder;
    1516import eu.clarin.sru.client.fcs.ClarinFCSEndpointDescriptionParser;
     17import eu.clarin.sru.fcs.aggregator.client.MaxConcurrentRequestsCallback;
    1618import eu.clarin.sru.fcs.aggregator.client.ThrottledClient;
    1719import eu.clarin.sru.fcs.aggregator.scan.Corpus;
     
    2527import java.io.File;
    2628import java.io.IOException;
     29import java.net.URI;
    2730import java.util.ArrayList;
    2831import java.util.Collections;
     
    6568 * @author edima
    6669 *
    67  * TODO: improve help page text
    68  *
    6970 * TODO: update comments everywhere
    7071 *
     
    102103        private TextObjectFactory textObjectFactory;
    103104
    104         private ThrottledClient sruScanClient = null;
    105         private ThrottledClient sruSearchClient = null;
     105        private ThrottledClient sruClient = null;
     106        public MaxConcurrentRequestsCallback maxScanConcurrentRequestsCallback;
     107        public MaxConcurrentRequestsCallback maxSearchConcurrentRequestsCallback;
    106108        private Map<Long, Search> activeSearches = Collections.synchronizedMap(new HashMap<Long, Search>());
    107109
     
    173175        public void init() throws IOException {
    174176                log.info("Aggregator initialization started.");
    175                 sruScanClient = new ThrottledClient(
    176                                 new ClarinFCSClientBuilder()
     177
     178                SRUThreadedClient sruScanClient
     179                                = new ClarinFCSClientBuilder()
    177180                                .setConnectTimeout(params.ENDPOINTS_SCAN_TIMEOUT_MS)
    178181                                .setSocketTimeout(params.ENDPOINTS_SCAN_TIMEOUT_MS)
     
    181184                                                new ClarinFCSEndpointDescriptionParser())
    182185                                .enableLegacySupport()
    183                                 .buildThreadedClient(),
    184                                 params.SCAN_MAX_CONCURRENT_REQUESTS_PER_ENDPOINT
    185                 );
    186                 sruSearchClient = new ThrottledClient(
    187                                 new ClarinFCSClientBuilder()
     186                                .buildThreadedClient();
     187
     188                SRUThreadedClient sruSearchClient
     189                                = new ClarinFCSClientBuilder()
    188190                                .setConnectTimeout(params.ENDPOINTS_SEARCH_TIMEOUT_MS)
    189191                                .setSocketTimeout(params.ENDPOINTS_SEARCH_TIMEOUT_MS)
    190192                                .addDefaultDataViewParsers()
     193                                .registerExtraResponseDataParser(
     194                                                new ClarinFCSEndpointDescriptionParser())
    191195                                .enableLegacySupport()
    192                                 .buildThreadedClient(),
    193                                 params.SEARCH_MAX_CONCURRENT_REQUESTS_PER_ENDPOINT
     196                                .buildThreadedClient();
     197
     198                maxScanConcurrentRequestsCallback = new MaxConcurrentRequestsCallback() {
     199                        @Override
     200                        public int getMaxConcurrentRequest(URI baseURI) {
     201                                return params.SCAN_MAX_CONCURRENT_REQUESTS_PER_ENDPOINT;
     202                        }
     203                };
     204
     205                maxSearchConcurrentRequestsCallback = new MaxConcurrentRequestsCallback() {
     206                        @Override
     207                        public int getMaxConcurrentRequest(URI baseURI) {
     208                                return params.slowEndpoints.contains(baseURI)
     209                                                ? params.SEARCH_MAX_CONCURRENT_REQUESTS_PER_SLOW_ENDPOINT
     210                                                : params.SEARCH_MAX_CONCURRENT_REQUESTS_PER_ENDPOINT;
     211                        }
     212                };
     213
     214                sruClient = new ThrottledClient(
     215                                sruScanClient, maxScanConcurrentRequestsCallback,
     216                                sruSearchClient, maxSearchConcurrentRequestsCallback
    194217                );
    195218
     
    221244                initLanguageDetector();
    222245
    223                 ScanCrawlTask task = new ScanCrawlTask(sruScanClient,
     246                ScanCrawlTask task = new ScanCrawlTask(sruClient,
    224247                                params.CENTER_REGISTRY_URL, params.SCAN_MAX_DEPTH,
    225248                                params.additionalCQLEndpoints,
     
    237260                        search.shutdown();
    238261                }
    239                 shutdownAndAwaitTermination(config.aggregatorParams, sruScanClient, scheduler);
    240                 shutdownAndAwaitTermination(config.aggregatorParams, sruSearchClient, scheduler);
     262                shutdownAndAwaitTermination(config.aggregatorParams, sruClient, scheduler);
    241263                log.info("Aggregator shutdown complete.");
    242264        }
     
    253275                        return null;
    254276                } else {
    255                         Search sr = new Search(sruSearchClient, version, searchStatsAtom.get(),
     277                        Search sr = new Search(sruClient,
     278                                        version, searchStatsAtom.get(),
    256279                                        corpora, searchString, searchLang, maxRecords);
    257280                        if (activeSearches.size() > SEARCHES_SIZE_GC_THRESHOLD) {
  • SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/app/AggregatorConfiguration.java

    r6065 r6131  
    44import com.fasterxml.jackson.annotation.JsonProperty;
    55import io.dropwizard.Configuration;
     6import java.net.URI;
    67import java.net.URL;
    78import java.util.List;
     
    1920                @JsonProperty
    2021                List<URL> additionalCQLEndpoints;
     22
     23                @JsonProperty
     24                List<URI> slowEndpoints;
    2125
    2226                @NotEmpty
     
    5155                @Range
    5256                int SEARCH_MAX_CONCURRENT_REQUESTS_PER_ENDPOINT;
     57
     58                @JsonProperty
     59                @Range
     60                int SEARCH_MAX_CONCURRENT_REQUESTS_PER_SLOW_ENDPOINT;
    5361
    5462                @JsonProperty
     
    112120
    113121                @JsonIgnore
     122                public int getSEARCH_MAX_CONCURRENT_REQUESTS_PER_SLOW_ENDPOINT() {
     123                        return SEARCH_MAX_CONCURRENT_REQUESTS_PER_SLOW_ENDPOINT;
     124                }
     125
     126                @JsonIgnore
    114127                public WeblichtConfig getWeblichtConfig() {
    115128                        return weblichtConfig;
  • SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/app/ErrorHandler.java

    r6123 r6131  
    11package eu.clarin.sru.fcs.aggregator.app;
    22
    3 import com.fasterxml.jackson.databind.ObjectMapper;
    43import java.io.IOException;
    54import javax.servlet.RequestDispatcher;
     
    1918        private static final org.slf4j.Logger log = LoggerFactory.getLogger(Aggregator.class);
    2019
    21         private final String redirectRoute = "/index.html";
     20        public static final String PARAM_QUERY = "query";
     21        public static final String PARAM_MODE = "mode";
     22        public static final String PARAM_AGGREGATION_CONTEXT = "x-aggregation-context";
     23
     24        public static final String redirectRoute = "/index.html";
     25
    2226
    2327        @Override
     
    2731                        forward(redirectRoute, baseRequest, response);
    2832                } else if (request.getMethod().equals("POST")
    29                                 && response.getStatus() == HttpServletResponse.SC_METHOD_NOT_ALLOWED
    30                                 && request.getParameterValues("x-aggregation-context") != null) {
    31 
    32                         // this request must come from VLO
    33                         String[] queryValues = request.getParameterValues("query");
    34                         if (queryValues != null && queryValues.length > 0) {
    35                                 baseRequest.getSession().setAttribute("query", queryValues[0]);
     33                                && response.getStatus() == HttpServletResponse.SC_METHOD_NOT_ALLOWED) {
     34                        // an external search request, coming from clarin.eu or VLO
     35                        {
     36                                String[] queryValues = request.getParameterValues(PARAM_QUERY);
     37                                if (queryValues != null && queryValues.length > 0) {
     38                                        baseRequest.getSession().setAttribute(PARAM_QUERY, queryValues[0]);
     39                                }
    3640                        }
    3741
    38                         String[] contextValues = request.getParameterValues("x-aggregation-context");
    39                         if (contextValues != null && contextValues.length > 0) {
    40                                 baseRequest.getSession().setAttribute("x-aggregation-context", contextValues[0]);
     42                        {
     43                                String[] modeValues = request.getParameterValues(PARAM_MODE);
     44                                if (modeValues != null && modeValues.length > 0) {
     45                                        baseRequest.getSession().setAttribute(PARAM_MODE, modeValues[0]);
     46                                }
     47                        }
     48
     49                        {
     50                                String[] contextValues = request.getParameterValues(PARAM_AGGREGATION_CONTEXT);
     51                                if (contextValues != null && contextValues.length > 0) {
     52                                        baseRequest.getSession().setAttribute(PARAM_AGGREGATION_CONTEXT, contextValues[0]);
     53                                }
    4154                        }
    4255
  • SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/client/GenericClient.java

    r5957 r6131  
    77import java.util.Map;
    88import java.util.Queue;
     9import org.slf4j.LoggerFactory;
    910
    1011/**
     
    1415class GenericClient {
    1516
     17        private static final org.slf4j.Logger log = LoggerFactory.getLogger(GenericClient.class);
     18
    1619        private final SRUThreadedClient sruClient;
    17         public final int maxConcurrentRequests;
     20        final MaxConcurrentRequestsCallback maxConcurrentRequestsCallback;
    1821
    1922        // queue of operations waiting for execution
    2023        static class ExecQueue {
    21 
     24                int maxConcurrentRequests = 0;
    2225                int nowExecuting = 0;
    2326                Queue<Operation> queue = new ArrayDeque<>();
     
    2629        private final Object lock = new Object();
    2730
    28         GenericClient(SRUThreadedClient sruClient, int maxConcurrentRequests) {
     31        GenericClient(SRUThreadedClient sruClient, MaxConcurrentRequestsCallback maxConcurrentRequestsCallback) {
    2932                this.sruClient = sruClient;
    30                 this.maxConcurrentRequests = maxConcurrentRequests;
     33                this.maxConcurrentRequestsCallback = maxConcurrentRequestsCallback;
    3134        }
    3235
     
    3740                        if (eq == null) {
    3841                                eq = new ExecQueue();
     42                                try {
     43                                        eq.maxConcurrentRequests = maxConcurrentRequestsCallback.getMaxConcurrentRequest(endpoint);
     44                                        log.info("CONCURRENCY LEVEL " + eq.maxConcurrentRequests
     45                                                        + " for operation: " + op.getClass().getSimpleName()
     46                                                        + " for endpoint: " + endpoint);
     47                                } catch (Exception xc) {
     48                                        // ignore
     49                                } finally {
     50                                        if (eq.maxConcurrentRequests <= 0) {
     51                                                eq.maxConcurrentRequests = 1;
     52                                        }
     53                                }
    3954                                endpointMap.put(endpoint, eq);
    4055                        }
     
    5368                                return;
    5469                        }
    55                         if (eq.nowExecuting >= maxConcurrentRequests) {
     70                        if (eq.nowExecuting >= eq.maxConcurrentRequests) {
    5671                                return;
    5772                        }
  • SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/client/ThrottledClient.java

    r5957 r6131  
    99import eu.clarin.sru.client.SRUSearchRetrieveResponse;
    1010import eu.clarin.sru.client.SRUThreadedClient;
     11import java.net.URI;
     12import java.net.URISyntaxException;
     13import java.util.logging.Level;
     14import java.util.logging.Logger;
     15import org.slf4j.LoggerFactory;
    1116
    1217/**
     
    1419 */
    1520public class ThrottledClient {
     21        private static final org.slf4j.Logger log = LoggerFactory.getLogger(GenericClient.class);
    1622
    1723        public interface Stats {
     
    4349        }
    4450
    45         GenericClient client;
     51        GenericClient scanClient;
     52        GenericClient searchClient;
    4653
    47         public ThrottledClient(SRUThreadedClient sruClient, int maxConcurrentRequests) {
    48                 this.client = new GenericClient(sruClient, maxConcurrentRequests);
     54        public ThrottledClient(
     55                        SRUThreadedClient sruScanClient, MaxConcurrentRequestsCallback scanConcurrentCallback,
     56                        SRUThreadedClient sruSearchClient, MaxConcurrentRequestsCallback searchConcurrentCallback) {
     57                this.scanClient = new GenericClient(sruScanClient, scanConcurrentCallback);
     58                this.searchClient = new GenericClient(sruSearchClient, searchConcurrentCallback);
    4959        }
    5060
    5161        public void explain(SRUExplainRequest request, ExplainCallback callback) {
    52                 client.execute(request.getBaseURI(), new ExplainOperation(request, callback));
     62                scanClient.execute(request.getBaseURI(), new ExplainOperation(request, callback));
    5363        }
    5464
    5565        public void scan(SRUScanRequest request, ScanCallback callback) {
    56                 client.execute(request.getBaseURI(), new ScanOperation(request, callback));
     66                scanClient.execute(request.getBaseURI(), new ScanOperation(request, callback));
    5767        }
    5868
    5969        public void searchRetrieve(SRUSearchRetrieveRequest request, SearchCallback callback) {
    60                 client.execute(request.getBaseURI(), new SearchOperation(request, callback));
     70                searchClient.execute(request.getBaseURI(), new SearchOperation(request, callback));
    6171        }
    6272
    6373        public void shutdown() {
    64                 client.shutdown();
     74                scanClient.shutdown();
     75                searchClient.shutdown();
    6576        }
    6677
    6778        public void shutdownNow() {
    68                 client.shutdownNow();
     79                scanClient.shutdownNow();
     80                searchClient.shutdownNow();
    6981        }
     82
     83        public int getMaxConcurrentRequests(boolean isSearch, String url) {
     84                try {
     85                        URI uri = new URI(url);
     86                        return isSearch
     87                                        ? searchClient.maxConcurrentRequestsCallback.getMaxConcurrentRequest(uri)
     88                                        : scanClient.maxConcurrentRequestsCallback.getMaxConcurrentRequest(uri);
     89                } catch (URISyntaxException ex) {
     90                        return -1;
     91                }
     92        }
     93
    7094}
  • SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/rest/RestService.java

    r6123 r6131  
    99import eu.clarin.sru.fcs.aggregator.app.AggregatorConfiguration;
    1010import eu.clarin.sru.fcs.aggregator.app.AggregatorConfiguration.Params.WeblichtConfig;
     11import static eu.clarin.sru.fcs.aggregator.app.ErrorHandler.PARAM_AGGREGATION_CONTEXT;
     12import static eu.clarin.sru.fcs.aggregator.app.ErrorHandler.PARAM_MODE;
     13import static eu.clarin.sru.fcs.aggregator.app.ErrorHandler.PARAM_QUERY;
    1114import eu.clarin.sru.fcs.aggregator.scan.Corpora;
    1215import eu.clarin.sru.fcs.aggregator.scan.Corpus;
     
    8184        @GET
    8285        @Path("init")
    83         public Response getInit(@Context HttpServletRequest request) throws IOException {
     86        public Response getInit(@Context final HttpServletRequest request) throws IOException {
    8487                log.info("get initial data");
    8588                final Corpora corpora = Aggregator.getInstance().getCorpora();
    86                 final Object contextString = request.getSession().getAttribute("x-aggregation-context");
    87                 final Object query = request.getSession().getAttribute("query");
    88                 final Object mode = request.getSession().getAttribute("mode");
     89                final Object query = request.getSession().getAttribute(PARAM_QUERY);
     90                final Object mode = request.getSession().getAttribute(PARAM_MODE);
     91                final Object contextString = request.getSession().getAttribute(PARAM_AGGREGATION_CONTEXT);
    8992                Object j = new HashMap<String, Object>() {
    9093                        {
    9194                                if (query != null) {
    92                                         put("query", query);
     95                                        put(PARAM_QUERY, query);
     96                                        request.getSession().setAttribute(PARAM_QUERY, null);
     97                                }
     98                                if (mode != null) {
     99                                        put(PARAM_MODE, mode);
     100                                        request.getSession().setAttribute(PARAM_MODE, null);
    93101                                }
    94102                                if (contextString instanceof String) {
    95103                                        Object context = new ObjectMapper().readValue((String) contextString, Object.class);
    96                                         put("x-aggregation-context", context); // preselected corpora
     104                                        put(PARAM_AGGREGATION_CONTEXT, context); // preselected corpora
     105                                        request.getSession().setAttribute(PARAM_AGGREGATION_CONTEXT, null);
    97106                                }
    98107                                put("corpora", corpora.getCorpora());
     
    288297                                put("Last Scan", new HashMap<String, Object>() {
    289298                                        {
    290                                                 put("maxConcurrentScanRequestsPerEndpoint",
    291                                                                 Aggregator.getInstance().getParams().getSCAN_MAX_CONCURRENT_REQUESTS_PER_ENDPOINT());
    292299                                                put("timeout", params.getENDPOINTS_SCAN_TIMEOUT_MS() / 1000.);
    293300                                                put("isScan", true);
     
    298305                                put("Recent Searches", new HashMap<String, Object>() {
    299306                                        {
    300                                                 put("maxConcurrentSearchRequestsPerEndpoint",
    301                                                                 Aggregator.getInstance().getParams().getSEARCH_MAX_CONCURRENT_REQUESTS_PER_ENDPOINT());
    302307                                                put("timeout", params.getENDPOINTS_SEARCH_TIMEOUT_MS() / 1000.);
    303308                                                put("isScan", false);
  • SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/scan/ScanCrawler.java

    r6092 r6131  
    1010import eu.clarin.sru.client.SRUScanResponse;
    1111import eu.clarin.sru.client.SRUTerm;
    12 import eu.clarin.sru.client.SRUVersion;
    1312import eu.clarin.sru.client.fcs.ClarinFCSEndpointDescription;
    1413import eu.clarin.sru.client.fcs.ClarinFCSEndpointDescription.ResourceInfo;
     
    9594                        SRUExplainRequest explainRequest = null;
    9695                        try {
     96                                statistics.initEndpoint(institution, endpoint, sruClient.getMaxConcurrentRequests(false, endpoint.getUrl()));
    9797                                explainRequest = new SRUExplainRequest(endpoint.getUrl());
    9898                                explainRequest.setExtraRequestData(SRUCQL.EXPLAIN_ASK_FOR_RESOURCES_PARAM, "true");
  • SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/scan/Statistics.java

    r6043 r6131  
    2828                List<Long> executionTimes = Collections.synchronizedList(new ArrayList<Long>());
    2929
     30                @JsonProperty
     31                int maxConcurrentRequests;
     32
    3033                public static class DiagPair {
    3134
     
    122125        public Map<String, Map<String, EndpointStats>> getInstitutions() {
    123126                return institutions;
     127        }
     128
     129        public void initEndpoint(Institution institution, Endpoint endpoint, int maxConcurrentRequests) {
     130                EndpointStats stats = getEndpointStats(institution, endpoint);
     131                synchronized (stats.lock) {
     132                        stats.maxConcurrentRequests = maxConcurrentRequests;
     133                }
    124134        }
    125135
  • SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/search/Search.java

    r6092 r6131  
    4242        private final Statistics statistics;
    4343
    44         public Search(ThrottledClient searchClient, SRUVersion version,
     44        public Search(ThrottledClient searchClient,
     45                        SRUVersion version,
    4546                        Statistics statistics, List<Corpus> corpora, String searchString,
    4647                        String searchLanguage, int maxRecords
     
    9091                                        corpus.getHandle());
    9192                }
     93
     94                statistics.initEndpoint(corpus.getInstitution(), corpus.getEndpoint(),
     95                                searchClient.getMaxConcurrentRequests(true, corpus.getEndpoint().getUrl()));
    9296                result.setInProgress(true);
    9397
  • SRUAggregator/trunk/src/main/resources/assets/js/main.js

    r6129 r6131  
    33"use strict";
    44
    5 var VERSION = window.MyAggregator.VERSION = "VERSION 2.0.0-beta-32";
     5var VERSION = window.MyAggregator.VERSION = "VERSION 2.0.0-beta-33";
    66var URLROOT = window.MyAggregator.URLROOT =
    77        window.location.pathname.substring(0, window.location.pathname.indexOf("/",2)) ||
     
    7373
    7474        renderAggregator: function() {
    75                 return React.createElement(AggregatorPage, {ajax: this.ajax});
     75                return React.createElement(AggregatorPage, {ajax: this.ajax, error: this.error});
    7676        },
    7777
     
    291291                                                                : React.createElement("span", {style: {color:'#3c763d'}}, React.createElement("i", {className: "glyphicon glyphicon-thumbs-up"}), " "),
    292292                                                       
    293                                                          " "+endpoint[0], ":"
    294                                                 ),
    295                                                 React.createElement("li", null,
    296                                                         React.createElement("span", null, stat.numberOfRequests), " request(s)," + ' ' +
    297                                                         "average:", this.renderWaitTimeSecs(stat.avgExecutionTime), "," + ' ' +
    298                                                         "max: ", this.renderWaitTimeSecs(stat.maxExecutionTime)
     293                                                         " "+endpoint[0]
    299294                                                )
     295                                        ),
     296                                        React.createElement("div", {style: {marginLeft:40}},
     297                                         isScan ?
     298                                                React.createElement("div", null, "Max concurrent scan requests:", " ", " ", stat.maxConcurrentRequests, " ") :
     299                                                React.createElement("div", null, "Max concurrent search requests:", " ", " ", stat.maxConcurrentRequests, " ")
     300                                       
     301                                        ),
     302                                        React.createElement("div", {style: {marginLeft:40}},
     303                                                React.createElement("span", null, stat.numberOfRequests), " request(s)," + ' ' +
     304                                                "average:", this.renderWaitTimeSecs(stat.avgExecutionTime), "," + ' ' +
     305                                                "max: ", this.renderWaitTimeSecs(stat.maxExecutionTime)
    300306                                        ),
    301307                                         isScan ? this.renderCollections(stat.rootCollections) : false,
     
    324330                                        React.createElement("div", null,
    325331                                                React.createElement("div", null, "Start date: ", new Date(stats.date).toLocaleString()),
    326                                                  stats.isScan ?
    327                                                         React.createElement("div", null, "Max concurrent scan requests per endpoint:", " ",
    328                                                                 React.createElement("kbd", null, stats.maxConcurrentScanRequestsPerEndpoint)
    329                                                         )
    330                                                         :
    331                                                         React.createElement("div", null, "Max concurrent search requests per endpoint:", " ",
    332                                                                 React.createElement("kbd", null, stats.maxConcurrentSearchRequestsPerEndpoint)
    333                                                         ),
    334                                                
    335332                                                React.createElement("div", null, "Timeout: ", " ", React.createElement("kbd", null, stats.timeout, " seconds"))
    336333                                        ),
  • SRUAggregator/trunk/src/main/resources/assets/js/main.jsx

    r6129 r6131  
    33"use strict";
    44
    5 var VERSION = window.MyAggregator.VERSION = "VERSION 2.0.0-beta-32";
     5var VERSION = window.MyAggregator.VERSION = "VERSION 2.0.0-beta-33";
    66var URLROOT = window.MyAggregator.URLROOT =
    77        window.location.pathname.substring(0, window.location.pathname.indexOf("/",2)) ||
     
    7373
    7474        renderAggregator: function() {
    75                 return <AggregatorPage ajax={this.ajax} />;
     75                return <AggregatorPage ajax={this.ajax} error={this.error} />;
    7676        },
    7777
     
    291291                                                                : <span style={{color:'#3c763d'}}><i className="glyphicon glyphicon-thumbs-up"></i> </span>
    292292                                                        }
    293                                                         { " "+endpoint[0] }:
    294                                                 </li>
    295                                                 <li>
    296                                                         <span>{stat.numberOfRequests}</span> request(s),
    297                                                         average:{this.renderWaitTimeSecs(stat.avgExecutionTime)},
    298                                                         max: {this.renderWaitTimeSecs(stat.maxExecutionTime)}
     293                                                        { " "+endpoint[0] }
    299294                                                </li>
    300295                                        </ul>
     296                                        <div style={{marginLeft:40}}>
     297                                        { isScan ?
     298                                                <div>Max concurrent scan requests:{" "} {stat.maxConcurrentRequests} </div> :
     299                                                <div>Max concurrent search requests:{" "} {stat.maxConcurrentRequests} </div>
     300                                        }
     301                                        </div>
     302                                        <div style={{marginLeft:40}}>
     303                                                <span>{stat.numberOfRequests}</span> request(s),
     304                                                average:{this.renderWaitTimeSecs(stat.avgExecutionTime)},
     305                                                max: {this.renderWaitTimeSecs(stat.maxExecutionTime)}
     306                                        </div>
    301307                                        { isScan ? this.renderCollections(stat.rootCollections) : false }
    302308                                        {       (errors && errors.length) ?
     
    324330                                        <div>
    325331                                                <div>Start date: {new Date(stats.date).toLocaleString()}</div>
    326                                                 { stats.isScan ?
    327                                                         <div>Max concurrent scan requests per endpoint:{" "}
    328                                                                 <kbd>{stats.maxConcurrentScanRequestsPerEndpoint}</kbd>
    329                                                         </div>
    330                                                         :
    331                                                         <div>Max concurrent search requests per endpoint:{" "}
    332                                                                 <kbd>{stats.maxConcurrentSearchRequestsPerEndpoint}</kbd>
    333                                                         </div>
    334                                                 }
    335332                                                <div>Timeout: {" "}<kbd>{stats.timeout} seconds</kbd></div>
    336333                                        </div>
  • SRUAggregator/trunk/src/main/resources/assets/js/search.js

    r6123 r6131  
    214214        propTypes: {
    215215                ajax: PT.func.isRequired,
     216                error: PT.func.isRequired,
    216217                embedded: PT.bool,
    217218        },
     
    257258                                                console.log("x-aggregation-context: ", json["x-aggregation-context"]);
    258259                                                corpora.setAggregationContext(json["x-aggregation-context"]);
     260                                                if (!corpora.getSelectedIds().length) {
     261                                                        this.props.error("Cannot find the required collection, will search all collections instead");
     262                                                        corpora.recurse(function(corpus) { corpus.selected = true; });
     263                                                }
    259264                                                corpora.update();
    260265                                        }
     
    280285                }
    281286                var selectedIds = this.state.corpora.getSelectedIds();
     287                if (!selectedIds.length) {
     288                        this.props.error("Please select a collection to search into");
     289                        return;
     290                }
     291
    282292                // console.log("searching in the following corpora:", selectedIds);
    283293                this.props.ajax({
  • SRUAggregator/trunk/src/main/resources/assets/js/search.jsx

    r6123 r6131  
    214214        propTypes: {
    215215                ajax: PT.func.isRequired,
     216                error: PT.func.isRequired,
    216217                embedded: PT.bool,
    217218        },
     
    257258                                                console.log("x-aggregation-context: ", json["x-aggregation-context"]);
    258259                                                corpora.setAggregationContext(json["x-aggregation-context"]);
     260                                                if (!corpora.getSelectedIds().length) {
     261                                                        this.props.error("Cannot find the required collection, will search all collections instead");
     262                                                        corpora.recurse(function(corpus) { corpus.selected = true; });
     263                                                }
    259264                                                corpora.update();
    260265                                        }
     
    280285                }
    281286                var selectedIds = this.state.corpora.getSelectedIds();
     287                if (!selectedIds.length) {
     288                        this.props.error("Please select a collection to search into");
     289                        return;
     290                }
     291
    282292                // console.log("searching in the following corpora:", selectedIds);
    283293                this.props.ajax({
  • SRUAggregator/trunk/src/test/java/eu/clarin/sru/fcs/aggregator/app/ScanCrawlerTest.java

    r5971 r6131  
    11package eu.clarin.sru.fcs.aggregator.app;
    22
     3import eu.clarin.sru.client.SRUThreadedClient;
    34import eu.clarin.sru.client.fcs.ClarinFCSClientBuilder;
     5import eu.clarin.sru.fcs.aggregator.client.MaxConcurrentRequestsCallback;
    46import eu.clarin.sru.fcs.aggregator.scan.Corpora;
    57import eu.clarin.sru.fcs.aggregator.scan.EndpointUrlFilterAllow;
    68import eu.clarin.sru.fcs.aggregator.scan.ScanCrawler;
    79import eu.clarin.sru.fcs.aggregator.client.ThrottledClient;
    8 import eu.clarin.sru.fcs.aggregator.scan.CenterRegistry;
    910import eu.clarin.sru.fcs.aggregator.scan.CenterRegistryLive;
    1011import eu.clarin.sru.fcs.aggregator.scan.Corpus;
     12import java.net.URI;
    1113import java.util.HashSet;
    1214import java.util.Set;
     
    2628        @Test
    2729        public void testCrawlForMpiAndTue() throws NamingException {
    28 
     30                SRUThreadedClient sruThreadedClient = new ClarinFCSClientBuilder()
     31                                .addDefaultDataViewParsers()
     32                                .buildThreadedClient();
     33                MaxConcurrentRequestsCallback callback = new MaxConcurrentRequestsCallback() {
     34                        @Override
     35                        public int getMaxConcurrentRequest(URI baseURI) {
     36                                return 2;
     37                        }
     38                };
    2939                ThrottledClient sruClient = new ThrottledClient(
    30                                 new ClarinFCSClientBuilder()
    31                                 .addDefaultDataViewParsers()
    32                                 .buildThreadedClient(), 2);
     40                                sruThreadedClient, callback,
     41                                sruThreadedClient, callback
     42                );
    3343
    3444                try {
Note: See TracChangeset for help on using the changeset viewer.