

####    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] 017/bci/app/user/DoRegisterUser.java:33:	POAvoidCatchingGenericException:	Evitar apanhar excepções demasiado genéricas (RuntimeException and Exception) em blocos try-catch.
Total de erros:  1


####    Quebra do encapsulamento


Nada a assinalar


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


[INFO] 017/bci/core/Creator.java:0:	POLooseCouplingRule:	Aplicação correcta (3) e incorrecta (0) do princípio Programar para abstracção no ficheiro Creator.java.
[INFO] 017/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] 017/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] 017/bci/core/Request.java:0:	POLooseCouplingRule:	Aplicação correcta (1) e incorrecta (0) do princípio Programar para abstracção no ficheiro Request.java.
[INFO] 017/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] 017/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] 017/bci/core/Creator.java:18:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Creator - atribui parâmetro (works) a atributo (this._works)
[ERROR] 017/bci/core/User.java:163:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe User - devolve atributo (_requests) em método público (getRequests)
[INFO] 017/bci/core/Creator.java:47:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em Creator por uso de Collections.unmodifiableList para devolver vista imutável de _works em método getWorks
[INFO] 017/bci/core/Library.java:133:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em Library por uso de Collections.unmodifiableList para devolver vista imutável de _works em método getWorks
[INFO] 017/bci/core/Library.java:143:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe Library evitada por criação de cópia (via _works.stream().filter().collect(Collectors.toUnmodifiableList())) de _works no método getWorksByCreator
[INFO] 017/bci/core/Library.java:154:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em Library por uso de Collections.unmodifiableList para devolver vista imutável de _users em método getUsers
[INFO] 017/bci/core/Library.java:307:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em Library por uso de Collections.unmodifiableList para devolver vista imutável de _users.stream().sorted(Comparator.comparing(User::getName).thenComparingInt(User::getId)).collect(Collectors.toUnmodifiableList()) em método getAllUsers
[INFO] 017/bci/core/Library.java:322:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em Library por uso de Collections.unmodifiableList para devolver vista imutável de _works.stream().sorted(Comparator.comparingInt(Work::getId)).collect(Collectors.toUnmodifiableList()) em método getAllWorks
[INFO] 017/bci/core/Library.java:337:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em Library por uso de Collections.unmodifiableList para devolver vista imutável de _works.stream().sorted(Comparator.comparingInt(Work::getId)).filter().collect(Collectors.toUnmodifiableList()) em método searchTerm
[INFO] 017/bci/core/Work.java:184:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em Work por uso de Collections.unmodifiableList para devolver vista imutável de _creators em método getCreators
Total de erros:  2
Total de fugas evitadas:        8


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

Nada a assinalar

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

Iniciando a auditoria...
[INFO] 017/bci/core/LibraryManager.java:51 ObjectOutputStream criado no método 'public void saveAs(String filename)' da classe 'LibraryManager'. [CheckSerialization]
[INFO] 017/bci/core/LibraryManager.java:78 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] 017/bci/core/Category.java:16 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão 'this' comparada '4' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 017/bci/core/MyParser.java:46 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] 017/bci/core/NotificationType.java:7 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão 'this' comparada '3' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 017/bci/core/UserClassification.java:15 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão 'this' comparada '4' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 017/bci/core/UserClassification.java:28 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão 'this' comparada '4' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 017/bci/core/UserClassification.java:44 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão 'this' comparada '12' 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...
[INFO] 017/bci/core/exception/ImportFileException.java:7 Atributo estático final 'String ERROR_MESSAGE' permitido. [POStaticMember]
[INFO] 017/bci/core/exception/InvalidCreatorQuantityException.java:9 Atributo estático final 'String ERROR_MESSAGE' permitido. [POStaticMember]
[INFO] 017/bci/core/exception/InvalidDateAdvanceException.java:7 Atributo estático final 'String ERROR_MESSAGE' permitido. [POStaticMember]
[INFO] 017/bci/core/exception/InvalidTotalCopiesException.java:7 Atributo estático final 'String ERROR_MESSAGE' permitido. [POStaticMember]
[INFO] 017/bci/core/exception/InvalidWorkRequestException.java:7 Atributo estático final 'String ERROR_MESSAGE' permitido. [POStaticMember]
[INFO] 017/bci/core/exception/NoSuchCreatorNameException.java:8 Atributo estático final 'String ERROR_MESSAGE' permitido. [POStaticMember]
[INFO] 017/bci/core/exception/NoSuchUserIdException.java:8 Atributo estático final 'String ERROR_MESSAGE' permitido. [POStaticMember]
[INFO] 017/bci/core/exception/NoSuchWorkIdException.java:8 Atributo estático final 'String ERROR_MESSAGE' permitido. [POStaticMember]
[INFO] 017/bci/core/exception/RuleFailedException.java:9 Atributo estático final 'String ERROR_MESSAGE' permitido. [POStaticMember]
[INFO] 017/bci/core/exception/UserIsNotSuspendedException.java:8 Atributo estático final 'String ERROR_MESSAGE' permitido. [POStaticMember]
[INFO] O número de serialVersionUID atributos estáticos definidos nas várias classes foi '30'. [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: 4, dos quais 0 private, 0 package-private, 0 protected e 4 public. [WriteClassStructure]
[INFO] Enumerados definidos no package core da aplicação (4): '[Category, NotificationType, UserClassification, UserSituation]'. [WriteClassStructure]
[INFO] Número total de classes definidos no core: 32, dos quais 0 private, 1 package-private, 0 protected e 31 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): '[CheckRequestMaxPrice, User, Creator, Clock, Notification, CheckActiveUser, Book, CheckMaxRequests, MyParser, Request, CheckRepeatRequest, Dvd, LibraryManager, Library, CheckNonReferenceWorkCategory, CheckAvailableWork]'. [WriteClassStructure]
[INFO] Excepções definidas no package core da aplicação (14): '[WorkNotBorrowedByUserException, RuleFailedException, NoSuchCreatorNameException, InvalidWorkRequestException, UnavailableFileException, InvalidTotalCopiesException, UnrecognizedEntryException, NoSuchUserIdException, NoSuchWorkIdException, InvalidDateAdvanceException, MissingFileAssociationException, UserIsNotSuspendedException, InvalidCreatorQuantityException, ImportFileException]'. [WriteClassStructure]
[INFO] Número total de métodos nas classes do core (sem excepções): 153, dos quais 8 private, 1 package-private, 0 protected e 144 public. [WriteClassStructure]
[INFO] Número total de atributos nas classes do core (sem excepções): 56, dos quais 45 private, 0 package-private, 11 protected e 0 public. [WriteClassStructure]
Auditoria completa.

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

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

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

    public String toString()

 [WriteClassStructure]
[INFO] enum NotificationType ( public )

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

    public String toString()

 [WriteClassStructure]
[INFO] enum UserClassification ( public )

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

    public int getMaxPrice()
    public int getMaxRequests()
    public int getExpiryDate(int availableCopies)

 [WriteClassStructure]
[INFO] enum UserSituation ( public )

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

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

    public boolean isValid(Request request)

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

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

    private final int _id
    private int _fine
    private int _maxRequests
    private int _maxPrice
    private int _cumpriuPrazos
    private int _faltas
    private final String _name
    private final String _email
    private UserClassification _classification
    private UserSituation _situation
    private final List<Request> _requests
    private final List<Notification> _notifications

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

    public int getId()
    public String getName()
    public String getEmail()
    public UserClassification getClassification()
    public void setClassification(UserClassification classification)
    public UserSituation getSituation()
    public void suspendUser()
    public void activateUser()
    public void updateFine(int currentDate, int fineAmmount)
    public int getFine()
    public void payAllFines(int currentDate, int fineAmmount)
    public List<Request> getRequests()
    public void addRequest(Request request)
    public void removeRequest(Request request)
    public int getMaxRequests()
    public int getMaxPrice()
    public List<Notification> getNotifications()
    public void notify(Notification notification)
    public void removeNotification(Notification notification)
    public String toString()
    public void updateSituation(int currentDate)
    public void updateClassification()
    public Request findRequestByWorkId(int workId)
    public void setCumpriuPrazos()
    public void setFaltouPrazos()
    public void returnWork(Request request, int currentDate)

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

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

    private final int _id
    private final String _name
    private final List<Work> _works

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

    public String getName()
    public int getId()
    public List<Work> getWorks()
    public void registerWork(Work work)
    public void removeWork(Work work)
    public void deleteCreator()
    public boolean searchTerm(String term)

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

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

    private int _day

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

    public int getDay()
    public boolean advanceDay(int days)

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

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

    private final User _user
    private Work _work
    private final NotificationType _type

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

    public User getUser()
    public Work getWork()
    public NotificationType getType()
    public String toString()
    public void assignWork(Work work)

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

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

    public boolean isValid(Request request)

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

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

    private final String _isbn

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

    public String getISBN()
    public String toString()
    public String getType()

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

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

    public boolean isValid(Request request)

 [WriteClassStructure]
[INFO] class MyParser (  )

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

    private final Library _library

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

    void parseFile(String filename)
    private void parseLine(String line)
    private void attachCreator(String name, Work work)
    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, Cloneable )

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

    protected String _title
    protected int _id
    protected int _totalCopies
    protected int _availableCopies
    protected int _price
    protected int _maxCreators
    protected Category _category
    protected List<Creator> _creators
    protected List<Notification> _notifications

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

    public void changeTotalCopies(int change)
    public boolean isAvailable()
    public void removeNotifications(NotificationType type)
    public void notifyUsers(NotificationType type)
    public void borrowWork()
    public void returnWork(Request request, int currentDate)
    public int getId()
    public String getTitle()
    public int getTotalCopies()
    public int getAvailableCopies()
    public int getPrice()
    public Category getCategory()
    public abstract String getType()
    public List<Creator> getCreators()
    public void deleteWork()
    public void removeCreator(Creator creator)
    public boolean assignCreator(Creator creator)
    public int getMaxCreators()
    public String toString()
    public Work clone()
    public boolean searchTerm(String term)
    public void createNotification(User user, NotificationType type)

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

   Method getType() overriden in subclass(es) Book Dvd 
   Method toString() overriden in subclass(es) Book Dvd 
 [WriteClassStructure]
