1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2011 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.databoard.binding.factory;
\r
14 import java.util.HashMap;
\r
15 import java.util.Map;
\r
16 import java.util.Map.Entry;
\r
18 import org.simantics.databoard.binding.Binding;
\r
19 import org.simantics.databoard.binding.reflection.BindingRequest;
\r
21 public class BindingRepository {
\r
24 * This map contains all the bindings
\r
26 Map<BindingRequest, Binding> requestMap;
\r
29 * This map contains bindings for non-generic classes.
\r
31 Map<Class<?>, Binding> classMap;
\r
33 public BindingRepository() {
\r
34 requestMap = new HashMap<BindingRequest, Binding>();
\r
35 classMap = new HashMap<Class<?>, Binding>();
\r
38 public BindingRepository(Map<BindingRequest, Binding> requests) {
\r
39 this.requestMap = requests;
\r
40 for (Entry<BindingRequest, Binding> e : requests.entrySet()) {
\r
41 if ( isClassRequest( e.getKey() ) ) {
\r
42 classMap.put(e.getKey().getClazz(), e.getValue());
\r
48 * Get binding for a class. May return the class if it is in the class map.
\r
49 * If not, the user should try request map with some arguments (component bindings)
\r
54 public synchronized Binding get(Class<?> clazz) {
\r
55 return classMap.get( clazz );
\r
59 * Get binding for a binding request
\r
62 * @return binding or null
\r
64 public synchronized Binding get( BindingRequest request ) {
\r
65 return requestMap.get( request );
\r
69 * Adds binding to the repository. If the request has no arguments, the
\r
70 * class is added to classMap, and is available with class request.
\r
75 public synchronized void put( BindingRequest request, Binding binding ) {
\r
76 if ( isClassRequest(request) ) {
\r
77 classMap.put( request.getClazz(), binding );
\r
79 requestMap.put( request, binding );
\r
82 public synchronized void remove(Binding binding) {
\r
83 for (Entry<BindingRequest, Binding> e : requestMap.entrySet()) {
\r
84 if (e.getValue() == binding) {
\r
85 requestMap.remove(e.getValue());
\r
90 for (Entry<Class<?>, Binding> e : classMap.entrySet()) {
\r
91 if (e.getValue() == binding) {
\r
92 classMap.remove(e.getValue());
\r
98 public synchronized boolean containsRequest( BindingRequest request ) {
\r
99 return requestMap.containsKey( request );
\r
103 * Checks if repository contains a class without arguments
\r
106 * @return true if contains class (without args)
\r
108 public synchronized boolean containsClass( Class<?> clazz ) {
\r
109 return classMap.containsKey( clazz );
\r
112 public synchronized void clear() {
\r
113 requestMap.clear();
\r
117 boolean isClassRequest( BindingRequest request )
\r
119 return request.className != null && (request.annotations==null || request.annotations.length==0);
\r