

####    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] 005/bci/app/request/DoRequestWork.java:50:	EmptyCatchBlock:	Evitar blocos catch vazios.
[ERROR] 005/bci/app/request/DoReturnWork.java:45:	EmptyCatchBlock:	Evitar blocos catch vazios.
Total de erros:  2


####    Quebra do encapsulamento


Nada a assinalar


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


[INFO] 005/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] 005/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] 005/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] 005/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] 005/bci/core/User.java:0:	POLooseCouplingRule:	Aplicação correcta (5) e incorrecta (0) do princípio Programar para abstracção no ficheiro User.java.
[INFO] 005/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] 005/bci/core/Book.java:23:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Book - atribui parâmetro (authors) a atributo (this._authors)
[ERROR] 005/bci/core/Book.java:34:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Book - devolve atributo (_authors) em método público (getAuthors)
[ERROR] 005/bci/core/User.java:61:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe User - devolve atributo (_requests) em método público (getRequests)
[ERROR] 005/bci/core/User.java:69:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe User - devolve atributo (_notifications) em método público (getNotifications)
[WARN] 005/bci/core/Creator.java:38:	MethodReturnsFieldCollectionRule:	Potencial fuga de privacidade (aceite) em método getWorks da classe Creator: devolve referência directa para '_works' mas método não é público: protected
Total de erros:  4
Total de fugas evitadas:        0


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


[ERROR] 005/bci/core/NormalUserBehaviour.java:31:9: Utilização de um ciclo 'while' para iterar o conteúdo da lista referenciada por 'requests' (do tipo 'List<Request>'). 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]
[ERROR] 005/bci/core/NormalUserBehaviour.java:38:9: Utilização de um ciclo 'while' para iterar o conteúdo da lista referenciada por 'requests' (do tipo 'List<Request>'). 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]
[ERROR] 005/bci/core/NormalUserBehaviour.java:46:9: Utilização de um ciclo 'while' para iterar o conteúdo da lista referenciada por 'requests' (do tipo 'List<Request>'). 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]
[ERROR] 005/bci/core/OffenderUserBehaviour.java:31:9: Utilização de um ciclo 'while' para iterar o conteúdo da lista referenciada por 'requests' (do tipo 'List<Request>'). 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]
[ERROR] 005/bci/core/OffenderUserBehaviour.java:36:9: Utilização de um ciclo 'while' para iterar o conteúdo da lista referenciada por 'requests' (do tipo 'List<Request>'). 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]
[ERROR] 005/bci/core/Book.java:65:9: Utilização de um ciclo 'for' para iterar o conteúdo da lista referenciada por '_authors' (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]
[ERROR] 005/bci/core/CompliantUserBehaviour.java:30:9: Utilização de um ciclo 'while' para iterar o conteúdo da lista referenciada por 'requests' (do tipo 'List<Request>'). 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]
[ERROR] 005/bci/core/CompliantUserBehaviour.java:35:9: Utilização de um ciclo 'while' para iterar o conteúdo da lista referenciada por 'requests' (do tipo 'List<Request>'). 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]
Total de erros:  8


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


[WARN] 005/bci/core/User.java:56:44: Parâmetro/variável local '_behaviour' esconde atributo da classe com o mesmo nome [HiddenField]
[WARN] 005/bci/core/Rule.java:24:27: Parâmetro/variável local '_id' esconde atributo da classe com o mesmo nome [HiddenField]
[WARN] 005/bci/core/Request.java:63:37: Parâmetro/variável local '_isActive' esconde atributo da classe com o mesmo nome [HiddenField]
[WARN] 005/bci/core/Request.java:71:45: Parâmetro/variável local '_returnedOnTime' esconde atributo da classe com o mesmo nome [HiddenField]
[WARN] 005/bci/core/Request.java:79:35: Parâmetro/variável local '_paid' esconde atributo da classe com o mesmo nome [HiddenField]
[WARN] 005/bci/core/Request.java:87:29: Parâmetro/variável local '_fine' esconde atributo da classe com o mesmo nome [HiddenField]
Total de erros:  0


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

[ERROR] 005/bci/core/DVD.java:13:14: Abreviações no nome 'DVD' não deveriam conter mais do que '1' letras maiúsculas consecutivas. [AbbreviationAsWordInName]
[ERROR] 005/bci/core/User.java:52:38: O parâmetro '_userStatus' deve condizer com o padrão '^[a-z][a-zA-Z]*[0-9]?$'. [ParameterName]
[ERROR] 005/bci/core/User.java:56:44: O parâmetro '_behaviour' deve condizer com o padrão '^[a-z][a-zA-Z]*[0-9]?$'. [ParameterName]
[ERROR] 005/bci/core/Rule.java:24:27: O parâmetro '_id' deve condizer com o padrão '^[a-z][a-zA-Z]*[0-9]?$'. [ParameterName]
[ERROR] 005/bci/core/Request.java:63:37: O parâmetro '_isActive' deve condizer com o padrão '^[a-z][a-zA-Z]*[0-9]?$'. [ParameterName]
[ERROR] 005/bci/core/Request.java:71:45: O parâmetro '_returnedOnTime' deve condizer com o padrão '^[a-z][a-zA-Z]*[0-9]?$'. [ParameterName]
[ERROR] 005/bci/core/Request.java:79:35: O parâmetro '_paid' deve condizer com o padrão '^[a-z][a-zA-Z]*[0-9]?$'. [ParameterName]
[ERROR] 005/bci/core/Request.java:87:29: O parâmetro '_fine' deve condizer com o padrão '^[a-z][a-zA-Z]*[0-9]?$'. [ParameterName]
Total de erros:  8

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

Iniciando a auditoria...
[INFO] 005/bci/core/LibraryManager.java:102 ObjectOutputStream criado no método 'public void saveAs(String filename)' da classe 'LibraryManager'. [CheckSerialization]
[INFO] 005/bci/core/LibraryManager.java:128 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...
[INFO] 005/bci/core/CheckCategory.java:23 Comparação de valores enumerados via método equals. Normalmente, a comparação de valores enumerados pode ser realizada via operador ==. [OpenClosePrinciple]
[INFO] 005/bci/core/CheckIsActive.java:23 Comparação de valores enumerados via método equals. Normalmente, a comparação de valores enumerados pode ser realizada via operador ==. [OpenClosePrinciple]
[WARN] 005/bci/core/Parser.java:53 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] 005/bci/core/User.java:261 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão '_status' comparada '3' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
Auditoria completa.

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

Iniciando a auditoria...
[ERROR] 005/bci/app/request/DoReturnWork.java:38 Instanciação de classe do domínio 'NoSuchUserException' não permitido na camada da aplicação. [POCreateCoreEntitiesInApp]
[ERROR] 005/bci/app/request/DoReturnWork.java:40 Instanciação de classe do domínio 'NoSuchWorkException' não permitido na camada da aplicação. [POCreateCoreEntitiesInApp]
[ERROR] 005/bci/app/request/DoReturnWork.java:42 Instanciação de classe do domínio 'WorkNotBorrowedByUserException' não permitido na camada da aplicação. [POCreateCoreEntitiesInApp]
[ERROR] 005/bci/app/request/DoReturnWork.java:44 Instanciação de classe do domínio 'UserIsActiveException' não permitido na camada da aplicação. [POCreateCoreEntitiesInApp]
Auditoria completa.
O Checkstyle terminou com 4 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...
[INFO] 005/bci/core/exception/ImportFileException.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 '12'. [POStaticMember]
Auditoria completa.

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

Iniciando a auditoria...
[ERROR] 005/bci/core/Date.java:10 O atributo '_day', com nível de acesso 'package', deveria ser privado e ter métodos acessores. [POVisibilityModifier]
[ERROR] 005/bci/core/Library.java:28 O atributo '_currentDate', com nível de acesso 'package', deveria ser privado e ter métodos acessores. [POVisibilityModifier]
[ERROR] 005/bci/core/exception/BorrowingRuleFailedException.java:7 O atributo '_ruleId', com nível de acesso 'package', deveria ser privado e ter métodos acessores. [POVisibilityModifier]
Auditoria completa.
O Checkstyle terminou com 3 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

