1 /***
2 * Copyright 2006 Joseph M. Ferner
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package com.fernsroth.easyio;
17
18 import java.lang.annotation.Annotation;
19 import java.lang.reflect.Field;
20 import java.util.HashMap;
21 import java.util.Map;
22
23 import com.fernsroth.easyio.field.FieldINT64;
24 import com.fernsroth.easyio.field.FieldUINT16;
25 import com.fernsroth.easyio.field.FieldUINT32;
26 import com.fernsroth.easyio.field.FieldUINT64;
27 import com.fernsroth.easyio.field.FieldUINT8;
28 import com.fernsroth.easyio.field.handler.FieldINT64Handler;
29 import com.fernsroth.easyio.field.handler.FieldUINT16Handler;
30 import com.fernsroth.easyio.field.handler.FieldUINT32Handler;
31 import com.fernsroth.easyio.field.handler.FieldUINT64Handler;
32 import com.fernsroth.easyio.field.handler.FieldUINT8Handler;
33
34 /***
35 *
36 * @author Joseph M. Ferner (Near Infinity Corporation)
37 */
38 public class DefaultFieldHandlerRegistry implements FieldHandlerRegistry {
39
40 /***
41 * the instance.
42 */
43 private static DefaultFieldHandlerRegistry instance;
44
45 /***
46 * the registry.
47 */
48 private Map<Class<? extends Annotation>, FieldHandler> registry = new HashMap<Class<? extends Annotation>, FieldHandler>();
49
50 /***
51 * gets an instance of the this class.
52 * @return the instance.
53 */
54 public static FieldHandlerRegistry getInstance() {
55 if (instance == null) {
56 instance = new DefaultFieldHandlerRegistry();
57 instance.register(FieldUINT8.class, new FieldUINT8Handler());
58 instance.register(FieldUINT16.class, new FieldUINT16Handler());
59 instance.register(FieldUINT32.class, new FieldUINT32Handler());
60 instance.register(FieldINT64.class, new FieldINT64Handler());
61 instance.register(FieldUINT64.class, new FieldUINT64Handler());
62 }
63 return instance;
64 }
65
66 /***
67 * @param an the annotation to register.
68 * @param handler the handler.
69 */
70 public void register(Class<? extends Annotation> an, FieldHandler handler) {
71 this.registry.put(an, handler);
72 }
73
74 /***
75 * {@inheritDoc}
76 */
77 public FieldHandler lookup(Object obj, Field field) {
78 for (Annotation an : field.getDeclaredAnnotations()) {
79 Class<? extends Annotation> anType = an.annotationType();
80 FieldHandler handler = this.registry.get(anType);
81 if (handler != null) {
82 return handler;
83 }
84 }
85
86 for (Annotation an : field.getAnnotations()) {
87 Class<? extends Annotation> anType = an.annotationType();
88 FieldHandler handler = this.registry.get(anType);
89 if (handler != null) {
90 return handler;
91 }
92 }
93 return null;
94 }
95 }