You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2017/01/20 03:01:21 UTC

svn commit: r1779552 - in /openmeetings/application: branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/ branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/ branches/3.1.x/openmeetings-db/...

Author: solomax
Date: Fri Jan 20 03:01:21 2017
New Revision: 1779552

URL: http://svn.apache.org/viewvc?rev=1779552&view=rev
Log:
[OPENMEETINGS-1533] appointment can be created

Added:
    openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestWebConverters.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestWebConverters.java
    openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestWebConverters.java
Modified:
    openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java
    openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
    openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
    openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
    openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java
    openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
    openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/CalendarParamConverter.java
    openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/DateParamConverter.java
    openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/OmParamConverterProvider.java
    openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java
    openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
    openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
    openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java
    openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
    openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/CalendarParamConverter.java
    openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/DateParamConverter.java
    openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/OmParamConverterProvider.java
    openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java
    openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
    openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
    openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
    openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java
    openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
    openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/CalendarParamConverter.java
    openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/DateParamConverter.java
    openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/OmParamConverterProvider.java

Modified: openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java?rev=1779552&r1=1779551&r2=1779552&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java Fri Jan 20 03:01:21 2017
@@ -100,7 +100,7 @@ public class AppointmentDTO implements S
 		a.setStart(start.getTime());
 		a.setEnd(end.getTime());
 		a.setDescription(description);
-		a.setOwner(owner.get(userDao));
+		a.setOwner(owner == null ? null : owner.get(userDao));
 		a.setInserted(inserted);
 		a.setUpdated(updated);
 		a.setDeleted(deleted);

Modified: openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java?rev=1779552&r1=1779551&r2=1779552&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java Fri Jan 20 03:01:21 2017
@@ -68,7 +68,8 @@ public class MeetingMemberDTO implements
 
 	public static MeetingMemberDTO get(JSONObject o) {
 		MeetingMemberDTO m = new MeetingMemberDTO();
-		m.id = o.optLong("id");
+		long id = o.optLong("id");
+		m.id = id == 0 ? null : id;
 		m.user = UserDTO.get(o.optJSONObject("user"));
 		return m;
 	}

Modified: openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java?rev=1779552&r1=1779551&r2=1779552&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java Fri Jan 20 03:01:21 2017
@@ -19,7 +19,6 @@
 package org.apache.openmeetings.db.dto.room;
 
 import static org.apache.openmeetings.db.dto.room.RoomOptionsDTO.optInt;
-import static org.apache.openmeetings.db.dto.room.RoomOptionsDTO.optLong;
 
 import java.io.Serializable;
 import java.util.ArrayList;
@@ -346,8 +345,12 @@ public class RoomDTO implements Serializ
 	}
 
 	public static RoomDTO get(JSONObject o) {
+		if (o == null) {
+			return null;
+		}
 		RoomDTO r = new RoomDTO();
-		r.id = optLong(o, "id");
+		long id = o.optLong("id");
+		r.id = id == 0 ? null : id;
 		r.name = o.optString("name");
 		r.comment = o.optString("comment");
 		r.type = Room.Type.valueOf(o.getString("type"));

Modified: openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java?rev=1779552&r1=1779551&r2=1779552&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java Fri Jan 20 03:01:21 2017
@@ -187,8 +187,12 @@ public class UserDTO implements Serializ
 	}
 
 	public static UserDTO get(JSONObject o) {
+		if (o == null) {
+			return null;
+		}
 		UserDTO u = new UserDTO();
-		u.id = o.optLong("id");
+		long id = o.optLong("id");
+		u.id = id == 0 ? null : id;
 		u.login = o.optString("login");
 		u.password = o.optString("password");
 		u.firstname = o.optString("firstname");

Modified: openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java?rev=1779552&r1=1779551&r2=1779552&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java Fri Jan 20 03:01:21 2017
@@ -18,8 +18,11 @@
  */
 package org.apache.openmeetings.test.webservice;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
+import java.time.LocalDate;
+import java.time.ZoneId;
 import java.util.Date;
 import java.util.UUID;
 
@@ -31,6 +34,7 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.user.GroupUser;
 import org.apache.openmeetings.db.entity.user.User;
+import org.apache.openmeetings.webservice.util.DateParamConverter;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 
@@ -65,4 +69,12 @@ public class TestCalendarService extends
 	public void testGetByPublicRoom() throws Exception {
 		actualTest(roomDao.get(5L)); //default public restricted room
 	}
+
+	@Test
+	public void testDateConverter() throws Exception {
+		assertEquals("Null date should be parsed", null, DateParamConverter.get(null));
+		assertEquals("Date should be parsed"
+				, Date.from(LocalDate.of(2017, 01, 15).atStartOfDay(ZoneId.systemDefault()).toInstant())
+				, DateParamConverter.get("2017-01-15"));
+	}
 }

