diff --git a/.gitignore b/.gitignore index 0ff9e49d..acc1a46d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ - .classpath .project diff --git a/ProductGeneration/ck.xml b/ProductGeneration/ck.xml index 741b2e99..9dd95d47 100644 --- a/ProductGeneration/ck.xml +++ b/ProductGeneration/ck.xml @@ -224,6 +224,8 @@ + + rgms @@ -1243,4 +1245,4 @@ --> - \ No newline at end of file + diff --git a/ProductGeneration/compModelTeste.txt b/ProductGeneration/compModelTeste.txt index 8920e145..25097941 100644 --- a/ProductGeneration/compModelTeste.txt +++ b/ProductGeneration/compModelTeste.txt @@ -113,10 +113,9 @@ publication => grailsapp/domain/rgms/publication/Publication.groovy; history => grailsapp/domain/rgms/member/Record.groovy; researchGroup => grailsapp/domain/rgms/member/ResearchGroup.groovy; Role => grailsapp/domain/rgms/authentication/Role.groovy; -thesis => grailsapp/domain/rgms/publication/Tese.groovy; -researchLine => grailsapp/domain/rgms/publication/ResearchLine.groovy; -visitor => grailsapp/domain/rgms/visit/Visitor.groovy; -visit => grailsapp/domain/rgms/visit/Visit.groovy; +thesis => gr=> grailsapp/domain/rgms/publication/ResearchLine.groovy; +researchLine => grailsapp/domain/rgms/ResearchLine.groovy; +defaultValueManager => grailsapp/domain/rgms/DefaultValueManager.groovy; initial => grailsapp/views/initial.gsp; @@ -132,8 +131,6 @@ reportFR => grailsapp/conf/reportfr.properties; reportBR => grailsapp/conf/reportptBR.properties; reportUS => grailsapp/conf/reportus.properties; -ShiroRoleController => grailsapp/controllers/ShiroRoleController.groovy; -ShiroUserController => grailsapp/controllers/ShiroUserController.groovy; AuthController => grailsapp/controllers/rgms/authentication/AuthController.groovy; @@ -145,11 +142,11 @@ MembershipController => grailsapp/controllers/rgms/member/MembershipController.g PeriodicoController => grailsapp/controllers/rgms/publication/PeriodicoController.groovy; PublicationController => grailsapp/controllers/rgms/publication/PublicationController.groovy; RecordController => grailsapp/controllers/rgms/member/RecordController.groovy; -ResearchGroupController => grailsapp/controllers/rgms/member/ResearchGroupController.groovy; -RoleController => grailsapp/controllers/rgms/authentication/RoleController.groovy; -TeseController => grailsapp/controllers/rgms/publication/TeseController.groovy; -VisitorController => grailsapp/controllers/rgms/visit/VisitorController.groovy; -VisitController => grailsapp/controllers/rgms/visit/VisitController.groovy; +ResearchGroupController => grailecordController => grailsapp/controllers/rgms/RecordController.groovy; +ResearchGroupController => grailsapp/controllers/rgms/ResearchGrogroovy; +TeseController => grailsapp/controllers/rgms/TeseController.groovy; +ResearchGroupController => grailsapp/controllers/rgms/ResearchGrogroovy; +TeseController => grailsapp/controllers/rgms/TeseController.groovy; @@ -173,25 +170,41 @@ shiro => grailsapp/i18n/shiro.properties; TwitterTool => grailsapp/controllers/rgms/tool/TwitterTool.groovy; TwitterController => grailsapp/controllers/rgms/tool/TwitterController.groovy; FacebookTool => grailsapp/controllers/rgms/tool/FacebookTool.groovy; -FacebookController => grailsapp/controllers/rgms/tool/FacebookController.groovy; - - -ShiroDbRealm => grailsapp/realms/ShiroDbRealm.groovy; - - -ShiroDbRealmRGMS => grailsapp/realms/rgms/ShiroDbRealm.groovy; - - -JqueryUiTagLib => grailsapp/taglib/com/grailsrocks/jqueryui/JqueryUiTagLib.groovy; - - -ferramentas => webapp/reports/reportBundle/ferramentas.jrxml; -memberPubs => webapp/reports/reportBundle/memberPubs.jrxml; -memberTools => webapp/reports/reportBundle/memberTools.jrxml; -publications => webapp/reports/reportBundle/publications.jrxml; -report => webapp/reports/reportBundle/report.jrxml; +FacebookController => grailsapp/controllers/rgms/tooferramentas => webapp/reports/reportBundle/ferramentas.jrxml;entas.jrxml; +memberPubs => webapp/reports/report_Bundle/memberPubs.jrxml; +memberTools => webapp/reports/report_Bundle/memberTools.jrxml; +publications => webapp/reports/report_Bundle/publications.jrxml; +report => webapp/reports/report_Bundle/report.jrxml; +report1 => webapp/reports/report_Bundle/report1.jrxml; +researchGroupReport => webapp/reports/repor> webapp/reports/reportBundle/report.jrxml; report1 => webapp/reports/reportBundle/report1.jrxml; researchGroup => webapp/reports/reportBundle/researchGroup.jrxml; +report1 => webapp/reports/reportBundle/report1.jrxml; +researchGroup => webapp/reports/reportBundle/researchGroup.jrxml; + +ferramentaFeature => test/cucumber/Ferramenta.feature; +bookchapterFeature => test/cucumber/BookChapter.feature; +dissertacaoFeature => test/cucumber/Dissertacao.feature; +conferenciaFeature => test/cucumber/Conferencia.feature; +technicalreportFeature => test/cucumber/TechnicalReport.feature; + +testFunctionalFormPage => test/functional/pages/FormPage.groovy; +testFunctionalTechnicalReportCreatePage => test/functional/pages/TechnicalReportCreatePage.groovy; +testFunctionalFerramentaCreate => test/functional/pages/FerramentaCreate.groovy; +testFunctionalDissertationCreate => test/functional/pages/DissertationCreate.groovy; +testFunctionalBookChapterCreatePage => test/functional/pages/BookChapterCreatePage.groovy; +testFunctionalConferenciaCreatePage => test/functional/pages/ConferenciaCreatePage.groovy; + +bibtexParse => grailsapp/domain/rgms/publication/BibtexParse.groovy; +bibtexFile => grailsapp/domain/rgms/publication/BibtexFile.groovy; +bibtexFileController => grailsapp/controllers/rgms/publication/BibtexFileController.groovy; +sampleBibtex => test/cucumber/steps/sample.bibtex; +homeBibtexFile => grailsapp/views/bibtexFile/home.gsp; +bibtexImportFeature => test/cucumber/BibtexImport.feature; +bibtexImportSteps => test/cucumber/steps/BibtexImportSteps.groovy; +strategyParse => grailsapp/domain/rgms/publication/strategyBibtexParse/StrategyParse.java; +strategyParseDissertacao => grailsapp/domain/rgms/publication/strategyBibtexParse/StrategyParseDissertacao.java; +strategyParseTese => grailsapp/domain/rgms/publication/strategyBibtexParse/StrategyParseTese.java; ArticleFeature => test/cucumber/Article.feature; env => test/cucumber/hooks/env.groovy; @@ -203,4 +216,4 @@ ArticleCreatePage => test/functional/pages/ArticleCreatePage.groovy; ArticleEditPage => test/functional/pages/ArticleEditPage.groovy; ArticleShowPage => test/functional/pages/ArticleShowPage.groovy; ArticlePage => test/functional/pages/ArticlesPage.groovy; -UserRegisterPage => test/functional/pages/UserRegisterPage.groovy; \ No newline at end of file +UserRegisterPage => test/functional/pages/UserRegisterPage.groovy; diff --git a/ProductGeneration/featureModel.xml b/ProductGeneration/featureModel.xml index 23e971fc..08fa84fa 100644 --- a/ProductGeneration/featureModel.xml +++ b/ProductGeneration/featureModel.xml @@ -9,7 +9,13 @@ - + + + + + + + diff --git a/ProductGeneration/hephaestus/project.properties b/ProductGeneration/hephaestus/project.properties index bbc9f46b..178d3739 100644 --- a/ProductGeneration/hephaestus/project.properties +++ b/ProductGeneration/hephaestus/project.properties @@ -1,11 +1,7 @@ name=rgms -feature-model=C:\Users\Rodrigo\Documents\GitHub\rgms/featureModel.xml - -configuration-model=C:\Users\Rodrigo\Documents\GitHub\rgms/ck.xml - -instance-model=C:\Users\Rodrigo\Documents\GitHub\rgms/instanceModel.xml - -component-model=C:\Users\Rodrigo\Documents\GitHub\rgms/compModelTeste.txt - -source-dir=C:\Users\Rodrigo\Documents\GitHub\rgms -target-dir=C:\Users\Rodrigo\Documents\GitHub\rgms_v1 \ No newline at end of file +feature-model=C:\spl\ultimate\rgms\ProductGeneration/featureModel.xml +configuration-model=C:\spl\ultimate\rgms\ProductGeneration/ck.xml +instance-model=C:\spl\ultimate\rgms\ProductGeneration/instanceModel.xml +component-model=C:\spl\ultimate\rgms\ProductGeneration/compModelTeste.txt +source-dir=C:\spl\ultimate\rgmsUltimateMiddleware +target-dir=C:\spl\ultimate\rgmsGenerated \ No newline at end of file diff --git a/ProductGeneration/instanceModel.xml b/ProductGeneration/instanceModel.xml index 0bea2a6d..ca4cf042 100644 --- a/ProductGeneration/instanceModel.xml +++ b/ProductGeneration/instanceModel.xml @@ -9,6 +9,12 @@ + + + + + + diff --git a/application.properties b/application.properties index 11df364c..e6246333 100644 --- a/application.properties +++ b/application.properties @@ -13,3 +13,4 @@ plugins.mail=1.0.1 plugins.pdf=0.6 plugins.shiro=1.1.4 plugins.shiro-ui=1.2.0-SNAPSHOT +plugins.twitter=0.2 diff --git a/grails-app/conf/BuildConfig.groovy b/grails-app/conf/BuildConfig.groovy index adcfe889..e11cb36f 100644 --- a/grails-app/conf/BuildConfig.groovy +++ b/grails-app/conf/BuildConfig.groovy @@ -11,7 +11,6 @@ cloudbees.api.secret = '' grails.project.dependency.resolution = { - //def gebVersion = "0.7.0" def gebVersion = "0.7.1" def seleniumVersion = "2.22.0" diff --git a/grails-app/conf/Config.groovy b/grails-app/conf/Config.groovy index 82404294..e3aa1f07 100644 --- a/grails-app/conf/Config.groovy +++ b/grails-app/conf/Config.groovy @@ -15,8 +15,8 @@ grails { port = 465 //TODO: Before running, make sure that your email login and password appear below //TODO: Before committing, make sure that the strings "LOGIN" and "PASSWORD" appear in place of your login and password - username = "LOGIN" - password = "PASSWORD" + username = "rgms2012.2@gmail.com" + password = "ufpe-cin-taes-2013.1" props = ["mail.smtp.auth": "true", "mail.smtp.socketFactory.port": "465", "mail.smtp.socketFactory.class": "javax.net.ssl.SSLSocketFactory", diff --git a/grails-app/conf/UrlMappings.groovy b/grails-app/conf/UrlMappings.groovy index 3852f019..a186f07d 100644 --- a/grails-app/conf/UrlMappings.groovy +++ b/grails-app/conf/UrlMappings.groovy @@ -13,6 +13,11 @@ class UrlMappings { } } + "/bibtexFileController/upload" { + controller = "bibtexFile" + action = "upload" + } + "/"(controller: "Auth", action: "index") "500"(view:'/error') } diff --git a/grails-app/conf/spring/resources.groovy b/grails-app/conf/spring/resources.groovy index 25dc7220..d0714db8 100644 --- a/grails-app/conf/spring/resources.groovy +++ b/grails-app/conf/spring/resources.groovy @@ -1,3 +1,7 @@ // Place your Spring DSL code here beans = { + localeResolver(org.springframework.web.servlet.i18n.SessionLocaleResolver) { + defaultLocale = new Locale("pt","BR") + java.util.Locale.setDefault(defaultLocale) + } } diff --git a/grails-app/controllers/rgms/member/MemberController.groovy b/grails-app/controllers/rgms/member/MemberController.groovy index aa269415..375a0434 100644 --- a/grails-app/controllers/rgms/member/MemberController.groovy +++ b/grails-app/controllers/rgms/member/MemberController.groovy @@ -29,11 +29,11 @@ class MemberController { } def save = { - // #if($Auth) +//#if($Auth) if (!grailsApplication.config.grails.mail.username) { throw new RuntimeException(message(code: 'mail.plugin.not.configured', 'default' : 'Mail plugin not configured')) } - //#end +//#end def memberInstance = new Member(params) def username = memberInstance?.username @@ -46,11 +46,6 @@ class MemberController { } memberInstance.passwordChangeRequiredOnNextLogon = true - //#if($History) - //saveHistory(memberInstance,memberInstance.status);//essa ? a maneira correta de chamar - //saveHistory(); - //#end - if (!memberInstance.save(flush: true)) { render(view: "create", model: [memberInstance: memberInstance]) return @@ -60,9 +55,9 @@ class MemberController { to memberInstance.email from grailsApplication.config.grails.mail.username subject "[GRMS] Your account was successfully created!" - //#literal() +//#literal() body "Hello ${ memberInstance.name},\n\nYour account was successfully created!\n\nHere is your username: ${ username} and password: ${ password}\n\n${ createLink(absolute: true, uri: '/')}\n\nBest Regards,\nAdministrator of the Research Group Management System".toString() - //#end +//#end } flash.message = message(code: 'default.created.message', args: [message(code: 'member.label', default: 'Member'), memberInstance.id]) @@ -122,10 +117,9 @@ class MemberController { if (!check_version(params.version, memberInstance)) return - //feature record - //#if($History) +//#if($History) def status0 = memberInstance.status //pega o status anterior do usuario - //#end +//#end memberInstance.properties = params //atualiza todos os parametros @@ -134,9 +128,7 @@ class MemberController { return } - //feature record - - //#if($History) //feature record +//#if($History) String newStatus = memberInstance.status //pega o novo status @@ -154,8 +146,7 @@ class MemberController { } saveHistory(memberInstance, newStatus) //refactoring - extract method } - //end feature record - // #end +//#end flash.message = message(code: 'default.updated.message', args: [message(code: 'member.label', default: 'Member'), memberInstance.id]) redirect(action: "show", id: memberInstance.id) diff --git a/grails-app/controllers/rgms/member/ResearchGroupController.groovy b/grails-app/controllers/rgms/member/ResearchGroupController.groovy index 271a72b5..fd764434 100644 --- a/grails-app/controllers/rgms/member/ResearchGroupController.groovy +++ b/grails-app/controllers/rgms/member/ResearchGroupController.groovy @@ -2,7 +2,10 @@ package rgms.member import org.springframework.dao.DataIntegrityViolationException - +import rgms.news.News +import rgms.news.NewsController +import rgms.news.TwitterConnection +import twitter4j.Status class ResearchGroupController { @@ -23,8 +26,8 @@ class ResearchGroupController { } def save() { - def researchGroupInstance = new ResearchGroup(params) - if (!researchGroupInstance.save(flush: true)) { + def researchGroupInstance = new ResearchGroup(params) + if (!researchGroupInstance.save(flush: true)) { render(view: "create", model: [researchGroupInstance: researchGroupInstance]) return } @@ -40,11 +43,12 @@ class ResearchGroupController { return } //def cm = Membership.getCurrentMemberships(researchGroupInstance) - [researchGroupInstance: researchGroupInstance, publicationsInstance : listPublicationByGroup(), currentMemberships: Membership.getCurrentMemberships(researchGroupInstance)] + [researchGroupInstance: researchGroupInstance, publicationsInstance : listPublicationByGroup(), currentMemberships: Membership.getCurrentMemberships(researchGroupInstance), currentNews: News.getCurrentNews(researchGroupInstance)] } def edit() { def researchGroupInstance = ResearchGroup.get(params.id) + assert researchGroupInstance != null if (!researchGroupInstance) { flash.message = message(code: 'default.not.found.message', args: [message(code: 'researchGroup.label', default: 'Research Group'), params.id]) //redirect(action: "list") @@ -164,28 +168,15 @@ class ResearchGroupController { return list } -// def Set listPublicationByGroup(){ -// def researchGroupInstance = ResearchGroup.get(params.id) -// //def g = rgms.ResearchGroup.findById(researchGroupInstance.id) -// def l = [] as Set -// def memberships = researchGroupInstance.memberships.findAll{ -// researchGroupInstance.id = it.researchGroup.id -// } -// -// memberships.each{ -// -// def dateJoined = it.dateJoined -// for(publication in it.member.publications) -// { -// -// if( publication.publicationDate.compareTo(it.dateJoined) > 0) -// { -// l.add(publication); -// } -// } -// } -// return l -// -// } - + + def updateNewsFromTwitter(){ + def researchGroupInstance = ResearchGroup.get(params.id) + TwitterConnection twConn = new TwitterConnection() + List timeline = twConn.getTimeLine(researchGroupInstance.twitter) + timeline.each { + researchGroupInstance.addToNews(new News(description: it.getText(), date: it.getCreatedAt())) + } + researchGroupInstance.save() + redirect(action: "show", id: researchGroupInstance.id) + } } diff --git a/grails-app/controllers/rgms/news/NewsController.groovy b/grails-app/controllers/rgms/news/NewsController.groovy new file mode 100644 index 00000000..61a3e4c9 --- /dev/null +++ b/grails-app/controllers/rgms/news/NewsController.groovy @@ -0,0 +1,59 @@ +package rgms.news + +import org.springframework.dao.DataIntegrityViolationException; + +import twitter4j.Status; + +class NewsController { + + def index() { } + + def create = { + def news = new News(params) + [newsInstance: news] + } + + def delete = { + def newsInstance = News.get(params.id) + if (!newsInstance) { + flash.message = message(code: 'default.not.found.message', args: [message(code: 'news.label', default: 'News'), params.id]) + redirect(action: "list") + return + } + + try { + newsInstance.delete(flush: true) + flash.message = message(code: 'default.deleted.message', args: [message(code: 'news.label', default: 'News'), params.id]) + redirect(action: "list") + } + catch (DataIntegrityViolationException e) { + flash.message = message(code: 'default.not.deleted.message', args: [message(code: 'news.label', default: 'News'), params.id]) + redirect(action: "show", id: params.id) + } + } + + def save = { + if (!grailsApplication.config.grails.mail.username) { + throw new RuntimeException(message(code: 'mail.plugin.not.configured', 'default' : 'Mail plugin not configured')) + } + + def newsInstance = new News(params) + def newsDB = News.findByDescriptionAndDateAndResearchGroup(newsInstance.description,newsInstance.date,newsInstance.researchGroup); + if(newsDB) + { + flash.message = message(code: 'news.not.created.unicity.rule.message', args: [message(code: 'news.label', default: 'News'), params.id]) + redirect(action: "show", id: params.id) + return + + } + //verificar unicidade aqui + //flash.message + + if (!newsInstance.save(flush: true)) { + render(view: "create", model: [newsInstance: newsInstance]) + return + } + } +} + + diff --git a/grails-app/controllers/rgms/publication/BibtexFileController.groovy b/grails-app/controllers/rgms/publication/BibtexFileController.groovy new file mode 100644 index 00000000..436cc282 --- /dev/null +++ b/grails-app/controllers/rgms/publication/BibtexFileController.groovy @@ -0,0 +1,51 @@ +package rgms.publication + +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.multipart.commons.CommonsMultipartFile; + +/** + * + * @author Diogo Vinícius + * + */ +class BibtexFileController { + + def index() {} + + def upload () { + MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest )request + CommonsMultipartFile cmf = (CommonsMultipartFile)multiRequest.getFile("file") + byte[] bytes = cmf.bytes + File file = new File("web-app//uploads//temp.bibtex") + BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)) + bos.write(bytes) + bos.close() + + System.out.println("********** " + file.getBytes().size()); + + BibtexFile bibtexFile = transform(file) + + System.out.println("********** " + bibtexFile.getPublications().size()) + for (Publication publication : bibtexFile.getPublications()) { + System.out.println("************* " + publication); + System.out.println("************************** School : " + publication.getSchool()); + System.out.println("************************** Address: " + publication.getAddress()); + System.out.println("************************** Title : " + publication.getTitle()); + System.out.println("************************** Date : " + publication.getPublicationDate()); + if (publication.save(failOnError: true)) { + System.out.println("salvando o objeto"); + } + } + redirect(action: "home") + + } + + def home () { + + } + + def BibtexFile transform(file) { + return new BibtexFile(file) + } + +} diff --git a/grails-app/controllers/rgms/publication/PublicationController.groovy b/grails-app/controllers/rgms/publication/PublicationController.groovy index 931883c5..ffad6afa 100644 --- a/grails-app/controllers/rgms/publication/PublicationController.groovy +++ b/grails-app/controllers/rgms/publication/PublicationController.groovy @@ -13,12 +13,12 @@ class PublicationController { render(view: "publication") } - //#if($Bibtex) +//#if($Bibtex) def generateBib() { def publication = Publication.get(params.id) render(text: publication.generateBib(), contentType: "text/txt", encoding: "UTF-8") } - //#end +//#end def upload(Publication publicationInstance) { diff --git a/grails-app/domain/rgms/member/ResearchGroup.groovy b/grails-app/domain/rgms/member/ResearchGroup.groovy index 087d46e8..074b6415 100644 --- a/grails-app/domain/rgms/member/ResearchGroup.groovy +++ b/grails-app/domain/rgms/member/ResearchGroup.groovy @@ -1,14 +1,17 @@ package rgms.member -import rgms.publication.Publication; +import rgms.news.News +import rgms.publication.Publication class ResearchGroup { String name String description + String twitter + //#if($researchGroupHierarchy) ResearchGroup childOf; //#end - static hasMany = [memberships : Membership] + static hasMany = [memberships : Membership, news : News] public String toString() { @@ -17,6 +20,7 @@ class ResearchGroup { static constraints = { name(maxSize:10,blank:false,unique:true) description(maxSize:1000,blank:false) + twitter(nullable:true) //#if($researchGroupHierarchy) childOf(nullable:true) diff --git a/grails-app/domain/rgms/news/News.groovy b/grails-app/domain/rgms/news/News.groovy new file mode 100644 index 00000000..b5f0612e --- /dev/null +++ b/grails-app/domain/rgms/news/News.groovy @@ -0,0 +1,26 @@ +package rgms.news + +import java.util.List; + +import rgms.member.ResearchGroup; + +class News { + + String description + Date date + + static belongsTo = [researchGroup:ResearchGroup] + + static constraints = { + description(blank:false) + date(blank:false) + researchGroup nullable:false + } + + + static List getCurrentNews(researchGroup){ + def list = News.findAllByResearchGroup(researchGroup) + return list + } + +} diff --git a/grails-app/domain/rgms/publication/BibtexFile.groovy b/grails-app/domain/rgms/publication/BibtexFile.groovy new file mode 100644 index 00000000..b27c7680 --- /dev/null +++ b/grails-app/domain/rgms/publication/BibtexFile.groovy @@ -0,0 +1,54 @@ +package rgms.publication + +import java.util.Collection; + +import java.io.BufferedReader +import java.io.File; +import java.io.FileInputStream +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStreamReader +import java.io.Reader; +import java.util.ArrayList +import java.util.List + +import org.jbibtex.BibTeXEntry; +import org.jbibtex.Value; +import org.jbibtex.BibTeXDatabase; +import org.jbibtex.BibTeXEntry; +import org.jbibtex.BibTeXParser; +import org.jbibtex.BibTeXString; +import org.jbibtex.Key; +import org.jbibtex.ParseException; + +import rgms.member.Member + +/** + * + * @author Diogo Vinícius + * + */ +class BibtexFile { + + List publications = new ArrayList() + Member member + + public BibtexFile(file) { + publications = BibtexParse.generatePublications(file) + } + + public List getPublications() { + return this.publications + } + + public List getPublications(Class clazz) { + List publicationsFiltered = new ArrayList() + for (Publication publication : this.getPublications()) { + if (publication.getClass().getName().equals(clazz.getName())) { + publicationsFiltered.add(publication) + } + } + return publicationsFiltered + } + +} diff --git a/grails-app/domain/rgms/publication/BibtexParse.groovy b/grails-app/domain/rgms/publication/BibtexParse.groovy new file mode 100644 index 00000000..34640439 --- /dev/null +++ b/grails-app/domain/rgms/publication/BibtexParse.groovy @@ -0,0 +1,108 @@ +package rgms.publication + +import org.jbibtex.BibTeXDatabase +import org.jbibtex.BibTeXEntry +import org.jbibtex.BibTeXParser +import org.jbibtex.BibTeXString +import org.jbibtex.Key +import org.jbibtex.ParseException + +import rgms.publication.strategyBibtexParse.StrategyParseTese +import rgms.publication.strategyBibtexParse.StrategyParseDissertacao + +/** + * + * @author Diogo Vinícius + * + */ +class BibtexParse { + + public static List generatePublications(File file) { + List publications = new ArrayList() + BibTeXDatabase bibtexDatabase = parseBibTeX(file) + Collection entries = bibtexDatabase.getEntries().values(); + + for(BibTeXEntry entry : entries){ + //TODO settar todos os atributos de acordo com a classe a ser instanciada + //Para pegar os valores do objeto 'entry' basta seguir o modelo da linha abaixo + //String value = entry.getField(BibTeXEntry.KEY_TITLE).toUserString(); + if (entry.getType().equals(BibTeXEntry.TYPE_ARTICLE)) { + + } + else if (entry.getType().equals(BibTeXEntry.TYPE_BOOK)) { + publications.add(new BookChapter()) + } + else if (entry.getType().equals(BibTeXEntry.TYPE_BOOKLET)) { + + } + else if (entry.getType().equals(BibTeXEntry.TYPE_CONFERENCE)) { + publications.add(new Conferencia()) + } + else if (entry.getType().equals(BibTeXEntry.TYPE_INBOOK)) { + + } + else if (entry.getType().equals(BibTeXEntry.TYPE_INCOLLECTION)) { + + } + else if (entry.getType().equals(BibTeXEntry.TYPE_INPROCEEDINGS)) { + + } + else if (entry.getType().equals(BibTeXEntry.TYPE_MANUAL)) { + + } + else if (entry.getType().equals(BibTeXEntry.TYPE_MASTERSTHESIS)) { + publications.add(new StrategyParseDissertacao().execute(entry)) + } + else if (entry.getType().equals(BibTeXEntry.TYPE_MISC)) { + + } + //#if($ImportBibtex && $TesePublication) + else if (entry.getType().equals(BibTeXEntry.TYPE_PHDTHESIS)) { + publications.add(new StrategyParseTese().execute(entry)) + } + //#end + else if (entry.getType().equals(BibTeXEntry.TYPE_PROCEEDINGS)) { + + } + else if (entry.getType().equals(BibTeXEntry.TYPE_TECHREPORT)) { + publications.add(new TechnicalReport()) + } + else if (entry.getType().equals(BibTeXEntry.TYPE_UNPUBLISHED)) { + + } + + } + + return publications + + } + + private static BibTeXDatabase parseBibTeX(File file) throws IOException, ParseException { + Reader reader = new FileReader(file); + + try { + BibTeXParser parser = new BibTeXParser(){ + + @Override + public void checkStringResolution(Key key, BibTeXString string){ + + if(string == null){ + System.err.println("Unresolved string: \"" + key.getValue() + "\""); + } + } + + @Override + public void checkCrossReferenceResolution(Key key, BibTeXEntry entry){ + + if(entry == null){ + System.err.println("Unresolved cross-reference: \"" + key.getValue() + "\""); + } + } + }; + + return parser.parse(reader); + } finally { + reader.close(); + } +} +} diff --git a/grails-app/domain/rgms/publication/Conferencia.groovy b/grails-app/domain/rgms/publication/Conferencia.groovy index 748cc2f7..568ce683 100644 --- a/grails-app/domain/rgms/publication/Conferencia.groovy +++ b/grails-app/domain/rgms/publication/Conferencia.groovy @@ -11,13 +11,13 @@ class Conferencia extends Publication { pages nullable: false, blank: false } - //#if($Bibtex) +//#if($Bibtex) String generateBib() { return "@inproceedings{"+ super.members.get(0) + super.publicationDate.getAt(Calendar.YEAR) + ",author=\"" + BibtexAux.organizeAuthors(super.members) + "\",\n title=\"" + super.title + "\",\n booktitle=\"" + this.booktitle + "\",\n year=\"" + super.publicationDate.getAt(Calendar.YEAR) + "\",\n pages=\"" + this.pages + "\",\n month=\"" + super.publicationDate.getAt(Calendar.MONTH) + "\"}" } - //#end +//#end } \ No newline at end of file diff --git a/grails-app/domain/rgms/publication/Dissertacao.groovy b/grails-app/domain/rgms/publication/Dissertacao.groovy index dcdef182..186933f7 100644 --- a/grails-app/domain/rgms/publication/Dissertacao.groovy +++ b/grails-app/domain/rgms/publication/Dissertacao.groovy @@ -3,12 +3,12 @@ package rgms.publication class Dissertacao extends TeseOrDissertacao { - //#if($Bibtex) +//#if($Bibtex) String generateBib() { return "@masterthesis{" + super.members.get(0) + super.publicationDate.getAt(Calendar.YEAR) + ", author=\"" + BibtexAux.organizeAuthors(super.members) + "\",\n title=\"" + super.title + "\",\n school=\"" + this.school + "\",\n year=\"" + super.publicationDate.getAt(Calendar.YEAR) + "\",\n address=\"" + this.address + "\",\n month=\"" + super.publicationDate.getAt(Calendar.MONTH) + "\"}" } - //#end +//#end } \ No newline at end of file diff --git a/grails-app/domain/rgms/publication/Ferramenta.groovy b/grails-app/domain/rgms/publication/Ferramenta.groovy index fd5bdb7c..2276a91d 100644 --- a/grails-app/domain/rgms/publication/Ferramenta.groovy +++ b/grails-app/domain/rgms/publication/Ferramenta.groovy @@ -11,12 +11,12 @@ class Ferramenta extends Publication { description nullable: false, blank: false } - //#if($Bibtex) +//#if($Bibtex) String generateBib() { return "@misc{"+ super.members.get(0) + super.publicationDate.getAt(Calendar.YEAR) + ",author=\"" + BibtexAux.organizeAuthors(super.members) + "\",\n title=\"" + super.title + "\",\n website=\"" + this.website + "\",\n year=\"" + super.publicationDate.getAt(Calendar.YEAR) + "\",\n description=\"" + this.description + "\",\n month=\"" + super.publicationDate.getAt(Calendar.MONTH) + "\"}" } - //#end +//#end } diff --git a/grails-app/domain/rgms/publication/Periodico.groovy b/grails-app/domain/rgms/publication/Periodico.groovy index dabdbf6b..b84399e3 100644 --- a/grails-app/domain/rgms/publication/Periodico.groovy +++ b/grails-app/domain/rgms/publication/Periodico.groovy @@ -14,7 +14,7 @@ class Periodico extends Publication { pages nullable: false, blank: false } - //#if($Bibtex) +//#if($Bibtex) String generateBib() { return "@article{"+ super.members.get(0) + super.publicationDate.getAt(Calendar.YEAR) + ",author=\"" + BibtexAux.organizeAuthors(super.members) + "\",\n title=\"" + super.title + "\",\n journal=\"" @@ -22,7 +22,7 @@ class Periodico extends Publication { + this.volume + "\",\n month=\"" + super.publicationDate.getAt(Calendar.MONTH) + "\",\n number=\"" + this.number + "\",\n pages=\"" + this.pages + "\"}" } - //#end +//#end @Override public String toString() { diff --git a/grails-app/domain/rgms/publication/Publication.groovy b/grails-app/domain/rgms/publication/Publication.groovy index db4ee956..154b5f9e 100644 --- a/grails-app/domain/rgms/publication/Publication.groovy +++ b/grails-app/domain/rgms/publication/Publication.groovy @@ -1,6 +1,7 @@ package rgms.publication import rgms.member.Member +import org.apache.shiro.SecurityUtils abstract class Publication { @@ -71,6 +72,15 @@ abstract class Publication { return result; } + public Set membersSelected() { +//#if ($Autofill) + def loggedUsername = SecurityUtils.subject?.principal; + return members ? members : [ Member.findByUsername(loggedUsername).id ]; +//#else + return members; +//#end + } + // public String retPrimeiroAutor(){ // String[] quebraString = this.author.tokenize(",") // String nomeAutor = quebraString[0] diff --git a/grails-app/domain/rgms/publication/Tese.groovy b/grails-app/domain/rgms/publication/Tese.groovy index 7e7ab71a..5cba112a 100644 --- a/grails-app/domain/rgms/publication/Tese.groovy +++ b/grails-app/domain/rgms/publication/Tese.groovy @@ -3,12 +3,12 @@ package rgms.publication class Tese extends TeseOrDissertacao { - //#if($Bibtex) +//#if($Bibtex) String generateBib() { return "@phdthesis{"+ super.members.get(1) + super.publicationDate.getAt(Calendar.YEAR) + ",author=\"" + BibtexAux.organizeAuthors(super.members) + "\",\n title=\"" + super.title + "\",\n school=\"" + this.school + "\",\n year=\"" + super.publicationDate.getAt(Calendar.YEAR) + "\",\n address=\"" + this.address + "\"}" } - //#end +//#end } diff --git a/grails-app/domain/rgms/publication/TeseOrDissertacao.groovy b/grails-app/domain/rgms/publication/TeseOrDissertacao.groovy index a9cb1619..81145c79 100644 --- a/grails-app/domain/rgms/publication/TeseOrDissertacao.groovy +++ b/grails-app/domain/rgms/publication/TeseOrDissertacao.groovy @@ -1,5 +1,8 @@ package rgms.publication +import rgms.member.Member +import org.apache.shiro.SecurityUtils + abstract class TeseOrDissertacao extends Publication{ String school @@ -9,4 +12,13 @@ abstract class TeseOrDissertacao extends Publication{ school nullable: false, blank: false address nullable: false, blank: false } + + public String schoolSelected() { +//#if ($Autofill) + def loggedUsername = SecurityUtils.subject?.principal; + return school ? school : Member.findByUsername(loggedUsername).university; +//#else + return school; +//#end + } } diff --git a/grails-app/domain/rgms/publication/strategyBibtexParse/StrategyParse.java b/grails-app/domain/rgms/publication/strategyBibtexParse/StrategyParse.java new file mode 100644 index 00000000..efdfc046 --- /dev/null +++ b/grails-app/domain/rgms/publication/strategyBibtexParse/StrategyParse.java @@ -0,0 +1,23 @@ +package rgms.publication.strategyBibtexParse; + +import org.jbibtex.BibTeXEntry; + +import rgms.publication.Publication; + +/** + * + * @author Diogo Vinicius + * + */ +public interface StrategyParse { + + // + /** + * Para pegar os valores do objeto 'entry' basta seguir o modelo da linha abaixo
+ * String value = entry.getField(BibTeXEntry.KEY_TITLE).toUserString(); + * @param entry + * @return Publication + */ + public abstract Publication execute(BibTeXEntry entry); + +} diff --git a/grails-app/domain/rgms/publication/strategyBibtexParse/StrategyParseDissertacao.java b/grails-app/domain/rgms/publication/strategyBibtexParse/StrategyParseDissertacao.java new file mode 100644 index 00000000..d00bb5cd --- /dev/null +++ b/grails-app/domain/rgms/publication/strategyBibtexParse/StrategyParseDissertacao.java @@ -0,0 +1,28 @@ +package rgms.publication.strategyBibtexParse; + +import java.util.Date; + +import org.jbibtex.BibTeXEntry; + +import rgms.publication.Dissertacao; +import rgms.publication.Publication; + +/** + * + * @author Diogo Vinicius + * + */ +public class StrategyParseDissertacao implements StrategyParse { + + @Override + public Publication execute(BibTeXEntry entry) { + Dissertacao dissertacao = new Dissertacao(); + dissertacao.setTitle(entry.getField(BibTeXEntry.KEY_TITLE).toUserString()); + dissertacao.setSchool(entry.getField(BibTeXEntry.KEY_SCHOOL).toUserString()); + dissertacao.setAddress(entry.getField(BibTeXEntry.KEY_ADDRESS).toUserString()); + dissertacao.setPublicationDate(new Date());//TODO transformar o date para setar no objeto + dissertacao.setFile("file");//TODO tirar a obrigatoriedade. futuramente processar a url para importar + return dissertacao; + } + +} diff --git a/grails-app/domain/rgms/publication/strategyBibtexParse/StrategyParseTese.java b/grails-app/domain/rgms/publication/strategyBibtexParse/StrategyParseTese.java new file mode 100644 index 00000000..fd1bbdf0 --- /dev/null +++ b/grails-app/domain/rgms/publication/strategyBibtexParse/StrategyParseTese.java @@ -0,0 +1,28 @@ +package rgms.publication.strategyBibtexParse; + +import java.util.Date; + +import org.jbibtex.BibTeXEntry; + +import rgms.publication.Publication; +import rgms.publication.Tese; + +/** + * + * @author Diogo Vinicius + * + */ +public class StrategyParseTese implements StrategyParse { + + @Override + public Publication execute(BibTeXEntry entry) { + Tese tese = new Tese(); + tese.setTitle(entry.getField(BibTeXEntry.KEY_TITLE).toUserString()); + tese.setSchool(entry.getField(BibTeXEntry.KEY_SCHOOL).toUserString()); + tese.setAddress(entry.getField(BibTeXEntry.KEY_ADDRESS).toUserString()); + tese.setPublicationDate(new Date());//TODO transformar o date para setar no objeto + tese.setFile("file");//TODO settar corretamente este atributo + return tese; + } + +} diff --git a/grails-app/i18n/messages.properties b/grails-app/i18n/messages.properties index 2ca18bcc..a592d0d3 100644 --- a/grails-app/i18n/messages.properties +++ b/grails-app/i18n/messages.properties @@ -150,3 +150,8 @@ default.xml.structure.message=The XML struct doesn't comply with Lattes default.xml.unknownerror.message=An unknown error occurred. Contact the administrator file.already.exist.message=A file has already been saved with the same name + +#if($news) +news.not.created.unicity.rule.message=The system has a news with this description and date. +default.button.update.twitter.label=Update News from Twitter +#end diff --git a/grails-app/i18n/messages_pt_BR.properties b/grails-app/i18n/messages_pt_BR.properties index a7eef048..06b413cf 100644 --- a/grails-app/i18n/messages_pt_BR.properties +++ b/grails-app/i18n/messages_pt_BR.properties @@ -141,4 +141,8 @@ tese.month.label=Mês tese.arquivo.label=Arquivo tese.label=Tese #end + +#if($news) +news.not.created.unicity.rule.message=Já existe no sistema uma noticia cadastrada o esta descrição de data para este grupo de pesquisa. +default.button.update.twitter.label=Atualizar noticias do twitter #end \ No newline at end of file diff --git a/grails-app/views/bibtexFile/home.gsp b/grails-app/views/bibtexFile/home.gsp new file mode 100644 index 00000000..0e768874 --- /dev/null +++ b/grails-app/views/bibtexFile/home.gsp @@ -0,0 +1,17 @@ +<%@ page contentType="text/html;charset=UTF-8" %> + + + + +Insert title here + + +
+
+ + + + +
+ + \ No newline at end of file diff --git a/grails-app/views/bookChapter/_form.gsp b/grails-app/views/bookChapter/_form.gsp index ef1a7b5f..e10194a9 100644 --- a/grails-app/views/bookChapter/_form.gsp +++ b/grails-app/views/bookChapter/_form.gsp @@ -2,7 +2,6 @@ <%@ page import="rgms.publication.BookChapter" %> -
- - + +
diff --git a/grails-app/views/conferencia/_form.gsp b/grails-app/views/conferencia/_form.gsp index c8787019..eaeb6d57 100644 --- a/grails-app/views/conferencia/_form.gsp +++ b/grails-app/views/conferencia/_form.gsp @@ -2,7 +2,6 @@ <%@ page import="rgms.publication.Conferencia" %> -
- +
diff --git a/grails-app/views/dissertacao/_form.gsp b/grails-app/views/dissertacao/_form.gsp index 68b9aad8..890c992f 100644 --- a/grails-app/views/dissertacao/_form.gsp +++ b/grails-app/views/dissertacao/_form.gsp @@ -2,7 +2,6 @@ <%@ page import="rgms.publication.Dissertacao" %> -
- +
@@ -58,7 +57,7 @@ + value="${dissertacaoInstance?.membersSelected()}" />
diff --git a/grails-app/views/ferramenta/_form.gsp b/grails-app/views/ferramenta/_form.gsp index 1ca659c6..c16ac0d7 100644 --- a/grails-app/views/ferramenta/_form.gsp +++ b/grails-app/views/ferramenta/_form.gsp @@ -2,7 +2,6 @@ <%@ page import="rgms.publication.Ferramenta" %> -
+ value="${ferramentaInstance?.membersSelected()}" />
diff --git a/grails-app/views/initial.gsp b/grails-app/views/initial.gsp index ef4bd8b3..e182d29a 100644 --- a/grails-app/views/initial.gsp +++ b/grails-app/views/initial.gsp @@ -143,13 +143,18 @@
  • Periodico
  • Linha de pesquisa
  • Technical Report
  • +
  • Tese
  • +
  • Orientation
  • Visita
  • + +
  • Import Bibtex File
  • + diff --git a/grails-app/views/researchGroup/_form.gsp b/grails-app/views/researchGroup/_form.gsp index b107cada..4f8d0a88 100644 --- a/grails-app/views/researchGroup/_form.gsp +++ b/grails-app/views/researchGroup/_form.gsp @@ -12,6 +12,14 @@ +
    + + +
    +