org.apache.uima.ruta.engine.StyleMapFactory.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.uima.ruta.engine.StyleMapFactory.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package org.apache.uima.ruta.engine;

import java.awt.Color;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.commons.lang3.StringUtils;
import org.apache.uima.cas.FSIterator;
import org.apache.uima.cas.FeatureStructure;
import org.apache.uima.cas.Type;
import org.apache.uima.jcas.JCas;
import org.apache.uima.ruta.type.RutaColoring;
import org.apache.uima.tools.stylemap.ColorParser;
import org.apache.uima.tools.stylemap.StyleMapEntry;
import org.apache.uima.tools.stylemap.StyleMapXmlParser;
import org.apache.uima.util.FileUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;

public class StyleMapFactory {

    private Map<String, String> colorNameMap;

    public StyleMapFactory() {
        initializeColorNameMap();
    }

    private void initializeColorNameMap() {
        colorNameMap = new HashMap<String, String>();
        colorNameMap.put("#000000", "black");
        colorNameMap.put("#c0c0c0", "silver");
        colorNameMap.put("#808080", "gray");
        colorNameMap.put("#ffffff", "white");
        colorNameMap.put("#800000", "maroon");
        colorNameMap.put("#ff0000", "red");
        colorNameMap.put("#800080", "purple");
        colorNameMap.put("#ff00ff", "fuchsia");
        colorNameMap.put("#008000", "green");
        colorNameMap.put("#00ff00", "lime");
        colorNameMap.put("#808000", "olive");
        colorNameMap.put("#ffff00", "yellow");
        colorNameMap.put("#000080", "navy");
        colorNameMap.put("#0000ff", "blue");
        colorNameMap.put("#00ffff", "aqua");
        colorNameMap.put("#000000", "black");
        colorNameMap.put("#add8e6", "lightblue");
        colorNameMap.put("#90ee90", "lightgreen");
        colorNameMap.put("#ffa500", "orange");
        colorNameMap.put("#ffc0cb", "pink");
        colorNameMap.put("#fa8072", "salmon");
        colorNameMap.put("#00ffff", "cyan");
        colorNameMap.put("#ee82ee", "violet");
        colorNameMap.put("#d2b48c", "tan");
        colorNameMap.put("#a52a2a", "brown");
        colorNameMap.put("#ffffff", "white");
        colorNameMap.put("#9370db", "mediumpurple");
        // in other order for lookup
        colorNameMap.put("black", "#000000");
        colorNameMap.put("silver", "#c0c0c0");
        colorNameMap.put("gray", "#808080");
        colorNameMap.put("white", "#ffffff");
        colorNameMap.put("maroon", "#800000");
        colorNameMap.put("red", "#ff0000");
        colorNameMap.put("purple", "#800080");
        colorNameMap.put("fuchsia", "#ff00ff");
        colorNameMap.put("green", "#008000");
        colorNameMap.put("lime", "#00ff00");
        colorNameMap.put("olive", "#808000");
        colorNameMap.put("yellow", "#ffff00");
        colorNameMap.put("navy", "#000080");
        colorNameMap.put("blue", "#0000ff");
        colorNameMap.put("aqua", "#00ffff");
        colorNameMap.put("black", "#000000");
        colorNameMap.put("lightblue", "#add8e6");
        colorNameMap.put("lightgreen", "#90ee90");
        colorNameMap.put("orange", "#ffa500");
        colorNameMap.put("pink", "#ffc0cb");
        colorNameMap.put("salmon", "#fa8072");
        colorNameMap.put("cyan", "#00ffff");
        colorNameMap.put("violet", "#ee82ee");
        colorNameMap.put("tan", "#d2b48c");
        colorNameMap.put("brown", "#a52a2a");
        colorNameMap.put("white", "#ffffff");
        colorNameMap.put("mediumpurple", "#9370db");
    }

