

####    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] 078/bci/app/request/DoRequestWork.java:64:	AvoidRethrowingException:	Deve evitar o uso de um bloco catch que apenas apanha a excepção para relançar outra excepção do mesmo tipo
[ERROR] 078/bci/app/user/DoRegisterUser.java:31:	POAvoidCatchingGenericException:	Evitar apanhar excepções demasiado genéricas (RuntimeException and Exception) em blocos try-catch.
[ERROR] 078/bci/core/LibraryManager.java:143:	POExceptionAsFlowControlRule:	Evite a utilização de excepções como controlo de fluxo.
Total de erros:  3


####    Quebra do encapsulamento


Nada a assinalar


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


[INFO] 078/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] 078/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] 078/bci/core/Library.java:0:	POLooseCouplingRule:	Aplicação correcta (14) e incorrecta (0) do princípio Programar para abstracção no ficheiro Library.java.
[INFO] 078/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] 078/bci/core/Work.java:0:	POLooseCouplingRule:	Aplicação correcta (2) e incorrecta (0) do princípio Programar para abstracção no ficheiro Work.java.
[INFO] 078/bci/core/rules/Rule3_BorrowingRule.java:0:	POLooseCouplingRule:	Aplicação correcta (1) e incorrecta (0) do princípio Programar para abstracção no ficheiro Rule3_BorrowingRule.java.
Total de erros:  0


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


[INFO] 078/bci/core/Book.java:16:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe Book, por atribuição de parâmetro a atributo authors, evitada por criação de cópia (new new ArrayList(authors)) no construtor.
[INFO] 078/bci/core/Book.java:20:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe Book evitada por criação de cópia (new ArrayList) de _authors no método getAuthors.
[INFO] 078/bci/core/Book.java:35:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe Book evitada por criação de cópia (new ArrayList) de _authors no método getCreatorNames.
[INFO] 078/bci/core/Book.java:40:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe Book evitada por criação de cópia (new ArrayList) de _authors no método getSearchableCreatorTerms.
[INFO] 078/bci/core/Library.java:164:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe Library evitada por criação de cópia (new ArrayList) de users.values() no método getUsers.
[INFO] 078/bci/core/Library.java:274:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe Library evitada por criação de cópia (new ArrayList) de works.values() no método getWorks.
[INFO] 078/bci/core/Library.java:658:	MethodReturnsFieldCollectionRule:	Fuga de privacidade na classe Library evitada por criação de cópia (new ArrayList) de _requests no método getRequests.
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


[WARN] 078/bci/core/Category.java:13:21: Parâmetro/variável local 'displayName' esconde atributo da classe com o mesmo nome [HiddenField]
[WARN] 078/bci/core/User.java:29:21: Parâmetro/variável local 'id' esconde atributo da classe com o mesmo nome [HiddenField]
[WARN] 078/bci/core/User.java:29:32: Parâmetro/variável local 'name' esconde atributo da classe com o mesmo nome [HiddenField]
[WARN] 078/bci/core/User.java:29:45: Parâmetro/variável local 'email' esconde atributo da classe com o mesmo nome [HiddenField]
[WARN] 078/bci/core/User.java:47:30: Parâmetro/variável local 'multa' esconde atributo da classe com o mesmo nome [HiddenField]
Total de erros:  0


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

