This are a NoSQL slides that I did last month in my current company
Tuesday, 6 July 2010
Monday, 19 January 2009
Fainit and Facebook Connect
I told that I wouldn't develop more features in Fainit, but this one can help to create community and increase the number of users. Because of this, last week I've been developing Facebook Connect in Fainit.
As a jump start I used Grails Facebook Connect Plugin. Later, if you remember what I did with OpenId and JSecurity, are exactly the same steps with Facebook Connect.
And now you can login in Fainit with your Facebook account, or associate an existing user account to your Facebook account in your profile.
As well, your recommendations can appear in your wall like this:
Enjoy new feature!!
As a jump start I used Grails Facebook Connect Plugin. Later, if you remember what I did with OpenId and JSecurity, are exactly the same steps with Facebook Connect.
And now you can login in Fainit with your Facebook account, or associate an existing user account to your Facebook account in your profile.
As well, your recommendations can appear in your wall like this:
Enjoy new feature!!
Tuesday, 23 December 2008
Grails: OpenSearch in Fainit
This week I've been improving Fainit. One of the features that I've added is OpenSearch, it's really easy in Grails.
The result is that you can add a search engine in firefox, and search in the site like in this screenshot:

First you have to create a controller to server XML for OpenSearch:
To be more user friendly add a mapping in URLMappings.groovy
Next you have to do a template _site_osd.gsp to server XML descriptor
And the last step is add Opensearch descriptor to your main layout (main.gsp) in the head section,, like this:
And that's it, really easy and good result.
The result is that you can add a search engine in firefox, and search in the site like in this screenshot:

First you have to create a controller to server XML for OpenSearch:
def site_osd = {
render(template: '/common/site_osd', contentType:"text/xml")
}"/site_osd"(controller:'home', action: 'site_osd')
<?xml version="1.0"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
<ShortName>${message(code:'search.opensearch.title')}</ShortName>
<Description>${message(code:'search.opensearch.description')}</Description>
<Url type="text/html" method="get" template="${createLink(controller: 'search', absolute: true)}?q={searchTerms}"/>
</OpenSearchDescription>
<link rel="search" href="${createLink(controller:'home',action:'site_osd')}" type="application/opensearchdescription+xml" title="${message(code:'search.opensearch.title2')}"/>Monday, 1 December 2008
Coming Soon Fainit

