package org.sigmah.offline.js; /* * #%L * Sigmah * %% * Copyright (C) 2010 - 2016 URD * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU 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 General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ import java.util.ArrayList; import java.util.List; import org.sigmah.shared.command.GetValue; import org.sigmah.shared.command.UpdateProject; import org.sigmah.shared.command.result.ValueResult; import org.sigmah.shared.dto.element.FlexibleElementDTO; import org.sigmah.shared.dto.element.event.ValueEventWrapper; import org.sigmah.shared.dto.referential.ValueEventChangeType; import org.sigmah.shared.dto.value.ListableValue; import org.sigmah.shared.dto.value.TripletValueDTO; import com.allen_sauer.gwt.log.client.Log; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; /** * JavaScript object storing the value of a flexible element. * * @author Raphaƫl Calabro (rcalabro@ideia.fr) */ public final class ValueJS extends JavaScriptObject { protected ValueJS() { // Empty. } public static ValueJS toJavaScript(final String value, final FlexibleElementDTO element, final int projectId) { final ValueJS valueJS = Values.createJavaScriptObject(ValueJS.class); valueJS.setId(ValueJSIdentifierFactory.toIdentifier(element.getEntityName(), projectId, element.getId(), null)); valueJS.setElementEntityName(element.getEntityName()); valueJS.setProjectId(projectId); valueJS.setElementId(element.getId()); valueJS.setAmendmentId(null); valueJS.setValue(value); valueJS.setAmendment(false); return valueJS; } public static ValueJS toJavaScript(GetValue getValue, ValueResult valueResult) { final ValueJS valueJS = Values.createJavaScriptObject(ValueJS.class); valueJS.setId(ValueJSIdentifierFactory.toIdentifier(getValue)); valueJS.setElementEntityName(getValue.getElementEntityName()); valueJS.setProjectId(getValue.getProjectId()); valueJS.setElementId(getValue.getElementId()); valueJS.setAmendmentId(getValue.getAmendmentId()); valueJS.setValue(valueResult.getValueObject()); valueJS.setValues(valueResult.getValuesObject()); valueJS.setAmendment(valueResult.isAmendment()); return valueJS; } public static ValueJS toJavaScript(UpdateProject updateProject, ValueEventWrapper valueEventWrapper) { return toJavaScript(updateProject, valueEventWrapper, null); } public static ValueJS toJavaScript(UpdateProject updateProject, ValueEventWrapper valueEventWrapper, ValueResult originalValue) { final ValueJS valueJS = Values.createJavaScriptObject(ValueJS.class); valueJS.setId(ValueJSIdentifierFactory.toIdentifier(updateProject, valueEventWrapper)); valueJS.setElementEntityName(valueEventWrapper.getSourceElement().getEntityName()); valueJS.setProjectId(updateProject.getProjectId()); valueJS.setElementId(valueEventWrapper.getSourceElement().getId()); valueJS.setAmendmentId(null); if (originalValue != null) { valueJS.setValue(originalValue.getValueObject()); valueJS.setValues(originalValue.getValuesObject()); valueJS.setAmendment(originalValue.isAmendment()); } valueJS.update(valueEventWrapper); valueJS.setChangeType(valueEventWrapper.getChangeType()); valueJS.setProjectCountryChanged(valueEventWrapper.isProjectCountryChanged()); valueJS.setSourceElement(FlexibleElementJS.toJavaScript(valueEventWrapper.getSourceElement())); return valueJS; } public ValueResult toValueResult() { final ValueResult valueResult = new ValueResult(); valueResult.setAmendment(isAmendment()); valueResult.setValueObject(getValue()); final JsArray<ListableValueJS> values = getValues(); if (values != null) { final ArrayList<ListableValue> list = new ArrayList<ListableValue>(); for (int index = 0; index < values.length(); index++) { list.add(values.get(index).toDTO()); } valueResult.setValuesObject(list); } return valueResult; } public ValueEventWrapper toValueEventWrapper() { final ValueEventWrapper valueEventWrapper = new ValueEventWrapper(); valueEventWrapper.setChangeType(getChangeTypeEnum()); valueEventWrapper.setProjectCountryChanged(isProjectCountryChanged()); valueEventWrapper.setSingleValue(getValue()); // TODO: set multivalued values if (getValues() != null && getValues().length() == 1) { final ListableValue listableValue = getValues().get(0).toDTO(); if (listableValue instanceof TripletValueDTO) { valueEventWrapper.setTripletValue((TripletValueDTO)listableValue); } } if (getSourceElement() != null) { valueEventWrapper.setSourceElement(getSourceElement().toDTO()); } return valueEventWrapper; } public void update(ValueEventWrapper valueEventWrapper) { setValue(valueEventWrapper.getSingleValue()); if(valueEventWrapper.getTripletValue() instanceof ListableValue) { JsArray<ListableValueJS> values = getValues(); if (values == null) { values = (JsArray<ListableValueJS>) JavaScriptObject.createArray(); setValues(values); } switch(valueEventWrapper.getChangeType()) { case ADD: values.push(ListableValueJS.toJavaScript(valueEventWrapper.getTripletValue())); break; case REMOVE: final JsArray<ListableValueJS> trimmedArray = (JsArray<ListableValueJS>) JavaScriptObject.createArray(); for (int index = 0; index < values.length(); index++) { final ListableValueJS entry = values.get(index); if(entry.getId() != valueEventWrapper.getTripletValue().getId()) { trimmedArray.push(entry); } else { Log.info("Removing entry " + entry.getId() + " from " + getId()); } } setValues(trimmedArray); break; default: break; } } } public native String getId() /*-{ return this.id; }-*/; public native void setId(String id) /*-{ this.id = id; }-*/; public native String getElementEntityName() /*-{ return this.elementEntityName; }-*/; public native void setElementEntityName(String elementEntityName) /*-{ this.elementEntityName = elementEntityName; }-*/; public native int getProjectId() /*-{ return this.projectId; }-*/; public native void setProjectId(int projectId) /*-{ this.projectId = projectId; }-*/; public native int getElementId() /*-{ return this.elementId; }-*/; public native void setElementId(int elementId) /*-{ this.elementId = elementId; }-*/; public native int getAmendmentId() /*-{ return this.amendmentId; }-*/; public void setAmendmentId(Integer amendmentId) { if (amendmentId != null) { setAmendmentId(amendmentId.intValue()); } } public native void setAmendmentId(int amendmentId) /*-{ this.amendmentId = amendmentId; }-*/; public native String getValue() /*-{ return this.value; }-*/; public native void setValue(String value) /*-{ this.value = value; }-*/; public native <T extends ListableValueJS> JsArray<T> getValues() /*-{ return this.values; }-*/; public void setValues(List<ListableValue> values) { if (values != null) { final JsArray<ListableValueJS> array = Values.createTypedJavaScriptArray(ListableValueJS.class); for (final ListableValue value : values) { array.push(ListableValueJS.toJavaScript(value)); } setValues(array); } } public native void setValues(JsArray<ListableValueJS> values) /*-{ this.values = values; }-*/; public native boolean isAmendment() /*-{ return this.amendment; }-*/; public native void setAmendment(boolean amendment) /*-{ this.amendment = amendment; }-*/; public native String getChangeType() /*-{ return this.changeType; }-*/; public ValueEventChangeType getChangeTypeEnum() { if(getChangeType() != null) { return ValueEventChangeType.valueOf(getChangeType()); } return null; } public void setChangeType(ValueEventChangeType changeType) { if(changeType != null) { setChangeType(changeType.name()); } } public native void setChangeType(String changeType) /*-{ this.changeType = changeType; }-*/; public native boolean isProjectCountryChanged() /*-{ return this.projectCountryChanged; }-*/; public native void setProjectCountryChanged(boolean projectCountryChanged) /*-{ this.projectCountryChanged = projectCountryChanged; }-*/; public native FlexibleElementJS getSourceElement() /*-{ return this.sourceElement; }-*/; public void setSourceElement(FlexibleElementDTO sourceElement) { if (sourceElement != null) { setSourceElement(FlexibleElementJS.toJavaScript(sourceElement)); } } public native void setSourceElement(FlexibleElementJS sourceElement) /*-{ this.sourceElement = sourceElement; }-*/; }