1 /*******************************************************************************
\r
2 * Copyright (c) 2012, 2013 Association for Decentralized Information Management in
\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.objmap.internal;
\r
14 import gnu.trove.map.hash.THashMap;
\r
16 import java.util.Collections;
\r
17 import java.util.Set;
\r
19 import org.simantics.db.ReadGraph;
\r
20 import org.simantics.objmap.exceptions.MappingException;
\r
21 import org.simantics.objmap.forward.IForwardLinkType;
\r
22 import org.simantics.objmap.forward.IForwardMapping;
\r
23 import org.simantics.objmap.forward.IForwardMappingSchema;
\r
25 public class MonotoneForwardMapping<Domain, Range> implements IForwardMapping<Domain, Range> {
\r
27 IForwardMappingSchema<Domain, Range> schema;
\r
28 THashMap<Domain, Range> map = new THashMap<Domain, Range>();
\r
30 public MonotoneForwardMapping(IForwardMappingSchema<Domain, Range> schema) {
\r
31 this.schema = schema;
\r
35 public Set<Domain> getDomain() {
\r
36 return Collections.unmodifiableSet(map.keySet());
\r
40 public Range get(Domain domainElement) {
\r
41 return map.get(domainElement);
\r
45 public Range map(ReadGraph graph, Domain domainElement) throws MappingException {
\r
46 Range result = get(domainElement);
\r
47 if(result == null) {
\r
48 IForwardLinkType<Domain, Range> linkType =
\r
49 schema.linkTypeOfDomainElement(graph, domainElement);
\r
50 // Two phase creation makes cyclic references possible
\r
51 Range rangeElement = linkType.createRangeElement(graph, domainElement);
\r
52 map.put(domainElement, rangeElement);
\r
53 linkType.createRange(graph, this, domainElement, rangeElement);
\r