|
Lines 47-52
Link Here
|
| 47 |
import java.util.Iterator; |
47 |
import java.util.Iterator; |
| 48 |
import java.util.List; |
48 |
import java.util.List; |
| 49 |
import java.util.Map; |
49 |
import java.util.Map; |
|
|
50 |
import java.util.concurrent.locks.ReentrantLock; |
| 50 |
|
51 |
|
| 51 |
/** |
52 |
/** |
| 52 |
* @author Eike Stepper |
53 |
* @author Eike Stepper |
|
Lines 177-189
Link Here
|
| 177 |
*/ |
178 |
*/ |
| 178 |
public void attach(InternalCDOObject object, InternalCDOTransaction transaction) |
179 |
public void attach(InternalCDOObject object, InternalCDOTransaction transaction) |
| 179 |
{ |
180 |
{ |
| 180 |
List<InternalCDOObject> contents = new ArrayList<InternalCDOObject>(); |
181 |
ReentrantLock viewLock = transaction.getStateLock(); |
| 181 |
attach1(object, new Pair<InternalCDOTransaction, List<InternalCDOObject>>(transaction, contents)); |
182 |
viewLock.lock(); |
| 182 |
attach2(object); |
|
|
| 183 |
|
183 |
|
| 184 |
for (InternalCDOObject content : contents) |
184 |
try |
| 185 |
{ |
185 |
{ |
| 186 |
attach2(content); |
186 |
List<InternalCDOObject> contents = new ArrayList<InternalCDOObject>(); |
|
|
187 |
attach1(object, new Pair<InternalCDOTransaction, List<InternalCDOObject>>(transaction, contents)); |
| 188 |
attach2(object); |
| 189 |
|
| 190 |
for (InternalCDOObject content : contents) |
| 191 |
{ |
| 192 |
attach2(content); |
| 193 |
} |
| 194 |
} |
| 195 |
finally |
| 196 |
{ |
| 197 |
viewLock.unlock(); |
| 187 |
} |
198 |
} |
| 188 |
} |
199 |
} |
| 189 |
|
200 |
|
|
Lines 219-253
Link Here
|
| 219 |
*/ |
230 |
*/ |
| 220 |
public void detach(InternalCDOObject object) |
231 |
public void detach(InternalCDOObject object) |
| 221 |
{ |
232 |
{ |
| 222 |
if (TRACER.isEnabled()) |
233 |
ReentrantLock viewLock = object.cdoView().getStateLock(); |
|
|
234 |
viewLock.lock(); |
| 235 |
|
| 236 |
try |
| 223 |
{ |
237 |
{ |
| 224 |
trace(object, CDOEvent.DETACH); |
238 |
if (TRACER.isEnabled()) |
| 225 |
} |
239 |
{ |
|
|
240 |
trace(object, CDOEvent.DETACH); |
| 241 |
} |
| 226 |
|
242 |
|
| 227 |
List<InternalCDOObject> objectsToDetach = new ArrayList<InternalCDOObject>(); |
243 |
List<InternalCDOObject> objectsToDetach = new ArrayList<InternalCDOObject>(); |
| 228 |
InternalCDOTransaction transaction = (InternalCDOTransaction)object.cdoView(); |
244 |
InternalCDOTransaction transaction = (InternalCDOTransaction)object.cdoView(); |
| 229 |
|
245 |
|
| 230 |
// Accumulate objects that needs to be detached |
246 |
// Accumulate objects that needs to be detached |
| 231 |
// If we have an error, we will keep the graph exactly like it was before. |
247 |
// If we have an error, we will keep the graph exactly like it was before. |
| 232 |
process(object, CDOEvent.DETACH, objectsToDetach); |
248 |
process(object, CDOEvent.DETACH, objectsToDetach); |
| 233 |
|
249 |
|
| 234 |
// postDetach requires the object to be TRANSIENT |
250 |
// postDetach requires the object to be TRANSIENT |
| 235 |
for (InternalCDOObject content : objectsToDetach) |
251 |
for (InternalCDOObject content : objectsToDetach) |
| 236 |
{ |
252 |
{ |
| 237 |
CDOState oldState = content.cdoInternalSetState(CDOState.TRANSIENT); |
253 |
CDOState oldState = content.cdoInternalSetState(CDOState.TRANSIENT); |
| 238 |
content.cdoInternalPostDetach(); |
254 |
content.cdoInternalPostDetach(); |
| 239 |
content.cdoInternalSetState(oldState); |
255 |
content.cdoInternalSetState(oldState); |
| 240 |
} |
256 |
} |
| 241 |
|
257 |
|
| 242 |
// detachObject needs to know the state before we change the object to TRANSIENT |
258 |
// detachObject needs to know the state before we change the object to TRANSIENT |
| 243 |
for (InternalCDOObject content : objectsToDetach) |
259 |
for (InternalCDOObject content : objectsToDetach) |
| 244 |
{ |
260 |
{ |
| 245 |
transaction.detachObject(content); |
261 |
transaction.detachObject(content); |
| 246 |
content.cdoInternalSetState(CDOState.TRANSIENT); |
262 |
content.cdoInternalSetState(CDOState.TRANSIENT); |
| 247 |
|
263 |
|
| 248 |
content.cdoInternalSetView(null); |
264 |
content.cdoInternalSetView(null); |
| 249 |
content.cdoInternalSetID(null); |
265 |
content.cdoInternalSetID(null); |
| 250 |
content.cdoInternalSetRevision(null); |
266 |
content.cdoInternalSetRevision(null); |
|
|
267 |
} |
| 268 |
} |
| 269 |
finally |
| 270 |
{ |
| 271 |
viewLock.unlock(); |
| 251 |
} |
272 |
} |
| 252 |
} |
273 |
} |
| 253 |
|
274 |
|
|
Lines 256-267
Link Here
|
| 256 |
*/ |
277 |
*/ |
| 257 |
public void read(InternalCDOObject object) |
278 |
public void read(InternalCDOObject object) |
| 258 |
{ |
279 |
{ |
| 259 |
if (TRACER.isEnabled()) |
280 |
ReentrantLock viewLock = object.cdoView().getStateLock(); |
|
|
281 |
viewLock.lock(); |
| 282 |
|
| 283 |
try |
| 260 |
{ |
284 |
{ |
| 261 |
trace(object, CDOEvent.READ); |
285 |
if (TRACER.isEnabled()) |
| 262 |
} |
286 |
{ |
|
|
287 |
trace(object, CDOEvent.READ); |
| 288 |
} |
| 263 |
|
289 |
|
| 264 |
process(object, CDOEvent.READ, null); |
290 |
process(object, CDOEvent.READ, null); |
|
|
291 |
} |
| 292 |
finally |
| 293 |
{ |
| 294 |
viewLock.unlock(); |
| 295 |
} |
| 265 |
} |
296 |
} |
| 266 |
|
297 |
|
| 267 |
/** |
298 |
/** |
|
Lines 277-288
Link Here
|
| 277 |
*/ |
308 |
*/ |
| 278 |
public void write(InternalCDOObject object, CDOFeatureDelta featureDelta) |
309 |
public void write(InternalCDOObject object, CDOFeatureDelta featureDelta) |
| 279 |
{ |
310 |
{ |
| 280 |
if (TRACER.isEnabled()) |
311 |
ReentrantLock viewLock = object.cdoView().getStateLock(); |
|
|
312 |
viewLock.lock(); |
| 313 |
|
| 314 |
try |
| 281 |
{ |
315 |
{ |
| 282 |
trace(object, CDOEvent.WRITE); |
316 |
if (TRACER.isEnabled()) |
| 283 |
} |
317 |
{ |
|
|
318 |
trace(object, CDOEvent.WRITE); |
| 319 |
} |
| 284 |
|
320 |
|
| 285 |
process(object, CDOEvent.WRITE, featureDelta); |
321 |
process(object, CDOEvent.WRITE, featureDelta); |
|
|
322 |
} |
| 323 |
finally |
| 324 |
{ |
| 325 |
viewLock.unlock(); |
| 326 |
} |
| 286 |
} |
327 |
} |
| 287 |
|
328 |
|
| 288 |
/** |
329 |
/** |
|
Lines 321-339
Link Here
|
| 321 |
|
362 |
|
| 322 |
if (view != null) |
363 |
if (view != null) |
| 323 |
{ |
364 |
{ |
| 324 |
InternalCDOSession session = (InternalCDOSession)view.getSession(); |
365 |
ReentrantLock viewLock = ((InternalCDOView)view).getStateLock(); |
| 325 |
revisions = session.getSessionProtocol().verifyRevision(revisions); |
366 |
viewLock.lock(); |
| 326 |
|
367 |
|
| 327 |
revisions.addAll(revised); |
368 |
try |
| 328 |
for (InternalCDORevision revision : revisions) |
|
|
| 329 |
{ |
369 |
{ |
| 330 |
InternalCDOObject object = ids.get(revision.getID()); |
370 |
InternalCDOSession session = (InternalCDOSession)view.getSession(); |
| 331 |
if (TRACER.isEnabled()) |
371 |
revisions = session.getSessionProtocol().verifyRevision(revisions); |
|
|
372 |
|
| 373 |
revisions.addAll(revised); |
| 374 |
for (InternalCDORevision revision : revisions) |
| 332 |
{ |
375 |
{ |
| 333 |
trace(object, CDOEvent.RELOAD); |
376 |
InternalCDOObject object = ids.get(revision.getID()); |
| 334 |
} |
377 |
if (TRACER.isEnabled()) |
|
|
378 |
{ |
| 379 |
trace(object, CDOEvent.RELOAD); |
| 380 |
} |
| 335 |
|
381 |
|
| 336 |
process(object, CDOEvent.RELOAD, null); |
382 |
process(object, CDOEvent.RELOAD, null); |
|
|
383 |
} |
| 384 |
} |
| 385 |
finally |
| 386 |
{ |
| 387 |
viewLock.unlock(); |
| 337 |
} |
388 |
} |
| 338 |
} |
389 |
} |
| 339 |
} |
390 |
} |
|
Lines 343-354
Link Here
|
| 343 |
*/ |
394 |
*/ |
| 344 |
public void invalidate(InternalCDOObject object, int version) |
395 |
public void invalidate(InternalCDOObject object, int version) |
| 345 |
{ |
396 |
{ |
| 346 |
if (TRACER.isEnabled()) |
397 |
ReentrantLock viewLock = object.cdoView().getStateLock(); |
|
|
398 |
viewLock.lock(); |
| 399 |
|
| 400 |
try |
| 347 |
{ |
401 |
{ |
| 348 |
trace(object, CDOEvent.INVALIDATE); |
402 |
if (TRACER.isEnabled()) |
| 349 |
} |
403 |
{ |
|
|
404 |
trace(object, CDOEvent.INVALIDATE); |
| 405 |
} |
| 350 |
|
406 |
|
| 351 |
process(object, CDOEvent.INVALIDATE, version); |
407 |
process(object, CDOEvent.INVALIDATE, version); |
|
|
408 |
} |
| 409 |
finally |
| 410 |
{ |
| 411 |
viewLock.unlock(); |
| 412 |
} |
| 352 |
} |
413 |
} |
| 353 |
|
414 |
|
| 354 |
/** |
415 |
/** |
|
Lines 356-367
Link Here
|
| 356 |
*/ |
417 |
*/ |
| 357 |
public void detachRemote(InternalCDOObject object) |
418 |
public void detachRemote(InternalCDOObject object) |
| 358 |
{ |
419 |
{ |
| 359 |
if (TRACER.isEnabled()) |
420 |
ReentrantLock viewLock = object.cdoView().getStateLock(); |
|
|
421 |
viewLock.lock(); |
| 422 |
|
| 423 |
try |
| 360 |
{ |
424 |
{ |
| 361 |
trace(object, CDOEvent.DETACH_REMOTE); |
425 |
if (TRACER.isEnabled()) |
| 362 |
} |
426 |
{ |
|
|
427 |
trace(object, CDOEvent.DETACH_REMOTE); |
| 428 |
} |
| 363 |
|
429 |
|
| 364 |
process(object, CDOEvent.DETACH_REMOTE, CDORevision.UNSPECIFIED_VERSION); |
430 |
process(object, CDOEvent.DETACH_REMOTE, CDORevision.UNSPECIFIED_VERSION); |
|
|
431 |
} |
| 432 |
finally |
| 433 |
{ |
| 434 |
viewLock.unlock(); |
| 435 |
} |
| 365 |
} |
436 |
} |
| 366 |
|
437 |
|
| 367 |
/** |
438 |
/** |
|
Lines 369-380
Link Here
|
| 369 |
*/ |
440 |
*/ |
| 370 |
public void commit(InternalCDOObject object, CommitTransactionResult result) |
441 |
public void commit(InternalCDOObject object, CommitTransactionResult result) |
| 371 |
{ |
442 |
{ |
| 372 |
if (TRACER.isEnabled()) |
443 |
ReentrantLock viewLock = object.cdoView().getStateLock(); |
|
|
444 |
viewLock.lock(); |
| 445 |
|
| 446 |
try |
| 373 |
{ |
447 |
{ |
| 374 |
trace(object, CDOEvent.COMMIT); |
448 |
if (TRACER.isEnabled()) |
| 375 |
} |
449 |
{ |
|
|
450 |
trace(object, CDOEvent.COMMIT); |
| 451 |
} |
| 376 |
|
452 |
|
| 377 |
process(object, CDOEvent.COMMIT, result); |
453 |
process(object, CDOEvent.COMMIT, result); |
|
|
454 |
} |
| 455 |
finally |
| 456 |
{ |
| 457 |
viewLock.unlock(); |
| 458 |
} |
| 378 |
} |
459 |
} |
| 379 |
|
460 |
|
| 380 |
/** |
461 |
/** |
|
Lines 382-393
Link Here
|
| 382 |
*/ |
463 |
*/ |
| 383 |
public void rollback(InternalCDOObject object) |
464 |
public void rollback(InternalCDOObject object) |
| 384 |
{ |
465 |
{ |
| 385 |
if (TRACER.isEnabled()) |
466 |
ReentrantLock viewLock = object.cdoView().getStateLock(); |
|
|
467 |
viewLock.lock(); |
| 468 |
|
| 469 |
try |
| 386 |
{ |
470 |
{ |
| 387 |
trace(object, CDOEvent.ROLLBACK); |
471 |
if (TRACER.isEnabled()) |
| 388 |
} |
472 |
{ |
|
|
473 |
trace(object, CDOEvent.ROLLBACK); |
| 474 |
} |
| 389 |
|
475 |
|
| 390 |
process(object, CDOEvent.ROLLBACK, null); |
476 |
process(object, CDOEvent.ROLLBACK, null); |
|
|
477 |
} |
| 478 |
finally |
| 479 |
{ |
| 480 |
viewLock.unlock(); |
| 481 |
} |
| 391 |
} |
482 |
} |
| 392 |
|
483 |
|
| 393 |
@Override |
484 |
@Override |