Author: ssmiweve
Date: 2007-11-11 19:30:40 +0100 (Sun, 11 Nov 2007)
New Revision: 5897

Modified:
   trunk/core-api/src/main/java/no/sesat/search/run/RunningQueryImpl.java
   trunk/data-model-api/src/main/java/no/sesat/search/datamodel/DataModel.java
   
trunk/data-model-api/src/main/java/no/sesat/search/datamodel/navigation/NavigationDataObject.java
   
trunk/data-model-api/src/main/java/no/sesat/search/datamodel/page/PageDataObject.java
   
trunk/view-config-spi/src/main/java/no/sesat/search/view/SearchTabFactory.java
   
trunk/view-config-spi/src/main/java/no/sesat/search/view/config/SearchTab.java
   
trunk/view-control-spi/src/main/java/no/sesat/search/view/navigation/ResultPagingNavigationController.java
   trunk/war/src/main/java/no/sesat/search/http/filters/DataModelFilter.java
   trunk/war/src/main/java/no/sesat/search/view/taglib/SearchTabIncludeTag.java
   trunk/war/src/main/webapp/WEB-INF/jsp/decorators/webDecorator.jsp
Log:
SEARCH-3719 - Se p?\195?\165 muligheter for bruk av ajax
 SearchTab now has an attribute "scope" that is by default REQUEST. This scope 
defaults in the datamodel being largely cleaned out at the end of the request.
 The other scope is SESSION which prevents anything from being cleaned out of 
the datamodel and allows ajax rich client interaction.


Modified: trunk/core-api/src/main/java/no/sesat/search/run/RunningQueryImpl.java
===================================================================
--- trunk/core-api/src/main/java/no/sesat/search/run/RunningQueryImpl.java      
2007-11-09 09:40:50 UTC (rev 5896)
+++ trunk/core-api/src/main/java/no/sesat/search/run/RunningQueryImpl.java      
2007-11-11 18:30:40 UTC (rev 5897)
@@ -88,7 +88,7 @@
             : Integer.MAX_VALUE;
 
     // TODO generic parameter key to be put into ParameterDataObject
-    private static final String PARAM_OUTPUT = "output";
+    public static final String PARAM_LAYOUT = "layout";
     // TODO generic parameter key to be put into ParameterDataObject
     private static final String PARAM_COMMANDS = "commands";
 
@@ -551,7 +551,7 @@
 
     private boolean isRss() {
 
-        final StringDataObject outputParam = 
datamodel.getParameters().getValue(PARAM_OUTPUT);
+        final StringDataObject outputParam = 
datamodel.getParameters().getValue(PARAM_LAYOUT);
         return null != outputParam && "rss".equals(outputParam.getString());
     }
 

Modified: 
trunk/data-model-api/src/main/java/no/sesat/search/datamodel/DataModel.java
===================================================================
--- trunk/data-model-api/src/main/java/no/sesat/search/datamodel/DataModel.java 
2007-11-09 09:40:50 UTC (rev 5896)
+++ trunk/data-model-api/src/main/java/no/sesat/search/datamodel/DataModel.java 
2007-11-11 18:30:40 UTC (rev 5897)
@@ -48,7 +48,7 @@
  *  but there exists *only* getter methods on non-dataNode dataObjects.
  * This allows dataObject, separated from their heirarchical context, to be 
immutable
  *  if the implementation so wishes. (The MapDataObject is an exception to 
this pattern).
- * 
+ *
  * The original design documentation is at
  *   
https://dev.sesat.no/confluence/display/TECHDEV/Search+Portal+DataModel+%28Sesam-3.0%29
  *
@@ -66,13 +66,13 @@
     // ParametersDataObject 
------------------------------------------------------------
 
     /** Get the ParametersDataObject associated to this request.
-     * 
+     *
      * @return the ParametersDataObject updated for this request.
      */
     ParametersDataObject getParameters();
 
     /** Update the ParametersDataObject.
-     * 
+     *
      * @param parameters ParametsDataObject associated to this request.
      */
     @AccessAllow({DATA_MODEL_CONSTRUCTION, REQUEST_CONSTRUCTION})
@@ -81,13 +81,13 @@
     // BrowserDataObject 
