Author: ssanjamt
Date: 2007-06-26 16:23:05 +0200 (Tue, 26 Jun 2007)
New Revision: 5433

Added:
   
trunk/data-model-javabean-impl/src/test/java/no/schibstedsok/searchportal/datamodel/DataModelSerializeTest.java
   trunk/data-model-javabean-impl/src/test/resources/core.properties
Modified:
   
trunk/data-model-api/src/main/java/no/schibstedsok/searchportal/datamodel/generic/DataObject.java
   
trunk/data-model-javabean-impl/src/main/java/no/schibstedsok/searchportal/datamodel/BeanDataObjectInvocationHandler.java
   trunk/query-api/src/main/java/no/schibstedsok/searchportal/query/Query.java
   
trunk/query-api/src/main/java/no/schibstedsok/searchportal/query/Visitable.java
   trunk/query-api/src/main/java/no/schibstedsok/searchportal/query/Visitor.java
   
trunk/query-api/src/main/java/no/schibstedsok/searchportal/query/parser/AbstractClause.java
   
trunk/query-api/src/main/java/no/schibstedsok/searchportal/query/token/TokenEvaluationEngine.java
   
trunk/search-command-config-spi/src/main/java/no/schibstedsok/searchportal/mode/NavigationConfig.java
   
trunk/search-command-config-spi/src/main/java/no/schibstedsok/searchportal/mode/config/SearchConfiguration.java
   trunk/site-spi/src/main/java/no/schibstedsok/searchportal/site/Site.java
   
trunk/site-spi/src/main/java/no/schibstedsok/searchportal/site/config/SiteConfiguration.java
Log:
- Exception caught:
AxisFault
 faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
 faultSubcode: 
 faultString: javax.net.ssl.SSLHandshakeException: 
sun.security.validator.ValidatorException: PKIX path building failed: 
sun.security.provider.certpath.SunCertPathBuilderException: unable to find 
valid certification path to requested target
 faultActor: 
 faultNode: 
 faultDetail: 
        
{http://xml.apache.org/axis/}stackTrace:javax.net.ssl.SSLHandshakeException: 
sun.security.validator.ValidatorException: PKIX path building failed: 
sun.security.provider.certpath.SunCertPathBuilderException: unable to find 
valid certification path to requested target
        at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
        at 
com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1520)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:182)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:176)
        at 
com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:975)
        at 
com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:123)
        at 
com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:511)
        at 
com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:449)
        at 
com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:817)
        at 
com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1029)
        at 
com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1056)
        at 
com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1040)
        at 
org.apache.axis.components.net.JSSESocketFactory.create(JSSESocketFactory.java:186)
        at 
org.apache.axis.transport.http.HTTPSender.getSocket(HTTPSender.java:191)
        at 
org.apache.axis.transport.http.HTTPSender.writeToSocket(HTTPSender.java:404)
        at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:138)
        at 
org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
        at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
        at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
        at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
        at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
        at org.apache.axis.client.Call.invoke(Call.java:2767)
        at org.apache.axis.client.Call.invoke(Call.java:2443)
        at org.apache.axis.client.Call.invoke(Call.java:2366)
        at org.apache.axis.client.Call.invoke(Call.java:1812)
        at 
com.atlassian.jira.rpc.soap.jirasoapservice_v2.JirasoapserviceV2SoapBindingStub.login(JirasoapserviceV2SoapBindingStub.java:5432)
        at no.jamtli.jira.JiraClient.run(JiraClient.java:37)
        at no.jamtli.jira.JiraClient.main(JiraClient.java:56)
Caused by: sun.security.validator.ValidatorException: PKIX path building 
failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to 
find valid certification path to requested target
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:285)
        at 
sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:191)
        at sun.security.validator.Validator.validate(Validator.java:218)
        at 
com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:126)
        at 
com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:209)
        at 
com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249)
        at 
com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:954)
        ... 23 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable 
to find valid certification path to requested target
        at 
sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174)
        at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238)
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:280)
        ... 29 more

        {http://xml.apache.org/axis/}hostname:jules

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: 
PKIX path building failed: 
sun.security.provider.certpath.SunCertPathBuilderException: unable to find 
valid certification path to requested target
        at org.apache.axis.AxisFault.makeFault(AxisFault.java:101)
        at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:154)
        at 
org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
        at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
        at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
        at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
        at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
        at org.apache.axis.client.Call.invoke(Call.java:2767)
        at org.apache.axis.client.Call.invoke(Call.java:2443)
        at org.apache.axis.client.Call.invoke(Call.java:2366)
        at org.apache.axis.client.Call.invoke(Call.java:1812)
        at 
com.atlassian.jira.rpc.soap.jirasoapservice_v2.JirasoapserviceV2SoapBindingStub.login(JirasoapserviceV2SoapBindingStub.java:5432)
        at no.jamtli.jira.JiraClient.run(JiraClient.java:37)
        at no.jamtli.jira.JiraClient.main(JiraClient.java:56)
