

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




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

[ERROR] 079/bci/app/main/DoOpenFile.java:32:	EmptyCatchBlock:	Evitar blocos catch vazios.
Total de erros:  1


####    Quebra do encapsulamento


Nada a assinalar


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


[INFO] 079/bci/core/Book.java:0:	POLooseCouplingRule:	Aplicação correcta (1) e incorrecta (0) do princípio Programar para abstracção no ficheiro Book.java.
[INFO] 079/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] 079/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] 079/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] 079/bci/core/User.java:0:	POLooseCouplingRule:	Aplicação correcta (2) e incorrecta (0) do princípio Programar para abstracção no ficheiro User.java.
[INFO] 079/bci/core/Work.java:0:	POLooseCouplingRule:	Aplicação correcta (3) 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] 079/bci/core/Creator.java:30:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Creator - devolve atributo (_works) em método público (getWorks)
[ERROR] 079/bci/core/Work.java:31:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Work - atribui parâmetro (creators) a atributo (_creators)
[ERROR] 079/bci/core/Work.java:38:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Work - devolve atributo (_creators) em método público (getCreators)
[INFO] 079/bci/core/Library.java:74:	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] 079/bci/core/Library.java:82:	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] 079/bci/core/Library.java:144:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe Library evitada por criação de cópia (via _works.values().stream().filter().sorted(Comparator.comparingInt(Work::getId)).collect(Collectors.toList())) de _works no método searchWorks
[INFO] 079/bci/core/Library.java:167:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em Library por uso de Collections.unmodifiableList para devolver vista imutável de _requests em método getRequests
Total de erros:  3
Total de fugas evitadas:        4


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


Nada a assinalar


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


Nada a assinalar


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

[ERROR] 079/bci/core/DVD.java:9:14: Abreviações no nome 'DVD' não deveriam conter mais do que '1' letras maiúsculas consecutivas. [AbbreviationAsWordInName]
[ERROR] 079/bci/core/Library.java:38:28: A constante com o nome 'LOAN_DAYS_GT5' deve condizer com o padrão '^[A-Z][A-Z0-9]*(_[A-Z]+)*$'. [ConstantName]
[ERROR] 079/bci/core/Library.java:39:28: A constante com o nome 'LOAN_DAYS_2_TO_5' deve condizer com o padrão '^[A-Z][A-Z0-9]*(_[A-Z]+)*$'. [ConstantName]
[ERROR] 079/bci/core/Library.java:40:28: A constante com o nome 'LOAN_DAYS_1' deve condizer com o padrão '^[A-Z][A-Z0-9]*(_[A-Z]+)*$'. [ConstantName]
[ERROR] 079/bci/app/work/DoDisplayWorksByCreator.java:33:144: Apenas uma instrução por linha é permitida. [OneStatementPerLine]
Total de erros:  5

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