------------------------------------------------------------
 
     /** Get the BrowserDataObject associated to this session.
-     * 
+     *
      * @return the BrowserDataObject created at the beginning of the session.
      */
     BrowserDataObject getBrowser();
 
     /** Assign the BrowserDataObject. Can only be called once.
-     * 
+     *
      * @param browser BrowserDataObject holding session-static information.
      */
     @AccessAllow(DATA_MODEL_CONSTRUCTION)
@@ -96,13 +96,13 @@
     // UserDataObject 
------------------------------------------------------------
 
     /** Get the UserDataObject holding the user information.
-     * 
+     *
      * @return the UserDataObject.
      */
     UserDataObject getUser();
 
     /** Assign the UserDataObject when user logs in.
-     * 
+     *
      * @param user UserDataObject holding user information.
      */
     @AccessAllow({DATA_MODEL_CONSTRUCTION, REQUEST_CONSTRUCTION})
@@ -111,14 +111,14 @@
     // SiteDataObject 
------------------------------------------------------------
 
     /** Get the SiteDataObject holding site and skin information.
-     * 
+     *
      * @return the SiteDataObject
      */
     SiteDataObject getSite();
 
-    /** Assign the SiteDataObject. 
+    /** Assign the SiteDataObject.
      * Usually only done once but some browsers don't use separate sessions 
for sub-domains.
-     * 
+     *
      * @param site the SiteDataObject holding site and skin information.
      */
     @AccessAllow({DATA_MODEL_CONSTRUCTION, REQUEST_CONSTRUCTION})
@@ -127,33 +127,33 @@
     // QueryDataObject 
------------------------------------------------------------
 
     /** The QueryDataObject holding all query related information associated 
to this request.
-     * 
+     *
      * @return the QueryDataObject
      */
     QueryDataObject getQuery();
 
     /** Set the QueryDataObject associated to this request.
-     * 
+     *
      * @param query the QueryDataObject holding all query related information
      */
     @AccessAllow({DATA_MODEL_CONSTRUCTION, REQUEST_CONSTRUCTION, 
RUNNING_QUERY_CONSTRUCTION})
     void setQuery(QueryDataObject query);
 
     // SearchDataObject 
------------------------------------------------------------
-    
+
     /** Map containing all the search results. See SearchDataObject.
      * Keys match each search configuration's name.
      * When a search command adds it's finished SearchDataObject, see 
setSearch(..)
      *  it is expected to call notifyAll() on the map.
      * This enables others to use wait() on the map so to get access to the 
results once they are ready.
-     * 
-     * @return 
+     *
+     * @return
      */
     @AccessDisallow({RUNNING_QUERY_CONSTRUCTION, SEARCH_COMMAND_CONSTRUCTION})
     Map<String,SearchDataObject> getSearches();
-    
+
     /** Get the SearchDataObject holding the given search's results
-     * 
+     *
      * @param key the search (commandName) to get SearchDataObject for
      * @return the SearchDataObject
      */
@@ -164,17 +164,17 @@
      * Any call to this method must be followed by the code:
      *  synchronized(getSearches()){ getSearches().notifyAll(); }
      *  to inform any other parties waiting for the results that they are 
ready.
-     * 
-     * @param key 
-     * @param value 
+     *
+     * @param key
+     * @param value
      */
     @AccessAllow({DATA_MODEL_CONSTRUCTION, REQUEST_CONSTRUCTION, 
SEARCH_COMMAND_EXECUTION})
     void setSearch(final String key, final SearchDataObject value);
-    
+
     // NavigationDataObject 
------------------------------------------------------------
-    
+
     /** Get the NavigationDataObject associated to the SearchMode.
-     * 
+     *
      * @return the NavigationDataObject
      */
     NavigationDataObject getNavigation();
@@ -182,13 +182,13 @@
     /** Set the NavigationDataObject.
      * @param value the NavigationDataObject associated to the SearchMode
      */
-    @AccessAllow(RUNNING_QUERY_CONSTRUCTION)
+    @AccessAllow({DATA_MODEL_CONSTRUCTION, RUNNING_QUERY_CONSTRUCTION})
     void setNavigation(final NavigationDataObject value);
-    
+
     // PageDataObject 
------------------------------------------------------------
-    
+
     /** Get the PageDataObject associated to the SearchTab.
-     * 
+     *
      * @return the PageDataObject
      */
     PageDataObject getPage();
@@ -198,7 +198,7 @@
      */
     @AccessAllow({DATA_MODEL_CONSTRUCTION, REQUEST_CONSTRUCTION})
     void setPage(final PageDataObject value);
