

####    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] 027/bci/core/work/Category.java:101:	POAvoidCatchingGenericException:	Evitar apanhar excepções demasiado genéricas (RuntimeException and Exception) em blocos try-catch.

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

[INFO] 027/bci/core/LibraryManager.java:105:	IdenticalCatchBranches:	Ramo 'catch' idênticol to ramo 'FileNotFoundException' pertencentes à mesma instrução try.
Total de erros:  1


####    Quebra do encapsulamento


Nada a assinalar


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


[INFO] 027/bci/core/Library.java:0:	POLooseCouplingRule:	Aplicação correcta (6) e incorrecta (0) do princípio Programar para abstracção no ficheiro Library.java.
[INFO] 027/bci/core/model/Creator.java:0:	POLooseCouplingRule:	Aplicação correcta (2) e incorrecta (0) do princípio Programar para abstracção no ficheiro Creator.java.
[INFO] 027/bci/core/user/Type.java:0:	POLooseCouplingRule:	Aplicação correcta (3) e incorrecta (0) do princípio Programar para abstracção no ficheiro Type.java.
[INFO] 027/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] 027/bci/core/work/Book.java:0:	POLooseCouplingRule:	Aplicação correcta (1) e incorrecta (0) do princípio Programar para abstracção no ficheiro Book.java.
[INFO] 027/bci/core/work/DVD.java:0:	POLooseCouplingRule:	Aplicação correcta (1) e incorrecta (0) do princípio Programar para abstracção no ficheiro DVD.java.
[INFO] 027/bci/core/work/Work.java:0:	POLooseCouplingRule:	Aplicação correcta (4) 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] 027/bci/core/work/Work.java:118:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Work - devolve atributo (_creators) em método público (getCreators)
[INFO] 027/bci/core/model/Creator.java:56:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em Creator por uso de Collections.unmodifiableSet para devolver vista imutável de _works em método getWorks
[INFO] 027/bci/core/user/User.java:102:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em User por uso de Collections.unmodifiableSet para devolver vista imutável de _requestedWorks.keySet() em método getRequestedWorks
Total de erros:  1
Total de fugas evitadas:        2


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


[ERROR] 027/bci/core/Library.java:283:59: Possível uso inválido de entrySet() para iterar um mapa. Utilize antes values() ou keySet(). [POCheckEntrySetCallRule]
	at pt.tecnico.po.check.POKeySetInvocationCheck.visitToken(POKeySetInvocationCheck.java:107)
Total de erros:  1


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


Nada a assinalar


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

[ERROR] 027/bci/core/user/Compliant.java:28:28: A constante com o nome 'RETURN_DAYS_1_COPY' deve condizer com o padrão '^[A-Z][A-Z0-9]*(_[A-Z]+)*$'. [ConstantName]
[ERROR] 027/bci/core/user/Compliant.java:29:28: A constante com o nome 'RETURN_DAYS_2_TO_5' deve condizer com o padrão '^[A-Z][A-Z0-9]*(_[A-Z]+)*$'. [ConstantName]
[ERROR] 027/bci/core/user/Compliant.java:30:28: A constante com o nome 'RETURN_DAYS_GT_5' deve condizer com o padrão '^[A-Z][A-Z0-9]*(_[A-Z]+)*$'. [ConstantName]
[ERROR] 027/bci/core/user/User.java:1: Foi capturada uma excepção - java.lang.NullPointerException: Cannot invoke "com.puppycrawl.tools.checkstyle.api.DetailAST.getLineNo()" because "ast" is null
 [Checker]
[ERROR] 027/bci/core/user/Normal.java:29:28: A constante com o nome 'RETURN_DAYS_1_COPY' deve condizer com o padrão '^[A-Z][A-Z0-9]*(_[A-Z]+)*$'. [ConstantName]
[ERROR] 027/bci/core/user/Normal.java:30:28: A constante com o nome 'RETURN_DAYS_2_TO_5' deve condizer com o padrão '^[A-Z][A-Z0-9]*(_[A-Z]+)*$'. [ConstantName]
[ERROR] 027/bci/core/user/Normal.java:31:28: A constante com o nome 'RETURN_DAYS_GT_5' deve condizer com o padrão '^[A-Z][A-Z0-9]*(_[A-Z]+)*$'. [ConstantName]
[ERROR] 027/bci/core/work/DVD.java:18:14: Abreviações no nome 'DVD' não deveriam conter mais do que '1' letras maiúsculas consecutivas. [AbbreviationAsWordInName]
Total de erros:  8

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

