

####    Verificação do uso correcto do mecanismo de excepções


Nada a assinalar


####    Quebra do encapsulamento


Nada a assinalar


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


[INFO] 063/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] 063/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] 063/bci/core/Library.java:0:	POLooseCouplingRule:	Aplicação correcta (10) e incorrecta (0) do princípio Programar para abstracção no ficheiro Library.java.
[INFO] 063/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] 063/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] 063/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] 063/bci/core/Book.java:24:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Book - atribui parâmetro (authors) a atributo (_authors)
[INFO] 063/bci/core/Book.java:34:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em Book por uso de Collections.unmodifiableList para devolver vista imutável de _authors em método getAuthors
[INFO] 063/bci/core/Creator.java:33:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em Creator por uso de Collections.unmodifiableSet para devolver vista imutável de _works em método getWorks
[INFO] 063/bci/core/Library.java:105:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em Library por uso de Collections.unmodifiableCollection para devolver vista imutável de _users.values() em método getUsers
[INFO] 063/bci/core/Library.java:158:	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] 063/bci/core/Library.java:184:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe Library evitada por criação de cópia (via _works.values().stream().filter().filter().sorted().toList()) de _works no método searchWorks
[INFO] 063/bci/core/User.java:185:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em User por uso de Collections.unmodifiableList para devolver vista imutável de _activeRequests em método getActiveRequests
Total de erros:  1
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] 063/bci/core/exception/RuleException.java:6:30: Parâmetro/variável local 'ruleId' esconde atributo da classe com o mesmo nome [HiddenField]
Total de erros:  0


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

[ERROR] 063/bci/core/Rule1NoDuplicateRequest.java:6:14: O tipo 'Rule1NoDuplicateRequest' deve condizer com o padrão '^[A-Z][a-zA-Z]+$'. [TypeName]
[ERROR] 063/bci/core/Rule3WorkAvailable.java:6:14: O tipo 'Rule3WorkAvailable' deve condizer com o padrão '^[A-Z][a-zA-Z]+$'. [TypeName]
[ERROR] 063/bci/core/Rule2UserMustBeActive.java:6:14: O tipo 'Rule2UserMustBeActive' deve condizer com o padrão '^[A-Z][a-zA-Z]+$'. [TypeName]
[ERROR] 063/bci/core/Rule5NotReference.java:6:14: O tipo 'Rule5NotReference' deve condizer com o padrão '^[A-Z][a-zA-Z]+$'. [TypeName]
[ERROR] 063/bci/core/Rule6PriceLimit.java:6:14: O tipo 'Rule6PriceLimit' deve condizer com o padrão '^[A-Z][a-zA-Z]+$'. [TypeName]
[ERROR] 063/bci/core/exception/RuleException.java:4:23: O atributo com o nome 'ruleId'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 063/bci/core/Rule4MaxRequests.java:6:14: O tipo 'Rule4MaxRequests' deve condizer com o padrão '^[A-Z][a-zA-Z]+$'. [TypeName]
Total de erros:  7

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

Iniciando a auditoria...
[INFO] 063/bci/core/LibraryManager.java:37 ObjectOutputStream criado no método 'public void save()' da classe 'LibraryManager'. [CheckSerialization]
[INFO] 063/bci/core/LibraryManager.java:66 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] 063/bci/core/DefaultDeadlineStrategy.java:21 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão 'behavior' comparada '9' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 063/bci/core/MyParser.java:39 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] 063/bci/core/User.java:113 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão '_behavior' comparada '2' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 063/bci/core/User.java:218 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão '_behavior' comparada '3' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 063/bci/core/Work.java:78 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.