-    
+
     // JunkYardDataObject 
------------------------------------------------------------
 
     /** @return all the old crap
@@ -207,8 +207,9 @@
     JunkYardDataObject getJunkYard();
 
     /**
-     * 
-     * @param junkYard 
+     *
+     * @param junkYard
+     * @deprecated  Provides access to datamodel elements not yet migrated 
into the DataModel proper.
      */
     @AccessAllow({DATA_MODEL_CONSTRUCTION, REQUEST_CONSTRUCTION})
     void setJunkYard(JunkYardDataObject junkYard);

Modified: 
trunk/data-model-api/src/main/java/no/sesat/search/datamodel/navigation/NavigationDataObject.java
===================================================================
--- 
trunk/data-model-api/src/main/java/no/sesat/search/datamodel/navigation/NavigationDataObject.java
   2007-11-09 09:40:50 UTC (rev 5896)
+++ 
trunk/data-model-api/src/main/java/no/sesat/search/datamodel/navigation/NavigationDataObject.java
   2007-11-11 18:30:40 UTC (rev 5897)
@@ -23,6 +23,8 @@
 package no.sesat.search.datamodel.navigation;
 
 import java.util.Map;
+import no.sesat.search.datamodel.access.AccessAllow;
+import static no.sesat.search.datamodel.access.ControlLevel.*;
 import no.sesat.search.datamodel.generic.DataObject;
 import no.sesat.search.view.navigation.NavigationConfig;
 import no.sesat.search.result.NavigationItem;
@@ -39,7 +41,6 @@
 
     /**
      *
-     * @param key
      * @return
      */
     Map<String,NavigationItem> getNavigations();
@@ -55,7 +56,7 @@
      * @param key
      * @param value
      */
-    //@AccessAllow(ControlLevel.RUNNING_QUERY_RESULT_HANDLING)
+    @AccessAllow({DATA_MODEL_CONSTRUCTION, RUNNING_QUERY_RESULT_HANDLING})
     void setNavigation(String key, NavigationItem value);
 
 //    /**

Modified: 
trunk/data-model-api/src/main/java/no/sesat/search/datamodel/page/PageDataObject.java
===================================================================
--- 
trunk/data-model-api/src/main/java/no/sesat/search/datamodel/page/PageDataObject.java
       2007-11-09 09:40:50 UTC (rev 5896)
+++ 
trunk/data-model-api/src/main/java/no/sesat/search/datamodel/page/PageDataObject.java
       2007-11-11 18:30:40 UTC (rev 5897)
