/******************************************************************************* * 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.hibernate.xml.model; import java.util.HashMap; import java.util.Map; import org.jboss.tools.common.meta.XAttribute; import org.jboss.tools.common.meta.XModelEntity; import org.jboss.tools.common.meta.constraint.impl.XAttributeConstraintAList; import org.jboss.tools.common.meta.impl.XModelMetaDataImpl; import org.jboss.tools.common.model.XModelObject; import org.jboss.tools.common.model.loaders.impl.SimpleWebFileLoader; import org.jboss.tools.common.model.util.XModelObjectLoaderUtil; import org.jboss.tools.common.xml.XMLUtilities; import org.jboss.tools.hibernate.xml.HibernateXMLPlugin; import org.jboss.tools.hibernate.xml.model.helpers.HibernateTypeHelper; import org.w3c.dom.Element; public class HibernateLoader extends SimpleWebFileLoader { protected XModelObjectLoaderUtil createUtil() { return new HibernateLoaderUtil(); } public void load(XModelObject object) { if(!HibernateMetaLoader.ok) HibernateMetaLoader.load(); super.load(object); } } class HibernateLoaderUtil extends XModelObjectLoaderUtil { static String[] metaFolders = new String[]{"Meta"}; //$NON-NLS-1$ static String[] fileFolders = new String[]{"Types", "Imports", "Classes", "Result Sets", "Queries", "Filters", "Database Objects"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ static String[] classFolders = new String[]{"Tuplizers", "Properties", "Subclasses", "SQL", "Filters", "Result Sets", "Queries"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ static String[] subclassFolders = new String[]{"Tuplizers", "Synchronize", "Properties", "Subclasses", "SQL", "Result Sets", "Queries"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ static String[] compositeElementFolders = new String[]{"Properties"}; //$NON-NLS-1$ static String[] listFolders = new String[]{"SQL"}; //$NON-NLS-1$ static String[] setFolders = new String[]{"SQL", "Filters"}; //$NON-NLS-1$ //$NON-NLS-2$ static Map<String,String[]> folders = new HashMap<String,String[]>(); static { folders.put("file", fileFolders); //$NON-NLS-1$ folders.put("class", classFolders); //$NON-NLS-1$ folders.put("subclass", subclassFolders); //$NON-NLS-1$ folders.put("component", compositeElementFolders); //$NON-NLS-1$ folders.put("element", compositeElementFolders); //$NON-NLS-1$ folders.put("list", listFolders); //$NON-NLS-1$ folders.put("set", setFolders); //$NON-NLS-1$ } private String[] getFolders(XModelObject o) { String loaderKind = o.getModelEntity().getProperty("loaderKind"); //$NON-NLS-1$ return (loaderKind == null) ? null : (String[])folders.get(loaderKind); } public void loadChildren(Element element, XModelObject o) { super.loadChildren(element, o); loadFolders(element, o, metaFolders); String[] fs = getFolders(o); if(fs != null) loadFolders(element, o, fs); } protected void loadFolders(Element element, XModelObject o, String[] folders) { for (int i = 0; i < folders.length; i++) { XModelObject c = o.getChildByPath(folders[i]); if(c != null) super.loadChildren(element, c); } } public boolean saveChildren(Element element, XModelObject o) { saveFolders(element, o, metaFolders); String entity = o.getModelEntity().getName(); if("Hibernate3Component".equals(entity)) { //$NON-NLS-1$ moveElementToEnd(element, "parent"); //$NON-NLS-1$ } boolean b = super.saveChildren(element, o); String[] fs = getFolders(o); if(fs != null) saveFolders(element, o, fs); return b; } protected boolean saveFolders(Element element, XModelObject o, String[] folders) { boolean b = true; for (int i = 0; i < folders.length; i++) { XModelObject c = o.getChildByPath(folders[i]); if(c != null) b &= super.saveChildren(element, c); } return b; } protected boolean isSaveable(XModelEntity entity, String n, String v, String dv) { if(v == null) return false; if(v.length() == 0 || v.equals(dv)) { XAttribute attr = entity.getAttribute(n); return (attr != null && "always".equals(attr.getProperty("save"))); //$NON-NLS-1$ //$NON-NLS-2$ } return super.isSaveable(entity, n, v, dv); } static void moveElementToEnd(Element element, String name) { Element[] es = XMLUtilities.getChildren(element, name); if(es != null) for (int i = 0; i < es.length; i++) { element.removeChild(es[i]); element.appendChild(es[i]); } } protected String getChildEntity(XModelEntity entity, Element e) { if(e != null && "database-object".equals(e.getNodeName())) { //$NON-NLS-1$ Element c = XMLUtilities.getUniqueChild(e, "definition"); //$NON-NLS-1$ return c != null ? "Hibernate3DatabaseObjectDef" : "Hibernate3DatabaseObjectCreateDrop"; //$NON-NLS-1$ //$NON-NLS-2$ } return super.getChildEntity(entity, e); } } class HibernateMetaLoader { static boolean ok = false; public static void load() { ok = true; try { XModelEntity e = XModelMetaDataImpl.getInstance().getEntity(HibernateConstants.ENTITY_HIBERNATE_PROPERTY_3_0); XAttribute a = e.getAttribute("type"); //$NON-NLS-1$ if(a.getConstraint() instanceof XAttributeConstraintAList) { XAttributeConstraintAList c = (XAttributeConstraintAList)a.getConstraint(); c.setValues(HibernateTypeHelper.TYPE_NAMES); } } catch (Exception e) { HibernateXMLPlugin.log(e); } } }