]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.testing/src/org/simantics/db/testing/common/AcornTests.java
Fixing problems in the database unit testing environment with Acorn
[simantics/platform.git] / bundles / org.simantics.db.testing / src / org / simantics / db / testing / common / AcornTests.java
1 package org.simantics.db.testing.common;
2
3 import java.io.File;
4 import java.io.FileInputStream;
5 import java.io.InputStream;
6 import java.util.ArrayList;
7
8 import org.eclipse.core.runtime.Platform;
9 import org.simantics.DefaultChoiceUserAgent;
10 import org.simantics.Simantics;
11 import org.simantics.SimanticsPlatform;
12 import org.simantics.SimanticsPlatform.OntologyRecoveryPolicy;
13 import org.simantics.SimanticsPlatform.RecoveryPolicy;
14 import org.simantics.databoard.Bindings;
15 import org.simantics.databoard.Files;
16 import org.simantics.databoard.binding.Binding;
17 import org.simantics.databoard.binding.error.BindingConstructionException;
18 import org.simantics.db.Session;
19 import org.simantics.db.exception.DatabaseException;
20 import org.simantics.db.management.ISessionContextProvider;
21 import org.simantics.db.management.ISessionContextProviderSource;
22 import org.simantics.db.management.SessionContext;
23 import org.simantics.db.management.SessionContextProvider;
24 import org.simantics.db.management.SingleSessionContextProviderSource;
25 import org.simantics.db.service.LifecycleSupport;
26 import org.simantics.db.testing.impl.Configuration;
27 import org.simantics.graph.db.TransferableGraphs;
28 import org.simantics.graph.representation.TransferableGraph1;
29 import org.simantics.scl.osgi.SCLOsgi;
30
31 public class AcornTests {
32
33     private static AcornTestHandler testHandler;
34
35     public static DatabaseState freshWorkspace(String CORE_DIR, ArrayList<String> fileFilter) throws Exception {
36         SimanticsPlatform.INSTANCE.resetWorkspace(null, fileFilter);
37         return newSimanticsWorkspace(null, CORE_DIR);
38     }
39
40     public static void freshDatabase() throws Exception {
41         DatabaseState state = freshWorkspace(Configuration.get().coreDir, null);
42         shutdown(state);
43     }
44
45     public static DatabaseState existingDatabase() throws Exception {
46         return oldSimanticsWorkspace(null, Configuration.get().coreDir);
47     }
48
49     private static void initSimanticsStuff() {
50         // Set session context provider.
51         final ISessionContextProvider provider = new SessionContextProvider(null);
52         ISessionContextProviderSource source = new SingleSessionContextProviderSource(provider);
53         Simantics.setSessionContextProviderSource(source);
54         org.simantics.db.layer0.internal.SimanticsInternal.setSessionContextProviderSource(source);
55     }
56
57     public static DatabaseState newSimanticsWorkspace(TestSettings testSettings, String address) throws Exception {
58         AcornTestHandler testHandler = AcornTests.getTestHandler(testSettings, address);
59         testHandler.initNew();
60         initSimanticsStuff();
61         SessionContext sessionContext = SimanticsPlatform.INSTANCE.startUp("acorn", null, RecoveryPolicy.FixError, OntologyRecoveryPolicy.Merge, true, new DefaultChoiceUserAgent());
62         return new DatabaseState(address, sessionContext);
63     }
64
65     public static DatabaseState oldSimanticsWorkspace(TestSettings testSettings, String address) throws Exception {
66         AcornTests.getTestHandler(testSettings, address);
67         initSimanticsStuff();
68         SessionContext sessionContext = SimanticsPlatform.INSTANCE.startUp(null, null, RecoveryPolicy.FixError,
69                 OntologyRecoveryPolicy.Merge, false, null);
70         return new DatabaseState(address, sessionContext);
71     }
72
73     public static void shutdown(DatabaseState state) throws Exception {
74         SCLOsgi.MODULE_REPOSITORY.flush();
75         SCLOsgi.SOURCE_REPOSITORY = null;
76         SCLOsgi.MODULE_REPOSITORY = null;
77         SCLOsgi.TEST_REPOSITORY = null;
78
79         if (Platform.isRunning()) {
80             SimanticsPlatform.INSTANCE.shutdown(null);
81             return;
82         } // Cleanup without platform code.
83         if (null == state)
84             return;
85         String address = state.getAddress();
86         try {
87             if (null != address)
88                 getTestHandler(null, address).getManagement().shutdown();
89         } catch (Throwable t) {
90             System.out.println(t);
91         }
92     }
93
94     public static void initOntology(Session session, String relative) throws DatabaseException {
95         // Open transferable graph file for layer0.
96         Binding binding;
97         try {
98             binding = Bindings.getBinding(TransferableGraph1.class);
99         } catch (BindingConstructionException e) {
100             throw new DatabaseException(e);
101         }
102         File t = new File(TestSettings.getInstance().getWorkspace(), relative);
103         if (!t.exists())
104             throw new DatabaseException("File does not exist. File=" + t + ".");
105
106         TransferableGraph1 layer0;
107         try {
108             InputStream is = new FileInputStream(t);
109             layer0 = (TransferableGraph1) Files.readFile(is, binding);
110             is.close();
111         } catch (Exception e) {
112             e.printStackTrace();
113             throw new DatabaseException(e);
114         }
115         try {
116             TransferableGraphs.importGraph(session, layer0);
117         } catch (Throwable e) {
118             e.printStackTrace();
119             throw new DatabaseException("Failed to init db.", e);
120         }
121     }
122
123     public static AcornTestHandler getTestHandler() throws DatabaseException {
124         return getTestHandler(null, null);
125     }
126
127     public static AcornTestHandler getTestHandler(TestSettings testSettings, String address)
128             throws DatabaseException {
129         if (null == testHandler)
130             testHandler = new AcornTestHandler(testSettings, address);
131         return testHandler;
132     }
133
134     public static void closeSession(Session session) throws DatabaseException {
135         try {
136             LifecycleSupport support = session.getService(LifecycleSupport.class);
137             support.close(-1, false);
138             session = null;
139         } catch (Exception e) {
140             session = null;
141             throw new DatabaseException("Session did not close cleanly.");
142         }
143     }
144
145 }