You are viewing a plain text version of this content. The canonical link for it is here.
Posted to wadi-commits@incubator.apache.org by bd...@apache.org on 2005/12/14 23:36:16 UTC
svn commit: r356933 [14/35] - in /incubator/wadi/trunk: ./ etc/ modules/
modules/assembly/ modules/assembly/src/ modules/assembly/src/bin/
modules/assembly/src/conf/ modules/assembly/src/main/
modules/assembly/src/main/assembly/ modules/core/ modules/c...
Added: incubator/wadi/trunk/modules/core/src/main/java/org/codehaus/wadi/impl/StreamingMigratingRelocater.java
URL: http://svn.apache.org/viewcvs/incubator/wadi/trunk/modules/core/src/main/java/org/codehaus/wadi/impl/StreamingMigratingRelocater.java?rev=356933&view=auto
==============================================================================
--- incubator/wadi/trunk/modules/core/src/main/java/org/codehaus/wadi/impl/StreamingMigratingRelocater.java (added)
+++ incubator/wadi/trunk/modules/core/src/main/java/org/codehaus/wadi/impl/StreamingMigratingRelocater.java Wed Dec 14 15:32:56 2005
@@ -0,0 +1,73 @@
+/**
+ *
+ * Copyright 2003-2005 Core Developers Network Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.codehaus.wadi.impl;
+
+import org.codehaus.wadi.Immoter;
+import org.codehaus.wadi.InvocationContext;
+import org.codehaus.wadi.InvocationException;
+import org.codehaus.wadi.RelocaterConfig;
+import org.codehaus.wadi.SessionRelocater;
+
+import EDU.oswego.cs.dl.util.concurrent.Sync;
+
+public class StreamingMigratingRelocater implements SessionRelocater {
+
+ public StreamingMigratingRelocater() {
+ super();
+ }
+
+ protected RelocaterConfig _config;
+
+ public void init(RelocaterConfig config) {
+ _config=config;
+ }
+
+ public void destroy() {
+ _config=null;
+ }
+
+ public boolean relocate(InvocationContext invocationContext, String name, Immoter immoter, Sync motionLock) throws InvocationException {
+ // check cache
+ //Server server=_config.getServer();
+
+ // repeat ...
+
+ //boolean sessionMoves=true;
+
+ //Location location;
+ //if (!sessionMoves && (location=(Location)locationMap.get(name))!=null) {
+ // if cache is fresh (i.e. holds a location) && lock required is 'R'
+ // p2p to known location with last known timestamp stating 'R' lock needed
+ // response is one of - don't know, newer location, lock-acquired
+ // if still no success fall through to else...
+ //}
+
+ // else - (cache is stale or 'W' lock required)
+ // p2n to whole cluster with last known timestamp stating r or w lock needed
+ // responses are one of: newer location, lock-acquired
+
+ // until either;
+ // you receive a lock-acquired (success)
+ // or:
+ // you cease to be told of fresher locations (fail)
+
+ // update our location cache on each iteration...
+
+ return false;
+ }
+
+}
Added: incubator/wadi/trunk/modules/core/src/main/java/org/codehaus/wadi/impl/TimeToLiveEvicter.java
URL: http://svn.apache.org/viewcvs/incubator/wadi/trunk/modules/core/src/main/java/org/codehaus/wadi/impl/TimeToLiveEvicter.java?rev=356933&view=auto
==============================================================================
--- incubator/wadi/trunk/modules/core/src/main/java/org/codehaus/wadi/impl/TimeToLiveEvicter.java (added)
+++ incubator/wadi/trunk/modules/core/src/main/java/org/codehaus/wadi/impl/TimeToLiveEvicter.java Wed Dec 14 15:32:56 2005
@@ -0,0 +1,39 @@
+/**
+ *
+ * Copyright 2003-2005 Core Developers Network Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.codehaus.wadi.impl;
+
+import org.codehaus.wadi.Evictable;
+
+/**
+ * An Evicter which also evicts Evictables with less than a certain time to live remaining.
+ * For example, using this Evicter, you could evict sessions with less than 30 minutes of time left.
+ *
+ * @author <a href="mailto:jules@coredevelopers.net">Jules Gosnell</a>
+ * @version $Revision: 1.1 $
+ */
+public class TimeToLiveEvicter extends AbstractBestEffortEvicter {
+ protected final long _ttl;
+
+ public TimeToLiveEvicter(int sweepInterval, boolean strictOrdering, int ttl) {
+ super(sweepInterval, strictOrdering);
+ _ttl=ttl*1000;
+ }
+
+ public boolean test(Evictable evictable, long time, long ttl) {
+ return ttl<=_ttl;
+ }
+}
Added: incubator/wadi/trunk/modules/core/src/main/java/org/codehaus/wadi/impl/TomcatSessionIdFactory.java
URL: http://svn.apache.org/viewcvs/incubator/wadi/trunk/modules/core/src/main/java/org/codehaus/wadi/impl/TomcatSessionIdFactory.java?rev=356933&view=auto
==============================================================================
--- incubator/wadi/trunk/modules/core/src/main/java/org/codehaus/wadi/impl/TomcatSessionIdFactory.java (added)
+++ incubator/wadi/trunk/modules/core/src/main/java/org/codehaus/wadi/impl/TomcatSessionIdFactory.java Wed Dec 14 15:32:56 2005
@@ -0,0 +1,417 @@
+/**
+ *
+ * Copyright 2003-2005 Core Developers Network Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// TODO - how do I license this file ?
+
+/*
+ *
+ * ====================================================================
+ *
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ * [Additional notices, if required by prior licensing conditions]
+ *
+ */
+
+// this class has been put together from code taken from Tomcat5
+// org.apache.catalina.session.ManagerBase. When I have the time, I
+// will invetigate UID generation and write my own generator...
+
+// How hard can it be to generate a secure session id ? :-)
+
+package org.codehaus.wadi.impl;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.codehaus.wadi.SessionIdFactory;
+
+import java.io.DataInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.security.AccessController;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivilegedAction;
+import java.util.Random;
+
+/**
+ * An IdGenerator borrowed from Tomcat
+ *
+ * @author <a href="mailto:jules@coredevelopers.net">Jules Gosnell</a>
+ * @version $Revision: 1.5 $
+ */
+public class TomcatSessionIdFactory
+ implements SessionIdFactory
+ {
+ protected final Log _log = LogFactory.getLog(getClass());
+
+ public String create() {
+ String id=generateSessionId();
+ if (log.isTraceEnabled()) log.trace("generated: "+id);
+ return id;
+ }
+
+ public int getSessionIdLength() {
+ return 32;
+ }
+
+ public void setSessionIdLength(int l) {
+ if (l!=getSessionIdLength())
+ if (_log.isWarnEnabled()) _log.warn("session id length is not a writeable attribute - ignoring new setting: " + l);
+ }
+
+// // we should be able to better than this - can't we work out the
+// // size of the ID ?
+// public String
+// getId(String idId, String idRoute)
+// {
+// return idId+"."+idRoute;
+// }
+
+// public String
+// getIdId(String id)
+// {
+// int index=id.indexOf('.');
+// return index<0?id:id.substring(0,index);
+// }
+
+// public String
+// getIdRoute(String id)
+// {
+// int index=id.indexOf('.');
+// return index<0?null:id.substring(index+1,id.length());
+// }
+
+ //------------------------------------------------
+ // integration layer..
+ //------------------------------------------------
+
+ protected final Log log=LogFactory.getLog(getClass());
+
+ class StringManager
+ {
+ String getString(String s){return s;}
+ String getString(String s, String a){return "["+a+"]: "+s;}
+ }
+
+ protected StringManager sm=new StringManager();
+
+ class Support
+ {
+ void firePropertyChange(String s, Object oldVal, Object newVal){} // TODO - do we really need this ?
+ }
+
+ protected Support support=new Support();
+
+ //------------------------------------------------
+ // everything below this line borrowed from Tomcat
+ //------------------------------------------------
+
+ protected DataInputStream randomIS=null;
+ protected String devRandomSource="/dev/urandom";
+
+ /**
+ * The default message digest algorithm to use if we cannot use
+ * the requested one.
+ */
+ protected static final String DEFAULT_ALGORITHM = "MD5";
+
+ /**
+ * The number of random bytes to include when generating a
+ * session identifier.
+ */
+ protected static final int SESSION_ID_BYTES = 16;
+
+ /**
+ * The message digest algorithm to be used when generating session
+ * identifiers. This must be an algorithm supported by the
+ * <code>java.security.MessageDigest</code> class on your platform.
+ */
+ protected String algorithm = DEFAULT_ALGORITHM;
+
+ /**
+ * Return the MessageDigest implementation to be used when
+ * creating session identifiers.
+ */
+ protected MessageDigest digest = null;
+
+ /**
+ * A random number generator to use when generating session identifiers.
+ */
+ protected Random random = null;
+
+ /**
+ * The Java class name of the random number generator class to be used
+ * when generating session identifiers.
+ */
+ protected String randomClass = "java.security.SecureRandom";
+
+ /**
+ * A String initialization parameter used to increase the entropy of
+ * the initialization of our random number generator.
+ */
+ protected String entropy = null;
+
+ /**
+ * Return the entropy increaser value, or compute a semi-useful value
+ * if this String has not yet been set.
+ */
+ public String getEntropy() {
+
+ // Calculate a semi-useful value if this has not been set
+ if (this.entropy == null)
+ setEntropy(this.toString());
+
+ return (this.entropy);
+
+ }
+
+ /**
+ * Set the entropy increaser value.
+ *
+ * @param entropy The new entropy increaser value
+ */
+ public void setEntropy(String entropy) {
+
+ String oldEntropy = entropy;
+ this.entropy = entropy;
+ support.firePropertyChange("entropy", oldEntropy, this.entropy);
+
+ }
+
+ /**
+ * Return the random number generator instance we should use for
+ * generating session identifiers. If there is no such generator
+ * currently defined, construct and seed a new one.
+ */
+ public synchronized Random getRandom() {
+ if (this.random == null) {
+ synchronized (this) {
+ if (this.random == null) {
+ // Calculate the new random number generator seed
+ long seed = System.currentTimeMillis();
+ //long t1 = seed;
+ char entropy[] = getEntropy().toCharArray();
+ for (int i = 0; i < entropy.length; i++) {
+ long update = ((byte) entropy[i]) << ((i % 8) * 8);
+ seed ^= update;
+ }
+ try {
+ // Construct and seed a new random number generator
+ Class clazz = Class.forName(randomClass);
+ this.random = (Random) clazz.newInstance();
+ this.random.setSeed(seed);
+ } catch (Exception e) {
+ // Fall back to the simple case
+ log.error(sm.getString("managerBase.random", randomClass), e);
+ this.random = new java.util.Random();
+ this.random.setSeed(seed);
+ }
+// long t2=System.currentTimeMillis();
+// if( (t2-t1) > 100 )
+// if (log.isTraceEnabled())
+// log.trace(sm.getString("managerBase.seeding", randomClass) + " " + (t2-t1));
+ }
+ }
+ }
+
+ return (this.random);
+
+ }
+
+ private class PrivilegedSetRandomFile implements PrivilegedAction{
+
+ public Object run(){
+ try {
+ File f=new File( devRandomSource );
+ if( ! f.exists() ) return null;
+ randomIS= new DataInputStream( new FileInputStream(f));
+ randomIS.readLong();
+// if( log.isTraceEnabled() )
+// log.trace( "Opening " + devRandomSource );
+ return randomIS;
+ } catch (IOException ex){
+ return null;
+ }
+ }
+ }
+
+ /** Use /dev/random-type special device. This is new code, but may reduce the
+ * big delay in generating the random.
+ *
+ * You must specify a path to a random generator file. Use /dev/urandom
+ * for linux ( or similar ) systems. Use /dev/random for maximum security
+ * ( it may block if not enough "random" exist ). You can also use
+ * a pipe that generates random.
+ *
+ * The code will check if the file exists, and default to java Random
+ * if not found. There is a significant performance difference, very
+ * visible on the first call to getSession ( like in the first JSP )
+ * - so use it if available.
+ */
+ public void setRandomFile( String s ) {
+ // as a hack, you can use a static file - and genarate the same
+ // session ids ( good for strange traceging )
+ if (System.getSecurityManager() != null){
+ randomIS = (DataInputStream)AccessController.doPrivileged(new PrivilegedSetRandomFile());
+ } else {
+ try{
+ devRandomSource=s;
+ File f=new File( devRandomSource );
+ if( ! f.exists() ) return;
+ randomIS= new DataInputStream( new FileInputStream(f));
+ randomIS.readLong();
+// if( log.isTraceEnabled() )
+// log.trace( "Opening " + devRandomSource );
+ } catch( IOException ex ) {
+ randomIS=null;
+ }
+ }
+ }
+
+ /**
+ * Generate and return a new session identifier.
+ */
+ protected synchronized String generateSessionId() {
+ byte bytes[] = new byte[SESSION_ID_BYTES];
+ getRandomBytes( bytes );
+ bytes = getDigest().digest(bytes);
+
+ // Render the result as a String of hexadecimal digits
+ StringBuffer result = new StringBuffer();
+ for (int i = 0; i < bytes.length; i++) {
+ byte b1 = (byte) ((bytes[i] & 0xf0) >> 4);
+ byte b2 = (byte) (bytes[i] & 0x0f);
+ if (b1 < 10)
+ result.append((char) ('0' + b1));
+ else
+ result.append((char) ('A' + (b1 - 10)));
+ if (b2 < 10)
+ result.append((char) ('0' + b2));
+ else
+ result.append((char) ('A' + (b2 - 10)));
+ }
+ return (result.toString());
+
+ }
+
+ /**
+ * Return the MessageDigest object to be used for calculating
+ * session identifiers. If none has been created yet, initialize
+ * one the first time this method is called.
+ */
+ public synchronized MessageDigest getDigest() {
+
+ if (this.digest == null) {
+ //long t1=System.currentTimeMillis();
+// if (log.isTraceEnabled())
+// log.trace(sm.getString("managerBase.getting", algorithm));
+ try {
+ this.digest = MessageDigest.getInstance(algorithm);
+ } catch (NoSuchAlgorithmException e) {
+ log.error(sm.getString("managerBase.digest", algorithm), e);
+ try {
+ this.digest = MessageDigest.getInstance(DEFAULT_ALGORITHM);
+ } catch (NoSuchAlgorithmException f) {
+ log.error(sm.getString("managerBase.digest", DEFAULT_ALGORITHM), e);
+ this.digest = null;
+ }
+ }
+// if (log.isTraceEnabled())
+// log.trace(sm.getString("managerBase.gotten"));
+// long t2=System.currentTimeMillis();
+// if( log.isTraceEnabled() )
+// log.trace("getDigest() " + (t2-t1));
+ }
+
+ return (this.digest);
+
+ }
+
+ protected void getRandomBytes( byte bytes[] ) {
+ // Generate a byte array containing a session identifier
+ if( devRandomSource!=null && randomIS==null ) {
+ setRandomFile( devRandomSource );
+ }
+ if(randomIS!=null ) {
+ try {
+ int len=randomIS.read( bytes );
+ if( len==bytes.length ) {
+ return;
+ }
+// if (log.isTraceEnabled())
+// log.trace("Got " + len + " " + bytes.length );
+ } catch( Exception ex ) {
+ }
+ devRandomSource=null;
+ randomIS=null;
+ }
+// Random random = getRandom();
+ getRandom().nextBytes(bytes);
+ }
+}
Added: incubator/wadi/trunk/modules/core/src/main/java/org/codehaus/wadi/impl/Utils.java
URL: http://svn.apache.org/viewcvs/incubator/wadi/trunk/modules/core/src/main/java/org/codehaus/wadi/impl/Utils.java?rev=356933&view=auto
==============================================================================
--- incubator/wadi/trunk/modules/core/src/main/java/org/codehaus/wadi/impl/Utils.java (added)
+++ incubator/wadi/trunk/modules/core/src/main/java/org/codehaus/wadi/impl/Utils.java Wed Dec 14 15:32:56 2005
@@ -0,0 +1,298 @@
+/**
+ *
+ * Copyright 2003-2005 Core Developers Network Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.codehaus.wadi.impl;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.activemq.ActiveMQConnectionFactory;
+import org.activemq.broker.impl.BrokerContainerFactoryImpl;
+import org.activemq.store.vm.VMPersistenceAdapter;
+import org.activemq.store.vm.VMPersistenceAdapterFactory;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.codehaus.wadi.Emoter;
+import org.codehaus.wadi.Immoter;
+import org.codehaus.wadi.Motable;
+import org.codehaus.wadi.SerializableContent;
+import org.codehaus.wadi.Streamer;
+
+import EDU.oswego.cs.dl.util.concurrent.Puttable;
+import EDU.oswego.cs.dl.util.concurrent.Sync;
+import EDU.oswego.cs.dl.util.concurrent.Takable;
+import EDU.oswego.cs.dl.util.concurrent.TimeoutException;
+
+/**
+ * A collection of useful static functions
+ *
+ * @author <a href="mailto:jules@coredevelopers.net">Jules Gosnell</a>
+ * @version $Revision: 1.7 $
+ */
+
+public class Utils {
+ protected static final Log _log=LogFactory.getLog(Utils.class);
+ protected static final Log _lockLog=LogFactory.getLog("org.codehaus.wadi.LOCKS");
+
+ /**
+ * Mote (in other words - move) the data held in a Motable from one Contextualiser to another, such
+ * that if the two Contextualisers store Motables in a persistant fashion, the data is never
+ * present in less than one of the two.
+ *
+ * @param emoter - delegate for the source Contextualiser
+ * @param immoter - delegate for the target Contextualiser
+ * @param emotable - data to be moved
+ * @param name - the id of said data
+ * @return - the resulting immotable - in other words - the data's new representation in the target Contextualiser
+ */
+ public static Motable mote(Emoter emoter, Immoter immoter, Motable emotable, String name) {
+ long startTime=System.currentTimeMillis();
+ Motable immotable=immoter.nextMotable(name, emotable);
+ boolean i=false;
+ boolean e=false;
+ if ((i=immoter.prepare(name, emotable, immotable)) &&(e=emoter.prepare(name, emotable, immotable))) {
+ immoter.commit(name, immotable);
+ emoter.commit(name, emotable);
+ long elapsedTime=System.currentTimeMillis()-startTime;
+ if (_log.isDebugEnabled())_log.debug("motion: "+name+" : "+emoter.getInfo()+" -> "+immoter.getInfo()+" ("+elapsedTime+" millis)");
+ return immotable;
+ } else {
+ if (e) emoter.rollback(name, emotable);
+ if (i) immoter.rollback(name, immotable);
+ long elapsedTime=System.currentTimeMillis()-startTime;
+ if (_log.isWarnEnabled()) _log.warn("motion failed: "+name+" : "+emoter.getInfo()+" -> "+immoter.getInfo()+" ("+elapsedTime+" millis)");
+ return null;
+ }
+ }
+
+ /**
+ * Ignore any interruptions whilst acquiring a lock.
+ *
+ * @param sync - the lock
+ * @throws TimeoutException - some Syncs (TimeoutSync) may timeout during acquisition
+ */
+ public static void acquireUninterrupted(Sync sync) throws TimeoutException {
+ do {
+ try {
+ sync.acquire();
+ } catch (TimeoutException e) {
+ Thread.interrupted(); // TODO - not sure if we need to clear the interrupted flag ?
+ throw e; // a TimeoutException isa InterruptedException
+ } catch (InterruptedException e) {
+ _log.trace("unexpected interruption - ignoring", e);
+ }
+ } while (Thread.interrupted());
+ }
+
+ public static void acquireUninterrupted(String lockType, String lockName, Sync sync) throws TimeoutException {
+ try {
+ do {
+ try {
+ if (_lockLog.isTraceEnabled()) _lockLog.trace(lockType+" - acquiring: "+lockName+" ["+Thread.currentThread().getName()+"]"+" : "+sync);
+ //sync.attempt(5000);
+ sync.acquire();
+ if (_lockLog.isTraceEnabled()) _lockLog.trace(lockType+" - acquired : "+lockName+" ["+Thread.currentThread().getName()+"]"+" : "+sync);
+ } catch (TimeoutException e) {
+ Thread.interrupted(); // TODO - not sure if we need to clear the interrupted flag ?
+ throw e; // a TimeoutException isa InterruptedException
+ } catch (InterruptedException e) {
+ _log.trace("unexpected interruption - ignoring", e);
+ }
+ } while (Thread.interrupted());
+ } catch (Exception e) {
+ if (_lockLog.isWarnEnabled()) _lockLog.warn(lockType+" - acquisition FAILED : "+lockName+" ["+Thread.currentThread().getName()+"]"+" : "+sync);
+ }
+ }
+
+ public static void release(String lockType, String lockName, Sync sync) {
+ if (_lockLog.isTraceEnabled()) _lockLog.trace(lockType+" - releasing: "+lockName+" ["+Thread.currentThread().getName()+"]"+" : "+sync);
+ sync.release();
+ if (_lockLog.isTraceEnabled()) _lockLog.trace(lockType+" - released : "+lockName+" ["+Thread.currentThread().getName()+"]"+" : "+sync);
+ }
+
+ /**
+ * If a lock is free, acquire it, ignoring any interruptions, else fail.
+ *
+ * @param sync - the lock
+ * @return - whether or not the lock was acquired
+ */
+ public static boolean attemptUninterrupted(String lockType, String lockName, Sync sync) {
+ boolean acquired=false;
+ do {
+ try {
+ if (_lockLog.isTraceEnabled()) _lockLog.trace(lockType+" - acquiring: "+lockName+" ["+Thread.currentThread().getName()+"]"+" : "+sync);
+ acquired=sync.attempt(0);
+ if (_lockLog.isTraceEnabled()) _lockLog.trace(lockType+" - acquired : "+lockName+" ["+Thread.currentThread().getName()+"]"+" : "+sync);
+ } catch (InterruptedException e) {
+ _log.trace("unexpected interruption - ignoring", e);
+ }
+ } while (Thread.interrupted());
+
+ if (!acquired)
+ if (_lockLog.isTraceEnabled()) _lockLog.trace(lockType+" - acquisition FAILED: "+lockName+" ["+Thread.currentThread().getName()+"]"+" : "+sync);
+
+ return acquired;
+ }
+
+ public static boolean attemptUninterrupted(Sync sync) {
+ boolean acquired=false;
+ do {
+ try {
+ acquired=sync.attempt(0);
+ } catch (InterruptedException e) {
+ _log.trace("unexpected interruption - ignoring", e);
+ }
+ } while (Thread.interrupted());
+ return acquired;
+ }
+
+ public static Object byteArrayToObject(byte[] bytes, Streamer streamer) throws IOException, ClassNotFoundException {
+ ByteArrayInputStream bais=new ByteArrayInputStream(bytes);
+ ObjectInput oi=streamer.getInputStream(bais);
+ Object tmp=oi.readObject(); // TODO - ClassLoading ?
+ oi.close();
+ return tmp;
+ }
+
+ public static Object safeByteArrayToObject(byte[] bytes, Streamer streamer) {
+ try {
+ return byteArrayToObject(bytes, streamer);
+ } catch (Exception e) {
+ _log.error("unexpected problem whilst unmarshalling", e);
+ return null;
+ }
+ }
+
+ public static byte[] objectToByteArray(Object object, Streamer streamer) throws IOException {
+ ByteArrayOutputStream baos=new ByteArrayOutputStream();
+ ObjectOutput oo=streamer.getOutputStream(baos);
+ oo.writeObject(object);
+ oo.close();
+ return baos.toByteArray();
+ }
+
+ public static byte[] safeObjectToByteArray(Object object, Streamer streamer) {
+ try {
+ return objectToByteArray(object, streamer);
+ } catch (Exception e) {
+ _log.error("unexpected problem whilst marshalling", e);
+ return null;
+ }
+ }
+
+ public static byte[] getContent(SerializableContent object, Streamer streamer) throws IOException {
+ ByteArrayOutputStream baos=new ByteArrayOutputStream();
+ ObjectOutput oo=streamer.getOutputStream(baos);
+ object.writeContent(oo);
+ oo.close();
+ return baos.toByteArray();
+ }
+
+ public static byte[] safeGetContent(SerializableContent object, Streamer streamer) {
+ try {
+ return getContent(object, streamer);
+ } catch (Exception e) {
+ _log.error("unexpected problem whilst marshalling", e);
+ return null;
+ }
+ }
+
+ public static SerializableContent setContent(SerializableContent object, byte[] content, Streamer streamer) throws IOException, ClassNotFoundException {
+ ByteArrayInputStream bais=new ByteArrayInputStream(content);
+ ObjectInput oi=streamer.getInputStream(bais);
+ object.readContent(oi);
+ oi.close();
+ return object;
+ }
+
+ public static SerializableContent safeSetContent(SerializableContent object, byte[] content, Streamer streamer) {
+ try {
+ return setContent(object, content, streamer);
+ } catch (Exception e) {
+ _log.error("unexpected problem whilst marshalling", e);
+ return null;
+ }
+ }
+
+ public static String getClusterUri() {
+ return "peer://org.codehaus.wadi";
+ }
+
+ // this should really be passed in the top somewhere - but the tests need access too...
+ public static ActiveMQConnectionFactory getConnectionFactory() {
+ ActiveMQConnectionFactory cf=new ActiveMQConnectionFactory(getClusterUri());
+ // ActiveMQConnectionFactory cf=new ActiveMQConnectionFactory("tcp://localhost:61616");
+ // _connectionFactory=new ActiveMQConnectionFactory("multicast://224.1.2.3:5123");
+ cf.setBrokerContainerFactory(new BrokerContainerFactoryImpl(new VMPersistenceAdapter())); // peer protocol seems to ignore this...
+ System.setProperty("activemq.persistenceAdapterFactory", VMPersistenceAdapterFactory.class.getName()); // peer protocol sees this
+ return cf;
+ }
+
+ public static void safePut(Object item, Puttable puttable) {
+ do {
+ try {
+ puttable.put(item);
+ } catch (InterruptedException e) {
+ if (_log.isTraceEnabled()) _log.trace("unexpected interruption - ignoring", e);
+ }
+ } while (Thread.interrupted());
+ }
+
+ public static Object safeTake(Takable takable) {
+ do {
+ try {
+ return takable.take();
+ } catch (InterruptedException e) {
+ if (_log.isTraceEnabled()) _log.trace("unexpected interruption - ignoring", e);
+ }
+ } while (Thread.interrupted());
+
+ throw new IllegalStateException();
+ }
+
+ public static void safeSleep(long period) {
+ long end=System.currentTimeMillis()+(period);
+ do {
+ try {
+ Thread.sleep(end-System.currentTimeMillis());
+ } catch (InterruptedException e) {
+ // ignore
+ }
+ } while (Thread.interrupted());
+ }
+
+ public static void safeAcquire(Sync sync) {
+ do {
+ try {
+ sync.acquire();
+ } catch (InterruptedException e) {
+ if (_log.isTraceEnabled()) _log.trace("unexpected interruption - ignoring", e);
+ }
+ } while (Thread.interrupted());
+ }
+
+ public static File createTempDirectory(String prefix, String suffix, File directory) throws IOException {
+ File dir=File.createTempFile(prefix, suffix, directory);
+ dir.delete();
+ dir.mkdir();
+ return dir;
+ }
+
+}
Added: incubator/wadi/trunk/modules/core/src/main/java/org/codehaus/wadi/impl/WebHybridRelocater.java
URL: http://svn.apache.org/viewcvs/incubator/wadi/trunk/modules/core/src/main/java/org/codehaus/wadi/impl/WebHybridRelocater.java?rev=356933&view=auto
==============================================================================
--- incubator/wadi/trunk/modules/core/src/main/java/org/codehaus/wadi/impl/WebHybridRelocater.java (added)
+++ incubator/wadi/trunk/modules/core/src/main/java/org/codehaus/wadi/impl/WebHybridRelocater.java Wed Dec 14 15:32:56 2005
@@ -0,0 +1,34 @@
+/**
+ *
+ * Copyright 2003-2005 Core Developers Network Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.codehaus.wadi.impl;
+
+import org.codehaus.wadi.InvocationContext;
+
+/**
+ * @version $Revision: 1.1 $
+ */
+public class WebHybridRelocater extends HybridRelocater {
+
+ public WebHybridRelocater(long resTimeout, long ackTimeout, boolean sessionOrRequestPreferred) {
+ super(resTimeout, ackTimeout, sessionOrRequestPreferred);
+ }
+
+ protected InvocationContext newRelocationInvocationContext() {
+ return WebInvocationContext.RELOCATED_INVOCATION;
+ }
+
+}
Added: incubator/wadi/trunk/modules/core/src/main/java/org/codehaus/wadi/impl/WebInvocationContext.java
URL: http://svn.apache.org/viewcvs/incubator/wadi/trunk/modules/core/src/main/java/org/codehaus/wadi/impl/WebInvocationContext.java?rev=356933&view=auto
==============================================================================
--- incubator/wadi/trunk/modules/core/src/main/java/org/codehaus/wadi/impl/WebInvocationContext.java (added)
+++ incubator/wadi/trunk/modules/core/src/main/java/org/codehaus/wadi/impl/WebInvocationContext.java Wed Dec 14 15:32:56 2005
@@ -0,0 +1,82 @@
+/**
+ *
+ * Copyright 2005 Core Developers Network Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.codehaus.wadi.impl;
+
+import javax.servlet.FilterChain;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.codehaus.wadi.InvocationContext;
+import org.codehaus.wadi.InvocationException;
+import org.codehaus.wadi.PoolableHttpServletRequestWrapper;
+import org.codehaus.wadi.PoolableInvocationWrapper;
+
+/**
+ * @version $Revision: 1.1 $
+ */
+public class WebInvocationContext implements InvocationContext {
+ public static final WebInvocationContext RELOCATED_INVOCATION = new WebInvocationContext(null, null, null);
+
+ private final HttpServletRequest hreq;
+ private final HttpServletResponse hres;
+ private final FilterChain chain;
+ private final boolean proxiedInvocation;
+
+ public WebInvocationContext(HttpServletRequest hreq, HttpServletResponse hres, FilterChain chain) {
+ this.hreq = hreq;
+ this.hres = hres;
+ this.chain = chain;
+ if (null == hreq) {
+ proxiedInvocation = true;
+ } else {
+ proxiedInvocation = false;
+ }
+ }
+
+ public FilterChain getChain() {
+ return chain;
+ }
+
+ public HttpServletRequest getHreq() {
+ return hreq;
+ }
+
+ public HttpServletResponse getHres() {
+ return hres;
+ }
+
+ public boolean isProxiedInvocation() {
+ return proxiedInvocation;
+ }
+
+ public void invoke(PoolableInvocationWrapper wrapper) throws InvocationException {
+ PoolableHttpServletRequestWrapper actualWrapper = (PoolableHttpServletRequestWrapper) wrapper;
+ try {
+ chain.doFilter(actualWrapper, hres);
+ } catch (Exception e) {
+ throw new InvocationException(e);
+ }
+ }
+
+ public void invoke() throws InvocationException {
+ try {
+ chain.doFilter(hreq, hres);
+ } catch (Exception e) {
+ throw new InvocationException(e);
+ }
+ }
+}
Added: incubator/wadi/trunk/modules/core/src/main/resources/DB.sql
URL: http://svn.apache.org/viewcvs/incubator/wadi/trunk/modules/core/src/main/resources/DB.sql?rev=356933&view=auto
==============================================================================
--- incubator/wadi/trunk/modules/core/src/main/resources/DB.sql (added)
+++ incubator/wadi/trunk/modules/core/src/main/resources/DB.sql Wed Dec 14 15:32:56 2005
@@ -0,0 +1,4 @@
+CREATE DATABASE WADI;
+CREATE TABLE SESSION_STORE(Name varchar(50), CreationTime long, LastAccessedTime long, MaxInactiveInterval int, Body varbinary(716800)) TYPE=INNODB;
+ALTER TABLE SESSION_STORE ADD INDEX (Name);
+
Added: incubator/wadi/trunk/modules/core/src/main/resources/org/codehaus/wadi/impl/wadiConfig.xml
URL: http://svn.apache.org/viewcvs/incubator/wadi/trunk/modules/core/src/main/resources/org/codehaus/wadi/impl/wadiConfig.xml?rev=356933&view=auto
==============================================================================
--- incubator/wadi/trunk/modules/core/src/main/resources/org/codehaus/wadi/impl/wadiConfig.xml (added)
+++ incubator/wadi/trunk/modules/core/src/main/resources/org/codehaus/wadi/impl/wadiConfig.xml Wed Dec 14 15:32:56 2005
@@ -0,0 +1,447 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+<beans>
+
+<!--
+This config sets up all the wadi stuff that is independent of the web container.
+
+It needs to be loaded after the following beans have been defined.
+
+SessionFactory - responsible for creating sessions for the particular container
+
+SessionWrapperFactory - responsible for creating session wrappers for the particular container
+-->
+
+ <bean
+ id="SessionPool"
+ class="org.codehaus.wadi.impl.SimpleSessionPool"
+ >
+ <constructor-arg><ref bean="SessionFactory"/></constructor-arg>
+ </bean>
+
+ <bean
+ id="AttributesFactory"
+ class="org.codehaus.wadi.impl.DistributableAttributesFactory"
+ >
+ </bean>
+
+ <bean
+ id="ValueFactory"
+ class="org.codehaus.wadi.impl.DistributableValueFactory"
+ >
+ </bean>
+
+ <bean
+ id="ValuePool"
+ class="org.codehaus.wadi.impl.SimpleValuePool"
+ >
+ <constructor-arg><ref bean="ValueFactory"/></constructor-arg>
+ </bean>
+
+ <bean
+ id="SessionIdFactory"
+ class="org.codehaus.wadi.impl.TomcatSessionIdFactory"
+ >
+ </bean>
+
+ <bean
+ id="AttributeStreamer"
+ class="org.codehaus.wadi.impl.SimpleStreamer"
+ >
+ </bean>
+
+ <!-- the Contextualiser stack...(shorthand for now) -->
+
+ <bean
+ id="MemoryMap"
+ class="EDU.oswego.cs.dl.util.concurrent.ConcurrentHashMap"
+ >
+ </bean>
+
+ <bean
+ id="DatabaseURL"
+ class="java.lang.String"
+ >
+ <constructor-arg><value>jdbc:axiondb:WADI</value></constructor-arg>
+ </bean>
+
+ <bean
+ id="DataSource"
+ class="org.axiondb.jdbc.AxionDataSource"
+ >
+ <constructor-arg><ref bean="DatabaseURL"/></constructor-arg>
+ </bean>
+
+ <bean
+ id="ContextPool"
+ class="org.codehaus.wadi.impl.SessionToContextPoolAdapter"
+ >
+ <constructor-arg><ref bean="SessionPool"/></constructor-arg>
+ </bean>
+
+<!--
+ <bean
+ id="Relocater"
+ class="org.codehaus.wadi.impl.MessagingMigratingRelocater"
+ >
+ <constructor-arg type="long" index="0"><value>5000</value></constructor-arg>
+ <constructor-arg type="long" index="1"><value>1000</value></constructor-arg>
+ </bean>
+
+ <bean
+ id="Relocater"
+ class="org.codehaus.wadi.impl.ProxyingRelocater"
+ >
+ <constructor-arg type="long" index="0"><value>5000</value></constructor-arg>
+ <constructor-arg type="long" index="1"><value>5000</value></constructor-arg>
+ </bean>
+-->
+
+ <bean
+ id="Relocater"
+ class="org.codehaus.wadi.impl.HybridRelocater"
+ >
+ <constructor-arg type="long" index="0"><value>5000</value></constructor-arg>
+ <constructor-arg type="long" index="1"><value>5000</value></constructor-arg>
+ <constructor-arg type="boolean" index="2"><value>true</value></constructor-arg><!-- relocate session, not request, if possible -->
+ </bean>
+
+ <!-- the contextualiser stack -->
+
+ <bean
+ id="SessionStreamer"
+ class="org.codehaus.wadi.impl.SimpleStreamer"
+ >
+ </bean>
+
+<!--
+ <bean
+ id="Collapser"
+ class="org.codehaus.wadi.impl.DebugCollapser"
+ >
+ </bean>
+-->
+
+ <bean
+ id="Collapser"
+ class="org.codehaus.wadi.impl.HashingCollapser"
+ >
+ <constructor-arg type="int"><value>1024</value></constructor-arg>
+ <constructor-arg type="long"><value>10000</value></constructor-arg>
+ </bean>
+
+ <bean
+ id="DummyContextualiser"
+ class="org.codehaus.wadi.impl.DummyContextualiser"
+ >
+ </bean>
+
+ <bean
+ id="DatabaseStore"
+ class="org.codehaus.wadi.impl.DatabaseStore"
+ >
+ <constructor-arg><ref bean="DatabaseURL"/></constructor-arg>
+ <constructor-arg><ref bean="DataSource"/></constructor-arg>
+ <constructor-arg><value>SESSIONS</value></constructor-arg>
+ <constructor-arg type="boolean"><value>false</value></constructor-arg>
+ <constructor-arg type="boolean"><value>false</value></constructor-arg><!-- reusingStore -->
+ <constructor-arg type="boolean"><value>true</value></constructor-arg><!-- build -->
+ </bean>
+
+ <bean
+ id="DatabaseContextualiser"
+ class="org.codehaus.wadi.impl.SharedStoreContextualiser"
+ >
+ <constructor-arg><ref bean="DummyContextualiser"/></constructor-arg>
+ <constructor-arg><ref bean="Collapser"/></constructor-arg>
+ <constructor-arg type="boolean"><value>true</value></constructor-arg>
+ <constructor-arg><ref bean="DatabaseStore"/></constructor-arg>
+ </bean>
+
+ <bean
+ id="ClusterContextualiser"
+ class="org.codehaus.wadi.impl.ClusterContextualiser"
+ >
+ <constructor-arg><ref bean="DatabaseContextualiser"/></constructor-arg>
+ <constructor-arg><ref bean="Collapser"/></constructor-arg>
+ <constructor-arg><ref bean="Relocater"/></constructor-arg>
+ </bean>
+
+ <bean
+ id="StatelessMethods"
+ class="java.util.regex.Pattern"
+ factory-method="compile"
+ >
+ <constructor-arg><value>GET|POST</value></constructor-arg>
+ <constructor-arg type="int"><value>2</value></constructor-arg><!-- Pattern.CASE_INSENSITIVE -->
+ </bean>
+
+ <bean
+ id="StatelessURIs"
+ class="java.util.regex.Pattern"
+ factory-method="compile"
+ >
+ <constructor-arg><value>.*\\.(JPG|JPEG|GIF|PNG|ICO|HTML|HTM)(|;jsessionid=.*)</value></constructor-arg>
+ <constructor-arg type="int"><value>2</value></constructor-arg><!-- Pattern.CASE_INSENSITIVE -->
+ </bean>
+
+ <bean
+ id="StatelessContextualiser"
+ class="org.codehaus.wadi.impl.StatelessContextualiser"
+ >
+ <constructor-arg><ref bean="ClusterContextualiser"/></constructor-arg>
+ <constructor-arg><ref bean="StatelessMethods"/></constructor-arg>
+ <constructor-arg type="boolean"><value>true</value></constructor-arg>
+ <constructor-arg><ref bean="StatelessURIs"/></constructor-arg>
+ <constructor-arg type="boolean"><value>false</value></constructor-arg>
+ </bean>
+
+ <bean
+ id="TmpDirectory"
+ class="java.io.File"
+ >
+ <constructor-arg><value>${java.io.tmpdir}</value></constructor-arg>
+ </bean>
+
+ <bean
+ id="DiscDirectory"
+ class="java.io.File"
+ >
+ <constructor-arg><ref bean="TmpDirectory"/></constructor-arg>
+ <constructor-arg><value>sessions</value></constructor-arg>
+ </bean>
+
+ <bean
+ id="DiscEvicter"
+ class="org.codehaus.wadi.impl.NeverEvicter"
+ >
+ <constructor-arg type="int"><value>20</value></constructor-arg><!-- sweep interval (millis) -->
+ <constructor-arg type="boolean"><value>true</value></constructor-arg><!-- strict ordering -->
+ </bean> <!-- sessions never pass below this point, unless the node is shutdown -->
+
+ <bean
+ id="DiscMap"
+ class="EDU.oswego.cs.dl.util.concurrent.ConcurrentHashMap"
+ >
+ </bean>
+
+ <bean
+ id="DiscContextualiser"
+ class="org.codehaus.wadi.impl.ExclusiveStoreContextualiser"
+ >
+ <constructor-arg><ref bean="StatelessContextualiser"/></constructor-arg>
+ <constructor-arg><ref bean="Collapser"/></constructor-arg>
+ <constructor-arg type="boolean"><value>true</value></constructor-arg>
+ <constructor-arg><ref bean="DiscEvicter"/></constructor-arg>
+ <constructor-arg><ref bean="DiscMap"/></constructor-arg>
+ <constructor-arg><ref bean="SessionStreamer"/></constructor-arg>
+ <constructor-arg><ref bean="DiscDirectory"/></constructor-arg>
+ </bean>
+
+ <bean
+ id="SerialContextualiser"
+ class="org.codehaus.wadi.impl.SerialContextualiser"
+ >
+ <constructor-arg><ref bean="DiscContextualiser"/></constructor-arg>
+ <constructor-arg><ref bean="Collapser"/></constructor-arg>
+ <constructor-arg><ref bean="MemoryMap"/></constructor-arg>
+ </bean>
+
+ <bean
+ id="MemoryEvicter"
+ class="org.codehaus.wadi.impl.AbsoluteEvicter"
+ >
+ <constructor-arg type="int"><value>10000</value></constructor-arg> <!-- sweep interval (millis) -->
+ <constructor-arg type="boolean"><value>true</value></constructor-arg> <!-- strict ordering -->
+ <constructor-arg type="int"><value>10</value></constructor-arg> <!-- inactivity interval (secs) -->
+ </bean>
+
+ <bean
+ id="RequestPool"
+ class="org.codehaus.wadi.impl.DummyStatefulHttpServletRequestWrapperPool"
+ >
+ </bean>
+
+ <bean
+ id="MemoryContextualiser"
+ class="org.codehaus.wadi.impl.MemoryContextualiser"
+ >
+ <constructor-arg><ref bean="SerialContextualiser"/></constructor-arg>
+ <constructor-arg><ref bean="MemoryEvicter"/></constructor-arg>
+ <constructor-arg><ref bean="MemoryMap"/></constructor-arg>
+ <constructor-arg><ref bean="SessionStreamer"/></constructor-arg>
+ <constructor-arg><ref bean="ContextPool"/></constructor-arg>
+ <constructor-arg><ref bean="RequestPool"/></constructor-arg>
+ </bean>
+
+
+ <!-- the Router (load-balancer integration) -->
+
+<!--
+ <bean
+ id="Router"
+ class="org.codehaus.wadi.impl.JkRouter"
+ >
+ <constructor-arg><value>${node.name}</value></constructor-arg>
+ </bean>
+-->
+
+ <bean
+ id="Router"
+ class="org.codehaus.wadi.impl.DummyRouter"
+ >
+ </bean>
+
+ <!-- other stuff... -->
+
+ <bean
+ id="HttpProxy"
+ class="org.codehaus.wadi.impl.StandardHttpProxy"
+ >
+ <constructor-arg><value>jsessionid</value></constructor-arg>
+ </bean>
+
+ <bean
+ id="NumPartitions"
+ class="java.lang.Integer"
+ >
+ <constructor-arg><value>72</value></constructor-arg>
+ </bean>
+
+ <bean
+ id="ReplicaterFactory"
+ class="org.codehaus.wadi.impl.MemoryReplicaterFactory"
+ >
+ <constructor-arg><ref bean="NumPartitions"/></constructor-arg>
+ </bean>
+
+ <bean
+ id="LocalHost"
+ class="java.net.InetAddress"
+ factory-method="getLocalHost"
+ >
+ </bean>
+
+ <bean
+ id="HttpAddress"
+ class="java.net.InetSocketAddress"
+ >
+ <constructor-arg><ref bean="LocalHost"/></constructor-arg>
+ <constructor-arg type="int"><value>${http.port}</value></constructor-arg>
+ </bean>
+
+ <bean
+ id="ProxiedLocation"
+ class="org.codehaus.wadi.http.HTTPProxiedLocation"
+ >
+ <constructor-arg><ref bean="HttpAddress"/></constructor-arg>
+ </bean>
+
+ <bean
+ id="PartitionManager"
+ class="org.codehaus.wadi.gridstate.impl.DummyPartitionManager"
+ >
+ <constructor-arg><ref bean="NumPartitions"/></constructor-arg>
+ </bean>
+
+ <bean
+ id="Dispatcher"
+ class="org.codehaus.wadi.gridstate.activecluster.ActiveClusterDispatcher"
+ >
+ <constructor-arg><value>${node.name}</value></constructor-arg>
+ <constructor-arg><value>CLUSTER0</value></constructor-arg>
+<!--
+ <constructor-arg><value>peer://org.codehaus.wadi</value></constructor-arg>
+ -->
+ <constructor-arg><value>tcp://localhost:61616</value></constructor-arg>
+ <constructor-arg type="long"><value>5000</value></constructor-arg>
+ </bean>
+
+ <!-- and finally - the SessionManager itself -->
+
+ <bean
+ id="SessionManager"
+ class="org.codehaus.wadi.impl.ClusteredManager"
+ >
+ <constructor-arg><ref bean="SessionPool"/></constructor-arg>
+ <constructor-arg><ref bean="AttributesFactory"/></constructor-arg>
+ <constructor-arg><ref bean="ValuePool"/></constructor-arg>
+ <constructor-arg><ref bean="SessionWrapperFactory"/></constructor-arg>
+ <constructor-arg><ref bean="SessionIdFactory"/></constructor-arg>
+ <constructor-arg><ref bean="MemoryContextualiser"/></constructor-arg>
+ <constructor-arg><ref bean="MemoryMap"/></constructor-arg>
+ <constructor-arg><ref bean="Router"/></constructor-arg>
+ <constructor-arg type="boolean"><value>false</value></constructor-arg><!-- errorIfSessionNotAcquired -->
+ <constructor-arg><ref bean="AttributeStreamer"/></constructor-arg>
+ <constructor-arg type="boolean"><value>true</value></constructor-arg>
+ <constructor-arg><ref bean="ReplicaterFactory"/></constructor-arg>
+ <constructor-arg><ref bean="ProxiedLocation"/></constructor-arg>
+ <constructor-arg><ref bean="HttpProxy"/></constructor-arg>
+ <constructor-arg><ref bean="Dispatcher"/></constructor-arg>
+ <constructor-arg><ref bean="PartitionManager"/></constructor-arg>
+ <constructor-arg><ref bean="Collapser"/></constructor-arg>
+ </bean>
+
+
+<!-- JMX support -->
+
+ <!--
+ This allows introspection via e.g mc4j (http://mc4j.sourceforge.net) on a running WADI system.
+
+ If you are using Tomcat 5.0.28, you will need to remove bin/jmx.jar,
+ d/l mx4j-3.0.1 and place mx4j-tools.jar and mx4j-remote.jar into
+ server/lib/.
+
+ If you do not require JMX support, feel free to comment out this section.
+
+ For further information please view the Spring JMX integration documentation.
+ -->
+
+ <!--
+ This will create a new MBeanServer unless one already exists, in which case it will be reused.
+ -->
+ <bean id="mbeanServer" class="org.codehaus.wadi.impl.MBeanServerFactoryBean"/>
+
+ <!--
+ This will register the beans mentioned in its 'beans' map with the MBeanServer.
+ -->
+ <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
+ <property name="beans">
+ <map>
+ <entry key="WADI:name=SessionManager"> <ref bean="SessionManager"/> </entry>
+ <entry key="WADI:name=MemoryContextualiser"> <ref bean="MemoryContextualiser"/> </entry>
+ <entry key="WADI:name=DiscContextualiser"> <ref bean="DiscContextualiser"/> </entry>
+ <entry key="WADI:name=ClusterContextualiser"> <ref bean="ClusterContextualiser"/> </entry>
+ <entry key="WADI:name=Router"> <ref bean="Router"/> </entry>
+ <entry key="WADI:name=HttpProxy"> <ref bean="HttpProxy"/> </entry>
+ <entry key="WADI:name=ProxiedLocation"> <ref bean="ProxiedLocation"/> </entry>
+ <entry key="WADI:name=Relocater"> <ref bean="Relocater"/> </entry>
+ <entry key="WADI:name=SessionIdFactory"> <ref bean="SessionIdFactory"/> </entry>
+ </map>
+ </property>
+ <property name="server" ref="mbeanServer"/>
+ <property name="registrationBehavior"><value>2</value></property> <!-- REGISTRATION_REPLACE_EXISTING -->
+ </bean>
+
+ <!--
+ if you are running your own jndi registry, you may comment this out
+ (untested)
+ <bean id="registry" class="java.rmi.registry.LocateRegistry" factory-method="createRegistry">
+ <constructor-arg value="${jndi.port}"/>
+ </bean>
+ -->
+
+ <!--
+ if you are running your own jmx remote connector, you may comment this out
+ you will also need to remove the reference to 'serverConnector' in the 'exporter' bean definition.
+ (untested)
+ <bean id="serverConnector" class="org.springframework.jmx.support.ConnectorServerFactoryBean" depends-on="registry">
+ <property name="objectName" value="connector:name=rmi"/>
+ <property name="serviceUrl" value="service:jmx:rmi://localhost/jndi/rmi://localhost:${jndi.port}/wadi"/>
+ <property name="server"><ref local="mbeanServer"/></property>
+ <property name="threaded" value="true"/>
+ <property name="daemon" value="true"/>
+ </bean>
+ -->
+
+</beans>
Added: incubator/wadi/trunk/modules/core/src/site/apt/license.apt
URL: http://svn.apache.org/viewcvs/incubator/wadi/trunk/modules/core/src/site/apt/license.apt?rev=356933&view=auto
==============================================================================
--- incubator/wadi/trunk/modules/core/src/site/apt/license.apt (added)
+++ incubator/wadi/trunk/modules/core/src/site/apt/license.apt Wed Dec 14 15:32:56 2005
@@ -0,0 +1,210 @@
+Overiew
+
+ Typically the licenses listed for the project are that of the project itself, and not of dependencies.
+
+Project License
+
+---------------
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
Added: incubator/wadi/trunk/modules/core/src/site/resources/css/maven-theme.css
URL: http://svn.apache.org/viewcvs/incubator/wadi/trunk/modules/core/src/site/resources/css/maven-theme.css?rev=356933&view=auto
==============================================================================
--- incubator/wadi/trunk/modules/core/src/site/resources/css/maven-theme.css (added)
+++ incubator/wadi/trunk/modules/core/src/site/resources/css/maven-theme.css Wed Dec 14 15:32:56 2005
@@ -0,0 +1,175 @@
+body {
+ background-color: #fff;
+ font-family: Verdana, Helvetica, Arial, sans-serif;
+ margin-left: auto;
+ margin-right: auto;
+ background-repeat: repeat-y;
+ font-size: 13px;
+ padding: 0px;
+}
+td, select, input, li{
+ font-family: Verdana, Helvetica, Arial, sans-serif;
+ font-size: 12px;
+ color:#333333;
+}
+code{
+ font-size: 12px;
+}
+a {
+ text-decoration: none;
+}
+a:link {
+ color:#47a;
+}
+a:visited {
+ color:#666666;
+}
+a:active, a:hover {
+ color:#990000;
+}
+#legend li.externalLink {
+ background: url(../images/external.png) left top no-repeat;
+ padding-left: 18px;
+}
+a.externalLink, a.externalLink:link, a.externalLink:visited, a.externalLink:active, a.externalLink:hover {
+ background: url(../images/external.png) right center no-repeat;
+ padding-right: 18px;
+}
+#legend li.newWindow {
+ background: url(../images/newwindow.png) left top no-repeat;
+ padding-left: 18px;
+}
+a.newWindow, a.newWindow:link, a.newWindow:visited, a.newWindow:active, a.newWindow:hover {
+ background: url(../images/newwindow.png) right center no-repeat;
+ padding-right: 18px;
+}
+h2 {
+ font-size: 17px;
+ color: #333333;
+}
+h3 {
+ padding: 4px 4px 4px 24px;
+ color: #666;
+ background-color: #ccc;
+ font-weight: bold;
+ font-size: 14px;
+ background-repeat: no-repeat;
+ background-position: left bottom;
+}
+p {
+ line-height: 1.3em;
+ font-size: 12px;
+ color: #000;
+}
+#breadcrumbs {
+ height: 13px;
+ background-image: url(../images/breadcrumbs.jpg);
+ padding: 5px 10px 14px 20px;
+}
+* html #breadcrumbs {
+ padding-bottom: 8px;
+}
+#leftColumn {
+ margin: 10px 0 10px 0;
+ border-top-color: #ccc;
+ border-top-style: solid;
+ border-top-width: 1px;
+ border-right-color: #ccc;
+ border-right-style: solid;
+ border-right-width: 1px;
+ border-bottom-color: #ccc;
+ border-bottom-style: solid;
+ border-bottom-width: 1px;
+ padding-right: 5px;
+ padding-left: 5px;
+}
+#navcolumn h5 {
+ font-size: smaller;
+ border-bottom: 1px solid #aaaaaa;
+ padding-top: 2px;
+ padding-left: 9px;
+ color: #49635a;
+ background-image: url(../images/h5.jpg);
+ background-repeat: no-repeat;
+ background-position: left bottom;
+}
+
+table.bodyTable th {
+ color: white;
+ background-color: #bbb;
+ text-align: left;
+ font-weight: bold;
+}
+
+table.bodyTable th, table.bodyTable td {
+ font-size: 11px;
+}
+
+table.bodyTable tr.a {
+ background-color: #ddd;
+}
+
+table.bodyTable tr.b {
+ background-color: #eee;
+}
+
+.source {
+ border: 1px solid #999;
+ overflow:auto
+}
+dt {
+ padding: 4px 4px 4px 24px;
+ color: #333333;
+ background-color: #ccc;
+ font-weight: bold;
+ font-size: 14px;
+ background-repeat: no-repeat;
+ background-position: left bottom;
+}
+.subsectionTitle {
+ font-size: 13px;
+ font-weight: bold;
+ color: #666;
+
+}
+
+table {
+ font-size: 10px;
+}
+.xright a:link, .xright a:visited, .xright a:active {
+ color: #666;
+}
+.xright a:hover {
+ color: #003300;
+}
+#banner {
+ height: 93px;
+}
+#navcolumn ul {
+ margin: 5px 0 15px -0em;
+}
+#navcolumn ul a {
+ color: #333333;
+}
+#navcolumn ul a:hover {
+ color: red;
+}
+#intro {
+ border: solid #ccc 1px;
+ margin: 6px 0px 0px 0px;
+ padding: 10px 40px 10px 40px;
+}
+.subsection {
+ margin-left: 3px;
+ color: #333333;
+}
+
+.subsection p {
+ font-size: 12px;
+}
+#footer {
+ padding: 10px;
+ margin: 20px 0px 20px 0px;
+ border-top: solid #ccc 1px;
+ color: #333333;
+}
Added: incubator/wadi/trunk/modules/core/src/site/resources/css/site.css
URL: http://svn.apache.org/viewcvs/incubator/wadi/trunk/modules/core/src/site/resources/css/site.css?rev=356933&view=auto
==============================================================================
--- incubator/wadi/trunk/modules/core/src/site/resources/css/site.css (added)
+++ incubator/wadi/trunk/modules/core/src/site/resources/css/site.css Wed Dec 14 15:32:56 2005
@@ -0,0 +1,52 @@
+a.externalLink, a.externalLink:link, a.externalLink:visited, a.externalLink:active, a.externalLink:hover {
+ background: none;
+ padding-right: 0;
+}
+
+/*
+body ul {
+ list-style-type: square;
+}
+*/
+
+#downloadbox {
+ float: right;
+ margin: 0 10px 20px 20px;
+ padding: 5px;
+ border: 1px solid #999;
+ background-color: #eee;
+}
+
+#downloadbox h5 {
+ color: #000;
+ margin: 0;
+ border-bottom: 1px solid #aaaaaa;
+ font-size: smaller;
+ padding: 0;
+}
+
+#downloadbox p {
+ margin-top: 1em;
+ margin-bottom: 0;
+}
+
+#downloadbox ul {
+ margin-top: 0;
+ margin-bottom: 1em;
+ list-style-type: disc;
+}
+
+#downloadbox li {
+ font-size: smaller;
+}
+
+/*
+h4 {
+ padding: 0;
+ border: none;
+ color: #000;
+ margin: 0;
+ font-size: larger;
+ font-weight: bold;
+}
+*/
Added: incubator/wadi/trunk/modules/core/src/site/resources/images/breadcrumbs.jpg
URL: http://svn.apache.org/viewcvs/incubator/wadi/trunk/modules/core/src/site/resources/images/breadcrumbs.jpg?rev=356933&view=auto
==============================================================================
Binary file - no diff available.
Propchange: incubator/wadi/trunk/modules/core/src/site/resources/images/breadcrumbs.jpg
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: incubator/wadi/trunk/modules/core/src/site/resources/images/codehaus-small.png
URL: http://svn.apache.org/viewcvs/incubator/wadi/trunk/modules/core/src/site/resources/images/codehaus-small.png?rev=356933&view=auto
==============================================================================
Binary file - no diff available.
Propchange: incubator/wadi/trunk/modules/core/src/site/resources/images/codehaus-small.png
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: incubator/wadi/trunk/modules/core/src/site/resources/images/folder-open.gif
URL: http://svn.apache.org/viewcvs/incubator/wadi/trunk/modules/core/src/site/resources/images/folder-open.gif?rev=356933&view=auto
==============================================================================
Binary file - no diff available.
Propchange: incubator/wadi/trunk/modules/core/src/site/resources/images/folder-open.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: incubator/wadi/trunk/modules/core/src/site/resources/images/h5.jpg
URL: http://svn.apache.org/viewcvs/incubator/wadi/trunk/modules/core/src/site/resources/images/h5.jpg?rev=356933&view=auto
==============================================================================
Binary file - no diff available.
Propchange: incubator/wadi/trunk/modules/core/src/site/resources/images/h5.jpg
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: incubator/wadi/trunk/modules/core/src/site/resources/images/wadi.png
URL: http://svn.apache.org/viewcvs/incubator/wadi/trunk/modules/core/src/site/resources/images/wadi.png?rev=356933&view=auto
==============================================================================
Binary file - no diff available.
Propchange: incubator/wadi/trunk/modules/core/src/site/resources/images/wadi.png
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: incubator/wadi/trunk/modules/core/src/site/site.xml
URL: http://svn.apache.org/viewcvs/incubator/wadi/trunk/modules/core/src/site/site.xml?rev=356933&view=auto
==============================================================================
--- incubator/wadi/trunk/modules/core/src/site/site.xml (added)
+++ incubator/wadi/trunk/modules/core/src/site/site.xml Wed Dec 14 15:32:56 2005
@@ -0,0 +1,24 @@
+<project name="Mojo">
+ <bannerLeft>
+ <name>WADI</name>
+ <src>/images/wadi.png</src>
+ <href>http://wadi.codehaus.org</href>
+ </bannerLeft>
+ <bannerRight>
+ <name>Codehaus</name>
+ <src>/images/codehaus-small.png</src>
+ <href>http://www.codehaus.org</href>
+ </bannerRight>
+ <body>
+ <links>
+ <item name="Geronimo" href="http://geronimo.apache.org"/>
+ <item name="Tomcat" href="http://tomcat.apache.org"/>
+ <item name="Jetty" href="http://jetty.mortbay.org/jetty/index.html"/>
+ </links>
+
+ <menu name="WADI">
+ <item name="Wadi" href="../index.html"/>
+ </menu>
+ ${reports}
+ </body>
+</project>
Added: incubator/wadi/trunk/modules/core/src/test/java/org/codehaus/wadi/Dirtier.java
URL: http://svn.apache.org/viewcvs/incubator/wadi/trunk/modules/core/src/test/java/org/codehaus/wadi/Dirtier.java?rev=356933&view=auto
==============================================================================
--- incubator/wadi/trunk/modules/core/src/test/java/org/codehaus/wadi/Dirtier.java (added)
+++ incubator/wadi/trunk/modules/core/src/test/java/org/codehaus/wadi/Dirtier.java Wed Dec 14 15:32:56 2005
@@ -0,0 +1,29 @@
+/**
+ *
+ * Copyright 2003-2005 Core Developers Network Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.codehaus.wadi;
+
+/**
+ * TODO - JavaDoc this type
+ *
+ * @author <a href="mailto:jules@coredevelopers.net">Jules Gosnell</a>
+ * @version $Revision: 1.1 $
+ */
+
+public interface Dirtier {
+ boolean readAccess();
+ boolean writeAccess();
+}
Added: incubator/wadi/trunk/modules/core/src/test/java/org/codehaus/wadi/PartAttributes.java
URL: http://svn.apache.org/viewcvs/incubator/wadi/trunk/modules/core/src/test/java/org/codehaus/wadi/PartAttributes.java?rev=356933&view=auto
==============================================================================
--- incubator/wadi/trunk/modules/core/src/test/java/org/codehaus/wadi/PartAttributes.java (added)
+++ incubator/wadi/trunk/modules/core/src/test/java/org/codehaus/wadi/PartAttributes.java Wed Dec 14 15:32:56 2005
@@ -0,0 +1,47 @@
+/**
+ *
+ * Copyright 2003-2005 Core Developers Network Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.codehaus.wadi;
+
+import java.util.Set;
+
+import javax.servlet.http.HttpSessionEvent;
+
+import org.codehaus.wadi.Dirtier;
+
+/**
+ * TODO - JavaDoc this type
+ *
+ * @author <a href="mailto:jules@coredevelopers.net">Jules Gosnell</a>
+ * @version $Revision: 1.1 $
+ */
+
+public class PartAttributes extends SimpleAttributes implements DistributableValueConfig {
+
+ public PartAttributes(Dirtier dirtier, Streamer streamer, boolean evictObjectRepASAP, boolean evictByteRepASAP) {
+ // NYI
+ }
+
+ public Set getBindingListenerNames() {return null;} //NYI
+ public Set getActivationListenerNames() {return null;} //NYI
+
+ public HttpSessionEvent getHttpSessionEvent() {return null;} //NYI
+ public Streamer getStreamer() {return null;} //NYI
+ public Dirtier getDirtier() {return null;} //NYI
+ public ValueHelper findHelper(Class type) {return null;} //NYI
+ public boolean getHttpSessionAttributeListenersRegistered(){return false;}// NYI
+
+}
Added: incubator/wadi/trunk/modules/core/src/test/java/org/codehaus/wadi/ReadWriteDirtier.java
URL: http://svn.apache.org/viewcvs/incubator/wadi/trunk/modules/core/src/test/java/org/codehaus/wadi/ReadWriteDirtier.java?rev=356933&view=auto
==============================================================================
--- incubator/wadi/trunk/modules/core/src/test/java/org/codehaus/wadi/ReadWriteDirtier.java (added)
+++ incubator/wadi/trunk/modules/core/src/test/java/org/codehaus/wadi/ReadWriteDirtier.java Wed Dec 14 15:32:56 2005
@@ -0,0 +1,33 @@
+/**
+ *
+ * Copyright 2003-2005 Core Developers Network Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.codehaus.wadi;
+
+import org.codehaus.wadi.Dirtier;
+
+/**
+ * TODO - JavaDoc this type
+ *
+ * @author <a href="mailto:jules@coredevelopers.net">Jules Gosnell</a>
+ * @version $Revision: 1.1 $
+ */
+
+public class ReadWriteDirtier implements Dirtier {
+
+ public boolean readAccess() {return true;}
+ public boolean writeAccess() {return true;}
+
+}
Added: incubator/wadi/trunk/modules/core/src/test/java/org/codehaus/wadi/SimpleAttributes.java
URL: http://svn.apache.org/viewcvs/incubator/wadi/trunk/modules/core/src/test/java/org/codehaus/wadi/SimpleAttributes.java?rev=356933&view=auto
==============================================================================
--- incubator/wadi/trunk/modules/core/src/test/java/org/codehaus/wadi/SimpleAttributes.java (added)
+++ incubator/wadi/trunk/modules/core/src/test/java/org/codehaus/wadi/SimpleAttributes.java Wed Dec 14 15:32:56 2005
@@ -0,0 +1,67 @@
+/**
+ *
+ * Copyright 2003-2005 Core Developers Network Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.codehaus.wadi;
+
+import java.io.IOException;
+import java.io.NotSerializableException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.HashMap;
+import java.util.Set;
+
+import javax.servlet.http.HttpSessionEvent;
+
+import org.codehaus.wadi.impl.SimpleStreamer;
+import org.codehaus.wadi.impl.Utils;
+
+/**
+ * TODO - JavaDoc this type
+ *
+ * @author <a href="mailto:jules@coredevelopers.net">Jules Gosnell</a>
+ * @version $Revision: 1.1 $
+ */
+
+public class SimpleAttributes extends HashMap implements Attributes {
+
+ protected final static Streamer _streamer=new SimpleStreamer(); // TODO - parameterise
+
+ public byte[] getBytes() {
+ return Utils.safeObjectToByteArray(this, _streamer);
+ }
+
+ public void setBytes(byte[] bytes) {
+ HashMap attributes=(HashMap)Utils.safeByteArrayToObject(bytes, _streamer);
+ putAll(attributes);
+ }
+
+ public void setHttpSessionEvent(HttpSessionEvent event) {
+ // we don't need it...
+ }
+
+ // FIXME
+ public Set getBindingListenerNames() {return null;}
+ public Set getActivationListenerNames() {return null;}
+
+ public void readContent(ObjectInput oi) throws IOException, ClassNotFoundException {
+ throw new NotSerializableException();
+ }
+
+ public void writeContent(ObjectOutput oo) throws IOException {
+ throw new NotSerializableException();
+ }
+
+}
Added: incubator/wadi/trunk/modules/core/src/test/java/org/codehaus/wadi/SimpleAttributesFactory.java
URL: http://svn.apache.org/viewcvs/incubator/wadi/trunk/modules/core/src/test/java/org/codehaus/wadi/SimpleAttributesFactory.java?rev=356933&view=auto
==============================================================================
--- incubator/wadi/trunk/modules/core/src/test/java/org/codehaus/wadi/SimpleAttributesFactory.java (added)
+++ incubator/wadi/trunk/modules/core/src/test/java/org/codehaus/wadi/SimpleAttributesFactory.java Wed Dec 14 15:32:56 2005
@@ -0,0 +1,33 @@
+/**
+ *
+ * Copyright 2003-2005 Core Developers Network Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.codehaus.wadi;
+
+
+/**
+ * TODO - JavaDoc this type
+ *
+ * @author <a href="mailto:jules@coredevelopers.net">Jules Gosnell</a>
+ * @version $Revision: 1.1 $
+ */
+
+public class SimpleAttributesFactory implements AttributesFactory {
+
+ public Attributes create(AttributesConfig config) {
+ return new SimpleAttributes(); // FIXME
+ }
+
+}