package at.it_fabrik.goods.wicket; import java.lang.ref.WeakReference; import org.apache.wicket.IRequestTarget; import org.apache.wicket.Page; import org.apache.wicket.PageParameters; import org.apache.wicket.protocol.http.request.WebRequestCodingStrategy; import org.apache.wicket.request.RequestParameters; import org.apache.wicket.request.target.coding.AbstractRequestTargetUrlCodingStrategy; import org.apache.wicket.request.target.component.BookmarkableListenerInterfaceRequestTarget; import org.apache.wicket.request.target.component.BookmarkablePageRequestTarget; import org.apache.wicket.request.target.component.IBookmarkablePageRequestTarget; import org.apache.wicket.util.string.AppendingStringBuffer; import at.it_fabrik.common.RequestService; public class MyGoodsPageRequestTargetUrlCodingStrategy extends AbstractRequestTargetUrlCodingStrategy { protected final WeakReference> bookmarkablePageClassRef; public MyGoodsPageRequestTargetUrlCodingStrategy(final String mountPath, final Class bookmarkablePageClass) { super(mountPath); bookmarkablePageClassRef = new WeakReference>(bookmarkablePageClass); } @Override public IRequestTarget decode(RequestParameters requestParameters) { final String parametersFragment = requestParameters.getPath().substring(getMountPath().length()); String[] pathSplit = parametersFragment.split("\\/"); final PageParameters parameters = new PageParameters("id=" + pathSplit[pathSplit.length - 1]); // do some extra work for checking whether this is a normal request to a // bookmarkable page, or a request to a stateless page (in which case a // wicket:interface parameter should be available // the page map name can be defined already by logic done in // WebRequestCodingStrategy.decode(), // but it could also be done by the decodeParameters() call // So we always remove the pagemap parameter just in case. String pageMapNameEncoded = (String) parameters.remove(WebRequestCodingStrategy.PAGEMAP); if (requestParameters.getPageMapName() == null) { requestParameters.setPageMapName(pageMapNameEncoded); } // the interface can be defined already by logic done in // WebRequestCodingStrategy.decode(), // but it could also be done by the decodeParameters() call // So we always remove the interface parameter just in case. String interfaceParameter = (String) parameters.remove(WebRequestCodingStrategy.INTERFACE_PARAMETER_NAME); if (requestParameters.getInterfaceName() == null) { WebRequestCodingStrategy.addInterfaceParameters(interfaceParameter, requestParameters); } // if an interface name was set prior to this method or in the // above block, process it if (requestParameters.getInterfaceName() != null) { return new BookmarkableListenerInterfaceRequestTarget(requestParameters.getPageMapName(), bookmarkablePageClassRef.get(), parameters, requestParameters.getComponentPath(), requestParameters.getInterfaceName(), requestParameters .getVersionNumber()); } // otherwise process as a normal bookmark page request else { return new BookmarkablePageRequestTarget(requestParameters.getPageMapName(), (Class) bookmarkablePageClassRef .get(), parameters); } } /** * @see org.apache.wicket.request.target.coding.IRequestTargetUrlCodingStrategy#encode(org.apache.wicket.IRequestTarget) */ @Override public final CharSequence encode(final IRequestTarget requestTarget) { if (!(requestTarget instanceof IBookmarkablePageRequestTarget)) { throw new IllegalArgumentException("This encoder can only be used with " + "instances of " + IBookmarkablePageRequestTarget.class.getName()); } final AppendingStringBuffer url = new AppendingStringBuffer(40); final IBookmarkablePageRequestTarget target = (IBookmarkablePageRequestTarget) requestTarget; PageParameters pageParameters = target.getPageParameters(); String idValue = pageParameters.getString("id"); String nameValue = pageParameters.getString("name"); String pagemap = target.getPageMapName(); if (pagemap != null) { if (pageParameters == null) { pageParameters = new PageParameters(); } pageParameters.put(WebRequestCodingStrategy.PAGEMAP, WebRequestCodingStrategy.encodePageMapName(pagemap)); } url.append(getMountPath()); if (nameValue != null) { url.append("/"); url.append(RequestService.seoEncode(nameValue)); } url.append("/"); if (idValue == null) { url.append("0"); } else { url.append(idValue); } url.append("/"); return url; } /** * @see org.apache.wicket.request.target.coding.IRequestTargetUrlCodingStrategy#matches(org.apache.wicket.IRequestTarget) */ @Override public boolean matches(IRequestTarget requestTarget) { if (requestTarget instanceof IBookmarkablePageRequestTarget) { IBookmarkablePageRequestTarget target = (IBookmarkablePageRequestTarget) requestTarget; if (((Class) bookmarkablePageClassRef.get()).equals(target.getPageClass())) { return true; } } return false; } }