Hello Sebastian,

I'm afraid we need something like "lightweight RoomClient" in the DB to
resolve 3)
This can be done without performance degradation.
I see no other way to get the number of users.

On Wed, Oct 24, 2012 at 3:31 PM, [email protected] <
[email protected]> wrote:

> 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]
>



-- 
WBR
Maxim aka solomax

Reply via email to