

####    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] 012/bci/app/user/DoRegisterUser.java:33:	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] 012/bci/app/main/DoSaveFile.java:34:	EmptyCatchBlock:	Evitar blocos catch vazios.
[ERROR] 012/bci/app/main/DoSaveFile.java:36:	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] 012/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] 012/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] 012/bci/core/Library.java:0:	POLooseCouplingRule:	Aplicação correcta (9) e incorrecta (0) do princípio Programar para abstracção no ficheiro Library.java.
[INFO] 012/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] 012/bci/core/User.java:0:	POLooseCouplingRule:	Aplicação correcta (7) e incorrecta (0) do princípio Programar para abstracção no ficheiro User.java.
[INFO] 012/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] 012/bci/core/Book.java:22:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Book - atribui parâmetro (authors) a atributo (_authors)
[ERROR] 012/bci/core/Creator.java:37:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Creator - devolve atributo (_works) em método público (works)
[ERROR] 012/bci/core/Library.java:71:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Library - devolve atributo (_users) em método público (getUsers)
[ERROR] 012/bci/core/User.java:195:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe User - devolve atributo (_requests) em método público (getRequests)
[ERROR] 012/bci/core/Work.java:66:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Work - devolve atributo (_requests) em método público (getRequests)
[INFO] 012/bci/core/Library.java:149:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe Library evitada por criação de cópia (new ArrayList) de _works no método getWorks.
[INFO] 012/bci/core/Library.java:193:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe Library evitada por criação de cópia (new ArrayList) de _requests no método getRequests.
[INFO] 012/bci/core/User.java:56:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe User evitada por criação de cópia (new ArrayList) de _notifications no método getNotifications.
[INFO] 012/bci/core/User.java:74:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe User evitada por criação de cópia (new ArrayList) de _availabilitySubscriptions no método getAvailabilitySubscriptions.
Total de erros:  5
Total de fugas evitadas:        4


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


[WARN] 012/bci/core/User.java:116:	ExcessiveMethodLength:	Evitar métodos com um corpo grande.
[ERROR] 012/bci/core/User.java:128:13: Utilização de um ciclo 'for' para iterar o conteúdo da lista referenciada por '_history' (do tipo 'List<Boolean>'). 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] 012/bci/core/User.java:143:13: Utilização de um ciclo 'for' para iterar o conteúdo da lista referenciada por '_history' (do tipo 'List<Boolean>'). 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] 012/bci/core/User.java:158:13: Utilização de um ciclo 'for' para iterar o conteúdo da lista referenciada por '_history' (do tipo 'List<Boolean>'). 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:  3


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


[WARN] 012/bci/core/Category.java:14:29: Parâmetro/variável local 'displayName' esconde atributo da classe com o mesmo nome [HiddenField]
Total de erros:  0


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

[ERROR] 012/bci/core/Category.java:12:26: O atributo com o nome 'displayName'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
Total de erros:  1

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

Iniciando a auditoria...
[INFO] 012/bci/core/LibraryManager.java:63 ObjectOutputStream criado no método 'public void save()' da classe 'LibraryManager'. [CheckSerialization]
[INFO] 012/bci/core/LibraryManager.java:108 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] 012/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]
Auditoria completa.

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

Iniciando a auditoria...
[ERROR] 012/bci/app/request/DoRequestWork.java:65 Instanciação de classe do domínio 'Request' não permitido na camada da aplicação. [POCreateCoreEntitiesInApp]
Auditoria completa.
O Checkstyle terminou com 1 erros.

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


Nada a assinalar


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

Iniciando a auditoria...
[WARN] 012/bci/core/LibraryManager.java:5 import 'bci.app.exception.BorrowingRuleFailedException' não permitido na classe 'LibraryManager'. [POCoreImport]
[ERROR] 012/bci/core/LibraryManager.java:134 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] 012/bci/core/LibraryManager.java:150 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] 012/bci/core/LibraryManager.java:153 instanciação do tipo 'BorrowingRuleFailedException' não permitido em classes da camada de domínio. [POCoreImport]
[ERROR] 012/bci/core/LibraryManager.java:158 instanciação do tipo 'BorrowingRuleFailedException' não permitido em classes da camada de domínio. [POCoreImport]
[ERROR] 012/bci/core/LibraryManager.java:163 instanciação do tipo 'BorrowingRuleFailedException' não permitido em classes da camada de domínio. [POCoreImport]
[ERROR] 012/bci/core/LibraryManager.java:168 instanciação do tipo 'BorrowingRuleFailedException' não permitido em classes da camada de domínio. [POCoreImport]
[ERROR] 012/bci/core/LibraryManager.java:173 instanciação do tipo 'BorrowingRuleFailedException' não permitido em classes da camada de domínio. [POCoreImport]
[ERROR] 012/bci/core/LibraryManager.java:178 instanciação do tipo 'BorrowingRuleFailedException' não permitido em classes da camada de domínio. [POCoreImport]
Auditoria completa.
O Checkstyle terminou com 8 erros.

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

Iniciando a auditoria...
[INFO] 012/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 '16'. [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


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'matchesCreator' 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: 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, UserBehavior]'. [WriteClassStructure]
[INFO] Número total de classes definidos no core: 16, dos quais 0 private, 1 package-private, 0 protected e 15 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 (10): '[User, Request, Creator, Notification, Date, Parser, 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): 122, dos quais 8 private, 2 package-private, 0 protected e 112 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 Type ( public )

 [WriteClassStructure]
