private void ProcessLogRecord(LogSource logSource, UUID transactionId, LogAction action, String message){
		if(logSource == LogSource.Coordinator){
			switch(action){
			case Start2Pc: {
				DistributedTransaction dt = new DistributedTransaction(this, transactionId);
				dt.Status = TransactionStatus.Start2Pc;
				// message contains the list of participant nodes
				String[] splits = message.split(ParticipantsSeparator);
				for(String id:splits){
					Integer nodeId = Integer.parseInt(id);
					dt.ParticipantNodes.put(nodeId, new ParticipantNodeState(nodeId));
				}
				_coordinatedTransactions.put(transactionId, dt);					
			}
				break;
				
			case Commit: 
				_coordinatedTransactions.get(transactionId).Status = TransactionStatus.Commited;
				break;
			case Abort: 
				_coordinatedTransactions.get(transactionId).Status = TransactionStatus.Aborted;
				break;
			default:
				// TODO handle error when dealing with unknown action
				break;
			}
		} else { // logSource == LogSource.Participant
			switch(action){
			case Enlist:{
				DistributedTransaction dt = new DistributedTransaction(this, transactionId);
				dt.Status = TransactionStatus.Created;
				dt.CoordinatorAddr = Integer.parseInt(message);
				_participantTransactions.put(transactionId, dt);	
				break;
			}
			case VoteYes: 
				_participantTransactions.get(transactionId).Status = TransactionStatus.VotedYes;
				break;
			case Abort: 
				_participantTransactions.get(transactionId).Status = TransactionStatus.Aborted;
				break;
			case Commit:
				_participantTransactions.get(transactionId).Status = TransactionStatus.Commited;
				break;
			default:
				break;
			}
		}
	}