org.richfaces.component.SavedState Maven / Gradle / Ivy
/*
* JBoss, Home of Professional Open Source
* Copyright ${year}, Red Hat, Inc. and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.richfaces.component;
import javax.faces.component.EditableValueHolder;
import javax.faces.component.StateHolder;
import javax.faces.component.UIComponentBase;
import javax.faces.component.UIForm;
import javax.faces.context.FacesContext;
import org.ajax4jsf.component.IterationStateHolder;
//from RI
/**
* This class keep values of {@link EditableValueHolder} row-sensitive fields.
*
* @author shura
*/
public final class SavedState implements StateHolder {
public static final SavedState EMPTY = new SavedState();
private static final long serialVersionUID = -1563864456074187422L;
private boolean valid = true;
private boolean localValueSet;
private boolean submitted;
private Object submittedValue;
private Object value;
private Object iterationState;
public SavedState() {
super();
}
public SavedState(EditableValueHolder evh) {
super();
this.value = evh.getLocalValue();
this.valid = evh.isValid();
this.submittedValue = evh.getSubmittedValue();
this.localValueSet = evh.isLocalValueSet();
}
public SavedState(IterationStateHolder ish) {
super();
this.iterationState = ish.getIterationState();
}
public SavedState(UIForm form) {
super();
this.submitted = form.isSubmitted();
}
Object getSubmittedValue() {
return this.submittedValue;
}
void setSubmittedValue(Object submittedValue) {
this.submittedValue = submittedValue;
}
boolean isValid() {
return this.valid;
}
void setValid(boolean valid) {
this.valid = valid;
}
Object getValue() {
return this.value;
}
void setValue(Object value) {
this.value = value;
}
boolean isLocalValueSet() {
return this.localValueSet;
}
void setLocalValueSet(boolean localValueSet) {
this.localValueSet = localValueSet;
}
Object getIterationState() {
return iterationState;
}
void setIterationState(Object iterationState) {
this.iterationState = iterationState;
}
boolean isSubmitted() {
return submitted;
}
void setSubmitted(boolean submitted) {
this.submitted = submitted;
}
@Override
public String toString() {
if (iterationState != null) {
return "iterationState: " + iterationState;
} else {
return "submittedValue: " + submittedValue + " value: " + value + " localValueSet: " + localValueSet
+ " submitted: " + submitted;
}
}
public void apply(EditableValueHolder evh) {
evh.setValue(this.value);
evh.setValid(this.valid);
evh.setSubmittedValue(this.submittedValue);
evh.setLocalValueSet(this.localValueSet);
}
public void apply(IterationStateHolder ish) {
ish.setIterationState(iterationState);
}
public void apply(UIForm form) {
form.setSubmitted(this.submitted);
}
private boolean isObjectTransient(Object o) {
if (o == null) {
return true;
}
if (o instanceof StateHolder) {
return ((StateHolder) o).isTransient();
}
return false;
}
public void setTransient(boolean newTransientValue) {
throw new UnsupportedOperationException();
}
public boolean isTransient() {
if (iterationState != null) {
return isObjectTransient(iterationState);
}
if (!valid) {
return false;
}
if (localValueSet || submitted) {
return false;
}
return isObjectTransient(submittedValue) && isObjectTransient(value);
}
public Object saveState(FacesContext context) {
if (isTransient()) {
return null;
}
if (iterationState != null) {
return new Object[] { UIComponentBase.saveAttachedState(context, iterationState) };
} else {
return new Object[] { valid ? Boolean.TRUE : Boolean.FALSE, localValueSet ? Boolean.TRUE : Boolean.FALSE,
submitted ? Boolean.TRUE : Boolean.FALSE, UIComponentBase.saveAttachedState(context, submittedValue),
UIComponentBase.saveAttachedState(context, value) };
}
}
public void restoreState(FacesContext context, Object stateObject) {
if (stateObject == null) {
return;
}
Object[] state = (Object[]) stateObject;
if (state.length == 1) {
iterationState = UIComponentBase.restoreAttachedState(context, state[0]);
} else {
valid = Boolean.TRUE.equals(state[0]);
localValueSet = Boolean.TRUE.equals(state[1]);
submitted = Boolean.TRUE.equals(state[2]);
submittedValue = UIComponentBase.restoreAttachedState(context, state[3]);
value = UIComponentBase.restoreAttachedState(context, state[4]);
}
}
}