# HG changeset patch # Parent d1650bbc02cafaae8c1c6700875aebffbbe0a329 Bug #187469 - NullPointerException at org.netbeans.modules.dlight.management.api.DLightSession.prepareContext diff --git a/dlight.management/src/org/netbeans/modules/dlight/management/api/DLightSession.java b/dlight.management/src/org/netbeans/modules/dlight/management/api/DLightSession.java --- a/dlight.management/src/org/netbeans/modules/dlight/management/api/DLightSession.java +++ b/dlight.management/src/org/netbeans/modules/dlight/management/api/DLightSession.java @@ -734,6 +734,25 @@ context.addDLightTargetExecutionEnviromentProvider((DLightTarget.ExecutionEnvVariablesProvider) toolCollector); } + /* + * DataCollector usually acts as IndicatorDataProvider.. + * It could be that infrastructure cannot provide all needed + * storages for the collector. This means that collector will + * not be able to *store* any data, still it *may* be able to + * act as an IndicatorDataProvider (with transient data). + * + * So do unconditional init with serviceInfoDataStorage. + * This will give a chance for collector to at least provide + * some information for Indicators... + * + * Note: It is collector's responsibility to handle the + * situation when it was not initialized with DataStorages! + * + * Note: Collector *will* be notified about session start even + * if it was not initialized with any DataStorage. + * + */ + if (currentStorages != null && !currentStorages.isEmpty()) { if (storages == null) { storages = new ArrayList(); @@ -745,9 +764,9 @@ storages.add(storage); } } - toolCollector.init(serviceInfoDataStorage); + toolCollector.init(currentStorages, target); - addDataFilterListener(toolCollector); + if (notAttachableDataCollector == null && !toolCollector.isAttachable()) { notAttachableDataCollector = toolCollector; } @@ -756,6 +775,9 @@ log.log(Level.SEVERE, "Cannot find storage for collector {0}", toolCollector); // NOI18N } + toolCollector.init(serviceInfoDataStorage); + addDataFilterListener(toolCollector); + target.addTargetListener(toolCollector); } for (DataCollector c : collectors) { @@ -769,10 +791,8 @@ idp.init(serviceInfoDataStorage); addDataFilterListener(idp); } - } - // at the end, initialize data filters (_temporarily_ here, as info // about filters is stored in target's info... @@ -792,7 +812,6 @@ ((SubstitutableTarget) target).substitute(notAttachableDataCollector.getCmd(), notAttachableDataCollector.getArgs()); } return true; - } /** diff --git a/dlight.management/src/org/netbeans/modules/dlight/management/api/impl/DataStorageManager.java b/dlight.management/src/org/netbeans/modules/dlight/management/api/impl/DataStorageManager.java --- a/dlight.management/src/org/netbeans/modules/dlight/management/api/impl/DataStorageManager.java +++ b/dlight.management/src/org/netbeans/modules/dlight/management/api/impl/DataStorageManager.java @@ -43,6 +43,7 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -137,16 +138,38 @@ } /** - * Returns existing or new instance of DataStorage - * for requested schema (if it can be found within all available DataStorages) + * Returns existing or new instance of DataStorage + * for requested schema (if it can be found within all available DataStorages) + * + * If collector requires several storages and infrastructure cannot provide + * *all* of them, then an empty list is returned. + * So this method guarantees to return either fully loaded map or nothing. + * */ - public synchronized Map getDataStoragesFor(DLightSession session, DataCollector collector) { + public synchronized Map getDataStoragesFor(DLightSession session, DataCollector collector) { + if (session == null || collector == null) { + return Collections.emptyMap(); + } + Map result = new HashMap(); + for (DataStorageType type : collector.getRequiredDataStorageTypes()) { - result.put(type, getDataStorageFor(session, type, collector.getDataTablesMetadata())); - } - return result; - } + final DataStorage dataStorage = getDataStorageFor(session, type, collector.getDataTablesMetadata()); + + if (dataStorage == null) { + DLightLogger.getLogger(DataStorageManager.class).log(Level.INFO, + "DataStorageManager.getDataStoragesFor(DLightSession, DataCollector):" // NOI18N + + " cannot find storage of type {0} [session={1}, collector={2}]." // NOI18N + + " NO storages will be returned", // NOI18N + new Object[]{type, session.getDisplayName(), collector.getName()}); + return Collections.emptyMap(); + } + + result.put(type, dataStorage); + } + + return result; + } public synchronized ServiceInfoDataStorage getServiceInfoDataStorageFor(String uniqueKey) { if (uniqueKey == null) { @@ -484,9 +507,16 @@ DataStorage newStorage = storage.createStorage(); if (newStorage instanceof ProxyDataStorage) { ProxyDataStorage proxyStorage = (ProxyDataStorage) newStorage; - DataStorage backendStorage = getDataStorageFor(session, proxyStorage.getBackendDataStorageType(), proxyStorage.getBackendTablesMetadata()); + DataStorageType requiredStorageType = proxyStorage.getBackendDataStorageType(); + List requiredTables = proxyStorage.getBackendTablesMetadata(); + DataStorage backendStorage = getDataStorageFor(session, requiredStorageType, requiredTables); + if (backendStorage == null) { + // Means that required (for this proxy) storage cannot be found ... + continue; + } proxyStorage.attachTo(backendStorage); } + if (newStorage != null) { newStorage.createTables(tableMetadatas); if (activeSessionStorages == null) { @@ -507,9 +537,15 @@ if (newStorage != null) { if (newStorage instanceof ProxyDataStorage) { ProxyDataStorage proxyStorage = (ProxyDataStorage) newStorage; - DataStorage backendStorage = getDataStorageFor(session, proxyStorage.getBackendDataStorageType(), proxyStorage.getBackendTablesMetadata()); + DataStorageType requiredStorageType = proxyStorage.getBackendDataStorageType(); + List requiredTables = proxyStorage.getBackendTablesMetadata(); + DataStorage backendStorage = getDataStorageFor(session, requiredStorageType, requiredTables); + if (backendStorage == null) { + continue; + } proxyStorage.attachTo(backendStorage); } + newStorage.createTables(tableMetadatas); return newStorage;