

####    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] 074/bci/core/LibraryManager.java:34:	POAvoidCatchingGenericException:	Evitar apanhar excepções demasiado genéricas (RuntimeException and Exception) em blocos try-catch.
Total de erros:  1


####    Quebra do encapsulamento


Nada a assinalar


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


[INFO] 074/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] 074/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] 074/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] 074/bci/core/User.java:0:	POLooseCouplingRule:	Aplicação correcta (4) e incorrecta (1) do princípio Programar para abstracção no ficheiro User.java.
[ERROR] 074/bci/core/User.java:20:	POLooseCouplingRule:	Erro: Evite declarar variáveis utilizando tipos concretos como 'LinkedList'; Em vez do tipo concreto utilize a interface.
[INFO] 074/bci/core/Work.java:0:	POLooseCouplingRule:	Aplicação correcta (1) e incorrecta (0) do princípio Programar para abstracção no ficheiro Work.java.
Total de erros:  1


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


[ERROR] 074/bci/core/Book.java:15:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Book - atribui parâmetro (creators) a atributo (_creators)
[INFO] 074/bci/core/Book.java:19:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em Book por uso de Collections.unmodifiableList para devolver vista imutável de _creators em método getCreators
[INFO] 074/bci/core/Library.java:224:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe Library evitada por criação de cópia (new ArrayList) de _work.values() no método getWorks.
[INFO] 074/bci/core/User.java:152:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe User evitada por criação de cópia (new ArrayList) de _requests no método getRequests.
Total de erros:  1
Total de fugas evitadas:        3


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


[ERROR] 074/bci/core/User.java:110:9: Utilização de um ciclo 'for' para iterar o conteúdo da lista referenciada por '_returnHistory' (do tipo 'LinkedList<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] 074/bci/core/User.java:120:9: Utilização de um ciclo 'for' para iterar o conteúdo da lista referenciada por '_returnHistory' (do tipo 'LinkedList<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] 074/bci/core/Book.java:29:7: 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:  3


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


[WARN] 074/bci/core/exception/RulesException.java:8:31: Parâmetro/variável local 'userId' esconde atributo da classe com o mesmo nome [HiddenField]
[WARN] 074/bci/core/exception/RulesException.java:8:43: Parâmetro/variável local 'workId' esconde atributo da classe com o mesmo nome [HiddenField]
[WARN] 074/bci/core/exception/RulesException.java:8:55: Parâmetro/variável local 'ruleNumber' esconde atributo da classe com o mesmo nome [HiddenField]
Total de erros:  0


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

