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/19 05:41:22 UTC

svn commit: r1779419 - 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: Thu Jan 19 05:41:22 2017
New Revision: 1779419

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

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/room/RoomStatus.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-util/src/main/java/org/apache/openmeetings/util/CalendarPatterns.java
    openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
    openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.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-util/src/main/java/org/apache/openmeetings/util/CalendarPatterns.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
    openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.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-util/src/main/java/org/apache/openmeetings/util/CalendarPatterns.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
    openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.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=1779419&r1=1779418&r2=1779419&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 Thu Jan 19 05:41:22 2017
@@ -18,7 +18,10 @@
  */
 package org.apache.openmeetings.db.dto.calendar;
 
+import static org.apache.openmeetings.util.CalendarPatterns.ISO8601_FORMAT;
+
 import java.io.Serializable;
+import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
@@ -36,6 +39,8 @@ import org.apache.openmeetings.db.dto.us
 import org.apache.openmeetings.db.entity.calendar.Appointment;
 import org.apache.openmeetings.db.entity.calendar.Appointment.Reminder;
 import org.apache.openmeetings.db.entity.calendar.MeetingMember;
+import org.apache.wicket.ajax.json.JSONArray;
+import org.apache.wicket.ajax.json.JSONObject;
 
 @XmlRootElement
 @XmlAccessorType(XmlAccessType.FIELD)
@@ -118,7 +123,7 @@ public class AppointmentDTO implements S
 		a.setReminderEmailSend(reminderEmailSend);
 		return a;
 	}
-	
+
 	public Long getId() {
 		return id;
 	}
@@ -278,4 +283,54 @@ public class AppointmentDTO implements S
 	public void setPassword(String password) {
 		this.password = password;
 	}
+
+	private static Date optDate(JSONObject o, String prop) throws ParseException {
+		return ISO8601_FORMAT.parse(o.optString(prop));
+	}
+
+	private static Calendar optCal(AppointmentDTO a, JSONObject o, String prop) throws ParseException {
+		Calendar c = Calendar.getInstance(TimeZone.getTimeZone(a.owner.getTimeZoneId()));
+		c.setTime(ISO8601_FORMAT.parse(o.optString(prop)));
+		return c;
+	}
+
+	public static AppointmentDTO fromString(String s) throws ParseException {
+		JSONObject o = new JSONObject(s);
+		AppointmentDTO a = new AppointmentDTO();
+		a.id = o.optLong("id");
+		a.title = o.optString("title");
+		a.location = o.optString("location");
+		a.owner = UserDTO.get(o.optJSONObject("owner"));
+		a.start = optCal(a, o, "start");
+		a.end = optCal(a, o, "end");
+		a.description = o.optString("description");
+		a.inserted = optDate(o, "inserted");
+		a.updated = optDate(o, "updated");
+		a.deleted = o.optBoolean("inserted");
+		a.reminder = Reminder.valueOf(o.optString("reminder"));
+		a.room = RoomDTO.get(o.optJSONObject("room"));
+		a.icalId = o.optString("icalId");
+		JSONArray mm = o.optJSONArray("meetingMembers");
+		if (mm != null) {
+			for (int i = 0; i < mm.length(); ++i) {
+				a.meetingMembers.add(MeetingMemberDTO.get(mm.getJSONObject(i)));
+			}
+		}
+		a.languageId = o.optLong("languageId");
+		a.password = o.optString("password");
+		a.passwordProtected = o.optBoolean("passwordProtected");
+		a.connectedEvent = o.optBoolean("connectedEvent");
+		a.reminderEmailSend = o.optBoolean("reminderEmailSend");
+		return a;
+	}
+
+	@Override
+	public String toString() {
+		return new JSONObject(this)
+			.put("start", ISO8601_FORMAT.format(start))
+			.put("end", ISO8601_FORMAT.format(end))
+			.put("inserted", ISO8601_FORMAT.format(inserted))
+			.put("updated", ISO8601_FORMAT.format(updated))
+			.toString();
+	}
 }

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=1779419&r1=1779418&r2=1779419&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 Thu Jan 19 05:41:22 2017
@@ -27,6 +27,7 @@ import javax.xml.bind.annotation.XmlRoot
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.dto.user.UserDTO;
 import org.apache.openmeetings.db.entity.calendar.MeetingMember;
+import org.apache.wicket.ajax.json.JSONObject;
 
 @XmlRootElement
 @XmlAccessorType(XmlAccessType.FIELD)
@@ -34,7 +35,7 @@ public class MeetingMemberDTO implements
 	private static final long serialVersionUID = 1L;
 	private Long id;
 	private UserDTO user;
-	
+
 	public MeetingMemberDTO() {}
 
 	public MeetingMemberDTO(MeetingMember mm) {
@@ -48,7 +49,7 @@ public class MeetingMemberDTO implements
 		mm.setUser(user.get(userDao));
 		return mm;
 	}
-	
+
 	public Long getId() {
 		return id;
 	}
@@ -64,4 +65,16 @@ public class MeetingMemberDTO implements
 	public void setUser(UserDTO user) {
 		this.user = user;
 	}
+
+	public static MeetingMemberDTO get(JSONObject o) {
+		MeetingMemberDTO m = new MeetingMemberDTO();
+		m.id = o.optLong("id");
+		m.user = UserDTO.get(o.optJSONObject("user"));
+		return m;
+	}
+
+	@Override
+	public String toString() {
+		return new JSONObject(this).toString();
+	}
 }

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=1779419&r1=1779418&r2=1779419&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 Thu Jan 19 05:41:22 2017
@@ -63,7 +63,7 @@ public class RoomDTO implements Serializ
 	private boolean whiteboardHidden;
 
 	public RoomDTO() {}
-	
+
 	public RoomDTO(Room r) {
 		id = r.getId();
 		name = r.getName();
@@ -122,7 +122,7 @@ public class RoomDTO implements Serializ
 		r.setHideWhiteboard(whiteboardHidden);
 		return r;
 	}
-	
+
 	public Long getId() {
 		return id;
 	}
@@ -340,9 +340,12 @@ public class RoomDTO implements Serializ
 		}
 		return rList;
 	}
-	
+
 	public static RoomDTO fromString(String s) {
-		JSONObject o = new JSONObject(s);
+		return get(new JSONObject(s));
+	}
+
+	public static RoomDTO get(JSONObject o) {
 		RoomDTO r = new RoomDTO();
 		r.id = optLong(o, "id");
 		r.name = o.optString("name");
@@ -372,7 +375,7 @@ public class RoomDTO implements Serializ
 		r.whiteboardHidden = o.optBoolean("whiteboardHidden", false);
 		return r;
 	}
