taylor      2004/03/24 15:31:19

  Modified:    portal/src/java/org/apache/jetspeed/container/session/impl
                        PathNavigationalState.java
                        SessionNavigationalState.java
               portal/src/java/org/apache/jetspeed/container/session
                        NavigationalState.java
  Added:       portal/src/test/org/apache/jetspeed/containers
                        test-navstate-container.groovy
               portal/src/java/org/apache/jetspeed/container/session/impl
                        SessionNavigationalStateContext.java
                        PathNavigationalStateContext.java
               portal/src/test/org/apache/jetspeed/container/session
                        TestNavigationalState.java
               portal/src/java/org/apache/jetspeed/container/session
                        NavigationalStateContext.java
  Log:
  Start of refactoring of Navigational State and Context

  Unit test and test assembly in place

  Added Mockrunner for Servlet Mock objects in tests

  

  Goal is to replace PortalControlParameter and PortalURL with pluggable Nav State and 
URL generation components and context classes

  The current implementation is very much coupled to Pluto's approach of storing nav 
state in the URL using Pluto-like navstate encoding

  Plan to have 3 implementations in Jetspeed from NavState handling:

  - Pluto Paths

  - Session

  - Encrypted

  

  The NavigationalState component will eventually be capable of storing and retrieving 
navigational 

  state on a per user/window basis, so that when a user returns to a site, the window 
state can be 

  recreated on a per user basis, not per page

  

  

  PR:

  Obtained from:

  Submitted by: 

  Reviewed by:  

  CVS: ----------------------------------------------------------------------

  CVS: PR:

  CVS:   If this change addresses a PR in the problem report tracking

  CVS:   database, then enter the PR number(s) here.

  CVS: Obtained from:

  CVS:   If this change has been taken from another system, such as NCSA,

  CVS:   then name the system in this line, otherwise delete it.

  CVS: Submitted by:

  CVS:   If this code has been contributed to Apache by someone else; i.e.,

  CVS:   they sent us a patch or a new module, then include their name/email

  CVS:   address here. If this is your work then delete this line.

  CVS: Reviewed by:

  CVS:   If we are doing pre-commit code reviews and someone else has

  CVS:   reviewed your changes, include their name(s) here.

  CVS:   If you have not had it reviewed then delete this line.

  
  Revision  Changes    Path
  1.1                  
jakarta-jetspeed-2/portal/src/test/org/apache/jetspeed/containers/test-navstate-container.groovy
  
  Index: test-navstate-container.groovy
  ===================================================================
  /*
   * Copyright 2000-2004 The Apache Software Foundation.
   * 
   * 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.
   */
  
  import org.picocontainer.defaults.DefaultPicoContainer
  import org.picocontainer.defaults.ConstantParameter
  import org.picocontainer.defaults.ComponentParameter
  import org.picocontainer.Parameter
  import org.apache.jetspeed.components.util.NanoQuickAssembler
   
  import org.apache.jetspeed.container.session.NavigationalState
  import org.apache.jetspeed.container.session.impl.PathNavigationalState
  
  
  // def register(container) 
  
  
  ClassLoader cl = Thread.currentThread().getContextClassLoader()
  container = new DefaultPicoContainer()
  
  
  container.registerComponentImplementation(NavigationalState, 
                                            PathNavigationalState)
  
  return container
  
  
  
  
  
  1.3       +64 -44    
jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/container/session/impl/PathNavigationalState.java
  
  Index: PathNavigationalState.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/container/session/impl/PathNavigationalState.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- PathNavigationalState.java        8 Mar 2004 00:24:16 -0000       1.2
  +++ PathNavigationalState.java        24 Mar 2004 23:31:19 -0000      1.3
  @@ -15,63 +15,83 @@
    */
   package org.apache.jetspeed.container.session.impl;
   
  -import javax.portlet.PortletMode;
  -import javax.portlet.WindowState;
  -
   import org.apache.jetspeed.container.session.NavigationalState;
  -import org.apache.pluto.om.window.PortletWindow;
  +import org.apache.jetspeed.container.session.NavigationalStateContext;
  +import org.apache.jetspeed.request.RequestContext;
   import org.picocontainer.Startable;
   
   /**
  - * PathNavigationalState
  + * PathNavigationalState is based on Pluto navigational state.
  + * All nav state is stored as path parameters in the URL.
  + * This implementation does not currently support persisting navigational state
    *
    * @author <a href="mailto:[EMAIL PROTECTED]">David Sean Taylor</a>
    * @version $Id$
    */
   public class PathNavigationalState implements NavigationalState, Startable
   {
  -    /* (non-Javadoc)
  -     * @see 
org.apache.jetspeed.container.session.NavigationalState#getState(org.apache.pluto.om.window.PortletWindow)
  -     */
  -    public WindowState getState(PortletWindow window)
  -    {
  -        // TODO Auto-generated method stub
  -        return null;
  -    }
  -    /* (non-Javadoc)
  -     * @see 
org.apache.jetspeed.container.session.NavigationalState#setState(org.apache.pluto.om.window.PortletWindow,
 javax.portlet.WindowState)
  -     */
  -    public void setState(PortletWindow window, WindowState state)
  -    {
  -        // TODO Auto-generated method stub
  -    }
  -    /* (non-Javadoc)
  -     * @see 
org.apache.jetspeed.container.session.NavigationalState#getMode(org.apache.pluto.om.window.PortletWindow)
  -     */
  -    public PortletMode getMode(PortletWindow window)
  -    {
  -        // TODO Auto-generated method stub
  -        return null;
  -    }
  -    /* (non-Javadoc)
  -     * @see 
org.apache.jetspeed.container.session.NavigationalState#setMode(org.apache.pluto.om.window.PortletWindow,
 javax.portlet.PortletMode)
  -     */
  -    public void setMode(PortletWindow window, PortletMode mode)
  -    {
  -        // TODO Auto-generated method stub
  -    }
  -    /* (non-Javadoc)
  -     * @see org.picocontainer.Startable#start()
  -     */
  +    static private final String ACTION = "ac";
  +    static private final String MODE = "md";
  +    static private final String PREFIX = "_";
  +    static private final String PREV_MODE = "pm";
  +    static private final String PREV_STATE = "ps";
  +    static private final String RENDER_PARAM = "rp";
  +    static private final String STATE = "st";
  +    static private final String KEY_DELIMITER = ":";
  +    static private final String PORTLET_ID = "pid";
  +
  +    public PathNavigationalState()
  +    {   
  +    }
  +            
       public void start()
       {
  -        // TODO Auto-generated method stub
       }
  -    /* (non-Javadoc)
  -     * @see org.picocontainer.Startable#stop()
  -     */
  +    
       public void stop()
       {
  -        // TODO Auto-generated method stub
       }
  +    
  +    public NavigationalStateContext createContext(RequestContext context)
  +    {
  +        // TODO: pool
  +        return new PathNavigationalStateContext(context);
  +    }
  +    
  +    public void storeContext(RequestContext context, NavigationalStateContext 
navContext)
  +    {
  +        // TODO: implement
  +    }
  +
  +    public String getActionKey()
  +    {
  +        return ACTION;
  +    }
  +
  +    public String getRenderParamKey()
  +    {
  +        return RENDER_PARAM;
  +    }
  +    
  +    public String getModeKey()
  +    {
  +        return MODE;
  +    }
  +    
  +    public String getPreviousModeKey()
  +    {
  +        return PREV_MODE;
  +    }
  +    
  +    
  +    public String getStateKey()
  +    {
  +        return STATE;
  +    }
  +    
  +    public String getPreviousStateKey()
  +    {
  +        return PREV_STATE;
  +    }
  +    
   }
  
  
  
  1.3       +43 -21    
jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/container/session/impl/SessionNavigationalState.java
  
  Index: SessionNavigationalState.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/container/session/impl/SessionNavigationalState.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- SessionNavigationalState.java     8 Mar 2004 00:24:16 -0000       1.2
  +++ SessionNavigationalState.java     24 Mar 2004 23:31:19 -0000      1.3
  @@ -15,14 +15,9 @@
    */
   package org.apache.jetspeed.container.session.impl;
   
  -import java.util.Map;
  -
  -import javax.portlet.PortletMode;
  -import javax.portlet.WindowState;
  -import javax.servlet.http.HttpSession;
  -
   import org.apache.jetspeed.container.session.NavigationalState;
  -import org.apache.pluto.om.window.PortletWindow;
  +import org.apache.jetspeed.container.session.NavigationalStateContext;
  +import org.apache.jetspeed.request.RequestContext;
   import org.picocontainer.Startable;
   
   /**
  @@ -33,14 +28,17 @@
    */
   public class SessionNavigationalState implements NavigationalState, Startable
   {
  -    HttpSession session;
  -    
  -    public SessionNavigationalState(HttpSession session)
  -    {
  -        this.session = session;
  -    }
  +    static private final String ACTION = "ac";
  +    static private final String MODE = "md";
  +    static private final String PREFIX = "_";
  +    static private final String PREV_MODE = "pm";
  +    static private final String PREV_STATE = "ps";
  +    static private final String RENDER_PARAM = "rp";
  +    static private final String STATE = "st";
  +    static private final String KEY_DELIMITER = ":";
  +    static private final String PORTLET_ID = "pid";
   
  -    public SessionNavigationalState(Map session) // we need mock objects for HTTP 
stuff! 
  +    public SessionNavigationalState()  
       {
       }
   
  @@ -52,23 +50,47 @@
       public void stop()
       {
       }
  +
  +    public NavigationalStateContext createContext(RequestContext context)
  +    {
  +        // TODO: pool
  +        return new SessionNavigationalStateContext(context);
  +    }
  +    
  +    public void storeContext(RequestContext context, NavigationalStateContext 
navContext)
  +    {
  +        // TODO: implement
  +    }
       
  -    public WindowState getState(PortletWindow window)
  +    public String getActionKey()
  +    {
  +        return ACTION;
  +    }
  +
  +    public String getRenderParamKey()
       {
  -        return null;
  +        return RENDER_PARAM;
       }
       
  -    public void setState(PortletWindow window, WindowState state)
  +    public String getModeKey()
       {
  +        return MODE;
       }
       
  -    public PortletMode getMode(PortletWindow window)
  +    public String getPreviousModeKey()
  +    {
  +        return PREV_MODE;
  +    }
  +    
  +    
  +    public String getStateKey()
       {
  -        return null;
  +        return STATE;
       }
       
  -    public void setMode(PortletWindow window, PortletMode mode)
  +    public String getPreviousStateKey()
       {
  +        return PREV_STATE;
       }
       
   }
  
  
  
  1.1                  
jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/container/session/impl/SessionNavigationalStateContext.java
  
  Index: SessionNavigationalStateContext.java
  ===================================================================
  /*
   * Copyright 2000-2001,2004 The Apache Software Foundation.
   * 
   * 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.apache.jetspeed.container.session.impl;
  
  import javax.portlet.PortletMode;
  import javax.portlet.WindowState;
  
  import org.apache.jetspeed.container.session.NavigationalStateContext;
  import org.apache.jetspeed.request.RequestContext;
  import org.apache.pluto.om.window.PortletWindow;
  
  /**
   * SessionNavigationalStateContext
   *
   * @author <a href="mailto:[EMAIL PROTECTED]">David Sean Taylor</a>
   * @version $Id: SessionNavigationalStateContext.java,v 1.1 2004/03/24 23:31:19 
taylor Exp $
   */
  public class SessionNavigationalStateContext
          implements
              NavigationalStateContext 
  {
      RequestContext context;
      
      public SessionNavigationalStateContext(RequestContext context)
      {
          init(context);        
      }
      
      public void init(RequestContext context)
      {
          this.context = context;
      }
      
      public WindowState getState(PortletWindow window) 
      {
          return null;
      }
      
      public void setState(PortletWindow window, WindowState state) 
      {
      }
      
      public PortletMode getMode(PortletWindow window) 
      {
          return null;
      }
      
      public void setMode(PortletWindow window, PortletMode mode) 
      {
      }
      
      public PortletMode getPreviousMode(PortletWindow window) 
      {
          return null;
      }
      
      public WindowState getPreviousState(PortletWindow window) 
      {
          return null;
      }
  }
  
  
  
  1.1                  
jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/container/session/impl/PathNavigationalStateContext.java
  
  Index: PathNavigationalStateContext.java
  ===================================================================
  /*
   * Copyright 2000-2001,2004 The Apache Software Foundation.
   * 
   * 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.apache.jetspeed.container.session.impl;
  
  import javax.portlet.PortletMode;
  import javax.portlet.WindowState;
  
  import org.apache.jetspeed.container.session.NavigationalStateContext;
  import org.apache.jetspeed.engine.core.PortalControlParameter;
  import org.apache.jetspeed.engine.core.PortalURL;
  import org.apache.jetspeed.request.RequestContext;
  import org.apache.pluto.om.window.PortletWindow;
  
  /**
   * PathNavigationalStateContext is based on Pluto navigational state.
   * All nav state is stored as path parameters in the URL.
   * This implementation does not currently support persisting navigational state
   *
   * @author <a href="mailto:[EMAIL PROTECTED]">David Sean Taylor</a>
   * @version $Id: PathNavigationalStateContext.java,v 1.1 2004/03/24 23:31:19 taylor 
Exp $
   */
  public class PathNavigationalStateContext implements NavigationalStateContext 
  {
      RequestContext context;
      PortalURL url;
      PortalControlParameter pcp;
      
      public PathNavigationalStateContext(RequestContext context)
      {
          init(context);
      }
      
      public void init(RequestContext context)
      {
          this.context = context;
          this.url = context.getRequestedPortalURL();
          this.pcp = new PortalControlParameter(url);        
      }
      
      public WindowState getState(PortletWindow window) 
      {
          return pcp.getState(window);
      }
      
      public void setState(PortletWindow window, WindowState state) 
      {
          pcp.setState(window, state);
      }
      
      public PortletMode getMode(PortletWindow window) 
      {
          return pcp.getMode(window);
      }
      
      public void setMode(PortletWindow window, PortletMode mode) 
      {
          pcp.setMode(window, mode);
      }
      
      public PortletMode getPreviousMode(PortletWindow window) 
      {
          return pcp.getPrevMode(window);
      }
      
      public WindowState getPreviousState(PortletWindow window) 
      {
          return pcp.getPrevState(window);
      }
      
  }
  
  
  
  1.1                  
jakarta-jetspeed-2/portal/src/test/org/apache/jetspeed/container/session/TestNavigationalState.java
  
  Index: TestNavigationalState.java
  ===================================================================
  /*
   * Copyright 2000-2001,2004 The Apache Software Foundation.
   * 
   * 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.apache.jetspeed.container.session;
  
  import javax.portlet.PortletMode;
  import javax.portlet.WindowState;
  import javax.servlet.ServletConfig;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  
  import junit.framework.Test;
  
  import org.apache.jetspeed.JetspeedPortalContext;
  import org.apache.jetspeed.PortalContext;
  import org.apache.jetspeed.components.AbstractComponentAwareTestCase;
  import org.apache.jetspeed.components.ComponentAwareTestSuite;
  import org.apache.jetspeed.om.window.impl.PortletWindowImpl;
  import org.apache.jetspeed.request.JetspeedRequestContext;
  import org.apache.jetspeed.request.RequestContext;
  import org.apache.pluto.om.window.PortletWindow;
  import org.picocontainer.MutablePicoContainer;
  
  import com.mockrunner.mock.web.MockHttpServletRequest;
  import com.mockrunner.mock.web.MockHttpServletResponse;
  import com.mockrunner.mock.web.MockServletConfig;
  
  /**
   * TestPortletContainer
   *
   * @author <a href="mailto:[EMAIL PROTECTED]">David Sean Taylor</a>
   * @version $Id: TestNavigationalState.java,v 1.1 2004/03/24 23:31:19 taylor Exp $
   */
  
  public class TestNavigationalState extends AbstractComponentAwareTestCase 
  {
      private MutablePicoContainer container;
      private NavigationalState navState;
      
      /**
       * Defines the testcase name for JUnit.
       *
       * @param name the testcase's name.
       */
      public TestNavigationalState(String name)
      {
          super(name);
      }
  
      /**
       * Start the tests.
       *
       * @param args the arguments. Not used
       */
      public static void main(String args[])
      {
          junit.awtui.TestRunner.main(new String[] { 
TestNavigationalState.class.getName()});
      }
  
      protected void setUp() throws Exception
      {
          super.setUp();
          container = (MutablePicoContainer) getContainer();
          assertNotNull("container is null", container);
          navState = (NavigationalState) 
container.getComponentInstance(NavigationalState.class);        
      }
  
      /**
       * Creates the test suite.
       *
       * @return a test suite (<code>TestSuite</code>) that includes all methods
       *         starting with "test"
       */
      public static Test suite()
      {
          ComponentAwareTestSuite suite = new 
ComponentAwareTestSuite(TestNavigationalState.class);
          
suite.setScript("org/apache/jetspeed/containers/test-navstate-container.groovy");
          return suite;
      }
  
      public void testBasic()
      {
          MockHttpServletRequest request = new MockHttpServletRequest();
          HttpServletResponse response = new MockHttpServletResponse();
          ServletConfig config = new MockServletConfig();
          request.setPathInfo("/stuff/");
          RequestContext context = new JetspeedRequestContext(new 
JetspeedPortalContext(null), 
                                                          (HttpServletRequest)request, 
                                                          response, 
                                                          config);
          
          
          assertNotNull("portlet container is null", navState);
          PortletWindow window = new PortletWindowImpl("33");
          PortletWindow window2 = new PortletWindowImpl("222");
          
          NavigationalStateContext nav = navState.createContext(context);
          nav.setState(window, WindowState.MAXIMIZED);
          nav.setMode(window, PortletMode.HELP);
          
          // Check that they come out correctly
          assertTrue("window mode is not set", 
nav.getMode(window).equals(PortletMode.HELP));
          assertTrue("window state is not set", 
nav.getState(window).equals(WindowState.MAXIMIZED));
          assertTrue("window mode is not set", 
nav.getMode(window2).equals(PortletMode.VIEW));
          
      }
      
  }
  
  
  
  1.3       +31 -12    
jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/container/session/NavigationalState.java
  
  Index: NavigationalState.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/container/session/NavigationalState.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- NavigationalState.java    8 Mar 2004 00:24:25 -0000       1.2
  +++ NavigationalState.java    24 Mar 2004 23:31:19 -0000      1.3
  @@ -15,11 +15,7 @@
    */
   package org.apache.jetspeed.container.session;
   
  -import javax.portlet.PortletMode;
  -import javax.portlet.WindowState;
  -
  -// import org.apache.pluto.om.entity.PortletEntity;
  -import org.apache.pluto.om.window.PortletWindow;
  +import org.apache.jetspeed.request.RequestContext;
   
   /**
    * NavigationalState
  @@ -28,12 +24,35 @@
    * @version $Id$
    */
   public interface NavigationalState
  -{
  -    WindowState getState(PortletWindow window);
  -    
  -    void setState(PortletWindow window, WindowState state);
  +{        
  +    /**
  +     * Creates a navigational state context for the given request context.
  +     * Depending on the implementation, navigational state can be retrieved from 
  +     * a persistence store to recover the state of a page such as portlet modes 
  +     * and window states of portlets on a page.
  +     *  
  +     * @param context The request context for which this navigational state is 
valid.
  +     * @return A new navigational state context for the given request.
  +     */
  +    NavigationalStateContext createContext(RequestContext context);
       
  -    PortletMode getMode(PortletWindow window);
  +    /**
  +     * Save the navigational state to persistence store for the given context.
  +     *   
  +     * @param context The request context for retrieving user and other information.
  +     * @param navContext The current navigational state context for the given 
request.
  +     */
  +    void storeContext(RequestContext context, NavigationalStateContext navContext);
  +     
  +    /**
  +     * Keys for URL encoding
  +     * @return
  +     */
  +    String getActionKey();
  +    String getRenderParamKey();    
  +    String getModeKey();    
  +    String getPreviousModeKey();        
  +    String getStateKey();    
  +    String getPreviousStateKey();
       
  -    void setMode(PortletWindow window, PortletMode mode);
   }
  
  
  
  1.1                  
jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/container/session/NavigationalStateContext.java
  
  Index: NavigationalStateContext.java
  ===================================================================
  /*
   * Copyright 2000-2001,2004 The Apache Software Foundation.
   * 
   * 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.apache.jetspeed.container.session;
  
  import javax.portlet.PortletMode;
  import javax.portlet.WindowState;
  
  import org.apache.pluto.om.window.PortletWindow;
  
  /**
   * NavigationalStateContext
   *
   * @author <a href="mailto:[EMAIL PROTECTED]">David Sean Taylor</a>
   * @version $Id: NavigationalStateContext.java,v 1.1 2004/03/24 23:31:19 taylor Exp $
   */
  public interface NavigationalStateContext 
  {
      WindowState getState(PortletWindow window);
      
      void setState(PortletWindow window, WindowState state);
      
      PortletMode getMode(PortletWindow window);
      
      void setMode(PortletWindow window, PortletMode mode);
      
      PortletMode getPreviousMode(PortletWindow window);
      
      WindowState getPreviousState(PortletWindow window);
      
  }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to