/* * Copyright 2013 Red Hat Inc. and/or its affiliates and other contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.switchyard.rhq.plugin; import static org.switchyard.rhq.plugin.SwitchYardConstants.OPERATION_RESET; import java.util.Collections; import java.util.Map; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.measurement.AvailabilityType; import org.rhq.core.domain.measurement.MeasurementDataNumeric; import org.rhq.core.domain.measurement.MeasurementReport; import org.rhq.core.domain.measurement.MeasurementScheduleRequest; import org.rhq.core.pluginapi.measurement.MeasurementFacet; import org.rhq.core.pluginapi.operation.OperationFacet; import org.rhq.core.pluginapi.operation.OperationResult; import org.rhq.modules.plugins.jbossas7.json.Operation; import org.switchyard.rhq.plugin.model.Application; import org.switchyard.rhq.plugin.model.ComponentReference; import org.switchyard.rhq.plugin.model.ComponentReferenceMetrics; import org.switchyard.rhq.plugin.model.ComponentService; import org.switchyard.rhq.plugin.model.ComponentServiceMetrics; import org.switchyard.rhq.plugin.model.OperationMetrics; import org.switchyard.rhq.plugin.operations.ResetComponentServiceMetrics; /** * SwitchYard Component Service Resource Component */ public class ComponentServiceResourceComponent extends BaseSwitchYardResourceComponent<ApplicationResourceComponent> implements MeasurementFacet, OperationFacet { /** * The logger instance. */ private static Log LOG = LogFactory.getLog(ComponentServiceResourceComponent.class); protected Log getLog() { return LOG; } @Override public AvailabilityType getAvailability() { final ComponentService componentService = getComponentService(); return (componentService == null) ? AvailabilityType.DOWN : AvailabilityType.UP; } public Map<String, ComponentReference> getReferences() { final ComponentService componentService = getComponentService(); if (componentService == null) { return Collections.emptyMap(); } else { return componentService.getReferences(); } } public ComponentService getComponentService() { final String componentServiceKey = getResourceContext().getResourceKey(); return getApplication().getComponentServices().get(componentServiceKey); } public Application getApplication() { return getResourceContext().getParentResourceComponent().getApplication(); } public <T> T execute(final Operation operation, Class<T> clazz) { return getResourceContext().getParentResourceComponent().execute(operation, clazz); } private ComponentServiceMetrics getComponentServiceMetrics() { final String componentServiceKey = getResourceContext().getResourceKey(); final Map<String, ComponentServiceMetrics> componentServiceMetrics = getResourceContext().getParentResourceComponent().getComponentServiceMetrics(); return (componentServiceMetrics != null) ? componentServiceMetrics.get(componentServiceKey) : null; } public Map<String, OperationMetrics> getOperationMetrics() { final ComponentServiceMetrics componentServiceMetrics = getComponentServiceMetrics(); if (componentServiceMetrics != null) { return componentServiceMetrics.getOperationMetrics(); } else { return Collections.emptyMap(); } } public Map<String, ComponentReferenceMetrics> getComponentReferenceMetrics() { final ComponentServiceMetrics componentServiceMetrics = getComponentServiceMetrics(); if (componentServiceMetrics != null) { return componentServiceMetrics.getComponentReferenceMetrics(); } else { return Collections.emptyMap(); } } public void clearComponentServiceMetrics() { getResourceContext().getParentResourceComponent().clearComponentServiceMetrics(); } @Override public void getValues(final MeasurementReport report, final Set<MeasurementScheduleRequest> requests) throws Exception { final ComponentServiceMetrics metrics = getComponentServiceMetrics(); if (metrics != null) { for (MeasurementScheduleRequest request: requests) { final MeasurementDataNumeric measurementData = getCommonMetric(request, metrics); if (measurementData != null) { report.addData(measurementData); } else if (LOG.isDebugEnabled()) { LOG.debug("Unable to collect Component Service measurement " + request.getName()); } } } } @Override public OperationResult invokeOperation(final String name, final Configuration parameters) throws InterruptedException, Exception { if (OPERATION_RESET.equals(name)) { final ComponentService componentService = getComponentService(); final Application application = getApplication(); if ((componentService != null) && (application != null)) { final String componentServiceName = componentService.getName().toString(); final String applicationName = application.getName().toString(); execute(new ResetComponentServiceMetrics(applicationName, componentServiceName), Void.class); clearComponentServiceMetrics(); } } else if (LOG.isDebugEnabled()) { LOG.warn("Unknown Component Service operation " + name); } return null; } }