-	
+
 	@Override
 	public String toString() {
 		return new JSONObject(this).toString();

Modified: openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomStatus.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomStatus.java?rev=1779419&r1=1779418&r2=1779419&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomStatus.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomStatus.java Thu Jan 19 05:41:22 2017
@@ -23,7 +23,6 @@ import java.util.List;
 import org.apache.openmeetings.db.entity.room.Client;
 
 public class RoomStatus {
-	
 	List<Client> clientList;
 	BrowserStatus browserStatus;
 	boolean roomFull = false;

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=1779419&r1=1779418&r2=1779419&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 Thu Jan 19 05:41:22 2017
@@ -20,6 +20,7 @@ package org.apache.openmeetings.db.dto.u
 
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
@@ -30,6 +31,8 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Right;
 import org.apache.openmeetings.db.entity.user.User.Type;
+import org.apache.wicket.ajax.json.JSONArray;
+import org.apache.wicket.ajax.json.JSONObject;
 
 @XmlRootElement
 public class UserDTO implements Serializable {
@@ -39,9 +42,9 @@ public class UserDTO implements Serializ
 	private String password;
 	private String firstname;
 	private String lastname;
-	private Set<Right> rights;
+	private Set<Right> rights = new HashSet<>();
 	private Long languageId;
-	private Address address;
+	private Address address = new Address();
 	private String timeZoneId;
 	private String externalId;
 	private String externalType;
@@ -62,7 +65,7 @@ public class UserDTO implements Serializ
 		externalId = u.getExternalId();
 		externalType = u.getExternalType();
 	}
-	
+
 	public User get(UserDao userDao) {
 		User u = id == null ? new User() : userDao.get(id);
 		u.setFirstname(firstname);
@@ -76,7 +79,7 @@ public class UserDTO implements Serializ
 		u.setType(type);
 		return u;
 	}
-	
+
 	public static List<UserDTO> list(List<User> l) {
 		List<UserDTO> uList = new ArrayList<>();
 		if (l != null) {
@@ -86,7 +89,7 @@ public class UserDTO implements Serializ
 		}
 		return uList;
 	}
-	
+
 	public Long getId() {
 		return id;
 	}
@@ -182,4 +185,31 @@ public class UserDTO implements Serializ
 	public void setExternalType(String externalType) {
 		this.externalType = externalType;
 	}
+
+	public static UserDTO get(JSONObject o) {
+		UserDTO u = new UserDTO();
+		u.id = o.optLong("id");
+		u.login = o.optString("login");
+		u.password = o.optString("password");
+		u.firstname = o.optString("firstname");
+		u.lastname = o.optString("lastname");
+		JSONArray rr = o.optJSONArray("rights");
+		if (rr !=  null) {
+			for (int i = 0; i < rr.length(); ++i) {
+				u.rights.add(Right.valueOf(rr.getString(i)));
+			}
+		}
+		u.languageId = o.optLong("languageId");
+		JSONObject a = o.optJSONObject("address");
+		if (a != null) {
+			u.address.setId(a.optLong("id"));
+			u.address.setCountry(a.optString("country"));
+			u.address.setEmail(a.optString("email"));
+		}
+		u.timeZoneId = o.optString("timeZoneId");
+		u.externalId = o.optString("externalId");
+		u.externalType = o.optString("externalType");
+		u.type = Type.valueOf(o.optString("type"));
+		return u;
+	}
 }

Modified: openmeetings/application/branches/3.1.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/CalendarPatterns.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/CalendarPatterns.java?rev=1779419&r1=1779418&r2=1779419&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/CalendarPatterns.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/CalendarPatterns.java Thu Jan 19 05:41:22 2017
@@ -35,13 +35,15 @@ import org.slf4j.Logger;
 public class CalendarPatterns {
 	private static final Logger log = Red5LoggerFactory.getLogger(CalendarPatterns.class, webAppRootKey);
 
-	public static FastDateFormat dateFormat__ddMMyyyyHHmmss = FastDateFormat.getInstance("dd.MM.yyyy HH:mm:ss");
-	public static FastDateFormat dateFormat__ddMMyyyy = FastDateFormat.getInstance("dd.MM.yyyy");
-	public static FastDateFormat dateFormat__ddMMyyyyBySeparator = FastDateFormat.getInstance("dd-MM-yyyy");
-	public static FastDateFormat dateFormat__yyyyMMddHHmmss = FastDateFormat.getInstance("yyyy.MM.dd HH:mm:ss");
-	public static FastDateFormat STREAM_DATE_FORMAT = FastDateFormat.getInstance("yyyy_MM_dd_HH_mm_ss");
-	public static String FULL_DF_PATTERN = "dd.MM.yyyy HH:mm:ss z (Z)";
-	public static FastDateFormat FULL_DATE_FORMAT = FastDateFormat.getInstance(FULL_DF_PATTERN);
+	public static final FastDateFormat dateFormat__ddMMyyyyHHmmss = FastDateFormat.getInstance("dd.MM.yyyy HH:mm:ss");
+	public static final FastDateFormat dateFormat__ddMMyyyy = FastDateFormat.getInstance("dd.MM.yyyy");
+	public static final FastDateFormat dateFormat__ddMMyyyyBySeparator = FastDateFormat.getInstance("dd-MM-yyyy");
+	public static final FastDateFormat dateFormat__yyyyMMddHHmmss = FastDateFormat.getInstance("yyyy.MM.dd HH:mm:ss");
+	public static final FastDateFormat STREAM_DATE_FORMAT = FastDateFormat.getInstance("yyyy_MM_dd_HH_mm_ss");
+	public static final String FULL_DF_PATTERN = "dd.MM.yyyy HH:mm:ss z (Z)";
+	public static final String ISO8601_FORMAT_STRING = "yyyy-MM-dd'T'HH:mm:ssZ";
+	public static final FastDateFormat FULL_DATE_FORMAT = FastDateFormat.getInstance(FULL_DF_PATTERN);
+	public static final FastDateFormat ISO8601_FORMAT = FastDateFormat.getInstance(ISO8601_FORMAT_STRING);
 
 	public static String getDateByMiliSeconds(Date t) {
 		return dateFormat__yyyyMMddHHmmss.format(t);

Modified: openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java?rev=1779419&r1=1779418&r2=1779419&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java Thu Jan 19 05:41:22 2017
@@ -19,6 +19,7 @@
 package org.apache.openmeetings.web.app;
 
 import static java.text.DateFormat.SHORT;
+import static org.apache.openmeetings.util.CalendarPatterns.ISO8601_FORMAT_STRING;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_SHOW_MYROOMS_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_SHOW_RSS_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_LANG_KEY;
@@ -91,7 +92,6 @@ public class WebSession extends Abstract
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = getLogger(WebSession.class, webAppRootKey);
 	public static final int MILLIS_IN_MINUTE = 60000;
-	public static final String ISO8601_FORMAT_STRING = "yyyy-MM-dd'T'HH:mm:ssZ";
 	public static final List<String> AVAILABLE_TIMEZONES = Arrays.asList(TimeZone.getAvailableIDs());
 	public static final Set<String> AVAILABLE_TIMEZONE_SET = new LinkedHashSet<String>(AVAILABLE_TIMEZONES);
 	public static final String WICKET_ROOM_ID = "wicketroomid";
@@ -315,7 +315,7 @@ public class WebSession extends Abstract
 		setLocale(getLocale(u));
 		sdf = FastDateFormat.getDateTimeInstance(SHORT, SHORT, getLocale());
 	}
-	
+
 	public boolean signIn(String login, String password, Type type, Long domainId) {
 		try {
 			User u = null;
@@ -344,7 +344,7 @@ public class WebSession extends Abstract
 		}
 		return false;
 	}
-	
+
 	public boolean signIn(User u) {
 		Sessiondata sessData = getBean(SessiondataDao.class).create();
 		SID = sessData.getSessionId();
@@ -354,20 +354,20 @@ public class WebSession extends Abstract
 		setUser(u, null);
 		return true;
 	}
-	
+
 	public Long getLoginError() {
 		return loginError;
 	}
-	
+
 	public static WebSession get() {
 		return (WebSession)AbstractAuthenticatedWebSession.get();
 	}
-	
+
 	@Override
 	public void setLanguage(long languageId) {
 		this.languageId = languageId;
 	}
-	
+
 	public static long getLanguage() {
 		checkIsInvalid();
 		WebSession session = get();
@@ -380,7 +380,7 @@ public class WebSession extends Abstract
 		}
 		return session.languageId;
 	}
-	
+
 	public String getValidatedSid() {
 		SessiondataDao sessionDao = getBean(SessiondataDao.class);
 		Long _userId = sessionDao.check(SID);
@@ -398,7 +398,7 @@ public class WebSession extends Abstract
 		}
 		return SID;
 	}
-	
+
 	public static String getSid() {
 		return get().getValidatedSid();
 	}
@@ -439,20 +439,20 @@ public class WebSession extends Abstract
 	public static FastDateFormat getIsoDateFormat() {
 		return get().ISO8601FORMAT;
 	}
