/*
* RHQ Management Platform
* Copyright (C) 2005-2008 Red Hat, Inc.
* All rights reserved.
*
* 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 version 2 of the License.
*
* 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, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.enterprise.gui.common.paging;
import java.beans.FeatureDescriptor;
import java.util.Iterator;
import javax.el.ELContext;
import javax.el.ELResolver;
import javax.el.PropertyNotFoundException;
import javax.el.PropertyNotWritableException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.util.PageControl;
import org.rhq.enterprise.gui.legacy.WebUser;
import org.rhq.enterprise.gui.legacy.WebUserPreferences;
import org.rhq.enterprise.gui.util.EnterpriseFacesContextUtility;
/**
* @author Joseph Marques
*/
public class PageControlELResolver extends ELResolver {
private final Log log = LogFactory.getLog(this.getClass());
@Override
public Class<?> getCommonPropertyType(ELContext context, Object base) {
return null; // for gui tools
}
@Override
public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext context, Object base) {
return null; // for gui tools
}
@Override
public Class<?> getType(ELContext context, Object base, Object property) {
Class<?> result = null;
if (context == null) {
throw new NullPointerException("ELContext was null for getType method in PageControlELResolver");
}
if (base == null) {
// We don't handle setting top-level implicit objects.
} else if (base.equals(PageControlView.class) || (base instanceof PageControlView)) {
String propertyName = property.toString().toLowerCase();
if ("pagesize".equals(propertyName)) {
result = Integer.class;
} else if ("pagenumber".equals(propertyName)) {
result = Integer.class;
} else if ("unlimited".equals(propertyName)) {
result = Boolean.class;
} else {
throw new PropertyNotWritableException(
"Only the pageSize and pageNumber properties of a PageControl object can be resolved");
}
context.setPropertyResolved(true);
}
return result;
}
@Override
public Object getValue(ELContext context, Object base, Object property) {
if (context == null) {
throw new NullPointerException("ELContext was null for getValue method in PageControlELResolver");
}
Object result = null;
if (base == null) {
// Resolving first two variables (e.g. ${PageControlView.something}).
String propertyName = (String) property;
if ("PageControl".equals(propertyName)) {
result = PageControlView.class;
context.setPropertyResolved(true);
}
} else if (PageControlView.class.equals(base)) {
// Getting a specific PageControlView instance
String viewName = property.toString();
result = PageControlView.valueOf(viewName);
context.setPropertyResolved(true);
} else if (base instanceof PageControlView) {
// cast to required types
PageControlView view = (PageControlView) base;
String methodName = (String) property;
String lowerCaseMethodName = methodName.toLowerCase();
log.debug("accessing PageControl." + methodName);
// allows simple misspellings for developer productivity
if ("pagesize".equals(lowerCaseMethodName)) {
// find the user for this session-based operation
WebUser user = EnterpriseFacesContextUtility.getWebUser();
WebUserPreferences preferences = user.getWebPreferences();
// get it
PageControl pc = preferences.getPageControl(view);
if (log.isDebugEnabled()) {
log.debug("Getting PageControlView[" + view + "] to " + pc);
}
result = pc.getPageSize();
} else if ("pagenumber".equals(lowerCaseMethodName)) {
// find the user for this session-based operation
WebUser user = EnterpriseFacesContextUtility.getWebUser();
WebUserPreferences preferences = user.getWebPreferences();
// get it
PageControl pc = preferences.getPageControl(view);
if (log.isDebugEnabled()) {
log.debug("Getting PageControlView[" + view + "] to " + pc);
}
result = pc.getPageNumber() + 1; // RF data table is 1-based, our PageControl is 0-based
} else if ("unlimited".equals(lowerCaseMethodName)) {
result = view.isUnlimited();
} else {
throw new PropertyNotFoundException("The " + methodName
+ " property of a PageControl object is not accessible");
}
// don't let other resolvers touch this
context.setPropertyResolved(true);
}
return result;
}
@Override
public boolean isReadOnly(ELContext context, Object base, Object property) {
return false;
}
@Override
public void setValue(ELContext context, Object base, Object property, Object value) {
if (context == null) {
throw new NullPointerException("ELContext was null for setValue method in PageControlELResolver");
}
if (base instanceof PageControlView) {
// cast to required types
PageControlView view = (PageControlView) base;
String methodName = (String) property;
String lowerCaseMethodName = methodName.toLowerCase();
// allows simple mispellings for developer productivity
if ("pagesize".equals(lowerCaseMethodName)) {
if (value != null) {
// find the user for this session-based operation
WebUser user = EnterpriseFacesContextUtility.getWebUser();
WebUserPreferences preferences = user.getWebPreferences();
// update it
PageControl pc = preferences.getPageControl(view);
int pageSize = (Integer) value;
if (pc.getPageSize() == pageSize) {
// nothing to do
if (log.isDebugEnabled()) {
log.debug("PageControlView[" + view + "] needs no changes " + pc);
}
} else {
pc.setPageSize(pageSize);
pc.setPageNumber(0); // reset the page number too
if (log.isDebugEnabled()) {
log.debug("Setting PageControlView[" + view + "] to " + pc);
}
preferences.setPageControl(view, pc);
}
}
// don't let other resolvers touch this
context.setPropertyResolved(true);
} else if ("pagenumber".equals(lowerCaseMethodName)) {
if (value != null) {
// find the user for this session-based operation
WebUser user = EnterpriseFacesContextUtility.getWebUser();
WebUserPreferences preferences = user.getWebPreferences();
// update it
PageControl pc = preferences.getPageControl(view);
int pageNumber = (Integer) value;
pc.setPageNumber(pageNumber - 1); // RF data table is 1-based, our PageControl is 0-based
if (log.isDebugEnabled()) {
log.debug("Setting PageControlView[" + view + "] to " + pc);
}
preferences.setPageControl(view, pc);
}
// don't let other resolvers touch this
context.setPropertyResolved(true);
} else {
throw new PropertyNotFoundException("The " + methodName
+ " property of a PageControl object can not be set, only pageSize");
}
}
}
}