

####    Verificação do uso correcto do mecanismo de excepções




	 Blocos catch's iguais ou vazios (incluindo neste casos blocos try e finaly vazios)

[INFO] 046/bci/core/LibraryManager.java:123:	IdenticalCatchBranches:	Ramo 'catch' idênticol to ramo 'FileNotFoundException' pertencentes à mesma instrução try.
Total de erros:  0


####    Quebra do encapsulamento


Nada a assinalar


####    Verificaçao do princípio de desenho Programar para o supertipo


[INFO] 046/bci/core/Book.java:0:	POLooseCouplingRule:	Aplicação correcta (3) e incorrecta (0) do princípio Programar para abstracção no ficheiro Book.java.
[INFO] 046/bci/core/Creator.java:0:	POLooseCouplingRule:	Aplicação correcta (2) e incorrecta (0) do princípio Programar para abstracção no ficheiro Creator.java.
[INFO] 046/bci/core/Library.java:0:	POLooseCouplingRule:	Aplicação correcta (13) e incorrecta (0) do princípio Programar para abstracção no ficheiro Library.java.
[INFO] 046/bci/core/LibraryManager.java:0:	POLooseCouplingRule:	Aplicação correcta (3) e incorrecta (0) do princípio Programar para abstracção no ficheiro LibraryManager.java.
[INFO] 046/bci/core/User.java:0:	POLooseCouplingRule:	Aplicação correcta (3) e incorrecta (0) do princípio Programar para abstracção no ficheiro User.java.
Total de erros:  0


####    Verificação de fugas de privacidade


[ERROR] 046/bci/core/Book.java:20:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Book - atribui parâmetro (authors) a atributo (_authors)
[ERROR] 046/bci/core/Book.java:27:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Book - devolve atributo (_authors) em método público (getAuthors)
[ERROR] 046/bci/core/User.java:76:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe User - devolve atributo (_requests) em método público (getRequests)
[INFO] 046/bci/core/Creator.java:23:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em Creator por uso de Collections.unmodifiableSet para devolver vista imutável de _works em método getWorks
Total de erros:  3
Total de fugas evitadas:        1


####    Verificação de alguns aspectos de qualidade do código


[WARN] 046/bci/core/Library.java:122:	ExcessiveMethodLength:	Evitar métodos com um corpo grande.
Total de erros:  0


####    Verificação da boa aplicação do mecanismo de herança


Nada a assinalar


####    Verificação de Convenções de Codificação

[ERROR] 046/bci/core/DVD.java:6:20: Abreviações no nome 'DVD' não deveriam conter mais do que '1' letras maiúsculas consecutivas. [AbbreviationAsWordInName]
[ERROR] 046/bci/core/LibraryManager.java:51:18: O método com o nome 'CreatorExists' não está de acordo com o padrão '^[a-z][a-zA-Z]*[0-9]?$'. [MethodName]
[ERROR] 046/bci/core/Library.java:283:18: O método com o nome 'CreatorExists' não está de acordo com o padrão '^[a-z][a-zA-Z]*[0-9]?$'. [MethodName]
[ERROR] 046/bci/core/Library.java:302:28: O atributo com o nome 'rules'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 046/bci/core/User.java:135:19: O método com o nome 'BehaviorToString' não está de acordo com o padrão '^[a-z][a-zA-Z]*[0-9]?$'. [MethodName]
[ERROR] 046/bci/core/Work.java:63:17: O método com o nome 'CategoryToString' não está de acordo com o padrão '^[a-z][a-zA-Z]*[0-9]?$'. [MethodName]
Total de erros:  6

####   Verificação do processo de serialização

Iniciando a auditoria...
[INFO] 046/bci/core/LibraryManager.java:87 ObjectOutputStream criado no método 'public void save()' da classe 'LibraryManager'. [CheckSerialization]
[INFO] 046/bci/core/LibraryManager.java:99 ObjectOutputStream criado no método 'public void saveAs(String filename)' da classe 'LibraryManager'. [CheckSerialization]
[INFO] 046/bci/core/LibraryManager.java:113 ObjectInputStream criado no método 'public void load(String filename)' da classe 'LibraryManager'. [CheckSerialization]
[ERROR] Número errado de instâncias criadas de 'ObjectOutputStream'. Devia ser 1 e é '2'. [CheckSerialization]
Auditoria completa.
O Checkstyle terminou com 1 erros.