-	
+
 	public static FastDateFormat getDateFormat() {
 		return get().sdf;
 	}
-	
+
 	public static Set<Right> getRights() {
 		checkIsInvalid();
 		return get().rights;
 	}
-	
+
 	public static void setKickedByAdmin(boolean kicked) {
 		get().kickedByAdmin = kicked;
 	}
-	
+
 	public boolean isKickedByAdmin() {
 		return kickedByAdmin;
 	}
@@ -465,7 +465,7 @@ public class WebSession extends Abstract
 		this.area = area;
 	}
 
-	
+
 	public static Dashboard getDashboard() {
 		Dashboard d = get().dashboard;
 		if (d == null) {
@@ -474,7 +474,7 @@ public class WebSession extends Abstract
 		}
 		return d;
 	}
-	
+
 	public Locale getBrowserLocale(){
 		return browserLocale;
 	}
@@ -507,12 +507,12 @@ public class WebSession extends Abstract
 		}
 		return _zone == null ? null : _zone.getID();
 	}
-	
+
 	public static TimeZone getClientTimeZone() {
 		String tzCode = get().getClientTZCode();
 		return tzCode == null ? null : TimeZone.getTimeZone(tzCode);
 	}
-	
+
 	private void initDashboard() {
 		DashboardContext dashboardContext = getDashboardContext();
 		dashboard = (UserDashboard)dashboardContext.getDashboardPersister().load();
@@ -590,12 +590,12 @@ public class WebSession extends Abstract
 	public long getOmLanguage() {
 		return getLanguage();
 	}
-	
+
 	private static void checkIsInvalid() {
 		if (isInvaldSession(get().getId())) {
 			setKickedByAdmin(true);
 			removeInvalidSession(get().getId());
-			org.apache.wicket.Session session = (org.apache.wicket.Session)get();
+			org.apache.wicket.Session session = get();
 			session.invalidate();
 			Application.get().restartResponseAtSignInPage();
 		}

Modified: openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java?rev=1779419&r1=1779418&r2=1779419&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java Thu Jan 19 05:41:22 2017
@@ -26,9 +26,11 @@ import java.util.Date;
 import java.util.List;
 import java.util.Set;
 
+import javax.jws.WebMethod;
 import javax.jws.WebParam;
 import javax.jws.WebService;
 import javax.ws.rs.DELETE;
+import javax.ws.rs.FormParam;
 import javax.ws.rs.GET;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
@@ -43,6 +45,7 @@ import org.apache.openmeetings.db.dao.se
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.dto.calendar.AppointmentDTO;
 import org.apache.openmeetings.db.entity.calendar.Appointment;
+import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Right;
 import org.apache.openmeetings.db.util.AuthLevelUtil;
 import org.apache.openmeetings.webservice.error.ServiceException;
@@ -52,9 +55,9 @@ import org.springframework.beans.factory
 
 /**
  * CalendarService contains methods to create, edit delete calendar meetings
- * 
+ *
  * @author sebawagner
- * 
+ *
  */
 @WebService(serviceName="org.apache.openmeetings.webservice.CalendarWebService", targetNamespace = TNS)
 @Features(features = "org.apache.cxf.feature.LoggingFeature")
@@ -72,14 +75,14 @@ public class CalendarWebService {
 
 	/**
 	 * Load appointments by a start / end range for the current SID
-	 * 
+	 *
 	 * @param sid
 	 *            The SID of the User. This SID must be marked as Loggedin
 	 * @param start
 	 *            start time
 	 * @param end
 	 *            end time
-	 *            
+	 *
 	 * @return - list of appointments in range
 	 * @throws {@link ServiceException} in case of any error
 	 */
@@ -108,7 +111,7 @@ public class CalendarWebService {
 
 	/**
 	 * Load appointments by a start / end range for the userId
-	 * 
+	 *
 	 * @param sid
 	 *            The SID of the User. This SID must be marked as Loggedin
 	 * @param userid
@@ -117,7 +120,7 @@ public class CalendarWebService {
 	 *            start time
 	 * @param end
 	 *            end time
-	 *            
+	 *
 	 * @return - list of appointments in range
 	 * @throws {@link ServiceException} in case of any error
 	 */
@@ -148,7 +151,7 @@ public class CalendarWebService {
 
 	/**
 	 * Get the next Calendar event for the current user of the SID
-	 * 
+	 *
 	 * @param sid
 	 *            The SID of the User. This SID must be marked as Loggedin
 	 * @return - next Calendar event
@@ -175,12 +178,12 @@ public class CalendarWebService {
 
 	/**
 	 * Get the next Calendar event for userId
-	 * 
+	 *
 	 * @param sid
 	 *            The SID of the User. This SID must be marked as Loggedin
 	 * @param userid
 	 *            the userId the calendar events should be loaded
-	 *            
+	 *
 	 * @return - next Calendar event
 	 * @throws {@link ServiceException} in case of any error
 	 */
@@ -204,9 +207,9 @@ public class CalendarWebService {
 	}
 
 	/**
-	 * 
+	 *
 	 * Load a calendar event by its room id
-	 * 
+	 *
 	 * @param sid
 	 * @param roomid
 	 * @return - calendar event by its room id
@@ -236,12 +239,12 @@ public class CalendarWebService {
 
 	/**
 	 * Search a calendar event for the current SID
-	 * 
+	 *
 	 * @param sid
 	 *            The SID of the User. This SID must be marked as Loggedin
 	 * @param title
 	 *            the search string
-	 *            
+	 *
 	 * @return - calendar event list
 	 * @throws {@link ServiceException} in case of any error
 	 */
@@ -265,28 +268,39 @@ public class CalendarWebService {
 
 	/**
 	 * Save an appointment
-	 * 
+	 *
 	 * @param sid
 	 *            The SID of the User. This SID must be marked as Loggedin
 	 * @param appointment
-	 *            calendar event 
-	 *            
+	 *            calendar event
+	 *
 	 * @return - appointment saved
 	 * @throws {@link ServiceException} in case of any error
 	 */
+	@WebMethod
 	@POST
 	@Path("/") //TODO FIXME update is also here for now
-	public AppointmentDTO save(@QueryParam("sid") @WebParam(name="sid") String sid, @QueryParam("appointment") @WebParam(name="appointment") AppointmentDTO appointment) throws ServiceException {
+	public AppointmentDTO save(@QueryParam("sid") @WebParam(name="sid") String sid, @FormParam("appointment") @WebParam(name="appointment") AppointmentDTO appointment) throws ServiceException {
 		//Seems to be create
 		log.debug("save SID:" + sid);
 
 		try {
 			Long userId = sessionDao.check(sid);
 			log.debug("save userId:" + userId);
-
-			if (AuthLevelUtil.hasUserLevel(userDao.getRights(userId))) {
+			User u = userDao.get(userId);
+			if (!AuthLevelUtil.hasWebServiceLevel(u.getRights())
+					&& (appointment.getOwner() != null || appointment.getRoom().isPublic() || !appointment.getRoom().isAppointment()))
+			{
+				//TODO maybe additional checks are required
+				log.error("USER/Room modification as SOAP");
+				throw new ServiceException("Insufficient permissions"); //TODO code -26
+			}
+			if (AuthLevelUtil.hasUserLevel(u.getRights())) {
 				Appointment a = appointment.get(userDao, appointmentDao);
-				return new AppointmentDTO(appointmentDao.update(a, userId));
+				if (a.getOwner() == null) {
+					a.setOwner(u);
+				}
+				return new AppointmentDTO(appointmentDao.update(a, u.getId()));
 			} else {
 				log.error("save : wrong user level");
 				throw new ServiceException("Insufficient permissions"); //TODO code -26
@@ -298,16 +312,16 @@ public class CalendarWebService {
 			throw new ServiceException(err.getMessage());
 		}
 	}
-	
+
 	/**
-	 * 
+	 *
 	 * delete a calendar event
-	 * 
+	 *
 	 * If the given SID is from an Administrator or Web-Service user, the user
 	 * can delete any appointment.<br/>
 	 * If the SID is assigned to a simple user, he can only delete appointments
 	 * where he is also the owner/creator of the appointment
-	 * 
+	 *
 	 * @param sid
 	 *            an authenticated SID
 	 * @param id

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=1779419&r1=1779418&r2=1779419&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 Thu Jan 19 05:41:22 2017
@@ -18,7 +18,10 @@
  */
 package org.apache.openmeetings.db.dto.calendar;
 
+import static org.apache.openmeetings.util.CalendarPatterns.ISO8601_FORMAT;
+
 import java.io.Serializable;
+import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
@@ -36,6 +39,8 @@ import org.apache.openmeetings.db.dto.us
 import org.apache.openmeetings.db.entity.calendar.Appointment;
 import org.apache.openmeetings.db.entity.calendar.Appointment.Reminder;
 import org.apache.openmeetings.db.entity.calendar.MeetingMember;
+import org.apache.wicket.ajax.json.JSONArray;
+import org.apache.wicket.ajax.json.JSONObject;
 
 @XmlRootElement
 @XmlAccessorType(XmlAccessType.FIELD)
@@ -118,7 +123,7 @@ public class AppointmentDTO implements S
 		a.setReminderEmailSend(reminderEmailSend);
 		return a;
 	}
-	
+
 	public Long getId() {
 		return id;
 	}
@@ -278,4 +283,54 @@ public class AppointmentDTO implements S
 	public void setPassword(String password) {
 		this.password = password;
 	}
+
+	private static Date optDate(JSONObject o, String prop) throws ParseException {
+		return ISO8601_FORMAT.parse(o.optString(prop));
+	}
+
+	private static Calendar optCal(AppointmentDTO a, JSONObject o, String prop) throws ParseException {
+		Calendar c = Calendar.getInstance(TimeZone.getTimeZone(a.owner.getTimeZoneId()));
+		c.setTime(ISO8601_FORMAT.parse(o.optString(prop)));
+		return c;
+	}
+
+	public static AppointmentDTO fromString(String s) throws ParseException {
+		JSONObject o = new JSONObject(s);
+		AppointmentDTO a = new AppointmentDTO();
+		a.id = o.optLong("id");
+		a.title = o.optString("title");
+		a.location = o.optString("location");
+		a.owner = UserDTO.get(o.optJSONObject("owner"));
+		a.start = optCal(a, o, "start");
+		a.end = optCal(a, o, "end");
+		a.description = o.optString("description");
+		a.inserted = optDate(o, "inserted");
+		a.updated = optDate(o, "updated");
+		a.deleted = o.optBoolean("inserted");
+		a.reminder = Reminder.valueOf(o.optString("reminder"));
+		a.room = RoomDTO.get(o.optJSONObject("room"));
+		a.icalId = o.optString("icalId");
+		JSONArray mm = o.optJSONArray("meetingMembers");
+		if (mm != null) {
+			for (int i = 0; i < mm.length(); ++i) {
+				a.meetingMembers.add(MeetingMemberDTO.get(mm.getJSONObject(i)));
+			}
+		}
+		a.languageId = o.optLong("languageId");
+		a.password = o.optString("password");
+		a.passwordProtected = o.optBoolean("passwordProtected");
+		a.connectedEvent = o.optBoolean("connectedEvent");
+		a.reminderEmailSend = o.optBoolean("reminderEmailSend");
+		return a;
+	}
+
+	@Override
+	public String toString() {
+		return new JSONObject(this)
+			.put("start", ISO8601_FORMAT.format(start))
+			.put("end", ISO8601_FORMAT.format(end))
+			.put("inserted", ISO8601_FORMAT.format(inserted))
+			.put("updated", ISO8601_FORMAT.format(updated))
+			.toString();
+	}
 }

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=1779419&r1=1779418&r2=1779419&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 Thu Jan 19 05:41:22 2017
@@ -27,6 +27,7 @@ import javax.xml.bind.annotation.XmlRoot
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.dto.user.UserDTO;
 import org.apache.openmeetings.db.entity.calendar.MeetingMember;
+import org.apache.wicket.ajax.json.JSONObject;
 
 @XmlRootElement
 @XmlAccessorType(XmlAccessType.FIELD)
@@ -34,7 +35,7 @@ public class MeetingMemberDTO implements
 	private static final long serialVersionUID = 1L;
 	private Long id;
 	private UserDTO user;
-	
+
 	public MeetingMemberDTO() {}
 
 	public MeetingMemberDTO(MeetingMember mm) {
@@ -48,7 +49,7 @@ public class MeetingMemberDTO implements
 		mm.setUser(user.get(userDao));
 		return mm;
 	}
-	
+
 	public Long getId() {
 		return id;
 	}
@@ -64,4 +65,16 @@ public class MeetingMemberDTO implements
 	public void setUser(UserDTO user) {
 		this.user = user;
 	}
+
+	public static MeetingMemberDTO get(JSONObject o) {
+		MeetingMemberDTO m = new MeetingMemberDTO();
+		m.id = o.optLong("id");
+		m.user = UserDTO.get(o.optJSONObject("user"));
+		return m;
+	}
+
+	@Override
+	public String toString() {
+		return new JSONObject(this).toString();
+	}
 }

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=1779419&r1=1779418&r2=1779419&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 Thu Jan 19 05:41:22 2017
@@ -61,7 +61,7 @@ public class RoomDTO implements Serializ
 	private Set<RoomElement> hiddenElements;
 
 	public RoomDTO() {}
-	
+
 	public RoomDTO(Room r) {
 		id = r.getId();
 		name = r.getName();
@@ -108,7 +108,7 @@ public class RoomDTO implements Serializ
 		r.setHiddenElements(hiddenElements);
 		return r;
 	}
-	
+
 	public Long getId() {
 		return id;
 	}
@@ -278,9 +278,12 @@ public class RoomDTO implements Serializ
 		}
 		return rList;
 	}
-	
+
 	public static RoomDTO fromString(String s) {
-		JSONObject o = new JSONObject(s);
+		return get(new JSONObject(s));
+	}
+
+	public static RoomDTO get(JSONObject o) {
 		RoomDTO r = new RoomDTO();
 		r.id = optLong(o, "id");
 		r.name = o.optString("name");
@@ -310,7 +313,7 @@ public class RoomDTO implements Serializ
 		}
 		return r;
 	}
-	
+
 	@Override
 	public String toString() {
 		return new JSONObject(this).toString();

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=1779419&r1=1779418&r2=1779419&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 Thu Jan 19 05:41:22 2017
@@ -20,6 +20,7 @@ package org.apache.openmeetings.db.dto.u
 
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
@@ -30,6 +31,8 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Right;
 import org.apache.openmeetings.db.entity.user.User.Type;
+import org.apache.wicket.ajax.json.JSONArray;
+import org.apache.wicket.ajax.json.JSONObject;
 
 @XmlRootElement
 public class UserDTO implements Serializable {
@@ -39,9 +42,9 @@ public class UserDTO implements Serializ
 	private String password;
 	private String firstname;
 	private String lastname;
-	private Set<Right> rights;
+	private Set<Right> rights = new HashSet<>();
 	private Long languageId;
-	private Address address;
+	private Address address = new Address();
 	private String timeZoneId;
 	private String externalId;
 	private String externalType;
@@ -62,7 +65,7 @@ public class UserDTO implements Serializ
 		externalId = u.getExternalId();
 		externalType = u.getExternalType();
 	}
-	
+
 	public User get(UserDao userDao) {
 		User u = id == null ? new User() : userDao.get(id);
 		u.setFirstname(firstname);
@@ -76,7 +79,7 @@ public class UserDTO implements Serializ
 		u.setType(type);
 		return u;
 	}
-	
+
 	public static List<UserDTO> list(List<User> l) {
 		List<UserDTO> uList = new ArrayList<>();
 		if (l != null) {
@@ -86,7 +89,7 @@ public class UserDTO implements Serializ
 		}
 		return uList;
 	}
-	
+
 	public Long getId() {
 		return id;
 	}
@@ -182,4 +185,31 @@ public class UserDTO implements Serializ
 	public void setExternalType(String externalType) {
 		this.externalType = externalType;
 	}
+
+	public static UserDTO get(JSONObject o) {
+		UserDTO u = new UserDTO();
+		u.id = o.optLong("id");
+		u.login = o.optString("login");
+		u.password = o.optString("password");
+		u.firstname = o.optString("firstname");
+		u.lastname = o.optString("lastname");
+		JSONArray rr = o.optJSONArray("rights");
+		if (rr !=  null) {
+			for (int i = 0; i < rr.length(); ++i) {
+				u.rights.add(Right.valueOf(rr.getString(i)));
+			}
+		}
+		u.languageId = o.optLong("languageId");
+		JSONObject a = o.optJSONObject("address");
+		if (a != null) {
+			u.address.setId(a.optLong("id"));
+			u.address.setCountry(a.optString("country"));
+			u.address.setEmail(a.optString("email"));
+		}
+		u.timeZoneId = o.optString("timeZoneId");
+		u.externalId = o.optString("externalId");
+		u.externalType = o.optString("externalType");
+		u.type = Type.valueOf(o.optString("type"));
+		return u;
+	}
 }

Modified: openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/CalendarPatterns.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/CalendarPatterns.java?rev=1779419&r1=1779418&r2=1779419&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/CalendarPatterns.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/CalendarPatterns.java Thu Jan 19 05:41:22 2017
@@ -35,13 +35,15 @@ import org.slf4j.Logger;
 public class CalendarPatterns {
 	private static final Logger log = Red5LoggerFactory.getLogger(CalendarPatterns.class, webAppRootKey);
 
-	public static FastDateFormat dateFormat__ddMMyyyyHHmmss = FastDateFormat.getInstance("dd.MM.yyyy HH:mm:ss");
-	public static FastDateFormat dateFormat__ddMMyyyy = FastDateFormat.getInstance("dd.MM.yyyy");
-	public static FastDateFormat dateFormat__ddMMyyyyBySeparator = FastDateFormat.getInstance("dd-MM-yyyy");
-	public static FastDateFormat dateFormat__yyyyMMddHHmmss = FastDateFormat.getInstance("yyyy.MM.dd HH:mm:ss");
-	public static FastDateFormat STREAM_DATE_FORMAT = FastDateFormat.getInstance("yyyy_MM_dd_HH_mm_ss");
-	public static String FULL_DF_PATTERN = "dd.MM.yyyy HH:mm:ss z (Z)";
-	public static FastDateFormat FULL_DATE_FORMAT = FastDateFormat.getInstance(FULL_DF_PATTERN);
+	public static final FastDateFormat dateFormat__ddMMyyyyHHmmss = FastDateFormat.getInstance("dd.MM.yyyy HH:mm:ss");
+	public static final FastDateFormat dateFormat__ddMMyyyy = FastDateFormat.getInstance("dd.MM.yyyy");
+	public static final FastDateFormat dateFormat__ddMMyyyyBySeparator = FastDateFormat.getInstance("dd-MM-yyyy");
+	public static final FastDateFormat dateFormat__yyyyMMddHHmmss = FastDateFormat.getInstance("yyyy.MM.dd HH:mm:ss");
+	public static final FastDateFormat STREAM_DATE_FORMAT = FastDateFormat.getInstance("yyyy_MM_dd_HH_mm_ss");
+	public static final String FULL_DF_PATTERN = "dd.MM.yyyy HH:mm:ss z (Z)";
+	public static final String ISO8601_FORMAT_STRING = "yyyy-MM-dd'T'HH:mm:ssZ";
+	public static final FastDateFormat FULL_DATE_FORMAT = FastDateFormat.getInstance(FULL_DF_PATTERN);
+	public static final FastDateFormat ISO8601_FORMAT = FastDateFormat.getInstance(ISO8601_FORMAT_STRING);
 
 	public static String getDateByMiliSeconds(Date t) {
 		return dateFormat__yyyyMMddHHmmss.format(t);

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java?rev=1779419&r1=1779418&r2=1779419&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java Thu Jan 19 05:41:22 2017
@@ -19,6 +19,7 @@
 package org.apache.openmeetings.web.app;
 
 import static java.text.DateFormat.SHORT;
+import static org.apache.openmeetings.util.CalendarPatterns.ISO8601_FORMAT_STRING;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_SHOW_MYROOMS_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_SHOW_RSS_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_LANG_KEY;
@@ -91,7 +92,6 @@ public class WebSession extends Abstract
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = getLogger(WebSession.class, webAppRootKey);
 	public static final int MILLIS_IN_MINUTE = 60000;
-	public static final String ISO8601_FORMAT_STRING = "yyyy-MM-dd'T'HH:mm:ssZ";
 	public static final List<String> AVAILABLE_TIMEZONES = Arrays.asList(TimeZone.getAvailableIDs());
 	public static final Set<String> AVAILABLE_TIMEZONE_SET = new LinkedHashSet<String>(AVAILABLE_TIMEZONES);
 	public static final String WICKET_ROOM_ID = "wicketroomid";

Modified: openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java?rev=1779419&r1=1779418&r2=1779419&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java Thu Jan 19 05:41:22 2017
@@ -26,9 +26,11 @@ import java.util.Date;
 import java.util.List;
 import java.util.Set;
 
+import javax.jws.WebMethod;
 import javax.jws.WebParam;
 import javax.jws.WebService;
 import javax.ws.rs.DELETE;
+import javax.ws.rs.FormParam;
 import javax.ws.rs.GET;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
@@ -44,6 +46,7 @@ import org.apache.openmeetings.db.dao.us
 import org.apache.openmeetings.db.dto.calendar.AppointmentDTO;
 import org.apache.openmeetings.db.entity.calendar.Appointment;
 import org.apache.openmeetings.db.entity.server.Sessiondata;
+import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Right;
 import org.apache.openmeetings.db.util.AuthLevelUtil;
 import org.apache.openmeetings.webservice.error.ServiceException;
@@ -53,9 +56,9 @@ import org.springframework.beans.factory
 
 /**
  * CalendarService contains methods to create, edit delete calendar meetings
- * 
+ *
  * @author sebawagner
- * 
+ *
  */
 @WebService(serviceName="org.apache.openmeetings.webservice.CalendarWebService", targetNamespace = TNS)
 @Features(features = "org.apache.cxf.feature.LoggingFeature")
@@ -73,14 +76,14 @@ public class CalendarWebService {
 
 	/**
 	 * Load appointments by a start / end range for the current SID
-	 * 
+	 *
 	 * @param sid
 	 *            The SID of the User. This SID must be marked as Loggedin
 	 * @param start
 	 *            start time
 	 * @param end
 	 *            end time
-	 *            
+	 *
 	 * @return - list of appointments in range
 	 * @throws {@link ServiceException} in case of any error
 	 */
@@ -109,7 +112,7 @@ public class CalendarWebService {
 
 	/**
 	 * Load appointments by a start / end range for the userId
-	 * 
+	 *
 	 * @param sid
 	 *            The SID of the User. This SID must be marked as Loggedin
 	 * @param userid
@@ -118,7 +121,7 @@ public class CalendarWebService {
 	 *            start time
 	 * @param end
 	 *            end time
-	 *            
+	 *
 	 * @return - list of appointments in range
 	 * @throws {@link ServiceException} in case of any error
 	 */
@@ -149,7 +152,7 @@ public class CalendarWebService {
 
 	/**
 	 * Get the next Calendar event for the current user of the SID
-	 * 
+	 *
 	 * @param sid
 	 *            The SID of the User. This SID must be marked as Loggedin
 	 * @return - next Calendar event
@@ -176,12 +179,12 @@ public class CalendarWebService {
 
 	/**
 	 * Get the next Calendar event for userId
-	 * 
+	 *
 	 * @param sid
 	 *            The SID of the User. This SID must be marked as Loggedin
 	 * @param userid
 	 *            the userId the calendar events should be loaded
-	 *            
+	 *
 	 * @return - next Calendar event
 	 * @throws {@link ServiceException} in case of any error
 	 */
@@ -205,9 +208,9 @@ public class CalendarWebService {
 	}
 
 	/**
-	 * 
+	 *
 	 * Load a calendar event by its room id
-	 * 
+	 *
 	 * @param sid
 	 * @param roomid
 	 * @return - calendar event by its room id
@@ -237,12 +240,12 @@ public class CalendarWebService {
 
 	/**
 	 * Search a calendar event for the current SID
-	 * 
+	 *
 	 * @param sid
 	 *            The SID of the User. This SID must be marked as Loggedin
 	 * @param title
 	 *            the search string
-	 *            
+	 *
 	 * @return - calendar event list
 	 * @throws {@link ServiceException} in case of any error
 	 */
@@ -266,28 +269,39 @@ public class CalendarWebService {
 
 	/**
 	 * Save an appointment
-	 * 
+	 *
 	 * @param sid
 	 *            The SID of the User. This SID must be marked as Loggedin
 	 * @param appointment
-	 *            calendar event 
-	 *            
+	 *            calendar event
+	 *
 	 * @return - appointment saved
 	 * @throws {@link ServiceException} in case of any error
 	 */
+	@WebMethod
 	@POST
 	@Path("/") //TODO FIXME update is also here for now
-	public AppointmentDTO save(@QueryParam("sid") @WebParam(name="sid") String sid, @QueryParam("appointment") @WebParam(name="appointment") AppointmentDTO appointment) throws ServiceException {
+	public AppointmentDTO save(@QueryParam("sid") @WebParam(name="sid") String sid, @FormParam("appointment") @WebParam(name="appointment") AppointmentDTO appointment) throws ServiceException {
 		//Seems to be create
 		log.debug("save SID:" + sid);
 
 		try {
 			Sessiondata sd = sessionDao.check(sid);
 			log.debug("save userId:" + sd);
-
-			if (AuthLevelUtil.hasUserLevel(userDao.getRights(sd.getUserId()))) {
+			User u = userDao.get(sd.getUserId());
+			if (!AuthLevelUtil.hasWebServiceLevel(u.getRights())
+					&& (appointment.getOwner() != null || appointment.getRoom().isPublic() || !appointment.getRoom().isAppointment()))
+			{
+				//TODO maybe additional checks are required
+				log.error("USER/Room modification as SOAP");
+				throw new ServiceException("Insufficient permissions"); //TODO code -26
+			}
+			if (AuthLevelUtil.hasUserLevel(u.getRights())) {
 				Appointment a = appointment.get(userDao, appointmentDao);
-				return new AppointmentDTO(appointmentDao.update(a, sd.getUserId()));
+				if (a.getOwner() == null) {
+					a.setOwner(u);
+				}
+				return new AppointmentDTO(appointmentDao.update(a, u.getId()));
 			} else {
 				log.error("save : wrong user level");
 				throw new ServiceException("Insufficient permissions"); //TODO code -26
@@ -299,16 +313,16 @@ public class CalendarWebService {
 			throw new ServiceException(err.getMessage());
 		}
 	}
-	
+
 	/**
-	 * 
+	 *
 	 * delete a calendar event
-	 * 
+	 *
 	 * If the given SID is from an Administrator or Web-Service user, the user
 	 * can delete any appointment.<br/>
 	 * If the SID is assigned to a simple user, he can only delete appointments
 	 * where he is also the owner/creator of the appointment
-	 * 
+	 *
 	 * @param sid
 	 *            an authenticated SID
 	 * @param id

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=1779419&r1=1779418&r2=1779419&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 Thu Jan 19 05:41:22 2017
@@ -18,7 +18,10 @@
  */
 package org.apache.openmeetings.db.dto.calendar;
 
+import static org.apache.openmeetings.util.CalendarPatterns.ISO8601_FORMAT;
+
 import java.io.Serializable;
+import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
@@ -36,6 +39,8 @@ import org.apache.openmeetings.db.dto.us
 import org.apache.openmeetings.db.entity.calendar.Appointment;
 import org.apache.openmeetings.db.entity.calendar.Appointment.Reminder;
 import org.apache.openmeetings.db.entity.calendar.MeetingMember;
+import org.apache.wicket.ajax.json.JSONArray;
+import org.apache.wicket.ajax.json.JSONObject;
 
 @XmlRootElement
 @XmlAccessorType(XmlAccessType.FIELD)
@@ -118,7 +123,7 @@ public class AppointmentDTO implements S
 		a.setReminderEmailSend(reminderEmailSend);
 		return a;
 	}
-	
+
 	public Long getId() {
 		return id;
 	}
@@ -278,4 +283,54 @@ public class AppointmentDTO implements S
 	public void setPassword(String password) {
 		this.password = password;
 	}
+
+	private static Date optDate(JSONObject o, String prop) throws ParseException {
+		return ISO8601_FORMAT.parse(o.optString(prop));
+	}
+
+	private static Calendar optCal(AppointmentDTO a, JSONObject o, String prop) throws ParseException {
+		Calendar c = Calendar.getInstance(TimeZone.getTimeZone(a.owner.getTimeZoneId()));
+		c.setTime(ISO8601_FORMAT.parse(o.optString(prop)));
+		return c;
+	}
+
+	public static AppointmentDTO fromString(String s) throws ParseException {
+		JSONObject o = new JSONObject(s);
+		AppointmentDTO a = new AppointmentDTO();
+		a.id = o.optLong("id");
+		a.title = o.optString("title");
+		a.location = o.optString("location");
+		a.owner = UserDTO.get(o.optJSONObject("owner"));
+		a.start = optCal(a, o, "start");
+		a.end = optCal(a, o, "end");
+		a.description = o.optString("description");
+		a.inserted = optDate(o, "inserted");
+		a.updated = optDate(o, "updated");
+		a.deleted = o.optBoolean("inserted");
+		a.reminder = Reminder.valueOf(o.optString("reminder"));
+		a.room = RoomDTO.get(o.optJSONObject("room"));
+		a.icalId = o.optString("icalId");
+		JSONArray mm = o.optJSONArray("meetingMembers");
+		if (mm != null) {
+			for (int i = 0; i < mm.length(); ++i) {
+				a.meetingMembers.add(MeetingMemberDTO.get(mm.getJSONObject(i)));
+			}
+		}
+		a.languageId = o.optLong("languageId");
+		a.password = o.optString("password");
+		a.passwordProtected = o.optBoolean("passwordProtected");
+		a.connectedEvent = o.optBoolean("connectedEvent");
+		a.reminderEmailSend = o.optBoolean("reminderEmailSend");
+		return a;
+	}
+
+	@Override
+	public String toString() {
+		return new JSONObject(this)
+			.put("start", ISO8601_FORMAT.format(start))
+			.put("end", ISO8601_FORMAT.format(end))
+			.put("inserted", ISO8601_FORMAT.format(inserted))
+			.put("updated", ISO8601_FORMAT.format(updated))
+			.toString();
+	}
 }

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=1779419&r1=1779418&r2=1779419&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 Thu Jan 19 05:41:22 2017
@@ -27,6 +27,7 @@ import javax.xml.bind.annotation.XmlRoot
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.dto.user.UserDTO;
 import org.apache.openmeetings.db.entity.calendar.MeetingMember;
+import org.apache.wicket.ajax.json.JSONObject;
 
 @XmlRootElement
 @XmlAccessorType(XmlAccessType.FIELD)
@@ -34,7 +35,7 @@ public class MeetingMemberDTO implements
 	private static final long serialVersionUID = 1L;
 	private Long id;
 	private UserDTO user;
-	
+
 	public MeetingMemberDTO() {}
 
 	public MeetingMemberDTO(MeetingMember mm) {
@@ -48,7 +49,7 @@ public class MeetingMemberDTO implements
 		mm.setUser(user.get(userDao));
 		return mm;
 	}
-	
+
 	public Long getId() {
 		return id;
 	}
@@ -64,4 +65,16 @@ public class MeetingMemberDTO implements
 	public void setUser(UserDTO user) {
 		this.user = user;
 	}
+
+	public static MeetingMemberDTO get(JSONObject o) {
+		MeetingMemberDTO m = new MeetingMemberDTO();
+		m.id = o.optLong("id");
+		m.user = UserDTO.get(o.optJSONObject("user"));
+		return m;
+	}
+
+	@Override
+	public String toString() {
+		return new JSONObject(this).toString();
+	}
 }

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=1779419&r1=1779418&r2=1779419&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 Thu Jan 19 05:41:22 2017
@@ -61,7 +61,7 @@ public class RoomDTO implements Serializ
 	private Set<RoomElement> hiddenElements;
 
 	public RoomDTO() {}
-	
+
 	public RoomDTO(Room r) {
 		id = r.getId();
 		name = r.getName();
@@ -108,7 +108,7 @@ public class RoomDTO implements Serializ
 		r.setHiddenElements(hiddenElements);
 		return r;
 	}
-	
+
 	public Long getId() {
 		return id;
 	}
@@ -278,9 +278,12 @@ public class RoomDTO implements Serializ
 		}
 		return rList;
 	}
-	
+
 	public static RoomDTO fromString(String s) {
-		JSONObject o = new JSONObject(s);
+		return get(new JSONObject(s));
+	}
+
+	public static RoomDTO get(JSONObject o) {
 		RoomDTO r = new RoomDTO();
 		r.id = optLong(o, "id");
 		r.name = o.optString("name");
@@ -310,7 +313,7 @@ public class RoomDTO implements Serializ
 		}
 		return r;
 	}
-	
+
 	@Override
 	public String toString() {
 		return new JSONObject(this).toString();

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=1779419&r1=1779418&r2=1779419&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 Thu Jan 19 05:41:22 2017
@@ -20,6 +20,7 @@ package org.apache.openmeetings.db.dto.u
 
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
@@ -30,6 +31,8 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Right;
 import org.apache.openmeetings.db.entity.user.User.Type;
+import org.apache.wicket.ajax.json.JSONArray;
+import org.apache.wicket.ajax.json.JSONObject;
 
 @XmlRootElement
 public class UserDTO implements Serializable {
@@ -39,9 +42,9 @@ public class UserDTO implements Serializ
 	private String password;
 	private String firstname;
 	private String lastname;
-	private Set<Right> rights;
+	private Set<Right> rights = new HashSet<>();
 	private Long languageId;
-	private Address address;
+	private Address address = new Address();
 	private String timeZoneId;
 	private String externalId;
 	private String externalType;
@@ -62,7 +65,7 @@ public class UserDTO implements Serializ
 		externalId = u.getExternalId();
 		externalType = u.getExternalType();
 	}
-	
+
 	public User get(UserDao userDao) {
 		User u = id == null ? new User() : userDao.get(id);
 		u.setFirstname(firstname);
@@ -76,7 +79,7 @@ public class UserDTO implements Serializ
 		u.setType(type);
 		return u;
 	}
-	
+
 	public static List<UserDTO> list(List<User> l) {
 		List<UserDTO> uList = new ArrayList<>();
 		if (l != null) {
@@ -86,7 +89,7 @@ public class UserDTO implements Serializ
 		}
 		return uList;
 	}
-	
+
 	public Long getId() {
 		return id;
 	}
@@ -182,4 +185,31 @@ public class UserDTO implements Serializ
 	public void setExternalType(String externalType) {
 		this.externalType = externalType;
 	}
+
+	public static UserDTO get(JSONObject o) {
+		UserDTO u = new UserDTO();
+		u.id = o.optLong("id");
+		u.login = o.optString("login");
+		u.password = o.optString("password");
+		u.firstname = o.optString("firstname");
+		u.lastname = o.optString("lastname");
+		JSONArray rr = o.optJSONArray("rights");
+		if (rr !=  null) {
+			for (int i = 0; i < rr.length(); ++i) {
+				u.rights.add(Right.valueOf(rr.getString(i)));
+			}
+		}
+		u.languageId = o.optLong("languageId");
+		JSONObject a = o.optJSONObject("address");
+		if (a != null) {
+			u.address.setId(a.optLong("id"));
+			u.address.setCountry(a.optString("country"));
+			u.address.setEmail(a.optString("email"));
+		}
+		u.timeZoneId = o.optString("timeZoneId");
+		u.externalId = o.optString("externalId");
+		u.externalType = o.optString("externalType");
+		u.type = Type.valueOf(o.optString("type"));
+		return u;
+	}
 }

Modified: openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/CalendarPatterns.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/CalendarPatterns.java?rev=1779419&r1=1779418&r2=1779419&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/CalendarPatterns.java (original)
+++ openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/CalendarPatterns.java Thu Jan 19 05:41:22 2017
@@ -35,13 +35,15 @@ import org.slf4j.Logger;
 public class CalendarPatterns {
 	private static final Logger log = Red5LoggerFactory.getLogger(CalendarPatterns.class, webAppRootKey);
 
-	public static FastDateFormat dateFormat__ddMMyyyyHHmmss = FastDateFormat.getInstance("dd.MM.yyyy HH:mm:ss");
-	public static FastDateFormat dateFormat__ddMMyyyy = FastDateFormat.getInstance("dd.MM.yyyy");
-	public static FastDateFormat dateFormat__ddMMyyyyBySeparator = FastDateFormat.getInstance("dd-MM-yyyy");
-	public static FastDateFormat dateFormat__yyyyMMddHHmmss = FastDateFormat.getInstance("yyyy.MM.dd HH:mm:ss");
-	public static FastDateFormat STREAM_DATE_FORMAT = FastDateFormat.getInstance("yyyy_MM_dd_HH_mm_ss");
-	public static String FULL_DF_PATTERN = "dd.MM.yyyy HH:mm:ss z (Z)";
-	public static FastDateFormat FULL_DATE_FORMAT = FastDateFormat.getInstance(FULL_DF_PATTERN);
+	public static final FastDateFormat dateFormat__ddMMyyyyHHmmss = FastDateFormat.getInstance("dd.MM.yyyy HH:mm:ss");
+	public static final FastDateFormat dateFormat__ddMMyyyy = FastDateFormat.getInstance("dd.MM.yyyy");
+	public static final FastDateFormat dateFormat__ddMMyyyyBySeparator = FastDateFormat.getInstance("dd-MM-yyyy");
+	public static final FastDateFormat dateFormat__yyyyMMddHHmmss = FastDateFormat.getInstance("yyyy.MM.dd HH:mm:ss");
+	public static final FastDateFormat STREAM_DATE_FORMAT = FastDateFormat.getInstance("yyyy_MM_dd_HH_mm_ss");
+	public static final String FULL_DF_PATTERN = "dd.MM.yyyy HH:mm:ss z (Z)";
+	public static final String ISO8601_FORMAT_STRING = "yyyy-MM-dd'T'HH:mm:ssZ";
+	public static final FastDateFormat FULL_DATE_FORMAT = FastDateFormat.getInstance(FULL_DF_PATTERN);
+	public static final FastDateFormat ISO8601_FORMAT = FastDateFormat.getInstance(ISO8601_FORMAT_STRING);
 
 	public static String getDateByMiliSeconds(Date t) {
 		return dateFormat__yyyyMMddHHmmss.format(t);

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java?rev=1779419&r1=1779418&r2=1779419&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java Thu Jan 19 05:41:22 2017
@@ -19,6 +19,7 @@
 package org.apache.openmeetings.web.app;
 
 import static java.text.DateFormat.SHORT;
+import static org.apache.openmeetings.util.CalendarPatterns.ISO8601_FORMAT_STRING;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_SHOW_MYROOMS_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_SHOW_RSS_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_LANG_KEY;
@@ -91,7 +92,6 @@ public class WebSession extends Abstract
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = getLogger(WebSession.class, webAppRootKey);
 	public static final int MILLIS_IN_MINUTE = 60000;
-	public static final String ISO8601_FORMAT_STRING = "yyyy-MM-dd'T'HH:mm:ssZ";
 	public static final List<String> AVAILABLE_TIMEZONES = Arrays.asList(TimeZone.getAvailableIDs());
 	public static final Set<String> AVAILABLE_TIMEZONE_SET = new LinkedHashSet<String>(AVAILABLE_TIMEZONES);
 	public static final String WICKET_ROOM_ID = "wicketroomid";

Modified: openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java?rev=1779419&r1=1779418&r2=1779419&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java (original)
+++ openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java Thu Jan 19 05:41:22 2017
@@ -26,9 +26,11 @@ import java.util.Date;
 import java.util.List;
 import java.util.Set;
 
+import javax.jws.WebMethod;
 import javax.jws.WebParam;
 import javax.jws.WebService;
 import javax.ws.rs.DELETE;
+import javax.ws.rs.FormParam;
 import javax.ws.rs.GET;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
@@ -44,6 +46,7 @@ import org.apache.openmeetings.db.dao.us
 import org.apache.openmeetings.db.dto.calendar.AppointmentDTO;
 import org.apache.openmeetings.db.entity.calendar.Appointment;
 import org.apache.openmeetings.db.entity.server.Sessiondata;
+import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Right;
 import org.apache.openmeetings.db.util.AuthLevelUtil;
 import org.apache.openmeetings.webservice.error.ServiceException;
@@ -53,9 +56,9 @@ import org.springframework.beans.factory
 
 /**
  * CalendarService contains methods to create, edit delete calendar meetings
- * 
+ *
  * @author sebawagner
- * 
+ *
  */
 @WebService(serviceName="org.apache.openmeetings.webservice.CalendarWebService", targetNamespace = TNS)
 @Features(features = "org.apache.cxf.feature.LoggingFeature")
@@ -73,14 +76,14 @@ public class CalendarWebService {
 
 	/**
 	 * Load appointments by a start / end range for the current SID
-	 * 
+	 *
 	 * @param sid
 	 *            The SID of the User. This SID must be marked as Loggedin
 	 * @param start
 	 *            start time
 	 * @param end
 	 *            end time
-	 *            
+	 *
 	 * @return - list of appointments in range
 	 * @throws {@link ServiceException} in case of any error
 	 */
@@ -109,7 +112,7 @@ public class CalendarWebService {
 
 	/**
 	 * Load appointments by a start / end range for the userId
-	 * 
+	 *
 	 * @param sid
 	 *            The SID of the User. This SID must be marked as Loggedin
 	 * @param userid
@@ -118,7 +121,7 @@ public class CalendarWebService {
 	 *            start time
 	 * @param end
 	 *            end time
-	 *            
+	 *
 	 * @return - list of appointments in range
 	 * @throws {@link ServiceException} in case of any error
 	 */
@@ -149,7 +152,7 @@ public class CalendarWebService {
 
 	/**
 	 * Get the next Calendar event for the current user of the SID
-	 * 
+	 *
 	 * @param sid
 	 *            The SID of the User. This SID must be marked as Loggedin
 	 * @return - next Calendar event
@@ -176,12 +179,12 @@ public class CalendarWebService {
 
 	/**
 	 * Get the next Calendar event for userId
-	 * 
+	 *
 	 * @param sid
 	 *            The SID of the User. This SID must be marked as Loggedin
 	 * @param userid
 	 *            the userId the calendar events should be loaded
-	 *            
+	 *
 	 * @return - next Calendar event
 	 * @throws {@link ServiceException} in case of any error
 	 */
@@ -205,9 +208,9 @@ public class CalendarWebService {
 	}
 
 	/**
-	 * 
+	 *
 	 * Load a calendar event by its room id
-	 * 
+	 *
 	 * @param sid
 	 * @param roomid
 	 * @return - calendar event by its room id
@@ -237,12 +240,12 @@ public class CalendarWebService {
 
 	/**
 	 * Search a calendar event for the current SID
-	 * 
+	 *
 	 * @param sid
 	 *            The SID of the User. This SID must be marked as Loggedin
 	 * @param title
 	 *            the search string
-	 *            
+	 *
 	 * @return - calendar event list
 	 * @throws {@link ServiceException} in case of any error
 	 */
@@ -266,28 +269,39 @@ public class CalendarWebService {
 
 	/**
 	 * Save an appointment
-	 * 
+	 *
 	 * @param sid
 	 *            The SID of the User. This SID must be marked as Loggedin
 	 * @param appointment
-	 *            calendar event 
-	 *            
+	 *            calendar event
+	 *
 	 * @return - appointment saved
 	 * @throws {@link ServiceException} in case of any error
 	 */
+	@WebMethod
 	@POST
 	@Path("/") //TODO FIXME update is also here for now
-	public AppointmentDTO save(@QueryParam("sid") @WebParam(name="sid") String sid, @QueryParam("appointment") @WebParam(name="appointment") AppointmentDTO appointment) throws ServiceException {
+	public AppointmentDTO save(@QueryParam("sid") @WebParam(name="sid") String sid, @FormParam("appointment") @WebParam(name="appointment") AppointmentDTO appointment) throws ServiceException {
 		//Seems to be create
 		log.debug("save SID:" + sid);
 
 		try {
 			Sessiondata sd = sessionDao.check(sid);
 			log.debug("save userId:" + sd);
-
-			if (AuthLevelUtil.hasUserLevel(userDao.getRights(sd.getUserId()))) {
+			User u = userDao.get(sd.getUserId());
+			if (!AuthLevelUtil.hasWebServiceLevel(u.getRights())
+					&& (appointment.getOwner() != null || appointment.getRoom().isPublic() || !appointment.getRoom().isAppointment()))
+			{
+				//TODO maybe additional checks are required
+				log.error("USER/Room modification as SOAP");
+				throw new ServiceException("Insufficient permissions"); //TODO code -26
+			}
+			if (AuthLevelUtil.hasUserLevel(u.getRights())) {
 				Appointment a = appointment.get(userDao, appointmentDao);
-				return new AppointmentDTO(appointmentDao.update(a, sd.getUserId()));
+				if (a.getOwner() == null) {
+					a.setOwner(u);
+				}
+				return new AppointmentDTO(appointmentDao.update(a, u.getId()));
 			} else {
 				log.error("save : wrong user level");
 				throw new ServiceException("Insufficient permissions"); //TODO code -26
@@ -299,16 +313,16 @@ public class CalendarWebService {
 			throw new ServiceException(err.getMessage());
 		}
 	}
-	
+
 	/**
-	 * 
+	 *
 	 * delete a calendar event
-	 * 
+	 *
 	 * If the given SID is from an Administrator or Web-Service user, the user
 	 * can delete any appointment.<br/>
 	 * If the SID is assigned to a simple user, he can only delete appointments
 	 * where he is also the owner/creator of the appointment
-	 * 
+	 *
 	 * @param sid
 	 *            an authenticated SID
 	 * @param id