/*****************************************************************************
 * Copyright (C) The Apache Software Foundation. All rights reserved.        *
 * ------------------------------------------------------------------------- *
 * This software is published under the terms of the Apache Software License *
 * version 1.1, a copy of which has been included with this distribution in  *
 * the LICENSE file.                                                         *
 *****************************************************************************/

package org.apache.batik.bridge;

import java.awt.geom.Dimension2D;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.apache.batik.css.HiddenChildElementSupport;
import org.apache.batik.gvt.GraphicsNode;
import org.apache.batik.gvt.GraphicsNodeRenderContext;
import org.apache.batik.script.InterpreterPool;
import org.apache.batik.util.SVGConstants;
import org.w3c.dom.Element;
import org.w3c.dom.svg.SVGDocument;

import org.apache.batik.gvt.filter.GraphicsNodeRableFactory;
import org.apache.batik.gvt.filter.ConcreteGraphicsNodeRableFactory;

/**
 * This class represents a context used by the various bridges and the
 * builder. A bridge context is associated to a particular document
 * and cannot be reused.
 *
 * The context encapsulates the dynamic bindings between DOM elements
 * and GVT nodes, graphic contexts such as a <tt>GraphicsNodeRenderContext</tt>,
 * and the different objects required by the GVT builder to interpret
 * a SVG DOM tree such as the current viewport or the user agent.
 *
 * @author <a href="mailto:Thierry.Kormann@sophia.inria.fr">Thierry Kormann</a>
 * @version $Id$
 */
public class BridgeContext implements ErrorConstants {

    /**
     * The GVT builder that might be used to create a GVT subtree.
     */
    protected GVTBuilder gvtBuilder;

    /**
     * The viewports.
     * key is an Element -
     * value is a Viewport
     */
    protected Map viewportMap = new HashMap();

    /**
     * The viewport stack. Used in building time.
     */
    protected List viewportStack = new LinkedList();

    /**
     * The user agent.
     */
    protected UserAgent userAgent;

    /**
     * Binding Map:
     * key is an SVG Element -
     * value is a GraphicsNode
     */
    protected HashMap elementNodeMap;

    /**
     * Binding Map:
     * key is GraphicsNode -
     * value is a SVG Element.
     */
    protected HashMap nodeElementMap;

    /**
     * Binding Map:
     * key is style Element -
     * value is a list of styleReference
     */
    protected HashMap elementStyleAttMap;

    /**
     * Binding Map:
     * key is GraphicsNode -
     * value is list of StyleElement.
     */
    protected HashMap nodeStyleMap;

    /**
     * Bridge Map:
     * Keys are namespace URI - values are HashMap (with keys are local
     * name and values are a Bridge instance).
     */
    protected HashMap namespaceURIMap;

    /**
     * The current <tt>GraphicsNodeRenderContext</tt> for <tt>GraphicsNode</tt>.
     */
    protected GraphicsNodeRenderContext rc;

    /**
     * The interpreter pool used to handle scripts.
     */
    protected InterpreterPool interpreterPool;

    /**
     * The document loader used to load/create Document.
     */
    protected DocumentLoader documentLoader;

    /**
     * The size of the document.
     */
    protected Dimension2D documentSize;

    /**
     * Constructs a new empty bridge context.
     */
    protected BridgeContext() {}

    /**
     * By default we share a unique instance of InterpreterPool.
     */
    private static InterpreterPool sharedPool = new InterpreterPool();

    /**
     * Constructs a new bridge context.
     * @param userAgent the user agent
     * @param rc the graphics node renderer context
     */
    public BridgeContext(UserAgent userAgent,
                         GraphicsNodeRenderContext rc) {
        this(userAgent,
             rc,
             sharedPool,
             new DocumentLoader(userAgent));
    }

    /**
     * Constructs a new bridge context.
     * @param userAgent the user agent
     * @param rc the graphics node renderer context
     * @param documentLoader document loader
     */
    public BridgeContext(UserAgent userAgent,
                         GraphicsNodeRenderContext rc,
                         DocumentLoader loader) {
        this(userAgent, rc, sharedPool, loader);
    }

