Created
May 12, 2013 07:25
-
-
Save dmitrygusev/5562739 to your computer and use it in GitHub Desktop.
Eager load Tapestry5 services on startup
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public void contributeApplicationInitializer(OrderedConfiguration<ApplicationInitializerFilter> configuration, | |
@Symbol(TapestryEagerLoadInitializer.FORCE_EAGER_LOAD) boolean forceEagerLoad) | |
{ | |
if (forceEagerLoad) | |
{ | |
configuration.addInstance("EagerLoad", TapestryEagerLoadInitializer.class, "before:*"); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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