Iniciando a auditoria...
[ERROR] Nível de acesso incorrecto (protected) nos seguintes membros '[getDescription]' da classe 'User' dado que não envolve o mecanismo de herança [WriteClassStructure]
[ERROR] Nível de acesso incorrecto (protected) nos seguintes membros '[getName, getWorks, addWork, removeWork]' da classe 'Creator' dado que não envolve o mecanismo de herança [WriteClassStructure]
Auditoria completa.
O Checkstyle terminou com 2 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 interfaces definidos no core: 3, dos quais 0 private, 0 package-private, 0 protected e 3 public. [WriteClassStructure]
[INFO] Interfaces definidos no package core da aplicação (3): '[IEventType, IObserver, ISubject]'. [WriteClassStructure]
[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): '[WorkEventType, WorkCategory, UserStatus]'. [WriteClassStructure]
[INFO] Número total de classes definidos no core: 35, dos quais 0 private, 1 package-private, 0 protected e 34 public. [WriteClassStructure]
[INFO] Classes abstractas definidas no package core da aplicação (3): '[Work, UserBehaviour, Rule]'. [WriteClassStructure]
[INFO] Classes concretas e não excepções definidas no package core da aplicação (21): '[User, CheckHasAvailableCopies, CheckMaxPrice, CheckCategory, CompliantUserBehaviour, Creator, Notification, CheckRequestTwice, Book, CheckMaxRequests, CompareWorkByTitle, Request, Date, Parser, CheckIsActive, CompareWorkById, DVD, LibraryManager, Library, NormalUserBehaviour, OffenderUserBehaviour]'. [WriteClassStructure]
[INFO] Excepções definidas no package core da aplicação (11): '[WorkNotBorrowedByUserException, NoSuchUserException, UserIsActiveException, UnavailableFileException, BorrowingRuleFailedException, UnrecognizedEntryException, NoSuchCreatorException, NotEnoughInventoryException, MissingFileAssociationException, NoSuchWorkException, ImportFileException]'. [WriteClassStructure]
[INFO] Número total de métodos nas classes do core (sem excepções): 156, dos quais 9 private, 5 package-private, 14 protected e 128 public. [WriteClassStructure]
[INFO] Número total de atributos nas classes do core (sem excepções): 47, dos quais 45 private, 2 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 )

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

    public String toString()
    public String toString()

 [WriteClassStructure]
[INFO] enum WorkCategory ( public )

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

    public String toString()
    public String toString()
    public String toString()

 [WriteClassStructure]
[INFO] enum UserStatus ( public )

 [WriteClassStructure]
[INFO] interface IEventType ( public )

 [WriteClassStructure]
[INFO] interface IObserver ( public )

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

    void update(Notification notification)

 [WriteClassStructure]
[INFO] interface ISubject ( public )

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

    String getDescription()
    void addObserver(E eventType, IObserver observer)
    void removeObserver(E eventType, IObserver observer)
    void notifyObservers(E eventType)
    boolean isObserver(E eventType, IObserver observer)

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

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

    private int _id
    private UserStatus _status
    private String _name
    private String _email
    private UserBehaviour _behaviour
    private List<Request> _requests
    private List<Request> _unpaidRequests
    private Collection<Notification<?>> _notifications

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

    public int getId()
    public UserStatus getStatus()
    public void setStatus(UserStatus _userStatus)
    public void setBehaviour(UserBehaviour _behaviour)
    public List<Request> getRequests()
    public void addRequest(Request request)
    public Collection<Notification<?>> getNotifications()
    public void clearNotifications()
    public void addUnpaid(Request request)
    public void update(Notification notification)
    public int getMaxRequests()
    public int getMaxPrice()
    public int getDeadline(int availableCopies)
    public void advanceState(Date currentDate)
    public void payFine(Date currentDate, Work work)
    public void payFine(Date currentDate)
    public void checkOverdueRequests(Date currentDate)
    public int calculateTotalFine()
    public int calculateSpecificFine(Request request)
    public int compareTo(User o)
    protected String getDescription()
    public String toString()

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

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

    public boolean check(Work work, User user)

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

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

    public boolean check(Work work, User user)

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

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

    public boolean check(Work work, User user)

 [WriteClassStructure]
