Author: nbelaevski
Date: 2010-05-28 15:41:30 -0400 (Fri, 28 May 2010)
New Revision: 17386
Added:
root/core/trunk/impl/src/main/java/org/richfaces/util/PartialStateHolderUtil.java
Log:
PSH utility class initial check-in
Added: root/core/trunk/impl/src/main/java/org/richfaces/util/PartialStateHolderUtil.java
===================================================================
--- root/core/trunk/impl/src/main/java/org/richfaces/util/PartialStateHolderUtil.java
(rev 0)
+++
root/core/trunk/impl/src/main/java/org/richfaces/util/PartialStateHolderUtil.java 2010-05-28
19:41:30 UTC (rev 17386)
@@ -0,0 +1,117 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, 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.util;
+
+import java.io.Serializable;
+
+import javax.faces.component.PartialStateHolder;
+import javax.faces.component.StateHolder;
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIComponentBase;
+import javax.faces.context.FacesContext;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public final class PartialStateHolderUtil {
+
+ private static final class StateHolderObject implements Serializable {
+
+ private static final long serialVersionUID = 6157742187482213801L;
+
+ private boolean partialState;
+
+ private Object savedState;
+
+ public StateHolderObject(boolean partialState, Object savedState) {
+ super();
+ this.partialState = partialState;
+ this.savedState = savedState;
+ }
+
+ public boolean isPartialState() {
+ return partialState;
+ }
+
+ public Object getSavedState() {
+ return savedState;
+ }
+ }
+
+ private PartialStateHolderUtil() {
+ //utility class constructor
+ }
+
+ public static Object saveState(FacesContext context, UIComponent component, Object
objectToSave) {
+ Object savedState = null;
+ boolean nullDelta = true;
+
+ boolean converterHasPartialState = false;
+
+ if (component.initialStateMarked()) {
+ if (objectToSave != null) {
+ if (objectToSave instanceof PartialStateHolder) {
+ // Delta
+ StateHolder holder = (StateHolder) objectToSave;
+ if (!holder.isTransient()) {
+ Object attachedState = holder.saveState(context);
+ if (attachedState != null) {
+ nullDelta = false;
+ savedState = attachedState;
+ }
+ converterHasPartialState = true;
+ } else {
+ savedState = null;
+ }
+ } else {
+ // Full
+ savedState = UIComponentBase.saveAttachedState(context,
objectToSave);
+ nullDelta = false;
+ }
+ }
+
+ if (savedState == null && nullDelta) {
+ // No values
+ return null;
+ }
+ } else {
+ savedState = UIComponentBase.saveAttachedState(context, objectToSave);
+ }
+
+ return new StateHolderObject(converterHasPartialState, savedState);
+ }
+
+ public static Object restoreState(FacesContext context, Object savedState, Object
existingObject) {
+ if (savedState != null) {
+ StateHolderObject stateHolderObject = (StateHolderObject) savedState;
+ if (stateHolderObject.isPartialState()) {
+ ((StateHolder) existingObject).restoreState(context,
stateHolderObject.getSavedState());
+ return existingObject;
+ } else {
+ return UIComponentBase.restoreAttachedState(context,
stateHolderObject.getSavedState());
+ }
+ } else {
+ return null;
+ }
+ }
+}