view flys-artifacts/src/main/java/de/intevation/flys/jfree/StyledAreaSeriesCollection.java @ 5779:ebec12def170

Datacage: Add a pool of builders to make it multi threadable. XML DOM is not thread safe. Therefore the old implementation only allowed one thread to use the builder at a time. As the complexity of the configuration has increased over time this has become a bottleneck of the whole application because it took quiet some time to build a result. Furthermore the builder code path is visited very frequent. So many concurrent requests were piled up resulting in long waits for the users. To mitigate this problem a round robin pool of builders is used now. Each of the pooled builders has an independent copy of the XML template and can be run in parallel. The number of builders is determined by the system property 'flys.datacage.pool.size'. It defaults to 4.
author Sascha L. Teichmann <teichmann@intevation.de>
date Sun, 21 Apr 2013 12:48:09 +0200
parents 85876e3a5346
children
line wrap: on
line source
package de.intevation.flys.jfree;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Stroke;

import org.jfree.data.xy.XYSeriesCollection;
import org.w3c.dom.Document;

import de.intevation.flys.themes.ThemeAccess;
import de.intevation.flys.utils.ThemeUtil;


/**
 * One or more dataseries to draw a polygon (either "open up/downwards", or
 * the area between two curves), a theme-document and further display options.
 * The theme-document will later "style" the graphical representation.
 * The display options can be used to control the z-order and the axis of the
 * dataset.
 */
public class StyledAreaSeriesCollection extends XYSeriesCollection {
    private static final long serialVersionUID = 5274940965666948237L;

    /** Mode, how to draw/which areas to fill. */
    public enum FILL_MODE {UNDER, ABOVE, BETWEEN};

    /** MODE in use. */
    protected FILL_MODE mode;

    /** The theme-document with attributes about actual visual representation. */
    protected Document theme;


    /**
     * @param theme the theme-document.
     */
    public StyledAreaSeriesCollection(Document theme) {
        this.theme = theme;
        this.mode = FILL_MODE.BETWEEN;
   }


    /** Gets the Fill mode. */
    public FILL_MODE getMode() {
        return this.mode;
    }


    /** Sets the Fill mode. */
    public void setMode(FILL_MODE fMode) {
        this.mode = fMode;
    }


    /**
     * Applies line color, size and type attributes to renderer, also
     * whether to draw lines and/or points.
     * @param renderer Renderer to apply theme to.
     * @return \param renderer
     */
    public StableXYDifferenceRenderer applyTheme(
        StableXYDifferenceRenderer renderer
    ) {
        applyFillColor(renderer);
        applyShowShape(renderer);
        applyOutlineColor(renderer);
        applyOutlineStyle(renderer);
        applyShowArea(renderer);
        if (mode == FILL_MODE.UNDER) {
            renderer.setAreaCalculationMode(StableXYDifferenceRenderer.CALCULATE_NEGATIVE_AREA);
        }
        else if (mode == FILL_MODE.ABOVE) {
            renderer.setAreaCalculationMode(StableXYDifferenceRenderer.CALCULATE_POSITIVE_AREA);
        }
        else {
            renderer.setAreaCalculationMode(StableXYDifferenceRenderer.CALCULATE_ALL_AREA);
        }

        // Apply text style.
        new ThemeAccess(theme).parseTextStyle().apply(renderer);
        return renderer;
    }


    protected void applyFillColor(StableXYDifferenceRenderer renderer) {
        Color paint = ThemeUtil.parseColor(
                ThemeUtil.getAreaBackgroundColorString(theme));

        int transparency = ThemeUtil.parseAreaTransparency(theme);
        if (transparency > 0 && paint != null) {
            paint = new Color(
                        paint.getRed(),
                        paint.getGreen(),
                        paint.getBlue(),
                        (int)((100 - transparency) * 2.55f));
        }

        if (paint != null && this.getMode() == FILL_MODE.ABOVE) {
            renderer.setPositivePaint(paint);
            renderer.setNegativePaint(new Color(0,0,0,0));
        }
        else if (paint != null && this.getMode() == FILL_MODE.UNDER) {
            renderer.setNegativePaint(paint);
            renderer.setPositivePaint(new Color(0,0,0,0));
        }
        else {
            if (paint == null)
                paint = new Color(177, 117, 102);
            renderer.setPositivePaint(paint);
            renderer.setNegativePaint(paint);
        }
    }


    protected void applyShowShape(StableXYDifferenceRenderer renderer) {
        boolean show = ThemeUtil.parseAreaShowBorder(theme);
        renderer.setDrawOutline(show);
    }


    protected void applyShowLine(StableXYDifferenceRenderer renderer) {
        boolean show = ThemeUtil.parseShowLine(theme);
        renderer.setShapesVisible(show);
    }


    protected void applyOutlineColor(StableXYDifferenceRenderer renderer) {
        Color c = ThemeUtil.parseLineColorField(theme);
        renderer.setOutlinePaint(c);
    }

    protected void applyOutlineWidth(StableXYDifferenceRenderer renderer) {
        int size = ThemeUtil.parseLineWidth(theme);
    }

    /** Inform renderer whether it should draw a label. */
    protected void applyShowArea(StableXYDifferenceRenderer renderer) {
        renderer.setLabelArea(ThemeUtil.parseShowArea(theme));
    }

    protected void applyOutlineStyle(StableXYDifferenceRenderer renderer) {
        float[] dashes = ThemeUtil.parseLineStyle(theme);
        int size       = ThemeUtil.parseLineWidth(theme);

        Stroke stroke = null;

        if (dashes.length <= 1) {
            stroke = new BasicStroke(Integer.valueOf(size));
        }
        else {
            stroke = new BasicStroke(Integer.valueOf(size),
                BasicStroke.CAP_BUTT,
                BasicStroke.JOIN_ROUND,
                1.0f,
                dashes,
                0.0f);
        }

        renderer.setOutlineStroke(stroke);
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org