We decided to change the name of our github organisation
- from "clojure-consulting" (ridiculous I know)
- to lazyposse (still ridiculous, but cooler).
256colors2.pl script: http://scie.nti.st/dist/256colors2.pl../256colors2.pl
emacs -nwM-x list-color-displayexport TERM=screen-256color
M-x list-color-displaymvn archetype:generate \ -DarchetypeGroupId=org.cometd.archetypes \ -DarchetypeArtifactId=cometd-archetype-jquery-jetty6 \ -DgroupId=cljinject \ -DartifactId=cljinjectCheck it's running correctly with:
cd cljinject
mvn jetty:run
You should have something on http://localhost:8080/cljinjectpom.xml:<version>1.0-SNAPSHOTversion> <repositories> <repository> <id>clojars.orgid> <url>http://clojars.org/repourl> repository> repositories> <build>
pom.xml:<dependency> <groupId>swank-clojuregroupId> <artifactId>swank-clojureartifactId> <version>1.4.2version> dependency> dependencies>
./src/main/java/cljinject/SwankServletContextListener.java:package cljinject; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import clojure.lang.Compiler; import java.io.StringReader; public class SwankServletContextListener implements ServletContextListener{ // keep a hand on the context so we can get it from within clojure public static ServletContext context; public void contextInitialized(ServletContextEvent contextEvent) { context = contextEvent.getServletContext(); final String startSwankScript = "(ns my-app\n" + " (:use [swank.swank :as swank]))\n" + "(swank/start-repl) "; // launch swank in a separate thread otherwise it will // block the webapp startup new Thread() { public void run() { try { Compiler.load(new StringReader(startSwankScript)); } catch (Exception e) { throw new RuntimeException(e); } } }.start(); } public void contextDestroyed(ServletContextEvent contextEvent) { } }
web.xml:<url-pattern>/cometd/*url-pattern> filter-mapping> <listener> <listener-class> cljinject.SwankServletContextListener listener-class> listener> web-app>
my-app=> Connection opened on null port 4005. nil
slime-rep.M-x slime-connectuser> (.println System/out "---- hello from clojure!!! -----") nil
---- hello from clojure!!! -----
SwankServletContextListener, so now we can access it from the REPL and mess around:user> cljinject.SwankServletContextListener/context #<SContext ServletContext@178820c{/cljinject,file:}>
package fr.hrgwt.client.command;
import net.customware.gwt.dispatch.shared.Action;
import net.customware.gwt.dispatch.shared.Result;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.Response;
public interface RequestBuilderActionHandler<A extends Action<R>, R extends Result> {
/**
* Prepare a RequestBuilder.
*/
RequestBuilder getRequestBuilder(A action);
/**
* Extract the result from the response.
*/
R extractResult(Response response);
Class<A> getActionType();
}
package fr.hrgwt.client.command.impl;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.Response;
import fr.hrgwt.client.command.RequestBuilderActionHandler;
public class FindAllCheckListXmlActionHandler
implements
RequestBuilderActionHandler<FindAllCheckListAction, FindAllCheckListActionResult> {
@Override
public Class<FindAllCheckListAction> getActionType() {
return FindAllCheckListAction.class;
}
@Override
public RequestBuilder getRequestBuilder(FindAllCheckListAction action) {
return new RequestBuilder(RequestBuilder.GET, "/myurl");
}
@Override
public FindAllCheckListActionResult extractResult(Response response) {
// TODO extract the xml from the response here
return null;
}
}
package fr.hrgwt.client.command;
import java.util.HashMap;
import java.util.Map;
import net.customware.gwt.dispatch.client.DispatchAsync;
import net.customware.gwt.dispatch.shared.Action;
import net.customware.gwt.dispatch.shared.Result;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.http.client.Response;
import com.google.gwt.user.client.rpc.AsyncCallback;
/**
* Implements DispatchAsync with a RequestBuilder.
*/
public class RequestBuilderDispatcher implements DispatchAsync {
@SuppressWarnings("unchecked")
Map<Class<Action>, RequestBuilderActionHandler> handlersMap = new HashMap<Class<Action>, RequestBuilderActionHandler>();
@SuppressWarnings("unchecked")
public <A extends Action<R>, R extends Result> void execute(A action,
final AsyncCallback<R> asyncCallback) {
Class<? extends Action> actionType = action.getClass();
final RequestBuilderActionHandler<A, R> handler = handlersMap
.get(actionType);
if (handler == null) {
throw new IllegalArgumentException("unregistered actionType:"
+ actionType);
}
RequestBuilder requestBuilder = handler.getRequestBuilder(action);
requestBuilder
.setCallback(createRequestCallback(asyncCallback, handler));
try {
requestBuilder.send();
}
catch (RequestException e) {
throw new RequestRuntimeException(e);
}
}
// visibility package for tests
<A extends Action<R>, R extends Result> RequestCallback createRequestCallback(
final AsyncCallback<R> asynchCallback,
final RequestBuilderActionHandler<A, R> handler) {
return new RequestCallback() {
@Override
public void onResponseReceived(Request request, Response response) {
asynchCallback.onSuccess(handler.extractResult(response));
}
@Override
public void onError(Request request, Throwable exception) {
throw new RuntimeException("not implemented yet");
}
};
}
@SuppressWarnings("unchecked")
public <A extends Action<R>, R extends Result> void addHandler(
RequestBuilderActionHandler<A, R> handler) {
handlersMap.put((Class<Action>) handler.getActionType(), handler);
}
}
RequestBuilderDispatcher dispatcher = new RequestBuilderDispatcher();
dispatcher.addHandler(new FindAllCheckListXmlActionHandler());
@Override
protected void onBind() {
dispatcher.execute(new FindAllCheckListAction(),
new AsyncCallback<FindAllCheckListActionResult>() {
@Override
public void onSuccess(FindAllCheckListActionResult result) {
display.setCheckLists(result.getCheckLists());
}
@Override
public void onFailure(Throwable caught) {
throw new RuntimeException("not implemented yet");
}
});