/*******************************************************************************
* 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.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.osgi.util.NLS;
import org.jboss.tools.common.java.generation.JavaPropertyGenerator;
import org.jboss.tools.common.model.ServiceDialog;
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.jsf.messages.JSFUIMessages;
import org.jboss.tools.jsf.model.helpers.bean.BeanHelper;
public class AddManagedBeanPropertiesContext {
IType type = null;
Map<String,IJavaElement> properties = null;
boolean[] enablement = new boolean[0];
String[] names = new String[0];
String[] values = new String[0];
public void setType(IType type) {
if(this.type == type) return;
this.type = type;
properties = new HashMap<String,IJavaElement>();
try {
properties = BeanHelper.getJavaProperties(type);
} catch (JavaModelException e) {
//ignore
}
if(properties.size() != enablement.length) {
enablement = new boolean[properties.size()];
names = new String[properties.size()];
values = new String[properties.size()];
}
names = (String[])properties.keySet().toArray(new String[0]);
for (int i = 0; i < names.length; i++) {
enablement[i] = false;
values[i] = ""; //$NON-NLS-1$
}
}
public int size() {
return enablement.length;
}
public boolean isEnabled(int i) {
return i >= 0 && i < size() && enablement[i];
}
public void setEnabled(int i, boolean v) {
if(i >= 0 && i < size()) enablement[i] = v;
}
public String getName(int i) {
return names[i];
}
public String getValue(int i) {
return values[i];
}
public void setValue(int i, String v) {
values[i] = v;
}
public void addProperties(XModelObject bean) throws XModelException, CoreException {
List<PropertyData> toGenerate = new ArrayList<PropertyData>();
int applyForAll = 0;
for (int i = 0; i < names.length; i++) {
if(!enablement[i]) continue;
PropertyData data = new PropertyData();
data.name = names[i];
XModelObject p = bean.getModel().createModelObject("JSFManagedProperty", null); //$NON-NLS-1$
IMember m = (IMember)properties.get(names[i]);
data.type = EclipseJavaUtil.getMemberTypeAsString(m);
p.setAttributeValue("property-name", data.name); //$NON-NLS-1$
p.setAttributeValue("property-class", data.type); //$NON-NLS-1$
p.setAttributeValue("value", values[i]); //$NON-NLS-1$
bean.addChild(p);
if(type.isBinary() || type.isInterface()) continue;
if(m instanceof IMethod) continue;
boolean getter = BeanHelper.findGetter(type, names[i]) != null;
boolean setter = BeanHelper.findSetter(type, names[i]) != null;
if(getter && setter) continue;
if(applyForAll == 0) {
String message = getMessage(getter, setter, names[i]);
ServiceDialog d = bean.getModel().getService();
Properties cp = new Properties();
cp.setProperty(ServiceDialog.DIALOG_MESSAGE, message);
cp.put(ServiceDialog.CHECKED, Boolean.FALSE);
cp.setProperty(ServiceDialog.CHECKBOX_MESSAGE, JSFUIMessages.APPLY_FOR_ALL_PROPERTIES);
cp.put(ServiceDialog.BUTTONS, new String[]{JSFUIMessages.YES, JSFUIMessages.NO});
boolean q = d.openConfirm(cp);
boolean b = ((Boolean)cp.get(ServiceDialog.CHECKED)).booleanValue();
if(b) applyForAll = (q) ? 1 : -1;
if(q) {
data.getter = !getter;
data.setter = !setter;
toGenerate.add(data);
}
} else if(applyForAll > 0) {
data.getter = !getter;
data.setter = !setter;
toGenerate.add(data);
}
}
PropertyData[] datas = toGenerate.toArray(new PropertyData[0]);
JavaPropertyGenerator g = new JavaPropertyGenerator();
g.setOwner(type);
for (int i = 0; i < datas.length; i++) {
g.generate(datas[i].name, datas[i].type, "public", false, datas[i].getter, datas[i].setter); //$NON-NLS-1$
}
}
private String getMessage(boolean getter, boolean setter, String name){
if(!getter && !setter) {
return NLS.bind(JSFUIMessages.ADD_GETTER_SETTER_FOR_PROPERTY, name);
}
if (!getter && setter){
return NLS.bind(JSFUIMessages.ADD_GETTER_FOR_PROPERTY, name);
}
return NLS.bind(JSFUIMessages.ADD_SETTER_FOR_PROPERTY, name);
}
class PropertyData {
String name;
String type;
boolean getter;
boolean setter;
}
}