

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




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

[ERROR] 056/bci/app/main/DoSaveFile.java:33:	EmptyCatchBlock:	Evitar blocos catch vazios.
[ERROR] 056/bci/core/LibraryManager.java:116:	EmptyCatchBlock:	Evitar blocos catch vazios.
Total de erros:  2


####    Quebra do encapsulamento


[ERROR] 056/bci/core/Creator.java:33:	MethodReturnsFieldCollectionRule:	Possível quebra de encapsulamento na classe Creator com o método gworks a devolver um Map
Total de erros:  1


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


[INFO] 056/bci/core/Book.java:0:	POLooseCouplingRule:	Aplicação correcta (1) e incorrecta (0) do princípio Programar para abstracção no ficheiro Book.java.
[INFO] 056/bci/core/Creator.java:0:	POLooseCouplingRule:	Aplicação correcta (2) e incorrecta (0) do princípio Programar para abstracção no ficheiro Creator.java.
[INFO] 056/bci/core/Library.java:0:	POLooseCouplingRule:	Aplicação correcta (10) e incorrecta (1) do princípio Programar para abstracção no ficheiro Library.java.
[ERROR] 056/bci/core/Library.java:428:	POLooseCouplingRule:	Erro: Evite declarar variáveis utilizando tipos concretos como 'ArrayList'; Em vez do tipo concreto utilize a interface.
[INFO] 056/bci/core/LibraryManager.java:0:	POLooseCouplingRule:	Aplicação correcta (4) e incorrecta (1) do princípio Programar para abstracção no ficheiro LibraryManager.java.
[ERROR] 056/bci/core/LibraryManager.java:171:	POLooseCouplingRule:	Erro: Evite declarar variáveis utilizando tipos concretos como 'ArrayList'; Em vez do tipo concreto utilize a interface.
[INFO] 056/bci/core/Observer.java:0:	POLooseCouplingRule:	Aplicação correcta (1) e incorrecta (0) do princípio Programar para abstracção no ficheiro Observer.java.
[INFO] 056/bci/core/RuleManager.java:0:	POLooseCouplingRule:	Aplicação correcta (2) e incorrecta (0) do princípio Programar para abstracção no ficheiro RuleManager.java.
[INFO] 056/bci/core/UpdateInteresse.java:0:	POLooseCouplingRule:	Aplicação correcta (1) e incorrecta (0) do princípio Programar para abstracção no ficheiro UpdateInteresse.java.
[INFO] 056/bci/core/UpdateNumber.java:0:	POLooseCouplingRule:	Aplicação correcta (1) e incorrecta (0) do princípio Programar para abstracção no ficheiro UpdateNumber.java.
[INFO] 056/bci/core/User.java:0:	POLooseCouplingRule:	Aplicação correcta (6) e incorrecta (0) do princípio Programar para abstracção no ficheiro User.java.
[INFO] 056/bci/core/Work.java:0:	POLooseCouplingRule:	Aplicação correcta (3) e incorrecta (0) do princípio Programar para abstracção no ficheiro Work.java.
Total de erros:  2


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


[WARN] 056/bci/core/Book.java:19:	MethodReturnsFieldCollectionRule:	Potencial fuga de privacidade (aceite) em método getCreators da classe Book: devolve referência directa para '_creators' mas método não é público: package-private
[WARN] 056/bci/core/Creator.java:34:	MethodReturnsFieldCollectionRule:	Potencial fuga de privacidade (aceite) em método gworks da classe Creator: devolve referência directa para '_works' mas método não é público: package-private
[WARN] 056/bci/core/Library.java:232:	MethodReturnsFieldCollectionRule:	Potencial fuga de privacidade (aceite) em método getWorks da classe Library: devolve referência directa para '_works.values()' mas método não é público: package-private
[WARN] 056/bci/core/RuleManager.java:34:	MethodReturnsFieldCollectionRule:	Potencial fuga de privacidade (aceite) em método getRules da classe RuleManager: devolve referência directa para '_rules' mas método não é público: package-private
[INFO] 056/bci/core/User.java:56:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em User por uso de Collections.unmodifiableCollection para devolver vista imutável de _requests em método getRequests
[INFO] 056/bci/core/User.java:89:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe User evitada por criação de cópia (new ArrayList) de _wishes no método getWishes.
[INFO] 056/bci/core/Work.java:93:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em Work por uso de Collections.unmodifiableSet para devolver vista imutável de _requests em método getRequests
Total de erros:  0
Total de fugas evitadas:        3


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


Nada a assinalar


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


Nada a assinalar


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