[ERROR] 074/bci/core/ResponsibleUserState.java:4:38: Abreviações no nome 'INSTANCE' não deveriam conter mais do que '1' letras maiúsculas consecutivas. [AbbreviationAsWordInName]
[ERROR] 074/bci/core/ResponsibleUserState.java:4:38: O atributo com o nome 'INSTANCE'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 074/bci/core/DVD.java:3:14: Abreviações no nome 'DVD' não deveriam conter mais do que '1' letras maiúsculas consecutivas. [AbbreviationAsWordInName]
[ERROR] 074/bci/core/DVD.java:5:18: Abreviações no nome '_IGAC' não deveriam conter mais do que '1' letras maiúsculas consecutivas. [AbbreviationAsWordInName]
[ERROR] 074/bci/core/DVD.java:5:18: O atributo com o nome '_IGAC'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 074/bci/core/DVD.java:7:85: O parâmetro 'IGAC' deve condizer com o padrão '^[a-z][a-zA-Z]*[0-9]?$'. [ParameterName]
[ERROR] 074/bci/core/IrresponsibleUserState.java:4:40: Abreviações no nome 'INSTANCE' não deveriam conter mais do que '1' letras maiúsculas consecutivas. [AbbreviationAsWordInName]
[ERROR] 074/bci/core/IrresponsibleUserState.java:4:40: O atributo com o nome 'INSTANCE'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 074/bci/core/Library.java:292:90: O parâmetro 'IGAC' deve condizer com o padrão '^[a-z][a-zA-Z]*[0-9]?$'. [ParameterName]
[ERROR] 074/bci/core/Library.java:310:91: O parâmetro 'ISBN' deve condizer com o padrão '^[a-z][a-zA-Z]*[0-9]?$'. [ParameterName]
[ERROR] 074/bci/core/User.java:15:26: O atributo com o nome '_Behavior'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 074/bci/core/User.java:107:45: Abreviações no nome 'lastNAllOnTime' não deveriam conter mais do que '1' letras maiúsculas consecutivas. [AbbreviationAsWordInName]
[ERROR] 074/bci/core/User.java:117:45: Abreviações no nome 'lastNAllLate' não deveriam conter mais do que '1' letras maiúsculas consecutivas. [AbbreviationAsWordInName]
[ERROR] 074/bci/core/Work.java:31:79: Apenas uma instrução por linha é permitida. [OneStatementPerLine]
[ERROR] 074/bci/core/Book.java:9:24: O atributo com o nome '_ISBN'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 074/bci/core/Book.java:12:86: O parâmetro 'ISBN' deve condizer com o padrão '^[a-z][a-zA-Z]*[0-9]?$'. [ParameterName]
[ERROR] 074/bci/core/NormalUserState.java:4:33: Abreviações no nome 'INSTANCE' não deveriam conter mais do que '1' letras maiúsculas consecutivas. [AbbreviationAsWordInName]
[ERROR] 074/bci/core/NormalUserState.java:4:33: O atributo com o nome 'INSTANCE'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 074/bci/core/exception/RulesException.java:4:17: O atributo com o nome 'userId'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 074/bci/core/exception/RulesException.java:5:17: O atributo com o nome 'workId'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 074/bci/core/exception/RulesException.java:6:17: O atributo com o nome 'ruleNumber'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 074/bci/app/request/DoReturnWork.java:25:9: A variável local com o nome 'IdUser'não está de acordo com o padrão '^[a-z][a-zA-Z0-9]*$'. [LocalVariableName]
[ERROR] 074/bci/app/request/DoReturnWork.java:26:9: A variável local com o nome 'IdWork'não está de acordo com o padrão '^[a-z][a-zA-Z0-9]*$'. [LocalVariableName]
[ERROR] 074/bci/app/request/DoRequestWork.java:29:9: A variável local com o nome 'IdUser'não está de acordo com o padrão '^[a-z][a-zA-Z0-9]*$'. [LocalVariableName]
[ERROR] 074/bci/app/request/DoRequestWork.java:30:9: A variável local com o nome 'IdWork'não está de acordo com o padrão '^[a-z][a-zA-Z0-9]*$'. [LocalVariableName]
Total de erros:  25

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

Iniciando a auditoria...
[INFO] 074/bci/core/LibraryManager.java:144 ObjectOutputStream criado no método 'public void save()' da classe 'LibraryManager'. [CheckSerialization]
[INFO] 074/bci/core/LibraryManager.java:174 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] 074/bci/core/Category.java:8 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão 'this' comparada '4' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[ERROR] 074/bci/core/Library.java:244 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] 074/bci/core/Library.java:248 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] 074/bci/core/LibraryManager.java:101 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] 074/bci/core/LibraryManager.java:105 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] 074/bci/core/Parser.java:28 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] 074/bci/core/UserState.java:6 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão 'behavior' comparada '4' 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


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...
[ERROR] 074/bci/core/IrresponsibleUserState.java:4 Membro estático 'IrresponsibleUserState INSTANCE' não recomendável. [POStaticMember]
[ERROR] 074/bci/core/NormalUserState.java:4 Membro estático 'NormalUserState INSTANCE' não recomendável. [POStaticMember]
[ERROR] 074/bci/core/ResponsibleUserState.java:4 Membro estático 'ResponsibleUserState INSTANCE' não recomendável. [POStaticMember]
[ERROR] 074/bci/core/UserState.java:6 Membro estático 'static UserState forBehavior(UserBehavior behavior)' não recomendável. [POStaticMember]
[INFO] 074/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 '19'. [POStaticMember]
Auditoria completa.
O Checkstyle terminou com 4 erros.

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

Iniciando a auditoria...
[ERROR] 074/bci/core/IrresponsibleUserState.java:4 O atributo 'INSTANCE', com nível de acesso 'public', deveria ser privado e ter métodos acessores. [POVisibilityModifier]
[ERROR] 074/bci/core/NormalUserState.java:4 O atributo 'INSTANCE', com nível de acesso 'public', deveria ser privado e ter métodos acessores. [POVisibilityModifier]
[ERROR] 074/bci/core/ResponsibleUserState.java:4 O atributo 'INSTANCE', com nível de acesso 'public', deveria ser privado e ter métodos acessores. [POVisibilityModifier]
Auditoria completa.
O Checkstyle terminou com 3 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 interfaces definidos no core: 2, dos quais 0 private, 0 package-private, 0 protected e 2 public. [WriteClassStructure]
[INFO] Interfaces definidos no package core da aplicação (2): '[UserState, Rule]'. [WriteClassStructure]
[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): '[Type, Category, InterestType, UserBehavior]'. [WriteClassStructure]
[INFO] Número total de classes definidos no core: 25, dos quais 0 private, 1 package-private, 0 protected e 24 public. [WriteClassStructure]
[INFO] Classes abstractas definidas no package core da aplicação (1): '[Work]'. [WriteClassStructure]
[INFO] Classes concretas e não excepções definidas no package core da aplicação (18): '[User, Creator, Notification, RuleF, RuleD, RuleE, NormalUserState, Book, ResponsibleUserState, RuleB, RuleC, RuleA, Request, Parser, DVD, LibraryManager, Library, IrresponsibleUserState]'. [WriteClassStructure]
[INFO] Excepções definidas no package core da aplicação (6): '[ThirdRuleException, UnavailableFileException, UnrecognizedEntryException, RulesException, MissingFileAssociationException, ImportFileException]'. [WriteClassStructure]
[INFO] Número total de métodos nas classes do core (sem excepções): 117, dos quais 9 private, 2 package-private, 0 protected e 106 public. [WriteClassStructure]
[INFO] Número total de atributos nas classes do core (sem excepções): 46, dos quais 43 private, 0 package-private, 0 protected e 3 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 )

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

    public String toString()

 [WriteClassStructure]
[INFO] enum InterestType ( public )

 [WriteClassStructure]
[INFO] enum UserBehavior ( public )

 [WriteClassStructure]
[INFO] interface UserState ( public )

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

    int loanDays(Work work)
    static UserState forBehavior(UserBehavior behavior)
    public int maxRequests()
    public boolean canRequestExpensive(Work work)

 [WriteClassStructure]
[INFO] interface Rule ( public )
  extends Serializable

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

    boolean checkRule(User user, Work work)

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

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

    private int _id
    private boolean _isActive
    private String _name
    private String _email
    private int _fine
    private UserBehavior _Behavior
    private java.util.List _requests
    private UserState _state
    private final LinkedList<Boolean> _returnHistory
    private final java.util.List _inbox

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

    public String getEmail()
    public String getName()
    public int getId()
    public int getmulta()
    public boolean getisActive()
    public UserBehavior getBehavior()
    public void payfine()
    public void requestWork(Request r)
    public void setBehavior(UserBehavior b)
    public int computeLoanDays(Work work)
    public int computeDeadline(int requestDate, Work work)
    public String toString()
    private Object readResolve()
    public int computeFine(int today, Request r)
    public void addFine(int amount)
    public void recordReturn(boolean late)
    public List<Request> getRequests()
    public Request findActiveRequestFor(Work work)
    public void setsuspended()
    public void setactive()
    public void pushNotification(Notification n)
    public java.util.List pullAllNotifications()
    public boolean removeRequest(Request req)
    public boolean hasOverdue(int today)
    public boolean hasOtherOverdue(int today, Request exclude)

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

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

    private String _name

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

    public String getName()

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

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

    private final Type _type
    private final String _message

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

    public Type getType()
    public String getMessage()
    public String toString()

 [WriteClassStructure]
[INFO] class RuleF ( public implements Rule )

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

    public boolean checkRule(User user, Work work)

 [WriteClassStructure]
[INFO] class RuleD ( public implements Rule )

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

    public boolean checkRule(User user, Work work)

 [WriteClassStructure]
[INFO] class RuleE ( public implements Rule )

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

    public boolean checkRule(User user, Work work)

 [WriteClassStructure]
