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