/* * Copyright 1999,2004 The Apache Software Foundation. * * Licensed 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 net.java.strux.application.support; import java.io.Serializable; import java.util.Map; import javax.faces.FacesException; import javax.faces.application.ViewHandler; import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; import net.java.strux.Jsf; /** * @author Jacob Hookom */ public class ActionMapping implements Serializable { public static final String ACTION_MAPPING_KEY = ActionMapping.class.getName(); public static final String DEFAULT_MAPPING = ".jsf"; public static final int TYPE_UNKNOWN = -1; public static final int TYPE_SUFFIX = 1; public static final int TYPE_PREFIX = 0; protected int type = TYPE_SUFFIX; protected String mapping = DEFAULT_MAPPING; protected String defaultSuffix = null; public ActionMapping() { // do nothing } public static ActionMapping getCurrentInstance(FacesContext context, int scope) throws FacesException { Map scopeMap = Jsf.getScope(context, scope); ActionMapping actionMapping = (ActionMapping) scopeMap.get(ACTION_MAPPING_KEY); if (actionMapping == null) { actionMapping = new ActionMapping(); scopeMap.put(ACTION_MAPPING_KEY, actionMapping); } return actionMapping; } public String getDefaultSuffix(FacesContext context) throws FacesException { if (this.defaultSuffix == null) { ExternalContext extCtx = context.getExternalContext(); String viewSuffix = extCtx.getInitParameter(ViewHandler.DEFAULT_SUFFIX_PARAM_NAME); this.defaultSuffix = (viewSuffix != null) ? viewSuffix : ViewHandler.DEFAULT_SUFFIX; } return this.defaultSuffix; } /** * @param context * @param viewId * @return * @throws FacesException */ public String convertToActionId(FacesContext context, String viewId) throws FacesException { String actionId = null; if (TYPE_PREFIX == this.type) { if (viewId.startsWith(this.mapping)) { actionId = viewId; } else { actionId = this.mapping + viewId; } } else if (TYPE_SUFFIX == this.type) { actionId = viewId.replaceFirst(this.getDefaultSuffix(context), this.mapping); } else { throw new FacesException(Jsf.msg("view.error.actionId",viewId)); } return actionId; } /** * Looks at the current context and updates its state while converting the actionId * to a viewId. Previous state is ignored when this is called since we can't determine the * mapping for the life of the request. * * @param context * @param actionId * @return * @throws FacesException */ public String convertToViewId(FacesContext context, String actionId) throws FacesException { ExternalContext extCtx = context.getExternalContext(); String viewId = extCtx.getRequestPathInfo(); if (extCtx.getRequestPathInfo() == null) { // we know it's a suffix mapping String facesSuffix = actionId.substring(actionId.lastIndexOf('.')); String viewSuffix = this.getDefaultSuffix(context); viewId = actionId.replaceFirst(facesSuffix, viewSuffix); synchronized (this) { this.type = TYPE_SUFFIX; this.mapping = facesSuffix; } } else { // else it's a prefix mapping synchronized (this) { this.type = TYPE_PREFIX; this.mapping = extCtx.getRequestServletPath(); } } return viewId; } public String getMapping() { return this.mapping; } public synchronized void setMapping(String mapping) { this.mapping = mapping; } public int getType() { return this.type; } public synchronized void setType(int type) { this.type = type; } }