

####    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] 041/bci/core/MyParser.java:41:	AvoidThrowingRawExceptionTypes:	Deve evitar a criação de excepções demasiado genéricas.
Total de erros:  1


####    Quebra do encapsulamento


Nada a assinalar


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


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


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


[WARN] 041/bci/core/Book.java:32:	MethodReturnsFieldCollectionRule:	Potencial fuga de privacidade (aceite) na classe Book: construtor atribui parâmetro 'authors' a atributo 'this._authors', mas construtor não é público
[INFO] 041/bci/core/Book.java:58:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em Book por uso de Collections.unmodifiableList para devolver vista imutável de _authors em método getAuthors
[INFO] 041/bci/core/User.java:170:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em User por uso de Collections.unmodifiableList para devolver vista imutável de _streaks em método getStreaks
[INFO] 041/bci/core/User.java:256:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em User por uso de Collections.unmodifiableCollection para devolver vista imutável de _requests.values() em método getRequestsList
[INFO] 041/bci/core/User.java:336:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em User por uso de Collections.unmodifiableList para devolver vista imutável de _notifications em método getNotifications
[INFO] 041/bci/core/Work.java:250:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em Work por uso de Collections.unmodifiableSet para devolver vista imutável de _stockObservers em método getStockObservers
[INFO] 041/bci/core/Work.java:258:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em Work por uso de Collections.unmodifiableSet para devolver vista imutável de _trakingObservers em método getTrackingObservers
[INFO] 041/bci/core/Work.java:266:	MethodReturnsFieldCollectionRule:	Fuga de privacidade evitada em Work por uso de Collections.unmodifiableList para devolver vista imutável de _creators em método getCreators
Total de erros:  0
Total de fugas evitadas:        7


####    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] 041/bci/core/Library.java:107:67: Apenas uma instrução por linha é permitida. [OneStatementPerLine]
[ERROR] 041/bci/core/Library.java:108:76: Apenas uma instrução por linha é permitida. [OneStatementPerLine]
Total de erros:  2

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