Caused by: javax.net.ssl.SSLHandshakeException: 
sun.security.validator.ValidatorException: PKIX path building failed: 
sun.security.provider.certpath.SunCertPathBuilderException: unable to find 
valid certification path to requested target
        at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
        at 
com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1520)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:182)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:176)
        at 
com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:975)
        at 
com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:123)
        at 
com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:511)
        at 
com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:449)
        at 
com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:817)
        at 
com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1029)
        at 
com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1056)
        at 
com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1040)
        at 
org.apache.axis.components.net.JSSESocketFactory.create(JSSESocketFactory.java:186)
        at 
org.apache.axis.transport.http.HTTPSender.getSocket(HTTPSender.java:191)
        at 
org.apache.axis.transport.http.HTTPSender.writeToSocket(HTTPSender.java:404)
        at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:138)
        ... 12 more
Caused by: sun.security.validator.ValidatorException: PKIX path building 
failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to 
find valid certification path to requested target
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:285)
        at 
sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:191)
        at sun.security.validator.Validator.validate(Validator.java:218)
        at 
com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:126)
        at 
com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:209)
        at 
com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249)
        at 
com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:954)
        ... 23 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable 
to find valid certification path to requested target
        at 
sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174)
        at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238)
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:280)
        ... 29 more


Modified: 
trunk/data-model-api/src/main/java/no/schibstedsok/searchportal/datamodel/generic/DataObject.java
===================================================================
--- 
trunk/data-model-api/src/main/java/no/schibstedsok/searchportal/datamodel/generic/DataObject.java
   2007-06-26 13:53:17 UTC (rev 5432)
+++ 
trunk/data-model-api/src/main/java/no/schibstedsok/searchportal/datamodel/generic/DataObject.java
   2007-06-26 14:23:05 UTC (rev 5433)
@@ -8,6 +8,7 @@
 
 package no.schibstedsok.searchportal.datamodel.generic;
 
+import java.io.Serializable;
 import java.lang.annotation.Documented;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Inherited;
