/**
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* <p>
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* <p>
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* @author Nuno Oliveira, GeoSolutions S.A.S., Copyright 2017
*/
package org.geowebcache.config.legends;
import org.geowebcache.util.ServletUtils;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* Builder for {@link LegendInfo} instances.
*/
public class LegendInfoBuilder {
private String layerName;
private String layerUrl;
private Integer defaultWidth;
private Integer defaultHeight;
private String defaultFormat;
private String styleName;
private Integer width;
private Integer height;
private String format;
private String url;
private String completeUrl;
private Double minScale;
private Double maxScale;
public LegendInfoBuilder withLayerName(String layerName) {
this.layerName = layerName;
return this;
}
public LegendInfoBuilder withLayerUrl(String layerUrl) {
this.layerUrl = layerUrl;
return this;
}
public LegendInfoBuilder withDefaultWidth(Integer defaultWidth) {
this.defaultWidth = defaultWidth;
return this;
}
public LegendInfoBuilder withDefaultHeight(Integer defaultHeight) {
this.defaultHeight = defaultHeight;
return this;
}
public LegendInfoBuilder withDefaultFormat(String defaultFormat) {
this.defaultFormat = defaultFormat;
return this;
}
public LegendInfoBuilder withStyleName(String styleName) {
this.styleName = styleName;
return this;
}
public LegendInfoBuilder withWidth(Integer width) {
this.width = width;
return this;
}
public LegendInfoBuilder withHeight(Integer height) {
this.height = height;
return this;
}
public LegendInfoBuilder withFormat(String format) {
this.format = format;
return this;
}
public LegendInfoBuilder withUrl(String url) {
this.url = url;
return this;
}
public LegendInfoBuilder withCompleteUrl(String completeUrl) {
this.completeUrl = completeUrl;
return this;
}
public LegendInfoBuilder withMinScale(Double minScale) {
this.minScale = minScale;
return this;
}
public LegendInfoBuilder withMaxScale(Double maxScale) {
this.maxScale = maxScale;
return this;
}
public LegendInfo build() {
// let's see if we need to really on the default values for width, height and format
Integer finalWidth = width == null ? defaultWidth : width;
Integer finalHeight = height == null ? defaultHeight : height;
String finalFormat = format == null ? defaultFormat : format;
// checking mandatory format value
checkNotNull(finalFormat, "A legend image format is mandatory.");
// default styles can have a NULL name
String finalStyleName = styleName == null ? "" : styleName;
// building the legend url
String finalUrl = buildFinalUrl(finalStyleName, finalWidth, finalHeight, finalFormat);
return new LegendInfo(finalStyleName, finalWidth, finalHeight, finalFormat, finalUrl, minScale, maxScale);
}
/**
* Helper method that builds the legend get url using the available info.
*/
private String buildFinalUrl(String finalStyleName, Integer finalWidth, Integer finalHeight, String finalFormat) {
if (completeUrl != null) {
// we have a complete url so let's just return it
return completeUrl;
}
String finalUrl = url == null ? layerUrl : url;
// check mandatory values
checkNotNull(finalWidth, "A legend width is mandatory.");
checkNotNull(finalHeight, "A legend height is mandatory.");
checkNotNull(finalUrl, "A legend url is mandatory.");
checkNotNull(layerName, "A layer name is mandatory.");
return finalUrl + addQuoteMark(finalUrl) +
"service=WMS&request=GetLegendGraphic" +
"&format=" + finalFormat +
"&width=" + finalWidth +
"&height=" + finalHeight +
"&layer=" + ServletUtils.URLEncode(layerName) +
"&style=" + ServletUtils.URLEncode(finalStyleName);
}
/**
* Helper method check's if a quote separating the base url from the query parameters
* needs to be added to the url or not.
*/
private String addQuoteMark(String finalUrl) {
if (finalUrl.indexOf("?") == finalUrl.length() - 1) {
// we are good no quote needed
return "";
}
return "?";
}
}