Download - From java to rails
![Page 1: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/1.jpg)
From Java...to Rails
Nick Sieger@nicksieger
![Page 2: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/2.jpg)
?Are you happy with
your development pace
![Page 3: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/3.jpg)
How do you get to a place where it’s better?
?
![Page 4: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/4.jpg)
![Page 5: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/5.jpg)
Introduce Language
![Page 6: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/6.jpg)
Replace JSF with *Anything*
![Page 7: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/7.jpg)
throw away
![Page 8: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/8.jpg)
Built environmentlong-running projectswith legacy codebases
![Page 9: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/9.jpg)
Sagrada Família, Barcelona, Spain
![Page 10: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/10.jpg)
nativityfacade
passionfacade
scaffolded interior
![Page 11: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/11.jpg)
Ryugyong Hotel,North Korea2004 2011
![Page 12: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/12.jpg)
seismic retrofit
![Page 13: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/13.jpg)
Szkieletor,Kraków, Poland
![Page 14: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/14.jpg)
Metaphor Use Ruby, JRuby, and Rails to...
Sagrada Familia
• Build new facade faster• Scaffolding during refactoring
Ryugyong Hotel
• Revive a project with a new face
Seismic retrofit
• Reinforce business rules with a DSL• Harden security
Szkieletor • Find novel uses for abandoned code
![Page 15: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/15.jpg)
Metaphor Use Ruby, JRuby, and Rails to...
Sagrada Familia
• Build new facade faster• Scaffolding during refactoring
Ryugyong Hotel
• Revive a project with a new face
Seismic retrofit
• Reinforce business rules with a DSL• Harden security
Szkieletor • Find novel uses for abandoned code
![Page 16: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/16.jpg)
Metaphor Use Ruby, JRuby, and Rails to...
Sagrada Familia
• Build new facade faster• Scaffolding during refactoring
Ryugyong Hotel
• Revive a project with a new face
Seismic retrofit
• Reinforce business rules with a DSL• Harden security
Szkieletor • Find novel uses for abandoned code
![Page 17: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/17.jpg)
Metaphor Use Ruby, JRuby, and Rails to...
Sagrada Familia
• Build new facade faster• Scaffolding during refactoring
Ryugyong Hotel
• Revive a project with a new face
Seismic retrofit
• Reinforce business rules with a DSL• Harden security
Szkieletor • Find novel uses for abandoned code
![Page 18: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/18.jpg)
Metaphor Use Ruby, JRuby, and Rails to...
Sagrada Familia
• Build new facade faster• Scaffolding during refactoring
Ryugyong Hotel
• Revive a project with a new face
Seismic retrofit
• Reinforce business rules with a DSL• Harden security
Szkieletor • Find novel uses for abandoned code
![Page 19: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/19.jpg)
Biological evolutionnew replaces old over time
![Page 20: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/20.jpg)
Strangler Fig
![Page 21: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/21.jpg)
![Page 22: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/22.jpg)
![Page 23: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/23.jpg)
github.com/nicksieger/refactoring-to-rails
![Page 24: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/24.jpg)
Before we begin...
![Page 25: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/25.jpg)
Test PlanDon’t leave home without it
![Page 26: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/26.jpg)
gembundler.com
![Page 27: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/27.jpg)
Bundler
source :rubygems
group :test do gem 'rspec-rails' gem 'cucumber-rails' gem 'capybara'end
![Page 28: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/28.jpg)
![Page 29: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/29.jpg)
Feature: Owners
Scenario: Add New Owner Given I am on the new owner page When I fill in the following: | First name | Dan | | Last name | Wood | | Address | 123 Main St | | City | Anywhere | | Telephone | 5555555 | And I press "Add Owner" Then I should see "Owner Information" within "h2" And I should see "Dan Wood"
![Page 30: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/30.jpg)
![Page 31: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/31.jpg)
![Page 32: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/32.jpg)
Foot in the doorSneaking Ruby in
![Page 33: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/33.jpg)
JRuby-Rackorg.jruby.rack:jruby-rack
![Page 34: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/34.jpg)
App
/* /rack/*
Java RubyServlet
![Page 35: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/35.jpg)
<listener> <listener-class> org.jruby.rack.RackServletContextListener </listener-class></listener>
<servlet> <servlet-name>rack</servlet-name> <servlet-class>org.jruby.rack.RackServlet</servlet-class></servlet>
<servlet-mapping> <servlet-name>rack</servlet-name> <url-pattern>/rack/*</url-pattern></servlet-mapping>
![Page 36: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/36.jpg)
# WEB-INF/config.rurequire 'sinatra'
if development? require 'sinatra/reloader' use Rack::ShowExceptionsend
require 'app'
set :run, falserun Sinatra::Application
![Page 37: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/37.jpg)
# app.rbget '/rack/' do '<h1>Sinatra</h1>'end
![Page 38: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/38.jpg)
RESTNot just APIs...
![Page 39: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/39.jpg)
URIs + HREFsArchitecture of the Web
![Page 40: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/40.jpg)
<a href="/vets.xml">View as XML</a>
![Page 41: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/41.jpg)
<a href="/rack/vets.xml">View as XML</a>
![Page 42: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/42.jpg)
<jruby-rack:rails path="/rack/vets" params="layout=none"/>
In JSPs
![Page 43: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/43.jpg)
Red Green RefactorContinuous improvement
![Page 44: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/44.jpg)
![Page 45: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/45.jpg)
Interceptor patternPartial strangulation
![Page 46: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/46.jpg)
App
/vets /owners/ /owners/1/pets
Filter
Java/Spring
![Page 47: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/47.jpg)
App
/vets /owners/ /owners/1/pets
Filter
/vets/
Java/Spring
Ruby
![Page 48: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/48.jpg)
SpringPetclinic::Application.routes.draw do
root :to => "welcome#index"
resources :vets
end
![Page 49: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/49.jpg)
Request Rails response
Java response
/ 200 OK (N/A)
/owners404 Not Found
200 OK
![Page 50: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/50.jpg)
Re-use viewsJSP-in-ERB
![Page 51: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/51.jpg)
<%= request.render '/WEB-INF/jsp/header.jsp' %>
<%= yield %>
<%= request.render '/WEB-INF/jsp/footer.jsp' %>
![Page 52: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/52.jpg)
Re-use modelsHibernate + ActiveModel
![Page 53: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/53.jpg)
# app/models/owner.rbjava_import org.springframework.samples.petclinic.Owner
![Page 54: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/54.jpg)
# app/models/owner.rbjava_import org.springframework.samples.petclinic.Owner
class Owner extend ActiveModel::Naming include ActiveModel::Validations include ActiveModel::Conversion
end
![Page 55: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/55.jpg)
# app/models/owner.rbjava_import org.springframework.samples.petclinic.Owner
class Owner extend ActiveModel::Naming include ActiveModel::Validations include ActiveModel::Conversion
end
validates_presence_of :first_name, :last_name, :address, :city, :telephone validates_format_of :telephone, :with => /[-0-9.+ ]+/, :message => "..."
![Page 56: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/56.jpg)
<%# app/views/owner/_form.html.erb %><%= form_for @owner do |f| %>
<%= f.label :first_name %> <br/> <%= f.text_field :first_name %>
<%= f.label :last_name %> <br/> <%= f.text_field :last_name %>
<%# ... %><% end -%>
![Page 57: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/57.jpg)
<%# app/views/owner/_form.html.erb %><%= form_for @owner do |f| %>
<%= f.label :first_name %> <br/> <%= f.text_field :first_name %>
<%= f.label :last_name %> <br/> <%= f.text_field :last_name %>
<%# ... %><% end -%>
@owner
![Page 58: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/58.jpg)
Rails takes overFinal strangulation
![Page 59: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/59.jpg)
$ rails new petclinic --skip-active-record
![Page 60: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/60.jpg)
$ mvn org.jruby.plugins:jruby-rake-plugin:classpath
![Page 61: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/61.jpg)
# config/initializers/classpath.rbmodule Maven extend self
CLASSPATH = [ "#{BASEDIR}/target/classes", "#{ENV['HOME']}/.m2/.../org.springframework.core-3.0.0.RELEASE.jar", # lots of jars here... ]
def set_classpath require 'java' CLASSPATH.each {|p| $CLASSPATH << p } endend
![Page 62: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/62.jpg)
Maven.set_classpath
module Spring SPRING_XML_CONFIG_FILES = [ 'classpath:applicationContext.xml' ].to_java :string # creates a String[]
CONTEXT = ClassPathXmlApplicationContext.new( SPRING_XML_CONFIG_FILES)end
![Page 63: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/63.jpg)
INSTALL
Warblergem install warbler
![Page 64: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/64.jpg)
# config/warble.rbWarbler::Config.new do |config|
require 'config/initializers/classpath' config.java_libs += Maven.jar_files
config.java_classes = FileList["target/classes/**/*"]
end
![Page 65: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/65.jpg)
$ warble executable warCreating refactoring-to-rails.war$ java -jar refactoring-to-rails.war
![Page 66: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/66.jpg)
Hollow out the tree
![Page 67: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/67.jpg)
JRuby T-Shirts!Stop by booth #5605
![Page 69: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/69.jpg)
➡ Script BowlNic WilliamsWed 8:30 AM–Hilton Grand Ballroom B
➡ Accelerate Your Business and Aim for the Cloud with Java and JRuby
Jacob Lehrbaum, Mike PiechWed 3:00 PM–Parc 55 Embarcadero
➡ Real World JRubyCharles Nutter, Thomas EneboWed 4:30 PM–Parc 55 Market Street
![Page 70: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/70.jpg)
![Page 71: From java to rails](https://reader033.vdocuments.us/reader033/viewer/2022042606/5457964cb1af9fb66e8b536f/html5/thumbnails/71.jpg)
http://www.flickr.com/photos/john_mcclumpha/4138419594/http://www.flickr.com/photos/phil_shirley/4500893932/http://www.flickr.com/photos/y_i/2330044065/http://www.flickr.com/photos/herzogbr/462383777/http://en.wikipedia.org/wiki/File:Sagrada_Familia_01.jpghttp://www.flickr.com/photos/koocheekoo/38407225/http://www.flickr.com/photos/27649557@N07/5000528445/http://www.flickr.com/photos/gpaumier/446059442/http://www.flickr.com/photos/ilm/12831049/http://upload.wikimedia.org/wikipedia/commons/9/95/Ryugyong_hotel_01.jpghttp://upload.wikimedia.org/wikipedia/commons/7/78/Ryugyeong_Hotel_on_February_2011.jpghttp://en.wikipedia.org/wiki/File:ExteiorShearTruss.jpghttp://en.wikipedia.org/wiki/File:ExtReenfDetail.jpghttp://en.wikipedia.org/wiki/File:Szkieleteor_in_krakow.JPGhttp://www.flickr.com/photos/epingchris/5110376533/http://www.flickr.com/photos/bazylek/3194294047/http://www.flickr.com/photos/58847482@N03/5920653295/http://www.flickr.com/photos/nancybaym/3828905896/http://www.flickr.com/photos/anitagould/5501316782/
Images