[ERROR] 056/bci/core/Book.java:40:16: A variável local com o nome '_tostring'não está de acordo com o padrão '^[a-z][a-zA-Z0-9]*$'. [LocalVariableName]
[ERROR] 056/bci/core/Observer.java:6:41: O parâmetro '_users' deve condizer com o padrão '^[a-z][a-zA-Z]*[0-9]?$'. [ParameterName]
Total de erros:  2

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

Iniciando a auditoria...
[INFO] 056/bci/core/LibraryManager.java:100 ObjectOutputStream criado no método 'public void save()' da classe 'LibraryManager'. [CheckSerialization]
[INFO] 056/bci/core/LibraryManager.java:129 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] 056/bci/core/Library.java:299 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão 'user.getBehavior()' comparada '3' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 056/bci/core/Library.java:381 Possível mau desenho: diferenciação do comportamento com base em comparação de enumerados (expressão 'user.getBehavior()' comparada '2' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 056/bci/core/Parser.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]
Auditoria completa.

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

Iniciando a auditoria...
[WARN] 056/bci/app/work/DoPerformSearch.java:24 Instanciação de comparador definido no domínio 'CompareWorkById' não permitido na camada da aplicação. [POCreateCoreEntitiesInApp]
Auditoria completa.

####  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] 056/bci/core/RuleManager.java:8 Membro estático 'Set<Rule> _rules' não recomendável. [POStaticMember]
[ERROR] 056/bci/core/RuleManager.java:9 Membro estático 'int _nextId' não recomendável. [POStaticMember]
[ERROR] 056/bci/core/RuleManager.java:10 Membro estático 'int _noStockRule' não recomendável. [POStaticMember]
[ERROR] 056/bci/core/RuleManager.java:21 Membro estático 'static void addRule(Rule r)' não recomendável. [POStaticMember]
[ERROR] 056/bci/core/RuleManager.java:26 Membro estático 'static void addRule(Rule r, boolean noStock)' não recomendável. [POStaticMember]
[ERROR] 056/bci/core/RuleManager.java:33 Método estático 'static Set<Rule> getRules()' com um simples return valor literal ou atributo não recomendável. [POStaticMember]
[ERROR] 056/bci/core/RuleManager.java:37 Método estático 'public static int noStockRuleId()' com um simples return valor literal ou atributo não recomendável. [POStaticMember]
[INFO] 056/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 7 erros.

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

Iniciando a auditoria...
[ERROR] 056/bci/core/RuleManager.java:8 O atributo '_rules', com nível de acesso 'package', deveria ser privado e ter métodos acessores. [POVisibilityModifier]
Auditoria completa.
O Checkstyle terminou com 1 erros.

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

Iniciando a auditoria...
[WARN] Possível erro: A classe 'Request' utilizada no atributo 'private final Set<Request> _requests' da classe 'User' não substitui os métodos hashCode e equals. [WriteClassStructure]
[WARN] Possível erro: A classe 'Request' utilizada no atributo 'private Set<Request> _requests' da classe 'Work' não substitui os métodos hashCode e equals. [WriteClassStructure]
[WARN] Possível erro: A classe 'Rule' utilizada no atributo ' static Set<Rule> _rules' da classe 'RuleManager' não substitui os métodos hashCode e equals. [WriteClassStructure]
[WARN] Possível erro: A classe 'Request' utilizada no atributo 'private final Set<Request> _requests' da classe 'Library' não substitui os métodos hashCode e equals. [WriteClassStructure]
[WARN] Possível erro: A classe 'Rule' utilizada no atributo 'private final Set<Rule> _rules' da classe 'Library' 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: 1, dos quais 0 private, 0 package-private, 0 protected e 1 public. [WriteClassStructure]
[INFO] Interfaces definidos no package core da aplicação (1): '[Observer]'. [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): '[Category, WishType, UserBehavior]'. [WriteClassStructure]
[INFO] Número total de classes definidos no core: 37, dos quais 0 private, 1 package-private, 0 protected e 36 public. [WriteClassStructure]
[INFO] Classes abstractas definidas no package core da aplicação (2): '[Work, Rule]'. [WriteClassStructure]
[INFO] Classes concretas e não excepções definidas no package core da aplicação (23): '[User, Creator, Notification, CheckRequestTwice, UpdateInteresse, UpdateNumber, Book, CheckUserMaxRequests, CheckWorkIsAvailable, CompareUserByNameAndId, Request, CompareWorkByName, Wish, Date, Parser, CheckUserIsActive, CompareWorkById, Dvd, CheckWorkNotReference, RuleManager, LibraryManager, Library, CheckUserWorkValue]'. [WriteClassStructure]
[INFO] Excepções definidas no package core da aplicação (12): '[UnavailableFileException, UnrecognizedEntryException, UserNotSuspendedException, FindCreatorFailedException, MissingFileAssociationException, FindRequestFailedException, FindWorkFailedException, CouldNotBorrowException, ImportFileException, NotEnoughCopiesException, FindUserFailedException, CreateUserFailedException]'. [WriteClassStructure]
[INFO] Número total de métodos nas classes do core (sem excepções): 153, dos quais 6 private, 76 package-private, 0 protected e 71 public. [WriteClassStructure]
[INFO] Número total de atributos nas classes do core (sem excepções): 53, dos quais 52 private, 1 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 )

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

    private final String _display

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

    public String toString()

 [WriteClassStructure]