[INFO] enum Category ( public )

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

    private final String displayName

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

    public String getDisplayName()

 [WriteClassStructure]
[INFO] enum UserBehavior ( public )

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

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

    private int _id
    private boolean _isActive
    private String _name
    private String _email
    private UserBehavior _userBehavior
    private List<Request> _requests
    private List<Boolean> _history
    private double _fine
    private List<Notification> _notifications
    private List<Work> _availabilitySubscriptions

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

    public boolean isCompliant()
    public boolean isDefaulting()
    public void addNotification(Notification notification)
    public List<Notification> getNotifications()
    public void clearNotifications()
    public void subscribeToAvailability(Work work)
    public boolean isSubscribedToAvailability(Work work)
    public List<Work> getAvailabilitySubscriptions()
    public boolean isActive()
    public String toString()
    public void addToFine(int amount)
    public int getId()
    public void updateActivity(Date currentDate)
    public void updateBehavior()
    public void registerReturn(boolean onTime)
    public void addRequest(Request r)
    public List<Request> getRequests()
    public void suspend()
    public void activate()
    public boolean isSuspended()
    public void payFine(int userId)
    public String getName()
    public String getEmail()
    public UserBehavior getBehavior()
    public double getFineAmount()

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

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

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

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

    public boolean isOverdue(Date currentDate)
    public int calculateFine(Date currentDate)
    public void returnWork()
    public boolean isReturned()
    public Work getWork()
    public User getUser()
    public int getDeadline()
    public int getRequestDate()

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

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

    private String _name
    private Collection<Work> _works

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

    public void add(Work work)
    public void remove(Work work)
    public Collection<Work> works()
    public boolean hasWorks()
    public String getName()

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

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

    private final String _message
    private final Type _type

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

    public Type getType()
    public String toString()

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

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

    private int _currentDate

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

    public int getCurrentDate()
    public void advanceDays(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 Dvd ( public implements Serializable )
  extends Work

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

    private String _igac
    private Creator _realizador

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

    public String toString()
    public String getCreatorName()
    public Creator getCreator()
    public boolean matchesCreator(String creatorName)

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

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

    private String _isbn
    private List<Creator> _authors

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

    public String toString()
    public void addAuthor(Creator author)
    public void removeAuthor(Creator author)
    public String getCreatorName()
    public Creator getCreator()
    public boolean hasAuthor(String authorName)
    public boolean matchesCreator(String creatorName)

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

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

    private int _id
    private int _price
    private int _numberOfCopies
    private String _title
    private List<Request> _requests
    private Category _category
    private int _nextId
    private int _numberOfAvailableCopies
    private List<User> _availabilityInterestedUsers
    private boolean _toBeRemoved

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

    public void increaseAvailableCopies()
    public abstract String toString()
    public int getId()
    public int getPrice()
    public int getNumberOfCopies()
    public String getTitle()
    public Category getCategory()
    public List<Request> getRequests()
    public int getNumberOfAvailableCopies()
    public boolean updateNumberOfCopies(int amount)
    private void removeFromSystem()
    public boolean shouldBeRemoved()
    public boolean isEmpty()
    public abstract String getCreatorName()
    public abstract Creator getCreator()
    public boolean decreaseAvailableCopies()
    public boolean matchesCreator(String creatorName)

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

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

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

    private Library _library
    private String _filename
    private List<Request> _requests

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

    public Date getCurrentDate()
    public void advanceDays(int nDays)
    public User createUser(String userName, String email)
    public User getUser(int id)
    public List<User> getUsers()
    public void save()
    public void saveAs(String filename)
    public void load(String filename)
    public int calculateLoanDuration(Work work, User user)
    public Request createRequest(User user, Work work, Date currentDate)
    public void checkBorrowingRules(User user, Work work)
    public void subscribeToAvailability(User user, Work work)
    public void notifyAvailabilitySubscribers(Work work)
    public List<Work> getWorks()
    public List<Work> getWorksByCreator(String creatorName)
    public void importFile(String datafile)
    public void removeWork(Work work)
    public User registerUser(String name, String email)
    public Work getWork(int workId)
    public void addRequest(Request request)
    public Request findActiveRequest(int userId, int workId)
    private boolean hasActiveRequestForWork(User user, Work work)
    private int getActiveRequestsCount(User user)
    private int getBorrowLimit(User user)

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

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

    private int _nextWorkId
    private int _nextUserId
    private boolean _modified
    private Date _date
    private List<Creator> _creators
    private List<Work> _works
    private List<Request> _requests
    private List<User> _users

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

    public Date getCurrentDate()
    public void advanceDays(int nDays)
    public User createUser(String userName, String email)
    public User getUser(int id)
    public List<User> getUsers()
    public void addWork(Work w)
    public void registerDvd(String title, int price, int numberOfCopies, Category category, String igac, Creator realizador)
    public void registerBook(String title, int price, int numberOfCopies, Category category, String isbn, List authors)
    public void removeWork(Work w)
    public Work findById(int id)
    public void addUser(String name, String email)
    public void removeUserById(int id)
    public User findUserById(int id)
    public Creator registerCreator(String name)
    public List<Work> getWorks()
    public List<Work> getWorksByCreator(String creatorName)
    void importFile(String filename)
    public Work getWork(int workId)
    public void addRequest(Request request)
    public List<Request> getRequests()
    public Request findActiveRequest(int userId, int workId)

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

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

    private int _id

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

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

 [WriteClassStructure]
Auditoria completa.
