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

Reply via email to