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