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

Reply via email to