    public void createStyleMap(String styleMapLocation, JCas jcas) throws IOException {
        List<StyleMapEntry> styleList = createStyleList(jcas);
        String styleXml = createStyleXml(styleList);
        writeStyleFile(styleXml, styleMapLocation);
    }

    private String createStyleXml(List<StyleMapEntry> styleList) {
        StringBuffer result = new StringBuffer();
        result.append("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n");
        result.append("<styleMap>\n");

        for (StyleMapEntry e : styleList) {
            result.append("<rule>\n");
            result.append("<pattern>");
            result.append(e.getPattern());
            result.append("</pattern>\n");
            result.append("<label>");
            String label = e.getLabel();
            if (label != null) {
                if (!StringUtils.isEmpty(label))
                    result.append(label);
                else
                    result.append(e.getAnnotationTypeName());
            } else
                result.append(e.getAnnotationTypeName());

            result.append("</label>\n");
            result.append("<style>");

            String foregroundColor = "#" + Integer.toHexString(e.getForeground().getRGB()).substring(2);
            String backgroundColor = "#" + Integer.toHexString(e.getBackground().getRGB()).substring(2);

            if (colorNameMap.containsKey(foregroundColor)) {
                result.append("color:" + colorNameMap.get(foregroundColor) + ";");
            } else {
                result.append("color:" + foregroundColor + ";");
            }

            if (colorNameMap.containsKey(backgroundColor)) {
                result.append("background:" + colorNameMap.get(backgroundColor) + ";");
            } else {
                result.append("background:" + backgroundColor + ";");
            }
            Boolean ck = e.getChecked();
            String ckString = ck.toString();

            Boolean hid = (Boolean) Boolean.FALSE;
            String hidString = hid.toString();
            // this prevents hidden from being checked,
            // becasue that is not a meaningful combination
            if (hidString.equals("true")) {
                ckString = "false";
            }
            result.append("checked:" + ckString + ";");
            result.append("hidden:" + hidString + ";");

            result.append("</style>\n");
            result.append("</rule>\n");
        }

        result.append("</styleMap>\n");

        return result.toString();
    }

    private void writeStyleFile(String output, String styleMapLocation) throws IOException {
        File file = new File(styleMapLocation);
        FileUtils.saveString2File(output, file);
    }

    private List<StyleMapEntry> createStyleList(JCas jcas) {
        List<StyleMapEntry> result = new ArrayList<StyleMapEntry>();
        Type type = jcas.getCasType(RutaColoring.type);
        FSIterator<FeatureStructure> iterator = jcas.getFSIndexRepository().getAllIndexedFS(type);
        while (iterator.hasNext()) {
            RutaColoring each = (RutaColoring) iterator.next();
            StyleMapEntry entry = new StyleMapEntry();
            entry.setAnnotationTypeName(each.getTargetType());
            String fgColor = each.getFgColor();
            entry.setForeground(parseColorBackground(fgColor));
            String bgColor = each.getBgColor();
            entry.setBackground(parseColorBackground(bgColor));
            entry.setChecked(each.getSelected());
            result.add(entry);
        }

        return result;
    }

    private Color parseColorBackground(String color) {
        if (color == null) {
            return Color.BLACK;
        }
        if (color.startsWith("#")) {
            return Color.decode(color);
        } else {
            String string = (String) colorNameMap.get(color);
            if (string != null)
                return Color.decode(string);
            else
                return Color.LIGHT_GRAY;
        }
    }

    private Color parseColorForeground(String color) {
        if (color.startsWith("#")) {
            return Color.decode(color);
        } else {
            String string = (String) colorNameMap.get(color);
            if (string != null)
                return Color.decode(string);
            else
                return Color.BLACK;
        }
    }

