View Javadoc
1 package org.jellyfish.implementation; 2 3 import java.beans.PropertyDescriptor; 4 import java.lang.reflect.InvocationTargetException; 5 import java.util.Collection; 6 import java.util.HashMap; 7 import java.util.Iterator; 8 import java.util.Map; 9 10 import javax.naming.NamingException; 11 import javax.naming.directory.Attribute; 12 import javax.naming.directory.Attributes; 13 import javax.naming.directory.BasicAttribute; 14 import javax.naming.directory.BasicAttributes; 15 16 import org.apache.avalon.framework.logger.LogEnabled; 17 import org.apache.avalon.framework.service.ServiceException; 18 import org.apache.avalon.framework.service.ServiceManager; 19 import org.apache.avalon.framework.service.Serviceable; 20 import org.apache.commons.beanutils.BeanUtils; 21 import org.apache.commons.beanutils.ConvertUtils; 22 import org.apache.commons.beanutils.Converter; 23 import org.apache.commons.beanutils.PropertyUtils; 24 import org.jellyfish.ConfigurationManager; 25 import org.jellyfish.MappingManager; 26 import org.jellyfish.ObjectMapNotFoundException; 27 import org.jellyfish.config.AttributeMapping; 28 import org.jellyfish.config.ObjectMapping; 29 30 public class MappingManagerDefault 31 implements MappingManager, Serviceable, LogEnabled { 32 private static MappingManagerDefault instance; 33 34 private static final String START_DN_ATTRIBUTE = "${"; 35 private static final String END_DN_ATTRIBUTE = "}"; 36 37 private Map objectMappingCache = new HashMap(); 38 39 private ServiceManager serviceManager; 40 41 private org.apache.avalon.framework.logger.Logger logger; 42 43 private ConfigurationManager configurationManager; 44 45 public MappingManagerDefault() { 46 } 47 48 public void service(ServiceManager serviceManager) 49 throws ServiceException { 50 this.serviceManager = serviceManager; 51 try { 52 configurationManager = 53 (ConfigurationManager) serviceManager.lookup( 54 ConfigurationManager.ROLE); 55 } catch (ServiceException e) { 56 e.printStackTrace(); 57 throw new RuntimeException(e); 58 } 59 } 60 61 public void enableLogging( 62 org.apache.avalon.framework.logger.Logger logger) { 63 this.logger = logger; 64 } 65 66 private Converter createConverter() { 67 try { 68 return (Converter) serviceManager.lookup(Converter.class.getName()); 69 } catch (ServiceException e) { 70 e.printStackTrace(); 71 throw new RuntimeException(e); 72 } 73 } 74 public Attributes mapToAttributes(Object object) { 75 Attributes attributes = new BasicAttributes(); 76 try { 77 for (Iterator iterator = 78 getObjectMapping(object).getAttributeMappings().iterator(); 79 iterator.hasNext(); 80 ) { 81 AttributeMapping attributeMapping = 82 (AttributeMapping) iterator.next(); 83 Object value = 84 getObjectProperty(object, attributeMapping.getJavaName()); 85 storeValueInAttributes( 86 attributes, 87 attributeMapping.getLdapName(), 88 value); 89 } 90 } catch (ObjectMapNotFoundException e) { 91 logException(object, e); 92 } 93 return attributes; 94 } 95 96 private void storeValueInAttributes( 97 Attributes attributes, 98 String name, 99 Object value) { 100 if (value instanceof Collection) { 101 for (Iterator iterator = ((Collection) value).iterator(); 102 iterator.hasNext(); 103 ) { 104 Object subValue = iterator.next(); 105 storeValueInAttributes(attributes, name, subValue); 106 } 107 } else if (value instanceof Object[]) { 108 for (int index = 0; index < ((Object[]) value).length; index++) { 109 storeValueInAttributes( 110 attributes, 111 name, 112 ((Object[]) value)[index]); 113 } 114 } else { 115 if (isMappedClass(value)) { 116 value = getObjectDn(value); 117 } 118 119 if (value != null) { 120 Attribute attribute = attributes.get(name); 121 if (attribute == null) { 122 attribute = new BasicAttribute(name); 123 attributes.put(attribute); 124 } 125 attribute.add(value); 126 } 127 } 128 } 129 130 private boolean isMappedClass(Object value) { 131 return value != null 132 && objectMappingCache.containsKey(value.getClass()); 133 } 134 135 public Object mapFromAttributes(Attributes attributes) { 136 Object object = null; 137 try { 138 ObjectMapping objectMapping = getObjectMapping(attributes); 139 object = Class.forName(objectMapping.getJavaName()).newInstance(); 140 Map objectProperties = new HashMap(); 141 for (Iterator iterator = 142 objectMapping.getAttributeMappings().iterator(); 143 iterator.hasNext(); 144 ) { 145 AttributeMapping attributeMapping = 146 (AttributeMapping) iterator.next(); 147 Attribute attribute = 148 attributes.get(attributeMapping.getLdapName()); 149 150 objectProperties.put( 151 attributeMapping.getJavaName(), 152 getValueFromAttribute( 153 attribute, 154 object, 155 attributeMapping.getJavaName(), 156 attributeMapping.getType())); 157 } 158 setObjectProperties(object, objectProperties); 159 } catch (ObjectMapNotFoundException e) { 160 logger.fatalError(e.getMessage(), e); 161 } catch (InstantiationException e) { 162 logger.fatalError(e.getMessage(), e); 163 } catch (IllegalAccessException e) { 164 logger.fatalError(e.getMessage(), e); 165 } catch (ClassNotFoundException e) { 166 logger.fatalError(e.getMessage(), e); 167 } catch (NamingException e) { 168 logger.fatalError(e.getMessage(), e); 169 } 170 return object; 171 } 172 173 private Object getValueFromAttribute( 174 Attribute attribute, 175 Object object, 176 String propertyName, 177 String propertyType) 178 throws 179 ClassNotFoundException, 180 NamingException, 181 InstantiationException, 182 IllegalAccessException { 183 if (attribute == null) { 184 return null; 185 } 186 187 Object value = null; 188 Class propertyClass = null; 189 if (propertyType == null || propertyType.trim().length() == 0) { 190 propertyClass = getTypeOfProperty(object, propertyName); 191 } else { 192 propertyClass = Class.forName(propertyType); 193 } 194 195 if (Collection.class.isAssignableFrom(propertyClass)) { 196 value = 197 getCollectionFromAttribute( 198 attribute, 199 value, 200 propertyName, 201 (Collection) propertyClass.newInstance()); 202 } else if ( 203 Object[].class.isAssignableFrom( 204 getTypeOfProperty(object, propertyName))) { 205 value = getArrayFromAttribute(attribute, value, propertyName); 206 } else { 207 value = attribute.get(); 208 } 209 return value; 210 } 211 212 private Object getInstanceOfProperty(Object object, String propertyName) { 213 try { 214 return getTypeOfProperty(object, propertyName).newInstance(); 215 } catch (InstantiationException e) { 216 logException(object, e); 217 } catch (IllegalAccessException e) { 218 logException(object, e); 219 } 220 return null; 221 } 222 223 private Class getTypeOfProperty(Object object, String propertyName) { 224 try { 225 PropertyDescriptor descriptor = 226 PropertyUtils.getPropertyDescriptor(object, propertyName); 227 return descriptor.getPropertyType(); 228 } catch (IllegalAccessException e) { 229 logException(object, e); 230 } catch (InvocationTargetException e) { 231 logException(object, e); 232 } catch (NoSuchMethodException e) { 233 logException(object, e); 234 } 235 return null; 236 } 237 238 private Collection getCollectionFromAttribute( 239 Attribute attribute, 240 Object object, 241 String propertyName, 242 Collection container) 243 throws NamingException { 244 if (attribute != null) { 245 for (int index = 0; index < attribute.size(); index++) { 246 container.add(attribute.get(index)); 247 } 248 } 249 return container; 250 } 251 252 private Object[] getArrayFromAttribute( 253 Attribute attribute, 254 Object object, 255 String propertyName) 256 throws NamingException { 257 String[] values = new String[attribute.size()]; 258 for (int index = 0; index < values.length; index++) { 259 values[index] = (String) attribute.get(index); 260 } 261 return values; 262 } 263 264 private void setObjectProperties(Object object, Map properties) { 265 try { 266 BeanUtils.populate(object, properties); 267 } catch (IllegalAccessException e) { 268 logException(object, e); 269 } catch (InvocationTargetException e) { 270 logException(object, e); 271 } catch (IllegalArgumentException e) { 272 logException(object, e); 273 } 274 } 275 276 private Object getObjectProperty(Object object, String property) { 277 try { 278 return PropertyUtils.getProperty(object, property); 279 } catch (IllegalAccessException e) { 280 logException(object, e); 281 } catch (InvocationTargetException e) { 282 logException(object, e); 283 } catch (NoSuchMethodException e) { 284 logException(object, e); 285 } 286 return ""; 287 } 288 289 public ObjectMapping getObjectMapping(Object object) 290 throws ObjectMapNotFoundException { 291 if (objectMappingCache.containsKey(object)) { 292 return (ObjectMapping) objectMappingCache.get(object.getClass()); 293 } 294 295 for (Iterator iterator = 296 configurationManager 297 .getConfiguration() 298 .getObjectMappings() 299 .iterator(); 300 iterator.hasNext(); 301 ) { 302 ObjectMapping objectMapping = (ObjectMapping) iterator.next(); 303 if (objectMapping 304 .getJavaName() 305 .equals(object.getClass().getName())) { 306 objectMappingCache.put(object.getClass(), objectMapping); 307 ConvertUtils.register(createConverter(), object.getClass()); 308 return objectMapping; 309 } 310 } 311 312 throw new ObjectMapNotFoundException(object); 313 } 314 315 public ObjectMapping getObjectMapping(Attributes attributes) 316 throws ObjectMapNotFoundException { 317 String ldapName = null; 318 try { 319 if (attributes.get(OBJECTCLASS) != null) { 320 ldapName = (String) attributes.get(OBJECTCLASS).get(); 321 for (Iterator iterator = 322 configurationManager 323 .getConfiguration() 324 .getObjectMappings() 325 .iterator(); 326 iterator.hasNext(); 327 ) { 328 ObjectMapping objectMapping = 329 (ObjectMapping) iterator.next(); 330 if (objectMapping 331 .getLdapName() 332 .equals(attributes.get(OBJECTCLASS).get())) { 333 return objectMapping; 334 } 335 } 336 } else { 337 logger.fatalError("No objectclass attribute!"); 338 } 339 } catch (NamingException exception) { 340 logger.fatalError(exception.getMessage(), exception); 341 } 342 343 throw new ObjectMapNotFoundException(ldapName); 344 } 345 346 public String getUserDn(String username) { 347 348 String dnPattern = configurationManager.getConfiguration().getUserDn(); 349 int dnAttributeStart = dnPattern.indexOf(START_DN_ATTRIBUTE); 350 int dnAttributeEnd = dnPattern.indexOf(END_DN_ATTRIBUTE); 351 String dnAttribute = 352 dnPattern.substring( 353 dnAttributeStart + START_DN_ATTRIBUTE.length(), 354 dnAttributeEnd); 355 StringBuffer dn = new StringBuffer(); 356 dn.append(dnPattern.substring(0, dnAttributeStart)); 357 dn.append(username); 358 dn.append( 359 dnPattern.substring(dnAttributeEnd + END_DN_ATTRIBUTE.length())); 360 if (configurationManager.getConfiguration().getBaseDn().length() > 0) { 361 dn.append(','); 362 } 363 dn.append(configurationManager.getConfiguration().getBaseDn()); 364 return dn.toString(); 365 } 366 367 public String getObjectDn(Object object) { 368 try { 369 String dnPattern = getObjectMapping(object).getDn(); 370 int dnAttributeStart = dnPattern.indexOf(START_DN_ATTRIBUTE); 371 int dnAttributeEnd = dnPattern.indexOf(END_DN_ATTRIBUTE); 372 String dnAttribute = 373 dnPattern.substring( 374 dnAttributeStart + START_DN_ATTRIBUTE.length(), 375 dnAttributeEnd); 376 StringBuffer dn = new StringBuffer(); 377 dn.append(dnPattern.substring(0, dnAttributeStart)); 378 dn.append(getObjectProperty(object, dnAttribute)); 379 dn.append( 380 dnPattern.substring( 381 dnAttributeEnd + END_DN_ATTRIBUTE.length())); 382 if (configurationManager.getConfiguration().getBaseDn().length() 383 > 0) { 384 dn.append(','); 385 } 386 dn.append(configurationManager.getConfiguration().getBaseDn()); 387 return dn.toString(); 388 } catch (ObjectMapNotFoundException e) { 389 logException(object, e); 390 } 391 return ""; 392 } 393 394 private void logException(Object object, Exception exception) { 395 logger.fatalError("Mapping " + object + ": " + exception.getMessage()); 396 exception.printStackTrace(); 397 } 398 }

This page was automatically generated by Maven