Skip to content

Instantly share code, notes, and snippets.

View jroper's full-sized avatar

James Roper jroper

View GitHub Profile
@jroper
jroper / EbeanShutdownHack.java
Created November 8, 2012 01:28
Ebean shutdown hack, for shutting down an individual ebeanserver before the Ebean shutdown hook runs
package com.avaje.ebeaninternal.server.lib;
import java.lang.reflect.Field;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Exists to work around this issue:
*
@jroper
jroper / TestController.scala
Created November 15, 2012 06:56
Compile errors with Json reads/writes
package controllers
import play.api.mvc.{Cookie, Action, Controller}
import play.api.libs.json._
import org.apache.commons.codec.binary.Base64
import play.api.libs.json.JsString
import play.api.data.validation.ValidationError
/**
* Used for testing stuff.
@jroper
jroper / Ec2Client.scala
Created February 26, 2013 19:44
Barebones Ec2 client that uses the Play Framework WS API for provisioning instances. Handles authentication signing etc. If you want to use it, you probably want to read the docs: http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-RunInstances.html and update it to do what you need it to do.
package utils
import scala.xml.Elem
import scala.concurrent.Future
import java.util.{TimeZone, Date}
import java.text.SimpleDateFormat
import java.net.URLEncoder
import javax.crypto.spec.SecretKeySpec
import javax.crypto.Mac
import org.apache.commons.codec.binary.Base64
@jroper
jroper / HttpPipeliningChannel.java
Last active December 15, 2015 06:59
Demonstration of HTTP pipelining support in Netty.
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.channel.*;
import org.jboss.netty.handler.codec.http.*;
import java.net.SocketAddress;
import java.util.LinkedList;
import java.util.concurrent.Callable;
public class HttpPipeliningHandler implements ChannelUpstreamHandler, ChannelDownstreamHandler {
@jroper
jroper / Global.scala
Last active December 20, 2015 19:38
Transparent HEAD request handling in Play 2.1. Note that it may be more efficient to implement HEAD support in an action directly, as this may avoid unnecessary opening of resources or rendering things.
import play.api.libs.iteratee.{Done, Iteratee, Enumerator}
import play.api.mvc._
import play.api._
import play.api.libs.concurrent.Execution.Implicits._
object Global extends GlobalSettings {
override def onRouteRequest(req: RequestHeader) = {
// Lookup handler
super.onRouteRequest(req) match {
@jroper
jroper / With Grzegorz's improvements
Last active December 21, 2015 22:19
Scala incremental compiler improvements by Grzegorz Kossakowski. Actual runtimes are not so important here, since the two benchmarks were run on different machines, and also they make no attempt to ensure that the scala compiler is fully JITed, which during normal Play development offers significant improvements over these times as the compiler …
Initial clean compile of entire project:
[info] [info] Compiling 29 Scala sources and 1 Java source to /tmp/inc-compile/target/scala-2.10/classes...
[info] [success] Total time: 15 s, completed Aug 28, 2013 9:43:38 PM
Now simulate adding a method to a controller:
[info] [info] Compiling 1 Scala source to /tmp/inc-compile/target/scala-2.10/classes...
[info] [success] Total time: 2 s, completed Aug 28, 2013 9:43:40 PM
Now simulate adding a new route to the routes file:
[info] [info] Compiling 2 Scala sources and 1 Java source to /tmp/inc-compile/target/scala-2.10/classes...
@jroper
jroper / gist:7019306
Created October 17, 2013 04:44
Reads for recursive search paths
// Reads for recursive path
def recursiveSearchReads[T : Reads](path: JsPath) = Reads[Seq[T]] { json =>
path.apply(json).map(_.validate[T]).foldLeft[JsResult[Seq[T]]](JsSuccess(Nil)) {
case (JsError(a), JsError(b)) => JsError(a ++ b)
case (err: JsError, _) => err
case (_, err: JsError) => err
case (JsSuccess(ts, _), JsSuccess(t, _)) => JsSuccess(ts :+ t)
}.repath(path)
}
@jroper
jroper / Html5PushStatePlaceManager.java
Created May 7, 2012 12:32
GWTP HTML5 pushState place manager implementation
package com.gwtplatform.mvp.client.proxy;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.user.client.Window;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.google.web.bindery.event.shared.EventBus;
@Singleton
public class Html5PushStatePlaceManager extends PlaceManagerImpl {
// TEST 1:
// Without scrolling down, can you work out whether bar() is the return value, or a side effecting
// method call?
def test1(): Boolean = {
if (foo) {
bar()
} else {
/*
It is a truth universally acknowledged, that a single man in possession
of a good fortune, must be in want of a wife.
@jroper
jroper / Attempts.scala
Created June 9, 2015 14:16
Reader monads
import scalaz.Reader
case class User(id: Int, name: String)
case class Interest(name: String)
trait Database
trait Attempt1 {
// How every explanation of Reader monad I've seen/read goes: