/*
* Copyright 2008-2009 the original author or authors.
*
* 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 net.hasor.rsf.rpc.caller.remote;
import net.hasor.rsf.utils.StringUtils;
import net.hasor.rsf.InterAddress;
import net.hasor.rsf.RsfBindInfo;
import net.hasor.rsf.RsfContext;
import net.hasor.rsf.RsfRequest;
import net.hasor.rsf.domain.AttributeSet;
import net.hasor.rsf.domain.OptionKeys;
import net.hasor.rsf.domain.RequestInfo;
import java.lang.reflect.Method;
/**
* RSF请求(远程发起调用)
* @version : 2014年10月25日
* @author 赵永春(zyc@hasor.net)
*/
class RsfRequestFormRemote extends AttributeSet implements RsfRequest {
private final RequestInfo requestInfo;
private final InterAddress target;
private final RemoteRsfCaller rsfCaller;
private final RsfBindInfo<?> bindInfo;
private final Method targetMethod;
private final Class<?>[] parameterTypes;
private final Object[] parameterObjects;
//
public RsfRequestFormRemote(InterAddress target, RequestInfo requestInfo, RsfBindInfo<?> bindInfo, Method targetMethod, Object[] parameterObjects, RemoteRsfCaller rsfCaller) {
this.target = target;
this.requestInfo = requestInfo;
this.bindInfo = bindInfo;
this.targetMethod = targetMethod;
this.parameterTypes = targetMethod.getParameterTypes();
this.parameterObjects = parameterObjects;
this.rsfCaller = rsfCaller;
}
@Override
public String toString() {
return "requestID:" + this.getRequestID() + " from Remote," + this.bindInfo.toString();
}
@Override
public boolean isLocal() {
return false;
}
@Override
public boolean isP2PCalls() {
return StringUtils.isNotBlank(this.requestInfo.getOption(OptionKeys.TargetAddress));
}
@Override
public boolean isMessage() {
return this.requestInfo.isMessage();
}
@Override
public Method getMethod() {
return this.targetMethod;
}
@Override
public Class<?>[] getParameterTypes() {
return this.parameterTypes.clone();
}
@Override
public Object[] getParameterObject() {
return this.parameterObjects.clone();
}
@Override
public RsfContext getContext() {
return this.rsfCaller.getContext();
}
@Override
public RsfBindInfo<?> getBindInfo() {
return this.bindInfo;
}
@Override
public long getRequestID() {
return this.requestInfo.getRequestID();
}
@Override
public String getSerializeType() {
return this.requestInfo.getSerializeType();
}
@Override
public long getReceiveTime() {
return this.requestInfo.getReceiveTime();
}
@Override
public int getTimeout() {
int timeOut1 = requestInfo.getClientTimeout();
int timeOut2 = this.bindInfo.getClientTimeout();
return timeOut1 < timeOut2 ? timeOut1 : timeOut2;
}
@Override
public String[] getOptionKeys() {
return this.requestInfo.getOptionKeys();
}
@Override
public String getOption(String key) {
return this.requestInfo.getOption(key);
}
@Override
public void addOption(String key, String value) {
this.requestInfo.addOption(key, value);
}
@Override
public void removeOption(String key) {
this.requestInfo.removeOption(key);
}
@Override
public InterAddress getRemoteAddress() {
return this.target;
}
@Override
public InterAddress getTargetAddress() {
//根据远程来的请求协议,来从本地获取对应的地址端口
String protocol = this.target.getSechma();
return this.rsfCaller.getContext().bindAddress(protocol);
}
}