/**
* ***************************************************************************
* Copyright (c) 2010 Qcadoo Limited
* Project: Qcadoo Framework
* Version: 1.4
*
* This file is part of Qcadoo.
*
* Qcadoo is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation; either version 3 of the License,
* or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* ***************************************************************************
*/
package com.qcadoo.view.internal.components.awesomeDynamicList;
import com.google.common.collect.Lists;
import com.qcadoo.model.api.Entity;
import com.qcadoo.view.api.components.AwesomeDynamicListComponent;
import com.qcadoo.view.api.components.FormComponent;
import com.qcadoo.view.internal.api.ContainerState;
import com.qcadoo.view.internal.api.InternalComponentState;
import com.qcadoo.view.internal.api.InternalViewDefinitionState;
import com.qcadoo.view.internal.components.FieldComponentState;
import com.qcadoo.view.internal.components.form.FormComponentPattern;
import com.qcadoo.view.internal.components.form.FormComponentState;
import com.qcadoo.view.internal.internal.ViewDefinitionStateImpl;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.*;
import static com.google.common.base.Preconditions.checkNotNull;
public class AwesomeDynamicListState extends FieldComponentState implements AwesomeDynamicListComponent, ContainerState {
public static final String JSON_FORM_VALUES = "forms";
private final AwesomeDynamicListModelUtils awesomeDynamicListModelUtils;
private final FormComponentPattern innerFormPattern;
private List<FormComponentState> forms;
public AwesomeDynamicListState(final AwesomeDynamicListPattern pattern, final FormComponentPattern innerFormPattern) {
super(pattern);
this.innerFormPattern = innerFormPattern;
this.awesomeDynamicListModelUtils = new AwesomeDynamicListModelUtilsImpl();
}
@Override
protected void initializeContent(final JSONObject json) throws JSONException {
if (json.has(JSON_FORM_VALUES)) {
forms = new LinkedList<FormComponentState>();
JSONArray formValues = json.getJSONArray(JSON_FORM_VALUES);
for (int i = 0; i < formValues.length(); i++) {
JSONObject value = formValues.getJSONObject(i);
String formName = value.getString("name");
JSONObject formValue = value.getJSONObject("value");
InternalViewDefinitionState innerFormState = new ViewDefinitionStateImpl();
FormComponentState formState = (FormComponentState) innerFormPattern.createComponentState(innerFormState);
formState.setName(formName);
innerFormPattern.updateComponentStateListeners(innerFormState);
formState.initialize(formValue, getLocale());
forms.add(formState);
}
}
}
@SuppressWarnings("unchecked")
@Override
public void setFieldValue(final Object value) {
requestRender();
forms = new LinkedList<FormComponentState>();
if ((value != null) && (value instanceof List)) {
List<Entity> entities = (List<Entity>) value;
for (Entity entity : entities) {
InternalViewDefinitionState innerFormState = new ViewDefinitionStateImpl();
FormComponentState formState = (FormComponentState) innerFormPattern.createComponentState(innerFormState);
innerFormPattern.updateComponentStateListeners(innerFormState);
try {
formState.initialize(new JSONObject(), getLocale());
} catch (JSONException e) {
throw new IllegalStateException(e);
}
formState.setEntity(entity);
forms.add(formState);
}
}
}
@Override
public Object getFieldValue() {
return getEntities();
}
@Override
public List<Entity> getEntities() {
List<Entity> entities = new LinkedList<Entity>();
for (FormComponent form : forms) {
Entity e = form.getEntity();
awesomeDynamicListModelUtils.proxyBelongsToFields(e);
entities.add(e);
}
return entities;
}
@Override
public JSONObject render() throws JSONException {
JSONObject json = super.render();
if (!json.has(JSON_CONTENT)) {
JSONObject childerJson = new JSONObject();
for (FormComponentState form : forms) {
childerJson.put(form.getName(), form.render());
}
JSONObject content = new JSONObject();
content.put("innerFormChanges", childerJson);
json.put(JSON_CONTENT, content);
}
return json;
}
@Override
protected JSONObject renderContent() throws JSONException {
JSONObject json = new JSONObject();
JSONArray formValues = new JSONArray();
for (FormComponentState formState : forms) {
formValues.put(formState.render());
}
json.put(JSON_FORM_VALUES, formValues);
json.put(JSON_REQUIRED, isRequired());
return json;
}
@Override
public Map<String, InternalComponentState> getChildren() {
Map<String, InternalComponentState> children = new HashMap<String, InternalComponentState>();
for (FormComponentState form : forms) {
children.put(form.getName(), form);
}
return children;
}
@Override
public InternalComponentState getChild(final String name) {
for (FormComponentState form : forms) {
if (name.equals(form.getName())) {
return form;
}
}
return null;
}
@Override
public void addChild(final InternalComponentState state) {
}
@Override
public boolean isHasError() {
for (FormComponent form : forms) {
if (form.isHasError()) {
return true;
}
}
return false;
}
@Override
public List<FormComponent> getFormComponents() {
List<FormComponent> formComponents = Lists.newArrayList();
for (FormComponent form : forms) {
formComponents.add(form);
}
return formComponents;
}
@Override
public FormComponent getFormComponent(final Long id) {
checkNotNull(id, "id must be given");
for (FormComponent form : forms) {
if (id.equals(form.getEntityId())) {
return form;
}
}
return null;
}
@Override
public InternalComponentState findChild(final String reference) {
InternalComponentState component = null;
for (FormComponent form : getFormComponents()) {
component = (InternalComponentState) form.findFieldComponentByName(reference);
}
return component;
}
}