

####    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] 023/bci/app/main/DoSaveFile.java:45:	AvoidThrowingRawExceptionTypes:	Deve evitar a criação de excepções demasiado genéricas.
[ERROR] 023/bci/app/request/DoRequestWork.java:80:	AvoidThrowingRawExceptionTypes:	Deve evitar a criação de excepções demasiado genéricas.
[ERROR] 023/bci/app/request/DoReturnWork.java:61:	AvoidThrowingRawExceptionTypes:	Deve evitar a criação de excepções demasiado genéricas.
Total de erros:  3


####    Quebra do encapsulamento


Nada a assinalar


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


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


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


[INFO] 023/bci/core/Library.java:188:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em Library por uso de Collections.unmodifiableSet para devolver vista imutável de _users em método getUsers
[INFO] 023/bci/core/Library.java:230:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em Library por uso de Collections.unmodifiableCollection para devolver vista imutável de _works.values() em método getWorks
[INFO] 023/bci/core/Library.java:296:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe Library evitada por criação de cópia (via _works.values().stream().filter().toList()) de _works no método searchWorksByTerm
[INFO] 023/bci/core/user/User.java:102:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em User por uso de Collections.unmodifiableList para devolver vista imutável de _activeRequests em método getActiveRequests
[INFO] 023/bci/core/work/Book.java:29:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em Book por uso de Collections.unmodifiableList para devolver vista imutável de _authors em método getCreators
[INFO] 023/bci/core/work/Work.java:62:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em Work por uso de Collections.unmodifiableList para devolver vista imutável de _requests em método getRequests
Total de erros:  0
Total de fugas evitadas:        6


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


Nada a assinalar


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


[WARN] 023/bci/core/user/Notification.java:32:42: Parâmetro/variável local 'type' esconde atributo da classe com o mesmo nome [HiddenField]
Total de erros:  0


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

[ERROR] 023/bci/core/LibraryManager.java:21:20: O atributo com o nome 'associatedFile'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 023/bci/core/user/Notification.java:19:36: O atributo com o nome 'type'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 023/bci/core/Date.java:17:17: O atributo com o nome 'currentDate'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
Total de erros:  3

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

Iniciando a auditoria...
[INFO] 023/bci/core/LibraryManager.java:67 ObjectOutputStream criado no método 'public void save()' da classe 'LibraryManager'. [CheckSerialization]
[INFO] 023/bci/core/LibraryManager.java:94 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] 023/bci/core/ImportFileParser.java:52 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


Nada a assinalar


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

Iniciando a auditoria...
[WARN] 023/bci/core/work/Book.java:38 uso desnecessário de super para invocar método 'getGeneralDescription' da super classe. [AvoidUselessSuper]
[WARN] 023/bci/core/work/Dvd.java:32 uso desnecessário de super para invocar método 'getGeneralDescription' da super classe. [AvoidUselessSuper]
Auditoria completa.

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


Nada a assinalar


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

