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
