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 fi.vtt.simantics.procore.internal;
\r
14 import gnu.trove.map.hash.THashMap;
\r
16 import java.io.File;
\r
17 import java.io.FileInputStream;
\r
18 import java.io.IOException;
\r
19 import java.io.InputStream;
\r
20 import java.util.Properties;
\r
21 import java.util.Set;
\r
22 import java.util.concurrent.atomic.AtomicLong;
\r
24 import org.simantics.db.ClusterCreator;
\r
25 import org.simantics.db.Database;
\r
26 import org.simantics.db.SessionReference;
\r
27 import org.simantics.db.Database.Session;
\r
28 import org.simantics.db.exception.DatabaseException;
\r
29 import org.simantics.db.impl.support.VirtualGraphServerSupport;
\r
30 import org.simantics.db.procore.protocol.Constants;
\r
31 import org.simantics.db.server.ProCoreException;
\r
32 import org.simantics.db.service.ClusterUID;
\r
34 class GraphSessionVirtual extends GraphSession { // Äsh! This extends relation was/is a pure design choice.
\r
35 private static String FileName = "virtualGraph.builtins.dat";
\r
36 private static long BuiltinClusterId = -1; // Virtual graph doesn't have clusters.
\r
37 static class VirtualSession implements Session {
\r
39 public Database getDatabase() {
\r
43 public void close() throws ProCoreException {
\r
46 public void open() throws ProCoreException {
\r
49 public boolean isClosed() throws ProCoreException {
\r
53 public String execute(String command) throws ProCoreException {
\r
57 public void acceptCommit(long transactionId, long changeSetId, byte[] metadata) throws ProCoreException {
\r
60 public long cancelCommit(long transactionId, long changeSetId, byte[] metadata, OnChangeSetUpdate on) throws ProCoreException {
\r
64 public Transaction askReadTransaction() throws ProCoreException {
\r
68 public Transaction askWriteTransaction(long transactionId) throws ProCoreException {
\r
72 public long endTransaction(long transactionId) throws ProCoreException {
\r
76 public byte[] getChangeSetMetadata(long changeSetId) throws ProCoreException {
\r
80 public ChangeSetData getChangeSetData(long minChangeSetId, long maxChangeSetId, OnChangeSetUpdate on) throws ProCoreException {
\r
84 public ChangeSetIds getChangeSetIds() throws ProCoreException {
\r
88 public Cluster getCluster(byte[] clusterId) throws ProCoreException {
\r
92 public ClusterChanges getClusterChanges(long changeSetId, byte[] clusterId) throws ProCoreException {
\r
96 public ClusterIds getClusterIds() throws ProCoreException {
\r
100 public Information getInformation() throws ProCoreException {
\r
104 public Refresh getRefresh(long changeSetId) throws ProCoreException {
\r
108 public ResourceSegment getResourceSegment(byte[] clusterUID, int resourceIndex, long offset, short size) throws ProCoreException {
\r
112 public long reserveIds(int count) throws ProCoreException {
\r
116 public void updateCluster(byte[] operations) throws ProCoreException {
\r
119 public boolean undo(long[] cChangeSetIds, OnChangeSetUpdate onChangeSetUpdate) throws ProCoreException {
\r
123 public <T> T clone(ClusterUID clusterUID, ClusterCreator clusterCreator) throws DatabaseException {
\r
124 throw new UnsupportedOperationException();
\r
127 public boolean refreshEnabled() {
\r
131 public boolean rolledback() {
\r
135 private AtomicLong changeSetId = new AtomicLong(Constants.NullChangeSetId);
\r
136 private AtomicLong transactionId = new AtomicLong(Constants.NullTransactionId);
\r
137 public static ServerInformationImpl serverInfo = new ServerInformationImpl("serverId", "protocolId", "databaseId", 0);
\r
138 private VirtualGraphServerSupport virtualGraphServerSupport;
\r
139 public GraphSessionVirtual(SessionImplSocket sessionImpl, SessionReference sessionReference, VirtualGraphServerSupport vgss) {
\r
140 super(sessionImpl, sessionReference, new VirtualSession()); // Super does not expect null session.
\r
141 virtualGraphServerSupport = vgss;
\r
143 protected THashMap<String, BuiltinData> initBuiltinMap()
\r
144 throws DatabaseException {
\r
146 Properties props = new Properties();
\r
147 File from = new File(FileName);
\r
148 InputStream in = new FileInputStream(from);
\r
150 THashMap<String, BuiltinData> builtins = new THashMap<String, BuiltinData>();
\r
151 Set<String> keys = props.stringPropertyNames();
\r
152 for (String key : keys) {
\r
153 long resourceId = Long.parseLong(key);
\r
154 long cluster = BuiltinClusterId;
\r
155 int resourceIndex = (int)resourceId;
\r
156 String uri = props.getProperty(key);
\r
157 BuiltinData bd = new BuiltinData(resourceIndex, cluster);
\r
158 builtins.put(uri, bd);
\r
161 } catch(IOException e) {
\r
163 e.printStackTrace();
\r
164 throw new DatabaseException("Failed to read builtins.", e);
\r
168 protected ServerInformationImpl getServerInformation() {
\r
172 public void acceptCommit(long transactionId, long csid, byte[] metadata)
\r
173 throws DatabaseException {
\r
174 changeSetId.incrementAndGet();
\r
178 public void cancelCommit(long transactionId, long csid, byte[] metadata, SynchronizeContextI context)
\r
179 throws DatabaseException {
\r
180 changeSetId.incrementAndGet();
\r
184 public void endTransaction(long transactionId, boolean write)
\r
185 throws DatabaseException {
\r
190 public long askWriteTransaction(int thread, long transactionId)
\r
191 throws DatabaseException {
\r
192 if (Constants.NullTransactionId != transactionId)
\r
193 return transactionId;
\r
195 return this.transactionId.incrementAndGet();
\r
198 public long askReadTransaction(int thread)
\r
199 throws DatabaseException {
\r
200 return transactionId.incrementAndGet();
\r
203 public void stop() throws DatabaseException {
\r
205 System.out.println("GraphSessionVirtual: stop.");
\r
209 public long reserveIds(int count)
\r
210 throws DatabaseException {
\r
211 // VirtualGraphServerSupport s = session.getService(VirtualGraphServerSupport.class);
\r
212 long id = Constants.NullSubjectId;
\r
213 for (int i=0; i<count; ++i)
\r
214 id = virtualGraphServerSupport.createVirtual();
\r