/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.plugin.svn.ide.importer; import com.google.common.base.Splitter; import com.google.common.base.Strings; import com.google.common.collect.Iterables; import com.google.gwt.regexp.shared.RegExp; import com.google.gwt.user.client.ui.AcceptsOneWidget; import com.google.inject.Inject; import org.eclipse.che.ide.api.project.MutableProjectConfig; import org.eclipse.che.ide.api.wizard.AbstractWizardPage; import org.eclipse.che.plugin.svn.ide.SubversionExtensionLocalizationConstants; import org.eclipse.che.ide.util.NameUtils; import static com.google.common.base.Strings.isNullOrEmpty; /** * Handler for the Subversion Project Importer. * * @author vzhukovskii@codenvy.com */ public class SubversionProjectImporterPresenter extends AbstractWizardPage<MutableProjectConfig> implements SubversionProjectImporterView.ActionDelegate { // start with white space private static final RegExp SUBVERSION_REPOSITORY_REGEX = RegExp.compile( "^(http|https|svn|svn\\+ssh)://[A-Za-z0-9_\\-]+@?[A-Za-z0-9_\\-]+(\\.[A-Za-z0-9_\\-:]+)+(/[A-Za-z0-9_.\\-]+)*/?$"); private final SubversionExtensionLocalizationConstants constants; private final SubversionProjectImporterView view; private boolean ignoreChanges; @Inject public SubversionProjectImporterPresenter(SubversionExtensionLocalizationConstants constants, SubversionProjectImporterView view) { this.constants = constants; this.view = view; this.view.setDelegate(this); } @Override public boolean isCompleted() { return isSubversionUrlCorrect(dataObject.getSource().getLocation()) && NameUtils.checkProjectName(dataObject.getName()); } /** {@inheritDoc} */ @Override public void go(AcceptsOneWidget container) { if (Strings.isNullOrEmpty(dataObject.getName()) && Strings.isNullOrEmpty(dataObject.getSource().getLocation())) { ignoreChanges = true; view.setProjectUrlErrorHighlight(false); view.setProjectNameErrorHighlight(false); view.setURLErrorMessage(null); } view.setProjectName(dataObject.getName()); view.setProjectDescription(dataObject.getDescription()); view.setProjectUrl(dataObject.getSource().getLocation()); container.setWidget(view); view.setInputsEnableState(true); ignoreChanges = false; } /** {@inheritDoc} */ @Override public void onProjectNameChanged(final String projectName) { if (ignoreChanges) { return; } dataObject.setName(projectName); updateDelegate.updateControls(); view.setProjectNameErrorHighlight(!NameUtils.checkProjectName(projectName)); } /** {@inheritDoc} */ @Override public void onProjectUrlChanged(final String projectUrl) { if (ignoreChanges) { return; } final String calcUrl = getUrl(projectUrl, view.getProjectRelativePath()); dataObject.getSource().setLocation(calcUrl); if (isSubversionUrlCorrect(calcUrl)) { view.setProjectUrlErrorHighlight(false); view.setURLErrorMessage(null); if (isNullOrEmpty(view.getProjectName())) { final String projectName = Iterables.getLast(Splitter.on("/").omitEmptyStrings().split(projectUrl)); if (!isNullOrEmpty(projectName)) { view.setProjectName(projectName); dataObject.setName(view.getProjectName()); } } } else { view.setProjectUrlErrorHighlight(true); view.setURLErrorMessage(constants.importProjectUrlIncorrectMessage()); } updateDelegate.updateControls(); } /** {@inheritDoc} */ @Override public void onProjectRelativePathChanged(final String projectRelativePath) { String calcUrl = getUrl(view.getProjectUrl(), projectRelativePath); dataObject.getSource().setLocation(calcUrl); } /** {@inheritDoc} */ @Override public void onProjectDescriptionChanged(final String projectDescription) { dataObject.setDescription(projectDescription); } private boolean isSubversionUrlCorrect(final String url) { return !isNullOrEmpty(url) && SUBVERSION_REPOSITORY_REGEX.test(url); } private String getUrl(String url, String relPath) { return (url.endsWith("/") ? url.substring(0, url.length() - 1) : url) + (relPath.startsWith("/") ? relPath : relPath.concat("/")); } }