

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




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

[INFO] 031/bci/app/main/DoOpenFile.java:32:	IdenticalCatchBranches:	Ramo 'catch' idênticol to ramo 'IOException' pertencentes à mesma instrução try.
[INFO] 031/bci/app/main/DoOpenFile.java:34:	IdenticalCatchBranches:	Ramo 'catch' idênticol to ramo 'IOException' pertencentes à mesma instrução try.
[INFO] 031/bci/app/main/DoSaveFile.java:34:	IdenticalCatchBranches:	Ramo 'catch' idênticol to ramo 'MissingFileAssociationException' pertencentes à mesma instrução try.
[INFO] 031/bci/app/main/DoSaveFile.java:36:	IdenticalCatchBranches:	Ramo 'catch' idênticol to ramo 'MissingFileAssociationException' pertencentes à mesma instrução try.
Total de erros:  0


####    Quebra do encapsulamento


Nada a assinalar


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


[INFO] 031/bci/core/Criador.java:0:	POLooseCouplingRule:	Aplicação correcta (2) e incorrecta (0) do princípio Programar para abstracção no ficheiro Criador.java.
[INFO] 031/bci/core/Library.java:0:	POLooseCouplingRule:	Aplicação correcta (5) e incorrecta (0) do princípio Programar para abstracção no ficheiro Library.java.
[INFO] 031/bci/core/LibraryManager.java:0:	POLooseCouplingRule:	Aplicação correcta (1) e incorrecta (0) do princípio Programar para abstracção no ficheiro LibraryManager.java.
[INFO] 031/bci/core/Livro.java:0:	POLooseCouplingRule:	Aplicação correcta (2) e incorrecta (0) do princípio Programar para abstracção no ficheiro Livro.java.
[INFO] 031/bci/core/Obra.java:0:	POLooseCouplingRule:	Aplicação correcta (2) e incorrecta (0) do princípio Programar para abstracção no ficheiro Obra.java.
[INFO] 031/bci/core/RegrasManager.java:0:	POLooseCouplingRule:	Aplicação correcta (1) e incorrecta (0) do princípio Programar para abstracção no ficheiro RegrasManager.java.
[INFO] 031/bci/core/Utente.java:0:	POLooseCouplingRule:	Aplicação correcta (3) e incorrecta (0) do princípio Programar para abstracção no ficheiro Utente.java.
Total de erros:  0


####    Verificação de fugas de privacidade


[INFO] 031/bci/core/Criador.java:25:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em Criador por uso de Collections.unmodifiableSet para devolver vista imutável de _obras em método obras
[INFO] 031/bci/core/Library.java:249:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em Library por uso de Collections.unmodifiableSet para devolver vista imutável de _criadores.get(nome).obras() em método getObrasCriador
[INFO] 031/bci/core/Livro.java:30:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe Livro, por atribuição de parâmetro a atributo creators, evitada por criação de cópia (new new ArrayList(creators)) no construtor.
Total de erros:  0
Total de fugas evitadas:        3


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


