

####    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] 035/bci/app/main/DoOpenFile.java:50:	POAvoidCatchingGenericException:	Evitar apanhar excepções demasiado genéricas (RuntimeException and Exception) em blocos try-catch.
[ERROR] 035/bci/app/main/DoOpenFile.java:55:	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] 035/bci/app/main/DoOpenFile.java:55:	EmptyCatchBlock:	Evitar blocos catch vazios.
[ERROR] 035/bci/app/main/DoSaveFile.java:51:	EmptyCatchBlock:	Evitar blocos catch vazios.
[ERROR] 035/bci/app/main/DoSaveFile.java:54:	EmptyCatchBlock:	Evitar blocos catch vazios.
Total de erros:  5


####    Quebra do encapsulamento


Nada a assinalar


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


[INFO] 035/bci/core/Book.java:0:	POLooseCouplingRule:	Aplicação correcta (2) e incorrecta (0) do princípio Programar para abstracção no ficheiro Book.java.
[INFO] 035/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] 035/bci/core/Library.java:0:	POLooseCouplingRule:	Aplicação correcta (6) e incorrecta (0) do princípio Programar para abstracção no ficheiro Library.java.
[INFO] 035/bci/core/LibraryManager.java:0:	POLooseCouplingRule:	Aplicação correcta (2) e incorrecta (0) do princípio Programar para abstracção no ficheiro LibraryManager.java.
[INFO] 035/bci/core/Request.java:0:	POLooseCouplingRule:	Aplicação correcta (2) e incorrecta (0) do princípio Programar para abstracção no ficheiro Request.java.
[INFO] 035/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] 035/bci/core/Work.java:0:	POLooseCouplingRule:	Aplicação correcta (3) 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] 035/bci/core/Book.java:131:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Book - devolve atributo (_creators) em método público (getCreators)
[ERROR] 035/bci/core/Creator.java:80:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Creator - devolve atributo (_works) em método público (works)
[ERROR] 035/bci/core/Library.java:335:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Library - devolve atributo (_users) em método público (getUsers)
[ERROR] 035/bci/core/Request.java:115:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Request - devolve atributo (_observers) em método público (getObservers)
[ERROR] 035/bci/core/User.java:92:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe User - atribui parâmetro (requests) a atributo (_requests)
[ERROR] 035/bci/core/User.java:159:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe User - devolve atributo (_notifications) em método público (getNotifications)
[ERROR] 035/bci/core/User.java:213:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe User - devolve atributo (_requests) em método público (requests)
[ERROR] 035/bci/core/Work.java:184:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Work - devolve atributo (_requests) em método público (getRequests)
Total de erros:  8
Total de fugas evitadas:        0


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


[WARN] 035/bci/core/Library.java:124:	ExcessiveMethodLength:	Evitar métodos com um corpo grande.
[WARN] 035/bci/core/Library.java:539:	ExcessiveMethodLength:	Evitar métodos com um corpo grande.
[WARN] 035/bci/core/Library.java:676:	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] 035/bci/app/request/DoReturnWork.java:30:10: A variável local com o nome 'first_user'não está de acordo com o padrão '^[a-z][a-zA-Z0-9]*$'. [LocalVariableName]
Total de erros:  1

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

Iniciando a auditoria...
[INFO] 035/bci/core/Library.java:79 ObjectOutputStream criado no método 'void save(String filename)' da classe 'Library'. [CheckSerialization]
[INFO] 035/bci/core/Library.java:97 ObjectInputStream criado no método 'static Library load(String filename)' da classe 'Library'. [CheckSerialization]
Auditoria completa.

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

Iniciando a auditoria...
[WARN] 035/bci/core/Library.java:124 Possível mau desenho: diferenciação do comportamento com base em comparação de strings (expressão 'type' comparada '5' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 035/bci/core/Library.java:539 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão 'user.getBehaviour()' comparada '4' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 035/bci/core/MaxBorrowedWorks.java:10 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão 'user.getBehaviour()' comparada '4' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[ERROR] 035/bci/core/Notification.java:80 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] 035/bci/core/User.java:262 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão '_behaviour' comparada '2' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 035/bci/core/User.java:281 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão '_behaviour' comparada '2' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
Auditoria completa.
O Checkstyle terminou com 1 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

Iniciando a auditoria...
[WARN] 035/bci/core/CheckRequestTwice.java:2 import 'bci.app.exception.BorrowingRuleFailedException' não permitido na classe 'CheckRequestTwice'. [POCoreImport]
[ERROR] 035/bci/core/CheckRequestTwice.java:11 Classe 'BorrowingRuleFailedException', definida na camada de aplicação, não pode ser indicada na lista de excepções de um método de uma entidade do domínio. [POCoreImport]
[ERROR] 035/bci/core/CheckRequestTwice.java:14 instanciação do tipo 'BorrowingRuleFailedException' não permitido em classes da camada de domínio. [POCoreImport]
[WARN] 035/bci/core/IsActive.java:2 import 'bci.app.exception.BorrowingRuleFailedException' não permitido na classe 'IsActive'. [POCoreImport]
[ERROR] 035/bci/core/IsActive.java:14 Classe 'BorrowingRuleFailedException', definida na camada de aplicação, não pode ser indicada na lista de excepções de um método de uma entidade do domínio. [POCoreImport]
[ERROR] 035/bci/core/IsActive.java:17 instanciação do tipo 'BorrowingRuleFailedException' não permitido em classes da camada de domínio. [POCoreImport]
[ERROR] 035/bci/core/Library.java:622 Classe 'bci.app.exception.BorrowingRuleFailedException', definida na camada de aplicação, não pode ser indicada na lista de excepções de um método de uma entidade do domínio. [POCoreImport]
[ERROR] 035/bci/core/LibraryManager.java:330 Classe 'bci.app.exception.BorrowingRuleFailedException', definida na camada de aplicação, não pode ser indicada na lista de excepções de um método de uma entidade do domínio. [POCoreImport]
[WARN] 035/bci/core/MaxBorrowedWorks.java:2 import 'bci.app.exception.BorrowingRuleFailedException' não permitido na classe 'MaxBorrowedWorks'. [POCoreImport]
[ERROR] 035/bci/core/MaxBorrowedWorks.java:11 Classe 'BorrowingRuleFailedException', definida na camada de aplicação, não pode ser indicada na lista de excepções de um método de uma entidade do domínio. [POCoreImport]
[ERROR] 035/bci/core/MaxBorrowedWorks.java:29 instanciação do tipo 'BorrowingRuleFailedException' não permitido em classes da camada de domínio. [POCoreImport]
[WARN] 035/bci/core/MaxPriceRestriction.java:2 import 'bci.app.exception.BorrowingRuleFailedException' não permitido na classe 'MaxPriceRestriction'. [POCoreImport]
[ERROR] 035/bci/core/MaxPriceRestriction.java:11 Classe 'BorrowingRuleFailedException', definida na camada de aplicação, não pode ser indicada na lista de excepções de um método de uma entidade do domínio. [POCoreImport]
[ERROR] 035/bci/core/MaxPriceRestriction.java:14 instanciação do tipo 'BorrowingRuleFailedException' não permitido em classes da camada de domínio. [POCoreImport]
[WARN] 035/bci/core/NotReferenceCategory.java:2 import 'bci.app.exception.BorrowingRuleFailedException' não permitido na classe 'NotReferenceCategory'. [POCoreImport]
[ERROR] 035/bci/core/NotReferenceCategory.java:11 Classe 'BorrowingRuleFailedException', definida na camada de aplicação, não pode ser indicada na lista de excepções de um método de uma entidade do domínio. [POCoreImport]
[ERROR] 035/bci/core/NotReferenceCategory.java:13 instanciação do tipo 'BorrowingRuleFailedException' não permitido em classes da camada de domínio. [POCoreImport]
[WARN] 035/bci/core/Rules.java:2 import 'bci.app.exception.BorrowingRuleFailedException' não permitido na classe 'Rules'. [POCoreImport]
[ERROR] 035/bci/core/Rules.java:15 Classe 'BorrowingRuleFailedException', definida na camada de aplicação, não pode ser indicada na lista de excepções de um método de uma entidade do domínio. [POCoreImport]
Auditoria completa.
O Checkstyle terminou com 13 erros.

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