Iniciando a auditoria...
[INFO] 027/bci/core/LibraryManager.java:59 ObjectOutputStream criado no método 'public void save()' da classe 'LibraryManager'. [CheckSerialization]
[INFO] 027/bci/core/LibraryManager.java:95 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...
[ERROR] 027/bci/core/LibraryManager.java:97 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] 027/bci/core/Parser.java:72 Possível mau desenho: diferenciação do comportamento com base em comparação de strings (expressão 'tag' comparada '4' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[ERROR] 027/bci/core/user/User.java:282 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] 027/bci/core/user/User.java:283 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] 027/bci/core/work/Category.java:78 Possível mau desenho: diferenciação do comportamento com base em comparação de strings (expressão 't' comparada '4' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 027/bci/core/work/Type.java:56 Possível mau desenho: diferenciação do comportamento com base em comparação de strings (expressão 't' comparada '3' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[ERROR] 027/bci/core/work/Work.java:261 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] 027/bci/core/work/Work.java:275 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]
Auditoria completa.
O Checkstyle terminou com 5 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...
[ERROR] 027/bci/core/Library.java:378 Membro estático 'private static List<String> sorter(Collection items, Comparator order, . format)' não recomendável. [POStaticMember]
[ERROR] 027/bci/core/Parser.java:181 Membro estático 'private static int parseInt(String field, String label, String kind, String line, int lineNo)' não recomendável. [POStaticMember]
[ERROR] 027/bci/core/Parser.java:195 Membro estático 'private static Category parseCategory(String field, String kind, String line, int lineNo)' não recomendável. [POStaticMember]
[INFO] 027/bci/core/exception/ImportFileException.java:7 Atributo estático final 'String ERROR_MESSAGE' permitido. [POStaticMember]
[INFO] 027/bci/core/user/Compliant.java:25 Atributo estático final 'Type INSTANCE' permitido. [POStaticMember]
[INFO] 027/bci/core/user/Compliant.java:28 Atributo estático final 'int RETURN_DAYS_1_COPY' permitido. [POStaticMember]
[INFO] 027/bci/core/user/Compliant.java:29 Atributo estático final 'int RETURN_DAYS_2_TO_5' permitido. [POStaticMember]
[INFO] 027/bci/core/user/Compliant.java:30 Atributo estático final 'int RETURN_DAYS_GT_5' permitido. [POStaticMember]
[INFO] 027/bci/core/user/Compliant.java:33 Atributo estático final 'int MAX_REQUESTS' permitido. [POStaticMember]
[INFO] 027/bci/core/user/Compliant.java:34 Atributo estático final 'int PRICE_CAP' permitido. [POStaticMember]
[INFO] 027/bci/core/user/Defaulting.java:25 Atributo estático final 'Type INSTANCE' permitido. [POStaticMember]
[INFO] 027/bci/core/user/Defaulting.java:28 Atributo estático final 'int RETURN_DAYS' permitido. [POStaticMember]
[INFO] 027/bci/core/user/Defaulting.java:29 Atributo estático final 'int MAX_REQUESTS' permitido. [POStaticMember]
[INFO] 027/bci/core/user/Defaulting.java:30 Atributo estático final 'int PRICE_CAP' permitido. [POStaticMember]
[INFO] 027/bci/core/user/Normal.java:26 Atributo estático final 'Type INSTANCE' permitido. [POStaticMember]
[INFO] 027/bci/core/user/Normal.java:29 Atributo estático final 'int RETURN_DAYS_1_COPY' permitido. [POStaticMember]
[INFO] 027/bci/core/user/Normal.java:30 Atributo estático final 'int RETURN_DAYS_2_TO_5' permitido. [POStaticMember]
[INFO] 027/bci/core/user/Normal.java:31 Atributo estático final 'int RETURN_DAYS_GT_5' permitido. [POStaticMember]
[INFO] 027/bci/core/user/Normal.java:34 Atributo estático final 'int MAX_REQUESTS' permitido. [POStaticMember]
[INFO] 027/bci/core/user/Normal.java:35 Atributo estático final 'int PRICE_CAP' permitido. [POStaticMember]
[ERROR] 027/bci/core/user/Type.java:85 Membro estático 'static boolean tailAll(List hist, int n, boolean expected)' não recomendável. [POStaticMember]
[ERROR] 027/bci/core/user/Type.java:103 Membro estático 'static Type nextFromHistory(List hist)' não recomendável. [POStaticMember]
[INFO] 027/bci/core/user/User.java:35 Atributo estático final 'int DAILY_FINE' permitido. [POStaticMember]
[INFO] 027/bci/core/work/Available.java:21 Atributo estático final 'int RETURN_DAY_NONE' permitido. [POStaticMember]
[INFO] 027/bci/core/work/Available.java:24 Atributo estático final 'Available INSTANCE' permitido. [POStaticMember]
[INFO] 027/bci/core/work/Book.java:23 Atributo estático final 'Type TYPE' permitido. [POStaticMember]
[ERROR] 027/bci/core/work/Category.java:78 Membro estático 'public static Category fromString(String text)' não recomendável. [POStaticMember]
[INFO] 027/bci/core/work/DVD.java:23 Atributo estático final 'Type TYPE' permitido. [POStaticMember]
[ERROR] 027/bci/core/work/Type.java:56 Membro estático 'public static Type fromString(String text)' não recomendável. [POStaticMember]
[INFO] O número de serialVersionUID atributos estáticos definidos nas várias classes foi '30'. [POStaticMember]
Auditoria completa.
O Checkstyle terminou com 7 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 final Map<Work, Integer> _requestedWorks' da classe 'User' não substitui os métodos hashCode e equals. [WriteClassStructure]
[WARN] Possível erro: A classe 'Work' utilizada no atributo 'private final Map<Work, Boolean> _requestedHistory' da classe 'User' não substitui os métodos hashCode e equals. [WriteClassStructure]
[WARN] Possível erro: A classe 'Work' utilizada no atributo 'private final 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: 4, dos quais 0 private, 0 package-private, 0 protected e 4 public. [WriteClassStructure]
[INFO] Interfaces definidos no package core da aplicação (4): '[NotificationSubject, Observer, Type, WorkState]'. [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): '[Type, Category, State]'. [WriteClassStructure]
[INFO] Número total de classes definidos no core: 24, dos quais 0 private, 2 package-private, 0 protected e 22 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 (13): '[User, Defaulting, Creator, Normal, Notification, Parser, Compliant, Borrowed, DVD, Book, LibraryManager, Available, Library]'. [WriteClassStructure]
[INFO] Excepções definidas no package core da aplicação (10): '[MissingFileAssociationException, UnknownWorkIdException, UnavailableFileException, UnknownUserIdException, UserRegistrationFailedCoreException, ImportFileException, UnknownCreatorIdException, BorrowRuleViolationException, UnrecognizedEntryException, WorkNotBorrowedByUserCoreException]'. [WriteClassStructure]
[INFO] Número total de métodos nas classes do core (sem excepções): 132, dos quais 12 private, 25 package-private, 3 protected e 92 public. [WriteClassStructure]
[INFO] Número total de atributos nas classes do core (sem excepções): 58, dos quais 54 private, 3 package-private, 0 protected e 1 public. [WriteClassStructure]
Auditoria completa.

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

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

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

    private final String _name

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

    public String getName()
    public String toString()
    public static Type fromString(String text)

 [WriteClassStructure]