[ERROR] 031/bci/core/Livro.java:48:9: Utilização de um ciclo 'for' para iterar o conteúdo da lista referenciada por '_creators' (do tipo 'List<Criador>'). 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]
[WARN] 031/bci/core/RegrasManager.java:23:47: A expressão pode ser simplicada. [SimplifyBooleanExpression]
[WARN] 031/bci/core/LibraryManager.java:128:35: A expressão pode ser simplicada. [SimplifyBooleanExpression]
[WARN] 031/bci/core/RegraSameWorkTwice.java:8:45: A expressão pode ser simplicada. [SimplifyBooleanExpression]
[WARN] 031/bci/core/Library.java:287:31: A expressão pode ser simplicada. [SimplifyBooleanExpression]
[WARN] 031/bci/core/Library.java:301:43: A expressão pode ser simplicada. [SimplifyBooleanExpression]
[WARN] 031/bci/core/Library.java:302:18: A expressão pode ser simplicada. [SimplifyBooleanExpression]
[WARN] 031/bci/core/Library.java:306:18: A expressão pode ser simplicada. [SimplifyBooleanExpression]
[WARN] 031/bci/core/Library.java:343:34: A expressão pode ser simplicada. [SimplifyBooleanExpression]
[WARN] 031/bci/core/Utente.java:79:24: A expressão pode ser simplicada. [SimplifyBooleanExpression]
[WARN] 031/bci/app/work/DoChangeWorkInventory.java:25:46: A expressão pode ser simplicada. [SimplifyBooleanExpression]
[WARN] 031/bci/app/request/DoReturnWork.java:41:18: A expressão pode ser simplicada. [SimplifyBooleanExpression]
[WARN] 031/bci/app/request/DoRequestWork.java:48:18: A expressão pode ser simplicada. [SimplifyBooleanExpression]
[WARN] 031/bci/app/main/DoOpenFile.java:20:35: A expressão pode ser simplicada. [SimplifyBooleanExpression]
[WARN] 031/bci/app/main/DoOpenFile.java:22:16: A expressão pode ser simplicada. [SimplifyBooleanExpression]
[WARN] 031/bci/app/main/DoSaveFile.java:24:35: A expressão pode ser simplicada. [SimplifyBooleanExpression]
[WARN] 031/bci/app/main/DoSaveFile.java:26:38: A expressão pode ser simplicada. [SimplifyBooleanExpression]
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] 031/bci/core/TipoUtente.java:13:29: O método com o nome 'canRequisMoreThan25Euro' não está de acordo com o padrão '^[a-z][a-zA-Z]*[0-9]?$'. [MethodName]
[ERROR] 031/bci/core/TipoUtenteNormal.java:25:20: O método com o nome 'canRequisMoreThan25Euro' não está de acordo com o padrão '^[a-z][a-zA-Z]*[0-9]?$'. [MethodName]
[ERROR] 031/bci/core/TipoUtenteFaltoso.java:19:20: O método com o nome 'canRequisMoreThan25Euro' não está de acordo com o padrão '^[a-z][a-zA-Z]*[0-9]?$'. [MethodName]
[ERROR] 031/bci/core/TipoUtenteCumpridor.java:25:20: O método com o nome 'canRequisMoreThan25Euro' não está de acordo com o padrão '^[a-z][a-zA-Z]*[0-9]?$'. [MethodName]
Total de erros:  4

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

Iniciando a auditoria...
[INFO] 031/bci/core/LibraryManager.java:151 ObjectOutputStream criado no método 'public void saveAs(String filename)' da classe 'LibraryManager'. [CheckSerialization]
[INFO] 031/bci/core/LibraryManager.java:173 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] 031/bci/core/Parser.java:23 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]
[INFO] 031/bci/core/Utente.java:160 Comparação de valores enumerados via método equals. Normalmente, a comparação de valores enumerados pode ser realizada via operador ==. [OpenClosePrinciple]
Auditoria completa.

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


Nada a assinalar


####  Verificação do uso desnecessário de super

Iniciando a auditoria...
[WARN] 031/bci/core/Dvd.java:44 uso desnecessário de super para invocar método 'getTitle' da super classe. [AvoidUselessSuper]
[WARN] 031/bci/core/Dvd.java:44 uso desnecessário de super para invocar método 'getPrice' da super classe. [AvoidUselessSuper]
[WARN] 031/bci/core/Dvd.java:44 uso desnecessário de super para invocar método 'getCategoria' da super classe. [AvoidUselessSuper]
[WARN] 031/bci/core/Dvd.java:49 uso desnecessário de super para invocar método 'getTitle' da super classe. [AvoidUselessSuper]
[WARN] 031/bci/core/Livro.java:38 uso desnecessário de super para invocar método 'getTitle' da super classe. [AvoidUselessSuper]
[WARN] 031/bci/core/Livro.java:38 uso desnecessário de super para invocar método 'getPrice' da super classe. [AvoidUselessSuper]
[WARN] 031/bci/core/Livro.java:38 uso desnecessário de super para invocar método 'getCategoria' da super classe. [AvoidUselessSuper]
[WARN] 031/bci/core/Livro.java:60 uso desnecessário de super para invocar método 'getTitle' da super classe. [AvoidUselessSuper]
Auditoria completa.

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


Nada a assinalar


####  Verificação do uso de membros estáticos

Iniciando a auditoria...
[INFO] 031/bci/core/TipoUtenteCumpridor.java:5 Atributo estático final 'TipoUtente CUMPRIDOR' permitido. [POStaticMember]
[INFO] 031/bci/core/TipoUtenteFaltoso.java:5 Atributo estático final 'TipoUtente FALTOSO' permitido. [POStaticMember]
[INFO] 031/bci/core/TipoUtenteNormal.java:5 Atributo estático final 'TipoUtente NORMAL' permitido. [POStaticMember]
[ERROR] 031/bci/core/Utente.java:221 Membro estático 'public static Collection<Utente> orderByEmail(Collection utentes)' não recomendável. [POStaticMember]
[INFO] 031/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 '12'. [POStaticMember]
Auditoria completa.
O Checkstyle terminou com 1 erros.

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

