blob: da8825cf27c8cd6836e1dadfef65af49b413bdc2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2008 Oracle Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Oracle Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.jsf.designtime.internal.view;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jst.jsf.context.IModelContext;
import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver;
import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler.ViewHandlerException;
import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler.ViewHandlerException.Cause;
import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry;
import org.eclipse.jst.jsp.core.internal.contentmodel.TaglibController;
import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TLDCMDocumentManager;
import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TaglibTracker;
import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
import org.eclipse.jst.jsp.core.internal.domdocument.DOMModelForJSP;
import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
import org.eclipse.wst.sse.core.StructuredModelManager;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
import org.w3c.dom.Element;
/**
* <p>
* A view definition adapter that adapts JSF view definitions based on the
* standard JSP view description language.
* </p>
*
* @author cbateman
*
*/
public class JSPViewDefnAdapter extends TaglibBasedViewDefnAdapter
{
JSPViewDefnAdapter(final ITagRegistry tldTagRegistry)
{
super(tldTagRegistry);
}
@Override
public IDocument getContainer(final DTFacesContext context,
final String viewId)
{
final IResource viewDefn = context.adaptContextObject();
if (viewDefn instanceof IFile)
{
final IFile viewDefnFile = (IFile) viewDefn;
IStructuredModel model = null;
try
{
model =
StructuredModelManager.getModelManager()
.getModelForRead(viewDefnFile);
if (model instanceof DOMModelForJSP)
{
return model.getStructuredDocument();
}
}
catch (final IOException e)
{
JSFCorePlugin.log(e, "Acquiring model for view root"); //$NON-NLS-1$
}
catch (final CoreException e)
{
JSFCorePlugin.log(e, "Acquiring model for view root"); //$NON-NLS-1$
}
finally
{
if (model != null)
{
model.releaseFromRead();
}
}
}
return null;
}
@Override
public final String getNamespace(final Element element,
final IDocument doc)
{
final String prefix = element.getPrefix();
// TODO: merge back with JSPUtil.findUri()
final TLDCMDocumentManager m =
TaglibController.getTLDCMDocumentManager(doc);
if (prefix == null || m == null)
{
return null;
}
final List<?> trackers = m.getTaglibTrackers();
for (final Object name : trackers)
{
final TaglibTracker tracker = (TaglibTracker) name;
if (prefix.equals(tracker.getPrefix()))
{
return tracker.getURI();
}
}
return null;
}
@Override
public DTELExpression getELExpression(final IModelContext genericContext)
throws ViewHandlerException
{
final IStructuredDocumentContext context =
(IStructuredDocumentContext) genericContext
.getAdapter(IStructuredDocumentContext.class);
if (context == null)
{
throw new ViewHandlerException(Cause.EL_NOT_FOUND);
}
ITextRegionContextResolver resolver =
IStructuredDocumentContextResolverFactory.INSTANCE
.getTextRegionResolver(context);
String elText = null;
if (resolver != null)
{
final String regionType = resolver.getRegionType();
if (regionType != null && resolver.matchesRelative(new String[]
{ DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE }))
{
// if we are in the EL content, then get the current region
// text
if (DOMJSPRegionContexts.JSP_VBL_CONTENT.equals(regionType))
{
elText = resolver.getRegionText();
}
// otherwise, we may be at the end of a content region but
// at
// the beginning of a closing brace so check to see if the
// previous
// region was a VBL_CONTENT
else if (regionType.equals(DOMJSPRegionContexts.JSP_VBL_CLOSE))
{
final IStructuredDocumentContext previousContext =
resolver.getPreviousContext();
final ITextRegionContextResolver prevResolver =
IStructuredDocumentContextResolverFactory.INSTANCE
.getTextRegionResolver(previousContext);
if (prevResolver != null)
{
if (DOMJSPRegionContexts.JSP_VBL_CONTENT
.equals(prevResolver.getRegionType()))
{
resolver = prevResolver;
elText = prevResolver.getRegionText();
}
else if (DOMJSPRegionContexts.JSP_VBL_OPEN
.equals(prevResolver.getRegionType()))
{
elText = ""; //$NON-NLS-1$
}
}
}
}
}
if (elText != null)
{
final IStructuredDocumentContext elContext =
IStructuredDocumentContextFactory.INSTANCE.getContext(
context.getStructuredDocument(), resolver
.getStartOffset());
return new DTELExpression(elContext, elText);
}
return null;
}
@Override
public String getGeneratedIdPrefix()
{
return "_idJsp"; //$NON-NLS-1$
}
@Override
public String getPrefix(String namespace, IDocument doc)
{
TLDCMDocumentManager m = TaglibController.getTLDCMDocumentManager(doc);
if (m == null)
return null;
List trackers = m.getTaglibTrackers();
for (Iterator iter = trackers.iterator(); iter.hasNext();) {
TaglibTracker tracker = (TaglibTracker) iter.next();
if (namespace.equals(tracker.getURI())) {
return tracker.getPrefix();
}
CMDocument cmdoc = tracker.getDocument();
if (cmdoc instanceof TLDDocument
&& namespace.equals(((TLDDocument) cmdoc).getUri())) {
return tracker.getPrefix();
}
}
return null;
}
}