/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.web;
import java.net.URI;
import java.util.List;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.servlet.ServletContext;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriInfo;
import org.joda.beans.Bean;
import org.joda.beans.impl.flexi.FlexiBean;
import com.google.common.collect.ImmutableList;
import com.opengamma.web.config.WebConfigData;
import com.opengamma.web.config.WebConfigUris;
import com.opengamma.web.config.WebConfigsResource;
import com.opengamma.web.convention.WebConventionData;
import com.opengamma.web.convention.WebConventionUris;
import com.opengamma.web.convention.WebConventionsResource;
import com.opengamma.web.exchange.WebExchangeData;
import com.opengamma.web.exchange.WebExchangeUris;
import com.opengamma.web.exchange.WebExchangesResource;
import com.opengamma.web.function.WebFunctionData;
import com.opengamma.web.function.WebFunctionUris;
import com.opengamma.web.function.WebFunctionsResource;
import com.opengamma.web.historicaltimeseries.WebAllHistoricalTimeSeriesResource;
import com.opengamma.web.historicaltimeseries.WebHistoricalTimeSeriesData;
import com.opengamma.web.historicaltimeseries.WebHistoricalTimeSeriesUris;
import com.opengamma.web.holiday.WebHolidayData;
import com.opengamma.web.holiday.WebHolidayUris;
import com.opengamma.web.holiday.WebHolidaysResource;
import com.opengamma.web.legalentity.WebLegalEntitiesResource;
import com.opengamma.web.legalentity.WebLegalEntityData;
import com.opengamma.web.legalentity.WebLegalEntityUris;
import com.opengamma.web.namedsnapshot.WebNamedSnapshotData;
import com.opengamma.web.namedsnapshot.WebNamedSnapshotUris;
import com.opengamma.web.namedsnapshot.WebNamedSnapshotsResource;
import com.opengamma.web.portfolio.WebPortfoliosData;
import com.opengamma.web.portfolio.WebPortfoliosResource;
import com.opengamma.web.portfolio.WebPortfoliosUris;
import com.opengamma.web.position.WebPositionsData;
import com.opengamma.web.position.WebPositionsResource;
import com.opengamma.web.position.WebPositionsUris;
import com.opengamma.web.region.WebRegionData;
import com.opengamma.web.region.WebRegionUris;
import com.opengamma.web.region.WebRegionsResource;
import com.opengamma.web.security.WebSecuritiesData;
import com.opengamma.web.security.WebSecuritiesResource;
import com.opengamma.web.security.WebSecuritiesUris;
import com.opengamma.web.user.WebRoleData;
import com.opengamma.web.user.WebRoleUris;
import com.opengamma.web.user.WebRolesResource;
import com.opengamma.web.user.WebUserData;
import com.opengamma.web.user.WebUserUris;
import com.opengamma.web.user.WebUsersResource;
/**
* RESTful resource for the home page.
*/
@Path("/")
public class WebHomeResource extends AbstractSingletonWebResource {
private static final ImmutableList<ResourceConfig> RESOURCE_CONFIGS;
private static final List<ResourceConfig> s_resourceConfigs = new CopyOnWriteArrayList<>();
static {
ImmutableList.Builder<ResourceConfig> builder = ImmutableList.builder();
builder.add(new ResourceConfig(WebConfigsResource.class, WebConfigData.class, WebConfigUris.class, "configUris"));
builder.add(new ResourceConfig(WebConventionsResource.class, WebConventionData.class, WebConventionUris.class, "conventionUris"));
builder.add(new ResourceConfig(WebExchangesResource.class, WebExchangeData.class, WebExchangeUris.class, "exchangeUris"));
builder.add(new ResourceConfig(WebFunctionsResource.class, WebFunctionData.class, WebFunctionUris.class, "functionUris"));
builder.add(new ResourceConfig(WebAllHistoricalTimeSeriesResource.class, WebHistoricalTimeSeriesData.class, WebHistoricalTimeSeriesUris.class, "timeseriesUris"));
builder.add(new ResourceConfig(WebHolidaysResource.class, WebHolidayData.class, WebHolidayUris.class, "holidayUris"));
builder.add(new ResourceConfig(WebLegalEntitiesResource.class, WebLegalEntityData.class, WebLegalEntityUris.class, "legalEntityUris"));
builder.add(new ResourceConfig(WebNamedSnapshotsResource.class, WebNamedSnapshotData.class, WebNamedSnapshotUris.class, "namedSnapshotUris"));
builder.add(new ResourceConfig(WebPortfoliosResource.class, WebPortfoliosData.class, WebPortfoliosUris.class, "portfolioUris"));
builder.add(new ResourceConfig(WebPositionsResource.class, WebPositionsData.class, WebPositionsUris.class, "positionUris"));
builder.add(new ResourceConfig(WebRegionsResource.class, WebRegionData.class, WebRegionUris.class, "regionUris"));
builder.add(new ResourceConfig(WebRolesResource.class, WebRoleData.class, WebRoleUris.class, "roleUris"));
builder.add(new ResourceConfig(WebSecuritiesResource.class, WebSecuritiesData.class, WebSecuritiesUris.class, "securityUris"));
builder.add(new ResourceConfig(WebUsersResource.class, WebUserData.class, WebUserUris.class, "userUris"));
RESOURCE_CONFIGS = builder.build();
}
private final Set<Class<?>> _publishedTypes;
/**
* Registers a new home page link.
* <p>
* This method is not intended for general use and may disappear without warning in the future.
*
* @param resourceType the resource type
* @param dataType the type of the web data class
* @param urisType the type of the web uri class
* @param name the name exposed to Freemarker
*/
public static void registerHomePageLink(
Class<?> resourceType, Class<? extends Bean> dataType, Class<?> urisType, String name) {
ResourceConfig config = new ResourceConfig(resourceType, dataType, urisType, name);
s_resourceConfigs.add(config);
}
//-------------------------------------------------------------------------
/**
* Creates the resource.
*
* @param publishedTypes the set of published types
*/
public WebHomeResource(Set<Class<?>> publishedTypes) {
_publishedTypes = publishedTypes;
}
//-------------------------------------------------------------------------
@GET
@Produces(MediaType.TEXT_HTML)
public String get(@Context ServletContext servletContext, @Context UriInfo uriInfo) {
FlexiBean out = createRootData(uriInfo);
return getFreemarker(servletContext).build("home.ftl", out);
}
//-------------------------------------------------------------------------
/**
* Creates the output root data.
*
* @param uriInfo the URI information, not null
* @return the output root data, not null
*/
@Override
protected FlexiBean createRootData(UriInfo uriInfo) {
FlexiBean out = super.createRootData(uriInfo);
out.put("uris", new WebHomeUris(uriInfo));
for (ResourceConfig config : RESOURCE_CONFIGS) {
if (_publishedTypes.contains(config._resourceType)) {
Object uriObj = createUriObj(config, uriInfo);
out.put(config._name, uriObj);
}
}
for (ResourceConfig config : s_resourceConfigs) {
Object uriObj = createUriObj(config, uriInfo);
out.put(config._name, uriObj);
}
return out;
}
private Object createUriObj(ResourceConfig resourceConfig, UriInfo uriInfo) {
try {
Bean dataInstance = resourceConfig._dataClazz.newInstance();
dataInstance.property("uriInfo").set(uriInfo);
return resourceConfig._uris.getConstructor(resourceConfig._dataClazz).newInstance(dataInstance);
} catch (Exception e) {
throw new IllegalStateException("Failed to create uri for resource " + resourceConfig._name);
}
}
private static class ResourceConfig {
private final Class<?> _resourceType;
private final Class<? extends Bean> _dataClazz;
private final Class<?> _uris;
private final String _name;
public ResourceConfig(Class<?> resourceType, Class<? extends Bean> dataClazz, Class<?> uris, String name) {
_resourceType = resourceType;
_dataClazz = dataClazz;
_uris = uris;
_name = name;
}
}
//-------------------------------------------------------------------------
/**
* Builds a URI for this page.
* @param uriInfo the uriInfo, not null
* @return the URI, not null
*/
public static URI uri(UriInfo uriInfo) {
return uriInfo.getBaseUriBuilder().path(WebHomeResource.class).build();
}
}