Author: gttersen
Date: 2007-03-01 14:42:36 +0100 (Thu, 01 Mar 2007)
New Revision: 4529
Added:
trunk/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/NewsAggregatorSearchCommand.java
trunk/core-api/src/main/java/no/schibstedsok/searchportal/mode/config/NewsAggregatorSearchConfiguration.java
trunk/core-api/src/main/java/no/schibstedsok/searchportal/result/NewsAggregatorSearchResult.java
trunk/query-transform-spi/src/main/java/no/schibstedsok/searchportal/query/transform/NewsCaseQueryTransformer.java
Modified:
trunk/core-api/src/main/java/no/schibstedsok/searchportal/mode/SearchModeFactory.java
trunk/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/AbstractSearchCommand.java
Log:
New skin: nyheter.sesam.no
Modified:
trunk/core-api/src/main/java/no/schibstedsok/searchportal/mode/SearchModeFactory.java
===================================================================
---
trunk/core-api/src/main/java/no/schibstedsok/searchportal/mode/SearchModeFactory.java
2007-03-01 10:36:12 UTC (rev 4528)
+++
trunk/core-api/src/main/java/no/schibstedsok/searchportal/mode/SearchModeFactory.java
2007-03-01 13:42:36 UTC (rev 4529)
@@ -1,24 +1,6 @@
// Copyright (2006) Schibsted Søk AS
package no.schibstedsok.searchportal.mode;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
import no.schibstedsok.commons.ioc.BaseContext;
import no.schibstedsok.commons.ioc.ContextWrapper;
import no.schibstedsok.searchportal.InfrastructureException;
@@ -38,6 +20,7 @@
import
no.schibstedsok.searchportal.mode.config.MathExpressionSearchConfiguration;
import no.schibstedsok.searchportal.mode.config.MobileSearchConfiguration;
import
no.schibstedsok.searchportal.mode.config.NavigatableESPFastConfiguration;
+import
no.schibstedsok.searchportal.mode.config.NewsAggregatorSearchConfiguration;
import no.schibstedsok.searchportal.mode.config.NewsSearchConfiguration;
import no.schibstedsok.searchportal.mode.config.OverturePPCSearchConfiguration;
import no.schibstedsok.searchportal.mode.config.PicSearchConfiguration;
@@ -96,18 +79,33 @@
import no.schibstedsok.searchportal.site.SiteKeyedFactory;
import no.schibstedsok.searchportal.site.config.AbstractDocumentFactory;
import no.schibstedsok.searchportal.site.config.DocumentLoader;
-import no.schibstedsok.searchportal.site.config.PropertiesLoader;
import no.schibstedsok.searchportal.site.config.ResourceContext;
import no.schibstedsok.searchportal.site.config.UrlResourceLoader;
import no.schibstedsok.searchportal.view.output.TextOutputResultHandler;
import no.schibstedsok.searchportal.view.output.VelocityResultHandler;
import no.schibstedsok.searchportal.view.output.XmlOutputResultHandler;
-
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
/**
* @author <a href="mailto:[EMAIL PROTECTED]>mick</a>
* @version <tt>$Id$</tt>
@@ -379,7 +377,8 @@
VEHICLE_COMMAND(VehicleSearchConfiguration.class),
CATALOGUE_COMMAND(CatalogueSearchConfiguration.class),
CATALOGUE_ADS_COMMAND(CatalogueAdsSearchConfiguration.class),
- HITTAMAP_COMMAND(HittaMapSearchConfiguration.class);
+ HITTAMAP_COMMAND(HittaMapSearchConfiguration.class),
+ NEWS_AGGREGATOR_COMMAND(NewsAggregatorSearchConfiguration.class);
private final Class<? extends SearchConfiguration> clazz;
private final String xmlName;
@@ -764,6 +763,11 @@
final CatalogueAdsSearchConfiguration casc =
(CatalogueAdsSearchConfiguration) sc;
fillBeanProperty(casc, inherit, "queryParameterWhere",
ParseType.String , commandE, "");
}
+ if(sc instanceof NewsAggregatorSearchConfiguration) {
+ final NewsAggregatorSearchConfiguration nasc =
(NewsAggregatorSearchConfiguration) sc;
+ fillBeanProperty(nasc, inherit, "xmlSource",
ParseType.String, commandE, "");
+ fillBeanProperty(nasc, inherit, "updateIntervalMinutes",
ParseType.Int, commandE, "2");
+ }
Modified:
trunk/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/AbstractSearchCommand.java
===================================================================
---
trunk/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/AbstractSearchCommand.java
2007-03-01 10:36:12 UTC (rev 4528)
+++
trunk/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/AbstractSearchCommand.java
2007-03-01 13:42:36 UTC (rev 4529)
@@ -351,6 +351,7 @@
executeQuery |= null != parameters.get("c") &&
parameters.get("c").equals("wt");
executeQuery |= null != parameters.get("c") &&
parameters.get("c").equals("n");
executeQuery |= null != parameters.get("c") &&
parameters.get("c").equals("t");
+ executeQuery |= null != parameters.get("c") &&
parameters.get("c").equals("na");
executeQuery |= null != filter && filter.length() > 0;
LOG.info("executeQuery==" + executeQuery
+ " ; queryToUse:" + queryToUse
Added:
trunk/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/NewsAggregatorSearchCommand.java
===================================================================
---
trunk/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/NewsAggregatorSearchCommand.java
(rev 0)
+++
trunk/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/NewsAggregatorSearchCommand.java
2007-03-01 13:42:36 UTC (rev 4529)
@@ -0,0 +1,145 @@
+package no.schibstedsok.searchportal.mode.command;
+
+import no.schibstedsok.searchportal.datamodel.DataModel;
+import
no.schibstedsok.searchportal.mode.config.NewsAggregatorSearchConfiguration;
+import no.schibstedsok.searchportal.result.BasicSearchResult;
+import no.schibstedsok.searchportal.result.SearchResult;
+import no.schibstedsok.searchportal.result.SearchResultItem;
+import no.schibstedsok.searchportal.result.BasicSearchResultItem;
+import no.schibstedsok.searchportal.result.NewsAggregatorSearchResult;
+import org.apache.log4j.Logger;
+import org.jdom.JDOMException;
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.input.SAXBuilder;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.net.URL;
+import java.net.URLConnection;
+
[EMAIL PROTECTED]({"unchecked"})
+public class NewsAggregatorSearchCommand extends AbstractSearchCommand {
+
+ private final static Logger log =
Logger.getLogger(NewsAggregatorSearchCommand.class);
+
+ /**
+ * @param cxt The context to execute in.
+ * @param dataModel The dataModel to use.
+ */
+ public NewsAggregatorSearchCommand(Context cxt, DataModel dataModel) {
+ super(cxt, dataModel);
+ }
+
+ public SearchResult execute() {
+ log.debug("News aggregator search executed with: " + getParameters());
+ log.debug("News aggregator search executed with: " +
datamodel.getParameters());
+
+ NewsAggregatorSearchConfiguration config =
(NewsAggregatorSearchConfiguration) getSearchConfiguration();
+ log.debug("Loading xml file at: " + config.getXmlSource());
+ log.debug("Update interval: " + config.getUpdateIntervalMinutes());
+
+ return getFrontPageResult(config);
+ }
+
+ private SearchResult getFrontPageResult(NewsAggregatorSearchConfiguration
config) {
+ try {
+ NewsAggregatorXmlParser newsAggregatorXmlParser = new
NewsAggregatorXmlParser();
+
+ URL url = new URL(config.getXmlSource());
+ URLConnection urlConnection = url.openConnection();
+ urlConnection.setConnectTimeout(1000);
+ return
newsAggregatorXmlParser.parse(urlConnection.getInputStream(), this);
+ } catch (JDOMException e) {
+ log.error("Could not parse xml: " + config.getXmlSource(), e);
+ } catch (IOException e) {
+ log.error("Could not parse xml: " + config.getXmlSource(), e);
+ }
+ return new BasicSearchResult(null);
+ }
+
+
+ public static class NewsAggregatorXmlParser {
+ private static final String ELEMENT_CLUSTER = "cluster";
+ private static final String ELEMENT_ENTRY_COLLECTION =
"entryCollection";
+ private static final String ATTRIBUTE_FULL_COUNT = "fullcount";
+ private static final String ATTRIBUTE_CLUSTERID = "id";
+ private static final String ELEMENT_RELATED = "related";
+ private static final String ATTRIBUTE_CATEGORY_TYPE = "type";
+ private static final String ELEMENT_CATEGORY = "category";
+ private static final String ATTRIBUTE_CATEGORY_ID = "id";
+
+ public SearchResult parse(InputStream inputStream, SearchCommand
searchCommand) throws JDOMException, IOException {
+ try {
+ final NewsAggregatorSearchResult searchResult = new
NewsAggregatorSearchResult(searchCommand);
+
+ final SAXBuilder saxBuilder = new SAXBuilder();
+ saxBuilder.setValidation(false);
+ saxBuilder.setIgnoringElementContentWhitespace(true);
+
+ final Document doc = saxBuilder.build(inputStream);
+ final Element root = doc.getRootElement();
+
+ handleClusters(root.getChildren(ELEMENT_CLUSTER),
searchResult, searchCommand);
+ handleRelated(root.getChild(ELEMENT_RELATED), searchResult);
+ return searchResult;
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch(Exception e) {
+ // Ignoring
+ }
+ }
+ }
+ }
+
+ private void handleRelated(Element relatedElement,
NewsAggregatorSearchResult searchResult) {
+ final List<Element> categoryElements =
relatedElement.getChildren(ELEMENT_CATEGORY);
+ for (Element categoryElement : categoryElements) {
+ final String categoryType =
categoryElement.getAttributeValue(ATTRIBUTE_CATEGORY_TYPE);
+ final SearchResultItem searchResultItem = new
BasicSearchResultItem();
+ searchResultItem.addField("name",
categoryElement.getTextTrim());
+ searchResult.addRelatedResultItem(categoryType,
searchResultItem);
+ }
+ }
+
+ private void handleClusters(List<Element> clusters, SearchResult
searchResult, SearchCommand searchCommand) {
+ for (Element cluster : clusters) {
+ final SearchResultItem searchResultItem = new
BasicSearchResultItem();
+ searchResultItem.addField("size",
cluster.getAttributeValue(ATTRIBUTE_FULL_COUNT));
+ searchResultItem.addField("clusterId",
cluster.getAttributeValue(ATTRIBUTE_CLUSTERID));
+
+ final Element entryCollectionElement =
cluster.getChild(ELEMENT_ENTRY_COLLECTION);
+ final List<Element> entryList =
entryCollectionElement.getChildren();
+ final BasicSearchResult nestedSearchResult = new
BasicSearchResult(searchCommand);
+ for (int i = 0; i < entryList.size(); i++) {
+ Element nestedEntry = entryList.get(i);
+ if (i == 0) {
+ // First element is main result
+ handleEntry(nestedEntry, searchResultItem);
+ } else {
+ SearchResultItem nestedResultItem = new
BasicSearchResultItem();
+ handleEntry(nestedEntry, nestedResultItem);
+ nestedSearchResult.addResult(nestedResultItem);
+ }
+ }
+ searchResultItem.addNestedSearchResult("entries",
nestedSearchResult);
+ searchResult.addResult(searchResultItem);
+ }
+ }
+
+ private void handleEntry(Element entryElement, SearchResultItem
searchResultItem) {
+ final List<Element> entrySubElements = entryElement.getChildren();
+ for (Element entrySubElement : entrySubElements) {
+ if (entrySubElement.getText() != null &&
entrySubElement.getTextTrim().length() > 0) {
+ searchResultItem.addField(entrySubElement.getName(),
entrySubElement.getTextTrim());
+ }
+ }
+ }
+
+
+ }
+
+}
Added:
trunk/core-api/src/main/java/no/schibstedsok/searchportal/mode/config/NewsAggregatorSearchConfiguration.java
===================================================================
---
trunk/core-api/src/main/java/no/schibstedsok/searchportal/mode/config/NewsAggregatorSearchConfiguration.java
(rev 0)
+++
trunk/core-api/src/main/java/no/schibstedsok/searchportal/mode/config/NewsAggregatorSearchConfiguration.java
2007-03-01 13:42:36 UTC (rev 4529)
@@ -0,0 +1,42 @@
+package no.schibstedsok.searchportal.mode.config;
+
+import org.apache.log4j.Logger;
+import no.schibstedsok.searchportal.result.SearchResult;
+
+public class NewsAggregatorSearchConfiguration extends
AbstractSearchConfiguration {
+ private long MINUTE_IN_MILLIS = 1000 * 60;
+ private final static Logger log =
Logger.getLogger(NewsAggregatorSearchConfiguration.class);
+
+ private String xmlSource;
+ private int updateIntervalMinutes;
+
+ public NewsAggregatorSearchConfiguration() {
+ super(null);
+ }
+
+ public NewsAggregatorSearchConfiguration(SearchConfiguration sc) {
+ super(sc);
+ if (sc instanceof NewsAggregatorSearchConfiguration) {
+ final NewsAggregatorSearchConfiguration nasc =
(NewsAggregatorSearchConfiguration) sc;
+ nasc.setXmlSource(nasc.getXmlSource());
+ nasc.setUpdateIntervalMinutes(nasc.getUpdateIntervalMinutes());
+ }
+ }
+
+ public String getXmlSource() {
+ return xmlSource;
+ }
+
+ public void setXmlSource(String xmlSource) {
+ this.xmlSource = xmlSource;
+ }
+
+ public int getUpdateIntervalMinutes() {
+ return updateIntervalMinutes;
+ }
+
+ public void setUpdateIntervalMinutes(int updateIntervalMinutes) {
+ this.updateIntervalMinutes = updateIntervalMinutes;
+ }
+
+}
Added:
trunk/core-api/src/main/java/no/schibstedsok/searchportal/result/NewsAggregatorSearchResult.java
===================================================================
---
trunk/core-api/src/main/java/no/schibstedsok/searchportal/result/NewsAggregatorSearchResult.java
(rev 0)
+++
trunk/core-api/src/main/java/no/schibstedsok/searchportal/result/NewsAggregatorSearchResult.java
2007-03-01 13:42:36 UTC (rev 4529)
@@ -0,0 +1,34 @@
+package no.schibstedsok.searchportal.result;
+
+import no.schibstedsok.searchportal.mode.command.SearchCommand;
+
+import java.util.Map;
+import java.util.HashMap;
+
+public class NewsAggregatorSearchResult extends BasicSearchResult {
+ private Map<String, SearchResult> relatedResults = new HashMap<String,
SearchResult>();
+
+ public NewsAggregatorSearchResult(SearchCommand command) {
+ super(command);
+ }
+
+ public void addRelatedResultItem(String name, SearchResultItem
searchResultItem) {
+ SearchResult searchResult = relatedResults.get(name);
+ if (searchResult == null) {
+ searchResult = new BasicSearchResult(getSearchCommand());
+ relatedResults.put(name, searchResult);
+ }
+ searchResult.addResult(searchResultItem);
+ }
+
+ public SearchResult getRelatedResult(String name) {
+ return relatedResults.get(name);
+ }
+
+ public String toString() {
+ return "NewsAggregatorSearchResult{" +
+ "super=" + super.toString() +
+ ", relatedResults=" + relatedResults +
+ '}';
+ }
+}
Added:
trunk/query-transform-spi/src/main/java/no/schibstedsok/searchportal/query/transform/NewsCaseQueryTransformer.java
===================================================================
---
trunk/query-transform-spi/src/main/java/no/schibstedsok/searchportal/query/transform/NewsCaseQueryTransformer.java
(rev 0)
+++
trunk/query-transform-spi/src/main/java/no/schibstedsok/searchportal/query/transform/NewsCaseQueryTransformer.java
2007-03-01 13:42:36 UTC (rev 4529)
@@ -0,0 +1,60 @@
+package no.schibstedsok.searchportal.query.transform;
+
+import org.w3c.dom.Element;
+import org.apache.log4j.Logger;
+import no.schibstedsok.searchportal.query.LeafClause;
+import no.schibstedsok.searchportal.query.Clause;
+
+import java.util.Map;
+
+public class NewsCaseQueryTransformer extends AbstractQueryTransformer {
+ private final static Logger log =
Logger.getLogger(NewsCaseQueryTransformer.class);
+ private static final String QUERY_TYPE = "query-type";
+ private String queryType;
+ private NewsQueryTransformerDataAccess dataAccess = new
NewsQueryTransformerDataAccess();
+
+ public void visitImpl(final LeafClause clause) {
+ final String term = getTransformedTerms().get(clause);
+
+ String transformedQuery = dataAccess.getQuery(term, queryType);
+ if (transformedQuery != null) {
+ log.debug("Transforming query: '" + term + "' to '" +
transformedQuery);
+ getTransformedTerms().put(clause, transformedQuery);
+ } else {
+ log.debug("No transformation done.");
+ }
+ }
+
+ private Map<Clause,String> getTransformedTerms() {
+ return getContext().getTransformedTerms();
+ }
+
+
+ @Override
+ public QueryTransformer readQueryTransformer(final Element element) {
+ queryType = element.getAttribute(QUERY_TYPE);
+ return this;
+ }
+
+
+ @Override
+ public Object clone() throws CloneNotSupportedException {
+ NewsCaseQueryTransformer ncqt = (NewsCaseQueryTransformer)
super.clone();
+ ncqt.queryType = queryType;
+ ncqt.dataAccess = dataAccess;
+ return ncqt;
+ }
+
+ public static class NewsQueryTransformerDataAccess {
+ public String getQuery(String newsCaseName, String queryType) {
+ if (newsCaseName.equals("Nokas-saken")) {
+ if (queryType.equals("news")) {
+ return "Nokas-ranet; Arne Sigve Klungland drept";
+ } else if (queryType.equals("picture")) {
+ return "Nokas";
+ }
+ }
+ return null;
+ }
+ }
+}
_______________________________________________
Kernel-commits mailing list
[email protected]
http://sesat.no/mailman/listinfo/kernel-commits