/* * Copyright 2016 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.plugin.activemq.client; import org.apache.activemq.command.ActiveMQMessage; import javax.jms.JMSException; import javax.jms.Message; /** * @author HyunGil Jeong */ public enum ActiveMQClientHeader { ACTIVEMQ_TRACE_ID("Pinpoint-TraceID"), ACTIVEMQ_SPAN_ID("Pinpoint-SpanID"), ACTIVEMQ_PARENT_SPAN_ID("Pinpoint-pSpanID"), ACTIVEMQ_SAMPLED("Pinpoint-Sampled"), ACTIVEMQ_FLAGS("Pinpoint-Flags"), ACTIVEMQ_PARENT_APPLICATION_NAME("Pinpoint-pAppName"), ACTIVEMQ_PARENT_APPLICATION_TYPE("Pinpoint-pAppType"); private final String id; ActiveMQClientHeader(String id) { this.id = id; } public String getId() { return this.id; } private interface MessageHandler<T> { void setMessage(Message message, ActiveMQClientHeader key, T value) throws JMSException; T getMessage(Message message, ActiveMQClientHeader key, T defaultValue); } private static abstract class MessageHandlerBase<T> implements MessageHandler<T> { @Override public final void setMessage(Message message, ActiveMQClientHeader key, T value) throws JMSException { String id = key.id; if (message instanceof ActiveMQMessage) { ActiveMQMessage activeMQMessage = (ActiveMQMessage) message; if (activeMQMessage.isReadOnlyProperties()) { activeMQMessage.setReadOnlyProperties(false); setMessage0(message, id, value); activeMQMessage.setReadOnlyProperties(true); return; } } setMessage0(message, id, value); } @Override public final T getMessage(Message message, ActiveMQClientHeader key, T defaultValue) { String id = key.id; try { if (message.propertyExists(id)) { return getMessage0(message, id); } } catch (JMSException e) { // just ignore and return default value } return defaultValue; } protected abstract void setMessage0(Message message, String id, T value) throws JMSException; protected abstract T getMessage0(Message message, String id) throws JMSException; } private static final MessageHandler<String> STRING_MESSAGE_HANDLER = new MessageHandlerBase<String>() { @Override protected void setMessage0(Message message, String id, String value) throws JMSException { message.setStringProperty(id, value); } @Override protected String getMessage0(Message message, String id) throws JMSException { return message.getStringProperty(id); } }; private static final MessageHandler<Long> LONG_MESSAGE_HANDLER = new MessageHandlerBase<Long>() { @Override protected void setMessage0(Message message, String id, Long value) throws JMSException { message.setLongProperty(id, value); } @Override protected Long getMessage0(Message message, String id) throws JMSException { return message.getLongProperty(id); } }; private static final MessageHandler<Short> SHORT_MESSAGE_HANDLER = new MessageHandlerBase<Short>() { @Override protected void setMessage0(Message message, String id, Short value) throws JMSException { message.setShortProperty(id, value); } @Override protected Short getMessage0(Message message, String id) throws JMSException { return message.getShortProperty(id); } }; private static final MessageHandler<Boolean> BOOLEAN_MESSAGE_HANDLER = new MessageHandlerBase<Boolean>() { @Override protected void setMessage0(Message message, String id, Boolean value) throws JMSException { message.setBooleanProperty(id, value); } @Override protected Boolean getMessage0(Message message, String id) throws JMSException { return message.getBooleanProperty(id); } }; public static void setTraceId(Message message, String traceId) throws JMSException { STRING_MESSAGE_HANDLER.setMessage(message, ACTIVEMQ_TRACE_ID, traceId); } public static String getTraceId(Message message, String defaultValue) { return STRING_MESSAGE_HANDLER.getMessage(message, ACTIVEMQ_TRACE_ID, defaultValue); } public static void setSpanId(Message message, Long spanId) throws JMSException { LONG_MESSAGE_HANDLER.setMessage(message, ACTIVEMQ_SPAN_ID, spanId); } public static Long getSpanId(Message message, Long defaultValue) { return LONG_MESSAGE_HANDLER.getMessage(message, ACTIVEMQ_SPAN_ID, defaultValue); } public static void setParentSpanId(Message message, Long parentSpanId) throws JMSException { LONG_MESSAGE_HANDLER.setMessage(message, ACTIVEMQ_PARENT_SPAN_ID, parentSpanId); } public static Long getParentSpanId(Message message, Long defaultValue) { return LONG_MESSAGE_HANDLER.getMessage(message, ACTIVEMQ_PARENT_SPAN_ID, defaultValue); } public static void setSampled(Message message, Boolean sampled) throws JMSException { BOOLEAN_MESSAGE_HANDLER.setMessage(message, ACTIVEMQ_SAMPLED, sampled); } public static Boolean getSampled(Message message, Boolean defaultValue) { return BOOLEAN_MESSAGE_HANDLER.getMessage(message, ACTIVEMQ_SAMPLED, defaultValue); } public static void setFlags(Message message, Short flags) throws JMSException { SHORT_MESSAGE_HANDLER.setMessage(message, ACTIVEMQ_FLAGS, flags); } public static Short getFlags(Message message, Short defaultValue) { return SHORT_MESSAGE_HANDLER.getMessage(message, ACTIVEMQ_FLAGS, defaultValue); } public static void setParentApplicationName(Message message, String parentApplicationName) throws JMSException { STRING_MESSAGE_HANDLER.setMessage(message, ACTIVEMQ_PARENT_APPLICATION_NAME, parentApplicationName); } public static String getParentApplicationName(Message message, String defaultValue) { return STRING_MESSAGE_HANDLER.getMessage(message, ACTIVEMQ_PARENT_APPLICATION_NAME, defaultValue); } public static void setParentApplicationType(Message message, Short parentApplicationType) throws JMSException { SHORT_MESSAGE_HANDLER.setMessage(message, ACTIVEMQ_PARENT_APPLICATION_TYPE, parentApplicationType); } public static Short getParentApplicationType(Message message, Short defaultValue) { return SHORT_MESSAGE_HANDLER.getMessage(message, ACTIVEMQ_PARENT_APPLICATION_TYPE, defaultValue); } }