+ public void copyExistingModulesAndProcessFactoryDiff(final Collection<ModuleInternalInfo> existingModules, final List<ModuleFactory> lastListOfFactories) {
+ // copy old configuration to this server
+ for (ModuleInternalInfo oldConfigInfo : existingModules) {
+ try {
+ copyExistingModule(oldConfigInfo);
+ } catch (final InstanceAlreadyExistsException e) {
+ throw new IllegalStateException("Error while copying " + oldConfigInfo, e);
+ }
+ }
+ processDefaultBeans(lastListOfFactories);
+ }
+
+ private synchronized void processDefaultBeans(final List<ModuleFactory> lastListOfFactories) {
+ transactionStatus.checkNotCommitStarted();
+ transactionStatus.checkNotAborted();
+
+ Set<ModuleFactory> oldSet = new HashSet<>(lastListOfFactories);
+ Set<ModuleFactory> newSet = new HashSet<>(factoriesHolder.getModuleFactories());
+
+ List<ModuleFactory> toBeAdded = new ArrayList<>();
+ List<ModuleFactory> toBeRemoved = new ArrayList<>();
+ for (ModuleFactory moduleFactory : factoriesHolder.getModuleFactories()) {
+ if (!oldSet.contains(moduleFactory)) {
+ toBeAdded.add(moduleFactory);
+ }
+ }
+ for (ModuleFactory moduleFactory : lastListOfFactories) {
+ if (!newSet.contains(moduleFactory)) {
+ toBeRemoved.add(moduleFactory);
+ }
+ }
+ // add default modules
+ for (ModuleFactory moduleFactory : toBeAdded) {
+ BundleContext bundleContext = getModuleFactoryBundleContext(moduleFactory.getImplementationName());
+ Set<? extends Module> defaultModules = moduleFactory.getDefaultModules(dependencyResolverManager,
+ bundleContext);
+ for (Module module : defaultModules) {
+ // ensure default module to be registered to jmx even if its module factory does not use dependencyResolverFactory
+ DependencyResolver dependencyResolver = dependencyResolverManager.getOrCreate(module.getIdentifier());
+ final ObjectName objectName;
+ try {
+ boolean defaultBean = true;
+ objectName = putConfigBeanToJMXAndInternalMaps(module.getIdentifier(), module, moduleFactory, null,
+ dependencyResolver, defaultBean, bundleContext);
+ } catch (final InstanceAlreadyExistsException e) {
+ throw new IllegalStateException(e);
+ }
+
+ // register default module as every possible service
+ final Set<ServiceInterfaceAnnotation> serviceInterfaceAnnotations = InterfacesHelper.getServiceInterfaceAnnotations(moduleFactory);
+ for (String qname : InterfacesHelper.getQNames(serviceInterfaceAnnotations)) {
+ try {
+ saveServiceReference(qname, module.getIdentifier().getInstanceName(), objectName);
+ } catch (final InstanceNotFoundException e) {
+ throw new IllegalStateException("Unable to register default module instance " + module + " as a service of " + qname, e);
+ }
+ }
+ }
+ }
+
+ // remove modules belonging to removed factories
+ for (ModuleFactory removedFactory : toBeRemoved) {
+ List<ModuleIdentifier> modulesOfRemovedFactory = dependencyResolverManager.findAllByFactory(removedFactory);
+ for (ModuleIdentifier name : modulesOfRemovedFactory) {
+ // remove service refs
+ final ModuleFactory moduleFactory = dependencyResolverManager.findModuleInternalTransactionalInfo(name).getModuleFactory();
+ final Set<ServiceInterfaceAnnotation> serviceInterfaceAnnotations = InterfacesHelper.getServiceInterfaceAnnotations(moduleFactory);
+ for (String qname : InterfacesHelper.getQNames(serviceInterfaceAnnotations)) {
+ try {
+ removeServiceReference(qname, name.getInstanceName());
+ } catch (final InstanceNotFoundException e) {
+ throw new IllegalStateException("Unable to UNregister default module instance " + name + " as a service of " + qname, e);
+ }
+ }
+
+ // close module
+ destroyModule(name);
+ }
+ }
+ }
+
+
+ private synchronized void copyExistingModule(final ModuleInternalInfo oldConfigBeanInfo)