diff --git a/grails-app/conf/BuildConfig.groovy b/grails-app/conf/BuildConfig.groovy index 42066943..630928ec 100644 --- a/grails-app/conf/BuildConfig.groovy +++ b/grails-app/conf/BuildConfig.groovy @@ -28,7 +28,7 @@ grails.project.dependency.resolution = { grailsHome() grailsCentral() mavenCentral() - + //mavenRepo "http://repo.grails.org/grails/plugins" // uncomment these to enable remote dependency resolution from public Maven repositories //mavenCentral() //mavenLocal() @@ -46,7 +46,7 @@ grails.project.dependency.resolution = { compile('lib:itext-pdfa:5.4.0') compile('lib:itext-xtra:5.4.0') compile('lib:twitter4j-core:4.0.1') - + //compile('commons-codec:commons-codec:1.6') compile(group: 'org.apache.poi', name: 'poi', version: '3.7') { excludes 'xmlbeans' } diff --git a/grails-app/controllers/rgms/member/ResearchGroupController.groovy b/grails-app/controllers/rgms/member/ResearchGroupController.groovy index c894c14f..6ffcfe65 100644 --- a/grails-app/controllers/rgms/member/ResearchGroupController.groovy +++ b/grails-app/controllers/rgms/member/ResearchGroupController.groovy @@ -46,6 +46,10 @@ class ResearchGroupController { def save() { def researchGroupInstance = new ResearchGroup(params) + + /* Checando Caracteres Não Permitidos Nos Nomes*/ + allowedChar(researchGroupInstance) + //#if($researchGroupHierarchy) try { validarChildOf(researchGroupInstance, researchGroupInstance.getChildOf()) @@ -266,4 +270,34 @@ class ResearchGroupController { researchGroupInstance.save() redirect(action: "show", id: researchGroupInstance.id) } + + def allowedChar(researchGroupInstance) { + def caracteres = ['#','%','*','@','!','$','¨','(',')','-','='] + + boolean pesquisa + pesquisa = false + + /* Procurando Caracteres não permitidos */ + for (x in caracteres){ + for (y in researchGroupInstance.name){ + if(x == y) + pesquisa = true; + } + + for (y in researchGroupInstance.twitter){ + if(x == y) + pesquisa = true; + } + + for (y in researchGroupInstance.sigla){ + if(x == y) + pesquisa = true; + } + } /* Fim for */ + + /* Checando se foi achado caracteres não permitidos */ + if (pesquisa){ + throw new RuntimeException("Não é possível registrar um grupo com Caracteres Especiais!") + } + } /* Fim allowedChar method*/ } diff --git a/grails-app/controllers/rgms/publication/AuxiliarController.groovy b/grails-app/controllers/rgms/publication/AuxiliarController.groovy index d73dd3a4..fc04d054 100644 --- a/grails-app/controllers/rgms/publication/AuxiliarController.groovy +++ b/grails-app/controllers/rgms/publication/AuxiliarController.groovy @@ -29,5 +29,26 @@ class AuxiliarController { } } } + + def deleteMultiples(Object id1, Publication publicationInstance1, String label, String classe, Object id2, Publication publicationInstance2 ) { + boolean isReturned1 = check(id1, publicationInstance1, label, classe); + boolean isReturned2 = check(id2, publicationInstance2, label, classe); + if(!(isReturned1 && isReturned2)) { + try { + publicationInstance1.removeFromPublications() + publicationInstance2.removeFromPublications() + publicationInstance1.delete(flush: true) + publicationInstance2.delete(flush: true) + flash.message1 = message(code: 'default.deleted.message', args: [message(code: label, default: classe), id1]) + flash.message2 = message(code: 'default.deleted.message', args: [message(code: label, default: classe), id2]) + redirect(action: "list") + } + catch (DataIntegrityViolationException e) { + flash.message1 = message(code: 'default.not.deleted.message', args: [message(code: label, default: classe), id1]) + flash.message2 = message(code: 'default.not.deleted.message', args: [message(code: label, default: classe), id2]) + redirect(action: "show", id: id) + } + } + } } diff --git a/grails-app/controllers/rgms/publication/BibTexMainMenuController.groovy b/grails-app/controllers/rgms/publication/BibTexMainMenuController.groovy new file mode 100644 index 00000000..895c2db6 --- /dev/null +++ b/grails-app/controllers/rgms/publication/BibTexMainMenuController.groovy @@ -0,0 +1,15 @@ +package rgms.publication + +/** + * Created by Luís Delgado on 02/05/15. + */ +class BibTexMainMenuController { + + def index() { + + } + + def list = { + } + +} diff --git a/grails-app/controllers/rgms/publication/BibtexGenerateFileController.groovy b/grails-app/controllers/rgms/publication/BibtexGenerateFileController.groovy index 07b6e6b7..27112a26 100644 --- a/grails-app/controllers/rgms/publication/BibtexGenerateFileController.groovy +++ b/grails-app/controllers/rgms/publication/BibtexGenerateFileController.groovy @@ -1,9 +1,11 @@ package rgms.publication +import cucumber.runtime.PendingException import rgms.authentication.User import rgms.member.Member import rgms.member.Membership import rgms.member.ResearchGroup +import rgms.publication.Periodico /** * Created with IntelliJ IDEA. @@ -32,7 +34,9 @@ class BibtexGenerateFileController { else userMemberList.add([member:i]) } - [researchGroupInstanceList: ResearchGroup.list(params), researchGroupInstanceTotal: ResearchGroup.count(), userMemberInstance: userMemberList, userMemberInstanceTotal: userMemberList.size() ] + [researchGroupInstanceList: ResearchGroup.list(params), researchGroupInstanceTotal: ResearchGroup.count(), + userMemberInstance: userMemberList, userMemberInstanceTotal: userMemberList.size(), + periodicoInstanceList: Periodico.list(params), periodicoInstanceTotal: Periodico.count()] } def generateBibTex = { @@ -71,4 +75,20 @@ class BibtexGenerateFileController { render(bibtex) } + def generateBibtexPeriodico = { + long articleId = (params.id).toLong() + + String bibtex = generateBibtexArticle(articleId) + + render (bibtex) + } + + def generateBibtexArticle (long articleId) { + String bibtex = "" + def periodico = Periodico.findById(articleId) + bibtex = bibtex + periodico.generateBib() + + return bibtex + } + } diff --git a/grails-app/controllers/rgms/publication/BookController.groovy b/grails-app/controllers/rgms/publication/BookController.groovy index eab9da7a..3e2dd79b 100644 --- a/grails-app/controllers/rgms/publication/BookController.groovy +++ b/grails-app/controllers/rgms/publication/BookController.groovy @@ -93,4 +93,19 @@ class BookController { def bookInstance = Book.get(id) aux.delete(id, bookInstance, 'book.label', 'Book'); } + + def List filterByAuthor(Integer max, String authorName) { + def List book = new ArrayList<>() + params.max = Math.min(max ?: 10, 100) + if (params["authors"] == authorName) { + book << [bookInstanceList: Book.list(params)] + } + return book + } + + def deleteMultiples(Long id1, Long id2) { + def bookInstance1 = Book.get(id1) + def bookInstance2 = Book.get(id2) + aux.deleteMultiples(id1, bookInstance1, 'book.label', 'Book', id2, bookInstance2); + } } diff --git a/grails-app/controllers/rgms/publication/XMLController.groovy b/grails-app/controllers/rgms/publication/XMLController.groovy index 62fb08ad..40c13999 100644 --- a/grails-app/controllers/rgms/publication/XMLController.groovy +++ b/grails-app/controllers/rgms/publication/XMLController.groovy @@ -14,12 +14,15 @@ import rgms.member.Member */ class XMLController { + static int similarityTolerance = 0 + def home() {} def upload() { + setSimilarityTolerance(Integer.parseInt(params.tolerance)) String flashMessage = 'Publications imported!' String controller = "Publication" - if (!XMLService.Import(savePublication, returnWithMessage, flashMessage, controller, request)) + if (!XMLService.Import(savePublication, returnWithMessage, flashMessage, controller, request, similarityTolerance)) return } @@ -95,6 +98,31 @@ class XMLController { XMLService.createDissertations(xmlFile) } + private Closure saveDissertationsWithSimilarityAnalisys = { + Node xmlFile -> + XMLService.createDissertationsWithSimilarityAnalysis(xmlFile, similarityTolerance) + } + + private Closure saveOrientationsWithSimilarityAnalisys = { + Node xmlFile -> + XMLService.createOrientationsWithSimilarityAnalysis(xmlFile, similarityTolerance) + } + + def boolean verifyDissertations(String title, Node xmlFile) + { + return XMLService.verifyDissertations(title, xmlFile) + } + + def boolean verifyOrientations(String title, Node xmlFile) + { + return XMLService.verifyOrientations(title, xmlFile) + } + + def boolean verifyJournals(String title, Node xmlFile) + { + return XMLService.verifyJournals(title, xmlFile) + } + def enviarConferenciaXML() { String flashMessage = message(code: 'default.importedMsg.message') @@ -133,6 +161,11 @@ class XMLController { XMLService.createJournals(xmlFile) } + private Closure saveJournalsWithSimilarityAnalysis = { + Node xmlFile -> + XMLService.createJournalsWithSimilarityAnalysis(xmlFile,similarityTolerance) + } + def uploadMemberXML() { String flashMessage = 'XML data extracted. Complete the remaining fields' @@ -163,4 +196,16 @@ class XMLController { User user = User.findByUsername(SecurityUtils.getSubject()?.getPrincipal().toString()) return user?.author } + + def setSimilarityTolerance(int value) + { + similarityTolerance = value; + } + + int getSimilarityToleranec() + { + return similarityTolerance; + } + + } diff --git a/grails-app/controllers/rgms/tool/Levenshtein.groovy b/grails-app/controllers/rgms/tool/Levenshtein.groovy new file mode 100644 index 00000000..d282299f --- /dev/null +++ b/grails-app/controllers/rgms/tool/Levenshtein.groovy @@ -0,0 +1,17 @@ +package rgms.tool + +class Levenshtein { + def static int distance(String str1, String str2) { + def str1_len = str1.length() + def str2_len = str2.length() + int[][] distance = new int[str1_len + 1][str2_len + 1] + (str1_len + 1).times { distance[it][0] = it } + (str2_len + 1).times { distance[0][it] = it } + (1..str1_len).each { i -> + (1..str2_len).each { j -> + distance[i][j] = [distance[i-1][j]+1, distance[i][j-1]+1, str1[i-1]==str2[j-1]?distance[i-1][j-1]:distance[i-1][j-1]+1].min() + } + } + distance[str1_len][str2_len] + } +} \ No newline at end of file diff --git a/grails-app/controllers/rgms/tool/TwitterTool.groovy b/grails-app/controllers/rgms/tool/TwitterTool.groovy index 9e0b965d..243f9047 100644 --- a/grails-app/controllers/rgms/tool/TwitterTool.groovy +++ b/grails-app/controllers/rgms/tool/TwitterTool.groovy @@ -42,4 +42,15 @@ public class TwitterTool{ twitterFound?.status != 0 } + static public boolean consultForBook(String bookName) { + println "consult="+bookName + def twitterFound = twittersHistory.find { bookNameTwitter -> + bookNameTwitter.bookName == bookName + } + if (twitterFound != null){ + return false + } + twitterFound?.status != 0 + } + } \ No newline at end of file diff --git a/grails-app/domain/rgms/member/ResearchGroup.groovy b/grails-app/domain/rgms/member/ResearchGroup.groovy index c942cf1a..aca68be2 100644 --- a/grails-app/domain/rgms/member/ResearchGroup.groovy +++ b/grails-app/domain/rgms/member/ResearchGroup.groovy @@ -7,6 +7,7 @@ class ResearchGroup { String name String description String twitter + String sigla //#if($researchGroupHierarchy) ResearchGroup childOf; @@ -15,9 +16,10 @@ class ResearchGroup { static hasMany = [memberships: Membership, news: News] static constraints = { - name(maxSize: 10, blank: false, unique: true) + name(maxSize: 15, blank: false, unique: true) description(maxSize: 1000, blank: false) twitter(nullable: true) + sigla(maxSize: 10, blank: true, unique: true) //#if($researchGroupHierarchy) childOf(nullable: true, blank: true) diff --git a/grails-app/domain/rgms/publication/BibTexMainMenu.groovy b/grails-app/domain/rgms/publication/BibTexMainMenu.groovy new file mode 100644 index 00000000..4a7cdd46 --- /dev/null +++ b/grails-app/domain/rgms/publication/BibTexMainMenu.groovy @@ -0,0 +1,11 @@ +package rgms.publication + +/** + * Created by Luís Delgado on 02/05/15. + */ +class BibTexMainMenu { + + static constraints = { + } + +} \ No newline at end of file diff --git a/grails-app/domain/rgms/publication/BibtexAux.groovy b/grails-app/domain/rgms/publication/BibtexAux.groovy index 13a21d2d..dade96b3 100644 --- a/grails-app/domain/rgms/publication/BibtexAux.groovy +++ b/grails-app/domain/rgms/publication/BibtexAux.groovy @@ -8,8 +8,15 @@ class BibtexAux { static String organizeAuthors(Set members) { def returning = "" - for (Member member : members) { - returning = returning + member.name + " and " + int count = 0; + for (Member member : members.iterator()) { + returning = returning + member.name + count = count + 1 + + /* Tomando cuidado para não adicionar um and depois do último autor*/ + if (count < members.size()) { + returning = returning + " and " + } } return returning.substring(0, returning.length()) } diff --git a/grails-app/domain/rgms/publication/BibtexGenerateFile.groovy b/grails-app/domain/rgms/publication/BibtexGenerateFile.groovy index 33bb6d26..d8427c3a 100644 --- a/grails-app/domain/rgms/publication/BibtexGenerateFile.groovy +++ b/grails-app/domain/rgms/publication/BibtexGenerateFile.groovy @@ -1,5 +1,6 @@ package rgms.publication +import cucumber.runtime.PendingException import rgms.member.Member /** @@ -31,4 +32,5 @@ class BibtexGenerateFile { } return publicationsFiltered } + } diff --git a/grails-app/i18n/messages.properties b/grails-app/i18n/messages.properties index 05c696f1..69d066e1 100644 --- a/grails-app/i18n/messages.properties +++ b/grails-app/i18n/messages.properties @@ -168,6 +168,9 @@ orientation.same.members=Um membro nao pode orientar a si mesmo default.xml.parserror.message=No file uploaded or it wasn't a valid XML default.xml.structure.message=The XML struct doesn't comply with Lattes default.xml.unknownerror.message=An unknown error occurred. Contact the administrator +default.xml.similar.dissertation.message = The file was not imported because there is a dissertation with a similar title registered +default.xml.similar.orientation.message = The file was not imported because there is a orientation with a similar title registered +default.xml.similar.journal.message = The file was not imported because there is a journal with a similar title registered xml.label=XMLImport file.already.exist.message=A file has already been saved with the same name diff --git a/grails-app/i18n/messages_pt_BR.properties b/grails-app/i18n/messages_pt_BR.properties index 6d3cc59d..3d6e1fc0 100644 --- a/grails-app/i18n/messages_pt_BR.properties +++ b/grails-app/i18n/messages_pt_BR.properties @@ -176,6 +176,9 @@ tese.month.label=Mês tese.arquivo.label=Arquivo tese.label=Tese tese.duplicatetitle.failure = Tese não cadastrada porque já existe uma tese com o mesmo título +default.xml.similar.dissertation.message = O arquivo não foi importado porque existe uma dissertação com um título semelhante registrada +default.xml.similar.orientation.message = O arquivo não foi importado porque existe uma orientação com um título semelhante registrada +default.xml.similar.journal.message = O arquivo não foi importado porque existe um periódico com um título semelhante registrado #end #if($news) diff --git a/grails-app/services/rgms/XMLService.groovy b/grails-app/services/rgms/XMLService.groovy index 107c729b..549e8a1b 100644 --- a/grails-app/services/rgms/XMLService.groovy +++ b/grails-app/services/rgms/XMLService.groovy @@ -3,10 +3,14 @@ package rgms import org.springframework.web.multipart.MultipartHttpServletRequest import org.springframework.web.multipart.commons.CommonsMultipartFile import rgms.member.Member +import rgms.member.MemberController import rgms.member.Orientation +import rgms.member.OrientationController import rgms.publication.* import rgms.researchProject.Funder import rgms.researchProject.ResearchProject +import rgms.tool.Levenshtein + class XMLService { @@ -14,14 +18,38 @@ class XMLService { saveEntity - closure que salva a classe de domínio que está usando a importação */ + static final int MAX_TOLERANCE_LEVEL = 10; + static boolean Import(Closure saveEntity, Closure returnWithMessage, String flashMessage, String controller, - javax.servlet.http.HttpServletRequest request) { + javax.servlet.http.HttpServletRequest request, int similarityTolerance) { boolean errorFound = false try { Node xmlFile = parseReceivedFile(request) - saveEntity(xmlFile) + def result = checkExistenceWithSimilarityAnalysis(xmlFile, similarityTolerance) + if(!result.status) + { + saveEntity(xmlFile) + } + else + { + if(result.type == "Dissertation") + { + flashMessage = 'default.xml.similar.dissertation.message' + } + else if(result.type == "Orientation") + { + flashMessage = 'default.xml.similar.orientation.message' + } + else if(result.type == "Journal") + { + flashMessage = 'default.xml.similar.journal.message' + } + + + errorFound = true + } } //If file is not XML or if no file was uploaded catch (SAXParseException) { @@ -282,6 +310,174 @@ class XMLService { createDissertation(doutorado) } + static void createDissertationsWithSimilarityAnalysis(Node xmlFile, int toleranceLevel) { + + List dissertations = Dissertacao.findAll(); + + Node dadosGerais = (Node) xmlFile.children()[0] + Node formacaoAcademica = getNodeFromNode(dadosGerais, "FORMACAO-ACADEMICA-TITULACAO") + Node mestrado = (Node) formacaoAcademica.children()[1] + Node doutorado = (Node) formacaoAcademica.children()[2] + + String dissertacaoMestrado = getAttributeValueFromNode(mestrado, "TITULO-DA-DISSERTACAO-TESE") + + String dissertacaoDoutorado = getAttributeValueFromNode(doutorado, "TITULO-DA-DISSERTACAO-TESE") + + boolean mestradoOK = true + boolean doutoradoOK = true + + for (int i = 0; i < dissertations.size(); i++) + { + String current = dissertations[i] + int distanciaMestrado = Levenshtein.distance(current, dissertacaoMestrado) + if (( distanciaMestrado> toleranceLevel) && distanciaMestrado <= MAX_TOLERANCE_LEVEL) + { + mestradoOK = false + + } + + int distanciaDoutorado = Levenshtein.distance(current, dissertacaoDoutorado) + if(distanciaDoutorado > toleranceLevel && distanciaDoutorado <=MAX_TOLERANCE_LEVEL) + { + doutoradoOK = false + + } + } + + if(mestradoOK) + { + createDissertation(mestrado) + } + + if(doutoradoOK) + { + createDissertation(doutorado) + } + + } + + static void createOrientationsWithSimilarityAnalysis(Node xmlFile, int toleranceLevel) { + + Node outraProducao = (Node) xmlFile.children()[3] + List orientations = Orientation.findAll(); + Node orientacoesConcluidas = (Node) getNodeFromNode(outraProducao, "ORIENTACOES-CONCLUIDAS") + + + for (int i = 0; i < orientacoesConcluidas.children().size(); i++) + { + boolean result = true; + String title = "" + + for (int h = 0; h < orientations.size(); h++) + { + String current = orientations[h].tituloTese + Node currentInXML = (Node) orientacoesConcluidas.children()[i] + Node infoCurrentInXML = (Node) currentInXML.children()[0] + String titleCurrentInXML = getAttributeValueFromNode(infoCurrentInXML, "TITULO") + title = titleCurrentInXML + + int distance = Levenshtein.distance(current, titleCurrentInXML ) + + if ( distance> toleranceLevel && distance <= MAX_TOLERANCE_LEVEL) + { + result = false + } + } + + if(result) + { + def members = [[name: "Rodolfo", username: "usernametest", email: "rodolfofake@gmail.com", status: "Graduate Student", university: "UFPE", enabled: true]] + def memberCreater = new Member(members[0]) + def cont = new OrientationController() + memberCreater.create() + memberCreater.save() + def member = Member.findByName(memberCreater.name) + + cont.params << [tipo: "Mestrado", orientando: "Tomaz", tituloTese: title, anoPublicacao: 2013, instituicao: "UFPE", orientador: member] + cont.request.setContent(new byte[1000]) // Could also vary the request content. + cont.create() + cont.save() + cont.response.reset() + + //createOrientations(xmlFile, memberCreater) + } + + + } + + + + } + + static void createJournalsWithSimilarityAnalysis(Node xmlFile, int toleranceLevel) { + + List periodicos = Periodico.findAll(); + + Node producaoBibliografica = (Node) xmlFile.children()[1] + Node artigosPublicados = (Node) producaoBibliografica.children()[1] + + + for (int i = 0; i < artigosPublicados.children().size(); i++) + { + boolean result = true; + + Node currentInXML = (Node) artigosPublicados.children()[i] + Node infoCurrentInXML = (Node) currentInXML.children()[0] + String titleCurrentInXML = getAttributeValueFromNode(infoCurrentInXML, "TITULO-DO-ARTIGO") + + for (int h = 0; h < periodicos.size(); h++) + { + + String current = periodicos[h].title + + int distance = Levenshtein.distance(current, titleCurrentInXML ) + + if ( distance> toleranceLevel && distance <= MAX_TOLERANCE_LEVEL) + { + result = false + } + } + + if(result) + { + def cont = new PeriodicoController() + + Node detailsCurrentInXML = (Node) currentInXML.children()[1] + + def journal = getAttributeValueFromNode(detailsCurrentInXML, "TITULO-DO-PERIODICO-OU-REVISTA") + + def volume = getAttributeValueFromNode(detailsCurrentInXML, "VOLUME") + + def number = getAttributeValueFromNode(detailsCurrentInXML, "FASCICULO") + + def pages = ""+getAttributeValueFromNode(detailsCurrentInXML, "PAGINA-INICIAL") +"-"+ getAttributeValueFromNode(detailsCurrentInXML, "PAGINA-FINAL") + + def title = titleCurrentInXML + + def file = title + ".pdf" + + def publicationDate = new Date("1 January "+getAttributeValueFromNode(infoCurrentInXML, "ANO-DO-ARTIGO")) + + cont.params << [journal: journal, volume: volume, number: number, pages: pages, + title: title,publicationDate: publicationDate, file: file] + + + cont.request.setContent(new byte[1000]) + cont.create() + cont.save() + cont.response.reset() + + + + } + + + } + + + + } + private static void createDissertation(Node xmlNode) { Dissertacao newDissertation = new Dissertacao() newDissertation.title = getAttributeValueFromNode(xmlNode, "TITULO-DA-DISSERTACAO-TESE") @@ -293,6 +489,218 @@ class XMLService { newDissertation.save(flush: false) } + static def checkExistenceWithSimilarityAnalysis(Node xmlFile, int toleranceLevel) + { + def finalResult = [status: false, type:""]; + + def res = checkDissertationExistenceWithSimilarityAnalysis(xmlFile,toleranceLevel) + if(res.status) + { + finalResult = res; + } + else + { + res = checkOrientationExistenceWithSimilarityAnalysis(xmlFile,toleranceLevel) + if(res.status) + { + finalResult = res; + } + else + { + finalResult = checkJournalExistenceWithSimilarityAnalysis(xmlFile,toleranceLevel) + } + + } + + return finalResult + + } + + @SuppressWarnings(["GroovyBreak", "GroovyBreak", "GroovyBreak", "GroovyBreak"]) + static def checkDissertationExistenceWithSimilarityAnalysis(Node xmlFile, int toleranceLevel) + { + def result = [status: false, type:""] + + Node dadosGerais = (Node) xmlFile.children()[0] + List dissertations = Dissertacao.findAll(); + Node formacaoAcademica = getNodeFromNode(dadosGerais, "FORMACAO-ACADEMICA-TITULACAO") + Node mestrado = (Node) formacaoAcademica.children()[1] + Node doutorado = (Node) formacaoAcademica.children()[2] + + String dissertacaoMestrado = getAttributeValueFromNode(mestrado, "TITULO-DA-DISSERTACAO-TESE") + + String dissertacaoDoutorado = getAttributeValueFromNode(doutorado, "TITULO-DA-DISSERTACAO-TESE") + + + for (int i = 0; i < dissertations.size(); i++) + { + + String current = dissertations[i] + + int distance1 = Levenshtein.distance(current, dissertacaoMestrado) + int distance2 = Levenshtein.distance(current, dissertacaoDoutorado) + if ((distance1 > toleranceLevel && distance1 <= MAX_TOLERANCE_LEVEL) || distance2 > toleranceLevel && distance2 <= MAX_TOLERANCE_LEVEL) + { + result.status = true + result.type = "Dissertation" + break; + } + } + return result + } + + static def checkOrientationExistenceWithSimilarityAnalysis(Node xmlFile, int toleranceLevel) { + def result = [status: false, type: ""] + + Node outraProducao = (Node) xmlFile.children()[3] + + List orientations = Orientation.findAll(); + + Node orientacoesConcluidas = (Node) getNodeFromNode(outraProducao, "ORIENTACOES-CONCLUIDAS") + + + for (int i = 0; i < orientations.size(); i++) + { + + for (int h = 0; h < orientacoesConcluidas.children().size(); h++) + { + + String current = orientations[i].tituloTese + + Node currentInXML = (Node) orientacoesConcluidas.children()[h] + + Node infoCurrentInXML = (Node) currentInXML.children()[0] + + String titleCurrentInXML = getAttributeValueFromNode(infoCurrentInXML, "TITULO") + + int distance = Levenshtein.distance(current, titleCurrentInXML ) + + if ( distance> toleranceLevel && distance <= MAX_TOLERANCE_LEVEL) + { + + result.status = true + result.type = "Orientation" + break; + } + } + } + return result + } + + static def checkJournalExistenceWithSimilarityAnalysis(Node xmlFile, int toleranceLevel) { + def result = [status: false, type: ""] + + List periodicos = Periodico.findAll(); + + Node producaoBibliografica = (Node) xmlFile.children()[1] + Node artigosPublicados = (Node) producaoBibliografica.children()[1] + + + for (int i = 0; i < periodicos.size(); i++) + { + + for (int h = 0; h < artigosPublicados.children().size(); h++) + { + + String current = periodicos[i].title + + Node currentInXML = (Node) artigosPublicados.children()[h] + + Node infoCurrentInXML = (Node) currentInXML.children()[0] + + String titleCurrentInXML = getAttributeValueFromNode(infoCurrentInXML, "TITULO-DO-ARTIGO") + + int distance = Levenshtein.distance(current, titleCurrentInXML ) + + + if ( distance> toleranceLevel && distance <= MAX_TOLERANCE_LEVEL) + { + + result.status = true + result.type = "Journal" + break; + } + + } + } + return result + } + + + static boolean verifyDissertations (String title, Node xmlFile ) + { + Node dadosGerais = (Node) xmlFile.children()[0] + Node formacaoAcademica = getNodeFromNode(dadosGerais, "FORMACAO-ACADEMICA-TITULACAO") + Node mestrado = (Node) formacaoAcademica.children()[1] + Node doutorado = (Node) formacaoAcademica.children()[2] + + return analizeDissertationNode(title, mestrado) || analizeDissertationNode(title, doutorado) + + } + + static boolean verifyOrientations (String title, Node xmlFile ) + { + + Node outraProducao = (Node) xmlFile.children()[3] + + Node orientacoesConcluidas = (Node) getNodeFromNode(outraProducao, "ORIENTACOES-CONCLUIDAS") + + boolean result = false + for(int i=0; i
- + + diff --git a/grails-app/views/bibTexMainMenu/_form.gsp b/grails-app/views/bibTexMainMenu/_form.gsp new file mode 100644 index 00000000..be7ea132 --- /dev/null +++ b/grails-app/views/bibTexMainMenu/_form.gsp @@ -0,0 +1,4 @@ +<%@ page import="rgms.publication.BibTexMainMenu" %> + + + diff --git a/grails-app/views/bibTexMainMenu/create.gsp b/grails-app/views/bibTexMainMenu/create.gsp new file mode 100644 index 00000000..f71f7706 --- /dev/null +++ b/grails-app/views/bibTexMainMenu/create.gsp @@ -0,0 +1,39 @@ +<%@ page import="rgms.publication.BibTexMainMenu" %> + + + + + + <g:message code="default.create.label" args="[entityName]" /> + + + + +
+

+ +
${flash.message}
+
+ + + + +
+ +
+
+ +
+
+
+ + diff --git a/grails-app/views/bibTexMainMenu/edit.gsp b/grails-app/views/bibTexMainMenu/edit.gsp new file mode 100644 index 00000000..09414bdc --- /dev/null +++ b/grails-app/views/bibTexMainMenu/edit.gsp @@ -0,0 +1,43 @@ +<%@ page import="rgms.publication.BibTexMainMenu" %> + + + + + + <g:message code="default.edit.label" args="[entityName]" /> + + + + +
+

+ +
${flash.message}
+
+ + + + + + +
+ +
+
+ + +
+
+
+ + diff --git a/grails-app/views/bibTexMainMenu/list.gsp b/grails-app/views/bibTexMainMenu/list.gsp new file mode 100644 index 00000000..56e9d250 --- /dev/null +++ b/grails-app/views/bibTexMainMenu/list.gsp @@ -0,0 +1,44 @@ + +<%@ page import="rgms.publication.BibTexMainMenu" %> + + + + + + <g:message code="default.list.label" args="[entityName]" /> + + + + +
+

+ +
${flash.message}
+
+ + + + + + + + + + + + + +
+ + + +
+ + diff --git a/grails-app/views/bibTexMainMenu/show.gsp b/grails-app/views/bibTexMainMenu/show.gsp new file mode 100644 index 00000000..d83ab69f --- /dev/null +++ b/grails-app/views/bibTexMainMenu/show.gsp @@ -0,0 +1,36 @@ + +<%@ page import="rgms.publication.BibTexMainMenu" %> + + + + + + <g:message code="default.show.label" args="[entityName]" /> + + + + +
+

+ +
${flash.message}
+
+
    + +
+ +
+ + + +
+
+
+ + diff --git a/grails-app/views/bibtexGenerateFile/home.gsp b/grails-app/views/bibtexGenerateFile/home.gsp index f4538d83..1314a1b0 100644 --- a/grails-app/views/bibtexGenerateFile/home.gsp +++ b/grails-app/views/bibtexGenerateFile/home.gsp @@ -6,6 +6,7 @@ + <g:message code="default.list.label" args="[entityName]" /> @@ -84,7 +85,51 @@ +
+

+ +
${flash.message}
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Extra
${fieldValue(bean: periodicoInstance, field: "title")}${fieldValue(bean: periodicoInstance, field: "file")}${fieldValue(bean: periodicoInstance, field: "authors")}${fieldValue(bean: periodicoInstance, field: "journal")}Generate BibTex
+
\ No newline at end of file diff --git a/grails-app/views/book/show.gsp b/grails-app/views/book/show.gsp index 7664a16c..1bd5af0c 100644 --- a/grails-app/views/book/show.gsp +++ b/grails-app/views/book/show.gsp @@ -3,6 +3,16 @@ + + + + + + + <g:message code="default.show.label" args="[entityName]"/> @@ -130,6 +140,71 @@ + +
+ + + + + + + + + + +
diff --git a/grails-app/views/membership/_form.gsp b/grails-app/views/membership/_form.gsp index 1a65e071..b3511a7b 100644 --- a/grails-app/views/membership/_form.gsp +++ b/grails-app/views/membership/_form.gsp @@ -2,6 +2,14 @@ +
+ + +
+
-
- - -
-
- +
@@ -31,6 +31,6 @@ * - +
diff --git a/grails-app/views/membership/list.gsp b/grails-app/views/membership/list.gsp index a52df3a3..0a591d64 100644 --- a/grails-app/views/membership/list.gsp +++ b/grails-app/views/membership/list.gsp @@ -24,10 +24,10 @@ - - + + @@ -38,9 +38,9 @@ - ${fieldValue(bean: membershipInstance, field: "dateJoined")} + ${fieldValue(bean: membershipInstance, field: "dateLeft")} - + ${fieldValue(bean: membershipInstance, field: "member")} diff --git a/grails-app/views/membership/show.gsp b/grails-app/views/membership/show.gsp index 52fbba39..06917c76 100644 --- a/grails-app/views/membership/show.gsp +++ b/grails-app/views/membership/show.gsp @@ -23,20 +23,20 @@
    - +
  1. - + - +
  2. - +
  3. - + - +
  4. diff --git a/grails-app/views/researchGroup/_form.gsp b/grails-app/views/researchGroup/_form.gsp index fb13fbe0..fe582b6c 100644 --- a/grails-app/views/researchGroup/_form.gsp +++ b/grails-app/views/researchGroup/_form.gsp @@ -1,70 +1,82 @@ -<%@ page import="rgms.member.ResearchGroup" %> - - - - -
    - - -
    - -
    - - -
    - -
    - - -
    - - - -
    - - -
    - -
    - - -
      - -
    • - -
    • -
      - -
    -
    - -
    - - -
    +<%@ page import="rgms.member.ResearchGroup" %> + + + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
      + +
    • ${m?.encodeAsHTML()}
    • +
      +
    • + ${message(code: 'default.add.label', args: [message(code: 'membership.label', default: 'Membership')])} +
    • +
    + +
    + +
    + + +
      + +
    • ${n?.encodeAsHTML()}
    • +
      +
    • + ${message(code: 'default.add.label', args: [message(code: 'news.label', default: 'News')])} +
    • +
    + +
    + diff --git a/grails-app/views/researchGroup/create.gsp b/grails-app/views/researchGroup/create.gsp index a7f21cfb..59c55ca1 100644 --- a/grails-app/views/researchGroup/create.gsp +++ b/grails-app/views/researchGroup/create.gsp @@ -1,39 +1,45 @@ -<%@ page import="rgms.member.ResearchGroup" %> - - - - - - <g:message code="default.create.label" args="[entityName]" /> - - - - -
    -

    - -
    ${flash.message}
    -
    - - - - -
    - -
    -
    - -
    -
    -
    - - +<%@ page import="rgms.member.ResearchGroup" %> + + + + + + <g:message code="default.create.label" args="[entityName]"/> + + + + + + + +
    +

    + +
    ${flash.message}
    +
    + + + + +
    + +
    +
    + +
    +
    +
    + + diff --git a/grails-app/views/researchGroup/edit.gsp b/grails-app/views/researchGroup/edit.gsp index 0f8eb404..52f6a31f 100644 --- a/grails-app/views/researchGroup/edit.gsp +++ b/grails-app/views/researchGroup/edit.gsp @@ -1,43 +1,52 @@ -<%@ page import="rgms.member.ResearchGroup" %> - - - - - - <g:message code="default.edit.label" args="[entityName]" /> - - - - -
    -

    - -
    ${flash.message}
    -
    - - - - - - -
    - -
    -
    - - -
    -
    -
    - - +<%@ page import="rgms.member.ResearchGroup" %> + + + + + + <g:message code="default.edit.label" args="[entityName]"/> + + + + + + + +
    +

    + +
    ${flash.message}
    +
    + + + + + + +
    + +
    +
    + + +
    +
    +
    + + diff --git a/grails-app/views/researchGroup/editMembers.gsp b/grails-app/views/researchGroup/editMembers.gsp deleted file mode 100644 index 34aceb06..00000000 --- a/grails-app/views/researchGroup/editMembers.gsp +++ /dev/null @@ -1,7 +0,0 @@ -
    - - -
    \ No newline at end of file diff --git a/grails-app/views/researchGroup/list.gsp b/grails-app/views/researchGroup/list.gsp index 30f2448a..e5f8e6e4 100644 --- a/grails-app/views/researchGroup/list.gsp +++ b/grails-app/views/researchGroup/list.gsp @@ -1,59 +1,70 @@ - -<%@ page import="rgms.member.ResearchGroup" %> - - - - - - <g:message code="default.list.label" args="[entityName]" /> - - - - -
    -

    - -
    ${ flash.message }
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ${ fieldValue(bean: researchGroupInstance, field: "name") }${ fieldValue(bean: researchGroupInstance, field: "description") } ${ fieldValue(bean: researchGroupInstance, field: "childOf") }
    - -
    - - - +<%@ page import="rgms.member.ResearchGroup" %> + + + + + + <g:message code="default.list.label" args="[entityName]"/> + + + + + + + +
    +

    + +
    ${flash.message}
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ${fieldValue(bean: researchGroupInstance, field: "name")}${fieldValue(bean: researchGroupInstance, field: "description")}${fieldValue(bean: researchGroupInstance, field: "twitter")}${fieldValue(bean: researchGroupInstance, field: "sigla")}${fieldValue(bean: researchGroupInstance, field: "childOf")}
    + + +
    + + diff --git a/grails-app/views/researchGroup/show.gsp b/grails-app/views/researchGroup/show.gsp index 396c70a3..d1ad43b0 100644 --- a/grails-app/views/researchGroup/show.gsp +++ b/grails-app/views/researchGroup/show.gsp @@ -1,160 +1,156 @@ - -<%@ page import="rgms.member.ResearchGroup" %> - - - - - - <g:message code="default.show.label" args="[entityName]"/> - - - -- --
    -- - - - - -- --
    -- - - - - - --
    -- - - - - - - - - - - - - - -
    -

    - -
    ${flash.message}
    -
    -
      - - -
    1. - - - - -
    2. -
      - - -
    3. - - - - -
    4. -
      - - -
    5. - - - - -
    6. -
      - - - -
    7. - - - ${researchGroupInstance?.childOf?.encodeAsHTML()} - -
    8. -
      - - - - - -
    9. - - - - ${m.member?.encodeAsHTML()} - - - -
    10. -
      - - -
    11. - - - - - - - - - -
      ${index + 1} -${n.description?.encodeAsHTML()}
      - -
    12. -
      - -
    -
      -
    1. - - -
    2. -
    - - -
    - - - -
    -
    -
    - - - +<%@ page import="rgms.member.ResearchGroup" %> + + + + + + <g:message code="default.show.label" args="[entityName]"/> + + + + + + +
    + + +
    + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + +
    +

    + +
    ${flash.message}
    +
    +
      + + +
    1. + + + + +
    2. +
      + + +
    3. + + + + +
    4. +
      + + +
    5. + + + + +
    6. +
      + + +
    7. + + + + +
    8. +
      + + +
    9. + + + ${researchGroupInstance?.childOf?.encodeAsHTML()} + +
    10. +
      + + +
    11. + + + + ${m?.encodeAsHTML()} + + +
    12. +
      + + +
    13. + + + + ${n?.encodeAsHTML()} + + +
    14. +
      + +
    + +
    + + + +
    +
    +
    + + diff --git a/rgms3.iml b/rgms3.iml new file mode 100644 index 00000000..68e7cc2e --- /dev/null +++ b/rgms3.iml @@ -0,0 +1,133 @@ + + + + + + + file://$MODULE_DIR$/web-app/WEB-INF/applicationContext.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/cucumber/BibtexGenerateFile.feature b/test/cucumber/BibtexGenerateFile.feature index 566bfa51..e09d5367 100644 --- a/test/cucumber/BibtexGenerateFile.feature +++ b/test/cucumber/BibtexGenerateFile.feature @@ -8,3 +8,78 @@ Feature: all bibtex When I select the export bibtex file option at the publications menu And I select Generate All BibTex option at the export bibtex page Then I can see the bibtex details + + Scenario: Duplicate citation-key generation + Given I have an article named "A theory of software product line refinement" + And I have another article named "Modularity analysis of use case implementations" + When I generate a BibTex file from articles named "A theory of software product line refinement" and "Modularity analysis of use case implementations" + Then the BibTex file has unique citation-keys for the articles "A theory of software product line refinement" and "Modularity analysis of use case implementations" + + Scenario: Generate new BibTex from a subset of publications web + Given I am on the "Publications" menu + When I select the publications "A theory of software product line refinement" and "Modularity analysis of use case implementations" + And I click on the "Generate BibTex" option + Then the BibTex details are showed + And It only contains the articles "A theory of software product line refinement" and "Modularity analysis of use case implementations" + + Scenario: Publications with multiple authors must have authors' names separated by and + Given I am at the article page + When I select the article with title "A theory of software product line refinement" + Then I should see the article with id title "A theory of software product line refinement" details + When I click the Bibtex button + Then I should see each authors' name at the author field separated by "and" + + Scenario: Users can generate bibtex file from articles at Bibtex Generate File + Given I am at the Bibtex Generate File + And I have an article named "A theory of software product line refinement" + When I select generate Bibtex from the article "A theory of software product line refinement" + Then I should see the Bibtex file of the article named "A theory of software product line refinement" + + #if ($InvalidEntryOfBibtex) + Scenario: Tags of entry of BibTex are not separated by commas + Given: I have a bibtex format string "@article{author="user" title="svd" journal="ny" year="2015" volume="1" month="4" number="1" pages="15"}" + And: the string does not have commas + When I try to generate a Bibtex file from the string + Then The bibtex file is not generate + + Scenario: Tags of entry of BibTex are incompatible with type of publication chosen + Given: I am logged into the system + And: I am at the BibTexGenerateFile page + When: I click to "Generate BibTex manually" + And: A BibTex entry is "@article{mrx05, + auTHor = "Mr. X", + Title = {Something Great}, + publisher = "nob" # "ody", + YEAR = 2005, + chapter = 8, + }" + And: I click on the other button "Generate BibTex" + Then: I see an error message + + Scenario: Lack mandatory tags in entry of BibTex with type of publication chosen + Given: I am logged into the system + And: I am at the BibTexGenerateFile page + When: I click to "Generate BibTex manually" + And: A BibTeX entry is "@article{mrx05, + auTHor = "Mr. X", + Title = {Something Great}, + publisher = "nob" # "ody", + } + And: I click on the other button "Generate BibTex" + Then: I see an error message + #end + + #if ($CorrectEntryOfBibtex) + Scenario: BibTex file is generated manually + Given: I am logged into the system + And: I am at the BibTexGenerateFile page + When: I click to "Generate BibTex manually" + And: A Bibtex entry is "@article{mrx05, + auTHor = "Mr. X", + Title = {Something Great}, + publisher = "nob" # "ody", + YEAR = 2005, + }" + And: I click on the other button "Generate BibTex" + Then: a BibTex file is generated + #end \ No newline at end of file diff --git a/test/cucumber/Book.feature b/test/cucumber/Book.feature index 3624ed38..5dfaec3b 100644 --- a/test/cucumber/Book.feature +++ b/test/cucumber/Book.feature @@ -34,4 +34,59 @@ Feature: Book And the system has no book entitled "Next Generation Software Product Line Engineering" When I go to new book page And I use the webpage to create the book "Next Generation Software Product Line Engineering" with file name "Ngs.pdf" - Then the book "Next Generation Software Product Line Engineering" was stored by the system \ No newline at end of file + Then the book "Next Generation Software Product Line Engineering" was stored by the system + + Scenario: List existing books by title in alphabetical order web + Given I am on the book page + When I select to sort the books by "title" + Then the books are ordered by "title" in alphabetical order + + Scenario: List existing book + Given the system has a book entitled "SPL Development" with file name "HSPLE.pdf" + When I view the book list + Then my book list contains the book "SPL Development" + + Scenario: Post an existing book on facebook + Given the system has a book entitled "SPL Development" with file name "HSPLE.pdf" + When I share the book entitled "SPL Development" on facebook + Then a facebook message is posted #if ($implementoFuncionalidadesNosMoldesArticle) + + #if ($implementaoNovasFuncionalidades) + Scenario: List existing books by title in alphabetical order + Given the system has a book entitled "Livro de Teste" with file name "TCS-1401.pdf" + And the system has a book entitled "SPL Development" with file name "MACI.pdf" + When the system orders the book list by title + Then the system book list content is not modified + + Scenario: list existing book web + Given I am on the book page + And there is the book "Livro de Teste" stored in the system with file name "TCS-88.pdf" + Then my resulting books list contains the book "Livro de Teste" + + Scenario: Filter existing books by author + Given the system has some books authored by "Paulo Borba" + When the system filter the books authored by author "Paulo Borba" + Then the system book list content is not modified + + Scenario: Post an existing book on facebook web + Given I am on the book page + And there is the book "Software Engineering 3" stored in the system with file name "TCS-04.pdf" + When I select to view "Software Engineering 3" in resulting book list + And I click on Share on Facebook for book + Then A Facebook message was posted + + Scenario: Add a new book tweeting it web + Given I am on the book page + When I try to create a book named as "Software Engineering 3" with filename "TCS-101.pdf" + And I share it in my Twitter with "rgms_ufpe" and "rgmsadmin2013" + Then A tweet is added to my twitter regarding the new book "Software Engineering 3" + + Scenario: remove multiple books + Given the system has a book entitled "Livro de Teste" with file name "TCS-01.pdf" + And the system has a book entitled "SPL Development" with file name "AROOP-02.pdf" + And the system has a book entitled "Software Engineering" with file name "MACI-03.pdf" + When I remove the books "SPL Development" and "Livro de Teste" + Then the system removes the book "SPL Development" + And the system removes the book "Livro de Teste" + And the system contains the "Software Engineering" book + #end \ No newline at end of file diff --git a/test/cucumber/Conferencia.feature b/test/cucumber/Conferencia.feature index 8553a4a3..07a23c99 100644 --- a/test/cucumber/Conferencia.feature +++ b/test/cucumber/Conferencia.feature @@ -1,8 +1,8 @@ @i9n Feature: conferencia As a member of a research group - I want to add, remove and modify conferencias I have published - so that I can generate web pages and reports containing these conferencias + So that I can add, remove and modify conferencias I had published + I want to generate web pages and reports containing these conferencias Scenario: new conferencia Given the system has no conferencia entitled "IV Conference on Software Product Lines" @@ -144,4 +144,120 @@ Feature: conferencia And I select the option Serach for Conference at the conference page Then a list of all conferences containing that date will be presented in the conference screen -# voces podem criar cenários para ordenar a lista de conferencia, filtrar a lista, verificar se alguns campos podem ser opcionais, etc. + Scenario: Publish a new article + Given I am at the article registration page + When I am filling in the author field + And As I type the name, they come up suggestions of names containing the string entered as "And" may appear names like " Anderson " or " Candido " + Then I choose the right name if it appears , otherwise we fill the whole field + + Scenario: new article + Given I am at the publications + When I select the "conferencia" option at the publications menu + And I select the new article + Then I can fill the article details + + Scenario: remove article + Given I am at the publications menu + When I select the "conferencia" option at the publications menu + And a list of articles stored by the system is displayed at the conferencia page + Then I select the desired article + Then I can remove the article + + Scenario: new article from an existing conference + Given the conference "I International Conference on software Engineering" is stored in the system + When I type the letter "I" in the conference field to publish a new article + Then the system suggests "I International Conference on software Engineering" + + Scenario: author suggestion for a new article (existing author) + Given I am adding a new article + When I type the first letter in the Author field + Then a list is displayed suggesting names from Authors who already published an article + And I select the name I want + + Scenario: Search conference web by existing Author + Given I am at the Search Conference page + When I write a name from an Author who already published an article at the Search field + And I click on the Search button + Then a list of all conferences with articles from that Author are displayed + + Scenario: System can suggest one author for new conferencia being created (good path) + Given I am at Add new conferencia page + And I had previously published only with "Júnior" + When I try to fill "J" in Authors + Then the system should suggest "Júnior" as an possible author + When I select "Júnior" + Then "Júnior" should be added in "Authors" + + Background: Start from the Add new conferencia page with conferencias yet published + Given I am at Add new conferencia page + And I had previously published with "Jorge", "Junior Lima" and "Fábio Jr" + + Scenario: System can suggest some authors for new conferencia being created (good path) + When I try to fill "J" in Authors + Then the system should suggest "Jorge", "Junior Lima" and "Fábio Jr" as possible authors in lexicographical order + When I select "Jorge" and other suggested authors + Then the selected authors should be added in "Authors" + + Scenario: System can try to suggest some authors for new conferencia being created (bad path) + When I try to fill "K" in Authors + Then the system should suggest the latest 5 authors I had published as possible authors + When I select any suggested author + Then the selected author should be added in "Authors" + +Scenario: Fill in the field "Author Name" + Given I'm registering a new Article + And I'm filling the field " Author Name" + When I type "and" if there author names as " Anderson " or " Candido " registered in the system + And the names " Anderson " and " Candido " will be suggested by the system + Then I choose between " Anderso " and " Candido " or if it is not neither I fill with the desired name + +Scenario: Remove Article Web + Given I want to remove the article "A theory of software" with the file name "ATOS.pdf" + When I click on "A theory of software" that is on the list of articles published in the conference page + And I click with the mouse in the article "A theory of software" + And appear the options to edit or remove the article + Then I click the button to remove and the "A theory of software" is removed from the list of articles + And the aquirvo "ATOS.pdf" is removed from the system + +# voces podem criar cenários para ordenar a lista de conferencia, filtrar a lista, verificar se alguns campos podem ser opcionais, etc. + + Scenario: Search conference articles by Author web + Given I am at the Conference Articles page + And the system has some conference articles authored by "Jose", among several publications + When I write "J" at the Search field + And I click on the Search button + Then a list of all conference articles by "Jose" is displayed + + Scenario: Search for conferences which an Author have published web + Given I am at the Conference page + And an Author named "Junior" had published the articles "An Analysis and Survey of the Development of Mutation Testing", "A Systematic Survey of Program Comprehension through Dynamic Analysis", and "Engineering Privacy", for the conferences "International Conference on Software Engineering", "Information and Software Technology" and "International Symposium on Software Testing and Analysis" + When I write "Junior" at the search field + And I click on the search button + Then a list of all conferences, composed by "International Conference on Software Engineering", "Information and Software Technology" and "International Symposium on Software Testing and Analysis", that "Junior" published an article is displayed + + + + Scenario: Remove conference article that does not exist + Given the system has no conference article entitled "An Analysis and Survey of the Development of Mutation Testing" + When I try to remove the conference article "An Analysis and Survey of the Development of Mutation Testing" + Then nothing happens + + Scenario: Search for conferences which an Author have published web + Given I am at the Conference page + And an Author named "Junior" had published the articles "An Analysis and Survey of the Development of Mutation Testing", "A Systematic Survey of Program Comprehension through Dynamic Analysis" and "Engineering Privacy" for the conferences "International Conference on Software Engineering", "Information and Software Technology" and "International Symposium on Software Testing and Analysis" + When I write "Junior" at the search field + And I click on the Search button + Then a list of all conferences, composed by "International Conference on Software Engineering", "Information and Software Technology" and "International Symposium on Software Testing and Analysis", that "Junior" published an article is displayed + + Scenario: Duplicate conference article + Given the conference article "A Systematic Survey of Program Comprehension through Dynamic Analysis" is stored in the system with file name "FileName.pdf" + When I create the conference article "A Systematic Survey of Program Comprehension through Dynamic Analysis" with file name "FileName.pdf" + Then the conference article "A Systematic Survey of Program Comprehension through Dynamic Analysis" is not stored twice + + Scenario: Search conference articles by Author web + Given I am at the Conference Articles page + And the system has some conference articles authored by "Jose", among several publications + When I write "J" at the Search field + And I click on the Search button + Then a list of all conference articles by "Jose" is displayed + diff --git a/test/cucumber/Reports.feature b/test/cucumber/Reports.feature index bf58123a..f2d9d302 100644 --- a/test/cucumber/Reports.feature +++ b/test/cucumber/Reports.feature @@ -7,6 +7,9 @@ Feature: Reports When I select the "1" option at the Member list And I can select the option Export to HTML at the Member show Then I can generate a HTML report about Member "1" + And I can see a photography of the Member + And I can see a description about the member + And I can see a list of Menber publications Scenario: export existent member report to xml Given I am at the Member list page @@ -14,41 +17,114 @@ Feature: Reports And I can select the option Export to XML at the Member show Then I can generate a XML report about Member "1" - Scenario: export recently created member report to pdf - Given I am at the publications menu - When I select the Novo Member option - Then I fill the Member details with "John Smith" "JohnSmith" "JohnSmith@gmail.cin.ufpe.br" "UFPE" and create a new one - Then I select the "2" option at the Member list + Scenario: export existent member report to pdf + Given I am at the Member list page + When I select the "1" option at the Member list And I can select the option Export to PDF at the Member show - Then I can generate a PDF report about Member "2" + Then I can generate a PDF report about Member "1" - Scenario: export report to pdf of recently created research group + Scenario: create a new Member + Given I am at the Member list page + When I select the "New Member" option + And I can fill the Member "Name" with "John Smith" + And I can fill the Member "Username" with "JohnSmith" + And I can fill the Member "Email" with "JohnSmith@gmail.cin.ufpe.br" + And I can fill the Member "University" "UFPE" + And I can select "Criar" option + Then I can see the new user at the Member List + + Scenario: missing field error when creating a new Member + Given I am at the Member list page + When I select the Novo Member option + And I dont fill a field with * symbol + And I can select Criar option + Then I can see a error message + + Scenario: invalid value in field error when creating a new Member + Given I am at the Member list page + When I select the "Novo Member" option + And I can fill a field with an invalid value "&%(#@" + And I select "Create" option + Then I can see a error message + + Scenario: export recently created member report to pdf + Given I am at the Member list page + When I can create a new Member named "João Paulo Silva" + Then I can export to PDF the existent member named "João Paulo Silva" + + Scenario: export recently created member report to xml + Given I am at the Member list page + When I can create a new Member named "João Paulo Silva" + Then I can export to XML the existent member named "João Paulo Silva" + + Scenario: export recently created member report to html + Given I am at the Member list page + When I can create a new Member named "João Paulo Silva" + Then I can export to HTML the existent member named "João Paulo Silva" + + Scenario: create a new research group + Given I am at the publications menu page + When I select the "Research Group" option at the publications menu page + And I select the "New Research Group" at research group list page + Then I can fill the field "Nome" with value "Grupo1" + And I can fill the field "Twitter" with value "@Grupo1" + And I can fill the field "Descrição" with value "Grupo de pesquisa 1" + And I can fill the field "Sigla" with value "G1" + And I select a member "1" at member list + And I select "Criar" option + Then I should see the new research group named "Grupo1" in Research Group list + + + Scenario: missing field error when creating a research group Given I am at the publications menu When I select the "Research Group" option at the publications menu And I select the new research group option at research group list page - Then I can fill the research group details with name "RGroup" and create a new one - And I select the "RGroup" option at the Research Group list - And I can select the option Export to PDF at the Research Group show - And I can generate a PDF report about Research Group "RGroup" + And I dont fill a field with "*" symbol + And I can select "Criar" option + Then I can see a error message - Scenario: export report to html of recently created research group + Scenario: invalid value in field error when creating a research group Given I am at the publications menu When I select the "Research Group" option at the publications menu And I select the new research group option at research group list page - Then I can fill the research group details with name "RGroup" and create a new one + And I can fill a field with an invalid value + And I can select "Criar" option + Then I can see a error message + + Scenario: export report to pdf of existent research group + Given I am at the publications menu And I select the "RGroup" option at the Research Group list - And I can select the option Export to HTML at the Research Group show - And I can generate a HTML report about Research Group "RGroup" + And I can select the option Export to PDF at the Research Group show page + Then I can generate a PDF report about Research Group "RGroup" - Scenario: export report to xml of recently created research group + Scenario: export report to xml of existent research group Given I am at the publications menu - When I select the "Research Group" option at the publications menu - And I select the new research group option at research group list page - Then I can fill the research group details with name "RGroup" and create a new one And I select the "RGroup" option at the Research Group list - And I can select the option Export to XML at the Research Group show - And I can generate a XML report about Research Group "RGroup" + And I can select the option Export to PDF at the Research Group show page + Then I can generate a XML report about Research Group "RGroup" + + Scenario: export report to html of existent research group + Given I am at the publications menu + And I select the "RGroup" option at the Research Group list + And I can select the option Export to PDF at the Research Group show page + Then I can generate a HMTL report about Research Group "RGroup" + + Scenario: export report to pdf of recently created research group + Given I am at the publications menu + When I create a new Research Group named "RGroup" + Then I can generate a PDF report about existent Research Group "RGroup" + + + Scenario: export report to html of recently created research group + Given I am at the publications menu + When I create a new Research Group named "RGroup" + Then I can generate a HTML report about existent Research Group "RGroup" + + Scenario: export report to xml of recently created research group + Given I am at the publications menu + When I create a new Research Group named "RGroup" + Then I can generate a XML report about existent Research Group "RGroup" Scenario: export existent member report to html and access bibtex from him Given I am at the Member list page @@ -94,3 +170,81 @@ Feature: Reports And I select the option Export to HTML at the News list page Then The system generate a HTML report with the news "The first news" in it #end + + Scenario: export a existent research group report to html + Given I am in research group list page + When I select "RGMSGroup" option at the research group list + And I select the option "export to html" at the research group show + Then I export a html report about resourch group "RGMSGroup" + + Scenario: export a existent news report to html + Given I am in News list page + When I select "RGMSNews" option at the News list + And I select the option "export to html" at the News show + Then I export a html report about News "RGMSNews" + + Scenario: export a existent research group report to pdf + Given I am in research group list page + When I select "RGMSGroup" option at the research group list + And I select the option "export to PDF" at the resourch group show + Then I export a PDF report about research group "RGMSGroup" + + Scenario: export a existent news report to PDF + Given I am in News list page + When I select "RGMSNews" option at the News list + And I select the option "export to PDF" at the News show + Then I export a PDF report about News "RGMSNews" + + Scenario: export a existent research group report to xml + Given I am in research group list page + When I select "RGMSGroup" option at the resourch group list + And I select the option "export to XML" at the research group show + Then I export a XML report about resourch group "RGMSGroup" + + Scenario: export a existent news report to xml + Given I am in News list page + When I select "RGMSNews" option at the News list + And I select the option "export to XML" at the News show + Then I export a XML report about News "RGMSNews" + + Scenario: export report to html link not enable when there is not research group created + Given I am at "publications" menu + And there is not research group created + When I select the "Research Group" option + Then I view that the research group list is empty + And I can not select the option "Export to html" + + Scenario: export report to html link not enable when there is not members report created + Given I am at "publications" menu + And there is not member created + When I select the "Member" option + Then I view that the member list is empty + And I can not select the option "Export to html" + + + #iniciado aqui + + Scenario: export research group report to HTML + Given I have a ResearchGroup registered in the system + And I am at ResearchGroupShowPage + When I select HTML Export option + Then I go to ResearchGroupReportHTMLPage + + + Scenario: export research group report to XML + Given I have a ResearchGroup registered in the system + And I am at ResearchGroupShowPage + When I select XML Export option + Then I receive a download link to XML Report + + Scenario: export research group report to PDF + Given I have a ResearchGroup registered in the system + And I am at ResearchGroupShowPage + When I select PDF Export option + Then I receive a download link to PDF Report + + Scenario: Include basic ResearchGroup information in ResearchGroup Report + Given I have a ResearchGroup registered in the system + When I go to ResearchGroupReportHTMLPage + Then I can see the ResearchGroup basic information on page + diff --git a/test/cucumber/XMLImport.feature b/test/cucumber/XMLImport.feature index cc0dcc6a..19394d45 100644 --- a/test/cucumber/XMLImport.feature +++ b/test/cucumber/XMLImport.feature @@ -10,8 +10,6 @@ Feature: XMLImport When I select the "upload" button And I upload the file "cv.pdf" Then the system outputs an error message - And no new publication is stored by the system - And the previously stored publications do not change @ignore Scenario: invalid file @@ -30,20 +28,15 @@ Feature: XMLImport @ignore Scenario: no file web Given I am at the "Import XML File" Page - And the system has some publications stored When I click on "upload" without select a xml file Then the system outputs an error message - And no new publication is stored by the system - And the previously stored publications do not change @ignore - Scenario: new publication + Scenario: create a new publication Given the system has some publications stored - And the system has no journal article entitled "An Abstract Equivalence Notion for Object Models" authored by me - When I upload the file "cv.xml" which contains a journal article entitled "An Abstract Equivalence Notion for Object Models" authored by me - Then the system outputs a list of imported publications which contains the journal article entitled "An Abstract Equivalence Notion for Object Models" with status "stable" - And no new publication is stored by the system - And the previously stored publications do not change + And the system has no journal article entitled "An Abstract Equivalence Notion for Object Models” authored by me + When I upload the file "cv.xml" which contains a journal article entitled "An Abstract Equivalence Notion for Object Models” + Then a journal article entitled "An Abstract Equivalence Notion for Object Models” is stored by the system @ignore Scenario: confirm import of new publication @@ -327,6 +320,57 @@ Feature: XMLImport When I cancel the import of the master's orientation entitled "Structuring Adaptive Aplications using AspectJ" with status "conflicted" And the master's orientation entitled "Structuring Adaptive Aplications using AspectJ" with status "conflicted" is removed from the list of imported orientations And the previously stored orientations do not change + + + #if($ToleranceLevel) + + Scenario: dissertations with similar names should be considered as duplicates, according to the tolerance level + Given the system has a dissertation entitled "Semantics and Refinement for a Concurrent Object Oriented Language" stored + And the similarity tolerance is configured to "5" + When I upload the file "curriculo5.xml" which contains a dissertation entitled "Semantics an refinement for a concurrent object oriented language" + Then the system outputs a list of imported dissertations which contains the dissertation entitled "Semantics and Refinement for a Concurrent Object Oriented Language" + And no new dissertation entitled "Semantics an refinement for a concurrent object oriented language" is stored by the system + + Scenario: show an error message when the tolerance level is not informed + Given I am at the XMLImport Page + And I select a xml file + When I click on "upload" without informing the tolerance level + Then the system outputs an error message + + Scenario: orientations with similar names should be considered as duplicates, according to the tolerance level + Given the system has a orientation entitled "Design and Evaluation of an Object-Oriented Formal Specification Language" stored + And the similarity tolerance is configured to "5" + When I upload the file "curriculo5.xml" which contains an orientation entitled "design and evaluation of an object-oriented formal specification Language" + Then the system outputs a list of imported orientations which contains the orientation entitled "Design and Evaluation of an Object-Oriented Formal Specification Language" + And no new orientation entitled "design and evaluation of an object-oriented formal specification Language" is stored by the system + + Scenario: show a successful message when the tolerance level is informed and no duplicates were found + Given I am at the XMLImport Page + And I select a xml file + When I click on "upload" informing the tolerance level + Then the system outputs a successful message + + Scenario: orientations without similar names should not be considered as duplicates, according to the tolerance level + Given the system has a orientation entitled "Design and Evaluation of an Object-Oriented Formal Specification Language" stored + And the similarity tolerance is configured to "5" + When I upload the file "curriculo6.xml" which contains an orientation entitled "Design and Evaluation of an Object-oriented formal Specification Languagee" + Then the system outputs a list of imported orientations which contains the orientations "Design and Evaluation of an Object-Oriented Formal Specification Language" and "Design and Evaluation of an Object-oriented formal Specification Languagee" + And the new orientation entitled "Design and Evaluation of an Object-oriented formal Specification Languagee" is stored by the system + + Scenario: journal articles with similar names should be considered as duplicates, according to the tolerance level + Given the system has a journal article entitled "A System For Translating Executable VDM Specifications Into Lazy ML" stored + And the similarity tolerance is configured to "6" + When I upload the file "curriculo5.xml" which contains a journal article entitled "a system For translating Executable VDM specifications into lazy Ml" + Then the system does not store the journal article entitled "a system For translating Executable VDM specifications into lazy Ml" + And the journal article entitled "A System For Translating Executable VDM Specifications Into Lazy ML" still in the system + + Scenario: journal articles without similar names should not be considered as duplicates, according to the tolerance level + Given the system has a journal article entitled "A System For Translating Executable VDM Specifications Into Lazy ML" stored with filename "ASFTEVSILM.pdf" + And the similarity tolerance is configured to "6" + When I upload the file "curriculo6.xml" which contains a journal article entitled "A system For translating Executable VDM specifications into lazy Ml" + Then the system store the journal article entitled "A system For translating Executable VDM specifications into lazy Ml" + And the journal article entitled "A System For Translating Executable VDM Specifications Into Lazy ML" still in the system + #end # o que acontece quando o arquivo tem publicações já cadastradas? e # publicações com mesmos títulos mas outras partes diferentes? e diff --git a/test/cucumber/steps/BibtexGenerateFileSteps.groovy b/test/cucumber/steps/BibtexGenerateFileSteps.groovy index 849cd8bd..adc0458a 100644 --- a/test/cucumber/steps/BibtexGenerateFileSteps.groovy +++ b/test/cucumber/steps/BibtexGenerateFileSteps.groovy @@ -1,6 +1,17 @@ import pages.BibtexGenerateFilePage +import pages.LoginPage +import pages.PublicationsPage +import rgms.publication.BibtexGenerateFile +import rgms.publication.Periodico +import pages.ArticlePages.ArticleShowPage +import pages.ArticlePages.ArticlesPage +import pages.LoginPage +/* +import static cucumber.runtime.groovy.EN.Then +import static cucumber.runtime.groovy.EN.When +import static cucumber.runtime.groovy.EN.And +import static cucumber.runtime.groovy.EN.Given -import static cucumber.api.groovy.EN.* When(~'^I select the export bibtex file option at the publications menu$') {-> page.select("Export Bibtex File") @@ -14,4 +25,95 @@ When(~'^I select Generate All BibTex option at the export bibtex page$') {-> Then(~'^I can see the bibtex details$') {-> } +Given(~'^I have an article named "([^"]*)"$') {String title -> + article = Periodico.findByTitle(title) + assert article != null +} + +And(~'^I have another article named "([^"]*)"$') {String title -> + article = Periodico.findByTitle(title) + assert article != null +} + +When(~'^I generate a BibTex file from articles named "([^"]*)" and "([^"]*)"$') { String title1, String title2 -> + article1 = Periodico.findByTitle(title1) + article2 = Periodico.findByTitle(title2) + bib1 = generateBibtexPeriodico(article1) + assert bib1 != null + bib2 = generateBibtexPeriodico(article2) + assert bib2 != null + bibtexFile = bib1 + "\n" + bib2 + assert bibtexFile != null +} + +Then(~'^the BibTex file has unique citation-keys for the articles "([^"]*)" and "([^"]*)"$') { String title1, String title2 -> + // The method that generates a BibTex does not include a citation-key + // Need to fix this issue first +} + +Given(~'^I am on the "Publications" menu$') {-> + to LoginPage + at LoginPage + page.add("admin", "adminadmin") + at PublicationsPage +} + +When(~'^I select the publications "([^"]*)" and "([^"]*)"$') { String p1, String p2 -> + + And(~'^I click on the "([^"]*)" option$') { String o -> + at PublicationsPage + page.select(o) + } + + Then(~'^the BibTex details are showed$') { -> + } + + And(~'^It only contains the articles "([^"]*)" and "([^"]*)"$') { String title1, String title2 -> + } + +//---------------------------------------------------------------// + + + Given(~'^And I am at the article page$') { + Login("admin", "adminadmin") + to ArticlesPage + at ArticlesPage + } + + When(~'^I select the article with title "([^"]*)"$') { String articleTitle -> + page.selectViewArticle(articleTitle) + } + + Then(~'^I should see the article with title "([^"]*)" details$') { String articleTitle -> + at ArticleShowPage + } + + When(~'^I click the Bibtex button$') { + at ArticleShowPage + page.select('Bibtex', 'fieldcontain') + } + + Then(~'^I should see each authors\' name at the author field separated by "and"$') { + assert true + } + +/*---------------------------------------------------------------*/ + +/* + Given(~'^I am at the Bibtex Generate File$') { + to BibtexGenerateFilePage + at BibtexGenerateFilePage + } + And(~'^I have an article named "([^"]*)"$') { String articleTitle -> + assert Periodico.findByTitle(articleTitle) + } + When(~'^I select generate Bibtex from the article "([^"]*)"$') { String articleTitle -> + at BibtexGenerateFilePage + page.select(Bibtex) + } + Then(~'^I should see the Bibtex file of the article named "([^"]*)"$') { String articleTitle -> + assert true + } + +*/ \ No newline at end of file diff --git a/test/cucumber/steps/BookSteps.groovy b/test/cucumber/steps/BookSteps.groovy index 45aae835..e2599682 100644 --- a/test/cucumber/steps/BookSteps.groovy +++ b/test/cucumber/steps/BookSteps.groovy @@ -6,12 +6,16 @@ * To change this template use File | Settings | File Templates. */ + import pages.BookCreatePage import pages.BookPage import pages.LoginPage import pages.PublicationsPage import rgms.publication.Book +import rgms.tool.TwitterTool import steps.BookTestDataAndOperations +import steps.TestDataAndOperationsFacebook +import pages.* import static cucumber.api.groovy.EN.* @@ -103,6 +107,133 @@ Then(~'^the book "([^"]*)" was stored by the system$') { String title -> at BookPage } +Given(~'^I am on the book page$') {-> + to LoginPage + at LoginPage + page.fillLoginData("admin", "adminadmin") + at PublicationsPage + to BookPage + at BookPage +} + +When(~'^I select to sort the books by "([^"]*)"$') { String sortType -> + at BookPage + createBooks() + page.selectOrderBy(sortType) +} + +Then(~'^the books are ordered by "([^"]*)" in alphabetical order$') { String sortType -> + at BookPage + page.checkOrderedBy(sortType) +} + +Given(~'^the system has a book entitled "([^"]*)" with file name "([^"]*)"$') { String title, String fileName -> + BookTestDataAndOperations.createBook(title, fileName) + assert Book.findByTitle(title) != null +} + +When(~'^I view the book list$') {-> + books = Book.findAll() + assert books != null +} + +When(~'^I share the book entitled "([^"]*)" on facebook$') { String title -> + TestDataAndOperationsFacebook.ShareArticleOnFacebook(title) +} + +Then(~'^my book list contains the book "([^"]*)"$') { String title -> + books = Book.findAll() + assert BookTestDataAndOperations.containsBook(title, books) +} + +Then(~'^a facebook message is posted$') {-> + assert true +} + +When(~'^the system orders the book list by title$') { -> + booksSorted = Book.listOrderByTitle(order: "asc") + assert BookTestDataAndOperations.isSorted(booksSorted, "title") +} + +Then(~'^the system book list content is not modified$') { -> + assert Book.findAll().size() == 2 + assert !bookNoExist('SPL Development') + assert !bookNoExist('Livro de Teste') +} + +And(~'^there is the book "([^"]*)" stored in the system with file name "([^"]*)"$') { String title, filename -> + page.select("Book") + selectNewBookInBooksPage() + page.fillBookDetails(title, filename) + page.selectCreateBook() + to BookPage + at BookPage +} + +Then(~'my resulting books list contains the book "([^"]*)"$') { String title -> + at BookPage + page.checkBookAtList(title, 0) +} + +Given(~'^the system has some books authored by "([^"]*)"$'){String authorName-> + BookTestDataAndOperations.createBook('Livro de Teste', 'TCSOS.pdf', 'Paulo Borba') + BookTestDataAndOperations.createBook('SPL Development', 'MACI.pdf') + assert (!bookNoExist('Livro de Teste') && !bookNoExist('SPL Development')) +} + +When(~'^the system filter the books authored by author "([^"]*)"$') {String authorName-> + booksFiltered = BookTestDataAndOperations.findAllByAuthor(authorName) + assert BookTestDataAndOperations.isFiltered(booksFiltered,authorName) +} + +When(~'^I select to view "([^"]*)" in resulting book list$') { String title -> + page.selectViewBook(title) + to BookShowPage + at BookShowPage +} + +When(~'^I click on Share on Facebook for book$') { -> + to BookShowPage + page.clickOnShareOnFacebook() + at BookShowPage +} + +Then(~'^A Facebook message was posted$') { -> + assert true +} + +When(~'^I try to create a book named as "([^"]*)" with filename "([^"]*)"$') { String bookName, String filename -> + selectNewBookInBooksPage() + page.fillBookDetails(bookName, filename) + page.selectCreateBook() +} + +When(~'^I share it in my Twitter with "([^"]*)" and "([^"]*)"$') { String twitterLogin, String twitterPw -> + to BookShowPage + page.clickOnTwitteIt(twitterLogin, twitterPw) + at BookShowPage +} + +Then(~'^A tweet is added to my twitter regarding the new book "([^"]*)"$') { String bookTitle -> + assert TwitterTool.consultForBook(bookTitle) +} + +And(~'^the system contains the "([^"]*)" book$') { String title1 -> + assert Book.findByTitle(title1) != null +} + +When(~'^I remove the books "([^"]*)" and "([^"]*)"$') { String title1, title2 -> + BookTestDataAndOperations.removeMultiplesBooks(title1, title2) + def testDeleteBook1 = Book.findByTitle(title1) + def testDeleteBook2 = Book.findByTitle(title2) + assert testDeleteBook1 == null + assert testDeleteBook2 == null +} + +Then(~'^the system removes the book "([^"]*)"$') { String title -> + assert bookNoExist(title) +} + def checkIfExists(String title) { book = Book.findByTitle(title) assert book == null @@ -113,4 +244,27 @@ def createAndCheckBookOnBrowser(String title, String filename) { page.clickSaveBook() book = Book.findByTitle(title) assert book != null +} + +def createBooks(){ + page.selectNewBook() + at BookCreatePage + createAndCheckBookOnBrowser("Pattern Recognition", "pr.pdf") + to BookPage + at BookPage + page.selectNewBook() + at BookCreatePage + createAndCheckBookOnBrowser("Machine Learning", "ml.pdf") + to BookPage + at BookPage +} + +def bookNoExist(String title){ + return Book.findByTitle(title) == null +} + +def selectNewBookInBooksPage(){ + at BookPage + page.selectNewBook() + at BookCreatePage } \ No newline at end of file diff --git a/test/cucumber/steps/ConferenciaSteps.groovy b/test/cucumber/steps/ConferenciaSteps.groovy index f11e0542..7211d8f7 100644 --- a/test/cucumber/steps/ConferenciaSteps.groovy +++ b/test/cucumber/steps/ConferenciaSteps.groovy @@ -1,10 +1,12 @@ import cucumber.runtime.PendingException +import pages.ArticlePages.ArticlesPage import pages.Conferencia.ConferenciaCreatePage import pages.Conferencia.ConferenciaPage import pages.LoginPage import pages.PublicationsPage import rgms.member.Member import rgms.publication.Conferencia +import steps.ArticleTestDataAndOperations import steps.TestDataAndOperations import steps.TestDataAndOperationsPublication import steps.ConferenciaTestDataAndOperations @@ -144,4 +146,92 @@ And(~'^the conferencias are not stored by the system$') {-> at ConferenciaPage page.checkIfConferenciaListIsEmpty() -} \ No newline at end of file +} + + +/*Given(~'^I'm registering a new Article$') {String authorName -> + at articleResgitrationPage + page.fillArticleAuthorName(authorName, null) +} + +When(~'^I type "([^"]*)" if there author names as "([^"]*)" or "([^"]*)" registered in the system) { String authorName -> + page.fillArticleAuthorName(ArticleTestDataAndOperations.path() + authorName) + at page.fillArticleAuthorName.suggest("([^"]*)" for aurthorName) +} + +Then(~'^I choose between " Anderso " and " Candido " or if it is not neither I fill with the desired name) { String authorName -> + at page.fillArticleAuthorName("([^"*])" or type "authorName") +} + + +Given(~'^I want to remove the article "([^"]*)" with the file name "([^"]*)") { String title, filename -> + + ArticleTestDataAndOperations.createArticle(title, filename,null,null) + assert Periodico.findByTitle(title) != null +} + +When(~'^I click on "([^"]*)" that is on the list of articles published in the conference page) { String title -> + ArticleTestDataAndOperations.removeArticles(title) + + def testDeleteArticle1 = Periodico.findByTitle(title) + assert testDeleteArticle == null +} + +Then(~'^I click the button to remove and the "A theory of software" is removed from the list of articles) { string title -> + assert periodicoNoExist(title) +} +And(~'^the aquirvo "ATOS.pdf" is removed from the system) {String fileName -> + assert fileNoExist(fileName) +} +*/ + + + + +/* +Given(~'^I am at the Conference articles page$') {-> + to LoginPage + at LoginPage + page.fillLoginData("admin","adminadmin") + at ConferenciaPage +} +And(~'^the system has some conference articles authored by "([^"]*)", among several publications$') { String author -> + article = TestDataAndOperationsPublication.containsUser(author) + assert article != null +} +When(~'^I write "([^"]*)" at the Search field$') { String author -> + at ConferenciaPage + page.fillSearch(author) +} +And (~'^I click on the Search button$'){ + page.select("search") +} +Then (~'^a list of all conference articles by "([^"]*)" is displayed$'){ String author -> + author = TestDataAndOperationsPublication.containsUser(author) + assert author != null + page.listConferenceArticles(author) +} +*/ + + +/* +And(~'^an Author named "([^"]*)" had published the articles "([^"]*)", "([^"]*)" and "([^"]*)" for the conferences "([^"]*)", "([^"]*)" and "([^"]*)"$'){ String author, String article1, String article2, String article3, String conference1, String conference2, String conference3 -> + assert Conferencia.findByTitle(conference1) != null + assert Conferencia.findByTitle(conference2) != null + assert Conferencia.findByTitle(conference3) != null + assert ArticleTestDataAndOperations.findArticleByTitle(article1) != null + assert ArticleTestDataAndOperations.findArticleByTitle(article2) != null + assert ArticleTestDataAndOperations.findArticleByTitle(article3) != null + author = TestDataAndOperationsPublication.containsUser(author) + assert author != null +} +} +Then(~'^a list of all conferences, composed by "([^"]*)", "([^"]*)" and "([^"]*)", that "([^"]*)" published an article is displayed$') { String author, String article1, String article2, String article3 -> + assert ArticleTestDataAndOperations.findArticleByTitle(article1) != null + assert ArticleTestDataAndOperations.findArticleByTitle(article2) != null + assert ArticleTestDataAndOperations.findArticleByTitle(article3) != null + author = TestDataAndOperationsPublication.containsUser(author) + assert author != null + page.listConferencia(author) +} +*/ diff --git a/test/cucumber/steps/ReportsSteps.groovy b/test/cucumber/steps/ReportsSteps.groovy index ff682686..516d6f5f 100644 --- a/test/cucumber/steps/ReportsSteps.groovy +++ b/test/cucumber/steps/ReportsSteps.groovy @@ -1,6 +1,7 @@ import pages.Conferencia.ConferenciaCreatePage import pages.Conferencia.ConferenciaPage import pages.LoginPage +import pages.ResearchGroup.ResearchGroupCreatePage import pages.member.MemberListPage import pages.member.MemberPage import pages.member.MemberCreatePage @@ -10,6 +11,9 @@ import pages.Report.ReportHTMLPage import pages.ResearchGroup.ResearchGroupPage import pages.ResearchGroup.ResearchGroupListPage import pages.ResearchGroup.ResearchGroupShowPage +import rgms.member.Member +import rgms.member.ResearchGroup +import rgms.member.ResearchGroupController import static cucumber.api.groovy.EN.* @@ -204,6 +208,228 @@ When(~'^I can fill the Conferencia details$') {-> //--------------------------------------------------------------------------------------------------- +//#if ($createanewresearchgroup) + Given(~'^I am at the publications menu page$') { -> + to LoginPage + at LoginPage + page.add("admin","adminadmin") + at PublicationsPage + } + +When(~'^I select the "([^"]*)" option at the publications menu page$') { String option -> + at PublicationsPage + page.select(option) +} + +And(~'^I select the "New Research Group" option at research group list page$') { -> + at ResearchGroupListPage + page.select("create") +} + +Then(~'^I can fill the field "Nome" with value "([^"]*)"$') { String field, String name -> + at ResearchGroupCreatePage + page.fillResearchGroupName(name) +} + +And(~'I can fill the field "Twitter" with value "([^"]*)"$') { String field, String twitter -> + at ResearchGroupCreatePage + page.fillResearchGroupTwitter(twitter) +} + +And(~'^I can fill the field "Descrição" with value "([^"]*)"$') { String field, String description -> + at ResearchGroupCreatePage + page.fillResearchGroupDescription(description) +} + +And(~'^I can fill the field "Sigla" with value "([^"]*)"$') { String field, String sigla -> + at ResearchGroupCreatePage + page.fillResearchGroupSigla(sigla) +} + +And(~'^I select a member "([^"]*)" at member list') { String memberId -> + at ResearchGroupCreatePage + page.selectMember(memberId) + page.clickOnCreate() +} + +Then(~'^I should see the new research group named "([^"]*)" in Research Group list$') { String groupName -> + at ResearchGroupPage + assert page.findByName(groupName) != null /* Checando se o grupo foi criado */ +} + +//#end + +//--------------------------------------------------------------------------------------------------- + +//#if ($invalidvalueinfielderrorwhencreatinganewMember) +// invalid value in field error when creating a new Member +/* Given(~'^I am at the Member list page$') { -> + to MemberListPage + at MemberListPage + } +*/ +When(~'^I select the "([^"]*)" option$') { String option -> + at MemberListPage + page.getMenuOption(option) +} + +And(~'^I can fill a field with an invalid value "([^"]*)"') { String value -> + at MemberCreatePage + page.fillMemberDetails(value) +} + +And(~'^I select "([^"]*)" option') { String value -> + at MemberCreatePage + page.clickOnCreate() +} + +Then(~'^I should see an error message'){ -> + at MemberListPage +} + +//#end + +//--------------------------------------------------------------------------------------------------- + +//created by marcio mendes github: marciojr + +//if ($createanewMember) + + Given(~'^I am at the Member menu page$') { -> + to LoginPage + at LoginPage + page.add("admin","adminadmin") + to MemberPage + } + +When(~'^I select the "New Member" option$') { -> + at MemberPage + MemberPage.select("create") + to MemberCreatePage +} + +And(~'^I can fill the Member "Name" with "([^"]*)"$') { String field, String name, String username, String email, String university -> + at MemberCreatePage + MemberCreatePage.fillSomeMemberDetails(name,username,email,university) + // all fields was created and the input "create" was called on the fillSomeMem... methods +} + +Then(~'^I should see the new user at the Member list$') { String MemberName -> + at MemberPage +} + +//end + +//----------------------------------------------------------------------------------------------------------------------------------------------------- + +// created by marcio mendes github: marciojr + +//if ($export a existent research group report to html) + + Given(~'^I am at the Research Group List page$') { -> + to LoginPage + at LoginPage + page.add("admin","adminadmin") + to ResearchGroupListPage + } + +When(~'^I select the "([^"]*)" option at the Research Group List$') { String name -> + at ResearchGroupListPage + ResearchGroupListPage.selectResearchGroup(name) +} + +And(~'^I select the option "([^"]*)" at the research group show$') { String name-> + at ResearchGroupListPage + ResearchGroupShowPage.checkHtml(name) // check if there is the name created +} + +Then(~'^I export a html report about resourch group "([^"]*)"$') { -> + at ResearchGroupListPage + ResearchGroupController.show() // show html using the own params.id +} + +//end + +//----------------------------------------------------------------------------------------------------------------------------------------------------- +//if ($missing field error when creating a new Member) + +/*Given(~'^I am at the Member list page$'){ -> + at MemberListPage +} + +When(~'^I select the Novo Member option$') { -> + to MemberCreatePage +} +*/ +And(~'^I dont fill a field with * symbol$'){ -> + assert (page.name.value() != null && + page.username.value() != null && + page.email.value() != null && + page.university.value() != null) +} + +And(~'^I can select Criar option$'){ -> + page.select("create") +} + +Then(~'^I can see a error message$'){ -> + assert (page.readFlashMessage() != null) +} + +//----------------------------------------------------------------------------------------------------------------------------------------------- +//----------------------------------------------------------------------------------------------------------------------------------------------------- +//if ($missing field error when creating a research group) + + +/*Given(~'^I am at the publications menu$'){ -> + at PublicationsPage +} +*/ +When(~'^I select the "Research Group" option at the publications menu') { -> + to ResearchGroupListPage +} + +And(~'^I select the new research group option at research group list page'){-> + to ResearchGroupCreatePage +} + +/*And(~'^I dont fill a field with * symbol$'){ -> + assert (page.name.value() != null && + page.twitter.value() != null && + page.description.value() != null) +} + +And(~'^I can select Criar option$'){ -> + page.select("create") +} + +Then(~'^I can see a error message$'){ -> + assert (page.readFlashMessage() != null) +}*/ +//----------------------------------------------------------------------------------------------------------------------------------------------- +//jp start here + +Given(~'^I have a ResearchGroup registered in the system$') { -> + researchGroup = ResearchGroup.getAll() + assert researchGroup.size() == 1 +} + +And(~'^I am at ResearchGroupShowPage$') { -> + at ResearchGroupShowPage +} + +When(~'^I select XML Export option$') { -> + page.clickXML() +} + +Then(~'^I receive a download link to XML Report$') { -> + +} + + + + +//------------------------------------------------------------------------- def Login(String user, String password) { to LoginPage at LoginPage diff --git a/test/cucumber/steps/XMLImportSteps.groovy b/test/cucumber/steps/XMLImportSteps.groovy index df70dccb..2d5354e7 100644 --- a/test/cucumber/steps/XMLImportSteps.groovy +++ b/test/cucumber/steps/XMLImportSteps.groovy @@ -6,7 +6,13 @@ import pages.LoginPage import pages.OrientationPages.OrientationsPage import pages.XMLImportPage import pages.ferramenta.FerramentaPage +import rgms.member.Orientation import rgms.publication.* +import steps.ArticleTestDataAndOperations +import steps.OrientationTestDataAndOperations +import steps.TestDataAndOperationsPublication +import steps.TestDataDissertacao + import static cucumber.api.groovy.EN.* import steps.TestDataAndOperations import CommonSteps @@ -104,4 +110,136 @@ And(~'^the publications are not stored by the system$') {-> to OrientationsPage at OrientationsPage page.checkIfOrientationListIsEmpty() +} + +Given(~'^the system has a dissertation entitled "([^"]*)" stored$') { String title-> + TestDataDissertacao.createDissertacao(title, "dissertation.txt", "University of Oxford") + def dissertation = Dissertacao.findByTitle(title); + assert dissertation != null +} + +And(~'^the similarity tolerance is configured to "([^"]*)"$') { int similarityTolerance-> + TestDataDissertacao.setSimilarityTolerance(similarityTolerance) +} + +When(~'^I upload the file "([^"]*)" which contains a dissertation entitled "([^"]*)"$') { String filename, title-> + + String path = new File(".").getCanonicalPath() + File.separator + "test" + File.separator + "functional" + File.separator + "steps" + File.separator + filename + TestDataDissertacao.uploadDissertacaoWithSimilarityAnalisys(path) + boolean result = TestDataDissertacao.verifyDissertationXML(title, path) + assert result + +} + +Then(~'^the system outputs a list of imported dissertations which contains the dissertation entitled "([^"]*)"$') { String title-> + def dissertation = Dissertacao.findByTitle(title) + assert dissertation != null +} + +And(~'^no new dissertation entitled "([^"]*)" is stored by the system$') { String title-> + def dissertation = Dissertacao.findByTitle(title) + assert dissertation == null +} + +Given(~'^I am at the XMLImport Page$') {-> + to LoginPage + at LoginPage + page.fillLoginData("admin", "adminadmin") + to XMLImportPage + at XMLImportPage +} + +And(~'^I select a xml file$') { -> + page.selectFile() +} + +When(~'^I click on "upload" without informing the tolerance level$') { -> + page.uploadClick() +} + +Then(~'^the system outputs an error message$') { -> + //qualquer navegador por padrão mostra uma mensagem de erro quando o atributo "required" está configurado + assert page.isRequiredEnabledOnToleranceSelect() +} + +Given(~'^the system has a orientation entitled "([^"]*)" stored$') { String title-> + //TestDataDissertacao.createDissertacao(title, "dissertation.txt", "University of Oxford") + OrientationTestDataAndOperations.createOrientation(title) + //def dissertation = Dissertacao.findByTitle(title); + def orientation = Orientation.findByTituloTese(title); + assert orientation != null +} + +When(~'^I upload the file "([^"]*)" which contains an orientation entitled "([^"]*)"$') { String filename, title-> + + String path = new File(".").getCanonicalPath() + File.separator + "test" + File.separator + "functional" + File.separator + "steps" + File.separator + filename + OrientationTestDataAndOperations.uploadOrientationWithSimilarityAnalisys(path) + boolean result = OrientationTestDataAndOperations.verifyOrientationXML(title, path) + assert result +} + +Then(~'^the system outputs a list of imported orientations which contains the orientation entitled "([^"]*)"$') { String title-> + def orientation = Orientation.findByTituloTese(title) + assert orientation != null +} + +And(~'^no new orientation entitled "([^"]*)" is stored by the system$') { String title-> + def orientation = Orientation.findByTituloTese(title) + assert orientation == null +} + +When(~'^I click on "upload" informing the tolerance level$') { -> + page.setToleranceValue(10) + page.uploadClick() +} + +Then(~'^the system outputs a successful message$') { -> + //se for um erro a mensagem é colocada em readErrorMessage + assert page.readFlashMessage() != null +} + +Then(~'^the system outputs a list of imported orientations which contains the orientations "([^"]*)" and "([^"]*)"$') { String title1, title2-> + def orientation1 = Orientation.findByTituloTese(title1) + def orientation2 = Orientation.findByTituloTese(title2) + assert orientation1 != null && orientation2 != null +} + +And(~'^the new orientation entitled "([^"]*)" is stored by the system$') { String title-> + def orientation = Orientation.findByTituloTese(title) + assert orientation != null +} + +Given(~'^the system has a journal article entitled "([^"]*)" stored$') { String title-> + ArticleTestDataAndOperations.createArticle(title, "article.pdf") + def periodico = Periodico.findByTitle(title); + assert periodico != null +} + +When(~'^I upload the file "([^"]*)" which contains a journal article entitled "([^"]*)"$') { String filename, title-> + + String path = new File(".").getCanonicalPath() + File.separator + "test" + File.separator + "functional" + File.separator + "steps" + File.separator + filename + ArticleTestDataAndOperations.uploadArticleWithSimilarityAnalysis(path) + boolean result = ArticleTestDataAndOperations.verifyJournalXML(title, path) + assert result +} + +Then(~'^the system does not store the journal article entitled "([^"]*)"$') { String title-> + def periodico = Periodico.findByTitle(title); + assert periodico == null +} + +And(~'^the journal article entitled "([^"]*)" still in the system$') { String title-> + def periodico = Periodico.findByTitle(title); + assert periodico != null +} + +Given(~'^the system has a journal article entitled "([^"]*)" stored with filename "([^"]*)"$') { String title, filename-> + ArticleTestDataAndOperations.createArticle(title, filename) + def periodico = Periodico.findByTitle(title); + assert periodico != null +} + +Then(~'^the system store the journal article entitled "([^"]*)"$') { String title-> + def periodico = Periodico.findByTitle(title); + assert periodico != null } \ No newline at end of file diff --git a/test/files/cv-duplicatedOrientationC.xml b/test/files/cv-duplicatedOrientationC.xml new file mode 100755 index 00000000..8be42eea --- /dev/null +++ b/test/files/cv-duplicatedOrientationC.xml @@ -0,0 +1,3092 @@ + + + + + + + + + + + + + + + + + + + + + + Theorem Proving and Algebra + Algebraic Semantics + + + + + + + + + + + + + + + + + + + + + + + + + + + Introduo a Programao (Orientada a Objetos com + Java) + + Programao Orientada a Objetos (e Java) + Engenharia de Software + Trabalho de Graduao em Engenharia de Software + + + + Paradigmas de Linguagens de Programao + Especificao de Sistemas Distribudos + Trabalho Individual em Engenharia de Software + + Introduo ao RUP--Rational Unified Process + Mtodos Formais + Programao Orientada a Objetos com AspectJ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/functional/pages/ArticlePages/ArticlesPage.groovy b/test/functional/pages/ArticlePages/ArticlesPage.groovy index 43f4a3ef..18291a6b 100644 --- a/test/functional/pages/ArticlePages/ArticlesPage.groovy +++ b/test/functional/pages/ArticlePages/ArticlesPage.groovy @@ -28,6 +28,7 @@ class ArticlesPage extends Page { $('a.create').click() } + def selectViewReports() { def listAnchors = $('a.list') def reportAnchor = listAnchors[1] @@ -46,7 +47,7 @@ class ArticlesPage extends Page { /** * @author Guilherme */ - def selectViewArticle(title) { + def selectViewArticle(String title) { def listDiv = $('div', id: 'list-periodico') def articleTable = (listDiv.find('table'))[0] def articleRow = articleTable.find('tbody').find('tr') diff --git a/test/functional/pages/BibTexMainMenuPage.groovy b/test/functional/pages/BibTexMainMenuPage.groovy new file mode 100644 index 00000000..b37649d7 --- /dev/null +++ b/test/functional/pages/BibTexMainMenuPage.groovy @@ -0,0 +1,31 @@ +package pages + +import geb.Page + +/** + * Created by Luís Delgado on 18/04/15. + */ +class BibTexMainMenuPage extends Page { + static url = "/bibtexmainmenu/home" + + static at = { + title ==~ /Member Listagem/ + } + + static content = { + bibTexEntry { + $("textarea", id: "bibtextManual") + } + buttonEntry { + $("input", id: "botao") + } + } + + def verificarEntrada(String bibtexManual){ + $(id: "bibtextManual").value() + } + + def select(String s) { + $(id: "botao").find('b', text: s).click() + } +} diff --git a/test/functional/pages/BibtexGenerateFilePage.groovy b/test/functional/pages/BibtexGenerateFilePage.groovy index 6ac1baca..67f4d7d7 100644 --- a/test/functional/pages/BibtexGenerateFilePage.groovy +++ b/test/functional/pages/BibtexGenerateFilePage.groovy @@ -19,4 +19,8 @@ class BibtexGenerateFilePage extends FormPage { def showBibtex() { $('a.Generate All BibTex').click() } -} + + def select(String s) { + $('div', id: 'status').find('a', text: s).click() + } +} \ No newline at end of file diff --git a/test/functional/pages/BookCreatePage.groovy b/test/functional/pages/BookCreatePage.groovy index b4768335..71eb43de 100644 --- a/test/functional/pages/BookCreatePage.groovy +++ b/test/functional/pages/BookCreatePage.groovy @@ -27,6 +27,11 @@ class BookCreatePage extends FormPage { } } + def fillBookDetails() { + def path = new File(".").getCanonicalPath() + File.separator + "test" + File.separator + "files" + File.separator + "TCS.pdf" + fillBookDetails(path, "Livro de Teste") + } + def fillBookDetails(title, filename) { fillTitle(title) $("form").publisher = "Person" diff --git a/test/functional/pages/BookPage.groovy b/test/functional/pages/BookPage.groovy index 2c658d49..0701fa19 100644 --- a/test/functional/pages/BookPage.groovy +++ b/test/functional/pages/BookPage.groovy @@ -1,6 +1,7 @@ package pages import geb.Page +import rgms.publication.Book /** * Created with IntelliJ IDEA. @@ -29,4 +30,57 @@ class BookPage extends Page { def selectNewBook() { $('a.create').click() } + + def selectOrderBy(sortType){ + switch (sortType) { + case 'title': + $('a[href="/rgms/book/list?sort=title&max=10&order=asc"]').click() + break + case 'publication date': + $('a[href="/rgms/book/list?sort=publicationDate&max=10&order=asc"]').click() + break + } + } + + def checkOrderedBy(sortType){ + def firstBookColumns = this.getBookColumns(0) + def secondBookColumns = this.getBookColumns(1) + switch (sortType) { + case 'title': + assert firstBookColumns[0].text().compareTo(secondBookColumns[0].text()) < 0 + break + case 'publication date': + assert firstBookColumns[1].text().compareTo(secondBookColumns[1].text()) < 0 + break + } + } + + def getBookColumns(row){ + def listDiv = $('div', id: 'list-book') + def bookTable = (listDiv.find('table'))[0] + def bookRows = bookTable.find('tbody').find('tr') + def bookColumns = bookRows[row].find('td') + return bookColumns + } + + def select(String s) { + $('div', id: 'status').find('a', text: s).click() + } + + def checkBookAtList(title, row) { + def bookColumns = this.getBookColumns(row) + bookColumns[1].text() == "Livro de Teste" + bookColumns[2].text() == "[]" + bookColumns[3].text() == "TCS-88.pdf" + bookColumns[4].text() == "[]" + + } + + def selectViewBook(String title) { + def listDiv = $('div', id: 'list-book') + def bookTable = (listDiv.find('table'))[0] + def bookRow = bookTable.find('tbody').find('tr') + def showLink = bookRow.find('td').find([text: title]) + showLink.click() + } } \ No newline at end of file diff --git a/test/functional/pages/BookShowPage.groovy b/test/functional/pages/BookShowPage.groovy new file mode 100644 index 00000000..af19bf4b --- /dev/null +++ b/test/functional/pages/BookShowPage.groovy @@ -0,0 +1,55 @@ +//#if($Book) +package pages + +/** +* Created by Luis on 26/05/2015. +*/ + +import geb.Page +import pages.GetPageTitle + +class BookShowPage extends Page { + static url = "book/show/1" + + static at = { + //title ==~ /Ver Book/ + GetPageTitle gp = new GetPageTitle() + def currentBook = gp.getMessageServerLocale("default.book.label") + title ==~ gp.msg("default.list.label", [currentBook]) + } + + static content = { + } + + def select(String e, v) { + if (v == 'delete') { + assert withConfirm(true) { $("form").find(e, class: v).click() } + } else { + $("form").find(e, class: v).click() + } + } +//#if ($Twitter) + def clickOnTwitteIt(String login, pw) { + $("#button_twitter").click() + //$("#password").text = login + //$("#username_or_email").text = pw + //$("input", type:"submit", class:"button selected submit", value:"Entrar e Tweetar").click() + // + } +//#end +//#if ($Facebook) + def clickOnFacebookIt(String login, pw, message) { + $("#share_facebook").click() + //$("#password").text = login + //$("#username_or_email").text = pw + //$("input", type:"submit", class:"button selected submit", value:"Entrar e Tweetar").click() + // + } + + def clickOnShareOnFacebook() { + $("form").find(id: 'share').click() + } +//#end +} +//#end + diff --git a/test/functional/pages/PublicationsPage.groovy b/test/functional/pages/PublicationsPage.groovy index 1607747c..f63eaac9 100644 --- a/test/functional/pages/PublicationsPage.groovy +++ b/test/functional/pages/PublicationsPage.groovy @@ -22,4 +22,8 @@ class PublicationsPage extends Page { def getLink(String linkName) { $('div#status a', text: linkName) } + + def verificarEntrada(String entrada) { + + } } diff --git a/test/functional/pages/ResearchGroup/ResearchGroupCreatePage.groovy b/test/functional/pages/ResearchGroup/ResearchGroupCreatePage.groovy index 77266b93..129a6717 100644 --- a/test/functional/pages/ResearchGroup/ResearchGroupCreatePage.groovy +++ b/test/functional/pages/ResearchGroup/ResearchGroupCreatePage.groovy @@ -18,6 +18,22 @@ class ResearchGroupCreatePage extends Page { $("form").description = "A research group called " + name } + def fillResearchGroupName(String name) { + $("form").name = name + } + + def fillResearchGroupTwitter(String twitter) { + $("form").twitter = twitter + } + + def fillResearchGroupDescription(String description) { + $("form").description = description + } + + def fillResearchGroupSigla(String sigla) { + $("form").sigla = sigla + } + def clickOnCreate() { $("input", name: "create").click() } diff --git a/test/functional/pages/ResearchGroup/ResearchGroupListPage.groovy b/test/functional/pages/ResearchGroup/ResearchGroupListPage.groovy index 9ad36b2c..9b78ed35 100644 --- a/test/functional/pages/ResearchGroup/ResearchGroupListPage.groovy +++ b/test/functional/pages/ResearchGroup/ResearchGroupListPage.groovy @@ -15,6 +15,10 @@ class ResearchGroupListPage extends Page { static content = { } + def select(String s) { + $('div', id: 'status').find('a', text: s).click() + } + def selectResearchGroup(String s) { $('div').find('a', text: s).click() } diff --git a/test/functional/pages/ResearchGroup/ResearchGroupShowPage.groovy b/test/functional/pages/ResearchGroup/ResearchGroupShowPage.groovy index c867a110..aa501f7c 100644 --- a/test/functional/pages/ResearchGroup/ResearchGroupShowPage.groovy +++ b/test/functional/pages/ResearchGroup/ResearchGroupShowPage.groovy @@ -1,14 +1,16 @@ package pages.ResearchGroup import geb.Page +import pages.GetPageTitle class ResearchGroupShowPage extends Page { static url = "researchGroup/show/1" static at = { - - title ==~ /Ver Grupo de Pesquisa/ - + GetPageTitle gp = new GetPageTitle() + def memberLabel = gp.msg("researchGroup.label") + def createLabel = gp.msg("default.create.label", [researchGroupLabel]) + title ==~ createLabel } static content = { @@ -32,6 +34,15 @@ class ResearchGroupShowPage extends Page { assert html != null } + def clickHtml() { + def html = $('form').find([title: "HTML"]).click() + } + + def clickXML() { + def html = $('form').find([title: "XML"]).click() + } + + def checkXml() { def xml = $('form').find([title: "XML"]) assert xml != null diff --git a/test/functional/pages/XMLImportPage.groovy b/test/functional/pages/XMLImportPage.groovy index 49ee322d..4137146b 100644 --- a/test/functional/pages/XMLImportPage.groovy +++ b/test/functional/pages/XMLImportPage.groovy @@ -2,6 +2,7 @@ package pages import geb.Page + /** * User: Raony Benjamim [RBAA] * Date: 29/08/13 @@ -20,6 +21,20 @@ class XMLImportPage extends Page { title ==~ currentTitle } + static content = { + //readFlashMessage(){ $("div .message").text() } + //readErrorsMessage() { $("div.errors").text() } + } + + String readFlashMessage(){ + String str = $("div .message").text().toString() + return str + } + + String readErrorsMessage() { + return $("div .errors").text() + } + def selectButton(String name) { $('form').find('a', text: name).click() } @@ -27,4 +42,20 @@ class XMLImportPage extends Page { def uploadWithoutFile(){ $('input.save').click() } + + def selectFile(){ + $("fileInput").value("C:\\fakepath\\curriculo5.xml") + } + + def uploadClick(){ + $('input.save').click() + } + + boolean isRequiredEnabledOnToleranceSelect(){ + return $("#toleranceSelect").getAttribute("required") + } + + def setToleranceValue(int value) { + $("#toleranceSelect").value(value) + } } diff --git a/test/functional/steps/ArticleTestDataAndOperations.groovy b/test/functional/steps/ArticleTestDataAndOperations.groovy index 390bd57f..d180e68d 100644 --- a/test/functional/steps/ArticleTestDataAndOperations.groovy +++ b/test/functional/steps/ArticleTestDataAndOperations.groovy @@ -41,6 +41,15 @@ class ArticleTestDataAndOperations { cont.response.reset() } + static public void uploadArticleWithSimilarityAnalysis(filename) { + + def cont = new XMLController() + def xml = new File(filename); + def records = new XmlParser() + cont.saveJournalsWithSimilarityAnalysis(records.parse(xml)) + cont.response.reset() + } + static public boolean compatibleTo(article, title) { def testarticle = findArticleByTitle(title) def compatible = false @@ -61,7 +70,11 @@ class ArticleTestDataAndOperations { static public void createArticle(String title, filename, date, authorName) { def cont = new PeriodicoController() - cont.params << ArticleTestDataAndOperations.findArticleByTitle(title) << [file: filename] + def journal = [journal: "Theoretical Computer Science", volume: 455, number: 1, pages: "2-30", + title: title, + publicationDate: (new Date("12 October 2012"))] + //cont.params << ArticleTestDataAndOperations.findArticleByTitle(title) << [file: filename] + cont.params << journal << [file: filename] if(date!=null){ cont.params["publicationDate"] = new Date(date) } @@ -164,5 +177,15 @@ class ArticleTestDataAndOperations { cont.params << [check: ids] cont.deleteMultiples() } + + static public boolean verifyJournalXML(String title, String filename) + { + def cont = new XMLController() + def xml = new File(filename); + def records = new XmlParser() + boolean result = cont.verifyJournals(title, records.parse(xml)); + cont.response.reset() + return result; + } } diff --git a/test/functional/steps/BookTestDataAndOperations.groovy b/test/functional/steps/BookTestDataAndOperations.groovy index a6a8f379..43f114c3 100644 --- a/test/functional/steps/BookTestDataAndOperations.groovy +++ b/test/functional/steps/BookTestDataAndOperations.groovy @@ -27,9 +27,17 @@ class BookTestDataAndOperations { } } - static public void createBook(String title, String filename) { + static public void createBook(String title, filename) { + createBook(title, filename, null) + } + + static public void createBook(String title, filename, authorName) { def cont = new BookController() - cont.params << findBookByTitle(title) << [file: filename] + cont.params << BookTestDataAndOperations.findBookByTitle(title) << [file: filename] + if(authorName!=null){ + cont.params["authors"] = authorName + + } cont.request.setContent(new byte[1000]) cont.create() cont.save() @@ -76,4 +84,45 @@ class BookTestDataAndOperations { } return compatible } + + static public boolean containsBook(title, books) { + def testBook = Book.findByTitle(title) + def cont = new BookController() + def result = cont.list().bookInstanceList + return result.contains(testBook) + } + + static public def isSorted(books,sortType) { + def isSorted = false + switch (sortType) { + case 'title': + isSorted = (books.size() < 2 || (1.. findAllByAuthor(authorName) { + def cont = new BookController() + cont.params << [authorName: authorName] + return cont.filterByAuthor(2, authorName) + } + + static public def isFiltered(books,authorName) { + for (book in books) { + if (book.authors!=null) { + if (!(book.authors).contains(authorName)) + return false + } + } + return true + } + + static public void removeMultiplesBooks(String title1, String title2) { + def testBook1 = Book.findByTitle(title1) + def testBook2 = Book.findByTitle(title2) + def cont = new BookController() + cont.params << [id: testBook1.id, id2: testBook2.id] + cont.deleteMultiples(testBook1.id, testBook2.id) + } } diff --git a/test/functional/steps/OrientationTestDataAndOperations.groovy b/test/functional/steps/OrientationTestDataAndOperations.groovy index b1f88aed..05498281 100644 --- a/test/functional/steps/OrientationTestDataAndOperations.groovy +++ b/test/functional/steps/OrientationTestDataAndOperations.groovy @@ -37,6 +37,14 @@ class OrientationTestDataAndOperations { createOrientationAux(cont, tituloTese, member) } + static public void uploadOrientationWithSimilarityAnalisys(filename) { + def cont = new XMLController() + def xml = new File(filename); + def records = new XmlParser() + cont.saveOrientationsWithSimilarityAnalisys(records.parse(xml)); + cont.response.reset() + } + private static void createOrientationAux(OrientationController cont, String tituloTese, Member member) { cont.params << [tipo: "Mestrado", orientando: "Tomaz", tituloTese: tituloTese, anoPublicacao: 2013, instituicao: "UFPE", orientador: member] cont.request.setContent(new byte[1000]) // Could also vary the request content. @@ -84,4 +92,14 @@ class OrientationTestDataAndOperations { cont.saveOrientations(records.parse(xml)); cont.response.reset() } + + static public boolean verifyOrientationXML(String title, String filename) + { + def cont = new XMLController() + def xml = new File(filename); + def records = new XmlParser() + boolean result = cont.verifyOrientations(title, records.parse(xml)); + cont.response.reset() + return result; + } } diff --git a/test/functional/steps/TestDataAndOperationsFacebook.groovy b/test/functional/steps/TestDataAndOperationsFacebook.groovy index 48627a38..465e08a2 100644 --- a/test/functional/steps/TestDataAndOperationsFacebook.groovy +++ b/test/functional/steps/TestDataAndOperationsFacebook.groovy @@ -18,4 +18,11 @@ class TestDataAndOperationsFacebook { member.facebook_id = "100006411132660" PublicationController.sendPostFacebook(member, title) } + + static public void ShareBookOnFacebook(String title){ + def member = new Member() + member.access_token = "CAAJIlmRWCUwBAN0r1puBTUa4vDZAKxWWlR5gN4qtgZAosBDKGUOLBquyKuHYQ0zxICioiarTJ66mpdZC08U4rHJOrtvXJCB8hMBcLKlQaTdwYZCgMTJtbFnQfIBZAxi6hRIkfw2fCSyCS6DuFIrGRThI53ZCzBOLsZD" + member.facebook_id = "100006411132660" + PublicationController.sendPostFacebook(member, title) + } } diff --git a/test/functional/steps/TestDataAndOperationsMembers.groovy b/test/functional/steps/TestDataAndOperationsMembers.groovy new file mode 100644 index 00000000..27e7968d --- /dev/null +++ b/test/functional/steps/TestDataAndOperationsMembers.groovy @@ -0,0 +1,55 @@ +package steps + +import rgms.member.ResearchGroup +import rgms.member.ResearchGroupController + +/** + * Created with IntelliJ IDEA. + * User: Alberto Junior + * Date: 27/08/13 + * Time: 21:43 + * To change this template use File | Settings | File Templates. + */ +class TestDataAndOperationsMembers { + + static public void createResearchGroup(String name, description) { + def researchGroupController = new ResearchGroupController() + researchGroupController.params << [name: name] << [description: description] + researchGroupController.request.setContent(new byte[1000]) // Could also vary the request content. + researchGroupController.create() + researchGroupController.save() + researchGroupController.response.reset() + } + + static public void editResearchGroup(def researchGroup, String newName, String newDescription) { + def researchGroupController = new ResearchGroupController() + researchGroupController.params << [name: newName] << [description: newDescription] << [id: researchGroup.getId()] + researchGroupController.request.setContent(new byte[1000]) // Could also vary the request content. + researchGroupController.edit() + researchGroupController.save() + researchGroupController.response.reset() + } + + //#if($researchGroupHierarchy) + static public void editResearchGroupChildOf(ResearchGroup researchGroup, ResearchGroup researchGroupParent) { + def researchGroupController = new ResearchGroupController() + researchGroupController.params << [name: researchGroup.name] + researchGroupController.params << [description: researchGroup.description] + researchGroupController.params << [id: researchGroup.id] + researchGroupController.params << [childOf: researchGroupParent] + researchGroupController.request.setContent(new byte[1000]) // Could also vary the request content. + + try { + researchGroupController.update() + } catch (Exception e) {} + } + //#end + + static public void deleteResearchGroup(def researchGroup) { + def researchGroupController = new ResearchGroupController() + researchGroupController.params << [id: researchGroup.getId()] + researchGroupController.request.setContent(new byte[1000]) // Could also vary the request content. + researchGroupController.delete() + researchGroupController.response.reset() + } +} diff --git a/test/functional/steps/TestDataBibTexFile.groovy b/test/functional/steps/TestDataBibTexFile.groovy index 96535029..0cef82b3 100644 --- a/test/functional/steps/TestDataBibTexFile.groovy +++ b/test/functional/steps/TestDataBibTexFile.groovy @@ -9,4 +9,29 @@ class TestDataBibTexFile BibtexFileController bibtexFileController = new BibtexFileController() BibtexFile bibtexFile = bibtexFileController.transform(new File(path)) } + + static public def createBibTexFile(String bibtexFormat){ + BibtexFileController bibtexFileController = new BibtexFileController() + BibtexFile bibtexFile = bibtexFileController.transform(bibtexFormat) + + return bibtexFile + } + + static public boolean checkValid(String bibtex){ + boolean valid = false + + /* Search for Commas */ + for (i in bibtex.each()){ + if (i == ',') + valid = true + } + + /* Search for bibtex tags that maybe are missing */ + //if (valid) { + //def tags = ['author', 'title', 'journal'] + //for (i in bibtex.split(',')) + //} + + return valid + } } \ No newline at end of file diff --git a/test/functional/steps/TestDataDissertacao.groovy b/test/functional/steps/TestDataDissertacao.groovy index a7e034fa..67496101 100644 --- a/test/functional/steps/TestDataDissertacao.groovy +++ b/test/functional/steps/TestDataDissertacao.groovy @@ -51,6 +51,14 @@ class TestDataDissertacao cont.response.reset() } + static public void uploadDissertacaoWithSimilarityAnalisys(filename) { + def cont = new XMLController() + def xml = new File(filename); + def records = new XmlParser() + cont.saveDissertationsWithSimilarityAnalisys(records.parse(xml)); + cont.response.reset() + } + static public void removeDissertacao(String title) { def testDissertation = Dissertacao.findByTitle(title) def cont = new DissertacaoController() @@ -59,4 +67,19 @@ class TestDataDissertacao cont.delete() } + static public void setSimilarityTolerance(int value) + { + XMLController.similarityTolerance = value + } + + static public boolean verifyDissertationXML(String title, String filename) + { + def cont = new XMLController() + def xml = new File(filename); + def records = new XmlParser() + boolean result = cont.verifyDissertations(title, records.parse(xml)); + cont.response.reset() + return result; + } + } \ No newline at end of file diff --git a/test/functional/steps/curriculo5.xml b/test/functional/steps/curriculo5.xml new file mode 100644 index 00000000..ec52c363 --- /dev/null +++ b/test/functional/steps/curriculo5.xml @@ -0,0 +1 @@ +Algebraic SemanticsTheorem Proving and AlgebraEngenharia de SoftwareIntroduo a Programao (Orientada a Objetos com Java)Programao Orientada a Objetos (e Java)Trabalho de Graduao em Engenharia de SoftwareEspecificao de Sistemas DistribudosIntroduo ao RUP--Rational Unified ProcessMtodos Formais (Especificaes Algbricas)Novos Conceitos de Modularidade de SoftwareParadigmas de Linguagens de ProgramaoProgramao Orientada a Aspectos com AspectJTrabalho Individual em Engenharia de SoftwareProgramao Orientada a Objetos (e Java)Orientao a Objetos com Java e J2ME (dezembro de 2002 e janeiro de 2003, junho e julho de 2003, janeiro e fevereiro de 2004, outubro de 2004, janeiro e fevereiro de 2005, junho e julho de 2005, maro de 2006, setembro e outubro de 2006, abril de 200Engenharia de Software (Programa de Capacitao Tecnolgica da Motorola)Introduo e Administrao de Sistemas UNIX (Extenso para a FISEPE)Orientao a Objetos e Java (InfoCampus, UFPE)Programming, Testing and Distribution with Java (Summer School on Object-Oriented Processes and Technologies) \ No newline at end of file diff --git a/test/functional/steps/curriculo6.xml b/test/functional/steps/curriculo6.xml new file mode 100644 index 00000000..166e83af --- /dev/null +++ b/test/functional/steps/curriculo6.xml @@ -0,0 +1 @@ +Algebraic SemanticsTheorem Proving and AlgebraEngenharia de SoftwareIntroduo a Programao (Orientada a Objetos com Java)Programao Orientada a Objetos (e Java)Trabalho de Graduao em Engenharia de SoftwareEspecificao de Sistemas DistribudosIntroduo ao RUP--Rational Unified ProcessMtodos Formais (Especificaes Algbricas)Novos Conceitos de Modularidade de SoftwareParadigmas de Linguagens de ProgramaoProgramao Orientada a Aspectos com AspectJTrabalho Individual em Engenharia de SoftwareProgramao Orientada a Objetos (e Java)Orientao a Objetos com Java e J2ME (dezembro de 2002 e janeiro de 2003, junho e julho de 2003, janeiro e fevereiro de 2004, outubro de 2004, janeiro e fevereiro de 2005, junho e julho de 2005, maro de 2006, setembro e outubro de 2006, abril de 200Engenharia de Software (Programa de Capacitao Tecnolgica da Motorola)Introduo e Administrao de Sistemas UNIX (Extenso para a FISEPE)Orientao a Objetos e Java (InfoCampus, UFPE)Programming, Testing and Distribution with Java (Summer School on Object-Oriented Processes and Technologies) \ No newline at end of file diff --git a/web-app/reports/report_Bundle/researchGroup.jasper b/web-app/reports/report_Bundle/researchGroup.jasper deleted file mode 100644 index d7f9e2de..00000000 --- a/web-app/reports/report_Bundle/researchGroup.jasper +++ /dev/null @@ -1,898 +0,0 @@ - - - - - - - - - rgms/web-app/reports/report_Bundle/researchGroup.jasper at 277779e1ba92798de756e55ad3396f4aebc9f5e0 · spgroup/rgms - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - -
    -
    - - - - - -
    - - - - -
    - - -
    -
    - - - - - - - - - - -
    -
    - -
    - - - - - - - - - - -
    -
    - - - - - - - -
    -
    - -
    -
    -
    - - - -
      - -
    • - Pull Request -
    • - -
    • -
      - -
      - - - - Unwatch - - - -
      -
      -
      - Notification status - -
      - -
      - -
      - -
      - -

      Not watching

      - You only receive notifications for discussions in which you participate or are @mentioned. - - - Watch - -
      -
      - -
      - -
      - -

      Watching

      - You receive notifications for all discussions in this repository. - - - Unwatch - -
      -
      - -
      - -
      - -

      Ignoring

      - You do not receive any notifications for discussions in this repository. - - - Stop ignoring - -
      -
      - -
      - -
      -
      -
      - -
      -
    • - -
    • - - - Unstar - - - - Star - - -
    • - -
    • - - - Fork - - -
    • - - -
    - -

    - public - - - / - rgms -

    -
    - - - - -
    - - - - - - -
    - - -
    - - - tree: - 277779e1ba - - -
    - -
    -
    - Switch branches/tags - -
    - -
    -
    - -
    -
    - -
    -
    - -
    - -
    - -
    - - master -
    -
    - - rsmbf-master -
    -
    - -
    - - -
    -

    Create branch:

    - from ‘277779e1ba92798de756e55ad3396f4aebc9f5e0’ -
    - - - -
    - -
    - - -
    -
    - -
    - -
    Nothing to show
    - -
    - -
    -
    -
    - -
    - - - -
    - - - - - - - -
    -
    - -
    - - - - - - - -
    -
    - - - - - - - - - -
    - - - - - - - -
    - - -
    - -
    -
    - -
    -
    -
    -
    - - file - 299 lines (299 sloc) - 63.224 kb -
    -
    -
    - Edit - Raw - Blame - History -
    -
    - -
    -
    - - - - - -
    -
    1
    -2
    -3
    -4
    -5
    -6
    -7
    -8
    -9
    -10
    -11
    -12
    -13
    -14
    -15
    -16
    -17
    -18
    -19
    -20
    -21
    -22
    -23
    -24
    -25
    -26
    -27
    -28
    -29
    -30
    -31
    -32
    -33
    -34
    -35
    -36
    -37
    -38
    -39
    -40
    -41
    -42
    -43
    -44
    -45
    -46
    -47
    -48
    -49
    -50
    -51
    -52
    -53
    -54
    -55
    -56
    -57
    -58
    -59
    -60
    -61
    -62
    -63
    -64
    -65
    -66
    -67
    -68
    -69
    -70
    -71
    -72
    -73
    -74
    -75
    -76
    -77
    -78
    -79
    -80
    -81
    -82
    -83
    -84
    -85
    -86
    -87
    -88
    -89
    -90
    -91
    -92
    -93
    -94
    -95
    -96
    -97
    -98
    -99
    -100
    -101
    -102
    -103
    -104
    -105
    -106
    -107
    -108
    -109
    -110
    -111
    -112
    -113
    -114
    -115
    -116
    -117
    -118
    -119
    -120
    -121
    -122
    -123
    -124
    -125
    -126
    -127
    -128
    -129
    -130
    -131
    -132
    -133
    -134
    -135
    -136
    -137
    -138
    -139
    -140
    -141
    -142
    -143
    -144
    -145
    -146
    -147
    -148
    -149
    -150
    -151
    -152
    -153
    -154
    -155
    -156
    -157
    -158
    -159
    -160
    -161
    -162
    -163
    -164
    -165
    -166
    -167
    -168
    -169
    -170
    -171
    -172
    -173
    -174
    -175
    -176
    -177
    -178
    -179
    -180
    -181
    -182
    -183
    -184
    -185
    -186
    -187
    -188
    -189
    -190
    -191
    -192
    -193
    -194
    -195
    -196
    -197
    -198
    -199
    -200
    -201
    -202
    -203
    -204
    -205
    -206
    -207
    -208
    -209
    -210
    -211
    -212
    -213
    -214
    -215
    -216
    -217
    -218
    -219
    -220
    -221
    -222
    -223
    -224
    -225
    -226
    -227
    -228
    -229
    -230
    -231
    -232
    -233
    -234
    -235
    -236
    -237
    -238
    -239
    -240
    -241
    -242
    -243
    -244
    -245
    -246
    -247
    -248
    -249
    -250
    -251
    -252
    -253
    -254
    -255
    -256
    -257
    -258
    -259
    -260
    -261
    -262
    -263
    -264
    -265
    -266
    -267
    -268
    -269
    -270
    -271
    -272
    -273
    -274
    -275
    -276
    -277
    -278
    -279
    -280
    -281
    -282
    -283
    -284
    -285
    -286
    -287
    -288
    -289
    -290
    -291
    -292
    -293
    -294
    -295
    -296
    -297
    -298
    -299
    -
    -
    -
    ��sr(net.sf.jasperreports.engine.JasperReport'�L compileDatatLjava/io/Serializable;LcompileNameSuffixtLjava/lang/String;L
    compilerClassq~xr-net.sf.jasperreports.engine.base.JRBaseReport'�*IPSEUDO_SERIAL_VERSION_UIDI bottomMarginI columnCountI
    columnSpacingI columnWidthZignorePaginationZisFloatColumnFooterZisSummaryNewPageZ isSummaryWithPageHeaderAndFooterZisTitleNewPageI
    leftMarginB orientationI
    pageHeightI pageWidthB
    printOrderI rightMarginI topMarginBwhenNoDataTypeL
    backgroundt$Lnet/sf/jasperreports/engine/JRBand;LcolumnDirectiont3Lnet/sf/jasperreports/engine/type/RunDirectionEnum;L columnFooterq~L columnHeaderq~[datasetst([Lnet/sf/jasperreports/engine/JRDataset;L defaultStylet%Lnet/sf/jasperreports/engine/JRStyle;Ldetailq~L
    detailSectiont'Lnet/sf/jasperreports/engine/JRSection;LformatFactoryClassq~L
    importsSettLjava/util/Set;Llanguageq~LlastPageFooterq~L mainDatasett'Lnet/sf/jasperreports/engine/JRDataset;Lnameq~LnoDataq~LorientationValuet2Lnet/sf/jasperreports/engine/type/OrientationEnum;L
    pageFooterq~L
    pageHeaderq~LprintOrderValuet1Lnet/sf/jasperreports/engine/type/PrintOrderEnum;[stylest&[Lnet/sf/jasperreports/engine/JRStyle;Lsummaryq~[ templatest/[Lnet/sf/jasperreports/engine/JRReportTemplate;Ltitleq~LwhenNoDataTypeValuet5Lnet/sf/jasperreports/engine/type/WhenNoDataTypeEnum;xp��JSsr+net.sf.jasperreports.engine.base.JRBaseBand'�IPSEUDO_SERIAL_VERSION_UIDIheightZisSplitAllowedLprintWhenExpressiont*Lnet/sf/jasperreports/engine/JRExpression;L splitTypetLjava/lang/Byte;LsplitTypeValuet0Lnet/sf/jasperreports/engine/type/SplitTypeEnum;xr3net.sf.jasperreports.engine.base.JRBaseElementGroup'�LchildrentLjava/util/List;L elementGroupt,Lnet/sf/jasperreports/engine/JRElementGroup;xpsrjava.util.ArrayListx����a�Isizexpw
    xp��pp~r.net.sf.jasperreports.engine.type.SplitTypeEnumxrjava.lang.EnumxptSTRETCH~r1net.sf.jasperreports.engine.type.RunDirectionEnumxq~tLTRsq~sq~w
    xp��-ppq~sq~sq~w
    xp��ppq~ur([Lnet.sf.jasperreports.engine.JRDataset;L6�ͬ�Dxpsr.net.sf.jasperreports.engine.base.JRBaseDataset'�IPSEUDO_SERIAL_VERSION_UIDZisMainBwhenResourceMissingType[fieldst&[Lnet/sf/jasperreports/engine/JRField;LfilterExpressionq~[groupst&[Lnet/sf/jasperreports/engine/JRGroup;Lnameq~[
    parameterst*[Lnet/sf/jasperreports/engine/JRParameter;L
    propertiesMapt-Lnet/sf/jasperreports/engine/JRPropertiesMap;Lqueryt%Lnet/sf/jasperreports/engine/JRQuery;LresourceBundleq~LscriptletClassq~[
    scriptletst*[Lnet/sf/jasperreports/engine/JRScriptlet;[
    sortFieldst*[Lnet/sf/jasperreports/engine/JRSortField;[ variablest)[Lnet/sf/jasperreports/engine/JRVariable;LwhenResourceMissingTypeValuet>Lnet/sf/jasperreports/engine/type/WhenResourceMissingTypeEnum;xp��ur&[Lnet.sf.jasperreports.engine.JRField;<��N*�pxpsr,net.sf.jasperreports.engine.base.JRBaseField'�L descriptionq~Lnameq~L
    propertiesMapq~,LvalueClassNameq~LvalueClassRealNameq~xpptidsr+net.sf.jasperreports.engine.JRPropertiesMap'�Lbaseq~,LpropertiesListq~L
    propertiesMaptLjava/util/Map;xpppptjava.lang.Longpsq~5ptversionsq~8ppptjava.lang.Longpsq~5ptpublication_datesq~8ppptjava.sql.Timestamppsq~5pttitlesq~8ppptjava.lang.Stringpsq~5ptpublication_titlesq~8ppptjava.lang.Stringppptdataset2ur*[Lnet.sf.jasperreports.engine.JRParameter;" �*�`!xpsr0net.sf.jasperreports.engine.base.JRBaseParameter'� ZisForPromptingZisSystemDefinedLdefaultValueExpressionq~L descriptionq~Lnameq~LnestedTypeNameq~L
    propertiesMapq~,LvalueClassNameq~LvalueClassRealNameq~xppptREPORT_CONTEXTpsq~8pppt)net.sf.jasperreports.engine.ReportContextpsq~OpptREPORT_PARAMETERS_MAPpsq~8pppt
    java.util.Mappsq~Oppt
    JASPER_REPORTpsq~8pppt(net.sf.jasperreports.engine.JasperReportpsq~OpptREPORT_CONNECTIONpsq~8ppptjava.sql.Connectionpsq~OpptREPORT_MAX_COUNTpsq~8ppptjava.lang.Integerpsq~OpptREPORT_DATA_SOURCEpsq~8pppt(net.sf.jasperreports.engine.JRDataSourcepsq~OpptREPORT_SCRIPTLETpsq~8pppt/net.sf.jasperreports.engine.JRAbstractScriptletpsq~Oppt
    REPORT_LOCALEpsq~8ppptjava.util.Localepsq~OpptREPORT_RESOURCE_BUNDLEpsq~8ppptjava.util.ResourceBundlepsq~OpptREPORT_TIME_ZONEpsq~8ppptjava.util.TimeZonepsq~OpptREPORT_FORMAT_FACTORYpsq~8pppt.net.sf.jasperreports.engine.util.FormatFactorypsq~OpptREPORT_CLASS_LOADERpsq~8ppptjava.lang.ClassLoaderpsq~OpptREPORT_URL_HANDLER_FACTORYpsq~8pppt java.net.URLStreamHandlerFactorypsq~OpptREPORT_FILE_RESOLVERpsq~8pppt-net.sf.jasperreports.engine.util.FileResolverpsq~OpptREPORT_TEMPLATESpsq~8ppptjava.util.Collectionpsq~Oppt SORT_FIELDSpsq~8ppptjava.util.Listpsq~OpptFILTERpsq~8pppt)net.sf.jasperreports.engine.DatasetFilterpsq~8pppsr,net.sf.jasperreports.engine.base.JRBaseQuery'�[chunkst+[Lnet/sf/jasperreports/engine/JRQueryChunk;Llanguageq~xpur+[Lnet.sf.jasperreports.engine.JRQueryChunk;@���4�xpsr1net.sf.jasperreports.engine.base.JRBaseQueryChunk'�BtypeLtextq~[tokenst[Ljava/lang/String;xpt�SELECT
         *,
         publication.`title` AS publication_title,
         publication.`publication_date` AS publication_publication_date
    FROM
         `publication` publicationptsqlppppur)[Lnet.sf.jasperreports.engine.JRVariable;b�|�,�Dxpsr/net.sf.jasperreports.engine.base.JRBaseVariable'�IPSEUDO_SERIAL_VERSION_UIDB calculationB
    incrementTypeZisSystemDefinedB resetTypeLcalculationValuet2Lnet/sf/jasperreports/engine/type/CalculationEnum;L
    expressionq~LincrementGroupt%Lnet/sf/jasperreports/engine/JRGroup;LincrementTypeValuet4Lnet/sf/jasperreports/engine/type/IncrementTypeEnum;LincrementerFactoryClassNameq~LincrementerFactoryClassRealNameq~LinitialValueExpressionq~Lnameq~L
    resetGroupq~�LresetTypeValuet0Lnet/sf/jasperreports/engine/type/ResetTypeEnum;LvalueClassNameq~LvalueClassRealNameq~xpw�~r0net.sf.jasperreports.engine.type.CalculationEnumxq~tSYSTEMpp~r2net.sf.jasperreports.engine.type.IncrementTypeEnumxq~tNONEppsr1net.sf.jasperreports.engine.base.JRBaseExpression'�Iid[chunkst0[Lnet/sf/jasperreports/engine/JRExpressionChunk;LvalueClassNameq~LvalueClassRealNameq~xpur0[Lnet.sf.jasperreports.engine.JRExpressionChunk;mY��iK�Uxpsr6net.sf.jasperreports.engine.base.JRBaseExpressionChunk'�BtypeLtextq~xptnew java.lang.Integer(1)ppt PAGE_NUMBERp~r.net.sf.jasperreports.engine.type.ResetTypeEnumxq~tREPORTq~cpsq~�w�q~�ppq~�ppsq~�uq~�sq~�tnew java.lang.Integer(1)ppt
    COLUMN_NUMBERp~q~�tPAGEq~cpsq~�w�~q~�tCOUNTsq~�uq~�sq~�tnew java.lang.Integer(1)pppq~�ppsq~�uq~�sq~�tnew java.lang.Integer(0)ppt REPORT_COUNTpq~�q~cpsq~�w�q~�sq~�uq~�sq~�tnew java.lang.Integer(1)pppq~�ppsq~�uq~�sq~�tnew java.lang.Integer(0)ppt
    PAGE_COUNTpq~�q~cpsq~�w�q~�sq~�uq~�sq~�tnew java.lang.Integer(1)pppq~�ppsq~�uq~�sq~�tnew java.lang.Integer(0)ppt COLUMN_COUNTp~q~�tCOLUMNq~cp~r<net.sf.jasperreports.engine.type.WhenResourceMissingTypeEnumxq~tNULLppsr.net.sf.jasperreports.engine.base.JRBaseSection'�[bandst%[Lnet/sf/jasperreports/engine/JRBand;xpur%[Lnet.sf.jasperreports.engine.JRBand;��~�ʅ5xpsq~sq~w
    xp��ppq~pptgroovypsq~(��uq~3sq~5ptidsq~8ppptjava.lang.Longpsq~5ptversionsq~8ppptjava.lang.Longpsq~5pt child_of_idsq~8ppptjava.lang.Longpsq~5pt descriptionsq~8ppptjava.lang.Stringpsq~5ptnamesq~8ppptjava.lang.Stringppptreportuq~Msq~Oppq~Qpsq~8pppq~Spsq~Oppq~Upsq~8pppq~Wpsq~Oppq~Ypsq~8pppq~[psq~Oppq~]psq~8pppq~_psq~Oppq~apsq~8pppq~cpsq~Oppq~epsq~8pppq~gpsq~Oppq~ipsq~8pppq~kpsq~Oppq~mpsq~8pppq~opsq~Oppq~qpsq~8pppq~spsq~Oppq~upsq~8pppq~wpsq~Oppq~ypsq~8pppq~{psq~Oppq~}psq~8pppq~psq~Oppq~�psq~8pppq~�psq~Oppq~�psq~8pppq~�psq~Oppq~�psq~8pppq~�psq~Oppq~�psq~8pppq~�psq~Oppq~�psq~8pppq~�psq~OpptREPORT_VIRTUALIZERpsq~8pppt)net.sf.jasperreports.engine.JRVirtualizerpsq~OpptIS_IGNORE_PAGINATIONpsq~8ppptjava.lang.Booleanpsq~Osq~�uq~�sq~�t-"..\\rgms\\web-app\\reports\\report_Bundle\\"pppt
    SUBREPORT_DIRpsq~8ppptjava.lang.Stringpsq~Opptresearch_group_idpsq~8ppptjava.lang.Stringpsq~8psq~w
    t ireport.zoomt ireport.xt ireport.yxsrjava.util.HashMap���`�F
    loadFactorI thresholdxp?@ wq~>t1.0q~?t0q~@t0xsq~�uq~�sq~�t:SELECT * FROM research_group where research_group.id=psq~�tresearch_group_idpsq~�t;pq~�treportpppuq~�sq~�w�q~�ppq~�ppsq~�uq~�sq~�tnew java.lang.Integer(1)ppq~�pq~�q~cpsq~�w�q~�ppq~�ppsq~�uq~�sq~�tnew java.lang.Integer(1)ppq~�pq~�q~cpsq~�w�q~�sq~�uq~�sq~�tnew java.lang.Integer(1)pppq~�ppsq~�uq~�sq~�tnew java.lang.Integer(0)ppq~�pq~�q~cpsq~�w�q~�sq~�uq~�sq~�tnew java.lang.Integer(1)pppq~�ppsq~�uq~�sq~�tnew java.lang.Integer(0)ppq~�pq~�q~cpsq~�w�q~�sq~�uq~�sq~�tnew java.lang.Integer(1)pppq~�ppsq~�uq~�sq~�tnew java.lang.Integer(0)ppq~�pq~�q~cpq~�q~p~r0net.sf.jasperreports.engine.type.OrientationEnumxq~tPORTRAITsq~sq~w
    xp��6ppq~sq~sq~w
    sr0net.sf.jasperreports.engine.base.JRBaseSubreport'�LconnectionExpressionq~LdataSourceExpressionq~L
    expressionq~L isUsingCachetLjava/lang/Boolean;[
    parameterst3[Lnet/sf/jasperreports/engine/JRSubreportParameter;LparametersMapExpressionq~[ returnValuest5[Lnet/sf/jasperreports/engine/JRSubreportReturnValue;L runToBottomq~}xr.net.sf.jasperreports.engine.base.JRBaseElement'�IPSEUDO_SERIAL_VERSION_UIDIheightZisPrintInFirstWholeBandZisPrintRepeatedValuesZisPrintWhenDetailOverflowsZisRemoveLineWhenBlankB positionTypeB stretchTypeIwidthIxIyL backcolortLjava/awt/Color;LdefaultStyleProvidert4Lnet/sf/jasperreports/engine/JRDefaultStyleProvider;L elementGroupq~L forecolorq~�Lkeyq~Lmodeq~L modeValuet+Lnet/sf/jasperreports/engine/type/ModeEnum;L parentStyleq~LparentStyleNameReferenceq~LpositionTypeValuet3Lnet/sf/jasperreports/engine/type/PositionTypeEnum;LprintWhenExpressionq~LprintWhenGroupChangesq~�L
    propertiesMapq~,[propertyExpressionst3[Lnet/sf/jasperreports/engine/JRPropertyExpression;LstretchTypeValuet2Lnet/sf/jasperreports/engine/type/StretchTypeEnum;xp��'r#&pq~q~zpppppp~r1net.sf.jasperreports.engine.type.PositionTypeEnumxq~tFIX_RELATIVE_TO_TOPpppp~r0net.sf.jasperreports.engine.type.StretchTypeEnumxq~t
    NO_STRETCHsq~� uq~�sq~�tREPORT_CONNECTIONpppsq~�
    uq~�sq~�t
    SUBREPORT_DIRsq~�t + "report1.jasper"pppppppsq~|��&�B$pq~q~zppppppq~�ppppq~�sq~�uq~�sq~�tREPORT_CONNECTIONpppsq~�uq~�sq~�t
    SUBREPORT_DIRsq~�t + "publications.jasper"pppppppsq~|��+�Bhpq~q~zppppppq~�ppppq~�sq~�uq~�sq~�tREPORT_CONNECTIONpppsq~�uq~�sq~�t
    SUBREPORT_DIRsq~�t + "ferramentas.jasper"pppppppsr0net.sf.jasperreports.engine.base.JRBaseTextField'�IPSEUDO_SERIAL_VERSION_UIDI
    bookmarkLevelBevaluationTimeBhyperlinkTargetB
    hyperlinkTypeZisStretchWithOverflowLanchorNameExpressionq~LevaluationGroupq~�LevaluationTimeValuet5Lnet/sf/jasperreports/engine/type/EvaluationTimeEnum;L
    expressionq~LhyperlinkAnchorExpressionq~LhyperlinkPageExpressionq~[hyperlinkParameterst3[Lnet/sf/jasperreports/engine/JRHyperlinkParameter;LhyperlinkReferenceExpressionq~LhyperlinkTooltipExpressionq~LisBlankWhenNullq~}L
    linkTargetq~LlinkTypeq~Lpatternq~LpatternExpressionq~xr2net.sf.jasperreports.engine.base.JRBaseTextElement'�%IPSEUDO_SERIAL_VERSION_UIDLborderq~L borderColorq~�L bottomBorderq~LbottomBorderColorq~�L
    bottomPaddingtLjava/lang/Integer;LfontNameq~LfontSizeq~�LhorizontalAlignmentq~LhorizontalAlignmentValuet6Lnet/sf/jasperreports/engine/type/HorizontalAlignEnum;LisBoldq~}LisItalicq~}L
    isPdfEmbeddedq~}LisStrikeThroughq~}L isStyledTextq~}L isUnderlineq~}L
    leftBorderq~LleftBorderColorq~�L leftPaddingq~�LlineBoxt'Lnet/sf/jasperreports/engine/JRLineBox;L lineSpacingq~LlineSpacingValuet2Lnet/sf/jasperreports/engine/type/LineSpacingEnum;Lmarkupq~Lpaddingq~�L paragrapht)Lnet/sf/jasperreports/engine/JRParagraph;L pdfEncodingq~L pdfFontNameq~L rightBorderq~LrightBorderColorq~�L rightPaddingq~�Lrotationq~L
    rotationValuet/Lnet/sf/jasperreports/engine/type/RotationEnum;L topBorderq~LtopBorderColorq~�L
    topPaddingq~�LverticalAlignmentq~LverticalAlignmentValuet4Lnet/sf/jasperreports/engine/type/VerticalAlignEnum;xq~����BOpq~q~zppppppq~�ppppq~���ppppppsrjava.lang.Integer⠤���8Ivaluexrjava.lang.Number��� ���xppppppppppppsr.net.sf.jasperreports.engine.base.JRBaseLineBox'� L
    bottomPaddingq~�L bottomPent+Lnet/sf/jasperreports/engine/base/JRBoxPen;L boxContainert,Lnet/sf/jasperreports/engine/JRBoxContainer;L leftPaddingq~�LleftPenq~�Lpaddingq~�Lpenq~�L rightPaddingq~�LrightPenq~�L
    topPaddingq~�LtopPenq~�xppsr3net.sf.jasperreports.engine.base.JRBaseBoxBottomPen'�xr-net.sf.jasperreports.engine.base.JRBaseBoxPen'�LlineBoxq~�xr*net.sf.jasperreports.engine.base.JRBasePen'�IPSEUDO_SERIAL_VERSION_UIDL lineColorq~�L lineStyleq~LlineStyleValuet0Lnet/sf/jasperreports/engine/type/LineStyleEnum;L lineWidthtLjava/lang/Float;L penContainert,Lnet/sf/jasperreports/engine/JRPenContainer;xp��ppppq~�q~�q~�psr1net.sf.jasperreports.engine.base.JRBaseBoxLeftPen'�xq~���ppppq~�q~�psq~���ppppq~�q~�psr2net.sf.jasperreports.engine.base.JRBaseBoxRightPen'�xq~���ppppq~�q~�psr0net.sf.jasperreports.engine.base.JRBaseBoxTopPen'�xq~���ppppq~�q~�ppppsr0net.sf.jasperreports.engine.base.JRBaseParagraph'�
    LfirstLineIndentq~�L
    leftIndentq~�L lineSpacingq~�LlineSpacingSizeq~�LparagraphContainert2Lnet/sf/jasperreports/engine/JRParagraphContainer;L rightIndentq~�L spacingAfterq~�L
    spacingBeforeq~�L tabStopWidthq~�LtabStopsq~xpppppq~�ppppppppppppppppp��pp~r3net.sf.jasperreports.engine.type.EvaluationTimeEnumxq~tNOWsq~�uq~�sq~�t ferramentasppppppppppppsq~����#pq~q~zppppppq~�ppppq~���ppppppq~�pppppppppppsq~�psq~���ppppq~�q~�q~�psq~���ppppq~�q~�psq~���ppppq~�q~�psq~���ppppq~�q~�psq~���ppppq~�q~�ppppsq~�ppppq~�ppppppppppppppppp��ppq~�sq~�uq~�sq~�tmembrosppppppppppppsq~����Bpq~q~zppppppq~�ppppq~���ppppppq~�pppppppppppsq~�psq~���ppppq~�q~�q~�psq~���ppppq~�q~�psq~���ppppq~�q~�psq~���ppppq~�q~�psq~���ppppq~�q~�ppppsq~�ppppq~�ppppppppppppppppp��ppq~�sq~�uq~�sq~�tpubsppppppppppppxp���ppq~~r/net.sf.jasperreports.engine.type.PrintOrderEnumxq~tVERTICALpsq~sq~w
    xp��*ppq~psq~sq~w
    sr,net.sf.jasperreports.engine.base.JRBaseImage'�*IPSEUDO_SERIAL_VERSION_UIDI
    bookmarkLevelBevaluationTimeBhyperlinkTargetB
    hyperlinkTypeZisLazyB onErrorTypeLanchorNameExpressionq~Lborderq~L borderColorq~�L bottomBorderq~LbottomBorderColorq~�L
    bottomPaddingq~�LevaluationGroupq~�LevaluationTimeValueq~�L
    expressionq~LhorizontalAlignmentq~LhorizontalAlignmentValueq~�LhyperlinkAnchorExpressionq~LhyperlinkPageExpressionq~[hyperlinkParametersq~�LhyperlinkReferenceExpressionq~LhyperlinkTooltipExpressionq~L isUsingCacheq~}L
    leftBorderq~LleftBorderColorq~�L leftPaddingq~�LlineBoxq~�L
    linkTargetq~LlinkTypeq~LonErrorTypeValuet2Lnet/sf/jasperreports/engine/type/OnErrorTypeEnum;Lpaddingq~�L rightBorderq~LrightBorderColorq~�L rightPaddingq~�L
    scaleImageq~LscaleImageValuet1Lnet/sf/jasperreports/engine/type/ScaleImageEnum;L topBorderq~LtopBorderColorq~�L
    topPaddingq~�LverticalAlignmentq~LverticalAlignmentValueq~�xr5net.sf.jasperreports.engine.base.JRBaseGraphicElement'�IPSEUDO_SERIAL_VERSION_UIDLfillq~L fillValuet+Lnet/sf/jasperreports/engine/type/FillEnum;LlinePent#Lnet/sf/jasperreports/engine/JRPen;Lpenq~xq~�����pq~q~�ppppppq~�ppppq~�w�ppsq~���ppppq~�p��pppppppq~�sq~� uq~�sq~�t("..\\rgms\\web-app\\images\\logoSPG.jpg"pppppppppppppsq~�psq~���ppppq~q~q~�psq~���ppppq~q~psq~���ppppq~q~psq~���ppppq~q~psq~���ppppq~q~pp~r0net.sf.jasperreports.engine.type.OnErrorTypeEnumxq~tERRORpppppppppppsq~���!d�pq~q~�ppppppq~�ppppq~���ppppppsq~�pppppppppppsq~�psq~���ppppq~q~q~
    psq~���ppppq~q~psq~���ppppq~q~psq~���ppppq~q~psq~���ppppq~q~ppppsq~�ppppq~
    ppppppppppppppppp��ppq~�sq~�
    uq~�sq~�tnameppppppppppppsq~���g\�5pq~q~�ppppppq~�ppppq~���ppppppsq~�pppppppppppsq~�psq~���ppppq~q~q~psq~���ppppq~q~psq~���ppppq~q~psq~���ppppq~q~psq~���ppppq~q~ppppsq~�ppppq~ppppppppppppppppp��ppq~�sq~� uq~�sq~�t descriptionppppppppppppxp���ppq~~r3net.sf.jasperreports.engine.type.WhenNoDataTypeEnumxq~tNO_PAGESsr6net.sf.jasperreports.engine.design.JRReportCompileData'�LcrosstabCompileDataq~9LdatasetCompileDataq~9LmainDatasetCompileDataq~xpsq~A?@ wxsq~A?@ wq~Lur[B���T�xp<�����/\#report_dataset2_1334191312525_14442,net/sf/jasperreports/engine/fill/JREvaluatorgroovy/lang/GroovyObject.calculator_report_dataset2_1334191312525_14442parameter_REPORT_LOCALE2Lnet/sf/jasperreports/engine/fill/JRFillParameter;parameter_JASPER_REPORTparameter_REPORT_TIME_ZONEparameter_SORT_FIELDSparameter_REPORT_FILE_RESOLVERparameter_REPORT_SCRIPTLETparameter_REPORT_PARAMETERS_MAPparameter_REPORT_CONNECTIONparameter_REPORT_CONTEXTparameter_REPORT_CLASS_LOADERparameter_REPORT_DATA_SOURCE$parameter_REPORT_URL_HANDLER_FACTORYparameter_FILTERparameter_REPORT_FORMAT_FACTORYparameter_REPORT_MAX_COUNTparameter_REPORT_TEMPLATES parameter_REPORT_RESOURCE_BUNDLEfield_id.Lnet/sf/jasperreports/engine/fill/JRFillField; field_titlefield_publication_titlefield_publication_date
    field_versionvariable_PAGE_NUMBER1Lnet/sf/jasperreports/engine/fill/JRFillVariable;variable_COLUMN_NUMBERvariable_REPORT_COUNTvariable_PAGE_COUNTvariable_COLUMN_COUNT$const$0Ljava/lang/Integer;$const$1$const$2$const$3$const$4$const$5$const$6$const$7$staticClassInfo*Lorg/codehaus/groovy/reflection/ClassInfo; metaClassLgroovy/lang/MetaClass; __timeStampLjava/lang/Long;)__timeStamp__239_neverHappen1334191312650<init>()V 67
    8$getCallSiteArray2()[Lorg/codehaus/groovy/runtime/callsite/CallSite; :;
    <<$get$$class$net$sf$jasperreports$engine$fill$JRFillParameter()Ljava/lang/Class; >?
    @1org/codehaus/groovy/runtime/ScriptBytecodeAdapterB
    castToType7(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object; DE
    CF0net/sf/jasperreports/engine/fill/JRFillParameterH  J
    L N P
    R  T  V  X  Z  \  ^  `  b  d  f  h  j8$get$$class$net$sf$jasperreports$engine$fill$JRFillField l?
    m,net/sf/jasperreports/engine/fill/JRFillFieldo  q  s  u  w  y;$get$$class$net$sf$jasperreports$engine$fill$JRFillVariable {?
    |/net/sf/jasperreports/engine/fill/JRFillVariable~ ! � "! � #! � $! � %! �$getStaticMetaClass()Lgroovy/lang/MetaClass; ��
    �!$get$$class$groovy$lang$MetaClass �?
    �groovy/lang/MetaClass� 12 �this%Lreport_dataset2_1334191312525_14442;customizedInit0(Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;)V-org/codehaus/groovy/runtime/callsite/CallSite� callCurrent@(Lgroovy/lang/GroovyObject;Ljava/lang/Object;)Ljava/lang/Object; �� ��pmLjava/util/Map;fmvm
    initParams(Ljava/util/Map;)V
    REPORT_LOCALE�call8(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; �� ��
    JASPER_REPORT�REPORT_TIME_ZONE� SORT_FIELDS�REPORT_FILE_RESOLVER�REPORT_SCRIPTLET� REPORT_PARAMETERS_MAP�
    REPORT_CONNECTION� REPORT_CONTEXT� REPORT_CLASS_LOADER�
    REPORT_DATA_SOURCE�REPORT_URL_HANDLER_FACTORY�FILTER�REPORT_FORMAT_FACTORY�REPORT_MAX_COUNT�REPORT_TEMPLATES�REPORT_RESOURCE_BUNDLE�
    initFieldsid�title�publication_title�publication_date�version�initVars PAGE_NUMBER�
    COLUMN_NUMBER� REPORT_COUNT�
    PAGE_COUNT� COLUMN_COUNT�evaluate(I)Ljava/lang/Object;Borg/codehaus/groovy/runtime/typehandling/DefaultTypeTransformationbox 
     &'  compareEqual'(Ljava/lang/Object;Ljava/lang/Object;)Z 
    C
    $get$$class$java$lang$Integer 
    ?
     (' callConstructor � � )'  *' ! +' " ,' # -' "$ .' %%$get$$class$java$lang$Object (?
    )java/lang/Object+IvalueLjava/lang/Object; evaluateOld&'()*+,-evaluateEstimated./012345this$dist$invoke$38(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;/$get$$class$report_dataset2_1334191312525_14442 D?
    E'org/codehaus/groovy/runtime/GStringImplGjava/lang/StringIK)([Ljava/lang/Object;[Ljava/lang/String;)V 6M
    HN$get$$class$java$lang$String P?
    Qjava/lang/IntegerSvalueOf(I)Ljava/lang/Integer; UV
    TWTYPELjava/lang/Class; YZ T[intUnbox(Ljava/lang/Object;)I ]^
    _ despreadList=([Ljava/lang/Object;[Ljava/lang/Object;[I)[Ljava/lang/Object; ab
    CcinvokeMethodOnCurrentNd(Ljava/lang/Class;Lgroovy/lang/GroovyObject;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/Object; ef
    CgnameLjava/lang/String;argsthis$dist$set$3'(Ljava/lang/String;Ljava/lang/Object;)VsetGroovyObjectFieldR(Ljava/lang/Object;Ljava/lang/Class;Lgroovy/lang/GroovyObject;Ljava/lang/String;)V no
    Cpthis$dist$get$3&(Ljava/lang/String;)Ljava/lang/Object;getGroovyObjectFieldQ(Ljava/lang/Class;Lgroovy/lang/GroovyObject;Ljava/lang/String;)Ljava/lang/Object; tu
    CvgetClass x?
    ,y
    initMetaClass+(Ljava/lang/Object;)Lgroovy/lang/MetaClass; {|
    C} /0 (org/codehaus/groovy/reflection/ClassInfo� getClassInfo=(Ljava/lang/Class;)Lorg/codehaus/groovy/reflection/ClassInfo; ��
    �� getMetaClass ��
    �� setMetaClass(Lgroovy/lang/MetaClass;)V invokeMethod
    �J(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; �� �� getProperty8(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object; �� �� setProperty9(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)V �� ��<clinit>java/lang/Long�(J)Ljava/lang/Long; U�
    �� 54 �6���
    34 �super$2$evaluate>(Lnet/sf/jasperreports/engine/JRExpression;)Ljava/lang/Object; ��
    �super$1$toString()Ljava/lang/String;toString ��
    ,�super$1$notifynotify �7
    ,�super$1$notifyAll notifyAll �7
    ,�super$2$evaluateEstimated 9�
    � super$2$initn(Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Lnet/sf/jasperreports/engine/type/WhenResourceMissingTypeEnum;)Vinit ��
    � super$2$str&(Ljava/lang/String;)Ljava/lang/String;str ��
    �
    super$1$clone()Ljava/lang/Object;clone ��
    ,�super$2$evaluateOld 0�
    � super$1$waitwait �7
    ,�(JI)V ��
    ,�super$2$handleMissingResource;(Ljava/lang/String;Ljava/lang/Exception;)Ljava/lang/String;handleMissingResource ��
    �super$1$getClass super$2$msg\(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/String;msg ��
    �J(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/String; ��
    �super$1$finalizefinalize �7
    ,�9(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String; ��
    �(J)V ��
    ,�8(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String; ��
    �super$1$equals(Ljava/lang/Object;)Zequals ��
    ,�super$1$hashCode()IhashCode ��
    ,�$callSiteArrayLjava/lang/ref/SoftReference;$createCallSiteArray_1([Ljava/lang/String;)V���get<$constructor$>$createCallSiteArray6()Lorg/codehaus/groovy/runtime/callsite/CallSiteArray;6 ��
    2org/codehaus/groovy/runtime/callsite/CallSiteArray '(Ljava/lang/Class;[Ljava/lang/String;)V 6
    
     �� java/lang/ref/SoftReference �
     
    (Ljava/lang/Object;)V 6
    array0[Lorg/codehaus/groovy/runtime/callsite/CallSite;  
    $class$java$lang$Integer Z java.lang.Integer class$%(Ljava/lang/String;)Ljava/lang/Class; "#
    $$class$groovy$lang$MetaClass &Z 'groovy.lang.MetaClass)$class$java$lang$Object +Z ,java.lang.Object.7$class$net$sf$jasperreports$engine$fill$JRFillParameter 0Z 10net.sf.jasperreports.engine.fill.JRFillParameter33$class$net$sf$jasperreports$engine$fill$JRFillField 5Z 6,net.sf.jasperreports.engine.fill.JRFillField8$class$java$lang$String :Z ;java.lang.String=6$class$net$sf$jasperreports$engine$fill$JRFillVariable ?Z @/net.sf.jasperreports.engine.fill.JRFillVariableB*$class$report_dataset2_1334191312525_14442 DZ Ejava/lang/ClassHforName J#
    IKjava/lang/NoClassDefFoundErrorM java/lang/ClassNotFoundExceptionO
    getMessage Q�
    PR(Ljava/lang/String;)V 6T
    NU SyntheticCodeLocalVariableTableLineNumberTable
    SourceFile!0 
      
                 !"!#!$!%!&'W('W)'W*'W+'W,'W-'W.'W
    /0W�12W 34W 54W
    ��W
    ZW
    &ZW
    +ZW
    0ZW
    5ZW
    :ZW
    ?ZW
    DZW367X�*�9�=L�A�G�IY�A�G�I*_�KW�A�G�IY�A�G�I*_�MW�A�G�IY�A�G�I*_�OW�A�G�IY�A�G�I*_�QW�A�G�IY�A�G�I*_�SW�A�G�IY�A�G�I*_�UW�A�G�IY�A�G�I*_�WW�A�G�IY�A�G�I*_�YW�A�G�IY�A�G�I*_�[W�A�G�IY�A�G�I*_�]W�A�G�IY�A�G�I*_�_W�A�G�IY�A�G�I*_�aW�A�G�IY�A�G�I*_�cW�A�G�IY�A�G�I*_�eW�A�G�IY�A�G�I*_�gW�A�G�IY�A�G�I*_�iW�A�G�IY�A�G�I*_�kW�n�G�pY�n�G�p*_�rW�n�G�pY�n�G�p*_�tW�n�G�pY�n�G�p*_�vW�n�G�pY�n�G�p*_�xW�n�G�pY�n�G�p*_�zW�}�G�Y�}�G�*_��W�}�G�Y�}�G�*_��W�}�G�Y�}�G�*_��W�}�G�Y�}�G�*_��W�}�G�Y�}�G�*_��W*��Y���G��*_��W�Y ���Z��X/�=:�2*+��W�2*,��W�2*-��W��Y*-��-��-��-��Z?@A��X�|�=M,�2+����A�G�IY�A�G�I*_�KW,�2+����A�G�IY�A�G�I*_�MW,�2+����A�G�IY�A�G�I*_�OW,�2+����A�G�IY�A�G�I*_�QW,�2+����A�G�IY�A�G�I*_�SW,�2+����A�G�IY�A�G�I*_�UW,�2+����A�G�IY�A�G�I*_�WW,�2+ù��A�G�IY�A�G�I*_�YW,�2+ƹ��A�G�IY�A�G�I*_�[W,�2+ɹ��A�G�IY�A�G�I*_�]W,�2+̹��A�G�IY�A�G�I*_�_W,�2+Ϲ��A�G�IY�A�G�I*_�aW,�2+ҹ��A�G�IY�A�G�I*_�cW,�2+չ��A�G�IY�A�G�I*_�eW,�2+ع��A�G�IY�A�G�I*_�gW,�2+۹��A�G�IY�A�G�I*_�iW,�2+޹��A�G�IY�A�G�I*_�kW��Yz��z��ZFJ)KNLsM�N�O�PQ,RQSvT�U�V�W
    X/YTZ��X��=M,�2+���n�G�pY�n�G�p*_�rW,�2+���n�G�pY�n�G�p*_�tW,�2+���n�G�pY�n�G�p*_�vW,�2+���n�G�pY�n�G�p*_�xW,�2+���n�G�pY�n�G�p*_�zW��Y������Zc)dNesf�g��X��=M,�2+���}�G�Y�}�G�*_��W,�2+����}�G�Y�}�G�*_��W,�2+���}�G�Y�}�G�*_��W,�2+���}�G�Y�}�G�*_��W,�2+����}�G�Y�}�G�*_��W��Y������Zp)qNrss�t�X�*�=MN��� �, 2���YNW����� �,2���YNW����� �,2���YNW����� �,2���YNW����� �,2���YNW�l�� � �,!2���YNW�I��#� �,$2���YNW�&��&� �,'2���YNW�-�*�G�,�Y )��)�-#./Zj}��)�6�6�L�Y�Y�o�|�|������������������������0X�*�=MN��� �,12���YNW����� �,22���YNW����� �,32���YNW����� �,42���YNW����� �,52���YNW�l�� � �,62���YNW�I��#� �,72���YNW�&��&� �,82���YNW�-�*�G�,�Y )��)�-#./Zj����)�6�6�L�Y�Y�o�|�|������������������������9X�*�=MN��� �,:2���YNW����� �,;2���YNW����� �,<2���YNW����� �,=2���YNW����� �,>2���YNW�l�� � �,?2���YNW�I��#� �,@2���YNW�&��&� �,A2���YNW�-�*�G�,�Y )��)�-#./Zj����)�6�6�L�Y�Y�o�|�|������������������������BCX�
    \�=N�F*�HY�,Y+S�JYLSYLS�O�R�G�J�,�,Y,S�
    Y��X�\�G�`O:�d�h�Y [��[ij[k/WlmXk 9�=N,Y�F*�HY�,Y+S�JYLSYLS�O�R�G�J�qW��Y 7��7ij7./WrsX] 5�=M�F*�HY�,Y+S�JYLSYLS�O�R�G�J�w�Y4��4ijW��X5)*�z�F�*�~���L+�*�z��YL��+���W��X$*��Y��W*Y����*���W��X*+���W�CX*��*+,���W�sX
    *��*+���W�mX*��*+,���W�7X�����Y����W���Y����W��XY�T�&W��XY�T�#W��XY�T� W��XY�T�W��XY�T�W��XY�T�W��XY�T�W��XY�T�W����X*+���W��X*���W�7X*���W�7X*���W��X*+���W��X
    *+,-���W��X*+�İW��X*�ɰW��X*+�̰W�7X*�бW��X*�ӱW��X*+,�ذW�?X*�z�W��X
    *+,-�ްW��X*+,-��W�7X*��W��X*+,��W��X*��W��X*+,��W��X*+��W��X*��W
    ��X��*��S*��S*��S*�S*�S*�S*�S*�S*�S*�S*�S*�S*�S*�S*�S*�S*�S*�S*�S*�S*�S*�S*�S*�S*�S*�S*�S*�S*�S*�S* S*S*S*S*S*!S*$S*'S*1S*2S*3S*4S*5S*6S*7S*8S*:S*;S*<S*=S*>S*?S*@S*AS�W
    X#�JK*��
    Y�F*�
    �W
    :;X4(�����
    YK��K�Y*��*��W
    
    ?X�Y�W!�%Y��W
    �?X�(Y�W*�%Y�(�W
    (?X�-Y�W/�%Y�-�W
    >?X�2Y�W4�%Y�2�W
    l?X�7Y�W9�%Y�7�W
    P?X�<Y�W>�%Y�<�W
    {?X�AY�WC�%Y�A�W
    D?X�FY�WG�%Y�F�W"#X&*�L�L�NY+�S�V�PW[xuq~.M3����/�report_1334191312525_14442,net/sf/jasperreports/engine/fill/JREvaluatorgroovy/lang/GroovyObject%calculator_report_1334191312525_14442parameter_REPORT_LOCALE2Lnet/sf/jasperreports/engine/fill/JRFillParameter;parameter_JASPER_REPORTparameter_REPORT_VIRTUALIZERparameter_REPORT_TIME_ZONEparameter_SORT_FIELDSparameter_REPORT_FILE_RESOLVERparameter_REPORT_SCRIPTLETparameter_REPORT_PARAMETERS_MAPparameter_REPORT_CONNECTIONparameter_REPORT_CONTEXTparameter_REPORT_CLASS_LOADERparameter_REPORT_DATA_SOURCE$parameter_REPORT_URL_HANDLER_FACTORYparameter_IS_IGNORE_PAGINATIONparameter_FILTERparameter_SUBREPORT_DIRparameter_REPORT_FORMAT_FACTORYparameter_REPORT_MAX_COUNTparameter_REPORT_TEMPLATESparameter_research_group_id parameter_REPORT_RESOURCE_BUNDLEfield_id.Lnet/sf/jasperreports/engine/fill/JRFillField;field_child_of_idfield_description
    field_name
    field_versionvariable_PAGE_NUMBER1Lnet/sf/jasperreports/engine/fill/JRFillVariable;variable_COLUMN_NUMBERvariable_REPORT_COUNTvariable_PAGE_COUNTvariable_COLUMN_COUNT$const$0Ljava/lang/Integer;$const$1$const$2$const$3$const$4$const$5$const$6$const$7$const$8$const$9 $const$10 $const$11 $const$12 $const$13 $const$14 $const$15 $const$16 $const$17 $const$18 $const$19 $const$20$staticClassInfo*Lorg/codehaus/groovy/reflection/ClassInfo; metaClassLgroovy/lang/MetaClass; __timeStampLjava/lang/Long;)__timeStamp__239_neverHappen1334191312646<init>()V GH
    I$getCallSiteArray2()[Lorg/codehaus/groovy/runtime/callsite/CallSite; KL
    M<$get$$class$net$sf$jasperreports$engine$fill$JRFillParameter()Ljava/lang/Class; OP
    Q1org/codehaus/groovy/runtime/ScriptBytecodeAdapterS
    castToType7(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object; UV
    TW0net/sf/jasperreports/engine/fill/JRFillParameterY  [
    ] _ a
    c  e  g  i  k  m  o  q  s  u  w  y  {  }    �  �8$get$$class$net$sf$jasperreports$engine$fill$JRFillField �P
    �,net/sf/jasperreports/engine/fill/JRFillField�  �  � ! � " � # �;$get$$class$net$sf$jasperreports$engine$fill$JRFillVariable �P
    �/net/sf/jasperreports/engine/fill/JRFillVariable� $% � &% � '% � (% � )% �$getStaticMetaClass()Lgroovy/lang/MetaClass; ��
    �!$get$$class$groovy$lang$MetaClass �P
    �groovy/lang/MetaClass� BC �thisLreport_1334191312525_14442;customizedInit0(Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;)V-org/codehaus/groovy/runtime/callsite/CallSite� callCurrent@(Lgroovy/lang/GroovyObject;Ljava/lang/Object;)Ljava/lang/Object; �� ��pmLjava/util/Map;fmvm
    initParams(Ljava/util/Map;)V
    REPORT_LOCALE�call8(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; �� ��
    JASPER_REPORT�REPORT_VIRTUALIZER�REPORT_TIME_ZONE� SORT_FIELDS�REPORT_FILE_RESOLVER� REPORT_SCRIPTLET�
    REPORT_PARAMETERS_MAP� REPORT_CONNECTION� REPORT_CONTEXT�
    REPORT_CLASS_LOADER�REPORT_DATA_SOURCE�REPORT_URL_HANDLER_FACTORY�IS_IGNORE_PAGINATION�FILTER�
    SUBREPORT_DIR�REPORT_FORMAT_FACTORY�REPORT_MAX_COUNT�REPORT_TEMPLATES�research_group_id�REPORT_RESOURCE_BUNDLE
    initFieldsid child_of_id  description nameversioninitVars PAGE_NUMBER
    COLUMN_NUMBER REPORT_COUNT 
    PAGE_COUNT! COLUMN_COUNT"evaluate(I)Ljava/lang/Object;Borg/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation&box (%
    ') *+ + compareEqual'(Ljava/lang/Object;Ljava/lang/Object;)Z -.
    T/&..\rgms\web-app\reports\report_Bundle\1 ,+ 3"$get$$class$java$lang$Integer 6P
    7callConstructor 9� �: -+ <# .+ ?$ /+ B% 0+ E& 1+ H' 2+ K( 3+ N) 4+ Q"..\rgms\web-app\images\logoSPG.jpgS 5+ U*&(Ljava/lang/Object;)Ljava/lang/Object; �X �Y$get$$class$java$lang$String [P
    \java/lang/String^ 6+ `+ 7+ c,$get$$class$java$sql$Connection fP
    gjava/sql/Connectioni 8+ k-.report1.jaspero 9+ q/ :+ t01publications.jasperx ;+ z2 <+ }34ferramentas.jasper� =+ �5 ferramentas� >+ �6membros� ?+ �7pubs�$get$$class$java$lang$Object �P
    �java/lang/Object�IvalueLjava/lang/Object; evaluateOld89:;<=>?@ABCDEFGHIJKLMevaluateEstimatedNOPQRSTUVWXYZ[\]^_`abcthis$dist$invoke$38(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;&$get$$class$report_1334191312525_14442 �P
    �'org/codehaus/groovy/runtime/GStringImpl��)([Ljava/lang/Object;[Ljava/lang/String;)V G�
    ��java/lang/Integer�valueOf(I)Ljava/lang/Integer; ��
    ��TYPELjava/lang/Class; �� ��intUnbox(Ljava/lang/Object;)I ��
    '� despreadList=([Ljava/lang/Object;[Ljava/lang/Object;[I)[Ljava/lang/Object; ��
    T�invokeMethodOnCurrentNd(Ljava/lang/Class;Lgroovy/lang/GroovyObject;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/Object; ��
    T�Ljava/lang/String;argsthis$dist$set$3'(Ljava/lang/String;Ljava/lang/Object;)VsetGroovyObjectFieldR(Ljava/lang/Object;Ljava/lang/Class;Lgroovy/lang/GroovyObject;Ljava/lang/String;)V ��
    T�this$dist$get$3&(Ljava/lang/String;)Ljava/lang/Object;getGroovyObjectFieldQ(Ljava/lang/Class;Lgroovy/lang/GroovyObject;Ljava/lang/String;)Ljava/lang/Object; ��
    T�getClass �P
    ��
    initMetaClass+(Ljava/lang/Object;)Lgroovy/lang/MetaClass; ��
    T� @A �(org/codehaus/groovy/reflection/ClassInfo getClassInfo=(Ljava/lang/Class;)Lorg/codehaus/groovy/reflection/ClassInfo; 
     getMetaClass �
     setMetaClass(Lgroovy/lang/MetaClass;)V invokeMethod
    J(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;   � getProperty8(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;  � setProperty9(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)V  �<clinit>java/lang/Long(J)Ljava/lang/Long; �
     FE !6��� DE %super$2$evaluate>(Lnet/sf/jasperreports/engine/JRExpression;)Ljava/lang/Object; $(
    )super$1$toString()Ljava/lang/String;toString -,
    �.super$1$notifynotify 1H
    �2super$1$notifyAll notifyAll 5H
    �6super$2$evaluateEstimated �(
    9 super$2$initn(Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Lnet/sf/jasperreports/engine/type/WhenResourceMissingTypeEnum;)Vinit =<
    > super$2$str&(Ljava/lang/String;)Ljava/lang/String;str BA
    C
    super$1$clone()Ljava/lang/Object;clone GF
    �Hsuper$2$evaluateOld �(
    K super$1$waitwait NH
    �O(JI)V NQ
    �Rsuper$2$handleMissingResource;(Ljava/lang/String;Ljava/lang/Exception;)Ljava/lang/String;handleMissingResource VU
    Wsuper$1$getClass super$2$msg\(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/String;msg \[
    ]J(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/String; \_
    `super$1$finalizefinalize cH
    �d9(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String; \f
    g(J)V Ni
    �j8(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String; \l
    msuper$1$equals(Ljava/lang/Object;)Zequals qp
    �rsuper$1$hashCode()IhashCode vu
    �w$callSiteArrayLjava/lang/ref/SoftReference;$createCallSiteArray_1([Ljava/lang/String;)V�get�<$constructor$>�getValue�plus�B getOldValue�$createCallSiteArray6()Lorg/codehaus/groovy/runtime/callsite/CallSiteArray;d {|
    �2org/codehaus/groovy/runtime/callsite/CallSiteArray�'(Ljava/lang/Class;[Ljava/lang/String;)V G�
    �� yz �java/lang/ref/SoftReference� �F
    �� ��
    �(Ljava/lang/Object;)V G�
    ��array0[Lorg/codehaus/groovy/runtime/callsite/CallSite; �� ��$class$java$lang$Integer �� �java.lang.Integer�class$%(Ljava/lang/String;)Ljava/lang/Class; ��
    �$class$groovy$lang$MetaClass �� �groovy.lang.MetaClass�$class$java$sql$Connection �� �java.sql.Connection�$class$java$lang$Object �� �java.lang.Object�7$class$net$sf$jasperreports$engine$fill$JRFillParameter �� �0net.sf.jasperreports.engine.fill.JRFillParameter�3$class$net$sf$jasperreports$engine$fill$JRFillField �� �,net.sf.jasperreports.engine.fill.JRFillField�!$class$report_1334191312525_14442 �� �$class$java$lang$String �� �java.lang.String�6$class$net$sf$jasperreports$engine$fill$JRFillVariable �� �/net.sf.jasperreports.engine.fill.JRFillVariable�java/lang/Class�forName ��
    ��java/lang/NoClassDefFoundError� java/lang/ClassNotFoundException�
    getMessage �,
    ��(Ljava/lang/String;)V G�
    �� SyntheticCodeLocalVariableTableLineNumberTable
    SourceFile!B 
      
                     !"#$%&%'%(%)%*+�,+�-+�.+�/+�0+�1+�2+�3+�4+�5+�6+�7+�8+�9+�:+�;+�<+�=+�>+�?+�
    @A��BC� DE� FE�
    yz�
    ���
    ���
    ���
    ���
    ���
    ���
    ���
    ���
    ���4GH�nD*�J�NL�R�X�ZY�R�X�Z*_�\W�R�X�ZY�R�X�Z*_�^W�R�X�ZY�R�X�Z*_�`W�R�X�ZY�R�X�Z*_�bW�R�X�ZY�R�X�Z*_�dW�R�X�ZY�R�X�Z*_�fW�R�X�ZY�R�X�Z*_�hW�R�X�ZY�R�X�Z*_�jW�R�X�ZY�R�X�Z*_�lW�R�X�ZY�R�X�Z*_�nW�R�X�ZY�R�X�Z*_�pW�R�X�ZY�R�X�Z*_�rW�R�X�ZY�R�X�Z*_�tW�R�X�ZY�R�X�Z*_�vW�R�X�ZY�R�X�Z*_�xW�R�X�ZY�R�X�Z*_�zW�R�X�ZY�R�X�Z*_�|W�R�X�ZY�R�X�Z*_�~W�R�X�ZY�R�X�Z*_��W�R�X�ZY�R�X�Z*_��W�R�X�ZY�R�X�Z*_��W���X��Y���X��*_��W���X��Y���X��*_��W���X��Y���X��*_��W���X��Y���X��*_��W���X��Y���X��*_��W���X��Y���X��*_��W���X��Y���X��*_��W���X��Y���X��*_��W���X��Y���X��*_��W���X��Y���X��*_��W*��Y���X��*_��W�� >������/�N:�2*+��W�2*,��W�2*-��W���*-��-��-��-���CDE�����NM,�2+ù��R�X�ZY�R�X�Z*_�\W,�2+ʹ��R�X�ZY�R�X�Z*_�^W,�2+͹��R�X�ZY�R�X�Z*_�`W,�2+й��R�X�ZY�R�X�Z*_�bW,�2+ӹ��R�X�ZY�R�X�Z*_�dW,�2+ֹ��R�X�ZY�R�X�Z*_�fW,�2+ٹ��R�X�ZY�R�X�Z*_�hW,�2+ܹ��R�X�ZY�R�X�Z*_�jW,�2+߹��R�X�ZY�R�X�Z*_�lW,�2+���R�X�ZY�R�X�Z*_�nW,�2+���R�X�ZY�R�X�Z*_�pW,�2+���R�X�ZY�R�X�Z*_�rW,�2+���R�X�ZY�R�X�Z*_�tW,�2+���R�X�ZY�R�X�Z*_�vW,�2+���R�X�ZY�R�X�Z*_�xW,�2+����R�X�ZY�R�X�Z*_�zW,�2+����R�X�ZY�R�X�Z*_�|W,�2+���R�X�ZY�R�X�Z*_�~W,�2+���R�X�ZY�R�X�Z*_��W,�2+���R�X�ZY�R�X�Z*_��W,2+���R�X�ZY�R�X�Z*_��W��������VN)ONPsQ�R�S�TU,VQWvX�Y�Z�[
    \/]T^y_�`�a�b��ʸNM,2+�����X��Y���X��*_��W,2+
    �����X��Y���X��*_��W, 2+
    �����X��Y���X��*_��W,2+�����X��Y���X��*_��W,2+�����X��Y���X��*_��W����������k+lRmyn�o��ʸNM,2+�����X��Y���X��*_��W,2+�����X��Y���X��*_��W,2+�����X��Y���X��*_��W,2+ �����X��Y���X��*_��W,!2+#�����X��Y���X��*_��W����������x+yRzy{�|$%�n0�NMN�*�,�0� 2YNW� �*�4�0�,52�8�4�;YNW���*�=�0�,>2�8�4�;YNW���*�@�0�,A2�8�4�;YNW���*�C�0�,D2�8�,�;YNW��*�F�0�,G2�8�4�;YNW�\�*�I�0�,J2�8�,�;YNW�9�*�L�0�,M2�8�4�;YNW��*�O�0�,P2�8�,�;YNW���*�R�0� TYNW���*�V�0� ,W2*���Z�]�X�_YNW���*�a�0� ,b2*���Z�]�X�_YNW���*�d�0� ,e2*�l�Z�h�X�jYNW�_�*�l�0�-,m2,n2*�z�Z�]�X�_p��YNW�(�*�r�0� ,s2*�l�Z�h�X�jYNW���*�u�0�-,v2,w2*�z�Z�]�X�_y��YNW���*�{�0� ,|2*�l�Z�h�X�jYNW���*�~�0�-,2,�2*�z�Z�]�X�_���YNW�f�*���0�,�2*���YNW�E�*���0�,�2*���YNW�$�*���0�,�2*���YNW�-���X���� /��/�)���A�����)�)�?�L�L�b�o�o����������������������������4�A�A�J�W�W�t������������������� � �)�6�6�`�m�m����������������������$��%�n0�NMN�*�,�0� 2YNW� �*�4�0�,�2�8�4�;YNW���*�=�0�,�2�8�4�;YNW���*�@�0�,�2�8�4�;YNW���*�C�0�,�2�8�,�;YNW��*�F�0�,�2�8�4�;YNW�\�*�I�0�,�2�8�,�;YNW�9�*�L�0�,�2�8�4�;YNW��*�O�0�,�2�8�,�;YNW���*�R�0� TYNW���*�V�0� ,�2*���Z�]�X�_YNW���*�a�0� ,�2*���Z�]�X�_YNW���*�d�0� ,�2*�l�Z�h�X�jYNW�_�*�l�0�-,�2,�2*�z�Z�]�X�_p��YNW�(�*�r�0� ,�2*�l�Z�h�X�jYNW���*�u�0�-,�2,�2*�z�Z�]�X�_y��YNW���*�{�0� ,�2*�l�Z�h�X�jYNW���*�~�0�-,�2,�2*�z�Z�]�X�_���YNW�f�*���0�,�2*���YNW�E�*���0�,�2*���YNW�$�*���0�,�2*���YNW�-���X���� /��/�)���A�����)�)�?�L�L�b�o�o�������������������� 4 A A
    JWWt���������   !)#6$6%`'m(m)�+�,�-�/�0�1�3�4�5789$<�%�n0�NMN�*�,�0� 2YNW� �*�4�0�,�2�8�4�;YNW���*�=�0�,�2�8�4�;YNW���*�@�0�,�2�8�4�;YNW���*�C�0�,�2�8�,�;YNW��*�F�0�,�2�8�4�;YNW�\�*�I�0�,�2�8�,�;YNW�9�*�L�0�,�2�8�4�;YNW��*�O�0�,�2�8�,�;YNW���*�R�0� TYNW���*�V�0� ,�2*���Z�]�X�_YNW���*�a�0� ,�2*���Z�]�X�_YNW���*�d�0� ,�2*�l�Z�h�X�jYNW�_�*�l�0�-,�2,�2*�z�Z�]�X�_p��YNW�(�*�r�0� ,�2*�l�Z�h�X�jYNW���*�u�0�-,�2,�2*�z�Z�]�X�_y��YNW���*�{�0� ,�2*�l�Z�h�X�jYNW���*�~�0�-,�2,�2*�z�Z�]�X�_���YNW�f�*���0�,�2*���YNW�E�*���0�,�2*���YNW�$�*���0�,�2*���YNW�-���X���� /��/�)���AEGHIK)L)M?OLPLQbSoToU�W�X�Y�[�\�]�_�`�a�c�d�eghi4kAlAmJoWpWqts�t�u�w�x�y�{�|�}� � �)�6�6�`�m�m����������������������$�����
    \�NN��*��Y��Y+S�_Y�SY�S�Ӹ]�X�_����Y,S�
    Y��ٲݸX��O:���� [��[�[������k 9�NN,Y��*��Y��Y+S�_Y�SY�S�Ӹ]�X�_��W��� 7��7�7������] 5�NM��*��Y��Y+S�_Y�SY�S�Ӹ]�X�_����4��4�����5)*��̦*����L+�*��YL�+� ����$*��Y��W*Y����*����
     �*+���� ��*�
    *+,�����
    *�
    *+�����*�
    *+,���H�<0� Y��"W#� Y��&W��Y�ճ�W���Y�ճ�W��Y�ճ�W��Y�ճ~W��Y�ճ{W��Y�ճuW��Y�ճrW��Y�ճlW��Y�ճdWݸ�Y�ճaWڸ�Y�ճVW׸�Y�ճRWԸ�Y�ճOWѸ�Y�ճLWθ�Y�ճIW˸�Y�ճFWȸ�Y�ճCW���Y�ճ@W���Y�ճ=W���Y�ճ4W���Y�ճ,W��'(�*+�*��+,�*�/��0H�*�3��4H�*�7��8(�*+�:��;<�
    *+,-�?��@A�*+�D��EF�*�I��J(�*+�L��MH�*�P��MQ�*�S��TU�*+,�X��YP�*���Z[�
    *+,-�^��Z_�*+,-�a��bH�*�e��Zf�*+,�h��Mi�*�k��Zl�*+,�n��op�*+�s��tu�*�x��
    {|�
    *�}S*�~S*�S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*�S*�S*�S* �S*�S*�S*�S*�S*�S*�S*!�S*5�S*>�S*A�S*D�S*G�S*J�S*M�S*P�S*W�S*b�S*e�S*m�S*n�S*s�S*v�S*w�S*|�S*�S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S*��S��
    ���#��_K*����Y��*����
    KL�4(���������YK���K��Y*����*����
    6P���Y�W���Y����
    �P���Y�W���Y����
    fP���Y�W���Y����
    �P���Y�W���Y����
    OP���Y�W���Y����
    �P���Y�WŸ�Y�ð�
    �P���Y�Wɸ�Y�Ȱ�
    [P���Y�Wθ�Y�̰�
    �P���Y�WӸ�Y�Ѱ����&*�ذL��Y+�߷����t_1334191312525_14442t/net.sf.jasperreports.compilers.JRGroovyCompiler
    -
    -
    - -
    -
    - - - - -
    -
    -
    - - - - -
    -
    -
    -
    - - -
    - - - - - -
    -
    -
    - -
    -
    -
    -
    -
    -
    - -
    - - - -
    - - Something went wrong with that request. Please try again. - -
    - - - - - - - - diff --git a/web-app/reports/report_Bundle/researchGroup.jrxml b/web-app/reports/report_Bundle/researchGroup.jrxml index 3aa61243..8d6e7307 100644 --- a/web-app/reports/report_Bundle/researchGroup.jrxml +++ b/web-app/reports/report_Bundle/researchGroup.jrxml @@ -1,712 +1,239 @@ - - - - - - - - - rgms/web-app/reports/report_Bundle/researchGroup.jrxml at 277779e1ba92798de756e55ad3396f4aebc9f5e0 · spgroup/rgms - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - -
    -
    - - - - - -
    - - - - -
    - - -
    -
    - - - - - - - - - - -
    -
    - -
    - - - - - - - - - - -
    -
    - - - - - - - -
    -
    - -
    -
    -
    - - - -
      - -
    • - Pull Request -
    • - -
    • -
      - -
      - - - - Unwatch - - - -
      -
      -
      - Notification status - -
      - -
      - -
      - -
      - -

      Not watching

      - You only receive notifications for discussions in which you participate or are @mentioned. - - - Watch - -
      -
      - -
      - -
      - -

      Watching

      - You receive notifications for all discussions in this repository. - - - Unwatch - -
      -
      - -
      - -
      - -

      Ignoring

      - You do not receive any notifications for discussions in this repository. - - - Stop ignoring - -
      -
      - -
      - -
      -
      -
      - -
      -
    • - -
    • - - - Unstar - - - - Star - - -
    • - -
    • - - - Fork - - -
    • - - -
    - -

    - public - - - / - rgms -

    -
    - - - - -
    - - - - - - -
    - - -
    - - - tree: - 277779e1ba - - -
    - -
    -
    - Switch branches/tags - -
    - -
    -
    - -
    -
    - -
    -
    - -
    - -
    - -
    - - master -
    -
    - - rsmbf-master -
    -
    - -
    - - -
    -

    Create branch:

    - from ‘277779e1ba92798de756e55ad3396f4aebc9f5e0’ -
    - - - -
    - -
    - - -
    -
    - -
    - -
    Nothing to show
    - -
    - -
    -
    -
    - -
    - - - -
    - - - - - - - -
    -
    - -
    - - - - - - - -
    -
    - - - - - - - - - -
    - - - - - - - -
    - - -
    - -
    -
    - -
    -
    -
    -
    - - file - 114 lines (113 sloc) - 4.42 kb -
    -
    -
    - Edit - Raw - Blame - History -
    -
    - -
    -
    - - - - - -
    -
    1
    -2
    -3
    -4
    -5
    -6
    -7
    -8
    -9
    -10
    -11
    -12
    -13
    -14
    -15
    -16
    -17
    -18
    -19
    -20
    -21
    -22
    -23
    -24
    -25
    -26
    -27
    -28
    -29
    -30
    -31
    -32
    -33
    -34
    -35
    -36
    -37
    -38
    -39
    -40
    -41
    -42
    -43
    -44
    -45
    -46
    -47
    -48
    -49
    -50
    -51
    -52
    -53
    -54
    -55
    -56
    -57
    -58
    -59
    -60
    -61
    -62
    -63
    -64
    -65
    -66
    -67
    -68
    -69
    -70
    -71
    -72
    -73
    -74
    -75
    -76
    -77
    -78
    -79
    -80
    -81
    -82
    -83
    -84
    -85
    -86
    -87
    -88
    -89
    -90
    -91
    -92
    -93
    -94
    -95
    -96
    -97
    -98
    -99
    -100
    -101
    -102
    -103
    -104
    -105
    -106
    -107
    -108
    -109
    -110
    -111
    -112
    -113
    -
    -
    -
    <?xml version="1.0" encoding="UTF-8"?>
    <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="report" language="groovy" pageWidth="595" pageHeight="842" columnWidth="535" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" resourceBundle="report">
    <property name="ireport.zoom" value="1.0"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="0"/>
    <subDataset name="dataset2">
    <queryString>
    <![CDATA[SELECT
         *,
         publication.`title` AS publication_title,
         publication.`publication_date` AS publication_publication_date
    FROM
         `publication` publication]]>
    </queryString>
    <field name="id" class="java.lang.Long"/>
    <field name="version" class="java.lang.Long"/>
    <field name="publication_date" class="java.sql.Timestamp"/>
    <field name="title" class="java.lang.String"/>
    <field name="publication_title" class="java.lang.String"/>
    </subDataset>
    <parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
    <defaultValueExpression><![CDATA["..\\rgms\\web-app\\reports\\report_Bundle\\"]]></defaultValueExpression>
    </parameter>
    <parameter name="research_group_id" class="java.lang.String"/>
    <queryString>
    <![CDATA[SELECT * FROM research_group where research_group.id=$P{research_group_id};]]>
    </queryString>
    <field name="id" class="java.lang.Long"/>
    <field name="version" class="java.lang.Long"/>
    <field name="child_of_id" class="java.lang.Long"/>
    <field name="description" class="java.lang.String"/>
    <field name="name" class="java.lang.String"/>
    <background>
    <band splitType="Stretch"/>
    </background>
    <title>
    <band height="158" splitType="Stretch">
    <image>
    <reportElement x="22" y="17" width="167" height="139"/>
    <imageExpression><![CDATA["..\\rgms\\web-app\\images\\logoSPG.jpg"]]></imageExpression>
    </image>
    <textField>
    <reportElement x="207" y="17" width="100" height="33"/>
    <textElement>
    <font size="18"/>
    </textElement>
    <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
    </textField>
    <textField>
    <reportElement x="207" y="53" width="348" height="103"/>
    <textElement>
    <font size="15"/>
    </textElement>
    <textFieldExpression><![CDATA[$F{description}]]></textFieldExpression>
    </textField>
    </band>
    </title>
    <pageHeader>
    <band height="147" splitType="Stretch">
    <subreport>
    <reportElement x="35" y="38" width="114" height="39"/>
    <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
    <subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "report1.jasper"]]></subreportExpression>
    </subreport>
    <subreport>
    <reportElement x="322" y="36" width="136" height="38"/>
    <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
    <subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "publications.jasper"]]></subreportExpression>
    </subreport>
    <subreport>
    <reportElement x="322" y="104" width="200" height="43"/>
    <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
    <subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "ferramentas.jasper"]]></subreportExpression>
    </subreport>
    <textField>
    <reportElement x="322" y="79" width="171" height="30"/>
    <textElement>
    <font size="18"/>
    </textElement>
    <textFieldExpression><![CDATA[$R{ferramentas}]]></textFieldExpression>
    </textField>
    <textField>
    <reportElement x="35" y="8" width="159" height="27"/>
    <textElement>
    <font size="18"/>
    </textElement>
    <textFieldExpression><![CDATA[$R{membros}]]></textFieldExpression>
    </textField>
    <textField>
    <reportElement x="322" y="5" width="171" height="30"/>
    <textElement>
    <font size="18"/>
    </textElement>
    <textFieldExpression><![CDATA[$R{pubs}]]></textFieldExpression>
    </textField>
    </band>
    </pageHeader>
    <columnHeader>
    <band splitType="Stretch"/>
    </columnHeader>
    <detail>
    <band height="1" splitType="Stretch"/>
    </detail>
    <columnFooter>
    <band height="45" splitType="Stretch"/>
    </columnFooter>
    <pageFooter>
    <band height="54" splitType="Stretch"/>
    </pageFooter>
    <summary>
    <band height="42" splitType="Stretch"/>
    </summary>
    </jasperReport>
    -
    -
    - -
    -
    - - - - -
    -
    -
    - - - - -
    -
    -
    -
    - - -
    - - - - - -
    -
    -
    - -
    -
    -
    -
    -
    -
    - -
    - - - -
    - - Something went wrong with that request. Please try again. - -
    - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <band height="97" splitType="Stretch"> + <textField> + <reportElement x="167" y="44" width="251" height="20" uuid="0c8ee8e6-f974-4075-b2a5-f2ef9a63b24b"/> + <textElement markup="none"> + <font size="15"/> + </textElement> + <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression> + </textField> + <textField> + <reportElement x="-1" y="44" width="148" height="20" uuid="f71e0954-1a17-46b8-b21e-92c2a1682d8c"/> + <textElement> + <font size="15"/> + </textElement> + <textFieldExpression><![CDATA[$F{twitter}]]></textFieldExpression> + </textField> + <textField> + <reportElement x="-1" y="64" width="148" height="20" uuid="b266481e-8369-4b1b-afc0-0abc2370589f"/> + <textElement> + <font size="15"/> + </textElement> + <textFieldExpression><![CDATA[$F{sigla}]]></textFieldExpression> + </textField> + <staticText> + <reportElement x="120" y="0" width="344" height="27" uuid="58c433d8-cf97-4fbf-a973-9391de02df7c"/> + <textElement> + <font size="18"/> + </textElement> + <text><![CDATA[RELATÓRIO DE GRUPO DE PESQUISA]]></text> + </staticText> + </band> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +