

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


####    Quebra do encapsulamento


[ERROR] 015/bci/core/Creator.java:28:	MethodReturnsFieldCollectionRule:	Possível quebra de encapsulamento na classe Creator com o método getObras a devolver um TreeMap
Total de erros:  1


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


[INFO] 015/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] 015/bci/core/Creator.java:0:	POLooseCouplingRule:	Aplicação correcta (0) e incorrecta (2) do princípio Programar para abstracção no ficheiro Creator.java.
[ERROR] 015/bci/core/Creator.java:28:	POLooseCouplingRule:	Erro: Evite declarar variáveis utilizando tipos concretos como 'TreeMap'; Em vez do tipo concreto utilize a interface.
[ERROR] 015/bci/core/Creator.java:8:	POLooseCouplingRule:	Erro: Evite declarar variáveis utilizando tipos concretos como 'TreeMap'; Em vez do tipo concreto utilize a interface.
[INFO] 015/bci/core/Library.java:0:	POLooseCouplingRule:	Aplicação correcta (7) e incorrecta (5) do princípio Programar para abstracção no ficheiro Library.java.
[ERROR] 015/bci/core/Library.java:198:	POLooseCouplingRule:	Erro: Evite declarar variáveis utilizando tipos concretos como 'ArrayList'; Em vez do tipo concreto utilize a interface.
[ERROR] 015/bci/core/Library.java:25:	POLooseCouplingRule:	Erro: Evite declarar variáveis utilizando tipos concretos como 'TreeMap'; Em vez do tipo concreto utilize a interface.
[ERROR] 015/bci/core/Library.java:26:	POLooseCouplingRule:	Erro: Evite declarar variáveis utilizando tipos concretos como 'TreeMap'; Em vez do tipo concreto utilize a interface.
[ERROR] 015/bci/core/Library.java:27:	POLooseCouplingRule:	Erro: Evite declarar variáveis utilizando tipos concretos como 'TreeMap'; Em vez do tipo concreto utilize a interface.
[ERROR] 015/bci/core/Library.java:99:	POLooseCouplingRule:	Erro: Evite declarar variáveis utilizando tipos concretos como 'ArrayList'; Em vez do tipo concreto utilize a interface.
[INFO] 015/bci/core/User.java:0:	POLooseCouplingRule:	Aplicação correcta (3) e incorrecta (0) do princípio Programar para abstracção no ficheiro User.java.
Total de erros:  7


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


[ERROR] 015/bci/core/Book.java:11:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Book - atribui parâmetro (creators) a atributo (_creators)
[ERROR] 015/bci/core/Book.java:27:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Book - devolve atributo (_creators) em método público (getCreators)
[ERROR] 015/bci/core/Creator.java:29:	MethodReturnsFieldCollectionRule:	Erro: Fuga de privacidade na classe Creator - devolve atributo (_obras) em método público (getObras)
Total de erros:  3
Total de fugas evitadas:        0


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


[WARN] 015/bci/core/User.java:77:	ExcessiveMethodLength:	Evitar métodos com um corpo grande.
[ERROR] 015/bci/core/Library.java:88:5: Iteração de um mapa referenciado por '_users' (do tipo 'TreeMap<Integer, User>') num ciclo 'for' utilizando os métodos keySet e get em vez de iterar directamente através do método ´values´. [POKeySetInvocation]
[ERROR] 015/bci/core/Library.java:205:5: Iteração de um mapa referenciado por 'obrasMap' (do tipo 'TreeMap<String, Integer>') num ciclo 'for' utilizando os métodos keySet e get em vez de iterar directamente através do método ´values´. [POKeySetInvocation]
[ERROR] 015/bci/core/Library.java:233:9: Utilização de um ciclo 'for' para iterar o conteúdo da lista referenciada por '_creators' (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]
[WARN] 015/bci/core/Library.java:347:39: A expressão pode ser simplicada. [SimplifyBooleanExpression]
[ERROR] 015/bci/core/User.java:82:13: Utilização de um ciclo 'for' para iterar o conteúdo da lista referenciada por '_comportamentoHistory' (do tipo 'List<Boolean>'). 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] 015/bci/core/User.java:96:13: Utilização de um ciclo 'for' para iterar o conteúdo da lista referenciada por '_comportamentoHistory' (do tipo 'List<Boolean>'). 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] 015/bci/core/User.java:110:13: Utilização de um ciclo 'for' para iterar o conteúdo da lista referenciada por '_comportamentoHistory' (do tipo 'List<Boolean>'). 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] 015/bci/core/User.java:144:21: A expressão pode ser simplicada. [SimplifyBooleanExpression]
Total de erros:  6


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


