/*******************************************************************************
* Copyright (c) 2013, 2016 GoPivotal, 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:
* GoPivotal, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.boot.wizard;
import java.util.ArrayList;
import java.util.List;
import org.springframework.ide.eclipse.boot.core.SimpleUriBuilder;
import org.springframework.ide.eclipse.boot.core.initializr.IdAble;
import org.springsource.ide.eclipse.commons.livexp.core.FieldModel;
import org.springsource.ide.eclipse.commons.livexp.core.LiveExpression;
/**
* LiveExpression that computes a URL String based on a number of input fields.
*/
public class UrlMaker extends LiveExpression<String> {
private final List<FieldModel<String>> inputs = new ArrayList<FieldModel<String>>();
private final List<MultiSelectionFieldModel<IdAble>> multiInputs = new ArrayList<MultiSelectionFieldModel<IdAble>>();
private final List<FieldModel<RadioInfo>> radioInputs = new ArrayList<FieldModel<RadioInfo>>();
private final LiveExpression<String> baseUrl;
public UrlMaker(String baseUrl) {
this(LiveExpression.constant(baseUrl));
}
public UrlMaker(LiveExpression<String> baseUrl) {
this.baseUrl = baseUrl;
dependsOn(baseUrl);
}
public UrlMaker addField(FieldModel<String> param) {
inputs.add(param);
dependsOn(param.getVariable()); //Recompute my value when the input changes.
return this;
}
@SuppressWarnings("unchecked")
public <T extends IdAble> UrlMaker addField(MultiSelectionFieldModel<T> param) {
multiInputs.add((MultiSelectionFieldModel<IdAble>) param);
for (T choice : param.getChoices()) {
//Recomput value when any 'checkbox' selection status changes
dependsOn(param.getSelection(choice));
}
return this;
}
public void addField(HierarchicalMultiSelectionFieldModel<? extends IdAble> param) {
for (String cat : param.getCategories()) {
addField(param.getContents(cat));
}
}
public UrlMaker addField(RadioGroup group) {
this.radioInputs.add(group);
dependsOn(group.getVariable());
return this;
}
@Override
protected String compute() {
String baseUrl = this.baseUrl.getValue();
if (baseUrl==null) {
baseUrl = "";
} else {
baseUrl = baseUrl.trim();
}
SimpleUriBuilder builder = new SimpleUriBuilder(baseUrl);
for (FieldModel<String> f : inputs) {
String paramValue = f.getValue();
if (paramValue!=null) {
builder.addParameter(f.getName(), paramValue);
}
}
for (FieldModel<RadioInfo> f : radioInputs) {
RadioInfo radio = f.getValue();
if (radio!=null) {
String paramValue = radio.getUrlParamValue();
if (paramValue!=null) {
builder.addParameter(f.getName(), paramValue);
}
}
}
for (MultiSelectionFieldModel<IdAble> mf : multiInputs) {
String name = mf.getName();
for (IdAble selectedValue : mf.getCurrentSelection()) {
//Note that it is possible for values to be selected and disabled at the same time
// (i.e. a checkbox can be checked and 'greyed' out at the same time)
//We must therefore check enablement before adding a selection to the URI.
if (mf.getEnablement(selectedValue).getValue()) {
builder.addParameter(name, selectedValue.getId());
}
}
}
return builder.toString();
}
}