Could you try to move all non-page classes/interfaces out of the pages package (same applies to components). So move Private.java to some package other than in components, mixins, base, pages
Martijn On Wed, 2008-07-30 at 10:41 +0100, [EMAIL PROTECTED] wrote: > I too have been trying to implement what is on the wiki. > > This is really doing my head in (not helped by the fact the wiki > solution http://wiki.apache.org/tapestry/Tapestry5HowToControlAccess > does not have all the "bits" of code necessary for a newbie like > myself to get it working. For instance, it's missing the package > imports and is also missing a necessary try-catch block at the end of > checkAccess()). > > I've had no success after a day or more working on it - even with the > updated code recently provided. It just does not work and seems either > to be a mistake on my part in how Annotations work (they are new to > me, I admit, having not used them before), or a serious problem with > the way the code works (the ClassLoaders? It seems the standard > classloader is loading Private while the tapestry pages are via its > own classloader - I don't know how getAnnotation() works, so I'm > wildly guessing and probably wrong) > > Below is the code I have. I'd appreciate a pointer on what I've done wrong. > > The output is as follows: > > [DEBUG] AppModule.TimingFilter Invoking method > uk.bl.dlportal.services.AppModule.buildTimingFilter(Logger) (at > AppModule.java:97). > 1 > PAGE CLASS = class uk.bl.dlportal.pages.Administration > PAGE ANNO = null > PAGE ANNOS = @uk.bl.dlportal.pages.util.Private() > [INFO] AppModule.TimingFilter Request time: 4784 ms > [INFO] AppModule.TimingFilter Request time: 0 ms > > > ----------------- AccessController.java -- > > package uk.bl.dlportal.pages.util; > > import java.io.IOException; > > import org.apache.tapestry5.runtime.Component; > import org.apache.tapestry5.services.ApplicationStateManager; > import org.apache.tapestry5.services.ComponentClassResolver; > import org.apache.tapestry5.services.ComponentSource; > import org.apache.tapestry5.services.Dispatcher; > import org.apache.tapestry5.services.Request; > import org.apache.tapestry5.services.Response; > > import uk.bl.dlportal.entities.User; > > public class AccessController implements Dispatcher > { > private final static String LOGIN_PAGE = "/index"; > > private ApplicationStateManager asm; > private final ComponentClassResolver resolver; > private final ComponentSource componentSource; > > > /** > * Receive all the services needed as constructor arguments. When we > bind > * this service, T5 IoC will provide all the services ! > */ > public AccessController(ApplicationStateManager asm, > ComponentClassResolver resolver, ComponentSource > componentSource) > { > this.asm = asm; > this.resolver = resolver; > this.componentSource = componentSource; > } > > > public boolean dispatch(Request request, Response response) > throws IOException > { > System.out.println("1"); > /* > * We need to get the Tapestry page requested by the user. So > we parse > * the path extracted from the request > */ > String path = request.getPath(); > if (path.equals("")) > return false; > > int nextslashx = path.length(); > String pageName; > > while (true) > { > pageName = path.substring(1, nextslashx); > if (!pageName.endsWith("/") && > resolver.isPageName(pageName)) > break; > nextslashx = path.lastIndexOf('/', nextslashx - 1); > if (nextslashx <= 1) > return false; > } > return checkAccess(pageName, request, response); > } > > > /** > * Check the rights of the user for the page requested > */ > public boolean checkAccess(String pageName, Request request, > Response response) > { > > boolean canAccess = true; > > /* Is the requested page private ? */ > Component page = componentSource.getPage(pageName); > > System.out.println("PAGE CLASS = "+page.getClass()); > System.out.println("PAGE ANNO = > "+page.getClass().getAnnotation(Private.class)); > System.out.println("PAGE ANNOS = > "+page.getClass().getAnnotations()[0]); > > boolean privatePage = > page.getClass().getAnnotation(Private.class) != null; > > if (privatePage) > { > canAccess = false; > /* Is the user already authenticated ? */ > if (asm.exists(User.class)) > { > User userSession = asm.get(User.class); > canAccess = userSession != null; > } > > /* > if (asm.exists(UserSessionImpl.class)) > { > UserSessionImpl userSession = > asm.get(UserSessionImpl.class); > canAccess = userSession.isUserLoggedIn(); > } > */ > } > > > if (!canAccess) > { > try > { > response.sendRedirect(request.getContextPath() > + LOGIN_PAGE); > } catch (IOException e) > { > // TODO Auto-generated catch block > e.printStackTrace(); > } > return true; // Make sure to leave the chain > } > return false; > } > > } > > > -------------------- AppModule.java -- > > ... > public static void bind(ServiceBinder binder) > { > // binder.bind(MyServiceInterface.class, MyServiceImpl.class); > > // Make bind() calls on the binder object to define most IoC > services. > // Use service builder methods (example below) when the > implementation > // is provided inline, or requires more initialization than > simply > // invoking the constructor. > > binder.bind(AccessController.class).withId("AccessController"); > > } > > > public void contributeMasterDispatcher( > OrderedConfiguration<Dispatcher> configuration, > @InjectService("AccessController") Dispatcher > accessController) > { > configuration.add("AccessController", accessController, > "before:PageRender"); > } > ... > > > ---------------- Private.java -- > > package uk.bl.dlportal.pages.util; > > import java.lang.annotation.Documented; > import java.lang.annotation.ElementType; > import java.lang.annotation.Retention; > import java.lang.annotation.RetentionPolicy; > import java.lang.annotation.Target; > > @Target(ElementType.TYPE) > @Retention(RetentionPolicy.RUNTIME) > @Documented > public @interface Private > { > } > > > ------------------ Administration.java -- (the page I'm testing this on) > > package uk.bl.dlportal.pages; > > import org.apache.tapestry5.annotations.ApplicationState; > > import uk.bl.dlportal.entities.User; > import uk.bl.dlportal.pages.util.Private; > > /** > * Admin page of application dlportal. > */ > @Private > public class Administration > { > .... > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]