Skip to content

Commit

Permalink
Add littleapp example of embedding Trinidad
Browse files Browse the repository at this point in the history
  • Loading branch information
nicksieger committed Mar 21, 2011
1 parent 5f5d64f commit 4350104
Show file tree
Hide file tree
Showing 8 changed files with 226 additions and 0 deletions.
5 changes: 5 additions & 0 deletions .gitignore
@@ -1 +1,6 @@
pkg
/littleapp/littleapp.jar
/rails-3.0.1/rails-3.0.1.jar
/ringpiano/ringpiano.jar
/ringpiano/warbler-1.3.0.beta1.jar
/littleapp/app/tmp/restart.txt
5 changes: 5 additions & 0 deletions README.md
Expand Up @@ -49,3 +49,8 @@ actually work on the Rails app...
This is just a simple Ruby script demonstrating the `Warbler::Jar` API
for creating archives from Ruby. Run with `jruby jar.rb` after
installing Warbler.

### Littleapp

This is another Warbler jar example that creates a simple rack
application and serves it with Trinidad as an executable ruby jar.
3 changes: 3 additions & 0 deletions littleapp/Gemfile
@@ -0,0 +1,3 @@
source "http://rubygems.org"
gem "rack"
gem "trinidad"
16 changes: 16 additions & 0 deletions littleapp/Gemfile.lock
@@ -0,0 +1,16 @@
GEM
remote: http://rubygems.org/
specs:
jruby-rack (1.0.7)
rack (1.2.2)
trinidad (1.1.0)
jruby-rack (>= 1.0.6)
trinidad_jars (>= 1.0.0)
trinidad_jars (1.0.1)

PLATFORMS
java

DEPENDENCIES
rack
trinidad
1 change: 1 addition & 0 deletions littleapp/app/config.ru
@@ -0,0 +1 @@
run lambda {|env| [200, {"Content-Type" => "text/plain"}, ["Hello World!"]] }
46 changes: 46 additions & 0 deletions littleapp/bin/littleapp
@@ -0,0 +1,46 @@
#!/usr/bin/env ruby

require 'rubygems'
require 'bundler/setup'
require 'littleapp'

if __FILE__ =~ /(.*\.jar)\!/
require 'jruby'
require 'fileutils'
# strip off file: and !/.* parts of jar paths
jar_file_name = __FILE__.sub(/file:([^!]+)!.*/, '\1')
# Warbler already extracts JRuby jars to a temp dir, if we extract
# our files there, they'll be cleaned up for us
extract_root = File.dirname(JRuby.runtime.instance_config.jruby_home.sub(/file:([^!]+)!.*/, '\1'))

puts "Extracting app from #{jar_file_name} to #{extract_root}/app"
appdir = File.join(extract_root, "app")
FileUtils.mkdir_p(appdir)

jar_file = java.util.jar.JarFile.new(jar_file_name)
jar_file.entries.each do |entry|
if entry.name =~ /^littleapp\/app/
entry_name = entry.name.sub('littleapp/app', '')
if entry.directory?
FileUtils.mkdir_p File.join(appdir, entry_name)
else
begin
entryio = jar_file.get_input_stream(entry).to_io
entry_path = File.join(appdir, entry_name)
FileUtils.mkdir_p File.dirname(entry_path)
File.open(entry_path, "w") {|f| f << entryio.read }
ensure
entryio.close rescue nil
end
end
end
end

else
appdir = File.expand_path('../../app', __FILE__)
end

ARGV.clear
# Put additional trinidad options here
ARGV.unshift *['--dir', appdir, '--rackup' ]
load Gem.bin_path('trinidad', 'trinidad')
146 changes: 146 additions & 0 deletions littleapp/config/warble.rb
@@ -0,0 +1,146 @@
# Disable Rake-environment-task framework detection by uncommenting/setting to false
# Warbler.framework_detection = false

class Warbler::Traits::Rack
# Override Rack autodetect
def self.detect?
false
end
end

# Warbler web application assembly configuration file
Warbler::Config.new do |config|
# Features: additional options controlling how the jar is built.
# Currently the following features are supported:
# - gemjar: package the gem repository in a jar file in WEB-INF/lib
# - executable: embed a web server and make the war executable
# - compiled: compile .rb files to .class files
# config.features = %w(gemjar)

# Application directories to be included in the webapp.
config.dirs = %w(bin app lib)

# Additional files/directories to include, above those in config.dirs
# config.includes = FileList["db"]

# Additional files/directories to exclude
config.excludes = FileList["app/{log,tmp,work}"]

# Additional Java .jar files to include. Note that if .jar files are placed
# in lib (and not otherwise excluded) then they need not be mentioned here.
# JRuby and JRuby-Rack are pre-loaded in this list. Be sure to include your
# own versions if you directly set the value
# config.java_libs += FileList["lib/java/*.jar"]