[INFO] class CompliantUserBehaviour ( public )
  extends UserBehaviour

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

    public void updateUserBehaviour()
    public int getMaxRequests()
    public int getMaxPrice()
    public int getDeadline(int availableCopies)
    public String toString()

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

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

    private String _name
    private Collection<Work> _works

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

    protected String getName()
    protected Collection<Work> getWorks()
    protected void addWork(Work work)
    protected void removeWork(Work work)

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

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

    private final E _eventType
    private final ISubject<E> _subject
    private final String _message

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

    public E getEventType()
    public ISubject<E> getSubject()
    public String getMessage()
    private String constructMessage()

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

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

    public boolean check(Work work, User user)

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

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

    private List<Creator> _authors
    private String _isbn

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

    public List<Creator> getAuthors()
    public List<Creator> getCreators()
    public void removeWorkFromCreators()
    public String toString()

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

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

    public boolean check(Work work, User user)

 [WriteClassStructure]
[INFO]  abstract class Work ( public implements Serializable, ISubject<WorkEventType> )

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

    private int _id
    private String _title
    private int _price
    private int _availableCopies
    private int _totalCopies
    private WorkCategory _category
    private Collection<Request> _requests
    private Map<WorkEventType, Collection<IObserver>> _observers

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

    protected int getId()
    protected String getTitle()
    protected int getPrice()
    protected int getAvailableCopies()
    protected int getTotalCopies()
    protected WorkCategory getCategory()
    public abstract Collection<Creator> getCreators()
    public void addObserver(WorkEventType eventType, IObserver observer)
    public void removeObserver(WorkEventType eventType, IObserver observer)
    public void notifyObservers(WorkEventType eventType)
    public boolean isObserver(WorkEventType eventType, IObserver observer)
    public int updateInventory(int amount)
    public int updateAvailableInventory(int amount)
    public String getDescription()
    public abstract String toString()
    public abstract void removeWorkFromCreators()

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

   Method getCreators() overriden in subclass(es) Book DVD 
   Method toString() overriden in subclass(es) Book DVD 
   Method removeWorkFromCreators() overriden in subclass(es) Book DVD 
 [WriteClassStructure]
[INFO] class CompareWorkByTitle ( public implements Comparator<Work> )

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

    public int compare(Work w1, Work w2)

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

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

    private User _user

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

    protected User getUser()
    protected void updateUserStatus(Date currentDate)
    protected abstract void updateUserBehaviour()
    public final void advanceState(Date currentDate)
    abstract int getMaxRequests()
    abstract int getMaxPrice()
    abstract int getDeadline(int totalCopies)

  ###### Subclasses  ###### 
    CompliantUserBehaviour   NormalUserBehaviour   OffenderUserBehaviour   

   Method updateUserBehaviour() overriden in subclass(es) CompliantUserBehaviour NormalUserBehaviour OffenderUserBehaviour 
   Method getMaxRequests() overriden in subclass(es) CompliantUserBehaviour NormalUserBehaviour OffenderUserBehaviour 
   Method getMaxPrice() overriden in subclass(es) CompliantUserBehaviour NormalUserBehaviour OffenderUserBehaviour 
   Method getDeadline(int) overriden in subclass(es) CompliantUserBehaviour NormalUserBehaviour OffenderUserBehaviour 
 [WriteClassStructure]
[INFO] class Request ( public implements Serializable )

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

    private Work _work
    private User _user
    private Date _dueDate
    private boolean _isActive
    private boolean _returnedOnTime
    private boolean _paid
    private int _fine

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

    public Work getWork()
    public Date getDueDate()
    public boolean isActive()
    public void setIsActive(boolean _isActive)
    public boolean isReturnedOnTime()
    public void setIsReturnedOnTime(boolean _returnedOnTime)
    public boolean isPaid()
    public void setIsPaid(boolean _paid)
    public int getFine()
    public void setFine(int _fine)
    public void addFine(int amount)
    public boolean isOverdue(Date currentDate)

 [WriteClassStructure]
