Skip to content

Commit

Permalink
Add the package org.apache.fileupload2.jaksrvlt,
Browse files Browse the repository at this point in the history
for compliance with Jakarta Servlet API 5.0.
(See #25.)
  • Loading branch information
jochenw committed May 4, 2020
1 parent 487e7a3 commit cd03180
Show file tree
Hide file tree
Showing 8 changed files with 1,116 additions and 5 deletions.
9 changes: 8 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
<parent>
<groupId>org.apache.commons</groupId>
<artifactId>commons-parent</artifactId>
<version>48</version>
<version>50</version>
</parent>

<artifactId>commons-fileupload2</artifactId>
Expand Down Expand Up @@ -250,6 +250,12 @@
<artifactId>commons-io</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0-M1</version>
<scope>provided</scope>
</dependency>
</dependencies>

<build>
Expand Down Expand Up @@ -332,6 +338,7 @@
</plugin>
</plugins>
</pluginManagement>
<defaultGoal>clean verify apache-rat:check clirr:check javadoc:javadoc</defaultGoal>

This comment has been minimized.

Copy link
@michael-o

michael-o May 4, 2020

Member

Seriously?

This comment has been minimized.

Copy link
@jochenw

jochenw May 4, 2020

Author Contributor

Why not? We remain usable with javax.servlet, and become usable with jakarta.servlet. Where's the drawback?

This comment has been minimized.

Copy link
@michael-o

michael-o May 4, 2020

Member

I was referring with the defaultGoal.

This comment has been minimized.

Copy link
@jochenw

jochenw May 5, 2020

Author Contributor

Setting a defaultGoal seems to make sense. So, I assume that you don't like my choice of targets. To be honest, I simply copied them from commons-lang. What would you suggest?

This comment has been minimized.

Copy link
@michael-o

michael-o May 5, 2020

Member

It looks too much for default. It should be at most package or install. RAT should run with a certain phase. This is what we have in all maven-parent derived projects. The rest should be optional.

</build>

<reporting>
Expand Down
3 changes: 3 additions & 0 deletions src/changes/changes.xml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@ The <action> type attribute can be add,update,fix,remove.
<action dev="jochen" type="update">Bumping Compiler Level to 1.8.</action>
<action issue="FILEUPLOAD-293" dev="jochen" type="fix">DiskFileItem.write(File) had been changed to use FileUtils.moveFile internally, preventing an existing file as the target.</action>
<action issue="FILEUPLOAD-296" dev="jochen" type="fix" due-to="David Georg Reochelt">Performance gains by reusing an internal buffer.</action>
<action dev="jochen" type="add">Add the package org.apache.fileupload2.jaksrvlt,
for compliance with Jakarta Servlet API 5.0.
</action>
</release>
<release version="1.4" date="2018-12-23" description="1.4 Release">
<action issue="FILEUPLOAD-292" dev="chtompki" type="update">Don't create un-needed resources in FileUploadBase.java</action>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
/*
* 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.commons.fileupload2.jaksrvlt;

import java.io.IOException;
import java.util.List;
import java.util.Map;

import jakarta.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload2.FileItem;
import org.apache.commons.fileupload2.FileItemFactory;
import org.apache.commons.fileupload2.FileItemIterator;
import org.apache.commons.fileupload2.FileUpload;
import org.apache.commons.fileupload2.FileUploadBase;
import org.apache.commons.fileupload2.FileUploadException;

/**
* <p>High level API for processing file uploads.</p>
*
* <p>This class handles multiple files per single HTML widget, sent using
* {@code multipart/mixed} encoding type, as specified by
* <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a>. Use {@link
* #parseRequest(HttpServletRequest)} to acquire a list of {@link
* org.apache.commons.fileupload2.FileItem}s associated with a given HTML
* widget.</p>
*
* <p>How the data for individual parts is stored is determined by the factory
* used to create them; a given part may be in memory, on disk, or somewhere
* else.</p>
*/
public class JakSrvltFileUpload extends FileUpload {

/**
* Constant for HTTP POST method.
*/
private static final String POST_METHOD = "POST";

// ---------------------------------------------------------- Class methods

/**
* Utility method that determines whether the request contains multipart
* content.
*
* @param request The servlet request to be evaluated. Must be non-null.
*
* @return {@code true} if the request is multipart;
* {@code false} otherwise.
*/
public static final boolean isMultipartContent(
HttpServletRequest request) {
if (!POST_METHOD.equalsIgnoreCase(request.getMethod())) {
return false;
}
return FileUploadBase.isMultipartContent(new JakSrvltRequestContext(request));
}

// ----------------------------------------------------------- Constructors

/**
* Constructs an uninitialised instance of this class. A factory must be
* configured, using {@code setFileItemFactory()}, before attempting
* to parse requests.
*
* @see FileUpload#FileUpload(FileItemFactory)
*/
public JakSrvltFileUpload() {
super();
}

/**
* Constructs an instance of this class which uses the supplied factory to
* create {@code FileItem} instances.
*
* @see FileUpload#FileUpload()
* @param fileItemFactory The factory to use for creating file items.
*/
public JakSrvltFileUpload(FileItemFactory fileItemFactory) {
super(fileItemFactory);
}

// --------------------------------------------------------- Public methods

/**
* Processes an <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a>
* compliant {@code multipart/form-data} stream.
*
* @param request The servlet request to be parsed.
*
* @return A list of {@code FileItem} instances parsed from the
* request, in the order that they were transmitted.
*
* @throws FileUploadException if there are problems reading/parsing
* the request or storing files.
*/
public List<FileItem> parseRequest(HttpServletRequest request) throws FileUploadException {
return parseRequest(new JakSrvltRequestContext(request));
}

/**
* Processes an <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a>
* compliant {@code multipart/form-data} stream.
*
* @param request The servlet request to be parsed.
*
* @return A map of {@code FileItem} instances parsed from the request.
*
* @throws FileUploadException if there are problems reading/parsing
* the request or storing files.
*
* @since 1.3
*/
public Map<String, List<FileItem>> parseParameterMap(HttpServletRequest request)
throws FileUploadException {
return parseParameterMap(new JakSrvltRequestContext(request));
}

/**
* Processes an <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a>
* compliant {@code multipart/form-data} stream.
*
* @param request The servlet request to be parsed.
*
* @return An iterator to instances of {@code FileItemStream}
* parsed from the request, in the order that they were
* transmitted.
*
* @throws FileUploadException if there are problems reading/parsing
* the request or storing files.
* @throws IOException An I/O error occurred. This may be a network
* error while communicating with the client or a problem while
* storing the uploaded content.
*/
public FileItemIterator getItemIterator(HttpServletRequest request)
throws FileUploadException, IOException {
return super.getItemIterator(new JakSrvltRequestContext(request));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
/*
* 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.commons.fileupload2.jaksrvlt;

import static java.lang.String.format;

import java.io.IOException;
import java.io.InputStream;

import jakarta.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload2.FileUploadBase;
import org.apache.commons.fileupload2.UploadContext;

/**
* <p>Provides access to the request information needed for a request made to
* an HTTP servlet.</p>
*
* @since FileUpload 1.1
*/
public class JakSrvltRequestContext implements UploadContext {

// ----------------------------------------------------- Instance Variables

/**
* The request for which the context is being provided.
*/
private final HttpServletRequest request;

// ----------------------------------------------------------- Constructors

/**
* Construct a context for this request.
*
* @param request The request to which this context applies.
*/
public JakSrvltRequestContext(HttpServletRequest request) {
this.request = request;
}

// --------------------------------------------------------- Public Methods

/**
* Retrieve the character encoding for the request.
*
* @return The character encoding for the request.
*/
@Override
public String getCharacterEncoding() {
return request.getCharacterEncoding();
}

/**
* Retrieve the content type of the request.
*
* @return The content type of the request.
*/
@Override
public String getContentType() {
return request.getContentType();
}

/**
* Retrieve the content length of the request.
*
* @return The content length of the request.
* @deprecated 1.3 Use {@link #contentLength()} instead
*/
@Override
@Deprecated
public int getContentLength() {
return request.getContentLength();
}

/**
* Retrieve the content length of the request.
*
* @return The content length of the request.
* @since 1.3
*/
@Override
public long contentLength() {
long size;
try {
size = Long.parseLong(request.getHeader(FileUploadBase.CONTENT_LENGTH));
} catch (NumberFormatException e) {
size = request.getContentLength();
}
return size;
}

/**
* Retrieve the input stream for the request.
*
* @return The input stream for the request.
*
* @throws IOException if a problem occurs.
*/
@Override
public InputStream getInputStream() throws IOException {
return request.getInputStream();
}

/**
* Returns a string representation of this object.
*
* @return a string representation of this object.
*/
@Override
public String toString() {
return format("ContentLength=%s, ContentType=%s",
Long.valueOf(this.contentLength()),
this.getContentType());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/*
* 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.
*/

/**
* <p>
* An implementation of
* {@link org.apache.commons.fileupload2.FileUpload FileUpload}
* for use in servlets conforming to the namespace {@code jakarta.servlet}.
*
* </p>
* <p>
* The following code fragment demonstrates typical usage.
* </p>
* <pre>
* DiskFileItemFactory factory = new DiskFileItemFactory();
* // Configure the factory here, if desired.
* JakSrvltFileUpload upload = new JakSrvltFileUpload(factory);
* // Configure the uploader here, if desired.
* List fileItems = upload.parseRequest(request);
* </pre>
* <p>
* Please see the FileUpload
* <a href="https://commons.apache.org/fileupload/using.html" target="_top">User Guide</a>
* for further details and examples of how to use this package.
* </p>
*/
package org.apache.commons.fileupload2.jaksrvlt;
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,10 @@ private Streams() {
* @param outputStream The output stream, to which data should
* be written. May be null, in which case the input streams
* contents are simply discarded.
* @param closeOutputStream True guarantees, that {@link OutputStream#close()}
* is called on the stream. False indicates, that only
* @param closeOutputStream True guarantees, that
* {@link OutputStream#close()} is called on the stream.
* False indicates, that only
* {@link OutputStream#flush()} should be called finally.
*
* @return Number of bytes, which have been copied.
* @throws IOException An I/O error occurred.
*/
Expand Down Expand Up @@ -153,7 +153,8 @@ public static String asString(InputStream inputStream) throws IOException {
* @return The streams contents, as a string.
* @throws IOException An I/O error occurred.
*/
public static String asString(InputStream inputStream, String encoding) throws IOException {
public static String asString(final InputStream inputStream, final String encoding)
throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
copy(inputStream, baos, true);
return baos.toString(encoding);
Expand Down
Loading

0 comments on commit cd03180

Please sign in to comment.