

####    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] 069/bci/app/user/DoRegisterUser.java:29:	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] 069/bci/app/main/DoSaveFile.java:27:	EmptyCatchBlock:	Evitar blocos catch vazios.
[ERROR] 069/bci/app/main/DoSaveFile.java:30:	EmptyCatchBlock:	Evitar blocos catch vazios.
Total de erros:  3


####    Quebra do encapsulamento


Nada a assinalar


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


[INFO] 069/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] 069/bci/core/Library.java:0:	POLooseCouplingRule:	Aplicação correcta (10) e incorrecta (0) do princípio Programar para abstracção no ficheiro Library.java.
[INFO] 069/bci/core/LibraryManager.java:0:	POLooseCouplingRule:	Aplicação correcta (4) e incorrecta (0) do princípio Programar para abstracção no ficheiro LibraryManager.java.
[INFO] 069/bci/core/User.java:0:	POLooseCouplingRule:	Aplicação correcta (2) e incorrecta (0) do princípio Programar para abstracção no ficheiro User.java.
[INFO] 069/bci/core/Work.java:0:	POLooseCouplingRule:	Aplicação correcta (2) e incorrecta (0) do princípio Programar para abstracção no ficheiro Work.java.
Total de erros:  0


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


[ERROR] 069/bci/core/Book.java:12:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Book - atribui parâmetro (creators) a atributo (this._creators)
[ERROR] 069/bci/core/Book.java:16:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Book - devolve atributo (_creators) em método público (getCreators)
[ERROR] 069/bci/core/Library.java:123:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Library - devolve atributo (_users.values()) em método público (getUsers)
[ERROR] 069/bci/core/Library.java:127:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Library - devolve atributo (_works.values()) em método público (getWorks)
[ERROR] 069/bci/core/Library.java:131:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Library - devolve atributo (_creators.values()) em método público (getCreators)
[INFO] 069/bci/core/Work.java:45:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe Work evitada por criação de cópia (new HashSet) de _observers no método getObservers.
Total de erros:  5
Total de fugas evitadas:        1


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


[WARN] 069/bci/app/request/DoRequestWork.java:25:	ExcessiveMethodLength:	Evitar métodos com um corpo grande.
[WARN] 069/bci/app/request/DoReturnWork.java:23:	ExcessiveMethodLength:	Evitar métodos com um corpo grande.
[ERROR] 069/bci/core/Book.java:28:5: Utilização de um ciclo 'for' para iterar o conteúdo da lista referenciada por '_creators' (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


[WARN] 069/bci/core/Creator.java:8:25: Parâmetro/variável local 'name' esconde atributo da classe com o mesmo nome [HiddenField]
[WARN] 069/bci/core/Request.java:11:25: Parâmetro/variável local 'userId' esconde atributo da classe com o mesmo nome [HiddenField]
[WARN] 069/bci/core/Request.java:11:40: Parâmetro/variável local 'workId' esconde atributo da classe com o mesmo nome [HiddenField]
[WARN] 069/bci/core/Request.java:11:52: Parâmetro/variável local 'dueDate' esconde atributo da classe com o mesmo nome [HiddenField]
[WARN] 069/bci/core/Request.java:21:35: Parâmetro/variável local 'returned' esconde atributo da classe com o mesmo nome [HiddenField]
Total de erros:  0


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

[ERROR] 069/bci/core/Creator.java:6:18: O atributo com o nome 'name'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 069/bci/core/Request.java:6:18: O atributo com o nome 'userId'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 069/bci/core/Request.java:7:18: O atributo com o nome 'workId'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 069/bci/core/Request.java:8:19: O atributo com o nome 'returned'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 069/bci/core/Request.java:9:15: O atributo com o nome 'dueDate'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 069/bci/app/request/DoReturnWork.java:24:12: A variável local com o nome '_userId'não está de acordo com o padrão '^[a-z][a-zA-Z0-9]*$'. [LocalVariableName]
[ERROR] 069/bci/app/request/DoReturnWork.java:25:12: A variável local com o nome '_workId'não está de acordo com o padrão '^[a-z][a-zA-Z0-9]*$'. [LocalVariableName]
[ERROR] 069/bci/app/request/DoRequestWork.java:26:12: A variável local com o nome '_userId'não está de acordo com o padrão '^[a-z][a-zA-Z0-9]*$'. [LocalVariableName]
[ERROR] 069/bci/app/request/DoRequestWork.java:27:12: A variável local com o nome '_workId'não está de acordo com o padrão '^[a-z][a-zA-Z0-9]*$'. [LocalVariableName]
Total de erros:  9

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

Iniciando a auditoria...
[INFO] 069/bci/core/LibraryManager.java:101 ObjectOutputStream criado no método 'public void save()' da classe 'LibraryManager'. [CheckSerialization]
[INFO] 069/bci/core/LibraryManager.java:129 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...
[WARN] 069/bci/app/request/DoRequestWork.java:24 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão 'user.getStatus()' comparada '9' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[ERROR] 069/bci/app/work/DoPerformSearch.java:26 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] 069/bci/app/work/DoPerformSearch.java:33 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] 069/bci/core/Book.java:36 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão 'category' comparada '8' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 069/bci/core/Dvd.java:31 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão 'category' comparada '8' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[ERROR] 069/bci/core/Library.java:145 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] 069/bci/core/Library.java:152 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] 069/bci/core/Parser.java:38 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] 069/bci/core/RuleMaxBorrowed.java:4 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão 'user.getStatus()' comparada '3' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 069/bci/core/User.java:48 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão '_status' comparada '2' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
Auditoria completa.
O Checkstyle terminou com 4 erros.

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