@@ -37,15 +37,14 @@
 @DataObject
 public interface PageDataObject {
 
-    @AccessDisallow({DATA_MODEL_CONSTRUCTION})        
+    @AccessDisallow({DATA_MODEL_CONSTRUCTION})
     SearchTab getCurrentTab();
-    
-    @AccessAllow({DATA_MODEL_CONSTRUCTION, REQUEST_CONSTRUCTION})    
+
+    @AccessAllow({DATA_MODEL_CONSTRUCTION, REQUEST_CONSTRUCTION})
     void setCurrentTab(SearchTab currentTab);
 
     /**
      *
-     * @param key
      * @return
      */
     @AccessDisallow({DATA_MODEL_CONSTRUCTION})
@@ -53,12 +52,12 @@
 
     /**
      *
-     * @param key
+     * @param tabName
      * @return
      */
     @AccessDisallow({DATA_MODEL_CONSTRUCTION})
     SearchTab getTab(String tabName);
-    
+
     @AccessAllow({})
     void setTab(String tabName, SearchTab tab);
 

Modified: 
trunk/view-config-spi/src/main/java/no/sesat/search/view/SearchTabFactory.java
===================================================================
--- 
trunk/view-config-spi/src/main/java/no/sesat/search/view/SearchTabFactory.java  
    2007-11-09 09:40:50 UTC (rev 5896)
+++ 
trunk/view-config-spi/src/main/java/no/sesat/search/view/SearchTabFactory.java  
    2007-11-11 18:30:40 UTC (rev 5897)
@@ -52,7 +52,7 @@
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
-/**
+/** Deserialises views.xml into SearchTab (& its inner classes).
  *
  * @author <a href="mailto:[EMAIL PROTECTED]">Michael Semb Wever</a>
  * @version $Id$
@@ -68,9 +68,9 @@
 
     private static final Map<Site, SearchTabFactory> INSTANCES = new 
HashMap<Site,SearchTabFactory>();
     private static final ReentrantReadWriteLock INSTANCES_LOCK = new 
ReentrantReadWriteLock();
-    
+
     private static final TabFactory TAB_FACTORY = new TabFactory();
-    
+
     /**
      * Name of the configuration file.
      */
@@ -84,20 +84,18 @@
 
     private static final String RESET_NAV_ELEMENT = "reset";
     private static final String NAV_CONFIG_ELEMENT = "config";
-    
+
     // Attributes ----------------------------------------------------
 
     private final Map<String,SearchTab> tabsByName = new 
HashMap<String,SearchTab>();
     private final Map<String,SearchTab> tabsByKey = new 
HashMap<String,SearchTab>();
-    // redundant w/ init() in constructor TODO remove
-    private final ReentrantReadWriteLock tabsLock = new 
ReentrantReadWriteLock(); 
 
     private final DocumentLoader loader;
     private final Context context;
-    
-    
-    
 
+
+
+
     // Static --------------------------------------------------------
 
     /** Return the factory in use for the skin defined within the context. *
@@ -233,16 +231,11 @@
     }
 
     public Map<String,SearchTab> getTabsByName(){
-        
+
         LOG.trace("getTabsByName()");
 
-        try{
-            tabsLock.readLock().lock();
-            return Collections.unmodifiableMap(tabsByName);
+        return Collections.unmodifiableMap(tabsByName);
 
-        }finally{
-            tabsLock.readLock().unlock();
-        }        
 
     }
 
@@ -252,7 +245,12 @@
 
     // Private -------------------------------------------------------
 
-
+    /** Initialises instance.
+     * Crucial that this method is called from the constructor,
+     *  otherwise read/write synchronisation must be re-added to the 
tabsByName & tabsByKey fields.
+     *
+     * @throws javax.xml.parsers.ParserConfigurationException
+     */
     private void init() throws ParserConfigurationException {
 
         loader.abut();
@@ -271,14 +269,9 @@
                         final SearchTab inherit = 
getTabByName(tabE.getAttribute("inherit"));
                         final SearchTab tab = TAB_FACTORY.parseTab(tabE, 
context, inherit);
 
-                        try{
-                            tabsLock.writeLock().lock();
-                            tabsByName.put(tab.getId(), tab);
-                            if(key.length() > 0){
-                                tabsByKey.put(key, tab);
-                            }
-                        }finally{
-                            tabsLock.writeLock().unlock();
+                        tabsByName.put(tab.getId(), tab);
+                        if(key.length() > 0){
+                            tabsByKey.put(key, tab);
                         }
                     }
                 }
@@ -294,41 +287,31 @@
 
         LOG.trace("getTabImpl(" + id + ')');
 
-        try{
-            tabsLock.readLock().lock();
-            return tabsByName.get(id);
+        return tabsByName.get(id);
 
-        }finally{
-            tabsLock.readLock().unlock();
-        }
     }
 
     private SearchTab getTabByKeyImpl(final String key){
 
         LOG.trace("getTabByKeyImpl(" + key + ')');
 
-        try{
-            tabsLock.readLock().lock();
-            return tabsByKey.get(key);
+        return tabsByKey.get(key);
 
-        }finally{
-            tabsLock.readLock().unlock();
-        }
     }
 
     // Inner classes -------------------------------------------------
-    
+
     private static final class TabFactory extends 
AbstractConfigFactory<SearchTab> {
 
-        private static final NavFactory NAV_FACTORY = new NavFactory();    
-    
+        private static final NavFactory NAV_FACTORY = new NavFactory();
+
         SearchTab parseTab(
                 final Element tabE,
                 final Context context,
                 final SearchTab inherit) throws ParserConfigurationException {
-            
 
 
+
                 final String id = tabE.getAttribute("id");
                 LOG.info(INFO_PARSING_TAB + id);
                 final String mode = parseString(tabE.getAttribute("mode"), 
inherit != null ? inherit.getMode() : "");
@@ -342,7 +325,7 @@
                 final String allJavascript = 
parseString(tabE.getAttribute("javascript"), null);
                 final String[] javascript = allJavascript != null ? 
allJavascript.split(",") : new String[]{};
 
-                
+
                 // enrichment hints
                 final NodeList enrichmentNodeList = 
tabE.getElementsByTagName("enrichment");
                 final Collection<SearchTab.EnrichmentHint> enrichments = new 
ArrayList<SearchTab.EnrichmentHint>();
@@ -355,7 +338,7 @@
                     final float weight = parseFloat(e.getAttribute("weight"), 
0);
                     final String command = e.getAttribute("command");
                     final boolean alwaysvisible = 
parseBoolean(e.getAttribute("always-visable"),false);
-                    
+
                     final SearchTab.EnrichmentHint enrichment
                             = new SearchTab.EnrichmentHint(rule, baseScore, 
threshold, weight, command, alwaysvisible);
                     enrichments.add(enrichment);
@@ -372,7 +355,7 @@
                         navE = n;
                     }
                 }
