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.project.features;
\r
14 import java.util.ArrayList;
\r
15 import java.util.Collection;
\r
17 import org.simantics.db.ReadGraph;
\r
18 import org.simantics.db.RequestProcessor;
\r
19 import org.simantics.db.Session;
\r
20 import org.simantics.db.common.processor.MergingGraphRequestProcessor;
\r
21 import org.simantics.db.common.request.ReadRequest;
\r
22 import org.simantics.db.exception.DatabaseException;
\r
23 import org.simantics.project.IProject;
\r
24 import org.simantics.project.exception.ProjectException;
\r
25 import org.simantics.utils.datastructures.hints.IHintContext.Key;
\r
29 * Implement {@link #configure()} and {@link #deconfigure()} to customize
\r
30 * how a feature configures the project in question.
\r
32 * @author Tuukka Lehtonen
\r
34 public abstract class AbstractProjectFeature implements IProjectFeature {
\r
36 private IProject project;
\r
38 public AbstractProjectFeature() {
\r
41 protected void assertProject() {
\r
42 if (project == null)
\r
43 throw new IllegalStateException("project element is null");
\r
47 public IProject getProjectElement() {
\r
51 public IProject getProject() {
\r
56 public IProject peekProject() {
\r
60 protected Session getSession() {
\r
61 IProject p = getProject();
\r
62 Session s = p.getSession();
\r
64 throw new IllegalStateException("project not attached to a database session");
\r
68 protected Session peekSession() {
\r
69 IProject p = peekProject();
\r
72 return p.getSession();
\r
75 protected RequestProcessor getGraphRequestProcessor() {
\r
76 IProject p = peekProject();
\r
79 Session s = p.getSession();
\r
80 //MergingGraphRequestProcessor mgrp = s.getService(MergingGraphRequestProcessor.class);
\r
81 MergingGraphRequestProcessor mgrp = null;
\r
82 return mgrp != null ? mgrp : s;
\r
86 public void setProjectElement(IProject project) {
\r
87 this.project = project;
\r
90 public void onActivated(final ReadGraph graph, final IProject project) throws DatabaseException {
\r
94 public void configure() throws ProjectException {
\r
96 getSession().syncRequest(new ReadRequest() {
\r
98 public void run(ReadGraph graph) throws DatabaseException {
\r
99 onActivated(graph, getProject());
\r
102 } catch (DatabaseException e) {
\r
103 throw new ProjectException(e);
\r
108 public void deconfigure() throws ProjectException {
\r
111 protected <T> void addToCollectionHint(Key key, T... ts) {
\r
112 Collection<T> c = getProjectElement().getHint(key);
\r
114 c = new ArrayList<T>();
\r
115 getProjectElement().setHint(key, c);
\r