/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.view.rest; import java.net.URI; import java.util.Map; import java.util.concurrent.ExecutorService; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.Response; import org.fudgemsg.FudgeMsg; import com.opengamma.engine.resource.EngineResourceReference; import com.opengamma.engine.view.ViewDefinition; import com.opengamma.engine.view.client.ViewClient; import com.opengamma.engine.view.client.ViewClientState; import com.opengamma.engine.view.client.ViewResultMode; import com.opengamma.engine.view.cycle.ViewCycle; import com.opengamma.financial.livedata.rest.DataLiveDataInjectorResource; import com.opengamma.financial.rest.AbstractRestfulJmsResultPublisher; import com.opengamma.id.UniqueId; import com.opengamma.transport.jaxrs.FudgeRest; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.fudgemsg.OpenGammaFudgeContext; import com.opengamma.util.jms.JmsConnector; /** * RESTful resource for a view client. */ @Consumes(FudgeRest.MEDIA) @Produces(FudgeRest.MEDIA) public class DataViewClientResource extends AbstractRestfulJmsResultPublisher { //CSOFF: just constants public static final String PATH_UNIQUE_ID = "id"; public static final String PATH_USER = "user"; public static final String PATH_STATE = "state"; public static final String PATH_IS_ATTACHED = "isAttached"; public static final String PATH_ATTACH_SEARCH = "attachSearch"; public static final String PATH_ATTACH_DIRECT = "attachDirect"; public static final String PATH_DETACH = "detach"; public static final String PATH_LIVE_DATA_OVERRIDE_INJECTOR = "overrides"; public static final String PATH_RESULT_MODE = "resultMode"; public static final String PATH_FRAGMENT_RESULT_MODE = "fragmentResultMode"; public static final String PATH_RESUME = "resume"; public static final String PATH_PAUSE = "pause"; public static final String PATH_COMPLETED = "completed"; public static final String PATH_RESULT_AVAILABLE = "resultAvailable"; public static final String PATH_LATEST_RESULT = "latestResult"; public static final String PATH_VIEW_DEFINITION = "viewDefinition"; public static final String PATH_VIEW_PROCESS = "viewProcess"; public static final String PATH_LATEST_COMPILED_VIEW_DEFINITION = "latestCompiledViewDefinition"; public static final String PATH_VIEW_CYCLE_ACCESS_SUPPORTED = "viewCycleAccessSupported"; public static final String PATH_CREATE_LATEST_CYCLE_REFERENCE = "createLatestCycleReference"; public static final String PATH_CREATE_CYCLE_REFERENCE = "createCycleReference"; public static final String PATH_TRIGGER_CYCLE = "triggerCycle"; public static final String PATH_SET_MINIMUM_LOG_MODE = "logMode"; public static final String PATH_UPDATE_PERIOD = "updatePeriod"; public static final String UPDATE_PERIOD_FIELD = "updatePeriod"; public static final String VIEW_CYCLE_ACCESS_SUPPORTED_FIELD = "isViewCycleAccessSupported"; public static final String PATH_VIEW_PROCESS_CONTEXT_MAP = "viewProcessContextMap"; //CSON: just constants private final ViewClient _viewClient; private final DataEngineResourceManagerResource<ViewCycle> _viewCycleManagerResource; public DataViewClientResource(ViewClient viewClient, DataEngineResourceManagerResource<ViewCycle> viewCycleManagerResource, JmsConnector jmsConnector, ExecutorService executor) { super(createJmsResultPublisher(viewClient, jmsConnector), executor); _viewClient = viewClient; _viewCycleManagerResource = viewCycleManagerResource; } private static ViewClientJmsResultPublisher createJmsResultPublisher(ViewClient viewClient, JmsConnector jmsConnector) { if (jmsConnector == null) { return null; } else { return new ViewClientJmsResultPublisher(viewClient, OpenGammaFudgeContext.getInstance(), jmsConnector); } } /*package*/ ViewClient getViewClient() { return _viewClient; } //------------------------------------------------------------------------- @Override protected boolean isTerminated() { return getViewClient().getState() == ViewClientState.TERMINATED; } @Override protected void expire() { shutdown(); } //------------------------------------------------------------------------- @GET @Path(PATH_UNIQUE_ID) public Response getUniqueId() { updateLastAccessed(); return responseOkObject(getViewClient().getUniqueId()); } @GET @Path(PATH_USER) public Response getUser() { updateLastAccessed(); return responseOkObject(getViewClient().getUser()); } @GET @Path(PATH_STATE) public Response getState() { updateLastAccessed(); return responseOkObject(getViewClient().getState()); } //------------------------------------------------------------------------- @GET @Path(PATH_IS_ATTACHED) public Response isAttached() { updateLastAccessed(); return responseOk(getViewClient().isAttached()); } @POST @Consumes(FudgeRest.MEDIA) @Path(PATH_ATTACH_SEARCH) public Response attachToViewProcess(AttachToViewProcessRequest request) { updateLastAccessed(); ArgumentChecker.notNull(request.getViewDefinitionId(), "viewDefinitionId"); ArgumentChecker.notNull(request.getExecutionOptions(), "executionOptions"); ArgumentChecker.notNull(request.isNewBatchProcess(), "isNewBatchProcess"); getViewClient().attachToViewProcess(request.getViewDefinitionId(), request.getExecutionOptions(), request.isNewBatchProcess()); return responseOk(); } @POST @Consumes(FudgeRest.MEDIA) @Path(PATH_ATTACH_DIRECT) public Response attachToViewProcess(UniqueId viewProcessId) { updateLastAccessed(); ArgumentChecker.notNull(viewProcessId, "viewProcessId"); getViewClient().attachToViewProcess(viewProcessId); return responseOk(); } @POST @Path(PATH_DETACH) public Response detachFromViewProcess() { updateLastAccessed(); getViewClient().detachFromViewProcess(); return responseOk(); } @Path(PATH_LIVE_DATA_OVERRIDE_INJECTOR) public DataLiveDataInjectorResource getLiveDataOverrideInjector() { updateLastAccessed(); return new DataLiveDataInjectorResource(getViewClient().getLiveDataOverrideInjector()); } @GET @Path(PATH_VIEW_DEFINITION) public Response getLatestViewDefinition() { ViewDefinition result = getViewClient().getLatestViewDefinition(); return responseOkObject(result); } @Path(PATH_VIEW_PROCESS) public DataViewProcessResource getViewProcess() { updateLastAccessed(); return new DataViewProcessResource(getViewClient().getViewProcess()); } //------------------------------------------------------------------------- @PUT @Path(PATH_UPDATE_PERIOD) @Consumes(FudgeRest.MEDIA) public Response setUpdatePeriod(FudgeMsg msg) { updateLastAccessed(); long periodMillis = msg.getLong(UPDATE_PERIOD_FIELD); getViewClient().setUpdatePeriod(periodMillis); return responseOk(); } //------------------------------------------------------------------------- @GET @Path(PATH_RESULT_MODE) public Response getResultMode() { updateLastAccessed(); return responseOkObject(getViewClient().getResultMode()); } @PUT @Path(PATH_RESULT_MODE) public Response setResultMode(ViewResultMode viewResultMode) { updateLastAccessed(); getViewClient().setResultMode(viewResultMode); return responseOk(); } //------------------------------------------------------------------------- @PUT @Path(PATH_VIEW_PROCESS_CONTEXT_MAP) public Response setViewProcessContextMap(Map<String, String> viewProcessContextMap) { updateLastAccessed(); getViewClient().setViewProcessContextMap(viewProcessContextMap); return responseOk(); } //------------------------------------------------------------------------- @GET @Path(PATH_FRAGMENT_RESULT_MODE) public Response getFragmentResultMode() { updateLastAccessed(); return responseOkObject(getViewClient().getFragmentResultMode()); } @PUT @Path(PATH_FRAGMENT_RESULT_MODE) public Response setFragmentResultMode(ViewResultMode viewResultMode) { updateLastAccessed(); getViewClient().setFragmentResultMode(viewResultMode); return responseOk(); } //------------------------------------------------------------------------- @POST @Path(PATH_PAUSE) public Response pause() { updateLastAccessed(); getViewClient().pause(); return responseOk(); } @POST @Path(PATH_RESUME) public Response resume() { updateLastAccessed(); getViewClient().resume(); return responseOk(); } @POST @Path(PATH_TRIGGER_CYCLE) public Response triggerCycle() { updateLastAccessed(); getViewClient().triggerCycle(); return responseOk(); } @GET @Path(PATH_COMPLETED) public Response isCompleted() { updateLastAccessed(); return responseOk(getViewClient().isCompleted()); } @GET @Path(PATH_RESULT_AVAILABLE) public Response isResultAvailable() { updateLastAccessed(); return responseOk(getViewClient().isResultAvailable()); } @GET @Path(PATH_LATEST_RESULT) public Response getLatestResult() { updateLastAccessed(); return responseOkObject(getViewClient().getLatestResult()); } @GET @Path(PATH_LATEST_COMPILED_VIEW_DEFINITION) public Response getLatestCompiledViewDefinition() { updateLastAccessed(); return responseOkObject(getViewClient().getLatestCompiledViewDefinition()); } @GET @Path(PATH_VIEW_CYCLE_ACCESS_SUPPORTED) public Response isViewCycleAccessSupported() { updateLastAccessed(); return responseOk(getViewClient().isViewCycleAccessSupported()); } @POST @Path(PATH_VIEW_CYCLE_ACCESS_SUPPORTED) public Response setViewCycleAccessSupported(FudgeMsg msg) { updateLastAccessed(); boolean isViewCycleAccessSupported = msg.getBoolean(VIEW_CYCLE_ACCESS_SUPPORTED_FIELD); getViewClient().setViewCycleAccessSupported(isViewCycleAccessSupported); return responseOk(); } @POST @Path(PATH_CREATE_LATEST_CYCLE_REFERENCE) public Response createLatestCycleReference() { updateLastAccessed(); EngineResourceReference<? extends ViewCycle> reference = getViewClient().createLatestCycleReference(); return getReferenceResponse(reference); } @POST @Path(PATH_CREATE_CYCLE_REFERENCE) @Consumes(FudgeRest.MEDIA) public Response createCycleReference(UniqueId cycleId) { updateLastAccessed(); EngineResourceReference<? extends ViewCycle> reference = getViewClient().createCycleReference(cycleId); return getReferenceResponse(reference); } private Response getReferenceResponse(EngineResourceReference<? extends ViewCycle> reference) { updateLastAccessed(); if (reference == null) { return responseOkNoContent(); } URI referenceUri = _viewCycleManagerResource.manageReference(reference); return responseCreated(referenceUri); } //------------------------------------------------------------------------- @POST @Path(PATH_SET_MINIMUM_LOG_MODE) @Consumes(FudgeRest.MEDIA) public Response setMinimumLogMode(SetMinimumLogModeRequest request) { updateLastAccessed(); ArgumentChecker.notNull(request.getMinimumLogMode(), "minimumLogMode"); ArgumentChecker.notNull(request.getTargets(), "targets"); getViewClient().setMinimumLogMode(request.getMinimumLogMode(), request.getTargets()); return responseOk(); } //------------------------------------------------------------------------- @DELETE public void shutdown() { getViewClient().shutdown(); stopResultStream(); } }