org.geoserver.web.wicket.FileExistsValidator.java Source code

Java tutorial

Introduction

Here is the source code for org.geoserver.web.wicket.FileExistsValidator.java

Source

/* Copyright (c) 2001 - 2013 OpenPlans - www.openplans.org. All rights reserved.
 * This code is licensed under the GPL 2.0 license, available at the root
 * application directory.
 */
package org.geoserver.web.wicket;

import java.io.File;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URLConnection;
import java.util.Collections;

import org.apache.commons.io.IOUtils;
import org.apache.wicket.validation.IValidatable;
import org.apache.wicket.validation.validator.AbstractValidator;
import org.apache.wicket.validation.validator.UrlValidator;
import org.geotools.util.Converters;
import org.vfny.geoserver.global.GeoserverDataDirectory;

/**
 * Checks the specified file exists on the file system, including checks in the data directory
 */
@SuppressWarnings("serial")
public class FileExistsValidator extends AbstractValidator {

    private UrlValidator delegate;

    /**
     * Checks the file exists on the local file system
     */
    public FileExistsValidator() {
        this(true);
    }

    /**
     * If <code>allowRemoveUrl</code> is true this validator allows the file to be either
     * local (no URI scheme, or file URI scheme) or a remote 
     * @param allowRemoteUrl
     */
    public FileExistsValidator(boolean allowRemoteUrl) {
        if (allowRemoteUrl) {
            this.delegate = new UrlValidator();
        }
    }

    @Override
    protected void onValidate(IValidatable validatable) {
        String uriSpec = Converters.convert(validatable.getValue(), String.class);

        // Make sure we are dealing with a local path
        try {
            URI uri = new URI(uriSpec);
            if (uri.getScheme() != null && !"file".equals(uri.getScheme())) {
                if (delegate != null) {
                    delegate.validate(validatable);
                    InputStream is = null;
                    try {
                        URLConnection connection = uri.toURL().openConnection();
                        connection.setConnectTimeout(10000);
                        is = connection.getInputStream();
                    } catch (Exception e) {
                        error(validatable, "FileExistsValidator.unreachable",
                                Collections.singletonMap("file", uriSpec));
                    } finally {
                        IOUtils.closeQuietly(is);
                    }
                }
                return;
            } else {
                // ok, strip away the scheme and just get to the path
                String path = uri.getPath();
                if (path != null && new File(path).exists()) {
                    return;
                }
            }
        } catch (URISyntaxException e) {
            // may be a windows path, move on               
        }

        // local to data dir?
        File relFile = GeoserverDataDirectory.findDataFile(uriSpec);
        if (relFile == null || !relFile.exists()) {
            error(validatable, "FileExistsValidator.fileNotFoundError", Collections.singletonMap("file", uriSpec));
        }
    }

}