Author: gttersen
Date: 2007-03-13 20:32:34 +0100 (Tue, 13 Mar 2007)
New Revision: 4569

Modified:
   
trunk/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/NewsAggregatorSearchCommand.java
Log:
New skin: nyheter.sesam.no

Modified: 
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
     2007-03-13 18:54:30 UTC (rev 4568)
+++ 
trunk/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/NewsAggregatorSearchCommand.java
     2007-03-13 19:32:34 UTC (rev 4569)
@@ -16,10 +16,11 @@
 import org.jdom.input.SAXBuilder;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.BufferedInputStream;
 import java.util.List;
 import java.util.HashMap;
 import java.net.URL;
-import no.schibstedsok.searchportal.http.HTTPClient;
+import java.net.URLConnection;
 
 
 public class NewsAggregatorSearchCommand extends AbstractSearchCommand {
@@ -35,41 +36,62 @@
     }
 
     public SearchResult execute() {
-        LOG.debug("News aggregator search executed with: " + getParameters());
-        LOG.debug("News aggregator search executed with: " + 
datamodel.getParameters());
+        try {
+            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());
+            NewsAggregatorSearchConfiguration config = 
(NewsAggregatorSearchConfiguration) getSearchConfiguration();
+            LOG.debug("Loading xml file at: " + config.getXmlSource());
+            LOG.debug("Update interval: " + config.getUpdateIntervalMinutes());
 
-        StringDataObject geoNav = datamodel.getParameters().getValue("geonav");
-        if (geoNav == null) {
-            return getFrontPageResult(config);
-        } else {
-            return getPageResult(config, geoNav.getString());
+            StringDataObject geoNav = 
datamodel.getParameters().getValue("geonav");
+            StringDataObject clusterId = 
datamodel.getParameters().getValue("clusterId");
+
+            String xmlFile = geoNav == null ? config.getXmlMainFile() : 
geoNav.getString();
+
+            if (clusterId == null) {
+                return getPageResult(config, xmlFile);
+            } else {
+                return getClusterResult(config, clusterId, xmlFile);
+            }
+        } catch (JDOMException e) {
+            // todo: Handle error in a defined way
+            BasicSearchResult errorResult = new BasicSearchResult(this);
+            BasicSearchResultItem resultItem = new BasicSearchResultItem();
+            resultItem.addField("error", "Cold not parse clusters");
+            errorResult.addResult(resultItem);
+            return errorResult;
+        } catch (IOException e) {
+            // todo: Handle error in a defined way
+            BasicSearchResult errorResult = new BasicSearchResult(this);
+            BasicSearchResultItem resultItem = new BasicSearchResultItem();
+            resultItem.addField("error", "Cold not find clusters");
+            errorResult.addResult(resultItem);
+            return errorResult;
         }
     }
 
+    private SearchResult getClusterResult(NewsAggregatorSearchConfiguration 
config, StringDataObject clusterId, String xmlFile) throws IOException, 
JDOMException {
+        NewsAggregatorXmlParser newsAggregatorXmlParser = new 
NewsAggregatorXmlParser();
+        return newsAggregatorXmlParser.parseCluster(getInputStream(config, 
xmlFile), clusterId.getString(), this);
+    }
 
