/*
* RHQ Management Platform
* Copyright (C) 2005-2011 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.coregui.client.gwt;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.user.client.rpc.RpcRequestBuilder;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import org.rhq.coregui.client.CoreGUI;
import org.rhq.coregui.client.UserSessionManager;
import org.rhq.coregui.client.util.Log;
/**
* This lookup service retrieves each RPC service and sets a custom RpcRequestBuilder that adds the login session
* id to be security checked on the server. Where timeouts can be specified: -1=default, 0=disable,
* >0=specifiedValueInMilliseconds.
* <p><b>IMPORTANT:</b></p>
* <p>
* A lookup for any given service returns a cached instance of the service. That instance is given a new
* RequestBuilder with the requested timeout (or the default if a no-timeout lookup signature is used). That means the
* the timeout lives <i>only until the next lookup is performed for the same service!</i>. So, it is highly
* recommended that you chain the service lookup directly to the service method being invoked. Do not declare
* the service in advance, especially as a class-level field where it may be instantiated at unexpected times.
* The lookups are lightweight, so don't be afraid to perform a lookup for each service call. For example:
* <pre>GWTServiceLookup.getBundleService().deleteBundleDestination(args)</pre>
* </p>
* @author Greg Hinkle
* @author Joseph Marques
* @author John Mazzitelli
*/
public class GWTServiceLookup {
public static AlertDefinitionGWTServiceAsync getAlertDefinitionService() {
return secure(AlertDefinitionGWTServiceAsync.Util.getInstance());
}
public static AlertTemplateGWTServiceAsync getAlertTemplateService() {
return secure(AlertTemplateGWTServiceAsync.Util.getInstance());
}
public static GroupAlertDefinitionGWTServiceAsync getGroupAlertDefinitionService() {
return secure(GroupAlertDefinitionGWTServiceAsync.Util.getInstance());
}
public static GroupDefinitionExpressionBuilderGWTServiceAsync getGroupDefinitionExpressionBuilderService() {
return secure(GroupDefinitionExpressionBuilderGWTServiceAsync.Util.getInstance());
}
public static ConfigurationGWTServiceAsync getConfigurationService() {
return secure(ConfigurationGWTServiceAsync.Util.getInstance());
}
public static ConfigurationGWTServiceAsync getConfigurationService(int timeout) {
return secure(ConfigurationGWTServiceAsync.Util.getInstance(), timeout);
}
public static DriftGWTServiceAsync getDriftService() {
return secure(DriftGWTServiceAsync.Util.getInstance());
}
public static PluginGWTServiceAsync getPluginService() {
return secure(PluginGWTServiceAsync.Util.getInstance());
}
public static ResourceGWTServiceAsync getResourceService() {
return secure(ResourceGWTServiceAsync.Util.getInstance());
}
public static ResourceGWTServiceAsync getResourceService(int timeout) {
return secure(ResourceGWTServiceAsync.Util.getInstance(), timeout);
}
public static ResourceGroupGWTServiceAsync getResourceGroupService() {
return secure(ResourceGroupGWTServiceAsync.Util.getInstance());
}
public static ResourceGroupGWTServiceAsync getResourceGroupService(int timeout) {
return secure(ResourceGroupGWTServiceAsync.Util.getInstance(), timeout);
}
public static ResourceTypeGWTServiceAsync getResourceTypeGWTService() {
return secure(ResourceTypeGWTServiceAsync.Util.getInstance());
}
public static ResourceTypeGWTServiceAsync getResourceTypeGWTService(int timeout) {
return secure(ResourceTypeGWTServiceAsync.Util.getInstance(), timeout);
}
public static RoleGWTServiceAsync getRoleService() {
return secure(RoleGWTServiceAsync.Util.getInstance());
}
public static SubjectGWTServiceAsync getSubjectService() {
return secure(SubjectGWTServiceAsync.Util.getInstance());
}
public static SystemGWTServiceAsync getSystemService() {
return secure(SystemGWTServiceAsync.Util.getInstance());
}
public static MeasurementDataGWTServiceAsync getMeasurementDataService() {
return secure(MeasurementDataGWTServiceAsync.Util.getInstance());
}
public static MeasurementDataGWTServiceAsync getMeasurementDataService(int timeout) {
return secure(MeasurementDataGWTServiceAsync.Util.getInstance(), timeout);
}
public static MeasurementChartsGWTServiceAsync getMeasurementChartsService() {
return secure(MeasurementChartsGWTServiceAsync.Util.getInstance());
}
public static MeasurementScheduleGWTServiceAsync getMeasurementScheduleService() {
return secure(MeasurementScheduleGWTServiceAsync.Util.getInstance());
}
public static AlertGWTServiceAsync getAlertService() {
return secure(AlertGWTServiceAsync.Util.getInstance());
}
public static AlertGWTServiceAsync getAlertService(int timeout) {
return secure(AlertGWTServiceAsync.Util.getInstance(), timeout);
}
public static OperationGWTServiceAsync getOperationService() {
return secure(OperationGWTServiceAsync.Util.getInstance());
}
public static BundleGWTServiceAsync getBundleService() {
return secure(BundleGWTServiceAsync.Util.getInstance());
}
public static BundleGWTServiceAsync getBundleService(int timeout) {
return secure(BundleGWTServiceAsync.Util.getInstance(), timeout);
}
public static ResourceBossGWTServiceAsync getResourceBossService() {
return secure(ResourceBossGWTServiceAsync.Util.getInstance());
}
/**
* Consider using {@link PermissionsLoader} instead of using
* this authorization service directly.
*/
public static AuthorizationGWTServiceAsync getAuthorizationService() {
return secure(AuthorizationGWTServiceAsync.Util.getInstance());
}
public static AvailabilityGWTServiceAsync getAvailabilityService() {
return secure(AvailabilityGWTServiceAsync.Util.getInstance());
}
public static TagGWTServiceAsync getTagService() {
return secure(TagGWTServiceAsync.Util.getInstance());
}
public static RemoteInstallGWTServiceAsync getRemoteInstallService(int timeout) {
return secure(RemoteInstallGWTServiceAsync.Util.getInstance(), timeout);
}
public static RepoGWTServiceAsync getRepoService() {
return secure(RepoGWTServiceAsync.Util.getInstance());
}
public static ContentGWTServiceAsync getContentService() {
return secure(ContentGWTServiceAsync.Util.getInstance());
}
public static SearchGWTServiceAsync getSearchService() {
return secure(SearchGWTServiceAsync.Util.getInstance());
}
public static DashboardGWTServiceAsync getDashboardService() {
return secure(DashboardGWTServiceAsync.Util.getInstance());
}
public static EventGWTServiceAsync getEventService() {
return secure(EventGWTServiceAsync.Util.getInstance());
}
public static ClusterGWTServiceAsync getClusterService() {
return secure(ClusterGWTServiceAsync.Util.getInstance());
}
public static LdapGWTServiceAsync getLdapService() {
return secure(LdapGWTServiceAsync.Util.getInstance());
}
public static AgentGWTServiceAsync getAgentService() {
return secure(AgentGWTServiceAsync.Util.getInstance());
}
public static PlatformUtilizationGWTServiceAsync getPlatformUtilizationService() {
return secure(PlatformUtilizationGWTServiceAsync.Util.getInstance());
}
public static PlatformUtilizationGWTServiceAsync getPlatformUtilizationService(int timeout) {
return secure(PlatformUtilizationGWTServiceAsync.Util.getInstance(), timeout);
}
public static TopologyGWTServiceAsync getTopologyService() {
return secure(TopologyGWTServiceAsync.Util.getInstance());
}
public static StorageGWTServiceAsync getStorageService() {
return secure(StorageGWTServiceAsync.Util.getInstance());
}
@SuppressWarnings("unchecked")
private static <T> T secure(Object sdt) {
return (T) secure(sdt, -1);
}
@SuppressWarnings("unchecked")
private static <T> T secure(Object sdt, int timeout) {
if (!(sdt instanceof ServiceDefTarget))
return null;
SessionRpcRequestBuilder rb = new SessionRpcRequestBuilder(timeout);
((ServiceDefTarget) sdt).setRpcRequestBuilder(rb);
return (T) sdt;
}
public static class SessionRpcRequestBuilder extends RpcRequestBuilder {
private static int DEBUG_TIMEOUT_FUDGE_FACTOR = 30000;
private static int DEFAULT_RPC_TIMEOUT = 30000;
private int timeout;
public SessionRpcRequestBuilder(int timeout) {
super();
int rpcTimeout = CoreGUI.get().getRpcTimeout();
if (rpcTimeout > -1) {
this.timeout = rpcTimeout;
} else {
this.timeout = (timeout < 0) ? DEFAULT_RPC_TIMEOUT : timeout;
}
if (CoreGUI.isDebugMode() && (this.timeout != 0)) {
// debug mode is slow, so give requests more time to complete otherwise you'll get
// weird exceptions whose messages are extremely unhelpful in finding root cause
this.timeout += DEBUG_TIMEOUT_FUDGE_FACTOR;
}
}
@Override
protected RequestBuilder doCreate(String serviceEntryPoint) {
RequestBuilder rb = super.doCreate(serviceEntryPoint);
rb.setTimeoutMillis(this.timeout);
String sessionId = UserSessionManager.getSessionId();
if (sessionId != null) {
if (Log.isDebugEnabled()) {
Log.debug("SessionRpcRequestBuilder is adding sessionId(" + sessionId + ") to request("
+ serviceEntryPoint + ")");
}
rb.setHeader(UserSessionManager.SESSION_NAME, sessionId);
} else {
Log.error("SessionRpcRequestBuilder missing sessionId for request(" + serviceEntryPoint + ") ");
}
return rb;
}
}
}