-                
+
                 final NavigationConfig navConf = parseNavigation(
                         mode,
                         null != navE ? navE.getElementsByTagName("navigation") 
: new NodeList() {
@@ -382,29 +365,33 @@
                             public int getLength() {
                                 return 0;
                             }
-                        }, 
+                        },
                         context,
                         null != inherit ? inherit.getNavigationConfiguration() 
: null);
-                               
+
                 // the tab's layout
                 final NodeList layoutsNodeList = 
tabE.getElementsByTagName("layout");
-                
+
                 Layout defaultLayout = null;
                 final Map<String,Layout> layouts = new 
HashMap<String,Layout>();
-                
+
                 for(int j = 0 ;j < layoutsNodeList.getLength(); ++j){
-                    
+
                     final Element layoutE = (Element) layoutsNodeList.item(j);
                     final String layoutId = null != layoutE.getAttribute("id") 
? layoutE.getAttribute("id") : "";
                     final Layout layout = new Layout(null != inherit ? 
inherit.getLayouts().get(layoutId) : null)
                             .readLayout(layoutE);
-                    
+
                     layouts.put(layoutId, layout);
-                    
+
                     if(0 == layoutId.length()){
                         defaultLayout = layout;
                     }
                 }
+                final String scopeStr = tabE.getAttribute("scope");
+                final SearchTab.Scope scope = 0 < scopeStr.length()
+                        ? SearchTab.Scope.valueOf(scopeStr.toUpperCase())
+                        : null != inherit ? inherit.getScope() : 
SearchTab.Scope.REQUEST;
 
                 return new SearchTab(
                         inherit,
@@ -439,14 +426,15 @@
                         ? inherit.isExecuteOnBlank()
                         : false),
                         defaultLayout,
-                        layouts);
+                        layouts,
+                        scope);
 
-                
+
         }
-        
 
+
         private NavigationConfig parseNavigation(
-                final String modeId, 
+                final String modeId,
                 final NodeList navigationElements,
                 final Context context,
                 final NavigationConfig inherit) throws 
