blob: 8ed778068ad147738792ca77c511dc109593ae82 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010-2014 SAP AG and others.
* All rights reserved. This program and the accompanying materials
* are 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:
* SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.skalli.view.ext;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.skalli.model.ExtensionEntityBase;
import org.eclipse.skalli.model.Project;
import org.eclipse.skalli.model.PropertyName;
import org.eclipse.skalli.services.template.ProjectTemplate;
import com.vaadin.data.Item;
import com.vaadin.ui.Form;
import com.vaadin.ui.FormFieldFactory;
/**
* Base class for the implementation of {@link ExtensionFormService}.
*/
public abstract class AbstractExtensionFormService<T extends ExtensionEntityBase>
implements ExtensionFormService<T> {
protected static final String STYLE_PROJECT_EDIT_FORM = "prjedt-form-default"; //$NON-NLS-1$
@Override
public Form createForm(Project project, ProjectEditContext context) {
ProjectTemplate projectTemplate = context.getProjectTemplate();
Form form = new Form();
form.setWriteThrough(false); // we want explicit 'apply'
form.setInvalidCommitted(false); // no invalid values in datamodel
form.addStyleName(getFormStyleName());
form.setValidationVisible(false); // we use our own issue markers
// FieldFactory for customizing the fields and adding validators
FormFieldFactory fieldFactory = getFieldFactory(project, context);
if (fieldFactory != null) {
form.setFormFieldFactory(fieldFactory);
}
// Determine which properties are shown, and in which order:
List<String> visibleItemProperties = new ArrayList<String>();
for (String propertyId : getVisibleItemProperties()) {
if (!projectTemplate.isHidden(getExtensionClass().getName(), propertyId, context.isAdministrator())) {
visibleItemProperties.add(propertyId);
}
}
// Bind to data source
Item itemDataSource = getItemDataSource(project);
if (itemDataSource != null) {
form.setItemDataSource(itemDataSource, visibleItemProperties);
} else {
form.setVisibleItemProperties(visibleItemProperties);
}
return form;
}
@Override
public boolean listenOnPropertyChanged(String extensionClassName, String propertyId, Object newValue) {
return false;
}
/**
* Determines which properties should be visible in the edit form.
*
* <p>
* As a default, all {@link PropertyName} from the model are returned.
* The order is determined by the {@link PropertyName#position()} attribute.
* </p>
* <p>
* Override this method if this default does not fit.
* </p>
*
* @return
*/
protected String[] getVisibleItemProperties() {
List<Field> fields = new LinkedList<Field>();
final T instance = newExtensionInstance();
for (Field field : getExtensionClass().getDeclaredFields()) {
PropertyName propName = field.getAnnotation(PropertyName.class);
if (propName != null && propName.position() >= 0) {
fields.add(field);
}
}
Collections.sort(fields, new Comparator<Field>() {
@Override
public int compare(Field o1, Field o2) {
int ret = 0;
int i1 = o1.getAnnotation(PropertyName.class).position();
int i2 = o2.getAnnotation(PropertyName.class).position();
ret = Integer.valueOf(i1).compareTo(i2);
if (ret == 0) {
String c1 = getFieldContents(o1, instance);
String c2 = getFieldContents(o2, instance);
ret = c1.compareTo(c2);
}
return ret;
}
});
List<String> ret = new LinkedList<String>();
for (Field field : fields) {
ret.add(getFieldContents(field, instance));
}
return ret.toArray(new String[ret.size()]);
}
private String getFieldContents(Field field, T instance) {
try {
return field.get(instance).toString();
} catch (IllegalArgumentException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
abstract protected FormFieldFactory getFieldFactory(Project project, ProjectEditContext context);
abstract protected Item getItemDataSource(Project project);
protected String getFormStyleName() {
return STYLE_PROJECT_EDIT_FORM;
}
protected T getExtension(Project project) {
Class<T> extensionClass = getExtensionClass();
T extension = project.getExtension(extensionClass);
if (extension == null) {
// in case ther is no suitable extension, i.e. extension is inherited
// but there is no parent, just return an empty extension instance
extension = newExtensionInstance();
}
return extension;
}
}