/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.isis.viewer.restfulobjects.server.resources;
import java.io.InputStream;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.SecurityContext;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.ext.Providers;
import org.apache.isis.applib.annotation.Where;
import org.apache.isis.applib.services.command.Command;
import org.apache.isis.applib.services.command.CommandContext;
import org.apache.isis.core.commons.authentication.AuthenticationSession;
import org.apache.isis.core.commons.config.IsisConfiguration;
import org.apache.isis.core.commons.url.UrlEncodingUtils;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
import org.apache.isis.core.metamodel.services.ServiceUtil;
import org.apache.isis.core.metamodel.services.ServicesInjector;
import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
import org.apache.isis.core.runtime.authentication.AuthenticationManager;
import org.apache.isis.core.runtime.system.context.IsisContext;
import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse.HttpStatusCode;
import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
import org.apache.isis.viewer.restfulobjects.rendering.service.RepresentationService;
import org.apache.isis.viewer.restfulobjects.rendering.util.Util;
import org.apache.isis.viewer.restfulobjects.server.ResourceContext;
import org.apache.isis.viewer.restfulobjects.server.util.OidUtils;
import org.apache.isis.viewer.restfulobjects.server.util.UrlDecoderUtils;
public abstract class ResourceAbstract {
@Context
HttpHeaders httpHeaders;
@Context
UriInfo uriInfo;
@Context
Request request;
@Context
HttpServletRequest httpServletRequest;
@Context
HttpServletResponse httpServletResponse;
@Context
SecurityContext securityContext;
@Context
Providers providers;
private ResourceContext resourceContext;
protected void init(
final Where where,
final RepresentationService.Intent intent) {
init(RepresentationType.GENERIC, where, intent);
}
protected void init(
final RepresentationType representationType,
Where where,
final RepresentationService.Intent intent) {
String queryStringIfAny = getUrlDecodedQueryStringIfAny();
init(representationType, where, intent, queryStringIfAny);
}
private String getUrlDecodedQueryStringIfAny() {
final String queryStringIfAny = httpServletRequest.getQueryString();
return UrlEncodingUtils.urlDecodeNullSafe(queryStringIfAny);
}
protected void init(
final RepresentationType representationType,
final Where where,
final RepresentationService.Intent intent,
final InputStream arguments) {
final String urlDecodedQueryString = Util.asStringUtf8(arguments);
init(representationType, where, intent, urlDecodedQueryString);
}
protected void init(
final RepresentationType representationType,
final Where where,
final RepresentationService.Intent intent,
final String urlUnencodedQueryString) {
if (!getIsisSessionFactory().inSession()) {
throw RestfulObjectsApplicationException.create(HttpStatusCode.UNAUTHORIZED);
}
if (getAuthenticationSession() == null) {
throw RestfulObjectsApplicationException.create(HttpStatusCode.UNAUTHORIZED);
}
this.resourceContext = new ResourceContext(
representationType, httpHeaders, providers, uriInfo, request, where, intent, urlUnencodedQueryString, httpServletRequest, httpServletResponse,
securityContext,
InteractionInitiatedBy.USER);
}
protected ResourceContext getResourceContext() {
return resourceContext;
}
protected void setCommandExecutor(Command.Executor executor) {
getServicesInjector().lookupServiceElseFail(CommandContext.class).getCommand().setExecutor(executor);
}
// //////////////////////////////////////////////////////////////
// Isis integration
// //////////////////////////////////////////////////////////////
protected ObjectAdapter getObjectAdapterElseThrowNotFound(String domainType, final String instanceId) {
ObjectAdapter objectAdapter = getObjectAdapterElseNull(domainType, instanceId);
if (objectAdapter == null) {
final String instanceIdUnencoded = UrlDecoderUtils.urlDecode(instanceId);
throw RestfulObjectsApplicationException.createWithMessage(HttpStatusCode.NOT_FOUND, "could not determine adapter for OID: '%s:%s'", domainType, instanceIdUnencoded);
}
return objectAdapter;
}
protected ObjectAdapter getObjectAdapterElseNull(String domainType, final String instanceId) {
return OidUtils.getObjectAdapterElseNull(resourceContext, domainType, instanceId);
}
protected ObjectAdapter getServiceAdapter(final String serviceId) {
final List<ObjectAdapter> serviceAdapters = getPersistenceSession().getServices();
for (final ObjectAdapter serviceAdapter : serviceAdapters) {
final Object servicePojo = serviceAdapter.getObject();
final String id = ServiceUtil.id(servicePojo);
if (serviceId.equals(id)) {
return serviceAdapter;
}
}
throw RestfulObjectsApplicationException.createWithMessage(HttpStatusCode.NOT_FOUND, "Could not locate service '%s'", serviceId);
}
// //////////////////////////////////////////////////////////////
// Dependencies (from singletons)
// //////////////////////////////////////////////////////////////
protected DeploymentCategory getDeploymentCategory() {
return getIsisSessionFactory().getDeploymentCategory();
}
protected IsisConfiguration getConfiguration () {
return getIsisSessionFactory().getConfiguration();
}
protected ServicesInjector getServicesInjector () {
return getIsisSessionFactory().getServicesInjector();
}
protected AuthenticationSession getAuthenticationSession() {
return getIsisSessionFactory().getCurrentSession().getAuthenticationSession();
}
protected AuthenticationManager getAuthenticationManager() {
return getIsisSessionFactory().getAuthenticationManager();
}
protected SpecificationLoader getSpecificationLoader() {
return getIsisSessionFactory().getSpecificationLoader();
}
protected PersistenceSession getPersistenceSession() {
return getIsisSessionFactory().getCurrentSession().getPersistenceSession();
}
protected IsisSessionFactory getIsisSessionFactory() {
return IsisContext.getSessionFactory();
}
// //////////////////////////////////////////////////////////////
// Dependencies (injected via @Context)
// //////////////////////////////////////////////////////////////
protected HttpServletRequest getServletRequest() {
return getResourceContext().getHttpServletRequest();
}
}