

####    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] 053/bci/app/main/DoOpenFile.java:30:	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] 053/bci/app/request/DoRequestWork.java:71:	IdenticalCatchBranches:	Ramo 'catch' idênticol to ramo 'bci.core.exception.UserSuspendedException' pertencentes à mesma instrução try.
[ERROR] 053/bci/app/main/DoOpenFile.java:30:	EmptyCatchBlock:	Evitar blocos catch vazios.
[ERROR] 053/bci/app/request/DoReturnWork.java:35:	EmptyCatchBlock:	Evitar blocos catch vazios.
[ERROR] 053/bci/core/Parser.java:142:	EmptyCatchBlock:	Evitar blocos catch vazios.
Total de erros:  4


####    Quebra do encapsulamento


Nada a assinalar


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


[INFO] 053/bci/core/Library.java:0:	POLooseCouplingRule:	Aplicação correcta (12) e incorrecta (0) do princípio Programar para abstracção no ficheiro Library.java.
[INFO] 053/bci/core/LibraryManager.java:0:	POLooseCouplingRule:	Aplicação correcta (6) e incorrecta (0) do princípio Programar para abstracção no ficheiro LibraryManager.java.
[INFO] 053/bci/core/Livro.java:0:	POLooseCouplingRule:	Aplicação correcta (3) e incorrecta (0) do princípio Programar para abstracção no ficheiro Livro.java.
[INFO] 053/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


[ERROR] 053/bci/core/Livro.java:16:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Livro - atribui parâmetro (autores) a atributo (_autores)
[ERROR] 053/bci/core/Livro.java:25:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Livro - devolve atributo (_autores) em método público (autores)
Total de erros:  2
Total de fugas evitadas:        0


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


[WARN] 053/bci/app/request/DoRequestWork.java:61:	EmptyControlStatement:	Empty else statement
[WARN] 053/bci/app/request/DoReturnWork.java:38:	EmptyControlStatement:	Empty else statement
[WARN] 053/bci/core/Library.java:270:	ExcessiveMethodLength:	Evitar métodos com um corpo grande.
[WARN] 053/bci/core/Library.java:358:	ExcessiveMethodLength:	Evitar métodos com um corpo grande.
Total de erros:  0


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


Nada a assinalar


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

[ERROR] 053/bci/core/DVD.java:5:14: Abreviações no nome 'DVD' não deveriam conter mais do que '1' letras maiúsculas consecutivas. [AbbreviationAsWordInName]
[ERROR] 053/bci/core/Utente.java:143:73: Apenas uma instrução por linha é permitida. [OneStatementPerLine]
[ERROR] 053/bci/core/Utente.java:144:67: Apenas uma instrução por linha é permitida. [OneStatementPerLine]
[ERROR] 053/bci/core/Utente.java:157:93: Apenas uma instrução por linha é permitida. [OneStatementPerLine]
Total de erros:  4

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

