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

Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...AliaaTarek5
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate Agents
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate AgentsRyan Mahoney - Will Artificial Intelligence Replace Real Estate Agents
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate AgentsRyan Mahoney
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxBkGupta21
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????blackmambaettijean
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESmohitsingh558521
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demoHarshalMandlekar2
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 

Recently uploaded (20)

Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate Agents
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate AgentsRyan Mahoney - Will Artificial Intelligence Replace Real Estate Agents
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate Agents
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptx
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demo
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 

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