ItEr50S13AdaptacionServiciosRESTItEr49S18: Implementing calendars export service.

This commit is contained in:
Manuel Rego Casasnovas 2010-03-22 12:01:33 +01:00 committed by Javier Moran Rua
parent 664a25ec8d
commit fb3bd8bacf
18 changed files with 487 additions and 26 deletions

View file

@ -0,0 +1,40 @@
/*
* This file is part of NavalPlan
*
* Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e
* Desenvolvemento Tecnolóxico de Galicia
*
* 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 org.navalplanner.business.calendars.daos;
import org.navalplanner.business.calendars.entities.CalendarData;
import org.navalplanner.business.common.daos.IntegrationEntityDAO;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;
/**
* DAO for {@link CalendarData}
*
* @author Manuel Rego Casasnovas <mrego@igalia.com>
*/
@Repository
@Scope(BeanDefinition.SCOPE_SINGLETON)
public class CalendarDataDAO extends
IntegrationEntityDAO<CalendarData>
implements ICalendarDataDAO {
}

View file

@ -0,0 +1,40 @@
/*
* This file is part of NavalPlan
*
* Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e
* Desenvolvemento Tecnolóxico de Galicia
*
* 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 org.navalplanner.business.calendars.daos;
import org.navalplanner.business.calendars.entities.CalendarException;
import org.navalplanner.business.common.daos.IntegrationEntityDAO;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;
/**
* DAO for {@link CalendarException}
*
* @author Manuel Rego Casasnovas <mrego@igalia.com>
*/
@Repository
@Scope(BeanDefinition.SCOPE_SINGLETON)
public class CalendarExceptionDAO extends
IntegrationEntityDAO<CalendarException> implements
ICalendarExceptionDAO {
}

View file

@ -0,0 +1,34 @@
/*
* This file is part of NavalPlan
*
* Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e
* Desenvolvemento Tecnolóxico de Galicia
*
* 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 org.navalplanner.business.calendars.daos;
import org.navalplanner.business.calendars.entities.CalendarData;
import org.navalplanner.business.common.daos.IIntegrationEntityDAO;
/**
* Contract for {@link CalendarDataDAO}
*
* @author Manuel Rego Casasnovas <mrego@igalia.com>
*/
public interface ICalendarDataDAO extends
IIntegrationEntityDAO<CalendarData> {
}

View file

@ -0,0 +1,34 @@
/*
* This file is part of NavalPlan
*
* Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e
* Desenvolvemento Tecnolóxico de Galicia
*
* 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 org.navalplanner.business.calendars.daos;
import org.navalplanner.business.calendars.entities.CalendarException;
import org.navalplanner.business.common.daos.IIntegrationEntityDAO;
/**
* Contract for {@link CalendarExceptionDAO}.
*
* @author Manuel Rego Casasnovas <mrego@igalia.com>
*/
public interface ICalendarExceptionDAO extends
IIntegrationEntityDAO<CalendarException> {
}

View file