####  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] 063/bci/app/exception/Message.java:12 Membro estático 'static String problemOpeningFile(Exception cause)' não recomendável. [POStaticMember]
[ERROR] 063/bci/app/exception/Message.java:22 Membro estático 'static String noSuchCreator(String id)' não recomendável. [POStaticMember]
[ERROR] 063/bci/app/exception/Message.java:32 Membro estático 'static String noSuchWork(int idWork)' não recomendável. [POStaticMember]
[ERROR] 063/bci/app/exception/Message.java:43 Membro estático 'static String noSuchUser(int idUser)' não recomendável. [POStaticMember]
[ERROR] 063/bci/app/exception/Message.java:54 Membro estático 'static String userNotSuspended(int id)' não recomendável. [POStaticMember]
[ERROR] 063/bci/app/exception/Message.java:67 Membro estático 'static String borrowingRuleFailed(int idUser, int idWork, int idRule)' não recomendável. [POStaticMember]
[ERROR] 063/bci/app/exception/Message.java:79 Membro estático 'static String workNotBorrowedByUser(int idWork, int idUser)' não recomendável. [POStaticMember]
[ERROR] 063/bci/app/exception/Message.java:88 Membro estático 'static String userRegistrationFailed(String name, String email)' não recomendável. [POStaticMember]
[ERROR] 063/bci/app/main/Message.java:4 Membro estático 'static String currentDate(int date)' não recomendável. [POStaticMember]
[ERROR] 063/bci/app/main/Prompt.java:9 Método estático 'static String openFile()' com um simples return valor literal ou atributo não recomendável. [POStaticMember]
[ERROR] 063/bci/app/main/Prompt.java:16 Método estático 'static String saveBeforeExit()' com um simples return valor literal ou atributo não recomendável. [POStaticMember]
[ERROR] 063/bci/app/main/Prompt.java:23 Método estático 'static String saveAs()' com um simples return valor literal ou atributo não recomendável. [POStaticMember]
[ERROR] 063/bci/app/main/Prompt.java:30 Membro estático 'static String newSaveAs()' não recomendável. [POStaticMember]
[ERROR] 063/bci/app/main/Prompt.java:41 Método estático 'static String daysToAdvance()' com um simples return valor literal ou atributo não recomendável. [POStaticMember]
[ERROR] 063/bci/app/request/Message.java:5 Membro estático 'static String showFine(int idUser, int amount)' não recomendável. [POStaticMember]
[ERROR] 063/bci/app/request/Message.java:9 Membro estático 'static String workReturnDay(int idWork, int day)' não recomendável. [POStaticMember]
[ERROR] 063/bci/app/request/Prompt.java:5 Método estático 'static String finePaymentChoice()' com um simples return valor literal ou atributo não recomendável. [POStaticMember]
[ERROR] 063/bci/app/request/Prompt.java:9 Método estático 'static String returnNotificationPreference()' com um simples return valor literal ou atributo não recomendável. [POStaticMember]
[ERROR] 063/bci/app/user/Message.java:4 Membro estático 'static String registrationSuccessful(int idUser)' não recomendável. [POStaticMember]
[ERROR] 063/bci/app/user/Prompt.java:5 Método estático 'static String userId()' com um simples return valor literal ou atributo não recomendável. [POStaticMember]
[ERROR] 063/bci/app/user/Prompt.java:9 Método estático 'static String userName()' com um simples return valor literal ou atributo não recomendável. [POStaticMember]
[ERROR] 063/bci/app/user/Prompt.java:13 Método estático 'static String userEMail()' com um simples return valor literal ou atributo não recomendável. [POStaticMember]
[ERROR] 063/bci/app/work/Message.java:12 Membro estático 'static String noSuchWork(int idWork)' não recomendável. [POStaticMember]
[ERROR] 063/bci/app/work/Message.java:23 Membro estático 'static String invalidWorkId(int idWork)' não recomendável. [POStaticMember]
[ERROR] 063/bci/app/work/Message.java:35 Membro estático 'static String workRequestedForDays(int idWork, int days)' não recomendável. [POStaticMember]
[ERROR] 063/bci/app/work/Message.java:39 Membro estático 'static String notEnoughInventory(int idWork, int amount)' não recomendável. [POStaticMember]
[ERROR] 063/bci/app/work/Prompt.java:9 Método estático 'static String workId()' com um simples return valor literal ou atributo não recomendável. [POStaticMember]
[ERROR] 063/bci/app/work/Prompt.java:13 Método estático 'static String amountToDecrement()' com um simples return valor literal ou atributo não recomendável. [POStaticMember]
[ERROR] 063/bci/app/work/Prompt.java:23 Método estático 'static String searchTerm()' com um simples return valor literal ou atributo não recomendável. [POStaticMember]
[ERROR] 063/bci/app/work/Prompt.java:27 Método estático 'static String creatorId()' com um simples return valor literal ou atributo não recomendável. [POStaticMember]
[INFO] 063/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 30 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 'Work' utilizada no atributo 'private Set<Work> _works' da classe 'Creator' não substitui os métodos hashCode e equals. [WriteClassStructure]
Auditoria completa.