Iniciando a auditoria...
[INFO] 023/bci/core/exception/ImportFileException.java:7 Atributo estático final 'String ERROR_MESSAGE' permitido. [POStaticMember]
[INFO] 023/bci/core/request/NoDuplicateRequestsRule.java:22 Atributo estático final 'int RULE_ID' permitido. [POStaticMember]
[INFO] 023/bci/core/request/Request.java:18 Atributo estático final 'byte INCREMENTAL_FINE_EUROS' permitido. [POStaticMember]
[INFO] 023/bci/core/request/SimultaneousRequestsLimitRule.java:18 Atributo estático final 'int RULE_ID' permitido. [POStaticMember]
[INFO] 023/bci/core/request/UserIsActiveRule.java:19 Atributo estático final 'int RULE_ID' permitido. [POStaticMember]
[INFO] 023/bci/core/request/WorkCategoryIsNotReferenceRule.java:21 Atributo estático final 'int RULE_ID' permitido. [POStaticMember]
[INFO] 023/bci/core/request/WorkHasAvailableCopyRule.java:20 Atributo estático final 'int RULE_ID' permitido. [POStaticMember]
[INFO] 023/bci/core/request/WorkPriceLimitRule.java:19 Atributo estático final 'int RULE_ID' permitido. [POStaticMember]
[INFO] 023/bci/core/user/CumpridorState.java:17 Atributo estático final 'CumpridorState CUMPRIDOR' permitido. [POStaticMember]
[ERROR] 023/bci/core/user/CumpridorState.java:29 Método estático 'public static CumpridorState getInstance()' com um simples return valor literal ou atributo não recomendável. [POStaticMember]
[INFO] 023/bci/core/user/FaltosoState.java:16 Atributo estático final 'FaltosoState FALTOSO' permitido. [POStaticMember]
[ERROR] 023/bci/core/user/FaltosoState.java:25 Método estático 'public static FaltosoState getInstance()' com um simples return valor literal ou atributo não recomendável. [POStaticMember]
[INFO] 023/bci/core/user/NormalState.java:16 Atributo estático final 'NormalState NORMAL' permitido. [POStaticMember]
[ERROR] 023/bci/core/user/NormalState.java:28 Método estático 'public static NormalState getInstance()' com um simples return valor literal ou atributo não recomendável. [POStaticMember]
[INFO] O número de serialVersionUID atributos estáticos definidos nas várias classes foi '40'. [POStaticMember]
Auditoria completa.
O Checkstyle terminou com 3 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 'User' utilizada no atributo 'private final 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 '[self]' da classe 'Builder' dado que não envolve o mecanismo de herança [WriteClassStructure]
Auditoria completa.
O Checkstyle terminou com 1 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: 3, dos quais 0 private, 0 package-private, 0 protected e 3 public. [WriteClassStructure]
[INFO] Enumerados definidos no package core da aplicação (3): '[NotificationType, WorkCategory, WorkType]'. [WriteClassStructure]
[INFO] Número total de classes definidos no core: 36, dos quais 0 private, 5 package-private, 0 protected e 31 public. [WriteClassStructure]
[INFO] Classes abstractas definidas no package core da aplicação (4): '[Work, WorkObserver, UserClassificationState, RequestRule]'. [WriteClassStructure]
[INFO] Classes concretas e não excepções definidas no package core da aplicação (20): '[User, ImportFileParser, Builder, CumpridorState, Creator, Notification, FaltosoState, UserIsActiveRule, Book, NoDuplicateRequestsRule, WorkPriceLimitRule, NormalState, Request, SimultaneousRequestsLimitRule, Date, WorkCategoryIsNotReferenceRule, Dvd, LibraryManager, WorkHasAvailableCopyRule, Library]'. [WriteClassStructure]
[INFO] Excepções definidas no package core da aplicação (12): '[WorkNotBorrowedByUserException, UnavailableFileException, UnrecognizedEntryException, UserNotSuspendedException, NoSuchUserWithIdException, NotEnoughInventoryException, MissingFileAssociationException, RequestRuleFailedException, NoSuchWorkWithIdException, ImportFileException, NoSuchCreatorWithIdException, InvalidArgumentsException]'. [WriteClassStructure]
[INFO] Número total de métodos nas classes do core (sem excepções): 139, dos quais 9 private, 7 package-private, 5 protected e 118 public. [WriteClassStructure]
[INFO] Número total de atributos nas classes do core (sem excepções): 63, dos quais 57 private, 0 package-private, 0 protected e 6 public. [WriteClassStructure]
Auditoria completa.

Descrição das estruturas de dados do core do projecto

Iniciando a auditoria...
[INFO] enum NotificationType ( public )

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

    private final String _label

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

    public String toString()

 [WriteClassStructure]
[INFO] enum WorkCategory ( public )

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

    private final String _label

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

    public String toString()

 [WriteClassStructure]
[INFO] enum WorkType ( public )

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

    private final String _label

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

    public String toString()

 [WriteClassStructure]
[INFO] class User ( public implements Comparable<User>, Serializable )
  extends WorkObserver

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

    private final int _id
    private final String _name
    private final String _email
    private boolean _isActive
    private UserClassificationState _classification
    private final List<Request> _activeRequests
    private final List<Request> _allRequests
    private final List<Notification> _notifications
    private int _totalFines

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

    public int getId()
    public String getName()
    public boolean isActive()
    public int getMaxSimultaneousRequests()
    public int getMaxWorkRequestPrice()
    public int getRequestDuration(Work work)
    public Collection<Request> getActiveRequests()
    public Collection<Notification> getNotifications()
    public int getTotalFines()
    public void updateState(int currentDate)
    public void payFine(int currentDate)
    public void requestWork(Request request)
    public void returnWork(Request request, int currentDate)
    public void disposeRequest(Request request)
    public void update(Notification notification)
    public int compareTo(User other)
    public boolean equals(Object obj)
    public String toString()
    int countConsecutiveOnTimeReturns(int n, int currentDate)
    int countRecentLateReturns(int n)
    private boolean hasNoSuspensionFlags(int currentDate)

 [WriteClassStructure]
