Package org.nutz.mock.servlet.multipart

Source Code of org.nutz.mock.servlet.multipart.MultipartInputStream

package org.nutz.mock.servlet.multipart;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;

import org.nutz.lang.Files;
import org.nutz.lang.Lang;
import org.nutz.mock.servlet.MockInputStream;
import org.nutz.mock.servlet.multipart.inputing.InputingHelper;
import org.nutz.mock.servlet.multipart.item.EndlMultipartItem;
import org.nutz.mock.servlet.multipart.item.FileMultipartItem;
import org.nutz.mock.servlet.multipart.item.ParamMultipartItem;

public class MultipartInputStream extends MockInputStream {

    private Map<String, String> mimes;

    private LinkedList<MultipartItem> items;

    private Iterator<MultipartItem> it;

    private MultipartItem current;

    private String boundary;

    private InputingHelper helper;

    public MultipartInputStream(String charset, String boundary) {
        this.boundary = boundary;
        this.helper = new InputingHelper(charset);
        mimes = new HashMap<String, String>();
        addMime("png", "image/png");
        addMime("jpg", "image/jpg");
        addMime("gif", "image/gif");
        addMime("txt", "text/plain");
        items = new LinkedList<MultipartItem>();
        items.add(new EndlMultipartItem(helper, boundary));
    }

    public String getCharset() {
        return helper.getCharset();
    }

    private String getContentType(String suffixName) {
        String ct = mimes.get(suffixName);
        if (null == ct)
            return "application/octet-stream";
        return ct;
    }

    public String getContentType() {
        return "multipart/form-data; boundary=" + boundary;
    }

    @Override
    public int available() throws IOException {
        int re = 0;
        Iterator<MultipartItem> it = items.iterator();
        while (it.hasNext())
            re += it.next().size();
        return re;
    }

    public MultipartInputStream addMime(String suffix, String contentType) {
        mimes.put(suffix, contentType);
        return this;
    }

    public void append(String name, File f) {
        String contentType = getContentType(Files.getSuffixName(f));
        FileMultipartItem fmi = new FileMultipartItem(helper, boundary, name, f, contentType);
        append(fmi);
    }

    public void append(String name, String value) {
        append(new ParamMultipartItem(helper, boundary, name, value));
    }

    private void append(MultipartItem item) {
        items.add(items.size() - 1, item);
    }

    public int read() throws IOException {
        int d = current.read();
        while (-1 == d) {
            if (!it.hasNext())
                return -1;
            current = it.next();
            d = current.read();
        }
        return d;
    }

    public void init() {
        try {
            for (MultipartItem item : items)
                item.init();
        }
        catch (IOException e) {
            throw Lang.wrapThrow(e);
        }
        it = items.iterator();
        current = it.next();
    }

    @Override
    public void close() throws IOException {
        try {
            for (MultipartItem item : items)
                item.close();
        }
        catch (IOException e) {
            throw Lang.wrapThrow(e);
        }
    }

}
TOP

Related Classes of org.nutz.mock.servlet.multipart.MultipartInputStream

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.