Added: openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestWebConverters.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestWebConverters.java?rev=1779552&view=auto
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestWebConverters.java (added)
+++ openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestWebConverters.java Fri Jan 20 03:01:21 2017
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.openmeetings.test.webservice;
+
+import static org.junit.Assert.assertEquals;
+
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.util.Calendar;
+import java.util.Date;
+
+import org.apache.openmeetings.db.dto.user.UserDTO;
+import org.apache.openmeetings.webservice.util.CalendarParamConverter;
+import org.apache.openmeetings.webservice.util.DateParamConverter;
+import org.apache.wicket.ajax.json.JSONObject;
+import org.junit.Test;
+
+public class TestWebConverters {
+	@Test
+	public void testDateConverter() throws Exception {
+		assertEquals("Null date should be parsed", null, DateParamConverter.get(null));
+		assertEquals("Date should be parsed"
+				, Date.from(LocalDate.of(2017, 01, 15).atStartOfDay(ZoneId.systemDefault()).toInstant())
+				, DateParamConverter.get("2017-01-15"));
+		assertEquals("Date should be parsed"
+				, Date.from(ZonedDateTime.of(2017, 01, 20, 20, 30, 03, 0, ZoneId.of("Europe/Moscow")).toInstant())
+				, DateParamConverter.get("2017-01-20T20:30:03+0300"));
+	}
+
+	@Test
+	public void testCalendarConverter() throws Exception {
+		CalendarParamConverter c = new CalendarParamConverter();
+		assertEquals("Null calendar should be parsed", null, c.fromString(null));
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(Date.from(LocalDate.of(2017, 01, 15).atStartOfDay(ZoneId.systemDefault()).toInstant()));
+		assertEquals("Calendar should be parsed", cal, c.fromString("2017-01-15"));
+	}
+
+	@Test
+	public void testUserConverter() throws Exception {
+		assertEquals("Null UserDTO should be parsed", null, UserDTO.get((JSONObject)null));
+	}
+}