####  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): '[DeadlineStrategy, Observer]'. [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): '[Type, Category, UserBehavior]'. [WriteClassStructure]
[INFO] Número total de classes definidos no core: 24, dos quais 0 private, 1 package-private, 0 protected e 23 public. [WriteClassStructure]
[INFO] Classes abstractas definidas no package core da aplicação (2): '[BorrowingRule, Work]'. [WriteClassStructure]
[INFO] Classes concretas e não excepções definidas no package core da aplicação (17): '[User, Rule2UserMustBeActive, Rule4MaxRequests, Rule6PriceLimit, Request, Rule1NoDuplicateRequest, Creator, Notification, Date, Rule5NotReference, Dvd, Rule3WorkAvailable, Book, MyParser, LibraryManager, DefaultDeadlineStrategy, Library]'. [WriteClassStructure]
[INFO] Excepções definidas no package core da aplicação (5): '[MissingFileAssociationException, RuleException, UnavailableFileException, ImportFileException, UnrecognizedEntryException]'. [WriteClassStructure]
[INFO] Número total de métodos nas classes do core (sem excepções): 127, dos quais 6 private, 8 package-private, 1 protected e 112 public. [WriteClassStructure]
[INFO] Número total de atributos nas classes do core (sem excepções): 45, dos quais 45 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 )

 [WriteClassStructure]
[INFO] enum UserBehavior (  )

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

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

    int calculateDeadline(Work work, User user)

 [WriteClassStructure]
[INFO] interface Observer ( public )

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

    void update(Notification notification)
    int getId()

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

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

    private final int _ruleNumber

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

    public abstract int validate(User user, Work work, Library library)
    public final int getRuleNumber()

  ###### Subclasses  ###### 
    Rule2UserMustBeActive   Rule4MaxRequests   Rule6PriceLimit   Rule1NoDuplicateRequest   Rule5NotReference   Rule3WorkAvailable   

   Method validate(User, Work, Library) overriden in subclass(es) Rule2UserMustBeActive Rule4MaxRequests Rule6PriceLimit Rule1NoDuplicateRequest Rule5NotReference Rule3WorkAvailable 
 [WriteClassStructure]
[INFO] class User ( public implements Serializable, Observer )

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

    private int _id
    private boolean _isActive
    private String _name
    private String _email
    private int _fine
    private UserBehavior _behavior
    private List<Notification> _notifications
    private List<Request> _activeRequests
    private int _consecutiveOnTimeReturns
    private int _lateReturnCount

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

    public void update(Notification notification)
    public int getId()
    public boolean isActive()
    public String getName()
    public String getEmail()
    public int getFine()
    public UserBehavior getBehavior()
    public void setIsActive(boolean isActive)
    public void setFine(int fine)
    public void setBehavior(UserBehavior behavior)
    public void incrementOnTimeReturns()
    public void resetOnTimeReturns()
    public void incrementLateReturns()
    public void payFine()
    public void updateStatus(Date currentDate)
    public List<Notification> getNotifications()
    public List<Request> getActiveRequests()
    public void addRequest(Request request)
    public void removeRequest(Request request)
    public boolean hasActiveRequestForWork(int workId)
    public int getActiveRequestCount()
    public int getMaxRequests()
    public String toString()

 [WriteClassStructure]
[INFO] class Rule2UserMustBeActive ( public )
  extends BorrowingRule

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

    public int validate(User user, Work work, Library library)

 [WriteClassStructure]
[INFO] class Rule4MaxRequests ( public )
  extends BorrowingRule

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

    public int validate(User user, Work work, Library library)

 [WriteClassStructure]
[INFO] class Rule6PriceLimit ( public )
  extends BorrowingRule

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

    public int validate(User user, Work work, Library library)

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

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

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

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

    User getUser()
    Work getWork()
    int getRequestDate()
    public int getDeadline()

 [WriteClassStructure]
[INFO] class Rule1NoDuplicateRequest ( public )
  extends BorrowingRule

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

    public int validate(User user, Work work, Library library)

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

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

    private String _name
    private Set<Work> _works

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

    public String getName()
    public Set<Work> getWorks()
    public void addWork(Work work)

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

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

    private Type _type
    private String _workDescription

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

    public Type getType()
    public String getWorkDescription()

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

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

    private int _currentDate

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

    public int getCurrentDate()
    void advanceDay(int nDays)

 [WriteClassStructure]
[INFO] class Rule5NotReference ( public )
  extends BorrowingRule

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

    public int validate(User user, Work work, Library library)

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

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

    private String _igac
    private Creator _director

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

    public Creator getDirector()
    public String getType()
    public String getCreatorString()
    public String getCode()
    public boolean matchesSearchTerm(String searchTerm)
    public String toString()

 [WriteClassStructure]