[INFO] enum Category ( public )

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

    private final boolean _reference
    private final String _name

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

    public boolean isReference()
    public String getName()
    public String toString()
    public static Category fromString(String text)

 [WriteClassStructure]
[INFO] enum State ( public )

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

    private final String _displayName
    private final String _eventTag

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

    public String getName()
    public String getEventTag()
    public String toString()

 [WriteClassStructure]
[INFO] interface NotificationSubject ( public )

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

    void addObserver(State state, Observer observer)
    void removeObserver(State state, Observer observer)
    void notifyObservers(State state, Observer observer)

 [WriteClassStructure]
[INFO] interface Observer ( public )

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

    void update(Notification notification)

 [WriteClassStructure]
[INFO] interface Type ( public )

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

    Type updateType(List history)
    int calculateReturnDay(Work work, int currentDate)
    int maxRequest()
    int priceCap()
    static boolean tailAll(List hist, int n, boolean expected)
    static Type nextFromHistory(List hist)

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

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

    String getName()
    WorkState updateState(User user, int returnDate)
    int getReturnDay()
    User getUser()
    boolean request()

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

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

    private final static int DAILY_FINE
    private final int _id
    private final String _name
    private final String _email
    private final Map<Work, Integer> _requestedWorks
    private final Map<Work, Boolean> _requestedHistory
    private final List<Notification> _notifications
    private int _fineAmount
    private boolean _isActive
    private Type _type

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

    public int getId()
    public String getName()
    public String getEmail()
    public Set<Work> getRequestedWorks()
    public List<Notification> getNotifications()
    public int getFineAmount()
    public boolean isActive()
    public void requestWork(Work work, int currentDate)
    public void addReturnNotificationPreference(Work work)
    public void returnWork(Work work, int currentDate)
    public boolean hasFine()
    public void payFine()
    public void update(Notification notification)
    public String toString()
    private String behaviorName()
    private boolean hasOverdueWorks(int currentDate)
    public void returnWork(Work work)

 [WriteClassStructure]
