| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You 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.apache.rocketmq.ons.open.trace.core.hook; |
| |
| import java.lang.reflect.Field; |
| import java.util.SortedMap; |
| import java.util.TreeMap; |
| import java.util.concurrent.ConcurrentHashMap; |
| |
| import org.apache.rocketmq.remoting.CommandCustomHeader; |
| import org.apache.rocketmq.remoting.RPCHook; |
| import org.apache.rocketmq.remoting.protocol.RemotingCommand; |
| |
| import static org.apache.rocketmq.ons.api.impl.authority.SessionCredentials.AccessKey; |
| import static org.apache.rocketmq.ons.api.impl.authority.SessionCredentials.ONSChannelKey; |
| |
| public abstract class AbstractRPCHook implements RPCHook { |
| protected ConcurrentHashMap<Class<? extends CommandCustomHeader>, Field[]> fieldCache = |
| new ConcurrentHashMap<Class<? extends CommandCustomHeader>, Field[]>(); |
| |
| |
| protected SortedMap<String, String> parseRequestContent(RemotingCommand request, String ak, String onsChannel) { |
| CommandCustomHeader header = request.readCustomHeader(); |
| // sort property |
| SortedMap<String, String> map = new TreeMap<String, String>(); |
| map.put(AccessKey, ak); |
| map.put(ONSChannelKey, onsChannel); |
| try { |
| // add header properties |
| if (null != header) { |
| Field[] fields = fieldCache.get(header.getClass()); |
| if (null == fields) { |
| fields = header.getClass().getDeclaredFields(); |
| for (Field field : fields) { |
| field.setAccessible(true); |
| } |
| Field[] tmp = fieldCache.putIfAbsent(header.getClass(), fields); |
| if (null != tmp) { |
| fields = tmp; |
| } |
| } |
| |
| for (Field field : fields) { |
| Object value = field.get(header); |
| if (null != value && !field.isSynthetic()) { |
| map.put(field.getName(), value.toString()); |
| } |
| } |
| } |
| return map; |
| } |
| catch (Exception e) { |
| throw new RuntimeException("incompatible exception.", e); |
| } |
| } |
| |
| } |