# Loose Java classes and miscellaneous files to be included.
# config.java_classes = FileList["target/classes/**.*"]

# One or more pathmaps defining how the java classes should be copied into
# the archive. The example pathmap below accompanies the java_classes
# configuration above. See http://rake.rubyforge.org/classes/String.html#M000017
# for details of how to specify a pathmap.
# config.pathmaps.java_classes << "%{target/classes/,}p"

# Bundler support is built-in. If Warbler finds a Gemfile in the
# project directory, it will be used to collect the gems to bundle
# in your application. If you wish to explicitly disable this
# functionality, uncomment here.
# config.bundler = false

# An array of Bundler groups to avoid including in the war file.
# Defaults to ["development", "test"].
# config.bundle_without = []

# Other gems to be included. If you don't use Bundler or a gemspec
# file, you need to tell Warbler which gems your application needs
# so that they can be packaged in the archive.
# For Rails applications, the Rails gems are included by default
# unless the vendor/rails directory is present.
# config.gems += ["activerecord-jdbcmysql-adapter", "jruby-openssl"]
# config.gems << "tzinfo"

# Uncomment this if you don't want to package rails gem.
# config.gems -= ["rails"]

# The most recent versions of gems are used.
# You can specify versions of gems by using a hash assignment:
# config.gems["rails"] = "2.3.10"

# You can also use regexps or Gem::Dependency objects for flexibility or
# finer-grained control.
# config.gems << /^merb-/
# config.gems << Gem::Dependency.new("merb-core", "= 0.9.3")

# Include gem dependencies not mentioned specifically. Default is
# true, uncomment to turn off.
# config.gem_dependencies = false

# Array of regular expressions matching relative paths in gems to be
# excluded from the war. Defaults to empty, but you can set it like
# below, which excludes test files.
# config.gem_excludes = [/^(test|spec)\//]

# Pathmaps for controlling how application files are copied into the archive
# config.pathmaps.application = ["WEB-INF/%p"]

# Name of the archive (without the extension). Defaults to the basename
# of the project directory.
# config.jar_name = "mywar"

# Name of the MANIFEST.MF template for the war file. Defaults to a simple
# MANIFEST.MF that contains the version of Warbler used to create the war file.
# config.manifest_file = "config/MANIFEST.MF"

# When using the 'compiled' feature and specified, only these Ruby
# files will be compiled. Default is to compile all \.rb files in
# the application.
# config.compiled_ruby_files = FileList['app/**/*.rb']

# === War files only below here ===

# Path to the pre-bundled gem directory inside the war file. Default
# is 'WEB-INF/gems'. Specify path if gems are already bundled
# before running Warbler. This also sets 'gem.path' inside web.xml.
# config.gem_path = "WEB-INF/vendor/bundler_gems"

# Files for WEB-INF directory (next to web.xml). This contains
# web.xml by default. If there is an .erb-File it will be processed
# with webxml-config. You may want to exclude this file via
# config.excludes.
# config.webinf_files += FileList["jboss-web.xml"]

# Files to be included in the root of the webapp. Note that files in public
# will have the leading 'public/' part of the path stripped during staging.
# config.public_html = FileList["public/**/*", "doc/**/*"]

# Pathmaps for controlling how public HTML files are copied into the .war
# config.pathmaps.public_html = ["%{public/,}p"]

# Value of RAILS_ENV for the webapp -- default as shown below
# config.webxml.rails.env = ENV['RAILS_ENV'] || 'production'

# Application booter to use, one of :rack, :rails, or :merb (autodetected by default)
# config.webxml.booter = :rails

# When using the :rack booter, "Rackup" script to use.
# - For 'rackup.path', the value points to the location of the rackup
# script in the web archive file. You need to make sure this file
# gets included in the war, possibly by adding it to config.includes
# or config.webinf_files above.
# - For 'rackup', the rackup script you provide as an inline string
# is simply embedded in web.xml.
# The script is evaluated in a Rack::Builder to load the application.
# Examples:
# config.webxml.rackup.path = 'WEB-INF/hello.ru'
# config.webxml.rackup = %{require './lib/demo'; run Rack::Adapter::Camping.new(Demo)}
# config.webxml.rackup = require 'cgi' && CGI::escapeHTML(File.read("config.ru"))

# Control the pool of Rails runtimes. Leaving unspecified means
# the pool will grow as needed to service requests. It is recommended
# that you fix these values when running a production server!
# config.webxml.jruby.min.runtimes = 2
# config.webxml.jruby.max.runtimes = 4

# JNDI data source name
# config.webxml.jndi = 'jdbc/rails'
end
4 changes: 4 additions & 0 deletions littleapp/lib/littleapp.rb
@@ -0,0 +1,4 @@
module Littleapp
VERSION = "1.0"
puts "This is Littleapp version #{VERSION}"
end

0 comments on commit 4350104

Please sign in to comment.