[INFO] class Rule3WorkAvailable ( public )
  extends BorrowingRule

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

    public int validate(User user, Work work, Library library)

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

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

    private List<Creator> _authors
    private String _isbn

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

    public List<Creator> getAuthors()
    public String getType()
    public String getCreatorString()
    public String getCode()
    public boolean matchesSearchTerm(String searchTerm)
    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 _totalCopies
    private int _availableCopies
    private String _title
    private Category _category
    private List<Observer> _deliveryObservers
    private List<Observer> _availabilityObservers

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

    public int getId()
    public int getPrice()
    public int getTotalCopies()
    public int getAvailableCopies()
    public String getTitle()
    public Category getCategory()
    protected String categoryLabel()
    public boolean borrowOne()
    public void returnOne()
    public boolean updateInventory(int amount)
    public void addDeliveryObserver(Observer observer)
    public void addAvailabilityObserver(Observer observer)
    public void removeDeliveryObserver(Observer observer)
    public void removeAvailabilityObserver(Observer observer)
    public void removeAvailabilityObserverById(int userId)
    private void notifyDeliveryObservers()
    private void notifyAvailabilityObservers()
    public boolean hasDeliveryObserver(int userId)
    public boolean hasAvailabilityObserver(int userId)
    public abstract String getType()
    public abstract String getCreatorString()
    public abstract String getCode()
    public abstract boolean matchesSearchTerm(String searchTerm)
    public abstract String toString()

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

   Method getType() overriden in subclass(es) Dvd Book 
   Method getCreatorString() overriden in subclass(es) Dvd Book 
   Method getCode() overriden in subclass(es) Dvd Book 
   Method matchesSearchTerm(String) overriden in subclass(es) Dvd Book 
   Method toString() overriden in subclass(es) Dvd Book 
 [WriteClassStructure]
[INFO] class LibraryManager ( public )

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

    private Library _library
    private String _filename

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

    public void save()
    public void saveAs(String filename)
    public void load(String filename)
    public void importFile(String datafile)
    public boolean hasChanged()
    public Date getCurrentDate()
    public void advanceDays(int nDays)
    public User getUser(int id)
    public Collection<User> getUsers()
    public User registerUser(String name, String email)
    public boolean hasCreator(String name)
    public Creator registerCreator(String name)
    public Work getWork(int id)
    public Collection<Work> getWorks()
    public Collection<Work> getWorksByCreator(String name)
    public Collection<Work> searchWorks(String searchTerm)
    public boolean updateWorkInventory(int workId, int amount)
    public Dvd registerDvd(int price, int nCopies, String title, Category category, Creator director, String igac)
    public Book registerBook(int price, int nCopies, String title, Category category, List authors, String isbn)
    public Request requestWork(int userId, int workId)
    public int calculateReturnFine(int userId, int workId)
    public int returnWork(int userId, int workId)
    public boolean payUserFine(int userId)

 [WriteClassStructure]
[INFO] class DefaultDeadlineStrategy ( public implements DeadlineStrategy )

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

    public int calculateDeadline(Work work, User user)

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

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

    private int _nextWorkId
    private int _nextUserId
    private boolean _modified
    private Date _currentDate
    private Map<Integer, User> _users
    private Map<String, Creator> _creators
    private Map<Integer, Work> _works
    private List<Request> _allRequests
    private List<BorrowingRule> _borrowingRules
    private DeadlineStrategy _deadlineStrategy

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

    void importFile(String filename)
    public boolean hasChanged()
    public void setModified(boolean modified)
    Date getCurrentDate()
    void advanceDays(int nDays)
    public User getUser(int id)
    public Collection<User> getUsers()
    public User registerUser(String name, String email)
    public boolean hasCreator(String name)
    public Creator registerCreator(String name)
    public Work getWork(int id)
    public Collection<Work> getWorks()
    public Collection<Work> getWorksByCreator(String name)
    public Collection<Work> searchWorks(String searchTerm)
    public Dvd registerDvd(int price, int nCopies, String title, Category category, Creator director, String igac)
    public Book registerBook(int price, int nCopies, String title, Category category, List authors, String isbn)
    public Request requestWork(int userId, int workId)
    public int calculateReturnFine(int userId, int workId)
    public int returnWork(int userId, int workId)
    public boolean payUserFine(int userId)

 [WriteClassStructure]
Auditoria completa.
