1 package org.eclipse.jetty.nosql;
2
3
4
5
6
7
8
9
10
11
12
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 }