

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

	 Uso do mecanismo de excepção como controlo de fluxo, lançar uma excepção demasiado genérica, apanhar uma excepção num bloco catch e lançar uma nova excepção do mesmo tipo ou a mesma excepção 

[ERROR] 052/bci/app/main/DoOpenFile.java:26:	POAvoidCatchingGenericException:	Evitar apanhar excepções demasiado genéricas (RuntimeException and Exception) em blocos try-catch.

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

[ERROR] 052/bci/app/main/DoOpenFile.java:26:	EmptyCatchBlock:	Evitar blocos catch vazios.
Total de erros:  2


####    Quebra do encapsulamento


Nada a assinalar


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


[ERROR] 052/bci/core/Book.java:55:5: Utilização de um ciclo 'for' para iterar o conteúdo da lista referenciada por '_authors' (do tipo 'List<Creator>'). Substituir por ciclo for-each ou usar um iterador dado que a utilização do método get pode ser muito ineficiente neste caso. [POIterateListWithForLoop]
Total de erros:  1


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


Nada a assinalar


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

[ERROR] 052/bci/core/Parser.java:76:13: A variável local com o nome '_creator'não está de acordo com o padrão '^[a-z][a-zA-Z0-9]*$'. [LocalVariableName]
[ERROR] 052/bci/core/Parser.java:80:9: A variável local com o nome '_dvd'não está de acordo com o padrão '^[a-z][a-zA-Z0-9]*$'. [LocalVariableName]
[ERROR] 052/bci/core/Parser.java:103:17: A variável local com o nome '_creator'não está de acordo com o padrão '^[a-z][a-zA-Z0-9]*$'. [LocalVariableName]
[ERROR] 052/bci/core/Parser.java:109:10: A variável local com o nome '_book'não está de acordo com o padrão '^[a-z][a-zA-Z0-9]*$'. [LocalVariableName]
[ERROR] 052/bci/core/DVD.java:4:14: Abreviações no nome 'DVD' não deveriam conter mais do que '1' letras maiúsculas consecutivas. [AbbreviationAsWordInName]
[ERROR] 052/bci/core/Library.java:266:9: A variável local com o nome '_deadline'não está de acordo com o padrão '^[a-z][a-zA-Z0-9]*$'. [LocalVariableName]
[ERROR] 052/bci/core/Date.java:6:15: O atributo com o nome 'currentDate'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
Total de erros:  7

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

Iniciando a auditoria...
[INFO] 052/bci/core/LibraryManager.java:76 ObjectOutputStream criado no método 'public void saveAs(String filename)' da classe 'LibraryManager'. [CheckSerialization]
[INFO] 052/bci/core/LibraryManager.java:91 ObjectInputStream criado no método 'public void load(String filename)' da classe 'LibraryManager'. [CheckSerialization]
Auditoria completa.

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

Iniciando a auditoria...
[ERROR] 052/bci/app/work/DoDisplayWorksByCreator.java:27 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] 052/bci/app/work/DoDisplayWorksByCreator.java:34 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] 052/bci/core/Library.java:279 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão 'user.getClassification()' comparada '2' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 052/bci/core/Parser.java:31 Possível mau desenho: diferenciação do comportamento com base em comparação de strings (expressão 'components[ ]' comparada '4' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 052/bci/core/RuleMaxRequests.java:13 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão 'user.getClassification()' comparada '2' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 052/bci/core/Work.java:57 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão '_category' comparada '4' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
Auditoria completa.
O Checkstyle terminou com 2 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] 052/bci/core/RuleMaxPrice.java:5 Atributo estático final 'int MAX_PRICE' permitido. [POStaticMember]
[INFO] 052/bci/core/RuleMaxRequests.java:5 Atributo estático final 'int BASE_LIMIT' permitido. [POStaticMember]
[INFO] 052/bci/core/RuleMaxRequests.java:6 Atributo estático final 'int CUMPRIDOR_LIMIT' permitido. [POStaticMember]
[INFO] 052/bci/core/RuleMaxRequests.java:7 Atributo estático final 'int FALTOSO_LIMIT' permitido. [POStaticMember]
[ERROR] 052/bci/core/UserRules.java:13 Membro estático 'public static UserClassification classify(List history)' não recomendável. [POStaticMember]
[ERROR] 052/bci/core/UserRules.java:33 Membro estático 'public static boolean shouldSuspend(boolean hasLateReturns, boolean hasUnpaidFines)' não recomendável. [POStaticMember]
[INFO] 052/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 '13'. [POStaticMember]
Auditoria completa.
O Checkstyle terminou com 2 erros.

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