@@ -29,9 +30,15 @@
 @Inherited
 public @interface DataObject {
 
-    public final class Property{
+    public final class Property implements Serializable {
         private final String name;
         private final Object value;
+        
+        private Property() {
+            name = null;
+            value = null;
+        }
+        
         public Property(final String name, final Object value){
             this.name = name;
             this.value = value;

Modified: 
trunk/data-model-javabean-impl/src/main/java/no/schibstedsok/searchportal/datamodel/BeanDataObjectInvocationHandler.java
===================================================================
--- 
trunk/data-model-javabean-impl/src/main/java/no/schibstedsok/searchportal/datamodel/BeanDataObjectInvocationHandler.java
    2007-06-26 13:53:17 UTC (rev 5432)
+++ 
trunk/data-model-javabean-impl/src/main/java/no/schibstedsok/searchportal/datamodel/BeanDataObjectInvocationHandler.java
    2007-06-26 14:23:05 UTC (rev 5433)
@@ -14,10 +14,16 @@
 import java.beans.beancontext.BeanContext;
 import java.beans.beancontext.BeanContextChild;
 import java.beans.beancontext.BeanContextSupport;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.lang.annotation.Annotation;
 import java.lang.ref.WeakReference;
 import java.lang.reflect.Method;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.InvocationTargetException;
+import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -30,6 +36,7 @@
 import no.schibstedsok.searchportal.datamodel.access.AccessAllow;
 import no.schibstedsok.searchportal.datamodel.access.AccessDisallow;
 import no.schibstedsok.searchportal.datamodel.access.ControlLevel;
+import no.schibstedsok.searchportal.datamodel.generic.DataObject;
 import no.schibstedsok.searchportal.datamodel.generic.DataObject.Property;
 import no.schibstedsok.searchportal.datamodel.generic.MapDataObject;
 import no.schibstedsok.searchportal.datamodel.generic.MapDataObjectSupport;
@@ -43,7 +50,7 @@
  * @author <a href="mailto:[EMAIL PROTECTED]">Mck</a>
  * @version <tt>$Id$</tt>
  */
-class BeanDataObjectInvocationHandler<T> implements InvocationHandler {
+class BeanDataObjectInvocationHandler<T> implements InvocationHandler, 
Serializable {
 
     // Constants -----------------------------------------------------
 
@@ -59,17 +66,17 @@
     // Attributes ----------------------------------------------------
 
 
-    private final Class<T> implementOf;
-    private final Object support;
-    private final boolean immutable;
+    private Class<T> implementOf;
+    private Object support;
+    private boolean immutable;
 
     // properties: the only part of this class that be immutable and reused
-    protected final List<Property> properties = new 
CopyOnWriteArrayList<Property>();
+    protected List<Property> properties = new CopyOnWriteArrayList<Property>();
 
-    protected final BeanContext context;
+    protected BeanContext context;
 
-    private final Map<Method,InvocationTarget> invocationTargetCache = new 
ConcurrentHashMap<Method,InvocationTarget>();
-    private final Map<Method,Method> supportMethodCache = new 
ConcurrentHashMap<Method,Method>();
+    transient private Map<Method,InvocationTarget> invocationTargetCache = new 
ConcurrentHashMap<Method,InvocationTarget>();
+    transient private Map<Method,Method> supportMethodCache = new 
ConcurrentHashMap<Method,Method>();
 
     // Static --------------------------------------------------------
 
@@ -114,7 +121,33 @@
 
     // Constructors --------------------------------------------------
 
+    /** No-arg constructor to support serialization */
+    protected BeanDataObjectInvocationHandler() {
+        implementOf = null;
+        context = new BeanContextSupport();
+        support = new Object();
+        immutable = false;
+    };
+   
+    @SuppressWarnings("unchecked")
+    private void readObject(ObjectInputStream stream) throws IOException, 
ClassNotFoundException {
+        invocationTargetCache = new 
ConcurrentHashMap<Method,InvocationTarget>();
+        supportMethodCache = new ConcurrentHashMap<Method,Method>();
+        implementOf = (Class<T>) stream.readObject();
+        context = (BeanContext) stream.readObject();
+        support = stream.readObject();
+        immutable = stream.readBoolean();
+        properties = (List<Property>) stream.readObject();
+    }
 
+    private void writeObject(ObjectOutputStream stream) throws IOException {
+        stream.writeObject(implementOf);
+        stream.writeObject(context);
+        stream.writeObject(support);
+        stream.writeBoolean(immutable);
+        stream.writeObject(properties);
+    }
+    
     /** Creates a new instance of ProxyBeanDataObject */
     protected BeanDataObjectInvocationHandler(
             final Class<T> cls,

Added: 
trunk/data-model-javabean-impl/src/test/java/no/schibstedsok/searchportal/datamodel/DataModelSerializeTest.java
===================================================================
--- 
trunk/data-model-javabean-impl/src/test/java/no/schibstedsok/searchportal/datamodel/DataModelSerializeTest.java
                             (rev 0)
+++ 
trunk/data-model-javabean-impl/src/test/java/no/schibstedsok/searchportal/datamodel/DataModelSerializeTest.java
     2007-06-26 14:23:05 UTC (rev 5433)
@@ -0,0 +1,356 @@
+/*
+ * DataModelSerializeTest.java
+ *
+ * Created on 11-Jun-2007, 13:42:18
+ *
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package no.schibstedsok.searchportal.datamodel;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.Set;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Properties;
+import no.schibstedsok.searchportal.datamodel.generic.DataObject;
+import no.schibstedsok.searchportal.datamodel.generic.StringDataObject;
+import no.schibstedsok.searchportal.datamodel.junkyard.JunkYardDataObject;
+import no.schibstedsok.searchportal.datamodel.navigation.NavigationDataObject;
+import no.schibstedsok.searchportal.datamodel.query.QueryDataObject;
+import no.schibstedsok.searchportal.datamodel.request.BrowserDataObject;
+import no.schibstedsok.searchportal.datamodel.request.ParametersDataObject;
+import no.schibstedsok.searchportal.datamodel.search.SearchDataObject;
+import no.schibstedsok.searchportal.datamodel.site.SiteDataObject;
+import no.schibstedsok.searchportal.datamodel.user.UserDataObject;
+import no.schibstedsok.searchportal.mode.NavigationConfig;
+import no.schibstedsok.searchportal.mode.config.SearchConfiguration;
+import no.schibstedsok.searchportal.mode.config.StaticCommandConfig;
+import no.schibstedsok.searchportal.query.Clause;
+import no.schibstedsok.searchportal.query.Query;
+import no.schibstedsok.searchportal.query.Visitor;
+import no.schibstedsok.searchportal.query.finder.ParentFinder;
+import no.schibstedsok.searchportal.query.parser.AbstractQuery;
+import no.schibstedsok.searchportal.query.token.TokenPredicate;
+import no.schibstedsok.searchportal.result.BasicNavigationItem;
+import no.schibstedsok.searchportal.result.BasicResultItem;
+import no.schibstedsok.searchportal.result.BasicResultList;
+import no.schibstedsok.searchportal.result.NavigationItem;
+import no.schibstedsok.searchportal.result.ResultList;
+import no.schibstedsok.searchportal.site.Site;
+import no.schibstedsok.searchportal.site.Site.Context;
+import no.schibstedsok.searchportal.site.SiteContext;
+import no.schibstedsok.searchportal.site.config.FileResourceLoader;
+import no.schibstedsok.searchportal.site.config.PropertiesLoader;
+import no.schibstedsok.searchportal.site.config.SiteConfiguration;
+import no.schibstedsok.searchportal.user.User;
+import org.apache.log4j.Logger;
+import org.testng.annotations.Test;
+
+/**
+ *
+ * @author andersjj
+ */
+public class DataModelSerializeTest implements Serializable {
+    
+    private static final Logger LOG = 
Logger.getLogger(DataModelSerializeTest.class);
+    
+    private static final String JUNK_YARD_KEY = "foo";
+    private static final String JUNK_YARD_VALUE = "bar";
+    private static final int    SEARCH_HIT_COUNT = 10;
+    private static final String SEARCH_KEY = "default";
+    private static final String NAVIGATION_TITLE = "navigationTitle";
+    private static final String NAVIGATION_URL = "http://navigationURL";;
+    private static final int    NAVIGATION_HIT_COUNT = 11;
+    private static final String NAVIGATION_KEY = "navigationKey";
+    private static final String QUERY_STRING = "sesam";
+    private static final String USER_AGENT = "Opera (Linux)";
+    private static final String REMOTE_ADDRESS = "127.0.0.1";
+    
+    public DataModelSerializeTest() {
+        
+    }
+    
+    @Test
+    public void testSerialize() throws Exception {
+        final DataModelFactory factory = new DataModelFactoryImpl(new 
DataModelFactory.Context(){
+            public Site getSite() {
+                return Site.DEFAULT;
+            }
+            
+            public PropertiesLoader newPropertiesLoader(final SiteContext 
siteCxt,
+                    final String resource,
+                    final Properties properties) {
+                return TestResourceLoader.newPropertiesLoader(siteCxt, 
resource, properties);
+            }
+        });
+        
+        final DataModel datamodel = factory.instantiate();
+        
+        final Site site = getTestingSite();
+        
+        final SiteConfiguration.Context cxt = new SiteConfiguration.Context() {
+            public Site getSite() {
+                return site;
+            }
+            
+            public PropertiesLoader newPropertiesLoader(
+                    final SiteContext siteContext,
+                    final String resource,
+                    final Properties properties) {
+                return TestResourceLoader.newPropertiesLoader(siteContext, 
resource, properties);
+            }
+        };
+        
+        final SiteConfiguration siteConfig = SiteConfiguration.valueOf(cxt);
+        
+        final SiteDataObject siteDO = factory.instantiate(
+                SiteDataObject.class,
+                new DataObject.Property("site", site),
+                new DataObject.Property("siteconfiguration", siteConfig));
+        datamodel.setSite(siteDO);
+        
+        final JunkYardDataObject junkYardDO = factory.instantiate(
+                JunkYardDataObject.class,
+                new DataObject.Property("values", new 
Hashtable<String,Object>()));
+        datamodel.setJunkYard(junkYardDO);
+        
+        datamodel.getJunkYard().setValue(JUNK_YARD_KEY, JUNK_YARD_VALUE);
+        
+        final SearchConfiguration searchConfiguration = new 
StaticCommandConfig();
+        final ResultList<BasicResultItem> searchResults = new 
BasicResultList<BasicResultItem>();
+        searchResults.setHitCount(SEARCH_HIT_COUNT);
+     
+        final Set<TokenPredicate> tokenPredicateSet = new 
HashSet<TokenPredicate>();
+        tokenPredicateSet.add(TokenPredicate.FOOD);
+        
+        final Clause root = new Clause() {
+
+            public String getTerm() {
+                return QUERY_STRING;
+            }
+
+            public Set<TokenPredicate> getKnownPredicates() {
+                return tokenPredicateSet;
+            }
+
+            public Set<TokenPredicate> getPossiblePredicates() {
+                return tokenPredicateSet;
+            }
+
+            public void accept(Visitor visitor) {
+            }
+        };
+       
+        final ParentFinder parentFinder = new ParentFinder();
+        
+        final Query query = new AbstractQuery(QUERY_STRING){
+            public Clause getRootClause(){
+                return root;
+            }
+            public ParentFinder getParentFinder(){
+                return parentFinder;
+            }
+            public boolean isBlank(){
+                return false;
+            }
+        };
+        
+        final QueryDataObject queryDO = factory.instantiate(
+                QueryDataObject.class,
+                new DataObject.Property("query", query));
+        
+        final SearchDataObject searchDO = factory.instantiate(
+                SearchDataObject.class,
+                new DataObject.Property("configuration", searchConfiguration),
+                new DataObject.Property("results", searchResults),
+                new DataObject.Property("query", queryDO));
+        datamodel.setSearch(SEARCH_KEY, searchDO);
+       
+        datamodel.setQuery(queryDO);
+     
+        final StringDataObject userAgent = factory.instantiate(
+                StringDataObject.class,
+                new DataObject.Property("string", USER_AGENT));
+        
+        final StringDataObject remoteAddress = factory.instantiate(
+                StringDataObject.class,
+                new DataObject.Property("string", REMOTE_ADDRESS));
+        
+        final BrowserDataObject browserDO = factory.instantiate(
+                BrowserDataObject.class,
+                new DataObject.Property("userAgent", userAgent),
+                new DataObject.Property("remoteAddress", remoteAddress));
+        
+        datamodel.setBrowser(browserDO);
+        
+        final NavigationConfig navigationConfiguration = new 
NavigationConfig();
+        final Map<String,NavigationItem> navigation = new 
HashMap<String,NavigationItem>();
+        final NavigationItem navigationItem = new 
BasicNavigationItem(NAVIGATION_TITLE, NAVIGATION_URL, NAVIGATION_HIT_COUNT);
+        navigation.put(NAVIGATION_KEY, navigationItem);
+        
+        final NavigationDataObject navigationDO = factory.instantiate(
+                NavigationDataObject.class,
+                new DataObject.Property("configuration", 
navigationConfiguration),
+                new DataObject.Property("navigations", navigation));
+        datamodel.setNavigation(navigationDO);
+      
+        final ParametersDataObject parametersDO = factory.instantiate(
+                ParametersDataObject.class);
+        datamodel.setParameters(parametersDO);
+     
+        final User user = new User() {};
+        
+        final UserDataObject userDO = factory.instantiate(
+                UserDataObject.class,
+                new DataObject.Property("user", user));
+        datamodel.setUser(userDO);
+        
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        final ObjectOutputStream os = new ObjectOutputStream(baos);
+        
+        LOG.info("Serializing datamodel");
+        os.writeObject(datamodel);
+        
+        final ByteArrayInputStream bais = new 
ByteArrayInputStream(baos.toByteArray());
+        final ObjectInputStream is = new ObjectInputStream(bais);
+        
+        LOG.info("De-serializing datamodel");
+        final DataModel datamodel2 = (DataModel) is.readObject();
+        
+        assert datamodel2 != null : "is.readObject() returned NULL";
+        LOG.info("Datamodel: OK");
+        
+        final SiteDataObject siteDO2 = datamodel2.getSite();
+        assert siteDO2 != null : "siteDO2 == null";
+        
+        final Site site2 = siteDO2.getSite();
+        assert site2 != null : "site2 == null";
+        
+        assert site.getName().equals(site2.getName()) : "Expected: '" + 
site.getName() + "', got: '" + site2.getName() + "'";
+        assert site.getConfigContext().equals(site2.getConfigContext()) : 
"Expected: '" + site.getConfigContext() + "', got: '" + site2.getName() + "'";
+        assert site.getTemplateDir().equals(site2.getTemplateDir()) : 
"Expected: '" + site.getTemplateDir() + "', got: '" + site2.getTemplateDir() + 
"'";
+        
+        LOG.info("Site: OK");
+        
+        assert datamodel2.getJunkYard() != null : "getJunkYard() returned 
NULL";
+        
+        assert datamodel2.getJunkYard() instanceof JunkYardDataObject
+                : "expected getJunkYard() to return instance of 
JunkYardObject, instead it returned: "
+                + datamodel2.getJunkYard().toString();
+        
+        final JunkYardDataObject junkYardDO2 = datamodel2.getJunkYard();
+        
+        assert JUNK_YARD_VALUE.equals(junkYardDO2.getValue(JUNK_YARD_KEY)) : 
"Expected: '" + JUNK_YARD_VALUE + "', got: '" + 
junkYardDO2.getValue(JUNK_YARD_KEY) + "'";
+        LOG.info("Junk yard: OK");
+        
+        assert datamodel2.getSearch(SEARCH_KEY) != null : 
"datamodel2.getSearch(\"" + SEARCH_KEY + "\") == null";
+        LOG.info("Search: OK");
+        
+        assert datamodel2.getNavigation() != null : 
"datamodel2.getNavigation() == null";
+        
+        final Map<String,NavigationItem> navigation2 = 
datamodel2.getNavigation().getNavigations();
+        assert navigation2.get(NAVIGATION_KEY) != null : "navigation2.get(" + 
NAVIGATION_KEY + ") == null";
+        
+        final NavigationItem navigationItem2 = navigation2.get(NAVIGATION_KEY);
+        assert navigationItem2.getTitle().equals(NAVIGATION_TITLE) : 
"Expected: '" + NAVIGATION_TITLE + "', got: '" + navigationItem2.getTitle() + 
"'";
+        assert navigationItem2.getUrl().equals(NAVIGATION_URL) : "Expected: '" 
+ NAVIGATION_URL + "', got: '" + navigationItem2.getUrl() + "'";
+        assert navigationItem2.getHitCount() == NAVIGATION_HIT_COUNT : 
"Expected: '" + NAVIGATION_HIT_COUNT + "', got: '" + 
navigationItem2.getHitCount() + "'";
+        
+        LOG.info("Navigation: OK");
+        
+        assert datamodel2.getQuery() != null : "datamodel2.getQuery()";
+    
+        final Query query2 = datamodel2.getQuery().getQuery();
+        assert query2.getQueryString().equals(QUERY_STRING) : "Expected: '" + 
QUERY_STRING + "', got: '" + query2.getQueryString() + "'";
+       
+        LOG.info("Query: OK");
+        
+        final BrowserDataObject browserDO2 = datamodel2.getBrowser();
+        assert browserDO2 != null : "browserDO2 == null";
+        assert browserDO2.getUserAgent().getString().equals(USER_AGENT) : 
"Expected: '" + USER_AGENT + "', got: '" + 
browserDO2.getUserAgent().getString();
+        
+        LOG.info("Browser: OK");
+        
+        final ParametersDataObject parametersDO2 = datamodel2.getParameters();
+        assert parametersDO2 != null : "parametersDO2 == null";
+      
+        LOG.info("Parameters: OK");
+        
+        final UserDataObject userDO2 = datamodel2.getUser();
+        assert userDO2 != null : "userDO2 == null";
+        LOG.info("User: OK");
+    }
+    
+    protected Site.Context getSiteConstructingContext(){
+        
+        return new Context(){
+            public String getParentSiteName(final SiteContext siteContext){
+                // we have to do this manually instead of using 
SiteConfiguration,
+                //  because SiteConfiguration relies on the parent site that 
we haven't get initialised.
+                // That is, the PARENT_SITE_KEY property MUST be explicit in 
the site's configuration.properties.
+                final Properties props = new Properties();
+                final PropertiesLoader loader
+                        = TestResourceLoader.newPropertiesLoader(siteContext, 
Site.CONFIGURATION_FILE, props);
+                loader.abut();
+                return props.getProperty(Site.PARENT_SITE_KEY);
+            }
+        };
+    }
+    
+    protected Site getTestingSite(){
+        
+        final String basedir = "localhost";
+        return Site.valueOf(
+                getSiteConstructingContext(),
+                basedir,
+                Locale.getDefault());
+    }    
+
+}
+
+class TestResourceLoader extends FileResourceLoader {
+    
+    private static final Logger LOG = 
Logger.getLogger(TestResourceLoader.class);
+    
+    protected TestResourceLoader(final SiteContext cxt) {
+        super(cxt);
+    }
+    
+    public static PropertiesLoader newPropertiesLoader(
+            final SiteContext siteCxt,
+            final String resource,
+            final Properties properties) {
+        
+        final PropertiesLoader pl = new TestResourceLoader(siteCxt);
+        return pl;
+    }
+    
+    @Override
+    public void init(final String resource, final Properties properties) {}
+    
+    private static final Properties props = new Properties();
+    static {
+        props.setProperty(Site.DEFAULT_SITE_LOCALE_KEY, "no");
+        props.setProperty("sesam.datamodel.impl", 
"no.schibstedsok.searchportal.datamodel.DataModelFactoryImpl");
+        props.setProperty(Site.DEFAULT_SERVER_PORT_KEY, "0");
+        props.setProperty(Site.DEFAULT_SITE_KEY, "localhost");
+        props.setProperty(Site.PARENT_SITE_KEY, "");
+    }
+    
+    @Override
+    public Properties getProperties() {
+        return props;
+    }
+    
+    @Override
+    public void abut() {}
+}

Added: trunk/data-model-javabean-impl/src/test/resources/core.properties
===================================================================
--- trunk/data-model-javabean-impl/src/test/resources/core.properties           
                (rev 0)
+++ trunk/data-model-javabean-impl/src/test/resources/core.properties   
2007-06-26 14:23:05 UTC (rev 5433)
@@ -0,0 +1,12 @@
+## These properties are needed beyond the SiteSearch architecture
+##  Everything else should be loaded (overrided) from the 
search-front-config's configuration.properties
+
+# The server's port. Can be 0 for development.
+server.port=0
+
+# Default Site. See no.schibstedsok.searchportal.site.Site.java
+site.default=generic.sesam
+site.default.locale.default=no
+
+sesam.datamodel.impl=no.schibstedsok.searchportal.datamodel.DataModelFactoryImpl
+

Modified: 
trunk/query-api/src/main/java/no/schibstedsok/searchportal/query/Query.java
===================================================================
--- trunk/query-api/src/main/java/no/schibstedsok/searchportal/query/Query.java 
2007-06-26 13:53:17 UTC (rev 5432)
+++ trunk/query-api/src/main/java/no/schibstedsok/searchportal/query/Query.java 
2007-06-26 14:23:05 UTC (rev 5433)
@@ -3,6 +3,7 @@
  */
 package no.schibstedsok.searchportal.query;
 
+import java.io.Serializable;
 import no.schibstedsok.searchportal.query.finder.ParentFinder;
 import no.schibstedsok.searchportal.query.token.TokenEvaluationEngine;
 
@@ -14,7 +15,7 @@
  * @version $Id$
  * @author <a href="mailto:[EMAIL PROTECTED]">Michael Semb Wever</a>
  */
-public interface Query {
+public interface Query extends Serializable {
 
     /** The root clause to the clause heirarchy.
      * Will always be an operation clause if more than one term exists in the 
query.

Modified: 
trunk/query-api/src/main/java/no/schibstedsok/searchportal/query/Visitable.java
===================================================================
--- 
trunk/query-api/src/main/java/no/schibstedsok/searchportal/query/Visitable.java 
    2007-06-26 13:53:17 UTC (rev 5432)
+++ 
trunk/query-api/src/main/java/no/schibstedsok/searchportal/query/Visitable.java 
    2007-06-26 14:23:05 UTC (rev 5433)
@@ -9,6 +9,7 @@
 
 package no.schibstedsok.searchportal.query;
 
+import java.io.Serializable;
 
 /** Interface for Classes that will implement the Visitor pattern.
  * See complimentary Visitor interface.
@@ -16,7 +17,7 @@
  * @version $Id$
  * @author <a href="mailto:[EMAIL PROTECTED]">Michael Semb Wever</a>
  */
-public interface Visitable {
+public interface Visitable extends Serializable {
 
     /** Method to accept a visitor.
      * This method usually doesn't do more than

Modified: 
trunk/query-api/src/main/java/no/schibstedsok/searchportal/query/Visitor.java
===================================================================
--- 
trunk/query-api/src/main/java/no/schibstedsok/searchportal/query/Visitor.java   
    2007-06-26 13:53:17 UTC (rev 5432)
+++ 
trunk/query-api/src/main/java/no/schibstedsok/searchportal/query/Visitor.java   
    2007-06-26 14:23:05 UTC (rev 5433)
@@ -3,13 +3,15 @@
  */
 package no.schibstedsok.searchportal.query;
 
+import java.io.Serializable;
+
 /** Interface for Classes that will implement the Visitor pattern.
  * See complimentary Visitable interface.
  *
  * @version $Id$
  * @author <a href="mailto:[EMAIL PROTECTED]">Michael Semb Wever</a>
  */
-public interface Visitor {
+public interface Visitor extends Serializable {
 
     /** Method to hold implementation for what the visitor is supposed to do 
to the clause object.
      *

Modified: 
trunk/query-api/src/main/java/no/schibstedsok/searchportal/query/parser/AbstractClause.java
===================================================================
--- 
trunk/query-api/src/main/java/no/schibstedsok/searchportal/query/parser/AbstractClause.java
 2007-06-26 13:53:17 UTC (rev 5432)
+++ 
trunk/query-api/src/main/java/no/schibstedsok/searchportal/query/parser/AbstractClause.java
 2007-06-26 14:23:05 UTC (rev 5433)
@@ -161,10 +161,15 @@
     /** You must use <CODE>AbstractClause(String, Set&lt;Predicate&gt;, 
Set&lt;Predicate&gt;)</CODE> instead.
      * This constructor will throw an IllegalArgumentException.
      **/
+//    protected AbstractClause() {
+//        throw new 
IllegalArgumentException(ERR_MUST_ALWAYS_USE_ARGED_CONSTRUCTOR);
+//    }
+    /** We need a no-argument constructor for serialization. */
     protected AbstractClause() {
-        throw new 
IllegalArgumentException(ERR_MUST_ALWAYS_USE_ARGED_CONSTRUCTOR);
+        this.term = null;
+        this.knownPredicates = null;
+        this.possiblePredicates = null;
     }
-
     /**
      * Create clause with the given term, known and possible predicates.
      * @param term the term (query string) for this clause.

Modified: 
trunk/query-api/src/main/java/no/schibstedsok/searchportal/query/token/TokenEvaluationEngine.java
===================================================================
--- 
trunk/query-api/src/main/java/no/schibstedsok/searchportal/query/token/TokenEvaluationEngine.java
   2007-06-26 13:53:17 UTC (rev 5432)
+++ 
trunk/query-api/src/main/java/no/schibstedsok/searchportal/query/token/TokenEvaluationEngine.java
   2007-06-26 14:23:05 UTC (rev 5433)
@@ -3,6 +3,7 @@
  */
 package no.schibstedsok.searchportal.query.token;
 
+import java.io.Serializable;
 import java.util.Set;
 import no.schibstedsok.commons.ioc.BaseContext;
 import no.schibstedsok.searchportal.query.Clause;
@@ -31,7 +32,7 @@
     public interface Context extends BaseContext, QueryStringContext, 
ResourceContext, SiteContext{
     }
 
-    public interface State{
+    public interface State extends Serializable {
         /** the current clause's term, or null if in query-evaluation mode. **/
         String getTerm();
         /** the current query, or null if in term-evaluation mode. **/

Modified: 
trunk/search-command-config-spi/src/main/java/no/schibstedsok/searchportal/mode/NavigationConfig.java
===================================================================
--- 
trunk/search-command-config-spi/src/main/java/no/schibstedsok/searchportal/mode/NavigationConfig.java
       2007-06-26 13:53:17 UTC (rev 5432)
+++ 
trunk/search-command-config-spi/src/main/java/no/schibstedsok/searchportal/mode/NavigationConfig.java
       2007-06-26 14:23:05 UTC (rev 5433)
@@ -1,5 +1,6 @@
 package no.schibstedsok.searchportal.mode;
 
+import java.io.Serializable;
 import no.schibstedsok.searchportal.site.config.AbstractDocumentFactory;
 import static 
no.schibstedsok.searchportal.site.config.AbstractDocumentFactory.ParseType;
 import org.apache.log4j.Logger;
@@ -28,7 +29,7 @@
  * @author Geir H. Pettersen(T-Rank)
  * @version $Id$
  */
-public final class NavigationConfig{
+public final class NavigationConfig implements Serializable {
 
     private static final Logger LOG = Logger.getLogger(NavigationConfig.class);
 

Modified: 
trunk/search-command-config-spi/src/main/java/no/schibstedsok/searchportal/mode/config/SearchConfiguration.java
===================================================================
--- 
trunk/search-command-config-spi/src/main/java/no/schibstedsok/searchportal/mode/config/SearchConfiguration.java
     2007-06-26 13:53:17 UTC (rev 5432)
+++ 
trunk/search-command-config-spi/src/main/java/no/schibstedsok/searchportal/mode/config/SearchConfiguration.java
     2007-06-26 14:23:05 UTC (rev 5433)
@@ -4,6 +4,7 @@
  */
 package no.schibstedsok.searchportal.mode.config;
 
+import java.io.Serializable;
 import no.schibstedsok.searchportal.query.transform.QueryTransformerConfig;
 import no.schibstedsok.searchportal.result.handler.ResultHandlerConfig;
 
@@ -15,8 +16,7 @@
  * @author <a href="mailto:[EMAIL PROTECTED]">Magnus Eklund</a>
  * @version <tt>$Id$</tt>
  */
-public interface SearchConfiguration {
-
+public interface SearchConfiguration extends Serializable {
     /**
      * Returns a (defensive copy) list of [EMAIL PROTECTED] 
no.schibstedsok.searchportal.query.transform.QueryTransformer} that should be 
applied to
      * the query before the query is sent to search indices.

Modified: 
trunk/site-spi/src/main/java/no/schibstedsok/searchportal/site/Site.java
===================================================================
--- trunk/site-spi/src/main/java/no/schibstedsok/searchportal/site/Site.java    
2007-06-26 13:53:17 UTC (rev 5432)
+++ trunk/site-spi/src/main/java/no/schibstedsok/searchportal/site/Site.java    
2007-06-26 14:23:05 UTC (rev 5433)
@@ -10,6 +10,7 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.Serializable;
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
@@ -27,7 +28,7 @@
  * @version $Id$
  * @author <a href="mailto:[EMAIL PROTECTED]">Michael Semb Wever</a>
  */
-public final class Site {
+public final class Site implements Serializable {
 
     /** Not to be confused with the SiteContext.
      * This is a Context required for constructing a Site.
@@ -82,6 +83,15 @@
     */
     private final Site parent;
 
+    /** No-argument constructor for deserialization. */
+    private Site() {
+        siteName = null;
+        cxtName = null;
+        locale = Locale.getDefault();
+        uniqueName = null;
+        parent = null;
+    }
+    
     /** Creates a new instance of Site.
      * A null Context will result in a parentSiteName == siteName
      */

Modified: 
trunk/site-spi/src/main/java/no/schibstedsok/searchportal/site/config/SiteConfiguration.java
===================================================================
--- 
trunk/site-spi/src/main/java/no/schibstedsok/searchportal/site/config/SiteConfiguration.java
        2007-06-26 13:53:17 UTC (rev 5432)
+++ 
trunk/site-spi/src/main/java/no/schibstedsok/searchportal/site/config/SiteConfiguration.java
        2007-06-26 14:23:05 UTC (rev 5433)
@@ -1,6 +1,7 @@
 // Copyright (2006) Schibsted Søk AS
 package no.schibstedsok.searchportal.site.config;
 
+import java.io.Serializable;
 import no.schibstedsok.commons.ioc.BaseContext;
 import no.schibstedsok.searchportal.site.Site;
 import no.schibstedsok.searchportal.site.SiteContext;
@@ -20,7 +21,7 @@
  * @author <a href="mailto:[EMAIL PROTECTED]">Magnus Eklund</a>
  * @version $Id$
  */
-public final class SiteConfiguration implements SiteKeyedFactory {
+public final class SiteConfiguration implements SiteKeyedFactory, Serializable 
{
 
     public static final String NAME_KEY = "SiteConfiguration";
     /**
@@ -47,7 +48,7 @@
     public static final String ALLOW_LIST = "site.allow";
     public static final String DISALLOW_LIST = "site.disallow";
     
-    public interface Context extends BaseContext, PropertiesContext, 
SiteContext {
+    public interface Context extends BaseContext, PropertiesContext, 
SiteContext, Serializable {
     }
 
     private final Properties properties = new Properties();
@@ -59,6 +60,11 @@
 
     private static final Logger LOG = 
Logger.getLogger(SiteConfiguration.class);
 
+    /** No-argument constructor for deserialization. */
+    private SiteConfiguration() {
+        context = null;
+    }
+    
     private SiteConfiguration(final Context cxt) {
 
         try {

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

Reply via email to