

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


Nada a assinalar


####    Quebra do encapsulamento


Nada a assinalar


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


[INFO] 028/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] 028/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] 028/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] 028/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] 028/bci/core/NotifiableWork.java:0:	POLooseCouplingRule:	Aplicação correcta (1) e incorrecta (0) do princípio Programar para abstracção no ficheiro NotifiableWork.java.
[INFO] 028/bci/core/RuleChecker.java:0:	POLooseCouplingRule:	Aplicação correcta (1) e incorrecta (0) do princípio Programar para abstracção no ficheiro RuleChecker.java.
[INFO] 028/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] 028/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] 028/bci/core/Book.java:14:	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] 028/bci/core/Library.java:82:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe Library evitada por criação de cópia (new ArrayList) de _worksById.values() no método listWorks.
[INFO] 028/bci/core/Library.java:208:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe Library evitada por criação de cópia (new ArrayList) de _usersById.values() no método listUsers.
Total de erros:  0
Total de fugas evitadas:        3


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


[WARN] 028/bci/core/Library.java:39:9: A lógica condicional pode ser removida. [SimplifyBooleanReturn]
[WARN] 028/bci/core/Library.java:44:9: A lógica condicional pode ser removida. [SimplifyBooleanReturn]
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] 028/bci/core/RuleChecker.java:10:24: O atributo com o nome 'rules'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 028/bci/core/exception/CouldNotRequestException.java:6:17: O atributo com o nome 'error'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
Total de erros:  2

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

Iniciando a auditoria...
[INFO] 028/bci/core/LibraryManager.java:33 ObjectOutputStream criado no método 'public void save()' da classe 'LibraryManager'. [CheckSerialization]
[INFO] 028/bci/core/LibraryManager.java:61 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] 028/bci/core/MyParser.java:55 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] 028/bci/core/Work.java:39 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]
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] 028/bci/core/UserBehavior.java:15 Atributo estático final 'Normal INSTANCE' permitido. [POStaticMember]
[INFO] 028/bci/core/UserBehavior.java:54 Atributo estático final 'Faltoso INSTANCE' permitido. [POStaticMember]
[INFO] 028/bci/core/UserBehavior.java:86 Atributo estático final 'Cumpridor INSTANCE' permitido. [POStaticMember]
[INFO] 028/bci/core/exception/ImportFileException.java:7 Atributo estático final 'String ERROR_MESSAGE' permitido. [POStaticMember]
[INFO] 028/bci/core/exception/NoIdMatchException.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


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: 3, dos quais 0 private, 0 package-private, 0 protected e 3 public. [WriteClassStructure]
[INFO] Interfaces definidos no package core da aplicação (3): '[NotifiableWork, Notifiable, UserBehavior]'. [WriteClassStructure]
[INFO] Número total de enumerados definidos no core: 2, dos quais 0 private, 1 package-private, 0 protected e 1 public. [WriteClassStructure]
[INFO] Enumerados definidos no package core da aplicação (2): '[Category, NotificationType]'. [WriteClassStructure]
[INFO] Número total de classes definidos no core: 33, dos quais 0 private, 16 package-private, 0 protected e 17 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 (20): '[User, RuleChecker, CheckCategory, Creator, Notification, CheckRequestTwice, CheckActiveUser, CheckNumberRequisitions, Book, CheckInventory, MyParser, CheckPrice, Request, Faltoso, Cumpridor, Normal, UserInterest, Dvd, LibraryManager, Library]'. [WriteClassStructure]
[INFO] Excepções definidas no package core da aplicação (11): '[NoSuchUserExceptionCore, CouldNotRequestException, NoIdMatchException, UnavailableFileException, UnrecognizedEntryException, MissingFileAssociationException, NoSuchWorkExceptionCore, NotEnoughInventoryExceptionCore, ImportFileException, UserIsActiveExceptionCore, NoSuchCreatorExceptionCore]'. [WriteClassStructure]
[INFO] Número total de métodos nas classes do core (sem excepções): 137, dos quais 8 private, 75 package-private, 1 protected e 53 public. [WriteClassStructure]
[INFO] Número total de atributos nas classes do core (sem excepções): 45, dos quais 42 private, 0 package-private, 0 protected e 3 public. [WriteClassStructure]
Auditoria completa.

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

