/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and 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
*
* Contributors:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.meta.impl;
import java.io.FileNotFoundException;
import java.text.MessageFormat;
import java.util.Vector;
import org.jboss.tools.common.meta.XMetaElement;
import org.jboss.tools.common.model.XModelObjectConstants;
import org.jboss.tools.common.model.plugin.ModelPlugin;
import org.jboss.tools.common.model.util.XMLUtil;
import org.jboss.tools.common.xml.XMLUtilities;
import org.w3c.dom.Element;
public class XMetaDataLoader implements XMetaDataConstants {
public static boolean hasAttribute(Element e, String s) {
return XMLUtil.hasAttribute(e, s);
}
private static XMetaElement getDefaultMetaElementInstance(Class defImpl) {
try {
return (XMetaElementImpl)defImpl.newInstance();
} catch (InstantiationException e) {
ModelPlugin.getPluginLog().logError("Error in getDefaultMetaElementInstance"); //$NON-NLS-1$
} catch (IllegalAccessException e) {
ModelPlugin.getPluginLog().logError("Error in getDefaultMetaElementInstance"); //$NON-NLS-1$
}
return null;
}
private static XMetaElement getMetaElementInstance(Element element, Class defImpl, boolean isRequired) {
if(element == null) {
return (!isRequired) ? null : getDefaultMetaElementInstance(defImpl);
}
if(defImpl != null) return getDefaultMetaElementInstance(defImpl);
String loader = element.getAttribute(LOADER);
if(loader == null || loader.length() == 0) return null;
try {
return (XMetaElementImpl)ModelPlugin.getDefault().getClass().getClassLoader().loadClass(loader).newInstance();
} catch (InstantiationException e) {
ModelPlugin.getPluginLog().logError("Error in getMetaElementInstance " + loader, e); //$NON-NLS-1$
} catch (IllegalAccessException e) {
ModelPlugin.getPluginLog().logError("Error in getMetaElementInstance " + loader, e); //$NON-NLS-1$
} catch (ClassNotFoundException e) {
ModelPlugin.getPluginLog().logError("Error in getMetaElementInstance " + loader, e); //$NON-NLS-1$
}
return null;
}
public static XMetaElement loadMetaElement(Element parent, String nodeName, Class defImpl, boolean isRequired){
return loadMetaElement(getUniqueChild(parent, nodeName), defImpl, isRequired);
}
public static XMetaElement loadMetaElement(Element element, Class defImpl, boolean isRequired){
XMetaElementImpl m = (XMetaElementImpl)getMetaElementInstance(element, defImpl, isRequired);
if(m != null && element != null) {
m.setName(element.getAttribute(NAME));
m.setDisplayName(element.getAttribute(DISPLAYNAME));
m.load(element);
}
return m;
}
public static XMetaElement[] loadElementGroup(Element element, String groupName, String elName, Class defImpl) {
Element att = getUniqueChild(element, groupName);
if(att == null) return (XMetaElement[])java.lang.reflect.Array.newInstance(defImpl,0);
Element[] cs = getChildrenElements(att, elName);
Vector<XMetaElement> v = new Vector<XMetaElement>(cs.length);
for (int i = 0; i < cs.length; i++) {
XMetaElement attr = loadMetaElement(cs[i], defImpl, false);
if(attr != null) v.addElement(attr);
}
return v.toArray((XMetaElement[])java.lang.reflect.Array.newInstance(defImpl,v.size()));
}
public static Element getUniqueChild(Element element, String name) {
return XMLUtil.getUniqueChild(element, name);
}
public static Element[] getChildrenElements(Element element, String child) {
return XMLUtil.getChildren(element, child);
}
public static boolean getBoolean(Element el, String attName, boolean def){
String a = el.getAttribute(attName);
return (a == null || a.length() == 0) ? def :
(XModelObjectConstants.TRUE.equalsIgnoreCase(a) || XModelObjectConstants.YES.equalsIgnoreCase(a));
}
public static int getInt(Element el, String attName, int def){
try {
return Integer.parseInt(el.getAttribute(attName));
} catch(NumberFormatException ex){
return def;
}
}
// meta data loading
static Element loadDocument(String filename) throws FileNotFoundException {
Element e = XMLUtil.getElement(filename);
if(e == null) throw new FileNotFoundException(MessageFormat.format("Can''t load meta model from {0}", filename));
return e;
}
public static void loadMetaModel(XModelMetaDataImpl factory) {
new MetaLibLoader().load(factory);
}
static void loadEntityGroup(XModelMetaDataImpl factory, Element g) {
// String n = g.getAttribute(XModelObjectConstants.XML_ATTR_NAME);
String module = ""; //$NON-NLS-1$
Element v = XMLUtilities.getUniqueChild(g, "VERSION"); //$NON-NLS-1$
if(v != null && v.hasAttribute("MODULE")) { //$NON-NLS-1$
module = v.getAttribute("MODULE"); //$NON-NLS-1$
}
loadMappings(factory, g);
factory.createIconList(getUniqueChild(g, ICONS));
loadGlobalActions(factory, g);
loadEntities(factory, g, module);
}
private static void loadEntities(XModelMetaDataImpl factory, Element element, String module) {
Element[] cs = getChildrenElements(element, XMODEL_ENTITY);
for (int i = 0; i < cs.length; i++) {
factory.createEntity(cs[i], module);
}
cs = getChildrenElements(element, XENTITY_EXTENTION);
XExtensions extensions = factory.getExtensions();
for (int i = 0; i < cs.length; i++) extensions.addExtension(cs[i]);
}
private static void loadMappings(XModelMetaDataImpl factory, Element group) {
Element mappings = getUniqueChild(group, MAPPINGS);
if(mappings != null) factory.loadMappings(mappings);
}
private static void loadGlobalActions(XModelMetaDataImpl factory, Element group) {
Element actions = getUniqueChild(group, "GlobalActions"); //$NON-NLS-1$
if(actions != null) factory.loadGlobalActions(actions);
}
}