[INFO] class ImportFileParser (  )

  ###### 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 parseBook(String components, String line)
    private void parseDvd(String components, String line)

 [WriteClassStructure]
[INFO] class Builder ( public, static )
  extends Work.Builder

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

    private String _isbn
    private List<Creator> _authors

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

    public Builder isbn(String isbn)
    public Builder authors(List authors)
    protected Builder self()
    public Book build()

 [WriteClassStructure]
[INFO] class CumpridorState (  )
  extends UserClassificationState

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

    private final static CumpridorState CUMPRIDOR

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

    public static CumpridorState getInstance()
    public UserClassificationState updateState(User user, int currentDate)
    public int getMaxSimultaneousRequests()
    public int getMaxWorkRequestPrice()
    public int getRequestDuration(Work work)
    public String toString()

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

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

    private final String _name
    private final List<Work> _works

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

    public String getName()
    public List<Work> getWorks()
    public void addWork(Work work)
    public void removeWork(Work work)
    public boolean shouldBeRemovedFromSystem()
    public boolean equals(Object obj)

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

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

    private final NotificationType type
    private final String _message

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

    public NotificationType getType()
    public String toString()

 [WriteClassStructure]
[INFO] class FaltosoState (  )
  extends UserClassificationState

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

    private final static FaltosoState FALTOSO

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

    public static FaltosoState getInstance()
    public UserClassificationState updateState(User user, int currentDate)
    public int getMaxSimultaneousRequests()
    public int getMaxWorkRequestPrice()
    public int getRequestDuration(Work work)
    public String toString()

 [WriteClassStructure]
[INFO] class UserIsActiveRule ( public )
  extends RequestRule

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

    public final static int RULE_ID

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

    public void check(User user, Work work)

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

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

    private final String _isbn
    private final List<Creator> _authors

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

    protected Collection<Creator> getCreators()
    public String toString()

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

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

    private final int _id
    private final String _title
    private final int _price
    private final WorkCategory _category
    private int _totalCopies
    private int _availableCopies
    private final WorkType _type
    private final List<Request> _requests
    private final List<WorkObserver> _observers

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

    public int getId()
    public String getTitle()
    public int getPrice()
    public WorkCategory getCategory()
    public int getTotalCopies()
    public int getAvailableCopies()
    public Collection<Request> getRequests()
    public boolean hasTerm(String term)
    public void changeInventory(int amount)
    public boolean shouldBeRemovedFromSystem()
    public Collection<Creator> dispose()
    public void requestWork(Request request)
    public void returnWork()
    public void subscribe(WorkObserver observer)
    public void unsubscribe(WorkObserver observer)
    private void notifyWorkWasRequested()
    private void notifyWorkHasAvailableCopy()
    private void notifyObservers(Notification notification)
    protected abstract Collection<Creator> getCreators()
    protected String getGeneralDescription()
    public boolean equals(Object obj)
    public abstract String toString()

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

   Method getCreators() overriden in subclass(es) Book Dvd 
   Method toString() overriden in subclass(es) Book Dvd 
 [WriteClassStructure]
[INFO]  abstract class WorkObserver ( public implements Serializable )

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

    private final HashMap<Integer, List<NotificationType>> _subscribedWorks

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

    public List<NotificationType> getSubscribedTypesOfWork(int workId)
    public void subscribeToWorkForNotification(int workId, NotificationType type)
    public void unsubscribeFromWorkForNotification(int workId, NotificationType type)
    public abstract void update(Notification notification)

  ###### Subclasses  ###### 
    User   

   Method update(Notification) overriden in subclass(es) User 
 [WriteClassStructure]
[INFO] class NoDuplicateRequestsRule ( public )
  extends RequestRule

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

    public final static int RULE_ID

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

    public void check(User user, Work work)

 [WriteClassStructure]
[INFO] class WorkPriceLimitRule ( public )
  extends RequestRule

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

    public final static int RULE_ID

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

    public void check(User user, Work work)

 [WriteClassStructure]
[INFO] class NormalState (  )
  extends UserClassificationState

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

    private final static NormalState NORMAL

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

    public static NormalState getInstance()
    public UserClassificationState updateState(User user, int currentDate)
    public int getMaxSimultaneousRequests()
    public int getMaxWorkRequestPrice()
    public int getRequestDuration(Work work)
    public String toString()

 [WriteClassStructure]
