Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
org.apache.wink.server.internal.servlet.AdminServlet Maven / Gradle / Ivy
/*******************************************************************************
* 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.wink.server.internal.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.core.MediaType;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import org.apache.wink.common.http.HttpStatus;
import org.apache.wink.common.internal.i18n.Messages;
import org.apache.wink.common.internal.model.admin.MatrixParameters;
import org.apache.wink.common.internal.model.admin.Parameter;
import org.apache.wink.common.internal.model.admin.QueryParameters;
import org.apache.wink.common.internal.model.admin.Registry;
import org.apache.wink.common.internal.model.admin.Resource;
import org.apache.wink.common.internal.model.admin.Resources;
import org.apache.wink.common.internal.model.admin.SubResource;
import org.apache.wink.common.internal.model.admin.SubResources;
import org.apache.wink.common.internal.registry.BoundInjectable;
import org.apache.wink.common.internal.registry.Injectable;
import org.apache.wink.common.internal.registry.metadata.MethodMetadata;
import org.apache.wink.common.internal.uritemplate.UriTemplateProcessor;
import org.apache.wink.common.internal.utils.JAXBUtils;
import org.apache.wink.server.internal.RequestProcessor;
import org.apache.wink.server.internal.registry.ResourceRecord;
import org.apache.wink.server.internal.registry.ResourceRegistry;
public class AdminServlet extends AbstractRestServlet {
private static final long serialVersionUID =
-5972412568762942420L;
private static final String APPLICATION_XML =
"application/xml"; //$NON-NLS-1$
private static final String DOCUMENT_TYPE =
"doc"; //$NON-NLS-1$
private static final String DOCUMENT_TYPE_REGISTRY =
"registry"; //$NON-NLS-1$
private static final String DOCUMENT_TYPE_RESOURCE =
"resources"; //$NON-NLS-1$
private static final String SLASH =
"/"; //$NON-NLS-1$
private static final JAXBContext resourceCtx;
private static final org.apache.wink.common.internal.model.admin.ObjectFactory resourcesObjectFactory;
static {
resourcesObjectFactory = new org.apache.wink.common.internal.model.admin.ObjectFactory();
try {
resourceCtx =
JAXBContext
.newInstance(org.apache.wink.common.internal.model.admin.ObjectFactory.class
.getPackage().getName());
} catch (JAXBException e) {
throw new RuntimeException(Messages
.getMessage("adminServletFailCreateJAXBForAdminServlet"), e); //$NON-NLS-1$
}
}
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException,
ServletException {
RequestProcessor requestProcessor = getRequestProcessor();
if (requestProcessor == null) {
throw new ServletException(Messages
.getMessage("adminServletRequestProcessorInitBeforeAdmin")); //$NON-NLS-1$
}
ResourceRegistry registry = requestProcessor.getConfiguration().getResourceRegistry();
String[] parameterValues = request.getParameterValues(DOCUMENT_TYPE);
if (parameterValues == null || parameterValues.length == 0) {
buildAdminHome(response);
return;
}
if (parameterValues[0].equals(DOCUMENT_TYPE_REGISTRY)) {
buildRegistryDocument(request, response, registry);
} else if (parameterValues[0].equals(DOCUMENT_TYPE_RESOURCE)) {
buildResourcesDocument(request, response, registry);
} else {
buildAdminHome(response);
return;
}
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
doGet(request, response);
}
private void buildRegistryDocument(HttpServletRequest request,
HttpServletResponse response,
ResourceRegistry registry) throws ServletException,
IOException {
Registry xmlRgistry = resourcesObjectFactory.createRegistry();
org.apache.wink.common.internal.model.admin.Resources resources =
resourcesObjectFactory.createResources();
List records = registry.getRecords();
for (ResourceRecord record : records) {
// Add current resource
Resource xmLResource = buildResource(record);
xmLResource.setPriority(new BigDecimal(record.getPriority()));
xmLResource.setClassName(record.getMetadata().getResourceClass().getCanonicalName());
// Add sub-resource locators & methods
addSubRrcMethodsAndLocators(xmLResource, record);
resources.getResource().add(xmLResource);
}
// Write Document
xmlRgistry.setResources(resources);
writeDocument(response, xmlRgistry);
return;
}
private void addSubRrcMethodsAndLocators(Resource xmLResource, ResourceRecord record) {
List subResourceLocators = record.getMetadata().getSubResourceLocators();
List subResourceMethods = record.getMetadata().getSubResourceMethods();
SubResources subResources = resourcesObjectFactory.createSubResources();
buildSubReasource(record, subResourceLocators, subResources, true);
buildSubReasource(record, subResourceMethods, subResources, false);
xmLResource.setSubResources(subResources);
}
private void buildSubReasource(ResourceRecord record,
List subResourceLocators,
SubResources subResources,
boolean isLocator) {
for (MethodMetadata subResourceLocator : subResourceLocators) {
SubResource subResource = resourcesObjectFactory.createSubResource();
UriTemplateProcessor uriTemplate = record.getTemplateProcessor();
subResource.setUri(SLASH + uriTemplate.getTemplate() + subResourceLocator.getPath());
if (isLocator) {
subResource.setType("Locator"); //$NON-NLS-1$
} else {
subResource.setType("Method"); //$NON-NLS-1$
subResource.setMethod(subResourceLocator.getHttpMethod().toString());
}
org.apache.wink.common.internal.model.admin.AcceptMediaTypes acceptMediaTypes =
resourcesObjectFactory.createAcceptMediaTypes();
buildCunsumeMimeTypes(subResourceLocator, acceptMediaTypes);
subResource.setAcceptMediaTypes(acceptMediaTypes);
// Add produce mime types
org.apache.wink.common.internal.model.admin.ProducedMediaTypes producedMediaTypes =
resourcesObjectFactory.createProducedMediaTypes();
buildProduceMimeTypes(subResourceLocator, producedMediaTypes);
subResource.setProducedMediaTypes(producedMediaTypes);
// Add Query Parameters
QueryParameters qParams = resourcesObjectFactory.createQueryParameters();
buildQueryParams(subResourceLocator, qParams);
subResource.setQueryParameters(qParams);
// Add Matrinx Parameters
MatrixParameters mParams = resourcesObjectFactory.createMatrixParameters();
buildMatrixParams(subResourceLocator, mParams);
subResource.setMatrixParameters(mParams);
subResources.getSubResource().add(subResource);
}
}
/**
* Build Resources Document. This document will contain resource oriented
* information about all registered resources
*
* @param request HttpServletRequest
* @param response HttpServletResponse
* @param resourceRegistry TODO
* @throws IOException
* @throws ServletException
*/
private void buildResourcesDocument(HttpServletRequest request,
HttpServletResponse response,
ResourceRegistry resourceRegistry) throws IOException,
ServletException {
List records = resourceRegistry.getRecords();
org.apache.wink.common.internal.model.admin.Resources resources =
resourcesObjectFactory.createResources();
for (ResourceRecord record : records) {
// Add current resource
resources.getResource().add(buildResource(record));
// Add sub-resource locators & methods
buildSubRrcMethodsAndLocatorsResources(resources, record);
}
// Write Document
writeDocument(response, resources);
return;
}
private void buildSubRrcMethodsAndLocatorsResources(Resources resources, ResourceRecord record) {
List subResourceLocators = record.getMetadata().getSubResourceLocators();
List subResourceMethods = record.getMetadata().getSubResourceMethods();
Map uri2ResourceMap = new HashMap();
for (MethodMetadata subResourceLocator : subResourceLocators) {
UriTemplateProcessor uriTemplate = record.getTemplateProcessor();
String uri = SLASH + uriTemplate.getTemplate() + subResourceLocator.getPath();
org.apache.wink.common.internal.model.admin.Methods xmlSRL =
createXMLSubResourceLocatorMethod(subResourceLocator);
addResourceMethods(uri2ResourceMap, uri, xmlSRL);
}
// Add all Sub Resource Locators as resources
resources.getResource().addAll(uri2ResourceMap.values());
uri2ResourceMap.clear();
for (MethodMetadata subResourceMethod : subResourceMethods) {
UriTemplateProcessor uriTemplate = record.getTemplateProcessor();
String uri = SLASH + uriTemplate.getTemplate() + SLASH + subResourceMethod.getPath();
org.apache.wink.common.internal.model.admin.Methods xmlSRM =
createXMLSubResourceMethod(subResourceMethod);
addResourceMethods(uri2ResourceMap, uri, xmlSRM);
}
// Add all Sub Resource Methods as resources
resources.getResource().addAll(uri2ResourceMap.values());
}
private void addResourceMethods(Map uri2ResourceMap,
String uri,
org.apache.wink.common.internal.model.admin.Methods xmlSRL) {
if (uri2ResourceMap.get(uri) != null) {
Resource r = uri2ResourceMap.get(uri);
r.getMethods().getMethod().addAll(xmlSRL.getMethod());
} else {
Resource newResource = resourcesObjectFactory.createResource();
newResource.setUri(uri);
newResource.setMethods(xmlSRL);
uri2ResourceMap.put(uri, newResource);
}
}
private org.apache.wink.common.internal.model.admin.Methods createXMLSubResourceLocatorMethod(MethodMetadata subResourceLocator) {
org.apache.wink.common.internal.model.admin.Methods methods =
resourcesObjectFactory.createMethods();
org.apache.wink.common.internal.model.admin.Methods.Method httpMethod =
resourcesObjectFactory.createMethodsMethod();
httpMethod.setName("Dynamic"); //$NON-NLS-1$
// Add consume mime types
org.apache.wink.common.internal.model.admin.AcceptMediaTypes acceptMediaTypes =
resourcesObjectFactory.createAcceptMediaTypes();
buildCunsumeMimeTypes(subResourceLocator, acceptMediaTypes);
// Add produce mime types
org.apache.wink.common.internal.model.admin.ProducedMediaTypes producedMediaTypes =
resourcesObjectFactory.createProducedMediaTypes();
buildProduceMimeTypes(subResourceLocator, producedMediaTypes);
// Add Query Parameters
QueryParameters qParams = resourcesObjectFactory.createQueryParameters();
buildQueryParams(subResourceLocator, qParams);
// Add Matrinx Parameters
MatrixParameters mParams = resourcesObjectFactory.createMatrixParameters();
buildMatrixParams(subResourceLocator, mParams);
httpMethod.setQueryParameters(qParams);
httpMethod.setProducedMediaTypes(producedMediaTypes);
httpMethod.setAcceptMediaTypes(acceptMediaTypes);
httpMethod.setMatrixParameters(mParams);
methods.getMethod().add(httpMethod);
return methods;
}
private org.apache.wink.common.internal.model.admin.Methods createXMLSubResourceMethod(MethodMetadata subResourceMethod) {
org.apache.wink.common.internal.model.admin.Methods methods =
resourcesObjectFactory.createMethods();
List methodRecord = new LinkedList();
methodRecord.add(subResourceMethod);
addResourceMethods(methodRecord, methods);
return methods;
}
private Resource buildResource(ResourceRecord record) {
Resource newResource = resourcesObjectFactory.createResource();
// Add dispatched URIs
UriTemplateProcessor uriTemplate = record.getTemplateProcessor();
newResource.setUri(SLASH + uriTemplate.getTemplate());
// Add Collection/Workspace data
newResource.setWorkspace(record.getMetadata().getWorkspaceName());
newResource.setCollection(record.getMetadata().getCollectionTitle());
// Add supported HTTP methods
List methodRecords = new LinkedList();
methodRecords.addAll(record.getMetadata().getResourceMethods());
org.apache.wink.common.internal.model.admin.Methods methods =
resourcesObjectFactory.createMethods();
addResourceMethods(methodRecords, methods);
newResource.setMethods(methods);
return newResource;
}
/**
* Add Http methods supported by resource. Http methods are grouped by
* method name
*
* @param methodRecords
* @param methods2xml
*/
private void addResourceMethods(List methodMD,
org.apache.wink.common.internal.model.admin.Methods methods2xml) {
for (MethodMetadata methodMetadata : methodMD) {
org.apache.wink.common.internal.model.admin.Methods.Method httpMethod =
resourcesObjectFactory.createMethodsMethod();
httpMethod.setName(methodMetadata.getHttpMethod().toString());
// Add consume mime types
org.apache.wink.common.internal.model.admin.AcceptMediaTypes acceptMediaTypes =
resourcesObjectFactory.createAcceptMediaTypes();
buildCunsumeMimeTypes(methodMetadata, acceptMediaTypes);
// Add produce mime types
org.apache.wink.common.internal.model.admin.ProducedMediaTypes producedMediaTypes =
resourcesObjectFactory.createProducedMediaTypes();
buildProduceMimeTypes(methodMetadata, producedMediaTypes);
// Add Query Parameters
QueryParameters qParams = resourcesObjectFactory.createQueryParameters();
buildQueryParams(methodMetadata, qParams);
// Add Matrinx Parameters
MatrixParameters mParams = resourcesObjectFactory.createMatrixParameters();
buildMatrixParams(methodMetadata, mParams);
httpMethod.setQueryParameters(qParams);
httpMethod.setProducedMediaTypes(producedMediaTypes);
httpMethod.setAcceptMediaTypes(acceptMediaTypes);
httpMethod.setMatrixParameters(mParams);
methods2xml.getMethod().add(httpMethod);
}
}
private void buildMatrixParams(MethodMetadata methodMetadata, MatrixParameters params) {
List formalParameters = methodMetadata.getFormalParameters();
for (Injectable var : formalParameters) {
if (var.getParamType() == Injectable.ParamType.MATRIX) {
Parameter param = resourcesObjectFactory.createParameter();
param.setValue(((BoundInjectable)var).getName());
params.getParameter().add(param);
}
}
}
/**
* Write XmlObject to the wire
*
* @param response HttpServletResponse
* @param document XmlObject
* @throws IOException
* @throws IOException
*/
private void writeDocument(HttpServletResponse response, Object jaxbObject)
throws ServletException, IOException {
PrintWriter writer = response.getWriter();
// Write Document
response.setContentType(APPLICATION_XML);
try {
Marshaller marshaller = JAXBUtils.createMarshaller(resourceCtx);
marshaller.marshal(jaxbObject, writer);
} catch (JAXBException e) {
throw new ServletException(Messages.getMessage("adminServletFailMarshalObject", //$NON-NLS-1$
jaxbObject.getClass().getName()), e);
}
response.flushBuffer();
writer.close();
}
/**
* Build Admin Home Page
*
* @param response
* @throws IOException
*/
private void buildAdminHome(HttpServletResponse response) throws IOException {
// Set the status code before writing content to the stream
// per the servlet specification.
response.setStatus(HttpStatus.BAD_REQUEST.getCode());
PrintWriter writer = response.getWriter();
writer
.write("\r\n" + "\r\n" //$NON-NLS-1$ //$NON-NLS-2$
+ "Admin Console \r\n" //$NON-NLS-1$
+ "" //$NON-NLS-1$
+ "\r\n" //$NON-NLS-1$
+ "\r\n" //$NON-NLS-1$
+ "\r\n" //$NON-NLS-1$
+ "\r\n" //$NON-NLS-1$
+ ""); //$NON-NLS-1$
writer.close();
return;
}
private void buildQueryParams(MethodMetadata methodMetadata, QueryParameters xmlQueryVariables) {
List formalParameters = methodMetadata.getFormalParameters();
for (Injectable var : formalParameters) {
if (var.getParamType() == Injectable.ParamType.QUERY) {
Parameter param = resourcesObjectFactory.createParameter();
param.setValue(((BoundInjectable)var).getName());
xmlQueryVariables.getParameter().add(param);
}
}
}
private void buildProduceMimeTypes(MethodMetadata methodMetadata,
org.apache.wink.common.internal.model.admin.ProducedMediaTypes xmlProducedMediaTypes) {
Set producedMime = methodMetadata.getProduces();
for (MediaType mediaType : producedMime) {
xmlProducedMediaTypes.getProducedMediaType().add(mediaType.getType() + SLASH
+ mediaType.getSubtype());
}
}
private void buildCunsumeMimeTypes(MethodMetadata methodMetadata,
org.apache.wink.common.internal.model.admin.AcceptMediaTypes xmlAcceptMediaTypes) {
Set consumedMime = methodMetadata.getConsumes();
for (MediaType mediaType : consumedMime) {
xmlAcceptMediaTypes.getAcceptMediaType().add(mediaType.getType() + SLASH
+ mediaType.getSubtype());
}
}
}