    public Map<String, StyleMapEntry> parseStyleMap(String styleFileString) {
        Map<String, StyleMapEntry> result = new HashMap<String, StyleMapEntry>();
        StyleMapXmlParser smxp = new StyleMapXmlParser(styleFileString);
        ColorParser cp = new ColorParser();
        for (int i = 0; i < smxp.annotType.size(); i++) {
            String typeName = ((String) smxp.annotType.elementAt(i));
            String labelString = ((String) smxp.styleLabel.elementAt(i));
            String featureValue = ((String) smxp.featureValue.elementAt(i));
            String styleColor = smxp.styleColor.elementAt(i).toString();
            StyleMapEntry e = cp.parseAndAssignColors(typeName, featureValue, labelString, styleColor);
            result.put(typeName, e);
        }
        return result;
    }

    public Map<String, StyleMapEntry> parseStyleMapDOM(String styleFileString) {
        Map<String, StyleMapEntry> result = new HashMap<String, StyleMapEntry>();
        if (styleFileString == null) {
            return result;
        }

        File styleMapFile = new File(styleFileString);
        Document parse = null;
        try {
            DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
            FileInputStream stream = new FileInputStream(styleMapFile);
            parse = db.parse(stream);
            stream.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return null;

        } catch (ParserConfigurationException e) {
            e.printStackTrace();
            return null;

        } catch (FactoryConfigurationError e) {
            e.printStackTrace();
            return null;

        } catch (SAXException e) {
            e.printStackTrace();
            return null;

        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }

        final Node root = parse.getDocumentElement();
        final NodeList nodeList = root.getChildNodes();

        for (int i = 0; i < nodeList.getLength(); ++i) {
            final Node node = nodeList.item(i);
            final String nodeName = node.getNodeName();
            // "rule" node ?
            if (!nodeName.equals("rule")) { //$NON-NLS-1$
                continue;
            }

            // Collect type or pattern, label, and color text style
            NodeList childrenList = node.getChildNodes();
            String type = ""; //$NON-NLS-1$ 
            String label = ""; //$NON-NLS-1$ 
            String colorText = ""; //$NON-NLS-1$ 
            for (int j = 0; j < childrenList.getLength(); ++j) {
                final Node child = childrenList.item(j);
                final String childName = child.getNodeName();

                if (childName.equals("pattern")) { //$NON-NLS-1$ 
                    type = getTextValue(child);
                } else if (childName.equals("label")) { //$NON-NLS-1$ 
                    label = getTextValue(child);
                } else if (childName.equals("style")) { //$NON-NLS-1$ 
                    colorText = getTextValue(child);
                }
            }

            StyleMapEntry styleMapEntry = getStyleMapEntry(type, label, colorText);
            result.put(styleMapEntry.getAnnotationTypeName(), styleMapEntry);
        }
        return result;
    }

    protected StyleMapEntry getStyleMapEntry(String type, String label, String styleColor) {
        StyleMapEntry result = new StyleMapEntry();
        result.setAnnotationTypeName(type);
        result.setLabel(label);
        StringTokenizer token = new StringTokenizer(styleColor, ":;");
        if (!token.hasMoreTokens()) {
            return null; // No token
        }

        token.nextToken();
        String fgString = token.nextToken().toLowerCase().trim();
        result.setForeground(parseColorForeground(fgString));

        token.nextToken();
        String bgString = token.nextToken().toLowerCase().trim();
        result.setBackground(parseColorBackground(bgString));

        boolean checked = false; // default to Checked
        if (token.hasMoreTokens()) {
            String ck = token.nextToken();
            String tf = token.nextToken();
            if (ck.equals("checked")) {
                if (tf.equals("false")) {
                    checked = false;
                } else if (tf.equals("true")) {
                    checked = true;
                }
            }
        }
        result.setChecked(checked);

        boolean hidden = false;
        if (token.hasMoreTokens()) {
            String ck = token.nextToken();
            String tf = token.nextToken();
            if (ck.equals("hidden")) {
                if (tf.equals("true")) {
                    hidden = true;
                }
            }
        }
        result.setHidden(hidden);
        return result;
    }

    private String getTextValue(final Node node) {
        final Node first = node.getFirstChild();

        if (first != null) {
            return ((Text) first).getNodeValue().trim();

        } else {
            return null;
        }
    }
}