Iniciando a auditoria...
[ERROR] 035/bci/core/Library.java:96 Membro estático 'static Library load(String filename)' não recomendável. [POStaticMember]
[INFO] 035/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 '15'. [POStaticMember]
Auditoria completa.
O Checkstyle terminou com 1 erros.

####  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 'Request' utilizada no atributo 'private Set<Request> _requests' da classe 'User' não substitui os métodos hashCode e equals. [WriteClassStructure]
[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]
[WARN] Possível erro: A classe 'Creator' utilizada no atributo 'private Set<Creator> _creators' da classe 'Book' não substitui os métodos hashCode e equals. [WriteClassStructure]
[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]
[WARN] Possível erro: A classe 'Work' utilizada no atributo 'private Set<Work> _works' da classe 'Library' não substitui os métodos hashCode e equals. [WriteClassStructure]
[WARN] Possível erro: A classe 'User' utilizada no atributo 'private Set<User> _users' 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

Iniciando a auditoria...
[ERROR] Nível de acesso incorrecto (protected) nos seguintes membros '[isActive]' da classe 'User' dado que não envolve o mecanismo de herança [WriteClassStructure]
[ERROR] Nível de acesso incorrecto (protected) nos seguintes membros '[getCurrentDate, advanceDay]' da classe 'Date' dado que não envolve o mecanismo de herança [WriteClassStructure]
Auditoria completa.
O Checkstyle terminou com 2 erros.

####  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, UserBehaviour]'. [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): '[Rules, Work]'. [WriteClassStructure]
[INFO] Classes concretas e não excepções definidas no package core da aplicação (15): '[MaxPriceRestriction, User, IsActive, Request, Creator, MaxBorrowedWorks, Notification, HasCopies, Date, CheckRequestTwice, NotReferenceCategory, Dvd, Book, LibraryManager, Library]'. [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): 129, dos quais 7 private, 2 package-private, 4 protected e 116 public. [WriteClassStructure]
[INFO] Número total de atributos nas classes do core (sem excepções): 40, dos quais 40 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 )

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

    private final String _description

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

    public String toString()

 [WriteClassStructure]
[INFO] enum UserBehaviour ( public )

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

    private final String _description

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

    public String toString()

 [WriteClassStructure]
[INFO] class MaxPriceRestriction ( public )
  extends Rules

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

    public void check(Work work, User user)

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

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

    private int _id
    private Boolean _isActive
    private String _name
    private String _email
    private int _fine
    private Set<Request> _requests
    private UserBehaviour _behaviour
    private List<Notification> _notifications
    private int _onTimeReturns
    private int _lateReturns

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

    protected Boolean isActive()
    public boolean hasOverdueWorks(int currentDate)
    public boolean isActive(int currentDate)
    public void addNotification(Notification notification)
    public List<Notification> getAndClearNotifications()
    public List<Notification> getNotifications()
    public boolean hasNotifications()
    public int getId()
    public String getName()
    public String getEmail()
    public int getFine()
    public Set<Request> requests()
    public String toString()
    public UserBehaviour getBehaviour()
    public void setBehaviour(UserBehaviour behaviour)
    public void recordOnTimeReturn()
    public void recordLateReturn()
    public int getOnTimeReturns()
    public int getLateReturns()
    public void payFine(int amount)
    public void payFineAndActivate()
    public void addFine(int amount)
    public void setActive(boolean isActive)

 [WriteClassStructure]
[INFO] class IsActive ( public )
  extends Rules

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

    private int _currentDate

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

    public void check(Work work, User user)

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

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

    private Work _work
    private User _user
    private int _deadline
    private List<User> _observers

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

    public int deadline()
    public Work getWork()
    public User getUser()
    public void addObserver(User user)
    public void removeObserver(User user)
    public void notifyObservers()
    public List<User> getObservers()

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

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

    private String _name
    private Set<Work> _works

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

    public String name()
    public void addWork(Work work)
    public void removeWork(Work work)
    public Set<Work> works()
    public String toString()

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

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

    private final int _id

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

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

  ###### Subclasses  ###### 
    MaxPriceRestriction   IsActive   MaxBorrowedWorks   HasCopies   CheckRequestTwice   NotReferenceCategory   

   Method check(Work, User) overriden in subclass(es) MaxPriceRestriction IsActive MaxBorrowedWorks HasCopies CheckRequestTwice NotReferenceCategory 
 [WriteClassStructure]
