blob: 699b0137a445dc32f5ccafd8e73ee021eef9a1f4 [file] [log] [blame]
package org.eclipse.jst.jsf.designtime.internal.view;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
/**
* <p>Defines the basic interface for all design time view handlers that
* parallel custom runtime view handlers (extenders of ViewHandler).</p>
*
* @author cbateman
*
*/
public interface IDTViewHandler
{
/**
* <p>Creates and returns the view root. This method <i>may</i> optionally
* intialize the view root with any data that need only be done
* once per instance. Generally, this will include providing the root
* access to itself or its IViewDefnAdapterFactory so that it can refresh
* itself. </p>
* <p>If the call does not initialize the viewId on the viewRoot to a
* non-null value, the framework will set it to viewId
* (normally the implementer should always setViewId on the new
* root to viewId).</p>
*
* @param facesContext
* @param viewId
* @return a designtime view root instance of viewId under
* the given faces context
* @throws ViewHandlerException
*/
DTUIViewRoot createView(DTFacesContext facesContext, String viewId) throws ViewHandlerException;
// TODO: I think this is better done by the view root itself.
/**
* Populate the view root with the component tree for the view definition
* associated with context. The returned value *must* have the same viewId
* as viewRoot, but the implementer can return a different instance of
* IDTUIViewRoot so long as the assertion:
*
* viewRoot.getViewId().equals(populateView(facesContext, viewRoot).getViewId())
*
* holds true. For a given view, this method may be called many times
* on the same view root to synchronizes changes in the associated view
* definition (i.e. a JSP).
*
* @param context
* @param viewRoot
* @param viewId
* @return the populated view root. Normally this will be the same
* as viewRoot but the implementer need not guarantee this.
* @throws ViewHandlerException
*/
// IDTUIViewRoot populateView(DTFacesContext context, IDTUIViewRoot viewRoot)throws ViewHandlerException;
/**
* Calculate the locale for the current view context. The return string must
* conform to the standard format proscribed by java.util.Locale.
*
* @param context
* @return the locale string for the view definition referred to by context
* @throws ViewHandlerException
*/
String calculateLocale(DTFacesContext context) throws ViewHandlerException;
/**
* Given that resource is the view definition source and requestPath is the
* current servlet uri for a request relative to the web content root, map
* it to the actual request uri that would be required at runtime to invoke
* the view definition in resource. DTFacesContext will contain an external
* context that may be used to derive servlet mapping configuration.
*
* @param context
* @param resource
* @param requestPath
* @return the IPath representing the newly mapped request path
* @throws ViewHandlerException
*/
IPath getActionURL(DTFacesContext context, IResource resource, IPath requestPath) throws ViewHandlerException;
/**
* TODO: if we already have context, must we already know what the source is?
*
* The IResource need not exist.
*
* @param context
* @param viewId
* @return the resource containing the view definition for viewId.
* @throws ViewHandlerException
*/
IResource getActionDefinition(DTFacesContext context, String viewId) throws ViewHandlerException;
/**
* Given that a request is made for uri from within the view named by
* relativeToViewId at runtime, return the path to the resource containing
* that view definition. The path need not point to a resource that
* currently exists.
*
* @param context
* @param relativeToViewId
* @param uri
* @return the path to the resource named by uri relative to the view
* named by relativeToViewId
* @throws ViewHandlerException
*/
IPath getRelativeActionPath(DTFacesContext context, String relativeToViewId, String uri) throws ViewHandlerException;
/**
* Translate a workspace resource to the view id it will have at runtime.
*
* @param context
* @param res
* @return the view id for res or null if there is no meaningful value
*/
String getViewId(DTFacesContext context, IResource res);
/**
* @param context
* @return a view definition adapter
* @throws ViewHandlerException
*/
IViewDefnAdapterFactory getViewMetadataAdapterFactory(DTFacesContext context) throws ViewHandlerException;
/**
* @param file
* @return true if the contents of the file is of a format that this
* view handler supports. Generally, this is decided by a combination
* of content type and, in the case of XML formats, schema.
*/
boolean supportsViewDefinition(final IFile file);
/**
* General exception class for problems that a custom view handler
* wants to propagate to the framework in a well-defined way.
*
*/
public static final class ViewHandlerException extends Exception
{
private final Cause _causeCode;
/**
* Enumerates the known failure causes
*
*/
public enum Cause
{
/**
* thrown from getELExpression when the context passed does
* not refer to a parsable EL expression in the view definition
*/
EL_NOT_FOUND,
/**
* thrown from getELExpression when an exception occurs during
* EL parsing. The ViewHandlerException should wrap the causing
* exception in this cause
*/
EL_EXCEPTION_CAUGHT_WHILE_PARSING,
/**
* an undefined exception cause indicating something not foreseen
* by the framework.
*/
UNDEFINED
}
/**
*
*/
private static final long serialVersionUID = 2109525340402345111L;
/**
* Construct an exception with an undefined cause
*/
public ViewHandlerException() {
this(Cause.UNDEFINED);
}
/**
* @param cause
*/
public ViewHandlerException(final Cause cause) {
super();
_causeCode = cause;
}
/**
* @param message
* @param caught
* @param cause
*/
public ViewHandlerException(final String message, final Throwable caught, final Cause cause) {
super(message, caught);
_causeCode = cause;
}
/**
* @param message
* @param cause
*/
public ViewHandlerException(final String message, final Cause cause) {
super(message);
_causeCode = cause;
}
/**
* @param caught
* @param cause
*/
public ViewHandlerException(final Throwable caught, final Cause cause) {
super(caught);
_causeCode = cause;
}
/**
* @return the cause code
*/
public final Cause getCauseCode() {
return _causeCode;
}
}
}