blob: 53e4f1b655416247e2cffea50db85b30592e2d7c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 Sybase, Inc. 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:
* Sybase, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.pagedesigner.converter;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages;
import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
import org.eclipse.jst.pagedesigner.PageDesignerTraceOptions;
import org.eclipse.jst.pagedesigner.converter.html.HTMLConverterFactory;
import org.eclipse.jst.pagedesigner.converter.jsp.JSPConverterFactory;
import org.eclipse.swt.graphics.Image;
import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
import org.w3c.dom.Element;
/**
* @author mengbo
* @version 1.5
*/
public class ConverterFactoryRegistry
{
List _factories = new ArrayList();
private static ConverterFactoryRegistry _instance;
/**
*
*/
private ConverterFactoryRegistry()
{
final List<IConverterFactory> facs = ConverterFacRegistryReader
.getAllHandlers();
if (facs != null)
{
for (final IConverterFactory fac : facs)
{
addFactory(fac);
}
}
_factories.add(new JSPConverterFactory());
_factories.add(new HTMLConverterFactory());
// TODO: this is not ideal, but until we get a better system for
// doing converter factory ordering:
// loop through the list and place the DTManager
}
/**
* @param fac
*/
public void addFactory(final IConverterFactory fac)
{
_factories.add(fac);
}
/**
* @param ele
* @param mode
* @param targetDocument
* @return the new btag converter
*/
public ITagConverter createTagConverter(final Element ele, final int mode,
final IDOMDocument targetDocument)
{
final ITagConverter converter = internalCreateTagConverter(ele, mode);
if (converter != null)
{
converter.setDestDocument(targetDocument);
}
return converter;
}
/**
* @param ele
* @param mode
* @return the new tag converter
*/
protected final ITagConverter internalCreateTagConverter(final Element ele,
final int mode)
{
final String uri = CMUtil.getElementNamespaceURI(ele);
// first round, match uri
for (int i = 0, size = _factories.size(); i < size; i++)
{
final IConverterFactory fac = (IConverterFactory) _factories.get(i);
final String facuri = fac.getSupportedURI();
if (facuri != null && facuri.equals(uri))
{
final ITagConverter converter = fac.createConverter(ele, mode);
if (converter != null)
{
if (PageDesignerTraceOptions.TRACE_CONVERTERSELECT)
{
PageDesignerTraceOptions
.log("ConverterFactoryRegistry: first loop, " //$NON-NLS-1$
+ String
.format(
"Selected converter %s for uri=%s, tagname=%s", //$NON-NLS-1$
converter.getClass()
.getName(),
uri, ele.getLocalName()));
}
return converter;
}
}
}
// second round
for (int i = 0, size = _factories.size(); i < size; i++)
{
final IConverterFactory fac = (IConverterFactory) _factories.get(i);
final String facuri = fac.getSupportedURI();
if (facuri == null)
{
final ITagConverter converter = fac.createConverter(ele, mode);
if (converter != null)
{
if (PageDesignerTraceOptions.TRACE_CONVERTERSELECT)
{
PageDesignerTraceOptions
.log("ConverterFactoryRegistry: second loop, " //$NON-NLS-1$
+ String
.format(
"Selected converter %s for uri=%s, tagname=%s", //$NON-NLS-1$
converter.getClass()
.getName(),
uri, ele.getLocalName()));
}
return converter;
}
}
}
// can't find. We need some default tag converter for it.
// if the tag is empty, show it as icon.
if (uri == null || ITLDConstants.URI_HTML.equals(uri))
{
if (PageDesignerTraceOptions.TRACE_CONVERTERSELECT)
{
PageDesignerTraceOptions
.log("ConverterFactoryRegistry: factory not found, " //$NON-NLS-1$
+ String
.format(
"Selected DumTagConverter for uri=%s, tagname=%s", //$NON-NLS-1$
uri, ele.getLocalName()));
}
// basically, for HTML or non JSP tag, directly renders it.
return new DumTagConverter(ele);
}
final CMElementDeclaration decl = CMUtil.getElementDeclaration(ele);
if (decl == null)
{
if (PageDesignerTraceOptions.TRACE_CONVERTERSELECT)
{
PageDesignerTraceOptions
.log("ConverterFactoryRegistry: factory and decl not found, " //$NON-NLS-1$
+ String
.format(
"Selected DumTagConverter for uri=%s, tagname=%s", //$NON-NLS-1$
uri, ele.getLocalName()));
}
return new DumTagConverter(ele);
}
final int contentType = decl.getContentType();
if (contentType == CMElementDeclaration.EMPTY)
{
if (PageDesignerTraceOptions.TRACE_CONVERTERSELECT)
{
PageDesignerTraceOptions
.log("ConverterFactoryRegistry: factory not found, content is EMPTY, " //$NON-NLS-1$
+ String
.format(
"Selected HiddenTagConverter with UnknownImage for uri=%s, tagname=%s", //$NON-NLS-1$
uri, ele.getLocalName()));
}
// if the tag is empty, show it as icon.
return new HiddenTagConverter(ele, new LabelProvider()
{
@Override
public Image getImage(final Object element)
{
return getUnknownImage();
}
});
}
if (PageDesignerTraceOptions.TRACE_CONVERTERSELECT)
{
PageDesignerTraceOptions
.log("ConverterFactoryRegistry: fall-through to default case, " //$NON-NLS-1$
+ String
.format(
"Selected DefaultUnknownTagConverter with UnknownImage for uri=%s, tagname=%s", //$NON-NLS-1$
uri, ele.getLocalName()));
}
return new DefaultUnknownTagConverter(ele, mode);
}
private static Image getUnknownImage()
{
return JSFUICommonPlugin.getDefault().getImage(
JSFSharedImages.DEFAULT_PALETTE_TAG_IMG);
}
/**
* @return the singleton instance of the registry
*/
public synchronized static ConverterFactoryRegistry getInstance()
{
if (_instance == null)
{
_instance = new ConverterFactoryRegistry();
}
return _instance;
}
}