

####    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] 021/bci/core/MyParser.java:67:	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] 021/bci/core/LibraryManager.java:275:	IdenticalCatchBranches:	Ramo 'catch' idênticol to ramo 'FileNotFoundException' pertencentes à mesma instrução try.
[INFO] 021/bci/core/LibraryManager.java:278:	IdenticalCatchBranches:	Ramo 'catch' idênticol to ramo '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] 021/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] 021/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] 021/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] 021/bci/core/LibraryManager.java:0:	POLooseCouplingRule:	Aplicação correcta (5) e incorrecta (0) do princípio Programar para abstracção no ficheiro LibraryManager.java.
[INFO] 021/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] 021/bci/core/WorkNotificationService.java:0:	POLooseCouplingRule:	Aplicação correcta (1) e incorrecta (0) do princípio Programar para abstracção no ficheiro WorkNotificationService.java.
Total de erros:  0


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


[ERROR] 021/bci/core/Creator.java:56:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Creator - devolve atributo (_works) em método público (getWorks)
[ERROR] 021/bci/core/Library.java:103:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Library - devolve atributo (_users) em método público (getUsers)
[ERROR] 021/bci/core/Library.java:123:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Library - devolve atributo (_works) em método público (getWorks)
[ERROR] 021/bci/core/Library.java:142:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Library - devolve atributo (_creators) em método público (getCreators)
[ERROR] 021/bci/core/Library.java:240:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Library - devolve atributo (_rules) em método público (getRules)
[ERROR] 021/bci/core/Library.java:247:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Library - devolve atributo (_requests) em método público (getRequests)
[ERROR] 021/bci/core/User.java:142:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe User - devolve atributo (_notifications) em método público (getNotifications)
[ERROR] 021/bci/core/User.java:163:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe User - devolve atributo (_openRequests) 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] 021/bci/app/request/DoRequestWork.java:25:	ExcessiveMethodLength:	Evitar métodos com um corpo grande.
[WARN] 021/bci/app/request/DoReturnWork.java:25:	ExcessiveMethodLength:	Evitar métodos com um corpo grande.
[WARN] 021/bci/core/Library.java:287:29: A expressão pode ser simplicada. [SimplifyBooleanExpression]
[ERROR] 021/bci/core/Book.java:32:9: Utilização de um ciclo 'while' 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]
[WARN] 021/bci/app/user/DoPayFine.java:37:59: A expressão pode ser simplicada. [SimplifyBooleanExpression]
[WARN] 021/bci/app/request/DoReturnWork.java:79:60: A expressão pode ser simplicada. [SimplifyBooleanExpression]
[WARN] 021/bci/app/request/DoRequestWork.java:49:30: A expressão pode ser simplicada. [SimplifyBooleanExpression]
[WARN] 021/bci/app/main/DoOpenFile.java:24:34: 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] 021/bci/core/LibraryManager.java:20:27: O atributo com o nome 'notificationService'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 021/bci/core/WorkNotificationService.java:10:53: O atributo com o nome 'listeners'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
Total de erros:  2

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

Iniciando a auditoria...
[INFO] 021/bci/core/LibraryManager.java:242 ObjectOutputStream criado no método 'public void save()' da classe 'LibraryManager'. [CheckSerialization]
[INFO] 021/bci/core/LibraryManager.java:269 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] 021/bci/app/request/DoRequestWork.java:24 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão 'b' comparada '6' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[ERROR] 021/bci/app/work/DoPerformSearch.java:31 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] 021/bci/app/work/DoPerformSearch.java:37 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]
[INFO] 021/bci/core/CheckIsReference.java:20 Comparação de valores enumerados via método equals. Normalmente, a comparação de valores enumerados pode ser realizada via operador ==. [OpenClosePrinciple]
[INFO] 021/bci/core/CheckWorkPrice.java:20 Comparação de valores enumerados via método equals. Normalmente, a comparação de valores enumerados pode ser realizada via operador ==. [OpenClosePrinciple]
[WARN] 021/bci/core/MyParser.java:37 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] 021/bci/core/Work.java:73 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão '_category' comparada '4' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
Auditoria completa.
O Checkstyle terminou com 2 erros.

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

Iniciando a auditoria...
[ERROR] 021/bci/app/request/DoRequestWork.java:102 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


Nada a assinalar


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

