Author: solomax
Date: Tue Jan 24 17:38:20 2017
New Revision: 1780097

URL: http://svn.apache.org/viewvc?rev=1780097&view=rev
Log:
[OPENMEETINGS-1541] more fixes for calendar web service and tests

Added:
    
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/DtoHelper.java
    
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/DtoHelper.java
    
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/DtoHelper.java
Modified:
    
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/AppointmentDao.java
    
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/RoomOptionsDTO.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-db/src/main/java/org/apache/openmeetings/db/entity/user/Address.java
    
openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
    
openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
    
openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractJUnitDefaults.java
    
openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/calendar/TestAppointmentAddAppointment.java
    
openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java
    
openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
    
openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
    
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/AppointmentDao.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/room/RoomOptionsDTO.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-db/src/main/java/org/apache/openmeetings/db/entity/user/Address.java
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractJUnitDefaults.java
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/calendar/TestAppointmentAddAppointment.java
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java
    
openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
    
openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
    
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/AppointmentDao.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/room/RoomOptionsDTO.java
    
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
    
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Address.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
    
openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractJUnitDefaults.java
    
openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/calendar/TestAppointmentAddAppointment.java
    
openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java
    
openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
    
openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java

Modified: 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/AppointmentDao.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/AppointmentDao.java?rev=1780097&r1=1780096&r2=1780097&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/AppointmentDao.java
 (original)
+++ 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/AppointmentDao.java
 Tue Jan 24 17:38:20 2017
