/* * Copyright 2014 NAVER Corp. * * 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 com.navercorp.pinpoint.common.trace; /** * @author emeroad * @author netspider * @author Jongho Moon */ class DefaultServiceType implements ServiceType { private final short code; private final String name; private final String desc; private final boolean terminal; private final boolean queue; // FIXME record statistics of only rpc call currently. so is it all right to chane into isRecordRpc() private final boolean recordStatistics; // whether or not print out api including destinationId private final boolean includeDestinationId; private final ServiceTypeCategory category; DefaultServiceType(int code, String name, String desc, ServiceTypeProperty... properties) { // code must be a short value but constructors accept int to make declaring ServiceType values more cleaner by removing casting to short. if (code > Short.MAX_VALUE || code < Short.MIN_VALUE) { throw new IllegalArgumentException("code must be a short value"); } this.code = (short)code; this.name = name; this.desc = desc; this.category = ServiceTypeCategory.findCategory((short)code); boolean terminal = false; boolean queue = false; boolean recordStatistics = false; boolean includeDestinationId = false; for (ServiceTypeProperty property : properties) { switch (property) { case TERMINAL: terminal = true; break; case QUEUE: queue = true; break; case RECORD_STATISTICS: recordStatistics = true; break; case INCLUDE_DESTINATION_ID: includeDestinationId = true; break; default: throw new IllegalStateException("Unknown ServiceTypeProperty:" + property); } } this.terminal = terminal; this.queue = queue; this.recordStatistics = recordStatistics; this.includeDestinationId = includeDestinationId; } @Override public boolean isInternalMethod() { return this == INTERNAL_METHOD; } @Override public boolean isRpcClient() { return ServiceTypeCategory.RPC.contains(code); } // FIXME record statistics of only rpc call currently. so is it all right to chane into isRecordRpc() @Override public boolean isRecordStatistics() { return recordStatistics; } @Override public boolean isUnknown() { return this == ServiceType.UNKNOWN; // || this == ServiceType.UNKNOWN_CLOUD; } // return true when the service type is USER or can not be identified @Override public boolean isUser() { return this == ServiceType.USER; } @Override public String getName() { return name; } @Override public short getCode() { return code; } @Override public String getDesc() { return desc; } @Override public boolean isTerminal() { return terminal; } @Override public boolean isQueue() { return queue; } @Override public boolean isIncludeDestinationId() { return includeDestinationId; } @Override public ServiceTypeCategory getCategory() { return category; } @Override public HistogramSchema getHistogramSchema() { return category.getHistogramSchema(); } @Override public boolean isWas() { return this.category == ServiceTypeCategory.SERVER; } @Override public String toString() { return desc; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; DefaultServiceType that = (DefaultServiceType) o; return code == that.code; } @Override public int hashCode() { return (int) code; } public static boolean isWas(final short code) { return ServiceTypeCategory.SERVER.contains(code); } }