Iniciando a auditoria...
[ERROR] 069/bci/app/request/DoRequestWork.java:34 Instanciação de classe do domínio 'RuleAlreadyBorrowed' não permitido na camada da aplicação. [POCreateCoreEntitiesInApp]
[ERROR] 069/bci/app/request/DoRequestWork.java:34 Instanciação de classe do domínio 'RuleMaxBorrowed' não permitido na camada da aplicação. [POCreateCoreEntitiesInApp]
[ERROR] 069/bci/app/request/DoRequestWork.java:34 Instanciação de classe do domínio 'RuleSuspended' não permitido na camada da aplicação. [POCreateCoreEntitiesInApp]
Auditoria completa.
O Checkstyle terminou com 3 erros.

####  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...
[ERROR] 069/bci/core/Book.java:36 Membro estático 'private static String categoryToPortuguese(. category)' não recomendável. [POStaticMember]
[ERROR] 069/bci/core/Dvd.java:31 Membro estático 'private static String categoryToPortuguese(. category)' não recomendável. [POStaticMember]
[INFO] 069/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 '12'. [POStaticMember]
Auditoria completa.
O Checkstyle terminou com 2 erros.

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

Iniciando a auditoria...
[ERROR] 069/bci/core/Library.java:25 O atributo '_requests', com nível de acesso 'public', deveria ser privado e ter métodos acessores. [POVisibilityModifier]
Auditoria completa.
O Checkstyle terminou com 1 erros.

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


Nada a assinalar


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

Iniciando a auditoria...
[INFO] Número total de enumerados definidos no core: 2, dos quais 0 private, 0 package-private, 0 protected e 2 public. [WriteClassStructure]
[INFO] Enumerados definidos no package core da aplicação (2): '[Category, UserStatus]'. [WriteClassStructure]
[INFO] Número total de classes definidos no core: 20, dos quais 0 private, 1 package-private, 0 protected e 19 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 (13): '[User, RuleMaxBorrowed, Request, Creator, Notification, RuleAlreadyBorrowed, Dvd, Book, MyParser, LibraryManager, RuleSuspended, RuleNotAvailable, Library]'. [WriteClassStructure]
[INFO] Excepções definidas no package core da aplicação (5): '[MissingFileAssociationException, UnavailableFileException, ImportFileException, UnrecognizedEntryException, RuleViolationException]'. [WriteClassStructure]
[INFO] Número total de métodos nas classes do core (sem excepções): 92, dos quais 6 private, 1 package-private, 0 protected e 85 public. [WriteClassStructure]
[INFO] Número total de atributos nas classes do core (sem excepções): 39, dos quais 38 private, 0 package-private, 0 protected e 1 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] class User ( public implements Serializable )

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

    private String _id
    private String _name
    private String _email
    private boolean _isActive
    private boolean _suspended
    private int _fine
    private List<Notification> _notifications
    private UserStatus _status
    private int _onTimeStreak
    private int _lateStreak

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

    public String getId()
    public String getName()
    public String getEmail()
    public boolean isActive()
    public boolean isSuspended()
    public void setSuspended(boolean suspended)
    public int getFine()
    public void setFine(int fine)
    public UserStatus getStatus()
    public void addNotification(Notification notification)
    public List<Notification> consumeNotifications()
    public void registerReturn(boolean onTime)

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

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

    public void check(Library library, User user, Work work)

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

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

    private String userId
    private String workId
    private boolean returned
    private int dueDate

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

    public String getUserId()
    public String getWorkId()
    public boolean isReturned()
    public void setReturned(boolean returned)
    public int getDueDate()

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

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

    private String name

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

    public String getName()

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

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

    private String _message

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

    public String getMessage()
    public String toString()

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

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

    public void check(Library library, User user, Work work)

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

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

    private int _igac
    private Creator _creator

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

    public int getIgac()
    public Creator getCreator()
    public String toString()
    private static String categoryToPortuguese(. category)

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

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

    private int _isbn
    private List<Creator> _creators

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

    public int getIsbn()
    public List<Creator> getCreators()
    public String toString()
    private static String categoryToPortuguese(. category)

 [WriteClassStructure]