[INFO] class Request ( public implements java.io.Serializable )

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

    private final int _id
    private final int _dateOfCreation
    private int _expiryDate
    private int _lastTimePayedFine
    private boolean _isValid
    private boolean _isActive
    private final User _user
    private final Work _work
    private final List<Rule> _rules

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

    public int getId()
    public User getUser()
    public Work getWork()
    public int getDateOfCreation()
    public Rule verifyRules()
    public void setExpiryDate(User user, Work work)
    public int getExpiryDate()
    public boolean isValid(int currentDate)
    public int getUsersFine(int currentDate, int fineAmmount)
    public void payFine(int currentDate)
    public boolean isActive()
    public void setInactive()

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

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

    public boolean isValid(Request request)

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

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

    private final String _igac

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

    public String getIGAC()
    public String toString()
    public String getType()

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

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

    private Library _library
    private final MyParser _parser

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

    public void save()
    public void saveAs(String filename)
    public boolean hasUnsavedChanges()
    public void load(String filename)
    public void importFile(String datafile)
    public int getCurrentDate()
    public void advanceDay(int days)
    public User registerUser(String name, String email)
    public User getUserById(int id)
    public List<User> getAllUsers()
    public List<Work> getAllWorks()
    public Work getWorkById(int id)
    public List<Work> getWorksByCreator(String creatorname)
    public int getFineAmmount()
    public List<Work> searchTerm(String term)
    public Request requestWork(int userId, int workId)
    public void createNotification(int userId, int workId)
    public Request returnWork(int userId, int workId)
    public int getUsersFine(int userId)
    public void payUsersFine(int userId)
    public void changeWorkInventory(int workId, int ammountToDecrement)
    public List<Notification> getUserNotifications(int userId)

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

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

    private String _name
    private boolean _hasChanges
    private int _lastWorkId
    private int _lastUserId
    private int _lastCreatorId
    private int _lastRequestId
    private int _fineAmmount
    private final List<Work> _works
    private final List<Creator> _creators
    private final List<User> _users
    private final List<Request> _requests
    private final Clock _clock

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

    public int getCurrentDate()
    public void advanceDay(int days)
    public int getNextWorkId()
    public int getNextUserId()
    public int getNextCreatorId()
    public int getNextRequestId()
    public String getName()
    public void setName(String name)
    public List<Work> getWorks()
    public List<Work> getWorksByCreator(Creator creator)
    public List<User> getUsers()
    public int getFineAmmount()
    public void setFineAmmount(int fineAmmount)
    public void registerWork(Work work)
    public void registerCreator(Creator creator)
    public void recordChanges()
    public boolean hasChanges()
    public boolean hasUser(int id)
    public User registerUser(String name, String email)
    public User getUserById(int id)
    public int getUsersFine(int userId)
    public Work getWorkById(int id)
    public Creator getCreatorByName(String name)
    public List<User> getAllUsers()
    public List<Work> getAllWorks()
    public List<Work> searchTerm(String term)
    private void addRequest(Request request)
    public void createNotification(User user, Work work, NotificationType type)
    public Request requestWork(int userId, int workId)
    public Request returnWork(int userId, int workId)
    public void update(int currentDate)
    public void payUsersFine(int userId)
    public void changeWorkInventory(int workId, int ammountToDecrement)
    public List<Notification> getUserNotifications(int userId)
    private void removeRequest(Request request)
    private void deactivateRequest(Request request, int currentDate)

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

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

    protected final int _id
    protected final String _description

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

    public abstract boolean isValid(Request request)
    public int getId()
    public String getDescription()

  ###### Subclasses  ###### 
    CheckRequestMaxPrice   CheckActiveUser   CheckMaxRequests   CheckRepeatRequest   CheckNonReferenceWorkCategory   CheckAvailableWork   

   Method isValid(Request) overriden in subclass(es) CheckRequestMaxPrice CheckActiveUser CheckMaxRequests CheckRepeatRequest CheckNonReferenceWorkCategory CheckAvailableWork 
 [WriteClassStructure]
[INFO] class CheckNonReferenceWorkCategory ( public )
  extends Rule

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

    public boolean isValid(Request request)

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

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

    public boolean isValid(Request request)

 [WriteClassStructure]
Auditoria completa.