[INFO] class Defaulting ( public, final implements Type, Serializable )

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

     final static Type INSTANCE
    private final static int RETURN_DAYS
    private final static int MAX_REQUESTS
    private final static int PRICE_CAP

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

    public Type updateType(List requestWorkHistory)
    public int calculateReturnDay(Work work, int currentDate)
    public int maxRequest()
    public int priceCap()

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

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

    private final String _name
    private final Set<Work> _works

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

    public String getName()
    public Set<Work> getWorks()
    public boolean addWork(Work work)
    public boolean removeWork(Work work)
    public boolean hasWorks()
    public boolean equals(Object o)
    public int hashCode()
    public String toString()
    private void readObject(ObjectInputStream in)

 [WriteClassStructure]
[INFO] class Normal ( public, final implements Type, Serializable )

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

     final static Type INSTANCE
    private final static int RETURN_DAYS_1_COPY
    private final static int RETURN_DAYS_2_TO_5
    private final static int RETURN_DAYS_GT_5
    private final static int MAX_REQUESTS
    private final static int PRICE_CAP

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

    public Type updateType(List requestWorkHistory)
    public int calculateReturnDay(Work work, int currentDate)
    public int maxRequest()
    public int priceCap()

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

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

    private final State _state
    private final Work _work

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

    public State getState()
    public Work getWork()
    public String toString()

 [WriteClassStructure]
[INFO] class Parser (  )

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

    private final Library _library

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

    void parseFile(String filename)
    private void parseLine(String line, int lineNo)
    private void parseUser(String c, String line, int lineNo)
    private void parseBook(String c, String line, int lineNo)
    private void parseDvd(String c, String line, int lineNo)
    private static int parseInt(String field, String label, String kind, String line, int lineNo)
    private static Category parseCategory(String field, String kind, String line, int lineNo)

 [WriteClassStructure]
[INFO] class Compliant ( public, final implements Type, Serializable )

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

     final static Type INSTANCE
    private final static int RETURN_DAYS_1_COPY
    private final static int RETURN_DAYS_2_TO_5
    private final static int RETURN_DAYS_GT_5
    private final static int MAX_REQUESTS
    private final static int PRICE_CAP

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

    public Type updateType(List requestWorkHistory)
    public int calculateReturnDay(Work work, int currentDate)
    public int maxRequest()
    public int priceCap()

 [WriteClassStructure]