Nada a assinalar


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

[ERROR] 015/bci/core/Library.java:32:15: O atributo com o nome 'obrasCounter'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 015/bci/core/Library.java:274:18: O método com o nome 'rule3and5and6' não está de acordo com o padrão '^[a-z][a-zA-Z]*[0-9]?$'. [MethodName]
Total de erros:  2

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

Iniciando a auditoria...
[INFO] 015/bci/core/LibraryManager.java:42 ObjectOutputStream criado no método 'public void save()' da classe 'LibraryManager'. [CheckSerialization]
[INFO] 015/bci/core/LibraryManager.java:71 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] 015/bci/core/Category.java:8 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão 'this' comparada '4' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 015/bci/core/Library.java:274 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão '_users.get().getComportamento()' comparada '2' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 015/bci/core/Library.java:292 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão '_users.get().getComportamento()' comparada '3' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 015/bci/core/Library.java:307 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão 'comportamento' comparada '4' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 015/bci/core/MyParser.java:30 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] 015/bci/core/User.java:77 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão '_comp' comparada '2' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
Auditoria completa.

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


Nada a assinalar


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


Nada a assinalar


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


Nada a assinalar


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

Iniciando a auditoria...
[INFO] 015/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 '19'. [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

Iniciando a auditoria...
[ERROR] Nível de acesso incorrecto (protected) nos seguintes membros '[isActiveToString]' da classe 'User' dado que não envolve o mecanismo de herança [WriteClassStructure]
Auditoria completa.
O Checkstyle terminou com 1 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 enumerados definidos no core: 2, dos quais 0 private, 0 package-private, 0 protected e 2 public. [WriteClassStructure]
[INFO] Enumerados definidos no package core da aplicação (2): '[Category, Comportamento]'. [WriteClassStructure]
[INFO] Número total de classes definidos no core: 22, dos quais 0 private, 1 package-private, 0 protected e 21 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 (10): '[User, Request, Creator, Notification, LibraryEntity, Dvd, Book, MyParser, LibraryManager, Library]'. [WriteClassStructure]
[INFO] Excepções definidas no package core da aplicação (11): '[MissingFileAssociationException, NoSuchWorkExceptionCore, NoSuchUserExceptionCore, UnavailableFileException, ImportFileException, UnrecognizedEntryException, UserRegistrationFailedExceptionCore, UserIsActiveExceptionCore, WorkNotBorrowedByUserExceptionCore, BorrowingRuleFailedExceptionCore, NoSuchCreatorExceptionCore]'. [WriteClassStructure]
[INFO] Número total de métodos nas classes do core (sem excepções): 89, dos quais 5 private, 2 package-private, 1 protected e 81 public. [WriteClassStructure]
[INFO] Número total de atributos nas classes do core (sem excepções): 38, dos quais 38 private, 0 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 Category ( public )

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

    public String toString()

 [WriteClassStructure]
[INFO] enum Comportamento ( public )

 [WriteClassStructure]
[INFO] class User ( public )
  extends LibraryEntity

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

    private String _name
    private String _email
    private Comportamento _comp
    private Boolean _active
    private int _fine
    private int _requests
    private List<Notification> _notifications
    private List<Boolean> _comportamentoHistory

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

    public String getName()
    public String getEmail()
    public Comportamento getComportamento()
    public int getFine()
    public int getRequests()
    public int addRequest()
    public int removeRequest(Boolean returnedOnTime)
    public Boolean isActive()
    public void activate()
    public void deactivate()
    public void addFine(int amount)
    public void payFine()
    private void checkComportamento()
    public void addNotif(Notification notification)
    public List<String> notificationsToString()
    protected String isActiveToString()
    public String toString()

 [WriteClassStructure]
[INFO]  abstract class Obra ( public )
  extends LibraryEntity

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

    private int _total
    private int _available
    private String _title
    private int _price
    private Category _category
    private boolean _wasUnable

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

    public int getTotal()
    public int getAvailable()
    public String getTitle()
    public int getPrice()
    public void request()
    public void returning()
    public boolean getWasUnable()
    public void setWasUnable(boolean wasUnable)
    public int changeAvailable(int amount)
    public Category getCategory()
    public String getCategoryToString()
    public abstract String toString()

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

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

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

    private int _userId
    private int _obraId
    private int _prazo

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

    public int getUserId()
    public int getObraId()
    public void setPrazo(int prazo)
    public int getPrazo()

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

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

    private String _name
    private TreeMap<String, Integer> _obras

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

    public String getName()
    public void addObra(String name, int id)
    public int removeObra(String obra)
    public TreeMap<String, Integer> getObras()

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

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

    private int _userId
    private int _obraId
    private String _message

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

    public int getUserId()
    public int getObraId()
    public String getMessage()
    public void addToMessage(String info)

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

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

    private int _id

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

    public int getId()

  ###### Subclasses  ###### 
    User   Obra   

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

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

    private String _creator
    private String _igac

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

    public String getCreator()
    public String getIgac()
    public String toString()

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

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

    private List<Creator> _creators
    private String _isbn

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

    public String getCreatorsToString()
    public List<Creator> getCreators()
    public String getIsbn()
    public String toString()

 [WriteClassStructure]
[INFO] class MyParser (  )

  ###### 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 LibraryManager ( public )

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

    private Library _library
    private String _fileName

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

    public void create()
    public void save()
    public void saveAs(String filename)
    public void load(String filename)
    public void importFile(String datafile)
    public Library getLibrary()

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

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

    private List<Creator> _creators
    private TreeMap<Integer, User> _users
    private TreeMap<Integer, Dvd> _dvds
    private TreeMap<Integer, Book> _books
    private List<Request> _requests
    private List<Notification> _notifications
    private int _data
    private int obrasCounter

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

    void importFile(String filename)
    public int getData()
    public void advanceData(int days)
    public int registerUser(String name, String email)
    public ArrayList<String> getUserStrings()
    public User getUserById(int id)
    public int searchCreatorByName(String name)
    public void registerDvd(String title, String creator, int price, Category category, String igac, int total)
    public void registerBook(String title, List creators, int price, Category category, String isbn, int total)
    public Creator registerCreator(String name)
    public List<String> getObras()
    public String getObraById(int id)
    public ArrayList<String> getObraByCreator(String creatorName)
    public int changeObraInventory(int obraId, int amount)
    public void rule1(Request request, int userId, int obraId)
    public void rule2(int userId, int obraId)
    public Boolean rule3and5and6(int userId, int obraId)
    public void rule4(int userId, int obraId)
    public int prazo(int userId, int obraId)
    public int request(int userId, int obraId)
    public Boolean checkObraForaDePrazo(int userId)
    public void payFine(int userId)
    public void payFineQuestion(int userId)
    public int getUserFine(int userId)
    public int returnObra(int userId, int obraId)
    public List<String> search(String term)
    public List<String> getUserNotifications(int userId)
    public void disponivel(int obraId)
    public void addNotification(int userId, int obraId, String preference)

 [WriteClassStructure]
Auditoria completa.
