SlideShare a Scribd company logo
1 of 33
jRecruiter
The AJUG Job Posting Service

   Gunnar Hillert




                               1
About Myself

1998-2002 CS at Univ. of Applied Sciences (HTW)
Berlin, Germany
2002 Thesis
2002-2005 Business Integration Consultant
2005-today Mostly web application development
  Struts 1, Spring MVC, Struts 2, GWT


                                                  2
Sometimes I don’t code...
but rather enjoy red clay and humidity
                                         3
About jRecruiter

 Google Code: http://code.google.com/p/jrecruiter/
 CI: http://74.207.227.71:9080/hudson/job/jRecruiter/
 Website: http://www.jrecruiter.org/
 AJUG Job Posting Site: http://www.ajug.org/jrecruiter/




                                                          4
History


 2005 jRecruiter 1.0 (Struts 1, Hibernate)
 2006 jRecruiter 1.2 (Design changes, validation)
 2009 jRecruiter 2.0 (Struts 2.1, Spring 3.0, JPA
 (Hibernate))




                                                    5
Changes
Heavy Use of Annotations (Spring 2.5+)
Google Maps Integration
Hibernate Search
RSS
Better Security
Flex Integration Example


                                         6
Maven 2

jRecruiter uses Maven 2
3 Modules
  jrecruiter-server
  jrecruiter-web
  jrecruiter-flex



                          7
AppFuse

If you develop Java web-applications, it’s a must-know!
http://www.appfuse.org
Developed by Matt Raible - www.raibledesigns.com
jRecruiter is loosely based on AppFuse




                                                          8
Spring 2.5/3.0

 Use annotations to reduce XML clutter
 @Autowired - eliminate getters/setters
 <tx:annotation-driven/>

 <context:annotation-config />
 <context:component-scan base-package="org.jrecruiter.dao.jpa" />
 <context:component-scan base-package="org.jrecruiter.service.impl" />




                                                                         9
Spring Tips

If using @Autowired and no setters - How to unit-test?
org.springframework.test.util.ReflectionTestUtils
Allows for setting private instance variables
EasyMock is awesome




                                                         10
Table Pluralization I

 What about rails-like table pluralization?
 You could do: @Table(name="users")
 Better: Hibernate Naming Strategy
   org.hibernate.cfg.DefaultNamingStrategy
   org.hibernate.cfg.ImprovedNamingStrategy



                                              11
