I realize i did not give any directions about how to use this class
but i was hoping the javadoc would speak for itself. Anyway the
getReplacementFor is a factory method for creating the panel that will
replace the current panel. Looking at your original class i think it
should do something like

protected MarkupContainer getReplacementFor(Component current, String id,
                        Class replacementClass)
{
return getPanelFactory().newPanel(id, replacementClass,current.getModel());
//not sure where getPanelFactory is accessible from, but you get the drift.
}

This will cause a onetime replacement of the panel, any next click
will just replace the panel again with a new instance of the same
class.
If you do not want any further clicks on the link you could do a
setVisible(false); to hide the link.
Or if you want the link to alternate between these two panels (or any
number really) you could do this
protected MarkupContainer getReplacementFor(Component current, String id,
                        Class replacementClass)
{
setReplacementClass(current.getClass());
return getPanelFactory().newPanel(id, replacementClass,current.getModel());
}

Note that in this last example you need to grant permission for all
the panelclasses you want to alternate between or the link will
disappear.

Also the link does not care about permissions for the currently
showing panel, the panel itself should do that, but only about the
panel you are going to replace it with.

I hope this clarifies things enough.

Keep me posted.

Maurice


On 9/12/07, Anthony Schexnaildre <[EMAIL PROTECTED]> wrote:
> Sitting down with the SecureContainerLink now. I may be slow but I am
> a little confused by it's intended use. I am not sure what the
> implementation of getReplacementFor(.....) is meant to look like.
>
> -Anthony
>
> On Sep 11, 2007, at 11:24 PM, Maurice Marrink wrote:
>
> > Ok, i just finished a SecureContainerLink that should do what your
> > SecurePanelLink does, but it is a bit less complex. I haven't checked
> > it in yet or tested it for that matter but hope to hear from you if
> > this is what you meant. If so i will make it a part of wasp.
> >
> > Maurice
> >
> > /*
> >  * Licensed to the Apache Software Foundation (ASF) under one or more
> >  * contributor license agreements.  See the NOTICE file distributed
> > with
> >  * this work for additional information regarding copyright ownership.
> >  * The ASF licenses this file to You under the Apache License,
> > Version 2.0
> >  * (the "License"); you may not use this file except in compliance
> > with
> >  * the License.  You may obtain a copy of the License at
> >  *
> >  *      http://www.apache.org/licenses/LICENSE-2.0
> >  *
> >  * Unless required by applicable law or agreed to in writing, software
> >  * distributed under the License is distributed on an "AS IS" BASIS,
> >  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> > implied.
> >  * See the License for the specific language governing permissions and
> >  * limitations under the License.
> >  */
> > package org.apache.wicket.security.components.markup.html.links;
> >
> > import org.apache.wicket.Component;
> > import org.apache.wicket.MarkupContainer;
> > import org.apache.wicket.WicketRuntimeException;
> > import org.apache.wicket.markup.html.link.Link;
> > import org.apache.wicket.model.IModel;
> > import org.apache.wicket.security.actions.AbstractWaspAction;
> > import org.apache.wicket.security.checks.ISecurityCheck;
> > import org.apache.wicket.security.checks.LinkSecurityCheck;
> > import org.apache.wicket.security.components.ISecureComponent;
> > import org.apache.wicket.security.components.SecureComponentHelper;
> >
> > /**
> >  * A secure link to handle panel replacements or any other type of
> >  * [EMAIL PROTECTED] MarkupContainer}s. It is also usable as a link to 
> > switch
> > between 2 or
> >  * more panels. Security is enforced on the replacing class.
> >  *
> >  * @author marrink
> >  */
> > public abstract class SecureContainerLink extends Link implements
> > ISecureComponent
> > {
> >       /**
> >        *
> >        */
> >       private static final long serialVersionUID = 1L;
> >
> >       private Class replacementClass;
> >       private MarkupContainer containerParent;
> >       private String containerId;
> >
> >       /**
> >        * Constructs a new replacement link.
> >        *
> >        * @param id
> >        *            id of the link
> >        * @param replacementPanel
> >        *            the class of the container replacing the component
> > on the
> >        *            supplied parent
> >        * @param parentOfReplaceablePanel
> >        *            the parent component where the replacement needs to
> > take place
> >        * @param panelId
> >        *            the id of the component to be replaced
> >        */
> >       public SecureContainerLink(String id, Class replacementPanel,
> >                       MarkupContainer parentOfReplaceablePanel, String 
> > panelId)
> >       {
> >               this(id, null, replacementPanel, parentOfReplaceablePanel, 
> > panelId);
> >
> >       }
> >
> >       /**
> >        * Constructs a new replacement link.
> >        *
> >        * @param id
> >        *            id of the link
> >        * @param object
> >        *            model of the link
> >        * @param replacementPanel
> >        *            the class of the container replacing the component
> > on the
> >        *            supplied parent
> >        * @param parentOfReplaceablePanel
> >        *            the parent component where the replacement needs to
> > take place
> >        * @param panelId
> >        *            the id of the component to be replaced
> >        */
> >       public SecureContainerLink(String id, IModel object, Class
> > replacementPanel,
> >                       MarkupContainer parentOfReplaceablePanel, String 
> > panelId)
> >       {
> >               super(id, object);
> >               setReplacementClass(replacementPanel);
> >               if (parentOfReplaceablePanel == null)
> >                       throw new WicketRuntimeException("Parent required for 
> > replacing
> > components.");
> >               containerParent = parentOfReplaceablePanel;
> >               if (panelId == null)
> >                       throw new WicketRuntimeException("Id required from 
> > component to be
> > replaced.");
> >               containerId = panelId;
> >       }
> >
> >       /**
> >        * Performs the replacement, only if an actual replacement was
> > constructed.
> >        *
> >        * @see org.apache.wicket.markup.html.link.Link#onClick()
> >        * @see #getReplacementFor(Component, String, Class)
> >        * @throws WicketRuntimeException
> >        *             if a problem occurs in replacing the container.
> >        */
> >       public final void onClick()
> >       {
> >               Component replaceMe = containerParent.get(containerId);
> >               if (replaceMe == null)
> >                       throw new WicketRuntimeException("unable to find 
> > child with id: " +
> > containerId
> >                                       + " on parent: " + containerParent);
> >               Class myReplacementClass = getReplacementClass();
> >               MarkupContainer replacement = getReplacementFor(replaceMe,
> > containerId, myReplacementClass);
> >               if (replacement == null)
> >                       return; // do nothing
> >               if (!containerId.equals(replacement.getId()))
> >                       throw new WicketRuntimeException("The replacement 
> > does not have the
> > specified id: "
> >                                       + containerId + ", but id: " + 
> > replacement.getId());
> >               if 
> > (myReplacementClass.isAssignableFrom(replacement.getClass()))
> >                       containerParent.replace(replacement);
> >               else
> >                       throw new WicketRuntimeException("The replacement for 
> > " +
> > containerId + " on "
> >                                       + containerParent + " is not 
> > assignable from " +
> > myReplacementClass);
> >
> >       }
> >
> >       /**
> >        * Creates a replacement for a component. although the component
> > to be
> >        * replaced does not need to be a [EMAIL PROTECTED] MarkupContainer} 
> > it
> > typically is.
> >        * The replacement however does need to be a MarkupContainer, more
> >        * specifically a (sub)class of replacementClass. Implementation
> > may choose
> >        * at this point to do the next replacement with a different class
> > by using
> >        * [EMAIL PROTECTED] #setReplacementClass(Class)} in order to create 
> > a switch
> > like
> >        * behavior.
> >        *
> >        * @param current
> >        *            the component to be replaced
> >        * @param id
> >        *            the id of the new container
> >        * @param replacementClass
> >        *            the class of the replacement
> >        * @return a new replacement or null if the original component is
> > not to be
> >        *         replaced
> >        * @see #setReplacementClass(Class)
> >        */
> >       protected abstract MarkupContainer getReplacementFor(Component
> > current, String id,
> >                       Class replacementClass);
> >
> >       /**
> >        * Generates the securitycheck for this link. by default this is a
> >        * [EMAIL PROTECTED] LinkSecurityCheck} but implementations may 
> > choose to
> > override
> >        * this. Note that the returned LinkSecurityCheck should not be
> > placed in
> >        * alternative rendering mode as this will completely change the
> > intended
> >        * behavior.
> >        *
> >        * @return the securitycheck for this link or null if no security
> > is to be
> >        *         enforced
> >        */
> >       protected ISecurityCheck generateSecurityCheck()
> >       {
> >               return new LinkSecurityCheck(this, getReplacementClass());
> >       }
> >
> >       /**
> >        * @see
> > org.apache.wicket.security.components.ISecureComponent#getSecurityChec
> > k()
> >        */
> >       public ISecurityCheck getSecurityCheck()
> >       {
> >               return SecureComponentHelper.getSecurityCheck(this);
> >       }
> >
> >       /**
> >        * @see
> > org.apache.wicket.security.components.ISecureComponent#isActionAuthori
> > zed(java.lang.String)
> >        */
> >       public boolean isActionAuthorized(String waspAction)
> >       {
> >               return SecureComponentHelper.isActionAuthorized(this, 
> > waspAction);
> >       }
> >
> >       /**
> >        * @see
> > org.apache.wicket.security.components.ISecureComponent#isActionAuthori
> > zed(org.apache.wicket.security.actions.AbstractWaspAction)
> >        */
> >       public boolean isActionAuthorized(AbstractWaspAction action)
> >       {
> >               return SecureComponentHelper.isActionAuthorized(this, action);
> >       }
> >
> >       /**
> >        * @see
> > org.apache.wicket.security.components.ISecureComponent#isAuthenticated
> > ()
> >        */
> >       public boolean isAuthenticated()
> >       {
> >               return SecureComponentHelper.isAuthenticated(this);
> >       }
> >
> >       /**
> >        * @see
> > org.apache.wicket.security.components.ISecureComponent#setSecurityChec
> > k(org.apache.wicket.security.checks.ISecurityCheck)
> >        */
> >       public void setSecurityCheck(ISecurityCheck check)
> >       {
> >               SecureComponentHelper.setSecurityCheck(this, check);
> >       }
> >
> >       /**
> >        * Gets replacementClass.
> >        *
> >        * @return replacementClass
> >        */
> >       protected final Class getReplacementClass()
> >       {
> >               return replacementClass;
> >       }
> >
> >       /**
> >        * Sets replacementClass. Note by changing the replacement class a
> > new
> >        * securitycheck is automatically created.
> >        *
> >        * @param replacementClass
> >        *            replacementClass
> >        * @see #generateSecurityCheck()
> >        * @throws WicketRuntimeException
> >        *             if the class is null or not a [EMAIL PROTECTED] 
> > MarkupContainer}
> >        */
> >       protected final void setReplacementClass(Class replacementClass)
> >       {
> >               if (replacementClass == null ||
> > !MarkupContainer.class.isAssignableFrom(replacementClass))
> >                       throw new WicketRuntimeException("This link requires 
> > a " +
> > MarkupContainer.class
> >                                       + ", not a " + replacementClass);
> >               this.replacementClass = replacementClass;
> >               setSecurityCheck(generateSecurityCheck());
> >       }
> > }
> >
> >
> > On 9/11/07, Martijn Dashorst <[EMAIL PROTECTED]> wrote:
> >> Create your custom request cycle, and add a getter that uses the
> >> session's username/id to retrieve the user from the database, and
> >> cache it locally.
> >>
> >> Martijn
> >>
> >> On 9/11/07, Anthony Schexnaildre <[EMAIL PROTECTED]> wrote:
> >>> This makes sense. Where would you stick the user on the
> >>> requestcycle?
> >>> It's not obvious from the javadocs. Is there a "wicket way"?
> >>>
> >>> -Anthony
> >>>
> >>> On Sep 11, 2007, at 10:05 AM, Maurice Marrink wrote:
> >>>
> >>>> Martijn, you are absolutely right, i forgot we moved the user
> >>>> from the
> >>>> session to the requestcycle. Just keep the id for your user in the
> >>>> session and keep the actual user for this request in the
> >>>> requestcycle.
> >>>> This way each thread will have its own instance of the user.
> >>>>
> >>>> Maurice
> >>>>
> >>>> On 9/11/07, Martijn Dashorst <[EMAIL PROTECTED]> wrote:
> >>>>> Just a quick note: storing objects that are not thread safe in
> >>>>> your
> >>>>> session is asking for trouble. While Wicket does limit page
> >>>>> processing
> >>>>> to one request at a time, other requests like resources can run in
> >>>>> parallel. What does this mean?
> >>>>>
> >>>>> One thing that comes to mind is that when two requests for the
> >>>>> same
> >>>>> session are being processed, and one is done before the other
> >>>>> it will
> >>>>> detach the user model. What are the semantics now for the other
> >>>>> thread?
> >>>>>
> >>>>> For instance if you have a detachable model storing a User
> >>>>> object in
> >>>>> your session and use Hibernate you are in a world of hurt, or
> >>>>> rather
> >>>>> Hibernate will sometimes bork because your Session tries to attach
> >>>>> the
> >>>>> single User instance to multiple Hibernate Session objects.
> >>>>> Exceptions
> >>>>> will be having a party.
> >>>>>
> >>>>> Now this is not meant as a Hibernate bashing reply, it just
> >>>>> happens
> >>>>> that Hibernate correctly detects multiple threads modifying the
> >>>>> same
> >>>>> object's state and stops tampering with it.
> >>>>>
> >>>>> Martijn
> >>>>>
> >>>>> --
> >>>>> Buy Wicket in Action: http://manning.com/dashorst
> >>>>> Apache Wicket 1.3.0-beta3 is released
> >>>>> Get it now: http://www.apache.org/dyn/closer.cgi/wicket/1.3.0-
> >>>>> beta3/
> >>>>>
> >>>>> ------------------------------------------------------------------
> >>>>> ---
> >>>>> 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]
> >>>>
> >>>
> >>>
> >>> --------------------------------------------------------------------
> >>> -
> >>> To unsubscribe, e-mail: [EMAIL PROTECTED]
> >>> For additional commands, e-mail: [EMAIL PROTECTED]
> >>>
> >>>
> >>
> >>
> >> --
> >> Buy Wicket in Action: http://manning.com/dashorst
> >> Apache Wicket 1.3.0-beta3 is released
> >> Get it now: http://www.apache.org/dyn/closer.cgi/wicket/1.3.0-beta3/
> >>
> >> ---------------------------------------------------------------------
> >> 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]
> >
>
>
> ---------------------------------------------------------------------
> 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]

Reply via email to