/*
* 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.protocol.rsf;
import io.netty.channel.ChannelHandler;
import net.hasor.core.AppContext;
import net.hasor.core.future.BasicFuture;
import net.hasor.rsf.InterAddress;
import net.hasor.rsf.RsfEnvironment;
import net.hasor.rsf.domain.OptionInfo;
import net.hasor.rsf.domain.ProtocolStatus;
import net.hasor.rsf.domain.ResponseInfo;
import net.hasor.rsf.protocol.rsf.v1.PoolBlock;
import net.hasor.rsf.rpc.net.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
/**
* RSF 解码器
* @version : 2014年10月10日
* @author 赵永春(zyc@hasor.net)
*/
public class RsfProtocolHandler implements ProtocolHandler {
protected Logger logger = LoggerFactory.getLogger(getClass());
@Override
public boolean acceptIn(final Connector connector, RsfChannel rsfChannel) throws Exception {
//
// .添加数据接收监听器,获取握手数据
final BasicFuture<Boolean> future = new BasicFuture<Boolean>();
rsfChannel.addListener(new ReceivedListener() {
@Override
public void receivedMessage(RsfChannel rsfChannel, OptionInfo info) throws IOException {
if (future.isDone()) {
return;
}
//
if (info instanceof ResponseInfo) {
ResponseInfo response = (ResponseInfo) info;
String serverInfo = response.getOption("SERVER_INFO");
try {
if (LinkType.In == rsfChannel.getLinkType()) {
connector.mappingTo(rsfChannel, new InterAddress(serverInfo));
}
} catch (Exception e) { /**/ }
future.completed(true);
logger.info("handshake -> ready for {}", serverInfo);
}
}
});
//
// .发送RSF实例信息
InterAddress interAddress = connector.getGatewayAddress();
if (interAddress == null) {
interAddress = connector.getBindAddress();
}
InterAddress publishAddress = interAddress;
ResponseInfo options = new ResponseInfo();
options.setRequestID(-1);
options.setStatus(ProtocolStatus.OK);
options.addOption("SERVER_INFO", publishAddress.toHostSchema());
rsfChannel.sendData(options, null);
//
return rsfChannel.activeIn();
}
@Override
public ChannelHandler[] channelHandler(Connector connector, AppContext appContext) {
RsfEnvironment env = appContext.getInstance(RsfEnvironment.class);
RsfDuplexHandler duplexHandler = new RsfDuplexHandler( //
new RsfDecoder(env, PoolBlock.DataMaxSize), //
new RsfEncoder(env) //
);
return new ChannelHandler[] { //
duplexHandler //
};
}
}