1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 @Override
184 public void setClusterId(String clusterId)
185 {
186 super.setClusterId(clusterId);
187 }
188
189 @Override
190 public void setNodeId(String nodeId)
191 {
192 super.setNodeId(nodeId);
193 }
194
195
196
197 }