neembuu.vfs.test.FileNameAndSizeFinderService.java Source code

Java tutorial

Introduction

Here is the source code for neembuu.vfs.test.FileNameAndSizeFinderService.java

Source

/*
 * Copyright (C) 2011 Shashank Tulsyan
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package neembuu.vfs.test;

import java.security.KeyStore;
import java.util.logging.Level;
import java.util.logging.Logger;
import jpfm.util.UniversallyValidFileName;
import neembuu.config.GlobalTestSettings;
import org.apache.http.HttpConnection;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.AuthState;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.protocol.ClientContext;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.DefaultHttpClientConnection;
import org.apache.http.impl.auth.BasicScheme;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.SingleClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.ExecutionContext;
import org.apache.http.protocol.HttpContext;

/**
 *
 * @author Shashank Tulsyan
 */
public class FileNameAndSizeFinderService {
    private static final Logger LOGGER = Logger.getLogger(FileNameAndSizeFinderService.class.getName());
    private final static FileNameAndSizeFinderService SINGLETON = new FileNameAndSizeFinderService();

    FileNameAndSizeFinderService() {

    }

    public static final class SIZE_AND_NAME {
        public final String fileName;
        public final long fileSize;

        private SIZE_AND_NAME(String fileName, long fileSize) {
            this.fileName = fileName;
            this.fileSize = fileSize;
        }
    }

    private DefaultHttpClient newClient() {
        DefaultHttpClient client = new DefaultHttpClient();
        GlobalTestSettings.ProxySettings proxySettings = GlobalTestSettings.getGlobalProxySettings();
        HttpContext context = new BasicHttpContext();
        SchemeRegistry schemeRegistry = new SchemeRegistry();

        schemeRegistry.register(new Scheme("http", new PlainSocketFactory(), 80));

        try {
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
            schemeRegistry.register(new Scheme("https", new SSLSocketFactory(keyStore), 8080));
        } catch (Exception a) {
            a.printStackTrace(System.err);
        }

        context.setAttribute(ClientContext.SCHEME_REGISTRY, schemeRegistry);
        context.setAttribute(ClientContext.AUTHSCHEME_REGISTRY,
                new BasicScheme()/*file.httpClient.getAuthSchemes()*/);

        context.setAttribute(ClientContext.COOKIESPEC_REGISTRY,
                client.getCookieSpecs()/*file.httpClient.getCookieSpecs()*/
        );

        BasicCookieStore basicCookieStore = new BasicCookieStore();

        context.setAttribute(ClientContext.COOKIE_STORE, basicCookieStore/*file.httpClient.getCookieStore()*/);
        context.setAttribute(ClientContext.CREDS_PROVIDER,
                new BasicCredentialsProvider()/*file.httpClient.getCredentialsProvider()*/);

        HttpConnection hc = new DefaultHttpClientConnection();
        context.setAttribute(ExecutionContext.HTTP_CONNECTION, hc);

        //System.out.println(file.httpClient.getParams().getParameter("http.useragent"));
        HttpParams httpParams = new BasicHttpParams();

        if (proxySettings != null) {
            AuthState as = new AuthState();
            as.setCredentials(new UsernamePasswordCredentials(proxySettings.userName, proxySettings.password));
            as.setAuthScope(AuthScope.ANY);
            as.setAuthScheme(new BasicScheme());
            httpParams.setParameter(ClientContext.PROXY_AUTH_STATE, as);
            httpParams.setParameter("http.proxy_host", new HttpHost(proxySettings.host, proxySettings.port));
        }

        client = new DefaultHttpClient(
                new SingleClientConnManager(httpParams/*file.httpClient.getParams()*/, schemeRegistry),
                httpParams/*file.httpClient.getParams()*/);

        if (proxySettings != null) {
            client.getCredentialsProvider().setCredentials(AuthScope.ANY,
                    new UsernamePasswordCredentials(proxySettings.userName, proxySettings.password));
        }

        return client;
    }

    public final SIZE_AND_NAME getSizeAndName(String url) {

        String fileName = url.substring(url.lastIndexOf('/') + 1);

        try {
            DefaultHttpClient httpClient = newClient();
            HttpGet request = new HttpGet(url);

            HttpResponse response = httpClient.execute(request);

            //resp.setHeader("Content-Disposition", "attachment; filename=" + fileName );
            //resp.setHeader("Content-Type", "attachment; filename=" + fileName );
            try {
                String tmp = response.getHeaders("Content-Disposition")[0].getValue();
                int i = tmp.lastIndexOf("filename=");
                if (i > 0) {
                    fileName = tmp.substring(i + 9);
                    fileName = trimLeadingAndTrailingInvertedComma(fileName);
                }
            } catch (Exception a) {
                String tmp = response.getHeaders("Content-Type")[0].getValue();
                try {
                    int i = tmp.lastIndexOf("filename=");
                    if (i > 0) {
                        fileName = tmp.substring(i + 9);
                        fileName = trimLeadingAndTrailingInvertedComma(fileName);
                    }
                } catch (Exception a2) {
                    LOGGER.log(Level.INFO, "Can\'t get filename from Content-Disposition header", a);
                    LOGGER.log(Level.INFO, "Can\'t get filename from Content-Type header", a2);
                    fileName = url.substring(url.lastIndexOf('/') + 1);
                }
            }

            long length = response.getEntity().getContentLength();
            LOGGER.log(Level.INFO, "File size found = {0}", length);
            if (length < 0) {
                LOGGER.info("length < 0 , not setting");
            } else {
                return new SIZE_AND_NAME(UniversallyValidFileName.makeUniversallyValidFileName(fileName), length);
            }
            request.abort();
        } catch (Exception any) {
            LOGGER.log(Level.INFO, "Can\'t get filesize", any);
        }
        return new SIZE_AND_NAME(UniversallyValidFileName.makeUniversallyValidFileName(fileName), -1);
    }

    private static String trimLeadingAndTrailingInvertedComma(String a) {
        if (a.charAt(0) == '\"') {
            a = a.substring(1);
        }
        if (a.charAt(a.length() - 1) == '\"') {
            a = a.substring(0, a.length() - 1);
        }
        return a;
    }

    public final long getSize(String url) {
        try {
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpGet request = new HttpGet(url);

            HttpResponse response = httpClient.execute(request);
            long length = response.getEntity().getContentLength();
            LOGGER.log(Level.INFO, "File size found = {0}", length);
            if (length < 0) {
                LOGGER.info("length < 0 , not setting");
            } else {
                return length;
            }
            request.abort();
        } catch (Exception any) {
            LOGGER.log(Level.INFO, "", any);
        }
        return -1;
    }

    public static FileNameAndSizeFinderService getSingleton() {
        return SINGLETON;
    }

}