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.
/*
* Copyright (c) 2012, 2018 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/
package org.glassfish.jersey.media.multipart.internal;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.function.Function;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import javax.ws.rs.BadRequestException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyReader;
import javax.inject.Provider;
import org.glassfish.jersey.internal.inject.ExtractorException;
import org.glassfish.jersey.internal.util.ReflectionHelper;
import org.glassfish.jersey.internal.util.collection.MultivaluedStringMap;
import org.glassfish.jersey.media.multipart.BodyPartEntity;
import org.glassfish.jersey.media.multipart.FormDataBodyPart;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataMultiPart;
import org.glassfish.jersey.media.multipart.FormDataParam;
import org.glassfish.jersey.media.multipart.FormDataParamException;
import org.glassfish.jersey.message.MessageBodyWorkers;
import org.glassfish.jersey.message.MessageUtils;
import org.glassfish.jersey.message.internal.Utils;
import org.glassfish.jersey.server.ContainerRequest;
import org.glassfish.jersey.server.internal.inject.AbstractValueParamProvider;
import org.glassfish.jersey.server.internal.inject.MultivaluedParameterExtractor;
import org.glassfish.jersey.server.internal.inject.MultivaluedParameterExtractorProvider;
import org.glassfish.jersey.server.model.Parameter;
import org.jvnet.mimepull.MIMEParsingException;
/**
* Value supplier provider supporting the {@link FormDataParam} injection annotation and entity ({@link FormDataMultiPart})
* injection.
*
* @author Craig McClanahan
* @author Paul Sandoz
* @author Michal Gajdos
*/
final class FormDataParamValueParamProvider extends AbstractValueParamProvider {
private static final Logger LOGGER = Logger.getLogger(FormDataParamValueParamProvider.class.getName());
private abstract class ValueProvider implements Function {
/**
* Returns a {@code FormDataMultiPart} entity from the request and stores it in the request context properties.
*
* @return a form data multi part entity.
*/
FormDataMultiPart getEntity(ContainerRequest request) {
final String requestPropertyName = FormDataMultiPart.class.getName();
Object entity = request.getProperty(requestPropertyName);
if (entity == null) {
entity = request.readEntity(FormDataMultiPart.class);
if (entity == null) {
throw new BadRequestException(LocalizationMessages.ENTITY_IS_EMPTY());
}
request.setProperty(requestPropertyName, entity);
}
return (FormDataMultiPart) entity;
}
}
/**
* Provider supplier for entity of {@code FormDataMultiPart} type.
*/
private final class FormDataMultiPartProvider extends ValueProvider {
@Override
public FormDataMultiPart apply(ContainerRequest request) {
return getEntity(request);
}
}
/**
* Provider supplier for list of {@link org.glassfish.jersey.media.multipart.FormDataBodyPart} types injected via
* {@link FormDataParam} annotation.
*/
private final class ListFormDataBodyPartValueProvider extends ValueProvider> {
private final String name;
public ListFormDataBodyPartValueProvider(final String name) {
this.name = name;
}
@Override
public List apply(ContainerRequest request) {
return getEntity(request).getFields(name);
}
}
/**
* Provider supplier for list of {@link org.glassfish.jersey.media.multipart.FormDataContentDisposition} types injected via
* {@link FormDataParam} annotation.
*/
private final class ListFormDataContentDispositionProvider extends ValueProvider> {
private final String name;
public ListFormDataContentDispositionProvider(final String name) {
this.name = name;
}
@Override
public List apply(ContainerRequest request) {
final List parts = getEntity(request).getFields(name);
return parts == null ? null : parts.stream()
.map(FormDataBodyPart::getFormDataContentDisposition)
.collect(Collectors.toList());
}
}
/**
* Provider supplier for {@link org.glassfish.jersey.media.multipart.FormDataBodyPart} types injected via
* {@link FormDataParam} annotation.
*/
private final class FormDataBodyPartProvider extends ValueProvider {
private final String name;
public FormDataBodyPartProvider(final String name) {
this.name = name;
}
@Override
public FormDataBodyPart apply(ContainerRequest request) {
return getEntity(request).getField(name);
}
}
/**
* Provider supplier for {@link org.glassfish.jersey.media.multipart.FormDataContentDisposition} types injected via
* {@link FormDataParam} annotation.
*/
private final class FormDataContentDispositionProvider extends ValueProvider {
private final String name;
public FormDataContentDispositionProvider(final String name) {
this.name = name;
}
@Override
public FormDataContentDisposition apply(ContainerRequest request) {
final FormDataBodyPart part = getEntity(request).getField(name);
return part == null ? null : part.getFormDataContentDisposition();
}
}
/**
* Provider supplier for {@link java.io.File} types injected via {@link FormDataParam} annotation.
*/
private final class FileProvider extends ValueProvider {
private final String name;
public FileProvider(final String name) {
this.name = name;
}
@Override
public File apply(ContainerRequest request) {
final FormDataBodyPart part = getEntity(request).getField(name);
final BodyPartEntity entity = part != null ? part.getEntityAs(BodyPartEntity.class) : null;
if (entity != null) {
try {
// Create a temporary file.
final File file = Utils.createTempFile();
// Move the part (represented either via stream or file) to the specific temporary file.
entity.moveTo(file);
return file;
} catch (final IOException | MIMEParsingException cannotMove) {
// Unable to create a temporary file or move the file.
LOGGER.log(Level.WARNING, LocalizationMessages.CANNOT_INJECT_FILE(), cannotMove);
}
}
return null;
}
}
/**
* Provider supplier for generic types injected via {@link FormDataParam} annotation.
*/
private final class FormDataParamValueProvider extends ValueProvider