/* (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.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 resolver.open(location); } } 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; } }