

####    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] 061/bci/app/main/DoSaveFile.java:29:	POAvoidCatchingGenericException:	Evitar apanhar excepções demasiado genéricas (RuntimeException and Exception) em blocos try-catch.
[ERROR] 061/bci/app/main/DoSaveFile.java:32:	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)

[INFO] 061/bci/app/request/DoReturnWork.java:43:	IdenticalCatchBranches:	Ramo 'catch' idênticol to ramo 'CNoSuchUserException' pertencentes à mesma instrução try.
[ERROR] 061/bci/app/request/DoReturnWork.java:42:	EmptyCatchBlock:	Evitar blocos catch vazios.
[ERROR] 061/bci/app/request/DoReturnWork.java:43:	EmptyCatchBlock:	Evitar blocos catch vazios.
Total de erros:  4


####    Quebra do encapsulamento


Nada a assinalar


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


[INFO] 061/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] 061/bci/core/Library.java:0:	POLooseCouplingRule:	Aplicação correcta (8) e incorrecta (0) do princípio Programar para abstracção no ficheiro Library.java.
[INFO] 061/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] 061/bci/core/User.java:0:	POLooseCouplingRule:	Aplicação correcta (6) e incorrecta (0) do princípio Programar para abstracção no ficheiro User.java.
[INFO] 061/bci/core/Work.java:0:	POLooseCouplingRule:	Aplicação correcta (4) 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] 061/bci/core/Creator.java:21:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Creator - devolve atributo (_works) em método público (getWorks)
[ERROR] 061/bci/core/Library.java:191:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe BorrowRecord - devolve atributo (_users) em método público (getUsers)
[ERROR] 061/bci/core/Library.java:216:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe BorrowRecord - devolve atributo (_works) em método público (getWorks)
[ERROR] 061/bci/core/Work.java:65:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Work - devolve atributo (_creators) em método público (getCreators)
[INFO] 061/bci/core/User.java:91:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe User evitada por criação de cópia (new ArrayList) de _notifications no método getNotifications.
[INFO] 061/bci/core/User.java:100:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe User evitada por criação de cópia (new ArrayList) de _borrowedWorks no método getBorrowedWorksList.
[INFO] 061/bci/core/User.java:104:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe User evitada por criação de cópia (new ArrayList) de _borrowHistory no método getBorrowHistory.
Total de erros:  4
Total de fugas evitadas:        3


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


[ERROR] 061/bci/core/User.java:57:9: Utilização de um ciclo 'for' para iterar o conteúdo da lista referenciada por '_borrowHistory' (do tipo 'List<Library.BorrowRecord>'). 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]
[ERROR] 061/bci/core/User.java:78:9: Utilização de um ciclo 'for' para iterar o conteúdo da lista referenciada por '_borrowHistory' (do tipo 'List<Library.BorrowRecord>'). 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]
[ERROR] 061/bci/core/User.java:135:9: Utilização de um ciclo 'for' para iterar o conteúdo da lista referenciada por '_borrowHistory' (do tipo 'List<Library.BorrowRecord>'). 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]
[ERROR] 061/bci/core/User.java:143:9: Utilização de um ciclo 'for' para iterar o conteúdo da lista referenciada por '_borrowHistory' (do tipo 'List<Library.BorrowRecord>'). 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]
[ERROR] 061/bci/core/User.java:157:9: Utilização de um ciclo 'for' para iterar o conteúdo da lista referenciada por '_borrowHistory' (do tipo 'List<Library.BorrowRecord>'). 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:  5


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


[WARN] 061/bci/core/Library.java:86:23: Parâmetro/variável local 'work' esconde atributo da classe com o mesmo nome [HiddenField]
[WARN] 061/bci/core/Library.java:86:33: Parâmetro/variável local 'borrowDate' esconde atributo da classe com o mesmo nome [HiddenField]
[WARN] 061/bci/core/Library.java:86:49: Parâmetro/variável local 'dueDate' esconde atributo da classe com o mesmo nome [HiddenField]
Total de erros:  0


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

