/*
* Copyright (C) 2011 Artur Suilin
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ru.metrika4j.impl;
import ru.metrika4j.MetrikaDate;
import ru.metrika4j.Report;
import ru.metrika4j.ReportBuilder;
import java.util.HashMap;
import java.util.Map;
/** @author asuilin */
public class ReportBuilderImpl implements ReportBuilder {
private final ApiContext apiContext;
private final PathBuilder pathBuilder;
//private MetrikaDate dateFrom;
//private MetrikaDate dateTo;
public ReportBuilderImpl(String path, int counterId, ApiContext apiContext) {
this.apiContext = apiContext;
pathBuilder = new PathBuilder(path).add("id", counterId);
}
public ReportBuilder withDateFrom(MetrikaDate date) {
//dateFrom = date;
pathBuilder.add("date1", date);
return this;
}
public ReportBuilder withDateTo(MetrikaDate date) {
//dateTo = date;
pathBuilder.add("date2", date);
return this;
}
public ReportBuilder withGoal(Integer goalId) {
if (goalId != 0) {
pathBuilder.add("goal_id", goalId);
}
return this;
}
public ReportBuilder groupBy(ReportBuilder.Group group) {
pathBuilder.add("group", group.toString());
return this;
}
public ReportBuilder sortBy(String field) {
pathBuilder.add("sort", field);
return this;
}
public ReportBuilder reverseSortBy(String field) {
pathBuilder.add("sort", field).add("reverse", 0);
return this;
}
public ReportBuilder withTableMode(ReportBuilder.TableMode tm) {
pathBuilder.add("table_mode", tm.toString());
return this;
}
public ReportBuilder withMirrorId(Integer mirrorId) {
if (mirrorId == null || mirrorId >= 0) {
pathBuilder.add("mirror_id", mirrorId);
} else {
pathBuilder.add("mirror_id", "other");
}
return this;
}
public ReportBuilder withParameter(String name, String value) {
pathBuilder.add(name, value);
return this;
}
public ReportBuilder withItemsPerPage(Integer numberOfItems) {
pathBuilder.add("per_page", numberOfItems);
return this;
}
public Report build() {
return new ReportImpl(apiContext.getResponseByPath(pathBuilder.buildPath()), apiContext);
}
/** Утилита для построения запроса к серверу */
private class PathBuilder {
private final String path;
private final Map<String, String> params;
PathBuilder(String path) {
this.path = path;
params = new HashMap<String, String>();
}
PathBuilder add(String name, String value) {
if (value == null) {
params.remove(name);
} else {
params.put(name, value);
}
return this;
}
PathBuilder add(String name, MetrikaDate value) {
return add(name, value.toApiString());
}
PathBuilder add(String name, Integer value) {
return add(name, value.toString());
}
String buildPath() {
StringBuilder builder = new StringBuilder(path).append(".json");
boolean firstPass = true;
for (Map.Entry<String, String> entry : params.entrySet()) {
builder.append(firstPass ? '?' : '&');
firstPass = false;
builder.append(entry.getKey()).append('=').append(entry.getValue());
}
return builder.toString();
}
}
}