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