[INFO] class MaxBorrowedWorks ( public )
  extends Rules

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

    public void check(Work work, User user)

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

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

    private String _message
    private String _type

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

    public String getMessage()
    public String getType()
    private String formatMessage(Work work, String type)
    public String toString()

 [WriteClassStructure]
[INFO] class HasCopies ( public )
  extends Rules

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

    public void check(Work work, User user)

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

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

    private int _currentDate

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

    protected int getCurrentDate()
    protected void advanceDay(int nDays)

 [WriteClassStructure]
[INFO] class CheckRequestTwice ( public )
  extends Rules

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

    public void check(Work work, User user)

 [WriteClassStructure]
[INFO] class NotReferenceCategory ( public )
  extends Rules

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

    public void check(Work work, User user)

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

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

    private String _igac
    private Creator _director

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

    public String getIgac()
    public void setIgac(String igac)
    public String toString()
    public String getIdentifier()
    public Set<Creator> getCreators()

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

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

    private String _isbn
    private Set<Creator> _creators

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

    public String getIsbn()
    public void setIsbn(String isbn)
    public String listCreatorsString()
    public String toString()
    public String getIdentifier()
    public Set<Creator> getCreators()

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

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

    private int _id
    private int _price
    private int _numberOfCopies
    private String _title
    private Category _category
    private List<Request> _requests

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

    public int getId()
    public int getPrice()
    public int getNumberOfCopies()
    public String getTitle()
    public Category getCategory()
    public void setPrice(int price)
    public void setNumberOfCopies(int numberOfCopies)
    public void changeInventory(int quantityChange)
    public void setTitle(String title)
    public void setCategory(Category category)
    protected String getDescription()
    public List<Request> getRequests()
    public void addRequest(Request request)
    public void deleteRequest(Request request)
    public abstract String toString()
    public abstract String getIdentifier()
    public abstract Set<Creator> getCreators()

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

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

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

    private Library _library
    private String _filename
    private boolean _hasUnsavedChanges

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

    public boolean hasUnsavedChanges()
    private void markAsChanged()
    private void markAsSaved()
    public void save()
    public void saveAs(String filename)
    public void load(String filename)
    public void importFile(String datafile)
    public Date date()
    public int getCurrentDate()
    public String displayWorks()
    public void displayWork(Work work)
    public Work getWorkById(int id)
    public String showUser(int id)
    public String listUsers()
    public void advanceDate(int nDays)
    public int registerUser(String name, String email)
    public Set<Work> getWorksByCreator(String name)
    public Set<Work> searchWorks(String searchTerm)
    public User getUserById(int userId)
    public int requestWork(Work work, User user, boolean wantsNotification)
    public int returnWork(Work work, User user)
    public void payUserFine(User user, int amount)
    public void payUserFineAndActivate(User user)
    public String getUserNotifications(User user)
    public void changeWorkInventory(Work work, int quantityChange)

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

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

    private Date _date
    private Set<Creator> _creators
    private Set<Work> _works
    private Set<User> _users
    private int _nextWorkId
    private int _nextUserId

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

    void save(String filename)
    static Library load(String filename)
    public void importFile(String filename)
    private Creator findOrCreateCreator(String name)
    public Date date()
    public int getCurrentDate()
    public String displayWorks()
    public void displayWork(Work work)
    public Work getWork(int id)
    public int getWorksCount()
    public int getCreatorsCount()
    public Work getWorkById(int id)
    public Set<User> getUsers()
    public String listUsers()
    public User getUserById(int id)
    public String showUser(int id)
    public String notificationMessage(Work work, User user, String type)
    public void advanceDate(int nDays)
    public int registerUser(String name, String email)
    public Set<Work> getWorksByCreator(String creatorName)
    public Set<Work> searchWorks(String searchTerm)
    private int calculateLoanPeriod(Work work, User user)
    private int calculateFine(int daysLate, int workPrice, UserBehaviour userBehaviour)
    public int requestWork(Work work, User user, boolean wantsNotification)
    public int returnWork(Work work, User user)
    private void notifyObserversForWork(Work work)
    public void changeWorkInventory(Work work, int quantityChange)

 [WriteClassStructure]
Auditoria completa.