[INFO] class Date ( public implements Serializable, Comparable<Date> )

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

    int _day

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

    public int getDate()
    public void advanceDate(int days)
    public int compareTo(Date other)

 [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 CheckIsActive ( public )
  extends Rule

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

    public boolean check(Work work, User user)

 [WriteClassStructure]
[INFO] class CompareWorkById ( public implements Comparator<Work> )

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

    public int compare(Work w1, Work w2)

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

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

    private Creator _director
    private String _igac

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

    public Creator getDirector()
    public Collection<Creator> getCreators()
    public void removeWorkFromCreators()
    public String toString()

 [WriteClassStructure]
[INFO] class LibraryManager ( public )

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

    private Library _library
    private String _associatedFile
    private boolean _isModified

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

    public boolean isModified()
    public int getCurrentDate()
    public void advanceDate(int days)
    public void save()
    public void saveAs(String filename)
    public void load(String filename)
    public void importFile(String datafile)
    public int registerUser(String name, String email)
    public String getUserDescription(int userId)
    public List<String> getUserNotifications(int userId)
    public List<String> getAllUsers()
    public void userPayFine(int userId, int workId)
    public void userPayFine(int userId)
    public String getWorkDescription(int workId)
    public List<String> getAllWorks()
    public List<String> getAllCreatorWorks(String creatorName)
    public void updateWorkInventory(int workId, int amount)
    public List<String> searchWorks(String searchTerm)
    public boolean requestWorkChecks(int userId, int workId)
    public int requestWork(int userId, int workId)
    public void userObserveWorkReturned(int userId, int workId)
    public int returnWork(int userId, int workId)
    public void addToUnpaid(int userId, int workId)

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

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

    private int _currentUserId
    private int _currentWorkId
    Date _currentDate
    private Collection<User> _users
    private Collection<Work> _works
    private Collection<Creator> _creators
    private Collection<Rule> _rules
    private Parser _parser

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

    private User findUserById(int userId)
    private Work findWorkById(int workId)
    private Creator findCreatorByName(String creatorName)
    private void removeWork(Work work)
    public int getCurrentDate()
    public void advanceDate(int days)
    void importFile(String filename)
    public int registerDVD(String title, Creator director, int price, WorkCategory category, String igac, int totalCopies)
    public int registerBook(String title, List authors, int price, WorkCategory category, String isbn, int totalCopies)
    public int registerUser(String name, String email)
    public Creator obtainCreator(String name)
    public String getUserDescription(int userId)
    public List<String> getUserNotifications(int userId)
    public List<String> getAllUsers()
    public void userPayFine(int userId, int workId)
    public void userPayFine(int userId)
    public String getWorkDescription(int workId)
    public List<String> getAllWorks()
    public List<String> getAllCreatorWorks(String creatorName)
    public void updateWorkInventory(int workId, int amount)
    public List<String> searchWorks(String searchTerm)
    public boolean requestWorkChecks(int userId, int workId)
    public int requestWork(int userId, int workId)
    public void userObserveWorkReturned(int userId, int workId)
    public int returnWork(int userId, int workId)
    public void addToUnpaid(int userId, int workId)

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

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

    private int _id

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

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

  ###### Subclasses  ###### 
    CheckHasAvailableCopies   CheckMaxPrice   CheckCategory   CheckRequestTwice   CheckMaxRequests   CheckIsActive   

   Method check(Work, User) overriden in subclass(es) CheckHasAvailableCopies CheckMaxPrice CheckCategory CheckRequestTwice CheckMaxRequests CheckIsActive 
 [WriteClassStructure]
[INFO] class NormalUserBehaviour ( public )
  extends UserBehaviour

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

    public void updateUserBehaviour()
    public int getMaxRequests()
    public int getMaxPrice()
    public int getDeadline(int availableCopies)
    public String toString()

 [WriteClassStructure]
[INFO] class OffenderUserBehaviour ( public )
  extends UserBehaviour

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

    public void updateUserBehaviour()
    public int getMaxRequests()
    public int getMaxPrice()
    public int getDeadline(int totalCopies)
    public String toString()

 [WriteClassStructure]
Auditoria completa.