Nada a assinalar


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


Nada a assinalar


####  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

Iniciando a auditoria...
[ERROR] O método'toString' está a ser substituído em todas as classes derivadas de 'Work' pelo que deve ser abstracto'. [WriteClassStructure]
Auditoria completa.
O Checkstyle terminou com 1 erros.

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

Iniciando a auditoria...
[INFO] Número total de enumerados definidos no core: 4, dos quais 0 private, 0 package-private, 0 protected e 4 public. [WriteClassStructure]
[INFO] Enumerados definidos no package core da aplicação (4): '[Category, UserStatus, NotificationType, UserClassification]'. [WriteClassStructure]
[INFO] Número total de classes definidos no core: 23, dos quais 0 private, 1 package-private, 0 protected e 22 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 (17): '[RuleMaxPrice, User, RuleUserActive, Request, RuleNoReferenceCategory, Creator, RuleWorkAvailable, Notification, Date, RuleMaxRequests, DVD, UserRules, Book, MyParser, LibraryManager, Library, RuleNoDuplicateRequests]'. [WriteClassStructure]
[INFO] Excepções definidas no package core da aplicação (4): '[MissingFileAssociationException, UnavailableFileException, ImportFileException, UnrecognizedEntryException]'. [WriteClassStructure]
[INFO] Número total de métodos nas classes do core (sem excepções): 104, dos quais 5 private, 2 package-private, 1 protected e 96 public. [WriteClassStructure]
[INFO] Número total de atributos nas classes do core (sem excepções): 47, dos quais 47 private, 0 package-private, 0 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 UserStatus ( public )

 [WriteClassStructure]
[INFO] enum NotificationType ( public )

 [WriteClassStructure]
