]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/impl/AbstractHandlerClass.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.g2d / src / org / simantics / g2d / diagram / impl / AbstractHandlerClass.java
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
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.g2d.diagram.impl;\r
13 \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
19 \r
20 import org.simantics.utils.datastructures.MapList;\r
21 \r
22 /**\r
23  * @author Toni Kalajainen\r
24  */\r
25 public class AbstractHandlerClass<Handler> implements Serializable {\r
26 \r
27     private static final long serialVersionUID = 4137854678128072467L;\r
28 \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
32 \r
33     public AbstractHandlerClass(Collection<Handler> contributions)\r
34     {\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
40     }\r
41 \r
42     private void _addClass(Class<?> clazz, Handler ec)\r
43     {\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
50     }\r
51 \r
52     /**\r
53      * Get all interactors by class\r
54      * @param clazz\r
55      * @return collection\r
56      */\r
57     @SuppressWarnings("unchecked")\r
58     public <R extends Handler> List<R> getItemsByClass(Class<R> clazz)\r
59     {\r
60         List<R> result = (List<R>) handlers.getValuesUnsafe(clazz);\r
61         if (result!=null)\r
62             return result;\r
63         return Collections.emptyList();\r
64     }\r
65 \r
66     /**\r
67      * Get a single item by class.\r
68      * (Convenience method)\r
69      * \r
70      * @param <R>\r
71      * @param clazz\r
72      * @return the item\r
73      * @throws RuntimeException if single interactor was not found\r
74      */\r
75     @SuppressWarnings("unchecked")\r
76     public <R extends Handler> R getSingleItem(Class<R> clazz)\r
77     {\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
81         return list.get(0);\r
82     }\r
83 \r
84     /**\r
85      * Get a single item by class.\r
86      * (Convenience method)\r
87      * \r
88      * @param <R>\r
89      * @param clazz\r
90      * @return the item or <code>null</code>\r
91      * @throws RuntimeException if more than one items were found\r
92      */\r
93     @SuppressWarnings("unchecked")\r
94     public <R extends Handler> R getAtMostOneItemOfClass(Class<R> clazz)\r
95     {\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
100     }\r
101 \r
102     public <R extends Handler> R[] getAtMostItemsOfClass(Class<R> clazz, R[] result)\r
103     {\r
104         handlers.getAtMostValues(clazz, result);\r
105         return result;\r
106     }\r
107 \r
108     public List<Handler> getAll()\r
109     {\r
110         return snapshot;\r
111     }\r
112 \r
113     public boolean contains(Handler handler)\r
114     {\r
115         return getAll().contains(handler);\r
116     }\r
117 \r
118     @SuppressWarnings("unchecked")\r
119     public <R extends Handler> boolean containsClass(Class<R> clazz)\r
120     {\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
124     }\r
125 \r
126     @Override\r
127     public int hashCode() {\r
128         return hash;\r
129     }\r
130 \r
131     @Override\r
132     public boolean equals(Object obj) {\r
133         if (this == obj)\r
134             return true;\r
135         if (obj == null)\r
136             return false;\r
137         if (!(obj instanceof AbstractHandlerClass<?>))\r
138             return false;\r
139         AbstractHandlerClass<?> other = (AbstractHandlerClass<?>) obj;\r
140         return snapshot.equals(other.snapshot);\r
141     }\r
142 \r
143 }\r