-    private SearchResult getFrontPageResult(NewsAggregatorSearchConfiguration 
config) {
-        return getPageResult(config, config.getXmlMainFile());
+    private SearchResult getPageResult(NewsAggregatorSearchConfiguration 
config, String xmlFile) throws JDOMException, IOException {
+        NewsAggregatorXmlParser newsAggregatorXmlParser = new 
NewsAggregatorXmlParser();
+        return newsAggregatorXmlParser.parseFullPage(getInputStream(config, 
xmlFile), this);
     }
-    private SearchResult getPageResult(NewsAggregatorSearchConfiguration 
config, String xmlFile) {
-        try {
-            final NewsAggregatorXmlParser newsAggregatorXmlParser = new 
NewsAggregatorXmlParser();
 
-            final URL url = new URL(config.getXmlSource() + xmlFile);
-            
-            final HTTPClient client = HTTPClient.instance(url.getHost(), 
url.getHost(), url.getPort());
-            
-            return 
newsAggregatorXmlParser.parse(client.getBufferedStream(url.getHost(), 
url.getPath()), 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);
+    private InputStream getInputStream(NewsAggregatorSearchConfiguration 
config, String xmlFile) throws IOException {
+        final URL url = new URL(config.getXmlSource() + xmlFile);
+// ---------
+//        Can not use HTTPClient in this case since it ignores protocol of the 
url.
+//  --------
+//        final HTTPClient client = HTTPClient.instance(url.getHost(), 
url.getHost(), url.getPort());
+//        return client.getBufferedStream(url.getHost(), url.getPath());
+        final URLConnection urlConnection = url.openConnection();
+        urlConnection.setConnectTimeout(1000);
+        urlConnection.setReadTimeout(1000);
+        return new BufferedInputStream(urlConnection.getInputStream());
     }
 
     @SuppressWarnings({"unchecked"})
@@ -86,18 +108,46 @@
         private static final String ATTRIBUTE_NAME = "name";
         private static final String ATTRIBUTE_XML = "xml";
 
-        public SearchResult parse(InputStream inputStream, SearchCommand 
searchCommand) throws JDOMException, IOException {
+        private Document getDocument(InputStream inputStream) throws 
JDOMException, IOException {
+            final SAXBuilder saxBuilder = new SAXBuilder();
+            saxBuilder.setValidation(false);
+            saxBuilder.setIgnoringElementContentWhitespace(true);
+
+            return saxBuilder.build(inputStream);
+        }
+
+        public SearchResult parseCluster(InputStream inputStream, String 
clusterId, NewsAggregatorSearchCommand searchCommand) throws JDOMException, 
IOException {
             try {
                 final NewsAggregatorSearchResult searchResult = new 
NewsAggregatorSearchResult(searchCommand);
+                final Document doc = getDocument(inputStream);
+                final Element root = doc.getRootElement();
+                List<Element> clusters = root.getChildren(ELEMENT_CLUSTER);
+                for (Element cluster : clusters) {
+                    if 
(cluster.getAttributeValue(ATTRIBUTE_CLUSTERID).equals(clusterId)) {
+                        handleCluster(cluster, searchCommand, true, 
searchResult);
+                        handleRelated(cluster.getChild(ELEMENT_RELATED), 
searchResult);
+                    }
+                }
+                handleGeoNav(root.getChild(ELEMENT_GEONAVIGATION), 
searchResult);
+                return searchResult;
+            } finally {
+                if (inputStream != null) {
+                    try {
+                        inputStream.close();
+                    } catch(Exception e) {
+                        // Ignoring
+                    }
+                }
+            }
+        }
 
-                final SAXBuilder saxBuilder = new SAXBuilder();
-                saxBuilder.setValidation(false);
-                saxBuilder.setIgnoringElementContentWhitespace(true);
-
-                final Document doc = saxBuilder.build(inputStream);
+        public SearchResult parseFullPage(InputStream inputStream, 
SearchCommand searchCommand) throws JDOMException, IOException {
+            try {
+                final NewsAggregatorSearchResult searchResult = new 
NewsAggregatorSearchResult(searchCommand);
+                final Document doc = getDocument(inputStream);
                 final Element root = doc.getRootElement();
 
-                handleClusters(root.getChildren(ELEMENT_CLUSTER), 
searchResult, searchCommand);
+                handleClusters(root.getChildren(ELEMENT_CLUSTER), 
searchResult, searchCommand, false);
                 handleRelated(root.getChild(ELEMENT_RELATED), searchResult);
                 handleGeoNav(root.getChild(ELEMENT_GEONAVIGATION), 
searchResult);
                 return searchResult;
@@ -131,47 +181,61 @@
                 final SearchResultItem searchResultItem = new 
BasicSearchResultItem();
                 searchResultItem.addField(ATTRIBUTE_NAME, 
categoryElement.getTextTrim());
                 searchResult.addRelatedResultItem(categoryType, 
searchResultItem);
-            }            
+            }
         }
 
-        private void handleClusters(List<Element> clusters, SearchResult 
searchResult, SearchCommand searchCommand) {
+        private void handleClusters(List<Element> clusters, SearchResult 
searchResult, SearchCommand searchCommand, boolean collapseDuplicates) {
             for (Element cluster : clusters) {
-                final SearchResultItem searchResultItem = new 
BasicSearchResultItem();
-                searchResultItem.addField("size", 
cluster.getAttributeValue(ATTRIBUTE_FULL_COUNT));
-                searchResultItem.addField("clusterId", 
cluster.getAttributeValue(ATTRIBUTE_CLUSTERID));
+                handleCluster(cluster, searchCommand, collapseDuplicates, 
searchResult);
+            }
+        }
 
-                final Element entryCollectionElement = 
cluster.getChild(ELEMENT_ENTRY_COLLECTION);
+        private void handleCluster(Element cluster, SearchCommand 
searchCommand, boolean collapseDuplicates, SearchResult searchResult) {
+            final SearchResultItem searchResultItem = new 
BasicSearchResultItem();
+            searchResultItem.addField("size", 
cluster.getAttributeValue(ATTRIBUTE_FULL_COUNT));
+            searchResultItem.addField("clusterId", 
cluster.getAttributeValue(ATTRIBUTE_CLUSTERID));
 
-                final HashMap<String, SearchResultItem> collapseMap = new 
HashMap<String, SearchResultItem>();
-                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);
-                        addResult(nestedResultItem, collapseMap, 
nestedSearchResult, searchCommand);
-                    }
+            final Element entryCollectionElement = 
cluster.getChild(ELEMENT_ENTRY_COLLECTION);
+            final List<Element> entryList = 
entryCollectionElement.getChildren();
+            final BasicSearchResult nestedSearchResult = new 
BasicSearchResult(searchCommand);
+
+            HashMap<String, SearchResultItem> collapseMap = null;
+            if (collapseDuplicates) {
+                collapseMap = new HashMap<String, SearchResultItem>();
+            }
+            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);
+                    addResult(nestedResultItem, collapseMap, 
nestedSearchResult, searchCommand);
                 }
