

####    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] 068/bci/core/LibraryManager.java:246:	IdenticalCatchBranches:	Ramo 'catch' idênticol to ramo 'FileNotFoundException' pertencentes à mesma instrução try.
[ERROR] 068/bci/app/main/DoOpenFile.java:84:	EmptyCatchBlock:	Evitar blocos catch vazios.
[ERROR] 068/bci/app/main/DoOpenFile.java:105:	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] 068/bci/core/Book.java:0:	POLooseCouplingRule:	Aplicação correcta (2) e incorrecta (0) do princípio Programar para abstracção no ficheiro Book.java.
[INFO] 068/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] 068/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] 068/bci/core/User.java:0:	POLooseCouplingRule:	Aplicação correcta (3) e incorrecta (0) do princípio Programar para abstracção no ficheiro User.java.
[INFO] 068/bci/core/Work.java:0:	POLooseCouplingRule:	Aplicação correcta (2) e incorrecta (0) do princípio Programar para abstracção no ficheiro Work.java.
Total de erros:  0


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


[INFO] 068/bci/core/Book.java:35:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe Book, por atribuição de parâmetro a atributo creators, evitada por criação de cópia (new new ArrayList(creators)) no construtor.
[INFO] 068/bci/core/Book.java:86:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe Book evitada por criação de cópia (new ArrayList) de _creators no método getCreators.
[INFO] 068/bci/core/User.java:106:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe User evitada por criação de cópia (new ArrayList) de _notifications no método getNotifications.
Total de erros:  0
Total de fugas evitadas:        3


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


[WARN] 068/bci/app/main/DoOpenFile.java:63:	ExcessiveMethodLength:	Evitar métodos com um corpo grande.
[ERROR] 068/bci/core/Book.java:62: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]
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] 068/bci/core/Parser.java:65:45: Apenas uma instrução por linha é permitida. [OneStatementPerLine]
[ERROR] 068/bci/core/Parser.java:66:45: Apenas uma instrução por linha é permitida. [OneStatementPerLine]
[ERROR] 068/bci/core/Parser.java:67:45: Apenas uma instrução por linha é permitida. [OneStatementPerLine]
Total de erros:  3

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

