/*
* Copyright 2014-2015 CyberVision, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.kaaproject.avro.ui.shared;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ArrayField extends FormField {
private static final long serialVersionUID = -1859402253654290694L;
public static enum OverrideStrategy {
APPEND,
REPLACE
}
private FormField elementMetadata;
private List<FormField> value;
private int minRowCount = 0;
private OverrideStrategy overrideStrategy;
public ArrayField() {
super();
value = new ArrayList<>();
}
public ArrayField(FormContext context,
String fieldName,
String displayName,
String schema,
boolean optional) {
super(context, fieldName, displayName, schema, optional);
value = new ArrayList<>();
}
public FormField getElementMetadata() {
return elementMetadata;
}
public void setElementMetadata(FormField elementMetadata) {
this.elementMetadata = elementMetadata;
}
public List<FormField> getValue() {
return value;
}
public int getMinRowCount() {
return minRowCount;
}
public void setMinRowCount(int minRowCount) {
this.minRowCount = minRowCount;
if (minRowCount == 0) {
setOptional(true);
}
}
public FormField createRow() {
FormField row = elementMetadata.clone();
row.finalizeMetadata();
return row;
}
public void removeRow(int index) {
if (index > -1 && index < value.size()) {
FormField field = value.remove(index);
if (field != null) {
field.dispose();
}
}
}
public OverrideStrategy getOverrideStrategy() {
return overrideStrategy;
}
public void setOverrideStrategy(OverrideStrategy overrideStrategy) {
this.overrideStrategy = overrideStrategy;
}
@Override
public String getDisplayString() {
return super.getDisplayString() + ": " + elementMetadata.getDisplayName() +" (" + value.size() + " rows)";
}
@Override
public FieldType getFieldType() {
return FieldType.ARRAY;
}
@Override
public boolean isNull() {
return false;
}
public void addArrayData(FormField data) {
data.setRowIndex(value.size());
data.setParentField(this);
this.value.add(data);
}
@Override
public void finalizeMetadata() {
if (elementMetadata != null) {
elementMetadata.finalizeMetadata();
elementMetadata.disableOverride();
}
for (FormField field : value) {
field.finalizeMetadata();
field.disableOverride();
}
}
@Override
protected FormField createInstance() {
return new ArrayField();
}
@Override
protected void copyFields(FormField cloned, boolean deepCopy) {
super.copyFields(cloned, deepCopy);
ArrayField clonedArrayField = (ArrayField)cloned;
clonedArrayField.minRowCount = minRowCount;
clonedArrayField.elementMetadata = elementMetadata.clone();
for (FormField field : value) {
FormField clonedField = field.clone();
clonedField.setParentField(clonedArrayField);
clonedArrayField.value.add(clonedField);
}
clonedArrayField.overrideStrategy = overrideStrategy;
}
@Override
public boolean isValid() {
if (isOverride() && !isChanged()) {
return true;
} else if (isOptional()) {
if (value.size() > 0) {
return valid();
} else {
return true;
}
} else {
return valid();
}
}
@Override
protected boolean valid() {
if (value.size() > 0 && value.size() >= minRowCount) {
boolean valid = true;
for (FormField field : value) {
valid &= field.isValid();
}
return valid;
}
return false;
}
@Override
public void dispose() {
if (elementMetadata != null) {
elementMetadata.dispose();
}
for (FormField field : value) {
field.dispose();
}
super.dispose();
}
@Override
public Iterator<FormField> iterator() {
return FormFieldIterator.concatItemWithCollection(this, value).iterator();
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result
+ ((elementMetadata == null) ? 0 : elementMetadata.hashCode());
result = prime * result + minRowCount;
result = prime
* result
+ ((overrideStrategy == null) ? 0 : overrideStrategy.hashCode());
result = prime * result + ((value == null) ? 0 : value.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
if (getClass() != obj.getClass())
return false;
ArrayField other = (ArrayField) obj;
if (elementMetadata == null) {
if (other.elementMetadata != null)
return false;
} else if (!elementMetadata.equals(other.elementMetadata))
return false;
if (minRowCount != other.minRowCount)
return false;
if (overrideStrategy != other.overrideStrategy)
return false;
if (value == null) {
if (other.value != null)
return false;
} else if (!value.equals(other.value))
return false;
return true;
}
}