001 // Copyright 2004, 2005 The Apache Software Foundation 002 // 003 // Licensed under the Apache License, Version 2.0 (the "License"); 004 // you may not use this file except in compliance with the License. 005 // You may obtain a copy of the License at 006 // 007 // http://www.apache.org/licenses/LICENSE-2.0 008 // 009 // Unless required by applicable law or agreed to in writing, software 010 // distributed under the License is distributed on an "AS IS" BASIS, 011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 012 // See the License for the specific language governing permissions and 013 // limitations under the License. 014 015 package org.apache.hivemind.parse; 016 017 import java.util.ArrayList; 018 import java.util.Collection; 019 import java.util.Collections; 020 import java.util.HashMap; 021 import java.util.List; 022 import java.util.Map; 023 024 import org.apache.commons.logging.Log; 025 import org.apache.commons.logging.LogFactory; 026 import org.apache.hivemind.ClassResolver; 027 import org.apache.hivemind.ErrorHandler; 028 import org.apache.hivemind.schema.Schema; 029 import org.apache.hivemind.schema.impl.SchemaImpl; 030 import org.apache.hivemind.util.ToStringBuilder; 031 032 /** 033 * Representation of a HiveMind module descriptor, as parsed by 034 * {@link org.apache.hivemind.parse.DescriptorParser}. Corresponds to the root <module> 035 * element. 036 * 037 * @author Howard Lewis Ship 038 */ 039 public final class ModuleDescriptor extends BaseAnnotationHolder 040 { 041 /** @since 1.1 */ 042 private static final Log LOG = LogFactory.getLog(ModuleDescriptor.class); 043 044 private String _moduleId; 045 046 private String _version; 047 048 /** @since 1.1 */ 049 050 private String _packageName; 051 052 private List _servicePoints; 053 054 private List _implementations; 055 056 private List _configurationPoints; 057 058 private List _contributions; 059 060 private List _subModules; 061 062 private List _dependencies; 063 064 /** @since 1.1 */ 065 private Map _schemas; 066 067 private ClassResolver _resolver; 068 069 /** @since 1.1 */ 070 private ErrorHandler _errorHandler; 071 072 public ModuleDescriptor(ClassResolver resolver, ErrorHandler errorHandler) 073 { 074 _resolver = resolver; 075 _errorHandler = errorHandler; 076 } 077 078 public String toString() 079 { 080 ToStringBuilder builder = new ToStringBuilder(this); 081 082 builder.append("moduleId", _moduleId); 083 builder.append("version", _version); 084 085 return builder.toString(); 086 } 087 088 public void addServicePoint(ServicePointDescriptor service) 089 { 090 if (_servicePoints == null) 091 _servicePoints = new ArrayList(); 092 093 _servicePoints.add(service); 094 } 095 096 public List getServicePoints() 097 { 098 return _servicePoints; 099 } 100 101 public void addImplementation(ImplementationDescriptor descriptor) 102 { 103 if (_implementations == null) 104 _implementations = new ArrayList(); 105 106 _implementations.add(descriptor); 107 } 108 109 public List getImplementations() 110 { 111 return _implementations; 112 } 113 114 public void addConfigurationPoint(ConfigurationPointDescriptor descriptor) 115 { 116 if (_configurationPoints == null) 117 _configurationPoints = new ArrayList(); 118 119 _configurationPoints.add(descriptor); 120 } 121 122 public List getConfigurationPoints() 123 { 124 return _configurationPoints; 125 } 126 127 public void addContribution(ContributionDescriptor descriptor) 128 { 129 if (_contributions == null) 130 _contributions = new ArrayList(); 131 132 _contributions.add(descriptor); 133 } 134 135 public List getContributions() 136 { 137 return _contributions; 138 } 139 140 public void addSubModule(SubModuleDescriptor subModule) 141 { 142 if (_subModules == null) 143 _subModules = new ArrayList(); 144 145 _subModules.add(subModule); 146 } 147 148 public List getSubModules() 149 { 150 return _subModules; 151 } 152 153 public void addDependency(DependencyDescriptor dependency) 154 { 155 if (_dependencies == null) 156 _dependencies = new ArrayList(); 157 158 _dependencies.add(dependency); 159 } 160 161 public List getDependencies() 162 { 163 return _dependencies; 164 } 165 166 /** 167 * Adds a schema to this module descriptor. If a schema with the same id already has been added, 168 * an error is reported and the given schema is ignored. 169 * 170 * @since 1.1 171 */ 172 public void addSchema(SchemaImpl schema) 173 { 174 if (_schemas == null) 175 _schemas = new HashMap(); 176 177 String schemaId = schema.getId(); 178 179 Schema existing = getSchema(schemaId); 180 181 if (existing != null) 182 { 183 _errorHandler.error(LOG, ParseMessages.duplicateSchema( 184 _moduleId + '.' + schemaId, 185 existing), schema.getLocation(), null); 186 return; 187 } 188 189 _schemas.put(schemaId, schema); 190 } 191 192 /** @since 1.1 */ 193 public Schema getSchema(String id) 194 { 195 return _schemas == null ? null : (Schema) _schemas.get(id); 196 } 197 198 /** 199 * Returns a Collection of {@link org.apache.hivemind.schema.impl.SchemaImpl}. 200 * 201 * @since 1.1 202 */ 203 public Collection getSchemas() 204 { 205 return _schemas != null ? _schemas.values() : Collections.EMPTY_LIST; 206 } 207 208 public String getModuleId() 209 { 210 return _moduleId; 211 } 212 213 public String getVersion() 214 { 215 return _version; 216 } 217 218 public void setModuleId(String string) 219 { 220 _moduleId = string; 221 } 222 223 public void setVersion(String string) 224 { 225 _version = string; 226 } 227 228 public ClassResolver getClassResolver() 229 { 230 return _resolver; 231 } 232 233 /** 234 * Returns the name of the package to search for class names within. By default, the package 235 * name will match the module id, but this can be overridden in the module descriptor. 236 * 237 * @since 1.1 238 */ 239 240 public String getPackageName() 241 { 242 return _packageName; 243 } 244 245 /** @since 1.1 */ 246 247 public void setPackageName(String packageName) 248 { 249 _packageName = packageName; 250 } 251 }