Iniciando a auditoria...
[INFO] enum Category (  )

 [WriteClassStructure]
[INFO] enum NotificationType ( public )

 [WriteClassStructure]
[INFO] interface NotifiableWork ( public )

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

    void addObserver(User user, NotificationType type)
    void removeObserver(User user, NotificationType type)
    List<UserInterest> getObservers()

 [WriteClassStructure]
[INFO] interface Notifiable ( public )

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

    void receiveNotification(Notification notification)

 [WriteClassStructure]
[INFO] interface UserBehavior ( public )

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

    int getReqTime(int copiesNum)
    int getMaxReq()
    String toString()
    void checkBehavior(User u)

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

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

    private String _name
    private String _email
    private final int _id
    private boolean _isActive
    private UserBehavior _behavior
    private int _fine
    private List<Request> _activeUserRequests
    private List<Boolean> _lastRequestsOnTime
    private List<Notification> _notifications

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

    public int getUserId()
    public String getName()
    Boolean isActive()
    void checkActive(int day)
    void setFine(int quant)
    void payFine(int day)
    int getUserFine()
    UserBehavior getBehavior()
    void setBehavior(UserBehavior newBehavior)
    void checkBehavior()
    int getActiveNumReq()
    List<Request> getUserRequests()
    void addUserRequest(Request request)
    int removeUserRequest(int workId, int day)
    List<Boolean> getLastRequestsOnTime()
    boolean checkRequisitions(int day)
    public void receiveNotification(Notification n)
    List<Notification> viewNotifications()
    public String toString()

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

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

    private List<Rule> rules

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

    void addRule(Rule rule)
    void checkRules(Work work, User user)

 [WriteClassStructure]
[INFO] class CheckCategory (  )
  extends Rule

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

    void check(Work work, User user)

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

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

    private final String _name
    private List<Work> _workList

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

    void addWork(Work work)
    void removeWork(int workId)
    String getName()
    List<Work> getWorkList()

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

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

    private final String _message
    private final NotificationType _type

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

    public String toString()

 [WriteClassStructure]
[INFO] class CheckRequestTwice (  )
  extends Rule

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

    void check(Work work, User user)

 [WriteClassStructure]
[INFO] class CheckActiveUser (  )
  extends Rule

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

    void check(Work work, User user)

 [WriteClassStructure]
[INFO] class CheckNumberRequisitions (  )
  extends Rule

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

    void check(Work work, User user)

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

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

    private String _isbn
    private List<Creator> _creators

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

    String getType()
    String getAdInfo()
    List<Creator> listCreators()
    String getIsbn()

 [WriteClassStructure]
[INFO] class CheckInventory (  )
  extends Rule

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

    void check(Work work, User user)

 [WriteClassStructure]
[INFO] class MyParser (  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]  abstract class Work ( public implements Serializable, NotifiableWork )

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

    private final int _workId
    private String _title
    private int _price
    private int _numberOfCopies
    private int _availableCopies
    private Category _category
    private List<UserInterest> _interestedUsers

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

    public int getWorkId()
    public String getTitle()
    int getPrice()
    int getNumberOfCopies()
    int getNumberOfAvailableCopies()
    void setNumberOfCopies(int numberOfCopies)
    void setNumberOfAvailableCopies(int numberOfAvailableCopies)
    String getCategoryString()
    public String toString()
    public void addObserver(User user, NotificationType type)
    public void removeObserver(User user, NotificationType type)
    public List<UserInterest> getObservers()
    public void notifyObservers(NotificationType type, String message)
    abstract String getType()
    abstract String getAdInfo()
    abstract List<Creator> listCreators()

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

   Method getType() overriden in subclass(es) Book Dvd 
   Method getAdInfo() overriden in subclass(es) Book Dvd 
   Method listCreators() overriden in subclass(es) Book Dvd 
 [WriteClassStructure]
[INFO] class CheckPrice (  )
  extends Rule

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

    void check(Work work, User user)

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

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

    private final int _userId
    private final int _workId
    private final int _endOfRequest

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

    int getUserId()
    int getWorkId()
    int getEndOfRequest()

 [WriteClassStructure]
