Package org.eclipse.jst.pagedesigner.converter

Source Code of org.eclipse.jst.pagedesigner.converter.ConverterFactoryRegistry

/*******************************************************************************
* 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;
    }
}
TOP

Related Classes of org.eclipse.jst.pagedesigner.converter.ConverterFactoryRegistry

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.