Iniciando a auditoria...
[INFO] 068/bci/core/LibraryManager.java:207 ObjectOutputStream criado no método 'public void save()' da classe 'LibraryManager'. [CheckSerialization]
[INFO] 068/bci/core/LibraryManager.java:237 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] 068/bci/core/Parser.java:61 Possível mau desenho: diferenciação do comportamento com base em comparação de strings (expressão 'c[ ]' comparada '4' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 068/bci/core/User.java:128 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão '_category' comparada '2' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 068/bci/core/User.java:158 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão '_category' comparada '2' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 068/bci/core/Work.java:150 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão '_category' comparada '4' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 068/bci/core/Work.java:183 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão 'userCategory' comparada '7' 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...
[ERROR] 068/bci/core/Parser.java:153 Membro estático 'private static int parseIntStrict(String s, String field, String line)' não recomendável. [POStaticMember]
[ERROR] 068/bci/core/Parser.java:168 Membro estático 'private static Category parseCategory(String s, String line)' não recomendável. [POStaticMember]
[INFO] 068/bci/core/exception/ImportFileException.java:14 Atributo estático final 'String ERROR_MESSAGE' permitido. [POStaticMember]
[INFO] O número de serialVersionUID atributos estáticos definidos nas várias classes foi '22'. [POStaticMember]
Auditoria completa.
O Checkstyle terminou com 2 erros.

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


Nada a assinalar


####  Sumário das classes do core da aplicação

Iniciando a auditoria...
[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): '[UserCategory, Category, UserStatus]'. [WriteClassStructure]
[INFO] Número total de classes definidos no core: 17, dos quais 0 private, 1 package-private, 0 protected e 16 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 (10): '[User, Request, Creator, Notification, Date, Parser, Dvd, Book, LibraryManager, Library]'. [WriteClassStructure]
[INFO] Excepções definidas no package core da aplicação (6): '[MissingFileAssociationException, UnavailableFileException, InvalidInventoryOperationException, ImportFileException, BorrowingRuleViolationException, UnrecognizedEntryException]'. [WriteClassStructure]
[INFO] Número total de métodos nas classes do core (sem excepções): 113, dos quais 8 private, 5 package-private, 0 protected e 100 public. [WriteClassStructure]
[INFO] Número total de atributos nas classes do core (sem excepções): 42, dos quais 42 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 UserCategory ( public )

 [WriteClassStructure]
[INFO] enum Category ( public )

 [WriteClassStructure]
[INFO] enum UserStatus ( public )

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

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

    private final int _id
    private final String _name
    private final String _email
    private UserStatus _status
    private UserCategory _category
    private final List<Notification> _notifications
    private int _onTimeReturns
    private int _consecutiveOnTimeReturns
    private int _lateReturns
    private int _fine
    private int _overdueWorks

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

    public int getId()
    public String getName()
    public String getEmail()
    public UserStatus getStatus()
    public UserCategory getCategory()
    public void setCategory(UserCategory category)
    public void addNotification(Notification notification)
    public List<Notification> getNotifications()
    public List<Notification> getAndClearNotifications()
    public void recordOnTimeReturn()
    public int getOnTimeReturns()
    public void recordLateReturn()
    public int getLateReturns()
    public void addFine(int amount)
    public void returnOverdueWork()
    public void payFine(int amount)
    public int getFine()
    public void setStatus(UserStatus status)
    public String toString()

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

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

    private final User _user
    private final Work _work
    private final int _requestDate
    private final int _dueDate

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

    public User getUser()
    public Work getWork()
    public int getRequestDate()
    public int getDueDate()

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

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

    private final String _name

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

    public String getName()
    public String toString()
    public boolean equals(Object o)
    public int hashCode()

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

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

    private final String _type
    private final int _workId
    private final String _workSnapshot

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

    public String getType()
    public int getWorkId()
    public String toString()

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

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

    private int _currentDate

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

    int getCurrentDate()
    void advanceDay(int nDays)

 [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 c, String line)
    private void parseDvd(String c, String line)
    private void parseBook(String c, String line)
    private static int parseIntStrict(String s, String field, String line)
    private static Category parseCategory(String s, String line)

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

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

    private final Creator _director
    private final String _igac

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

    public String getTypeName()
    public String getCreatorsString()
    public String getCode()
    public List<Creator> getCreators()
    public Creator getDirector()

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

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

    private final List<Creator> _creators
    private final String _isbn

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

    public String getTypeName()
    public String getCreatorsString()
    public String getCode()
    public List<Creator> getCreators()

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

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

    private final int _id
    private final String _title
    private final int _price
    private final Category _category
    private int _availableCopies
    private int _totalCopies
    private final List<User> _interestedUsers

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

    public int getId()
    public String getTitle()
    public int getPrice()
    public Category getCategory()
    public int getAvailableCopies()
    public int getTotalCopies()
    public boolean isAvailable()
    public void borrowCopy()
    public void returnCopy()
    public void addCopies(int amount)
    public void addInterestedUser(User user)
    public void removeInterestedUser(User user)
    public String getCategoryName()
    public abstract String getTypeName()
    public abstract String getCreatorsString()
    public abstract String getCode()
    public abstract List<Creator> getCreators()
    public int getLoanPeriod(UserCategory userCategory)
    public int calculateFine(int daysLate)
    public String toString()

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

   Method getTypeName() overriden in subclass(es) Dvd Book 
   Method getCreatorsString() overriden in subclass(es) Dvd Book 
   Method getCode() overriden in subclass(es) Dvd Book 
   Method getCreators() overriden in subclass(es) Dvd Book 
 [WriteClassStructure]
[INFO] class LibraryManager ( public )

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

    private Library _library
    private String _filename
    private boolean _modified

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

    public boolean isModified()
    public String getFilename()
    public int getCurrentDate()
    public void advanceDays(int n)
    public java.util.List getAllWorks()
    public Work getWork(int id)
    public void changeWorkInventory(int workId, int amount)
    public java.util.List getAllUsers()
    public User getUser(int id)
    public int registerUser(String name, String email)
    public java.util.List getWorksByCreator(String creatorName)
    public boolean hasCreator(String creatorName)
    public java.util.List searchWorks(String searchTerm)
    public int requestWork(int userId, int workId)
    public int returnWork(int userId, int workId)
    public void payFine(int userId, int amount)
    public void registerInterestInWork(int userId, int workId)
    public java.util.List getUserNotifications(int userId)
    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 final Date _date
    private final Map<String, Creator> _creators
    private final Map<Integer, Work> _works
    private int _nextWorkId
    private final Map<Integer, User> _users
    private int _nextUserId
    private final Map<String, Request> _requests

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

    Date getCurrentDate()
    public void advanceDays(int n)
    private void checkOverdueWorks()
    Date getDate()
    void importFile(String filename)
    public int registerUser(String name, String email)
    public Creator registerCreator(String name)
    public void registerDvd(String title, Creator creator, int price, Category category, String igac, int copies)
    public void registerBook(String title, List creators, int price, Category category, String isbn, int copies)
    public List<Work> getAllWorks()
    public Work getWork(int id)
    public User getUser(int id)
    public List<User> getAllUsers()
    public List<Work> getWorksByCreator(String creatorName)
    public boolean hasCreator(String creatorName)
    public List<Work> searchWorks(String searchTerm)
    public int requestWork(int userId, int workId)
    public void registerInterestInWork(int userId, int workId)
    public int returnWork(int userId, int workId)
    private int countOverdueWorks(int userId)
    public void updateUserStatus(int userId)
    public void payFine(int userId, int amount)
    public List<Notification> getUserNotifications(int userId)

 [WriteClassStructure]
Auditoria completa.