@ -25,19 +25,19 @@ import java.util.HashMap;
import java.util.Map;
import org.joda.time.LocalDate;
import org.navalplanner.business.common.BaseEntity;
import org.navalplanner.business.calendars.daos.ICalendarDataDAO;
import org.navalplanner.business.common.IntegrationEntity;
import org.navalplanner.business.common.Registry;
/**
* Represents the information about the calendar that can change through time.
*
* @author Manuel Rego Casasnovas <mrego@igalia.com>
*/
public class CalendarData extends BaseEntity {
public class CalendarData extends IntegrationEntity {
public static CalendarData create() {
CalendarData calendarData = new CalendarData();
calendarData.setNewObject(true);
return calendarData;
return create(new CalendarData());
}
private Map<Integer, Integer> hoursPerDay;
@ -159,4 +159,9 @@ public class CalendarData extends BaseEntity {
return true;
}
@Override
protected ICalendarDataDAO getIntegrationEntityDAO() {
return Registry.getCalendarDataDAO();
}
}

View file

@ -24,7 +24,9 @@ import java.util.Date;
import org.hibernate.validator.NotNull;
import org.joda.time.LocalDate;
import org.navalplanner.business.common.BaseEntity;
import org.navalplanner.business.calendars.daos.ICalendarExceptionDAO;
import org.navalplanner.business.common.IntegrationEntity;
import org.navalplanner.business.common.Registry;
/**
* Represents an exceptional day that has a different number of hours. For
@ -34,22 +36,16 @@ import org.navalplanner.business.common.BaseEntity;
*
* @author Manuel Rego Casasnovas <mrego@igalia.com>
*/
public class CalendarException extends BaseEntity {
public class CalendarException extends IntegrationEntity {
public static CalendarException create(Date date, Integer hours,
CalendarExceptionType type) {
CalendarException exceptionDay = new CalendarException(new LocalDate(
date), hours, type);
exceptionDay.setNewObject(true);
return exceptionDay;
return create(new CalendarException(new LocalDate(date), hours, type));
}
public static CalendarException create(LocalDate date, Integer hours,
CalendarExceptionType type) {
CalendarException exceptionDay = new CalendarException(date, hours,
type);
exceptionDay.setNewObject(true);
return exceptionDay;
return create(new CalendarException(date, hours, type));
}
private LocalDate date;
@ -85,4 +81,9 @@ public class CalendarException extends BaseEntity {
return type;
}
@Override
protected ICalendarExceptionDAO getIntegrationEntityDAO() {
return Registry.getCalendarExceptionDAO();
}
}

View file

@ -22,6 +22,8 @@ package org.navalplanner.business.common;
import org.navalplanner.business.advance.daos.IAdvanceTypeDAO;
import org.navalplanner.business.calendars.daos.IBaseCalendarDAO;
import org.navalplanner.business.calendars.daos.ICalendarDataDAO;
import org.navalplanner.business.calendars.daos.ICalendarExceptionDAO;
import org.navalplanner.business.calendars.daos.ICalendarExceptionTypeDAO;
import org.navalplanner.business.common.daos.IConfigurationDAO;
import org.navalplanner.business.costcategories.daos.ICostCategoryDAO;
@ -154,6 +156,12 @@ public class Registry {
@Autowired
private IHourCostDAO hourCostDAO;
@Autowired
private ICalendarExceptionDAO calendarExceptionDAO;
@Autowired
private ICalendarDataDAO calendarDataDAO;
@Autowired
private ICalendarExceptionTypeDAO calendarExceptionTypeDAO;
@ -282,4 +290,12 @@ public class Registry {
return getInstance().calendarExceptionTypeDAO;
}
public static ICalendarExceptionDAO getCalendarExceptionDAO() {
return getInstance().calendarExceptionDAO;
}
public static ICalendarDataDAO getCalendarDataDAO() {
return getInstance().calendarDataDAO;
}
}

View file

@ -51,6 +51,8 @@
</id>
<version name="version" access="property" type="long" />
<property name="code" access="property" not-null="true" unique="true"/>
<property name="date" access="field"
type="org.joda.time.contrib.hibernate.PersistentLocalDate"/>
<property name="hours" access="field"/>
@ -85,6 +87,8 @@
</id>
<version name="version" access="property" type="long" />
<property name="code" access="property" not-null="true" unique="true"/>
<map name="hoursPerDay">
<key column="BASE_CALENDAR_ID"/>
<index column="DAY_ID" type="integer" />

View file

@ -20,7 +20,12 @@
package org.navalplanner.ws.calendars.api;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import org.navalplanner.business.calendars.entities.BaseCalendar;
import org.navalplanner.ws.common.api.IntegrationEntityDTO;
@ -37,16 +42,30 @@ public class BaseCalendarDTO extends IntegrationEntityDTO {
@XmlAttribute
public String name;
@XmlElementWrapper(name = "calendar-exception-list")
@XmlElement(name = "calendar-exception")
public List<CalendarExceptionDTO> calendarExceptions = new ArrayList<CalendarExceptionDTO>();
@XmlElementWrapper(name = "calendar-data-list")
@XmlElement(name = "calendar-data")
public List<CalendarDataDTO> calendarDatas = new ArrayList<CalendarDataDTO>();
public BaseCalendarDTO() {
}
public BaseCalendarDTO(String code, String name) {
public BaseCalendarDTO(String code, String name,
List<CalendarExceptionDTO> calendarExceptions,
List<CalendarDataDTO> calendarDatas) {
super(code);
this.name = name;
this.calendarExceptions = calendarExceptions;
this.calendarDatas = calendarDatas;
}
public BaseCalendarDTO(String name) {
this(generateCode(), name);
public BaseCalendarDTO(String name,
List<CalendarExceptionDTO> calendarExceptions,
List<CalendarDataDTO> calendarDatas) {
this(generateCode(), name, calendarExceptions, calendarDatas);
}
@Override

View file

@ -0,0 +1,74 @@
/*
* This file is part of NavalPlan
*
* Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e
* Desenvolvemento Tecnolóxico de Galicia
*
* 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 org.navalplanner.ws.calendars.api;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import org.navalplanner.business.calendars.entities.CalendarData;
import org.navalplanner.ws.common.api.IntegrationEntityDTO;
/**
* DTO for {@link CalendarData} entity.
*
* @author Manuel Rego Casasnovas <mrego@igalia.com>
*/
public class CalendarDataDTO extends IntegrationEntityDTO {
public final static String ENTITY_TYPE = "calendar-data";
@XmlElementWrapper(name = "hors-per-day-list")
@XmlElement(name = "hors-per-day")
public List<HoursPerDayDTO> hoursPerDays = new ArrayList<HoursPerDayDTO>();
@XmlAttribute(name = "expiring-date")
public Date expiringDate;
@XmlAttribute(name = "parent-calendar")
public String parentCalendar;
public CalendarDataDTO() {
}
public CalendarDataDTO(String code, List<HoursPerDayDTO> hoursPerDays,
Date expiringDate, String parentCalendar) {
super(code);
this.hoursPerDays = hoursPerDays;
this.expiringDate = expiringDate;
this.parentCalendar = parentCalendar;
}
public CalendarDataDTO(List<HoursPerDayDTO> hoursPerDays,
Date expiringDate, String parentCalendar) {
this(generateCode(), hoursPerDays, expiringDate, parentCalendar);
}
@Override
public String getEntityType() {
return ENTITY_TYPE;
}
}

View file

@ -0,0 +1,69 @@
/*
* This file is part of NavalPlan
*
* Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e
* Desenvolvemento Tecnolóxico de Galicia
*
* 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 org.navalplanner.ws.calendars.api;
import java.util.Date;
import javax.xml.bind.annotation.XmlAttribute;
import org.navalplanner.business.calendars.entities.CalendarException;
import org.navalplanner.ws.common.api.IntegrationEntityDTO;
/**
* DTO for {@link CalendarException} entity.
*
* @author Manuel Rego Casasnovas <mrego@igalia.com>
*/
public class CalendarExceptionDTO extends IntegrationEntityDTO {
public final static String ENTITY_TYPE = "calendar-exception";
@XmlAttribute
public Date date;
@XmlAttribute
public Integer hours;
@XmlAttribute(name = "calendar-exception-type-name")
public String calendarExceptionTypeName;
public CalendarExceptionDTO() {
}
public CalendarExceptionDTO(String code, Date date, Integer hours,
String calendarExceptionTypeName) {
super(code);
this.date = date;
this.hours = hours;
this.calendarExceptionTypeName = calendarExceptionTypeName;
}
public CalendarExceptionDTO(Date date, Integer hours,
String calendarExceptionTypeName) {
this(generateCode(), date, hours, calendarExceptionTypeName);
}
@Override
public String getEntityType() {
return ENTITY_TYPE;
}
}

View file

@ -0,0 +1,48 @@
/*
* This file is part of NavalPlan
*
* Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e
* Desenvolvemento Tecnolóxico de Galicia
*
* 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 org.navalplanner.ws.calendars.api;
import javax.xml.bind.annotation.XmlAttribute;
import org.navalplanner.business.calendars.entities.CalendarData;
/**
* DTO for represent hours per day of {@link CalendarData} entity.
*
* @author Manuel Rego Casasnovas <mrego@igalia.com>
*/
public class HoursPerDayDTO {
@XmlAttribute
public String day;
@XmlAttribute
public Integer hours;
public HoursPerDayDTO() {
}
public HoursPerDayDTO(String day, Integer hours) {
this.day = day;
this.hours = hours;
}
}

View file

@ -20,8 +20,18 @@
package org.navalplanner.ws.calendars.impl;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.navalplanner.business.calendars.entities.BaseCalendar;
import org.navalplanner.business.calendars.entities.CalendarData;
import org.navalplanner.business.calendars.entities.CalendarException;
import org.navalplanner.business.calendars.entities.CalendarData.Days;
import org.navalplanner.ws.calendars.api.BaseCalendarDTO;
import org.navalplanner.ws.calendars.api.CalendarDataDTO;
import org.navalplanner.ws.calendars.api.CalendarExceptionDTO;
import org.navalplanner.ws.calendars.api.HoursPerDayDTO;
/**
* Converter from/to {@link BaseCalendar} related entities to/from DTOs.
@ -34,8 +44,46 @@ public final class CalendarConverter {
}
public final static BaseCalendarDTO toDTO(BaseCalendar baseCalendar) {
List<CalendarExceptionDTO> calendarExceptionDTOs = new ArrayList<CalendarExceptionDTO>();
for (CalendarException calendarException : baseCalendar.getExceptions()) {
calendarExceptionDTOs.add(toDTO(calendarException));
}
List<CalendarDataDTO> calendarDataDTOs = new ArrayList<CalendarDataDTO>();
for (CalendarData calendarData : baseCalendar.getCalendarDataVersions()) {
calendarDataDTOs.add(toDTO(calendarData));
}
return new BaseCalendarDTO(baseCalendar.getCode(), baseCalendar
.getName());
.getName(), calendarExceptionDTOs, calendarDataDTOs);
}
private final static CalendarExceptionDTO toDTO(
CalendarException calendarException) {
return new CalendarExceptionDTO(calendarException.getCode(),
calendarException.getDate().toDateTimeAtStartOfDay().toDate(),
calendarException.getHours(), calendarException.getType()
.getName());
}
private final static CalendarDataDTO toDTO(CalendarData calendarData) {
List<HoursPerDayDTO> hoursPerDayDTOs = new ArrayList<HoursPerDayDTO>();
Days[] days = CalendarData.Days.values();
for (Integer day : calendarData.getHoursPerDay().keySet()) {
String dayName = days[day].name();
Integer hours = calendarData.getHoursPerDay().get(day);
hoursPerDayDTOs.add(new HoursPerDayDTO(dayName, hours));
}
Date expiringDate = (calendarData.getExpiringDate() != null) ? calendarData
.getExpiringDate().toDateTimeAtStartOfDay().toDate()
: null;
String parentCalendar = (calendarData.getParent() != null) ? calendarData
.getParent().getCode()
: null;
return new CalendarDataDTO(hoursPerDayDTOs, expiringDate,
parentCalendar);
}
}

View file

@ -20,13 +20,14 @@
package org.navalplanner.ws.calendars.impl;
import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import org.navalplanner.business.calendars.daos.IBaseCalendarDAO;
import org.navalplanner.business.calendars.entities.BaseCalendar;
import org.navalplanner.business.common.daos.IIntegrationEntityDAO;
import org.navalplanner.business.common.exceptions.ValidationException;
import org.navalplanner.ws.calendars.api.BaseCalendarDTO;
import org.navalplanner.ws.calendars.api.BaseCalendarListDTO;
@ -54,7 +55,7 @@ public class CalendarServiceREST extends
private IBaseCalendarDAO baseCalendarDAO;
@Override
protected IIntegrationEntityDAO<BaseCalendar> getIntegrationEntityDAO() {
protected IBaseCalendarDAO getIntegrationEntityDAO() {
return baseCalendarDAO;
}
@ -81,7 +82,10 @@ public class CalendarServiceREST extends
@GET
@Transactional(readOnly = true)
public BaseCalendarListDTO getBaseCalendars() {
return new BaseCalendarListDTO(findAll());
// Avoid ResourceCalendar entities
List<BaseCalendar> justBaseCalendars = getIntegrationEntityDAO()
.getBaseCalendars();
return new BaseCalendarListDTO(toDTO(justBaseCalendars));
}
}

View file

@ -82,6 +82,10 @@
- export-calendar-exception-types.sh (authenticate with wsreader/wsreader)
* Export calendars:
- export-calendars.sh (authenticate with wsreader/wsreader)
+ When working with the online demo add "--prod" argument to every command.
Example:

View file

@ -0,0 +1,21 @@
#!/bin/sh
. ./rest-common-env.sh
printf "Login name: "
read loginName
printf "Password: "
read password
if [ "$1" = "--prod" ]; then
baseServiceURL=$PRODUCTION_BASE_SERVICE_URL
certificate=$PRODUCTION_CERTIFICATE
else
baseServiceURL=$DEVELOPMENT_BASE_SERVICE_URL
certificate=$DEVELOPMENT_CERTIFICATE
fi
authorization=`./base64.sh $loginName:$password`
curl -sv -X GET $certificate --header "Authorization: Basic $authorization" \
$baseServiceURL/calendars | tidy -xml -i -q -utf8