Skip to content

Instantly share code, notes, and snippets.

@dmitrygusev
Created May 12, 2013 07:25
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dmitrygusev/5562739 to your computer and use it in GitHub Desktop.
Save dmitrygusev/5562739 to your computer and use it in GitHub Desktop.
Eager load Tapestry5 services on startup
public void contributeApplicationInitializer(OrderedConfiguration<ApplicationInitializerFilter> configuration,
@Symbol(TapestryEagerLoadInitializer.FORCE_EAGER_LOAD) boolean forceEagerLoad)
{
if (forceEagerLoad)
{
configuration.addInstance("EagerLoad", TapestryEagerLoadInitializer.class, "before:*");
}
}
package com.anjlab.tapestry5.services;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import javax.servlet.ServletContext;
import org.apache.tapestry5.TapestryFilter;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.ioc.def.ServiceDef2;
import org.apache.tapestry5.ioc.internal.RegistryImpl;
import org.apache.tapestry5.ioc.internal.RegistryWrapper;
import org.apache.tapestry5.ioc.internal.ServiceDefImpl;
import org.apache.tapestry5.services.ApplicationGlobals;
import org.apache.tapestry5.services.ApplicationInitializer;
import org.apache.tapestry5.services.ApplicationInitializerFilter;
import org.apache.tapestry5.services.Context;
import org.apache.tapestry5.services.Request;
import org.apache.tapestry5.services.RequestGlobals;
import org.apache.tapestry5.services.Session;
public class TapestryEagerLoadInitializer implements ApplicationInitializerFilter
{
public static final String FORCE_EAGER_LOAD = "tapestry.force-eager-load";
@Inject private ApplicationGlobals applicationGlobals;
@Override
public void initializeApplication(Context context, ApplicationInitializer initializer)
{
RegistryWrapper wrapper = (RegistryWrapper) context.getAttribute(TapestryFilter.REGISTRY_CONTEXT_NAME);
try
{
RegistryImpl registryImpl = getFieldValue(wrapper, "registry");
RequestGlobals requestGlobals = registryImpl.getService(RequestGlobals.class);
requestGlobals.storeRequestResponse(new RequestForEagerLoad(applicationGlobals.getServletContext()), null);
Set<ServiceDef2> allServiceDefs = getFieldValue(registryImpl, "allServiceDefs");
for (ServiceDef2 serviceDef2 : allServiceDefs)
{
if (serviceDef2 instanceof ServiceDefImpl)
{
setFieldValue(serviceDef2, "eagerLoad", true);
}
}
initializer.initializeApplication(context);
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
protected void setFieldValue(Object object, String fieldName, Object value)
throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException
{
Field field = object.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
field.set(object, value);
field.setAccessible(false);
}
@SuppressWarnings("unchecked")
protected <T> T getFieldValue(Object object, String fieldName)
throws NoSuchFieldException, IllegalAccessException
{
Field field = object.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
Object value = field.get(object);
field.setAccessible(false);
return (T) value;
}
public static class RequestForEagerLoad implements Request
{
private final ServletContext context;
public RequestForEagerLoad(ServletContext context)
{
this.context = context;
}
@Override
public void setAttribute(String name, Object value)
{
throw new UnsupportedOperationException();
}
@Override
public boolean isXHR()
{
throw new UnsupportedOperationException();
}
@Override
public boolean isSecure()
{
throw new UnsupportedOperationException();
}
@Override
public boolean isRequestedSessionIdValid()
{
throw new UnsupportedOperationException();
}
@Override
public Session getSession(boolean create)
{
throw new UnsupportedOperationException();
}
@Override
public int getServerPort()
{
throw new UnsupportedOperationException();
}
@Override
public String getServerName()
{
throw new UnsupportedOperationException();
}
@Override
public String getRemoteHost()
{
throw new UnsupportedOperationException();
}
@Override
public String getPath()
{
throw new UnsupportedOperationException();
}
@Override
public String[] getParameters(String name)
{
throw new UnsupportedOperationException();
}
@Override
public List<String> getParameterNames()
{
throw new UnsupportedOperationException();
}
@Override
public String getParameter(String name)
{
throw new UnsupportedOperationException();
}
@Override
public String getMethod()
{
throw new UnsupportedOperationException();
}
@Override
public Locale getLocale()
{
throw new UnsupportedOperationException();
}
@Override
public int getLocalPort()
{
throw new UnsupportedOperationException();
}
@Override
public List<String> getHeaderNames()
{
throw new UnsupportedOperationException();
}
@Override
public String getHeader(String name)
{
throw new UnsupportedOperationException();
}
@Override
public long getDateHeader(String name)
{
throw new UnsupportedOperationException();
}
@Override
public String getContextPath()
{
return context.getContextPath();
}
@Override
public Object getAttribute(String name)
{
throw new UnsupportedOperationException();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment