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


Reply via email to