/*******************************************************************************
* Copyright (c) 2016 Rogue Wave Software, Inc.
* 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:
* Rogue Wave Software, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.plugin.composer.ide.project;
import com.google.common.base.Optional;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.inject.Inject;
import org.eclipse.che.api.project.shared.dto.SourceEstimation;
import org.eclipse.che.api.promises.client.Operation;
import org.eclipse.che.api.promises.client.OperationException;
import org.eclipse.che.ide.api.app.AppContext;
import org.eclipse.che.ide.api.dialogs.DialogFactory;
import org.eclipse.che.ide.api.project.MutableProjectConfig;
import org.eclipse.che.ide.api.project.type.wizard.ProjectWizardMode;
import org.eclipse.che.ide.api.resources.Container;
import org.eclipse.che.ide.api.wizard.AbstractWizardPage;
import org.eclipse.che.plugin.composer.ide.ComposerLocalizationConstant;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static org.eclipse.che.ide.api.project.type.wizard.ProjectWizardMode.CREATE;
import static org.eclipse.che.ide.api.project.type.wizard.ProjectWizardMode.UPDATE;
import static org.eclipse.che.ide.api.project.type.wizard.ProjectWizardRegistrar.WIZARD_MODE_KEY;
import static org.eclipse.che.plugin.composer.shared.Constants.COMPOSER_PROJECT_TYPE_ID;
import static org.eclipse.che.plugin.composer.shared.Constants.PACKAGE;
/**
* @author Kaloyan Raev
*/
public class ComposerPagePresenter extends AbstractWizardPage<MutableProjectConfig> implements ComposerPageView.ActionDelegate {
private static final String ATTRIBUTE_VALUE_SEPARATOR = ", ";
private final ComposerPageView view;
private final DialogFactory dialogFactory;
private final AppContext appContext;
private final ComposerLocalizationConstant localization;
@Inject
public ComposerPagePresenter(ComposerPageView view,
DialogFactory dialogFactory,
AppContext appContext,
ComposerLocalizationConstant localization) {
super();
this.view = view;
this.dialogFactory = dialogFactory;
this.appContext = appContext;
this.localization = localization;
view.setDelegate(this);
}
@Override
public void init(MutableProjectConfig dataObject) {
super.init(dataObject);
final ProjectWizardMode wizardMode = ProjectWizardMode.parse(context.get(WIZARD_MODE_KEY));
if (CREATE == wizardMode) {
setAttribute(PACKAGE, Collections.<String>emptyList());
} else if (UPDATE == wizardMode && getAttribute(PACKAGE).isEmpty()) {
estimateAndSetAttributes();
}
}
private void estimateAndSetAttributes() {
appContext.getWorkspaceRoot().getContainer(dataObject.getPath()).then(new Operation<Optional<Container>>() {
@Override
public void apply(Optional<Container> container) throws OperationException {
if (!container.isPresent()) {
return;
}
container.get().estimate(COMPOSER_PROJECT_TYPE_ID).then(new Operation<SourceEstimation>() {
@Override
public void apply(SourceEstimation estimation) throws OperationException {
if (!estimation.isMatched()) {
final String resolution = estimation.getResolution();
final String errorMessage = resolution.isEmpty() ? localization.composerPageEstimateErrorMessage() : resolution;
dialogFactory.createMessageDialog(localization.composerPageErrorDialogTitle(), errorMessage, null).show();
return;
}
Map<String, List<String>> estimatedAttributes = estimation.getAttributes();
List<String> artifactIdValues = estimatedAttributes.get(PACKAGE);
if (artifactIdValues != null && !artifactIdValues.isEmpty()) {
setAttribute(PACKAGE, artifactIdValues);
}
updateDelegate.updateControls();
}
});
}
});
}
@Override
public boolean isCompleted() {
return areAttributesCompleted();
}
@Override
public void go(AcceptsOneWidget container) {
container.setWidget(view);
final ProjectWizardMode wizardMode = ProjectWizardMode.parse(context.get(WIZARD_MODE_KEY));
final String projectName = dataObject.getName();
if (CREATE == wizardMode && projectName != null) {
updateDelegate.updateControls();
}
updateView();
validateAttributes();
}
@Override
public void onAttributesChanged() {
setAttribute(PACKAGE, Arrays.asList(view.getPackage()));
validateAttributes();
updateDelegate.updateControls();
}
private List<String> getAttribute(String attrId) {
Map<String, List<String>> attributes = dataObject.getAttributes();
List<String> values = attributes.get(attrId);
if (values == null || values.isEmpty()) {
return Collections.emptyList();
}
return values;
}
private void setAttribute(String attrId, List<String> value) {
Map<String, List<String>> attributes = dataObject.getAttributes();
attributes.put(attrId, value);
}
private boolean areAttributesCompleted() {
return !getAttribute(PACKAGE).isEmpty();
}
private void updateView() {
ProjectWizardMode wizardMode = ProjectWizardMode.parse(context.get(WIZARD_MODE_KEY));
boolean isCreateWizard = wizardMode == CREATE;
view.changePackageFieldState(isCreateWizard);
Map<String, List<String>> attributes = dataObject.getAttributes();
view.setPackage(attributes.get(PACKAGE) == null ? ""
: convertAttributeValuesToString(getAttribute(PACKAGE)));
}
private String convertAttributeValuesToString(List<String> values) {
StringBuilder result = new StringBuilder();
for (String value : values) {
result.append(value).append(ATTRIBUTE_VALUE_SEPARATOR);
}
return result.toString().isEmpty() ? result.toString()
: result.delete(result.lastIndexOf(ATTRIBUTE_VALUE_SEPARATOR), result.length()).toString();
}
private void validateAttributes() {
view.showPackageMissingIndicator(view.getPackage().isEmpty());
}
}