Advertisement
Guest User

Untitled

a guest
Dec 8th, 2016
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.48 KB | None | 0 0
  1. package pt.ipleiria.estg.dei.contacts.model;
  2.  
  3. import java.util.LinkedList;
  4.  
  5. import pt.ipleiria.estg.dei.colecoes.ComparacaoLimite;
  6. import pt.ipleiria.estg.dei.colecoes.Iterador;
  7. import pt.ipleiria.estg.dei.colecoes.ListaSimplesCircularBaseLimite;
  8. import pt.ipleiria.estg.dei.colecoes.TabelaHashPorListas;
  9. import pt.ipleiria.estg.dei.colecoes.TabelaHashPorSondagem;
  10. import pt.ipleiria.estg.dei.colecoes.TabelaHashPorSondagemHashingDuplo;
  11. import pt.ipleiria.estg.dei.contacts.R;
  12. import pt.ipleiria.estg.dei.contacts.colections.Filtro;
  13. import pt.ipleiria.estg.dei.contacts.colections.ListaSimplesCircularBaseLimiteFiltravel;
  14. import pt.ipleiria.estg.dei.contacts.exceptions.EmailExistsException;
  15. import pt.ipleiria.estg.dei.contacts.exceptions.IdExistsException;
  16.  
  17. import static android.R.attr.order;
  18.  
  19.  
  20. public enum ContactManager {
  21.     INSTANCE;
  22.  
  23.     public enum OrderBy {
  24.         ID_ASC(CompareContactIdsByAscendingOrder.INSTANCE),
  25.         NAME_DESC(CompareContactNamesByDescendingOrder.INSTANCE);
  26.  
  27.         public final ComparacaoLimite<Contact> COMPARATOR;
  28.  
  29.         OrderBy(ComparacaoLimite<Contact> comparator) {
  30.             this.COMPARATOR = comparator;
  31.         }
  32.     }
  33.  
  34.  
  35.     private ListaSimplesCircularBaseLimiteFiltravel<Contact>[] contacts;
  36.  
  37.  
  38.     private TabelaHashPorListas<Long, Contact> HashContactsById;
  39.  
  40.     private TabelaHashPorSondagemHashingDuplo<String, Contact> HashSondagemDuplaContactsByEmail;
  41.  
  42.     private TabelaHashPorSondagemHashingDuplo<String, ListaSimplesCircularBaseLimite<Contact>> hashContactByDomain;
  43.  
  44.     ContactManager() {
  45.         contacts = new ListaSimplesCircularBaseLimiteFiltravel[OrderBy.values().length];
  46.  
  47.         for (OrderBy order : OrderBy.values()) {
  48.             contacts[order.ordinal()] =
  49.                     new ListaSimplesCircularBaseLimiteFiltravel<Contact>(order.COMPARATOR);
  50.         }
  51.  
  52.         HashContactsById = new TabelaHashPorListas<>(1000, HashingLongs.INSTANCE, CompareLongAsc.INSTANCE);
  53.  
  54.         HashSondagemDuplaContactsByEmail = new TabelaHashPorSondagemHashingDuplo<>(1000, HashingStrings.INSTANCE, new HashingIncrStrings(1000));
  55.  
  56.         hashContactByDomain = new TabelaHashPorSondagemHashingDuplo<>(1000, HashingStrings.INSTANCE, new HashingIncrStrings(1000));
  57.         addExampleContacts();
  58.     }
  59.  
  60.         public Iterador<Contact> getByDomain(String domain) {
  61.             ListaSimplesCircularBaseLimite<Contact> lista = hashContactByDomain.consultar(domain);
  62.  
  63.             if (lista != null) {
  64.                 return lista.iterador();
  65.             }
  66.             return new ListaSimplesCircularBaseLimite<>(CompareContactEmailsByAscendingOrder.INSTANCE).iterador();
  67.         }
  68.     private void addExampleContacts() {
  69.         add(new Contact(12345, "Carlos Urbano", 1973, "curbano@gmail.com"));
  70.         add(new Contact(65432, "Ana Silva", 1981, "asilva@hotmail.com"));
  71.         add(new Contact(56462, "Joaquim Correia", 2000, "jcorreia@gmail.com"));
  72.         add(new Contact(43526, "Anibal Pereira", 2000, "apereira@gmail.com"));
  73.         add(new Contact(21342, "Manuel José", 1973, "mjose@gmail.com"));
  74.         add(new Contact(67848, "Maria Joaquina", 2000, "mjoaquina@hotmail.com"));
  75.         add(new Contact(84753, "Daniela Alves", 1981, "dalves@gmail.com"));
  76.     }
  77.  
  78.     public void add(Contact c) {
  79.  
  80.         //Comparar ID inserido com uma já existente
  81.         final Contact iDexistente = getById(c.getId());
  82.  
  83.         final Contact emailExistente = getByEmail(c.getEmail());
  84.  
  85.  
  86.         if (iDexistente != null) {
  87.             throw new IdExistsException();
  88.         } else if (emailExistente != null) {
  89.             throw new EmailExistsException();
  90.         }
  91.  
  92.         for (OrderBy order : OrderBy.values()) {
  93.             contacts[order.ordinal()].inserir(c);
  94.         }
  95.         HashContactsById.inserir(c.getId(), c);
  96.         HashSondagemDuplaContactsByEmail.inserir(c.getEmail(), c);
  97.  
  98.         addToHashByDomain(c);
  99.     }
  100.  
  101.     private void addToHashByDomain(Contact c) {
  102.         ListaSimplesCircularBaseLimite<Contact> lista = hashContactByDomain.consultar(c.getEmailDomain());
  103.  
  104.         if (lista == null) {
  105.             lista = new ListaSimplesCircularBaseLimite<Contact>(CompareContactEmailsByAscendingOrder.INSTANCE);
  106.             hashContactByDomain.inserir(c.getEmailDomain(), lista);
  107.         }
  108.         lista.inserir(c);
  109.     }
  110.  
  111.     public void remove(Contact c) {
  112.         for (OrderBy order : OrderBy.values()) {
  113.             contacts[order.ordinal()].remover(c);
  114.         }
  115.         HashContactsById.remover(c.getId());
  116.         HashSondagemDuplaContactsByEmail.remover(c.getEmail());
  117.  
  118.         removeFromHashByDomain(c);
  119.  
  120.  
  121.     }
  122.  
  123.     private void removeFromHashByDomain(Contact c) {
  124.         ListaSimplesCircularBaseLimite<Contact> lista = hashContactByDomain.consultar(c.getEmailDomain());
  125.  
  126.         if (lista != null) {
  127.             lista.remover(c);
  128.             if (lista.isVazia()) {
  129.                 hashContactByDomain.remover(c.getEmailDomain());
  130.             }
  131.         }
  132.     }
  133.  
  134.     public Contact get(OrderBy order, int index) {
  135.         return contacts[order.ordinal()].consultar(index);
  136.     }
  137.  
  138.     public Contact getById(long id) {
  139.         return HashContactsById.consultar(id);
  140. //        Iterador<Contact> it = contacts[OrderBy.ID_ASC.ordinal()].consultar(new Contact(id, "", 0, ""));
  141. //        if (it.podeAvancar())
  142. //            return it.avancar();
  143. //        return null;
  144.     }
  145.  
  146.     public Contact getByEmail(String email) {
  147.  
  148.         return HashSondagemDuplaContactsByEmail.consultar(email);
  149. //        Iterador<Contact> it = contacts[OrderBy.EMAIL_ASC.ordinal()].consultar(new Contact(0,"",0,email));
  150. //        if (it.podeAvancar()){
  151. //            return  it.avancar();
  152. //        }
  153. //        return null;
  154.     }
  155.  
  156.     public Iterable<Contact> getAll(OrderBy order) {
  157.         return contacts[order.ordinal()];
  158.     }
  159.  
  160.     public Iterador<Long> getAllIDs() {
  161.         return HashContactsById.iteradorChaves();
  162.     }
  163.  
  164.     public Iterador<String> getAllDomains() {
  165.         return hashContactByDomain.iteradorChaves();
  166.     }
  167.  
  168.     @Override
  169.     public String toString() {
  170.         StringBuilder result = new StringBuilder("");
  171.  
  172.         for (OrderBy order : OrderBy.values()) {
  173.             result.append("=========== ").append(order).append("\n");
  174.             for (Contact c : contacts[order.ordinal()]) {
  175.                 result.append(c.toString()).append("---------------\n");
  176.             }
  177.         }
  178.  
  179.         return result.toString();
  180.     }
  181.  
  182.     public void update(Contact oldContact, Contact newContact) {
  183.  
  184.         if (oldContact != null) {
  185.  
  186.             //Ou nao estou a alterar ID
  187.             //OU ESTOU A ALTERAR ID
  188.             //      JA EXISTE UM CONTACTO COM ESSE ID === ERRO
  189.             //      OU NAO EXISTE CONTACTO COM ESSE ID
  190.  
  191.  
  192.             if (oldContact.getId() != newContact.getId() && getById(newContact.getId()) != null) {
  193.                 throw new IdExistsException();
  194.             } else if (!oldContact.getEmail().equals(newContact.getEmail()) && getByEmail(newContact.getEmail()) != null) {
  195.                 throw new EmailExistsException();
  196.             }
  197.  
  198. //            boolean altereiID = false;
  199. //            if (oldContact.getId() != newContact.getId()) {
  200. //                HashContactsById.remover(oldContact.getId());
  201. //                altereiID = true;
  202. //            }
  203.  
  204.             HashContactsById.remover(oldContact.getId());
  205.             HashSondagemDuplaContactsByEmail.remover(oldContact.getEmail());
  206.  
  207.             LinkedList<Integer> listasOndeRemovi = new LinkedList<>();
  208.             for (OrderBy order : OrderBy.values()) {
  209.                 if (order.COMPARATOR.comparar(oldContact, newContact) != 0) {
  210.                     contacts[order.ordinal()].removerPorReferencia(oldContact);
  211.                     listasOndeRemovi.add(order.ordinal());
  212.                 }
  213.             }
  214.  
  215.             oldContact.copyFrom(newContact);
  216.  
  217.             for (Integer i : listasOndeRemovi) {
  218.                 contacts[i].inserir(oldContact);
  219.             }
  220.  
  221. //            if (altereiID) {
  222. //                HashContactsById.inserir(oldContact.getId(),oldContact);
  223. //            }
  224.  
  225.             HashContactsById.inserir(oldContact.getId(), oldContact);
  226.             HashSondagemDuplaContactsByEmail.inserir(oldContact.getEmail(), oldContact);
  227.  
  228.             addToHashByDomain(oldContact);
  229.  
  230.         }
  231.     }
  232.  
  233.     public void filterBy(Filtro<Contact> filtro) {
  234.         for (OrderBy order : OrderBy.values()) {
  235.             contacts[order.ordinal()].setFiltro(filtro);
  236.         }
  237.     }
  238.  
  239.  
  240. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement