

####    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] 007/bci/app/main/DoSaveFile.java:36:	POExceptionAsFlowControlRule:	Evite a utilização de excepções como controlo de fluxo.

	 Blocos catch's iguais ou vazios (incluindo neste casos blocos try e finaly vazios)

[INFO] 007/bci/app/main/DoSaveFile.java:38:	IdenticalCatchBranches:	Ramo 'catch' idênticol to ramo 'MissingFileAssociationException | FileNotFoundException' pertencentes à mesma instrução try.
Total de erros:  1


####    Quebra do encapsulamento


Nada a assinalar


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


[INFO] 007/bci/core/Book.java:0:	POLooseCouplingRule:	Aplicação correcta (4) e incorrecta (0) do princípio Programar para abstracção no ficheiro Book.java.
[INFO] 007/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] 007/bci/core/Library.java:0:	POLooseCouplingRule:	Aplicação correcta (11) e incorrecta (0) do princípio Programar para abstracção no ficheiro Library.java.
[INFO] 007/bci/core/LibraryManager.java:0:	POLooseCouplingRule:	Aplicação correcta (3) e incorrecta (0) do princípio Programar para abstracção no ficheiro LibraryManager.java.
[INFO] 007/bci/core/User.java:0:	POLooseCouplingRule:	Aplicação correcta (4) e incorrecta (0) do princípio Programar para abstracção no ficheiro User.java.
[INFO] 007/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] 007/bci/core/User.java:118:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe User - devolve atributo (_notifications) em método público (getNotifications)
[WARN] 007/bci/core/Book.java:21:	MethodReturnsFieldCollectionRule:	Potencial fuga de privacidade (aceite) em método getAuthors da classe Book: devolve referência directa para '_authors' mas método não é público: package-private
[WARN] 007/bci/core/Creator.java:30:	MethodReturnsFieldCollectionRule:	Potencial fuga de privacidade (aceite) em método works da classe Creator: devolve referência directa para '_works' mas método não é público: package-private
[WARN] 007/bci/core/Library.java:435:	MethodReturnsFieldCollectionRule:	Potencial fuga de privacidade (aceite) em método getUsersL da classe Library: devolve referência directa para '_usersOrganized' mas método não é público: package-private
[WARN] 007/bci/core/Library.java:445:	MethodReturnsFieldCollectionRule:	Potencial fuga de privacidade (aceite) em método getWorksL da classe Library: devolve referência directa para '_workOrganized' mas método não é público: package-private
[WARN] 007/bci/core/User.java:136:	MethodReturnsFieldCollectionRule:	Potencial fuga de privacidade (aceite) em método getRequests da classe User: devolve referência directa para '_requests' mas método não é público: package-private
[WARN] 007/bci/core/Work.java:63:	MethodReturnsFieldCollectionRule:	Potencial fuga de privacidade (aceite) em método getInterested da classe Work: devolve referência directa para '_interested' mas método não é público: package-private
[INFO] 007/bci/core/Book.java:13:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe Book, por atribuição de parâmetro a atributo authors, evitada por criação de cópia (new new ArrayList(authors)) no construtor.
Total de erros:  1
Total de fugas evitadas:        1


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


[WARN] 007/bci/core/Rule6.java:10:8: A lógica condicional pode ser removida. [SimplifyBooleanReturn]
[WARN] 007/bci/core/LibraryManager.java:49:26: A expressão pode ser simplicada. [SimplifyBooleanExpression]
[WARN] 007/bci/core/Library.java:258:37: A expressão pode ser simplicada. [SimplifyBooleanExpression]
[WARN] 007/bci/core/User.java:151:25: A expressão pode ser simplicada. [SimplifyBooleanExpression]
[ERROR] 007/bci/core/Book.java:26:9: Utilização de um ciclo 'for' para iterar o conteúdo da lista referenciada por 'authors' (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]
[WARN] 007/bci/app/user/DoPayFine.java:27:44: A expressão pode ser simplicada. [SimplifyBooleanExpression]
[WARN] 007/bci/app/work/DoChangeWorkInventory.java:28:55: A expressão pode ser simplicada. [SimplifyBooleanExpression]
[WARN] 007/bci/app/main/DoOpenFile.java:21:39: A expressão pode ser simplicada. [SimplifyBooleanExpression]
[WARN] 007/bci/app/main/DoOpenFile.java:23:56: A expressão pode ser simplicada. [SimplifyBooleanExpression]
Total de erros:  1


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


Nada a assinalar


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

[ERROR] 007/bci/core/Rule6.java:3:14: O tipo 'Rule6' deve condizer com o padrão '^[A-Z][a-zA-Z]+$'. [TypeName]
[ERROR] 007/bci/core/Rule1.java:3:14: O tipo 'Rule1' deve condizer com o padrão '^[A-Z][a-zA-Z]+$'. [TypeName]
[ERROR] 007/bci/core/Library.java:24:16: Abreviações no nome '_userID' não deveriam conter mais do que '1' letras maiúsculas consecutivas. [AbbreviationAsWordInName]
[ERROR] 007/bci/core/Library.java:30:15: Abreviações no nome '_workID' não deveriam conter mais do que '1' letras maiúsculas consecutivas. [AbbreviationAsWordInName]
[ERROR] 007/bci/core/Rule3.java:3:14: O tipo 'Rule3' deve condizer com o padrão '^[A-Z][a-zA-Z]+$'. [TypeName]
[ERROR] 007/bci/core/Rule2.java:3:14: O tipo 'Rule2' deve condizer com o padrão '^[A-Z][a-zA-Z]+$'. [TypeName]
[ERROR] 007/bci/core/Rule5.java:3:14: O tipo 'Rule5' deve condizer com o padrão '^[A-Z][a-zA-Z]+$'. [TypeName]
[ERROR] 007/bci/core/Rule4.java:3:14: O tipo 'Rule4' deve condizer com o padrão '^[A-Z][a-zA-Z]+$'. [TypeName]
Total de erros:  8

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

Iniciando a auditoria...
[INFO] 007/bci/core/LibraryManager.java:173 ObjectOutputStream criado no método 'public void save()' da classe 'LibraryManager'. [CheckSerialization]
[INFO] 007/bci/core/LibraryManager.java:197 ObjectOutputStream criado no método 'public void saveAs(String filename)' da classe 'LibraryManager'. [CheckSerialization]
[INFO] 007/bci/core/LibraryManager.java:219 ObjectInputStream criado no método 'public void load(String filename)' da classe 'LibraryManager'. [CheckSerialization]
[ERROR] Número errado de instâncias criadas de 'ObjectOutputStream'. Devia ser 1 e é '2'. [CheckSerialization]
Auditoria completa.
O Checkstyle terminou com 1 erros.

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

Iniciando a auditoria...
[WARN] 007/bci/core/MyParser.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] 007/bci/core/Work.java:66 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

Iniciando a auditoria...
[ERROR] 007/bci/app/main/DoSaveFile.java:30 Instanciação de classe do domínio 'MissingFileAssociationException' 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


Nada a assinalar


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

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

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


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): '[Comportamento, Category]'. [WriteClassStructure]
[INFO] Número total de classes definidos no core: 22, dos quais 0 private, 1 package-private, 0 protected e 21 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): '[Rule6, Rule4, User, Rule5, Request, Creator, Rule2, Rule3, Notification, Date, Rule1, Dvd, Book, MyParser, 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): 133, dos quais 4 private, 91 package-private, 0 protected e 38 public. [WriteClassStructure]
[INFO] Número total de atributos nas classes do core (sem excepções): 46, dos quais 46 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 Comportamento ( public )

 [WriteClassStructure]
[INFO] enum Category ( public )

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

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

    boolean checkRule(Work work, User user)

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

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

    boolean checkRule(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 Comportamento _userBehavior
    private boolean _validoNoSistema
    private List<Notification> _notifications
    private List<Request> _requests
    private int _deadLineFulfilled
    private int _deadLineNotFulfilled

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

    void setDeadLineFulfilled(int i)
    void setDeadLineNotFulfilled(int i)
    int getDeadLineFulfilled()
    int getDeadLineNotFulfilled()
    int setId(int id)
    int getId()
    boolean isActive()
    void setActive(boolean x)
    String getName()
    String getEmail()
    int getFine()
    void setFine(int i)
    void payAll()
    Comportamento getComportamento()
    void setComportamento(. comportamento)
    void setValidade()
    boolean getValidade()
    void addRequest(Request request)
    void addNotification(Notification notification)
    public List<Notification> getNotifications()
    boolean existingRequest(Work work)
    int getNumberOfRequest()
    List<Request> getRequests()
    void removeRequest(Request r)
    void clearNotifications()
    public String toString()

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

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

    boolean checkRule(Work work, User user)

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

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

    private int _deadLine
    private User _user
    private Work _work

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

    int getDeadLine()
    User getUser()
    Work getWork()
    int computeDeadLine(int date)

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

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

    private String _name
    private List<Work> _works

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

    String getName()
    void add(Work work)
    void remove(Work work)
    List<Work> works()

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

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

    boolean checkRule(Work work, User user)

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

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

    boolean checkRule(Work work, User user)

 [WriteClassStructure]
[INFO] class Notification ( public )

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

    private String _message
    private Work _work

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

    public String toString()

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

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

    private int _currentDate

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

    int getCurrentDate()
    void advanceDay(int nDays)

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

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

    boolean checkRule(Work work, User user)

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

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

    private int _igac
    private Creator _diretor

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

    int getIGAC()
    Creator getCreator()
    public String getDescription()

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

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

    private int _isbn
    private List<Creator> _authors

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

    int getISBN()
    List<Creator> getAuthors()
    String toStringCreators(List authors)
    public String getDescription()

 [WriteClassStructure]
[INFO] class MyParser (  )

  ###### 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]  abstract class Work ( public implements Serializable )

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

    private int _id
    private int _price
    private int _numberOfCopies
    private int _available
    private String _title
    private Category _category
    private int _code
    private List<User> _interested

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

    int getId()
    int setId(int id)
    void setAvailable(int integer)
    int getPrice()
    int getNumberOfCopies()
    String getTitle()
    Category getCategory()
    public int getAvailable()
    void addInterested(User user)
    List<User> getInterested()
    String categoryToString()
    public abstract String getDescription()
    void changeInventory(int inventoryChange)

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

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

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

    private Library _library

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

    public Library getLibrary()
    public boolean getChangesLM()
    public String getFileName()
    public int getDateLM()
    public void advanceDateLM(int advance)
    public int rcreateUser(String name, String email)
    public User getUserLM(int id)
    public List<User> getUsersLM()
    public Work getWorkLM(int id)
    public List<Work> getWorksLM()
    public List<Work> getCreatorWorksLM(String name)
    public String getDescriptionLM(Work work)
    public boolean changeWorkInventoryLM(Work work, int inventoryChange)
    public int doRequestLM(Work work, User user)
    public Request getRequestLM(int userid, int workid)
    public void removeRequestLM(int userid, int workid)
    public int checkRulesLM(int work, int user)
    public void sendNotificationLM(int workID)
    public void addInterestedLM(int userid, int workid)
    public boolean allowedToRequestLM(int userid)
    public void payFineLM(int userid, int fine)
    public void payAllLM(int userid)
    public void setStateLM(int userid)
    public int calculateFineLM(int userid, int workid)
    public void suspend(int userid)
    public void clearNotificationsLM(int userid)
    public int fineToPayLM(int userid)
    public void save()
    public void saveAs(String filename)
    public void load(String filename)
    public void importFile(String datafile)

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

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

    private boolean _changed
    private int _userID
    private Map<Integer, User> _users
    private List<User> _usersOrganized
    private Map<String, Creator> _creators
    private int _workID
    private Map<Integer, Work> _works
    private List<Work> _workOrganized
    private Date _date
    private List<Request> _requests
    private String _fileName
    private List<Rule> _rules

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

    String getFileName()
    void setFileName(String fileName)
    boolean getChangesL()
    void setChangesL(boolean changes)
    int getDateL()
    void advanceDateL(int advance)
    User createUser(String name, String email)
    Creator registerCreator(String name)
    void registerDvd(String title, Creator diretor, int price, Category category, int igac, int nCopies)
    void registerBook(String title, List authores, int price, Category category, int isbn, int nCopies)
    void deleteWork(Work work)
    int doRequestL(Work work, User user)
    Request getRequestL(int userId, int workId)
    void removeRequestL(int userId, int workId)
    int checkRulesL(int workId, int userId)
    void sendNotificationL(int workID)
    void addInterestedL(int userid, int workid)
    void judgeUserL(Request request)
    boolean allowedToRequestL(int userid)
    void payfineL(int userId, int fine)
    void payAllL(int userid)
    int fineToPayL(int userid)
    List<Work> getCreatorWorksL(String name)
    Work getWork(int id)
    User getUserL(int id)
    boolean setStateL(int userid)
    void suspendL(int userid)
    int calculateFineL(int userid, int workid)
    void clearNotificationsL(int userid)
    List<User> getUsersL()
    List<Work> getWorksL()
    void importFile(String filename)

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

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

    private int _id

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

    abstract boolean checkRule(Work work, User user)
    int getId()

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

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