Iniciando a auditoria...
[INFO] 079/bci/core/LibraryManager.java:37 ObjectOutputStream criado no método 'public void saveAs(String filename)' da classe 'LibraryManager'. [CheckSerialization]
[INFO] 079/bci/core/LibraryManager.java:45 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] 079/bci/core/Library.java:323 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão 'st' comparada '2' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[ERROR] 079/bci/core/Library.java:353 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] 079/bci/core/Library.java:355 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] 079/bci/core/Parser.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]
Auditoria completa.
O Checkstyle terminou com 2 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...
[INFO] 079/bci/core/Library.java:38 Atributo estático final 'int LOAN_DAYS_GT5' permitido. [POStaticMember]
[INFO] 079/bci/core/Library.java:39 Atributo estático final 'int LOAN_DAYS_2_TO_5' permitido. [POStaticMember]
[INFO] 079/bci/core/Library.java:40 Atributo estático final 'int LOAN_DAYS_1' permitido. [POStaticMember]
[INFO] 079/bci/core/Library.java:41 Atributo estático final 'int BONUS_CUMPRIDOR' permitido. [POStaticMember]
[INFO] 079/bci/core/Library.java:42 Atributo estático final 'int FINE_PER_DAY' permitido. [POStaticMember]
[INFO] 079/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 '18'. [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

Iniciando a auditoria...
[ERROR] O método'toString' está a ser substituído em todas as classes derivadas de 'Work' pelo que deve ser abstracto'. [WriteClassStructure]
Auditoria completa.
O Checkstyle terminou com 1 erros.

####  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): '[UserState, WorkCategory]'. [WriteClassStructure]
[INFO] Número total de classes definidos no core: 14, dos quais 0 private, 1 package-private, 0 protected e 13 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 (9): '[User, Request, Creator, Parser, DVD, Book, LibraryManager, TimeManagement, 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): 124, dos quais 7 private, 7 package-private, 1 protected e 109 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 UserState ( public )

 [WriteClassStructure]
[INFO] enum WorkCategory ( public )

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

    private final String _displayName

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

    public String toString()

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

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

    private final int _id
    private final String _name
    private final String _email
    private boolean _isActive
    private String _classification
    private final List<String> _notifications
    private UserState _state
    private int _fine
    private int _suspensionUntil
    private int _onTimeStreak
    private int _lateCount

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

    public void incLateCount()
    public int getLateCount()
    public int getId()
    public String getName()
    public String getEmail()
    public boolean isActive()
    public void setActive(boolean active)
    public int getFine()
    public String getClassification()
    public String toString()
    public void addNotification(String message)
    public List<String> pullNotifications()
    public boolean hasNotifications()
    public UserState getState()
    public void setState(UserState s)
    public void addFine(int amount)
    public int payFine(int amount)
    public void maybeUnsuspend(int today)
    public boolean hasFine()
    public int getSuspensionUntil()
    public void suspendUntil(int day)
    public boolean isSuspended(int currentDay)
    public void resetOnTimeStreak()
    public void incOnTimeStreak()
    public int getOnTimeStreak()

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

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

    private final int _userId
    private final int _workId
    private final int _requestDate
    private final int _dueDate
    private Integer _returnDate

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

    public int getUserId()
    public int getWorkId()
    public int getRequestDate()
    public int getDueDate()
    public Integer getReturnDate()
    public boolean isOpen()
    public void markReturned(int returnDate)
    public String toString()
    public boolean equals(Object o)
    public int hashCode()

 [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()
    void addWork(Work work)
    boolean hasNoWorks()
    public boolean equals(Object o)
    public int hashCode()

 [WriteClassStructure]
[INFO] class Parser (  )

  ###### 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] class DVD ( public )
  extends Work

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

    private final String _igacNumber

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

    public String getIgacNumber()
    public Creator getDirector()
    public String getType()
    public String getSpecificDetails()
    public String toString()

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

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

    private final String _isbn

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

    public String getIsbn()
    public String getType()
    public String getSpecificDetails()
    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 final List<Creator> _creators
    private int _totalCopies
    private int _availableCopies

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

    public int getId()
    public String getTitle()
    public int getPrice()
    public WorkCategory getCategory()
    public List<Creator> getCreators()
    public int getTotalCopies()
    public int getAvailableCopies()
    public void changeCopies(int delta)
    public void borrowOne()
    public void returnOne()
    protected String getCreatorsAsString()
    public abstract String getType()
    public abstract String getSpecificDetails()
    public String toString()

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

   Method getType() overriden in subclass(es) DVD Book 
   Method getSpecificDetails() 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
    private boolean _changed

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

    public Library getLibrary()
    public int getDate()
    public void save()
    public void saveAs(String filename)
    public void load(String filename)
    public void importFile(String datafile)
    public void advanceDate(int days)
    public boolean hasChanged()
    public void markChanged()
    public List<Work> searchWorks(String term)
    public Work getWork(int id)
    public Creator getCreator(String name)
    public User getUser(int id)
    public List<Work> getWorksByCreator(String name)
    public boolean changeWorkInventory(int workId, int delta)
    public Request createRequest(int userId, int workId)
    public boolean processReturn(int userId, int workId)
    public List<Request> fetchAllRequests()
    public void subscribeAvailability(int userId, int workId)
    public List<String> pullUserNotifications(int userId)
    public int getUserFine(int userId)
    public void payUserFine(int userId, int amount)
    public Request findOpenRequest(int userId, int workId)
    public int previewLateDays(int userId, int workId)
    public Integer processReturnAndGetLate(int userId, int workId)
    public Integer returnWork(int userId, int workId)
    public Integer returnWorkWithInfo(int userId, int workId)

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

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

    private int _dataAtual

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

    public int getDataAtual()
    public void avancaData(int dias)
    public void setDataAtual(int novaData)

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

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

    private int _nextWorkId
    private int _nextUserId
    private int _date
    private TimeManagement _timeManagement
    private final Map<Integer, Work> _works
    private final Map<Integer, User> _users
    private final Map<String, Creator> _creators
    private final Map<Integer, Set<Integer>> _waitlistByWork
    private final List<Request> _requests
    private final static int LOAN_DAYS_GT5
    private final static int LOAN_DAYS_2_TO_5
    private final static int LOAN_DAYS_1
    private final static int BONUS_CUMPRIDOR
    private final static int FINE_PER_DAY

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

    public int getDate()
    public TimeManagement getTimeManagement()
    public void advanceDate(int days)
    public User registerUser(String name, String email)
    public Collection<User> getUsers()
    public User getUser(int id)
    public Collection<Work> getWorks()
    public Work getWork(int id)
    public Creator getCreator(String name)
    void importFile(String filename)
    Creator getOrCreateCreator(String name)
    void addWork(Work work)
    int getNextWorkId()
    public boolean changeWorkInventory(int workId, int delta)
    private void removeWorkAndCleanup(Work w)
    public List<Work> searchWorks(String term)
    public List<Work> getWorksByCreator(String creatorName)
    public List<Request> getRequests()
    public Request requestWork(int userId, int workId)
    public Request findOpenRequest(int userId, int workId)
    public Integer returnWorkWithInfo(int userId, int workId)
    public Integer returnWork(int userId, int workId)
    private int loanDaysFor(Work w, User u)
    public void subscribeAvailability(int userId, int workId)
    private void notifyAvailability(int workId)

 [WriteClassStructure]
Auditoria completa.
