1 package org.exolab.castor.mapping.loader;
2
3 import java.util.Hashtable;
4 import java.util.Iterator;
5 import java.util.List;
6 import java.util.Map;
7 import java.util.Vector;
8
9 import org.exolab.castor.mapping.ClassDescriptor;
10 import org.exolab.castor.mapping.MappingException;
11 import org.exolab.castor.mapping.MappingLoader;
12
13 public abstract class AbstractMappingLoader2 implements MappingLoader {
14
15
16 private ClassLoader _loader;
17
18
19 private boolean _allowRedefinitions = false;
20
21
22 private boolean _loaded = false;
23
24
25
26
27 private final List<ClassDescriptor> _descriptors = new Vector<>();
28
29
30
31
32 private final Map<String, ClassDescriptor> _descriptorsByClassname =
33 new Hashtable<String, ClassDescriptor>();
34
35 public AbstractMappingLoader2(final ClassLoader loader) {
36 setClassLoader(loader);
37 }
38
39 public final void clear() {
40 _allowRedefinitions = false;
41 _loaded = false;
42 _descriptors.clear();
43 _descriptorsByClassname.clear();
44 }
45
46
47
48
49
50 public final void setClassLoader(final ClassLoader loader) {
51 if (loader == null) {
52 _loader = getClass().getClassLoader();
53 } else {
54 _loader = loader;
55 }
56 }
57
58
59
60
61 public final ClassLoader getClassLoader() {
62 return _loader;
63 }
64
65
66
67
68
69
70 public final void setAllowRedefinitions(boolean allow) {
71 _allowRedefinitions = allow;
72 }
73
74
75
76
77
78
79 public final boolean isAllowRedefinition() {
80 return _allowRedefinitions;
81 }
82
83
84
85
86
87
88
89
90 protected final void addDescriptor(final ClassDescriptor descriptor) throws MappingException {
91 String classname = descriptor.getJavaClass().getName();
92 if (_descriptorsByClassname.containsKey(classname)) {
93 if (!isAllowRedefinition()) {
94 throw new MappingException("mapping.duplicateDescriptors", classname);
95 }
96 for (Iterator<ClassDescriptor> iterator = _descriptors.iterator(); iterator.hasNext();) {
97 ClassDescriptor d = iterator.next();
98 if (classname.equals(d.getJavaClass().getName())) {
99 iterator.remove();
100 }
101 }
102 _descriptors.add(descriptor);
103 } else {
104 _descriptors.add(descriptor);
105 }
106
107
108 _descriptorsByClassname.put(classname, descriptor);
109 }
110
111
112
113
114 public final ClassDescriptor getDescriptor(final String classname) {
115 if (classname == null) {
116 return null;
117 }
118 return _descriptorsByClassname.get(classname);
119 }
120
121
122
123
124
125
126
127
128
129 public final List<ClassDescriptor> getDescriptors() {
130 return _descriptors;
131 }
132
133
134
135
136
137
138
139
140 protected final boolean loadMapping() {
141 if (_loaded) {
142 return false;
143 }
144 _loaded = true;
145 return true;
146 }
147
148 }