[ERROR] 078/bci/core/Category.java:11:26: O atributo com o nome 'displayName'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 078/bci/core/Library.java:45:32: O atributo com o nome 'users'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 078/bci/core/Library.java:47:32: O atributo com o nome 'works'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 078/bci/core/Library.java:607:83: Apenas uma instrução por linha é permitida. [OneStatementPerLine]
[ERROR] 078/bci/core/Library.java:610:86: Apenas uma instrução por linha é permitida. [OneStatementPerLine]
[ERROR] 078/bci/core/Library.java:615:84: Apenas uma instrução por linha é permitida. [OneStatementPerLine]
[ERROR] 078/bci/core/Library.java:618:83: Apenas uma instrução por linha é permitida. [OneStatementPerLine]
[ERROR] 078/bci/core/User.java:17:23: O atributo com o nome 'id'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 078/bci/core/User.java:18:26: O atributo com o nome 'name'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 078/bci/core/User.java:19:26: O atributo com o nome 'email'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 078/bci/core/User.java:20:17: O atributo com o nome 'multa'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 078/bci/core/User.java:22:32: O atributo com o nome 'classification'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 078/bci/core/User.java:26:17: O atributo com o nome 'onTimeReturnsCount'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 078/bci/core/User.java:27:17: O atributo com o nome 'lateReturnsCount'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
[ERROR] 078/bci/core/rules/Rule4_CheckRequestLimit.java:14:14: O tipo 'Rule4_CheckRequestLimit' deve condizer com o padrão '^[A-Z][a-zA-Z]+$'. [TypeName]
[ERROR] 078/bci/core/rules/Rule3_BorrowingRule.java:16:18: O tipo 'Rule3_BorrowingRule' deve condizer com o padrão '^[A-Z][a-zA-Z]+$'. [TypeName]
[ERROR] 078/bci/core/rules/Rule5_CheckReferenceCategory.java:14:14: O tipo 'Rule5_CheckReferenceCategory' deve condizer com o padrão '^[A-Z][a-zA-Z]+$'. [TypeName]
[ERROR] 078/bci/core/rules/Rule2_CheckUserActive.java:14:14: O tipo 'Rule2_CheckUserActive' deve condizer com o padrão '^[A-Z][a-zA-Z]+$'. [TypeName]
[ERROR] 078/bci/core/rules/Rule6_CheckPriceLimit.java:14:14: O tipo 'Rule6_CheckPriceLimit' deve condizer com o padrão '^[A-Z][a-zA-Z]+$'. [TypeName]
[ERROR] 078/bci/core/rules/Rule1_CheckDuplicateRequest.java:14:14: O tipo 'Rule1_CheckDuplicateRequest' deve condizer com o padrão '^[A-Z][a-zA-Z]+$'. [TypeName]
[ERROR] 078/bci/core/Creator.java:12:24: O atributo com o nome 'nextId'não está de acordo com o padrão '^_[a-z][a-zA-Z]*[0-9]?$'. [POAttributeName]
Total de erros:  21

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

Iniciando a auditoria...
[INFO] 078/bci/core/LibraryManager.java:123 ObjectOutputStream criado no método 'public void saveAs(String filename)' da classe 'LibraryManager'. [CheckSerialization]
[INFO] 078/bci/core/LibraryManager.java:133 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...
[ERROR] 078/bci/app/work/DoDisplayWork.java:55 Evite a utilização do operador instanceof dado que normalmente o seu uso indica uma má aplicação do paradigma de programação com objectos. [OpenClosePrinciple]
[ERROR] 078/bci/app/work/DoDisplayWork.java:62 Evite a utilização do operador instanceof dado que normalmente o seu uso indica uma má aplicação do paradigma de programação com objectos. [OpenClosePrinciple]
[ERROR] 078/bci/app/work/DoDisplayWork.java:64 Evite a utilização do operador instanceof dado que normalmente o seu uso indica uma má aplicação do paradigma de programação com objectos. [OpenClosePrinciple]
[ERROR] 078/bci/app/work/DoDisplayWorks.java:44 Evite a utilização do operador instanceof dado que normalmente o seu uso indica uma má aplicação do paradigma de programação com objectos. [OpenClosePrinciple]
[ERROR] 078/bci/app/work/DoDisplayWorks.java:53 Evite a utilização do operador instanceof dado que normalmente o seu uso indica uma má aplicação do paradigma de programação com objectos. [OpenClosePrinciple]
[ERROR] 078/bci/app/work/DoDisplayWorks.java:56 Evite a utilização do operador instanceof dado que normalmente o seu uso indica uma má aplicação do paradigma de programação com objectos. [OpenClosePrinciple]
[ERROR] 078/bci/app/work/DoDisplayWorksByCreator.java:58 Evite a utilização do operador instanceof dado que normalmente o seu uso indica uma má aplicação do paradigma de programação com objectos. [OpenClosePrinciple]
[ERROR] 078/bci/app/work/DoDisplayWorksByCreator.java:67 Evite a utilização do operador instanceof dado que normalmente o seu uso indica uma má aplicação do paradigma de programação com objectos. [OpenClosePrinciple]
[ERROR] 078/bci/app/work/DoDisplayWorksByCreator.java:70 Evite a utilização do operador instanceof dado que normalmente o seu uso indica uma má aplicação do paradigma de programação com objectos. [OpenClosePrinciple]
[ERROR] 078/bci/app/work/DoPerformSearch.java:45 Evite a utilização do operador instanceof dado que normalmente o seu uso indica uma má aplicação do paradigma de programação com objectos. [OpenClosePrinciple]
[ERROR] 078/bci/app/work/DoPerformSearch.java:52 Evite a utilização do operador instanceof dado que normalmente o seu uso indica uma má aplicação do paradigma de programação com objectos. [OpenClosePrinciple]
[ERROR] 078/bci/app/work/DoPerformSearch.java:54 Evite a utilização do operador instanceof dado que normalmente o seu uso indica uma má aplicação do paradigma de programação com objectos. [OpenClosePrinciple]
[WARN] 078/bci/core/Category.java:23 Possível mau desenho: diferenciação do comportamento com base em comparação de strings (expressão 's.toUpperCase()' comparada '4' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 078/bci/core/Library.java:600 Possível mau desenho: diferenciação do comportamento com base em comparação de strings (expressão 'current' comparada '4' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[ERROR] 078/bci/core/LibraryManager.java:135 Evite a utilização do operador instanceof dado que normalmente o seu uso indica uma má aplicação do paradigma de programação com objectos. [OpenClosePrinciple]
[WARN] 078/bci/core/TextImporter.java:41 Possível mau desenho: diferenciação do comportamento com base em comparação de strings (expressão 'type' comparada '4' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
[WARN] 078/bci/core/TextImporter.java:110 Possível mau desenho: diferenciação do comportamento com base em comparação de strings (expressão 's.toUpperCase()' comparada '4' vezes) e não com base no polimorfismo. [OpenClosePrinciple]
Auditoria completa.
O Checkstyle terminou com 13 erros.

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

Iniciando a auditoria...
[WARN] 078/bci/core/Library.java:14 import 'bci.app.exception.BorrowingRuleFailedException' não permitido na classe 'Library'. [POCoreImport]
[WARN] 078/bci/core/Library.java:15 import 'bci.app.exception.WorkNotBorrowedByUserException' não permitido na classe 'Library'. [POCoreImport]
[ERROR] 078/bci/core/Library.java:369 Classe 'BorrowingRuleFailedException', definida na camada de aplicação, não pode ser indicada na lista de excepções de um método de uma entidade do domínio. [POCoreImport]
[ERROR] 078/bci/core/Library.java:381 instanciação do tipo 'BorrowingRuleFailedException' não permitido em classes da camada de domínio. [POCoreImport]
[ERROR] 078/bci/core/Library.java:394 instanciação do tipo 'BorrowingRuleFailedException' não permitido em classes da camada de domínio. [POCoreImport]
[ERROR] 078/bci/core/Library.java:397 instanciação do tipo 'BorrowingRuleFailedException' não permitido em classes da camada de domínio. [POCoreImport]
[ERROR] 078/bci/core/Library.java:402 instanciação do tipo 'BorrowingRuleFailedException' não permitido em classes da camada de domínio. [POCoreImport]
[ERROR] 078/bci/core/Library.java:407 instanciação do tipo 'BorrowingRuleFailedException' não permitido em classes da camada de domínio. [POCoreImport]
[ERROR] 078/bci/core/Library.java:412 instanciação do tipo 'BorrowingRuleFailedException' não permitido em classes da camada de domínio. [POCoreImport]
[ERROR] 078/bci/core/Library.java:477 Classe 'WorkNotBorrowedByUserException', definida na camada de aplicação, não pode ser indicada na lista de excepções de um método de uma entidade do domínio. [POCoreImport]
[ERROR] 078/bci/core/Library.java:488 instanciação do tipo 'WorkNotBorrowedByUserException' não permitido em classes da camada de domínio. [POCoreImport]
[WARN] 078/bci/core/LibraryManager.java:3 import 'bci.app.exception.*' não permitido na classe 'LibraryManager'. [POCoreImport]
[ERROR] 078/bci/core/LibraryManager.java:53 Classe 'UserRegistrationFailedException', definida na camada de aplicação, não pode ser indicada na lista de excepções de um método de uma entidade do domínio. [POCoreImport]
[ERROR] 078/bci/core/LibraryManager.java:55 instanciação do tipo 'UserRegistrationFailedException' não permitido em classes da camada de domínio. [POCoreImport]
[ERROR] 078/bci/core/LibraryManager.java:77 Classe 'BorrowingRuleFailedException', definida na camada de aplicação, não pode ser indicada na lista de excepções de um método de uma entidade do domínio. [POCoreImport]
[ERROR] 078/bci/core/LibraryManager.java:99 Classe 'WorkNotBorrowedByUserException', definida na camada de aplicação, não pode ser indicada na lista de excepções de um método de uma entidade do domínio. [POCoreImport]
[WARN] 078/bci/core/rules/Rule1_CheckDuplicateRequest.java:7 import 'bci.app.exception.BorrowingRuleFailedException' não permitido na classe 'Rule1_CheckDuplicateRequest'. [POCoreImport]
[ERROR] 078/bci/core/rules/Rule1_CheckDuplicateRequest.java:21 Classe 'BorrowingRuleFailedException', definida na camada de aplicação, não pode ser indicada na lista de excepções de um método de uma entidade do domínio. [POCoreImport]
[ERROR] 078/bci/core/rules/Rule1_CheckDuplicateRequest.java:24 instanciação do tipo 'BorrowingRuleFailedException' não permitido em classes da camada de domínio. [POCoreImport]
[WARN] 078/bci/core/rules/Rule2_CheckUserActive.java:7 import 'bci.app.exception.BorrowingRuleFailedException' não permitido na classe 'Rule2_CheckUserActive'. [POCoreImport]
[ERROR] 078/bci/core/rules/Rule2_CheckUserActive.java:20 Classe 'BorrowingRuleFailedException', definida na camada de aplicação, não pode ser indicada na lista de excepções de um método de uma entidade do domínio. [POCoreImport]
[ERROR] 078/bci/core/rules/Rule2_CheckUserActive.java:26 instanciação do tipo 'BorrowingRuleFailedException' não permitido em classes da camada de domínio. [POCoreImport]
[ERROR] 078/bci/core/rules/Rule2_CheckUserActive.java:31 instanciação do tipo 'BorrowingRuleFailedException' não permitido em classes da camada de domínio. [POCoreImport]
[WARN] 078/bci/core/rules/Rule3_BorrowingRule.java:7 import 'bci.app.exception.BorrowingRuleFailedException' não permitido na classe 'Rule3_BorrowingRule'. [POCoreImport]
[ERROR] 078/bci/core/rules/Rule3_BorrowingRule.java:27 Classe 'BorrowingRuleFailedException', definida na camada de aplicação, não pode ser indicada na lista de excepções de um método de uma entidade do domínio. [POCoreImport]
[WARN] 078/bci/core/rules/Rule4_CheckRequestLimit.java:7 import 'bci.app.exception.BorrowingRuleFailedException' não permitido na classe 'Rule4_CheckRequestLimit'. [POCoreImport]
[ERROR] 078/bci/core/rules/Rule4_CheckRequestLimit.java:20 Classe 'BorrowingRuleFailedException', definida na camada de aplicação, não pode ser indicada na lista de excepções de um método de uma entidade do domínio. [POCoreImport]
[ERROR] 078/bci/core/rules/Rule4_CheckRequestLimit.java:23 instanciação do tipo 'BorrowingRuleFailedException' não permitido em classes da camada de domínio. [POCoreImport]
[WARN] 078/bci/core/rules/Rule5_CheckReferenceCategory.java:7 import 'bci.app.exception.BorrowingRuleFailedException' não permitido na classe 'Rule5_CheckReferenceCategory'. [POCoreImport]
[ERROR] 078/bci/core/rules/Rule5_CheckReferenceCategory.java:20 Classe 'BorrowingRuleFailedException', definida na camada de aplicação, não pode ser indicada na lista de excepções de um método de uma entidade do domínio. [POCoreImport]
[ERROR] 078/bci/core/rules/Rule5_CheckReferenceCategory.java:23 instanciação do tipo 'BorrowingRuleFailedException' não permitido em classes da camada de domínio. [POCoreImport]
[WARN] 078/bci/core/rules/Rule6_CheckPriceLimit.java:7 import 'bci.app.exception.BorrowingRuleFailedException' não permitido na classe 'Rule6_CheckPriceLimit'. [POCoreImport]
[ERROR] 078/bci/core/rules/Rule6_CheckPriceLimit.java:20 Classe 'BorrowingRuleFailedException', definida na camada de aplicação, não pode ser indicada na lista de excepções de um método de uma entidade do domínio. [POCoreImport]
[ERROR] 078/bci/core/rules/Rule6_CheckPriceLimit.java:23 instanciação do tipo 'BorrowingRuleFailedException' não permitido em classes da camada de domínio. [POCoreImport]
Auditoria completa.
O Checkstyle terminou com 25 erros.

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

Iniciando a auditoria...
[ERROR] 078/bci/core/Category.java:23 Membro estático 'public static Category fromString(String s)' não recomendável. [POStaticMember]
[ERROR] 078/bci/core/Creator.java:12 Membro estático 'int nextId' não recomendável. [POStaticMember]
[INFO] 078/bci/core/Library.java:64 Atributo estático final 'int FINE_PER_DAY' permitido. [POStaticMember]
[INFO] 078/bci/core/Library.java:66 Atributo estático final 'int FALTOSO_TO_NORMAL_LIMIT' permitido. [POStaticMember]
[INFO] 078/bci/core/Library.java:68 Atributo estático final 'int NORMAL_TO_CUMPRIDOR_LIMIT' permitido. [POStaticMember]
[INFO] 078/bci/core/Library.java:70 Atributo estático final 'int NORMAL_TO_FALTOSO_LIMIT' permitido. [POStaticMember]
[INFO] 078/bci/core/Library.java:76 Atributo estático final 'int RULE_ID_WORK_ALREADY_REQUESTED' permitido. [POStaticMember]
[INFO] 078/bci/core/Library.java:78 Atributo estático final 'int RULE_ID_USER_NOT_ACTIVE' permitido. [POStaticMember]
[INFO] 078/bci/core/Library.java:82 Atributo estático final 'int RULE_ID_REQUEST_LIMIT_REACHED' permitido. [POStaticMember]
[INFO] 078/bci/core/Library.java:84 Atributo estático final 'int RULE_ID_REFERENCE_WORK_NOT_ALLOWED' permitido. [POStaticMember]
[INFO] 078/bci/core/Library.java:86 Atributo estático final 'int RULE_ID_PRICE_LIMIT_EXCEEDED' permitido. [POStaticMember]
[INFO] 078/bci/core/exception/ImportFileException.java:7 Atributo estático final 'String ERROR_MESSAGE' permitido. [POStaticMember]
[INFO] 078/bci/core/rules/Rule1_CheckDuplicateRequest.java:17 Atributo estático final 'int RULE_ID' permitido. [POStaticMember]
[INFO] 078/bci/core/rules/Rule2_CheckUserActive.java:16 Atributo estático final 'int RULE_ID' permitido. [POStaticMember]
[INFO] 078/bci/core/rules/Rule4_CheckRequestLimit.java:16 Atributo estático final 'int RULE_ID' permitido. [POStaticMember]
[INFO] 078/bci/core/rules/Rule5_CheckReferenceCategory.java:16 Atributo estático final 'int RULE_ID' permitido. [POStaticMember]
[INFO] 078/bci/core/rules/Rule6_CheckPriceLimit.java:16 Atributo estático final 'int RULE_ID' permitido. [POStaticMember]
[INFO] O número de serialVersionUID atributos estáticos definidos nas várias classes foi '28'. [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

Iniciando a auditoria...
[WARN] Possível erro: A classe 'Work' utilizada no atributo 'private Map<Work, List<User>> _notificationInterests' da classe 'Library' não substitui os métodos hashCode e equals. [WriteClassStructure]
[WARN] Possível erro: A classe 'Work' utilizada no atributo 'private Map<Work, List<User>> _borrowingNotificationInterests' da classe 'Library' não substitui os métodos hashCode e equals. [WriteClassStructure]
[WARN] Possível erro: A classe 'User' utilizada no atributo 'private Map<User, List<Notification>> _userNotifications' 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: 2, dos quais 0 private, 0 package-private, 0 protected e 2 public. [WriteClassStructure]
[INFO] Interfaces definidos no package core da aplicação (2): '[UserClassification, Rule3_BorrowingRule]'. [WriteClassStructure]
[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, UserBehavior]'. [WriteClassStructure]
[INFO] Número total de classes definidos no core: 23, dos quais 0 private, 0 package-private, 0 protected e 23 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 (18): '[User, Request, Rule5_CheckReferenceCategory, Rule1_CheckDuplicateRequest, Creator, NormalClassification, FaltosoClassification, Notification, Date, Dvd, Book, Rule4_CheckRequestLimit, Rule2_CheckUserActive, LibraryManager, Library, CumpridorClassification, Rule6_CheckPriceLimit, TextImporter]'. [WriteClassStructure]
[INFO] Excepções definidas no package core da aplicação (4): '[MissingFileAssociationException, UnavailableFileException, ImportFileException, UnrecognizedEntryException]'. [WriteClassStructure]
[INFO] Número total de métodos nas classes do core (sem excepções): 146, dos quais 12 private, 1 package-private, 6 protected e 127 public. [WriteClassStructure]
[INFO] Número total de atributos nas classes do core (sem excepções): 59, dos quais 53 private, 0 package-private, 6 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 displayName

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

    public String toString()
    public static Category fromString(String s)

 [WriteClassStructure]
[INFO] enum UserBehavior ( public )

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

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

    int getRequestLimit()
    int getLoanDuration(Work work)
    boolean isPriceLimitApplied()
    String getComportamento()

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

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

    void check(User user, Work work, List userActiveRequests, Date currentDate)

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

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

    private final int id
    private final String name
    private final String email
    private int multa
    private UserClassification classification
    private boolean _isSuspenso
    private int onTimeReturnsCount
    private int lateReturnsCount

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

    public int getId()
    public String getName()
    public String getEmail()
    public int getMulta()
    public void setMulta(int multa)
    public void addMulta(int amount)
    public void setClassification(UserClassification c)
    public void setSuspenso(boolean isSuspenso)
    public UserClassification getClassification()
    public int getOnTimeReturnsCount()
    public void recordOnTimeReturn()
    public int getLateReturnsCount()
    public void recordLateReturn()
    public String getComportamento()
    public String getEstado()
    public boolean canRequest()
    public int getRequestLimit()
    public boolean isPriceLimitApplied()
    public int getLoanDuration(Work work)
    public String toString()

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

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

    private final User _user
    private final Work _work
    private final Date _requestDate
    private final Date _returnDate
    private Boolean _wasReturnedOnTime

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

    public User getUser()
    public Work getWork()
    public Date getReturnDate()
    public Date getRequestDate()
    public boolean isReturned()
    public Boolean wasReturnedOnTime()
    public void markAsReturned(Date currentDate)
    public boolean isOverdue(Date currentDate)
    public String toString()

 [WriteClassStructure]
[INFO] class Rule5_CheckReferenceCategory ( public implements Rule3_BorrowingRule )

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

    private final static int RULE_ID

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

    public void check(User user, Work work, List userActiveRequests, Date currentDate)

 [WriteClassStructure]
[INFO] class Rule1_CheckDuplicateRequest ( public implements Rule3_BorrowingRule )

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

    private final static int RULE_ID

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

    public void check(User user, Work work, List userActiveRequests, Date currentDate)

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

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

    private static int nextId
    private final int _id
    private String _name
    private List<Work> _works

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

    public int getId()
    public void add(Work work)
    public void remove(Work work)
    public Collection<Work> works()
    public String getName()

 [WriteClassStructure]
[INFO] class NormalClassification ( public implements UserClassification )

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

    public int getRequestLimit()
    public int getLoanDuration(Work work)
    public boolean isPriceLimitApplied()
    public String getComportamento()

 [WriteClassStructure]
[INFO] class FaltosoClassification ( public implements UserClassification )

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

    public int getRequestLimit()
    public int getLoanDuration(Work work)
    public boolean isPriceLimitApplied()
    public String getComportamento()

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

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

    private String _message

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

    public String toString()

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

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

    private int _currentDate

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

    public int getCurrentDate()
    public int diff(Date other)
    public void advanceDays(int nDays)
    public String toString()

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

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

    private String _director
    private String _igac

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

    public String getDirector()
    public String getIgac()
    protected String getType()
    protected String getSpecificDetailsString()
    public List<String> getCreatorNames()
    public List<String> getSearchableCreatorTerms()

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

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

    private List<String> _authors
    private String _isbn

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

    public List<String> getAuthors()
    public String getIsbn()
    protected String getType()
    protected String getSpecificDetailsString()
    public List<String> getCreatorNames()
    public List<String> getSearchableCreatorTerms()

 [WriteClassStructure]
[INFO] class Rule4_CheckRequestLimit ( public implements Rule3_BorrowingRule )

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

    private final static int RULE_ID

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

    public void check(User user, Work work, List userActiveRequests, Date currentDate)

 [WriteClassStructure]
[INFO] class Rule2_CheckUserActive ( public implements Rule3_BorrowingRule )

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

    private final static int RULE_ID

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

    public void check(User user, Work work, List userActiveRequests, Date currentDate)

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

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

    protected int _id
    protected int _price
    protected int _numberOfCopies
    protected int _availableCopies
    protected String _title
    protected Category _category

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

    public int getId()
    public String getTitle()
    public int getPrice()
    public int getNumberOfCopies()
    public void setNumberOfCopies(int n)
    public int getAvailableCopies()
    public void setAvailableCopies(int n)
    public Category getCategory()
    protected abstract String getType()
    protected abstract String getSpecificDetailsString()
    public abstract List<String> getCreatorNames()
    public abstract List<String> getSearchableCreatorTerms()
    public String toString()
    public String toNotificationString()

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

   Method getType() overriden in subclass(es) Dvd Book 
   Method getSpecificDetailsString() overriden in subclass(es) Dvd Book 
   Method getCreatorNames() overriden in subclass(es) Dvd Book 
   Method getSearchableCreatorTerms() overriden in subclass(es) Dvd Book 
 [WriteClassStructure]
[INFO] class LibraryManager ( public )

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

    private String _filename
    private Library _library

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

    public Work getWork(int id)
    public List<Work> getWorks()
    public void addWork(Work w, List creatorNames)
    public void removeWork(Work work)
    public List<Work> searchWorks(String term)
    public Creator getCreator(int id)
    public Creator getCreatorByName(String name)
    public int createUser(String userName, String email)
    public User getUser(int id)
    public List<User> getUsers()
    public List<Notification> getUserNotifications(int userId)
    public Date getCurrentDate()
    public void advanceDays(int nDays)
    public Request requestWork(User user, Work work)
    public void registerNotificationInterest(User user, Work work)
    public void registerBorrowingInterest(User user, Work work)
    public void returnWork(User user, Work work)
    public void payFines(User user)
    public boolean isModified()
    public String getFilename()
    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 int _nextWorkId
    private int _nextUserId
    private int _nextCreatorId
    private boolean _modified
    private Date _date
    private Map<Integer, User> users
    private Map<Integer, Work> works
    private Map<Integer, Creator> _creators
    private Map<String, Creator> _creatorsByName
    private List<Request> _requests
    private Map<Work, List<User>> _notificationInterests
    private Map<Work, List<User>> _borrowingNotificationInterests
    private Map<User, List<Notification>> _userNotifications
    private final static int FINE_PER_DAY
    private final static int FALTOSO_TO_NORMAL_LIMIT
    private final static int NORMAL_TO_CUMPRIDOR_LIMIT
    private final static int NORMAL_TO_FALTOSO_LIMIT
    private final static int RULE_ID_WORK_ALREADY_REQUESTED
    private final static int RULE_ID_USER_NOT_ACTIVE
    private final static int RULE_ID_REQUEST_LIMIT_REACHED
    private final static int RULE_ID_REFERENCE_WORK_NOT_ALLOWED
    private final static int RULE_ID_PRICE_LIMIT_EXCEEDED

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

    public int nextWorkId()
    public int nextUserId()
    public int nextCreatorId()
    public Date getCurrentDate()
    public void advanceDays(int nDays)
    public User createUser(String userName, String email)
    public User getUser(int id)
    public List<User> getUsers()
    public void addWork(Work w, List creatorNames)
    public void removeWork(Work work)
    private void removeCreator(Creator creator)
    public List<Work> searchWorks(String term)
    public Work getWork(int id)
    public List<Work> getWorks()
    public Creator createCreator(String name)
    public Creator getCreator(int id)
    public Creator getCreatorByName(String name)
    public void registerNotificationInterest(User user, Work work)
    public void registerBorrowingInterest(User user, Work work)
    public List<Notification> getUserNotifications(int userId)
    public Request requestWork(User user, Work work)
    private Request createRequest(User user, Work work, int duration)
    public void returnWork(User user, Work work)
    public void returnRequest(Request req)
    public void payFines(User user)
    private boolean hasOverdueRequests(User user)
    private void updateUserSuspensionStatus(User user)
    private void checkAndReactivateUser(User user)
    private void applyClassificationTransition(User user, boolean onTime)
    private void notifyWaitingUsers(Work work)
    public List<Request> getRequests()
    public boolean isModified()
    public void clearModified()
    void importFile(String filename)

 [WriteClassStructure]
[INFO] class CumpridorClassification ( public implements UserClassification )

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

    public int getRequestLimit()
    public int getLoanDuration(Work work)
    public boolean isPriceLimitApplied()
    public String getComportamento()

 [WriteClassStructure]
[INFO] class Rule6_CheckPriceLimit ( public implements Rule3_BorrowingRule )

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

    private final static int RULE_ID

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

    public void check(User user, Work work, List userActiveRequests, Date currentDate)

 [WriteClassStructure]
[INFO] class TextImporter ( public )

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

    private final Library _library

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

    public void importFile(String filename)
    private void processLine(String line)
    private void createUser(String tokens)
    private void createBook(String tokens)
    private void createDvd(String tokens)
    private Category parseCategory(String s)

 [WriteClassStructure]
Auditoria completa.