Iniciando a auditoria...
[INFO] 053/bci/core/LibraryManager.java:25 ObjectOutputStream criado no método 'public void save()' da classe 'LibraryManager'. [CheckSerialization]
[INFO] 053/bci/core/LibraryManager.java:39 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] 053/bci/core/Library.java:585 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] 053/bci/core/Library.java:587 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] 053/bci/core/Obra.java:113 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão '_categoria' comparada '4' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 053/bci/core/Parser.java:31 Possível mau desenho: diferenciação do comportamento com base em comparação de strings (expressão 'parts[ ].trim().toUpperCase()' comparada '4' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 053/bci/core/Parser.java:130 Possível mau desenho: diferenciação do comportamento com base em comparação de strings (expressão 'up' comparada '4' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
Auditoria completa.
O Checkstyle terminou com 2 erros.

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


Nada a assinalar


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


Nada a assinalar


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

Iniciando a auditoria...
[WARN] 053/bci/core/LibraryManager.java:3 import 'bci.app.exception.ImportFileException' não permitido na classe 'LibraryManager'. [POCoreImport]
[ERROR] 053/bci/core/LibraryManager.java:48 Classe 'ImportFileException', definida na camada de aplicação, não pode ser indicada na lista de excepções de um método de uma entidade do domínio. [POCoreImport]
[ERROR] 053/bci/core/LibraryManager.java:53 instanciação do tipo 'ImportFileException' não permitido em classes da camada de domínio. [POCoreImport]
Auditoria completa.
O Checkstyle terminou com 2 erros.

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

Iniciando a auditoria...
[INFO] 053/bci/core/Utente.java:8 Atributo estático final 'String ESTADO_ACTIVO' permitido. [POStaticMember]
[INFO] 053/bci/core/Utente.java:9 Atributo estático final 'String ESTADO_SUSPENSO' permitido. [POStaticMember]
[INFO] 053/bci/core/Utente.java:10 Atributo estático final 'String COMPORTAMENTO_NORMAL' permitido. [POStaticMember]
[INFO] 053/bci/core/Utente.java:11 Atributo estático final 'String COMPORTAMENTO_CUMPRIDOR' permitido. [POStaticMember]
[INFO] 053/bci/core/Utente.java:12 Atributo estático final 'String COMPORTAMENTO_FALTOSO' permitido. [POStaticMember]
[INFO] O número de serialVersionUID atributos estáticos definidos nas várias classes foi '24'. [POStaticMember]
Auditoria completa.

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


Nada a assinalar


####  Verificação da necessidade da concretização de hashCode e equals


Nada a assinalar


####  Verificação de membros com o nível protected desnecessário


Nada a assinalar


####  Verificação do mecanismo de herança II: atributos duplicados e métodos que deviam ser abstractos

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

####  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): '[CategoriaObra]'. [WriteClassStructure]
[INFO] Número total de classes definidos no core: 25, dos quais 0 private, 0 package-private, 0 protected e 25 public. [WriteClassStructure]
[INFO] Classes abstractas definidas no package core da aplicação (1): '[Obra]'. [WriteClassStructure]
[INFO] Classes concretas e não excepções definidas no package core da aplicação (8): '[Utente, Emprestimo, Livro, Parser, DVD, LibraryManager, Library, Criador]'. [WriteClassStructure]
[INFO] Excepções definidas no package core da aplicação (16): '[MaxActiveLoansExceededException, NoSuchUserCoreException, UnavailableFileException, InvalidInventoryOperationException, UnrecognizedEntryException, UserSuspendedException, CategoryNotBorrowableException, WorkNotAvailableException, UserHasFinesException, MissingFileAssociationException, NoSuchWorkCoreException, InvalidWorkDataException, InvalidCreatorDataException, InvalidUserDataException, InvalidLoanOperationException, PriceLimitExceededException]'. [WriteClassStructure]
[INFO] Número total de métodos nas classes do core (sem excepções): 121, dos quais 12 private, 1 package-private, 14 protected e 94 public. [WriteClassStructure]
[INFO] Número total de atributos nas classes do core (sem excepções): 41, dos quais 36 private, 0 package-private, 0 protected e 5 public. [WriteClassStructure]
Auditoria completa.

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

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

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

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

    public final static String ESTADO_ACTIVO
    public final static String ESTADO_SUSPENSO
    public final static String COMPORTAMENTO_NORMAL
    public final static String COMPORTAMENTO_CUMPRIDOR
    public final static String COMPORTAMENTO_FALTOSO
    private final int _id
    private final String _nome
    private final String _email
    private String _comportamento
    private String _estado
    private int _multa
    private final java.util.List _notificacoes
    private final java.util.Deque _ultimasDevolucoes

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

    public int id()
    public String nome()
    public String email()
    public String comportamento()
    public String estado()
    public int multa()
    public void adicionarNotificacao(String text)
    public java.util.List visualizarNotificacoes()
    public java.util.List consumirNotificacoes()
    public void removerNotificacoesDisponibilidade(int obraId)
    public void suspender()
    public void reativar()
    public void adicionarMulta(int amount)
    public int saldarMulta()
    public int saldarMultaSemReativar()
    public void definirComportamento(String comportamento)
    public void registrarDevolucaoEmAtraso()
    public void registrarDevolucaoPontual()
    private void registarResultadoDevolucao(boolean pontual)
    public String toString()

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

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

    private final int _id
    private final String _titulo
    private final int _preco
    private final CategoriaObra _categoria
    private int _totalExemplares
    private int _disponiveis

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

    public int id()
    public String titulo()
    public int preco()
    public CategoriaObra categoria()
    public int totalExemplares()
    public int disponiveis()
    public boolean podeSerRequisitada()
    public void registarEmprestimo()
    public void registarDevolucao()
    public void reduzirDisponiveis(int amount)
    public void aumentarDisponiveis(int amount)
    protected abstract String tipoPt()
    protected abstract String detalheFinal()
    protected boolean isByCreator(String nomeCriador)
    protected boolean matchesTerm(String termo)
    protected String categoriaPt()
    protected String linhaFormatoTestes()
    public boolean equals(Object obj)
    public int hashCode()

  ###### Subclasses  ###### 
    Livro   DVD   

   Method tipoPt() overriden in subclass(es) Livro DVD 
   Method detalheFinal() overriden in subclass(es) Livro DVD 
   Method isByCreator(String) overriden in subclass(es) Livro DVD 
   Method matchesTerm(String) overriden in subclass(es) Livro DVD 
 [WriteClassStructure]
[INFO] class Emprestimo ( public implements Serializable )

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

    private final int _idUtente
    private final int _idObra
    private final int _dataInicio
    private final int _dataLimite
    private boolean _ativo

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

    public int idUtente()
    public int idObra()
    public int dataInicio()
    public int dataLimite()
    public boolean ativo()
    public void concluir()

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

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

    private final String _isbn
    private final Set<Criador> _autores

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

    public String isbn()
    public Set<Criador> autores()
    protected String tipoPt()
    protected String detalheFinal()
    protected boolean isByCreator(String nomeCriador)
    protected boolean matchesTerm(String termo)
    public String toString()

 [WriteClassStructure]
[INFO] class Parser ( public )

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

    private final Library _library

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

    public void parseFile(String filename)
    private void parseLine(String line)
    private void parseUser(String parts, String line)
    private void parseBook(String parts, String line)
    private void parseDvd(String parts, String line)
    private CategoriaObra parseCategoria(String raw)

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

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

    private final Criador _realizador
    private final String _igac

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

    public String igac()
    public Criador realizador()
    protected String tipoPt()
    protected String detalheFinal()
    protected boolean isByCreator(String nomeCriador)
    protected boolean matchesTerm(String termo)
    public String toString()

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

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

    private Library _library
    private String _filename
    private boolean _hasUnsavedChanges

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

    public void save()
    public void saveAs(String filename)
    public void load(String filename)
    public void importFile(String datafile)
    public Utente registarUtente(String nome, String email)
    public Utente getUtente(int id)
    public Collection<Utente> getUtentes()
    public Collection<Obra> getObras()
    public Obra getObra(int id)
    public Collection<Obra> getObrasDeCriador(String nome)
    public Collection<Obra> pesquisarObras(String termo)
    public void decrementarInventario(int obraId, int amount)
    public int requisitarObra(int userId, int obraId)
    public void subscreverDisponibilidade(int userId, int obraId)
    public int devolverObra(int userId, int obraId)
    public int saldarMulta(int userId)
    public int saldarMultaSemReativar(int userId)
    public java.util.List visualizarNotificacoes(int userId)
    public java.util.List consumirNotificacoes(int userId)
    public int getMulta(int userId)
    public String getFilename()
    public boolean hasUnsavedChanges()
    private void markAsChanged()
    public int getDataAtual()
    public void avancarData(int dias)

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

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

    private final Map<Integer, Utente> _utentes
    private final Map<Integer, Obra> _obras
    private final Map<String, Criador> _criadores
    private final Map<Integer, Map<Integer, Emprestimo>> _emprestimosAtivos
    private final Map<Integer, Set<Integer>> _subscricoesDisponibilidade
    private int _nextUtenteId
    private int _nextObraId
    private int _dataAtual

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

    public int getDataAtual()
    public void avancarData(int dias)
    private int calcularDiasEmprestimo(Utente u, Obra o)
    private int calcularMulta(int atrasoDias)
    void importFile(String filename)
    public Utente registarUtente(String nome, String email)
    public Utente getUtente(int id)
    public Collection<Utente> getUtentes()
    public Criador registarCriador(String nome)
    public Livro adicionarLivro(String titulo, int preco, CategoriaObra categoria, String isbn, Set autores, int exemplares)
    public DVD adicionarDVD(String titulo, int preco, CategoriaObra categoria, String igac, Criador realizador, int exemplares)
    public Collection<Obra> getObras()
    public Obra getObra(int id)
    private Emprestimo getEmprestimoAtivo(int userId, int obraId)
    public int requisitarObra(int userId, int obraId)
    public int devolverObra(int userId, int obraId)
    private boolean existeEmprestimoEmAtraso(int userId)
    public java.util.List visualizarNotificacoes(int userId)
    public java.util.List consumirNotificacoes(int userId)
    public int getMulta(int userId)
    public int saldarMulta(int userId)
    public int saldarMultaSemReativar(int userId)
    public Collection<Obra> getObrasDeCriador(String nomeCriador)
    public Collection<Obra> pesquisarObras(String termo)
    public void decrementarInventario(int obraId, int amount)
    private void limparCriadoresSemObras()
    public void subscreverDisponibilidade(int userId, int obraId)

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

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

    private final String _nome

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

    public String nome()
    public String toString()
    public boolean equals(Object obj)
    public int hashCode()

 [WriteClassStructure]
Auditoria completa.
