/**
* Copyright 2013, WebGate Consulting AG
*
* 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.openntf.xpt.objectlist.datasource;
import java.io.IOException;
import java.util.Map;
import java.util.logging.Logger;
import javax.faces.context.FacesContext;
import javax.faces.el.MethodBinding;
import org.openntf.xpt.core.XPTRuntimeException;
import org.openntf.xpt.core.dss.SingleObjectStore;
import org.openntf.xpt.core.utils.ValueBindingSupport;
import org.openntf.xpt.core.utils.logging.LoggerFactory;
import com.ibm.commons.util.StringUtil;
import com.ibm.xsp.FacesExceptionEx;
import com.ibm.xsp.binding.MethodBindingEx;
import com.ibm.xsp.model.AbstractDataSource;
import com.ibm.xsp.model.DataContainer;
import com.ibm.xsp.util.StateHolderUtil;
public class DSSObjectDataSource extends AbstractDataSource {
public static final String[] DSSOBJECT_SSJS_NAME = { "cDSSObject" };
private String m_DatabaseName;
private String m_ObjectId;
private String m_Action;
private MethodBinding m_ObjectStorageService;
private MethodBinding m_PostOpen;
private MethodBinding m_PostNew;
private MethodBinding m_PostSave;
private MethodBinding m_QuerySave;
@Override
protected String composeUniqueId() {
StringBuilder sb = new StringBuilder();
sb.append("dssObjectDataStore");
String strRequestParam = getRequestParamPrefix();
if (!StringUtil.isEmpty(strRequestParam)) {
sb.append(strRequestParam);
}
String strDBName = getDatabaseName();
if (!StringUtil.isEmpty(strDBName)) {
sb.append(strDBName);
}
String strObjectId = getObjectId();
if (!StringUtil.isEmpty(strObjectId)) {
sb.append(strObjectId);
}
return sb.toString();
}
@Override
public Object getDataObject() {
DSSObjectDataContainer dc = (DSSObjectDataContainer) getDataContainer();
return dc == null ? null : dc.getDSSObject();
}
@Override
public boolean isReadonly() {
return getDataObject() == null;
}
@Override
public DataContainer load(FacesContext context) throws IOException {
DSSObject dssObject = buildDSSObject(context);
if (dssObject != null) {
if (dssObject.isNew()) {
invoke(context, m_PostNew, dssObject);
} else {
invoke(context, m_PostOpen, dssObject);
}
}
return new DSSObjectDataContainer(getBeanId(), composeUniqueId(), dssObject);
}
@Override
public void readRequestParams(FacesContext arg0, Map<String, Object> paramMap) {
String strDatabase = (String) paramMap.get(prefixRequestParam("databaseName"));
if (StringUtil.isNotEmpty(strDatabase)) {
m_DatabaseName = strDatabase;
}
String strObjectId = (String) paramMap.get(prefixRequestParam("objectId"));
if (StringUtil.isNotEmpty(strObjectId)) {
m_ObjectId = strObjectId;
}
String strAction = (String) paramMap.get(prefixRequestParam("action"));
if (StringUtil.isNotEmpty(strAction)) {
m_Action = strAction;
}
}
@Override
public boolean save(FacesContext context, DataContainer container) throws FacesExceptionEx {
DSSObject dssObject = ((DSSObjectDataContainer) container).getDSSObject();
SingleObjectStore<?> sos = getObjectStore();
invoke(context, m_QuerySave, dssObject);
if (sos.saveObject(dssObject.getBO(), getDatabaseName())) {
invoke(context, m_PostSave, dssObject);
return true;
}
return false;
}
public String getDatabaseName() {
return ValueBindingSupport.getValue(m_DatabaseName, "databaseName", this, "", getFacesContext());
}
public void setDatabaseName(String databaseName) {
m_DatabaseName = databaseName;
}
public String getObjectId() {
return ValueBindingSupport.getValue(m_ObjectId, "objectId", this, "", getFacesContext());
}
public void setObjectId(String objectId) {
m_ObjectId = objectId;
}
public String getAction() {
return ValueBindingSupport.getValue(m_Action, "action", this, "", getFacesContext());
}
public void setAction(String action) {
m_Action = action;
}
public MethodBinding getObjectStorageService() {
return m_ObjectStorageService;
}
public void setObjectStorageService(MethodBinding objectStorageService) {
m_ObjectStorageService = objectStorageService;
}
@Override
public Object saveState(FacesContext context) {
Object[] values = new Object[9];
values[0] = super.saveState(context);
values[1] = m_DatabaseName;
values[2] = m_ObjectId;
values[3] = m_Action;
values[4] = StateHolderUtil.saveMethodBinding(context, m_ObjectStorageService);
values[5] = StateHolderUtil.saveMethodBinding(context, m_PostNew);
values[6] = StateHolderUtil.saveMethodBinding(context, m_PostOpen);
values[7] = StateHolderUtil.saveMethodBinding(context, m_PostSave);
values[8] = StateHolderUtil.saveMethodBinding(context, m_QuerySave);
return values;
}
@Override
public void restoreState(FacesContext context, Object val) {
Object[] values = (Object[]) val;
super.restoreState(context, values[0]);
m_DatabaseName = (String) values[1];
m_ObjectId = (String) values[2];
m_Action = (String) values[3];
m_ObjectStorageService = StateHolderUtil.restoreMethodBinding(context, getComponent(), values[4]);
m_PostNew = StateHolderUtil.restoreMethodBinding(context, getComponent(), values[5]);
m_PostOpen = StateHolderUtil.restoreMethodBinding(context, getComponent(), values[6]);
m_PostSave = StateHolderUtil.restoreMethodBinding(context, getComponent(), values[7]);
m_QuerySave = StateHolderUtil.restoreMethodBinding(context, getComponent(), values[8]);
}
private DSSObject buildDSSObject(FacesContext context) {
String strAction = getAction();
String strObjectID = getObjectId();
SingleObjectStore<?> sos = getObjectStore();
Object obj = null;
boolean isEdit = false;
boolean isNew = false;
if (StringUtil.isEmpty(strAction) || "newObject".equals(strAction)) {
obj = sos.newObject();
isEdit = true;
isNew = true;
} else {
if (!StringUtil.isEmpty(strObjectID)) {
obj = sos.getObjectByID(strObjectID, getDatabaseName());
if ("editObject".equals(strAction)) {
isEdit = true;
}
}
}
return obj == null ? null : new DSSObject(obj, isEdit, isNew);
}
private SingleObjectStore<?> getObjectStore() {
try {
Logger logCurrent = LoggerFactory.getLogger(this.getClass().getCanonicalName());
if (m_ObjectStorageService != null) {
logCurrent.info("Exectue BuildValues");
Object objCurrent = m_ObjectStorageService.invoke(getFacesContext(), null);
logCurrent.info(objCurrent.getClass().getCanonicalName());
if (objCurrent instanceof SingleObjectStore<?>) {
return (SingleObjectStore<?>) objCurrent;
}
}
throw new XPTRuntimeException("No ObjectStorageService defined!");
} catch (Exception ex) {
throw new XPTRuntimeException("Error during getObjectStore (SingleObjectStore)", ex);
}
}
private void invoke(FacesContext context, MethodBinding method, DSSObject dssObject) {
if (method != null) {
Object[] params = null;
if (method instanceof MethodBindingEx) {
params = new Object[] { dssObject.getBO() };
((MethodBindingEx) method).setComponent(this.getComponent());
((MethodBindingEx) method).setParamNames(DSSOBJECT_SSJS_NAME);
}
method.invoke(context, params);
}
}
public MethodBinding getPostOpen() {
return m_PostOpen;
}
public void setPostOpen(MethodBinding postOpen) {
m_PostOpen = postOpen;
}
public MethodBinding getPostNew() {
return m_PostNew;
}
public void setPostNew(MethodBinding postNew) {
m_PostNew = postNew;
}
public MethodBinding getPostSave() {
return m_PostSave;
}
public void setPostSave(MethodBinding postSave) {
m_PostSave = postSave;
}
public MethodBinding getQuerySave() {
return m_QuerySave;
}
public void setQuerySave(MethodBinding querySave) {
m_QuerySave = querySave;
}
}