diff --git a/dlight.collector.procfs/src/org/netbeans/modules/dlight/collector/procfs/impl/ProcFSDataCollector.java b/dlight.collector.procfs/src/org/netbeans/modules/dlight/collector/procfs/impl/ProcFSDataCollector.java --- a/dlight.collector.procfs/src/org/netbeans/modules/dlight/collector/procfs/impl/ProcFSDataCollector.java +++ b/dlight.collector.procfs/src/org/netbeans/modules/dlight/collector/procfs/impl/ProcFSDataCollector.java @@ -365,27 +365,33 @@ private final Object lock = LWPsTracker.class.getName() + "_lock"; // NOI18N private final HashMap lastReportedLWPs = new HashMap(); private final HashMap newReportedLWPs = new HashMap(); - private PreparedStatement insertStatement = null; - private PreparedStatement updateStatement = null; + private final PreparedStatement insertStatement; + private final PreparedStatement updateStatement; public LWPsTracker() { + PreparedStatement _insertStatement = null; + PreparedStatement _updateStatement = null; try { - insertStatement = sqlStorage.prepareStatement( - String.format("insert into %s (%s, %s, %s) values (?, ?, null)", // NOI18N - MSASQLTables.lwps.tableMetadata.getName(), - MSASQLTables.lwps.LWP_ID.getColumnName(), - MSASQLTables.lwps.LWP_START.getColumnName(), - MSASQLTables.lwps.LWP_END.getColumnName())); - updateStatement = sqlStorage.prepareStatement( - String.format("update %s set %s = ? where %s = ?", // NOI18N - MSASQLTables.lwps.tableMetadata.getName(), - MSASQLTables.lwps.LWP_END.getColumnName(), - MSASQLTables.lwps.LWP_ID.getColumnName())); + if (sqlStorage != null) { + _insertStatement = sqlStorage.prepareStatement( + String.format("insert into %s (%s, %s, %s) values (?, ?, null)", // NOI18N + MSASQLTables.lwps.tableMetadata.getName(), + MSASQLTables.lwps.LWP_ID.getColumnName(), + MSASQLTables.lwps.LWP_START.getColumnName(), + MSASQLTables.lwps.LWP_END.getColumnName())); + _updateStatement = sqlStorage.prepareStatement( + String.format("update %s set %s = ? where %s = ?", // NOI18N + MSASQLTables.lwps.tableMetadata.getName(), + MSASQLTables.lwps.LWP_END.getColumnName(), + MSASQLTables.lwps.LWP_ID.getColumnName())); + } } catch (Throwable th) { if (log.isLoggable(Level.FINE)) { log.log(Level.FINE, "will not provide data...", th); // NOI18N } - + } finally { + insertStatement = _insertStatement; + updateStatement = _updateStatement; } } 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,26 @@ 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. + * + */ + toolCollector.init(serviceInfoDataStorage); + if (currentStorages != null && !currentStorages.isEmpty()) { if (storages == null) { storages = new ArrayList(); @@ -745,7 +765,7 @@ storages.add(storage); } } - toolCollector.init(serviceInfoDataStorage); + toolCollector.init(currentStorages, target); addDataFilterListener(toolCollector); if (notAttachableDataCollector == null && !toolCollector.isAttachable()) { 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,14 +138,36 @@ } /** - * 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())); + 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; } @@ -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;