diff --git a/connector/src/main/java/org/jboss/as/connector/deployers/datasource/DataSourceDefinitionInjectionSource.java b/connector/src/main/java/org/jboss/as/connector/deployers/datasource/DataSourceDefinitionInjectionSource.java index f01467654738..0e6a403fc90b 100644 --- a/connector/src/main/java/org/jboss/as/connector/deployers/datasource/DataSourceDefinitionInjectionSource.java +++ b/connector/src/main/java/org/jboss/as/connector/deployers/datasource/DataSourceDefinitionInjectionSource.java @@ -218,7 +218,7 @@ private void startDataSource(final AbstractDataSourceService dataSourceService, final ServiceBuilder valueSourceServiceBuilder, final Injector injector, boolean securityEnabled) { - final ServiceName dataSourceServiceName = AbstractDataSourceService.SERVICE_NAME_BASE.append("DataSourceDefinition", moduleDescription.getApplicationName(), moduleDescription.getModuleName(), jndiName); + final ServiceName dataSourceServiceName = AbstractDataSourceService.SERVICE_NAME_BASE.append(jndiName); final ServiceBuilder dataSourceServiceBuilder = Services.addServerExecutorDependency( serviceTarget.addService(dataSourceServiceName, dataSourceService), diff --git a/connector/src/main/java/org/jboss/as/connector/deployers/ds/processors/DsXmlDeploymentInstallProcessor.java b/connector/src/main/java/org/jboss/as/connector/deployers/ds/processors/DsXmlDeploymentInstallProcessor.java index d78ed56e9ec9..f99a31fd071c 100644 --- a/connector/src/main/java/org/jboss/as/connector/deployers/ds/processors/DsXmlDeploymentInstallProcessor.java +++ b/connector/src/main/java/org/jboss/as/connector/deployers/ds/processors/DsXmlDeploymentInstallProcessor.java @@ -31,10 +31,12 @@ import java.util.Map; import org.jboss.as.connector.logging.ConnectorLogger; +import org.jboss.as.connector.services.datasources.statistics.DataSourceStatisticsService; import org.jboss.as.connector.services.driver.registry.DriverRegistry; import org.jboss.as.connector.subsystems.datasources.AbstractDataSourceService; +import org.jboss.as.connector.subsystems.datasources.CommonDeploymentService; +import org.jboss.as.connector.subsystems.datasources.Constants; import org.jboss.as.connector.subsystems.datasources.DataSourceReferenceFactoryService; -import org.jboss.as.connector.subsystems.datasources.DataSourceStatisticsListener; import org.jboss.as.connector.subsystems.datasources.DataSourcesExtension; import org.jboss.as.connector.subsystems.datasources.DataSourcesSubsystemProviders; import org.jboss.as.connector.subsystems.datasources.LocalDataSourceService; @@ -76,6 +78,7 @@ import org.jboss.jca.core.spi.mdr.MetadataRepository; import org.jboss.jca.core.spi.rar.ResourceAdapterRepository; import org.jboss.jca.core.spi.transaction.TransactionIntegration; +import org.jboss.jca.deployers.common.CommonDeployment; import org.jboss.msc.service.AbstractServiceListener; import org.jboss.msc.service.ServiceBuilder; import org.jboss.msc.service.ServiceController; @@ -308,8 +311,13 @@ private void startDataSource(final AbstractDataSourceService dataSourceService, if (overrideRegistration == null || overrideRegistration.isAllowsOverride()) { overrideRegistration = registration.registerOverrideModel(managementName, DataSourcesSubsystemProviders.OVERRIDE_DS_DESC); } - dataSourceServiceBuilder.addListener(new DataSourceStatisticsListener(overrideRegistration, false)); - DataSourceStatisticsListener.registerStatisticsResources(resource); + DataSourceStatisticsService statsService = new DataSourceStatisticsService(registration, false ); + serviceTarget.addService(dataSourceServiceName.append(Constants.STATISTICS), statsService) + .addDependency(dataSourceServiceName) + .addDependency(CommonDeploymentService.SERVICE_NAME_BASE.append(jndiName), CommonDeployment.class, statsService.getCommonDeploymentInjector()) + .setInitialMode(ServiceController.Mode.PASSIVE) + .install(); + DataSourceStatisticsService.registerStatisticsResources(resource); } // else should probably throw an ISE or something final ServiceName driverServiceName = ServiceName.JBOSS.append("jdbc-driver", driverName.replaceAll("\\.", "_")); diff --git a/connector/src/main/java/org/jboss/as/connector/deployers/ra/RaDeploymentActivator.java b/connector/src/main/java/org/jboss/as/connector/deployers/ra/RaDeploymentActivator.java index e719fc846c10..0a9babbb9590 100644 --- a/connector/src/main/java/org/jboss/as/connector/deployers/ra/RaDeploymentActivator.java +++ b/connector/src/main/java/org/jboss/as/connector/deployers/ra/RaDeploymentActivator.java @@ -101,8 +101,7 @@ public void activateProcessors(final DeploymentProcessorTarget updateContext) { new AdministeredObjectDefinitionDescriptorProcessor()); updateContext.addDeploymentProcessor(ResourceAdaptersExtension.SUBSYSTEM_NAME, Phase.INSTALL, Phase.INSTALL_RA_NATIVE, new RaNativeProcessor()); updateContext.addDeploymentProcessor(ResourceAdaptersExtension.SUBSYSTEM_NAME, Phase.INSTALL, Phase.INSTALL_RA_DEPLOYMENT, new ParsedRaDeploymentProcessor()); - updateContext.addDeploymentProcessor(ResourceAdaptersExtension.SUBSYSTEM_NAME, Phase.INSTALL, Phase.INSTALL_RA_XML_DEPLOYMENT, new RaXmlDeploymentProcessor( - mdrService.getValue())); + updateContext.addDeploymentProcessor(ResourceAdaptersExtension.SUBSYSTEM_NAME, Phase.INSTALL, Phase.INSTALL_RA_XML_DEPLOYMENT, new RaXmlDeploymentProcessor() ); updateContext.addDeploymentProcessor(ResourceAdaptersExtension.SUBSYSTEM_NAME, Phase.INSTALL, Phase.INSTALL_JDBC_DRIVER, new DriverProcessor()); } } diff --git a/connector/src/main/java/org/jboss/as/connector/deployers/ra/processors/AbstractResourceAdapterDeploymentServiceListener.java b/connector/src/main/java/org/jboss/as/connector/deployers/ra/processors/AbstractResourceAdapterDeploymentServiceListener.java deleted file mode 100644 index d66e3c3692d1..000000000000 --- a/connector/src/main/java/org/jboss/as/connector/deployers/ra/processors/AbstractResourceAdapterDeploymentServiceListener.java +++ /dev/null @@ -1,306 +0,0 @@ -/* - * JBoss, Home of Professional Open Source. - * Copyright 2011, Red Hat, Inc., and individual contributors - * as indicated by the @author tags. See the copyright.txt file in the - * distribution for a full listing of individual contributors. - * - * This is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this software; if not, write to the Free - * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA - * 02110-1301 USA, or see the FSF site: http://www.fsf.org. - */ - -package org.jboss.as.connector.deployers.ra.processors; - -import org.jboss.as.connector.dynamicresource.StatisticsResourceDefinition; -import org.jboss.as.connector.dynamicresource.ClearWorkManagerStatisticsHandler; -import org.jboss.as.connector.subsystems.common.pool.PoolMetrics; -import org.jboss.as.connector.subsystems.common.pool.PoolStatisticsRuntimeAttributeReadHandler; -import org.jboss.as.connector.subsystems.common.pool.PoolStatisticsRuntimeAttributeWriteHandler; -import org.jboss.as.connector.subsystems.resourceadapters.CommonAttributes; -import org.jboss.as.connector.subsystems.resourceadapters.Constants; -import org.jboss.as.connector.subsystems.resourceadapters.IronJacamarResource; -import org.jboss.as.connector.subsystems.resourceadapters.ResourceAdaptersExtension; -import org.jboss.as.connector.subsystems.resourceadapters.WorkManagerRuntimeAttributeReadHandler; -import org.jboss.as.connector.subsystems.resourceadapters.WorkManagerRuntimeAttributeWriteHandler; -import org.jboss.as.connector.util.ConnectorServices; -import org.jboss.as.controller.AttributeDefinition; -import org.jboss.as.controller.OperationStepHandler; -import org.jboss.as.controller.PathAddress; -import org.jboss.as.controller.PathElement; -import org.jboss.as.controller.ResourceBuilder; -import org.jboss.as.controller.SimpleAttributeDefinition; -import org.jboss.as.controller.descriptions.ModelDescriptionConstants; -import org.jboss.as.controller.descriptions.OverrideDescriptionProvider; -import org.jboss.as.controller.descriptions.StandardResourceDescriptionResolver; -import org.jboss.as.controller.registry.ManagementResourceRegistration; -import org.jboss.as.controller.registry.Resource; -import org.jboss.dmr.ModelNode; -import org.jboss.jca.core.api.bootstrap.CloneableBootstrapContext; -import org.jboss.jca.core.api.workmanager.DistributedWorkManager; -import org.jboss.jca.core.api.workmanager.WorkManager; -import org.jboss.jca.core.connectionmanager.ConnectionManager; -import org.jboss.jca.core.spi.statistics.StatisticsPlugin; -import org.jboss.jca.deployers.common.CommonDeployment; -import org.jboss.msc.service.AbstractServiceListener; -import org.jboss.msc.service.ServiceController; - -import java.util.Collections; -import java.util.Locale; -import java.util.Map; - -/** - * @author Stefano Maestri (c) 2011 Red Hat Inc. - */ -public abstract class AbstractResourceAdapterDeploymentServiceListener extends AbstractServiceListener { - private final ManagementResourceRegistration registration; - private final String deploymentUnitName; - private final Resource deploymentResource; - private final String bootstrapCtx; - private final String raName; - private final boolean statsEnabled; - - public AbstractResourceAdapterDeploymentServiceListener(ManagementResourceRegistration registration, String deploymentUnitName, Resource deploymentResource, final String bootstrapCtx, final String raName, final boolean statsEnabled) { - this.registration = registration; - this.deploymentUnitName = deploymentUnitName; - this.deploymentResource = deploymentResource; - this.bootstrapCtx = bootstrapCtx; - this.raName = raName; - this.statsEnabled = statsEnabled; - } - - public void transition(final ServiceController controller, - final ServiceController.Transition transition) { - switch (transition) { - case STARTING_to_UP: { - - CommonDeployment deploymentMD = getDeploymentMetadata(controller); - - if (deploymentMD.getConnectionManagers() != null) { - for (ConnectionManager cm : deploymentMD.getConnectionManagers()) { - if (cm.getPool() != null) { - StatisticsPlugin poolStats = cm.getPool().getStatistics(); - poolStats.setEnabled(statsEnabled); - final ServiceController bootstrapContextController = controller.getServiceContainer().getService(ConnectorServices.BOOTSTRAP_CONTEXT_SERVICE.append(bootstrapCtx)); - WorkManager wm = null; - if (bootstrapContextController != null) { - wm = (WorkManager) ((CloneableBootstrapContext) bootstrapContextController.getValue()).getWorkManager(); - } - if ((wm != null && wm.getStatistics() != null) || poolStats.getNames().size() != 0) { - - PathElement pe = PathElement.pathElement(ModelDescriptionConstants.SUBSYSTEM, ResourceAdaptersExtension.SUBSYSTEM_NAME); - PathElement peStats = PathElement.pathElement(Constants.STATISTICS_NAME, Constants.STATISTICS_NAME); - PathElement peRa = PathElement.pathElement(Constants.RESOURCEADAPTER_NAME, raName); - PathElement peWm = PathElement.pathElement(Constants.WORKMANAGER_NAME, wm.getName()); - PathElement peDistributedWm = PathElement.pathElement(Constants.DISTRIBUTED_WORKMANAGER_NAME, wm.getName()); - PathElement peCD = PathElement.pathElement(Constants.CONNECTIONDEFINITIONS_NAME, cm.getJndiName()); - ManagementResourceRegistration overrideRegistration = registration; - //when you are in deploy you have a registration pointing to deployment=* - //when you are in re-deploy it points to specific deploymentUnit - synchronized (this) { - if (registration.isAllowsOverride()) { - - if (registration.getOverrideModel(deploymentUnitName) != null) { - overrideRegistration = registration.getOverrideModel(deploymentUnitName); - } else { - overrideRegistration = registration.registerOverrideModel(deploymentUnitName, new OverrideDescriptionProvider() { - @Override - public Map getAttributeOverrideDescriptions(Locale locale) { - return Collections.emptyMap(); - } - - @Override - public Map getChildTypeOverrideDescriptions(Locale locale) { - return Collections.emptyMap(); - } - }); - } - - } - - ManagementResourceRegistration subRegistration; - try { - ResourceBuilder resourceBuilder = ResourceBuilder.Factory.create(pe, - new StandardResourceDescriptionResolver(Constants.STATISTICS_NAME, CommonAttributes.RESOURCE_NAME, CommonAttributes.class.getClassLoader())); - subRegistration = overrideRegistration.registerSubModel(resourceBuilder.build()); - - } catch (IllegalArgumentException iae) { - subRegistration = overrideRegistration.getSubModel(PathAddress.pathAddress(pe)); - } - Resource subsystemResource; - - // Instances of Resoure is not thread-safe and need to be synchronized externally - synchronized (deploymentResource) { - if (!deploymentResource.hasChild(pe)) { - subsystemResource = new IronJacamarResource.IronJacamarRuntimeResource(); - deploymentResource.registerChild(pe, subsystemResource); - } else { - subsystemResource = deploymentResource.getChild(pe); - } - } - - ManagementResourceRegistration statsRegistration; - try { - ResourceBuilder resourceBuilder = ResourceBuilder.Factory.create(peStats, - new StandardResourceDescriptionResolver(Constants.STATISTICS_NAME, CommonAttributes.RESOURCE_NAME, CommonAttributes.class.getClassLoader())); - - statsRegistration = subRegistration.registerSubModel(resourceBuilder.build()); - } catch (IllegalArgumentException iae) { - statsRegistration = subRegistration.getSubModel(PathAddress.pathAddress(peStats)); - } - Resource statisticsResource; - - if (!subsystemResource.hasChild(peStats)) { - statisticsResource = new IronJacamarResource.IronJacamarRuntimeResource(); - subsystemResource.registerChild(peStats, statisticsResource); - } else { - statisticsResource = subsystemResource.getChild(peStats); - } - - ManagementResourceRegistration raRegistration; - try { - ResourceBuilder resourceBuilder = ResourceBuilder.Factory.create(peRa, - new StandardResourceDescriptionResolver(Constants.STATISTICS_NAME, CommonAttributes.RESOURCE_NAME, CommonAttributes.class.getClassLoader())); - - raRegistration = statsRegistration.registerSubModel(resourceBuilder.build()); - } catch (IllegalArgumentException iae) { - raRegistration = statsRegistration.getSubModel(PathAddress.pathAddress(peRa)); - } - Resource raResource; - - if (!statisticsResource.hasChild(peRa)) { - raResource = new IronJacamarResource.IronJacamarRuntimeResource(); - statisticsResource.registerChild(peRa, raResource); - } else { - raResource = statisticsResource.getChild(peRa); - } - if (deploymentMD.getConnector() != null && deploymentMD.getConnector().getResourceAdapter() != null && deploymentMD.getConnector().getResourceAdapter().getStatistics() != null) { - StatisticsPlugin raStats = deploymentMD.getConnector().getResourceAdapter().getStatistics(); - raStats.setEnabled(statsEnabled); - PoolMetrics.ParametrizedPoolMetricsHandler handler = new PoolMetrics.ParametrizedPoolMetricsHandler(raStats); - for (AttributeDefinition attribute : StatisticsResourceDefinition.getAttributesFromPlugin(raStats)){ - raRegistration.registerMetric(attribute, handler); - } - //adding enable/disable for pool stats - OperationStepHandler readHandler = new PoolStatisticsRuntimeAttributeReadHandler(raStats); - OperationStepHandler writeHandler = new PoolStatisticsRuntimeAttributeWriteHandler(raStats); - raRegistration.registerReadWriteAttribute(org.jboss.as.connector.subsystems.common.pool.Constants.POOL_STATISTICS_ENABLED, readHandler, writeHandler); - - } - if (poolStats.getNames().size() != 0 && raRegistration.getSubModel(PathAddress.pathAddress(peCD)) == null) { - ManagementResourceRegistration cdSubRegistration = raRegistration.registerSubModel(new StatisticsResourceDefinition(peCD, CommonAttributes.RESOURCE_NAME, poolStats)); - final Resource cdResource = new IronJacamarResource.IronJacamarRuntimeResource(); - - if (!raResource.hasChild(peCD)) - raResource.registerChild(peCD, cdResource); - } - - if (wm.getStatistics() != null) { - if (wm instanceof DistributedWorkManager && ((DistributedWorkManager)wm).getDistributedStatistics() != null && raRegistration.getSubModel(PathAddress.pathAddress(peDistributedWm)) == null) { - ResourceBuilder resourceBuilder = ResourceBuilder.Factory.create(peDistributedWm, - new StandardResourceDescriptionResolver(Constants.STATISTICS_NAME + "." + Constants.WORKMANAGER_NAME, CommonAttributes.RESOURCE_NAME, CommonAttributes.class.getClassLoader())); - - ManagementResourceRegistration dwmSubRegistration = raRegistration.registerSubModel(resourceBuilder.build()); - final Resource dwmResource = new IronJacamarResource.IronJacamarRuntimeResource(); - - if (!raResource.hasChild(peDistributedWm)) - raResource.registerChild(peDistributedWm, dwmResource); - - OperationStepHandler metricsHandler = new WorkManagerRuntimeAttributeReadHandler(wm, ((DistributedWorkManager)wm).getDistributedStatistics(), false); - for (SimpleAttributeDefinition metric : Constants.WORKMANAGER_METRICS) { - dwmSubRegistration.registerMetric(metric, metricsHandler); - } - - OperationStepHandler readHandler = new WorkManagerRuntimeAttributeReadHandler(wm, ((DistributedWorkManager)wm).getDistributedStatistics(), true); - OperationStepHandler writeHandler = new WorkManagerRuntimeAttributeWriteHandler(wm, true, Constants.DISTRIBUTED_WORKMANAGER_RW_ATTRIBUTES); - for (SimpleAttributeDefinition attribute : Constants.DISTRIBUTED_WORKMANAGER_RW_ATTRIBUTES) { - dwmSubRegistration.registerReadWriteAttribute(attribute, readHandler, writeHandler); - } - - dwmSubRegistration.registerOperationHandler(ClearWorkManagerStatisticsHandler.DEFINITION, new ClearWorkManagerStatisticsHandler(wm)); - } - if (raRegistration.getSubModel(PathAddress.pathAddress(peWm)) == null) { - ResourceBuilder resourceBuilder = ResourceBuilder.Factory.create(peWm, - new StandardResourceDescriptionResolver(Constants.STATISTICS_NAME + "." + Constants.WORKMANAGER_NAME, CommonAttributes.RESOURCE_NAME, CommonAttributes.class.getClassLoader())); - - ManagementResourceRegistration wmSubRegistration = raRegistration.registerSubModel(resourceBuilder.build()); - final Resource wmResource = new IronJacamarResource.IronJacamarRuntimeResource(); - - if (!raResource.hasChild(peWm)) - raResource.registerChild(peWm, wmResource); - - OperationStepHandler metricHandler = new WorkManagerRuntimeAttributeReadHandler(wm, wm.getStatistics(), false); - for (SimpleAttributeDefinition metric : Constants.WORKMANAGER_METRICS) { - wmSubRegistration.registerMetric(metric, metricHandler); - } - - OperationStepHandler readHandler = new WorkManagerRuntimeAttributeReadHandler(wm, wm.getStatistics(), false); - OperationStepHandler writeHandler = new WorkManagerRuntimeAttributeWriteHandler(wm, false, Constants.WORKMANAGER_RW_ATTRIBUTES); - for (SimpleAttributeDefinition attribute : Constants.WORKMANAGER_RW_ATTRIBUTES) { - wmSubRegistration.registerReadWriteAttribute(attribute, readHandler, writeHandler); - } - - wmSubRegistration.registerOperationHandler(ClearWorkManagerStatisticsHandler.DEFINITION, new ClearWorkManagerStatisticsHandler(wm)); - - } - } - - registerIronjacamar(controller, subRegistration, subsystemResource); - } - } - } - } - } - break; - - } - case UP_to_STOP_REQUESTED: { - - PathElement pe = PathElement.pathElement(ModelDescriptionConstants.SUBSYSTEM, ResourceAdaptersExtension.SUBSYSTEM_NAME); - PathElement ijPe = PathElement.pathElement(Constants.IRONJACAMAR_NAME, Constants.IRONJACAMAR_NAME); - PathElement peStats = PathElement.pathElement(Constants.STATISTICS_NAME, Constants.STATISTICS_NAME); - PathElement peCD = PathElement.pathElement(Constants.CONNECTIONDEFINITIONS_NAME); - - ManagementResourceRegistration overrideRegistration = registration; - //when you are in deploy you have a registration pointing to deployment=* - //when you are in re-deploy it points to specific deploymentUnit - if (registration.isAllowsOverride() && registration.getOverrideModel(deploymentUnitName) != null) { - overrideRegistration = registration.getOverrideModel(deploymentUnitName); - } - ManagementResourceRegistration subsystemReg = overrideRegistration.getSubModel(PathAddress.pathAddress(pe)); - if (subsystemReg != null) { - if (subsystemReg.getSubModel(PathAddress.pathAddress(ijPe)) != null) { - subsystemReg.unregisterSubModel(ijPe); - } - ManagementResourceRegistration statsReg = subsystemReg.getSubModel(PathAddress.pathAddress(peStats)); - if (statsReg != null) { - if (statsReg.getSubModel(PathAddress.pathAddress(peCD)) != null) { - statsReg.unregisterSubModel(peCD); - } - subsystemReg.unregisterSubModel(peStats); - } - overrideRegistration.unregisterSubModel(pe); - } - - deploymentResource.removeChild(pe); - - - } - - } - } - - protected abstract void registerIronjacamar(final ServiceController controller, final ManagementResourceRegistration subRegistration, final Resource subsystemResource); - - protected abstract CommonDeployment getDeploymentMetadata(final ServiceController controller); -} diff --git a/connector/src/main/java/org/jboss/as/connector/deployers/ra/processors/IronJacamarDeploymentParsingProcessor.java b/connector/src/main/java/org/jboss/as/connector/deployers/ra/processors/IronJacamarDeploymentParsingProcessor.java index 2c8e6f305036..a560d7fb5d68 100644 --- a/connector/src/main/java/org/jboss/as/connector/deployers/ra/processors/IronJacamarDeploymentParsingProcessor.java +++ b/connector/src/main/java/org/jboss/as/connector/deployers/ra/processors/IronJacamarDeploymentParsingProcessor.java @@ -43,6 +43,7 @@ * DeploymentUnitProcessor responsible for parsing an iron-jacamar.xml descriptor * and attaching the corresponding IronJacamar metadata. It take care also to * register this metadata into IronJacamar0s MetadataRepository + * * @author Stefano * Maestri */ @@ -57,6 +58,7 @@ public IronJacamarDeploymentParsingProcessor() { /** * Process a deployment for iron-jacamar.xml files. Will parse the xml file * and attach metadata discovered during processing. + * * @param phaseContext the deployment unit context * @throws DeploymentUnitProcessingException */ @@ -74,7 +76,7 @@ public void deploy(DeploymentPhaseContext phaseContext) throws DeploymentUnitPro } public static IronJacamarXmlDescriptor process(VirtualFile deploymentRoot, boolean resolveProperties) throws DeploymentUnitProcessingException { - IronJacamarXmlDescriptor xmlDescriptor = null ; + IronJacamarXmlDescriptor xmlDescriptor = null; if (deploymentRoot == null || !deploymentRoot.exists()) return null; diff --git a/connector/src/main/java/org/jboss/as/connector/deployers/ra/processors/ParsedRaDeploymentProcessor.java b/connector/src/main/java/org/jboss/as/connector/deployers/ra/processors/ParsedRaDeploymentProcessor.java index 292338a55cff..6bb513c599c7 100644 --- a/connector/src/main/java/org/jboss/as/connector/deployers/ra/processors/ParsedRaDeploymentProcessor.java +++ b/connector/src/main/java/org/jboss/as/connector/deployers/ra/processors/ParsedRaDeploymentProcessor.java @@ -36,8 +36,6 @@ import org.jboss.as.connector.services.resourceadapters.deployment.ResourceAdapterDeploymentService; import org.jboss.as.connector.services.resourceadapters.deployment.registry.ResourceAdapterDeploymentRegistry; import org.jboss.as.connector.subsystems.jca.JcaSubsystemConfiguration; -import org.jboss.as.connector.subsystems.resourceadapters.IronJacamarResourceCreator; -import org.jboss.as.connector.subsystems.resourceadapters.IronJacamarResourceDefinition; import org.jboss.as.connector.util.ConnectorServices; import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.PathElement; @@ -66,10 +64,8 @@ import org.jboss.jca.core.api.management.ManagementRepository; import org.jboss.jca.core.spi.rar.ResourceAdapterRepository; import org.jboss.jca.core.spi.transaction.TransactionIntegration; -import org.jboss.jca.deployers.common.CommonDeployment; import org.jboss.modules.Module; import org.jboss.msc.service.ServiceBuilder; -import org.jboss.msc.service.ServiceController; import org.jboss.msc.service.ServiceController.Mode; import org.jboss.msc.service.ServiceName; import org.jboss.msc.service.ServiceTarget; @@ -126,7 +122,7 @@ public void deploy(DeploymentPhaseContext phaseContext) throws DeploymentUnitPro Map annotationIndexes = AnnotationIndexUtils.getAnnotationIndexes(deploymentUnit); - ServiceBuilder builder = process(connectorXmlDescriptor, ironJacamarXmlDescriptor, classLoader, serviceTarget, annotationIndexes, deploymentUnit.getServiceName()); + ServiceBuilder builder = process(connectorXmlDescriptor, ironJacamarXmlDescriptor, classLoader, serviceTarget, annotationIndexes, deploymentUnit.getServiceName(),registration, deploymentResource); if (builder != null) { String bootstrapCtx = null; @@ -150,33 +146,17 @@ public Map getChildTypeOverrideDescriptions(Locale locale) { }); } - builder.addListener(new AbstractResourceAdapterDeploymentServiceListener(registration, deploymentUnit.getName(), deploymentResource, bootstrapCtx, deploymentUnit.getName(), false) { - - @Override - protected void registerIronjacamar(final ServiceController controller, final ManagementResourceRegistration subRegistration, final Resource subsystemResource) { - //register ironJacamar - try { - subRegistration.registerSubModel(new IronJacamarResourceDefinition()); - } catch (IllegalArgumentException iae) { - //ignore it: submodel already registered - } - AS7MetadataRepository mdr = ((ResourceAdapterDeploymentService) controller.getService()).getMdr(); - IronJacamarResourceCreator.INSTANCE.execute(subsystemResource, mdr); - } - @Override - protected CommonDeployment getDeploymentMetadata(final ServiceController controller) { - return ((ResourceAdapterDeploymentService) controller.getService()).getRaDeployment(); - } - }); + builder.setInitialMode(Mode.ACTIVE).install(); - builder.setInitialMode(Mode.ACTIVE).install(); } } - public static ServiceBuilder process(final ConnectorXmlDescriptor connectorXmlDescriptor, final IronJacamarXmlDescriptor ironJacamarXmlDescriptor, final ClassLoader classLoader, final ServiceTarget serviceTarget, final Map annotationIndexes, final ServiceName duServiceName) throws DeploymentUnitProcessingException { + public static ServiceBuilder process(final ConnectorXmlDescriptor connectorXmlDescriptor, final IronJacamarXmlDescriptor ironJacamarXmlDescriptor, final ClassLoader classLoader, + final ServiceTarget serviceTarget, final Map annotationIndexes, final ServiceName duServiceName, + final ManagementResourceRegistration registration, Resource deploymentResource) throws DeploymentUnitProcessingException { Connector cmd = connectorXmlDescriptor != null ? connectorXmlDescriptor.getConnector() : null; final Activation activation = ironJacamarXmlDescriptor != null ? ironJacamarXmlDescriptor.getIronJacamar() : null; @@ -209,8 +189,7 @@ public static ServiceBuilder process(final ConnectorXmlDescriptor connectorXmlDe } final ServiceName deployerServiceName = ConnectorServices.RESOURCE_ADAPTER_DEPLOYER_SERVICE_PREFIX.append(connectorXmlDescriptor.getDeploymentName()); - final ResourceAdapterDeploymentService raDeploymentService = new ResourceAdapterDeploymentService(connectorXmlDescriptor, cmd, activation, classLoader, deployerServiceName, duServiceName); - + final ResourceAdapterDeploymentService raDeploymentService = new ResourceAdapterDeploymentService(connectorXmlDescriptor, cmd, activation, classLoader, deployerServiceName, duServiceName, registration, deploymentResource); // Create the service return Services.addServerExecutorDependency( @@ -227,6 +206,9 @@ public static ServiceBuilder process(final ConnectorXmlDescriptor connectorXmlDe .addDependency(ConnectorServices.IDLE_REMOVER_SERVICE) .addDependency(ConnectorServices.CONNECTION_VALIDATOR_SERVICE) .addDependency(NamingService.SERVICE_NAME); + + + } catch (Throwable t) { throw new DeploymentUnitProcessingException(t); } diff --git a/connector/src/main/java/org/jboss/as/connector/deployers/ra/processors/RaXmlDeploymentProcessor.java b/connector/src/main/java/org/jboss/as/connector/deployers/ra/processors/RaXmlDeploymentProcessor.java index a8d829e4bdd9..14c587bb9e8d 100644 --- a/connector/src/main/java/org/jboss/as/connector/deployers/ra/processors/RaXmlDeploymentProcessor.java +++ b/connector/src/main/java/org/jboss/as/connector/deployers/ra/processors/RaXmlDeploymentProcessor.java @@ -41,7 +41,6 @@ import org.jboss.as.server.deployment.DeploymentUnitProcessingException; import org.jboss.as.server.deployment.DeploymentUnitProcessor; import org.jboss.jca.common.api.metadata.resourceadapter.Activation; -import org.jboss.jca.core.spi.mdr.MetadataRepository; import org.jboss.modules.Module; import org.jboss.msc.service.ServiceBuilder; import org.jboss.msc.service.ServiceController; @@ -59,10 +58,10 @@ */ public class RaXmlDeploymentProcessor implements DeploymentUnitProcessor { - private final MetadataRepository mdr; + private ConnectorXmlDescriptor connectorXmlDescriptor; + + public RaXmlDeploymentProcessor() { - public RaXmlDeploymentProcessor(final MetadataRepository mdr) { - this.mdr = mdr; } /** @@ -71,7 +70,6 @@ public RaXmlDeploymentProcessor(final MetadataRepository mdr) { * * @param phaseContext the deployment unit context * @throws DeploymentUnitProcessingException - * */ public void deploy(DeploymentPhaseContext phaseContext) throws DeploymentUnitProcessingException { final DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit(); @@ -80,7 +78,7 @@ public void deploy(DeploymentPhaseContext phaseContext) throws DeploymentUnitPro final Resource deploymentResource = phaseContext.getDeploymentUnit().getAttachment(DeploymentModelUtils.DEPLOYMENT_RESOURCE); - final ConnectorXmlDescriptor connectorXmlDescriptor = deploymentUnit + connectorXmlDescriptor = deploymentUnit .getAttachment(ConnectorXmlDescriptor.ATTACHMENT_KEY); if (connectorXmlDescriptor == null) { return; // Skip non ra deployments @@ -119,7 +117,7 @@ public void deploy(DeploymentPhaseContext phaseContext) throws DeploymentUnitPro String rarName = raxml.getArchive(); if (deploymentUnitName.equals(rarName)) { - RaServicesFactory.createDeploymentService(registration, connectorXmlDescriptor, module, serviceTarget, deploymentUnitName, deploymentUnit.getServiceName(), deploymentUnitName, raxml, deploymentResource, false); + RaServicesFactory.createDeploymentService(registration, connectorXmlDescriptor, module, serviceTarget, deploymentUnitName, deploymentUnit.getServiceName(), deploymentUnitName, raxml, deploymentResource); } } @@ -139,4 +137,6 @@ public void deploy(DeploymentPhaseContext phaseContext) throws DeploymentUnitPro public void undeploy(final DeploymentUnit context) { } + + } diff --git a/connector/src/main/java/org/jboss/as/connector/services/datasources/statistics/DataSourceStatisticsService.java b/connector/src/main/java/org/jboss/as/connector/services/datasources/statistics/DataSourceStatisticsService.java new file mode 100644 index 000000000000..42eae79b348c --- /dev/null +++ b/connector/src/main/java/org/jboss/as/connector/services/datasources/statistics/DataSourceStatisticsService.java @@ -0,0 +1,134 @@ +/* + * JBoss, Home of Professional Open Source. + * Copyright 2011, Red Hat, Inc., and individual contributors + * as indicated by the @author tags. See the copyright.txt file in the + * distribution for a full listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this software; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. + */ + +package org.jboss.as.connector.services.datasources.statistics; + +import static org.jboss.as.connector.logging.ConnectorLogger.ROOT_LOGGER; + +import org.jboss.as.connector.dynamicresource.StatisticsResourceDefinition; +import org.jboss.as.connector.subsystems.datasources.DataSourcesSubsystemProviders; +import org.jboss.as.controller.PathElement; +import org.jboss.as.controller.registry.ManagementResourceRegistration; +import org.jboss.as.controller.registry.PlaceholderResource; +import org.jboss.as.controller.registry.Resource; +import org.jboss.jca.core.spi.statistics.StatisticsPlugin; +import org.jboss.jca.deployers.common.CommonDeployment; +import org.jboss.msc.inject.Injector; +import org.jboss.msc.service.Service; +import org.jboss.msc.service.StartContext; +import org.jboss.msc.service.StartException; +import org.jboss.msc.service.StopContext; +import org.jboss.msc.value.InjectedValue; + +public class DataSourceStatisticsService implements Service { + + + private static final PathElement JDBC_STATISTICS = PathElement.pathElement("statistics", "jdbc"); + private static final PathElement POOL_STATISTICS = PathElement.pathElement("statistics", "pool"); + + private final ManagementResourceRegistration registration; + private final boolean statsEnabled; + + protected final InjectedValue injectedDeploymentMD = new InjectedValue<>(); + + + /** + * create an instance * + */ + public DataSourceStatisticsService(final ManagementResourceRegistration registration, + final boolean statsEnabled) { + super(); + this.registration = registration; + this.statsEnabled = statsEnabled; + + } + + + @Override + public void start(StartContext context) throws StartException { + ROOT_LOGGER.debugf("Starting DataSourceStatisticsService"); + synchronized (this) { + CommonDeployment deploymentMD = injectedDeploymentMD.getValue(); + + + StatisticsPlugin jdbcStats = deploymentMD.getDataSources()[0].getStatistics(); + StatisticsPlugin poolStats = deploymentMD.getDataSources()[0].getPool().getStatistics(); + jdbcStats.setEnabled(statsEnabled); + poolStats.setEnabled(statsEnabled); + + int jdbcStatsSize = jdbcStats.getNames().size(); + int poolStatsSize = poolStats.getNames().size(); + if (jdbcStatsSize > 0 || poolStatsSize > 0) { + if (registration != null) { + if (jdbcStatsSize > 0) { + ManagementResourceRegistration jdbcRegistration = registration.registerSubModel(new StatisticsResourceDefinition(JDBC_STATISTICS, DataSourcesSubsystemProviders.RESOURCE_NAME, jdbcStats)); + jdbcRegistration.setRuntimeOnly(true); + } + + if (poolStatsSize > 0) { + ManagementResourceRegistration poolRegistration = registration.registerSubModel(new StatisticsResourceDefinition(POOL_STATISTICS, DataSourcesSubsystemProviders.RESOURCE_NAME, poolStats)); + poolRegistration.setRuntimeOnly(true); + } + } + + } + } + } + + @Override + public void stop(StopContext context) { + if (registration != null) { + registration.unregisterSubModel(JDBC_STATISTICS); + registration.unregisterSubModel(POOL_STATISTICS); + } + } + + + @Override + public ManagementResourceRegistration getValue() throws IllegalStateException, IllegalArgumentException { + return registration; + } + + public Injector getCommonDeploymentInjector() { + return injectedDeploymentMD; + } + + + public static void registerStatisticsResources(Resource datasourceResource) { + if (!datasourceResource.hasChild(JDBC_STATISTICS)) { + datasourceResource.registerChild(JDBC_STATISTICS, new PlaceholderResource.PlaceholderResourceEntry(JDBC_STATISTICS)); + } + if (!datasourceResource.hasChild(POOL_STATISTICS)) { + datasourceResource.registerChild(POOL_STATISTICS, new PlaceholderResource.PlaceholderResourceEntry(POOL_STATISTICS)); + } + } + + public static void removeStatisticsResources(Resource datasourceResource) { + if (datasourceResource.hasChild(JDBC_STATISTICS)) { + datasourceResource.removeChild(JDBC_STATISTICS); + } + if (datasourceResource.hasChild(POOL_STATISTICS)) { + datasourceResource.removeChild(POOL_STATISTICS); + } + } + +} diff --git a/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/IronJacamarActivationResourceService.java b/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/IronJacamarActivationResourceService.java new file mode 100644 index 000000000000..de5c210f58d8 --- /dev/null +++ b/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/IronJacamarActivationResourceService.java @@ -0,0 +1,302 @@ +/* + * JBoss, Home of Professional Open Source. + * Copyright 2011, Red Hat, Inc., and individual contributors + * as indicated by the @author tags. See the copyright.txt file in the + * distribution for a full listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this software; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. + */ + +package org.jboss.as.connector.services.resourceadapters; + +import static org.jboss.as.connector.logging.ConnectorLogger.ROOT_LOGGER; + +import java.util.Collections; +import java.util.Locale; +import java.util.Map; + +import org.jboss.as.connector.dynamicresource.ClearStatisticsHandler; +import org.jboss.as.connector.dynamicresource.StatisticsResourceDefinition; +import org.jboss.as.connector.metadata.deployment.ResourceAdapterDeployment; +import org.jboss.as.connector.services.mdr.AS7MetadataRepository; +import org.jboss.as.connector.subsystems.common.pool.PoolMetrics; +import org.jboss.as.connector.subsystems.resourceadapters.CommonAttributes; +import org.jboss.as.connector.subsystems.resourceadapters.Constants; +import org.jboss.as.connector.subsystems.resourceadapters.IronJacamarResource; +import org.jboss.as.connector.subsystems.resourceadapters.IronJacamarResourceCreator; +import org.jboss.as.connector.subsystems.resourceadapters.IronJacamarResourceDefinition; +import org.jboss.as.connector.subsystems.resourceadapters.ResourceAdaptersExtension; +import org.jboss.as.controller.AttributeDefinition; +import org.jboss.as.controller.PathAddress; +import org.jboss.as.controller.PathElement; +import org.jboss.as.controller.ResourceBuilder; +import org.jboss.as.controller.descriptions.ModelDescriptionConstants; +import org.jboss.as.controller.descriptions.OverrideDescriptionProvider; +import org.jboss.as.controller.descriptions.StandardResourceDescriptionResolver; +import org.jboss.as.controller.registry.ManagementResourceRegistration; +import org.jboss.as.controller.registry.Resource; +import org.jboss.dmr.ModelNode; +import org.jboss.jca.core.api.management.AdminObject; +import org.jboss.jca.core.api.management.ConnectionFactory; +import org.jboss.jca.core.connectionmanager.ConnectionManager; +import org.jboss.jca.core.spi.statistics.StatisticsPlugin; +import org.jboss.jca.deployers.common.CommonDeployment; +import org.jboss.msc.inject.Injector; +import org.jboss.msc.service.Service; +import org.jboss.msc.service.StartContext; +import org.jboss.msc.service.StartException; +import org.jboss.msc.service.StopContext; +import org.jboss.msc.value.InjectedValue; + +public class IronJacamarActivationResourceService implements Service { + + private static PathElement SUBSYSTEM_PATH_ELEMENT = PathElement.pathElement(ModelDescriptionConstants.SUBSYSTEM, ResourceAdaptersExtension.SUBSYSTEM_NAME); + private static PathElement IJ_PATH_ELEMENT = PathElement.pathElement(Constants.IRONJACAMAR_NAME, Constants.IRONJACAMAR_NAME); + + + private final ManagementResourceRegistration registration; + private final Resource deploymentResource; + private final boolean statsEnabled; + + protected final InjectedValue deployment = new InjectedValue<>(); + + protected final InjectedValue mdr = new InjectedValue(); + + /** + * create an instance * + */ + public IronJacamarActivationResourceService(final ManagementResourceRegistration registration, final Resource deploymentResource, + final boolean statsEnabled) { + super(); + this.registration = registration; + this.deploymentResource = deploymentResource; + this.statsEnabled = statsEnabled; + } + + + @Override + public void start(StartContext context) throws StartException { + ManagementResourceRegistration subRegistration; + final CommonDeployment deploymentMD = deployment.getValue().getDeployment(); + ROOT_LOGGER.debugf("Starting IronJacamarActivationResourceService %s", deploymentMD.getDeploymentName()); + + try { + ResourceBuilder resourceBuilder = ResourceBuilder.Factory.create(SUBSYSTEM_PATH_ELEMENT, + new StandardResourceDescriptionResolver(Constants.STATISTICS_NAME, CommonAttributes.RESOURCE_NAME, CommonAttributes.class.getClassLoader())); + subRegistration = registration.registerSubModel(resourceBuilder.build()); + + } catch (IllegalArgumentException iae) { + subRegistration = registration.getSubModel(PathAddress.pathAddress(SUBSYSTEM_PATH_ELEMENT)); + } + ManagementResourceRegistration ijRegistration; + + try { + ijRegistration = subRegistration.registerSubModel(new IronJacamarResourceDefinition()); + + } catch (IllegalArgumentException iae) { + ijRegistration = subRegistration.getSubModel(PathAddress.pathAddress(Constants.IRONJACAMAR_NAME, Constants.IRONJACAMAR_NAME)); + + } + + try { + if (deploymentResource != null) { + + + PathElement peLocalStats = PathElement.pathElement(Constants.STATISTICS_NAME, "extended"); + + if (deploymentMD.getConnector() != null && deploymentMD.getConnector().getResourceAdapter() != null) { + ManagementResourceRegistration raRegistration = ijRegistration. + getSubModel(PathAddress.EMPTY_ADDRESS.append(PathElement.pathElement(Constants.RESOURCEADAPTER_NAME))) + .registerOverrideModel(deploymentMD.getDeploymentName(), new OverrideDescriptionProvider() { + @Override + public Map getAttributeOverrideDescriptions(Locale locale) { + return Collections.emptyMap(); + } + + @Override + public Map getChildTypeOverrideDescriptions(Locale locale) { + return Collections.emptyMap(); + } + + }); + + ResourceBuilder resourceBuilder = ResourceBuilder.Factory.create(peLocalStats, + new StandardResourceDescriptionResolver(Constants.STATISTICS_NAME + "." + Constants.WORKMANAGER_NAME, CommonAttributes.RESOURCE_NAME, CommonAttributes.class.getClassLoader())); + + ManagementResourceRegistration raStatsSubRegistration = raRegistration.registerSubModel(resourceBuilder.build()); + + + if (deploymentMD.getConnector().getResourceAdapter().getStatistics() != null) { + StatisticsPlugin raStats = deploymentMD.getConnector().getResourceAdapter().getStatistics(); + raStats.setEnabled(statsEnabled); + PoolMetrics.ParametrizedPoolMetricsHandler handler = new PoolMetrics.ParametrizedPoolMetricsHandler(raStats); + for (AttributeDefinition attribute : StatisticsResourceDefinition.getAttributesFromPlugin(raStats)) { + raStatsSubRegistration.registerMetric(attribute, handler); + } + raStatsSubRegistration.registerOperationHandler(ClearStatisticsHandler.DEFINITION, new ClearStatisticsHandler(raStats)); + } + if (deploymentMD.getConnector() != null && deploymentMD.getConnector().getConnectionFactories() != null) { + for (ConnectionFactory cf : deploymentMD.getConnector().getConnectionFactories()) { + if (cf.getManagedConnectionFactory() != null && cf.getManagedConnectionFactory().getStatistics() != null) { + PathElement peCD = PathElement.pathElement(Constants.CONNECTIONDEFINITIONS_NAME, cf.getJndiName()); + PathElement peCdStats = PathElement.pathElement(Constants.STATISTICS_NAME, "extended"); + StatisticsPlugin extendStats = cf.getManagedConnectionFactory().getStatistics(); + extendStats.setEnabled(statsEnabled); + if (extendStats.getNames().size() != 0) { + + + if (extendStats.getNames().size() != 0) { + ManagementResourceRegistration cdRegistration = raRegistration.getSubModel(PathAddress.pathAddress(peCD)); + ManagementResourceRegistration overrideCdRegistration = cdRegistration.registerOverrideModel(cf.getJndiName(), new OverrideDescriptionProvider() { + @Override + public Map getAttributeOverrideDescriptions(Locale locale) { + return Collections.emptyMap(); + } + + @Override + public Map getChildTypeOverrideDescriptions(Locale locale) { + return Collections.emptyMap(); + } + + }); + if (extendStats.getNames().size() != 0 && overrideCdRegistration.getSubModel(PathAddress.pathAddress(peCdStats)) == null) { + overrideCdRegistration.registerSubModel(new StatisticsResourceDefinition(peCdStats, CommonAttributes.RESOURCE_NAME, extendStats)); + } + + + } + } + } + } + } + + if (deploymentMD.getConnectionManagers() != null) { + for (ConnectionManager cm : deploymentMD.getConnectionManagers()) { + if (cm.getPool() != null) { + PathElement peCD = PathElement.pathElement(Constants.CONNECTIONDEFINITIONS_NAME, cm.getJndiName()); + PathElement peCdStats = PathElement.pathElement(Constants.STATISTICS_NAME, "pool"); + StatisticsPlugin poolStats = cm.getPool().getStatistics(); + poolStats.setEnabled(statsEnabled); + + if (poolStats.getNames().size() != 0) { + ManagementResourceRegistration cdRegistration = raRegistration.getSubModel(PathAddress.pathAddress(peCD)); + ManagementResourceRegistration overrideCdRegistration = cdRegistration.registerOverrideModel(cm.getJndiName(), new OverrideDescriptionProvider() { + @Override + public Map getAttributeOverrideDescriptions(Locale locale) { + return Collections.emptyMap(); + } + + @Override + public Map getChildTypeOverrideDescriptions(Locale locale) { + return Collections.emptyMap(); + } + + }); + if (poolStats.getNames().size() != 0 && overrideCdRegistration.getSubModel(PathAddress.pathAddress(peCdStats)) == null) { + overrideCdRegistration.registerSubModel(new StatisticsResourceDefinition(peCdStats, CommonAttributes.RESOURCE_NAME, poolStats)); + } + + + } + } + } + } + + if (deploymentMD.getConnector() != null && deploymentMD.getConnector().getAdminObjects() != null) { + for (AdminObject ao : deploymentMD.getConnector().getAdminObjects()) { + if (ao.getStatistics() != null) { + PathElement peCD = PathElement.pathElement(Constants.ADMIN_OBJECTS_NAME, ao.getJndiName()); + PathElement peCdStats = PathElement.pathElement(Constants.STATISTICS_NAME, "extended"); + StatisticsPlugin extendStats = ao.getStatistics(); + extendStats.setEnabled(statsEnabled); + if (extendStats.getNames().size() != 0) { + + + if (extendStats.getNames().size() != 0) { + ManagementResourceRegistration cdRegistration = raRegistration.getSubModel(PathAddress.pathAddress(peCD)); + ManagementResourceRegistration overrideCdRegistration = cdRegistration.registerOverrideModel(ao.getJndiName(), new OverrideDescriptionProvider() { + @Override + public Map getAttributeOverrideDescriptions(Locale locale) { + return Collections.emptyMap(); + } + + @Override + public Map getChildTypeOverrideDescriptions(Locale locale) { + return Collections.emptyMap(); + } + + }); + if (extendStats.getNames().size() != 0 && overrideCdRegistration.getSubModel(PathAddress.pathAddress(peCdStats)) == null) { + overrideCdRegistration.registerSubModel(new StatisticsResourceDefinition(peCdStats, CommonAttributes.RESOURCE_NAME, extendStats)); + } + + + } + } + } + } + } + + } + } + } catch (IllegalArgumentException e) { + //ignore it, already restered + } + Resource subsystemResource; + + if (!deploymentResource.hasChild(SUBSYSTEM_PATH_ELEMENT)) { + subsystemResource = new IronJacamarResource.IronJacamarRuntimeResource(); + deploymentResource.registerChild(SUBSYSTEM_PATH_ELEMENT, subsystemResource); + } else { + subsystemResource = deploymentResource.getChild(SUBSYSTEM_PATH_ELEMENT); + } + + + IronJacamarResourceCreator.INSTANCE.execute(subsystemResource, mdr.getValue()); + + + } + + @Override + public void stop(StopContext context) { + ManagementResourceRegistration subsystemResourceRegistration; + + subsystemResourceRegistration = registration.getSubModel(PathAddress.pathAddress(SUBSYSTEM_PATH_ELEMENT)); + + if (subsystemResourceRegistration != null) { + if (subsystemResourceRegistration.getSubModel(PathAddress.pathAddress(IJ_PATH_ELEMENT)) != null) { + subsystemResourceRegistration.unregisterSubModel(IJ_PATH_ELEMENT); + } + registration.unregisterSubModel(SUBSYSTEM_PATH_ELEMENT); + } + deploymentResource.removeChild(SUBSYSTEM_PATH_ELEMENT); + } + + + @Override + public ManagementResourceRegistration getValue() throws IllegalStateException, IllegalArgumentException { + return registration; + } + + public Injector getMdrInjector() { + return mdr; + } + + public Injector getResourceAdapterDeploymentInjector() { + return deployment; + } + +} diff --git a/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/ResourceAdapterActivatorService.java b/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/ResourceAdapterActivatorService.java index b8e3d3e6eb87..2e053f968be3 100644 --- a/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/ResourceAdapterActivatorService.java +++ b/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/ResourceAdapterActivatorService.java @@ -149,7 +149,7 @@ public CommonDeployment getDeploymentMD() { return deploymentMD; } - private class ResourceAdapterActivator extends AbstractAS7RaDeployer { + private class ResourceAdapterActivator extends AbstractWildFlyRaDeployer { private final Activation activation; diff --git a/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/deployment/AbstractResourceAdapterDeploymentService.java b/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/deployment/AbstractResourceAdapterDeploymentService.java index ab1ba1d716de..1c7696372cd0 100644 --- a/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/deployment/AbstractResourceAdapterDeploymentService.java +++ b/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/deployment/AbstractResourceAdapterDeploymentService.java @@ -345,7 +345,7 @@ public void run() { } } - protected abstract class AbstractAS7RaDeployer extends AbstractResourceAdapterDeployer { + protected abstract class AbstractWildFlyRaDeployer extends AbstractResourceAdapterDeployer { protected final ServiceTarget serviceTarget; protected final URL url; @@ -355,8 +355,8 @@ protected abstract class AbstractAS7RaDeployer extends AbstractResourceAdapterDe protected final Connector cmd; protected final ServiceName deploymentServiceName; - protected AbstractAS7RaDeployer(ServiceTarget serviceTarget, URL url, String deploymentName, File root, ClassLoader cl, - Connector cmd, final ServiceName deploymentServiceName) { + protected AbstractWildFlyRaDeployer(ServiceTarget serviceTarget, URL url, String deploymentName, File root, ClassLoader cl, + Connector cmd, final ServiceName deploymentServiceName) { super(true); this.serviceTarget = serviceTarget; this.url = url; diff --git a/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/deployment/ResourceAdapterDeploymentService.java b/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/deployment/ResourceAdapterDeploymentService.java index 76a5d7a0c3ba..9d7c52fbe5c8 100644 --- a/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/deployment/ResourceAdapterDeploymentService.java +++ b/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/deployment/ResourceAdapterDeploymentService.java @@ -36,9 +36,12 @@ import org.jboss.as.connector.metadata.deployment.ResourceAdapterDeployment; import org.jboss.as.connector.metadata.xmldescriptors.ConnectorXmlDescriptor; import org.jboss.as.connector.services.mdr.AS7MetadataRepository; +import org.jboss.as.connector.services.resourceadapters.IronJacamarActivationResourceService; import org.jboss.as.connector.services.resourceadapters.ResourceAdapterService; import org.jboss.as.connector.subsystems.resourceadapters.RaOperationUtil; import org.jboss.as.connector.util.ConnectorServices; +import org.jboss.as.controller.registry.ManagementResourceRegistration; +import org.jboss.as.controller.registry.Resource; import org.jboss.as.naming.WritableServiceBasedNamingStore; import org.jboss.jca.common.api.metadata.resourceadapter.Activation; import org.jboss.jca.common.api.metadata.spec.AdminObject; @@ -59,6 +62,7 @@ /** * A ResourceAdapterDeploymentService. + * * @author Stefano Maestri * @author Jesper Pedersen */ @@ -71,6 +75,8 @@ public final class ResourceAdapterDeploymentService extends AbstractResourceAdap private final ConnectorXmlDescriptor connectorXmlDescriptor; private final Connector cmd; private final Activation activation; + private final ManagementResourceRegistration registration; + private final Resource deploymentResource; private CommonDeployment raDeployment = null; private String deploymentName; @@ -78,22 +84,24 @@ public final class ResourceAdapterDeploymentService extends AbstractResourceAdap private final ServiceName duServiceName; /** - * * @param connectorXmlDescriptor * @param cmd - * @activationm activation * @param classLoader * @param deploymentServiceName - * @param duServiceName the deployment unit's service name + * @param duServiceName the deployment unit's service name + * @activationm activation */ public ResourceAdapterDeploymentService(final ConnectorXmlDescriptor connectorXmlDescriptor, final Connector cmd, - final Activation activation, final ClassLoader classLoader, final ServiceName deploymentServiceName, final ServiceName duServiceName) { + final Activation activation, final ClassLoader classLoader, final ServiceName deploymentServiceName, final ServiceName duServiceName, + final ManagementResourceRegistration registration, final Resource deploymentResource) { this.connectorXmlDescriptor = connectorXmlDescriptor; this.cmd = cmd; this.activation = activation; this.classLoader = classLoader; this.deploymentServiceName = deploymentServiceName; this.duServiceName = duServiceName; + this.registration = registration; + this.deploymentResource = deploymentResource; } @Override @@ -102,10 +110,10 @@ public void start(StartContext context) throws StartException { deploymentName = connectorXmlDescriptor == null ? null : connectorXmlDescriptor.getDeploymentName(); connectorServicesRegistrationName = deploymentName; final File root = connectorXmlDescriptor == null ? null : connectorXmlDescriptor.getRoot(); - DEPLOYMENT_CONNECTOR_LOGGER.debugf("DEPLOYMENT name = %s",deploymentName); + DEPLOYMENT_CONNECTOR_LOGGER.debugf("DEPLOYMENT name = %s", deploymentName); final boolean fromModule = duServiceName.getParent().equals(RaOperationUtil.RAR_MODULE); - final AS7RaDeployer raDeployer = - new AS7RaDeployer(context.getChildTarget(), url, deploymentName, root, classLoader, cmd, activation, deploymentServiceName, fromModule); + final WildFLyRaDeployer raDeployer = + new WildFLyRaDeployer(context.getChildTarget(), url, deploymentName, root, classLoader, cmd, activation, deploymentServiceName, fromModule); raDeployer.setConfiguration(config.getValue()); ClassLoader old = WildFlySecurityManager.getCurrentContextClassLoaderPrivileged(); @@ -125,10 +133,21 @@ public void start(StartContext context) throws StartException { value = new ResourceAdapterDeployment(raDeployment, deploymentName, raServiceName); managementRepository.getValue().getConnectors().add(value.getDeployment().getConnector()); registry.getValue().registerResourceAdapterDeployment(value); - context.getChildTarget() + ServiceTarget serviceTarget = context.getChildTarget(); + serviceTarget .addService(raServiceName, new ResourceAdapterService(raServiceName, value.getDeployment().getResourceAdapter())).setInitialMode(Mode.ACTIVE) .install(); + final ServiceName deployerServiceName = ConnectorServices.RESOURCE_ADAPTER_DEPLOYER_SERVICE_PREFIX.append(connectorXmlDescriptor.getDeploymentName()); + + IronJacamarActivationResourceService ijResourceService = new IronJacamarActivationResourceService(registration, deploymentResource, false); + + serviceTarget.addService(deployerServiceName.append(ConnectorServices.IRONJACAMAR_RESOURCE), ijResourceService) + .addDependency(ConnectorServices.IRONJACAMAR_MDR, AS7MetadataRepository.class, ijResourceService.getMdrInjector()) + .addDependency(deployerServiceName, ResourceAdapterDeployment.class, ijResourceService.getResourceAdapterDeploymentInjector()) + .setInitialMode(Mode.PASSIVE) + .install(); + } else { DEPLOYMENT_CONNECTOR_LOGGER.debugf("Not activating: %s", deploymentName); } @@ -140,7 +159,7 @@ public void start(StartContext context) throws StartException { // TODO this could be replaced by the superclass method if there is no need for the TCCL change and push/pop owner // The stop() call doesn't do that so it's probably not needed private void cleanupStartAsync(final StartContext context, final String deploymentName, final Throwable cause, - final ServiceName duServiceName, final ClassLoader toUse) { + final ServiceName duServiceName, final ClassLoader toUse) { ExecutorService executorService = getLifecycleExecutorService(); Runnable r = new Runnable() { @Override @@ -182,16 +201,16 @@ public CommonDeployment getRaDeployment() { } public AS7MetadataRepository getMdr() { - return mdr.getValue(); - } + return mdr.getValue(); + } - private class AS7RaDeployer extends AbstractAS7RaDeployer { + private class WildFLyRaDeployer extends AbstractWildFlyRaDeployer { private final Activation activation; private final boolean fromModule; - public AS7RaDeployer(ServiceTarget serviceContainer, URL url, String deploymentName, File root, ClassLoader cl, - Connector cmd, Activation activation, final ServiceName deploymentServiceName, final boolean fromModule) { + public WildFLyRaDeployer(ServiceTarget serviceContainer, URL url, String deploymentName, File root, ClassLoader cl, + Connector cmd, Activation activation, final ServiceName deploymentServiceName, final boolean fromModule) { super(serviceContainer, url, deploymentName, root, cl, cmd, deploymentServiceName); this.activation = activation; this.fromModule = fromModule; @@ -215,29 +234,29 @@ protected boolean checkActivation(Connector cmd, Activation activation) { Set raMcfClasses = new HashSet(); Set raAoClasses = new HashSet(); - ResourceAdapter ra = cmd.getResourceadapter(); - if (ra != null && ra.getOutboundResourceadapter() != null && + ResourceAdapter ra = cmd.getResourceadapter(); + if (ra != null && ra.getOutboundResourceadapter() != null && ra.getOutboundResourceadapter().getConnectionDefinitions() != null) { - List cdMetas = ra.getOutboundResourceadapter().getConnectionDefinitions(); - if (cdMetas.size() > 0) { - for (ConnectionDefinition cdMeta : cdMetas) { - raMcfClasses.add(cdMeta.getManagedConnectionFactoryClass().getValue()); - } + List cdMetas = ra.getOutboundResourceadapter().getConnectionDefinitions(); + if (cdMetas.size() > 0) { + for (ConnectionDefinition cdMeta : cdMetas) { + raMcfClasses.add(cdMeta.getManagedConnectionFactoryClass().getValue()); } } + } - if (ra != null && ra.getAdminObjects() != null) { - List aoMetas = ra.getAdminObjects(); - if (aoMetas.size() > 0) { - for (AdminObject aoMeta : aoMetas) { - raAoClasses.add(aoMeta.getAdminobjectClass().getValue()); - } + if (ra != null && ra.getAdminObjects() != null) { + List aoMetas = ra.getAdminObjects(); + if (aoMetas.size() > 0) { + for (AdminObject aoMeta : aoMetas) { + raAoClasses.add(aoMeta.getAdminobjectClass().getValue()); } } + } - // Pure inflow always active except in case it is deployed as module - if (raMcfClasses.size() == 0 && raAoClasses.size() == 0 && ! fromModule) - return true; + // Pure inflow always active except in case it is deployed as module + if (raMcfClasses.size() == 0 && raAoClasses.size() == 0 && !fromModule) + return true; if (activation != null) { diff --git a/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/deployment/ResourceAdapterXmlDeploymentService.java b/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/deployment/ResourceAdapterXmlDeploymentService.java index a9ea3a160bc2..5bce4cbe63ee 100644 --- a/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/deployment/ResourceAdapterXmlDeploymentService.java +++ b/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/deployment/ResourceAdapterXmlDeploymentService.java @@ -104,7 +104,7 @@ public void start(StartContext context) throws StartException { raServiceName = ConnectorServices.getResourceAdapterServiceName(id); this.connectorServicesRegistrationName = id; } - final AS7RaXmlDeployer raDeployer = new AS7RaXmlDeployer(context.getChildTarget(), connectorXmlDescriptor.getUrl(), + final WildFlyRaXmlDeployer raDeployer = new WildFlyRaXmlDeployer(context.getChildTarget(), connectorXmlDescriptor.getUrl(), raName, root, module.getClassLoader(), cmd, localRaXml, deploymentServiceName); raDeployer.setConfiguration(config.getValue()); @@ -152,13 +152,13 @@ public synchronized Activation getRaxml() { } - private class AS7RaXmlDeployer extends AbstractAS7RaDeployer { + private class WildFlyRaXmlDeployer extends AbstractWildFlyRaDeployer { private final Activation activation; - public AS7RaXmlDeployer(ServiceTarget serviceTarget, URL url, String deploymentName, File root, ClassLoader cl, - Connector cmd, Activation activation, final ServiceName deploymentServiceName) { + public WildFlyRaXmlDeployer(ServiceTarget serviceTarget, URL url, String deploymentName, File root, ClassLoader cl, + Connector cmd, Activation activation, final ServiceName deploymentServiceName) { super(serviceTarget, url, deploymentName, root, cl, cmd, deploymentServiceName); this.activation = activation; } diff --git a/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/statistics/AdminObjectStatisticsService.java b/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/statistics/AdminObjectStatisticsService.java new file mode 100644 index 000000000000..a57ba7e3b49d --- /dev/null +++ b/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/statistics/AdminObjectStatisticsService.java @@ -0,0 +1,139 @@ +/* + * JBoss, Home of Professional Open Source. + * Copyright 2011, Red Hat, Inc., and individual contributors + * as indicated by the @author tags. See the copyright.txt file in the + * distribution for a full listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this software; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. + */ + +package org.jboss.as.connector.services.resourceadapters.statistics; + +import static org.jboss.as.connector.logging.ConnectorLogger.ROOT_LOGGER; + +import java.util.Collections; +import java.util.Locale; +import java.util.Map; + +import org.jboss.as.connector.dynamicresource.StatisticsResourceDefinition; +import org.jboss.as.connector.metadata.deployment.ResourceAdapterDeployment; +import org.jboss.as.connector.subsystems.resourceadapters.CommonAttributes; +import org.jboss.as.connector.subsystems.resourceadapters.Constants; +import org.jboss.as.controller.PathAddress; +import org.jboss.as.controller.PathElement; +import org.jboss.as.controller.descriptions.OverrideDescriptionProvider; +import org.jboss.as.controller.registry.ManagementResourceRegistration; +import org.jboss.dmr.ModelNode; +import org.jboss.jca.core.api.bootstrap.CloneableBootstrapContext; +import org.jboss.jca.core.api.management.AdminObject; +import org.jboss.jca.core.spi.statistics.StatisticsPlugin; +import org.jboss.jca.deployers.common.CommonDeployment; +import org.jboss.msc.inject.Injector; +import org.jboss.msc.service.Service; +import org.jboss.msc.service.StartContext; +import org.jboss.msc.service.StartException; +import org.jboss.msc.service.StopContext; +import org.jboss.msc.value.InjectedValue; + +public class AdminObjectStatisticsService implements Service { + + + private final ManagementResourceRegistration overrideRegistration; + private final boolean statsEnabled; + + protected final InjectedValue deployment = new InjectedValue<>(); + protected final InjectedValue bootstrapContext = new InjectedValue<>(); + + + /** + * create an instance * + */ + public AdminObjectStatisticsService(final ManagementResourceRegistration registration, + final String jndiName, + final boolean statsEnabled) { + super(); + if (registration.isAllowsOverride()) { + overrideRegistration = registration.registerOverrideModel(jndiName, new OverrideDescriptionProvider() { + @Override + public Map getAttributeOverrideDescriptions(Locale locale) { + return Collections.emptyMap(); + } + + @Override + public Map getChildTypeOverrideDescriptions(Locale locale) { + return Collections.emptyMap(); + } + + }); + } else { + overrideRegistration = registration; + } + this.statsEnabled = statsEnabled; + + } + + + @Override + public void start(StartContext context) throws StartException { + ROOT_LOGGER.debugf("Starting ResourceAdapterStatusicService"); + synchronized (this) { + + + final CommonDeployment deploymentMD = deployment.getValue().getDeployment(); + PathElement peExtendedStats = PathElement.pathElement(Constants.STATISTICS_NAME, "extended"); + + if (deploymentMD.getConnector() != null && deploymentMD.getConnector().getAdminObjects() != null) { + for (AdminObject ao : deploymentMD.getConnector().getAdminObjects()) { + if (ao.getStatistics() != null) { + StatisticsPlugin extendStats = ao.getStatistics(); + extendStats.setEnabled(statsEnabled); + if (extendStats.getNames().size() != 0) { + + if (extendStats.getNames().size() != 0 && overrideRegistration.getSubModel(PathAddress.pathAddress(peExtendedStats)) == null) { + overrideRegistration.registerSubModel(new StatisticsResourceDefinition(peExtendedStats, CommonAttributes.RESOURCE_NAME, extendStats)); + } + + } + } + } + } + + } + + } + + @Override + public void stop(StopContext context) { + PathElement peLocaldWm = PathElement.pathElement(Constants.STATISTICS_NAME, "extended"); + if (overrideRegistration.getSubModel(PathAddress.pathAddress(peLocaldWm)) != null) + overrideRegistration.unregisterSubModel(peLocaldWm); + } + + + @Override + public ManagementResourceRegistration getValue() throws IllegalStateException, IllegalArgumentException { + //TODO implement getValue + throw new UnsupportedOperationException(); + } + + public Injector getResourceAdapterDeploymentInjector() { + return deployment; + } + + public Injector getBootstrapContextInjector() { + return bootstrapContext; + } +} diff --git a/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/statistics/ConnectionDefinitionStatisticsService.java b/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/statistics/ConnectionDefinitionStatisticsService.java new file mode 100644 index 000000000000..7cb949b964f0 --- /dev/null +++ b/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/statistics/ConnectionDefinitionStatisticsService.java @@ -0,0 +1,163 @@ +/* + * JBoss, Home of Professional Open Source. + * Copyright 2011, Red Hat, Inc., and individual contributors + * as indicated by the @author tags. See the copyright.txt file in the + * distribution for a full listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this software; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. + */ + +package org.jboss.as.connector.services.resourceadapters.statistics; + +import static org.jboss.as.connector.logging.ConnectorLogger.ROOT_LOGGER; + +import java.util.Collections; +import java.util.Locale; +import java.util.Map; + +import org.jboss.as.connector.dynamicresource.StatisticsResourceDefinition; +import org.jboss.as.connector.metadata.deployment.ResourceAdapterDeployment; +import org.jboss.as.connector.subsystems.resourceadapters.CommonAttributes; +import org.jboss.as.connector.subsystems.resourceadapters.Constants; +import org.jboss.as.controller.PathAddress; +import org.jboss.as.controller.PathElement; +import org.jboss.as.controller.descriptions.OverrideDescriptionProvider; +import org.jboss.as.controller.registry.ManagementResourceRegistration; +import org.jboss.dmr.ModelNode; +import org.jboss.jca.core.api.bootstrap.CloneableBootstrapContext; +import org.jboss.jca.core.api.management.ConnectionFactory; +import org.jboss.jca.core.connectionmanager.ConnectionManager; +import org.jboss.jca.core.spi.statistics.StatisticsPlugin; +import org.jboss.jca.deployers.common.CommonDeployment; +import org.jboss.msc.inject.Injector; +import org.jboss.msc.service.Service; +import org.jboss.msc.service.StartContext; +import org.jboss.msc.service.StartException; +import org.jboss.msc.service.StopContext; +import org.jboss.msc.value.InjectedValue; + +public class ConnectionDefinitionStatisticsService implements Service { + + + private final ManagementResourceRegistration overrideRegistration; + private final boolean statsEnabled; + private final String jndiName; + + protected final InjectedValue deployment = new InjectedValue<>(); + protected final InjectedValue bootstrapContext = new InjectedValue<>(); + + + /** + * create an instance * + */ + public ConnectionDefinitionStatisticsService(final ManagementResourceRegistration registration, + final String jndiName, + final String poolName, + final boolean statsEnabled) { + super(); + this.jndiName = jndiName; + if (registration.isAllowsOverride()) { + overrideRegistration = registration.registerOverrideModel(poolName, new OverrideDescriptionProvider() { + @Override + public Map getAttributeOverrideDescriptions(Locale locale) { + return Collections.emptyMap(); + } + + @Override + public Map getChildTypeOverrideDescriptions(Locale locale) { + return Collections.emptyMap(); + } + + }); + } else { + overrideRegistration = registration; + } + this.statsEnabled = statsEnabled; + + } + + + @Override + public void start(StartContext context) throws StartException { + ROOT_LOGGER.debugf("Starting ConnectionDefinitionStatisticsService %s", jndiName); + synchronized (this) { + final CommonDeployment deploymentMD = deployment.getValue().getDeployment(); + PathElement pePoolStats = PathElement.pathElement(Constants.STATISTICS_NAME, "pool"); + PathElement peExtendedStats = PathElement.pathElement(Constants.STATISTICS_NAME, "extended"); + + if (deploymentMD.getConnector() != null && deploymentMD.getConnector().getConnectionFactories() != null) { + for (ConnectionFactory cf : deploymentMD.getConnector().getConnectionFactories()) { + if (cf.getManagedConnectionFactory() != null && cf.getManagedConnectionFactory().getStatistics() != null) { + StatisticsPlugin extendStats = cf.getManagedConnectionFactory().getStatistics(); + extendStats.setEnabled(statsEnabled); + if (extendStats.getNames().size() != 0) { + + if (extendStats.getNames().size() != 0 && overrideRegistration.getSubModel(PathAddress.pathAddress(peExtendedStats)) == null) { + overrideRegistration.registerSubModel(new StatisticsResourceDefinition(peExtendedStats, CommonAttributes.RESOURCE_NAME, extendStats)); + } + + } + } + } + } + + if (deploymentMD.getConnectionManagers() != null) { + for (ConnectionManager cm : deploymentMD.getConnectionManagers()) { + if (cm.getPool() != null && cm.getJndiName() != null && cm.getJndiName().equals(jndiName)) { + StatisticsPlugin poolStats = cm.getPool().getStatistics(); + poolStats.setEnabled(statsEnabled); + + if (poolStats.getNames().size() != 0) { + + if (poolStats.getNames().size() != 0 && overrideRegistration.getSubModel(PathAddress.pathAddress(pePoolStats)) == null) { + overrideRegistration.registerSubModel(new StatisticsResourceDefinition(pePoolStats, CommonAttributes.RESOURCE_NAME, poolStats)); + } + + } + } + } + } + } + } + + @Override + public void stop(StopContext context) { + PathElement peCD = PathElement.pathElement(Constants.STATISTICS_NAME, "pool"); + if (overrideRegistration.getSubModel(PathAddress.pathAddress(peCD)) != null) { + overrideRegistration.unregisterSubModel(peCD); + } + PathElement peExtended = PathElement.pathElement(Constants.STATISTICS_NAME, "extended"); + if (overrideRegistration.getSubModel(PathAddress.pathAddress(peExtended)) != null) { + overrideRegistration.unregisterSubModel(peExtended); + } + + + } + + + @Override + public ManagementResourceRegistration getValue() throws IllegalStateException, IllegalArgumentException { + return overrideRegistration; + } + + public Injector getResourceAdapterDeploymentInjector() { + return deployment; + } + + public Injector getBootstrapContextInjector() { + return bootstrapContext; + } +} diff --git a/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/statistics/ResourceAdapterStatisticsService.java b/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/statistics/ResourceAdapterStatisticsService.java new file mode 100644 index 000000000000..3f3f1a93caf3 --- /dev/null +++ b/connector/src/main/java/org/jboss/as/connector/services/resourceadapters/statistics/ResourceAdapterStatisticsService.java @@ -0,0 +1,128 @@ +/* + * JBoss, Home of Professional Open Source. + * Copyright 2011, Red Hat, Inc., and individual contributors + * as indicated by the @author tags. See the copyright.txt file in the + * distribution for a full listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this software; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. + */ + +package org.jboss.as.connector.services.resourceadapters.statistics; + +import static org.jboss.as.connector.logging.ConnectorLogger.ROOT_LOGGER; + +import java.util.Collections; +import java.util.Locale; +import java.util.Map; + +import org.jboss.as.connector.dynamicresource.StatisticsResourceDefinition; +import org.jboss.as.connector.metadata.deployment.ResourceAdapterDeployment; +import org.jboss.as.connector.subsystems.resourceadapters.CommonAttributes; +import org.jboss.as.connector.subsystems.resourceadapters.Constants; +import org.jboss.as.controller.PathAddress; +import org.jboss.as.controller.PathElement; +import org.jboss.as.controller.descriptions.OverrideDescriptionProvider; +import org.jboss.as.controller.registry.ManagementResourceRegistration; +import org.jboss.dmr.ModelNode; +import org.jboss.jca.core.api.bootstrap.CloneableBootstrapContext; +import org.jboss.jca.core.spi.statistics.StatisticsPlugin; +import org.jboss.jca.deployers.common.CommonDeployment; +import org.jboss.msc.inject.Injector; +import org.jboss.msc.service.Service; +import org.jboss.msc.service.StartContext; +import org.jboss.msc.service.StartException; +import org.jboss.msc.service.StopContext; +import org.jboss.msc.value.InjectedValue; + +public class ResourceAdapterStatisticsService implements Service { + + + private final ManagementResourceRegistration overrideRegistration; + private final boolean statsEnabled; + + protected final InjectedValue deployment = new InjectedValue<>(); + protected final InjectedValue bootstrapContext = new InjectedValue<>(); + + + /** + * create an instance * + */ + public ResourceAdapterStatisticsService(final ManagementResourceRegistration registration, + final String jndiName, + final boolean statsEnabled) { + super(); + if (registration.isAllowsOverride()) { + overrideRegistration = registration.registerOverrideModel(jndiName, new OverrideDescriptionProvider() { + @Override + public Map getAttributeOverrideDescriptions(Locale locale) { + return Collections.emptyMap(); + } + + @Override + public Map getChildTypeOverrideDescriptions(Locale locale) { + return Collections.emptyMap(); + } + + }); + } else { + overrideRegistration = registration; + } + this.statsEnabled = statsEnabled; + + } + + + @Override + public void start(StartContext context) throws StartException { + ROOT_LOGGER.debugf("Starting ResourceAdapterStatusicService"); + synchronized (this) { + PathElement peExtendedStats = PathElement.pathElement(Constants.STATISTICS_NAME, "extended"); + + + + final CommonDeployment deploymentMD = deployment.getValue().getDeployment(); + + if (deploymentMD.getConnector() != null && deploymentMD.getConnector().getResourceAdapter() != null && deploymentMD.getConnector().getResourceAdapter().getStatistics() != null) { + StatisticsPlugin raStats = deploymentMD.getConnector().getResourceAdapter().getStatistics(); + raStats.setEnabled(statsEnabled); + overrideRegistration.registerSubModel(new StatisticsResourceDefinition(peExtendedStats, CommonAttributes.RESOURCE_NAME, raStats)); + } + } + + } + + @Override + public void stop(StopContext context) { + PathElement peLocaldWm = PathElement.pathElement(Constants.STATISTICS_NAME, "extended"); + if (overrideRegistration.getSubModel(PathAddress.pathAddress(peLocaldWm)) != null) + overrideRegistration.unregisterSubModel(peLocaldWm); + } + + + @Override + public ManagementResourceRegistration getValue() throws IllegalStateException, IllegalArgumentException { + //TODO implement getValue + throw new UnsupportedOperationException(); + } + + public Injector getResourceAdapterDeploymentInjector() { + return deployment; + } + + public Injector getBootstrapContextInjector() { + return bootstrapContext; + } +} diff --git a/connector/src/main/java/org/jboss/as/connector/services/workmanager/statistics/DistributedWorkManagerStatisticsService.java b/connector/src/main/java/org/jboss/as/connector/services/workmanager/statistics/DistributedWorkManagerStatisticsService.java new file mode 100644 index 000000000000..6a28259b5968 --- /dev/null +++ b/connector/src/main/java/org/jboss/as/connector/services/workmanager/statistics/DistributedWorkManagerStatisticsService.java @@ -0,0 +1,140 @@ +/* + * JBoss, Home of Professional Open Source. + * Copyright 2011, Red Hat, Inc., and individual contributors + * as indicated by the @author tags. See the copyright.txt file in the + * distribution for a full listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this software; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. + */ + +package org.jboss.as.connector.services.workmanager.statistics; + +import java.util.Collections; +import java.util.Locale; +import java.util.Map; + +import org.jboss.as.connector.dynamicresource.ClearWorkManagerStatisticsHandler; +import org.jboss.as.connector.subsystems.resourceadapters.CommonAttributes; +import org.jboss.as.connector.subsystems.resourceadapters.Constants; +import org.jboss.as.connector.subsystems.resourceadapters.WorkManagerRuntimeAttributeReadHandler; +import org.jboss.as.connector.subsystems.resourceadapters.WorkManagerRuntimeAttributeWriteHandler; +import org.jboss.as.controller.OperationStepHandler; +import org.jboss.as.controller.PathAddress; +import org.jboss.as.controller.PathElement; +import org.jboss.as.controller.ResourceBuilder; +import org.jboss.as.controller.SimpleAttributeDefinition; +import org.jboss.as.controller.descriptions.OverrideDescriptionProvider; +import org.jboss.as.controller.descriptions.StandardResourceDescriptionResolver; +import org.jboss.as.controller.registry.ManagementResourceRegistration; +import org.jboss.dmr.ModelNode; +import org.jboss.jca.core.api.workmanager.DistributedWorkManager; +import org.jboss.msc.inject.Injector; +import org.jboss.msc.service.Service; +import org.jboss.msc.service.StartContext; +import org.jboss.msc.service.StartException; +import org.jboss.msc.service.StopContext; +import org.jboss.msc.value.InjectedValue; + +public class DistributedWorkManagerStatisticsService implements Service { + + private final ManagementResourceRegistration overrideRegistration; + private final boolean statsEnabled; + + protected final InjectedValue distributedWorkManager = new InjectedValue<>(); + + + /** + * create an instance * + */ + public DistributedWorkManagerStatisticsService(final ManagementResourceRegistration registration, + final String name, + final boolean statsEnabled) { + super(); + if (registration.isAllowsOverride()) { + overrideRegistration = registration.registerOverrideModel(name, new OverrideDescriptionProvider() { + @Override + public Map getAttributeOverrideDescriptions(Locale locale) { + return Collections.emptyMap(); + } + + @Override + public Map getChildTypeOverrideDescriptions(Locale locale) { + return Collections.emptyMap(); + } + + }); + } else { + overrideRegistration = registration; + } + this.statsEnabled = statsEnabled; + + } + + + @Override + public void start(StartContext context) throws StartException { + synchronized (this) { + DistributedWorkManager dwm = distributedWorkManager.getValue(); + dwm.setDistributedStatisticsEnabled(statsEnabled); + + if (dwm.getDistributedStatistics() != null) { + PathElement peDistributedWm = PathElement.pathElement(Constants.STATISTICS_NAME, "distributed"); + + ResourceBuilder resourceBuilder = ResourceBuilder.Factory.create(peDistributedWm, + new StandardResourceDescriptionResolver(Constants.STATISTICS_NAME + "." + Constants.WORKMANAGER_NAME, CommonAttributes.RESOURCE_NAME, CommonAttributes.class.getClassLoader())); + + ManagementResourceRegistration dwmSubRegistration = overrideRegistration.registerSubModel(resourceBuilder.build()); + + OperationStepHandler metricHandler = new WorkManagerRuntimeAttributeReadHandler(dwm, dwm.getDistributedStatistics(), false); + for (SimpleAttributeDefinition metric : Constants.WORKMANAGER_METRICS) { + dwmSubRegistration.registerMetric(metric, metricHandler); + } + + OperationStepHandler readHandler = new WorkManagerRuntimeAttributeReadHandler(dwm, dwm.getDistributedStatistics(), false); + OperationStepHandler writeHandler = new WorkManagerRuntimeAttributeWriteHandler(dwm, false, Constants.DISTRIBUTED_WORKMANAGER_RW_ATTRIBUTES); + + for (SimpleAttributeDefinition attribute : Constants.DISTRIBUTED_WORKMANAGER_RW_ATTRIBUTES) { + dwmSubRegistration.registerReadWriteAttribute(attribute, readHandler, writeHandler); + } + + + dwmSubRegistration.registerOperationHandler(ClearWorkManagerStatisticsHandler.DEFINITION, new ClearWorkManagerStatisticsHandler(dwm)); + + } + } + } + + + @Override + public void stop(StopContext context) { + + PathElement peDistributedWm = PathElement.pathElement(Constants.STATISTICS_NAME, "distributed"); + if (overrideRegistration.getSubModel(PathAddress.pathAddress(peDistributedWm)) != null) + overrideRegistration.unregisterSubModel(peDistributedWm); + + } + + + @Override + public ManagementResourceRegistration getValue() throws IllegalStateException, IllegalArgumentException { + return overrideRegistration; + } + + + public Injector getDistributedWorkManagerInjector() { + return distributedWorkManager; + } +} diff --git a/connector/src/main/java/org/jboss/as/connector/services/workmanager/statistics/WorkManagerStatisticsService.java b/connector/src/main/java/org/jboss/as/connector/services/workmanager/statistics/WorkManagerStatisticsService.java new file mode 100644 index 000000000000..8a0b15291730 --- /dev/null +++ b/connector/src/main/java/org/jboss/as/connector/services/workmanager/statistics/WorkManagerStatisticsService.java @@ -0,0 +1,134 @@ +/* + * JBoss, Home of Professional Open Source. + * Copyright 2011, Red Hat, Inc., and individual contributors + * as indicated by the @author tags. See the copyright.txt file in the + * distribution for a full listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this software; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. + */ + +package org.jboss.as.connector.services.workmanager.statistics; + +import java.util.Collections; +import java.util.Locale; +import java.util.Map; + +import org.jboss.as.connector.dynamicresource.ClearWorkManagerStatisticsHandler; +import org.jboss.as.connector.subsystems.resourceadapters.CommonAttributes; +import org.jboss.as.connector.subsystems.resourceadapters.Constants; +import org.jboss.as.connector.subsystems.resourceadapters.WorkManagerRuntimeAttributeReadHandler; +import org.jboss.as.connector.subsystems.resourceadapters.WorkManagerRuntimeAttributeWriteHandler; +import org.jboss.as.controller.OperationStepHandler; +import org.jboss.as.controller.PathAddress; +import org.jboss.as.controller.PathElement; +import org.jboss.as.controller.ResourceBuilder; +import org.jboss.as.controller.SimpleAttributeDefinition; +import org.jboss.as.controller.descriptions.OverrideDescriptionProvider; +import org.jboss.as.controller.descriptions.StandardResourceDescriptionResolver; +import org.jboss.as.controller.registry.ManagementResourceRegistration; +import org.jboss.dmr.ModelNode; +import org.jboss.jca.core.api.workmanager.WorkManager; +import org.jboss.msc.inject.Injector; +import org.jboss.msc.service.Service; +import org.jboss.msc.service.StartContext; +import org.jboss.msc.service.StartException; +import org.jboss.msc.service.StopContext; +import org.jboss.msc.value.InjectedValue; + +public class WorkManagerStatisticsService implements Service { + + private final ManagementResourceRegistration overrideRegistration; + private final boolean statsEnabled; + + protected final InjectedValue workManager = new InjectedValue<>(); + + + /** + * create an instance * + */ + public WorkManagerStatisticsService(final ManagementResourceRegistration registration, + final String name, + final boolean statsEnabled) { + super(); + overrideRegistration = registration.registerOverrideModel(name, new OverrideDescriptionProvider() { + @Override + public Map getAttributeOverrideDescriptions(Locale locale) { + return Collections.emptyMap(); + } + + @Override + public Map getChildTypeOverrideDescriptions(Locale locale) { + return Collections.emptyMap(); + } + + }); + this.statsEnabled = statsEnabled; + + } + + + @Override + public void start(StartContext context) throws StartException { + synchronized (this) { + WorkManager wm = workManager.getValue(); + wm.setStatisticsEnabled(statsEnabled); + + if (wm.getStatistics() != null) { + PathElement peLocaldWm = PathElement.pathElement(Constants.STATISTICS_NAME, "local"); + + ResourceBuilder resourceBuilder = ResourceBuilder.Factory.create(peLocaldWm, + new StandardResourceDescriptionResolver(Constants.STATISTICS_NAME + "." + Constants.WORKMANAGER_NAME, CommonAttributes.RESOURCE_NAME, CommonAttributes.class.getClassLoader())); + + ManagementResourceRegistration wmSubRegistration = overrideRegistration.registerSubModel(resourceBuilder.build()); + + + OperationStepHandler metricHandler = new WorkManagerRuntimeAttributeReadHandler(wm, wm.getStatistics(), false); + for (SimpleAttributeDefinition metric : Constants.WORKMANAGER_METRICS) { + wmSubRegistration.registerMetric(metric, metricHandler); + } + + OperationStepHandler readHandler = new WorkManagerRuntimeAttributeReadHandler(wm, wm.getStatistics(), false); + OperationStepHandler writeHandler = new WorkManagerRuntimeAttributeWriteHandler(wm, false, Constants.WORKMANAGER_RW_ATTRIBUTES); + for (SimpleAttributeDefinition attribute : Constants.WORKMANAGER_RW_ATTRIBUTES) { + wmSubRegistration.registerReadWriteAttribute(attribute, readHandler, writeHandler); + } + + wmSubRegistration.registerOperationHandler(ClearWorkManagerStatisticsHandler.DEFINITION, new ClearWorkManagerStatisticsHandler(wm)); + + } + } + } + + + @Override + public void stop(StopContext context) { + PathElement peLocaldWm = PathElement.pathElement(Constants.STATISTICS_NAME, "local"); + if (overrideRegistration.getSubModel(PathAddress.pathAddress(peLocaldWm)) != null) + overrideRegistration.unregisterSubModel(peLocaldWm); + + } + + + @Override + public ManagementResourceRegistration getValue() throws IllegalStateException, IllegalArgumentException { + return overrideRegistration; + } + + + public Injector getWorkManagerInjector() { + return workManager; + } +} diff --git a/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/AbstractDataSourceRemove.java b/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/AbstractDataSourceRemove.java index 4030045b0176..2509e21e6e71 100644 --- a/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/AbstractDataSourceRemove.java +++ b/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/AbstractDataSourceRemove.java @@ -106,6 +106,8 @@ protected void performRuntime(OperationContext context, ModelNode operation, Mod if (dataSourceController != null) { context.removeService(dataSourceServiceName); } + context.removeService(CommonDeploymentService.SERVICE_NAME_BASE.append(jndiName)); + context.removeService(dataSourceServiceName.append(Constants.STATISTICS)); final ServiceName driverDemanderServiceName = ServiceName.JBOSS.append("driver-demander").append(jndiName); diff --git a/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/AbstractDataSourceService.java b/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/AbstractDataSourceService.java index 2168ec04e680..4734fbae7f1c 100644 --- a/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/AbstractDataSourceService.java +++ b/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/AbstractDataSourceService.java @@ -80,6 +80,7 @@ import org.jboss.msc.inject.Injector; import org.jboss.msc.service.Service; import org.jboss.msc.service.ServiceContainer; +import org.jboss.msc.service.ServiceController; import org.jboss.msc.service.ServiceName; import org.jboss.msc.service.StartContext; import org.jboss.msc.service.StartException; @@ -138,6 +139,10 @@ public synchronized void start(StartContext startContext) throws StartException } sqlDataSource = new WildFlyDataSource((javax.sql.DataSource) deploymentMD.getCfs()[0], jndiName); DS_DEPLOYER_LOGGER.debugf("Adding datasource: %s", deploymentMD.getCfJndiNames()[0]); + CommonDeploymentService cdService = new CommonDeploymentService(deploymentMD); + startContext.getController().getServiceContainer().addService(CommonDeploymentService.SERVICE_NAME_BASE.append(jndiName),cdService) + .addDependency(SERVICE_NAME_BASE.append(jndiName)) + .setInitialMode(ServiceController.Mode.ACTIVE).install(); } catch (Throwable t) { throw ConnectorLogger.ROOT_LOGGER.deploymentError(t, dsName); } @@ -146,6 +151,9 @@ public synchronized void start(StartContext startContext) throws StartException protected abstract AS7DataSourceDeployer getDeployer() throws ValidateException ; public void stop(final StopContext stopContext) { + if (stopContext.getController().getServiceContainer().getService(CommonDeploymentService.SERVICE_NAME_BASE.append(jndiName)) != null) { + stopContext.getController().getServiceContainer().getService(CommonDeploymentService.SERVICE_NAME_BASE.append(jndiName)).setMode(ServiceController.Mode.REMOVE); + } ExecutorService executorService = executor.getValue(); Runnable r = new Runnable() { @Override diff --git a/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/CommonDeploymentService.java b/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/CommonDeploymentService.java new file mode 100644 index 000000000000..0db9d33ddfe5 --- /dev/null +++ b/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/CommonDeploymentService.java @@ -0,0 +1,62 @@ +/* + * JBoss, Home of Professional Open Source. + * Copyright 2011, Red Hat, Inc., and individual contributors + * as indicated by the @author tags. See the copyright.txt file in the + * distribution for a full listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this software; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. + */ + +package org.jboss.as.connector.subsystems.datasources; + +import static org.jboss.as.connector.logging.ConnectorLogger.ROOT_LOGGER; + +import org.jboss.jca.deployers.common.CommonDeployment; +import org.jboss.msc.service.Service; +import org.jboss.msc.service.ServiceName; +import org.jboss.msc.service.StartContext; +import org.jboss.msc.service.StartException; +import org.jboss.msc.service.StopContext; + +public class CommonDeploymentService implements Service { + + public static final ServiceName SERVICE_NAME_BASE = ServiceName.JBOSS.append("data-source").append("common-deployment"); + + private CommonDeployment value; + + /** create an instance **/ + public CommonDeploymentService(CommonDeployment value) { + super(); + this.value = value; + + } + + @Override + public CommonDeployment getValue() throws IllegalStateException, IllegalArgumentException { + return value; + } + + @Override + public void start(StartContext context) throws StartException { + ROOT_LOGGER.debugf("Started CommonDeployment %s"); + + } + + @Override + public void stop(StopContext context) { + ROOT_LOGGER.debugf("Stopped CommonDeployment %s"); + } +} diff --git a/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/Constants.java b/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/Constants.java index 651116d7ec97..77126afb3333 100644 --- a/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/Constants.java +++ b/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/Constants.java @@ -239,7 +239,7 @@ public class Constants { .setAllowNull(true) .build(); - static final String STATISTICS = "statistics"; + public static final String STATISTICS = "statistics"; static SimpleAttributeDefinition CONNECTION_URL = new SimpleAttributeDefinitionBuilder(CONNECTION_URL_NAME, ModelType.STRING, false) diff --git a/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/DataSourceDisable.java b/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/DataSourceDisable.java index 2532ef9bfdcc..dbf37daa7d11 100644 --- a/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/DataSourceDisable.java +++ b/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/DataSourceDisable.java @@ -29,6 +29,7 @@ import java.util.List; import org.jboss.as.connector.logging.ConnectorLogger; +import org.jboss.as.connector.services.datasources.statistics.DataSourceStatisticsService; import org.jboss.as.controller.OperationContext; import org.jboss.as.controller.OperationFailedException; import org.jboss.as.controller.OperationStepHandler; @@ -67,7 +68,7 @@ public void execute(OperationContext context, ModelNode operation) { if (context.isNormalServer()) { - DataSourceStatisticsListener.removeStatisticsResources(resource); + DataSourceStatisticsService.removeStatisticsResources(resource); if (context.isResourceServiceRestartAllowed()) { context.addStep(new OperationStepHandler() { @@ -90,17 +91,18 @@ public void execute(final OperationContext context, ModelNode operation) throws } else { throw new OperationFailedException(ConnectorLogger.ROOT_LOGGER.serviceNotAvailable("Data-source", dsName)); } - + context.removeService(CommonDeploymentService.SERVICE_NAME_BASE.append(jndiName)); + context.removeService(dataSourceServiceName.append(Constants.STATISTICS)); final ServiceName referenceServiceName = DataSourceReferenceFactoryService.SERVICE_NAME_BASE.append(dsName); final ServiceController referenceController = registry.getService(referenceServiceName); - if (referenceController != null ) { + if (referenceController != null) { context.removeService(referenceController); } final ServiceName binderServiceName = ContextNames.bindInfoFor(jndiName).getBinderServiceName(); final ServiceController binderController = registry.getService(binderServiceName); - if (binderController != null ) { + if (binderController != null) { context.removeService(binderController); } diff --git a/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/DataSourceEnable.java b/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/DataSourceEnable.java index ddc08926c701..e571e55f1ff8 100644 --- a/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/DataSourceEnable.java +++ b/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/DataSourceEnable.java @@ -33,6 +33,7 @@ import java.util.List; import org.jboss.as.connector.logging.ConnectorLogger; +import org.jboss.as.connector.services.datasources.statistics.DataSourceStatisticsService; import org.jboss.as.controller.OperationContext; import org.jboss.as.controller.OperationFailedException; import org.jboss.as.controller.OperationStepHandler; @@ -48,6 +49,7 @@ import org.jboss.jca.common.api.metadata.common.Credential; import org.jboss.jca.common.api.metadata.ds.DsSecurity; import org.jboss.jca.common.api.validator.ValidateException; +import org.jboss.jca.deployers.common.CommonDeployment; import org.jboss.msc.service.AbstractServiceListener; import org.jboss.msc.service.ServiceBuilder; import org.jboss.msc.service.ServiceController; @@ -79,7 +81,7 @@ public void execute(OperationContext context, ModelNode operation) { model.get(ENABLED).set(true); if (context.isNormalServer()) { - DataSourceStatisticsListener.registerStatisticsResources(resource); + DataSourceStatisticsService.registerStatisticsResources(resource); context.addStep(new OperationStepHandler() { public void execute(OperationContext context, ModelNode operation) throws OperationFailedException { @@ -201,8 +203,12 @@ static void addServices(OperationContext context, ModelNode operation, Managemen if (dataSourceController != null) { if (!ServiceController.State.UP.equals(dataSourceController.getState())) { final boolean statsEnabled = STATISTICS_ENABLED.resolveModelAttribute(context, model).asBoolean(); - dataSourceController.addListener(new DataSourceStatisticsListener(datasourceRegistration, statsEnabled)); - + DataSourceStatisticsService statsService = new DataSourceStatisticsService(datasourceRegistration, statsEnabled); + serviceTarget.addService(dataSourceServiceName.append(Constants.STATISTICS), statsService) + .addDependency(dataSourceServiceName) + .addDependency(CommonDeploymentService.SERVICE_NAME_BASE.append(jndiName), CommonDeployment.class, statsService.getCommonDeploymentInjector()) + .setInitialMode(ServiceController.Mode.PASSIVE) + .install(); dataSourceController.setMode(ServiceController.Mode.ACTIVE); } else { throw new OperationFailedException(ConnectorLogger.ROOT_LOGGER.serviceAlreadyStarted("Data-source", dsName)); diff --git a/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/DataSourceStatisticsListener.java b/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/DataSourceStatisticsListener.java deleted file mode 100644 index 259408935d53..000000000000 --- a/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/DataSourceStatisticsListener.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * JBoss, Home of Professional Open Source. - * Copyright 2012, Red Hat, Inc., and individual contributors - * as indicated by the @author tags. See the copyright.txt file in the - * distribution for a full listing of individual contributors. - * - * This is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this software; if not, write to the Free - * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA - * 02110-1301 USA, or see the FSF site: http://www.fsf.org. - */ - -package org.jboss.as.connector.subsystems.datasources; - -import org.jboss.as.connector.dynamicresource.StatisticsResourceDefinition; -import org.jboss.as.controller.PathElement; -import org.jboss.as.controller.registry.ManagementResourceRegistration; -import org.jboss.as.controller.registry.PlaceholderResource; -import org.jboss.as.controller.registry.Resource; -import org.jboss.jca.core.spi.statistics.StatisticsPlugin; -import org.jboss.jca.deployers.common.CommonDeployment; -import org.jboss.msc.service.AbstractServiceListener; -import org.jboss.msc.service.ServiceController; - -/** - * Listener that registers data source statistics with the management model - */ -public class DataSourceStatisticsListener extends AbstractServiceListener { - - private static final PathElement JDBC_STATISTICS = PathElement.pathElement("statistics", "jdbc"); - private static final PathElement POOL_STATISTICS = PathElement.pathElement("statistics", "pool"); - - private final ManagementResourceRegistration overrideRegistration; - private final boolean statsEnabled; - - public DataSourceStatisticsListener(final ManagementResourceRegistration overrideRegistration, final boolean statsEnabled) { - this.overrideRegistration = overrideRegistration; - this.statsEnabled = statsEnabled; - } - - public void transition(final ServiceController controller, - final ServiceController.Transition transition) { - - switch (transition) { - case STARTING_to_UP: { - - CommonDeployment deploymentMD = ((AbstractDataSourceService) controller.getService()).getDeploymentMD(); - - StatisticsPlugin jdbcStats = deploymentMD.getDataSources()[0].getStatistics(); - StatisticsPlugin poolStats = deploymentMD.getDataSources()[0].getPool().getStatistics(); - jdbcStats.setEnabled(statsEnabled); - poolStats.setEnabled(statsEnabled); - - int jdbcStatsSize = jdbcStats.getNames().size(); - int poolStatsSize = poolStats.getNames().size(); - if (jdbcStatsSize > 0 || poolStatsSize > 0) { - if (overrideRegistration != null) { - if (jdbcStatsSize > 0) { - ManagementResourceRegistration jdbcRegistration = overrideRegistration.registerSubModel(new StatisticsResourceDefinition(JDBC_STATISTICS,DataSourcesSubsystemProviders.RESOURCE_NAME, jdbcStats)); - jdbcRegistration.setRuntimeOnly(true); - } - - if (poolStatsSize > 0) { - ManagementResourceRegistration poolRegistration = overrideRegistration.registerSubModel(new StatisticsResourceDefinition(POOL_STATISTICS, DataSourcesSubsystemProviders.RESOURCE_NAME, poolStats)); - poolRegistration.setRuntimeOnly(true); - } - } - } - break; - - - } - case UP_to_STOP_REQUESTED: { - - if (overrideRegistration != null) { - overrideRegistration.unregisterSubModel(JDBC_STATISTICS); - overrideRegistration.unregisterSubModel(POOL_STATISTICS); - } - break; - - } - } - } - - public static void registerStatisticsResources(Resource datasourceResource) { - if (!datasourceResource.hasChild(JDBC_STATISTICS)) { - datasourceResource.registerChild(JDBC_STATISTICS, new PlaceholderResource.PlaceholderResourceEntry(JDBC_STATISTICS)); - } - if (!datasourceResource.hasChild(POOL_STATISTICS)) { - datasourceResource.registerChild(POOL_STATISTICS, new PlaceholderResource.PlaceholderResourceEntry(POOL_STATISTICS)); - } - } - - public static void removeStatisticsResources(Resource datasourceResource) { - if (datasourceResource.hasChild(JDBC_STATISTICS)) { - datasourceResource.removeChild(JDBC_STATISTICS); - } - if (datasourceResource.hasChild(POOL_STATISTICS)) { - datasourceResource.removeChild(POOL_STATISTICS); - } - } -} diff --git a/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/DataSourcesSubsystemProviders.java b/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/DataSourcesSubsystemProviders.java index 1999010c6ffa..8b001d76e3f5 100644 --- a/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/DataSourcesSubsystemProviders.java +++ b/connector/src/main/java/org/jboss/as/connector/subsystems/datasources/DataSourcesSubsystemProviders.java @@ -42,7 +42,7 @@ public class DataSourcesSubsystemProviders { - static final String RESOURCE_NAME = DataSourcesSubsystemProviders.class.getPackage().getName() + ".LocalDescriptions"; + public static final String RESOURCE_NAME = DataSourcesSubsystemProviders.class.getPackage().getName() + ".LocalDescriptions"; public static OverrideDescriptionProvider OVERRIDE_DS_DESC = new OverrideDescriptionProvider() { diff --git a/connector/src/main/java/org/jboss/as/connector/subsystems/jca/DistributedWorkManagerAdd.java b/connector/src/main/java/org/jboss/as/connector/subsystems/jca/DistributedWorkManagerAdd.java index 6af153e9976b..7f5a1993869f 100644 --- a/connector/src/main/java/org/jboss/as/connector/subsystems/jca/DistributedWorkManagerAdd.java +++ b/connector/src/main/java/org/jboss/as/connector/subsystems/jca/DistributedWorkManagerAdd.java @@ -21,18 +21,31 @@ */ package org.jboss.as.connector.subsystems.jca; +import static org.jboss.as.connector.logging.ConnectorLogger.ROOT_LOGGER; +import static org.jboss.as.connector.subsystems.jca.Constants.WORKMANAGER_LONG_RUNNING; +import static org.jboss.as.connector.subsystems.jca.Constants.WORKMANAGER_SHORT_RUNNING; + +import java.util.Map; +import java.util.concurrent.Executor; + +import org.jboss.as.connector.services.workmanager.statistics.DistributedWorkManagerStatisticsService; +import org.jboss.as.connector.services.workmanager.statistics.WorkManagerStatisticsService; import org.jboss.as.connector.services.workmanager.DistributedWorkManagerService; import org.jboss.as.connector.services.workmanager.NamedDistributedWorkManager; +import org.jboss.as.connector.subsystems.resourceadapters.IronJacamarResource; import org.jboss.as.connector.util.ConnectorServices; import org.jboss.as.connector.util.Injection; import org.jboss.as.controller.AbstractAddStepHandler; import org.jboss.as.controller.OperationContext; import org.jboss.as.controller.OperationFailedException; +import org.jboss.as.controller.PathElement; import org.jboss.as.controller.PropertiesAttributeDefinition; +import org.jboss.as.controller.registry.Resource; import org.jboss.as.threads.ThreadsServices; import org.jboss.as.txn.service.TxnServices; import org.jboss.dmr.ModelNode; import org.jboss.jca.core.api.workmanager.DistributedWorkManager; +import org.jboss.jca.core.api.workmanager.WorkManager; import org.jboss.jca.core.workmanager.policy.Always; import org.jboss.jca.core.workmanager.policy.Never; import org.jboss.jca.core.workmanager.policy.WaterMark; @@ -46,13 +59,6 @@ import org.wildfly.clustering.jgroups.ChannelFactory; import org.wildfly.clustering.jgroups.spi.service.ProtocolStackServiceName; -import java.util.Map; -import java.util.concurrent.Executor; - -import static org.jboss.as.connector.logging.ConnectorLogger.ROOT_LOGGER; -import static org.jboss.as.connector.subsystems.jca.Constants.WORKMANAGER_LONG_RUNNING; -import static org.jboss.as.connector.subsystems.jca.Constants.WORKMANAGER_SHORT_RUNNING; - /** * @author Jesper Pedersen * @author Stefano Maestri @@ -61,16 +67,19 @@ public class DistributedWorkManagerAdd extends AbstractAddStepHandler { public static final DistributedWorkManagerAdd INSTANCE = new DistributedWorkManagerAdd(); + + @Override protected void populateModel(final ModelNode operation, final ModelNode model) throws OperationFailedException { for (JcaDistributedWorkManagerDefinition.DWmParameters parameter : JcaDistributedWorkManagerDefinition.DWmParameters.values()) { parameter.getAttribute().validateAndSet(operation, model); } + } @Override - protected void performRuntime(final OperationContext context, final ModelNode operation, final ModelNode model) throws OperationFailedException { - + protected void performRuntime(final OperationContext context, final ModelNode operation, final Resource resource) throws OperationFailedException { + ModelNode model = resource.getModel(); String name = JcaDistributedWorkManagerDefinition.DWmParameters.NAME.getAttribute().resolveModelAttribute(context, model).asString(); String policy = JcaDistributedWorkManagerDefinition.DWmParameters.POLICY.getAttribute().resolveModelAttribute(context, model).asString(); @@ -156,5 +165,28 @@ protected void performRuntime(final OperationContext context, final ModelNode op builder.addDependency(TxnServices.JBOSS_TXN_XA_TERMINATOR, JBossXATerminator.class, wmService.getXaTerminatorInjector()) .setInitialMode(ServiceController.Mode.ACTIVE) .install(); + WorkManagerStatisticsService wmStatsService = new WorkManagerStatisticsService(context.getResourceRegistrationForUpdate(), name, true); + serviceTarget + .addService(ConnectorServices.WORKMANAGER_STATS_SERVICE.append(name), wmStatsService) + .addDependency(ConnectorServices.WORKMANAGER_SERVICE.append(name), WorkManager.class, wmStatsService.getWorkManagerInjector()) + .setInitialMode(ServiceController.Mode.PASSIVE).install(); + DistributedWorkManagerStatisticsService dwmStatsService = new DistributedWorkManagerStatisticsService(context.getResourceRegistrationForUpdate(), name, true); + serviceTarget + .addService(ConnectorServices.DISTRIBUTED_WORKMANAGER_STATS_SERVICE.append(name), dwmStatsService) + .addDependency(ConnectorServices.WORKMANAGER_SERVICE.append(name), DistributedWorkManager.class, dwmStatsService.getDistributedWorkManagerInjector()) + .setInitialMode(ServiceController.Mode.PASSIVE).install(); + PathElement peDistributedWm = PathElement.pathElement(org.jboss.as.connector.subsystems.resourceadapters.Constants.STATISTICS_NAME, "distributed"); + PathElement peLocaldWm = PathElement.pathElement(org.jboss.as.connector.subsystems.resourceadapters.Constants.STATISTICS_NAME, "local"); + + final Resource wmResource = new IronJacamarResource.IronJacamarRuntimeResource(); + + if (!resource.hasChild(peLocaldWm)) + resource.registerChild(peLocaldWm, wmResource); + + + final Resource dwmResource = new IronJacamarResource.IronJacamarRuntimeResource(); + + if (!resource.hasChild(peDistributedWm)) + resource.registerChild(peDistributedWm, dwmResource); } } diff --git a/connector/src/main/java/org/jboss/as/connector/subsystems/jca/WorkManagerAdd.java b/connector/src/main/java/org/jboss/as/connector/subsystems/jca/WorkManagerAdd.java index c9e1166f9b61..7ba64e143466 100644 --- a/connector/src/main/java/org/jboss/as/connector/subsystems/jca/WorkManagerAdd.java +++ b/connector/src/main/java/org/jboss/as/connector/subsystems/jca/WorkManagerAdd.java @@ -21,12 +21,16 @@ */ package org.jboss.as.connector.subsystems.jca; +import org.jboss.as.connector.services.workmanager.statistics.WorkManagerStatisticsService; import org.jboss.as.connector.services.workmanager.NamedWorkManager; import org.jboss.as.connector.services.workmanager.WorkManagerService; +import org.jboss.as.connector.subsystems.resourceadapters.IronJacamarResource; import org.jboss.as.connector.util.ConnectorServices; import org.jboss.as.controller.AbstractAddStepHandler; import org.jboss.as.controller.OperationContext; import org.jboss.as.controller.OperationFailedException; +import org.jboss.as.controller.PathElement; +import org.jboss.as.controller.registry.Resource; import org.jboss.as.threads.ThreadsServices; import org.jboss.as.txn.service.TxnServices; import org.jboss.dmr.ModelNode; @@ -49,6 +53,7 @@ public class WorkManagerAdd extends AbstractAddStepHandler { public static final WorkManagerAdd INSTANCE = new WorkManagerAdd(); + @Override protected void populateModel(final ModelNode operation, final ModelNode model) throws OperationFailedException { for (JcaWorkManagerDefinition.WmParameters parameter : JcaWorkManagerDefinition.WmParameters.values()) { @@ -57,9 +62,9 @@ protected void populateModel(final ModelNode operation, final ModelNode model) t } @Override - protected void performRuntime(final OperationContext context, final ModelNode operation, final ModelNode model) throws OperationFailedException { + protected void performRuntime(final OperationContext context, final ModelNode operation, final Resource resource) throws OperationFailedException { - String name = JcaWorkManagerDefinition.WmParameters.NAME.getAttribute().resolveModelAttribute(context, model).asString(); + String name = JcaWorkManagerDefinition.WmParameters.NAME.getAttribute().resolveModelAttribute(context, resource.getModel()).asString(); ServiceTarget serviceTarget = context.getServiceTarget(); @@ -77,5 +82,19 @@ protected void performRuntime(final OperationContext context, final ModelNode op builder.addDependency(TxnServices.JBOSS_TXN_XA_TERMINATOR, JBossXATerminator.class, wmService.getXaTerminatorInjector()) .setInitialMode(ServiceController.Mode.ON_DEMAND) .install(); + + + WorkManagerStatisticsService wmStatsService = new WorkManagerStatisticsService(context.getResourceRegistrationForUpdate(), name, true); + serviceTarget + .addService(ConnectorServices.WORKMANAGER_STATS_SERVICE.append(name), wmStatsService) + .addDependency(ConnectorServices.WORKMANAGER_SERVICE.append(name), WorkManager.class, wmStatsService.getWorkManagerInjector()) + .setInitialMode(ServiceController.Mode.PASSIVE).install(); + PathElement peLocaldWm = PathElement.pathElement(org.jboss.as.connector.subsystems.resourceadapters.Constants.STATISTICS_NAME, "local"); + + final Resource wmResource = new IronJacamarResource.IronJacamarRuntimeResource(); + + if (!resource.hasChild(peLocaldWm)) + resource.registerChild(peLocaldWm, wmResource); + } } diff --git a/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/AdminObjectAdd.java b/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/AdminObjectAdd.java index cbffa74ff5f1..c0a126c07d2c 100644 --- a/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/AdminObjectAdd.java +++ b/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/AdminObjectAdd.java @@ -22,20 +22,30 @@ package org.jboss.as.connector.subsystems.resourceadapters; +import static org.jboss.as.connector.subsystems.jca.Constants.DEFAULT_NAME; import static org.jboss.as.connector.subsystems.resourceadapters.CommonAttributes.ADMIN_OBJECTS_NODE_ATTRIBUTE; +import static org.jboss.as.connector.subsystems.resourceadapters.Constants.ARCHIVE; +import static org.jboss.as.connector.subsystems.resourceadapters.Constants.MODULE; +import static org.jboss.as.connector.subsystems.resourceadapters.Constants.STATISTICS_ENABLED; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP_ADDR; import org.jboss.as.connector.logging.ConnectorLogger; +import org.jboss.as.connector.services.resourceadapters.statistics.AdminObjectStatisticsService; import org.jboss.as.connector.util.ConnectorServices; import org.jboss.as.controller.AbstractAddStepHandler; import org.jboss.as.controller.AttributeDefinition; import org.jboss.as.controller.OperationContext; import org.jboss.as.controller.OperationFailedException; import org.jboss.as.controller.PathAddress; +import org.jboss.as.controller.PathElement; +import org.jboss.as.controller.registry.Resource; import org.jboss.dmr.ModelNode; +import org.jboss.jca.common.api.metadata.resourceadapter.Activation; import org.jboss.jca.common.api.validator.ValidateException; +import org.jboss.msc.service.ServiceBuilder; import org.jboss.msc.service.ServiceController; import org.jboss.msc.service.ServiceName; +import org.jboss.msc.service.ServiceRegistry; import org.jboss.msc.service.ServiceTarget; /** @@ -43,7 +53,8 @@ */ public class AdminObjectAdd extends AbstractAddStepHandler { static final AdminObjectAdd INSTANCE = new AdminObjectAdd(); - private AdminObjectAdd(){ + + private AdminObjectAdd() { } @@ -55,11 +66,23 @@ protected void populateModel(ModelNode operation, ModelNode modelNode) throws Op } @Override - protected void performRuntime(OperationContext context, ModelNode operation, ModelNode recoveryEnvModel) throws OperationFailedException { + protected void performRuntime(OperationContext context, ModelNode operation, final Resource resource) throws OperationFailedException { final ModelNode address = operation.require(OP_ADDR); PathAddress path = PathAddress.pathAddress(address); - final String archiveName = path.getElement(path.size() - 2).getValue(); + final String raName = context.getCurrentAddress().getParent().getLastElement().getValue(); + final String archiveOrModuleName; + ModelNode raModel = context.readResourceFromRoot(path.subAddress(0, path.size() - 1)).getModel(); + final boolean statsEnabled = STATISTICS_ENABLED.resolveModelAttribute(context, raModel).asBoolean(); + + if (!raModel.hasDefined(ARCHIVE.getName()) && !raModel.hasDefined(MODULE.getName())) { + throw ConnectorLogger.ROOT_LOGGER.archiveOrModuleRequired(); + } + if (raModel.get(ARCHIVE.getName()).isDefined()) { + archiveOrModuleName = ARCHIVE.resolveModelAttribute(context, raModel).asString(); + } else { + archiveOrModuleName = MODULE.resolveModelAttribute(context, raModel).asString(); + } final String poolName = PathAddress.pathAddress(address).getLastElement().getValue(); @@ -71,8 +94,8 @@ protected void performRuntime(OperationContext context, ModelNode operation, Mod } - ServiceName serviceName = ServiceName.of(ConnectorServices.RA_SERVICE, archiveName, poolName); - ServiceName raServiceName = ServiceName.of(ConnectorServices.RA_SERVICE, archiveName); + ServiceName serviceName = ServiceName.of(ConnectorServices.RA_SERVICE, raName, poolName); + ServiceName raServiceName = ServiceName.of(ConnectorServices.RA_SERVICE, raName); final ServiceTarget serviceTarget = context.getServiceTarget(); @@ -80,5 +103,30 @@ protected void performRuntime(OperationContext context, ModelNode operation, Mod serviceTarget.addService(serviceName, service).setInitialMode(ServiceController.Mode.ACTIVE) .addDependency(raServiceName, ModifiableResourceAdapter.class, service.getRaInjector()) .install(); + + ServiceRegistry registry = context.getServiceRegistry(true); + + final ServiceController RaxmlController = registry.getService(ServiceName.of(ConnectorServices.RA_SERVICE, raName)); + Activation raxml = (Activation) RaxmlController.getValue(); + ServiceName deploymentServiceName = ConnectorServices.getDeploymentServiceName(archiveOrModuleName, raName); + String bootStrapCtxName = DEFAULT_NAME; + if (raxml.getBootstrapContext() != null && !raxml.getBootstrapContext().equals("undefined")) { + bootStrapCtxName = raxml.getBootstrapContext(); + } + + + AdminObjectStatisticsService adminObjectStatisticsService = new AdminObjectStatisticsService(context.getResourceRegistrationForUpdate(), poolName, statsEnabled); + + ServiceBuilder statsServiceBuilder = serviceTarget.addService(serviceName.append(ConnectorServices.STATISTICS_SUFFIX), adminObjectStatisticsService); + statsServiceBuilder.addDependency(ConnectorServices.BOOTSTRAP_CONTEXT_SERVICE.append(bootStrapCtxName), adminObjectStatisticsService.getBootstrapContextInjector()) + .addDependency(deploymentServiceName, adminObjectStatisticsService.getResourceAdapterDeploymentInjector()) + .setInitialMode(ServiceController.Mode.PASSIVE) + .install(); + + PathElement peAO = PathElement.pathElement(Constants.STATISTICS_NAME, "extended"); + + final Resource aoResource = new IronJacamarResource.IronJacamarRuntimeResource(); + + resource.registerChild(peAO, aoResource); } } diff --git a/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/ConnectionDefinitionAdd.java b/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/ConnectionDefinitionAdd.java index ff186dae4119..bd22f23dc9ca 100644 --- a/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/ConnectionDefinitionAdd.java +++ b/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/ConnectionDefinitionAdd.java @@ -22,26 +22,36 @@ package org.jboss.as.connector.subsystems.resourceadapters; +import static org.jboss.as.connector.subsystems.jca.Constants.DEFAULT_NAME; import static org.jboss.as.connector.subsystems.resourceadapters.CommonAttributes.CONNECTION_DEFINITIONS_NODE_ATTRIBUTE; +import static org.jboss.as.connector.subsystems.resourceadapters.Constants.ARCHIVE; +import static org.jboss.as.connector.subsystems.resourceadapters.Constants.JNDINAME; +import static org.jboss.as.connector.subsystems.resourceadapters.Constants.MODULE; +import static org.jboss.as.connector.subsystems.resourceadapters.Constants.STATISTICS_ENABLED; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP_ADDR; import org.jboss.as.connector.logging.ConnectorLogger; +import org.jboss.as.connector.services.resourceadapters.statistics.ConnectionDefinitionStatisticsService; import org.jboss.as.connector.util.ConnectorServices; import org.jboss.as.controller.AbstractAddStepHandler; import org.jboss.as.controller.AttributeDefinition; import org.jboss.as.controller.OperationContext; import org.jboss.as.controller.OperationFailedException; import org.jboss.as.controller.PathAddress; +import org.jboss.as.controller.PathElement; +import org.jboss.as.controller.registry.Resource; import org.jboss.dmr.ModelNode; import org.jboss.jca.common.api.metadata.common.TransactionSupportEnum; +import org.jboss.jca.common.api.metadata.resourceadapter.Activation; import org.jboss.jca.common.api.validator.ValidateException; +import org.jboss.msc.service.ServiceBuilder; import org.jboss.msc.service.ServiceController; import org.jboss.msc.service.ServiceName; +import org.jboss.msc.service.ServiceRegistry; import org.jboss.msc.service.ServiceTarget; /** * Adds a recovery-environment to the Transactions subsystem - * */ public class ConnectionDefinitionAdd extends AbstractAddStepHandler { @@ -50,27 +60,40 @@ public class ConnectionDefinitionAdd extends AbstractAddStepHandler { @Override protected void populateModel(ModelNode operation, ModelNode modelNode) throws OperationFailedException { for (AttributeDefinition attribute : CONNECTION_DEFINITIONS_NODE_ATTRIBUTE) { - attribute.validateAndSet(operation, modelNode); + attribute.validateAndSet(operation, modelNode); } } @Override - protected void performRuntime(OperationContext context, ModelNode operation, ModelNode recoveryEnvModel) throws OperationFailedException { + protected void performRuntime(OperationContext context, ModelNode operation, final Resource resource) throws OperationFailedException { final ModelNode address = operation.require(OP_ADDR); - PathAddress path = PathAddress.pathAddress(address); - final String archiveName = path.getElement(path.size() -2).getValue(); + PathAddress path = context.getCurrentAddress(); + final String jndiName = JNDINAME.resolveModelAttribute(context, operation).asString(); + final String raName = path.getParent().getLastElement().getValue(); + + final String archiveOrModuleName; + ModelNode raModel = context.readResourceFromRoot(path.getParent()).getModel(); + final boolean statsEnabled = STATISTICS_ENABLED.resolveModelAttribute(context, raModel).asBoolean(); + + if (!raModel.hasDefined(ARCHIVE.getName()) && !raModel.hasDefined(MODULE.getName())) { + throw ConnectorLogger.ROOT_LOGGER.archiveOrModuleRequired(); + } + if (raModel.get(ARCHIVE.getName()).isDefined()) { + archiveOrModuleName = ARCHIVE.resolveModelAttribute(context, raModel).asString(); + } else { + archiveOrModuleName = MODULE.resolveModelAttribute(context, raModel).asString(); + } final String poolName = PathAddress.pathAddress(address).getLastElement().getValue(); try { - ServiceName serviceName = ServiceName.of(ConnectorServices.RA_SERVICE, archiveName, poolName); - ServiceName raServiceName = ServiceName.of(ConnectorServices.RA_SERVICE, archiveName); + ServiceName serviceName = ServiceName.of(ConnectorServices.RA_SERVICE, raName, poolName); + ServiceName raServiceName = ServiceName.of(ConnectorServices.RA_SERVICE, raName); final ModifiableResourceAdapter ravalue = ((ModifiableResourceAdapter) context.getServiceRegistry(false).getService(raServiceName).getValue()); boolean isXa = ravalue.getTransactionSupport() == TransactionSupportEnum.XATransaction; - final ModifiableConnDef connectionDefinitionValue = RaOperationUtil.buildConnectionDefinitionObject(context, recoveryEnvModel, poolName, isXa); - + final ModifiableConnDef connectionDefinitionValue = RaOperationUtil.buildConnectionDefinitionObject(context, resource.getModel(), poolName, isXa); final ServiceTarget serviceTarget = context.getServiceTarget(); @@ -80,11 +103,43 @@ protected void performRuntime(OperationContext context, ModelNode operation, Mod .addDependency(raServiceName, ModifiableResourceAdapter.class, service.getRaInjector()) .install(); + + ServiceRegistry registry = context.getServiceRegistry(true); + + final ServiceController RaxmlController = registry.getService(ServiceName.of(ConnectorServices.RA_SERVICE, raName)); + Activation raxml = (Activation) RaxmlController.getValue(); + ServiceName deploymentServiceName = ConnectorServices.getDeploymentServiceName(archiveOrModuleName, raName); + String bootStrapCtxName = DEFAULT_NAME; + if (raxml.getBootstrapContext() != null && !raxml.getBootstrapContext().equals("undefined")) { + bootStrapCtxName = raxml.getBootstrapContext(); + } + + + ConnectionDefinitionStatisticsService connectionDefinitionStatisticsService = new ConnectionDefinitionStatisticsService(context.getResourceRegistrationForUpdate(), jndiName, poolName, statsEnabled); + + ServiceBuilder statsServiceBuilder = serviceTarget.addService(serviceName.append(ConnectorServices.STATISTICS_SUFFIX), connectionDefinitionStatisticsService); + statsServiceBuilder.addDependency(ConnectorServices.BOOTSTRAP_CONTEXT_SERVICE.append(bootStrapCtxName), connectionDefinitionStatisticsService.getBootstrapContextInjector()) + .addDependency(deploymentServiceName, connectionDefinitionStatisticsService.getResourceAdapterDeploymentInjector()) + .setInitialMode(ServiceController.Mode.PASSIVE) + .install(); + + PathElement peCD = PathElement.pathElement(Constants.STATISTICS_NAME, "pool"); + + final Resource cdResource = new IronJacamarResource.IronJacamarRuntimeResource(); + + resource.registerChild(peCD, cdResource); + + PathElement peExtended = PathElement.pathElement(Constants.STATISTICS_NAME, "extended"); + + final Resource extendedResource = new IronJacamarResource.IronJacamarRuntimeResource(); + + resource.registerChild(peExtended, extendedResource); + + } catch (ValidateException e) { throw new OperationFailedException(e, new ModelNode().set(ConnectorLogger.ROOT_LOGGER.failedToCreate("ConnectionDefinition", operation, e.getLocalizedMessage()))); } } - } diff --git a/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/Constants.java b/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/Constants.java index 0f33f382b537..06675f7ffe8f 100644 --- a/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/Constants.java +++ b/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/Constants.java @@ -146,7 +146,7 @@ public class Constants { private static final String BEANVALIDATIONGROUPS_NAME = "beanvalidationgroups"; - static final String ADMIN_OBJECTS_NAME = "admin-objects"; + public static final String ADMIN_OBJECTS_NAME = "admin-objects"; private static final String INTERLEAVING_NAME = "interleaving"; diff --git a/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/IronJacamarResourceCreator.java b/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/IronJacamarResourceCreator.java index fab5400e2961..de28fefb87d9 100644 --- a/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/IronJacamarResourceCreator.java +++ b/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/IronJacamarResourceCreator.java @@ -86,6 +86,7 @@ import org.jboss.jca.common.api.metadata.resourceadapter.AdminObject; import org.jboss.jca.common.api.metadata.resourceadapter.ConnectionDefinition; import org.jboss.jca.common.api.metadata.resourceadapter.WorkManagerSecurity; +import org.jboss.jca.core.spi.statistics.StatisticsPlugin; /** * Handler for exposing transaction logs @@ -133,6 +134,8 @@ private void addConfigProperties(final Resource parent, String name, String valu } + + private void addConnectionDefinition(final Resource parent, ConnectionDefinition connDef) { final Resource connDefResource = new IronJacamarResource.IronJacamarRuntimeResource(); final ModelNode model = connDefResource.getModel(); @@ -147,14 +150,14 @@ private void addConnectionDefinition(final Resource parent, ConnectionDefinition setAttribute(model, USE_JAVA_CONTEXT, connDef.isUseJavaContext()); setAttribute(model, ENABLED, connDef.isEnabled()); - setAttribute(model, CONNECTABLE, connDef.isConnectable()); - if (connDef.isTracking() != null) { - setAttribute(model, TRACKING, connDef.isTracking()); - } + setAttribute(model, CONNECTABLE, connDef.isConnectable()); + if (connDef.isTracking() != null) { + setAttribute(model, TRACKING, connDef.isTracking()); + } setAttribute(model, USE_CCM, connDef.isUseCcm()); - setAttribute(model, SHARABLE, connDef.isSharable()); - setAttribute(model, ENLISTMENT, connDef.isEnlistment()); + setAttribute(model, SHARABLE, connDef.isSharable()); + setAttribute(model, ENLISTMENT, connDef.isEnlistment()); final Pool pool = connDef.getPool(); if (pool != null) { @@ -163,27 +166,26 @@ private void addConnectionDefinition(final Resource parent, ConnectionDefinition setAttribute(model, MIN_POOL_SIZE, pool.getMinPoolSize()); - setAttribute(model, INITIAL_POOL_SIZE, pool.getInitialPoolSize()); - if (pool.getCapacity() != null) { - if (pool.getCapacity().getIncrementer() != null) { - setAttribute(model, CAPACITY_INCREMENTER_CLASS, pool.getCapacity().getIncrementer().getClassName()); - if ( pool.getCapacity().getIncrementer().getConfigPropertiesMap() != null) { - for (Map.Entry config : pool.getCapacity().getIncrementer().getConfigPropertiesMap().entrySet()) { - model.get(CAPACITY_INCREMENTER_PROPERTIES.getName(), config.getKey()).set(config.getValue()); - } + setAttribute(model, INITIAL_POOL_SIZE, pool.getInitialPoolSize()); + if (pool.getCapacity() != null) { + if (pool.getCapacity().getIncrementer() != null) { + setAttribute(model, CAPACITY_INCREMENTER_CLASS, pool.getCapacity().getIncrementer().getClassName()); + if (pool.getCapacity().getIncrementer().getConfigPropertiesMap() != null) { + for (Map.Entry config : pool.getCapacity().getIncrementer().getConfigPropertiesMap().entrySet()) { + model.get(CAPACITY_INCREMENTER_PROPERTIES.getName(), config.getKey()).set(config.getValue()); } } - if (pool.getCapacity().getDecrementer() != null) { - setAttribute(model, CAPACITY_DECREMENTER_CLASS, pool.getCapacity().getDecrementer().getClassName()); - if (pool.getCapacity().getDecrementer().getConfigPropertiesMap() != null) { - for (Map.Entry config : pool.getCapacity().getDecrementer().getConfigPropertiesMap().entrySet()) { - model.get(CAPACITY_DECREMENTER_PROPERTIES.getName(), config.getKey()).set(config.getValue()); - } + } + if (pool.getCapacity().getDecrementer() != null) { + setAttribute(model, CAPACITY_DECREMENTER_CLASS, pool.getCapacity().getDecrementer().getClassName()); + if (pool.getCapacity().getDecrementer().getConfigPropertiesMap() != null) { + for (Map.Entry config : pool.getCapacity().getDecrementer().getConfigPropertiesMap().entrySet()) { + model.get(CAPACITY_DECREMENTER_PROPERTIES.getName(), config.getKey()).set(config.getValue()); } - } - } + } + } setAttribute(model, POOL_USE_STRICT_MIN, pool.isUseStrictMin()); @@ -252,6 +254,8 @@ private void addConnectionDefinition(final Resource parent, ConnectionDefinition } } + final Resource statsResource = new IronJacamarResource.IronJacamarRuntimeResource(); + connDefResource.registerChild( PathElement.pathElement(Constants.STATISTICS_NAME, "local"), statsResource); final PathElement element = PathElement.pathElement(Constants.CONNECTIONDEFINITIONS_NAME, connDef.getJndiName()); parent.registerChild(element, connDefResource); @@ -282,39 +286,39 @@ private void addResourceAdapter(final Resource parent, String name, Activation i setAttribute(model, Constants.BOOTSTRAP_CONTEXT, ironJacamarMetadata.getBootstrapContext()); if (ironJacamarMetadata.getTransactionSupport() != null) model.get(Constants.TRANSACTION_SUPPORT.getName()).set(ironJacamarMetadata.getTransactionSupport().name()); - if (ironJacamarMetadata.getWorkManager() != null && ironJacamarMetadata.getWorkManager().getSecurity() != null) { - WorkManagerSecurity security = ironJacamarMetadata.getWorkManager().getSecurity(); - model.get(Constants.WM_SECURITY.getName()).set(true); - if (security.getDefaultGroups() != null) { - for (String group : security.getDefaultGroups()) { - model.get(Constants.WM_SECURITY_DEFAULT_GROUPS.getName()).add(group); - } + if (ironJacamarMetadata.getWorkManager() != null && ironJacamarMetadata.getWorkManager().getSecurity() != null) { + WorkManagerSecurity security = ironJacamarMetadata.getWorkManager().getSecurity(); + model.get(Constants.WM_SECURITY.getName()).set(true); + if (security.getDefaultGroups() != null) { + for (String group : security.getDefaultGroups()) { + model.get(Constants.WM_SECURITY_DEFAULT_GROUPS.getName()).add(group); } - if (security.getDefaultPrincipal() != null) - model.get(Constants.WM_SECURITY_DEFAULT_PRINCIPAL.getName()).set(security.getDefaultPrincipal()); - model.get(Constants.WM_SECURITY_MAPPING_REQUIRED.getName()).set(security.isMappingRequired()); - model.get(Constants.WM_SECURITY_DOMAIN.getName()).set(security.getDomain()); - if (security.getGroupMappings() != null) { - for (Map.Entry entry : security.getGroupMappings().entrySet()) { - final Resource mapping = new IronJacamarResource.IronJacamarRuntimeResource(); - final ModelNode subModel = mapping.getModel(); - subModel.get(Constants.WM_SECURITY_MAPPING_FROM.getName()).set(entry.getKey()); - subModel.get(Constants.WM_SECURITY_MAPPING_TO.getName()).set(entry.getKey()); - final PathElement element = PathElement.pathElement(Constants.WM_SECURITY_MAPPING_GROUPS.getName(), WM_SECURITY_MAPPING_GROUP.getName()); - ijResourceAdapter.registerChild(element, mapping); - } + } + if (security.getDefaultPrincipal() != null) + model.get(Constants.WM_SECURITY_DEFAULT_PRINCIPAL.getName()).set(security.getDefaultPrincipal()); + model.get(Constants.WM_SECURITY_MAPPING_REQUIRED.getName()).set(security.isMappingRequired()); + model.get(Constants.WM_SECURITY_DOMAIN.getName()).set(security.getDomain()); + if (security.getGroupMappings() != null) { + for (Map.Entry entry : security.getGroupMappings().entrySet()) { + final Resource mapping = new IronJacamarResource.IronJacamarRuntimeResource(); + final ModelNode subModel = mapping.getModel(); + subModel.get(Constants.WM_SECURITY_MAPPING_FROM.getName()).set(entry.getKey()); + subModel.get(Constants.WM_SECURITY_MAPPING_TO.getName()).set(entry.getKey()); + final PathElement element = PathElement.pathElement(Constants.WM_SECURITY_MAPPING_GROUPS.getName(), WM_SECURITY_MAPPING_GROUP.getName()); + ijResourceAdapter.registerChild(element, mapping); } - if (security.getUserMappings() != null) { - for (Map.Entry entry : security.getUserMappings().entrySet()) { - final Resource mapping = new IronJacamarResource.IronJacamarRuntimeResource(); - final ModelNode subModel = mapping.getModel(); - subModel.get(Constants.WM_SECURITY_MAPPING_FROM.getName()).set(entry.getKey()); - subModel.get(Constants.WM_SECURITY_MAPPING_TO.getName()).set(entry.getKey()); - final PathElement element = PathElement.pathElement(Constants.WM_SECURITY_MAPPING_USERS.getName(), WM_SECURITY_MAPPING_USER.getName()); - ijResourceAdapter.registerChild(element, mapping); - } + } + if (security.getUserMappings() != null) { + for (Map.Entry entry : security.getUserMappings().entrySet()) { + final Resource mapping = new IronJacamarResource.IronJacamarRuntimeResource(); + final ModelNode subModel = mapping.getModel(); + subModel.get(Constants.WM_SECURITY_MAPPING_FROM.getName()).set(entry.getKey()); + subModel.get(Constants.WM_SECURITY_MAPPING_TO.getName()).set(entry.getKey()); + final PathElement element = PathElement.pathElement(Constants.WM_SECURITY_MAPPING_USERS.getName(), WM_SECURITY_MAPPING_USER.getName()); + ijResourceAdapter.registerChild(element, mapping); } } + } if (ironJacamarMetadata.getBeanValidationGroups() != null) { for (String bv : ironJacamarMetadata.getBeanValidationGroups()) { model.get(Constants.BEANVALIDATION_GROUPS.getName()).add(new ModelNode().set(bv)); @@ -335,6 +339,9 @@ private void addResourceAdapter(final Resource parent, String name, Activation i addAdminObject(ijResourceAdapter, adminObject); } } + final Resource statsResource = new IronJacamarResource.IronJacamarRuntimeResource(); + ijResourceAdapter.registerChild( PathElement.pathElement(Constants.STATISTICS_NAME, "local"), statsResource); + final PathElement element = PathElement.pathElement(Constants.RESOURCEADAPTER_NAME, name); parent.registerChild(element, ijResourceAdapter); @@ -369,4 +376,14 @@ public void execute(Resource parentResource, AS7MetadataRepository mdr) { } } + private void setStatsModelValue(ModelNode result, String attributeName, StatisticsPlugin stats) { + if (stats.getType(attributeName) == int.class) { + result.set((Integer) stats.getValue(attributeName)); + } else if (stats.getType(attributeName) == long.class) { + result.set((Long) stats.getValue(attributeName)); + } else { + result.set("" + stats.getValue(attributeName)); + } + } + } diff --git a/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/RaActivate.java b/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/RaActivate.java index 62bafb76d898..25616737b0a0 100644 --- a/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/RaActivate.java +++ b/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/RaActivate.java @@ -22,6 +22,10 @@ package org.jboss.as.connector.subsystems.resourceadapters; +import static org.jboss.as.connector.subsystems.resourceadapters.Constants.ARCHIVE; +import static org.jboss.as.connector.subsystems.resourceadapters.Constants.MODULE; +import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP_ADDR; + import org.jboss.as.connector.logging.ConnectorLogger; import org.jboss.as.controller.OperationContext; import org.jboss.as.controller.OperationFailedException; @@ -30,11 +34,6 @@ import org.jboss.dmr.ModelNode; import org.jboss.msc.service.ServiceName; -import static org.jboss.as.connector.subsystems.resourceadapters.Constants.ARCHIVE; -import static org.jboss.as.connector.subsystems.resourceadapters.Constants.MODULE; -import static org.jboss.as.connector.subsystems.resourceadapters.Constants.STATISTICS_ENABLED; -import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP_ADDR; - /** * Operation handler responsible for disabling an existing data-source. * @@ -57,7 +56,6 @@ public void execute(OperationContext context, ModelNode operation) throws Opera } else { archiveOrModuleName = model.get(MODULE.getName()).asString(); } - final boolean statsEnabled = STATISTICS_ENABLED.resolveModelAttribute(context, model).asBoolean(); if (context.isNormalServer()) { context.addStep(new OperationStepHandler() { @@ -66,7 +64,7 @@ public void execute(final OperationContext context, ModelNode operation) throws ServiceName restartedServiceName = RaOperationUtil.restartIfPresent(context, archiveOrModuleName, idName); if (restartedServiceName == null) { - RaOperationUtil.activate(context, idName, archiveOrModuleName, statsEnabled); + RaOperationUtil.activate(context, idName, archiveOrModuleName); } context.completeStep(new OperationContext.RollbackHandler() { @Override diff --git a/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/RaAdd.java b/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/RaAdd.java index 8a8208feaf87..efe1a7ccc1aa 100644 --- a/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/RaAdd.java +++ b/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/RaAdd.java @@ -22,24 +22,30 @@ package org.jboss.as.connector.subsystems.resourceadapters; +import static org.jboss.as.connector.subsystems.jca.Constants.DEFAULT_NAME; +import static org.jboss.as.connector.subsystems.resourceadapters.Constants.ARCHIVE; +import static org.jboss.as.connector.subsystems.resourceadapters.Constants.MODULE; +import static org.jboss.as.connector.subsystems.resourceadapters.Constants.STATISTICS_ENABLED; + +import java.util.ArrayList; +import java.util.List; + import org.jboss.as.connector.logging.ConnectorLogger; +import org.jboss.as.connector.services.resourceadapters.statistics.ResourceAdapterStatisticsService; +import org.jboss.as.connector.util.ConnectorServices; import org.jboss.as.controller.AbstractAddStepHandler; import org.jboss.as.controller.AttributeDefinition; import org.jboss.as.controller.OperationContext; import org.jboss.as.controller.OperationFailedException; import org.jboss.as.controller.OperationStepHandler; -import org.jboss.as.controller.PathAddress; +import org.jboss.as.controller.PathElement; +import org.jboss.as.controller.registry.Resource; import org.jboss.dmr.ModelNode; +import org.jboss.jca.common.api.metadata.resourceadapter.Activation; +import org.jboss.msc.service.ServiceBuilder; import org.jboss.msc.service.ServiceController; import org.jboss.msc.service.ServiceName; - -import java.util.ArrayList; -import java.util.List; - -import static org.jboss.as.connector.subsystems.resourceadapters.Constants.ARCHIVE; -import static org.jboss.as.connector.subsystems.resourceadapters.Constants.MODULE; -import static org.jboss.as.connector.subsystems.resourceadapters.Constants.STATISTICS_ENABLED; -import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP_ADDR; +import org.jboss.msc.service.ServiceRegistry; /** * Operation handler responsible for adding a Ra. @@ -57,12 +63,14 @@ protected void populateModel(ModelNode operation, ModelNode model) throws Operat } @Override - public void performRuntime(final OperationContext context, ModelNode operation, final ModelNode model) throws OperationFailedException { + public void performRuntime(final OperationContext context, ModelNode operation, final Resource resource) throws OperationFailedException { // Compensating is remove - final ModelNode address = operation.require(OP_ADDR); - final String name = PathAddress.pathAddress(address).getLastElement().getValue(); + final String name = context.getCurrentAddressValue(); final String archiveOrModuleName; - if (!model.hasDefined(ARCHIVE.getName()) && ! model.hasDefined(MODULE.getName())) { + ModelNode model = resource.getModel(); + final boolean statsEnabled = STATISTICS_ENABLED.resolveModelAttribute(context, model).asBoolean(); + + if (!model.hasDefined(ARCHIVE.getName()) && !model.hasDefined(MODULE.getName())) { throw ConnectorLogger.ROOT_LOGGER.archiveOrModuleRequired(); } if (model.get(ARCHIVE.getName()).isDefined()) { @@ -88,7 +96,7 @@ public void execute(final OperationContext context, ModelNode operation) throws //newly added configuration ServiceName restartedServiceName = RaOperationUtil.restartIfPresent(context, archiveOrModuleName, name); if (restartedServiceName == null) { - RaOperationUtil.activate(context, name, archiveOrModuleName, STATISTICS_ENABLED.resolveModelAttribute(context, model).asBoolean()); + RaOperationUtil.activate(context, name, archiveOrModuleName); } context.completeStep(new OperationContext.RollbackHandler() { @Override @@ -105,7 +113,29 @@ public void handleRollback(OperationContext context, ModelNode operation) { }, OperationContext.Stage.RUNTIME); } } + ServiceRegistry registry = context.getServiceRegistry(true); + + final ServiceController RaxmlController = registry.getService(ServiceName.of(ConnectorServices.RA_SERVICE, name)); + Activation raxml = (Activation) RaxmlController.getValue(); + ServiceName serviceName = ConnectorServices.getDeploymentServiceName(archiveOrModuleName, name); + String bootStrapCtxName = DEFAULT_NAME; + if (raxml.getBootstrapContext() != null && !raxml.getBootstrapContext().equals("undefined")) { + bootStrapCtxName = raxml.getBootstrapContext(); + } + + ResourceAdapterStatisticsService raStatsService = new ResourceAdapterStatisticsService(context.getResourceRegistrationForUpdate(), name, statsEnabled); + + ServiceBuilder statsServiceBuilder = context.getServiceTarget().addService(ServiceName.of(ConnectorServices.RA_SERVICE, name).append(ConnectorServices.STATISTICS_SUFFIX), raStatsService); + statsServiceBuilder.addDependency(ConnectorServices.BOOTSTRAP_CONTEXT_SERVICE.append(bootStrapCtxName), raStatsService.getBootstrapContextInjector()) + .addDependency(serviceName, raStatsService.getResourceAdapterDeploymentInjector()) + .setInitialMode(ServiceController.Mode.PASSIVE) + .install(); + + PathElement peStats = PathElement.pathElement(Constants.STATISTICS_NAME, "extended"); + + final Resource statsResource = new IronJacamarResource.IronJacamarRuntimeResource(); + resource.registerChild(peStats, statsResource); } } diff --git a/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/RaOperationUtil.java b/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/RaOperationUtil.java index 7e3c612465c7..692b04b442fc 100644 --- a/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/RaOperationUtil.java +++ b/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/RaOperationUtil.java @@ -334,7 +334,7 @@ public static boolean removeIfActive(OperationContext context, String raName, St } - public static void activate(OperationContext context, String raName, String archiveName, boolean statsEnabled) throws OperationFailedException { + public static void activate(OperationContext context, String raName, String archiveName) throws OperationFailedException { ServiceRegistry registry = context.getServiceRegistry(true); ServiceController inactiveRaController = registry.getService(ConnectorServices.INACTIVE_RESOURCE_ADAPTER_SERVICE.append(archiveName)); @@ -351,7 +351,7 @@ public static void activate(OperationContext context, String raName, String arch final ServiceController RaxmlController = registry.getService(ServiceName.of(ConnectorServices.RA_SERVICE, raName)); Activation raxml = (Activation) RaxmlController.getValue(); RaServicesFactory.createDeploymentService(inactive.getRegistration(), inactive.getConnectorXmlDescriptor(), inactive.getModule(), inactive.getServiceTarget(), - archiveName, inactive.getDeploymentUnitServiceName(), inactive.getDeployment(), raxml, inactive.getResource(), statsEnabled); + archiveName, inactive.getDeploymentUnitServiceName(), inactive.getDeployment(), raxml, inactive.getResource()); } public static ServiceName installRaServices(OperationContext context, String name, ModifiableResourceAdapter resourceAdapter, final List> newControllers) { @@ -459,7 +459,7 @@ public static void installRaServicesAndDeployFromModule(OperationContext context final ServiceName deployerServiceName = ConnectorServices.RESOURCE_ADAPTER_DEPLOYER_SERVICE_PREFIX.append(connectorXmlDescriptor.getDeploymentName()); final ServiceController deployerService = context.getServiceRegistry(true).getService(deployerServiceName); if (deployerService == null) { - ServiceBuilder builder = ParsedRaDeploymentProcessor.process(connectorXmlDescriptor, ironJacamarXmlDescriptor, module.getClassLoader(), serviceTarget, annotationIndexes, RAR_MODULE.append(name)); + ServiceBuilder builder = ParsedRaDeploymentProcessor.process(connectorXmlDescriptor, ironJacamarXmlDescriptor, module.getClassLoader(), serviceTarget, annotationIndexes, RAR_MODULE.append(name), null, null); newControllers.add(builder.addDependency(raServiceName).setInitialMode(ServiceController.Mode.ACTIVE).install()); } String rarName = resourceAdapter.getArchive(); diff --git a/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/RaRemove.java b/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/RaRemove.java index 836655c50851..e2362af2caa4 100644 --- a/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/RaRemove.java +++ b/connector/src/main/java/org/jboss/as/connector/subsystems/resourceadapters/RaRemove.java @@ -25,7 +25,6 @@ import static org.jboss.as.connector.subsystems.resourceadapters.Constants.ARCHIVE; import static org.jboss.as.connector.subsystems.resourceadapters.Constants.MODULE; import static org.jboss.as.connector.subsystems.resourceadapters.Constants.RESOURCEADAPTERS_NAME; -import static org.jboss.as.connector.subsystems.resourceadapters.Constants.STATISTICS_ENABLED; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADD; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP_ADDR; @@ -137,7 +136,7 @@ public void handleRollback(OperationContext context, ModelNode operation) { } try { if (wasActive){ - RaOperationUtil.activate(context, idName, archiveOrModuleName, STATISTICS_ENABLED.resolveModelAttribute(context, model).asBoolean()); + RaOperationUtil.activate(context, idName, archiveOrModuleName); } } catch (OperationFailedException e) { diff --git a/connector/src/main/java/org/jboss/as/connector/util/ConnectorServices.java b/connector/src/main/java/org/jboss/as/connector/util/ConnectorServices.java index f7bd6df36d78..3d2f83d95948 100644 --- a/connector/src/main/java/org/jboss/as/connector/util/ConnectorServices.java +++ b/connector/src/main/java/org/jboss/as/connector/util/ConnectorServices.java @@ -64,8 +64,15 @@ public class ConnectorServices { public static final ServiceName WORKMANAGER_SERVICE = ServiceName.JBOSS.append("connector", "workmanager"); + public static final ServiceName WORKMANAGER_STATS_SERVICE = WORKMANAGER_SERVICE.append("statistics"); + + public static final ServiceName DISTRIBUTED_WORKMANAGER_STATS_SERVICE = WORKMANAGER_SERVICE.append("distributed-statistics"); + public static final ServiceName RESOURCE_ADAPTER_SERVICE_PREFIX = ServiceName.JBOSS.append("ra"); + public static final String STATISTICS_SUFFIX = "STATISTICS"; + + public static final ServiceName RESOURCE_ADAPTER_DEPLOYMENT_SERVICE_PREFIX = RESOURCE_ADAPTER_SERVICE_PREFIX .append("deployment"); @@ -83,6 +90,8 @@ public class ConnectorServices { */ public static final ServiceName IRONJACAMAR_MDR = ServiceName.JBOSS.append("ironjacamar", "mdr"); + public static final ServiceName IRONJACAMAR_RESOURCE = ServiceName.JBOSS.append("ironjacamar", "resource"); + public static final ServiceName RA_REPOSITORY_SERVICE = ServiceName.JBOSS.append("rarepository"); public static final ServiceName MANAGEMENT_REPOSITORY_SERVICE = ServiceName.JBOSS.append("management_repository"); diff --git a/connector/src/main/java/org/jboss/as/connector/util/RaServicesFactory.java b/connector/src/main/java/org/jboss/as/connector/util/RaServicesFactory.java index 782df36d0b60..c39d0e658829 100644 --- a/connector/src/main/java/org/jboss/as/connector/util/RaServicesFactory.java +++ b/connector/src/main/java/org/jboss/as/connector/util/RaServicesFactory.java @@ -28,7 +28,6 @@ import java.util.Locale; import java.util.Map; -import org.jboss.as.connector.deployers.ra.processors.AbstractResourceAdapterDeploymentServiceListener; import org.jboss.as.connector.metadata.xmldescriptors.ConnectorXmlDescriptor; import org.jboss.as.connector.services.mdr.AS7MetadataRepository; import org.jboss.as.connector.services.resourceadapters.deployment.ResourceAdapterXmlDeploymentService; @@ -46,7 +45,6 @@ import org.jboss.jca.core.api.management.ManagementRepository; import org.jboss.jca.core.spi.rar.ResourceAdapterRepository; import org.jboss.jca.core.spi.transaction.TransactionIntegration; -import org.jboss.jca.deployers.common.CommonDeployment; import org.jboss.modules.Module; import org.jboss.msc.service.ServiceBuilder; import org.jboss.msc.service.ServiceController; @@ -58,7 +56,7 @@ public class RaServicesFactory { public static void createDeploymentService(final ManagementResourceRegistration registration, ConnectorXmlDescriptor connectorXmlDescriptor, Module module, ServiceTarget serviceTarget, final String deploymentUnitName, ServiceName deploymentUnitServiceName, String deployment, - Activation raxml, final Resource deploymentResource, final boolean statsEnabled) { + Activation raxml, final Resource deploymentResource) { // Create the service ServiceName serviceName = ConnectorServices.getDeploymentServiceName(deploymentUnitName,raxml); @@ -93,7 +91,6 @@ public static void createDeploymentService(final ManagementResourceRegistration .addDependency(ConnectorServices.RESOURCE_ADAPTER_DEPLOYER_SERVICE_PREFIX.append(connectorXmlDescriptor.getDeploymentName())); if (registration != null && deploymentResource != null) { - String bootstrapCtxName = raxml.getBootstrapContext() != null ? raxml.getBootstrapContext() : "default"; if (registration.isAllowsOverride() && registration.getOverrideModel(deploymentUnitName) == null) { registration.registerOverrideModel(deploymentUnitName, new OverrideDescriptionProvider() { @Override @@ -107,20 +104,11 @@ public Map getChildTypeOverrideDescriptions(Locale locale) { } }); } - builder.addListener(new AbstractResourceAdapterDeploymentServiceListener(registration, deploymentUnitName, deploymentResource, bootstrapCtxName, raxml.getId(), statsEnabled) { + } - @Override - protected void registerIronjacamar(ServiceController controller, ManagementResourceRegistration subRegistration, Resource subsystemResource) { - //do nothing, no ironjacamar registration for raxml activated ra - } - @Override - protected CommonDeployment getDeploymentMetadata(final ServiceController controller) { - return ((ResourceAdapterXmlDeploymentService) controller.getService()).getRaxmlDeployment(); - } - }); - } builder.setInitialMode(ServiceController.Mode.ACTIVE).install(); + } } diff --git a/connector/src/main/resources/org/jboss/as/connector/subsystems/jca/LocalDescriptions.properties b/connector/src/main/resources/org/jboss/as/connector/subsystems/jca/LocalDescriptions.properties index 3363054b73e1..2ff1a341cb3e 100644 --- a/connector/src/main/resources/org/jboss/as/connector/subsystems/jca/LocalDescriptions.properties +++ b/connector/src/main/resources/org/jboss/as/connector/subsystems/jca/LocalDescriptions.properties @@ -56,3 +56,23 @@ jca.distributed-workmanager.transport-request-timeout=Define timeout for works' jca.distributed-workmanager.long-running-threads=boolean indicating if service for long running activated jca.distributed-workmanager.short-running-threads=boolean indicating if service for short running activated +jca.distributed-workmanager.statistics=Ditributed Workmanager's statistics. + +jca.workmanager.work-active=Number of current active works +jca.workmanager.work-successful=Number of works completed successfully +jca.workmanager.work-failed=Number of works failed +jca.workmanager.dowork-accepted=Number of doWork calls accepted +jca.workmanager.dowork-rejected=Number of doWork calls rejected +jca.workmanager.schedulework-accepted=Number of scheduleWork calls accepted +jca.workmanager.schedulework-rejected=Number of scheduleWork calls rejected +jca.workmanager.startwork-accepted=Number of startWork calls accepted +jca.workmanager.startwork-rejected=Number of startWork calls rejected +jca.workmanager.statistics-enabled=Specifies if workmanager's statistics is enabled. +jca.workmanager.statistics=Workmanager's statistics. +jca.workmanager.workmanager-statistics-enabled=Specifies if workmanager's statistics is enabled. +jca.workmanager.workmanager-statistics-enabled.deprecated=Use 'statistics-enabled'. +jca.workmanager.distributed-workmanager-statistics-enabled=Specifies if distributed workmanager's statistics is enabled. +jca.workmanager.distributed-workmanager-statistics-enabled.deprecated=Use 'statistics-enabled'. +jca.workmanager.dowork-distribution-enabled=Specifies if distribution is enabled for doWork calls. +jca.workmanager.schedulework-distribution-enabled=Specifies if distribution is enabled for scheduleWork calls. +jca.workmanager.startwork-distribution-enabled=Specifies if distribution is enabled for startWork calls. diff --git a/connector/src/main/resources/org/jboss/as/connector/subsystems/resourceadapters/LocalDescriptions.properties b/connector/src/main/resources/org/jboss/as/connector/subsystems/resourceadapters/LocalDescriptions.properties index c53c9f8f4dff..8140bbd23990 100644 --- a/connector/src/main/resources/org/jboss/as/connector/subsystems/resourceadapters/LocalDescriptions.properties +++ b/connector/src/main/resources/org/jboss/as/connector/subsystems/resourceadapters/LocalDescriptions.properties @@ -23,6 +23,7 @@ resource-adapter.activate=Force the resource adapter config activation without s resource-adapter.admin-objects=The configuration of this resource adapter's admin objects. resource-adapter.archive=Specifies the resource adapter archive. resource-adapter.statistics-enabled=define if runtime statistics is enabled or not +resource-adapter.statistics=Runtime statistics provided by the resource adapter. resource-adapter.module=Specifies the module from which resource adapter will be loaded resource-adapter.beanvalidationgroups=Specifies the bean validation groups that should be used. resource-adapter.bootstrap-context=Specifies the unique name of the bootstrap context that should be used. @@ -63,6 +64,7 @@ connection-definitions.background-validation=An element to specify that connecti connection-definitions.blocking-timeout-wait-millis=The blocking-timeout-millis element specifies the maximum time, in milliseconds, to block while waiting for a connection before throwing an exception. Note that this blocks only while waiting for locking a connection, and will never throw an exception if creating a new connection takes an inordinately long time. connection-definitions.class-name=Specifies the fully qualified class name of a managed connection factory or admin object. connection-definitions.clear-statistics=Clear statistics values for this resource adapter's connection definitions. +connection-definitions.statistics=Runtime statistics provided by the resource adapter's connection definitions. connection-definitions.config-properties=Custom defined config properties. connection-definitions.connectable=Enable the use of CMR. This feature means that a local resource can reliably participate in an XA transaction. connection-definitions.tracking=Defines if IronJacamar should track connection handles across transaction boundaries @@ -115,7 +117,7 @@ connection-definitions.validate-on-match=The validate-on-match element specifies statistics.workmanager=Specifies a Workmanager. statistics.distributed-workmanager=Specifies a workmanager able to distribute work. -statistics.resource-adapter=The configuration of a resource adapter. +statistics.resource-adapter=Metrics of a resource adapter. statistics.statistics=Collection of runtime information for resource-adapter's workmanagers and connection-definitions statistics.ironjacamar=Model representing resource adapters activated by ironjacamar.xml file inside rar. diff --git a/testsuite/integration/basic/src/test/java/org/jboss/as/test/integration/jca/statistics/IronJacamarDeploymentStatisticsTestCase.java b/testsuite/integration/basic/src/test/java/org/jboss/as/test/integration/jca/statistics/IronJacamarDeploymentStatisticsTestCase.java index 787821287a49..8224380621e6 100644 --- a/testsuite/integration/basic/src/test/java/org/jboss/as/test/integration/jca/statistics/IronJacamarDeploymentStatisticsTestCase.java +++ b/testsuite/integration/basic/src/test/java/org/jboss/as/test/integration/jca/statistics/IronJacamarDeploymentStatisticsTestCase.java @@ -103,9 +103,11 @@ private void enableStats(String name, String cdName) throws Exception { ModelNode statAddress = new ModelNode(); statAddress.add(DEPLOYMENT, arch) .add(SUBSYSTEM, "resource-adapters") - .add("statistics", "statistics") + .add("ironjacamar", "ironjacamar") .add("resource-adapter", arch) - .add("connection-definitions", cdName); + .add("connection-definitions", cdName) + .add("statistics", "pool"); + statAddress.protect(); ModelNode operation = new ModelNode(); operation.get(OP).set("write-attribute"); @@ -190,9 +192,10 @@ public ModelNode translateFromConnectionToStatistics(ModelNode connectionNode) { ModelNode statNode = new ModelNode(); statNode.add(DEPLOYMENT, connectionNode.get(0).get(DEPLOYMENT).asString()); statNode.add(SUBSYSTEM, "resource-adapters"); - statNode.add("statistics", "statistics"); + statNode.add("ironjacamar", "ironjacamar"); statNode.add(connectionNode.get(3)); statNode.add("connection-definitions", connectionNode.get(4).get("connection-definitions").asString()); + statNode.add("statistics", "pool"); return statNode; } } diff --git a/testsuite/integration/basic/src/test/java/org/jboss/as/test/integration/jca/statistics/ResourceAdapterStatisticsTestCase.java b/testsuite/integration/basic/src/test/java/org/jboss/as/test/integration/jca/statistics/ResourceAdapterStatisticsTestCase.java index edad684de606..40e9c43dc110 100644 --- a/testsuite/integration/basic/src/test/java/org/jboss/as/test/integration/jca/statistics/ResourceAdapterStatisticsTestCase.java +++ b/testsuite/integration/basic/src/test/java/org/jboss/as/test/integration/jca/statistics/ResourceAdapterStatisticsTestCase.java @@ -212,11 +212,11 @@ private ModelNode getAnotherConnection(ModelNode mn) { @Override public ModelNode translateFromConnectionToStatistics(ModelNode connectionNode) { ModelNode statNode = new ModelNode(); - statNode.add(DEPLOYMENT, connectionNode.get(1).get("resource-adapter").asString()); + //statNode.add(DEPLOYMENT, connectionNode.get(1).get("resource-adapter").asString()); statNode.add(SUBSYSTEM, "resource-adapters"); - statNode.add("statistics", "statistics"); statNode.add(connectionNode.get(1)); statNode.add("connection-definitions", connectionNode.get(2).get("connection-definitions").asString()); + statNode.add("statistics", "pool"); return statNode; } }