    /**
     * Constructs a new bridge context.
     * @param userAgent the user agent
     * @param rc the graphics node renderer context
     * @param interpreterPool the interpreter pool
     * @param documentLoader document loader
     */
    public BridgeContext(UserAgent userAgent,
                         GraphicsNodeRenderContext rc,
                         InterpreterPool interpreterPool,
                         DocumentLoader documentLoader) {
        this.userAgent = userAgent;
        this.viewportMap.put(userAgent, new UserAgentViewport(userAgent));
        this.rc = rc;
        this.interpreterPool = interpreterPool;
        this.documentLoader = documentLoader;
        registerSVGBridges(this);
    }

    /////////////////////////////////////////////////////////////////////////
    // properties
    /////////////////////////////////////////////////////////////////////////

    /**
     * Returns the user agent of this bridge context.
     */
    public UserAgent getUserAgent() {
        return userAgent;
    }

    /**
     * Sets the user agent to the specified user agent.
     * @param userAgent the user agent
     */
    protected void setUserAgent(UserAgent userAgent) {
        this.userAgent = userAgent;
    }

    /**
     * Sets the GVT builder that uses this context.
     */
    protected void setGVTBuilder(GVTBuilder gvtBuilder) {
        this.gvtBuilder = gvtBuilder;
    }

    /**
     * Returns the GVT builder that is currently used to build the GVT tree.
     */
    public GVTBuilder getGVTBuilder() {
        return gvtBuilder;
    }

    /**
     * Returns the interpreter pool used to handle scripts.
     */
    public InterpreterPool getInterpreterPool() {
        return interpreterPool;
    }

    /**
     * Sets the interpreter pool used to handle scripts to the
     * specified interpreter pool.
     * @param interpreterPool the interpreter pool
     */
    protected void setInterpreterPool(InterpreterPool interpreterPool) {
        this.interpreterPool = interpreterPool;
    }

    /**
     * Returns the document loader used to load external documents.
     */
    public DocumentLoader getDocumentLoader() {
        return documentLoader;
    }

    /**
     * Sets the document loader used to load external documents.
     * @param newDocumentLoader the new document loader
     */
    protected void setDocumentLoader(DocumentLoader newDocumentLoader) {
        this.documentLoader = newDocumentLoader;
    }

    /**
     * Returns a <tt>GraphicsNodeRenderContext</tt> to use.
     */
    public GraphicsNodeRenderContext getGraphicsNodeRenderContext() {
        return rc;
    }

    /**
     * Sets the <tt>GraphicsNodeRenderContext</tt> to use.
     * @param rc the new GraphicsNodeRenderContext
     */
    protected void setGraphicsNodeRenderContext(GraphicsNodeRenderContext rc) {
        this.rc = rc;
    }

    /////////////////////////////////////////////////////////////////////////
    // convenient methods
    /////////////////////////////////////////////////////////////////////////

    /**
     * Returns the element referenced by the specified element by the
     * specified uri. The referenced element can not be a Document.
     *
     * @param e the element referencing
     * @param uri the uri of the referenced element
     */
    public Element getReferencedElement(Element e, String uri) {
        try {
            SVGDocument document = (SVGDocument)e.getOwnerDocument();
            URIResolver ur = new URIResolver(document, documentLoader);
            Element ref = ur.getElement(uri);
            if (ref == null) {
                throw new BridgeException(e, ERR_URI_MALFORMED,
                                          new Object[] {uri});
            } else {
                return ref;
            }
        } catch (MalformedURLException ex) {
            throw new BridgeException(e, ERR_URI_MALFORMED,
                                      new Object[] {uri});
        } catch (IOException ex) {
            throw new BridgeException(e, ERR_URI_IO,
                                      new Object[] {uri});
        } catch (IllegalArgumentException ex) {
            throw new BridgeException(e, ERR_URI_REFERENCE_A_DOCUMENT,
                                      new Object[] {uri});
        }
    }

    /////////////////////////////////////////////////////////////////////////
    // methods to access to the current state of the bridge context
    /////////////////////////////////////////////////////////////////////////

    /**
     * Returns the actual size of the document or null if the document
     * has not been built yet.
     */
    public Dimension2D getDocumentSize() {
        return documentSize;
    }

    /**
     * Sets the size of the document to the specified dimension.
     *
     * @param d the actual size of the SVG document
     */
    protected void setDocumentSize(Dimension2D d) {
        this.documentSize = d;
    }