[INFO] enum UserClassification ( public )

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

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

    private final static int MAX_PRICE

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

    public boolean isSatisfied(User user, Work work)

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

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

    private int _id
    private String _name
    private String _email
    private UserStatus _status
    private UserClassification _classification
    private int _fine
    private List<Request> _requests
    private List<Notification> _notifications
    private List<Boolean> _history

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

    public int getId()
    public String getName()
    public String getEmail()
    public UserStatus getStatus()
    public UserClassification getClassification()
    public List<Request> getRequests()
    public List<Notification> getNotifications()
    public int getFine()
    public void suspend()
    public void activate()
    public boolean isSuspended()
    public void registerReturn(boolean onTime)
    public void addRequest(Request request)
    public void removeRequest(Request request)
    public void addFine(int amount)
    public void clearFine()
    public void payFine(int amount, int currentDay)
    public void updateStatus(int currentDay)
    public String toString()

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

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

    public boolean isSatisfied(User user, Work work)

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

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

    private User _user
    private Work _work
    private int _deadline
    private int _requestDate

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

    public User getUser()
    public Work getWork()
    public int getDeadline()
    public int getRequestDate()
    public String toString()

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

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

    public boolean isSatisfied(User user, Work work)

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

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

    private String _name
    private List<Work> _works

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

    public String getName()
    public List<Work> getWorks()
    public void addWork(Work work)
    public void removeWork(Work work)
    public boolean hasWorks()
    public String toString()

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

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

    public boolean isSatisfied(User user, Work work)

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

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

    private int _id
    private String _message
    private User _user
    private Work _work
    private NotificationType _type

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

    public int getId()
    public String getMessage()
    public User getUser()
    public Work getWork()
    public NotificationType getType()
    public String toString()

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

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

    private int currentDate

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

    public int getCurrentDate()
    public void advanceDate(int nDays)
    public String toString()

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

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

    private final static int BASE_LIMIT
    private final static int CUMPRIDOR_LIMIT
    private final static int FALTOSO_LIMIT

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

    public boolean isSatisfied(User user, Work work)

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

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

    private Creator _director
    private String _igacNumber

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

    public Creator getDirector()
    public String getIgacNumber()
    public String toString()

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

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

    public static UserClassification classify(List history)
    public static boolean shouldSuspend(boolean hasLateReturns, boolean hasUnpaidFines)

 [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 void addAuthor(Creator author)
    public void removeAuthor(Creator author)
    public String toString()

 [WriteClassStructure]
[INFO] class MyParser (  )

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

    private Library _library

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

    void parseFile(String filename)
    private void parseLine(String line)
    private void parseUser(String components, String line)
    private void parseDvd(String components, String line)
    private void parseBook(String components, String line)

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

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

    private int _id
    private String _title
    private int _price
    private Category _category
    private int _copiesAvailable
    private int _copies

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

    public void setId(int id)
    public int getId()
    public String getTitle()
    public int getPrice()
    public Category getCategory()
    public int getCopies()
    public int getCopiesAvailable()
    public void updateCopies(int delta)
    public void updateCopiesAvailable(int delta)
    public boolean hasNoCopies()
    protected String localizeCategory()
    public String toString()

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

   Method toString() overriden in subclass(es) DVD Book 
 [WriteClassStructure]
[INFO] class LibraryManager ( public implements Serializable )

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

    private Library _library
    private boolean _changed
    private String _filename

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

    public boolean isAssociated()
    public final Library getLibrary()
    public boolean hasChanged()
    public void newLibrary()
    public void save()
    public void saveAs(String filename)
    public void load(String filename)
    public void importFile(String filename)

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

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

    private List<User> _users
    private List<Work> _works
    private List<Rule> _rules
    private List<Creator> _creators
    private Date _date
    private int _nextUserId
    private int _nextWorkId

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

    public void addCreator(Creator creator)
    public boolean removeCreator(Creator creator)
    public Creator getCreatorByName(String name)
    public int addUser(String name, String email)
    public User getUserById(int id)
    public List<User> getUsers()
    public void addWork(Work work)
    public void addBook(Book book)
    public void addDVD(DVD dvd)
    public int getNextWorkId()
    public void removeWork(Work work)
    public Work getWorkById(int id)
    public List<Work> getWorks()
    public void advanceDate(int days)
    public int getCurrentDate()
    void importFile(String filename)
    public void createRequest(User user, Work work)
    private int calculateDeadLine(User user, Work work)
    public void returnWork(User user, Work work)
    public int getUserFine(int userId)
    public void payUserFine(int userId, int amount)

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

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

    private final int _id

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

    public int getId()
    public abstract boolean isSatisfied(User user, Work work)
    public String toString()

  ###### Subclasses  ###### 
    RuleMaxPrice   RuleUserActive   RuleNoReferenceCategory   RuleWorkAvailable   RuleMaxRequests   RuleNoDuplicateRequests   

   Method isSatisfied(User, Work) overriden in subclass(es) RuleMaxPrice RuleUserActive RuleNoReferenceCategory RuleWorkAvailable RuleMaxRequests RuleNoDuplicateRequests 
 [WriteClassStructure]
[INFO] class RuleNoDuplicateRequests ( public )
  extends Rule

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

    public boolean isSatisfied(User user, Work work)

 [WriteClassStructure]
Auditoria completa.
