/* * 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.profiler.receiver; import com.google.inject.Inject; import com.navercorp.pinpoint.rpc.MessageListener; import com.navercorp.pinpoint.rpc.PinpointSocket; import com.navercorp.pinpoint.rpc.packet.RequestPacket; import com.navercorp.pinpoint.rpc.packet.SendPacket; import com.navercorp.pinpoint.rpc.packet.stream.StreamClosePacket; import com.navercorp.pinpoint.rpc.packet.stream.StreamCode; import com.navercorp.pinpoint.rpc.packet.stream.StreamCreatePacket; import com.navercorp.pinpoint.rpc.stream.ServerStreamChannelContext; import com.navercorp.pinpoint.rpc.stream.ServerStreamChannelMessageListener; import com.navercorp.pinpoint.thrift.dto.TResult; import com.navercorp.pinpoint.thrift.util.SerializationUtils; import org.apache.thrift.TBase; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Set; /** * @author Taejin Koo */ public class CommandDispatcher implements MessageListener, ServerStreamChannelMessageListener { private final Logger logger = LoggerFactory.getLogger(this.getClass()); private final ProfilerCommandServiceLocator commandServiceLocator; @Inject public CommandDispatcher(ProfilerCommandServiceLocator commandServiceLocator) { if (commandServiceLocator == null) { throw new NullPointerException("commandServiceLocator may not be null"); } this.commandServiceLocator = commandServiceLocator; } @Override public void handleSend(SendPacket sendPacket, PinpointSocket pinpointSocket) { logger.info("handleSend packet:{}, remote:{}", sendPacket, pinpointSocket.getRemoteAddress()); } @Override public void handleRequest(RequestPacket requestPacket, PinpointSocket pinpointSocket) { logger.info("handleRequest packet:{}, remote:{}", requestPacket, pinpointSocket.getRemoteAddress()); final TBase<?, ?> request = SerializationUtils.deserialize(requestPacket.getPayload(), CommandSerializer.DESERIALIZER_FACTORY, null); logger.debug("handleRequest request:{}, remote:{}", request, pinpointSocket.getRemoteAddress()); TBase response; if (request == null) { final TResult tResult = new TResult(false); tResult.setMessage("Unsupported ServiceTypeInfo."); response = tResult; } else { final ProfilerRequestCommandService service = commandServiceLocator.getRequestService(request); if (service == null) { TResult tResult = new TResult(false); tResult.setMessage("Can't find suitable service(" + request + ")."); response = tResult; } else { response = service.requestCommandService(request); } } final byte[] payload = SerializationUtils.serialize(response, CommandSerializer.SERIALIZER_FACTORY, null); if (payload != null) { pinpointSocket.response(requestPacket, payload); } } @Override public StreamCode handleStreamCreate(ServerStreamChannelContext streamChannelContext, StreamCreatePacket packet) { logger.info("MessageReceived handleStreamCreate {} {}", packet, streamChannelContext); final TBase<?, ?> request = SerializationUtils.deserialize(packet.getPayload(), CommandSerializer.DESERIALIZER_FACTORY, null); if (request == null) { return StreamCode.TYPE_UNKNOWN; } final ProfilerStreamCommandService service = commandServiceLocator.getStreamService(request); if (service == null) { return StreamCode.TYPE_UNSUPPORT; } return service.streamCommandService(request, streamChannelContext); } @Override public void handleStreamClose(ServerStreamChannelContext streamChannelContext, StreamClosePacket packet) { } public Set<Short> getRegisteredCommandServiceCodes() { return commandServiceLocator.getCommandServiceCodes(); } }