    /**
     * Returns the viewport of the specified element.
     * @param e the element interested in its viewport
     */
    public Viewport getViewport(Element e) {
        if (viewportStack != null) { // building time
            if (viewportStack.size() > 0) {
                return (Viewport)viewportStack.get(0);
            } else {
                return (Viewport)viewportMap.get(userAgent);
            }
        } else {
            // search the first parent which has defined a viewport
            e = HiddenChildElementSupport.getParentElement(e);
            while (e != null) {
                Viewport viewport = (Viewport)viewportMap.get(e);
                if (viewport != null) {
                    return viewport;
                }
                e = HiddenChildElementSupport.getParentElement(e);
            }
            return (Viewport)viewportMap.get(userAgent);
        }
    }

    /**
     * Starts a new viewport from the specified element.
     * @param e the element that starts the viewport
     * @param viewport the viewport of the element
     */
    public void openViewport(Element e, Viewport viewport) {
        viewportMap.put(e, viewport);
        viewportStack.add(0, viewport);
    }

    /**
     * Closes the viewport associated to the specified element.
     * @param e the element that closes its viewport
     */
    public void closeViewport(Element e) {
        viewportMap.remove(e);
        viewportStack.remove(0);
    }

    /**
     * Returns true if the bridge should support dynamic SVG content,
     * false otherwise.
     */
    public boolean isDynamic() {
        return true;
    }

    /////////////////////////////////////////////////////////////////////////
    // binding methods
    /////////////////////////////////////////////////////////////////////////

    /**
     * Binds the specified GraphicsNode to the specified Element. This method
     * automatically bind the graphics node to the element and the element to
     * the graphics node.
     * @param element the element to bind to the specified graphics node
     * @param node the graphics node to bind to the specified element
     */
    public void bind(Element element, GraphicsNode node) {
        if (elementNodeMap == null) {
            elementNodeMap = new HashMap();
            nodeElementMap = new HashMap();
        }
        elementNodeMap.put(element, node);
        nodeElementMap.put(node, element);
    }

    /**
     * Removes the binding of the specified Element. This method
     * unbinds the specified element to its associated graphics node,
     * remove the binding from the graphics node to the specified
     * element, and all the style references associated to the
     * specified element are also removed.
     * @param element the element to unbind
     */
    public void unbind(Element element) {
        if (elementNodeMap == null) {
            return;
        }
        GraphicsNode node = (GraphicsNode)elementNodeMap.get(element);
        elementNodeMap.remove(element);
        nodeElementMap.remove(node);
        // Removes all styles bound to this GraphicsNode
        removeStyleReferences(node);
    }

    /**
     * Returns the GraphicsNode associated to the specified Element or
     * null if any.
     * @param element the element associated to the graphics node to return
     */
    public GraphicsNode getGraphicsNode(Element element) {
        if (elementNodeMap != null) {
            return (GraphicsNode)elementNodeMap.get(element);
        } else {
            return null;
        }
    }

    /**
     * Returns the Element associated to the specified GraphicsNode or
     * null if any.
     * @param node the graphics node associated to the element to return
     */
    public Element getElement(GraphicsNode node) {
        if (nodeElementMap != null) {
            return (Element)nodeElementMap.get(node);
        } else {
            return null;
        }
    }

    /**
     * Binds a style element to a style reference.
     * Several style reference can be bound to the same style element.
     * @param element the element
     * @param reference the style reference
     */
    public void bind(Element element, StyleReference reference) {
        if (elementStyleAttMap == null) {
            elementStyleAttMap = new HashMap();
        }
        LinkedList list = (LinkedList)elementStyleAttMap.get(element);
        if (list == null) {
            list = new LinkedList();
            elementStyleAttMap.put(element, list);
        }
        list.add(reference);
        if (nodeStyleMap == null)
            nodeStyleMap = new HashMap();

        GraphicsNode node = reference.getGraphicsNode();
        list = (LinkedList)nodeStyleMap.get(node);
        if (list == null) {
            list = new LinkedList();
            nodeStyleMap.put(node, list);
        }
        list.add(element);
    }