[INFO]  abstract class UserClassificationState (  implements Serializable )

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

    public abstract UserClassificationState updateState(User user, int currentDate)
    public abstract int getMaxSimultaneousRequests()
    public abstract int getMaxWorkRequestPrice()
    public abstract int getRequestDuration(Work work)
    public abstract String toString()

  ###### Subclasses  ###### 
    CumpridorState   FaltosoState   NormalState   

   Method updateState(User, int) overriden in subclass(es) CumpridorState FaltosoState NormalState 
   Method getMaxSimultaneousRequests() overriden in subclass(es) CumpridorState FaltosoState NormalState 
   Method getMaxWorkRequestPrice() overriden in subclass(es) CumpridorState FaltosoState NormalState 
   Method getRequestDuration(Work) overriden in subclass(es) CumpridorState FaltosoState NormalState 
   Method toString() overriden in subclass(es) CumpridorState FaltosoState NormalState 
 [WriteClassStructure]
[INFO] class Request ( public implements Serializable )

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

    private final static byte INCREMENTAL_FINE_EUROS
    private final int _id
    private final User _user
    private final Work _work
    private final int _deadline
    private int _returnDate
    private boolean _fineLiquidated

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

    public int getId()
    public User getUser()
    public Work getWork()
    public boolean hasBeenReturned()
    public void markAsReturned(int returnDate)
    public void liquidateFine()
    public boolean isOverdue(int currentDate)
    public boolean wasOverdue()
    public boolean shouldPayFine(int currentDate)
    public int calculateFine(int currentDate)

 [WriteClassStructure]
[INFO] class SimultaneousRequestsLimitRule ( public )
  extends RequestRule

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

    public final static int RULE_ID

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

    public void check(User user, Work work)

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

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

    private int currentDate

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

    public int getCurrentDate()
    public void advanceDate(int days)

 [WriteClassStructure]
[INFO] class WorkCategoryIsNotReferenceRule ( public )
  extends RequestRule

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

    public final static int RULE_ID

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

    public void check(User user, Work work)

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

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

    private final String _igac
    private final Creator _director

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

    protected Collection<Creator> getCreators()
    public String toString()

 [WriteClassStructure]
[INFO] class LibraryManager ( public )

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

    private Library _library
    private String associatedFile
    private boolean _firstSave

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

    public Library getLibrary()
    public boolean hasAssociatedFile()
    public void save()
    public void saveAs(String filename)
    public void load(String filename)
    public void importFile(String datafile)

 [WriteClassStructure]
[INFO] class WorkHasAvailableCopyRule ( public )
  extends RequestRule

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

    public final static int RULE_ID

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

    public void check(User user, Work work)

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

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

    private final Date _currentDate
    private int _nextUserId
    private int _nextWorkId
    private int _nextRequestId
    private final Set<User> _users
    private final Map<Integer, User> _usersById
    private final Map<Integer, Work> _works
    private final Map<String, Creator> _creators
    private final Map<Integer, Request> _activeRequests
    private final List<Request> _archivedRequests
    private final List<RequestRule> _requestRules
    private boolean _modified

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

    public Date getCurrentDate()
    public void advanceDate(int days)
    public User registerUser(String name, String email)
    public User getUserById(int id)
    public Collection<Notification> getUserNotifications(int userId)
    public Collection<User> getUsers()
    public void payFine(int userId)
    public Work getWorkById(int id)
    public Collection<Work> getWorks()
    public Creator getCreatorByName(String name)
    public void changeWorkInventory(int workId, int amount)
    public Collection<Work> searchWorksByTerm(String term)
    public void subscribeUserToWorkNotifications(int userId, int workId, NotificationType type)
    public void unsubscribeUserToWorkNotifications(int userId, int workId, NotificationType type)
    public int requestWork(int userId, int workId)
    public Request returnWork(int userId, int workId)
    T registerWork(B workBuilder)
    Creator registerCreator(String name)
    private void updateUsersStates()
    public boolean isModified()
    void setToUnmodified()
    void importFile(String filename)

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

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

    private final int _id

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

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

  ###### Subclasses  ###### 
    UserIsActiveRule   NoDuplicateRequestsRule   WorkPriceLimitRule   SimultaneousRequestsLimitRule   WorkCategoryIsNotReferenceRule   WorkHasAvailableCopyRule   

   Method check(User, Work) overriden in subclass(es) UserIsActiveRule NoDuplicateRequestsRule WorkPriceLimitRule SimultaneousRequestsLimitRule WorkCategoryIsNotReferenceRule WorkHasAvailableCopyRule 
 [WriteClassStructure]
Auditoria completa.
