/******************************************************************************* * 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.jsf.model.handlers.bean; import java.util.*; import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IMember; import org.eclipse.jdt.core.JavaModelException; import org.jboss.tools.common.java.generation.*; import org.jboss.tools.common.meta.action.*; import org.jboss.tools.common.meta.action.impl.*; import org.jboss.tools.common.meta.action.impl.handlers.DefaultCreateHandler; import org.jboss.tools.common.meta.constraint.impl.XAttributeConstraintJavaName; import org.jboss.tools.common.model.XModelException; import org.jboss.tools.common.model.XModelObject; import org.jboss.tools.common.model.util.EclipseJavaUtil; import org.jboss.tools.common.model.util.XModelObjectLoaderUtil; import org.jboss.tools.jsf.model.handlers.ChangeContentKindHandler; import org.jboss.tools.jsf.model.helpers.bean.BeanHelper; public class AddManagedPropertySupport extends SpecialWizardSupport { ClassExistsCheck classCheck = new ClassExistsCheck(); JavaPropertyGenerator generator = new JavaPropertyGenerator(); XAttributeConstraintJavaName constraint = new XAttributeConstraintJavaName(); Map<String,IJavaElement> fields; boolean isLight = false; XEntityData lightData = XEntityDataImpl.create(new String[][]{ {"AddJSFManagedPropertyWizard", "yes"}, //$NON-NLS-1$ //$NON-NLS-2$ {"property-name", "yes"}, //$NON-NLS-1$ //$NON-NLS-2$ {"property-class", "no"}, //$NON-NLS-1$ //$NON-NLS-2$ {"value-kind", "no"}, //$NON-NLS-1$ //$NON-NLS-2$ {"value", "no"} //$NON-NLS-1$ //$NON-NLS-2$ }); public void reset() { if(isLight) { XEntityData d = getEntityData()[0]; getEntityData()[0] = lightData; XAttributeData[] ad = d.getAttributeData(); for (int i = 0; i < ad.length; i++) { String n = ad[i].getAttribute().getName(); lightData.setValue(n, d.getValue(n)); } } if(ChangeContentKindHandler.isNewValueKind(getTarget(), "properties") && //$NON-NLS-1$ !ChangeContentKindHandler.checkChangeSignificance(getTarget())) { setFinished(true); return; } classCheck.setModelContext(getTarget()); String s = getTarget().getAttributeValue("managed-bean-class"); //$NON-NLS-1$ if(s == null) s = ""; //$NON-NLS-1$ classCheck.update(s); try { fields = BeanHelper.getJavaProperties(classCheck.getExistingClass()); } catch (JavaModelException e) { fields = new TreeMap<String,IJavaElement>(); } XModelObject[] cs = getTarget().getChildren("JSFManagedProperty"); //$NON-NLS-1$ for (int i = 0; i < cs.length; i++) fields.remove(cs[i].getAttributeValue("property-name")); //$NON-NLS-1$ String[] fs = (String[])fields.keySet().toArray(new String[0]); setValueList(0, "property-name", fs); //$NON-NLS-1$ if(isLight) setAttributeValue(0, "add java property", "false"); //$NON-NLS-1$ //$NON-NLS-2$ } public void action(String name) throws XModelException { if(FINISH.equals(name)) { execute(); setFinished(true); } else if(CANCEL.equals(name)) { setFinished(true); } else if(HELP.equals(name)) { help(); } } public String[] getActionNames(int stepId) { return new String[]{FINISH, CANCEL, HELP}; } void execute() throws XModelException { Properties p = extractStepData(0); getTarget().setAttributeValue("content-kind", "properties"); //$NON-NLS-1$ //$NON-NLS-2$ String entity = action.getProperty("entity"); //$NON-NLS-1$ XModelObject c = XModelObjectLoaderUtil.createValidObject(getTarget().getModel(), entity, p); DefaultCreateHandler.addCreatedObject(getTarget(), c, getProperties()); getProperties().put("created", c); //$NON-NLS-1$ if(!isGenerationOn(p)) return; try { generate(p); } catch (CoreException e) { throw new XModelException(e); } } boolean isGenerationOn(Properties p) { if(!"true".equals(p.getProperty("add java property"))) return false; //$NON-NLS-1$ //$NON-NLS-2$ if(!isFieldEditorEnabled(0, "add java property", p)) return false; //$NON-NLS-1$ return true; } public boolean isFieldEditorEnabled(int stepId, String name, Properties values) { String pn = values.getProperty("property-name"); //$NON-NLS-1$ String vk = values.getProperty("value-kind"); //$NON-NLS-1$ boolean canGenerate = classCheck.isValid() && classCheck.classExists() && !classCheck.getExistingClass().isBinary(); boolean canGenerateField = !fields.containsKey(pn); if("add java property".equals(name)) { //$NON-NLS-1$ return !isLight && canGenerate && canGenerateField; } if("generate getter".equals(name) || "generate setter".equals(name)) { //$NON-NLS-1$ //$NON-NLS-2$ boolean agp = "true".equals(values.getProperty("add java property")); //$NON-NLS-1$ //$NON-NLS-2$ return agp && canGenerate && canGenerateField; } else if("value".equals(name)) { //$NON-NLS-1$ return "value".equals(vk); //$NON-NLS-1$ } return true; } public String getFieldType(String name) { IMember m = (IMember)fields.get(name); return (m == null) ? null : EclipseJavaUtil.getMemberTypeAsString(m); } void generate(Properties p) throws CoreException { generator.setOwner(classCheck.getExistingClass()); String type = p.getProperty("property-class"); //$NON-NLS-1$ if(type.length() == 0) type = "String"; //$NON-NLS-1$ String name = p.getProperty("property-name"); //$NON-NLS-1$ boolean getter = "true".equals(p.getProperty("generate getter")); //$NON-NLS-1$ //$NON-NLS-2$ boolean setter = "true".equals(p.getProperty("generate setter")); //$NON-NLS-1$ //$NON-NLS-2$ generator.generate(name, type, "public", true, getter, setter); //$NON-NLS-1$ } public String getStepImplementingClass(int stepId) { return "org.jboss.tools.jsf.ui.wizard.bean.AddManagedBeanPropertyScreen"; //$NON-NLS-1$ } protected DefaultWizardDataValidator validator = new PropertyValidator(); public WizardDataValidator getValidator(int step) { validator.setSupport(this, step); return validator; } class PropertyValidator extends DefaultWizardDataValidator { public void validate(Properties data) { super.validate(data); if(message != null) return; String propertyName = data.getProperty("property-name"); //$NON-NLS-1$ message = DefaultCreateHandler.getConstraintMessage("property-name", propertyName, constraint); //$NON-NLS-1$ } } }