Difference between revisions of "Solução: Problema da memória transacional (Diogo Maron)"
From AdonaiMedrado.Pro.Br
Line 1: | Line 1: | ||
+ | <code lang="java"> | ||
package console; | package console; | ||
Line 23: | Line 24: | ||
} | } | ||
− | |||
package memoriatransacional; | package memoriatransacional; |
Latest revision as of 13:33, 3 June 2009
package console; import java.util.Scanner; import memoriatransacional.MemoriaTransacional; public class Main { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here Scanner loScanner = new Scanner(System.in); String lsEntrada = loScanner.nextLine(); MemoriaTransacional loMemoria = new MemoriaTransacional(); String[] loSaida = loMemoria.ExecutarEscrita(lsEntrada.split(" ")); for (int i = 0; i < loSaida.length; i++){ String lsLetra = new String(); lsLetra +=(char)((int)'A' + i); System.out.println(lsLetra + "=" + loSaida[i]); } } } package memoriatransacional; public class MemoriaTransacional { private int TAMANHO_MEMORIA = 26; private String[] ioMemoria = new String[TAMANHO_MEMORIA]; private Transaction ioTransaction; public MemoriaTransacional() { this.Reset(); } public String[] ExecutarEscrita(String[] aoEscritas){ for (int i = 0; i<aoEscritas.length; i++){ if (aoEscritas[i].contains("=")) this.ExecutarEscrita(aoEscritas[i]); else { this.ExecutarTransaction(aoEscritas[i]); } } return ioMemoria; } public void ExecutarEscrita(String asEscrita){ if (this.IsInTransaction()) this.ioTransaction.AddEscrita((asEscrita)); else this.Escrever(asEscrita); } private void Escrever(String asEscrita){ String[] loValores = asEscrita.split("="); int liPosicao = (int)loValores[0].charAt(0) - (int)'A'; this.ioMemoria[liPosicao] = loValores[1]; } private void ExecutarTransaction(String asComando){ if (asComando.equals("B")) this.BeginTransaction(); else if (asComando.equals("C")) this.CommitTransaction(); else if (asComando.equals("R")) this.RollBackTransaction(); } private void BeginTransaction() { if (this.IsInTransaction()){ this.ioTransaction.Begin(); } else this.ioTransaction = new Transaction(); } private void CommitTransaction(){ if (this.ioTransaction.Commit()) { for (String loString : this.ioTransaction.GetEscritas()) this.Escrever(loString); this.ioTransaction=null; } } private void RollBackTransaction(){ if (this.ioTransaction.RollBack()) { this.ioTransaction=null; } } private Boolean IsInTransaction(){ return (this.ioTransaction != null); } public void Reset(){ for (int i =0; i < TAMANHO_MEMORIA; i++) this.ioMemoria[i] = ""; } } package memoriatransacional; import java.util.ArrayList; public class Transaction { private ArrayList<String> ioEscritas = new ArrayList<String>(); private Transaction ioInner; private Boolean ibOpen = true; public void AddEscrita(String asEscrita){ if (this.HasInner()) this.ioInner.AddEscrita(asEscrita); else this.ioEscritas.add(asEscrita); } public ArrayList<String> GetEscritas(){ return this.ioEscritas; } private Boolean HasInner(){ return (this.ioInner != null); } public void Begin(){ if (this.HasInner()) { this.ioInner.Begin(); } else { this.ioInner = new Transaction(); } } public Boolean Commit(){ if (this.HasInner()){ if (this.ioInner.Commit()){ ArrayList<String> loEscritasInner = this.ioInner.GetEscritas(); this.ioInner = null; for (String lsEscrita : loEscritasInner) this.AddEscrita(lsEscrita); } } else { this.ibOpen = false; } return !this.ibOpen; } public Boolean RollBack() { if (!this.HasInner()) { this.ibOpen = false; } else { if (this.ioInner.RollBack()) this.ioInner = null; } return !this.ibOpen; } }