[ERROR] 061/bci/core/Rule6.java:8:14: O tipo 'Rule6' deve condizer com o padrão '^[A-Z][a-zA-Z]+$'. [TypeName]
[ERROR] 061/bci/core/Rule1.java:8:14: O tipo 'Rule1' deve condizer com o padrão '^[A-Z][a-zA-Z]+$'. [TypeName]
[ERROR] 061/bci/core/Library.java:75:24: O atributo com o nome 'work'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 061/bci/core/Library.java:76:23: O atributo com o nome 'borrowDate'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 061/bci/core/Library.java:77:23: O atributo com o nome 'dueDate'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 061/bci/core/Library.java:78:21: O atributo com o nome 'returnDate'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 061/bci/core/User.java:136:78: Apenas uma instrução por linha é permitida. [OneStatementPerLine]
[ERROR] 061/bci/core/User.java:138:72: Apenas uma instrução por linha é permitida. [OneStatementPerLine]
[ERROR] 061/bci/core/User.java:158:74: Apenas uma instrução por linha é permitida. [OneStatementPerLine]
[ERROR] 061/bci/core/User.java:160:68: Apenas uma instrução por linha é permitida. [OneStatementPerLine]
[ERROR] 061/bci/core/Work.java:67:17: O método com o nome 'SetCreators' não está de acordo com o padrão '^[a-z][a-zA-Z]*[0-9]?$'. [MethodName]
[ERROR] 061/bci/core/Rule3.java:8:14: O tipo 'Rule3' deve condizer com o padrão '^[A-Z][a-zA-Z]+$'. [TypeName]
[ERROR] 061/bci/core/Rule2.java:8:14: O tipo 'Rule2' deve condizer com o padrão '^[A-Z][a-zA-Z]+$'. [TypeName]
[ERROR] 061/bci/core/Rule5.java:8:14: O tipo 'Rule5' deve condizer com o padrão '^[A-Z][a-zA-Z]+$'. [TypeName]
[ERROR] 061/bci/core/exception/CNoSuchUserException.java:3:14: Abreviações no nome 'CNoSuchUserException' não deveriam conter mais do que '1' letras maiúsculas consecutivas. [AbbreviationAsWordInName]
[ERROR] 061/bci/core/exception/CNoSuchWorkException.java:3:14: Abreviações no nome 'CNoSuchWorkException' não deveriam conter mais do que '1' letras maiúsculas consecutivas. [AbbreviationAsWordInName]
[ERROR] 061/bci/core/Rule4.java:8:14: O tipo 'Rule4' deve condizer com o padrão '^[A-Z][a-zA-Z]+$'. [TypeName]
Total de erros:  17

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

Iniciando a auditoria...
[INFO] 061/bci/core/LibraryManager.java:35 ObjectOutputStream criado no método 'public void save()' da classe 'LibraryManager'. [CheckSerialization]
[INFO] 061/bci/core/LibraryManager.java:199 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] 061/bci/core/Library.java:269 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão 'user.getBehaviour()' comparada '2' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 061/bci/core/Notification.java:48 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão '_type' comparada '3' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 061/bci/core/Parser.java:26 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] 061/bci/core/Rule4.java:13 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão 'user.getBehaviour()' comparada '2' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 061/bci/core/Work.java:55 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão '_category' comparada '2' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
Auditoria completa.

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

Iniciando a auditoria...
[WARN] 061/bci/core/Library.java:4 import 'bci.app.exception.NoSuchUserException' não permitido na classe 'Library'. [POCoreImport]
[WARN] 061/bci/core/Library.java:5 import 'bci.app.exception.NoSuchWorkException' não permitido na classe 'Library'. [POCoreImport]
[WARN] 061/bci/core/Library.java:6 import 'bci.app.exception.WorkNotBorrowedByUserException' não permitido na classe 'Library'. [POCoreImport]
Auditoria completa.

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

