/* Copyright (c) 2001 - 2009 TOPP - 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.data.store; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.FormComponent; import org.apache.wicket.markup.html.form.validation.IFormValidator; import org.apache.wicket.validation.IValidationError; import org.apache.wicket.validation.ValidationError; import org.geoserver.catalog.Catalog; import org.geoserver.catalog.StoreInfo; import org.geoserver.catalog.WorkspaceInfo; import org.geoserver.web.GeoServerApplication; /** * A Form validator that takes the workspace and store name form components and validates there's no * an existing {@link StoreInfo} in the selected workspace with the same name than the one assigned * through the store name form component. * * @author Andrea Aime - OpenGeo * @author Gabriel Roldan - OpenGeo */ @SuppressWarnings("serial") class StoreNameValidator implements IFormValidator { FormComponent workspaceComponent; FormComponent storeNameComponent; private String edittingStoreId; /** * * @param workspaceFormComponent * the form component for the {@link WorkspaceInfo} assigned to the {@link StoreInfo} * being edited * @param storeNameFormComponent * the form component for the name assigned to the {@link StoreInfo} * @param edittingStoreId * the id for the store being edited. May be {@code null} if we're talking of a new * Store */ public StoreNameValidator(final FormComponent workspaceFormComponent, final FormComponent storeNameFormComponent, final String edittingStoreId) { this.workspaceComponent = workspaceFormComponent; this.storeNameComponent = storeNameFormComponent; this.edittingStoreId = edittingStoreId; } public FormComponent[] getDependentFormComponents() { return new FormComponent[] { workspaceComponent, storeNameComponent }; } /** * Performs the cross validation between the selected workspace and the assigned store name * <p> * If there's already a {@link StoreInfo} in the selected workspace with the same name than the * choosed one the store name form component is set with a proper {@link IValidationError error * message} * </p> * * @see IFormValidator#validate(Form) */ public void validate(final Form form) { final FormComponent[] components = getDependentFormComponents(); final FormComponent wsComponent = components[0]; final FormComponent nameComponent = components[1]; WorkspaceInfo workspace = (WorkspaceInfo) wsComponent.getConvertedInput(); String name = (String) nameComponent.getConvertedInput(); if(name == null) { ValidationError error = new ValidationError(); error.addMessageKey("StoreNameValidator.storeNameRequired"); nameComponent.error((IValidationError) error); return; } Catalog catalog = GeoServerApplication.get().getCatalog(); final StoreInfo existing = catalog.getStoreByName(workspace, name, StoreInfo.class); if (existing != null) { final String existingId = existing.getId(); if (!existingId.equals(edittingStoreId)) { ValidationError error = new ValidationError(); error.addMessageKey("StoreNameValidator.storeExistsInWorkspace"); error.setVariable("workspace", workspace.getName()); error.setVariable("storeName", name); nameComponent.error((IValidationError) error); } } } }