001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.commons.fileupload2.core;
018
019import org.apache.commons.io.FileCleaningTracker;
020import org.apache.commons.io.build.AbstractStreamBuilder;
021import org.apache.commons.io.file.PathUtils;
022
023/**
024 * Creates {@link FileItem} instances.
025 * <p>
026 * Factories can provide their own custom configuration, over and above that provided by the default file upload implementation.
027 * </p>
028 *
029 * @param <I> The {@link FileItem} type this factory creates.
030 */
031public interface FileItemFactory<I extends FileItem<I>> {
032
033    /**
034     * Abstracts building for subclasses.
035     *
036     * @param <I> the type of {@link FileItem} to build.
037     * @param <B> the type of builder subclass.
038     */
039    abstract class AbstractFileItemBuilder<I extends FileItem<I>, B extends AbstractFileItemBuilder<I, B>> extends AbstractStreamBuilder<I, B> {
040
041        public static FileItemHeaders newFileItemHeaders() {
042            return new FileItemHeadersImpl();
043        }
044
045        /**
046         * Field name.
047         */
048        private String fieldName;
049
050        /**
051         * Content type.
052         */
053        private String contentType;
054
055        /**
056         * Is this a form field.
057         */
058        private boolean isFormField;
059
060        /**
061         * File name.
062         */
063        private String fileName;
064
065        /**
066         * File item headers.
067         */
068        private FileItemHeaders fileItemHeaders = newFileItemHeaders();
069
070        /**
071         * The instance of {@link FileCleaningTracker}, which is responsible for deleting temporary files.
072         * <p>
073         * May be null, if tracking files is not required.
074         * </p>
075         */
076        private FileCleaningTracker fileCleaningTracker;
077
078        public AbstractFileItemBuilder() {
079            setBufferSize(DiskFileItemFactory.DEFAULT_THRESHOLD);
080            setPath(PathUtils.getTempDirectory());
081        }
082
083        public String getContentType() {
084            return contentType;
085        }
086
087        public String getFieldName() {
088            return fieldName;
089        }
090
091        public FileCleaningTracker getFileCleaningTracker() {
092            return fileCleaningTracker;
093        }
094
095        public FileItemHeaders getFileItemHeaders() {
096            return fileItemHeaders;
097        }
098
099        public String getFileName() {
100            return fileName;
101        }
102
103        public boolean isFormField() {
104            return isFormField;
105        }
106
107        public B setContentType(final String contentType) {
108            this.contentType = contentType;
109            return asThis();
110        }
111
112        public B setFieldName(final String fieldName) {
113            this.fieldName = fieldName;
114            return asThis();
115        }
116
117        public B setFileCleaningTracker(final FileCleaningTracker fileCleaningTracker) {
118            this.fileCleaningTracker = fileCleaningTracker;
119            return asThis();
120        }
121
122        public B setFileItemHeaders(final FileItemHeaders fileItemHeaders) {
123            this.fileItemHeaders = fileItemHeaders != null ? fileItemHeaders : newFileItemHeaders();
124            return asThis();
125        }
126
127        public B setFileName(final String fileName) {
128            this.fileName = fileName;
129            return asThis();
130        }
131
132        public B setFormField(final boolean isFormField) {
133            this.isFormField = isFormField;
134            return asThis();
135        }
136
137    }
138
139    /**
140     * Creates a new AbstractFileItemBuilder.
141     *
142     * @param <B> The type of AbstractFileItemBuilder.
143     * @return a new AbstractFileItemBuilder.
144     */
145    <B extends AbstractFileItemBuilder<I, B>> AbstractFileItemBuilder<I, B> fileItemBuilder();
146
147}