Iniciando a auditoria...
[ERROR] 031/bci/core/Regras.java:6 O atributo '_id', com nível de acesso 'public', deveria ser privado e ter métodos acessores. [POVisibilityModifier]
[ERROR] 031/bci/core/exception/WorkNotAvailableException.java:4 O atributo '_id', com nível de acesso 'package', deveria ser privado e ter métodos acessores. [POVisibilityModifier]
Auditoria completa.
O Checkstyle terminou com 2 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


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: 1, dos quais 0 private, 0 package-private, 0 protected e 1 public. [WriteClassStructure]
[INFO] Enumerados definidos no package core da aplicação (1): '[Categoria]'. [WriteClassStructure]
[INFO] Número total de classes definidos no core: 38, dos quais 0 private, 1 package-private, 0 protected e 37 public. [WriteClassStructure]
[INFO] Classes abstractas definidas no package core da aplicação (4): '[Obra, TipoUtente, Notificacao, Regras]'. [WriteClassStructure]
[INFO] Classes concretas e não excepções definidas no package core da aplicação (22): '[RegrasManager, RegraSameWorkTwice, TipoUtenteFaltoso, Utente, TipoUtenteNormal, NotificacaoRequisicao, Livro, UtenteCmpEmail, NotificacaoDisponibilidade, Dia, RegraUtenteMaxWork, RegraWorkCategory, RegraWorkPrice, Parser, Dvd, RegraUtenteActive, TipoUtenteCumpridor, LibraryManager, Library, RegraWorkHasAvailableCopies, Requisicao, Criador]'. [WriteClassStructure]
[INFO] Excepções definidas no package core da aplicação (12): '[UserNotFoundException, RuleNotPassedException, UnavailableFileException, UnrecognizedEntryException, EmptyNameException, WorkNotAvailableException, CreatorNotFoundException, UserActivityException, MissingFileAssociationException, WorkNotFoundException, RequisNotFoundException, ImportFileException]'. [WriteClassStructure]
[INFO] Número total de métodos nas classes do core (sem excepções): 161, dos quais 5 private, 7 package-private, 0 protected e 149 public. [WriteClassStructure]
[INFO] Número total de atributos nas classes do core (sem excepções): 48, dos quais 44 private, 0 package-private, 0 protected e 4 public. [WriteClassStructure]
Auditoria completa.

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

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

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

    private String _categoria

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

    public String toString()

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

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

    private List<Regras> _regras

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

    public void verificaRegras(Utente utente, Obra obra)

 [WriteClassStructure]
[INFO] class RegraSameWorkTwice ( public )
  extends Regras

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

    public boolean verificar(Utente utente, Obra obra)

 [WriteClassStructure]
[INFO] class TipoUtenteFaltoso ( public )
  extends TipoUtente

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

    public final static TipoUtente FALTOSO

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

    public String toString()
    public int prazo(Obra obra)
    public int maxNumRequis()
    public boolean canRequisMoreThan25Euro()

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

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

    private int _id
    private String _nome
    private String _email
    private boolean _atividade
    private int _multa
    private TipoUtente _tipo
    private Map<Integer, Requisicao> _requisicoes
    private String _notificacoes
    private int _numForaPrazo
    private int _credit

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

    public int compareTo(Utente utente)
    public boolean equals(Object obj)
    public int hashCode()
    public String utenteString()
    public int getId()
    public String getEmail()
    public boolean getAtividade()
    public void setAtividade(boolean bool)
    public void limpaMulta()
    public void addMulta(int qtd)
    public int getMulta()
    public void setTipo(TipoUtente tipo)
    public void addRequis(Obra obra, int deadline)
    public void removeRequis(int obraId)
    public boolean hasRequis(int obraId)
    public Requisicao getRequis(int id)
    public int getNumObrasRequisitadas()
    public TipoUtente getTipo()
    public void updateTipo()
    public boolean alreadyContainsWork(Obra obra)
    public void addNotif(String notif)
    public void clearNotifs()
    public String getAllNotifString()
    public void changeNumForaPrazo(int num)
    public int getNumForaPrazo()
    public int getCredit()
    public void setCredit(int qtd)
    public void changeCredit(int qtd)
    public void updateEstado(Library library)
    public static Collection<Utente> orderByEmail(Collection utentes)

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

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

    private int _id
    private int _price
    private int _numberOfCopies
    private String _title
    private Categoria _categoria
    private int _disponiveis
    private Map<Integer, Utente> _notifDisp
    private Map<Integer, Utente> _notifRequis

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

    public int compareTo(Obra obra)
    public boolean equals(Object obj)
    public int hashCode()
    public int getPrice()
    public int getCopies()
    public int getDisponiveis()
    public String getTitle()
    public int getId()
    public Categoria getCategoria()
    public abstract String toString()
    public abstract String getCriadores()
    public abstract boolean searchSpecificObras(String termo)
    public String getDescription()
    public boolean changeCopies(int copies, Library library)
    public void removeObra(Library library)
    public void changeDisponiveis(int num)
    public void addNotifDisp(int id, Library library)
    public void addNotifRequis(int id, Library library)
    public void sendNotifDisp()
    public void sendNotifRequis()
    public void removeNotifDisp(int id)

  ###### Subclasses  ###### 
    Livro   Dvd   

   Method toString() overriden in subclass(es) Livro Dvd 
   Method getCriadores() overriden in subclass(es) Livro Dvd 
   Method searchSpecificObras(String) overriden in subclass(es) Livro Dvd 
   Method removeObra(Library) overriden in subclass(es) Livro Dvd 
 [WriteClassStructure]
