Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
- package servidorpersistencia;
- import java.io.BufferedReader;
- import java.io.BufferedWriter;
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileReader;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.net.DatagramPacket;
- import java.net.InetAddress;
- import java.net.MulticastSocket;
- import java.net.SocketTimeoutException;
- import java.nio.charset.Charset;
- import java.nio.file.Files;
- import java.nio.file.Paths;
- import java.nio.file.StandardOpenOption;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.List;
- import java.util.Random;
- import java.util.Scanner;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- import sun.nio.cs.StandardCharsets;
- /**
- *
- * @author giovanne.gaspareto
- */
- public class ServidorPersistencia {
- static InetAddress grupo;
- static MulticastSocket s;
- static DatagramPacket msg;
- static DatagramPacket recv;
- private static Scanner keyboard;
- static final String GROUP_IP = "224.0.0.1";
- static final int MULTICAST_PORT = 2000;
- static int IDProcesso = 0;
- static String mensagem = "";
- static int numeroProcessosGrupo = 0;
- static int tempoRandom = 0;
- static int idProcessoNaRegiaoCritica = 0;
- static int idRecebido = 0;
- static int proximo = 0;
- //VARIAVEIS Para leitura de arquivo
- static File baseDados;
- static int contadorInsercoes;
- static final String DIVISOR_STRING_BD = "//";
- static String[] partesBD;
- static char indiceBD;
- static String mensagemBD;
- static String prefixoBD;
- static boolean idEncontradoBD;
- static int idCliente;
- static String mensagemCliente;
- static String tipoRequisicao = "";
- static int idDestino;
- static int k = 0;
- static boolean escolhaBusca = false;
- static int idBuscaCliente = 0;
- //Constantes leitura de arquivo
- static final String ERRO_ID_NAO_EXISTE = "Erro, ID nao registrado na base de dados";
- //Variaveis para controle da area critica
- static List<Integer> listaEsperaRegiaoCritica = new ArrayList<Integer>(); //lista com IDs dos processos aguardando pela regiao critica
- static boolean executarProcesso = true;
- static boolean aguardaPermissaoRegiaoCritica = false;
- static boolean regiaoCritica = false;
- static boolean aguardarResposta = false;
- // Constantes para comunicacao de processos
- static final String OK_STRING = "ok";
- static final String DESCONECTAR_STRING = "q";
- static final String DIVISOR_STRING = ";";
- static final String GRUPO_COMPLETO_STRING = "gc";
- static final String EXISTE_PROCESSO_REGIAO_CRITICA = "regiao critica";
- static final String REQUISICAO_REG_CRITICA_STRING = "rc";
- static final String SAINDO_REGIAO_CRITICA_STRING = "sc";
- static final String ENTROU_REGIAO_CRITICA_STRING = "ec";
- static final String CLIENTE_M= "M";
- static final String BUSCA = "b";
- static final String INSERCAO = "i";
- static final String VERIFICA_MEMBROS_VIVOS = "ver";
- static final String RESPOSTA = "resposta";
- static final int NOVO_MEMBRO = 1;
- static final int GRUPO_COMPLETO = 2;
- static final int REQUISICAO_REG_CRITICA = 3;
- static final int SAINDO_REGIAO_CRITICA = 4;
- static final int ENTROU_REGIAO_CRITICA = 5;
- static final int REQUISICAO_CLIENTE = 6;
- static final int REQUISICAO_INSERCAO_CLIENTE = 7;
- static final int REQUISICAO_BUSCA_CLIENTE = 8;
- static final int VERIFICACAO_MEMBROS = 9;
- static final int TIMEOUT = 2;
- public static void lerArquivo(){
- String linhaAtual;
- FileReader fr;
- try {
- fr = new FileReader(baseDados);
- BufferedReader reader = new BufferedReader(fr);
- partesBD = new String[2];
- while((linhaAtual = reader.readLine())!= null){
- partesBD = linhaAtual.split(DIVISOR_STRING_BD);
- prefixoBD = partesBD[0];
- indiceBD = prefixoBD.charAt(1);
- mensagemBD = partesBD[1];
- System.out.println("Prefixo lido: " + prefixoBD + " com indice: " + indiceBD + " Mensagem: " + mensagemBD);
- }
- reader.close();
- } catch (IOException ex) {
- Logger.getLogger(ServidorPersistencia.class.getName()).log(Level.SEVERE, null, ex);
- }
- }
- public static void escreveArquivo(String texto){
- contadorInsercoes++;
- String aux = "M"+contadorInsercoes+ DIVISOR_STRING_BD + texto;
- texto = aux;
- BufferedWriter writer = null;
- try {
- //Criando arquivo no diretorio do projeto
- // Imprime o diretorio do arquivo criado
- System.out.println(baseDados.getCanonicalPath());
- //Escreve no arquivo
- writer = new BufferedWriter(new FileWriter(baseDados,true)); //true=adiciona ao fim do arquivo
- writer.write(texto);
- writer.newLine();
- } catch (IOException e) {
- } finally {
- try {
- // Close the writer regardless of what happens...
- writer.close();
- } catch (IOException e) {
- }
- }
- }
- public static void inserir(String texto, int k){
- //contadorInsercoes++;
- String aux = k + DIVISOR_STRING + "M"+ idCliente + DIVISOR_STRING_BD + texto;
- texto = aux;
- BufferedWriter writer = null;
- try {
- //Criando arquivo no diretorio do projeto
- // Imprime o diretorio do arquivo criado
- // System.out.println(baseDados.getCanonicalPath());
- //Escreve no arquivo
- writer = new BufferedWriter(new FileWriter(baseDados,true)); //true=adiciona ao fim do arquivo
- writer.write(texto);
- writer.newLine();
- } catch (IOException e) {
- } finally {
- try {
- // Close the writer regardless of what happens...
- writer.close();
- } catch (IOException e) {
- }
- }
- }
- public static String buscaBD(int indiceBusca){
- String linhaAtual;
- FileReader fr;
- try {
- idEncontradoBD = false;
- fr = new FileReader(baseDados);
- BufferedReader reader = new BufferedReader(fr);
- partesBD = new String[2];
- String[] linhaInteira = new String[2];
- while((linhaAtual = reader.readLine())!= null && !idEncontradoBD ){
- linhaInteira = linhaAtual.split(DIVISOR_STRING);
- indiceBD = linhaInteira[0].charAt(0);
- partesBD = linhaInteira[1].split(DIVISOR_STRING_BD);
- prefixoBD = partesBD[0];
- //indiceBD = prefixoBD.charAt(1);
- if(indiceBusca == Character.getNumericValue(indiceBD))
- { //encontrou id fornecido, salva mensagem
- mensagemBD = partesBD[1];
- idEncontradoBD = true;
- }
- else{
- mensagemBD = ERRO_ID_NAO_EXISTE;
- }
- // mensagemBD = partesBD[1];
- //System.out.println("Prefixo lido: " + prefixoBD + " com indice: " + indiceBD + " Mensagem: " + mensagemBD);
- }
- reader.close();
- } catch (IOException ex) {
- Logger.getLogger(ServidorPersistencia.class.getName()).log(Level.SEVERE, null, ex);
- }
- return mensagemBD;
- }
- public static String receiveMessageGroup(){
- byte[] buf=new byte[1000];
- recv=new DatagramPacket(buf, buf.length);
- try {
- s.setSoTimeout(10);
- s.setLoopbackMode(false);
- // System.out.println("timeout no recevei sem nada: " + s.getSoTimeout());
- s.receive(recv);
- byte[] dest=new byte[recv.getLength()];
- System.arraycopy(recv.getData(), 0, dest, 0, dest.length);
- String mensagemRecebida = new String(recv.getData(),recv.getOffset(),recv.getLength());
- System.err.println("Mensagen recebida: "+ mensagemRecebida);
- return mensagemRecebida;
- } catch (SocketTimeoutException ex) {
- // Logger.getLogger(ProcessoSender.class.getName()).log(Level.SEVERE, null, ex);
- return "x;0;0";
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- return "x;0;0";
- }
- }
- public static void sendMessageGroup(String msgStr) {
- msg=new DatagramPacket(msgStr.getBytes(), msgStr.length(),grupo, 2000);
- // System.out.println("Enviando mensagem para o grupo ...");
- try {
- s.send(msg);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- public static int geraRandomEntre(int min, int max){
- Random rn = new Random();
- return rn.nextInt(max-min+1)+min;
- }
- public static void defineIDProcesso(){
- keyboard = new Scanner(System.in);
- System.out.println("Informe o ID deste processo: ");
- IDProcesso = keyboard.nextInt();
- }
- public static void setUp(){
- baseDados = new File(".//","baseDados.txt");
- try {
- //System.setProperty("java.net.preferIPv4Stack", "true"); // somente pra mac no wifi
- grupo=InetAddress.getByName(GROUP_IP);
- s=new MulticastSocket(MULTICAST_PORT);
- System.err.println("Entrando no grupo ...");
- s.joinGroup(grupo);
- System.err.println("Ok.");
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- public static int trataMensagem(String mensagemRecebida, DatagramPacket PacketLider){
- String[] partes = mensagemRecebida.split(DIVISOR_STRING);
- String operacao = partes[0];
- String mensagem = partes[1];
- idRecebido = Integer.parseInt(mensagem);
- if(operacao.equals(VERIFICA_MEMBROS_VIVOS)){
- idRecebido = Integer.parseInt(mensagem);
- return VERIFICACAO_MEMBROS;
- }else if(operacao.equals(CLIENTE_M)){
- idCliente = Integer.parseInt(mensagem);
- idRecebido = Integer.parseInt(mensagem);
- tipoRequisicao = partes[2];
- if(tipoRequisicao.equals(BUSCA) && (idRecebido == IDProcesso)){
- escolhaBusca = true;
- idBuscaCliente = Integer.parseInt(partes[3]);
- return REQUISICAO_BUSCA_CLIENTE;
- }
- else if (tipoRequisicao.equals(INSERCAO)&& (idRecebido == IDProcesso)){
- escolhaBusca = false;
- mensagemCliente = partes[3];
- return REQUISICAO_INSERCAO_CLIENTE;
- }
- }else if(operacao.equals(OK_STRING)){
- idRecebido = Integer.parseInt(mensagem);
- idDestino = Integer.parseInt(partes[2]);
- if(idRecebido != IDProcesso && ((idDestino == IDProcesso) || (idDestino == 0))){
- return NOVO_MEMBRO;
- }
- }
- else if(operacao.equals(GRUPO_COMPLETO_STRING)){
- return GRUPO_COMPLETO;
- }else if(operacao.equals(REQUISICAO_REG_CRITICA_STRING)){
- return REQUISICAO_REG_CRITICA;
- }else if(operacao.equals(SAINDO_REGIAO_CRITICA_STRING)){
- idProcessoNaRegiaoCritica = 0;
- return SAINDO_REGIAO_CRITICA;
- }else if(operacao.equals(ENTROU_REGIAO_CRITICA_STRING)){
- idProcessoNaRegiaoCritica = Integer.parseInt(mensagem);
- return ENTROU_REGIAO_CRITICA;
- }
- return -1;
- }
- public static void lerGrupoTrataMensagem(){
- switch(trataMensagem(receiveMessageGroup(),recv)){//só cria timer apos estar de fato atuando na regiao critica, so acontecera quando receber um ok que o processo anterior liberou ela
- //ler mensagens ate receber ok que a regiao critica esta livre
- case REQUISICAO_REG_CRITICA:
- //Recebeu uma requisicao de regiao critica, todos atualizam a lista de espera
- listaEsperaRegiaoCritica.add(idRecebido);
- proximo = listaEsperaRegiaoCritica.get(0);
- if(proximo == IDProcesso && idProcessoNaRegiaoCritica == 0){ //é o primeiro da fila e nao ha nenhum processo na regiao critica
- aguardaPermissaoRegiaoCritica = false;
- regiaoCritica = true;
- }
- break;
- case SAINDO_REGIAO_CRITICA:
- //verificar se seu proprio ID é o proximo a entrar na regiao critica, se for, envia que entrou e inicia timer, senao salva o id de quem entrou
- proximo = listaEsperaRegiaoCritica.get(0);
- System.out.println("[Processo "+ IDProcesso + "] Proximo da lista: " + proximo);
- if(proximo == IDProcesso){
- aguardaPermissaoRegiaoCritica = false; //este processo é o proximo da fila, sai do loop de espera espera
- //sendMessageGroup(ENTROU_REGIAO_CRITICA_STRING + DIVISOR_STRING + IDProcesso); //avisa outros processos que esta entrando
- regiaoCritica = true;
- }
- break;
- case ENTROU_REGIAO_CRITICA:
- //se idProcesso = idProcessoNaRegiaoCritica, significa que pode entrar. aguardaPermissaoRegiaoCritica = false, regiaoCritica = true
- // remove ID do processo que entrou da lista de espera
- listaEsperaRegiaoCritica.remove(0);
- break;
- case VERIFICACAO_MEMBROS:
- mensagem = OK_STRING+DIVISOR_STRING+IDProcesso+DIVISOR_STRING + idRecebido;
- sendMessageGroup(mensagem);
- break;
- }
- }
- public static void lerGrupoRegiaoNaoCritica(){
- switch(trataMensagem(receiveMessageGroup(),recv)){//só cria timer apos estar de fato atuando na regiao critica, so acontecera quando receber um ok que o processo anterior liberou ela
- //ler mensagens ate receber ok que a regiao critica esta livre
- case REQUISICAO_REG_CRITICA:
- //Recebeu uma requisicao de regiao critica, todos atualizam a lista de espera
- listaEsperaRegiaoCritica.add(idRecebido);
- break;
- case ENTROU_REGIAO_CRITICA:
- //se idProcesso = idProcessoNaRegiaoCritica, significa que pode entrar. aguardaPermissaoRegiaoCritica = false, regiaoCritica = true
- // remove ID do processo que entrou da lista de espera
- // if(IDProcesso != idRecebido){ //somente se for outro processo lendo que alguem entrou. Se for o proprio processo, ele ja se removeu da lista ao avaliar que era o proximo
- listaEsperaRegiaoCritica.remove(0);
- break;
- case REQUISICAO_INSERCAO_CLIENTE:
- aguardaPermissaoRegiaoCritica = true;
- break;
- case REQUISICAO_BUSCA_CLIENTE:
- aguardaPermissaoRegiaoCritica = true;
- break;
- case VERIFICACAO_MEMBROS:
- mensagem = OK_STRING+DIVISOR_STRING+IDProcesso+DIVISOR_STRING + idRecebido;
- sendMessageGroup(mensagem);
- break;
- default:
- break;
- }
- }
- public static void aguardaMembrosDoGrupo(){
- numeroProcessosGrupo = 1;
- while(numeroProcessosGrupo<3){
- switch(trataMensagem(receiveMessageGroup(),recv)){
- case NOVO_MEMBRO:
- numeroProcessosGrupo ++;
- System.out.println("Novo processo Conectado ao Grupo!");
- break;
- case GRUPO_COMPLETO:
- numeroProcessosGrupo = 3;
- break;
- case VERIFICACAO_MEMBROS:
- mensagem = OK_STRING+DIVISOR_STRING+IDProcesso+DIVISOR_STRING + idRecebido;
- sendMessageGroup(mensagem);
- break;
- default:
- // System.out.println("Case Default da espera grupo");
- break;
- }
- }
- sendMessageGroup(GRUPO_COMPLETO_STRING+DIVISOR_STRING+IDProcesso);
- }
- public static void testaBuscaID(){
- for(int i=0;i<4;i++){
- escreveArquivo("texto qualquer " + i);
- }
- System.out.println(buscaBD(1));
- }
- public static boolean todosProcessosVivos(){
- aguardarResposta = true;
- TimerProcessos timeoutResposta = new TimerProcessos(TIMEOUT);
- sendMessageGroup(VERIFICA_MEMBROS_VIVOS+DIVISOR_STRING+IDProcesso);
- numeroProcessosGrupo = 1;
- while(aguardarResposta && !timeoutResposta.shouldCreate){
- switch(trataMensagem(receiveMessageGroup(),recv)){
- case NOVO_MEMBRO:
- numeroProcessosGrupo ++;
- System.out.println(numeroProcessosGrupo);
- if(numeroProcessosGrupo>=2){
- aguardarResposta = false;
- System.out.println("Todos vivos!");
- }
- break;
- case GRUPO_COMPLETO:
- numeroProcessosGrupo = 3;
- break;
- default:
- // System.out.println("Case Default da espera grupo");
- break;
- }
- }
- timeoutResposta.cancelTimer();
- return !aguardarResposta;
- }
- /**
- * @param args the command line arguments
- */
- public static void main(String[] args) {
- setUp();
- defineIDProcesso();
- sendMessageGroup(OK_STRING+DIVISOR_STRING+IDProcesso + DIVISOR_STRING + 0);
- aguardaMembrosDoGrupo();
- System.out.println("Grupo completo! Iniciar execucao.");
- aguardaPermissaoRegiaoCritica = false;
- while(executarProcesso){
- //Se receber requisicao de busca ou insercao -> aguardaPermissaoRegiaoCritica = true;
- if(aguardaPermissaoRegiaoCritica){
- //fazer coisas da regiao critica
- System.out.println("[Processo " + IDProcesso + "] Aguardando entrada na regiao critica!");
- //Notifica a todos que deseja estar na regiao critica
- sendMessageGroup(REQUISICAO_REG_CRITICA_STRING + DIVISOR_STRING + IDProcesso);
- while(aguardaPermissaoRegiaoCritica){
- lerGrupoTrataMensagem();
- }
- sendMessageGroup(ENTROU_REGIAO_CRITICA_STRING + DIVISOR_STRING + IDProcesso); //avisa outros processos que esta entrando na regiao critica
- //Iniciar timer da regiao critica
- regiaoCritica = true;
- while(regiaoCritica){
- //verifica timer, muda regiaoCritica para false apos fim do timer
- aguardarResposta = true;
- TimerProcessos timeoutResposta = new TimerProcessos(TIMEOUT);
- while(aguardarResposta && !timeoutResposta.shouldCreate)
- { if(escolhaBusca)
- {
- mensagem = buscaBD(idBuscaCliente);
- }
- else{
- k++;
- inserir(mensagemCliente,k);
- mensagem = "Sucesso";
- }
- sendMessageGroup(RESPOSTA+DIVISOR_STRING+idCliente+DIVISOR_STRING+mensagem);
- aguardarResposta = false;
- regiaoCritica = false;
- //lerGrupoTrataMensagem();
- }
- //Ainda ler grupo, para atualizar lista de espera
- }
- System.err.println("[Processo " + IDProcesso + "]Fim da regiao critica!");
- sendMessageGroup(SAINDO_REGIAO_CRITICA_STRING + DIVISOR_STRING + IDProcesso); //notifica que saiu da regiao critica
- System.out.println("[Processo " + IDProcesso + "] Executando na regiao nao critica");
- }else{
- //fazer coisas da regiao nao critica
- //Ler grupo para atualizar controle de quem esta na regiao critica e atualizar a lista de espera
- lerGrupoRegiaoNaoCritica();
- if(aguardaPermissaoRegiaoCritica){
- //se veio requisicao de adicionar texto, precisa verificar se os 3 processos estao vivos
- if(todosProcessosVivos()){
- aguardaPermissaoRegiaoCritica =true;
- System.out.println("Todos processos vivos! Pode requisitar entrar na regiao critica");
- }else{
- aguardaPermissaoRegiaoCritica = false; // envia mensagem de erro
- System.out.println("Algum processo nao esta presente!");
- }
- }
- }
- }
- }
- }
Add Comment
Please, Sign In to add comment