/******************************************************************************* * 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.action.impl; import java.util.Properties; import org.w3c.dom.Element; import org.jboss.tools.common.meta.action.*; import org.jboss.tools.common.meta.action.impl.handlers.DefaultSpecialHandler; import org.jboss.tools.common.meta.impl.*; import org.jboss.tools.common.model.*; import org.jboss.tools.common.model.plugin.ModelPlugin; import org.jboss.tools.common.model.util.*; public class XActionImpl extends XActionItemImpl implements XAction { private String wizard; private String handlerClassName = null; private ClassHolder2 handlername = null; private XEntityData[] data; private AbstractHandler handler = new AbstractHandler(); private String baseaction = null; private boolean isSave2ModelRequired = false; private String hide = HIDE_NEVER; public XActionImpl() {} public String getWizardClassName() { return (wizard = expand(wizard, "Wizards")); //$NON-NLS-1$ } public XRedirect getRedirect() { return handler instanceof XRedirect ? (XRedirect)handler : null; } public String getBaseActionName() { return baseaction; } public boolean isSave2ModelRequired() { return isSave2ModelRequired; } public boolean hide(boolean enabled) { return (!hasHandler()) ? hide0(enabled) : handler.hide(enabled); } public XEntityData[] getEntityData(XModelObject object) { data = (!hasHandler()) ? new XEntityData[0] : handler.getEntityData(object); return data; } public void setDefaultData(XModelObject object) { if(hasHandler()) handler.setDefaultData(object); } public void executeHandler(XModelObject object, Properties p) throws XModelException { if(hasHandler()) handler.executeHandler(object, p); } public boolean getSignificantFlag(XModelObject object) { return hasHandler() && handler.getSignificantFlag(object); } public boolean isEnabled(XModelObject object) { return hasHandler() && handler.isEnabled(object); } public boolean isEnabled(XModelObject object, XModelObject[] objects) { return hasHandler() && handler.isEnabled(object, objects); } public void executeHandler(XModelObject object, XModelObject[] objects, java.util.Properties p) throws XModelException { if(hasHandler()) handler.executeHandler(object, objects, p); } private boolean hasHandler() { if(handlername != null) { handler = (AbstractHandler)handlername.createInstance(); if(handler == null) handler = new AbstractHandler(); handler.setAction(this); handler.setData(data); handlername = null; } return (handler != null); } public void load(Element el) { super.load(el); handlerClassName = el.getAttribute("HandlerClassName"); //$NON-NLS-1$ handlername = new ClassHolder2(this, el.getAttribute("HandlerClassName"), "Handlers"); //$NON-NLS-1$ //$NON-NLS-2$ wizard = el.getAttribute("WizardClassName"); //$NON-NLS-1$ baseaction = (!XMetaDataLoader.hasAttribute(el, "BaseActionName")) ? null : //$NON-NLS-1$ el.getAttribute("BaseActionName"); //$NON-NLS-1$ isSave2ModelRequired = XModelObjectConstants.YES.equals(el.getAttribute("SAVE_REQUIRED")); //$NON-NLS-1$ hide = el.getAttribute("HIDE"); //$NON-NLS-1$ Element[] cs = XMetaDataLoader.getChildrenElements(el, "EntityData"); //$NON-NLS-1$ data = new XEntityDataImpl[cs.length]; for (int i = 0; i < cs.length; i++) { data[i] = new XEntityDataImpl(); ((XEntityDataImpl)data[i]).load(cs[i]); } String callbackname = el.getAttribute("CallBackClassName"); //$NON-NLS-1$ if(callbackname != null && callbackname.length() > 0) { ModelPlugin.getPluginLog().logInfo("Warning: callback=" + callbackname); //$NON-NLS-1$ } } boolean hide0(boolean enabled) { return hide.equals(HIDE_ALWAYS) || (!enabled && hide.equals(HIDE_DISABLED)); } public XActionItem copy(XActionItem.Acceptor acceptor) { return (acceptor.accepts(this)) ? this : null; } // dirty hacks /* * Should be called only through AbstractHandler */ void setWizardClassName(String wizard) { this.wizard = wizard; } /* * universal help action */ private static XAction help = null; public static XAction getHelpAction() { if(help != null) return help; XActionImpl a = new XActionImpl(); a.handlername = new ClassHolder2(a, "org.jboss.tools.common.meta.help.HelpHandler", "Handlers"); //$NON-NLS-1$ //$NON-NLS-2$ a.setDisplayName("Help"); //$NON-NLS-1$ a.setName("Help"); //$NON-NLS-1$ a.iconname = "action.empty"; //$NON-NLS-1$ a.data = new XEntityDataImpl[0]; return help = a; } /** * TODO move to XModelTestPlugin * @deprecated */ public String testHandler() { if(handlerClassName == null || handlerClassName.trim().length() == 0) { return null; //"handler is not set"; } String cn = expand(handlerClassName, "Handlers"); //$NON-NLS-1$ if(cn == null) { return "cannot expand handler name " + handlerClassName; //$NON-NLS-1$ } Class cls = ModelFeatureFactory.getInstance().getFeatureClass(cn); if(cls == null) { return "cannot load handler class " + cn; //$NON-NLS-1$ } Object h = null; try { h = cls.newInstance(); } catch (NoClassDefFoundError nc) { //just wrong class path in test plugin return null; } catch (InstantiationException e) { return "cannot create handler " + cn; //$NON-NLS-1$ } catch (IllegalAccessException e) { return "cannot create handler " + cn; //$NON-NLS-1$ } if(!(h instanceof XActionHandler)) { return "cannot reduce handler to XActionHandler"; //$NON-NLS-1$ } if(h instanceof DefaultSpecialHandler) { String scn = getProperty("support"); //$NON-NLS-1$ Class scls = ModelFeatureFactory.getInstance().getFeatureClass(scn); if(scls == null) { return "cannot load support class " + scn; //$NON-NLS-1$ } Object so = null; try { so = scls.newInstance(); } catch (IllegalAccessException e) { return "cannot create support " + scn; //$NON-NLS-1$ } catch (InstantiationException e) { return "cannot create support " + scn; //$NON-NLS-1$ } if(!(so instanceof SpecialWizardSupport)) { return "cannot reduce support " + scn + " to SpecialWizardSupport"; //$NON-NLS-1$ //$NON-NLS-2$ } } return null; } public String testEntityData() { if(data == null) return null; for (int i = 0; i < data.length; i++) { XEntityDataImpl d = (XEntityDataImpl)data[i]; if(d.getModelEntity() == null) { return "cannot find entity " + d.getEntityName(); //$NON-NLS-1$ } XAttributeData[] ad = d.getAttributeData(); for (int j = 0; j < ad.length; j++) { XAttributeDataImpl a = (XAttributeDataImpl)ad[j]; if(a.getAttribute() == null) { return "cannot find attribute " + d.getEntityName() + ":" + a.getAttributeName(); //$NON-NLS-1$ //$NON-NLS-2$ } } } return null; } } class ClassHolder2 { private XMetaElementImpl owner = null; private String name = null; private String map = null; public ClassHolder2(XMetaElementImpl owner, String name, String map) { this.owner = owner; this.name = name; this.map = map; } public Object createInstance() { if(name == null || name.trim().length() == 0) return null; validate(); return ModelFeatureFactory.getInstance().createFeatureInstance(name); } private void validate() { if(map == null) return; name = owner.expand(name, map); map = null; } }