Iniciando a auditoria...
[INFO] 061/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 '18'. [POStaticMember]
Auditoria completa.

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

Iniciando a auditoria...
[ERROR] 061/bci/app/exception/WorkNotBorrowedByUserException.java:14 O atributo '_userId', com nível de acesso 'public', deveria ser privado e ter métodos acessores. [POVisibilityModifier]
[ERROR] 061/bci/app/exception/WorkNotBorrowedByUserException.java:17 O atributo '_workId', com nível de acesso 'public', deveria ser privado e ter métodos acessores. [POVisibilityModifier]
Auditoria completa.
O Checkstyle terminou com 2 erros.

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

Iniciando a auditoria...
[WARN] Possível erro: A classe 'Creator' utilizada no atributo 'private Set<Creator> _creators' da classe 'Library' 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 interfaces definidos no core: 1, dos quais 0 private, 0 package-private, 0 protected e 1 public. [WriteClassStructure]
[INFO] Interfaces definidos no package core da aplicação (1): '[WorkObserver]'. [WriteClassStructure]
[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): '[Type, Category, UserBehaviour]'. [WriteClassStructure]
[INFO] Número total de classes definidos no core: 27, dos quais 0 private, 1 package-private, 0 protected e 26 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 (16): '[User, Creator, Notification, Book, Rule6, Rule4, Rule5, Rule2, Rule3, Date, Parser, Rule1, BorrowRecord, Dvd, LibraryManager, Library]'. [WriteClassStructure]
[INFO] Excepções definidas no package core da aplicação (9): '[UnavailableFileException, CNoSuchUserException, BorrowingRuleFailedException, NoSuchBorrowException, UnrecognizedEntryException, UserNotSuspendedException, MissingFileAssociationException, CNoSuchWorkException, ImportFileException]'. [WriteClassStructure]
[INFO] Número total de métodos nas classes do core (sem excepções): 105, dos quais 4 private, 2 package-private, 0 protected e 99 public. [WriteClassStructure]
[INFO] Número total de atributos nas classes do core (sem excepções): 41, dos quais 40 private, 0 package-private, 1 protected e 0 public. [WriteClassStructure]
Auditoria completa.

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

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

 [WriteClassStructure]
[INFO] enum Category ( public )

 [WriteClassStructure]
[INFO] enum UserBehaviour ( public )

 [WriteClassStructure]
[INFO] interface WorkObserver ( public )

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

    void update(Notification notification)

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

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

    private int _id
    private boolean _isActive
    private String _name
    private String _email
    private int _fine
    private UserBehaviour _behaviour
    private List<Work> _borrowedWorks
    private List<Notification> _notifications
    private List<Library.BorrowRecord> _borrowHistory

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

    public int getId()
    public boolean isActive()
    public String getName()
    public String getEmail()
    public int getFine()
    public void suspend()
    public void activate()
    public int getDueDateOfBorrow(Work work)
    public boolean hasBorrowed(Work work)
    public void addBorrowedWork(Work work, int borrowDate, int dueDate)
    public void removeBorrowedWork(Work work, int returnDate)
    public void update(Notification notification)
    public List<Notification> getNotifications()
    public void clearNotifications()
    public UserBehaviour getBehaviour()
    public List<Work> getBorrowedWorksList()
    public List<Library.BorrowRecord> getBorrowHistory()
    public void payFine()
    public void addFine(int amount)
    public void updateBehaviour()
    public String toString()

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

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

    private String _name
    private List<Work> _works

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

    public String getName()
    public void add(Work work)
    public List<Work> getWorks()
    public void addWork(Work work)
    public String toString()

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

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

    private Type _type
    private String _workDescription
    private int _workId

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

    public Type getType()
    public String getWorkDescription()
    public int getWorkId()
    public String toString()

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

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

    private String _isbn

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

    public String toString()

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

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

    private int _id
    private int _price
    private int _numberOfCopies
    private int _numberOfCopiesAvailable
    private String _title
    private Category _category
    private List<Creator> _creators
    private List<WorkObserver> _observers

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

    public String getDescription()
    public int getId()
    public int getPrice()
    public int getNumberOfCopies()
    public int getNumberOfCopiesAvailable()
    public void setNumberOfCopiesAvailable(int numberOfCopiesAvailable)
    public void setNumberOfCopies(int numberOfCopies)
    public String getTitle()
    public Category getCategoryEnum()
    public String getCategory()
    public List<Creator> getCreators()
    public void SetCreators(List creators)
    public void addObserver(WorkObserver observer)
    public void removeObserver(WorkObserver observer)
    public void notifyObservers(Notification notification)
    public abstract String toString()

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

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

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

    public void check(User user, Work work)

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

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

    public void check(User user, Work work)

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

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

    public void check(User user, Work work)

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

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

    public void check(User user, Work work)

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

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

    public void check(User user, Work work)

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

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

    private int _currentDate

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

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

 [WriteClassStructure]