Modified: openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java?rev=1779552&r1=1779551&r2=1779552&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java Fri Jan 20 03:01:21 2017
@@ -35,15 +35,17 @@ public class AppointmentParamConverter i
 	public AppointmentDTO fromString(String val) {
 		JSONObject o = new JSONObject(val);
 		AppointmentDTO a = new AppointmentDTO();
-		a.setId(o.optLong("id"));
+		long id = o.optLong("id");
+		a.setId(id == 0 ? null : id);
 		a.setTitle(o.optString("title"));
 		a.setLocation(o.optString("location"));
 		a.setOwner(UserDTO.get(o.optJSONObject("owner")));
-		a.setStart(CalendarParamConverter.get(o.optString("start"), a.getOwner().getTimeZoneId()));
-		a.setEnd(CalendarParamConverter.get(o.optString("end"), a.getOwner().getTimeZoneId()));
+		String tzId = a.getOwner() == null ? null : a.getOwner().getTimeZoneId();
+		a.setStart(CalendarParamConverter.get(o.optString("start"), tzId));
+		a.setEnd(CalendarParamConverter.get(o.optString("end"), tzId));
 		a.setDescription(o.optString("description"));
 		a.setInserted(DateParamConverter.get(o.optString("inserted")));
-		a.setInserted(DateParamConverter.get(o.optString("updated")));
+		a.setUpdated(DateParamConverter.get(o.optString("updated")));
 		a.setDeleted(o.optBoolean("inserted"));
 		a.setReminder(Reminder.valueOf(o.optString("reminder")));
 		a.setRoom(RoomDTO.get(o.optJSONObject("room")));

Modified: openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/CalendarParamConverter.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/CalendarParamConverter.java?rev=1779552&r1=1779551&r2=1779552&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/CalendarParamConverter.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/CalendarParamConverter.java Fri Jan 20 03:01:21 2017
@@ -25,15 +25,20 @@ import java.util.TimeZone;
 
 import javax.ws.rs.ext.ParamConverter;
 
+import org.apache.wicket.util.string.Strings;
+
 public class CalendarParamConverter implements ParamConverter<Calendar> {
 	public static Calendar get(String val, String tzId) {
-		Calendar c = Calendar.getInstance(TimeZone.getTimeZone(tzId));
+		Calendar c = Strings.isEmpty(tzId) ? Calendar.getInstance() : Calendar.getInstance(TimeZone.getTimeZone(tzId));
 		c.setTime(DateParamConverter.get(val));
 		return c;
 	}
 
 	@Override
 	public Calendar fromString(String val) {
+		if (Strings.isEmpty(val)) {
+			return null;
+		}
 		Calendar c = Calendar.getInstance();
 		c.setTime(DateParamConverter.get(val));
 		return c;

Modified: openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/DateParamConverter.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/DateParamConverter.java?rev=1779552&r1=1779551&r2=1779552&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/DateParamConverter.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/DateParamConverter.java Fri Jan 20 03:01:21 2017
@@ -28,11 +28,15 @@ import java.util.Date;
 import javax.ws.rs.ext.ParamConverter;
 
 import org.apache.commons.lang3.time.FastDateFormat;
+import org.apache.wicket.util.string.Strings;
 
 public class DateParamConverter implements ParamConverter<Date> {
 	private final static FastDateFormat[] formats = new FastDateFormat[] { ISO8601_FULL_FORMAT, ISO8601_DATETIME_FORMAT, ISO8601_DATE_FORMAT };
 
-	static Date get(String val) {
+	public static Date get(String val) {
+		if (Strings.isEmpty(val)) {
+			return null;
+		}
 		for (FastDateFormat df : formats) {
 			try {
 				return df.parse(val);
@@ -40,7 +44,7 @@ public class DateParamConverter implemen
 				// no-op
 			}
 		}
-		throw new IllegalArgumentException("Unparsable format");
+		throw new IllegalArgumentException("Unparsable format: " + val);
 	}
 
 	@Override

Modified: openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/OmParamConverterProvider.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/OmParamConverterProvider.java?rev=1779552&r1=1779551&r2=1779552&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/OmParamConverterProvider.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/OmParamConverterProvider.java Fri Jan 20 03:01:21 2017
@@ -38,7 +38,7 @@ public class OmParamConverterProvider im
 		} else if (Date.class.isAssignableFrom(rawType)) {
 			return (ParamConverter<T>)new DateParamConverter();
 		} else if (AppointmentDTO.class.isAssignableFrom(rawType)) {
-			return (ParamConverter<T>)new DateParamConverter();
+			return (ParamConverter<T>)new AppointmentParamConverter();
 		}
 		return null;
 	}

Modified: openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java?rev=1779552&r1=1779551&r2=1779552&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java Fri Jan 20 03:01:21 2017
@@ -100,7 +100,7 @@ public class AppointmentDTO implements S
 		a.setStart(start.getTime());
 		a.setEnd(end.getTime());
 		a.setDescription(description);
-		a.setOwner(owner.get(userDao));
+		a.setOwner(owner == null ? null : owner.get(userDao));
 		a.setInserted(inserted);
 		a.setUpdated(updated);
 		a.setDeleted(deleted);

Modified: openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java?rev=1779552&r1=1779551&r2=1779552&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java Fri Jan 20 03:01:21 2017
@@ -68,7 +68,8 @@ public class MeetingMemberDTO implements
 
 	public static MeetingMemberDTO get(JSONObject o) {
 		MeetingMemberDTO m = new MeetingMemberDTO();
-		m.id = o.optLong("id");
+		long id = o.optLong("id");
+		m.id = id == 0 ? null : id;
 		m.user = UserDTO.get(o.optJSONObject("user"));
 		return m;
 	}

Modified: openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java?rev=1779552&r1=1779551&r2=1779552&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java Fri Jan 20 03:01:21 2017
@@ -284,8 +284,12 @@ public class RoomDTO implements Serializ
 	}
 
 	public static RoomDTO get(JSONObject o) {
+		if (o == null) {
+			return null;
+		}
 		RoomDTO r = new RoomDTO();
-		r.id = optLong(o, "id");
+		long id = o.optLong("id");
+		r.id = id == 0 ? null : id;
 		r.name = o.optString("name");
 		r.comment = o.optString("comment");
 		r.type = Room.Type.valueOf(o.getString("type"));

Modified: openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java?rev=1779552&r1=1779551&r2=1779552&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java Fri Jan 20 03:01:21 2017
@@ -187,8 +187,12 @@ public class UserDTO implements Serializ
 	}
 
 	public static UserDTO get(JSONObject o) {
+		if (o == null) {
+			return null;
+		}
 		UserDTO u = new UserDTO();
-		u.id = o.optLong("id");
+		long id = o.optLong("id");
+		u.id = id == 0 ? null : id;
 		u.login = o.optString("login");
 		u.password = o.optString("password");
 		u.firstname = o.optString("firstname");

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java?rev=1779552&r1=1779551&r2=1779552&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java Fri Jan 20 03:01:21 2017
@@ -18,8 +18,11 @@
  */
 package org.apache.openmeetings.test.webservice;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
+import java.time.LocalDate;
+import java.time.ZoneId;
 import java.util.Date;
 import java.util.UUID;
 
@@ -31,6 +34,7 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.user.GroupUser;
 import org.apache.openmeetings.db.entity.user.User;
+import org.apache.openmeetings.webservice.util.DateParamConverter;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 
@@ -65,4 +69,12 @@ public class TestCalendarService extends
 	public void testGetByPublicRoom() throws Exception {
 		actualTest(roomDao.get(5L)); //default public restricted room
 	}
+
+	@Test
+	public void testDateConverter() throws Exception {
+		assertEquals("Null date should be parsed", null, DateParamConverter.get(null));
+		assertEquals("Date should be parsed"
+				, Date.from(LocalDate.of(2017, 01, 15).atStartOfDay(ZoneId.systemDefault()).toInstant())
+				, DateParamConverter.get("2017-01-15"));
+	}
 }

Added: openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestWebConverters.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestWebConverters.java?rev=1779552&view=auto
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestWebConverters.java (added)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestWebConverters.java Fri Jan 20 03:01:21 2017
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.openmeetings.test.webservice;
+
+import static org.junit.Assert.assertEquals;
+
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.util.Calendar;
+import java.util.Date;
+
+import org.apache.openmeetings.db.dto.user.UserDTO;
+import org.apache.openmeetings.webservice.util.CalendarParamConverter;
+import org.apache.openmeetings.webservice.util.DateParamConverter;
+import org.apache.wicket.ajax.json.JSONObject;
+import org.junit.Test;
+
+public class TestWebConverters {
+	@Test
+	public void testDateConverter() throws Exception {
+		assertEquals("Null date should be parsed", null, DateParamConverter.get(null));
+		assertEquals("Date should be parsed"
+				, Date.from(LocalDate.of(2017, 01, 15).atStartOfDay(ZoneId.systemDefault()).toInstant())
+				, DateParamConverter.get("2017-01-15"));
+		assertEquals("Date should be parsed"
+				, Date.from(ZonedDateTime.of(2017, 01, 20, 20, 30, 03, 0, ZoneId.of("Europe/Moscow")).toInstant())
+				, DateParamConverter.get("2017-01-20T20:30:03+0300"));
+	}
+
+	@Test
+	public void testCalendarConverter() throws Exception {
+		CalendarParamConverter c = new CalendarParamConverter();
+		assertEquals("Null calendar should be parsed", null, c.fromString(null));
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(Date.from(LocalDate.of(2017, 01, 15).atStartOfDay(ZoneId.systemDefault()).toInstant()));
+		assertEquals("Calendar should be parsed", cal, c.fromString("2017-01-15"));
+	}
+
+	@Test
+	public void testUserConverter() throws Exception {
+		assertEquals("Null UserDTO should be parsed", null, UserDTO.get((JSONObject)null));
+	}
+}

Modified: openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java?rev=1779552&r1=1779551&r2=1779552&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java Fri Jan 20 03:01:21 2017
@@ -35,15 +35,17 @@ public class AppointmentParamConverter i
 	public AppointmentDTO fromString(String val) {
 		JSONObject o = new JSONObject(val);
 		AppointmentDTO a = new AppointmentDTO();
-		a.setId(o.optLong("id"));
+		long id = o.optLong("id");
+		a.setId(id == 0 ? null : id);
 		a.setTitle(o.optString("title"));
 		a.setLocation(o.optString("location"));
 		a.setOwner(UserDTO.get(o.optJSONObject("owner")));
-		a.setStart(CalendarParamConverter.get(o.optString("start"), a.getOwner().getTimeZoneId()));
-		a.setEnd(CalendarParamConverter.get(o.optString("end"), a.getOwner().getTimeZoneId()));
+		String tzId = a.getOwner() == null ? null : a.getOwner().getTimeZoneId();
+		a.setStart(CalendarParamConverter.get(o.optString("start"), tzId));
+		a.setEnd(CalendarParamConverter.get(o.optString("end"), tzId));
 		a.setDescription(o.optString("description"));
 		a.setInserted(DateParamConverter.get(o.optString("inserted")));
-		a.setInserted(DateParamConverter.get(o.optString("updated")));
+		a.setUpdated(DateParamConverter.get(o.optString("updated")));
 		a.setDeleted(o.optBoolean("inserted"));
 		a.setReminder(Reminder.valueOf(o.optString("reminder")));
 		a.setRoom(RoomDTO.get(o.optJSONObject("room")));

Modified: openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/CalendarParamConverter.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/CalendarParamConverter.java?rev=1779552&r1=1779551&r2=1779552&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/CalendarParamConverter.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/CalendarParamConverter.java Fri Jan 20 03:01:21 2017
@@ -25,15 +25,20 @@ import java.util.TimeZone;
 
 import javax.ws.rs.ext.ParamConverter;
 
+import org.apache.wicket.util.string.Strings;
+
 public class CalendarParamConverter implements ParamConverter<Calendar> {
 	public static Calendar get(String val, String tzId) {
-		Calendar c = Calendar.getInstance(TimeZone.getTimeZone(tzId));
+		Calendar c = Strings.isEmpty(tzId) ? Calendar.getInstance() : Calendar.getInstance(TimeZone.getTimeZone(tzId));
 		c.setTime(DateParamConverter.get(val));
 		return c;
 	}
 
 	@Override
 	public Calendar fromString(String val) {
+		if (Strings.isEmpty(val)) {
+			return null;
+		}
 		Calendar c = Calendar.getInstance();
 		c.setTime(DateParamConverter.get(val));
 		return c;

Modified: openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/DateParamConverter.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/DateParamConverter.java?rev=1779552&r1=1779551&r2=1779552&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/DateParamConverter.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/DateParamConverter.java Fri Jan 20 03:01:21 2017
@@ -28,11 +28,15 @@ import java.util.Date;
 import javax.ws.rs.ext.ParamConverter;
 
 import org.apache.commons.lang3.time.FastDateFormat;
+import org.apache.wicket.util.string.Strings;
 
 public class DateParamConverter implements ParamConverter<Date> {
 	private final static FastDateFormat[] formats = new FastDateFormat[] { ISO8601_FULL_FORMAT, ISO8601_DATETIME_FORMAT, ISO8601_DATE_FORMAT };
 
-	static Date get(String val) {
+	public static Date get(String val) {
+		if (Strings.isEmpty(val)) {
+			return null;
+		}
 		for (FastDateFormat df : formats) {
 			try {
 				return df.parse(val);
@@ -40,7 +44,7 @@ public class DateParamConverter implemen
 				// no-op
 			}
 		}
-		throw new IllegalArgumentException("Unparsable format");
+		throw new IllegalArgumentException("Unparsable format: " + val);
 	}
 
 	@Override

Modified: openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/OmParamConverterProvider.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/OmParamConverterProvider.java?rev=1779552&r1=1779551&r2=1779552&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/OmParamConverterProvider.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/OmParamConverterProvider.java Fri Jan 20 03:01:21 2017
@@ -38,7 +38,7 @@ public class OmParamConverterProvider im
 		} else if (Date.class.isAssignableFrom(rawType)) {
 			return (ParamConverter<T>)new DateParamConverter();
 		} else if (AppointmentDTO.class.isAssignableFrom(rawType)) {
-			return (ParamConverter<T>)new DateParamConverter();
+			return (ParamConverter<T>)new AppointmentParamConverter();
 		}
 		return null;
 	}

Modified: openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java?rev=1779552&r1=1779551&r2=1779552&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java (original)
+++ openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java Fri Jan 20 03:01:21 2017
@@ -100,7 +100,7 @@ public class AppointmentDTO implements S
 		a.setStart(start.getTime());
 		a.setEnd(end.getTime());
 		a.setDescription(description);
-		a.setOwner(owner.get(userDao));
+		a.setOwner(owner == null ? null : owner.get(userDao));
 		a.setInserted(inserted);
 		a.setUpdated(updated);
 		a.setDeleted(deleted);

Modified: openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java?rev=1779552&r1=1779551&r2=1779552&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java (original)
+++ openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java Fri Jan 20 03:01:21 2017
@@ -68,7 +68,8 @@ public class MeetingMemberDTO implements
 
 	public static MeetingMemberDTO get(JSONObject o) {
 		MeetingMemberDTO m = new MeetingMemberDTO();
-		m.id = o.optLong("id");
+		long id = o.optLong("id");
+		m.id = id == 0 ? null : id;
 		m.user = UserDTO.get(o.optJSONObject("user"));
 		return m;
 	}

Modified: openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java?rev=1779552&r1=1779551&r2=1779552&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java (original)
+++ openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java Fri Jan 20 03:01:21 2017
@@ -284,8 +284,12 @@ public class RoomDTO implements Serializ
 	}
 
 	public static RoomDTO get(JSONObject o) {
+		if (o == null) {
+			return null;
+		}
 		RoomDTO r = new RoomDTO();
-		r.id = optLong(o, "id");
+		long id = o.optLong("id");
+		r.id = id == 0 ? null : id;
 		r.name = o.optString("name");
 		r.comment = o.optString("comment");
 		r.type = Room.Type.valueOf(o.getString("type"));

Modified: openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java?rev=1779552&r1=1779551&r2=1779552&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java (original)
+++ openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java Fri Jan 20 03:01:21 2017
@@ -187,8 +187,12 @@ public class UserDTO implements Serializ
 	}
 
 	public static UserDTO get(JSONObject o) {
+		if (o == null) {
+			return null;
+		}
 		UserDTO u = new UserDTO();
-		u.id = o.optLong("id");
+		long id = o.optLong("id");
+		u.id = id == 0 ? null : id;
 		u.login = o.optString("login");
 		u.password = o.optString("password");
 		u.firstname = o.optString("firstname");

Modified: openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java?rev=1779552&r1=1779551&r2=1779552&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java Fri Jan 20 03:01:21 2017
@@ -18,8 +18,11 @@
  */
 package org.apache.openmeetings.test.webservice;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
+import java.time.LocalDate;
+import java.time.ZoneId;
 import java.util.Date;
 import java.util.UUID;
 
@@ -31,6 +34,7 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.user.GroupUser;
 import org.apache.openmeetings.db.entity.user.User;
+import org.apache.openmeetings.webservice.util.DateParamConverter;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 
@@ -65,4 +69,12 @@ public class TestCalendarService extends
 	public void testGetByPublicRoom() throws Exception {
 		actualTest(roomDao.get(5L)); //default public restricted room
 	}
+
+	@Test
+	public void testDateConverter() throws Exception {
+		assertEquals("Null date should be parsed", null, DateParamConverter.get(null));
+		assertEquals("Date should be parsed"
+				, Date.from(LocalDate.of(2017, 01, 15).atStartOfDay(ZoneId.systemDefault()).toInstant())
+				, DateParamConverter.get("2017-01-15"));
+	}
 }

Added: openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestWebConverters.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestWebConverters.java?rev=1779552&view=auto
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestWebConverters.java (added)
+++ openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestWebConverters.java Fri Jan 20 03:01:21 2017
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.openmeetings.test.webservice;
+
+import static org.junit.Assert.assertEquals;
+
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.util.Calendar;
+import java.util.Date;
+
+import org.apache.openmeetings.db.dto.user.UserDTO;
+import org.apache.openmeetings.webservice.util.CalendarParamConverter;
+import org.apache.openmeetings.webservice.util.DateParamConverter;
+import org.apache.wicket.ajax.json.JSONObject;
+import org.junit.Test;
+
+public class TestWebConverters {
+	@Test
+	public void testDateConverter() throws Exception {
+		assertEquals("Null date should be parsed", null, DateParamConverter.get(null));
+		assertEquals("Date should be parsed"
+				, Date.from(LocalDate.of(2017, 01, 15).atStartOfDay(ZoneId.systemDefault()).toInstant())
+				, DateParamConverter.get("2017-01-15"));
+		assertEquals("Date should be parsed"
+				, Date.from(ZonedDateTime.of(2017, 01, 20, 20, 30, 03, 0, ZoneId.of("Europe/Moscow")).toInstant())
+				, DateParamConverter.get("2017-01-20T20:30:03+0300"));
+	}
+
+	@Test
+	public void testCalendarConverter() throws Exception {
+		CalendarParamConverter c = new CalendarParamConverter();
+		assertEquals("Null calendar should be parsed", null, c.fromString(null));
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(Date.from(LocalDate.of(2017, 01, 15).atStartOfDay(ZoneId.systemDefault()).toInstant()));
+		assertEquals("Calendar should be parsed", cal, c.fromString("2017-01-15"));
+	}
+
+	@Test
+	public void testUserConverter() throws Exception {
+		assertEquals("Null UserDTO should be parsed", null, UserDTO.get((JSONObject)null));
+	}
+}

Modified: openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java?rev=1779552&r1=1779551&r2=1779552&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java (original)
+++ openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java Fri Jan 20 03:01:21 2017
@@ -35,15 +35,17 @@ public class AppointmentParamConverter i
 	public AppointmentDTO fromString(String val) {
 		JSONObject o = new JSONObject(val);
 		AppointmentDTO a = new AppointmentDTO();
-		a.setId(o.optLong("id"));
+		long id = o.optLong("id");
+		a.setId(id == 0 ? null : id);
 		a.setTitle(o.optString("title"));
 		a.setLocation(o.optString("location"));
 		a.setOwner(UserDTO.get(o.optJSONObject("owner")));
-		a.setStart(CalendarParamConverter.get(o.optString("start"), a.getOwner().getTimeZoneId()));
-		a.setEnd(CalendarParamConverter.get(o.optString("end"), a.getOwner().getTimeZoneId()));
+		String tzId = a.getOwner() == null ? null : a.getOwner().getTimeZoneId();
+		a.setStart(CalendarParamConverter.get(o.optString("start"), tzId));
+		a.setEnd(CalendarParamConverter.get(o.optString("end"), tzId));
 		a.setDescription(o.optString("description"));
 		a.setInserted(DateParamConverter.get(o.optString("inserted")));
-		a.setInserted(DateParamConverter.get(o.optString("updated")));
+		a.setUpdated(DateParamConverter.get(o.optString("updated")));
 		a.setDeleted(o.optBoolean("inserted"));
 		a.setReminder(Reminder.valueOf(o.optString("reminder")));
 		a.setRoom(RoomDTO.get(o.optJSONObject("room")));

Modified: openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/CalendarParamConverter.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/CalendarParamConverter.java?rev=1779552&r1=1779551&r2=1779552&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/CalendarParamConverter.java (original)
+++ openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/CalendarParamConverter.java Fri Jan 20 03:01:21 2017
@@ -25,15 +25,20 @@ import java.util.TimeZone;
 
 import javax.ws.rs.ext.ParamConverter;
 
+import org.apache.wicket.util.string.Strings;
+
 public class CalendarParamConverter implements ParamConverter<Calendar> {
 	public static Calendar get(String val, String tzId) {
-		Calendar c = Calendar.getInstance(TimeZone.getTimeZone(tzId));
+		Calendar c = Strings.isEmpty(tzId) ? Calendar.getInstance() : Calendar.getInstance(TimeZone.getTimeZone(tzId));
 		c.setTime(DateParamConverter.get(val));
 		return c;
 	}
 
 	@Override
 	public Calendar fromString(String val) {
+		if (Strings.isEmpty(val)) {
+			return null;
+		}
 		Calendar c = Calendar.getInstance();
 		c.setTime(DateParamConverter.get(val));
 		return c;

Modified: openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/DateParamConverter.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/DateParamConverter.java?rev=1779552&r1=1779551&r2=1779552&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/DateParamConverter.java (original)
+++ openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/DateParamConverter.java Fri Jan 20 03:01:21 2017
@@ -28,11 +28,15 @@ import java.util.Date;
 import javax.ws.rs.ext.ParamConverter;
 
 import org.apache.commons.lang3.time.FastDateFormat;
+import org.apache.wicket.util.string.Strings;
 
 public class DateParamConverter implements ParamConverter<Date> {
 	private final static FastDateFormat[] formats = new FastDateFormat[] { ISO8601_FULL_FORMAT, ISO8601_DATETIME_FORMAT, ISO8601_DATE_FORMAT };
 
-	static Date get(String val) {
+	public static Date get(String val) {
+		if (Strings.isEmpty(val)) {
+			return null;
+		}
 		for (FastDateFormat df : formats) {
 			try {
 				return df.parse(val);
@@ -40,7 +44,7 @@ public class DateParamConverter implemen
 				// no-op
 			}
 		}
-		throw new IllegalArgumentException("Unparsable format");
+		throw new IllegalArgumentException("Unparsable format: " + val);
 	}
 
 	@Override

Modified: openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/OmParamConverterProvider.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/OmParamConverterProvider.java?rev=1779552&r1=1779551&r2=1779552&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/OmParamConverterProvider.java (original)
+++ openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/OmParamConverterProvider.java Fri Jan 20 03:01:21 2017
@@ -38,7 +38,7 @@ public class OmParamConverterProvider im
 		} else if (Date.class.isAssignableFrom(rawType)) {
 			return (ParamConverter<T>)new DateParamConverter();
 		} else if (AppointmentDTO.class.isAssignableFrom(rawType)) {
-			return (ParamConverter<T>)new DateParamConverter();
+			return (ParamConverter<T>)new AppointmentParamConverter();
 		}
 		return null;
 	}