1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
\r
3 * in Industry THTH ry.
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.diagram.content;
\r
14 import org.simantics.db.RequestProcessor;
\r
15 import org.simantics.db.Resource;
\r
16 import org.simantics.db.Session;
\r
17 import org.simantics.db.exception.DatabaseException;
\r
18 import org.simantics.diagram.adapter.DiagramContentRequest;
\r
19 import org.simantics.diagram.synchronization.ErrorHandler;
\r
20 import org.simantics.g2d.canvas.ICanvasContext;
\r
21 import org.simantics.utils.ui.ErrorLogger;
\r
24 * A utility for requesting a diagram's contents and keeping track of them and
\r
25 * obtaining differences.
\r
28 * This class is not thread-safe.
\r
30 * @author Tuukka Lehtonen
\r
32 public class DiagramContentTracker {
\r
34 private final ErrorHandler errorHandler = new ErrorHandler() {
\r
36 public void warning(String message, Exception e) {
\r
37 ErrorLogger.defaultLogWarning(message, e);
\r
40 public void error(String message, Throwable t) {
\r
41 ErrorLogger.defaultLogError(message, t);
\r
45 private DiagramContents lastContents = new DiagramContents();
\r
46 private DiagramContentChanges lastDifference = DiagramContentChanges.EMPTY;
\r
48 private final ICanvasContext context;
\r
49 private final Session session;
\r
50 private final Resource diagram;
\r
52 public static DiagramContentTracker start(ICanvasContext context, RequestProcessor processor, Resource diagram) throws DatabaseException {
\r
53 DiagramContentTracker tracker = new DiagramContentTracker(context, processor.getSession(), diagram);
\r
54 tracker.update(processor);
\r
58 private DiagramContentTracker(ICanvasContext context, Session session, Resource diagram) {
\r
59 if (context == null)
\r
60 throw new NullPointerException("null canvas context");
\r
61 if (session == null)
\r
62 throw new NullPointerException("null session");
\r
63 if (diagram == null)
\r
64 throw new NullPointerException("null diagram");
\r
65 this.context = context;
\r
66 this.session = session;
\r
67 this.diagram = diagram;
\r
70 public DiagramContentChanges update() throws DatabaseException {
\r
71 return update(session);
\r
74 public DiagramContentChanges update(RequestProcessor processor) throws DatabaseException {
\r
75 DiagramContents contents = processor.syncRequest(new DiagramContentRequest(context, diagram, errorHandler));
\r
76 DiagramContentChanges changes = contents.differenceFrom(lastContents);
\r
77 this.lastDifference = changes;
\r
78 this.lastContents = contents;
\r
82 public DiagramContents getLastContents() {
\r
83 return lastContents;
\r
86 public DiagramContentChanges getLastDifference() {
\r
87 return lastDifference;
\r