[INFO] class Parser (  )

  ###### 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] class Rule1 ( public )
  extends Rule

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

    public void check(User user, Work work)

 [WriteClassStructure]
[INFO] class BorrowRecord ( public, static implements Serializable )

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

    private final Work work
    private final int borrowDate
    private final int dueDate
    private Integer returnDate

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

    public Work getWork()
    public int getBorrowDate()
    public int getDueDate()
    public Integer getReturnDate()
    public void setReturnDate(int day)

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

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

    private String _igac

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

    public String toString()

 [WriteClassStructure]
[INFO] class LibraryManager ( public )

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

    private Library _library
    private String _filename
    private boolean _changed

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

    public void save()
    public void saveAs(String filename)
    public User getUser(int id)
    public Collection<User> getUsers()
    public void advanceDate(int nDays)
    public int getCurrentDate()
    public User registerUser(String name, String email)
    public Work getWork(int id)
    public List<Work> getWorks()
    public List<Work> getWorksByCreator(String creatorName)
    public List<Work> searchWorks(String term)
    public int requestWork(int userId, int workId)
    public void returnWork(int userId, int workId)
    public boolean changeWorkInventory(int workId, int amount)
    public int getFine(int userId)
    public void load(String filename)
    public void payFine(int userId)
    public void importFile(String datafile)
    public boolean hasUnsavedChanges()

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

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

    private Date _currentDate
    private int _nextWorkId
    private int _nextUserId
    private boolean _modified
    private List<User> _users
    private Set<Creator> _creators
    private List<Work> _works

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

    public int getCurrentDate()
    public void advanceDate(int nDays)
    public User registerUser(String userName, String email)
    public Creator registerCreator(String name)
    public User getUser(int id)
    public List<User> getUsers()
    public Work getWork(int id)
    public List<Work> getWorks()
    public List<Work> getWorksByCreator(String creatorName)
    public List<Work> searchWorks(String term)
    public int requestWork(int userId, int workId)
    public void returnWork(int userId, int workId)
    public int borrow(Library library, int userId, int workId)
    public boolean changeWorkInventory(int workId, int amount)
    public int getFine(int userId)
    public void registerBook(String isbn, List creators, String title, int price, int numberOfCopies, Category category)
    public void registerDvd(String igac, Creator creator, String title, int price, int numberOfCopies, Category category)
    void importFile(String filename)

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

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

    protected final int _ruleNumber

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

    public abstract void check(User user, Work work)
    public int getRuleNumber()

  ###### Subclasses  ###### 
    Rule6   Rule4   Rule5   Rule2   Rule3   Rule1   

   Method check(User, Work) overriden in subclass(es) Rule6 Rule4 Rule5 Rule2 Rule3 Rule1 
 [WriteClassStructure]
Auditoria completa.