[INFO] class Faltoso (  implements UserBehavior, Serializable )

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

    public final static Faltoso INSTANCE

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

    public int getReqTime(int copiesNum)
    public int getMaxReq()
    public String toString()
    public void checkBehavior(User u)
    private Object readResolve()

 [WriteClassStructure]
[INFO] class Cumpridor (  implements UserBehavior, Serializable )

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

    public final static Cumpridor INSTANCE

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

    public int getReqTime(int copiesNum)
    public int getMaxReq()
    public String toString()
    public void checkBehavior(User u)
    private Object readResolve()

 [WriteClassStructure]
[INFO] class Normal (  implements UserBehavior, Serializable )

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

    public final static Normal INSTANCE

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

    public int getReqTime(int copiesNum)
    public int getMaxReq()
    public String toString()
    public void checkBehavior(User u)
    private Object readResolve()

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

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

    private final User _user
    private final NotificationType _notificationType

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

    public User getUser()
    public NotificationType getNotificationType()

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

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

    private String _igac
    private Creator _creator

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

    String getType()
    String getAdInfo()
    List<Creator> listCreators()
    String getIgac()

 [WriteClassStructure]
[INFO] class LibraryManager ( public )

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

    private Library _library
    private String _filename
    private boolean _modified

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

    public void save()
    public void saveAs(String filename)
    public void load(String filename)
    public void importFile(String datafile)
    public int getCurrentDay()
    public void advanceDays(int days)
    public boolean validWork(int workId)
    public void registerDvd(String igac, Creator creator, String title, int price, int numberOfCopies, Category type)
    public void registerBook(String isbn, int price, String title, int numberOfCopies, . creators, Category type)
    public void alterInvWork(int number, int workId)
    public String listWork(int workId)
    public List<Work> listWorks()
    public List<Work> listWorksByCreators(String name)
    public String performSearch(String search)
    public boolean validUser(int userId)
    public int registerUser(String name, String email)
    public User listUser(int userId)
    public List<User> listUsers()
    public boolean isModified()
    public Creator registerCreator(String name)
    public int requestWork(int userId, int workId)
    public int returnWork(int userId, int workId)
    public int getRuleError(CouldNotRequestException e)
    public void payFine(int userId)
    public void setFine(int userId, int quant)
    public List<Notification> showUserNotifications(int userId)
    public void subscribeObserver(int userId, int workId, NotificationType type)

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

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

    private Map<Integer, Work> _worksById
    private Map<Integer, User> _usersById
    private Map<String, Creator> _creatorsByName
    private int _currentDay
    private int _nextWorkId
    private int _nextUserId
    private RuleChecker _ruleChecker

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

    void importFile(String filename)
    boolean validUser(int userId)
    boolean validWork(int workId)
    List<Work> getListOfWorks()
    List<Creator> getListOfCreators()
    List<User> getListOfUsers()
    private void removeWorkInternal(Work work)
    String listWork(int workId)
    List<Work> listWorks()
    List<Work> listWorksByCreators(String name)
    void alterInvWork(int quantityChange, int workId)
    String performSearch(String search)
    void registerDvd(String igac, Creator creator, String title, int price, int numberOfCopies, Category type)
    void registerBook(String isbn, int price, String title, int numberOfCopies, List creators, Category type)
    Creator registerCreator(String name)
    int getCurrentDay()
    void advanceDays(int day)
    int registerUser(String name, String email)
    User listUser(int userId)
    void subscribeObserver(int userId, int workId, NotificationType type)
    List<User> listUsers()
    void payFine(int userId)
    void setFine(int userId, int quant)
    void removeCreators(List creators)
    int requestWork(int userId, int workId)
    int returnWork(int userId, int workId)
    List<Notification> showUserNotifications(int userId)

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

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

    private final int _ruleId

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

    protected int getId()
    abstract void check(Work work, User user)

  ###### Subclasses  ###### 
    CheckCategory   CheckRequestTwice   CheckActiveUser   CheckNumberRequisitions   CheckInventory   CheckPrice   

   Method check(Work, User) overriden in subclass(es) CheckCategory CheckRequestTwice CheckActiveUser CheckNumberRequisitions CheckInventory CheckPrice 
 [WriteClassStructure]
Auditoria completa.
