View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
4   //  ------------------------------------------------------------------------
5   //  All rights reserved. This program and the accompanying materials
6   //  are made available under the terms of the Eclipse Public License v1.0
7   //  and Apache License v2.0 which accompanies this distribution.
8   //
9   //      The Eclipse Public License is available at
10  //      http://www.eclipse.org/legal/epl-v10.html
11  //
12  //      The Apache License v2.0 is available at
13  //      http://www.opensource.org/licenses/apache2.0.php
14  //
15  //  You may elect to redistribute this code under either of these licenses.
16  //  ========================================================================
17  //
18  
19  package org.eclipse.jetty.nosql;
20  
21  import java.util.HashSet;
22  import java.util.Set;
23  import java.util.concurrent.atomic.AtomicInteger;
24  
25  import javax.servlet.http.HttpServletRequest;
26  
27  import org.eclipse.jetty.server.session.AbstractSession;
28  import org.eclipse.jetty.util.log.Log;
29  import org.eclipse.jetty.util.log.Logger;
30  
31  
32  /* ------------------------------------------------------------ */
33  public class NoSqlSession extends AbstractSession
34  {
35      private final static Logger __log = Log.getLogger("org.eclipse.jetty.server.session");
36  
37      private final NoSqlSessionManager _manager;
38      private Set<String> _dirty;
39      private final AtomicInteger _active = new AtomicInteger();
40      private Object _version;
41      private long _lastSync;
42  
43      /* ------------------------------------------------------------ */
44      public NoSqlSession(NoSqlSessionManager manager, HttpServletRequest request)
45      {
46          super(manager, request);
47          _manager=manager;
48          save(true);
49          _active.incrementAndGet();
50      }
51      
52      /* ------------------------------------------------------------ */
53      public NoSqlSession(NoSqlSessionManager manager, long created, long accessed, String clusterId, Object version)
54      {
55          super(manager, created,accessed,clusterId);
56          _manager=manager;
57          _version=version;
58      }
59      
60      /* ------------------------------------------------------------ */
61      @Override
62      public Object doPutOrRemove(String name, Object value)
63      {
64          synchronized (this)
65          {
66              if (_dirty==null)
67                  _dirty=new HashSet<String>();
68              _dirty.add(name);
69              Object old = super.doPutOrRemove(name,value);
70              if (_manager.getSavePeriod()==-2)
71                  save(true);
72              return old;
73          }
74      }
75  
76      /* ------------------------------------------------------------ */
77      @Override
78      protected void checkValid() throws IllegalStateException
79      {
80          super.checkValid();
81      }
82  
83      /* ------------------------------------------------------------ */
84      @Override
85      protected boolean access(long time)
86      {
87          __log.debug("NoSqlSession:access:active "+_active);
88          if (_active.incrementAndGet()==1)
89          {
90              long period=_manager.getStalePeriod()*1000L;
91              if (period==0)
92                  refresh();
93              else if (period>0)
94              {
95                  long stale=time-_lastSync;
96                  __log.debug("NoSqlSession:access:stale "+stale);
97                  if (stale>period)
98                      refresh();
99              }
100         }
101 
102         return super.access(time);
103     }
104 
105     /* ------------------------------------------------------------ */
106     @Override
107     protected void complete()
108     {
109         super.complete();
110         if(_active.decrementAndGet()==0)
111         {
112             switch(_manager.getSavePeriod())
113             {
114                 case 0: 
115                     save(isValid());
116                     break;
117                 case 1:
118                     if (isDirty())
119                         save(isValid());
120                     break;
121 
122             }
123         }
124     }
125 
126     /* ------------------------------------------------------------ */
127     @Override
128     protected void doInvalidate() throws IllegalStateException
129     {
130         super.doInvalidate();
131         save(false);
132     }
133     
134     /* ------------------------------------------------------------ */
135     protected void save(boolean activateAfterSave)
136     {
137         synchronized (this)
138         {
139             _version=_manager.save(this,_version,activateAfterSave);
140             _lastSync=getAccessed();
141         }
142     }
143 
144 
145     /* ------------------------------------------------------------ */
146     protected void refresh()
147     {
148         synchronized (this)
149         {
150             _version=_manager.refresh(this,_version);
151         }
152     }
153 
154     /* ------------------------------------------------------------ */
155     public boolean isDirty()
156     {
157         synchronized (this)
158         {
159             return _dirty!=null && !_dirty.isEmpty();
160         }
161     }
162     
163     /* ------------------------------------------------------------ */
164     public Set<String> takeDirty()
165     {
166         synchronized (this)
167         {
168             Set<String> dirty=_dirty;
169             if (dirty==null)
170                 dirty= new HashSet<String>();
171             else
172                 _dirty=null;
173             return dirty;
174         }
175     }
176 
177     /* ------------------------------------------------------------ */
178     public Object getVersion()
179     {
180     	return _version;
181     }
182     
183 }