From java to rails

71
From Java...to Rails Nick Sieger @nicksieger

description

 

Transcript of From java to rails

Page 1: From java to rails

From Java...to Rails

Nick Sieger@nicksieger

Page 2: From java to rails

?Are you happy with

your development pace

Page 3: From java to rails

How do you get to a place where it’s better?

?

Page 4: From java to rails
Page 5: From java to rails

Introduce Language

Page 6: From java to rails

Replace JSF with *Anything*

Page 7: From java to rails

throw away

Page 8: From java to rails

Built environmentlong-running projectswith legacy codebases

Page 9: From java to rails

Sagrada Família, Barcelona, Spain

Page 10: From java to rails

nativityfacade

passionfacade

scaffolded interior

Page 11: From java to rails

Ryugyong Hotel,North Korea2004 2011

Page 12: From java to rails

seismic retrofit

Page 13: From java to rails

Szkieletor,Kraków, Poland

Page 14: From java to rails

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

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

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

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

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

Biological evolutionnew replaces old over time

Page 20: From java to rails

Strangler Fig

Page 21: From java to rails
Page 22: From java to rails
Page 23: From java to rails

github.com/nicksieger/refactoring-to-rails

Page 24: From java to rails

Before we begin...

Page 25: From java to rails

Test PlanDon’t leave home without it

Page 26: From java to rails

gembundler.com

Page 27: From java to rails

Bundler

source :rubygems

group :test do gem 'rspec-rails' gem 'cucumber-rails' gem 'capybara'end

Page 28: From java to rails
Page 29: From java to rails

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
Page 31: From java to rails
Page 32: From java to rails

Foot in the doorSneaking Ruby in

Page 33: From java to rails

JRuby-Rackorg.jruby.rack:jruby-rack

Page 34: From java to rails

App

/* /rack/*

Java RubyServlet

Page 35: From java to rails

<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

# 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

# app.rbget '/rack/' do '<h1>Sinatra</h1>'end

Page 38: From java to rails

RESTNot just APIs...

Page 39: From java to rails

URIs + HREFsArchitecture of the Web

Page 40: From java to rails

<a href="/vets.xml">View as XML</a>

Page 41: From java to rails

<a href="/rack/vets.xml">View as XML</a>

Page 42: From java to rails

<jruby-rack:rails path="/rack/vets" params="layout=none"/>

In JSPs

Page 43: From java to rails

Red Green RefactorContinuous improvement

Page 44: From java to rails
Page 45: From java to rails

Interceptor patternPartial strangulation

Page 46: From java to rails

App

/vets /owners/ /owners/1/pets

Filter

Java/Spring

Page 47: From java to rails

App

/vets /owners/ /owners/1/pets

Filter

/vets/

Java/Spring

Ruby

Page 48: From java to rails

SpringPetclinic::Application.routes.draw do

root :to => "welcome#index"

resources :vets

end

Page 49: From java to rails

Request Rails response

Java response

/ 200 OK (N/A)

/owners404 Not Found

200 OK

Page 50: From java to rails

Re-use viewsJSP-in-ERB

Page 51: From java to rails

<%= request.render '/WEB-INF/jsp/header.jsp' %>

<%= yield %>

<%= request.render '/WEB-INF/jsp/footer.jsp' %>

Page 52: From java to rails

Re-use modelsHibernate + ActiveModel

Page 53: From java to rails

# app/models/owner.rbjava_import org.springframework.samples.petclinic.Owner

Page 54: From java to rails

# 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

# 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

<%# 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

<%# 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

Rails takes overFinal strangulation

Page 59: From java to rails

$ rails new petclinic --skip-active-record

Page 60: From java to rails

$ mvn org.jruby.plugins:jruby-rake-plugin:classpath

Page 61: From java to rails

# 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

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

INSTALL

Warblergem install warbler

Page 64: From java to rails

# 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

$ warble executable warCreating refactoring-to-rails.war$ java -jar refactoring-to-rails.war

Page 66: From java to rails

Hollow out the tree

Page 67: From java to rails

JRuby T-Shirts!Stop by booth #5605

Page 68: From java to rails

Party Tue 6:30pm http://ey.io/oeuot1

Page 69: From java to rails

➡ 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
Page 71: From java to rails

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