1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
\r
3 * in Industry THTH ry.
\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.g2d.diagram.impl;
\r
14 import java.io.Serializable;
\r
15 import java.util.ArrayList;
\r
16 import java.util.Collection;
\r
17 import java.util.Collections;
\r
18 import java.util.List;
\r
20 import org.simantics.utils.datastructures.MapList;
\r
23 * @author Toni Kalajainen
\r
25 public class AbstractHandlerClass<Handler> implements Serializable {
\r
27 private static final long serialVersionUID = 4137854678128072467L;
\r
29 private final MapList<Class<?>, Handler> handlers = new MapList<Class<?>, Handler>();
\r
30 private final List<Handler> snapshot;
\r
31 private final int hash;
\r
33 public AbstractHandlerClass(Collection<Handler> contributions)
\r
35 for (Handler c : contributions)
\r
36 _addClass(c.getClass(), c);
\r
37 this.handlers.makeImmutable();
\r
38 this.snapshot = Collections.unmodifiableList(new ArrayList<Handler>(contributions));
\r
39 this.hash = snapshot.hashCode();
\r
42 private void _addClass(Class<?> clazz, Handler ec)
\r
44 if (handlers.contains(clazz, ec)) return;
\r
45 handlers.add(clazz, ec);
\r
46 Class<?> superClazz = clazz.getSuperclass();
\r
47 if (superClazz!=null) _addClass(superClazz, ec);
\r
48 for (Class<?> interphase : clazz.getInterfaces())
\r
49 _addClass(interphase, ec);
\r
53 * Get all interactors by class
\r
55 * @return collection
\r
57 @SuppressWarnings("unchecked")
\r
58 public <R extends Handler> List<R> getItemsByClass(Class<R> clazz)
\r
60 List<R> result = (List<R>) handlers.getValuesUnsafe(clazz);
\r
63 return Collections.emptyList();
\r
67 * Get a single item by class.
\r
68 * (Convenience method)
\r
73 * @throws RuntimeException if single interactor was not found
\r
75 @SuppressWarnings("unchecked")
\r
76 public <R extends Handler> R getSingleItem(Class<R> clazz)
\r
78 List<R> list = (List<R>) handlers.getValuesUnsafe(clazz);
\r
79 if (list==null || list.size()!=1)
\r
80 throw new RuntimeException("Invalid element class "+toString()+": One and only one "+clazz.getName()+" is expected, got " + (list != null ? list.size() : 0));
\r
85 * Get a single item by class.
\r
86 * (Convenience method)
\r
90 * @return the item or <code>null</code>
\r
91 * @throws RuntimeException if more than one items were found
\r
93 @SuppressWarnings("unchecked")
\r
94 public <R extends Handler> R getAtMostOneItemOfClass(Class<R> clazz)
\r
96 List<R> list = (List<R>) handlers.getValuesUnsafe(clazz);
\r
97 if (list==null || list.size()==0) return null;
\r
98 if (list.size()==1) return list.get(0);
\r
99 throw new RuntimeException("At most one was "+clazz.getName()+" expected in "+this.getClass().getName() + ", got " + list.size());
\r
102 public <R extends Handler> R[] getAtMostItemsOfClass(Class<R> clazz, R[] result)
\r
104 handlers.getAtMostValues(clazz, result);
\r
108 public List<Handler> getAll()
\r
113 public boolean contains(Handler handler)
\r
115 return getAll().contains(handler);
\r
118 @SuppressWarnings("unchecked")
\r
119 public <R extends Handler> boolean containsClass(Class<R> clazz)
\r
121 List<R> list = (List<R>) handlers.getValuesUnsafe(clazz);
\r
122 if (list==null || list.size()==0) return false;
\r
123 return list.size()>0;
\r
127 public int hashCode() {
\r
132 public boolean equals(Object obj) {
\r
137 if (!(obj instanceof AbstractHandlerClass<?>))
\r
139 AbstractHandlerClass<?> other = (AbstractHandlerClass<?>) obj;
\r
140 return snapshot.equals(other.snapshot);
\r