[INFO] class Borrowed ( , final implements WorkState )

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

    private final int _returnDay
    private final User _user

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

    public String getName()
    public WorkState updateState(User user, int returnDate)
    public int getReturnDay()
    public User getUser()
    public boolean request()

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

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

    private final static Type TYPE
    private final String _igac

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

    protected String additionalInfo()
    public String getIgac()

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

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

    private final static Type TYPE
    private final String _isbn

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

    protected String additionalInfo()
    public String getIsbn()

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

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

    private final int _id
    private final int _price
    private final String _title
    private final Set<Creator> _creators
    private final Category _category
    private final Type _type
    private final Map<State, Set<Observer>> _observers
    private int _numCopies
    private int _numCopiesAvailable
    private WorkState _state

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

    public String getTitle()
    public int getId()
    public int getNumCopiesAvailable()
    public int getReturnDay()
    public Set<Creator> getCreators()
    public int getNumCopies()
    public Category getCategory()
    public Type getType()
    public int getPrice()
    public WorkState getState()
    String getCreatorAsString()
    public String toString()
    public boolean changeInventory(int delta)
    public void addObserver(State state, Observer observer)
    public void removeObserver(State state, Observer observer)
    public void notifyObservers(State state, Observer observer)
    protected abstract String additionalInfo()
    public boolean borrowBy(. user, int returnDay)
    public boolean returnFrom(. user)

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

   Method additionalInfo() overriden in subclass(es) DVD Book 
 [WriteClassStructure]
[INFO] class LibraryManager ( public implements Serializable )

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

    private Library _library
    private boolean _isModified
    private String _currentFileName

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

    public void save()
    public void saveAs(String filename)
    public void load(String filename)
    public void importFile(String datafile)
    public void advanceDate(int days)
    public int displayDate()
    public boolean changedSinceLastSave()
    public String getFilename()
    public void requestWork(int idUser, int idWork)
    public int getNumCopiesAvailable(int idWork)
    public void addReturnNotificationPreference(int idUser, int idWork)
    public int getWorkReturnDay(int idWork)
    public void returnWork(int idUser, int idWork)
    public boolean hasFine(int idUser)
    public int getFineAmount(int idUser)
    public void payFine(int idUser)
    public int registerUser(String name, String email)
    public String showUser(int idUser)
    public Iterable<String> getUserNotifications(int idUser)
    public Iterable<String> getAllUsers()
    public String displayWork(int idWork)
    public boolean changeWorkInventory(int idWork, int amount)
    public Iterable<String> displayWorks()
    public Iterable<String> displayWorksByCreator(String idCreator)
    public Iterable<String> performSearch(String term)
    private void ensureLibrary()
    private void markModified()

 [WriteClassStructure]
[INFO] class Available ( public, final implements WorkState )

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

    private final static int RETURN_DAY_NONE
    public final static Available INSTANCE

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

    public String getName()
    public WorkState updateState(User user, int returnDate)
    public int getReturnDay()
    public User getUser()
    public boolean request()

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

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

    private final Map<Integer, User> _users
    private final Map<Integer, Work> _works
    private final Map<String, Creator> _creators
    private int _currentDate
    private int _nextUserId
    private int _nextWorkId

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

    void importFile(String filename)
    void advanceDate(int days)
    int displayDate()
    void requestWork(int idUser, int idWork)
    void addReturnNotificationPreference(int idUser, int idWork)
    int getWorkReturnDay(int idWork)
    void returnWork(int idUser, int idWork)
    int getNumCopiesAvailable(int idWork)
    boolean hasFine(int idUser)
    int getFineAmount(int idUser)
    void payFine(int idUser)
    int registerUser(String name, String email)
    String showUser(int idUser)
    Iterable<String> getUserNotifications(int idUser)
    String displayWork(int idWork)
    boolean changeWorkInventory(int idWork, int amount)
    Iterable<String> getAllUsers()
    Iterable<String> displayWorks()
    Iterable<String> displayWorksByCreator(String creatorId)
    Iterable<String> performSearch(String term)
    Creator getOrRegisterCreator(String name)
    void registerDvd(String title, Creator creator, int price, Category category, String igac, int nCopies)
    void registerBook(String title, Set creators, int price, Category category, String isbn, int nCopies)
    private static List<String> sorter(Collection items, Comparator order, . format)

 [WriteClassStructure]
Auditoria completa.