-                searchResultItem.addNestedSearchResult("entries", 
nestedSearchResult);
-                searchResult.addResult(searchResultItem);
             }
+            searchResultItem.addNestedSearchResult("entries", 
nestedSearchResult);
+            searchResult.addResult(searchResultItem);
         }
 
-        private void addResult(SearchResultItem nestedResultItem, 
HashMap<String, SearchResultItem> collapseMap, SearchResult nestedSearchResult, 
SearchCommand searchCommand) {
+        private void addResult(SearchResultItem nestedResultItem,
+                               HashMap<String, SearchResultItem> collapseMap,
+                               SearchResult nestedSearchResult,
+                               SearchCommand searchCommand) {
             // Check if entry is duplicate and should be a subresult
+            SearchResultItem collapseParent = null;
             String collapseId = nestedResultItem.getField(ELEMENT_COLLAPSEID);
-            SearchResultItem collapseParent = collapseMap.get(collapseId);
+            if (collapseMap != null) {
+                collapseParent = collapseMap.get(collapseId);
+            }
             if (collapseParent == null) {
-                // No duplicate in results
+                // No duplicate in results or should not be collapsed
                 nestedSearchResult.addResult(nestedResultItem);
-                collapseMap.put(collapseId, nestedResultItem);
+                if (collapseMap != null) {
+                    collapseMap.put(collapseId, nestedResultItem);
+                }
             } else {
-                // duplicat item, adding as a subresult to first item.
+                // duplicate item, adding as a subresult to first item.
                 SearchResult collapsedResults = 
collapseParent.getNestedSearchResult("collapsedResults");
                 if (collapsedResults == null) {
                     collapsedResults = new BasicSearchResult(searchCommand);

_______________________________________________
Kernel-commits mailing list
[email protected]
http://sesat.no/mailman/listinfo/kernel-commits

Reply via email to