/*
 *
 * 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.crail.namenode;

import org.apache.crail.rpc.RpcNameNodeService;
import org.apache.crail.rpc.RpcNameNodeState;
import org.apache.crail.rpc.RpcProtocol;
import org.apache.crail.rpc.RpcRequestMessage.CreateFileReq;
import org.apache.crail.rpc.RpcRequestMessage.DumpNameNodeReq;
import org.apache.crail.rpc.RpcRequestMessage.GetBlockReq;
import org.apache.crail.rpc.RpcRequestMessage.GetDataNodeReq;
import org.apache.crail.rpc.RpcRequestMessage.GetFileReq;
import org.apache.crail.rpc.RpcRequestMessage.GetLocationReq;
import org.apache.crail.rpc.RpcRequestMessage.PingNameNodeReq;
import org.apache.crail.rpc.RpcRequestMessage.RemoveDataNodeReq;
import org.apache.crail.rpc.RpcRequestMessage.RemoveFileReq;
import org.apache.crail.rpc.RpcRequestMessage.RenameFileReq;
import org.apache.crail.rpc.RpcRequestMessage.SetBlockReq;
import org.apache.crail.rpc.RpcRequestMessage.SetFileReq;
import org.apache.crail.rpc.RpcResponseMessage.CreateFileRes;
import org.apache.crail.rpc.RpcResponseMessage.DeleteFileRes;
import org.apache.crail.rpc.RpcResponseMessage.GetBlockRes;
import org.apache.crail.rpc.RpcResponseMessage.GetDataNodeRes;
import org.apache.crail.rpc.RpcResponseMessage.GetFileRes;
import org.apache.crail.rpc.RpcResponseMessage.GetLocationRes;
import org.apache.crail.rpc.RpcResponseMessage.PingNameNodeRes;
import org.apache.crail.rpc.RpcResponseMessage.RemoveDataNodeRes;
import org.apache.crail.rpc.RpcResponseMessage.RenameRes;
import org.apache.crail.rpc.RpcResponseMessage.VoidRes;

public class LogDispatcher implements RpcNameNodeService {
	private RpcNameNodeService service;
	private LogService logService;
	
	public LogDispatcher(RpcNameNodeService service) throws Exception{
		this.service = service;
		this.logService = new LogService();
		this.logService.replay(service);
	}

	@Override
	public short createFile(CreateFileReq request, CreateFileRes response,
			RpcNameNodeState errorState) throws Exception {
		LogRecord record = new LogRecord(request);
		record.setCommand(RpcProtocol.CMD_CREATE_FILE);
		logService.writeRecord(record);
		return service.createFile(request, response, errorState);
	}

	@Override
	public short getFile(GetFileReq request, GetFileRes response,
			RpcNameNodeState errorState) throws Exception {
		return service.getFile(request, response, errorState);
	}

	@Override
	public short setFile(SetFileReq request, VoidRes response,
			RpcNameNodeState errorState) throws Exception {
		LogRecord record = new LogRecord(request);
		record.setCommand(RpcProtocol.CMD_SET_FILE);
		logService.writeRecord(record);		
		return service.setFile(request, response, errorState);
	}

	@Override
	public short removeFile(RemoveFileReq request, DeleteFileRes response,
			RpcNameNodeState errorState) throws Exception {
		LogRecord record = new LogRecord(request);
		record.setCommand(RpcProtocol.CMD_REMOVE_FILE);
		logService.writeRecord(record);		
		return service.removeFile(request, response, errorState);
	}

	@Override
	public short renameFile(RenameFileReq request, RenameRes response,
			RpcNameNodeState errorState) throws Exception {
		LogRecord record = new LogRecord(request);
		record.setCommand(RpcProtocol.CMD_RENAME_FILE);
		logService.writeRecord(record);		
		return service.renameFile(request, response, errorState);
	}

	@Override
	public short getDataNode(GetDataNodeReq request, GetDataNodeRes response,
			RpcNameNodeState errorState) throws Exception {
		return service.getDataNode(request, response, errorState);
	}

	@Override
	public short setBlock(SetBlockReq request, VoidRes response,
			RpcNameNodeState errorState) throws Exception {
		LogRecord record = new LogRecord(request);
		record.setCommand(RpcProtocol.CMD_SET_BLOCK);
		logService.writeRecord(record);		
		return service.setBlock(request, response, errorState);
	}

	@Override
	public short getBlock(GetBlockReq request, GetBlockRes response,
			RpcNameNodeState errorState) throws Exception {
		LogRecord record = new LogRecord(request);
		record.setCommand(RpcProtocol.CMD_GET_BLOCK);
		logService.writeRecord(record);		
		return service.getBlock(request, response, errorState);
	}

	@Override
	public short getLocation(GetLocationReq request, GetLocationRes response,
			RpcNameNodeState errorState) throws Exception {
		return service.getLocation(request, response, errorState);
	}

	@Override
	public short dump(DumpNameNodeReq request, VoidRes response,
			RpcNameNodeState errorState) throws Exception {
		return service.dump(request, response, errorState);
	}

	@Override
	public short ping(PingNameNodeReq request, PingNameNodeRes response,
			RpcNameNodeState errorState) throws Exception {
		return service.ping(request, response, errorState);
	}

	@Override
	public short removeDataNode(RemoveDataNodeReq request, RemoveDataNodeRes response,
			RpcNameNodeState errorState) throws Exception {
		return service.removeDataNode(request, response, errorState);
	}

}