    /**
     * Returns an enumeration of all style refence for the specified
     * style element.
     * @param element the element
     */
    public List getStyleReferenceList(Element element) {
        if (elementStyleAttMap == null) {
            return Collections.EMPTY_LIST;
        } else {
            LinkedList list = (LinkedList)elementStyleAttMap.get(element);
            if (list != null) {
                return list;
            } else {
                return Collections.EMPTY_LIST;
            }
        }
    }

    /**
     * Removes all bindings between a style Element and the specified
     * GraphicsNode.
     * @param node the graphics node
     */
    private void removeStyleReferences(GraphicsNode node){
        // Get the list of style Elements used by this node
        if (nodeStyleMap == null) {
            return;
        }
        List styles = (List)nodeStyleMap.get(node);
        if (styles != null) {
            nodeStyleMap.remove(node);
        }
        for (Iterator it = styles.iterator(); it.hasNext();){
            Element style = (Element)it.next();
            removeStyleReference(node, style);
        }
    }

    /**
     * Removes all StyleReference corresponding to the specified GraphicsNode.
     * @param node the graphics node
     * @param style the style element
     */
    private void removeStyleReference(GraphicsNode node, Element style){
        if (elementStyleAttMap == null) {
            return;
        }
        LinkedList list = (LinkedList)elementStyleAttMap.get(style);
        List removed = null;
        if (list == null) {
            return;
        }
        for (Iterator it = list.iterator(); it.hasNext();){
            StyleReference styleRef = (StyleReference)it.next();
            if (styleRef.getGraphicsNode()==node) {
                if (removed == null) {
                    removed = new LinkedList();
                }
                removed.add(styleRef);
            }
        }
        if (removed != null) {
            for (Iterator it = removed.iterator(); it.hasNext();) {
                list.remove(it.next());
            }
        }
        if (list.size() == 0) {
            elementStyleAttMap.remove(style);
        }
    }

    /////////////////////////////////////////////////////////////////////////
    // bridge support
    /////////////////////////////////////////////////////////////////////////

    /**
     * Returns the bridge associated with the specified element.
     * @param element the element
     */
    public Bridge getBridge(Element element) {
        if (namespaceURIMap == null || element == null) {
            return null;
        }
        String namespaceURI = element.getNamespaceURI();
        String localName = element.getLocalName();
        namespaceURI = ((namespaceURI == null)? "" : namespaceURI);
        HashMap localNameMap = (HashMap) namespaceURIMap.get(namespaceURI);
        if (localNameMap == null) {
            return null;
        }
        return (Bridge)localNameMap.get(localName);
    }

    /**
     * Returns the bridge associated with the element type
     * @param nameSpaceURI namespace of the requested element
     * @param localName element's local name
     *
     */
    public Bridge getBridge(String namespaceURI,
                            String localName){
        HashMap localNameMap = (HashMap) namespaceURIMap.get(namespaceURI);
        if (localNameMap == null) {
            return null;
        }
        return (Bridge)localNameMap.get(localName);
    }

    /**
     * Associates the specified <tt>Bridge</tt> object with the specified
     * namespace URI and local name.
     * @param namespaceURI the namespace URI
     * @param localName the local name
     * @param bridge the bridge that manages the element
     */
    public void putBridge(String namespaceURI, String localName,
                          Bridge bridge) {
        if (namespaceURIMap == null) {
            namespaceURIMap = new HashMap();
        }
        namespaceURI = ((namespaceURI == null)? "" : namespaceURI);
        HashMap localNameMap = (HashMap) namespaceURIMap.get(namespaceURI);
        if (localNameMap == null) {
            localNameMap = new HashMap();
            namespaceURIMap.put(namespaceURI, localNameMap);
        }
        localNameMap.put(localName, bridge);
    }

    /**
     * Removes the <tt>Bridge</tt> object associated to the specified
     * namespace URI and local name.
     * @param namespaceURI the namespace URI
     * @param localName the local name
     */
    public void removeBridge(String namespaceURI, String localName) {
        if (namespaceURIMap == null) {
            return;
        }
        namespaceURI = ((namespaceURI == null)? "" : namespaceURI);
        HashMap localNameMap = (HashMap) namespaceURIMap.get(namespaceURI);
        if (localNameMap != null) {
            localNameMap.remove(localName);
            if (localNameMap.isEmpty()) {
                namespaceURIMap.remove(namespaceURI);
                if (namespaceURIMap.isEmpty()) {
                    namespaceURIMap = null;
                }
            }
        }
    }