[INFO] class MyParser (  )

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

    private Library _library
    private LibraryManager _manager

  ###### 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 String _id
    private String _title
    private int _price
    private Category _category
    private int _nCopies
    private int _maxCopies
    private Set<String> _observers

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

    public String getId()
    public String getTitle()
    public int getPrice()
    public Category getCategory()
    public int getNCopies()
    public int getMaxCopies()
    public void addObserver(String userId)
    public void removeObserver(String userId)
    public void clearObservers()
    public Set<String> getObservers()
    public void decrementCopies()
    public void incrementCopies()
    public boolean incrementCopiesWithNotify(Library library)
    public void notifyObserversOnRequest(Library library)
    public abstract String toString()

  ###### Subclasses  ###### 
    Dvd   Book   

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

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

    private Library _library
    private String _filename

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

    public Library getLibrary()
    public User getUser(String id)
    public Collection<User> getUsers()
    public Work getWork(String id)
    public Collection<Work> getWorks()
    public List<Work> getWorksByCreator(String creatorName)
    public int getCurrentDate()
    public void advanceDate(int days)
    public User registerUser(String name, String email)
    public Book registerBook(List creatorsList, String title, int price, Category category, int isbn, int nCopies)
    public Dvd registerDvd(Creator creator, String title, int price, Category category, int igac, int nCopies)
    public void addRequest(String userId, String workId, int dueDate)
    public void addRequest(String userId, String workId)
    public boolean hasActiveRequest(String userId, String workId)
    public void markRequestReturned(String userId, String workId)
    public void tagUserForNotification(String userId, String workId)
    public boolean isUserTaggedForNotification(String userId, String workId)
    public void save()
    public void saveAs(String filename)
    public void load(String filename)
    public void importFile(String datafile)

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

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

    public void check(Library library, User user, Work work)

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

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

    public void check(Library library, User user, Work work)

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

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

    private Map<String, User> _users
    private Map<String, Creator> _creators
    private Map<String, Work> _works
    private Map<String, Set<String>> _notificationRequests
    private int _currentDate
    private int _nextUserId
    private int _nextWorkId
    public List<Request> _requests

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

    public int getCurrentDate()
    public void advanceDate(int days)
    public User registerUser(String name, String email)
    public Creator registerCreator(String name)
    public Dvd registerDvd(Creator creator, String title, int price, Category category, int igac, int nCopies)
    public Book registerBook(List creatorsList, String title, int price, Category category, int isbn, int nCopies)
    public Collection<User> getUsers()
    public Collection<Work> getWorks()
    public Collection<Creator> getCreators()
    public Work getWork(String id)
    public User getUser(String id)
    public List<Work> getWorksByCreator(String creatorName)
    public void addRequest(String userId, String workId, int dueDate)
    public void addRequest(String userId, String workId)
    public boolean hasActiveRequest(String userId, String workId)
    public void markRequestReturned(String userId, String workId)
    public void tagUserForNotification(String userId, String workId)
    public boolean isUserTaggedForNotification(String userId, String workId)

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

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

    public abstract void check(Library library, User user, Work work)

  ###### Subclasses  ###### 
    RuleMaxBorrowed   RuleAlreadyBorrowed   RuleSuspended   RuleNotAvailable   

   Method check(Library, User, Work) overriden in subclass(es) RuleMaxBorrowed RuleAlreadyBorrowed RuleSuspended RuleNotAvailable 
 [WriteClassStructure]
Auditoria completa.