####  Verificação do princípio de desenho aberto/fechado

Iniciando a auditoria...
[WARN] 046/bci/app/request/DoRequestWork.java:23 Possível mau desenho: diferenciação do comportamento com base em comparação de strings (expressão 'e.getMessage()' comparada '8' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 046/bci/app/request/DoReturnWork.java:23 Possível mau desenho: diferenciação do comportamento com base em comparação de strings (expressão 'e.getMessage()' comparada '3' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[ERROR] 046/bci/app/work/DoPerformSearch.java:24 Evite a utilização do operador instanceof dado que normalmente o seu uso indica uma má aplicação do paradigma de programação com objectos. [OpenClosePrinciple]
[WARN] 046/bci/core/Library.java:103 Possível mau desenho: diferenciação do comportamento com base em comparação de strings (expressão 'categoryString.toUpperCase()' comparada '4' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 046/bci/core/Library.java:122 Possível mau desenho: diferenciação do comportamento com base em comparação de strings (expressão 'tag' comparada '4' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 046/bci/core/Library.java:311 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão 'u.getBehavior()' comparada '6' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[ERROR] 046/bci/core/Library.java:424 Evite a utilização do operador instanceof dado que normalmente o seu uso indica uma má aplicação do paradigma de programação com objectos. [OpenClosePrinciple]
[ERROR] 046/bci/core/Library.java:425 Evite a utilização do operador instanceof dado que normalmente o seu uso indica uma má aplicação do paradigma de programação com objectos. [OpenClosePrinciple]
[ERROR] 046/bci/core/Library.java:427 Evite a utilização do operador instanceof dado que normalmente o seu uso indica uma má aplicação do paradigma de programação com objectos. [OpenClosePrinciple]
[ERROR] 046/bci/core/Library.java:433 Evite a utilização do operador instanceof dado que normalmente o seu uso indica uma má aplicação do paradigma de programação com objectos. [OpenClosePrinciple]
[ERROR] 046/bci/core/LibraryManager.java:116 Evite a utilização do operador instanceof dado que normalmente o seu uso indica uma má aplicação do paradigma de programação com objectos. [OpenClosePrinciple]
[WARN] 046/bci/core/User.java:135 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão '_behavior' comparada '3' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 046/bci/core/Work.java:63 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão '_category' comparada '3' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 046/bci/core/rules/CheckWorkAmount.java:6 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão 'u.getBehavior()' comparada '3' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
Auditoria completa.
O Checkstyle terminou com 6 erros.

####  Verificação de dependência app de core


Nada a assinalar


####  Verificação do uso desnecessário de super


Nada a assinalar


####  Verificação de dependência de core de app


Nada a assinalar


####  Verificação do uso de membros estáticos

Iniciando a auditoria...
[INFO] 046/bci/core/exception/ImportFileException.java:7 Atributo estático final 'String ERROR_MESSAGE' permitido. [POStaticMember]
[INFO] O número de serialVersionUID atributos estáticos definidos nas várias classes foi '20'. [POStaticMember]
Auditoria completa.

####  Verificação do nível de acesso dos atributos


Nada a assinalar


####  Verificação da necessidade da concretização de hashCode e equals

Iniciando a auditoria...
[WARN] Possível erro: A classe 'Work' utilizada no atributo 'private Set<Work> _works' da classe 'Creator' não substitui os métodos hashCode e equals. [WriteClassStructure]
Auditoria completa.

####  Verificação de membros com o nível protected desnecessário


Nada a assinalar


####  Verificação do mecanismo de herança II: atributos duplicados e métodos que deviam ser abstractos


Nada a assinalar


####  Sumário das classes do core da aplicação

Iniciando a auditoria...
[INFO] Número total de enumerados definidos no core: 3, dos quais 0 private, 0 package-private, 0 protected e 3 public. [WriteClassStructure]
[INFO] Enumerados definidos no package core da aplicação (3): '[Category, NotificationType, Behavior]'. [WriteClassStructure]
[INFO] Número total de classes definidos no core: 21, dos quais 0 private, 0 package-private, 0 protected e 21 public. [WriteClassStructure]
[INFO] Classes abstractas definidas no package core da aplicação (2): '[Work, Rule]'. [WriteClassStructure]
[INFO] Classes concretas e não excepções definidas no package core da aplicação (14): '[User, CheckCategory, Request, Creator, Notification, CheckDuplicate, CheckWorkAmount, DVD, CheckIsAvailable, Book, LibraryManager, CheckPrice, Library, CheckIsUserSuspended]'. [WriteClassStructure]
[INFO] Excepções definidas no package core da aplicação (5): '[MissingFileAssociationException, RuleException, UnavailableFileException, ImportFileException, UnrecognizedEntryException]'. [WriteClassStructure]
[INFO] Número total de métodos nas classes do core (sem excepções): 97, dos quais 6 private, 0 package-private, 0 protected e 91 public. [WriteClassStructure]
[INFO] Número total de atributos nas classes do core (sem excepções): 45, dos quais 38 private, 0 package-private, 7 protected e 0 public. [WriteClassStructure]
Auditoria completa.

Descrição das estruturas de dados do core do projecto

Iniciando a auditoria...
[INFO] enum Category ( public )

 [WriteClassStructure]
[INFO] enum NotificationType ( public )

 [WriteClassStructure]
[INFO] enum Behavior ( public )

 [WriteClassStructure]
[INFO] class User ( public implements Serializable )

  ###### Atributos ###### 

    private final String _name
    private final String _email
    private final int _id
    private boolean _isActive
    private int _fine
    private List<Request> _requests
    private int[] _history
    private int _historyIndex
    private Behavior _behavior

  ###### Métodos ###### 

    public String getName()
    public String getEmail()
    public int getId()
    public boolean isActive()
    public Behavior getBehavior()
    public void setBehavior(Behavior behavior)
    public List<Work> getBorrowedWorks()
    public void payFine(int date)
    public void addFine(int amount)
    public void addRequest(Request r)
    public void removeRequest(Request r)
    public List<Request> getRequests()
    public int getFine()
    public Request getRequestByWork(Work w)
    public void updateStatus(int date)
    public void updateHistory(int lastRequest)
    public String BehaviorToString()
    public String toString()

 [WriteClassStructure]
[INFO] class CheckCategory ( public, final )
  extends Rule

  ###### Métodos ###### 

    public void check(Work w, User u)

 [WriteClassStructure]
[INFO] class Request ( public implements Serializable )

  ###### Atributos ###### 

    private User _user
    private Work _work
    private int _requestDate
    private int _returnDate

  ###### Métodos ###### 

    public User getUser()
    public int getRequestDate()
    public int getReturnDate()
    public Work getWork()

 [WriteClassStructure]
[INFO] class Creator ( public implements Serializable )

  ###### Atributos ###### 

    private final String _name
    private Set<Work> _works

  ###### Métodos ###### 

    public String getName()
    public Set<Work> getWorks()
    public void addWork(Work work)
    public void removeWork(Work work)

 [WriteClassStructure]
[INFO] class Notification ( public implements Serializable )

  ###### Atributos ###### 

    private Work _work
    private String _message
    private final String _workTitle
    private NotificationType _type

  ###### Métodos ###### 

    public Work getWork()
    public String getWorkTitle()
    public String toString()

 [WriteClassStructure]
[INFO] class CheckDuplicate ( public )
  extends Rule

  ###### Métodos ###### 

    public void check(Work w, User u)

 [WriteClassStructure]
[INFO] class CheckWorkAmount ( public, final )
  extends Rule

  ###### Métodos ###### 

    public void check(Work w, User u)

 [WriteClassStructure]
[INFO] class DVD ( public, final )
  extends Work

  ###### Atributos ###### 

    private Creator _director
    private final String _igac

  ###### Métodos ###### 

    public Creator getDirector()
    public String getIGAC()
    public String toString()

 [WriteClassStructure]
[INFO] class CheckIsAvailable ( public, final )
  extends Rule

  ###### Métodos ###### 

    public void check(Work w, User u)

 [WriteClassStructure]
[INFO] class Book ( public )
  extends Work

  ###### Atributos ###### 

    private List<Creator> _authors
    private String _isbn

  ###### Métodos ###### 

    public List<Creator> getAuthors()
    public String getISBN()
    public String toString()

 [WriteClassStructure]
[INFO]  abstract class Work ( public implements Serializable )

  ###### Atributos ###### 

    protected String _title
    protected boolean _isAvailable
    protected int _price
    protected int _numberOfCopies
    protected Category _category
    protected int _id
    protected int _disponiveis

  ###### Métodos ###### 

    public String getTitle()
    public boolean isAvailable()
    public int getPrice()
    public int getNumberOfCopies()
    public Category getCategory()
    public int getAvailableCopies()
    public void devolvido()
    public void emprestado()
    public int getId()
    public String CategoryToString()
    public void applyInventoryDelta(int delta)

  ###### Subclasses  ###### 
    DVD   Book   

 [WriteClassStructure]
[INFO] class LibraryManager ( public )

  ###### Atributos ###### 

    private Library _library
    private String _filename

  ###### Métodos ###### 

    public int getCurrentDate()
    public void advanceDate(int days)
    public int registerUser(String name, String email)
    public User getUser(int id)
    public List<User> getUsers()
    public Work getWork(int id)
    public Iterable<Work> getWorks()
    public boolean CreatorExists(String name)
    public List<Work> getWorksByCreator(String name)
    public int requestWork(int userId, int workId)
    public int returnWork(int userId, int workId)
    public void payFine(int userId)
    public void wantsAvailability(int userId, int workId)
    public List<String> getNotifications(int userId)
    public void save()
    public void saveAs(String filename)
    public String getFilename()
    public void load(String filename)
    public void importFile(String datafile)
    public int changeWorkInventory(int workId, int delta)

 [WriteClassStructure]
[INFO] class CheckPrice ( public, final )
  extends Rule

  ###### Métodos ###### 

    public void check(Work w, User u)

 [WriteClassStructure]
[INFO] class Library ( public implements Serializable )

  ###### Atributos ###### 

    private List<User> _users
    private List<Book> _books
    private List<DVD> _dvds
    private final List<Work> _works
    private final Map<String, Creator> _creators
    private final List<Request> _requests
    private final Map<Integer, LinkedHashSet<Integer>> _availabilityWatchlist
    private final Map<Integer, ArrayDeque<Notification>> _notifications
    private int _nextUserId
    private int _nextWorkId
    private String _filename
    private int _currentDate
    private final List<Rule> rules

  ###### Métodos ###### 

    public int getCurrentDate()
    public void advanceDate(int days)
    private Creator getOrCreateCreator(String name)
    private Category stringToCategory(String categoryString)
    public void importFile(String datafile)
    public int registerUser(String name, String email)
    public User getUser(int id)
    public Iterable<Work> getWorks()
    public List<User> getUsers()
    private void addBook(String title, List authors, int price, String categoryText, String isbn, int copies)
    private void addDvd(String title, String director, int price, String categoryText, String igac, int copies)
    public Work getWork(int id)
    public boolean CreatorExists(String name)
    public List<Work> getWorksByCreator(String name)
    public int returnTime(User u, Work w)
    public Request requestWork(int userId, int workId)
    public int returnWork(int userId, int workId)
    public void payFine(int userId)
    public int changeWorkInventory(int workId, int delta)
    private void removeWorkAndCleanupCreators(Work w)
    public void subscribeAvailability(int userId, int workId)
    public void addNotification(int userId, Notification notification)
    private void notifyAvailability(Work w)
    public List<String> getUserNotifications(int userId)

 [WriteClassStructure]
[INFO]  abstract class Rule ( public implements Serializable )

  ###### Métodos ###### 

    public abstract void check(Work w, User u)

  ###### Subclasses  ###### 
    CheckCategory   CheckDuplicate   CheckWorkAmount   CheckIsAvailable   CheckPrice   CheckIsUserSuspended   

   Method check(Work, User) overriden in subclass(es) CheckCategory CheckDuplicate CheckWorkAmount CheckIsAvailable CheckPrice CheckIsUserSuspended 
 [WriteClassStructure]
[INFO] class CheckIsUserSuspended ( public, final )
  extends Rule

  ###### Métodos ###### 

    public void check(Work w, User u)

 [WriteClassStructure]
Auditoria completa.