    /**
     * Registers the bridges to handle SVG 1.0 elements.
     * @param ctx the bridge context to initialize
     */
    public static void registerSVGBridges(BridgeContext ctx) {
        // bridges to handle elements in the SVG namespace

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_A_TAG,
                      new SVGAElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_CIRCLE_TAG,
                      new SVGCircleElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_CLIP_PATH_TAG,
                      new SVGClipPathElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_COLOR_PROFILE_TAG,
                      new SVGColorProfileElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_ELLIPSE_TAG,
                      new SVGEllipseElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_FE_BLEND_TAG,
                      new SVGFeBlendElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_FE_COLOR_MATRIX_TAG,
                      new SVGFeColorMatrixElementBridge());
        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_FE_COMPONENT_TRANSFER_TAG,
                      new SVGFeComponentTransferElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_FE_COMPOSITE_TAG,
                      new SVGFeCompositeElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_FE_CONVOLVE_MATRIX_TAG,
                      new SVGFeConvolveMatrixElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_FE_DIFFUSE_LIGHTING_TAG,
                      new SVGFeDiffuseLightingElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_FE_DISPLACEMENT_MAP_TAG,
                      new SVGFeDisplacementMapElementBridge());
        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_FE_FLOOD_TAG,
                      new SVGFeFloodElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_FE_GAUSSIAN_BLUR_TAG,
                      new SVGFeGaussianBlurElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_FE_IMAGE_TAG,
                      new SVGFeImageElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_FE_MERGE_TAG,
                      new SVGFeMergeElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_FE_MERGE_NODE_TAG,
                      new SVGFeMergeElementBridge.SVGFeMergeNodeElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_FE_MORPHOLOGY_TAG,
                      new SVGFeMorphologyElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_FE_OFFSET_TAG,
                      new SVGFeOffsetElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_FE_SPECULAR_LIGHTING_TAG,
                      new SVGFeSpecularLightingElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_FE_TILE_TAG,
                      new SVGFeTileElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_FE_TURBULENCE_TAG,
                      new SVGFeTurbulenceElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_FILTER_TAG,
                      new SVGFilterElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_FE_FUNC_A_TAG,
                      new SVGFeComponentTransferElementBridge.SVGFeFuncAElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_FE_FUNC_R_TAG,
                      new SVGFeComponentTransferElementBridge.SVGFeFuncRElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_FE_FUNC_G_TAG,
                      new SVGFeComponentTransferElementBridge.SVGFeFuncGElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_FE_FUNC_B_TAG,
                      new SVGFeComponentTransferElementBridge.SVGFeFuncBElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_G_TAG,
                      new SVGGElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_IMAGE_TAG,
                      new SVGImageElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_LINE_TAG,
                      new SVGLineElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_LINEAR_GRADIENT_TAG,
                      new SVGLinearGradientElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_MARKER_TAG,
                      new SVGMarkerElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_MASK_TAG,
                      new SVGMaskElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_PATH_TAG,
                      new SVGPathElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_PATTERN_TAG,
                      new SVGPatternElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_POLYLINE_TAG,
                      new SVGPolylineElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_POLYGON_TAG,
                      new SVGPolygonElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_RADIAL_GRADIENT_TAG,
                      new SVGRadialGradientElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_RECT_TAG,
                      new SVGRectElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_STOP_TAG,
                      new SVGAbstractGradientElementBridge.SVGStopElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_SVG_TAG,
                      new SVGSVGElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_SWITCH_TAG,
                      new SVGSwitchElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_TEXT_TAG,
                      new SVGTextElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_USE_TAG,
                      new SVGUseElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_FE_SPOT_LIGHT_TAG,
                      new SVGFeAbstractLightingElementBridge.SVGFeSpotLightElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_FE_POINT_LIGHT_TAG,
                      new SVGFeAbstractLightingElementBridge.SVGFePointLightElementBridge());

        ctx.putBridge(SVGConstants.SVG_NAMESPACE_URI,
                      SVGConstants.SVG_FE_DISTANT_LIGHT_TAG,
                      new SVGFeAbstractLightingElementBridge.SVGFeDistantLightElementBridge());

    }
}