@@ -69,31 +69,30 @@ public class AppointmentDao {
        /*
         * insert, update, delete, select
         */
-
        // 
-----------------------------------------------------------------------------------------------
-
        public Appointment get(Long id) {
                TypedQuery<Appointment> query = 
em.createNamedQuery("getAppointmentById", Appointment.class);
                query.setParameter("id", id);
 
-               Appointment appoint = null;
+               Appointment a = null;
                try {
-                       appoint = query.getSingleResult();
+                       a = query.getSingleResult();
                } catch (NoResultException ex) {
+                       //no-op
                }
-               return appoint;
+               return a;
        }
 
        public Appointment getAny(Long id) {
                TypedQuery<Appointment> query = 
em.createNamedQuery("getAppointmentByIdAny", 
Appointment.class).setParameter("id", id);
 
-               Appointment appoint = null;
+               Appointment a = null;
                try {
-                       appoint = query.getSingleResult();
+                       a = query.getSingleResult();
                } catch (NoResultException ex) {
+                       //no-op
                }
-
-               return appoint;
+               return a;
        }
 
        public List<Appointment> get() {
@@ -103,7 +102,7 @@ public class AppointmentDao {
        public Appointment update(Appointment a, Long userId) {
                return update(a, userId, true);
        }
-       
+
        public Appointment update(Appointment a, Long userId, boolean 
sendmails) {
                Room r = a.getRoom();
                if (r.getId() == null) {
@@ -151,11 +150,11 @@ public class AppointmentDao {
                        em.persist(a);
                } else {
                        a.setUpdated(new Date());
-                       a =     em.merge(a);
+                       a = em.merge(a);
                }
                return a;
        }
-       
+
        // 
----------------------------------------------------------------------------------------------------------
 
        public void delete(Appointment a, Long userId) {
@@ -167,7 +166,7 @@ public class AppointmentDao {
                }
                update(a, userId);
        }
-       
+
        public List<Appointment> getInRange(Long userId, Date start, Date end) {
                log.debug("Start " + start + " End " + end);
 
@@ -175,8 +174,8 @@ public class AppointmentDao {
                query.setParameter("start", start);
                query.setParameter("end", end);
                query.setParameter("userId", userId);
-               
-               List<Appointment> listAppoints = new 
ArrayList<Appointment>(query.getResultList()); 
+
+               List<Appointment> listAppoints = new 
ArrayList<>(query.getResultList());
                TypedQuery<Appointment> q1 = 
em.createNamedQuery("joinedAppointmentsInRange", Appointment.class);
                q1.setParameter("start", start);
                q1.setParameter("end", end);
@@ -196,7 +195,7 @@ public class AppointmentDao {
                q.setParameter("end", end.getTime());
                return q.getResultList();
        }
-       
+
        // next appointment to select date
        public Appointment getNext(Long userId, Date start) {
                List<Appointment> list = 
em.createNamedQuery("getNextAppointment", Appointment.class)

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=1780097&r1=1780096&r2=1780097&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
 Tue Jan 24 17:38:20 2017
@@ -36,6 +36,7 @@ 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.openmeetings.db.entity.user.User;
 import org.apache.wicket.ajax.json.JSONObject;
 
 @XmlRootElement
@@ -92,7 +93,7 @@ public class AppointmentDTO implements S
                reminderEmailSend = a.isReminderEmailSend();
        }
 
-       public Appointment get(UserDao userDao, AppointmentDao appointmentDao) {
+       public Appointment get(UserDao userDao, AppointmentDao appointmentDao, 
User u) {
                Appointment a = id == null ? new Appointment() : 
appointmentDao.get(id);
                a.setId(id);
                a.setTitle(title);
@@ -100,7 +101,7 @@ public class AppointmentDTO implements S
                a.setStart(start.getTime());
                a.setEnd(end.getTime());
                a.setDescription(description);
-               a.setOwner(owner == null ? null : userDao.get(owner.getId()));
+               a.setOwner(owner == null ? u : userDao.get(owner.getId()));
                a.setInserted(inserted);
                a.setUpdated(updated);
                a.setDeleted(deleted);
@@ -109,7 +110,7 @@ public class AppointmentDTO implements S
                a.setIcalId(icalId);
                a.setMeetingMembers(new ArrayList<MeetingMember>());
                for(MeetingMemberDTO mm : meetingMembers) {
-                       MeetingMember m = mm.get(userDao);
+                       MeetingMember m = mm.get(userDao, u);
                        m.setAppointment(a);
                        a.getMeetingMembers().add(m);
                }

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=1780097&r1=1780096&r2=1780097&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
 Tue Jan 24 17:38:20 2017
@@ -18,6 +18,8 @@
  */
 package org.apache.openmeetings.db.dto.calendar;
 
+import static org.apache.openmeetings.db.util.DtoHelper.optLong;
+
 import java.io.Serializable;
 
 import javax.xml.bind.annotation.XmlAccessType;
@@ -44,7 +46,7 @@ public class MeetingMemberDTO implements
                this.user = new UserDTO(mm.getUser());
        }
 
-       public MeetingMember get(UserDao userDao) {
+       public MeetingMember get(UserDao userDao, User owner) {
                MeetingMember mm = new MeetingMember();
                mm.setId(id);
                if (user.getId() != null) {
@@ -55,6 +57,14 @@ public class MeetingMemberDTO implements
                                // try to get ext. user
                                u = 
userDao.getExternalUser(user.getExternalId(), user.getExternalType());
                        }
+                       if (u == null && user.getAddress() != null) {
+                               u = 
userDao.getContact(user.getAddress().getEmail()
+                                               , user.getFirstname()
+                                               , user.getLastname()
+                                               , user.getLanguageId()
+                                               , user.getTimeZoneId()
+                                               , owner);
+                       }
                        if (u == null) {
                                u = user.get(userDao);
                                u.setType(User.Type.contact);
@@ -85,8 +95,7 @@ public class MeetingMemberDTO implements
 
        public static MeetingMemberDTO get(JSONObject o) {
                MeetingMemberDTO m = new MeetingMemberDTO();
-               long id = o.optLong("id");
-               m.id = id == 0 ? null : id;
+               m.id = optLong(o, "id");
                m.user = UserDTO.get(o.optJSONObject("user"));
                return m;
        }

Modified: 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java?rev=1780097&r1=1780096&r2=1780097&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
 Tue Jan 24 17:38:20 2017
@@ -19,6 +19,8 @@
 package org.apache.openmeetings.db.dto.room;
 
 import static org.apache.openmeetings.db.dto.room.RoomOptionsDTO.optInt;
+import static org.apache.openmeetings.db.util.DtoHelper.optEnum;
+import static org.apache.openmeetings.db.util.DtoHelper.optLong;
 
 import java.io.Serializable;
 import java.util.ArrayList;
@@ -349,11 +351,10 @@ public class RoomDTO implements Serializ
                        return null;
                }
                RoomDTO r = new RoomDTO();
-               long id = o.optLong("id");
-               r.id = id == 0 ? null : id;
+               r.id = optLong(o, "id");
                r.name = o.optString("name");
                r.comment = o.optString("comment");
-               r.type = Room.Type.valueOf(o.getString("type"));
+               r.type = optEnum(Room.Type.class, o, "type");
                r.numberOfPartizipants = o.optLong("numberOfPartizipants", 4);
                r.appointment = o.optBoolean("appointment", false);
                r.confno = o.optString("confno");

Modified: 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomOptionsDTO.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomOptionsDTO.java?rev=1780097&r1=1780096&r2=1780097&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomOptionsDTO.java
 (original)
+++ 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomOptionsDTO.java
 Tue Jan 24 17:38:20 2017
@@ -18,6 +18,8 @@
  */
 package org.apache.openmeetings.db.dto.room;
 
+import static org.apache.openmeetings.db.util.DtoHelper.optLong;
+
 import java.io.Serializable;
 
 import javax.xml.bind.annotation.XmlAccessType;
@@ -99,11 +101,7 @@ public class RoomOptionsDTO implements S
        public static Integer optInt(JSONObject o, String key) {
                return o.has(key) && !o.isNull(key) ? o.getInt(key) : null;
        }
-       
-       public static Long optLong(JSONObject o, String key) {
-               return o.has(key) && !o.isNull(key) ? o.getLong(key) : null;
-       }
-       
+
        public static RoomOptionsDTO fromString(String s) {
                JSONObject o = new JSONObject(s);
                RoomOptionsDTO ro = new RoomOptionsDTO();
@@ -116,7 +114,7 @@ public class RoomOptionsDTO implements S
                ro.showNickNameDialog = o.optBoolean("showNickNameDialog", 
false);
                return ro;
        }
-       
+
        @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/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=1780097&r1=1780096&r2=1780097&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
 Tue Jan 24 17:38:20 2017
@@ -18,6 +18,10 @@
  */
 package org.apache.openmeetings.db.dto.user;
 
+import static org.apache.openmeetings.db.util.DtoHelper.optEnum;
+import static org.apache.openmeetings.db.util.DtoHelper.optEnumList;
+import static org.apache.openmeetings.db.util.DtoHelper.optLong;
+
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.HashSet;
@@ -191,30 +195,23 @@ public class UserDTO implements Serializ
                        return null;
                }
                UserDTO u = new UserDTO();
-               long id = o.optLong("id");
-               u.id = id == 0 ? null : id;
+               u.id = optLong(o, "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.rights.addAll(optEnumList(Right.class, 
o.optJSONArray("rights")));
                u.languageId = o.optLong("languageId");
                JSONObject a = o.optJSONObject("address");
                if (a != null) {
-                       u.address.setId(a.optLong("id"));
+                       u.address.setId(optLong(a, "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");
-               String t = o.optString("type", null);
-               u.type = t == null ? null : Type.valueOf(t);
+               u.type = optEnum(Type.class, o, "type");
                return u;
        }
 

Modified: 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Address.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Address.java?rev=1780097&r1=1780096&r2=1780097&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Address.java
 (original)
+++ 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Address.java
 Tue Jan 24 17:38:20 2017
@@ -36,56 +36,55 @@ import org.simpleframework.xml.Root;
 @Table(name = "address")
 @Root(name="address")
 public class Address implements IDataProviderEntity {
-
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "id")
        private Long id;
-       
+
        @Column(name = "additionalname")
        @Element(data=true, required=false)
        private String additionalname;
-       
+
        @Lob
        @Column(name = "comment", length=2048)
        @Element(data=true, required=false)
        private String comment;
-       
+
        @Column(name = "fax")
        @Element(data=true, required=false)
        private String fax;
-       
+
        @Column(name = "inserted")
        @Element(name = "starttime",data=true, required=false)
        private Date inserted;
-       
+
        @Column(name = "country")
        @Element(name="country", data=true, required=false)
        private String country;
-       
+
        @Column(name = "street")
        @Element(data=true, required=false)
        private String street;
-       
+
        @Column(name = "town")
        @Element(data=true, required=false)
        private String town;
-       
+
        @Column(name = "updated")
        private Date updated;
-       
+
        @Column(name = "zip")
        @Element(data=true, required=false)
        private String zip;
-       
+
        @Column(name = "deleted", nullable = false)
        private boolean deleted;
 
        @Column(name = "email")
        @Element(name="mail", data=true, required=false)
        private String email;
-       
+
        @Column(name = "phone")
        @Element(data=true, required=false)
        private String phone;

Added: 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/DtoHelper.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/DtoHelper.java?rev=1780097&view=auto
==============================================================================
--- 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/DtoHelper.java
 (added)
+++ 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/DtoHelper.java
 Tue Jan 24 17:38:20 2017
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.db.util;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.apache.wicket.ajax.json.JSONArray;
+import org.apache.wicket.ajax.json.JSONObject;
+
+public class DtoHelper {
+       public static Long optLong(JSONObject o, String key) {
+               return o.has(key) && !o.isNull(key) ? o.getLong(key) : null;
+       }
+
+       public static <T extends Enum<T>> T optEnum(Class<T> clazz, JSONObject 
o, String key) {
+               return o.has(key) && !o.isNull(key) ? Enum.valueOf(clazz, 
o.getString(key)) : null;
+       }
+
+       public static <T extends Enum<T>> Collection<T> optEnumList(Class<T> 
clazz, JSONArray arr) {
+               Collection<T> l = new ArrayList<>();
+               if (arr !=  null) {
+                       for (int i = 0; i < arr.length(); ++i) {
+                               l.add(Enum.valueOf(clazz, arr.getString(i)));
+                       }
+               }
+               return l;
+       }
+}

Modified: 
openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java?rev=1780097&r1=1780096&r2=1780097&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
 (original)
+++ 
openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
 Tue Jan 24 17:38:20 2017
@@ -96,7 +96,7 @@ import org.wicketstuff.dashboard.web.Das
 public class Application extends AuthenticatedWebApplication implements 
IApplication {
        private static final Logger log = getLogger(Application.class, 
webAppRootKey);
        private static boolean isInstalled;
-       private static ConcurrentHashMap<String, Client> ONLINE_USERS = new 
ConcurrentHashMap<>(); 
+       private static ConcurrentHashMap<String, Client> ONLINE_USERS = new 
ConcurrentHashMap<>();
        private static ConcurrentHashMap<String, Client> INVALID_SESSIONS = new 
ConcurrentHashMap<>();
        private static ConcurrentHashMap<Long, Set<String>> ROOMS = new 
ConcurrentHashMap<>();
        //additional maps for faster searching should be created
@@ -114,14 +114,14 @@ public class Application extends Authent
                wicketApplicationName = super.getName();
                getSecuritySettings().setAuthenticationStrategy(new 
OmAuthenticationStrategy());
                
getApplicationSettings().setAccessDeniedPage(AccessDeniedPage.class);
-               
-               //Add custom resource loader at the beginning, so it will be 
checked first in the 
-               //chain of Resource Loaders, if not found it will search in 
Wicket's internal 
+
+               //Add custom resource loader at the beginning, so it will be 
checked first in the
+               //chain of Resource Loaders, if not found it will search in 
Wicket's internal
                //Resource Loader for a the property key
                getResourceSettings().getStringResourceLoaders().add(0, new 
LabelResourceLoader());
-               
+
                super.init();
-               
+
                // register some widgets
                dashboardContext = new DashboardContext();
                dashboardContext.setDashboardPersister(new 
UserDashboardPersister());
@@ -136,7 +136,7 @@ public class Application extends Authent
                DashboardSettings dashboardSettings = DashboardSettings.get();
                dashboardSettings.setIncludeJQuery(false);
                dashboardSettings.setIncludeJQueryUI(false);
-               
+
                getRootRequestMapperAsCompound().add(new 
NoVersionMapper(getHomePage()));
                getRootRequestMapperAsCompound().add(new 
NoVersionMapper("notinited", NotInitedPage.class));
                getRootRequestMapperAsCompound().add(new NoVersionMapper("swf", 
HashPage.class));
@@ -157,7 +157,7 @@ public class Application extends Authent
                public NoVersionMapper(final Class<? extends IRequestablePage> 
pageClass) {
                        this("/", pageClass);
                }
-               
+
                public NoVersionMapper(String mountPath, final Class<? extends 
IRequestablePage> pageClass) {
                        super(mountPath, pageClass, new 
PageParametersEncoder());
                }
@@ -166,7 +166,7 @@ public class Application extends Authent
                protected void encodePageComponentInfo(Url url, 
PageComponentInfo info) {
                        //Does nothing
                }
-               
+
                @Override
                public Url mapHandler(IRequestHandler requestHandler) {
                        if (requestHandler instanceof 
ListenerInterfaceRequestHandler || requestHandler instanceof 
BookmarkableListenerInterfaceRequestHandler) {
@@ -180,7 +180,7 @@ public class Application extends Authent
        public static OmAuthenticationStrategy getAuthenticationStrategy() {
                return 
(OmAuthenticationStrategy)get().getSecuritySettings().getAuthenticationStrategy();
        }
-       
+
        @Override
        public Class<? extends Page> getHomePage() {
                return MainPage.class;
@@ -195,31 +195,31 @@ public class Application extends Authent
        public Class<? extends WebPage> getSignInPageClass() {
                return SignInPage.class;
        }
-       
+
        public static Application get() {
                return (Application) WebApplication.get();
        }
-       
+
        public static DashboardContext getDashboardContext() {
                return get().dashboardContext;
        }
-       
+
        public static void addOnlineUser(Client c) {
                log.debug("Adding online client: {}, room: {}", c.getUid(), 
c.getRoomId());
                ONLINE_USERS.put(c.getUid(), c);
        }
-       
+
        public static void removeOnlineUser(Client c) {
                if (c != null) {
                        log.debug("Removing online client: {}, room: {}", 
c.getUid(), c.getRoomId());
                        ONLINE_USERS.remove(c.getUid());
                }
        }
-       
+
        public static Client getOnlineClient(String uid) {
                return uid == null ? null : ONLINE_USERS.get(uid);
        }
-       
+
        public static boolean isUserOnline(Long userId) {
                boolean isUserOnline = false;
                for (Map.Entry<String, Client> e : ONLINE_USERS.entrySet()) {
@@ -227,7 +227,7 @@ public class Application extends Authent
                                isUserOnline = true;
                                break;
                        }
-               } 
+               }
                return isUserOnline;
        }
 
@@ -245,11 +245,11 @@ public class Application extends Authent
                }
                return result;
        }
-       
+
        public static int getClientsSize() {
                return ONLINE_USERS.size();
        }
-       
+
        public static Client getClientByKeys(Long userId, String sessionId) {
                Client client = null;
                for (Map.Entry<String, Client> e : ONLINE_USERS.entrySet()) {
@@ -258,10 +258,10 @@ public class Application extends Authent
                                client = c;
                                break;
                        }
-               } 
+               }
                return client;
        }
-       
+
        @Override
        public void invalidateClient(Long userId, String sessionId) {
                Client client = getClientByKeys(userId, sessionId);
@@ -272,24 +272,24 @@ public class Application extends Authent
                        }
                }
        }
-       
+
        public static boolean isInvaldSession(String sessionId) {
                return sessionId == null ? false : 
INVALID_SESSIONS.containsKey(sessionId);
        }
-       
+
        public static void removeInvalidSession(String sessionId) {
                if (sessionId != null){
                        INVALID_SESSIONS.remove(sessionId);
                }
        }
-       
+
        public static Client addUserToRoom(Client c) {
                log.debug("Adding online room client: {}, room: {}", 
c.getUid(), c.getRoomId());
                ROOMS.putIfAbsent(c.getRoomId(), new 
ConcurrentHashSet<String>());
                ROOMS.get(c.getRoomId()).add(c.getUid());
                return c;
        }
-       
+
        public static Client removeUserFromRoom(Client c) {
                log.debug("Removing online room client: {}, room: {}", 
c.getUid(), c.getRoomId());
                if (c.getRoomId() != null) {
@@ -301,7 +301,7 @@ public class Application extends Authent
                }
                return c;
        }
-       
+
        public static List<Client> getRoomClients(Long roomId) {
                List<Client> clients = new ArrayList<>();
                if (roomId != null) {
@@ -317,7 +317,7 @@ public class Application extends Authent
                }
                return clients;
        }
-       
+
        public static Set<Long> getUserRooms(Long userId) {
                Set<Long> result = new HashSet<>();
                for (Entry<Long, Set<String>> me : ROOMS.entrySet()) {
@@ -330,7 +330,7 @@ public class Application extends Authent
                }
                return result;
        }
-       
+
        public static boolean isUserInRoom(long roomId, long userId) {
                Set<String> clients = ROOMS.get(roomId);
                if (clients != null) {
@@ -342,7 +342,7 @@ public class Application extends Authent
                }
                return false;
        }
-       
+
        //TODO need more safe way FIXME
        public <T> T _getBean(Class<T> clazz) {
                WebApplicationContext wac = 
getWebApplicationContext(getServletContext());
@@ -364,15 +364,15 @@ public class Application extends Authent
                }
                return loc;
        }
-       
+
        public static String getString(String key, final long languageId) {
                return getString(key, getLocale(languageId));
        }
-       
+
        public static String getString(long id, final long languageId) {
                return getString(id, getLocale(languageId));
        }
-       
+
        public static String getString(long id, final Locale loc) {
                return getString("" + id, loc);
        }
@@ -406,7 +406,7 @@ public class Application extends Authent
                }
                return result;
        }
-       
+
        public static <T> T getBean(Class<T> clazz) {
                if (InitializationContainer.initComplete) {
                        if (!isInstalled()) {
@@ -417,7 +417,7 @@ public class Application extends Authent
                        throw new RestartResponseException(NotInitedPage.class);
                }
        }
-       
+
        @Override
        public <T> T getOmBean(Class<T> clazz) { //FIXME hack for email 
templates support (should be in separate module for now
                return Application.getBean(clazz);
@@ -437,19 +437,23 @@ public class Application extends Authent
                Room r = i.getRoom();
                User u = i.getInvitee();
                if (r != null) {
-                       boolean allowed = u.getType() != Type.contact;
-                       if (allowed) {
-                               allowed = 
getBean(MainService.class).isRoomAllowedToUser(r, u);
-                       }
-                       if (!allowed) {
-                               PageParameters pp = new PageParameters();
-                               pp.add(INVITATION_HASH, i.getHash());
-                               if (u.getLanguageId() > 0) {
-                                       pp.add("language", u.getLanguageId());
-                               }
-                               link = urlForPage(HashPage.class, pp);
-                       } else {
+                       if (r.isAppointment() && 
i.getInvitedBy().getId().equals(u.getId())) {
                                link = getRoomUrlFragment(r.getId()).getLink();
+                       } else {
+                               boolean allowed = u.getType() != Type.contact;
+                               if (allowed) {
+                                       allowed = 
getBean(MainService.class).isRoomAllowedToUser(r, u);
+                               }
+                               if (allowed) {
+                                       link = 
getRoomUrlFragment(r.getId()).getLink();
+                               } else {
+                                       PageParameters pp = new 
PageParameters();
+                                       pp.add(INVITATION_HASH, i.getHash());
+                                       if (u.getLanguageId() > 0) {
+                                               pp.add("language", 
u.getLanguageId());
+                                       }
+                                       link = urlForPage(HashPage.class, pp);
+                               }
                        }
                }
                Recording rec = i.getRecording();
@@ -458,12 +462,12 @@ public class Application extends Authent
                }
                return link;
        }
-       
+
        @Override
        public String getOmInvitationLink(Invitation i) { //FIXME hack for 
email templates support (should be in separate module for now
                return getInvitationLink(i);
        }
-       
+
        public static String urlForPage(Class<? extends Page> clazz, 
PageParameters pp) {
                RequestCycle rc = RequestCycle.get();
                return 
rc.getUrlRenderer().renderFullUrl(Url.parse(getBean(ConfigurationDao.class).getBaseUrl()
 + rc.urlFor(clazz, pp)));
@@ -478,7 +482,7 @@ public class Application extends Authent
        public String getOmString(long id) {
                return getString(id);
        }
-       
+
        @Override
        public String getOmString(long id, long languageId) {
                return getString(id, languageId);

Modified: 
openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java?rev=1780097&r1=1780096&r2=1780097&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
 (original)
+++ 
openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
 Tue Jan 24 17:38:20 2017
@@ -87,7 +87,7 @@ public abstract class InvitationForm ext
                add(subject, message);
                
recipients.setLabel(Model.of(Application.getString(216))).setRequired(true).add(new
 AjaxFormComponentUpdatingBehavior("change") {
                        private static final long serialVersionUID = 1L;
-                       
+
                        @Override
                        protected void onUpdate(AjaxRequestTarget target) {
                                url.setModelObject(null);
@@ -154,11 +154,11 @@ public abstract class InvitationForm ext
                i.setId(null);
                i.setUpdated(null);
                i.setUsed(false);
-               
+
                i.setPassword(CryptProvider.get().hash(i.getPassword()));
                i.setValidFrom(getDate(from.getModelObject().minusMinutes(5), 
timeZoneId.getModelObject()));
                i.setValidTo(getDate(to.getModelObject(), 
timeZoneId.getModelObject()));
-               
+
                i.setInvitee(u);
                i.setHash(UUID.randomUUID().toString());
                if (Type.contact == u.getType()) {

Modified: 
openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractJUnitDefaults.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractJUnitDefaults.java?rev=1780097&r1=1780096&r2=1780097&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractJUnitDefaults.java
 (original)
+++ 
openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractJUnitDefaults.java
 Tue Jan 24 17:38:20 2017
@@ -48,7 +48,7 @@ public abstract class AbstractJUnitDefau
        private static final String orgname = "smoketest";
        private static final String timeZone = "Europe/Berlin";
        private static final String useremail = "[email protected]";
-       
+
        @Autowired
        private AppointmentDao appointmentDao;
        @Autowired
@@ -114,7 +114,7 @@ public abstract class AbstractJUnitDefau
                if (ap.getReminder() == null) {
                        ap.setReminder(Appointment.Reminder.none);
                }
-               
+
                if (r == null) {
                        r = new Room();
                        r.setType(Room.Type.conference);
@@ -178,12 +178,15 @@ public abstract class AbstractJUnitDefau
                importInitvalues.loadAll(cfg, false);
        }
 
+       public User getContact(String uuid, Long ownerId) {
+               return userDao.getContact("email" + uuid, "firstname" + uuid, 
"lastname" + uuid, ownerId);
+       }
+
        public User createUserContact(Long ownerId) {
-               return createUserContact(UUID.randomUUID().toString(), ownerId);
+               return 
createUserContact(getContact(UUID.randomUUID().toString(), ownerId), ownerId);
        }
 
-       public User createUserContact(String uuid, Long ownerId) {
-               User user = userDao.getContact("email" + uuid, "firstname" + 
uuid, "lastname" + uuid, ownerId);
+       public User createUserContact(User user, Long ownerId) {
                user = userDao.update(user, ownerId);
                assertNotNull("Cann't add user", user);
                return user;

Modified: 
openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/calendar/TestAppointmentAddAppointment.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/calendar/TestAppointmentAddAppointment.java?rev=1780097&r1=1780096&r2=1780097&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/calendar/TestAppointmentAddAppointment.java
 (original)
+++ 
openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/calendar/TestAppointmentAddAppointment.java
 Tue Jan 24 17:38:20 2017
@@ -19,14 +19,28 @@
 package org.apache.openmeetings.test.calendar;
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.ArrayList;
 import java.util.Calendar;
+import java.util.Date;
+import java.util.UUID;
 
 import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
+import org.apache.openmeetings.db.dao.user.UserDao;
 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.openmeetings.db.entity.room.Room;
+import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.service.calendar.AppointmentLogic;
 import org.apache.openmeetings.test.AbstractWicketTester;
+import org.apache.openmeetings.web.app.WebSession;
+import org.apache.wicket.util.string.StringValue;
 import org.junit.Test;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
@@ -39,11 +53,17 @@ public class TestAppointmentAddAppointme
        private AppointmentLogic appointmentLogic;
        @Autowired
        private AppointmentDao appointmentDao;
+       @Autowired
+       private UserDao userDao;
+
+       private void setTime(Appointment a) {
+               
a.setStart(Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant()));
+               
a.setEnd(Date.from(LocalDateTime.now().plusHours(1).atZone(ZoneId.systemDefault()).toInstant()));
+       }
 
        @Test
        public void saveAppointment() throws Exception {
-               log.debug("- 1 MeetingReminderJob.execute");
-               log.warn("- 2 MeetingReminderJob.execute");
+               log.debug("- saveAppointment");
 
                Calendar start = Calendar.getInstance();
                start.setTimeInMillis(start.getTimeInMillis() + 600000);
@@ -74,14 +94,45 @@ public class TestAppointmentAddAppointme
                                isMonthly, isYearly, remind, mmClient,
                                roomType, languageId, false, "", -1, userId);
                a = appointmentDao.update(a, userId);
-               
+
                Thread.sleep(3000);
-               
+
                appointmentLogic.doScheduledMeetingReminder();
-               
+
                Thread.sleep(3000);
-               
-               assertTrue("Saved appointment should have valid id: " + 
a.getId(), a.getId() != null && a.getId() > 0);
+
+               assertNotNull("Saved appointment should have valid id: " + 
a.getId(), a.getId());
+       }
+
+       @Test
+       public void testCreate() {
+               Appointment a = new Appointment();
+               a.setTitle("Test title");
+               setTime(a);
+               a.setReminder(Reminder.ical);
+               a.setMeetingMembers(new ArrayList<>());
+               User owner = userDao.get(1L);
+               a.setOwner(owner);
+               a.setRoom(new Room());
+               a.getRoom().setAppointment(true);
+               a.getRoom().setType(Room.Type.conference);
+               for (int i = 0; i < 3; ++i) {
+                       MeetingMember mm = new MeetingMember();
+                       mm.setUser(getContact(UUID.randomUUID().toString(), 
owner.getId()));
+                       a.getMeetingMembers().add(mm);
+               }
+               a = appointmentDao.update(a, owner.getId());
+               assertNotNull("Saved appointment should have valid id: " + 
a.getId(), a.getId());
+               assertEquals("Saved appointment should have corect count of 
guests: ", 3, a.getMeetingMembers().size());
+               for (MeetingMember mm : a.getMeetingMembers()) {
+                       assertNotNull("Saved guest should have valid id: ", 
mm.getId());
+                       assertNotNull("Saved guest should have valid 
invitation: ", mm.getInvitation());
+               }
+
+               WebSession ws = WebSession.get();
+               Appointment a1 = appointmentDao.get(a.getId());
+               ws.checkHashes(StringValue.valueOf(""), 
StringValue.valueOf(a1.getMeetingMembers().get(0).getInvitation().getHash()));
+               assertTrue("Login via secure hash should be successful", 
ws.isSignedIn());
        }
 
        private static String createClientObj(String firstname, String 
lastname, String email, String jNameTimeZone) {
@@ -94,5 +145,4 @@ public class TestAppointmentAddAppointme
                        .append(jNameTimeZone);
                return sb.toString();
        }
-
 }

Modified: 
openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java?rev=1780097&r1=1780096&r2=1780097&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java
 (original)
+++ 
openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java
 Tue Jan 24 17:38:20 2017
@@ -32,6 +32,7 @@ import org.apache.openmeetings.db.dao.ro
 import org.apache.openmeetings.db.dao.user.GroupDao;
 import org.apache.openmeetings.db.dto.basic.ServiceResult;
 import org.apache.openmeetings.db.dto.calendar.AppointmentDTO;
+import org.apache.openmeetings.db.dto.calendar.MeetingMemberDTO;
 import org.apache.openmeetings.db.entity.calendar.Appointment;
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.user.GroupUser;
@@ -174,14 +175,14 @@ public class TestCalendarService extends
                JSONObject o = createAppointment()
                                .put("meetingMembers", new JSONArray()
                                                .put(new 
JSONObject().put("user", new JSONObject()
-                                                               
.put("firstname", "Jhon 1")
+                                                               
.put("firstname", "John 1")
                                                                
.put("lastname", "Doe")
-                                                               .put("Address", 
new JSONObject().put("email", "[email protected]"))
+                                                               .put("address", 
new JSONObject().put("email", "[email protected]"))
                                                                ))
                                                .put(new 
JSONObject().put("user", new JSONObject()
-                                                               
.put("firstname", "Jhon 2")
+                                                               
.put("firstname", "John 2")
                                                                
.put("lastname", "Doe")
-                                                               .put("Address", 
new JSONObject().put("email", "[email protected]"))
+                                                               .put("address", 
new JSONObject().put("email", "[email protected]"))
                                                                ))
                                                );
 
@@ -202,6 +203,9 @@ public class TestCalendarService extends
                assertNotNull("Valid DTO should be returned", dto);
                assertNotNull("DTO id should be valid", dto.getId());
                assertEquals("DTO should have 2 attendees", 2, 
dto.getMeetingMembers().size());
+               for (MeetingMemberDTO mm : dto.getMeetingMembers()) {
+                       assertNotNull("Email should be valid", 
mm.getUser().getAddress().getEmail());
+               }
 
                //try to change MM list
                JSONObject o1 = AppointmentParamConverter.json(dto)

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=1780097&r1=1780096&r2=1780097&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
 Tue Jan 24 17:38:20 2017
@@ -302,10 +302,7 @@ public class CalendarWebService {
                                throw new ServiceException("Insufficient 
permissions"); //TODO code -26
                        }
                        if (AuthLevelUtil.hasUserLevel(u.getRights())) {
-                               Appointment a = appointment.get(userDao, 
appointmentDao);
-                               if (a.getOwner() == null) {
-                                       a.setOwner(u);
-                               }
+                               Appointment a = appointment.get(userDao, 
appointmentDao, u);
                                if (a.getRoom().getId() != null) {
                                        if (a.getRoom().isAppointment()) {
                                                a.getRoom().setIspublic(false);

Modified: 
openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java?rev=1780097&r1=1780096&r2=1780097&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
 (original)
+++ 
openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
 Tue Jan 24 17:38:20 2017
@@ -18,6 +18,8 @@
  */
 package org.apache.openmeetings.webservice.util;
 
+import static org.apache.openmeetings.db.util.DtoHelper.optEnum;
+import static org.apache.openmeetings.db.util.DtoHelper.optLong;
 import static 
org.apache.openmeetings.util.CalendarPatterns.ISO8601_FULL_FORMAT;
 
 import java.util.Date;
@@ -37,8 +39,7 @@ public class AppointmentParamConverter i
        public AppointmentDTO fromString(String val) {
                JSONObject o = new JSONObject(val);
                AppointmentDTO a = new AppointmentDTO();
-               long id = o.optLong("id");
-               a.setId(id == 0 ? null : id);
+               a.setId(optLong(o, "id"));
                a.setTitle(o.optString("title"));
                a.setLocation(o.optString("location"));
                a.setOwner(UserDTO.get(o.optJSONObject("owner")));
@@ -49,8 +50,7 @@ public class AppointmentParamConverter i
                a.setInserted(DateParamConverter.get(o.optString("inserted")));
                a.setUpdated(DateParamConverter.get(o.optString("updated")));
                a.setDeleted(o.optBoolean("inserted"));
-               String r = o.optString("reminder", null);
-               a.setReminder(r == null ? null : Reminder.valueOf(r));
+               a.setReminder(optEnum(Reminder.class, o, "reminder"));
                a.setRoom(RoomDTO.get(o.optJSONObject("room")));
                a.setIcalId(o.optString("icalId"));
                JSONArray mm = o.optJSONArray("meetingMembers");

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/AppointmentDao.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/AppointmentDao.java?rev=1780097&r1=1780096&r2=1780097&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/AppointmentDao.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/AppointmentDao.java
 Tue Jan 24 17:38:20 2017
@@ -69,9 +69,7 @@ public class AppointmentDao {
        /*
         * insert, update, delete, select
         */
-
        // 
-----------------------------------------------------------------------------------------------
-
        public Appointment get(Long id) {
                TypedQuery<Appointment> query = 
em.createNamedQuery("getAppointmentById", Appointment.class);
                query.setParameter("id", id);
@@ -94,7 +92,6 @@ public class AppointmentDao {
                } catch (NoResultException ex) {
                        //no-op
                }
-
                return a;
        }
 
@@ -153,7 +150,7 @@ public class AppointmentDao {
                        em.persist(a);
                } else {
                        a.setUpdated(new Date());
-                       a =     em.merge(a);
+                       a = em.merge(a);
                }
                return a;
        }

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=1780097&r1=1780096&r2=1780097&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
 Tue Jan 24 17:38:20 2017
@@ -36,6 +36,7 @@ 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.openmeetings.db.entity.user.User;
 import org.apache.wicket.ajax.json.JSONObject;
 
 @XmlRootElement
@@ -92,7 +93,7 @@ public class AppointmentDTO implements S
                reminderEmailSend = a.isReminderEmailSend();
        }
 
-       public Appointment get(UserDao userDao, AppointmentDao appointmentDao) {
+       public Appointment get(UserDao userDao, AppointmentDao appointmentDao, 
User u) {
                Appointment a = id == null ? new Appointment() : 
appointmentDao.get(id);
                a.setId(id);
                a.setTitle(title);
@@ -100,7 +101,7 @@ public class AppointmentDTO implements S
                a.setStart(start.getTime());
                a.setEnd(end.getTime());
                a.setDescription(description);
-               a.setOwner(owner == null ? null : userDao.get(owner.getId()));
+               a.setOwner(owner == null ? u : userDao.get(owner.getId()));
                a.setInserted(inserted);
                a.setUpdated(updated);
                a.setDeleted(deleted);
@@ -109,7 +110,7 @@ public class AppointmentDTO implements S
                a.setIcalId(icalId);
                a.setMeetingMembers(new ArrayList<MeetingMember>());
                for(MeetingMemberDTO mm : meetingMembers) {
-                       MeetingMember m = mm.get(userDao);
+                       MeetingMember m = mm.get(userDao, u);
                        m.setAppointment(a);
                        a.getMeetingMembers().add(m);
                }

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=1780097&r1=1780096&r2=1780097&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
 Tue Jan 24 17:38:20 2017
@@ -18,6 +18,8 @@
  */
 package org.apache.openmeetings.db.dto.calendar;
 
+import static org.apache.openmeetings.db.util.DtoHelper.optLong;
+
 import java.io.Serializable;
 
 import javax.xml.bind.annotation.XmlAccessType;
@@ -44,7 +46,7 @@ public class MeetingMemberDTO implements
                this.user = new UserDTO(mm.getUser());
        }
 
-       public MeetingMember get(UserDao userDao) {
+       public MeetingMember get(UserDao userDao, User owner) {
                MeetingMember mm = new MeetingMember();
                mm.setId(id);
                if (user.getId() != null) {
@@ -55,6 +57,14 @@ public class MeetingMemberDTO implements
                                // try to get ext. user
                                u = 
userDao.getExternalUser(user.getExternalId(), user.getExternalType());
                        }
+                       if (u == null && user.getAddress() != null) {
+                               u = 
userDao.getContact(user.getAddress().getEmail()
+                                               , user.getFirstname()
+                                               , user.getLastname()
+                                               , user.getLanguageId()
+                                               , user.getTimeZoneId()
+                                               , owner);
+                       }
                        if (u == null) {
                                u = user.get(userDao);
                                u.setType(User.Type.contact);
@@ -85,8 +95,7 @@ public class MeetingMemberDTO implements
 
        public static MeetingMemberDTO get(JSONObject o) {
                MeetingMemberDTO m = new MeetingMemberDTO();
-               long id = o.optLong("id");
-               m.id = id == 0 ? null : id;
+               m.id = optLong(o, "id");
                m.user = UserDTO.get(o.optJSONObject("user"));
                return m;
        }

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java?rev=1780097&r1=1780096&r2=1780097&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
 Tue Jan 24 17:38:20 2017
@@ -19,6 +19,9 @@
 package org.apache.openmeetings.db.dto.room;
 
 import static org.apache.openmeetings.db.dto.room.RoomOptionsDTO.optInt;
+import static org.apache.openmeetings.db.util.DtoHelper.optEnum;
+import static org.apache.openmeetings.db.util.DtoHelper.optEnumList;
+import static org.apache.openmeetings.db.util.DtoHelper.optLong;
 
 import java.io.Serializable;
 import java.util.ArrayList;
@@ -287,11 +290,10 @@ public class RoomDTO implements Serializ
                        return null;
                }
                RoomDTO r = new RoomDTO();
-               long id = o.optLong("id");
-               r.id = id == 0 ? null : id;
+               r.id = optLong(o, "id");
                r.name = o.optString("name");
                r.comment = o.optString("comment");
-               r.type = Room.Type.valueOf(o.getString("type"));
+               r.type = optEnum(Room.Type.class, o, "type");
                r.numberOfPartizipants = o.optLong("numberOfPartizipants", 4);
                r.appointment = o.optBoolean("appointment", false);
                r.confno = o.optString("confno");
@@ -307,13 +309,7 @@ public class RoomDTO implements Serializ
                r.allowRecording = o.optBoolean("allowRecording", false);
                r.waitForRecording = o.optBoolean("waitForRecording", false);
                r.audioOnly = o.optBoolean("audioOnly", false);
-               r.setHiddenElements(new HashSet<RoomElement>());
-               JSONArray hidden = o.optJSONArray("hiddenElements");
-               if (hidden != null) {
-                       for (int i = 0; i < hidden.length(); ++i) {
-                               
r.getHiddenElements().add(RoomElement.valueOf(hidden.getString(i)));
-                       }
-               }
+               r.getHiddenElements().addAll(optEnumList(RoomElement.class, 
o.optJSONArray("hiddenElements")));
                return r;
        }
 

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomOptionsDTO.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomOptionsDTO.java?rev=1780097&r1=1780096&r2=1780097&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomOptionsDTO.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomOptionsDTO.java
 Tue Jan 24 17:38:20 2017
@@ -18,6 +18,8 @@
  */
 package org.apache.openmeetings.db.dto.room;
 
+import static org.apache.openmeetings.db.util.DtoHelper.optLong;
+
 import java.io.Serializable;
 
 import javax.xml.bind.annotation.XmlAccessType;
@@ -90,11 +92,7 @@ public class RoomOptionsDTO implements S
        public static Integer optInt(JSONObject o, String key) {
                return o.has(key) && !o.isNull(key) ? o.getInt(key) : null;
        }
-       
-       public static Long optLong(JSONObject o, String key) {
-               return o.has(key) && !o.isNull(key) ? o.getLong(key) : null;
-       }
-       
+
        public static RoomOptionsDTO fromString(String s) {
                JSONObject o = new JSONObject(s);
                RoomOptionsDTO ro = new RoomOptionsDTO();
@@ -106,7 +104,7 @@ public class RoomOptionsDTO implements S
                ro.showAudioVideoTest = o.optBoolean("showAudioVideoTest", 
false);
                return ro;
        }
-       
+
        @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=1780097&r1=1780096&r2=1780097&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
 Tue Jan 24 17:38:20 2017
@@ -18,6 +18,10 @@
  */
 package org.apache.openmeetings.db.dto.user;
 
+import static org.apache.openmeetings.db.util.DtoHelper.optEnum;
+import static org.apache.openmeetings.db.util.DtoHelper.optEnumList;
+import static org.apache.openmeetings.db.util.DtoHelper.optLong;
+
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.HashSet;
@@ -191,30 +195,23 @@ public class UserDTO implements Serializ
                        return null;
                }
                UserDTO u = new UserDTO();
-               long id = o.optLong("id");
-               u.id = id == 0 ? null : id;
+               u.id = optLong(o, "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.rights.addAll(optEnumList(Right.class, 
o.optJSONArray("rights")));
                u.languageId = o.optLong("languageId");
                JSONObject a = o.optJSONObject("address");
                if (a != null) {
-                       u.address.setId(a.optLong("id"));
+                       u.address.setId(optLong(a, "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");
-               String t = o.optString("type", null);
-               u.type = t == null ? null : Type.valueOf(t);
+               u.type = optEnum(Type.class, o, "type");
                return u;
        }
 

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Address.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Address.java?rev=1780097&r1=1780096&r2=1780097&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Address.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Address.java
 Tue Jan 24 17:38:20 2017
@@ -36,56 +36,55 @@ import org.simpleframework.xml.Root;
 @Table(name = "address")
 @Root(name="address")
 public class Address implements IDataProviderEntity {
-
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "id")
        private Long id;
-       
+
        @Column(name = "additionalname")
        @Element(data=true, required=false)
        private String additionalname;
-       
+
        @Lob
        @Column(name = "comment", length=2048)
        @Element(data=true, required=false)
        private String comment;
-       
+
        @Column(name = "fax")
        @Element(data=true, required=false)
        private String fax;
-       
+
        @Column(name = "inserted")
        @Element(name = "starttime",data=true, required=false)
        private Date inserted;
-       
+
        @Column(name = "country")
        @Element(name="country", data=true, required=false)
        private String country;
-       
+
        @Column(name = "street")
        @Element(data=true, required=false)
        private String street;
-       
+
        @Column(name = "town")
        @Element(data=true, required=false)
        private String town;
-       
+
        @Column(name = "updated")
        private Date updated;
-       
+
        @Column(name = "zip")
        @Element(data=true, required=false)
        private String zip;
-       
+
        @Column(name = "deleted", nullable = false)
        private boolean deleted;
 
        @Column(name = "email")
        @Element(name="mail", data=true, required=false)
        private String email;
-       
+
        @Column(name = "phone")
        @Element(data=true, required=false)
        private String phone;

Added: 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/DtoHelper.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/DtoHelper.java?rev=1780097&view=auto
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/DtoHelper.java
 (added)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/DtoHelper.java
 Tue Jan 24 17:38:20 2017
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.db.util;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.apache.wicket.ajax.json.JSONArray;
+import org.apache.wicket.ajax.json.JSONObject;
+
+public class DtoHelper {
+       public static Long optLong(JSONObject o, String key) {
+               return o.has(key) && !o.isNull(key) ? o.getLong(key) : null;
+       }
+
+       public static <T extends Enum<T>> T optEnum(Class<T> clazz, JSONObject 
o, String key) {
+               return o.has(key) && !o.isNull(key) ? Enum.valueOf(clazz, 
o.getString(key)) : null;
+       }
+
+       public static <T extends Enum<T>> Collection<T> optEnumList(Class<T> 
clazz, JSONArray arr) {
+               Collection<T> l = new ArrayList<>();
+               if (arr !=  null) {
+                       for (int i = 0; i < arr.length(); ++i) {
+                               l.add(Enum.valueOf(clazz, arr.getString(i)));
+                       }
+               }
+               return l;
+       }
+}

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java?rev=1780097&r1=1780096&r2=1780097&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
 Tue Jan 24 17:38:20 2017
@@ -486,19 +486,23 @@ public class Application extends Authent
                Room r = i.getRoom();
                User u = i.getInvitee();
                if (r != null) {
-                       boolean allowed = u.getType() != Type.contact;
-                       if (allowed) {
-                               allowed = 
getBean(MainService.class).isRoomAllowedToUser(r, u);
-                       }
-                       if (!allowed) {
-                               PageParameters pp = new PageParameters();
-                               pp.add(INVITATION_HASH, i.getHash());
-                               if (u.getLanguageId() > 0) {
-                                       pp.add("language", u.getLanguageId());
-                               }
-                               link = urlForPage(HashPage.class, pp);
-                       } else {
+                       if (r.isAppointment() && 
i.getInvitedBy().getId().equals(u.getId())) {
                                link = getRoomUrlFragment(r.getId()).getLink();
+                       } else {
+                               boolean allowed = u.getType() != Type.contact;
+                               if (allowed) {
+                                       allowed = 
getBean(MainService.class).isRoomAllowedToUser(r, u);
+                               }
+                               if (allowed) {
+                                       link = 
getRoomUrlFragment(r.getId()).getLink();
+                               } else {
+                                       PageParameters pp = new 
PageParameters();
+                                       pp.add(INVITATION_HASH, i.getHash());
+                                       if (u.getLanguageId() > 0) {
+                                               pp.add("language", 
u.getLanguageId());
+                                       }
+                                       link = urlForPage(HashPage.class, pp);
+                               }
                        }
                }
                Recording rec = i.getRecording();

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java?rev=1780097&r1=1780096&r2=1780097&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
 Tue Jan 24 17:38:20 2017
@@ -87,7 +87,7 @@ public abstract class InvitationForm ext
                add(subject, message);
                
recipients.setLabel(Model.of(Application.getString(216))).setRequired(true).add(new
 AjaxFormComponentUpdatingBehavior("change") {
                        private static final long serialVersionUID = 1L;
-                       
+
                        @Override
                        protected void onUpdate(AjaxRequestTarget target) {
                                url.setModelObject(null);
@@ -154,11 +154,11 @@ public abstract class InvitationForm ext
                i.setId(null);
                i.setUpdated(null);
                i.setUsed(false);
-               
+
                i.setPassword(CryptProvider.get().hash(i.getPassword()));
                i.setValidFrom(getDate(from.getModelObject().minusMinutes(5), 
timeZoneId.getModelObject()));
                i.setValidTo(getDate(to.getModelObject(), 
timeZoneId.getModelObject()));
-               
+
                i.setInvitee(u);
                i.setHash(UUID.randomUUID().toString());
                if (Type.contact == u.getType()) {
@@ -232,4 +232,4 @@ public abstract class InvitationForm ext
                        dialog.onSuperClick(target, button);
                }
        }
-}
\ No newline at end of file
+}

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractJUnitDefaults.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractJUnitDefaults.java?rev=1780097&r1=1780096&r2=1780097&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractJUnitDefaults.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractJUnitDefaults.java
 Tue Jan 24 17:38:20 2017
@@ -48,7 +48,7 @@ public abstract class AbstractJUnitDefau
        private static final String orgname = "smoketest";
        private static final String timeZone = "Europe/Berlin";
        private static final String useremail = "[email protected]";
-       
+
        @Autowired
        private AppointmentDao appointmentDao;
        @Autowired
@@ -114,7 +114,7 @@ public abstract class AbstractJUnitDefau
                if (ap.getReminder() == null) {
                        ap.setReminder(Appointment.Reminder.none);
                }
-               
+
                if (r == null) {
                        r = new Room();
                        r.setType(Room.Type.conference);
@@ -178,12 +178,15 @@ public abstract class AbstractJUnitDefau
                importInitvalues.loadAll(cfg, false);
        }
 
+       public User getContact(String uuid, Long ownerId) {
+               return userDao.getContact("email" + uuid, "firstname" + uuid, 
"lastname" + uuid, ownerId);
+       }
+
        public User createUserContact(Long ownerId) {
-               return createUserContact(UUID.randomUUID().toString(), ownerId);
+               return 
createUserContact(getContact(UUID.randomUUID().toString(), ownerId), ownerId);
        }
 
-       public User createUserContact(String uuid, Long ownerId) {
-               User user = userDao.getContact("email" + uuid, "firstname" + 
uuid, "lastname" + uuid, ownerId);
+       public User createUserContact(User user, Long ownerId) {
                user = userDao.update(user, ownerId);
                assertNotNull("Cann't add user", user);
                return user;

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/calendar/TestAppointmentAddAppointment.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/calendar/TestAppointmentAddAppointment.java?rev=1780097&r1=1780096&r2=1780097&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/calendar/TestAppointmentAddAppointment.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/calendar/TestAppointmentAddAppointment.java
 Tue Jan 24 17:38:20 2017
@@ -19,14 +19,28 @@
 package org.apache.openmeetings.test.calendar;
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.ArrayList;
 import java.util.Calendar;
+import java.util.Date;
+import java.util.UUID;
 
 import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
+import org.apache.openmeetings.db.dao.user.UserDao;
 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.openmeetings.db.entity.room.Room;
+import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.service.calendar.AppointmentLogic;
 import org.apache.openmeetings.test.AbstractWicketTester;
+import org.apache.openmeetings.web.app.WebSession;
+import org.apache.wicket.util.string.StringValue;
 import org.junit.Test;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
@@ -39,11 +53,17 @@ public class TestAppointmentAddAppointme
        private AppointmentLogic appointmentLogic;
        @Autowired
        private AppointmentDao appointmentDao;
+       @Autowired
+       private UserDao userDao;
+
+       private void setTime(Appointment a) {
+               
a.setStart(Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant()));
+               
a.setEnd(Date.from(LocalDateTime.now().plusHours(1).atZone(ZoneId.systemDefault()).toInstant()));
+       }
 
        @Test
        public void saveAppointment() throws Exception {
-               log.debug("- 1 MeetingReminderJob.execute");
-               log.warn("- 2 MeetingReminderJob.execute");
+               log.debug("- saveAppointment");
 
                Calendar start = Calendar.getInstance();
                start.setTimeInMillis(start.getTimeInMillis() + 600000);
@@ -74,14 +94,45 @@ public class TestAppointmentAddAppointme
                                isMonthly, isYearly, remind, mmClient,
                                roomType, languageId, false, "", -1, userId);
                a = appointmentDao.update(a, userId);
-               
+
                Thread.sleep(3000);
-               
+
                appointmentLogic.doScheduledMeetingReminder();
-               
+
                Thread.sleep(3000);
-               
-               assertTrue("Saved appointment should have valid id: " + 
a.getId(), a.getId() != null && a.getId() > 0);
+
+               assertNotNull("Saved appointment should have valid id: " + 
a.getId(), a.getId());
+       }
+
+       @Test
+       public void testCreate() {
+               Appointment a = new Appointment();
+               a.setTitle("Test title");
+               setTime(a);
+               a.setReminder(Reminder.ical);
+               a.setMeetingMembers(new ArrayList<>());
+               User owner = userDao.get(1L);
+               a.setOwner(owner);
+               a.setRoom(new Room());
+               a.getRoom().setAppointment(true);
+               a.getRoom().setType(Room.Type.conference);
+               for (int i = 0; i < 3; ++i) {
+                       MeetingMember mm = new MeetingMember();
+                       mm.setUser(getContact(UUID.randomUUID().toString(), 
owner.getId()));
+                       a.getMeetingMembers().add(mm);
+               }
+               a = appointmentDao.update(a, owner.getId());
+               assertNotNull("Saved appointment should have valid id: " + 
a.getId(), a.getId());
+               assertEquals("Saved appointment should have corect count of 
guests: ", 3, a.getMeetingMembers().size());
+               for (MeetingMember mm : a.getMeetingMembers()) {
+                       assertNotNull("Saved guest should have valid id: ", 
mm.getId());
+                       assertNotNull("Saved guest should have valid 
invitation: ", mm.getInvitation());
+               }
+
+               WebSession ws = WebSession.get();
+               Appointment a1 = appointmentDao.get(a.getId());
+               ws.checkHashes(StringValue.valueOf(""), 
StringValue.valueOf(a1.getMeetingMembers().get(0).getInvitation().getHash()));
+               assertTrue("Login via secure hash should be successful", 
ws.isSignedIn());
        }
 
        private static String createClientObj(String firstname, String 
lastname, String email, String jNameTimeZone) {
@@ -94,5 +145,4 @@ public class TestAppointmentAddAppointme
                        .append(jNameTimeZone);
                return sb.toString();
        }
-
 }

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java?rev=1780097&r1=1780096&r2=1780097&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java
 Tue Jan 24 17:38:20 2017
@@ -32,6 +32,7 @@ import org.apache.openmeetings.db.dao.ro
 import org.apache.openmeetings.db.dao.user.GroupDao;
 import org.apache.openmeetings.db.dto.basic.ServiceResult;
 import org.apache.openmeetings.db.dto.calendar.AppointmentDTO;
+import org.apache.openmeetings.db.dto.calendar.MeetingMemberDTO;
 import org.apache.openmeetings.db.entity.calendar.Appointment;
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.user.GroupUser;
@@ -174,14 +175,14 @@ public class TestCalendarService extends
                JSONObject o = createAppointment()
                                .put("meetingMembers", new JSONArray()
                                                .put(new 
JSONObject().put("user", new JSONObject()
-                                                               
.put("firstname", "Jhon 1")
+                                                               
.put("firstname", "John 1")
                                                                
.put("lastname", "Doe")
-                                                               .put("Address", 
new JSONObject().put("email", "[email protected]"))
+                                                               .put("address", 
new JSONObject().put("email", "[email protected]"))
                                                                ))
                                                .put(new 
JSONObject().put("user", new JSONObject()
-                                                               
.put("firstname", "Jhon 2")
+                                                               
.put("firstname", "John 2")
                                                                
.put("lastname", "Doe")
-                                                               .put("Address", 
new JSONObject().put("email", "[email protected]"))
+                                                               .put("address", 
new JSONObject().put("email", "[email protected]"))
                                                                ))
                                                );
 
@@ -202,6 +203,9 @@ public class TestCalendarService extends
                assertNotNull("Valid DTO should be returned", dto);
                assertNotNull("DTO id should be valid", dto.getId());
                assertEquals("DTO should have 2 attendees", 2, 
dto.getMeetingMembers().size());
+               for (MeetingMemberDTO mm : dto.getMeetingMembers()) {
+                       assertNotNull("Email should be valid", 
mm.getUser().getAddress().getEmail());
+               }
 
                //try to change MM list
                JSONObject o1 = AppointmentParamConverter.json(dto)

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=1780097&r1=1780096&r2=1780097&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
 Tue Jan 24 17:38:20 2017
@@ -303,10 +303,7 @@ public class CalendarWebService {
                                throw new ServiceException("Insufficient 
permissions"); //TODO code -26
                        }
                        if (AuthLevelUtil.hasUserLevel(u.getRights())) {
-                               Appointment a = appointment.get(userDao, 
appointmentDao);
-                               if (a.getOwner() == null) {
-                                       a.setOwner(u);
-                               }
+                               Appointment a = appointment.get(userDao, 
appointmentDao, u);
                                if (a.getRoom().getId() != null) {
                                        if (a.getRoom().isAppointment()) {
                                                a.getRoom().setIspublic(false);

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java?rev=1780097&r1=1780096&r2=1780097&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
 Tue Jan 24 17:38:20 2017
@@ -18,6 +18,8 @@
  */
 package org.apache.openmeetings.webservice.util;
 
+import static org.apache.openmeetings.db.util.DtoHelper.optEnum;
+import static org.apache.openmeetings.db.util.DtoHelper.optLong;
 import static 
org.apache.openmeetings.util.CalendarPatterns.ISO8601_FULL_FORMAT;
 
 import java.util.Date;
@@ -37,8 +39,7 @@ public class AppointmentParamConverter i
        public AppointmentDTO fromString(String val) {
                JSONObject o = new JSONObject(val);
                AppointmentDTO a = new AppointmentDTO();
-               long id = o.optLong("id");
-               a.setId(id == 0 ? null : id);
+               a.setId(optLong(o, "id"));
                a.setTitle(o.optString("title"));
                a.setLocation(o.optString("location"));
                a.setOwner(UserDTO.get(o.optJSONObject("owner")));
@@ -49,8 +50,7 @@ public class AppointmentParamConverter i
                a.setInserted(DateParamConverter.get(o.optString("inserted")));
                a.setUpdated(DateParamConverter.get(o.optString("updated")));
                a.setDeleted(o.optBoolean("inserted"));
-               String r = o.optString("reminder", null);
-               a.setReminder(r == null ? null : Reminder.valueOf(r));
+               a.setReminder(optEnum(Reminder.class, o, "reminder"));
                a.setRoom(RoomDTO.get(o.optJSONObject("room")));
                a.setIcalId(o.optString("icalId"));
                JSONArray mm = o.optJSONArray("meetingMembers");

Modified: 
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/AppointmentDao.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/AppointmentDao.java?rev=1780097&r1=1780096&r2=1780097&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/AppointmentDao.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/AppointmentDao.java
 Tue Jan 24 17:38:20 2017
@@ -69,9 +69,7 @@ public class AppointmentDao {
        /*
         * insert, update, delete, select
         */
-
        // 
-----------------------------------------------------------------------------------------------
-
        public Appointment get(Long id) {
                TypedQuery<Appointment> query = 
em.createNamedQuery("getAppointmentById", Appointment.class);
                query.setParameter("id", id);
@@ -94,7 +92,6 @@ public class AppointmentDao {
                } catch (NoResultException ex) {
                        //no-op
                }
-
                return a;
        }
 
@@ -153,7 +150,7 @@ public class AppointmentDao {
                        em.persist(a);
                } else {
                        a.setUpdated(new Date());
-                       a =     em.merge(a);
+                       a = em.merge(a);
                }
                return a;
        }

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=1780097&r1=1780096&r2=1780097&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
 Tue Jan 24 17:38:20 2017
@@ -36,6 +36,7 @@ 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.openmeetings.db.entity.user.User;
 import org.apache.wicket.ajax.json.JSONObject;
 
 @XmlRootElement
@@ -92,7 +93,7 @@ public class AppointmentDTO implements S
                reminderEmailSend = a.isReminderEmailSend();
        }
 
-       public Appointment get(UserDao userDao, AppointmentDao appointmentDao) {
+       public Appointment get(UserDao userDao, AppointmentDao appointmentDao, 
User u) {
                Appointment a = id == null ? new Appointment() : 
appointmentDao.get(id);
                a.setId(id);
                a.setTitle(title);
@@ -100,7 +101,7 @@ public class AppointmentDTO implements S
                a.setStart(start.getTime());
                a.setEnd(end.getTime());
                a.setDescription(description);
-               a.setOwner(owner == null ? null : userDao.get(owner.getId()));
+               a.setOwner(owner == null ? u : userDao.get(owner.getId()));
                a.setInserted(inserted);
                a.setUpdated(updated);
                a.setDeleted(deleted);
@@ -109,7 +110,7 @@ public class AppointmentDTO implements S
                a.setIcalId(icalId);
                a.setMeetingMembers(new ArrayList<MeetingMember>());
                for(MeetingMemberDTO mm : meetingMembers) {
-                       MeetingMember m = mm.get(userDao);
+                       MeetingMember m = mm.get(userDao, u);
                        m.setAppointment(a);
                        a.getMeetingMembers().add(m);
                }

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=1780097&r1=1780096&r2=1780097&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
 Tue Jan 24 17:38:20 2017
@@ -18,6 +18,8 @@
  */
 package org.apache.openmeetings.db.dto.calendar;
 
+import static org.apache.openmeetings.db.util.DtoHelper.optLong;
+
 import java.io.Serializable;
 
 import javax.xml.bind.annotation.XmlAccessType;
@@ -44,7 +46,7 @@ public class MeetingMemberDTO implements
                this.user = new UserDTO(mm.getUser());
        }
 
-       public MeetingMember get(UserDao userDao) {
+       public MeetingMember get(UserDao userDao, User owner) {
                MeetingMember mm = new MeetingMember();
                mm.setId(id);
                if (user.getId() != null) {
@@ -55,6 +57,14 @@ public class MeetingMemberDTO implements
                                // try to get ext. user
                                u = 
userDao.getExternalUser(user.getExternalId(), user.getExternalType());
                        }
+                       if (u == null && user.getAddress() != null) {
+                               u = 
userDao.getContact(user.getAddress().getEmail()
+                                               , user.getFirstname()
+                                               , user.getLastname()
+                                               , user.getLanguageId()
+                                               , user.getTimeZoneId()
+                                               , owner);
+                       }
                        if (u == null) {
                                u = user.get(userDao);
                                u.setType(User.Type.contact);
@@ -85,8 +95,7 @@ public class MeetingMemberDTO implements
 
        public static MeetingMemberDTO get(JSONObject o) {
                MeetingMemberDTO m = new MeetingMemberDTO();
-               long id = o.optLong("id");
-               m.id = id == 0 ? null : id;
+               m.id = optLong(o, "id");
                m.user = UserDTO.get(o.optJSONObject("user"));
                return m;
        }

Modified: 
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java?rev=1780097&r1=1780096&r2=1780097&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
 Tue Jan 24 17:38:20 2017
@@ -19,6 +19,9 @@
 package org.apache.openmeetings.db.dto.room;
 
 import static org.apache.openmeetings.db.dto.room.RoomOptionsDTO.optInt;
+import static org.apache.openmeetings.db.util.DtoHelper.optEnum;
+import static org.apache.openmeetings.db.util.DtoHelper.optEnumList;
+import static org.apache.openmeetings.db.util.DtoHelper.optLong;
 
 import java.io.Serializable;
 import java.util.ArrayList;
@@ -287,11 +290,10 @@ public class RoomDTO implements Serializ
                        return null;
                }
                RoomDTO r = new RoomDTO();
-               long id = o.optLong("id");
-               r.id = id == 0 ? null : id;
+               r.id = optLong(o, "id");
                r.name = o.optString("name");
                r.comment = o.optString("comment");
-               r.type = Room.Type.valueOf(o.getString("type"));
+               r.type = optEnum(Room.Type.class, o, "type");
                r.numberOfPartizipants = o.optLong("numberOfPartizipants", 4);
                r.appointment = o.optBoolean("appointment", false);
                r.confno = o.optString("confno");
@@ -307,13 +309,7 @@ public class RoomDTO implements Serializ
                r.allowRecording = o.optBoolean("allowRecording", false);
                r.waitForRecording = o.optBoolean("waitForRecording", false);
                r.audioOnly = o.optBoolean("audioOnly", false);
-               r.setHiddenElements(new HashSet<RoomElement>());
-               JSONArray hidden = o.optJSONArray("hiddenElements");
-               if (hidden != null) {
-                       for (int i = 0; i < hidden.length(); ++i) {
-                               
r.getHiddenElements().add(RoomElement.valueOf(hidden.getString(i)));
-                       }
-               }
+               r.getHiddenElements().addAll(optEnumList(RoomElement.class, 
o.optJSONArray("hiddenElements")));
                return r;
        }
 


Reply via email to