aboutsummaryrefslogtreecommitdiffstats
path: root/src/org/apache/fop/fo/FOUserAgent.java
blob: f81753d83adb93a4e526fd3d4953fc515576ab2a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/*
 * $Id$
 * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
 * For details on use and redistribution please refer to the
 * LICENSE file included with these sources.
 */

package org.apache.fop.fo;

import org.apache.fop.render.XMLHandler;
import org.apache.fop.render.RendererContext;

import org.apache.avalon.framework.logger.Logger;

import org.w3c.dom.*;

import java.util.HashMap;

/**
 * The User Agent for fo.
 * This user agent is used by the processing to obtain user configurable
 * options.
 *
 * Renderer specific extensions (that do not produce normal areas on
 * the output) will be done like so:
 * The extension will create an area, custom if necessary
 * this area will be added to the user agent with a key
 * the renderer will know keys for particular extensions
 * eg. bookmarks will be held in a special hierarchical area representing
 * the title and bookmark structure
 * These areas may contain resolveable areas that will be processed
 * with other resolveable areas
 */
public class FOUserAgent {
    HashMap defaults = new HashMap();
    HashMap handlers = new HashMap();
    Logger log;
    String base;

    public void setLogger(Logger logger) {
        log = logger;
    }

    public Logger getLogger() {
        return log;
    }

    public void setBaseURL(String b) {
        base = b;
    }

    public String getBaseURL() {
        return base;
    }

    public float getPixelToMM() {
        return 0.35277777777777777778f;
    }

    /**
     * If to create hot links to footnotes and before floats.
     */
    public boolean linkToFootnotes() {
        return true;
    }

    /**
     * Set the default xml handler for the given mime type.
     */
    public void setDefaultXMLHandler(String mime, XMLHandler handler) {
        defaults.put(mime, handler);
    }

    /**
     * Add an xml handler for the given mime type and xml namespace.
     */
    public void addXMLHandler(String mime, String ns, XMLHandler handler) {
        HashMap mh = (HashMap) handlers.get(mime);
        if (mh == null) {
            mh = new HashMap();
            handlers.put(mime, mh);
        }
        mh.put(ns, handler);
    }

    /** 
     * Render the xml document with the given xml namespace.
     * The Render Context is by the handle to render into the current
     * rendering target.
     */
    public void renderXML(RendererContext ctx, Document doc,
                          String namespace) {
        String mime = ctx.getMimeType();
        HashMap mh = (HashMap) handlers.get(mime);
        XMLHandler handler = null;
        if (mh != null) {
            handler = (XMLHandler) mh.get(namespace);
        }
        if (handler == null) {
            handler = (XMLHandler) defaults.get(mime);
        }
        if (handler != null) {
            try {
                handler.handleXML(ctx, doc, namespace);
            } catch (Throwable t) {
                // could not handle document
                log.error("Could not render XML", t);
            }
        } else {
            // no handler found for document
            log.debug("No handler defined for XML: " + namespace);
        }
    }
}