Have you ever looked for a plumber? Do you know the best restaurant in your city? Do you ask your friends to know the best services and places?
I've been working the whole past month in a collaboratively site to share the best places and services with your friends and with the world. Now I have the first beta, the chosen name is fainit.com, it's a really beta service and for this period I have a limited number of users, try to register and start to share your recommendations.
Behind fainit there is a grails project, and great experience developing my first social network.
Enjoy the site and send me feedback.
Monday, 20 October 2008
Grails: Hacking JSecurity plugin to supports OpenId
I'm currently developing an application for my new brand company and I'd like that supports authentication with username and password , and OpenId.
I could install Acegi Grails Plugin, but I'm very happy using JSecurity, ok no problem let's hack.
First, I have to install OpenId Plugin to support OpenId authenticantion, with this plugin I can manage login process and get openid identifier for OpenId users.
With JSecurity installed and done QuickStart, I need to pass Openid identifier in auth process, for this I've created class OpenIdContextHolder to save in a ThreadLocal context.
Now I have to hack AuthController to manage openid issues. The trick is when a user try to signIn, if I recive an OpenId identifier from OpenId Plugin then I put it in OpenIdContextHolder.
Next step is update JsecDbRealm generated. I have to retrieve OpenId identifier from ContextHolder, and lookup in my domain objects. I use the trick to register my openId users in JScecurity with the password 'secret' but if anyone try to access with username and password in this kind of users, I throw an Exception.
The last step is redirect, openid users to signIn controller after logged (you only have to change it in OpenId Plugin).
And that's all folks.
I could install Acegi Grails Plugin, but I'm very happy using JSecurity, ok no problem let's hack.
First, I have to install OpenId Plugin to support OpenId authenticantion, with this plugin I can manage login process and get openid identifier for OpenId users.
With JSecurity installed and done QuickStart, I need to pass Openid identifier in auth process, for this I've created class OpenIdContextHolder to save in a ThreadLocal context.
class OpenIdContextHolder{
private static final ThreadLocal openIdContextHolder = new ThreadLocal();
static void resetContext() {
openIdContextHolder.set(null);
}
static def getOpenIdIdentifier(){
openIdContextHolder.get()
}
static void setOpenIdIdentifier(id){
openIdContextHolder.set(id)
}
}
def login = {
if(openidService.isLoggedIn(session)){
return redirect(action:'signIn')
}
return [ username: params.username, rememberMe: (params.rememberMe != null), targetUri: params.targetUri ]
}
def signIn = {
// if is logged with openid set contextholder
if(openidService.isLoggedIn(session)){
def openId = openidService.getIdentifier(session)
OpenIdContextHolder.setOpenIdIdentifier(openId)
params.rememberMe = true
params.username = openId
params.password = "nullpass"
}
def authToken = new UsernamePasswordToken(params.username, params.password)
// continues the default generated code...
// ...
}
def authenticate(authToken) {
log.info "Attempting to authenticate ${authToken.username} in DB realm..."
// experimental!!
def openid = OpenIdContextHolder.getOpenIdIdentifier()
OpenIdContextHolder.resetContext()
log.info "OpenIdContextHolder request with openid: ${openid}"
if(openid){
def openidUser = User.findByOpenid(openid)
if (!openidUser)
throw new UnknownAccountException("No account found for user [${username}]")
log.info "Jsecurity with Openid ${openidUser.username} : ${openidUser.openid}"
authToken.password = 'secret'
authToken.username = openidUser.username
}else {
def openidUser = User.findByUsername(authToken.username)
if(openidUser?.openid?.trim()){
// trying to access with password for openid user
log.info "Jsecurity: Trying to access with password for user: ${openidUser.username} : ${openidUser.openid}"
throw new IncorrectCredentialsException("Invalid password for openid user '${authToken.username}', try to use openid instead user:password")
}
}
def username = authToken.username
// continues the default generated code...
// ...And that's all folks.
Saturday, 6 September 2008
New hopes and expectations
I've been very busy those months, because I have a lot of work to do. The main reason is that I quit my old job and I've started the adventure to work in my own company.
Now I work for the best company in the world Heralsoft, and of course the best company only can use the best technology, Grails :D.
To start, I eat my own food because the company website is a Grails application. In less than one week of development, I did a professional site with i18n (English and Spanish), blog (only English), feeds, authentication, searchable.
Visit my company home page and contact to me if you have any comment, or business oportunities.
Now I work for the best company in the world Heralsoft, and of course the best company only can use the best technology, Grails :D.
To start, I eat my own food because the company website is a Grails application. In less than one week of development, I did a professional site with i18n (English and Spanish), blog (only English), feeds, authentication, searchable.
Visit my company home page and contact to me if you have any comment, or business oportunities.
Wednesday, 18 June 2008
Script to deploy Grails Applications Remote
I spent some time this week doing a script to deploy my grails applications in remote Jetty container.
To do my deploy script I use Gant, with Grails support. To deploy War in Jetty you have two options:
To generate XML, Groovy is fantastic I mix some withWriter closure to generate the head of the document, and MarkupBuilder to do the hard work.
And this is the script:
I have an issue with hot deploy in Jetty and Grails (if anyone can help?) , but the script works well :D
To do my deploy script I use Gant, with Grails support. To deploy War in Jetty you have two options:
- Static. To do in static way you only have to copy your War to "webapps" directory and restart container.
- Hot deploy. I prefer hot deploy to avoid restart container and I have to copy War in "webapps" directory and generate XML with context description.
To generate XML, Groovy is fantastic I mix some withWriter closure to generate the head of the document, and MarkupBuilder to do the hard work.
And this is the script:
import org.codehaus.groovy.grails.commons.GrailsClassUtils as GCU
import groovy.xml.MarkupBuilder
grailsHome = Ant.project.properties."environment.GRAILS_HOME"
includeTargets << new File ( "${grailsHome}/scripts/War.groovy" )
target('default': "Deploy war in server") {
depends(war)
// avoid War with dots (problems with static deploy)
def warTmp = "${grailsAppName}.war"
Ant.copy(file:warName, tofile:warTmp)
def dir = "/opt/jetty"
def host = "myhost.com"
def port = "22"
def user = "myuser"
def dsa = "${basedir}/scripts/key/id_dsa"
def swriter = new StringWriter()
def xml = new MarkupBuilder(swriter)
xml.Configure('class': "org.mortbay.jetty.webapp.WebAppContext") {
Set(name: 'contextPath','/')
Set(name: 'war'){
SystemProperty(name: 'jetty.home', default: '.')
mkp.yield("/webapps/${warTmp}")
}
Set(name: 'defaultsDescriptor'){
SystemProperty(name: 'jetty.home', default: '.')
mkp.yield("/etc/webdefault.xml")
}
}
def xmlDescriptor = "${basedir}/${grailsAppName}.xml"
new File(xmlDescriptor).withWriter{ writer ->
writer << '<?xml version="1.0" encoding="ISO-8859-1"?>\r\n'
writer << '<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">\r\n'
writer << swriter.toString()
writer << '\r\n'
}
echo "Deploying files to remote: ${host}"
scp(file: warTmp, todir: "${user}@${host}:${dir}/webapps", keyfile:"${dsa}", port:"${port}", passphrase:"", trust:"true")
scp(file: xmlDescriptor, todir: "${user}@${host}:${dir}/contexts", keyfile:"${dsa}", port:"${port}", passphrase:"", trust:"true")
echo "Finished :)"
}
I have an issue with hot deploy in Jetty and Grails (if anyone can help?) , but the script works well :D
Saturday, 17 May 2008
The advantage of Grails
This week Spring Source have released, Spring Web Flow 2, I've read release notes and this make me think about the advantage of Grails.
Let's see release notes:
And the best, Grails can be updated to use Spring Webflow 2.
But, the advantage goes further, with Servlet 3.0 and generation of web.xml, I can do it with Grails plugins, and really futher with Java 7 and closures.
Let's see release notes:
- "The Web Flow module is a MVC extension that allows you to define Controllers using a domain-specific-language."
- Spring Javascript is a JavaScript abstraction framework that allows you to progressively enhance a web page with behavior.
- The Spring Faces module contains Spring's support for JavaServerFaces.
- Using Spring Security to secure your flows in a declarative manner
- Using Tiles for JSP page composition and Ajax partial-rendering
And the best, Grails can be updated to use Spring Webflow 2.
But, the advantage goes further, with Servlet 3.0 and generation of web.xml, I can do it with Grails plugins, and really futher with Java 7 and closures.
Monday, 12 May 2008
Great feedback in Grails Course
In last week I've been teaching in Groovy and Grails course, around 15 students, some people from Struts 1.x, some people from PHP, some portal developers with Vignette, and newbie people from University.
The people were very interested in Grails, and all said that is very easy learn, and create Web apps.
Great experience.
The people were very interested in Grails, and all said that is very easy learn, and create Web apps.
Great experience.
Thursday, 17 April 2008
Grails course in Asturias, Spain
I'm pleased to annonce a Grails course in Asturias, Spain. The course is organized by the College of Engineers of Principado de Asturias, from 5th to 10th of may, around 15 hours training in Groovy and Grails technologies.
The title of course can be translate as "Agile Development in Java EE with Grails". If any one is interested, can contact to me by mail.
Here the slides (in Spanish) for my first class.
The title of course can be translate as "Agile Development in Java EE with Grails". If any one is interested, can contact to me by mail.
Here the slides (in Spanish) for my first class.
Subscribe to:
Posts (Atom)