/*
* Copyright 2014 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.deploy.karaf;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.switchyard.admin.Application;
import org.switchyard.admin.Binding;
import org.switchyard.admin.ComponentReference;
import org.switchyard.admin.ComponentService;
import org.switchyard.admin.MessageMetrics;
import org.switchyard.admin.Reference;
import org.switchyard.admin.Service;
import org.switchyard.admin.ServiceOperation;
import org.switchyard.admin.Throttling;
import org.switchyard.admin.Transformer;
import org.switchyard.admin.Validator;
import org.switchyard.config.model.switchyard.ArtifactModel;
/**
* PrintUtil
*
* Utility class for creating text output for
* {@link org.switchyard.admin.SwitchYard} admin objects.
*/
final public class PrintUtil {
private static final String INTERFACE = "interface";
private static final String TYPE = "type";
private static final String APPLICATION = "application";
private static final String COMPONENT_SERVICES = "componentServices";
private static final String CONFIGURATION = "configuration";
private static final String FROM = "from";
private static final String IMPLEMENTATION = "implementation";
private static final String IMPLEMENTATION_CONFIGURATION = "implementationConfiguration";
private static final String GATEWAYS = "gateways";
private static final String OPERATIONS = "operations";
private static final String PROPERTIES = "properties";
private static final String PROMOTED_REFERENCE = "promotedReference";
private static final String PROMOTED_SERVICE = "promotedService";
private static final String REFERENCES = "references";
private static final String SERVICES = "services";
private static final String STATE = "state";
private static final String THROTTLING = "throttling";
private static final String TO = "to";
private static final String TRANSFORMERS = "transformers";
private static final String ARTIFACTS = "artifacts";
private static final String URL = "url";
private static final String VALIDATORS = "validators";
private static final String SUCCESS_COUNT = "successCount";
private static final String FAULT_COUNT = "faultCount";
private static final String TOTAL_COUNT = "totalCount";
private static final String AVERAGE_TIME = "averageTime";
private static final String MIN_TIME = "minTime";
private static final String MAX_TIME = "maxTime";
private static final String TOTAL_TIME = "totalTime";
private static final String ENABLED = "enabled";
private static final String MAX_REQUESTS = "maxRequests";
private static final String TIME_PERIOD = "timePeriod";
/**
* Creates output tree for the {@link Application}. The tree has the form: <br>
* <code><pre>
* "name" = [
* "services" = [
* "name" = [
* "application" = "name"
* "interface" = "interfaceName"
* "promotedService" = "promotedServiceName"
* "gateways" = [
* "name" = [
* "type" = "typeName"
* "configuration" = "<?binding.foo ..."
* ]
* ...
* ]
* ]
* ...
* ]
* "references" = [
* "name" = [
* "application" = "name"
* "interface" = "interfaceName"
* "promotedReference" = "promotedReferenceName"
* "gateways" = [
* "name" = [
* "type" = "typeName"
* "configuration" = "<?binding.foo ..."
* ]
* ...
* ]
* ]
* ...
* ]
* "componentServices" = [
* "name" = [
* "application" = "name"
* "interface" = "interfaceName"
* "implementation" = "implementationTypeName"
* "references" = [
* "name" = "interfaceName"
* ...
* ]
* ]
* ...
* ]
* "transformers" = [
* [
* "from" = "fromType"
* "to" = "toType"
* "type" = "transformerType"
* ]
* ...
* ]
* "artifacts" = [
* "name" = "urlType"
* ...
* ]
* "validators" = [
* "name" = "XML"
* ]
* "properties" = [
* "key" = "value",
* ]
* ]
* </pre></code>
*
* @param application the {@link Application} used to populate the node.
* @return text
*/
public static String printApplication(Application application) {
final StringBuffer applicationNode = new StringBuffer();
int indentLevel = 0;
applicationNode.append(indent(indentLevel)).append(application.getName()).append(" = [\n");
++indentLevel;
applicationNode.append(indent(indentLevel)).append(SERVICES).append(" = [\n");
++indentLevel;
for (Service service : application.getServices()) {
applicationNode.append(printService(service, indentLevel));
}
--indentLevel;
applicationNode.append(indent(indentLevel)).append("]\n");
applicationNode.append(indent(indentLevel)).append(REFERENCES).append(" = [\n");
++indentLevel;
for (Reference reference : application.getReferences()) {
applicationNode.append(printReference(reference, indentLevel));
}
--indentLevel;
applicationNode.append(indent(indentLevel)).append("]\n");
applicationNode.append(indent(indentLevel)).append(COMPONENT_SERVICES).append(" = [\n");
++indentLevel;
for (ComponentService componentService : application.getComponentServices()) {
applicationNode.append(printComopnentService(componentService, indentLevel));
}
--indentLevel;
applicationNode.append(indent(indentLevel)).append("]\n");
applicationNode.append(indent(indentLevel)).append(TRANSFORMERS).append(" = [\n");
++indentLevel;
for (Transformer transformer : application.getTransformers()) {
applicationNode.append(indent(indentLevel)).append("[\n");
++indentLevel;
applicationNode.append(printTransformer(transformer, indentLevel));
--indentLevel;
applicationNode.append(indent(indentLevel)).append("]\n");
}
if (application.getConfig().getArtifacts() != null) {
applicationNode.append(indent(indentLevel)).append(ARTIFACTS).append(" = [\n");
++indentLevel;
for (ArtifactModel artifact : application.getConfig().getArtifacts().getArtifacts()) {
applicationNode.append(printArtifact(artifact, indentLevel));
}
--indentLevel;
applicationNode.append(indent(indentLevel)).append("]\n");
}
if (application.getValidators() != null) {
applicationNode.append(indent(indentLevel)).append(VALIDATORS).append(" = [\n");
++indentLevel;
for (Validator validator : application.getValidators()) {
applicationNode.append(printValidator(validator, indentLevel));
}
--indentLevel;
applicationNode.append(indent(indentLevel)).append("]\n");
}
if (application.getProperties() != null) {
applicationNode.append(indent(indentLevel)).append(PROPERTIES).append(" = [\n");
++indentLevel;
for (Map.Entry<String, String> property : application.getProperties().entrySet()) {
applicationNode.append(indent(indentLevel)).append(property.getKey()).append(" = ")
.append(property.getValue());
applicationNode.append("\n");
}
--indentLevel;
applicationNode.append(indent(indentLevel)).append("]\n");
}
--indentLevel;
applicationNode.append(indent(indentLevel)).append("]\n");
return applicationNode.toString();
}
/**
* Creates text tree from the {@link Reference}. The tree has the form: <br>
* <code><pre>
* "name" = [
* "application" = "name"
* "interface" = "interfaceName"
* "promotedReference" = "promotedReferenceName"
* "gateways" = [
* name = [
* "type" = "typeName"
* "configuration" = "<?binding.foo ..."
* ]
* ...
* ]
* ]
* </pre></code>
*
* @param reference the {@link Reference} used to populate the node.
* @param indentLevel the beginning indent level
* @return text
*/
public static String printReference(Reference reference, int indentLevel) {
final StringBuffer referenceNode = new StringBuffer();
referenceNode.append(indent(indentLevel)).append(reference.getName().toString()).append(" = [\n");
++indentLevel;
referenceNode.append(indent(indentLevel)).append(APPLICATION).append(" = ")
.append(reference.getApplication().getName().toString());
referenceNode.append("\n");
String interfaceName = reference.getInterface();
if (interfaceName != null) {
referenceNode.append(indent(indentLevel)).append(INTERFACE).append(" = ").append(interfaceName);
referenceNode.append("\n");
}
String promotedReference = reference.getPromotedReference();
if (promotedReference != null) {
referenceNode.append(indent(indentLevel)).append(PROMOTED_REFERENCE).append(" = ")
.append(promotedReference);
referenceNode.append("\n");
}
referenceNode.append(indent(indentLevel)).append(GATEWAYS).append(" = [\n");
++indentLevel;
for (Binding gateway : reference.getGateways()) {
referenceNode.append(createGateway(gateway, indentLevel));
}
--indentLevel;
referenceNode.append(indent(indentLevel)).append("]\n");
--indentLevel;
referenceNode.append(indent(indentLevel)).append("]\n");
return referenceNode.toString();
}
/**
* Creates text tree from the {@link Service}. The tree has the form: <br>
* <code><pre>
* "name" = [
* "application" = "name"
* "interface" = "interfaceName"
* "promotedService" = "promotedServiceName"
* "gateways" = [
* name = [
* "type" = "typeName"
* "configuration" = "<?binding.foo ..."
* ]
* ...
* ]
* "throttling" = [
* "enabled" = "true"
* "maxRequests" = "maxRequests"
* "timePeriod" = "timePeriod"
* ]
* ]
* </pre></code>
*
* @param service the {@link Service} used to populate the node.
* @param indentLevel the beginning indent level
* @return text
*/
public static String printService(Service service, int indentLevel) {
final StringBuffer serviceNode = new StringBuffer();
serviceNode.append(indent(indentLevel)).append(service.getName()).append(" = [\n");
++indentLevel;
serviceNode.append(indent(indentLevel)).append(APPLICATION).append(" = ")
.append(service.getApplication().getName().toString());
serviceNode.append("\n");
String interfaceName = service.getInterface();
if (interfaceName != null) {
serviceNode.append(indent(indentLevel)).append(INTERFACE).append(" = ").append(interfaceName);
serviceNode.append("\n");
}
ComponentService promotedService = service.getPromotedService();
if (promotedService != null) {
serviceNode.append(indent(indentLevel)).append(PROMOTED_SERVICE).append(" = ")
.append(promotedService.getName().toString());
serviceNode.append("\n");
}
serviceNode.append(indent(indentLevel)).append(GATEWAYS).append(" = [\n");
++indentLevel;
for (Binding gateway : service.getGateways()) {
serviceNode.append(createGateway(gateway, indentLevel));
}
--indentLevel;
serviceNode.append(indent(indentLevel)).append("]\n");
serviceNode.append(printThrottlingTo(service.getThrottling(), indentLevel));
--indentLevel;
serviceNode.append(indent(indentLevel)).append("]\n");
return serviceNode.toString();
}
/**
* Creates text tree from the {@link ComponentService}. The tree has the
* form: <br>
* <code><pre>
* "name" = [
* "application" = "name"
* "interface" = "interfaceName"
* "implementation" = "implementationTypeName"
* "references" = [
* "name" = [
* "interface" = "interfaceName"
* ]
* ...
* ]
* ]
* </pre></code>
*
* @param service the {@link ComponentService} used to populate the node.
* @param indentLevel the beginning indent level
* @return text
*/
public static String printComopnentService(ComponentService service, int indentLevel) {
final StringBuffer serviceNode = new StringBuffer();
serviceNode.append(indent(indentLevel)).append(service.getName()).append(" = [\n");
++indentLevel;
serviceNode.append(indent(indentLevel)).append(APPLICATION).append(" = ")
.append(service.getApplication().getName().toString());
serviceNode.append("\n");
String interfaceName = service.getInterface();
if (interfaceName != null) {
serviceNode.append(indent(indentLevel)).append(INTERFACE).append(" = ").append(interfaceName);
serviceNode.append("\n");
}
String implementation = service.getImplementation();
if (implementation != null) {
serviceNode.append(indent(indentLevel)).append(IMPLEMENTATION).append(" = ").append(implementation);
serviceNode.append("\n");
}
String implementationConfiguration = service.getImplementationConfiguration();
if (implementationConfiguration != null) {
serviceNode.append(indent(indentLevel)).append(IMPLEMENTATION_CONFIGURATION).append(" = ")
.append(implementationConfiguration);
serviceNode.append("\n");
}
serviceNode.append(indent(indentLevel)).append(REFERENCES).append(" = [\n");
++indentLevel;
for (ComponentReference reference : service.getReferences()) {
serviceNode.append(printComponentReference(reference, indentLevel));
}
--indentLevel;
serviceNode.append(indent(indentLevel)).append("]\n");
--indentLevel;
serviceNode.append(indent(indentLevel)).append("]\n");
return serviceNode.toString();
}
/**
* Creates text tree from the {@link Service}. The tree has the form: <br>
* <code><pre>
* "name" = [
* "type" = "typeName"
* "configuration" = "<?binding.foo ..."
* "state" = "STARTED"
* ]
* </pre></code>
*
* @param binding the {@link Binding} used to populate the node.
* @param indentLevel the beginning indentLevel
* @return text
*/
public static String createGateway(Binding binding, int indentLevel) {
StringBuffer gatewayNode = new StringBuffer();
gatewayNode.append(indent(indentLevel)).append(binding.getName()).append(" = [\n");
++indentLevel;
if (binding.getType() != null) {
gatewayNode.append(indent(indentLevel)).append(TYPE).append(" = ").append(binding.getType());
gatewayNode.append("\n");
}
if (binding.getConfiguration() != null) {
gatewayNode.append(indent(indentLevel)).append(CONFIGURATION).append(" = ")
.append(binding.getConfiguration());
gatewayNode.append("\n");
}
gatewayNode.append(indent(indentLevel)).append(STATE).append(" = ").append(binding.getState().toString());
gatewayNode.append("\n");
--indentLevel;
gatewayNode.append(indent(indentLevel)).append("]\n");
return gatewayNode.toString();
}
/**
* Creates text tree from the {@link ComponentReference}. The tree has the
* form: <br>
* <code><pre>
* "name" = [
* "interface" = "interfaceName"
* ]
* </pre></code>
*
* @param reference the {@link ComponentReference} used to populate the
* node.
* @param indentLevel the beginning indent level
* @return text
*/
public static String printComponentReference(ComponentReference reference, int indentLevel) {
final StringBuffer referenceNode = new StringBuffer();
referenceNode.append(indent(indentLevel)).append(reference.getName().toString()).append(" = [\n");
++indentLevel;
referenceNode.append(indent(indentLevel)).append(INTERFACE).append(" = ").append(reference.getInterface())
.append("\n");
--indentLevel;
referenceNode.append(indent(indentLevel)).append("]\n");
return referenceNode.toString();
}
/**
* Creates text tree from the {@link Transformer}. The tree has the form: <br>
* <code><pre>
* "from" = "fromType",
* "to" = "toType",
* "type" = "transformerType",
* </pre></code>
*
* @param transformation the {@link Transformer} used to populate the node.
* @param indentLevel the beginning indent level
* @return text
*/
public static String printTransformer(Transformer transformation, int indentLevel) {
final StringBuffer transformationNode = new StringBuffer();
if (transformation.getFrom() != null) {
transformationNode.append(indent(indentLevel)).append(FROM).append(" = ")
.append(transformation.getFrom().toString());
transformationNode.append("\n");
}
if (transformation.getTo() != null) {
transformationNode.append(indent(indentLevel)).append(TO).append(" = ")
.append(transformation.getTo().toString());
transformationNode.append("\n");
}
if (transformation.getType() != null) {
transformationNode.append(indent(indentLevel)).append(TYPE).append(" = ").append(transformation.getType());
transformationNode.append("\n");
}
return transformationNode.toString();
}
/**
* Creates text tree from the {@link ArtifactModel}. The tree has the form: <br>
* <code><pre>
* "name" = [
* "url" = "urlType"
* ]
* </pre></code>
*
* @param artifact the {@link ArtifactModel} used to populate the node.
* @param indentLevel the beginning indent level;
* @return text
*/
public static String printArtifact(ArtifactModel artifact, int indentLevel) {
final StringBuffer artifactNode = new StringBuffer();
artifactNode.append(indent(indentLevel)).append(artifact.getName()).append(" = [\n");
++indentLevel;
artifactNode.append(indent(indentLevel)).append(URL).append(" = ").append(artifact.getURL()).append("\n");
--indentLevel;
artifactNode.append("]\n");
return artifactNode.toString();
}
/**
* Creates text tree from the validtors. The tree has the form: <br>
* <code><pre>
* "name" = [
* "type" = "XML"
* ]
* </pre></code>
*
* @param validator the {@link Validator} used to populate the node.
* @param indentLevel the beginning indent level
* @return text
*/
public static String printValidator(Validator validator, int indentLevel) {
final StringBuffer validatorNode = new StringBuffer();
validatorNode.append(indent(indentLevel)).append(validator.getName().toString()).append(" = [\n");
++indentLevel;
validatorNode.append(indent(indentLevel)).append(TYPE).append(" = ").append(validator.getType()).append("\n");
--indentLevel;
validatorNode.append(indent(indentLevel)).append("]\n");
return validatorNode.toString();
}
/**
* Adds metrics to an existing node from the {@link MessageMetrics}. The
* tree has the form: <br>
* <code><pre>
* "successCount" = "successCount",
* "faultCount" = "faultCount",
* "totalCount" = "totalCount",
* "averageTime" = "averageTime",
* "minTime" = "minTime",
* "maxTime" = "maxTime",
* "totalTime" = "totalTime"
* </pre></code>
*
* @param metrics the metrics to add to the node
* @param indentLevel the indent level
* @return text
*/
public static String addMetricsToNode(MessageMetrics metrics, int indentLevel) {
final StringBuffer metricsNode = new StringBuffer();
metricsNode.append(indent(indentLevel)).append(SUCCESS_COUNT).append(" = ").append(metrics.getSuccessCount())
.append("\n");
metricsNode.append(indent(indentLevel)).append(FAULT_COUNT).append(" = ").append(metrics.getFaultCount())
.append("\n");
metricsNode.append(indent(indentLevel)).append(TOTAL_COUNT).append(" = ").append(metrics.getTotalCount())
.append("\n");
metricsNode.append(indent(indentLevel)).append(AVERAGE_TIME).append(" = ")
.append(BigDecimal.valueOf(metrics.getAverageProcessingTime())).append("\n");
metricsNode.append(indent(indentLevel)).append(MIN_TIME).append(" = ").append(metrics.getMinProcessingTime())
.append("\n");
metricsNode.append(indent(indentLevel)).append(MAX_TIME).append(" = ").append(metrics.getMaxProcessingTime())
.append("\n");
metricsNode.append(indent(indentLevel)).append(TOTAL_TIME).append(" = ")
.append(metrics.getTotalProcessingTime()).append("\n");
return metricsNode.toString();
}
/**
* Creates text tree from the {@link Reference} for metrics. The tree has
* the form: <br>
* <code><pre>
* "name" = [
* "successCount" = "successCount"
* "faultCount" = "faultCount"
* "totalCount" = "totalCount"
* "averageTime" = "averageTime"
* "minTime" = "minTime"
* "maxTime" = "maxTime"
* "totalTime" = "totalTime"
* "gateways" = [
* "name" = [
* "type" = "bindingType",
* "successCount" = "successCount",
* "faultCount" = "faultCount",
* "totalCount" = "totalCount",
* "averageTime" = "averageTime",
* "minTime" = "minTime",
* "maxTime" = "maxTime",
* "totalTime" = "totalTime",
* ]
* ...
* ]
* "operations" = [
* "name" = [
* "successCount" = "successCount"
* "faultCount" = "faultCount"
* "totalCount" = "totalCount"
* "averageTime" = "averageTime"
* "minTime" = "minTime"
* "maxTime" = "maxTime"
* "totalTime" = "totalTime"
* ]
* ...
* ]
* ]
* </pre></code>
*
* @param reference the {@link Reference} used to populate the node.
* @param indentLevel the beginning indent level
* @return text
*/
public static String printReferenceMetrics(Reference reference, int indentLevel) {
final StringBuffer referenceNode = new StringBuffer();
referenceNode.append(indent(indentLevel)).append(reference.getName().toString()).append(" = [\n");
++indentLevel;
referenceNode.append(addMetricsToNode(reference.getMessageMetrics(), indentLevel));
referenceNode.append(indent(indentLevel)).append(GATEWAYS).append(" = [\n");
++indentLevel;
for (Binding gateway : reference.getGateways()) {
referenceNode.append(indent(indentLevel)).append(gateway.getName()).append(" = [\n");
++indentLevel;
referenceNode.append(indent(indentLevel)).append(TYPE).append(" = ").append(gateway.getType()).append("\n");
referenceNode.append(addMetricsToNode(gateway.getMessageMetrics(), indentLevel));
--indentLevel;
referenceNode.append(indent(indentLevel)).append("]\n");
}
--indentLevel;
referenceNode.append(indent(indentLevel)).append("]\n");
referenceNode.append(indent(indentLevel)).append(OPERATIONS).append(" = [\n");
++indentLevel;
for (ServiceOperation operation : reference.getServiceOperations()) {
referenceNode.append(indent(indentLevel)).append(operation.getName()).append(" = [\n");
++indentLevel;
referenceNode.append(addMetricsToNode(operation.getMessageMetrics(), indentLevel));
--indentLevel;
referenceNode.append(indent(indentLevel)).append("]\n");
}
--indentLevel;
referenceNode.append(indent(indentLevel)).append("]\n");
--indentLevel;
referenceNode.append(indent(indentLevel)).append("]\n");
return referenceNode.toString();
}
/**
* Creates text tree from the {@link Service} for metrics. The tree has the
* form: <br>
* <code><pre>
* "name" = [
* "successCount" = "successCount"
* "faultCount" = "faultCount"
* "totalCount" = "totalCount"
* "averageTime" = "averageTime"
* "minTime" = "minTime"
* "maxTime" = "maxTime"
* "totalTime" = "totalTime"
* "operations" = [
* "name" = [
* "successCount" = "successCount"
* "faultCount" = "faultCount"
* "totalCount" = "totalCount"
* "averageTime" = "averageTime"
* "minTime" = "minTime"
* "maxTime" = "maxTime"
* "totalTime" = "totalTime"
* ]
* ...
* ]
* "references" = [
* "name" = [
* "successCount" = "successCount"
* "faultCount" = "faultCount"
* "totalCount" = "totalCount"
* "averageTime" = "averageTime"
* "minTime" = "minTime"
* "maxTime" = "maxTime"
* "totalTime" = "totalTime"
* ]
* ...
* ]
* "gateways" = [
* "name" = [
* "type" = "bindingType"
* "successCount" = "successCount"
* "faultCount" = "faultCount"
* "totalCount" = "totalCount"
* "averageTime" = "averageTime"
* "minTime" = "minTime"
* "maxTime" = "maxTime"
* "totalTime" = "totalTime"
* ]
* ...
* ]
* </pre></code>
*
* @param service the {@link Service} used to populate the node.
* @param indentLevel the beginning indent level
* @return text
*/
public static String printServiceMetrics(Service service, int indentLevel) {
final StringBuffer serviceNode = new StringBuffer();
serviceNode.append(indent(indentLevel)).append(service.getName().toString()).append(" = [\n");
++indentLevel;
serviceNode.append(addMetricsToNode(service.getMessageMetrics(), indentLevel));
serviceNode.append(indent(indentLevel)).append(OPERATIONS).append(" = [\n");
++indentLevel;
for (ServiceOperation operation : service.getPromotedService().getServiceOperations()) {
serviceNode.append(indent(indentLevel)).append(operation.getName()).append(" = [\n");
++indentLevel;
serviceNode.append(addMetricsToNode(operation.getMessageMetrics(), indentLevel));
--indentLevel;
serviceNode.append(indent(indentLevel)).append("]\n");
}
--indentLevel;
serviceNode.append(indent(indentLevel)).append("]\n");
serviceNode.append(indent(indentLevel)).append(REFERENCES).append(" = [\n");
++indentLevel;
for (ComponentReference reference : service.getPromotedService().getReferences()) {
serviceNode.append(indent(indentLevel)).append(reference.getName()).append(" = [\n");
++indentLevel;
serviceNode.append(addMetricsToNode(reference.getMessageMetrics(), indentLevel));
--indentLevel;
serviceNode.append(indent(indentLevel)).append("]\n");
}
--indentLevel;
serviceNode.append(indent(indentLevel)).append("]\n");
serviceNode.append(indent(indentLevel)).append(GATEWAYS).append(" = [\n");
++indentLevel;
for (Binding gateway : service.getGateways()) {
serviceNode.append(indent(indentLevel)).append(gateway.getName()).append(" = [\n");
++indentLevel;
serviceNode.append(indent(indentLevel)).append(TYPE).append(" = ").append(gateway.getType()).append("\n");
serviceNode.append(addMetricsToNode(gateway.getMessageMetrics(), indentLevel));
--indentLevel;
serviceNode.append(indent(indentLevel)).append("]\n");
}
--indentLevel;
serviceNode.append(indent(indentLevel)).append("]\n");
--indentLevel;
serviceNode.append(indent(indentLevel)).append("]\n");
return serviceNode.toString();
}
/**
* Creates text tree from the {@link ComponentService} for metrics. The tree
* has the form: <br>
* <code><pre>
* "name" = "serviceName",
* "application" = "name",
* "successCount" = "successCount",
* "faultCount" = "faultCount",
* "totalCount" = "totalCount",
* "averageTime" = "averageTime",
* "minTime" = "minTime",
* "maxTime" = "maxTime",
* "totalTime" = "totalTime",
* "operations" = [
* {
* "name" = "operationName",
* "successCount" = "successCount",
* "faultCount" = "faultCount",
* "totalCount" = "totalCount",
* "averageTime" = "averageTime",
* "minTime" = "minTime",
* "maxTime" = "maxTime",
* "totalTime" = "totalTime",
* },
* ...
* ],
* "references" = [
* {
* "name" = "referenceName",
* "successCount" = "successCount",
* "faultCount" = "faultCount",
* "totalCount" = "totalCount",
* "averageTime" = "averageTime",
* "minTime" = "minTime",
* "maxTime" = "maxTime",
* "totalTime" = "totalTime",
* },
* ...
* ]
* </pre></code>
*
* @param componentService the {@link Service} used to populate the node.
* @param indentLevel the beginning indent level
* @return text
*/
public static String printComponentServiceMetrics(ComponentService componentService, int indentLevel) {
final StringBuffer serviceNode = new StringBuffer();
serviceNode.append(indent(indentLevel)).append(componentService.getName().toString()).append(" = [\n");
++indentLevel;
serviceNode.append(addMetricsToNode(componentService.getMessageMetrics(), indentLevel));
serviceNode.append(indent(indentLevel)).append(OPERATIONS).append(" = [\n");
++indentLevel;
for (ServiceOperation operation : componentService.getServiceOperations()) {
serviceNode.append(indent(indentLevel)).append(operation.getName()).append(" = [\n");
++indentLevel;
serviceNode.append(addMetricsToNode(operation.getMessageMetrics(), indentLevel));
--indentLevel;
serviceNode.append(indent(indentLevel)).append("]\n");
}
--indentLevel;
serviceNode.append(indent(indentLevel)).append("]\n");
serviceNode.append(indent(indentLevel)).append(REFERENCES).append(" = [\n");
++indentLevel;
for (ComponentReference reference : componentService.getReferences()) {
serviceNode.append(indent(indentLevel)).append(reference.getName()).append(" = [\n");
++indentLevel;
serviceNode.append(addMetricsToNode(reference.getMessageMetrics(), indentLevel));
--indentLevel;
serviceNode.append(indent(indentLevel)).append("]\n");
}
--indentLevel;
serviceNode.append(indent(indentLevel)).append("]\n");
--indentLevel;
serviceNode.append(indent(indentLevel)).append("]\n");
return serviceNode.toString();
}
/**
* Creates a new node from the {@link Throttling}. The tree has the form: <br>
* <code><pre>
* "throttling" = [
* "enabled" = "true"
* "maxRequests" = "maxRequests"
* "timePeriod" = "timePeriod"
* ]
* </pre></code>
*
* @param throttling the throttling configuration to add to the node
* @param indentLevel the beginning indent level
* @return text
*/
public static String printThrottlingTo(Throttling throttling, int indentLevel) {
if (throttling == null) {
return "";
}
final StringBuffer throttlingNode = new StringBuffer();
throttlingNode.append(indent(indentLevel)).append(THROTTLING).append(" = [\n");
++indentLevel;
throttlingNode.append(indent(indentLevel)).append(ENABLED).append(" = ").append(throttling.isEnabled())
.append("\n");
throttlingNode.append(indent(indentLevel)).append(MAX_REQUESTS).append(" = ")
.append(throttling.getMaxRequests()).append("\n");
throttlingNode.append(indent(indentLevel)).append(TIME_PERIOD).append(" = ").append(throttling.getTimePeriod())
.append("\n");
--indentLevel;
throttlingNode.append(indent(indentLevel)).append("]\n");
return throttlingNode.toString();
}
private static final List<String> INDENT = new ArrayList<String>();
private static synchronized String indent(int indentLevel) {
while (INDENT.size() <= indentLevel) {
final StringBuffer indent = new StringBuffer();
for (int i = 0, size = 4 * INDENT.size(); i <= size; ++i) {
indent.append(' ');
}
INDENT.add(indent.toString());
}
return INDENT.get(indentLevel);
}
private PrintUtil() {
}
}