Table Pluralization II

 How to do pluralization?
 inflector project (http://inflector.dev.java.net)
 e.g. String cats = Noun.pluralOf(“cat”)
 jRecruiter: ImprovedPluralizedNamingStrategy




                                                   12
Data Migration

How to deal with external services referencing jobs?
Primary key ids may change across data migrations
Solution: UUID for Job postings
How to map old urls to the new one?
Solution: urlrewriter (http://tuckey.org/urlrewrite/)



                                                        13
Lorem Ipsum

Generate an arbitrary number of job postings
Fill them with Dummy Data aka ‘place holder text’
http://en.wikipedia.org/wiki/Lorem_ipsum
Library for Java: http://loremipsum.sourceforge.net/




                                                       14
Struts 2.1

 Annotation-driven configuration
 Using Convention Plugin (Bundled with Struts 2.1)
 VERY similar to Spring MVC 3.0
 Which one is better?




                                                     15
I18N part I

 support for German (80% complete)
 support for Spanish is planned
 Advice: UTF-8 for everything!
 Java properties files are a bit ‘iffy’




                                         16
I18N part II

 by default Java properties files are in ISO-8859-1
 UTF-8 characters need to be escaped - ugly!
 Java 6 has better support: ResourceBundle.Control
 ResourceBundle bundle =
 ResourceBundle.getBundle("messages", new
 MyControl());



                                                     17
I18N part III
 Spring: ReloadableResourceBundleMessageSource
 <bean id="messageSource"
 class="org.springframework.context.support.ReloadableResourceBundleMessageSource" >
       <property name="basenames" >
          <list>
              <value>classpath:messages</value>
         </list>
       </property>
      <property name="defaultEncoding" value="utf-8"/>
      <property name="cacheSeconds" value="0"/>
 </bean>


 Spring JSP message tag can use it
 Good plugin for eclipse: Eclipse ResourceBundle Editor
 http://sourceforge.net/projects/eclipse-rbe/
                                                                                       18
Security in jRecruiter

 SSL for all administrative pages
 Account verification at signup (Email)
 User Login: Email + Password
 Under the covers: Email OR Username + Password




                                                  19
Jasypt
http://www.jasypt.org/
http://www.jasypt.org/howtoencryptuserpasswords.html
<bean id="stringDigester" class="org.jasypt.digest.StandardStringDigester" >
<property name="algorithm"      value="SHA-512" />
 <property name="iterations"     value="100000" />
 <property name="saltSizeBytes" value="16" />
</bean>

<bean id="passwordEncoder" class="org.jasypt.spring.security2.PasswordEncoder">
 <property name="stringDigester">
   <ref bean="stringDigester" />
 </property>
</bean>




                                                                                  20
reCATPCHA

http://recaptcha.net/
Ensure a human is filling
out the form
APIs for many languages
  Java, Ruby, Python, .Net…
  Recaptcha4j (http://code.google.com/p/recaptcha/)


                                                      21
Google Maps

jRecruiter uses:
  Maps Api (Version 2)
  Maps Api for Flash
  Static Maps API
Be careful with SSL!
  http://code.google.com/p/gmaps-api-issues/issues/detail?id=591




                                                                   22
Google Maps for PDF


Using Static Maps API
Server makes call
Image embedded using iText




                             23
Twitter and bit.ly
 Twitter4J (http://yusuke.homeip.net/twitter4j/
 java-twitter (http://code.google.com/p/java-twitter/)
 Jtwitter (http://www.winterwell.com/software/
 jtwitter.php)
 jRecruiter uses Twitter4J:
     final Twitter twitter = new Twitter(“my_username”, “my password”);
     try {
        twitter.updateStatus(“tweet”);
     } catch (TwitterException e) { …}


                                                                         24
bit.ly
 similar to TinyUrl, just cooler
 there is a Java library available bitlyj
 http://code.google.com/p/bitlyj/
 bitlyj works okay but needs some work
  final Bitly bitly = BitlyFactory.newInstance(“username”, “password”);

  try {
      final BitlyUrl bUrl = bitly.shorten(“http://www.google.com/”);
      return bUrl.getShortUrl();
  } catch (final IOException e) { … }



                                                                          25
Managing API Keys

Dealing with one API key is easy, but many?
Google Maps, Twitter, bit.ly, reCAPTCHA ...
Centrally stored in jrecruiter.properties
org.jrecruiter.common.ApiKeysHolder
Spring-injected



                                              26
RSS Feed Support

Provide the latest 20 Job postings as Feed
ROME
  https://rome.dev.java.net/
Struts2 integration with s2-rome
  http://code.google.com/p/s2-rome/



                                             27
Web Services (Indeed.com)

Used JDOM at first, yet memory intensive
StAX - Streaming API for XML
Stream XML data to client
Advantage: Lower Memory Footprint
Part of Java 6



                                          28
YSlow

80% of the end-user response time is spent on the
front-end.
Reduce HTTP requests, GZIP, Minify …
http://developer.yahoo.com/yslow/
http://developer.yahoo.com/performance/rules.html



                                                    29
Jawr

https://jawr.dev.java.net/
Bundling
Minification
GZipping
DWR Integration
JMX Support


                             30
Flex

 Spring BlazeDS Integration
   http://www.springsource.org/spring-flex
 http://coenraets.org (Christophe Coenraets)
 SWFObject 2 - Easier Flex Embedding
   http://code.google.com/p/swfobject/



                                               31
flexmojos


http://flexmojos.sonatype.org/
Build Flex projects with Maven
Now part of Sonatype




                                 32
¿Questions?

Feature requests/issues/feedback


   gunnar@hillert.com
   http://blog.hillert.com


Slides available at:
http://www.slideshare.net/hillert/jrecruiter-the-ajug-job-posting-service


                                                                            33

More Related Content

What's hot

Intro to Web Components, Polymer & Vaadin Elements
Intro to Web Components, Polymer & Vaadin ElementsIntro to Web Components, Polymer & Vaadin Elements
Intro to Web Components, Polymer & Vaadin ElementsManuel Carrasco Moñino
 
Creating the interfaces of the future with the APIs of today
Creating the interfaces of the future with the APIs of todayCreating the interfaces of the future with the APIs of today
Creating the interfaces of the future with the APIs of todaygerbille
 
Front End Development for Backend Developers - GIDS 2019
Front End Development for Backend Developers - GIDS 2019Front End Development for Backend Developers - GIDS 2019
Front End Development for Backend Developers - GIDS 2019Matt Raible
 
Jsf, facelets, spring, hibernate, maven2
Jsf, facelets, spring, hibernate, maven2Jsf, facelets, spring, hibernate, maven2
Jsf, facelets, spring, hibernate, maven2Raghavan Mohan
 
How to Build SPA with Vue Router 2.0
How to Build SPA with Vue Router 2.0How to Build SPA with Vue Router 2.0
How to Build SPA with Vue Router 2.0Takuya Tejima
 
Drupal 8, Where Did the Code Go? From Info Hook to Plugin
Drupal 8, Where Did the Code Go? From Info Hook to PluginDrupal 8, Where Did the Code Go? From Info Hook to Plugin
Drupal 8, Where Did the Code Go? From Info Hook to PluginAcquia
 
JSF, Facelets, Spring-JSF & Maven
JSF, Facelets, Spring-JSF & MavenJSF, Facelets, Spring-JSF & Maven
JSF, Facelets, Spring-JSF & MavenRaghavan Mohan
 
OSGi framework overview
OSGi framework overviewOSGi framework overview
OSGi framework overviewBalduran Chang
 
Scalable Front-end Development with Vue.JS
Scalable Front-end Development with Vue.JSScalable Front-end Development with Vue.JS
Scalable Front-end Development with Vue.JSGalih Pratama
 
Google App Engine for Java v0.0.2
Google App Engine for Java v0.0.2Google App Engine for Java v0.0.2
Google App Engine for Java v0.0.2Matthew McCullough
 
Zend Framework 2 - Basic Components
Zend Framework 2  - Basic ComponentsZend Framework 2  - Basic Components
Zend Framework 2 - Basic ComponentsMateusz Tymek
 

What's hot (16)

2021laravelconftwslides11
2021laravelconftwslides112021laravelconftwslides11
2021laravelconftwslides11
 
Intro to Web Components, Polymer & Vaadin Elements
Intro to Web Components, Polymer & Vaadin ElementsIntro to Web Components, Polymer & Vaadin Elements
Intro to Web Components, Polymer & Vaadin Elements
 
Creating the interfaces of the future with the APIs of today
Creating the interfaces of the future with the APIs of todayCreating the interfaces of the future with the APIs of today
Creating the interfaces of the future with the APIs of today
 
Vuex
VuexVuex
Vuex
 
Front End Development for Backend Developers - GIDS 2019
Front End Development for Backend Developers - GIDS 2019Front End Development for Backend Developers - GIDS 2019
Front End Development for Backend Developers - GIDS 2019
 
Jsf, facelets, spring, hibernate, maven2
Jsf, facelets, spring, hibernate, maven2Jsf, facelets, spring, hibernate, maven2
Jsf, facelets, spring, hibernate, maven2
 
How to Build SPA with Vue Router 2.0
How to Build SPA with Vue Router 2.0How to Build SPA with Vue Router 2.0
How to Build SPA with Vue Router 2.0
 
Drupal 8, Where Did the Code Go? From Info Hook to Plugin
Drupal 8, Where Did the Code Go? From Info Hook to PluginDrupal 8, Where Did the Code Go? From Info Hook to Plugin
Drupal 8, Where Did the Code Go? From Info Hook to Plugin
 
Build system
Build systemBuild system
Build system
 
JSF, Facelets, Spring-JSF & Maven
JSF, Facelets, Spring-JSF & MavenJSF, Facelets, Spring-JSF & Maven
JSF, Facelets, Spring-JSF & Maven
 
OSGi framework overview
OSGi framework overviewOSGi framework overview
OSGi framework overview
 
GWT Reloaded
GWT ReloadedGWT Reloaded
GWT Reloaded
 
Scalable Front-end Development with Vue.JS
Scalable Front-end Development with Vue.JSScalable Front-end Development with Vue.JS
Scalable Front-end Development with Vue.JS
 
Google App Engine for Java v0.0.2
Google App Engine for Java v0.0.2Google App Engine for Java v0.0.2
Google App Engine for Java v0.0.2
 
Zend Framework 2 - Basic Components
Zend Framework 2  - Basic ComponentsZend Framework 2  - Basic Components
Zend Framework 2 - Basic Components
 
Struts2 tutorial
Struts2 tutorialStruts2 tutorial
Struts2 tutorial
 

Viewers also liked

Working between the clouds
Working between the cloudsWorking between the clouds
Working between the cloudsDavide Cerbo
 
Posting a Job versus Sourcing Talent
Posting a Job versus Sourcing TalentPosting a Job versus Sourcing Talent
Posting a Job versus Sourcing TalentHello Talent
 
Recruitment Best Practices
Recruitment Best PracticesRecruitment Best Practices
Recruitment Best PracticesEmploywise
 
Job Advert Writing Presentation
Job Advert Writing PresentationJob Advert Writing Presentation
Job Advert Writing PresentationJade Webster
 
Chapter 5 Effective Job Analysis
Chapter 5 Effective Job AnalysisChapter 5 Effective Job Analysis
Chapter 5 Effective Job AnalysisWisnu Dewobroto
 
Building Talent Pipelines vs Lean/Just-In-Time Recruiting - Talent 42 Keynote
Building Talent Pipelines vs Lean/Just-In-Time Recruiting - Talent 42 KeynoteBuilding Talent Pipelines vs Lean/Just-In-Time Recruiting - Talent 42 Keynote
Building Talent Pipelines vs Lean/Just-In-Time Recruiting - Talent 42 KeynoteGlen Cathey
 
How to Get People to Respond to Your Recruiting Emails & Messages
How to Get People to Respond to Your Recruiting Emails & MessagesHow to Get People to Respond to Your Recruiting Emails & Messages
How to Get People to Respond to Your Recruiting Emails & MessagesGlen Cathey
 

Viewers also liked (7)

Working between the clouds
Working between the cloudsWorking between the clouds
Working between the clouds
 
Posting a Job versus Sourcing Talent
Posting a Job versus Sourcing TalentPosting a Job versus Sourcing Talent
Posting a Job versus Sourcing Talent
 
Recruitment Best Practices
Recruitment Best PracticesRecruitment Best Practices
Recruitment Best Practices
 
Job Advert Writing Presentation
Job Advert Writing PresentationJob Advert Writing Presentation
Job Advert Writing Presentation
 
Chapter 5 Effective Job Analysis
Chapter 5 Effective Job AnalysisChapter 5 Effective Job Analysis
Chapter 5 Effective Job Analysis
 
Building Talent Pipelines vs Lean/Just-In-Time Recruiting - Talent 42 Keynote
Building Talent Pipelines vs Lean/Just-In-Time Recruiting - Talent 42 KeynoteBuilding Talent Pipelines vs Lean/Just-In-Time Recruiting - Talent 42 Keynote
Building Talent Pipelines vs Lean/Just-In-Time Recruiting - Talent 42 Keynote
 
How to Get People to Respond to Your Recruiting Emails & Messages
How to Get People to Respond to Your Recruiting Emails & MessagesHow to Get People to Respond to Your Recruiting Emails & Messages
How to Get People to Respond to Your Recruiting Emails & Messages
 

Similar to jRecruiter - The AJUG Job Posting Service

Spring Performance Gains
Spring Performance GainsSpring Performance Gains
Spring Performance GainsVMware Tanzu
 
Front End Development for Back End Developers - UberConf 2017
Front End Development for Back End Developers - UberConf 2017Front End Development for Back End Developers - UberConf 2017
Front End Development for Back End Developers - UberConf 2017Matt Raible
 
TechEvent Eclipse Microprofile
TechEvent Eclipse MicroprofileTechEvent Eclipse Microprofile
TechEvent Eclipse MicroprofileTrivadis
 
Javascript as a target language - GWT KickOff - Part 2/2
Javascript as a target language - GWT KickOff - Part 2/2Javascript as a target language - GWT KickOff - Part 2/2
Javascript as a target language - GWT KickOff - Part 2/2JooinK
 
OGCE Project Overview
OGCE Project OverviewOGCE Project Overview
OGCE Project Overviewmarpierc
 
using Mithril.js + postgREST to build and consume API's
using Mithril.js + postgREST to build and consume API'susing Mithril.js + postgREST to build and consume API's
using Mithril.js + postgREST to build and consume API'sAntônio Roberto Silva
 
MeasureCamp IX (London) - 10 JavaScript Concepts for web analysts
MeasureCamp IX (London) - 10 JavaScript Concepts for web analystsMeasureCamp IX (London) - 10 JavaScript Concepts for web analysts
MeasureCamp IX (London) - 10 JavaScript Concepts for web analystsSimo Ahava
 
Java programming concept
Java programming conceptJava programming concept
Java programming conceptSanjay Gunjal
 
Solving anything in VCL
Solving anything in VCLSolving anything in VCL
Solving anything in VCLFastly
 
手把手教你如何串接 Log 到各種網路服務
手把手教你如何串接 Log 到各種網路服務手把手教你如何串接 Log 到各種網路服務
手把手教你如何串接 Log 到各種網路服務Mu Chun Wang
 
The Ring programming language version 1.7 book - Part 75 of 196
The Ring programming language version 1.7 book - Part 75 of 196The Ring programming language version 1.7 book - Part 75 of 196
The Ring programming language version 1.7 book - Part 75 of 196Mahmoud Samir Fayed
 
Testing of javacript
Testing of javacriptTesting of javacript
Testing of javacriptLei Kang
 
The Ring programming language version 1.8 book - Part 77 of 202
The Ring programming language version 1.8 book - Part 77 of 202The Ring programming language version 1.8 book - Part 77 of 202
The Ring programming language version 1.8 book - Part 77 of 202Mahmoud Samir Fayed
 
Choose Your Own Adventure with JHipster & Kubernetes - Utah JUG 2020
Choose Your Own Adventure with JHipster & Kubernetes - Utah JUG 2020Choose Your Own Adventure with JHipster & Kubernetes - Utah JUG 2020
Choose Your Own Adventure with JHipster & Kubernetes - Utah JUG 2020Matt Raible
 
Server side programming bt0083
Server side programming bt0083Server side programming bt0083
Server side programming bt0083Divyam Pateriya
 
Analyzing the Performance of Mobile Web
Analyzing the Performance of Mobile WebAnalyzing the Performance of Mobile Web
Analyzing the Performance of Mobile WebAriya Hidayat
 
Andy Bosch - JavaServer Faces in the cloud
Andy Bosch -  JavaServer Faces in the cloudAndy Bosch -  JavaServer Faces in the cloud
Andy Bosch - JavaServer Faces in the cloudAndy Bosch
 

Similar to jRecruiter - The AJUG Job Posting Service (20)

Spring Performance Gains
Spring Performance GainsSpring Performance Gains
Spring Performance Gains
 
Front End Development for Back End Developers - UberConf 2017
Front End Development for Back End Developers - UberConf 2017Front End Development for Back End Developers - UberConf 2017
Front End Development for Back End Developers - UberConf 2017
 
TechEvent Eclipse Microprofile
TechEvent Eclipse MicroprofileTechEvent Eclipse Microprofile
TechEvent Eclipse Microprofile
 
Javascript as a target language - GWT KickOff - Part 2/2
Javascript as a target language - GWT KickOff - Part 2/2Javascript as a target language - GWT KickOff - Part 2/2
Javascript as a target language - GWT KickOff - Part 2/2
 
OGCE Project Overview
OGCE Project OverviewOGCE Project Overview
OGCE Project Overview
 
using Mithril.js + postgREST to build and consume API's
using Mithril.js + postgREST to build and consume API'susing Mithril.js + postgREST to build and consume API's
using Mithril.js + postgREST to build and consume API's
 
MeasureCamp IX (London) - 10 JavaScript Concepts for web analysts
MeasureCamp IX (London) - 10 JavaScript Concepts for web analystsMeasureCamp IX (London) - 10 JavaScript Concepts for web analysts
MeasureCamp IX (London) - 10 JavaScript Concepts for web analysts
 
Java programming concept
Java programming conceptJava programming concept
Java programming concept
 
Solving anything in VCL
Solving anything in VCLSolving anything in VCL
Solving anything in VCL
 
手把手教你如何串接 Log 到各種網路服務
手把手教你如何串接 Log 到各種網路服務手把手教你如何串接 Log 到各種網路服務
手把手教你如何串接 Log 到各種網路服務
 
The Ring programming language version 1.7 book - Part 75 of 196
The Ring programming language version 1.7 book - Part 75 of 196The Ring programming language version 1.7 book - Part 75 of 196
The Ring programming language version 1.7 book - Part 75 of 196
 
Testing of javacript
Testing of javacriptTesting of javacript
Testing of javacript
 
The Ring programming language version 1.8 book - Part 77 of 202
The Ring programming language version 1.8 book - Part 77 of 202The Ring programming language version 1.8 book - Part 77 of 202
The Ring programming language version 1.8 book - Part 77 of 202
 
Choose Your Own Adventure with JHipster & Kubernetes - Utah JUG 2020
Choose Your Own Adventure with JHipster & Kubernetes - Utah JUG 2020Choose Your Own Adventure with JHipster & Kubernetes - Utah JUG 2020
Choose Your Own Adventure with JHipster & Kubernetes - Utah JUG 2020
 
Server side programming bt0083
Server side programming bt0083Server side programming bt0083
Server side programming bt0083
 
Analyzing the Performance of Mobile Web
Analyzing the Performance of Mobile WebAnalyzing the Performance of Mobile Web
Analyzing the Performance of Mobile Web
 
Droidcon Paris 2015
Droidcon Paris 2015Droidcon Paris 2015
Droidcon Paris 2015
 
micro-frontends-with-vuejs
micro-frontends-with-vuejsmicro-frontends-with-vuejs
micro-frontends-with-vuejs
 
Power ai image-pipeline
Power ai image-pipelinePower ai image-pipeline
Power ai image-pipeline
 
Andy Bosch - JavaServer Faces in the cloud
Andy Bosch -  JavaServer Faces in the cloudAndy Bosch -  JavaServer Faces in the cloud
Andy Bosch - JavaServer Faces in the cloud
 

More from Gunnar Hillert

High Precision GPS Positioning for Spring Developers
High Precision GPS Positioning for Spring DevelopersHigh Precision GPS Positioning for Spring Developers
High Precision GPS Positioning for Spring DevelopersGunnar Hillert
 
Migrating to Angular 5 for Spring Developers
Migrating to Angular 5 for Spring DevelopersMigrating to Angular 5 for Spring Developers
Migrating to Angular 5 for Spring DevelopersGunnar Hillert
 
Ajug - The Spring Update
Ajug - The Spring UpdateAjug - The Spring Update
Ajug - The Spring UpdateGunnar Hillert
 
s2gx2015 who needs batch
s2gx2015 who needs batchs2gx2015 who needs batch
s2gx2015 who needs batchGunnar Hillert
 
Spring Batch Performance Tuning
Spring Batch Performance TuningSpring Batch Performance Tuning
Spring Batch Performance TuningGunnar Hillert
 
Creating Modular Test-Driven SPAs with Spring and AngularJS
Creating Modular Test-Driven SPAs with Spring and AngularJSCreating Modular Test-Driven SPAs with Spring and AngularJS
Creating Modular Test-Driven SPAs with Spring and AngularJSGunnar Hillert
 
Modular Test-driven SPAs with Spring and AngularJS
Modular Test-driven SPAs with Spring and AngularJSModular Test-driven SPAs with Spring and AngularJS
Modular Test-driven SPAs with Spring and AngularJSGunnar Hillert
 
Atlanta JUG - Integrating Spring Batch and Spring Integration
Atlanta JUG - Integrating Spring Batch and Spring IntegrationAtlanta JUG - Integrating Spring Batch and Spring Integration
Atlanta JUG - Integrating Spring Batch and Spring IntegrationGunnar Hillert
 
DevNexus 2013 - Introduction to WebSockets
DevNexus 2013 - Introduction to WebSocketsDevNexus 2013 - Introduction to WebSockets
DevNexus 2013 - Introduction to WebSocketsGunnar Hillert
 
Introduction to WebSockets
Introduction to WebSocketsIntroduction to WebSockets
Introduction to WebSocketsGunnar Hillert
 
S2GX 2012 - Spring Projects Infrastructure
S2GX 2012 - Spring Projects InfrastructureS2GX 2012 - Spring Projects Infrastructure
S2GX 2012 - Spring Projects InfrastructureGunnar Hillert
 
S2GX 2012 - What's New in Spring Integration
S2GX 2012 - What's New in Spring IntegrationS2GX 2012 - What's New in Spring Integration
S2GX 2012 - What's New in Spring IntegrationGunnar Hillert
 
S2GX 2012 - Introduction to Spring Integration and Spring Batch
S2GX 2012 - Introduction to Spring Integration and Spring BatchS2GX 2012 - Introduction to Spring Integration and Spring Batch
S2GX 2012 - Introduction to Spring Integration and Spring BatchGunnar Hillert
 
Spring Projects Infrastructure
Spring Projects InfrastructureSpring Projects Infrastructure
Spring Projects InfrastructureGunnar Hillert
 
Cloud Foundry for Spring Developers
Cloud Foundry for Spring DevelopersCloud Foundry for Spring Developers
Cloud Foundry for Spring DevelopersGunnar Hillert
 

More from Gunnar Hillert (16)

High Precision GPS Positioning for Spring Developers
High Precision GPS Positioning for Spring DevelopersHigh Precision GPS Positioning for Spring Developers
High Precision GPS Positioning for Spring Developers
 
Migrating to Angular 5 for Spring Developers
Migrating to Angular 5 for Spring DevelopersMigrating to Angular 5 for Spring Developers
Migrating to Angular 5 for Spring Developers
 
The Spring Update
The Spring UpdateThe Spring Update
The Spring Update
 
Ajug - The Spring Update
Ajug - The Spring UpdateAjug - The Spring Update
Ajug - The Spring Update
 
s2gx2015 who needs batch
s2gx2015 who needs batchs2gx2015 who needs batch
s2gx2015 who needs batch
 
Spring Batch Performance Tuning
Spring Batch Performance TuningSpring Batch Performance Tuning
Spring Batch Performance Tuning
 
Creating Modular Test-Driven SPAs with Spring and AngularJS
Creating Modular Test-Driven SPAs with Spring and AngularJSCreating Modular Test-Driven SPAs with Spring and AngularJS
Creating Modular Test-Driven SPAs with Spring and AngularJS
 
Modular Test-driven SPAs with Spring and AngularJS
Modular Test-driven SPAs with Spring and AngularJSModular Test-driven SPAs with Spring and AngularJS
Modular Test-driven SPAs with Spring and AngularJS
 
Atlanta JUG - Integrating Spring Batch and Spring Integration
Atlanta JUG - Integrating Spring Batch and Spring IntegrationAtlanta JUG - Integrating Spring Batch and Spring Integration
Atlanta JUG - Integrating Spring Batch and Spring Integration
 
DevNexus 2013 - Introduction to WebSockets
DevNexus 2013 - Introduction to WebSocketsDevNexus 2013 - Introduction to WebSockets
DevNexus 2013 - Introduction to WebSockets
 
Introduction to WebSockets
Introduction to WebSocketsIntroduction to WebSockets
Introduction to WebSockets
 
S2GX 2012 - Spring Projects Infrastructure
S2GX 2012 - Spring Projects InfrastructureS2GX 2012 - Spring Projects Infrastructure
S2GX 2012 - Spring Projects Infrastructure
 
S2GX 2012 - What's New in Spring Integration
S2GX 2012 - What's New in Spring IntegrationS2GX 2012 - What's New in Spring Integration
S2GX 2012 - What's New in Spring Integration
 
S2GX 2012 - Introduction to Spring Integration and Spring Batch
S2GX 2012 - Introduction to Spring Integration and Spring BatchS2GX 2012 - Introduction to Spring Integration and Spring Batch
S2GX 2012 - Introduction to Spring Integration and Spring Batch
 
Spring Projects Infrastructure
Spring Projects InfrastructureSpring Projects Infrastructure
Spring Projects Infrastructure
 
Cloud Foundry for Spring Developers
Cloud Foundry for Spring DevelopersCloud Foundry for Spring Developers
Cloud Foundry for Spring Developers
 

Recently uploaded

Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilV3cube
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAndrey Devyatkin
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessPixlogix Infotech
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 

Recently uploaded (20)

Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 

jRecruiter - The AJUG Job Posting Service

  • 1. jRecruiter The AJUG Job Posting Service Gunnar Hillert 1
  • 2. About Myself 1998-2002 CS at Univ. of Applied Sciences (HTW) Berlin, Germany 2002 Thesis 2002-2005 Business Integration Consultant 2005-today Mostly web application development Struts 1, Spring MVC, Struts 2, GWT 2
  • 3. Sometimes I don’t code... but rather enjoy red clay and humidity 3
  • 4. About jRecruiter Google Code: http://code.google.com/p/jrecruiter/ CI: http://74.207.227.71:9080/hudson/job/jRecruiter/ Website: http://www.jrecruiter.org/ AJUG Job Posting Site: http://www.ajug.org/jrecruiter/ 4
  • 5. History 2005 jRecruiter 1.0 (Struts 1, Hibernate) 2006 jRecruiter 1.2 (Design changes, validation) 2009 jRecruiter 2.0 (Struts 2.1, Spring 3.0, JPA (Hibernate)) 5
  • 6. Changes Heavy Use of Annotations (Spring 2.5+) Google Maps Integration Hibernate Search RSS Better Security Flex Integration Example 6
  • 7. Maven 2 jRecruiter uses Maven 2 3 Modules jrecruiter-server jrecruiter-web jrecruiter-flex 7
  • 8. AppFuse If you develop Java web-applications, it’s a must-know! http://www.appfuse.org Developed by Matt Raible - www.raibledesigns.com jRecruiter is loosely based on AppFuse 8
  • 9. Spring 2.5/3.0 Use annotations to reduce XML clutter @Autowired - eliminate getters/setters <tx:annotation-driven/> <context:annotation-config /> <context:component-scan base-package="org.jrecruiter.dao.jpa" /> <context:component-scan base-package="org.jrecruiter.service.impl" /> 9
  • 10. Spring Tips If using @Autowired and no setters - How to unit-test? org.springframework.test.util.ReflectionTestUtils Allows for setting private instance variables EasyMock is awesome 10
  • 11. Table Pluralization I What about rails-like table pluralization? You could do: @Table(name="users") Better: Hibernate Naming Strategy org.hibernate.cfg.DefaultNamingStrategy org.hibernate.cfg.ImprovedNamingStrategy 11
  • 12. Table Pluralization II How to do pluralization? inflector project (http://inflector.dev.java.net) e.g. String cats = Noun.pluralOf(“cat”) jRecruiter: ImprovedPluralizedNamingStrategy 12
  • 13. Data Migration How to deal with external services referencing jobs? Primary key ids may change across data migrations Solution: UUID for Job postings How to map old urls to the new one? Solution: urlrewriter (http://tuckey.org/urlrewrite/) 13
  • 14. Lorem Ipsum Generate an arbitrary number of job postings Fill them with Dummy Data aka ‘place holder text’ http://en.wikipedia.org/wiki/Lorem_ipsum Library for Java: http://loremipsum.sourceforge.net/ 14
  • 15. Struts 2.1 Annotation-driven configuration Using Convention Plugin (Bundled with Struts 2.1) VERY similar to Spring MVC 3.0 Which one is better? 15
  • 16. I18N part I support for German (80% complete) support for Spanish is planned Advice: UTF-8 for everything! Java properties files are a bit ‘iffy’ 16
  • 17. I18N part II by default Java properties files are in ISO-8859-1 UTF-8 characters need to be escaped - ugly! Java 6 has better support: ResourceBundle.Control ResourceBundle bundle = ResourceBundle.getBundle("messages", new MyControl()); 17
  • 18. I18N part III Spring: ReloadableResourceBundleMessageSource <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource" > <property name="basenames" > <list> <value>classpath:messages</value> </list> </property> <property name="defaultEncoding" value="utf-8"/> <property name="cacheSeconds" value="0"/> </bean> Spring JSP message tag can use it Good plugin for eclipse: Eclipse ResourceBundle Editor http://sourceforge.net/projects/eclipse-rbe/ 18
  • 19. Security in jRecruiter SSL for all administrative pages Account verification at signup (Email) User Login: Email + Password Under the covers: Email OR Username + Password 19
  • 20. Jasypt http://www.jasypt.org/ http://www.jasypt.org/howtoencryptuserpasswords.html <bean id="stringDigester" class="org.jasypt.digest.StandardStringDigester" > <property name="algorithm" value="SHA-512" /> <property name="iterations" value="100000" /> <property name="saltSizeBytes" value="16" /> </bean> <bean id="passwordEncoder" class="org.jasypt.spring.security2.PasswordEncoder"> <property name="stringDigester"> <ref bean="stringDigester" /> </property> </bean> 20
  • 21. reCATPCHA http://recaptcha.net/ Ensure a human is filling out the form APIs for many languages Java, Ruby, Python, .Net… Recaptcha4j (http://code.google.com/p/recaptcha/) 21
  • 22. Google Maps jRecruiter uses: Maps Api (Version 2) Maps Api for Flash Static Maps API Be careful with SSL! http://code.google.com/p/gmaps-api-issues/issues/detail?id=591 22
  • 23. Google Maps for PDF Using Static Maps API Server makes call Image embedded using iText 23
  • 24. Twitter and bit.ly Twitter4J (http://yusuke.homeip.net/twitter4j/ java-twitter (http://code.google.com/p/java-twitter/) Jtwitter (http://www.winterwell.com/software/ jtwitter.php) jRecruiter uses Twitter4J: final Twitter twitter = new Twitter(“my_username”, “my password”); try { twitter.updateStatus(“tweet”); } catch (TwitterException e) { …} 24
  • 25. bit.ly similar to TinyUrl, just cooler there is a Java library available bitlyj http://code.google.com/p/bitlyj/ bitlyj works okay but needs some work final Bitly bitly = BitlyFactory.newInstance(“username”, “password”); try { final BitlyUrl bUrl = bitly.shorten(“http://www.google.com/”); return bUrl.getShortUrl(); } catch (final IOException e) { … } 25
  • 26. Managing API Keys Dealing with one API key is easy, but many? Google Maps, Twitter, bit.ly, reCAPTCHA ... Centrally stored in jrecruiter.properties org.jrecruiter.common.ApiKeysHolder Spring-injected 26
  • 27. RSS Feed Support Provide the latest 20 Job postings as Feed ROME https://rome.dev.java.net/ Struts2 integration with s2-rome http://code.google.com/p/s2-rome/ 27
  • 28. Web Services (Indeed.com) Used JDOM at first, yet memory intensive StAX - Streaming API for XML Stream XML data to client Advantage: Lower Memory Footprint Part of Java 6 28
  • 29. YSlow 80% of the end-user response time is spent on the front-end. Reduce HTTP requests, GZIP, Minify … http://developer.yahoo.com/yslow/ http://developer.yahoo.com/performance/rules.html 29
  • 31. Flex Spring BlazeDS Integration http://www.springsource.org/spring-flex http://coenraets.org (Christophe Coenraets) SWFObject 2 - Easier Flex Embedding http://code.google.com/p/swfobject/ 31
  • 33. ¿Questions? Feature requests/issues/feedback gunnar@hillert.com http://blog.hillert.com Slides available at: http://www.slideshare.net/hillert/jrecruiter-the-ajug-job-posting-service 33