01: /***************************************************************
02: * This file is part of the [fleXive](R) project.
03: *
04: * Copyright (c) 1999-2007
05: * UCS - unique computing solutions gmbh (http://www.ucs.at)
06: * All rights reserved
07: *
08: * The [fleXive](R) project is free software; you can redistribute
09: * it and/or modify it under the terms of the GNU General Public
10: * License as published by the Free Software Foundation;
11: * either version 2 of the License, or (at your option) any
12: * later version.
13: *
14: * The GNU General Public License can be found at
15: * http://www.gnu.org/copyleft/gpl.html.
16: * A copy is found in the textfile GPL.txt and important notices to the
17: * license from the author are found in LICENSE.txt distributed with
18: * these libraries.
19: *
20: * This library is distributed in the hope that it will be useful,
21: * but WITHOUT ANY WARRANTY; without even the implied warranty of
22: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23: * GNU General Public License for more details.
24: *
25: * For further information about UCS - unique computing solutions gmbh,
26: * please see the company website: http://www.ucs.at
27: *
28: * For further information about [fleXive](R), please see the
29: * project website: http://www.flexive.org
30: *
31: *
32: * This copyright notice MUST APPEAR in all copies of the file!
33: ***************************************************************/package com.flexive.faces;
34:
35: import com.sun.facelets.FaceletViewHandler;
36:
37: import javax.faces.application.ViewHandler;
38: import javax.faces.component.UIViewRoot;
39: import javax.faces.context.FacesContext;
40: import javax.servlet.http.HttpServletRequest;
41:
42: /**
43: * An extension to the facelet view handler that provides custom URIs using
44: * {@link URIRoute URIRoutes}. You must provide a concrete implementation with
45: * a public constructor that takes a single ViewHandler argument and passes
46: * the URIRouteCollection to be used to this viewhandler.
47: *
48: * @author Daniel Lichtenberger (daniel.lichtenberger@flexive.com), UCS - unique computing solutions gmbh (http://www.ucs.at)
49: * @version $Rev: 1 $
50: */
51: public class CustomURIViewHandler extends FaceletViewHandler {
52: protected final URIRouteCollection<ContentURIRoute> routes;
53:
54: protected CustomURIViewHandler(ViewHandler parent,
55: URIRouteCollection<ContentURIRoute> routes) {
56: super (parent);
57: this .routes = routes;
58: }
59:
60: @Override
61: protected String getRenderedViewId(FacesContext context,
62: String actionId) {
63: final URIMatcher uriMatcher = routes.getMatcher(actionId);
64: return uriMatcher != null ? uriMatcher.apply(context) : super
65: .getRenderedViewId(context, actionId);
66: }
67:
68: @Override
69: public UIViewRoot restoreView(FacesContext context, String viewId) {
70: final URIMatcher uriMatcher = routes.getMatcher(viewId);
71: if (uriMatcher != null) {
72: // apply route before entering the JSF lifecycle (set request attributes, etc.)
73: uriMatcher.apply(context);
74: }
75: return super .restoreView(context, viewId);
76: }
77:
78: @Override
79: public String getActionURL(FacesContext facesContext, String viewId) {
80: final Object oRequest = facesContext.getExternalContext()
81: .getRequest();
82: if (oRequest instanceof HttpServletRequest) {
83: final HttpServletRequest request = (HttpServletRequest) oRequest;
84: final String origUri = (String) request
85: .getAttribute(ContentURIMatcher.REQUEST_ORIG_URI);
86: final String mappedUri = (String) request
87: .getAttribute(ContentURIMatcher.REQUEST_MAPPED_URI);
88: if (origUri != null && mappedUri.equals(viewId)) {
89: // use original url for postbacks
90: return origUri;
91: }
92: }
93: return super.getActionURL(facesContext, viewId);
94: }
95:
96: }
|