So will we find a consens here? :)

1) No DB query in Sync methods to keep performance up
2) Session objects should not stay in a database but in memory
3) To have the number of users per server instance there is no need to have
the RoomClient in the database.

Can we find a consens based on those resolutions?

Sebastian

2012/10/22 [email protected] <[email protected]>

> Practically in this case you would have to iterate thorugh the connection.
> You could also call IConnection => getConnection => getSize.
> This would give a rough idea. But as you don't know how many of those
> connection are screensharing or Audio/Video you can't tell how many users
> exactly there are.
>
> If you want to share this information with others I would suggest you
> simply add a SOAP/REST call and in that sense query the number of users via
> a HTTP call.
>
>
> Sebastian
>
> 2012/10/22 Maxim Solodovnik <[email protected]>
>
>> If I remember correctly I have added RoomClient to the DB since I need
>> mechanism to retrieve how much users are currently in the room.
>>
>>
>> On Mon, Oct 22, 2012 at 3:23 PM, [email protected] <
>> [email protected]> wrote:
>>
>>> We could even store it currently in the IConnection. The Red5 framework
>>> has the similar mechanism like the static Map that I've build.
>>>
>>> We will also stay with our Red5 implementation for the next 6 months as
>>> we have no alternative to stream audio/video in HTML5.
>>>
>>> It is no option to stay with it, how can we offer OpenMeetings to be
>>> scalable to 1000 concurrent users? We would have to limit it to 250. Also
>>> it would become mandatory to have the database server on the same machine
>>> as the red5 server. Otherwise you have performance bottlenecks. Can you
>>> imagine what kind of negative public feedback we will have if every
>>> question about performance of red5 is answered with: Did you install db
>>> server on another instance of your network?
>>>
>>> Sorry but it is not possible. Also not for a temporary solution. We
>>> can't sell this product like that and claim to have 1000 user sessions per
>>> server unit.
>>>
>>> What requirements do exist to store the RoomClient in the database and
>>> what is needed to be done to remove it from the db again?
>>>
>>>
>>> Sebastian
>>>
>>> 2012/10/22 Maxim Solodovnik <[email protected]>
>>>
>>>> OK, I'm not insist. I believe RoomClient will be removed in the future.
>>>>
>>>>
>>>> On Mon, Oct 22, 2012 at 3:00 PM, [email protected] <
>>>> [email protected]> wrote:
>>>>
>>>>> Sorry but:
>>>>>
>>>>> for (RoomClient rc: allClient) {
>>>>>    if (rc.getPublicSID().equals(_publicSID) {
>>>>>       return rc;
>>>>>    }
>>>>> }
>>>>>
>>>>> That is simply not true.
>>>>> There are _some_ implementations where it was needed that you need to
>>>>> get the RoomClient by its public SID. However this usage was quite 
>>>>> limited.
>>>>>
>>>>> In general it was the way I described it:
>>>>> The maps key was the streamid. And the streamid was obtained from the
>>>>> IConnection of each stream.
>>>>>
>>>>>
>>>>> http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/remote/red5/ClientListManager.java?revision=1339514&view=markup
>>>>> Line 118, that was the function that was mainly in use all over the
>>>>> application.
>>>>> There is no sorting, there is no iteration => nothing.
>>>>>
>>>>> Search in the ScopeApplicationAdapter for "getClientByStreamId" => 52
>>>>> of matches.
>>>>> Every of this call is now replaced by a single DB query.
>>>>> And if you iterate like described through all connection (like it is
>>>>> in EVERY snyc method)
>>>>> You will do a single query for EVERY connection.
>>>>> Like 100 users in a room => 100 queries.
>>>>> Think about the green dot that blinks every time you speak in the
>>>>> video pod:
>>>>> If it gets visible => one sync message
>>>>> If its get transparent => one sync message.
>>>>> If you have a quite good and sensitive micro it will flush 10 mabye 10
>>>>> times per second.
>>>>> per 100 users in a room => 10 * 100 = 1000 queries in a SINGLE SECOND
>>>>> => that is just impossible !!
>>>>> And that is just a SINGLE videopod with 100 users watching. Now scale
>>>>> that up to 1000 concurrent rooms with  4x4 meetings where every user has
>>>>> micro turned on ?! Should we calc the number of database queries really?!
>>>>>
>>>>> Sorry we will not follow that route :)
>>>>>
>>>>> Sebastian
>>>>>
>>>>> 2012/10/22 Maxim Solodovnik <[email protected]>
>>>>>
>>>>>> Previous solution was:
>>>>>>
>>>>>> for (RoomClient rc: allClient) {
>>>>>>    if (rc.getPublicSID().equals(_publicSID) {
>>>>>>       return rc;
>>>>>>    }
>>>>>> }
>>>>>>
>>>>>> + screen sharing clients were filtered same way.
>>>>>> Right now we can filter all sessions with 1 query this is why the
>>>>>> code can work faster (after minor changes in iterating logic)
>>>>>>
>>>>>> I'm not insist RoomClient should be DB object. But having it as DB
>>>>>> object was the only option to have user count in the room (in case Rooms
>>>>>> are on the different servers).
>>>>>>
>>>>>> I believe right now org.apache.openmeetings.web.app.WebSession will
>>>>>> be session object.
>>>>>> I hope everything except audio and video will move to Wicket :)
>>>>>>
>>>>>>
>>>>>> On Mon, Oct 22, 2012 at 2:33 PM, [email protected] <
>>>>>> [email protected]> wrote:
>>>>>>
>>>>>>> Hi Maxim,
>>>>>>>
>>>>>>> you can't persist on the argumentation that a HashMap stored in the
>>>>>>> memory is slower then doing a single query for every entry of the map ?
>>>>>>> Basicaly the previous implementation was a single HashMap.
>>>>>>> Getting a RoomClient from this map was:
>>>>>>> map.get($streamId)
>>>>>>> and now this single line is replaced by a Database query. The
>>>>>>> performance of this single line  is ... I guess smaller then 1 
>>>>>>> millisecond.
>>>>>>> How can you say that a "Right now I think the current code should work
>>>>>>> faster or the same as previous one." :)
>>>>>>>
>>>>>>> I guess you had some other requirements that made you implement this.
>>>>>>> For example for the clustering solution.
>>>>>>> However I also persist on my view:
>>>>>>> A database is _not_ the right place for storing session variables.
>>>>>>> This is simply a bad design decision that will cost a lot of 
>>>>>>> performance in
>>>>>>> the future.
>>>>>>>
>>>>>>> Could you explain why there is a need for having the RoomClient in
>>>>>>> the database? Maybe we can resolve those requirements differently so 
>>>>>>> that
>>>>>>> we can have the RoomClient back in memory.
>>>>>>>
>>>>>>> Sebastian
>>>>>>>
>>>>>>>
>>>>>>> 2012/10/19 Maxim Solodovnik <[email protected]>
>>>>>>>
>>>>>>>> Sorry for double post.
>>>>>>>>
>>>>>>>> Correct me if I'm wrong, but i think "Transient for XML
>>>>>>>> export/import" is not necessary since it doesn't have @Element 
>>>>>>>> annotation
>>>>>>>> On Oct 19, 2012 9:59 PM, "Maxim Solodovnik" <[email protected]>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> RoomClient was mooved to the DB while I implemented cluster.
>>>>>>>>> Current changes only make the calls faster (since DB is quered
>>>>>>>>> only once)
>>>>>>>>>
>>>>>>>>> I'll try to create couple of tests. Right now I think the current
>>>>>>>>> code should work faster or the same as previous one.
>>>>>>>>>
>>>>>>>>> Old code did lots of full filterings of RommsClient hash map to
>>>>>>>>> get subset required.
>>>>>>>>>
>>>>>>>>> I tests will show I'm wrong on this I'll try to tune up openjpa
>>>>>>>>> cache and if it doesn't help will split RoomClient to the couple of 
>>>>>>>>> objects
>>>>>>>>> and/or will create hashtable in parallel to speed up things.
>>>>>>>>>
>>>>>>>>> But I hope everything is not so slow since these changes are
>>>>>>>>> present in 2.0 and nobody reports performance degradation.
>>>>>>>>>
>>>>>>>>> Sorry for typos, I'm from mobile phone
>>>>>>>>> On Oct 19, 2012 9:11 PM, "[email protected]" <
>>>>>>>>> [email protected]> wrote:
>>>>>>>>>
>>>>>>>>>> I guess this happened lately in trunk.
>>>>>>>>>> How are we the in the future planning to determine the current
>>>>>>>>>> users in the room.
>>>>>>>>>> Session or database based?
>>>>>>>>>>
>>>>>>>>>> I ask that critical as some queries require to sync messages to
>>>>>>>>>> all clients of a room.
>>>>>>>>>> This can happen 1000 times in a single second if you think about
>>>>>>>>>> having up to 1000 concurrent user sessions.
>>>>>>>>>>
>>>>>>>>>> For example:
>>>>>>>>>> ScopeApplicationAdapter::syncMessageToCurrentScope(String
>>>>>>>>>> remoteMethodName, Object newMessage, boolean sendSelf, boolean 
>>>>>>>>>> sendScreen)
>>>>>>>>>> => Collection<Set<IConnection>> conCollection = current.getScope()
>>>>>>>>>>                     .getConnections();
>>>>>>>>>> ==> iterates through all connection of the scope.
>>>>>>>>>>
>>>>>>>>>> Now the new thing is that for every connection you will create a
>>>>>>>>>> query for the RoomClient Object.
>>>>>>>>>> This is simply impossible.
>>>>>>>>>>
>>>>>>>>>> We want to scale up to 1000 concurrent user sessions and more.
>>>>>>>>>> The RoomClient is a typical Session object and it should stay in
>>>>>>>>>> the session.
>>>>>>>>>> It is the same issue like with the WhiteboardObject.
>>>>>>>>>> We are making a real time application, there is no chance to run
>>>>>>>>>> queries in sync methods.
>>>>>>>>>>
>>>>>>>>>> Can we find some consens here? I know you must have refactored
>>>>>>>>>> already a lot but I strictly did implement zero db related stuff in 
>>>>>>>>>> sync
>>>>>>>>>> methods.
>>>>>>>>>>
>>>>>>>>>> There might be a chance for some events to trigger db
>>>>>>>>>> actions.However I don't think having two times the RoomClient stored 
>>>>>>>>>> (one
>>>>>>>>>> time session, second time database) makes sense.
>>>>>>>>>>
>>>>>>>>>> What are you thoughts on this?
>>>>>>>>>>
>>>>>>>>>> Sebastian
>>>>>>>>>>
>>>>>>>>>> 2012/10/19 [email protected] <[email protected]>
>>>>>>>>>>
>>>>>>>>>>> Hi Maxim,
>>>>>>>>>>>
>>>>>>>>>>> I don't understand this new code in the Rooms Entity:
>>>>>>>>>>>     @OneToMany(fetch = FetchType.LAZY)
>>>>>>>>>>>
>>>>>>>>>>>     @JoinColumn(name = "room_id")
>>>>>>>>>>>     private List<RoomClient> currentusers;
>>>>>>>>>>>
>>>>>>>>>>> We calc the current users online by iterating through the Red5
>>>>>>>>>>> Connections.
>>>>>>>>>>> In which OpenMeetings version was it changed?
>>>>>>>>>>>
>>>>>>>>>>> I guess you can set it Transient for XML export/import. So maybe
>>>>>>>>>>> annotate it with:
>>>>>>>>>>> @org.simpleframework.xml.Transient
>>>>>>>>>>> same like roomOrganisations.
>>>>>>>>>>>
>>>>>>>>>>> Sebastian
>>>>>>>>>>>
>>>>>>>>>>> 2012/10/19 <[email protected]>
>>>>>>>>>>>
>>>>>>>>>>>  Author: solomax
>>>>>>>>>>>> Date: Fri Oct 19 12:39:38 2012
>>>>>>>>>>>> New Revision: 1400075
>>>>>>>>>>>>
>>>>>>>>>>>> URL: http://svn.apache.org/viewvc?rev=1400075&view=rev
>>>>>>>>>>>> Log:
>>>>>>>>>>>> Wicket: calendar form is improved
>>>>>>>>>>>>
>>>>>>>>>>>> Modified:
>>>>>>>>>>>>
>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/RoomDAO.java
>>>>>>>>>>>>
>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/rooms/Rooms.java
>>>>>>>>>>>>
>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarForm.java
>>>>>>>>>>>>
>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarPanel.html
>>>>>>>>>>>>
>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarPanel.java
>>>>>>>>>>>>
>>>>>>>>>>>> Modified:
>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/RoomDAO.java
>>>>>>>>>>>> URL:
>>>>>>>>>>>> http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/RoomDAO.java?rev=1400075&r1=1400074&r2=1400075&view=diff
>>>>>>>>>>>>
>>>>>>>>>>>> ==============================================================================
>>>>>>>>>>>> ---
>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/RoomDAO.java
>>>>>>>>>>>> (original)
>>>>>>>>>>>> +++
>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/RoomDAO.java
>>>>>>>>>>>> Fri Oct 19 12:39:38 2012
>>>>>>>>>>>> @@ -76,6 +76,24 @@ public class RoomDAO implements OmDAO<Ro
>>>>>>>>>>>>                 return q.getSingleResult();
>>>>>>>>>>>>         }
>>>>>>>>>>>>
>>>>>>>>>>>> +       public List<Rooms> getPublicRooms() {
>>>>>>>>>>>> +               //TypedQuery<Rooms> q =
>>>>>>>>>>>> em.createNamedQuery("getNondeletedRooms", Rooms.class);
>>>>>>>>>>>> +               TypedQuery<Rooms> q = em.createQuery(
>>>>>>>>>>>> +                               "SELECT r from Rooms r LEFT
>>>>>>>>>>>> JOIN FETCH r.currentusers WHERE r.ispublic= true and r.deleted= 
>>>>>>>>>>>> false ORDER
>>>>>>>>>>>> BY r.name ASC", Rooms.class);
>>>>>>>>>>>> +               return q.getResultList();
>>>>>>>>>>>> +       }
>>>>>>>>>>>> +
>>>>>>>>>>>> +       public List<Rooms> getOrganisationRooms(long orgId) {
>>>>>>>>>>>> +               TypedQuery<Rooms> q = em.createQuery(
>>>>>>>>>>>> +                               "SELECT DISTINCT c.room FROM
>>>>>>>>>>>> Rooms_Organisation c LEFT JOIN FETCH c.room LEFT JOIN FETCH
>>>>>>>>>>>> c.room.currentusers "
>>>>>>>>>>>> +               + "WHERE c.organisation.organisation_id =
>>>>>>>>>>>> :orgId "
>>>>>>>>>>>> +               + "AND c.deleted = false AND c.room.deleted =
>>>>>>>>>>>> false "
>>>>>>>>>>>> +               + "AND c.organisation.deleted = false "
>>>>>>>>>>>> +               + "ORDER BY c.room.name ASC", Rooms.class);
>>>>>>>>>>>> +               q.setParameter("orgId", orgId);
>>>>>>>>>>>> +               return q.getResultList();
>>>>>>>>>>>> +       }
>>>>>>>>>>>> +
>>>>>>>>>>>>         public Rooms update(Rooms entity, long userId) {
>>>>>>>>>>>>                 if (entity.getRooms_id() == null) {
>>>>>>>>>>>>                 /* Red5SIP integration
>>>>>>>>>>>> *******************************************************************************/
>>>>>>>>>>>>
>>>>>>>>>>>> Modified:
>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/rooms/Rooms.java
>>>>>>>>>>>> URL:
>>>>>>>>>>>> http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/rooms/Rooms.java?rev=1400075&r1=1400074&r2=1400075&view=diff
>>>>>>>>>>>>
>>>>>>>>>>>> ==============================================================================
>>>>>>>>>>>> ---
>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/rooms/Rooms.java
>>>>>>>>>>>> (original)
>>>>>>>>>>>> +++
>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/rooms/Rooms.java
>>>>>>>>>>>> Fri Oct 19 12:39:38 2012
>>>>>>>>>>>> @@ -38,7 +38,6 @@ import javax.persistence.NamedQuery;
>>>>>>>>>>>>  import javax.persistence.OneToMany;
>>>>>>>>>>>>  import javax.persistence.OneToOne;
>>>>>>>>>>>>  import javax.persistence.Table;
>>>>>>>>>>>> -import javax.persistence.Transient;
>>>>>>>>>>>>
>>>>>>>>>>>>  import org.apache.openjpa.persistence.ElementDependent;
>>>>>>>>>>>>  import org.apache.openmeetings.persistence.beans.OmEntity;
>>>>>>>>>>>> @@ -69,7 +68,6 @@ public class Rooms implements Serializab
>>>>>>>>>>>>         private String name;
>>>>>>>>>>>>
>>>>>>>>>>>>         @Lob
>>>>>>>>>>>> -       // @Basic(fetch=FetchType.LAZY)
>>>>>>>>>>>>         @Column(name = "comment_field")
>>>>>>>>>>>>         @Element(data = true, required = false)
>>>>>>>>>>>>         private String comment;
>>>>>>>>>>>> @@ -217,10 +215,8 @@ public class Rooms implements Serializab
>>>>>>>>>>>>         @org.simpleframework.xml.Transient
>>>>>>>>>>>>         private List<Rooms_Organisation> roomOrganisations =
>>>>>>>>>>>> new ArrayList<Rooms_Organisation>();
>>>>>>>>>>>>
>>>>>>>>>>>> -       /*
>>>>>>>>>>>> -        * Non persistent attributes
>>>>>>>>>>>> -        */
>>>>>>>>>>>> -       @Transient
>>>>>>>>>>>> +       @OneToMany(fetch = FetchType.LAZY)
>>>>>>>>>>>> +       @JoinColumn(name = "room_id")
>>>>>>>>>>>>         private List<RoomClient> currentusers;
>>>>>>>>>>>>
>>>>>>>>>>>>         public String getComment() {
>>>>>>>>>>>>
>>>>>>>>>>>> Modified:
>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarForm.java
>>>>>>>>>>>> URL:
>>>>>>>>>>>> http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarForm.java?rev=1400075&r1=1400074&r2=1400075&view=diff
>>>>>>>>>>>>
>>>>>>>>>>>> ==============================================================================
>>>>>>>>>>>> ---
>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarForm.java
>>>>>>>>>>>> (original)
>>>>>>>>>>>> +++
>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarForm.java
>>>>>>>>>>>> Fri Oct 19 12:39:38 2012
>>>>>>>>>>>> @@ -18,14 +18,36 @@
>>>>>>>>>>>>   */
>>>>>>>>>>>>  package org.apache.openmeetings.web.components.user.calendar;
>>>>>>>>>>>>
>>>>>>>>>>>> +import java.util.ArrayList;
>>>>>>>>>>>> +import java.util.List;
>>>>>>>>>>>> +
>>>>>>>>>>>> +import
>>>>>>>>>>>> org.apache.openmeetings.data.calendar.daos.AppointmentReminderTypDaoImpl;
>>>>>>>>>>>> +import org.apache.openmeetings.data.conference.RoomDAO;
>>>>>>>>>>>> +import org.apache.openmeetings.data.conference.Roommanagement;
>>>>>>>>>>>> +import org.apache.openmeetings.data.user.dao.UsersDaoImpl;
>>>>>>>>>>>>  import
>>>>>>>>>>>> org.apache.openmeetings.persistence.beans.calendar.Appointment;
>>>>>>>>>>>> +import
>>>>>>>>>>>> org.apache.openmeetings.persistence.beans.calendar.AppointmentReminderTyps;
>>>>>>>>>>>> +import
>>>>>>>>>>>> org.apache.openmeetings.persistence.beans.domain.Organisation_Users;
>>>>>>>>>>>> +import
>>>>>>>>>>>> org.apache.openmeetings.persistence.beans.rooms.RoomTypes;
>>>>>>>>>>>> +import org.apache.openmeetings.persistence.beans.rooms.Rooms;
>>>>>>>>>>>> +import org.apache.openmeetings.web.app.Application;
>>>>>>>>>>>> +import org.apache.openmeetings.web.app.WebSession;
>>>>>>>>>>>> +import org.apache.wicket.ajax.AjaxRequestTarget;
>>>>>>>>>>>> +import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox;
>>>>>>>>>>>> +import org.apache.wicket.extensions.yui.calendar.DateTimeField;
>>>>>>>>>>>> +import org.apache.wicket.markup.html.form.ChoiceRenderer;
>>>>>>>>>>>> +import org.apache.wicket.markup.html.form.DropDownChoice;
>>>>>>>>>>>>  import org.apache.wicket.markup.html.form.Form;
>>>>>>>>>>>> +import org.apache.wicket.markup.html.form.PasswordTextField;
>>>>>>>>>>>>  import org.apache.wicket.markup.html.form.RequiredTextField;
>>>>>>>>>>>>  import org.apache.wicket.markup.html.form.TextArea;
>>>>>>>>>>>> +import org.apache.wicket.markup.html.form.TextField;
>>>>>>>>>>>>  import org.apache.wicket.model.IModel;
>>>>>>>>>>>> +import org.apache.wicket.model.PropertyModel;
>>>>>>>>>>>>
>>>>>>>>>>>>  public class CalendarForm extends Form<Appointment> {
>>>>>>>>>>>>         private static final long serialVersionUID =
>>>>>>>>>>>> -1764738237821487526L;
>>>>>>>>>>>> +       private boolean createRoom = true;
>>>>>>>>>>>>
>>>>>>>>>>>>         public CalendarForm(String id, IModel<Appointment>
>>>>>>>>>>>> model) {
>>>>>>>>>>>>                 super(id, model);
>>>>>>>>>>>> @@ -33,5 +55,71 @@ public class CalendarForm extends Form<A
>>>>>>>>>>>>
>>>>>>>>>>>>                 add(new
>>>>>>>>>>>> RequiredTextField<String>("appointmentName"));
>>>>>>>>>>>>                 add(new
>>>>>>>>>>>> TextArea<String>("appointmentDescription"));
>>>>>>>>>>>> +               add(new
>>>>>>>>>>>> TextField<String>("appointmentLocation"));
>>>>>>>>>>>> +               add(new DateTimeField("appointmentStarttime"));
>>>>>>>>>>>> +               add(new DateTimeField("appointmentEndtime"));
>>>>>>>>>>>> +               final PasswordTextField pwd = new
>>>>>>>>>>>> PasswordTextField("password");
>>>>>>>>>>>> +               pwd.setEnabled(isPwdProtected());
>>>>>>>>>>>> +               pwd.setOutputMarkupId(true);
>>>>>>>>>>>> +               add(pwd);
>>>>>>>>>>>> +
>>>>>>>>>>>> +               add(new DropDownChoice<AppointmentReminderTyps>(
>>>>>>>>>>>> +                               "remind"
>>>>>>>>>>>> +                               ,
>>>>>>>>>>>> Application.getBean(AppointmentReminderTypDaoImpl.class).getAppointmentReminderTypList()
>>>>>>>>>>>> +                               , new
>>>>>>>>>>>> ChoiceRenderer<AppointmentReminderTyps>("name", "typId")));
>>>>>>>>>>>> +
>>>>>>>>>>>> +               final DropDownChoice<RoomTypes> roomType = new
>>>>>>>>>>>> DropDownChoice<RoomTypes>(
>>>>>>>>>>>> +                               "room.roomtype"
>>>>>>>>>>>> +                               ,
>>>>>>>>>>>> Application.getBean(Roommanagement.class).getAllRoomTypes()
>>>>>>>>>>>> +                               , new
>>>>>>>>>>>> ChoiceRenderer<RoomTypes>("name", "roomtypes_id"));
>>>>>>>>>>>> +               roomType.setEnabled(createRoom);
>>>>>>>>>>>> +               roomType.setOutputMarkupId(true);
>>>>>>>>>>>> +               add(roomType);
>>>>>>>>>>>> +
>>>>>>>>>>>> +               final DropDownChoice<Rooms> room = new
>>>>>>>>>>>> DropDownChoice<Rooms>(
>>>>>>>>>>>> +                               "room"
>>>>>>>>>>>> +                               , getRoomList()
>>>>>>>>>>>> +                               , new
>>>>>>>>>>>> ChoiceRenderer<Rooms>("name", "rooms_id"));
>>>>>>>>>>>> +               room.setEnabled(!createRoom);
>>>>>>>>>>>> +               room.setOutputMarkupId(true);
>>>>>>>>>>>> +               add(room);
>>>>>>>>>>>> +
>>>>>>>>>>>> +               add(new AjaxCheckBox("createRoom", new
>>>>>>>>>>>> PropertyModel<Boolean>(this, "createRoom")) {
>>>>>>>>>>>> +                       private static final long
>>>>>>>>>>>> serialVersionUID = -3743113990890386035L;
>>>>>>>>>>>> +
>>>>>>>>>>>> +                       @Override
>>>>>>>>>>>> +                       protected void
>>>>>>>>>>>> onUpdate(AjaxRequestTarget target) {
>>>>>>>>>>>> +                               createRoom =
>>>>>>>>>>>> getConvertedInput();
>>>>>>>>>>>> +
>>>>>>>>>>>> target.add(roomType.setEnabled(createRoom), 
>>>>>>>>>>>> room.setEnabled(!createRoom));
>>>>>>>>>>>> +                       }
>>>>>>>>>>>> +               });
>>>>>>>>>>>> +               add(new AjaxCheckBox("isPasswordProtected") {
>>>>>>>>>>>> +                       private static final long
>>>>>>>>>>>> serialVersionUID = 6041200584296439976L;
>>>>>>>>>>>> +
>>>>>>>>>>>> +                       @Override
>>>>>>>>>>>> +                       protected void
>>>>>>>>>>>> onUpdate(AjaxRequestTarget target) {
>>>>>>>>>>>> +
>>>>>>>>>>>> CalendarForm.this.getModelObject().setIsPasswordProtected(getConvertedInput());
>>>>>>>>>>>> +
>>>>>>>>>>>> pwd.setEnabled(isPwdProtected());
>>>>>>>>>>>> +                               target.add(pwd);
>>>>>>>>>>>> +                       }
>>>>>>>>>>>> +               });
>>>>>>>>>>>> +       }
>>>>>>>>>>>> +
>>>>>>>>>>>> +       private boolean isPwdProtected() {
>>>>>>>>>>>> +               return
>>>>>>>>>>>> Boolean.TRUE.equals(getModelObject().getIsPasswordProtected());
>>>>>>>>>>>> +       }
>>>>>>>>>>>> +
>>>>>>>>>>>> +       private List<Rooms> getRoomList() {
>>>>>>>>>>>> +               //FIXME need to be reviewed
>>>>>>>>>>>> +               List<Rooms> result = new ArrayList<Rooms>();
>>>>>>>>>>>> +               RoomDAO dao =
>>>>>>>>>>>> Application.getBean(RoomDAO.class);
>>>>>>>>>>>> +               result.addAll(dao.getPublicRooms());
>>>>>>>>>>>> +               for (Organisation_Users ou :
>>>>>>>>>>>> Application.getBean(UsersDaoImpl.class).get(WebSession.getUserId()).getOrganisation_users())
>>>>>>>>>>>> {
>>>>>>>>>>>> +
>>>>>>>>>>>> result.addAll(dao.getOrganisationRooms(ou.getOrganisation().getOrganisation_id()));
>>>>>>>>>>>> +               }
>>>>>>>>>>>> +               if (getModelObject().getRoom() != null &&
>>>>>>>>>>>> getModelObject().getRoom().getAppointment()) { //FIXME review
>>>>>>>>>>>> +                       result.add(getModelObject().getRoom());
>>>>>>>>>>>> +               }
>>>>>>>>>>>> +               return result;
>>>>>>>>>>>>         }
>>>>>>>>>>>>  }
>>>>>>>>>>>>
>>>>>>>>>>>> Modified:
>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarPanel.html
>>>>>>>>>>>> URL:
>>>>>>>>>>>> http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarPanel.html?rev=1400075&r1=1400074&r2=1400075&view=diff
>>>>>>>>>>>>
>>>>>>>>>>>> ==============================================================================
>>>>>>>>>>>> ---
>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarPanel.html
>>>>>>>>>>>> (original)
>>>>>>>>>>>> +++
>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarPanel.html
>>>>>>>>>>>> Fri Oct 19 12:39:38 2012
>>>>>>>>>>>> @@ -71,7 +71,7 @@
>>>>>>>>>>>>                                 $('#appointment').dialog({
>>>>>>>>>>>>                                         closeOnEscape: true
>>>>>>>>>>>>                                         , resizable: true
>>>>>>>>>>>> -                                       , width: 400
>>>>>>>>>>>> +                                       , width: 450
>>>>>>>>>>>>                                         , autoOpen: false
>>>>>>>>>>>>                                         , modal: true
>>>>>>>>>>>>                                 });
>>>>>>>>>>>> @@ -89,53 +89,55 @@
>>>>>>>>>>>>
>>>>>>>>>>>> <td><wicket:ommessage key="572" /></td>
>>>>>>>>>>>>                                                 <td><input
>>>>>>>>>>>> type="text" wicket:id="appointmentName" /></td>
>>>>>>>>>>>>                                         </tr>
>>>>>>>>>>>> -                                       <!-- tr>
>>>>>>>>>>>> -                                               <td>&nbsp;</td>
>>>>>>>>>>>> -                                               <td>
>>>>>>>>>>>> -
>>>>>>>>>>>> <wicket:ommessage key="570" /><input type="text"
>>>>>>>>>>>> wicket:id="appointmentStarttime" />
>>>>>>>>>>>> -
>>>>>>>>>>>> <wicket:ommessage key="571" /><input type="text"
>>>>>>>>>>>> wicket:id="appointmentEndtime" />
>>>>>>>>>>>> -                                               </td>
>>>>>>>>>>>> +                                       <tr>
>>>>>>>>>>>> +
>>>>>>>>>>>> <td><wicket:ommessage key="570" /></td>
>>>>>>>>>>>> +                                               <td><span
>>>>>>>>>>>> wicket:id="appointmentStarttime"></span></td>
>>>>>>>>>>>> +                                       </tr>
>>>>>>>>>>>> +                                       <tr>
>>>>>>>>>>>> +
>>>>>>>>>>>> <td><wicket:ommessage key="571" /></td>
>>>>>>>>>>>> +                                               <td><span
>>>>>>>>>>>> wicket:id="appointmentEndtime"></span></td>
>>>>>>>>>>>>                                         </tr>
>>>>>>>>>>>>                                         <tr>
>>>>>>>>>>>>
>>>>>>>>>>>> <td><wicket:ommessage key="565" /></td>
>>>>>>>>>>>> -                                               <td><select
>>>>>>>>>>>> wicket:id="notification" ></select></td>
>>>>>>>>>>>> +                                               <td><select
>>>>>>>>>>>> wicket:id="remind" ></select></td>
>>>>>>>>>>>>                                         </tr>
>>>>>>>>>>>>                                         <tr>
>>>>>>>>>>>>                                                 <td
>>>>>>>>>>>> colspan="2"><input type="checkbox" wicket:id="createRoom"
>>>>>>>>>>>> /><wicket:ommessage key="1509" /></td>
>>>>>>>>>>>>                                         </tr>
>>>>>>>>>>>>                                         <tr>
>>>>>>>>>>>>
>>>>>>>>>>>> <td><wicket:ommessage key="619" /></td>
>>>>>>>>>>>> -                                               <td><select
>>>>>>>>>>>> wicket:id="roomType" ></select></td>
>>>>>>>>>>>> +                                               <td><select
>>>>>>>>>>>> wicket:id="room.roomtype" ></select></td>
>>>>>>>>>>>>                                         </tr>
>>>>>>>>>>>>                                         <tr>
>>>>>>>>>>>>
>>>>>>>>>>>> <td><wicket:ommessage key="406" /></td>
>>>>>>>>>>>>                                                 <td><select
>>>>>>>>>>>> wicket:id="room" ></select></td>
>>>>>>>>>>>>                                         </tr>
>>>>>>>>>>>>                                         <tr>
>>>>>>>>>>>> -                                               <td
>>>>>>>>>>>> colspan="2"><input type="checkbox" wicket:id="isPasswordProtected"
>>>>>>>>>>>> /><wicket:ommessage key="1509" /></td>
>>>>>>>>>>>> +                                               <td
>>>>>>>>>>>> colspan="2"><input type="checkbox" wicket:id="isPasswordProtected"
>>>>>>>>>>>> /><wicket:ommessage key="524" /></td>
>>>>>>>>>>>>                                         </tr>
>>>>>>>>>>>>                                         <tr>
>>>>>>>>>>>>
>>>>>>>>>>>> <td><wicket:ommessage key="525" /></td>
>>>>>>>>>>>> -                                               <td><input
>>>>>>>>>>>> type="text" wicket:id="password" /></td>
>>>>>>>>>>>> +                                               <td><input
>>>>>>>>>>>> type="password" wicket:id="password" /></td>
>>>>>>>>>>>>                                         </tr>
>>>>>>>>>>>>                                         <tr>
>>>>>>>>>>>>                                                 <td
>>>>>>>>>>>> colspan="2"><wicket:ommessage key="1445" /></td>
>>>>>>>>>>>>                                         </tr>
>>>>>>>>>>>> +                                       <!--
>>>>>>>>>>>>                                         <tr>
>>>>>>>>>>>>
>>>>>>>>>>>> <td><wicket:ommessage key="803" /></td>
>>>>>>>>>>>>                                                 <td><select
>>>>>>>>>>>> wicket:id="meetingMember" ></select></td>
>>>>>>>>>>>> -                                       </tr>
>>>>>>>>>>>> +                                       </tr -->
>>>>>>>>>>>>                                         <tr>
>>>>>>>>>>>>
>>>>>>>>>>>> <td><wicket:ommessage key="569" /></td>
>>>>>>>>>>>>                                                 <td><input
>>>>>>>>>>>> type="text" wicket:id="appointmentLocation" /></td>
>>>>>>>>>>>> -                                       </tr-->
>>>>>>>>>>>> +                                       </tr>
>>>>>>>>>>>>                                         <tr>
>>>>>>>>>>>>
>>>>>>>>>>>> <td><wicket:ommessage key="573" /></td>
>>>>>>>>>>>> -                                               <td><input
>>>>>>>>>>>> type="text" wicket:id="appointmentDescription" /></td>
>>>>>>>>>>>> +                                               <td><textarea
>>>>>>>>>>>> wicket:id="appointmentDescription"></textarea></td>
>>>>>>>>>>>>                                         </tr>
>>>>>>>>>>>>                                         <!-- tr>
>>>>>>>>>>>>                                                 <td colspan="2"
>>>>>>>>>>>> style="text-align: right"><input type="button" wicket:id="save" 
>>>>>>>>>>>> /><input
>>>>>>>>>>>> type="button" wicket:id="cancel" /></td>
>>>>>>>>>>>> -                                       </tr-->
>>>>>>>>>>>> +                                       </tr -->
>>>>>>>>>>>>                                 </table>
>>>>>>>>>>>>                         </form>
>>>>>>>>>>>>                 </div>
>>>>>>>>>>>>
>>>>>>>>>>>> Modified:
>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarPanel.java
>>>>>>>>>>>> URL:
>>>>>>>>>>>> http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarPanel.java?rev=1400075&r1=1400074&r2=1400075&view=diff
>>>>>>>>>>>>
>>>>>>>>>>>> ==============================================================================
>>>>>>>>>>>> ---
>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarPanel.java
>>>>>>>>>>>> (original)
>>>>>>>>>>>> +++
>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarPanel.java
>>>>>>>>>>>> Fri Oct 19 12:39:38 2012
>>>>>>>>>>>> @@ -150,6 +150,9 @@ public class CalendarPanel extends UserP
>>>>>>>>>>>>                                 Calendar end =
>>>>>>>>>>>> WebSession.getCalendar();
>>>>>>>>>>>>
>>>>>>>>>>>> end.setTimeInMillis(getRequestCycle().getRequest().getRequestParameters().getParameterValue("_end").toLong());
>>>>>>>>>>>>
>>>>>>>>>>>> +                               if (start.equals(end)) {
>>>>>>>>>>>> +
>>>>>>>>>>>> end.add(Calendar.HOUR_OF_DAY, 1);
>>>>>>>>>>>> +                               }
>>>>>>>>>>>>                                 Appointment a = new
>>>>>>>>>>>> Appointment();
>>>>>>>>>>>>
>>>>>>>>>>>> a.setAppointmentStarttime(start.getTime());
>>>>>>>>>>>>
>>>>>>>>>>>> a.setAppointmentEndtime(end.getTime());
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> --
>>>>>>>>>>> Sebastian Wagner
>>>>>>>>>>> https://twitter.com/#!/dead_lock
>>>>>>>>>>> http://www.webbase-design.de
>>>>>>>>>>> http://www.wagner-sebastian.com
>>>>>>>>>>> [email protected]
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> Sebastian Wagner
>>>>>>>>>> https://twitter.com/#!/dead_lock
>>>>>>>>>> http://www.webbase-design.de
>>>>>>>>>> http://www.wagner-sebastian.com
>>>>>>>>>> [email protected]
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Sebastian Wagner
>>>>>>> https://twitter.com/#!/dead_lock
>>>>>>> http://www.webbase-design.de
>>>>>>> http://www.wagner-sebastian.com
>>>>>>> [email protected]
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> WBR
>>>>>> Maxim aka solomax
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Sebastian Wagner
>>>>> https://twitter.com/#!/dead_lock
>>>>> http://www.webbase-design.de
>>>>> http://www.wagner-sebastian.com
>>>>> [email protected]
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> WBR
>>>> Maxim aka solomax
>>>>
>>>
>>>
>>>
>>> --
>>> Sebastian Wagner
>>> https://twitter.com/#!/dead_lock
>>> http://www.webbase-design.de
>>> http://www.wagner-sebastian.com
>>> [email protected]
>>>
>>
>>
>>
>> --
>> WBR
>> Maxim aka solomax
>>
>
>
>
> --
> Sebastian Wagner
> https://twitter.com/#!/dead_lock
> http://www.webbase-design.de
> http://www.wagner-sebastian.com
> [email protected]
>



-- 
Sebastian Wagner
https://twitter.com/#!/dead_lock
http://www.webbase-design.de
http://www.wagner-sebastian.com
[email protected]

Reply via email to