package com.github.zangxiaoqiang.dfc.server;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.Socket;
import com.github.zangxiaoqiang.common.conf.ConfigurationManager;
import com.github.zangxiaoqiang.common.conf.GitConfiguration;
import com.github.zangxiaoqiang.dfc.HashAlgorithm;
import com.github.zangxiaoqiang.dfc.locator.CommonNodeLocator;
import com.github.zangxiaoqiang.dfc.protocol.DataTransferProtocol;
import com.github.zangxiaoqiang.dfc.protocol.Op;
import com.github.zangxiaoqiang.dfc.utils.IOUtils;
import com.github.zangxiaoqiang.dfc.utils.NetUtils;
import com.github.zangxiaoqiang.io.Handler;
public class DataXceiver extends DataTransferProtocol.Receiver implements Handler {
static GitConfiguration conf = ConfigurationManager.getDefaultConfig();
private static final String DEFAULT_DATA_DIR = "/spare/dfc/dn/";
private static final String DATA_DIR = conf.getValue("datanode.data.dir", DEFAULT_DATA_DIR);
Socket clientSocket;
DataInputStream in;
DataOutputStream out;
public DataXceiver(Socket clientSocket) {
this.clientSocket = clientSocket;
}
@Override
public void run() {
in = new DataInputStream(NetUtils.getInputStream(clientSocket));
out = new DataOutputStream(NetUtils.getOutputStream(clientSocket));
try {
Op op = readOp(in);
processOp(op, in);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
protected void opReadBlock(DataInputStream in, long blockId, long blockGs,
long offset, long length, String client) throws IOException {
// TODO Auto-generated method stub
}
@Override
protected void opReadFile(DataInputStream in) {
try {
int filePathLength = in.read();
byte[] filePathBuf = new byte[filePathLength];
in.read(filePathBuf, 0 , filePathLength);
String filePath = new String(filePathBuf);
File file = new File(filePath);
FileInputStream fin = new FileInputStream(file);
IOUtils.copyBytes(fin, out, 1024, true);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
protected void opWriteFile(DataInputStream in) {
try {
int filePathLength = in.read();
byte[] filePathBuf = new byte[filePathLength];
in.read(filePathBuf, 0 , filePathLength);
String filePath = new String(filePathBuf);
long fileHashcode = CommonNodeLocator.getPathHash(HashAlgorithm.KETAMA_HASH, filePath);
File file = new File(filePath);
if(file.exists()){
return;
}
if(!file.getParentFile().exists()){
file.getParentFile().mkdir();
}
file.createNewFile();
IOUtils.copyBytes(in, new FileOutputStream(file), 1024, true);
} catch (IOException e) {
e.printStackTrace();
}
}
}