/*
* 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.thrift.io;
import com.navercorp.pinpoint.thrift.dto.command.*;
import org.apache.thrift.TBase;
import com.navercorp.pinpoint.thrift.dto.TResult;
/**
* @author koo.taejin
*/
public enum TCommandType {
// Using reflection would make code cleaner.
// But it also makes it hard to handle exception, constructor and will show relatively low performance.
RESULT((short) 320, TResult.class) {
@Override
public TBase newObject() {
return new TResult();
}
},
TRANSFER((short) 700, TCommandTransfer.class) {
@Override
public TBase newObject() {
return new TCommandTransfer();
}
},
TRANSFER_RESPONSE((short) 701, TCommandTransferResponse.class) {
@Override
public TBase newObject() {
return new TCommandTransferResponse();
}
},
ECHO((short) 710, TCommandEcho.class) {
@Override
public TBase newObject() {
return new TCommandEcho();
}
},
THREAD_DUMP((short) 720, TCommandThreadDump.class) {
@Override
public TBase newObject() {
return new TCommandThreadDump();
}
},
THREAD_DUMP_RESPONSE((short) 721, TCommandThreadDumpResponse.class) {
@Override
public TBase newObject() {
return new TCommandThreadDumpResponse();
}
},
ACTIVE_THREAD_COUNT((short) 730, TCmdActiveThreadCount.class) {
@Override
public TBase newObject() {
return new TCmdActiveThreadCount();
}
},
ACTIVE_THREAD_COUNT_RESPONSE((short) 731, TCmdActiveThreadCountRes.class) {
@Override
public TBase newObject() {
return new TCmdActiveThreadCountRes();
}
},
ACTIVE_THREAD_DUMP((short) 740, TCmdActiveThreadDump.class) {
@Override
public TBase newObject() {
return new TCmdActiveThreadDump();
}
},
ACTIVE_THREAD_DUMP_RESPONSE((short) 741, TCmdActiveThreadDumpRes.class) {
@Override
public TBase newObject() {
return new TCmdActiveThreadDumpRes();
}
},
ACTIVE_THREAD_LIGHT_DUMP((short) 750, TCmdActiveThreadLightDump.class) {
@Override
public TBase newObject() {
return new TCmdActiveThreadLightDump();
}
},
ACTIVE_THREAD_LIGHT_DUMP_RESPONSE((short) 751, TCmdActiveThreadLightDumpRes.class) {
@Override
public TBase newObject() {
return new TCmdActiveThreadLightDumpRes();
}
};
private final short code;
private final Class<? extends TBase> clazz;
private final Header header;
private TCommandType(short code, Class<? extends TBase> clazz) {
this.code = code;
this.clazz = clazz;
this.header = createHeader(code);
}
public short getCode() {
return code;
}
public Class getClazz() {
return clazz;
}
protected boolean isInstanceOf(Object value) {
return this.clazz.isInstance(value);
}
protected Header getHeader() {
return header;
}
public abstract TBase newObject();
private static Header createHeader(short code) {
Header header = new Header();
header.setType(code);
return header;
}
public static TCommandType getType(Class<? extends TBase> clazz) {
TCommandType[] commandTypes = values();
for (TCommandType commandType : commandTypes) {
if (commandType.getClazz() == clazz) {
return commandType;
}
}
return null;
}
public static TCommandType getType(short code) {
TCommandType[] commandTypes = values();
for (TCommandType commandType : commandTypes) {
if (commandType.getCode() == code) {
return commandType;
}
}
return null;
}
}