@Override public String toString() { final String objectName = initializable.getName(); return "PendingInitialization[" + (objectName != null ? objectName + "|" : "") + object + "]"; } }
protected void addException(final Descriptor descriptor, final Exception exception) { if (exceptions == null) { exceptions = new HashMap<String, Exception>(); } exceptions.put(descriptor.getName(), exception); }
void addPendingInitialization(final Object object, final Descriptor descriptor) { if (pendingInitializations == null) { pendingInitializations = new HashMap<String, PendingInitialization>(); } pendingInitializations.put(descriptor.getName(), new PendingInitialization(object, descriptor)); }
void processPendingInitializations() { if (pendingInitializations != null) { final Collection<PendingInitialization> pendingInitializationValues = new HashSet<PendingInitialization>( pendingInitializations.values()); for (PendingInitialization pi : pendingInitializationValues) { // move pi from pending initializations to under initialization final String objectName = pi.initializable.getName(); pi = pendingInitializations.remove(objectName); if (pi != null) { // initialize performInitialization(pi.object, pi.initializable); } } } }
Object construct(final Descriptor descriptor) { Object object; final String objectName = descriptor.getName(); if (objectName != null) { fireObjectEvent(Descriptor.EVENT_CONSTRUCTING, objectName, null); if (underConstruction == null) { underConstruction = new HashSet<String>(); } underConstruction.add(objectName); if (LOG.isLoggable(Level.FINE)) { LOG.fine("constructing " + objectName); } } try { object = descriptor.construct(this); } catch (final RuntimeException e) { addException(descriptor, e); throw e; } if (objectName != null) { underConstruction.remove(objectName); } return object; }
void performInitialization(final Object object, final Descriptor descriptor) { final String objectName = descriptor.getName(); if (objectName != null) { fireObjectEvent(Descriptor.EVENT_INITIALIZING, objectName, object); if (underInitialization == null) { underInitialization = new HashMap<String, Object>(); } underInitialization.put(objectName, object); if (LOG.isLoggable(Level.FINE)) { LOG.fine("initializing " + objectName); } } try { descriptor.initialize(object, this); } catch (final RuntimeException e) { addException(descriptor, e); throw e; } if (objectName != null) { underInitialization.remove(objectName); // event constructed is fired before the object is put in the cache // because that generates a set event fireObjectEvent(Descriptor.EVENT_CONSTRUCTED, objectName, object); set(objectName, object); } }
void initialize(final Object object, final Descriptor descriptor, final boolean isDelayable) { final InitializationType initializationType = getInitializationType(object, descriptor, isDelayable); if (initializationType == InitializationType.IMMEDIATE) { performInitialization(object, descriptor); } else if (initializationType == InitializationType.DELAYEBLE) { addPendingInitialization(object, descriptor); } else { final String objectName = descriptor.getName(); if (objectName != null) { set(objectName, object); } } }
public void addDescriptor(Descriptor descriptor) { if (descriptor != null) { String name = descriptor.getName(); if (useTypes) { Class<?> type = descriptor.getType(this); if (type != null) { if ((name == null) && (descriptor instanceof AbstractDescriptor)) { name = type.getName(); ((AbstractDescriptor) descriptor).setName(type.getName()); } if ((name != null) && ((descriptors == null) || (!descriptors.containsKey(name)))) { // add all superclasses and interfaces to map to this descriptor addDescriptorType(type, descriptor, name); } } } if ((name != null) && (!hasDescriptor(name))) { putDescriptor(name, descriptor); if (descriptor.isEagerInit()) { addEagerInitObjectName(name); } } } }