org.hibernate.eclipse.launch.ExportersXMLAttributeDescription.java Source code

Java tutorial

Introduction

Here is the source code for org.hibernate.eclipse.launch.ExportersXMLAttributeDescription.java

Source

/*******************************************************************************
 * Copyright (c) 2010 Red Hat, Inc.
 * Distributed under license by Red Hat, Inc. All rights reserved.
 * This program is 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
 *
 * Contributor:
 *     Red Hat, Inc. - initial API and implementation
 ******************************************************************************/
package org.hibernate.eclipse.launch;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.hibernate.eclipse.console.HibernateConsolePlugin;

/**
 * Ant Hibernate Exporters tasks attribute description.
 * 
 * @author Vitali Yemialyanchyk
 */
public class ExportersXMLAttributeDescription {

    /**
     * path to file to store description
     */
    public static final String ANT_TASKS_DESCRIPTION_PATH = "org/hibernate/eclipse/launch/ant-tasks-description.xml"; //$NON-NLS-1$

    public static class AttributeDescription {
        public String name;
        public String guiName;
        public String defaultValue;
    }

    private static Map<String, Map<String, AttributeDescription>> mapExporter2AttributeDescr = null;
    private static Map<String, Set<String>> mapExporter2SetSubTags = null;

    private static void initExportersDescriptionmap() {
        if (mapExporter2AttributeDescr != null) {
            return;
        }
        mapExporter2AttributeDescr = new TreeMap<String, Map<String, AttributeDescription>>();
        mapExporter2SetSubTags = new TreeMap<String, Set<String>>();
        Document doc = getDocument();
        if (doc == null) {
            return;
        }
        Element root = doc.getRootElement();
        @SuppressWarnings("rawtypes")
        Iterator itTask = root.elementIterator("task"); //$NON-NLS-1$
        while (itTask.hasNext()) {
            Element elTask = (Element) itTask.next();
            Map<String, AttributeDescription> attributes = new TreeMap<String, AttributeDescription>();
            @SuppressWarnings("rawtypes")
            Iterator itAttribute = elTask.elementIterator("attribute"); //$NON-NLS-1$
            while (itAttribute.hasNext()) {
                Element elAttribute = (Element) itAttribute.next();
                AttributeDescription ad = new AttributeDescription();
                ad.name = elAttribute.attributeValue("name"); //$NON-NLS-1$
                ad.guiName = elAttribute.attributeValue("gui-name"); //$NON-NLS-1$
                ad.defaultValue = elAttribute.attributeValue("default"); //$NON-NLS-1$
                attributes.put(ad.guiName, ad);
            }
            Set<String> subtags = new TreeSet<String>();
            itAttribute = elTask.elementIterator("subtag"); //$NON-NLS-1$
            while (itAttribute.hasNext()) {
                Element elAttribute = (Element) itAttribute.next();
                AttributeDescription ad = new AttributeDescription();
                ad.name = elAttribute.attributeValue("name"); //$NON-NLS-1$
                ad.guiName = elAttribute.attributeValue("gui-name"); //$NON-NLS-1$
                ad.defaultValue = elAttribute.attributeValue("default"); //$NON-NLS-1$
                attributes.put(ad.guiName, ad);
                subtags.add(ad.guiName);
            }
            //String taskId = elTask.attributeValue("id"); //$NON-NLS-1$
            String taskName = elTask.attributeValue("name"); //$NON-NLS-1$
            mapExporter2AttributeDescr.put(taskName, attributes);
            mapExporter2SetSubTags.put(taskName, subtags);
        }
    }

    /**
     * get map with core description
     * 
     * @return
     */
    public static Map<String, Map<String, AttributeDescription>> getExportersDescription() {
        initExportersDescriptionmap();
        Map<String, Map<String, AttributeDescription>> res = new TreeMap<String, Map<String, AttributeDescription>>();
        res.putAll(mapExporter2AttributeDescr);
        return res;
    }

    public static Map<String, Set<String>> getExportersSetSubTags() {
        initExportersDescriptionmap();
        Map<String, Set<String>> res = new TreeMap<String, Set<String>>();
        res.putAll(mapExporter2SetSubTags);
        return res;
    }

    private static Document getDocument() {
        InputStream input = getResInputStream(ANT_TASKS_DESCRIPTION_PATH, ExportersXMLAttributeDescription.class);
        if (input == null) {
            HibernateConsolePlugin.getDefault()
                    .logErrorMessage("Can't read resource: " + ANT_TASKS_DESCRIPTION_PATH, (Throwable) null); //$NON-NLS-1$
            return null;
        }
        StringBuffer cbuf = new StringBuffer();
        InputStreamReader isReader = null;
        BufferedReader in = null;
        try {
            String ls = System.getProperties().getProperty("line.separator", "\n"); //$NON-NLS-1$//$NON-NLS-2$
            isReader = new InputStreamReader(input);
            in = new BufferedReader(isReader);
            String str;
            while ((str = in.readLine()) != null) {
                cbuf.append(str + ls);
            }
        } catch (IOException e) {
            HibernateConsolePlugin.getDefault().logErrorMessage("IOException: ", e); //$NON-NLS-1$
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    // ignore
                }
            }
            if (isReader != null) {
                try {
                    isReader.close();
                } catch (IOException e) {
                    // ignore
                }
            }
            try {
                input.close();
            } catch (IOException e) {
                // ignore
            }
        }
        Document res = null;
        try {
            res = DocumentHelper.parseText(cbuf.toString());
        } catch (DocumentException e) {
            HibernateConsolePlugin.getDefault().logErrorMessage("DocumentException: ", e); //$NON-NLS-1$
        }
        return res;
    }

    /**
     * @param resName fully qualified path of the resource
     * @param clazz the class where the resource will exist
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static InputStream getResInputStream(final String resName, final Class clazz) {
        InputStream input = null;
        if (System.getSecurityManager() == null) {
            input = getResInputStreamInternal(resName, clazz);
        } else {
            input = AccessController.doPrivileged(new PrivilegedAction() {
                public Object run() {
                    return getResInputStreamInternal(resName, clazz);
                }
            });
        }
        return input;
    }

    @SuppressWarnings("rawtypes")
    static InputStream getResInputStreamInternal(final String resName, Class clazz) {
        ClassLoader loader = clazz.getClassLoader();
        final InputStream input = loader == null ? ClassLoader.getSystemResourceAsStream(resName)
                : loader.getResourceAsStream(resName);
        return input;
    }
}