org.geogig.geoserver.web.repository.RepositoryEditPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.geogig.geoserver.web.repository.RepositoryEditPanel.java

Source

/* (c) 2016 Open Source Geospatial Foundation - all rights reserved
 * This code is licensed under the GPL 2.0 license, available at the root
 * application directory.
 */
package org.geogig.geoserver.web.repository;

import static org.geogig.geoserver.config.RepositoryManager.isGeogigDirectory;

import java.io.File;
import java.net.URI;

import org.apache.wicket.markup.html.form.FormComponentPanel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.validation.IValidatable;
import org.apache.wicket.validation.IValidator;
import org.apache.wicket.validation.ValidationError;
import org.geogig.geoserver.config.RepositoryInfo;
import org.geogig.geoserver.config.RepositoryManager;
import org.geogig.geoserver.util.PostgresConnectionErrorHandler;
import org.locationtech.geogig.repository.Repository;
import org.locationtech.geogig.repository.RepositoryResolver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class RepositoryEditPanel extends FormComponentPanel<RepositoryInfo> {

    private static final long serialVersionUID = -870873448379832051L;
    private static final Logger LOGGER = LoggerFactory.getLogger(RepositoryEditPanel.class);

    private final GeoGigRepositoryInfoFormComponent config;

    public RepositoryEditPanel(final String wicketId, IModel<RepositoryInfo> model, final boolean isNew) {
        super(wicketId, model);

        config = new GeoGigRepositoryInfoFormComponent("repositoryConfig", model, isNew);
        config.setVisible(true);
        add(config);

        add(new IValidator<RepositoryInfo>() {

            private static final long serialVersionUID = 224160688160723504L;

            @Override
            public void validate(IValidatable<RepositoryInfo> validatable) {
                if (isNew) {
                    config.processInput();
                }
                ValidationError error = new ValidationError();
                RepositoryInfo repo = validatable.getValue();
                final URI location = repo.getLocation();
                final RepositoryResolver resolver = RepositoryResolver.lookup(location);
                final String scheme = location.getScheme();
                if (isNew && repoNameExists(repo.getRepoName())) {
                    error.addKey("errRepositoryNameExists");
                } else if ("file".equals(scheme)) {
                    File repoDir = new File(location);
                    final File parent = repoDir.getParentFile();
                    if (!parent.exists() || !parent.isDirectory()) {
                        error.addKey("errParentDoesntExist");
                    }
                    if (!parent.canWrite()) {
                        error.addKey("errParentReadOnly");
                    }
                    if (isNew) {
                        if (repoDir.exists()) {
                            error.addKey("errDirectoryExists");
                        }
                    } else if (!isGeogigDirectory(repoDir)) {
                        error.addKey("notAGeogigRepository");
                    }
                } else if ("postgresql".equals(scheme)) {
                    try {
                        if (isNew) {
                            if (resolver.repoExists(location)) {
                                error.addKey("errRepositoryExists");
                            }
                        } else {
                            // try to connect
                            Repository repository = null;
                            try {
                                repository = resolver.open(location);
                            } finally {
                                if (repository != null) {
                                    repository.close();
                                }
                            }

                        }
                    } catch (Exception ex) {
                        // likely failed to connect
                        LOGGER.error("Failed to connect to PostgreSQL database", ex);
                        error.addKey("errCannotConnectToDatabase");
                        // find root cause
                        error.setVariable("message", PostgresConnectionErrorHandler.getMessage(ex));
                    }
                }
                if (!error.getKeys().isEmpty()) {
                    validatable.error(error);
                }
            }
        });
    }

    @Override
    public void convertInput() {
        RepositoryInfo modelObject = getModelObject();
        setConvertedInput(modelObject);
    }

    private boolean repoNameExists(String repoName) {
        for (RepositoryInfo repo : RepositoryManager.get().getAll()) {
            if (repo.getRepoName().equals(repoName)) {
                return true;
            }
        }
        return false;
    }
}