[INFO] enum WishType ( public )

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

    private final String _display

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

    public String toString()

 [WriteClassStructure]
[INFO] enum UserBehavior ( public )

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

    private final int _obrasMax

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

    public int obrasMax()

 [WriteClassStructure]
[INFO] interface Observer ( public )

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

    public void update(Collection _users, Work work)

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

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

    private final int _id
    private boolean _isActive
    private final String _name
    private final String _email
    private int _fine
    private UserBehavior _behavior
    private final Set<Request> _requests
    private final List<Notification> _notifications
    private List<Wish> _wishes
    private int _returnTiming

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

    int id()
    String name()
    boolean isActive()
    void addRequest(Request request)
    public void removeRequest(Request r)
    Collection<Request> getRequests()
    public void changeReturnTiming(int change)
    public int getReturnTiming()
    UserBehavior getBehavior()
    void setBehavior(UserBehavior behavior)
    void addWish(WishType type, Work work)
    void removeWish(Wish wish)
    void removeWishes()
    Collection<Wish> getWishes()
    void addNotification(WishType type, Work work)
    void removeNotification(Notification notification)
    Collection<Notification> getNotifications()
    void addFine(int fine)
    void removeFine()
    void active(boolean bool)
    public int getAccumulatedFine()
    public String toString()
    public void payAccumulatedFine()

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

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

    private final String _name
    private final Map<Integer, Work> _works

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

    public boolean equals(Object obj)
    public int hashCode()
    String gname()
    Map<Integer, Work> gworks()
    void addWork(Work nWork)
    void removeWork(Work work)

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

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

    private final WishType _type
    private final Work _work
    private final String _message

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

    public Work getWork()
    public String toString()

 [WriteClassStructure]
[INFO] class CheckRequestTwice ( public implements Serializable )
  extends Rule

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

    public boolean check(Work work, User user)

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

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

    public void update(Collection users, Work work)

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

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

    public void update(Collection users, Work work)

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

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

    private final String _isbn
    private final List<Creator> _creators

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

    List<Creator> getCreators()
    void removeCreator(Creator creator)
    void addCreator(Creator creator)
    String gIsbn()
    String getType()
    public String addiInfo()

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

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

    private final int _id
    private final int _price
    private int _availableCopies
    private int _totalCopies
    private final String _title
    private final Category _category
    private Set<Request> _requests
    private final Library _library

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

    public boolean equals(Object object)
    public void addRequest(Request request)
    void removeRequest(Request request)
    int totalCopies()
    boolean changeTotalCopies(int number)
    boolean changeAvailableCopies(int number)
    final int id()
    final String title()
    final int availableCopies()
    final Category category()
    final int price()
    final Set<Request> getRequests()
    public String toString()
    abstract void addCreator(Creator creator)
    abstract void removeCreator(Creator creator)
    abstract List<Creator> getCreators()
    abstract String getType()
    abstract String addiInfo()

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

   Method addCreator(Creator) overriden in subclass(es) Book Dvd 
   Method removeCreator(Creator) overriden in subclass(es) Book Dvd 
   Method getCreators() overriden in subclass(es) Book Dvd 
   Method getType() overriden in subclass(es) Book Dvd 
   Method addiInfo() overriden in subclass(es) Book Dvd 
 [WriteClassStructure]
[INFO] class CheckUserMaxRequests ( public implements Serializable )
  extends Rule

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

    public boolean check(Work work, User user)

 [WriteClassStructure]
[INFO] class CheckWorkIsAvailable ( public implements Serializable )
  extends Rule

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

    public boolean check(Work work, User user)

 [WriteClassStructure]
[INFO] class CompareUserByNameAndId ( public implements Comparator<User>, Serializable )

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

    public int compare(User o1, User o2)

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

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

    private final int _deadline
    private final User _user
    private final Work _work
    private int _fine

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

    public boolean equals(Object object)
    public int getDeadline()
    public User getUser()
    public Work getWork()
    void removeRequest()
    public void addFine(int i)
    public void removeFine()
    public int getFine()

 [WriteClassStructure]
