Index: src/main/java/sgf/gateway/search/provider/solr/query/PassFreeTextQueryStrategy.java =================================================================== --- src/main/java/sgf/gateway/search/provider/solr/query/PassFreeTextQueryStrategy.java (revision 0) +++ src/main/java/sgf/gateway/search/provider/solr/query/PassFreeTextQueryStrategy.java (working copy) @@ -0,0 +1,11 @@ +package sgf.gateway.search.provider.solr.query; + +/** + * Created by jcunning on 5/1/14. + */ +public class PassFreeTextQueryStrategy implements FreeTextQueryStrategy { + @Override + public String getFreeTextQuery(String string) { + return string; + } +} Index: src/main/java/sgf/gateway/web/controllers/metrics/LinkMetricsController.java =================================================================== --- src/main/java/sgf/gateway/web/controllers/metrics/LinkMetricsController.java (revision 0) +++ src/main/java/sgf/gateway/web/controllers/metrics/LinkMetricsController.java (working copy) @@ -0,0 +1,27 @@ +package sgf.gateway.web.controllers.metrics; + + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.view.RedirectView; + + +@Controller +public class LinkMetricsController { + + // Redirect so request goes thru Clickstream to collect metrics + @RequestMapping(value = "/redirect.html", method=RequestMethod.GET) + public ModelAndView redirect (@RequestParam(value="link", required=true) String link) { + + ModelAndView result = null; + + RedirectView redirectView = new RedirectView(link); + result = new ModelAndView(redirectView); + + return result; + } + +} Index: src/main/java/sgf/gateway/web/controllers/metrics/OffsiteLinkMetricsController.java =================================================================== --- src/main/java/sgf/gateway/web/controllers/metrics/OffsiteLinkMetricsController.java (revision 18675) +++ src/main/java/sgf/gateway/web/controllers/metrics/OffsiteLinkMetricsController.java (working copy) @@ -1,27 +0,0 @@ -package sgf.gateway.web.controllers.metrics; - - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.servlet.view.RedirectView; - - -@Controller -public class OffsiteLinkMetricsController { - - // Redirect so request goes thru Clickstream to collect metrics - @RequestMapping(value = "/redirect.html", method=RequestMethod.GET) - public ModelAndView redirect (@RequestParam(value="link", required=true) String link) { - - ModelAndView result = null; - - RedirectView redirectView = new RedirectView(link); - result = new ModelAndView(redirectView); - - return result; - } - -} Index: src/main/java/sgf/gateway/web/controllers/search/AnalyticalSearchCommand.java =================================================================== --- src/main/java/sgf/gateway/web/controllers/search/AnalyticalSearchCommand.java (revision 0) +++ src/main/java/sgf/gateway/web/controllers/search/AnalyticalSearchCommand.java (working copy) @@ -0,0 +1,23 @@ +package sgf.gateway.web.controllers.search; + +import org.hibernate.validator.constraints.NotBlank; +import org.springframework.util.StringUtils; + +public class AnalyticalSearchCommand { + + @NotBlank(message="A query is required.") + String queryText; + + public void setQueryText(String queryText) { + + if (StringUtils.hasText(queryText)) { + this.queryText = queryText.trim(); + } + + this.queryText = queryText; + } + + public String getQueryText() { + return queryText; + } +} Index: src/main/java/sgf/gateway/web/controllers/search/AnalyticalSearchController.java =================================================================== --- src/main/java/sgf/gateway/web/controllers/search/AnalyticalSearchController.java (revision 0) +++ src/main/java/sgf/gateway/web/controllers/search/AnalyticalSearchController.java (working copy) @@ -0,0 +1,76 @@ +package sgf.gateway.web.controllers.search; + +import java.util.HashMap; +import java.util.Map; + +import javax.validation.Valid; + +import org.apache.solr.client.solrj.SolrServerException; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + +import sgf.gateway.search.api.Criteria; +import sgf.gateway.search.api.SearchQuery; +import sgf.gateway.search.api.SearchResult; +import sgf.gateway.search.core.CriteriaImpl; +import sgf.gateway.search.core.SortTargetsImpl; + +@Controller +public class AnalyticalSearchController { + + private final SearchQuery searchQuery; + + public AnalyticalSearchController(SearchQuery searchQuery) { + this.searchQuery = searchQuery; + } + + @RequestMapping(value = "/root/search/analytic.html", method = RequestMethod.GET) + public ModelAndView search() throws SolrServerException { + + ModelAndView modelAndView = new ModelAndView("/search/search-analytical"); + + return modelAndView; + } + + @RequestMapping(value = "/root/search/analytic.html", method = RequestMethod.POST) + public ModelAndView submit(@ModelAttribute("analyticalSearchForm") @Valid AnalyticalSearchCommand searchCommand, BindingResult result) throws SolrServerException { + + ModelAndView modelAndView = new ModelAndView("/search/search-analytical"); + + if (!result.hasErrors()) { + SearchResult searchResult = this.executeSearchQuery(searchCommand); + modelAndView.addObject("searchResult", searchResult); + } + + return modelAndView; + } + + @ModelAttribute("analyticalSearchForm") + public AnalyticalSearchCommand setupAnalyticalSearchCommand() { + return new AnalyticalSearchCommand(); + } + + private SearchResult executeSearchQuery(AnalyticalSearchCommand searchCommand) { + + Criteria criteria = this.createSearchCriteria(searchCommand); + SearchResult searchResult = this.searchQuery.execute(criteria); + + return searchResult; + } + + private Criteria createSearchCriteria(AnalyticalSearchCommand searchCommand) { + + CriteriaImpl criteria = new CriteriaImpl(); + + criteria.setFreeText(searchCommand.getQueryText()); + + Integer bigEnoughToReturnAll = 20000; + criteria.setResultSize(bigEnoughToReturnAll); + + return criteria; + } +} Index: src/main/resources/spring/sgf/gateway/web/controllers/metrics/metrics-controllers.xml =================================================================== --- src/main/resources/spring/sgf/gateway/web/controllers/metrics/metrics-controllers.xml (revision 18675) +++ src/main/resources/spring/sgf/gateway/web/controllers/metrics/metrics-controllers.xml (working copy) @@ -11,6 +11,6 @@ <constructor-arg index="2" ref="gateway" /> </bean> - <bean id="offsiteLinkMetricsController" class="sgf.gateway.web.controllers.metrics.OffsiteLinkMetricsController" /> + <bean id="linkMetricsController" class="sgf.gateway.web.controllers.metrics.LinkMetricsController" /> </beans> Index: src/main/resources/spring/sgf/gateway/web/controllers/search/search.xml =================================================================== --- src/main/resources/spring/sgf/gateway/web/controllers/search/search.xml (revision 18675) +++ src/main/resources/spring/sgf/gateway/web/controllers/search/search.xml (working copy) @@ -11,4 +11,8 @@ <property name="resultsPerPageValues" value="${search.ui.rpp.options}" /> </bean> + <bean id="analyticalSearchController" class="sgf.gateway.web.controllers.search.AnalyticalSearchController" > + <constructor-arg index="0" ref="analyticalSearchQuery" /> + </bean> + </beans> Index: src/main/webapp/WEB-INF/tags/cadis/dataset-summary-tab-content.tag =================================================================== --- src/main/webapp/WEB-INF/tags/cadis/dataset-summary-tab-content.tag (revision 18739) +++ src/main/webapp/WEB-INF/tags/cadis/dataset-summary-tab-content.tag (working copy) @@ -325,6 +325,7 @@ <c:choose> <c:when test="${result.remoteIndexable}"> <c:url var="redirectURL" value="/redirect.html" > + <c:param name="prv" value="mlt" /> <c:param name="link" value="${result.detailsURI}" /> </c:url> <a href="${redirectURL}">${result.title}</a> @@ -332,7 +333,12 @@ <br> </c:when> <c:otherwise> - <a href="<c:url value="/${result.type.toLowerCase()}/${result.shortName}.html" />">${result.title}</a><br> + <c:url var="gatewayURL" value="/${result.type.toLowerCase()}/${result.shortName}.html" /> + <c:url var="redirectURL" value="/redirect.html" > + <c:param name="prv" value="mlt" /> + <c:param name="link" value="${gatewayURL}" /> + </c:url> + <a href="${redirectURL}">${result.title}</a><br> </c:otherwise> </c:choose> </c:forEach> Index: src/main/webapp/WEB-INF/views/html/cadis/root/index.jsp =================================================================== --- src/main/webapp/WEB-INF/views/html/cadis/root/index.jsp (revision 18700) +++ src/main/webapp/WEB-INF/views/html/cadis/root/index.jsp (working copy) @@ -39,6 +39,9 @@ <h5><legend>Search Provider</legend></h5> <ul> <li><a href='<c:url value="/root/search/reindex.htm"/>'>Reindex</a> (Root Admin Only)</li> + <li class="desc">Reindex the SOLR Search Index</li> + <li><a href='<c:url value="/root/search/analytic.html"/>'>Analytical Search</a> (Root Admin Only)</li> + <li class="desc">Access the Analytical Search page</li> </ul> <h5><legend>Gateway Scheduled Tasks</legend></h5> Index: src/main/webapp/WEB-INF/views/html/root/index.jsp =================================================================== --- src/main/webapp/WEB-INF/views/html/root/index.jsp (revision 18700) +++ src/main/webapp/WEB-INF/views/html/root/index.jsp (working copy) @@ -39,6 +39,11 @@ <li><a href='<c:url value="/root/search/reindex.htm"/>'>Reindex</a> (Root Admin Only)</li> </ul> + <h5><legend>Analytical Search</legend></h5> + <ul> + <li><a href="<c:url value="/root/search/analytic.html"/>" >Analytical Search</a> (Root Admin Only)</li> + </ul> + <h5><legend>Publishing</legend></h5> <ul> <li><a href="<c:url value="/publish/publishThreddsCatalog.htm"/>" >Publish THREDDS Catalog</a> (Root Admin Only)</li> Index: src/main/webapp/WEB-INF/views/html/search/search-analytical.jsp =================================================================== --- src/main/webapp/WEB-INF/views/html/search/search-analytical.jsp (revision 0) +++ src/main/webapp/WEB-INF/views/html/search/search-analytical.jsp (working copy) @@ -0,0 +1,59 @@ +<%@ include file="/WEB-INF/views/html/common/include.jsp" %> + +<tiles:insertDefinition name="search-layout"> + +<tiles:putAttribute type="string" name="title" value="Analytical Search" /> +<tiles:putAttribute type="string" name="pageTitle" value="Analytical Search" /> + +<tiles:putAttribute name="body"> + +<common:form-errors commandName="analyticalSearchForm" /> + +<div class="form"> + +<springForm:form method="post" commandName="analyticalSearchForm" > + + <springForm:input cssClass="textfield" path="queryText" size="100"/> + <input class="button" type="submit" value="Search" id="searchButton"/> + +</springForm:form> + +</div> + +<c:if test="${searchResult != null}"> +<c:choose> + <c:when test="${searchResult.resultCount > 0}"> + Result count: ${searchResult.resultCount}<br><br> + <c:forEach var="result" items="${searchResult.results}"> + <b>${result.title}</b><br> + ${result.type} + <c:choose> + <c:when test="${result.remoteIndexable}"> + <c:url var="redirectURL" value="/redirect.html" > + <c:param name="prv" value="mlt" /> + <c:param name="link" value="${result.detailsURI}" /> + </c:url> + <a href="${redirectURL}">${result.title}</a> + <a href="${redirectURL}"><img src="<c:url value="/images/icons/external-link-icon.svg" />" ></a> + </c:when> + <c:otherwise> + <c:url var="gatewayURL" value="/${result.type.toLowerCase()}/${result.shortName}.html" /> + <c:url var="redirectURL" value="/redirect.html" > + <c:param name="prv" value="mlt" /> + <c:param name="link" value="${gatewayURL}" /> + </c:url> + <a href="${redirectURL}">${result.title}</a> + </c:otherwise> + </c:choose> + <br><br> + </c:forEach> + </c:when> + <c:otherwise> + No results found! + </c:otherwise> +</c:choose> +</c:if> + +</tiles:putAttribute> + +</tiles:insertDefinition>