/*
* Copyright (C) 2005 - 2014 Jaspersoft Corporation. All rights reserved.
* http://www.jaspersoft.com.
*
* Unless you have purchased a commercial license agreement from Jaspersoft,
* the following license terms apply:
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.jaspersoft.jasperserver.jaxrs.client.apiadapters.jobs.calendar;
import com.jaspersoft.jasperserver.jaxrs.client.apiadapters.AbstractAdapter;
import com.jaspersoft.jasperserver.jaxrs.client.core.*;
import com.jaspersoft.jasperserver.jaxrs.client.core.operationresult.OperationResult;
import com.jaspersoft.jasperserver.jaxrs.client.core.operationresult.WithEntityOperationResult;
import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.ReportJobCalendar;
import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.calendars.*;
import javax.ws.rs.core.MultivaluedHashMap;
import javax.ws.rs.core.MultivaluedMap;
import static com.jaspersoft.jasperserver.jaxrs.client.core.JerseyRequest.buildRequest;
public class SingleCalendarOperationsAdapter extends AbstractAdapter {
public static final String JOBS = "jobs";
public static final String CALENDARS = "calendars";
private final String calendarName;
private final MultivaluedMap<String, String> params;
public SingleCalendarOperationsAdapter(SessionStorage sessionStorage, String calendarName) {
super(sessionStorage);
this.calendarName = calendarName;
params = new MultivaluedHashMap<String, String>();
}
public SingleCalendarOperationsAdapter parameter(CalendarParameter parameter, String value) {
params.add(parameter.getName(), value);
return this;
}
public OperationResult<Calendar> get() {
OperationResult<ReportJobCalendar> result = buildRequest(sessionStorage, ReportJobCalendar.class, new String[]{JOBS, CALENDARS, calendarName}).get();
return convertToLocalCalendarType(result);
}
private OperationResult<Calendar> convertToLocalCalendarType(OperationResult<ReportJobCalendar> source) {
ReportJobCalendar reportJobCalendar = source.getEntity();
CalendarType calendarType = CalendarType.valueOf(reportJobCalendar.getCalendarType());
Calendar localCalendar = null;
switch (calendarType) {
case annual: {
AnnualCalendar annualCalendar = new AnnualCalendar();
setCommonCalendarFields(annualCalendar, reportJobCalendar);
annualCalendar.setDataSorted(reportJobCalendar.isDataSorted());
annualCalendar.setExcludeDays(reportJobCalendar.getExcludeDays());
localCalendar = annualCalendar;
break;
}
case base: {
BaseCalendar baseCalendar = new BaseCalendar();
setCommonCalendarFields(baseCalendar, reportJobCalendar);
localCalendar = baseCalendar;
break;
}
case cron: {
CronCalendar cronCalendar = new CronCalendar();
setCommonCalendarFields(cronCalendar, reportJobCalendar);
cronCalendar.setCronExpression(reportJobCalendar.getCronExpression());
localCalendar = cronCalendar;
break;
}
case daily: {
DailyCalendar dailyCalendar = new DailyCalendar();
setCommonCalendarFields(dailyCalendar, reportJobCalendar);
dailyCalendar.setInvertTimeRange(reportJobCalendar.isInvertTimeRange());
dailyCalendar.setRangeEndingCalendar(reportJobCalendar.getRangeEndingCalendar());
dailyCalendar.setRangeStartingCalendar(reportJobCalendar.getRangeStartingCalendar());
localCalendar = dailyCalendar;
break;
}
case holiday: {
HolidayCalendar holidayCalendar = new HolidayCalendar();
setCommonCalendarFields(holidayCalendar, reportJobCalendar);
holidayCalendar.setDataSorted(reportJobCalendar.isDataSorted());
holidayCalendar.setExcludeDays(reportJobCalendar.getExcludeDays());
localCalendar = holidayCalendar;
break;
}
case monthly: {
MonthlyCalendar monthlyCalendar = new MonthlyCalendar();
setCommonCalendarFields(monthlyCalendar, reportJobCalendar);
monthlyCalendar.setExcludeDaysFlags(reportJobCalendar.getExcludeDaysFlags());
localCalendar = monthlyCalendar;
break;
}
case weekly: {
WeeklyCalendar weeklyCalendar = new WeeklyCalendar();
setCommonCalendarFields(weeklyCalendar, reportJobCalendar);
weeklyCalendar.setExcludeDaysFlags(reportJobCalendar.getExcludeDaysFlags());
localCalendar = weeklyCalendar;
break;
}
}
final Calendar finalLocalCalendar = localCalendar;
return new WithEntityOperationResult<Calendar>(source.getResponse(), Calendar.class) {{
this.entity = finalLocalCalendar;
}};
}
private void setCommonCalendarFields(Calendar target, ReportJobCalendar src) {
target.setCalendarType(CalendarType.valueOf(src.getCalendarType()));
target.setDescription(src.getDescription());
target.setTimeZone(src.getTimeZone());
}
public <R> RequestExecution asyncGet(final Callback<OperationResult<Calendar>, R> callback) {
final JerseyRequest<ReportJobCalendar> request = buildRequest(sessionStorage, ReportJobCalendar.class, new String[]{JOBS, CALENDARS, calendarName});
RequestExecution task = new RequestExecution(new Runnable() {
@Override
public void run() {
callback.execute(convertToLocalCalendarType(request.get()));
}
});
ThreadPoolUtil.runAsynchronously(task);
return task;
}
public OperationResult delete() {
return buildRequest(sessionStorage, Object.class, new String[]{JOBS, CALENDARS, calendarName}).delete();
}
public <R> RequestExecution asyncDelete(final Callback<OperationResult, R> callback) {
final JerseyRequest request = buildRequest(sessionStorage, Object.class, new String[]{JOBS, CALENDARS, calendarName});
RequestExecution task = new RequestExecution(new Runnable() {
@Override
public void run() {
callback.execute(request.delete());
}
});
ThreadPoolUtil.runAsynchronously(task);
return task;
}
public OperationResult<ReportJobCalendar> createNew(Calendar calendarDescriptor) {
JerseyRequest<ReportJobCalendar> request = buildRequest(sessionStorage, ReportJobCalendar.class, new String[]{JOBS, CALENDARS, calendarName});
request.addParams(params);
return request.put(calendarDescriptor);
}
public <R> RequestExecution asyncCreateNew(final Calendar calendarDescriptor, final Callback<OperationResult<ReportJobCalendar>, R> callback) {
final JerseyRequest<ReportJobCalendar> request = buildRequest(sessionStorage, ReportJobCalendar.class, new String[]{JOBS, CALENDARS, calendarName});
request.addParams(params);
RequestExecution task = new RequestExecution(new Runnable() {
@Override
public void run() {
callback.execute(request.put(calendarDescriptor));
}
});
ThreadPoolUtil.runAsynchronously(task);
return task;
}
}