Iniciando a auditoria...
[ERROR] 021/bci/core/LibraryManager.java:17 Membro estático 'LibraryManager _instance' não recomendável. [POStaticMember]
[ERROR] 021/bci/core/LibraryManager.java:33 Membro estático 'public static LibraryManager getInstance()' não recomendável. [POStaticMember]
[ERROR] 021/bci/core/Notification.java:28 Membro estático 'private static String buildMessage(String type, Work work)' não recomendável. [POStaticMember]
[INFO] 021/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 '22'. [POStaticMember]
Auditoria completa.
O Checkstyle terminou com 3 erros.

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

Iniciando a auditoria...
[ERROR] 021/bci/core/LibraryManager.java:20 O atributo 'notificationService', com nível de acesso 'package', deveria ser privado e ter métodos acessores. [POVisibilityModifier]
Auditoria completa.
O Checkstyle terminou com 1 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): '[WorkObserver, WorkEvent]'. [WriteClassStructure]
[INFO] Número total de enumerados definidos no core: 3, dos quais 0 private, 1 package-private, 0 protected e 2 public. [WriteClassStructure]
[INFO] Enumerados definidos no package core da aplicação (3): '[WorkEventType, UserBehaviour, Category]'. [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 (2): '[Work, Rule]'. [WriteClassStructure]
[INFO] Classes concretas e não excepções definidas no package core da aplicação (19): '[WorkNotificationService, User, BorrowListener, CheckIsReference, Creator, Notification, CheckRequestTwice, AvailabilityListener, Book, MyParser, CheckWorkAvailable, Request, CheckUserActive, CheckWorkPrice, Date, Dvd, CheckWorksRequested, LibraryManager, Library]'. [WriteClassStructure]
[INFO] Excepções definidas no package core da aplicação (4): '[UnavailableFileException, UnrecognizedEntryException, MissingFileAssociationException, ImportFileException]'. [WriteClassStructure]
[INFO] Número total de métodos nas classes do core (sem excepções): 136, dos quais 6 private, 2 package-private, 0 protected e 128 public. [WriteClassStructure]
[INFO] Número total de atributos nas classes do core (sem excepções): 49, dos quais 48 private, 1 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 WorkEventType ( public )

 [WriteClassStructure]
[INFO] enum UserBehaviour ( public )

 [WriteClassStructure]
[INFO] enum Category (  )

 [WriteClassStructure]
[INFO] interface WorkObserver ( public )

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

    void update(WorkEvent event)

 [WriteClassStructure]
[INFO] interface WorkEvent ( public )

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

    void update(WorkEventType type)
    Work getWork()

 [WriteClassStructure]
[INFO] class WorkNotificationService ( public implements java.io.Serializable )

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

    private final Map<WorkEventType, List<WorkEvent>> listeners

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

    public void subscribe(WorkEventType eventType, WorkEvent listener)
    public void unsubscribe(WorkEventType eventType, WorkEvent listener)
    public void notify(WorkEventType eventType, int workId)

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

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

    private int _id
    private boolean _isActive
    private String _name
    private String _email
    private int _fine
    private UserBehaviour _behaviour
    private Collection<Notification> _notifications
    private Collection<Request> _openRequests
    private int _consecutiveLateReturns
    private int _consecutiveOnTimeReturns

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

    public int getId()
    public void setId(int id)
    public String getName()
    public void setName(String name)
    public String getEmail()
    public void setEmail(String email)
    public int getFine()
    public void setFine(int fine)
    public void addFine(int amount)
    public boolean isActive()
    public void setStatus(boolean b)
    public String toString()
    public Collection<Notification> getNotifications()
    public void addNotification(Notification n)
    public void clearNotifications()
    public void setNotifications()
    public Collection<Request> getRequests()
    public UserBehaviour getBehaviour()
    public void setBehaviour(UserBehaviour b)
    public void addRequest(Request req)
    public void removeRequest(Request req)
    public void addConsecutiveLateReturn()
    public void addConsecutiveOnTimeReturn()
    public void altersBehaviour()
    public void alterStatus(int today)
    public boolean hasOverdueWorks(int today)

 [WriteClassStructure]
[INFO] class BorrowListener ( public implements WorkEvent )

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

    private final User _user
    private final Work _work

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

    public void update(WorkEventType type)
    public Work getWork()

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

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

    public boolean check(Work w, User u)

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

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

    private String _name
    private Collection<Work> _works

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

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

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

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

    private final String _message
    private Work _work

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

    private static String buildMessage(String type, Work work)
    public String getMessage()
    public Work getWork()
    public String toString()

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

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

    public boolean check(Work w, User u)

 [WriteClassStructure]
[INFO] class AvailabilityListener ( public implements WorkEvent )

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

    private final User _user
    private final Work _work

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

    public void update(WorkEventType type)
    public Work getWork()

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

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

    private String _isbn
    private Collection<Creator> _authors

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

    public String getCreator()
    public String getisbn()
    public String toString()

 [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 _availableCopies
    private String _title
    private Category _category

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

    public int getId()
    public int getPrice()
    public int getNumberCopies()
    public String getTitle()
    public Category getCategory()
    public String getTranslatedCategory()
    public void setId(int id)
    public void setPrice(int price)
    public void setNumberCopies(int number)
    public void setAvailableCopies(int number)
    public void setTitle(String title)
    public void setCategory(Category category)
    public int getAvailableCopies()
    public abstract String toString()
    public abstract String getCreator()

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

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

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

    public boolean check(Work w, User u)

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

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

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

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

    public int getDeadline()
    public void setDeadline(int deadline)
    public User getUser()
    public Work getWork()
    public boolean isReturned()
    public void setReturned(boolean returned)

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

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

    public boolean check(Work w, User u)

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

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

    public boolean check(Work w, User u)

 [WriteClassStructure]
[INFO] class Date ( public implements java.io.Serializable )

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

    private int _currentDate

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

    public int getCurrentDate()
    public void advanceDays(int nDays)

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

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

    private String _igac
    private Creator _director

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

    public String getIgac()
    public String getCreator()
    public String toString()

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

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

    public boolean check(Work w, User u)

 [WriteClassStructure]
[INFO] class LibraryManager ( public )

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

    private static LibraryManager _instance
    private Library _library
    private String _filename
    WorkNotificationService notificationService

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

    public static LibraryManager getInstance()
    public Library getLibrary()
    public User getUser(int id)
    public Work getWork(int id)
    public Creator getCreator(String name)
    public Collection<User> getUsers()
    public Collection<Work> getWorks()
    public Collection<Creator> getCreators()
    public int getCurrentDate()
    public void advanceDays(int nDays)
    public void registerUser(String userName, String email)
    public int getNextUserId()
    public int getNextWorkId()
    public boolean getModified()
    public void setModified(boolean mod)
    public Collection<Rule> getRules()
    public Collection<Request> getRequests()
    public void addRequest(Request req)
    public void removeRequest(Request req)
    public void removeWork(Work work)
    public WorkNotificationService getNotificationService()
    public void addUserAvailableNotification(User user, Work work)
    public void addUserBorrowNotification(User user, Work work)
    public void removeUserAvailableNotification(User user, Work work)
    public void removeUserBorrowNotification(User user, Work work)
    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 int _nextWorkId
    private int _nextUserId
    private boolean _modified
    private Date _date
    private Collection<Rule> _rules
    private Collection<Creator> _creators
    private Collection<Work> _works
    private Collection<Request> _requests
    private Collection<User> _users

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

    public int getCurrentDate()
    public void advanceDays(int nDays)
    public int getNextUserId()
    public int getNextWorkId()
    public User getUser(int id)
    public Collection<User> getUsers()
    public Work getWork(int id)
    public Collection<Work> getWorks()
    public Creator getCreator(String name)
    public Collection<Creator> getCreators()
    public User registerUser(String userName, String email)
    public Work registerDvd(String title, Creator author, int price, Category category, String igac, int nCopies)
    public Work registerBook(String title, List authors, int price, Category category, String isbn, int nCopies)
    public Creator registerCreator(String nome)
    public boolean getModified()
    public void setModified(boolean mod)
    public Collection<Rule> getRules()
    public Collection<Request> getRequests()
    public void addRequest(Request req)
    public void removeRequest(Request req)
    public void removeWork(Work work)
    private void cleanupCreators(Work removedWork)
    void importFile(String filename)

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

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

    private final int _id

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

    public int getId()
    public abstract boolean check(Work w, User u)

  ###### Subclasses  ###### 
    CheckIsReference   CheckRequestTwice   CheckWorkAvailable   CheckUserActive   CheckWorkPrice   CheckWorksRequested   

   Method check(Work, User) overriden in subclass(es) CheckIsReference CheckRequestTwice CheckWorkAvailable CheckUserActive CheckWorkPrice CheckWorksRequested 
 [WriteClassStructure]
Auditoria completa.