ParserConfigurationException {
@@ -462,8 +450,8 @@
                 for (int l = 0; l < navs.getLength(); l++) {
                     final Node navNode = navs.item(l);
 
-                    if (navNode instanceof Element 
-                            && ! 
(RESET_NAV_ELEMENT.equals(navNode.getNodeName()) 
+                    if (navNode instanceof Element
+                            && ! 
(RESET_NAV_ELEMENT.equals(navNode.getNodeName())
                             || 
NAV_CONFIG_ELEMENT.equals(navNode.getNodeName()))) {
 
                         navigation.addNav(
@@ -497,7 +485,7 @@
         /** XXX Implement me. Everything is hardcoded to SearchTab. Not even 
used i believe. */
         protected Class<SearchTab> findClass(final String xmlName, final 
Context context)
                 throws ClassNotFoundException {
-            
+
             final String bName = xmlToBeanName(xmlName);
             final String className = Character.toUpperCase(bName.charAt(0)) + 
bName.substring(1, bName.length());
 
@@ -522,7 +510,7 @@
                 final NavigationConfig.Navigation navigation,
                 final Context context,
                 final NavigationConfig.Nav parent) throws 
ParserConfigurationException {
-            
+
             try {
 
                 Class<NavigationConfig.Nav> clazz = null;
@@ -570,7 +558,7 @@
 
         protected Class<NavigationConfig.Nav> findClass(final String xmlName, 
final Context context)
                 throws ClassNotFoundException {
-            
+
             final String bName = xmlToBeanName(xmlName);
             final String className = Character.toUpperCase(bName.charAt(0)) + 
bName.substring(1, bName.length());
 

Modified: 
trunk/view-config-spi/src/main/java/no/sesat/search/view/config/SearchTab.java
===================================================================
--- 
trunk/view-config-spi/src/main/java/no/sesat/search/view/config/SearchTab.java  
    2007-11-09 09:40:50 UTC (rev 5896)
+++ 
trunk/view-config-spi/src/main/java/no/sesat/search/view/config/SearchTab.java  
    2007-11-11 18:30:40 UTC (rev 5897)
@@ -42,6 +42,7 @@
  */
 public final class SearchTab implements Serializable{
 
+    public enum Scope{REQUEST, SESSION};
 
     // Constants -----------------------------------------------------
 
@@ -73,6 +74,7 @@
     private final Layout defaultLayout;
     private final Map<String,Layout> layouts = new HashMap<String,Layout>();
     private final NavigationConfig navigationConfig;
+    private final Scope scope;
 
     // Static --------------------------------------------------------
 
@@ -126,7 +128,8 @@
                 final boolean displayCss,
                 final boolean executeOnBlank,
                 final Layout defaultLayout,
-                final Map<String,Layout> layouts){
+                final Map<String,Layout> layouts,
+                final Scope scope){
 
         this.inherit = inherit;
         this.id = id;
@@ -166,6 +169,7 @@
         this.rssHidden = rssHidden;
         this.defaultLayout = defaultLayout;
         this.layouts.putAll(layouts);
+        this.scope = null != scope ? scope : inherit.scope;
     }
 
     // Getters --------------------------------------------------------
@@ -433,6 +437,10 @@
     public NavigationConfig getNavigationConfiguration(){
         return navigationConfig;
     }
+    
+    public Scope getScope(){
+        return scope;
+    }
 
     // Inner classes -------------------------------------------------
 

Modified: 
trunk/view-control-spi/src/main/java/no/sesat/search/view/navigation/ResultPagingNavigationController.java
===================================================================
--- 
trunk/view-control-spi/src/main/java/no/sesat/search/view/navigation/ResultPagingNavigationController.java
  2007-11-09 09:40:50 UTC (rev 5896)
+++ 
trunk/view-control-spi/src/main/java/no/sesat/search/view/navigation/ResultPagingNavigationController.java
  2007-11-11 18:30:40 UTC (rev 5897)
@@ -25,14 +25,18 @@
 import no.sesat.search.result.ResultItem;
 import no.sesat.search.result.ResultList;
 import no.sesat.search.site.config.TextMessages;
+import org.apache.log4j.Logger;
 
 
 /**
  * @author maek
+ * @version $Id$
  */
 public final class ResultPagingNavigationController
         implements NavigationControllerFactory<ResultPagingNavigationConfig>, 
NavigationController {
 
+    private static final Logger LOG = 
Logger.getLogger(ResultPagingNavigationController.class);
+
     private ResultPagingNavigationConfig config;
 
     public NavigationController get(final ResultPagingNavigationConfig nav) {
@@ -43,47 +47,49 @@
     public NavigationItem getNavigationItems(Context context) {
 
         final SearchDataObject search = 
context.getDataModel().getSearch(config.getCommandName());
+        NavigationItem item = null;
 
         if (search == null) {
-            throw new IllegalArgumentException("Could not find search result 
for command " + config.getCommandName());
-        }
+            LOG.info("Could not find search result for command " + 
config.getCommandName());
 
-        final ResultList<? extends ResultItem> searchResult = 
search.getResults();
+        }else{
 
-        final int hitCount = searchResult.getHitCount();
-        final StringDataObject offsetString = 
context.getDataModel().getParameters().getValue("offset");
-        final int offset = offsetString == null ? 0 : 
Integer.parseInt(offsetString.getUtf8UrlEncoded());
+            final ResultList<? extends ResultItem> searchResult = 
search.getResults();
 
-        final NavigationItem item = new BasicNavigationItem();
-        final PagingHelper pager = new PagingHelper(hitCount, 
config.getPageSize(), offset, config.getNumberOfPages());
+            final int hitCount = searchResult.getHitCount();
+            final StringDataObject offsetString = 
context.getDataModel().getParameters().getValue("offset");
+            final int offset = offsetString == null ? 0 : 
Integer.parseInt(offsetString.getUtf8UrlEncoded());
 
-        final TextMessages messages = TextMessages.valueOf(context.getSite());
+            item = new BasicNavigationItem();
+            final PagingHelper pager = new PagingHelper(hitCount, 
config.getPageSize(), offset, config.getNumberOfPages());
 
-        // Add navigation item for previous page.
-        if (pager.getCurrentPage() > 1) {
-            final String pageOffset = 
Integer.toString(pager.getOffsetOfPage(pager.getCurrentPage() - 1));
-            final String url = context.getUrlGenerator().getURL(pageOffset, 
config);
-            item.addResult(new 
BasicNavigationItem(messages.getMessage("prev"), url, config.getPageSize()));
-        }
+            final TextMessages messages = 
TextMessages.valueOf(context.getSite());
 
-        // Add navigation items for the individual pages.
-        for (int i = pager.getFirstVisiblePage(); i <= 
pager.getLastVisiblePage(); ++i) {
-            final String pageOffset = 
Integer.toString(pager.getOffsetOfPage(i));
-            final String url = context.getUrlGenerator().getURL(pageOffset, 
config);
-            final BasicNavigationItem navItem = new 
BasicNavigationItem(Integer.toString(i), url, config.getPageSize());
+            // Add navigation item for previous page.
+            if (pager.getCurrentPage() > 1) {
+                final String pageOffset = 
Integer.toString(pager.getOffsetOfPage(pager.getCurrentPage() - 1));
+                final String url = 
context.getUrlGenerator().getURL(pageOffset, config);
+                item.addResult(new 
BasicNavigationItem(messages.getMessage("prev"), url, config.getPageSize()));
+            }
 
-            navItem.setSelected(i == pager.getCurrentPage());
+            // Add navigation items for the individual pages.
+            for (int i = pager.getFirstVisiblePage(); i <= 
pager.getLastVisiblePage(); ++i) {
+                final String pageOffset = 
Integer.toString(pager.getOffsetOfPage(i));
+                final String url = 
context.getUrlGenerator().getURL(pageOffset, config);
+                final BasicNavigationItem navItem = new 
BasicNavigationItem(Integer.toString(i), url, config.getPageSize());
 
-            item.addResult(navItem);
-        }
+                navItem.setSelected(i == pager.getCurrentPage());
 
-        // Add navigation item for next page.
-        if (pager.getCurrentPage() < pager.getNumberOfPages()) {
-            final String pageOffset = 
Integer.toString(pager.getOffsetOfPage(pager.getCurrentPage() + 1));
-            final String url = context.getUrlGenerator().getURL(pageOffset, 
config);
-            item.addResult(new 
BasicNavigationItem(messages.getMessage("next"), url, config.getPageSize()));
-        }                               
+                item.addResult(navItem);
+            }
 
+            // Add navigation item for next page.
+            if (pager.getCurrentPage() < pager.getNumberOfPages()) {
+                final String pageOffset = 
Integer.toString(pager.getOffsetOfPage(pager.getCurrentPage() + 1));
+                final String url = 
context.getUrlGenerator().getURL(pageOffset, config);
+                item.addResult(new 
BasicNavigationItem(messages.getMessage("next"), url, config.getPageSize()));
+            }
+        }
         return item;
     }
 }


Property changes on: 
trunk/view-control-spi/src/main/java/no/sesat/search/view/navigation/ResultPagingNavigationController.java
___________________________________________________________________
Name: svn:keywords
   + Id

Modified: 
trunk/war/src/main/java/no/sesat/search/http/filters/DataModelFilter.java
===================================================================
--- trunk/war/src/main/java/no/sesat/search/http/filters/DataModelFilter.java   
2007-11-09 09:40:50 UTC (rev 5896)
+++ trunk/war/src/main/java/no/sesat/search/http/filters/DataModelFilter.java   
2007-11-11 18:30:40 UTC (rev 5897)
@@ -65,6 +65,7 @@
 import no.sesat.search.site.config.SiteConfiguration;
 import no.sesat.search.site.config.UrlResourceLoader;
 
+import no.sesat.search.view.config.SearchTab;
 import org.apache.log4j.Logger;
 
 /** Ensures that a session is created, and that a new DataModel, with Site and 
Browser dataObjects,
@@ -279,8 +280,27 @@
     @SuppressWarnings("deprecation")
     private static void cleanDataModel(final DataModelFactory factory, final 
DataModel datamodel){
 
-        for(String key : datamodel.getJunkYard().getValues().keySet()){
-            datamodel.getJunkYard().setValue(key, null);
+        if(null != datamodel.getPage().getCurrentTab()){
+            final SearchTab.Scope scope = 
datamodel.getPage().getCurrentTab().getScope();
+            // we need to reset control level so to be able to unset 
properties in it.
+            factory.assignControlLevel(datamodel, 
ControlLevel.DATA_MODEL_CONSTRUCTION);
+
+            for(String key : datamodel.getJunkYard().getValues().keySet()){
+                datamodel.getJunkYard().setValue(key, null);
+            }
+
+            if(SearchTab.Scope.REQUEST == scope){
+                for(String key : datamodel.getSearches().keySet()){
+                    datamodel.setSearch(key, null);
+                }
+                for(String key : 
datamodel.getNavigation().getNavigations().keySet()){
+                    datamodel.getNavigation().setNavigation(key, null);
+                }
+                datamodel.setNavigation(null);
+                datamodel.setParameters(null);
+                datamodel.setQuery(null);
+                datamodel.getPage().setCurrentTab(null);
+            }
         }
 
         assert isSerializable(datamodel) : "Datamodel is not serializable!";

Modified: 
trunk/war/src/main/java/no/sesat/search/view/taglib/SearchTabIncludeTag.java
===================================================================
--- 
trunk/war/src/main/java/no/sesat/search/view/taglib/SearchTabIncludeTag.java    
    2007-11-09 09:40:50 UTC (rev 5896)
+++ 
trunk/war/src/main/java/no/sesat/search/view/taglib/SearchTabIncludeTag.java    
    2007-11-11 18:30:40 UTC (rev 5897)
@@ -29,7 +29,10 @@
 import javax.servlet.jsp.JspException;
 import javax.servlet.jsp.PageContext;
 import no.sesat.search.datamodel.DataModel;
+import no.sesat.search.datamodel.generic.StringDataObject;
+import no.sesat.search.run.RunningQueryImpl;
 import no.sesat.search.view.config.SearchTab;
+import no.sesat.search.view.config.SearchTab.Layout;
 import org.apache.log4j.Logger;
 
 
@@ -80,7 +83,11 @@
         final PageContext cxt = (PageContext) getJspContext();
         final DataModel datamodel = (DataModel) 
cxt.findAttribute(DataModel.KEY);
         final SearchTab tab = datamodel.getPage().getCurrentTab();
-        final String template = LAYOUT_DIRECTORY + 
tab.getDefaultLayout().getInclude(include);
+        final StringDataObject layoutDO = 
datamodel.getParameters().getValue(RunningQueryImpl.PARAM_LAYOUT);
+        final Layout layout = null != layoutDO 
+                ? tab.getLayouts().get(layoutDO.getXmlEscaped()) 
+                : tab.getDefaultLayout();
+        final String template = LAYOUT_DIRECTORY + layout.getInclude(include);
         try{
             cxt.getOut().println("<!-- " + include + " -->");
         }catch(IOException ioe){
@@ -90,7 +97,7 @@
         final Map<String,Object> map = new HashMap<String,Object>();
         
         // HACK the pager until the datamodel provides methods to access 
"paging" commands in the current mode.
-        map.put("commandName", tab.getDefaultLayout().getOrigin());
+        map.put("commandName", layout.getOrigin());
         // end-HACK
         
         importTemplate(template, map);

Modified: trunk/war/src/main/webapp/WEB-INF/jsp/decorators/webDecorator.jsp
===================================================================
--- trunk/war/src/main/webapp/WEB-INF/jsp/decorators/webDecorator.jsp   
2007-11-09 09:40:50 UTC (rev 5896)
+++ trunk/war/src/main/webapp/WEB-INF/jsp/decorators/webDecorator.jsp   
2007-11-11 18:30:40 UTC (rev 5897)
@@ -26,8 +26,8 @@
 <search:velocity template="/pages/main"/>
 <c:if test="${! empty Missing_pagesmain_Template}">
     <c:choose>
-        <c:when test="${!empty param.layout}">
-            <c:set var="layout" value="{tab.layouts[param.layout]}" 
scope="request"/>
+        <c:when test="${!empty DataModel.parameters.values['layout']}">
+            <c:set var="layout" 
value="${tab.layouts[DataModel.parameters.values['layout'].xmlEscaped]}" 
scope="request"/>
         </c:when>
         <c:otherwise>
             <c:set var="layout" value="${tab.defaultLayout}" scope="request"/>

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

Reply via email to