/** * Start tracking dependencies. */ public void start(){ myListeningFlag = true; myRequiredCount = 0; for(DependencyDescriptor desc : myDependencyDescMap.values()){ if(DependencyType.REQUIRED == desc.getDependencyType()){ myRequiredCount++; } } for(SingleServiceListener ssl : myDependencyTrackers.values()){ ssl.start(); } }
private synchronized void dependencyChanged(String requirementId, Object req){ if(requirementId == null || req == null){ throw new NullPointerException(); }DependencyDescriptor desc = myDependencyDescMap.get(requirementId); if(desc == null){ return; }else if(DependencyType.REQUIRED == desc.getDependencyType()){ getLogger().info("Required dependency changed: {0}", requirementId); myRequiredDependencies.put(requirementId, req); }else{ getLogger().info("Optional dependency changed: {0}", requirementId); } myAvailableDependencies.put(requirementId, req); firePropertyChange(PROP_DEPENDENCY_CHANGED, requirementId, req); }
private synchronized void dependencyLost(String requirementId){ if(requirementId == null){ throw new NullPointerException(); } DependencyDescriptor desc = myDependencyDescMap.get(requirementId); if(desc == null){ return; }else if(DependencyType.REQUIRED == desc.getDependencyType()){ myRequiredDependencies.remove(requirementId); getLogger().info("Lost required dependency: {0}", requirementId); }else{ getLogger().info("Lost optional dependency: {0}", requirementId); } myAvailableDependencies.remove(requirementId); firePropertyChange(PROP_DEPENDENCY_UNAVAILABLE, requirementId, null); }
}else if(depdendencies == null || depdendencies.isEmpty()){ for(DependencyDescriptor desc : descriptors){ if(DependencyType.REQUIRED == desc.getDependencyType()){ return false;
private synchronized void dependencyFound(String requirementId, Object req){ if(requirementId == null || req == null){ throw new NullPointerException(); } DependencyDescriptor desc = myDependencyDescMap.get(requirementId); if(desc == null){ return; }else if(DependencyType.REQUIRED == desc.getDependencyType()){ getLogger().info("Found required dependency: {0}", requirementId); myRequiredDependencies.put(requirementId, req); }else{ getLogger().info("Found optional dependency: {0}", requirementId); } myAvailableDependencies.put(requirementId, req); firePropertyChange(PROP_DEPENDENCY_AVAILABLE, requirementId, req); checkRequiredDependencies(); }
/** * Validates a DependencyDescriptor against a map of dependencies. A * descriptor is valid if there is an entry where the key and the * dependency's class matches the descriptor's fields. If there is no * dependency for the name, the descriptor is only valid if it is * optional. * If the dependecy's class does not match the descriptor, it is * invalid. * @param descriptor descriptor to check for * @param dependencies map of ids and dependencies to check against * @return true is a map entry matches the descriptor, false otherwise */ private static boolean checkDescriptor( DependencyDescriptor descriptor, Map<String,Object> dependencies){ String id = descriptor.getDependencyName(); Object req = dependencies.get(id); if(req == null){ return DependencyType.OPTIONAL == descriptor.getDependencyType(); } Class reqClass = descriptor.getServiceClass(); if(!reqClass.isAssignableFrom(req.getClass())){ return false; } return true; }
/** * Adds the description to the list of dependency to listen for. * @param descriptor dependency description to listen for * @throws IllegalStateException if the tracker has already been started * @throws IllegalArgumentException if the given dependencyId already exists */ public boolean addDependencyDescription(DependencyDescriptor descriptor){ if(descriptor == null){ throw new NullPointerException(); } return addDependencyDescription( descriptor.getServiceClass(), descriptor.getDependencyName(), descriptor.getServiceFilter(), descriptor.getDependencyType()); } /**
dd.getDependencyName(), dd.getServiceFilter(), dd.getDependencyType());