Iniciando a auditoria...
[INFO] 041/bci/core/LibraryManager.java:43 ObjectOutputStream criado no método 'public void saveAs(String filename)' da classe 'LibraryManager'. [CheckSerialization]
[INFO] 041/bci/core/LibraryManager.java:60 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] 041/bci/core/Library.java:103 Possível mau desenho: diferenciação do comportamento com base em comparação de strings (expressão 'criteria' comparada '3' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 041/bci/core/MyParser.java:54 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


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] 041/bci/core/exception/CreatorAlreadyRegistedException.java:7 Atributo estático final 'String ERROR_MESSAGE' permitido. [POStaticMember]
[INFO] 041/bci/core/exception/ImportFileException.java:7 Atributo estático final 'String ERROR_MESSAGE' permitido. [POStaticMember]
[INFO] 041/bci/core/exception/NoSuchCreatorRegistedException.java:10 Atributo estático final 'String ERROR_MESSAGE' permitido. [POStaticMember]
[INFO] 041/bci/core/exception/NoSuchUserRegistedException.java:10 Atributo estático final 'String ERROR_MESSAGE' permitido. [POStaticMember]
[INFO] 041/bci/core/exception/NoSuchWorkRegistedException.java:10 Atributo estático final 'String ERROR_MESSAGE' permitido. [POStaticMember]
[INFO] 041/bci/core/exception/NotEnoughInventoryException.java:7 Atributo estático final 'String ERROR_MESSAGE' permitido. [POStaticMember]
[INFO] 041/bci/core/exception/RuleFailedException.java:9 Atributo estático final 'String ERROR_MESSAGE' permitido. [POStaticMember]
[INFO] O número de serialVersionUID atributos estáticos definidos nas várias classes foi '23'. [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

Iniciando a auditoria...
[ERROR] A classe 'Work' utilizada no atributo 'private HashMap<Work, Request> _requests' da classe 'User' não substitui os métodos hashCode e equals. [WriteClassStructure]
Auditoria completa.
O Checkstyle terminou com 1 erros.

####  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): '[Interested, RequestState, Behavior]'. [WriteClassStructure]
[INFO] Número total de enumerados definidos no core: 4, dos quais 0 private, 0 package-private, 0 protected e 4 public. [WriteClassStructure]
[INFO] Enumerados definidos no package core da aplicação (4): '[Category, WorkType, RequestStatus, UserSituation]'. [WriteClassStructure]
[INFO] Número total de classes definidos no core: 41, dos quais 0 private, 2 package-private, 0 protected e 39 public. [WriteClassStructure]
[INFO] Classes abstractas definidas no package core da aplicação (3): '[Notification, Work, Rule]'. [WriteClassStructure]
[INFO] Classes concretas e não excepções definidas no package core da aplicação (23): '[User, ActiveRequestState, UserComparator, Creator, CheckRequestTwice, TrackingNotification, Book, MyParser, StockNotification, FaultyRequestState, Request, FaultyUserBehavior, CompliantUserBehavior, CheckUserNumberRequisition, CheckWorkPrice, Date, CheckUserIsActive, CheckWorkCategory, Dvd, CheckWorkStock, LibraryManager, NormalUserBehavior, Library]'. [WriteClassStructure]
[INFO] Excepções definidas no package core da aplicação (15): '[UserHasNoFineExcepetion, RuleFailedException, NoSuchCreatorRegistedException, NoSuchWorkRegistedException, UnavailableFileException, UserHasFaultyRequestException, UnrecognizedEntryException, UserRegistrationException, NotEnoughInventoryException, MissingFileAssociationException, CreatorAlreadyRegistedException, WorkWasNotRequestedException, UnavailableWorkStockException, ImportFileException, NoSuchUserRegistedException]'. [WriteClassStructure]
[INFO] Número total de métodos nas classes do core (sem excepções): 156, dos quais 13 private, 78 package-private, 7 protected e 58 public. [WriteClassStructure]
[INFO] Número total de atributos nas classes do core (sem excepções): 48, dos quais 36 private, 0 package-private, 12 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 String _category

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

    String getName()

 [WriteClassStructure]
[INFO] enum WorkType ( public )

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

    private String _type

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

    public String toString()

 [WriteClassStructure]
[INFO] enum RequestStatus ( public )

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

    private final int _id

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

    int getId()
    boolean equals(RequestStatus other)

 [WriteClassStructure]
[INFO] enum UserSituation ( public )

 [WriteClassStructure]
[INFO] interface Interested ( public )
  extends Serializable

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

    void update(Notification notification)
    List<Notification> getNotifications()
    void removeNotifications()
    void removeNotification(Notification notification)

 [WriteClassStructure]
[INFO] interface RequestState ( public )
  extends Serializable

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

    boolean resolve(int todayDate)
    RequestStatus getStatus()

 [WriteClassStructure]
[INFO] interface Behavior ( public )
  extends Serializable

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

    int getDeadLine(int stock)
    int getMaxRequests()
    boolean isCompliant()
    String toString()
    int getId()

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

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

    private final Integer _id
    private final String _name
    private final String _email
    private final int _maxStreaksRecord
    private Behavior _behavior
    private UserSituation _situation
    private int _fine
    private ArrayList<Boolean> _streaks
    private HashMap<Work, Request> _requests
    private List<Notification> _notifications

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

    String getName()
    public Integer getId()
    UserSituation getUserSituation()
    void setSituation(UserSituation situation)
    void updateSituation()
    void updateStateRequests(int today)
    void checkFaultyRequests(int today)
    boolean isSuspend()
    void addStreak(boolean e)
    List<Boolean> getStreaks()
    Behavior getBehavior()
    private void setBehavior(Behavior behavior)
    void updateBehavior()
    int getFine()
    void setFine(int fine)
    String getEmail()
    Collection<Request> getRequestsList()
    Request getRequest(Work work)
    boolean hasRequested(Work work)
    void addRequest(Work work, Request request)
    void removeRequest(Work work)
    int totalRequests()
    int getDeadLine(int stock)
    int getMaxRequests()
    public void update(Notification notification)
    public List<Notification> getNotifications()
    public void removeNotifications()
    public void removeNotification(Notification notification)
    public String toString()

 [WriteClassStructure]
[INFO] class ActiveRequestState ( public implements RequestState )

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

    private final Request _request

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

    public boolean resolve(int todayDate)
    public RequestStatus getStatus()

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

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

    public int compare(User user1, User user2)

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

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

    private final String _nome
    private final HashMap<String, Work> _creatorWorks

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

    String getName()
    public Collection<Work> getCreatorWorks()
    void addWork(Work work)
    void removeWork(Work work)
    boolean hasWork(Work work)
    boolean hasWorks()

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

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

    protected final Work _work
    protected final int _id
    protected final String _snapshot

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

    int getId()
    Work getWork()
    public abstract String toString()

  ###### Subclasses  ###### 
    TrackingNotification   StockNotification   

   Method toString() overriden in subclass(es) TrackingNotification StockNotification 
 [WriteClassStructure]
[INFO] class CheckRequestTwice ( public )
  extends Rule

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

    protected void check(User user, Work work)

 [WriteClassStructure]
[INFO] class TrackingNotification ( public )
  extends Notification

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

    public String toString()

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

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

    private final List<Creator> _authors
    private final String _isbn

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

    WorkType getType()
    String getInfo()
    List<Creator> getAuthors()
    private String getCreatorNames()
    public String toString()
    boolean containsSearch(String search)

 [WriteClassStructure]
[INFO] class MyParser ( , final )

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

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

    protected final int _id
    protected final String _title
    protected final int _price
    protected final Category _category
    protected int _request
    protected int _total
    protected Set<Interested> _stockObservers
    protected Set<Interested> _trakingObservers
    protected ArrayList<Creator> _creators

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

    abstract WorkType getType()
    abstract String getInfo()
    public abstract String toString()
    abstract boolean containsSearch(String search)
    String getTitle()
    int getId()
    int getNumberRequests()
    int getPrice()
    String getCategory()
    int getTotal()
    int getAvailability()
    void performRequest()
    void doReturn()
    void changeInventory(int amount)
    void addStockObserver(Interested interested)
    void addTrackingObserver(Interested interested)
    void removeStockObserver(Interested interested)
    void removeTrackingObserver(Interested interested)
    boolean isStockObserver(Interested interested)
    boolean isTrackingObserver(Interested interested)
    private void notifyStockObservers(Notification notification)
    private void notifyTrackingObservers(Notification notification)
    private void unNotifyStockObservers(Notification notification)
    private void unNotifyTrackingObservers(Notification notification)
    Collection<Interested> getStockObservers()
    Collection<Interested> getTrackingObservers()
    List<Creator> getCreators()
    void addCreator(Creator creator)

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

   Method getType() overriden in subclass(es) Book Dvd 
   Method getInfo() overriden in subclass(es) Book Dvd 
   Method toString() overriden in subclass(es) Book Dvd 
   Method containsSearch(String) overriden in subclass(es) Book Dvd 
 [WriteClassStructure]
[INFO] class StockNotification ( public )
  extends Notification

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

    public String toString()

 [WriteClassStructure]
[INFO] class FaultyRequestState ( public implements RequestState )

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

    private final Request _request

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

    public boolean resolve(int todayDate)
    public RequestStatus getStatus()

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

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

    private final int _deadLine
    private final User _user
    private final Work _work
    private boolean _workReturned
    private RequestState _state

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

    int getDeadLine()
    User getUser()
    Work getWork()
    RequestStatus getStateStatus()
    void setWorkReturned()
    boolean workIsReturned()
    void updateState(int todayDate)
    boolean resolve(int todayDate)

 [WriteClassStructure]
[INFO] class FaultyUserBehavior ( public implements Behavior )

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

    public int getDeadLine(int stock)
    public int getMaxRequests()
    public boolean isCompliant()
    public String toString()
    public int getId()

 [WriteClassStructure]
[INFO] class CompliantUserBehavior ( public implements Behavior )

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

    public int getDeadLine(int stock)
    public int getMaxRequests()
    public boolean isCompliant()
    public String toString()
    public int getId()

 [WriteClassStructure]
[INFO] class CheckUserNumberRequisition ( public )
  extends Rule

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

    protected void check(User user, Work work)

 [WriteClassStructure]
[INFO] class CheckWorkPrice ( public )
  extends Rule

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

    protected void check(User user, Work work)

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

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

    private int _day

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

    int getDay()
    boolean advanceDate(int amountDays)

 [WriteClassStructure]
[INFO] class CheckUserIsActive ( public )
  extends Rule

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

    protected void check(User user, Work work)

 [WriteClassStructure]
[INFO] class CheckWorkCategory ( public )
  extends Rule

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

    protected void check(User user, Work work)

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

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

    private final Creator _director
    private final String _igac

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

    WorkType getType()
    String getInfo()
    Creator getDirector()
    public String toString()
    boolean containsSearch(String search)

 [WriteClassStructure]
[INFO] class CheckWorkStock ( public )
  extends Rule

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

    protected void check(User user, Work work)

 [WriteClassStructure]
[INFO] class LibraryManager ( public )

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

    private Library _library
    private String _fileName

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

    public void save()
    public void saveAs(String filename)
    public void load(String filename)
    public void importFile(String datafile)
    public final Library getLibrary()
    public void newLibrary()
    public String getFileName()
    private void setFileName(String filename)
    public boolean hasUnsavedChanges()
    public void setLibraryState(boolean bool)

 [WriteClassStructure]
[INFO] class NormalUserBehavior ( public implements Behavior )

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

    public int getDeadLine(int stock)
    public int getMaxRequests()
    public boolean isCompliant()
    public String toString()
    public int getId()

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

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

    private final HashMap<Integer, User> _users
    private final HashMap<Integer, Work> _works
    private final HashMap<String, Creator> _creators
    private final List<Rule> _rules
    private int _nextWorkId
    private int _nextUserId
    private final Date _date
    private boolean _state

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

    void setState(Boolean state)
    boolean getState()
    public User registerUser(String name, String email)
    public User getUser(Integer userId)
    public List<User> getUsers(String criteria)
    private int getNextUserId()
    public Work getWork(Integer workId)
    public Collection<Work> getWorks()
    private int getNextWorkId()
    public int getDate()
    public void updateDate(int amountDays)
    Creator registerCreator(String name)
    public Creator getCreator(String creatorId)
    Dvd registerDvd(String title, Creator director, int price, Category category, int total, String igac)
    Book registerBook(String title, List authors, int price, Category category, int total, String isbn)
    public int requestWork(User user, Work work)
    public void returnWork(User user, Work work, String decision)
    public void checkReturnWork(User user, Work work)
    public void payUserFine(User user)
    public void addStockInterested(String decision, User user, Work work)
    public List<Notification> getNotifications(Interested interested)
    public void updateInventory(Work work, int amount)
    public Collection<Work> searchWorks(String search)
    void importFile(String filename)

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

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

    private final int _id

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

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

  ###### Subclasses  ###### 
    CheckRequestTwice   CheckUserNumberRequisition   CheckWorkPrice   CheckUserIsActive   CheckWorkCategory   CheckWorkStock   

   Method check(User, Work) overriden in subclass(es) CheckRequestTwice CheckUserNumberRequisition CheckWorkPrice CheckUserIsActive CheckWorkCategory CheckWorkStock 
 [WriteClassStructure]
Auditoria completa.