[INFO] class CompareWorkByName ( public implements Comparator<Work>, Serializable )

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

    public int compare(Work w1, Work w2)

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

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

    private WishType _type
    private Work _work

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

    public WishType getType()
    public Work getWork()

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

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

    private int _currentDate

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

    int getCurrentDate()
    void advanceDay(int nDays)

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

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

    private final 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 CheckUserIsActive ( public implements Serializable )
  extends Rule

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

    public boolean check(Work work, User user)

 [WriteClassStructure]
[INFO] class CompareWorkById ( public implements Comparator<Work>, Serializable )

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

    public int compare(Work w1, Work w2)

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

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

    private final String _igac
    private Creator _creator

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

    void removeCreator(Creator creator)
    void addCreator(Creator creator)
    List<Creator> getCreators()
    String gigac()
    String getType()
    public String addiInfo()

 [WriteClassStructure]
[INFO] class CheckWorkNotReference ( public implements Serializable )
  extends Rule

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

    public boolean check(Work work, User user)

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

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

     static Set<Rule> _rules
    private static int _nextId
    private static int _noStockRule

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

    static void addRule(Rule r)
    static void addRule(Rule r, boolean noStock)
    static Set<Rule> getRules()
    public static int noStockRuleId()

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

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

    private Library _library
    private String _filename

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

    public int getCurrentDate()
    public void advanceDays(int nDays)
    public int rcreateUser(String name, String email)
    public User getUser(int id)
    public List<User> getUsers()
    public String saveFile()
    public Work getWork(int id)
    public Collection<Work> getWorks()
    public Collection<Work> getCreatorWorks(String name)
    public boolean modified()
    public int request(int userId, int workId)
    public int returnWork(int userId, int workId)
    public void addUserWish(int user, int work, WishType type)
    public int getAccumulatedFine(int userId)
    public int getRequestFine(int userId, int workId)
    public void payRequestFine(int userId, int workId)
    public void save()
    public void saveAs(String filename)
    public void load(String filename)
    public void importFile(String datafile)
    public Collection<Notification> getUserNotifications(int id)
    public void payFine(int id)
    public void payAccumulatedFine(int userId)
    public void addFine(int userId, int fine)
    public ArrayList<Work> searchWorks(String word)
    public void changeTotalCopies(int id, int dif)

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

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

    private final Date _date
    private int _nextUserId
    private int _nextWorkId
    private final Map<Integer, User> _users
    private final Set<Creator> _creators
    private final Map<Integer, Work> _works
    private boolean _modified
    private final Set<Request> _requests
    private final Set<Rule> _rules
    private UpdateInteresse _upInteresse
    private UpdateNumber _upNumber
    private final int _multa

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

    void importFile(String filename)
    void setSaved()
    boolean modified()
    void advanceDays(int nDays)
    void updateFines(int diasPassados, int diaAtual)
    int getCurrentDate()
    User createUser(String name, String email)
    User getUser(int id)
    List<User> getUsers()
    Creator addCreator(String nome)
    void addBook(int price, String title, int numberCopies, Category category, String isbn, List creators)
    void addDVD(int price, String title, int numberCopies, Category category, String igac, Creator creator)
    void changeTotalNumber(int dif, int id)
    public void updateNumber(Work work)
    Work getWork(int id)
    Collection<Work> getWorks()
    Collection<Work> getCreatorWorks(String nome)
    void removeWork(Work work)
    int request(int userId, int workId)
    private void checkRequest(User user, Work work)
    private int addRequest(User user, Work work)
    Collection<Notification> getUserNotifications(int id)
    void addUserWish(int userId, int workId, WishType type)
    public int getAccumulatedFine(int userId)
    public int getRequestFine(int userId, int workId)
    public int returnWork(int userId, int workId)
    void pagaDividas(User user)
    void payAccumulatedFine(int userId)
    ArrayList<Work> searchWork(String word)
    public void payRequestFine(int userId, int workId)
    public void addFine(int userId, int fine)

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

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

    private int _id

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

    public abstract boolean check(Work work, User user)
    public void setId(int id)
    public int getId()

  ###### Subclasses  ###### 
    CheckRequestTwice   CheckUserMaxRequests   CheckWorkIsAvailable   CheckUserIsActive   CheckWorkNotReference   CheckUserWorkValue   

   Method check(Work, User) overriden in subclass(es) CheckRequestTwice CheckUserMaxRequests CheckWorkIsAvailable CheckUserIsActive CheckWorkNotReference CheckUserWorkValue 
 [WriteClassStructure]
[INFO] class CheckUserWorkValue ( public implements Serializable )
  extends Rule

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

    public boolean check(Work work, User user)

 [WriteClassStructure]
Auditoria completa.