[INFO]  abstract class TipoUtente ( public implements Serializable )

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

    public abstract String toString()
    public abstract int prazo(Obra obra)
    public abstract int maxNumRequis()
    public abstract boolean canRequisMoreThan25Euro()
    public boolean equals(TipoUtente tipo)

  ###### Subclasses  ###### 
    TipoUtenteFaltoso   TipoUtenteNormal   TipoUtenteCumpridor   

   Method toString() overriden in subclass(es) TipoUtenteFaltoso TipoUtenteNormal TipoUtenteCumpridor 
   Method prazo(Obra) overriden in subclass(es) TipoUtenteFaltoso TipoUtenteNormal TipoUtenteCumpridor 
   Method maxNumRequis() overriden in subclass(es) TipoUtenteFaltoso TipoUtenteNormal TipoUtenteCumpridor 
   Method canRequisMoreThan25Euro() overriden in subclass(es) TipoUtenteFaltoso TipoUtenteNormal TipoUtenteCumpridor 
 [WriteClassStructure]
[INFO] class TipoUtenteNormal ( public )
  extends TipoUtente

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

    public final static TipoUtente NORMAL

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

    public String toString()
    public int prazo(Obra obra)
    public int maxNumRequis()
    public boolean canRequisMoreThan25Euro()

 [WriteClassStructure]
[INFO] class NotificacaoRequisicao ( public )
  extends Notificacao

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

    public String toString()

 [WriteClassStructure]
[INFO] class Livro ( public )
  extends Obra

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

    private String _isbn
    private List<Criador> _creators

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

    public String toString()
    public String getCriadores()
    public boolean searchSpecificObras(String termo)
    public void removeObra(Library library)

 [WriteClassStructure]
[INFO] class UtenteCmpEmail ( public implements Comparator<Utente> )

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

    public int compare(Utente u1, Utente u2)

 [WriteClassStructure]
[INFO] class NotificacaoDisponibilidade ( public )
  extends Notificacao

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

    public String toString()

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

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

    private Obra _obra

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

    public String toString()

  ###### Subclasses  ###### 
    NotificacaoRequisicao   NotificacaoDisponibilidade   

   Method toString() overriden in subclass(es) NotificacaoRequisicao NotificacaoDisponibilidade 
 [WriteClassStructure]
[INFO] class Dia ( public implements Serializable )

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

    private int _dia

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

    public int getDia()
    public String diaString()
    public void avanca(int n)

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

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

    public int _id

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

    public int compareTo(Regras regra)
    public abstract boolean verificar(Utente utente, Obra obra)
    public int getId()

  ###### Subclasses  ###### 
    RegraSameWorkTwice   RegraUtenteMaxWork   RegraWorkCategory   RegraWorkPrice   RegraUtenteActive   RegraWorkHasAvailableCopies   

   Method verificar(Utente, Obra) overriden in subclass(es) RegraSameWorkTwice RegraUtenteMaxWork RegraWorkCategory RegraWorkPrice RegraUtenteActive RegraWorkHasAvailableCopies 
 [WriteClassStructure]