[INFO] class NormalUserState ( public implements UserState )

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

    public static NormalUserState INSTANCE

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

    public int loanDays(Work work)
    public int maxRequests()
    public boolean canRequestExpensive(Work work)

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

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

    private final String _ISBN
    private final List<Creator> _creators

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

    public List<Creator> getCreators()
    public String toString()

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

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

    private int _disponiveis
    private int _id
    private int _price
    private int _numberOfCopies
    private String _title
    private Category _category
    private final java.util.Map _observers

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

    public int getId()
    public int getDisponiveis()
    public int getCopies()
    public String getTitle()
    public int getPrice()
    public Category getCategory()
    public abstract String toString()
    public void setdisponiveis()
    public void changeinventory(int n)
    public void increaseDisponiveis()
    public void addInterest(User u, InterestType type)
    public void removeInterest(User u, InterestType type)
    public void notifyBorrow()
    public void notifyAvailable()
    private String formatForListing()

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

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

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

    public static ResponsibleUserState INSTANCE

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

    public int loanDays(Work work)
    public int maxRequests()
    public boolean canRequestExpensive(Work work)

 [WriteClassStructure]
[INFO] class RuleB ( public implements Rule )

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

    public boolean checkRule(User user, Work work)

 [WriteClassStructure]
[INFO] class RuleC ( public implements Rule )

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

    public boolean checkRule(User user, Work work)

 [WriteClassStructure]
[INFO] class RuleA ( public implements Rule )

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

    public boolean checkRule(User user, Work work)

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

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

    private final int _deadline
    private final Work _work
    private final int _requestDate
    private boolean _returned
    private int _returnDate

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

    public int getDeadline()
    public Work getWork()
    public int getRequestDate()
    public boolean getisReturned()
    public void markReturned(int day)

 [WriteClassStructure]
[INFO] class Parser (  )

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

    private final 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 )
  extends Work

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

    private String _IGAC
    private final Creator _creator

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

    public Creator getCreator()
    public String toString()

 [WriteClassStructure]
[INFO] class LibraryManager ( public )

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

    private Library _library
    private int _nextUserId
    private int _nextCreatorId
    private String _fileName
    private boolean _changed

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

    public boolean checkRules(User user, Work work)
    public void importFile(String filename)
    public int getCurrentDate()
    public void advanceDays(int n)
    public boolean isChanged()
    public List<User> getUsers()
    public User registerUser(String name, String email)
    public User getUser(int id)
    public List<Work> getWorks()
    public Work getWork(int id)
    public void payfine(int id)
    public void changeinventory(int workId, int n)
    public void removework(int workId)
    public void returnWork(int userId, int workId)
    public List<Work> performsearch(String term)
    public List<Work> getWorksByCreator(String name)
    public void requestWork(int userId, int workId)
    public void save()
    public void saveAs(String filename)
    public void load(String filename)

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

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

    private int _nextWorkId
    private int _nextUserId
    private int _currentDate
    private boolean _changed
    private List<Rule> _rules
    private final Map<String, Creator> _creators
    private final Map<Integer, User> _users
    private final Map<Integer, Work> _work

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

    public boolean checkRules(User user, Work work)
    public int getCurrentDate()
    public void setCurrentDate(int d)
    public void setChanged(boolean changed)
    public boolean isChanged()
    public void advanceDays(int n)
    public Creator registerCreator(String name)
    public List<User> getUsers()
    public User registerUser(String name, String email)
    public User getUser(int id)
    public void payfine(int id)
    public void changeinventory(int workId, int n)
    public void removework(int workId)
    public void returnWork(int userId, int workId)
    public List<Work> getWorks()
    public List<Work> performSearch(String term)
    private boolean matchesWork(Work w, String q)
    private boolean containsNormalized(String source, String q)
    private String normalize(String s)
    public Work getWork(int id)
    public void registerDvd(int price, String title, int copies, Category category, String IGAC, Creator creator, int disponiveis)
    public void registerBook(int price, String title, int copies, Category category, String ISBN, List creators, int disp)
    public void requestWork(User u, Work w, Request r)
    void importFile(String filename)

 [WriteClassStructure]
[INFO] class IrresponsibleUserState ( public implements UserState )

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

    public static IrresponsibleUserState INSTANCE

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

    public int loanDays(Work work)
    public int maxRequests()
    public boolean canRequestExpensive(Work work)

 [WriteClassStructure]
Auditoria completa.
