-
Notifications
You must be signed in to change notification settings - Fork 54
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
cb559b6
commit 0c0584a
Showing
3 changed files
with
174 additions
and
45 deletions.
There are no files selected for viewing
138 changes: 138 additions & 0 deletions
138
elements/src/main/java/com/manydesigns/elements/fields/ListField.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,138 @@ | ||
package com.manydesigns.elements.fields; | ||
|
||
import com.manydesigns.elements.KeyValueAccessor; | ||
import com.manydesigns.elements.Mode; | ||
import com.manydesigns.elements.forms.Form; | ||
import com.manydesigns.elements.forms.FormBuilder; | ||
import com.manydesigns.elements.forms.TableForm; | ||
import com.manydesigns.elements.forms.TableFormBuilder; | ||
import com.manydesigns.elements.reflection.ClassAccessor; | ||
import com.manydesigns.elements.reflection.PropertyAccessor; | ||
import com.manydesigns.elements.reflection.factories.ClassAccessorFactories; | ||
import com.manydesigns.elements.xml.XhtmlBuffer; | ||
import org.apache.commons.lang3.StringUtils; | ||
import org.jetbrains.annotations.NotNull; | ||
import org.jetbrains.annotations.Nullable; | ||
|
||
import javax.servlet.http.HttpServletRequest; | ||
|
||
public class ListField extends AbstractField<Object> { | ||
|
||
protected final ClassAccessor classAccessor; | ||
protected final String prefix; | ||
protected Object value; | ||
private TableForm form; | ||
|
||
public ListField(@NotNull PropertyAccessor accessor, @NotNull Mode mode, @Nullable String prefix) { | ||
super(accessor, mode, prefix); | ||
this.prefix = prefix; | ||
classAccessor = ClassAccessorFactories.get(accessor.getType()); | ||
} | ||
|
||
protected TableForm ensureForm() { | ||
if (form == null) { | ||
form = new TableFormBuilder(classAccessor) | ||
.configPrefix(StringUtils.defaultString(prefix) + accessor.getName() + ".") | ||
.build(); | ||
} | ||
return form; | ||
} | ||
|
||
public ListField(@NotNull PropertyAccessor accessor, @NotNull Mode mode) { | ||
this(accessor, mode, null); | ||
} | ||
|
||
@Override | ||
public boolean validate() { | ||
errors.clear(); | ||
if (isRequired() && value == null) { | ||
errors.add(getText("elements.error.field.required")); | ||
return false; | ||
} | ||
return ensureForm().validate(); | ||
} | ||
|
||
@Override | ||
public boolean isValid() { | ||
return super.isValid() && ensureForm().isValid(); | ||
} | ||
|
||
@Override | ||
public void writeToObject(Object obj) { | ||
ensureForm().writeToObject(accessor.get(obj)); | ||
} | ||
|
||
@Override | ||
public void valueToXhtml(XhtmlBuffer xb) { | ||
ensureForm().toXhtml(xb); | ||
} | ||
|
||
@Override | ||
public String getStringValue() { | ||
return null; | ||
} | ||
|
||
@Override | ||
public void setStringValue(String stringValue) { | ||
throw new UnsupportedOperationException(); | ||
} | ||
|
||
@Override | ||
public Object getValue() { | ||
return value; | ||
} | ||
|
||
@Override | ||
public void setValue(Object value) { | ||
this.value = value; | ||
ensureForm().readFromObject(value); | ||
} | ||
|
||
@Override | ||
public void readFromRequest(HttpServletRequest req) { | ||
super.readFromRequest(req); | ||
if (mode.isView(insertable, updatable)) { | ||
return; | ||
} | ||
ensureForm().readFromRequest(req); | ||
setValueFromForm(); | ||
} | ||
|
||
@Override | ||
public void readFromObject(Object obj) { | ||
super.readFromObject(obj); | ||
if (obj == null) { | ||
setValue(null); | ||
} else { | ||
setValue(accessor.get(obj)); | ||
} | ||
} | ||
|
||
@Override | ||
public void readFrom(KeyValueAccessor keyValueAccessor) { | ||
if (isReadOnly()) { | ||
return; | ||
} | ||
if(!keyValueAccessor.has(accessor.getName())) { | ||
setValue(null); | ||
return; | ||
} | ||
bulkChecked = true; | ||
Object value = keyValueAccessor.get(accessor.getName()); | ||
if (value == null) { | ||
setValue(null); | ||
} else { | ||
ensureForm().readFrom(keyValueAccessor.inner(value)); | ||
setValueFromForm(); | ||
} | ||
} | ||
|
||
protected void setValueFromForm() { | ||
Object object = classAccessor.newInstance(); | ||
if (object == null) { | ||
throw new IllegalStateException("Could not create an instance using " + classAccessor); | ||
} | ||
ensureForm().writeToObject(object); | ||
this.value = object; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -22,6 +22,7 @@ | |
|
||
import com.manydesigns.elements.Element; | ||
import com.manydesigns.elements.ElementsProperties; | ||
import com.manydesigns.elements.KeyValueAccessor; | ||
import com.manydesigns.elements.annotations.Help; | ||
import com.manydesigns.elements.composites.AbstractCompositeElement; | ||
import com.manydesigns.elements.fields.Field; | ||
|
@@ -36,9 +37,7 @@ | |
|
||
import javax.servlet.http.HttpServletRequest; | ||
import java.lang.reflect.Array; | ||
import java.util.Collection; | ||
import java.util.HashMap; | ||
import java.util.Map; | ||
import java.util.*; | ||
|
||
/* | ||
* @author Paolo Predonzani - [email protected] | ||
|
@@ -53,7 +52,7 @@ public class TableForm implements Element { | |
protected String selectInputName = "select"; | ||
|
||
protected final Column[] columns; | ||
protected final Row[] rows; | ||
protected final List<Row> rows = new ArrayList<>(); | ||
|
||
protected String prefix; | ||
|
||
|
@@ -70,14 +69,8 @@ public class TableForm implements Element { | |
// Costruttori | ||
//************************************************************************** | ||
|
||
public TableForm(int nRows, PropertyAccessor... propertyAccessors) { | ||
rows = new Row[nRows]; | ||
public TableForm(PropertyAccessor... propertyAccessors) { | ||
columns = new Column[propertyAccessors.length]; | ||
|
||
for (int i = 0; i < nRows; i++) { | ||
rows[i] = new Row(i); | ||
} | ||
|
||
for (int i = 0; i < columns.length; i++) { | ||
columns[i] = new Column(propertyAccessors[i]); | ||
} | ||
|
@@ -144,7 +137,7 @@ public void toXhtml(@NotNull XhtmlBuffer xb) { | |
xb.closeElement("tr"); | ||
xb.closeElement("thead"); | ||
|
||
if(rows.length > 0) { | ||
if(!rows.isEmpty()) { | ||
xb.openElement("tbody"); | ||
for (Row row : rows) { | ||
row.toXhtml(xb); | ||
|
@@ -161,6 +154,19 @@ public void readFromRequest(HttpServletRequest req) { | |
} | ||
} | ||
|
||
@Override | ||
public void readFrom(KeyValueAccessor keyValueAccessor) { | ||
Object object = keyValueAccessor.get(); | ||
if (object instanceof Iterable) { | ||
Iterator<?> iterator = ((Iterable<?>) object).iterator(); | ||
for (Row row : rows) { | ||
if (iterator.hasNext()) { | ||
row.readFrom(keyValueAccessor.inner(iterator.next())); | ||
} | ||
} | ||
} | ||
} | ||
|
||
public boolean validate() { | ||
boolean result = true; | ||
for (Row row : rows) { | ||
|
@@ -221,15 +227,15 @@ public void writeToObject(Object obj) { | |
final int arrayLength = Array.getLength(obj); | ||
for (int i = 0; i < arrayLength; i++) { | ||
Object currentObj = Array.get(obj, i); | ||
rows[i].writeToObject(currentObj); | ||
rows.get(i).writeToObject(currentObj); | ||
} | ||
} else if (Collection.class.isAssignableFrom(clazz)) { | ||
// Tratta obj come collection | ||
Collection collection = (Collection)obj; | ||
|
||
int i = 0; | ||
for (Object currentObj : collection) { | ||
rows[i].writeToObject(currentObj); | ||
rows.get(i).writeToObject(currentObj); | ||
i++; | ||
} | ||
} | ||
|
@@ -267,8 +273,8 @@ public Column[] getColumns() { | |
return columns; | ||
} | ||
|
||
public Row[] getRows() { | ||
return rows; | ||
public List<Row> getRows() { | ||
return Collections.unmodifiableList(rows); | ||
} | ||
|
||
public String getPrefix() { | ||
|
@@ -357,6 +363,13 @@ public void readFromRequest(HttpServletRequest req) { | |
} | ||
} | ||
|
||
@Override | ||
public void readFrom(KeyValueAccessor keyValueAccessor) { | ||
for (Field current : this) { | ||
current.readFrom(keyValueAccessor); | ||
} | ||
} | ||
|
||
public boolean validate() { | ||
boolean result = true; | ||
for (Field current : this) { | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters