/*******************************************************************************
* 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;
}
}