View Javadoc

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