1 /*******************************************************************************
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.db.tests.api.readGraph.adapt;
14 import org.junit.Before;
15 import org.junit.Test;
16 import org.simantics.db.AsyncReadGraph;
17 import org.simantics.db.ReadGraph;
18 import org.simantics.db.Resource;
19 import org.simantics.db.Session;
20 import org.simantics.db.WriteGraph;
21 import org.simantics.db.common.request.ResourceAsyncRead;
22 import org.simantics.db.common.request.WriteRequest;
23 import org.simantics.db.exception.AdaptionException;
24 import org.simantics.db.exception.DatabaseException;
25 import org.simantics.db.procedure.AsyncProcedure;
26 import org.simantics.db.request.Read;
27 import org.simantics.db.services.GlobalServiceInitializer;
28 import org.simantics.db.testing.base.ExistingDatabaseTest;
29 import org.simantics.layer0.Layer0;
32 * Checks that {@link ReadGraph#adapt(org.simantics.db.Resource, Class)},
33 * {@link ReadGraph#adaptUnique(org.simantics.db.Resource, Class)},
34 * <code>AsyncReadGraph.forAdapted</code> fail as expected.
37 * Regression test for https://www.simulationsite.net/trac/simantics/ticket/617
39 * @author Tuukka Lehtonen
41 public class AdaptionFailureTest extends ExistingDatabaseTest {
45 public void setUp() throws Exception {
47 new GlobalServiceInitializer().initialize(getSession());
50 private Resource writeTypeless(Session session) throws DatabaseException {
51 final Resource[] typeless = { null };
52 session.syncRequest(new WriteRequest() {
54 public void perform(WriteGraph graph) throws DatabaseException {
55 Layer0 l0 = Layer0.getInstance(graph);
56 Resource tless = graph.newResource();
57 Resource name = graph.newResource();
58 graph.claim(name, l0.InstanceOf, null, l0.String);
59 graph.claimValue(name, "A Typeless Resource");
60 graph.claim(tless, l0.HasName, name);
67 static abstract class Adapter {
70 public Adapter(String name) {
74 public abstract <T> T adapt(ReadGraph graph, Resource r, Class<T> clazz) throws DatabaseException;
77 public String toString() {
82 private void adaptTester(final Adapter adapter) throws DatabaseException {
83 final Session session = getSession();
84 final Resource typeless = writeTypeless(session);
86 String s = session.syncRequest(new Read<String>() {
88 public String perform(ReadGraph graph) throws DatabaseException {
90 return adapter.adapt(graph, typeless, String.class);
91 } catch (AdaptionException e) {
93 } catch (DatabaseException e) {
94 throw new DatabaseException("AdaptionException expected, got " + e, e);
100 fail(adapter + " must never return null");
101 } catch (AdaptionException e) {
102 // Failure with AdaptionException is expected
104 System.out.println("Expected failure message: " + e.getMessage());
109 public void testAdapt() throws DatabaseException{
110 adaptTester(new Adapter("ReadGraph.adapt") {
112 public <T> T adapt(ReadGraph graph, Resource resource, Class<T> clazz) throws DatabaseException {
113 return graph.adapt(resource, clazz);
119 public void testAdaptUnique() throws DatabaseException{
120 adaptTester(new Adapter("ReadGraph.adaptUnique") {
122 public <T> T adapt(ReadGraph graph, Resource resource, Class<T> clazz) throws DatabaseException {
123 return graph.adaptUnique(resource, clazz);
129 public void testforAdapted() throws DatabaseException{
130 adaptTester(new Adapter("AsyncReadGraph.forAdapted") {
132 public <T> T adapt(ReadGraph graph, Resource resource, final Class<T> clazz) throws DatabaseException {
133 return graph.syncRequest(new ResourceAsyncRead<T>(resource) {
135 public void perform(AsyncReadGraph graph, AsyncProcedure<T> procedure) {
136 graph.forAdapted(resource, clazz, procedure);
144 public void testforUniqueAdapted() throws DatabaseException{
145 adaptTester(new Adapter("AsyncReadGraph.forUniqueAdapted") {
147 public <T> T adapt(ReadGraph graph, Resource resource, final Class<T> clazz) throws DatabaseException {
148 return graph.syncRequest(new ResourceAsyncRead<T>(resource) {
150 public void perform(AsyncReadGraph graph, AsyncProcedure<T> procedure) {
151 graph.forUniqueAdapted(resource, clazz, procedure);