[INFO] class RegraUtenteMaxWork ( public )
  extends Regras

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

    public boolean verificar(Utente utente, Obra obra)

 [WriteClassStructure]
[INFO] class RegraWorkCategory ( public )
  extends Regras

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

    public boolean verificar(Utente utente, Obra obra)

 [WriteClassStructure]
[INFO] class RegraWorkPrice ( public )
  extends Regras

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

    public boolean verificar(Utente utente, Obra obra)

 [WriteClassStructure]
[INFO] class Parser (  implements Serializable )

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

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

    private String _igac
    private Criador _realizador

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

    public String getCriadores()
    public String toString()
    public boolean searchSpecificObras(String termo)
    public void removeObra(Library library)

 [WriteClassStructure]
[INFO] class RegraUtenteActive ( public )
  extends Regras

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

    public boolean verificar(Utente utente, Obra obra)

 [WriteClassStructure]
[INFO] class TipoUtenteCumpridor ( public )
  extends TipoUtente

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

    public final static TipoUtente CUMPRIDOR

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

    public String toString()
    public int prazo(Obra obra)
    public int maxNumRequis()
    public boolean canRequisMoreThan25Euro()

 [WriteClassStructure]
[INFO] class LibraryManager ( public )

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

    private Library _library

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

    public Library getLibrary()
    public Dia getData()
    public void avancaData(int n)
    public String getFilename()
    public boolean getHasFilename()
    public Boolean getIsModified()
    public void setIsModified(boolean bool)
    public int registaUtente(String nome, String email)
    public Utente getUtente(int id)
    public String getAllUtenteString()
    public Obra addLivro(String title, int price, Categoria categoria, int copies, String isbn, List criadores)
    public Obra addDvd(String title, int price, Categoria categoria, int copies, String igac, Criador realizador)
    public Obra getObra(int id)
    public String getAllObrasString()
    public String getObrasCriadorString(String nome)
    public Criador addCriador(String nome)
    public void pagarMulta(int id)
    public String pesquisaTermoObras(String termo)
    public boolean changeCopies(int id, int copies)
    public String getAllNotifString(int id)
    public void clearNotifs(int id)
    public void requisitaObra(int utenteId, int obraId)
    public int devolveObra(int utenteId, int obraId)
    public void updateEstadoUtentes()
    public void save()
    public void saveAs(String filename)
    public void load(String filename)
    public void importFile(String datafile)

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

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

    private int _nextUtenteId
    private int _nextObraId
    private int _numUtentes
    private int _numObras
    private Dia _dia
    private boolean _hasFilename
    private Parser _parser
    private String _filename
    private boolean _isModified
    private Map<Integer, Obra> _obras
    private Set<Utente> _utentes
    private Map<String, Criador> _criadores
    private RegrasManager _regrasManager

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

    public Dia getData()
    public void avancaData(int n)
    void setHasFilename(boolean bool)
    void setFilename(String filename)
    public boolean getHasFilename()
    public String getFilename()
    public boolean getIsModified()
    public void setIsModified(boolean bool)
    public int registaUtente(String nome, String email)
    public Utente getUtente(int id)
    public String getAllUtenteString()
    public Obra addLivro(String title, int price, Categoria categoria, int copies, String isbn, List criadores)
    public Obra addDvd(String title, int price, Categoria categoria, int copies, String igac, Criador realizador)
    public Obra getObra(int id)
    public String getAllObrasString()
    private Set<Obra> getObrasCriador(String nome)
    public String getObrasCriadorString(String nome)
    public Criador addCriador(String nome)
    public void pagarMulta(int id)
    public String pesquisaTermoObras(String termo)
    public boolean changeCopies(int id, int copies)
    public void removeObra(int id)
    public void removeCriador(String nome)
    public void requisitaObra(int utenteId, int obraId)
    public int devolveObra(int utenteId, int obraId)
    public void updateEstadoUtentes()
    void importFile(String filename)

 [WriteClassStructure]
[INFO] class RegraWorkHasAvailableCopies ( public )
  extends Regras

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

    public boolean verificar(Utente utente, Obra obra)

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

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

    private Obra _obra
    private int _deadline

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

    public Obra getObra()
    public int getDeadline()

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

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

    private String _nome
    private Set<Obra> _obras

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

    void add(Obra obra)
    void remove(Obra obra)
    public String getNome()
    Set<Obra> obras()
    public int getNumObras()
    public void removeCriador(Library library)

 [WriteClassStructure]
Auditoria completa.
