I'm afraid I never can get why do we need to perform RPC call (no matter by
client or by server) if we already have common DB and can use it.

DB can be used even if RoomClient is not DB Entity.

I still think that if code will be changed from
        for (Set<IConnection> conset : conCollection) {
            for (IConnection conn : conset) {
                if (conn != null) {
                    RoomClient rcl = this.clientListManager
                            .getClientByStreamId(conn
                                    .getClient().getId());
                    if (rcl == null) {
                        // continue;
                    } else if (rcl.getIsScreenClient() != null
                            && rcl.getIsScreenClient()) {
                        // continue;
                    } else {
                        if (!streamid.equals(rcl.getStreamid())) {
                            // do staff here
                        }
                    }
                }
            }
        }


to:
for (RoomClient rc : clientListManager.getClientListByRoom(roomId)) {
      // do same staff here
}

we will have
1) only one DB call per broadcast
2) 1 loop instead 2 nested loops
3) no 3 level filtering inside second loop


To implement your solution and remove RoomClient from DB, I propose the
following:
1) remove RoomClient from DB
2) add RoomAttendee Entity to the DB (it will contain minimal attendee info
and will be queried only to get room clients and their basic info while
getting list of users currently in room)

Is it OK?

On Fri, Oct 26, 2012 at 2:11 PM, [email protected] <
[email protected]> wrote:

> Now userC opens OM installed on serverA
> => userC asks for the list of rooms including the number of users.
> The server side will calc the users per room. Either by calculating the
> rooms locally, or by perrforming a RPC call to the connected server to get
> the list of current usercount per room.
> userC will only peform a single call, server might do mulitple calls to
> calc the usercount, but it sends back a single answer.
> So there is no multiple calls needed.
> For a future iteration we might also think about a master slave principle
> where the slave always automatically pushes current usercount to the
> master, so there is no need for the master to ask for the usercount.
>
> However for the time being I think it is acceptable, with a scenario of
> 2-3 servers in the cluster such a RPC call might take 2 seconds longer then
> currently, but I think that is ok for now.
>
> Sebastian
>
>
> 2012/10/26 Maxim Solodovnik <[email protected]>
>
>> Hello Sebastian,
>>
>> Imagine the following situation:
>> We have 2 servers: serverA and serverB, both have OM installed with same
>> DB
>> We have 2 rooms: roomA (assigned to serverA) and roomB (assigned to
>> serverB) each have 10 active users in it right now
>>
>> Now userC opens OM installed on serverA
>> In the list of rooms he can see roomA (user count can be get by counting
>> connections) and roomB (no user count)
>>
>> performing RTMP call from client to both server seems to be possible but
>> complicated solution for the LZX client, but it seems to
>> me unacceptable for the wicket client.
>>
>>
>>
>> On Wed, Oct 24, 2012 at 5:13 PM, [email protected] <
>> [email protected]> wrote:
>>
>>> How do you handle rooms in general in that solution, is a single room
>>> always on the same server instance.
>>> Or in other words:
>>> Can it happens that two users are in the same room but on different
>>> servers?
>>> Cause from my point of view that is impossible.
>>> You can't stream a video from server instance 1 and from instance 2 at
>>> the same time.
>>> So users of a one room are always on the same server.
>>> That should also make the calculation easier.
>>>
>>> The other point is of course you will have to write a script that will
>>> collect the number of users per room from all server instances and then
>>> calculate the sum of it.
>>> I would collect this on the server side and then give the client just
>>> the result of it. For the client it would look like a single RPC call,
>>> while on server side, the server asks each instance for its usage
>>> numbers/statistics.
>>>
>>>
>>> Sebastian
>>>
>>> 2012/10/24 Maxim Solodovnik <[email protected]>
>>>
>>>> If there is only 1 server - all your solutions will work.
>>>> But imaging we have 2 servers. Each have its own room full of clients.
>>>>
>>>> Now User enters server1 and would like to see how much users in each
>>>> room.
>>>> But it is impossible since server1 only have connections/roomClients
>>>> only for 1 server, and have no information regarding second one.
>>>>
>>>>
>>>> On Wed, Oct 24, 2012 at 4:32 PM, [email protected] <
>>>> [email protected]> wrote:
>>>>
>>>>> *I see no other way to get the number of users (per server)*
>>>>> => There are at least three alternative ways to get this number:
>>>>> a) You count the number of connection of a certain scope and then take
>>>>> the sum of it
>>>>> This will give you the total number of connections, no matter if
>>>>> audio/video, conferencing or a screensharing connection.
>>>>> b) You count the total number of RoomClients from the current session
>>>>> This will give you the total number of connections, no matter if
>>>>> audio/video, conferencing or a screensharing connection.
>>>>> c) You count the total number of RoomClients from the current session,
>>>>> but you filter the result based on if the RoomClient is a Audio/Video
>>>>> client or a Screensharing client
>>>>> With this method you would be able to calc the exact number of
>>>>> Audio/Video connection
>>>>>
>>>>> Which of those would fit yours?
>>>>> Or did I misunderstood something?
>>>>>
>>>>> Sebastian
>>>>>
>>>>>
>>>>> 2012/10/24 Maxim Solodovnik <[email protected]>
>>>>>
>>>>>> Hello Sebastian,
>>>>>>
>>>>>> I'm afraid we need something like "lightweight RoomClient" in the DB
>>>>>> to resolve 3)
>>>>>> This can be done without performance degradation.
>>>>>> I see no other way to get the number of users.
>>>>>>
>>>>>> On Wed, Oct 24, 2012 at 3:31 PM, [email protected] <
>>>>>> [email protected]> wrote:
>>>>>>
>>>>>>> So will we find a consens here? :)
>>>>>>>
>>>>>>> 1) No DB query in Sync methods to keep performance up
>>>>>>> 2) Session objects should not stay in a database but in memory
>>>>>>> 3) To have the number of users per server instance there is no need
>>>>>>> to have the RoomClient in the database.
>>>>>>>
>>>>>>> Can we find a consens based on those resolutions?
>>>>>>>
>>>>>>> Sebastian
>>>>>>>
>>>>>>> 2012/10/22 [email protected] <[email protected]>
>>>>>>>
>>>>>>> Practically in this case you would have to iterate thorugh the
>>>>>>>> connection.
>>>>>>>> You could also call IConnection => getConnection => getSize.
>>>>>>>> This would give a rough idea. But as you don't know how many of
>>>>>>>> those connection are screensharing or Audio/Video you can't tell how 
>>>>>>>> many
>>>>>>>> users exactly there are.
>>>>>>>>
>>>>>>>> If you want to share this information with others I would suggest
>>>>>>>> you simply add a SOAP/REST call and in that sense query the number of 
>>>>>>>> users
>>>>>>>> via a HTTP call.
>>>>>>>>
>>>>>>>>
>>>>>>>> Sebastian
>>>>>>>>
>>>>>>>> 2012/10/22 Maxim Solodovnik <[email protected]>
>>>>>>>>
>>>>>>>>> If I remember correctly I have added RoomClient to the DB since I
>>>>>>>>> need mechanism to retrieve how much users are currently in the room.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Mon, Oct 22, 2012 at 3:23 PM, [email protected] <
>>>>>>>>> [email protected]> wrote:
>>>>>>>>>
>>>>>>>>>> We could even store it currently in the IConnection. The Red5
>>>>>>>>>> framework has the similar mechanism like the static Map that I've 
>>>>>>>>>> build.
>>>>>>>>>>
>>>>>>>>>> We will also stay with our Red5 implementation for the next 6
>>>>>>>>>> months as we have no alternative to stream audio/video in HTML5.
>>>>>>>>>>
>>>>>>>>>> It is no option to stay with it, how can we offer OpenMeetings to
>>>>>>>>>> be scalable to 1000 concurrent users? We would have to limit it to 
>>>>>>>>>> 250.
>>>>>>>>>> Also it would become mandatory to have the database server on the 
>>>>>>>>>> same
>>>>>>>>>> machine as the red5 server. Otherwise you have performance 
>>>>>>>>>> bottlenecks. Can
>>>>>>>>>> you imagine what kind of negative public feedback we will have if 
>>>>>>>>>> every
>>>>>>>>>> question about performance of red5 is answered with: Did you install 
>>>>>>>>>> db
>>>>>>>>>> server on another instance of your network?
>>>>>>>>>>
>>>>>>>>>> Sorry but it is not possible. Also not for a temporary solution.
>>>>>>>>>> We can't sell this product like that and claim to have 1000 user 
>>>>>>>>>> sessions
>>>>>>>>>> per server unit.
>>>>>>>>>>
>>>>>>>>>> What requirements do exist to store the RoomClient in the
>>>>>>>>>> database and what is needed to be done to remove it from the db 
>>>>>>>>>> again?
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Sebastian
>>>>>>>>>>
>>>>>>>>>> 2012/10/22 Maxim Solodovnik <[email protected]>
>>>>>>>>>>
>>>>>>>>>>> OK, I'm not insist. I believe RoomClient will be removed in the
>>>>>>>>>>> future.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On Mon, Oct 22, 2012 at 3:00 PM, [email protected] <
>>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> Sorry but:
>>>>>>>>>>>>
>>>>>>>>>>>> for (RoomClient rc: allClient) {
>>>>>>>>>>>>    if (rc.getPublicSID().equals(_publicSID) {
>>>>>>>>>>>>       return rc;
>>>>>>>>>>>>    }
>>>>>>>>>>>> }
>>>>>>>>>>>>
>>>>>>>>>>>> That is simply not true.
>>>>>>>>>>>> There are _some_ implementations where it was needed that you
>>>>>>>>>>>> need to get the RoomClient by its public SID. However this usage 
>>>>>>>>>>>> was quite
>>>>>>>>>>>> limited.
>>>>>>>>>>>>
>>>>>>>>>>>> In general it was the way I described it:
>>>>>>>>>>>> The maps key was the streamid. And the streamid was obtained
>>>>>>>>>>>> from the IConnection of each stream.
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/remote/red5/ClientListManager.java?revision=1339514&view=markup
>>>>>>>>>>>> Line 118, that was the function that was mainly in use all over
>>>>>>>>>>>> the application.
>>>>>>>>>>>> There is no sorting, there is no iteration => nothing.
>>>>>>>>>>>>
>>>>>>>>>>>> Search in the ScopeApplicationAdapter for "getClientByStreamId"
>>>>>>>>>>>> => 52 of matches.
>>>>>>>>>>>> Every of this call is now replaced by a single DB query.
>>>>>>>>>>>> And if you iterate like described through all connection (like
>>>>>>>>>>>> it is in EVERY snyc method)
>>>>>>>>>>>> You will do a single query for EVERY connection.
>>>>>>>>>>>> Like 100 users in a room => 100 queries.
>>>>>>>>>>>> Think about the green dot that blinks every time you speak in
>>>>>>>>>>>> the video pod:
>>>>>>>>>>>> If it gets visible => one sync message
>>>>>>>>>>>> If its get transparent => one sync message.
>>>>>>>>>>>> If you have a quite good and sensitive micro it will flush 10
>>>>>>>>>>>> mabye 10 times per second.
>>>>>>>>>>>> per 100 users in a room => 10 * 100 = 1000 queries in a SINGLE
>>>>>>>>>>>> SECOND
>>>>>>>>>>>> => that is just impossible !!
>>>>>>>>>>>> And that is just a SINGLE videopod with 100 users watching. Now
>>>>>>>>>>>> scale that up to 1000 concurrent rooms with  4x4 meetings where 
>>>>>>>>>>>> every user
>>>>>>>>>>>> has micro turned on ?! Should we calc the number of database 
>>>>>>>>>>>> queries
>>>>>>>>>>>> really?!
>>>>>>>>>>>>
>>>>>>>>>>>> Sorry we will not follow that route :)
>>>>>>>>>>>>
>>>>>>>>>>>> Sebastian
>>>>>>>>>>>>
>>>>>>>>>>>> 2012/10/22 Maxim Solodovnik <[email protected]>
>>>>>>>>>>>>
>>>>>>>>>>>>> Previous solution was:
>>>>>>>>>>>>>
>>>>>>>>>>>>> for (RoomClient rc: allClient) {
>>>>>>>>>>>>>    if (rc.getPublicSID().equals(_publicSID) {
>>>>>>>>>>>>>       return rc;
>>>>>>>>>>>>>    }
>>>>>>>>>>>>> }
>>>>>>>>>>>>>
>>>>>>>>>>>>> + screen sharing clients were filtered same way.
>>>>>>>>>>>>> Right now we can filter all sessions with 1 query this is why
>>>>>>>>>>>>> the code can work faster (after minor changes in iterating logic)
>>>>>>>>>>>>>
>>>>>>>>>>>>> I'm not insist RoomClient should be DB object. But having it
>>>>>>>>>>>>> as DB object was the only option to have user count in the room 
>>>>>>>>>>>>> (in case
>>>>>>>>>>>>> Rooms are on the different servers).
>>>>>>>>>>>>>
>>>>>>>>>>>>> I believe right now org.apache.openmeetings.web.app.WebSession
>>>>>>>>>>>>> will be session object.
>>>>>>>>>>>>> I hope everything except audio and video will move to Wicket :)
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Mon, Oct 22, 2012 at 2:33 PM, [email protected] <
>>>>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>>> Hi Maxim,
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> you can't persist on the argumentation that a HashMap stored
>>>>>>>>>>>>>> in the memory is slower then doing a single query for every 
>>>>>>>>>>>>>> entry of the
>>>>>>>>>>>>>> map ?
>>>>>>>>>>>>>> Basicaly the previous implementation was a single HashMap.
>>>>>>>>>>>>>> Getting a RoomClient from this map was:
>>>>>>>>>>>>>> map.get($streamId)
>>>>>>>>>>>>>> and now this single line is replaced by a Database query. The
>>>>>>>>>>>>>> performance of this single line  is ... I guess smaller then 1 
>>>>>>>>>>>>>> millisecond.
>>>>>>>>>>>>>> How can you say that a "Right now I think the current code 
>>>>>>>>>>>>>> should work
>>>>>>>>>>>>>> faster or the same as previous one." :)
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I guess you had some other requirements that made you
>>>>>>>>>>>>>> implement this.
>>>>>>>>>>>>>> For example for the clustering solution.
>>>>>>>>>>>>>> However I also persist on my view:
>>>>>>>>>>>>>> A database is _not_ the right place for storing session
>>>>>>>>>>>>>> variables. This is simply a bad design decision that will cost a 
>>>>>>>>>>>>>> lot of
>>>>>>>>>>>>>> performance in the future.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Could you explain why there is a need for having the
>>>>>>>>>>>>>> RoomClient in the database? Maybe we can resolve those 
>>>>>>>>>>>>>> requirements
>>>>>>>>>>>>>> differently so that we can have the RoomClient back in memory.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Sebastian
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> 2012/10/19 Maxim Solodovnik <[email protected]>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Sorry for double post.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Correct me if I'm wrong, but i think "Transient for XML
>>>>>>>>>>>>>>> export/import" is not necessary since it doesn't have @Element 
>>>>>>>>>>>>>>> annotation
>>>>>>>>>>>>>>> On Oct 19, 2012 9:59 PM, "Maxim Solodovnik" <
>>>>>>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> RoomClient was mooved to the DB while I implemented cluster.
>>>>>>>>>>>>>>>> Current changes only make the calls faster (since DB is
>>>>>>>>>>>>>>>> quered only once)
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> I'll try to create couple of tests. Right now I think the
>>>>>>>>>>>>>>>> current code should work faster or the same as previous one.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Old code did lots of full filterings of RommsClient hash
>>>>>>>>>>>>>>>> map to get subset required.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> I tests will show I'm wrong on this I'll try to tune up
>>>>>>>>>>>>>>>> openjpa cache and if it doesn't help will split RoomClient to 
>>>>>>>>>>>>>>>> the couple of
>>>>>>>>>>>>>>>> objects and/or will create hashtable in parallel to speed up 
>>>>>>>>>>>>>>>> things.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> But I hope everything is not so slow since these changes
>>>>>>>>>>>>>>>> are present in 2.0 and nobody reports performance degradation.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Sorry for typos, I'm from mobile phone
>>>>>>>>>>>>>>>> On Oct 19, 2012 9:11 PM, "[email protected]" <
>>>>>>>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> I guess this happened lately in trunk.
>>>>>>>>>>>>>>>>> How are we the in the future planning to determine the
>>>>>>>>>>>>>>>>> current users in the room.
>>>>>>>>>>>>>>>>> Session or database based?
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> I ask that critical as some queries require to sync
>>>>>>>>>>>>>>>>> messages to all clients of a room.
>>>>>>>>>>>>>>>>> This can happen 1000 times in a single second if you think
>>>>>>>>>>>>>>>>> about having up to 1000 concurrent user sessions.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> For example:
>>>>>>>>>>>>>>>>> ScopeApplicationAdapter::syncMessageToCurrentScope(String
>>>>>>>>>>>>>>>>> remoteMethodName, Object newMessage, boolean sendSelf, 
>>>>>>>>>>>>>>>>> boolean sendScreen)
>>>>>>>>>>>>>>>>> => Collection<Set<IConnection>> conCollection =
>>>>>>>>>>>>>>>>> current.getScope()
>>>>>>>>>>>>>>>>>                     .getConnections();
>>>>>>>>>>>>>>>>> ==> iterates through all connection of the scope.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Now the new thing is that for every connection you will
>>>>>>>>>>>>>>>>> create a query for the RoomClient Object.
>>>>>>>>>>>>>>>>> This is simply impossible.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> We want to scale up to 1000 concurrent user sessions and
>>>>>>>>>>>>>>>>> more.
>>>>>>>>>>>>>>>>> The RoomClient is a typical Session object and it should
>>>>>>>>>>>>>>>>> stay in the session.
>>>>>>>>>>>>>>>>> It is the same issue like with the WhiteboardObject.
>>>>>>>>>>>>>>>>> We are making a real time application, there is no chance
>>>>>>>>>>>>>>>>> to run queries in sync methods.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Can we find some consens here? I know you must have
>>>>>>>>>>>>>>>>> refactored already a lot but I strictly did implement zero db 
>>>>>>>>>>>>>>>>> related stuff
>>>>>>>>>>>>>>>>> in sync methods.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> There might be a chance for some events to trigger db
>>>>>>>>>>>>>>>>> actions.However I don't think having two times the RoomClient 
>>>>>>>>>>>>>>>>> stored (one
>>>>>>>>>>>>>>>>> time session, second time database) makes sense.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> What are you thoughts on this?
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Sebastian
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> 2012/10/19 [email protected] <[email protected]>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Hi Maxim,
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> I don't understand this new code in the Rooms Entity:
>>>>>>>>>>>>>>>>>>     @OneToMany(fetch = FetchType.LAZY)
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>     @JoinColumn(name = "room_id")
>>>>>>>>>>>>>>>>>>     private List<RoomClient> currentusers;
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> We calc the current users online by iterating through the
>>>>>>>>>>>>>>>>>> Red5 Connections.
>>>>>>>>>>>>>>>>>> In which OpenMeetings version was it changed?
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> I guess you can set it Transient for XML export/import.
>>>>>>>>>>>>>>>>>> So maybe annotate it with:
>>>>>>>>>>>>>>>>>> @org.simpleframework.xml.Transient
>>>>>>>>>>>>>>>>>> same like roomOrganisations.
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Sebastian
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> 2012/10/19 <[email protected]>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>  Author: solomax
>>>>>>>>>>>>>>>>>>> Date: Fri Oct 19 12:39:38 2012
>>>>>>>>>>>>>>>>>>> New Revision: 1400075
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> URL: http://svn.apache.org/viewvc?rev=1400075&view=rev
>>>>>>>>>>>>>>>>>>> Log:
>>>>>>>>>>>>>>>>>>> Wicket: calendar form is improved
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Modified:
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/RoomDAO.java
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/rooms/Rooms.java
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarForm.java
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarPanel.html
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarPanel.java
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Modified:
>>>>>>>>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/RoomDAO.java
>>>>>>>>>>>>>>>>>>> URL:
>>>>>>>>>>>>>>>>>>> http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/RoomDAO.java?rev=1400075&r1=1400074&r2=1400075&view=diff
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> ==============================================================================
>>>>>>>>>>>>>>>>>>> ---
>>>>>>>>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/RoomDAO.java
>>>>>>>>>>>>>>>>>>> (original)
>>>>>>>>>>>>>>>>>>> +++
>>>>>>>>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/RoomDAO.java
>>>>>>>>>>>>>>>>>>> Fri Oct 19 12:39:38 2012
>>>>>>>>>>>>>>>>>>> @@ -76,6 +76,24 @@ public class RoomDAO implements
>>>>>>>>>>>>>>>>>>> OmDAO<Ro
>>>>>>>>>>>>>>>>>>>                 return q.getSingleResult();
>>>>>>>>>>>>>>>>>>>         }
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> +       public List<Rooms> getPublicRooms() {
>>>>>>>>>>>>>>>>>>> +               //TypedQuery<Rooms> q =
>>>>>>>>>>>>>>>>>>> em.createNamedQuery("getNondeletedRooms", Rooms.class);
>>>>>>>>>>>>>>>>>>> +               TypedQuery<Rooms> q = em.createQuery(
>>>>>>>>>>>>>>>>>>> +                               "SELECT r from Rooms r
>>>>>>>>>>>>>>>>>>> LEFT JOIN FETCH r.currentusers WHERE r.ispublic= true and 
>>>>>>>>>>>>>>>>>>> r.deleted= false
>>>>>>>>>>>>>>>>>>> ORDER BY r.name ASC", Rooms.class);
>>>>>>>>>>>>>>>>>>> +               return q.getResultList();
>>>>>>>>>>>>>>>>>>> +       }
>>>>>>>>>>>>>>>>>>> +
>>>>>>>>>>>>>>>>>>> +       public List<Rooms> getOrganisationRooms(long
>>>>>>>>>>>>>>>>>>> orgId) {
>>>>>>>>>>>>>>>>>>> +               TypedQuery<Rooms> q = em.createQuery(
>>>>>>>>>>>>>>>>>>> +                               "SELECT DISTINCT c.room
>>>>>>>>>>>>>>>>>>> FROM Rooms_Organisation c LEFT JOIN FETCH c.room LEFT JOIN 
>>>>>>>>>>>>>>>>>>> FETCH
>>>>>>>>>>>>>>>>>>> c.room.currentusers "
>>>>>>>>>>>>>>>>>>> +               + "WHERE c.organisation.organisation_id
>>>>>>>>>>>>>>>>>>> = :orgId "
>>>>>>>>>>>>>>>>>>> +               + "AND c.deleted = false AND
>>>>>>>>>>>>>>>>>>> c.room.deleted = false "
>>>>>>>>>>>>>>>>>>> +               + "AND c.organisation.deleted = false "
>>>>>>>>>>>>>>>>>>> +               + "ORDER BY c.room.name ASC",
>>>>>>>>>>>>>>>>>>> Rooms.class);
>>>>>>>>>>>>>>>>>>> +               q.setParameter("orgId", orgId);
>>>>>>>>>>>>>>>>>>> +               return q.getResultList();
>>>>>>>>>>>>>>>>>>> +       }
>>>>>>>>>>>>>>>>>>> +
>>>>>>>>>>>>>>>>>>>         public Rooms update(Rooms entity, long userId) {
>>>>>>>>>>>>>>>>>>>                 if (entity.getRooms_id() == null) {
>>>>>>>>>>>>>>>>>>>                 /* Red5SIP integration
>>>>>>>>>>>>>>>>>>> *******************************************************************************/
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Modified:
>>>>>>>>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/rooms/Rooms.java
>>>>>>>>>>>>>>>>>>> URL:
>>>>>>>>>>>>>>>>>>> http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/rooms/Rooms.java?rev=1400075&r1=1400074&r2=1400075&view=diff
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> ==============================================================================
>>>>>>>>>>>>>>>>>>> ---
>>>>>>>>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/rooms/Rooms.java
>>>>>>>>>>>>>>>>>>> (original)
>>>>>>>>>>>>>>>>>>> +++
>>>>>>>>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/rooms/Rooms.java
>>>>>>>>>>>>>>>>>>> Fri Oct 19 12:39:38 2012
>>>>>>>>>>>>>>>>>>> @@ -38,7 +38,6 @@ import javax.persistence.NamedQuery;
>>>>>>>>>>>>>>>>>>>  import javax.persistence.OneToMany;
>>>>>>>>>>>>>>>>>>>  import javax.persistence.OneToOne;
>>>>>>>>>>>>>>>>>>>  import javax.persistence.Table;
>>>>>>>>>>>>>>>>>>> -import javax.persistence.Transient;
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>  import org.apache.openjpa.persistence.ElementDependent;
>>>>>>>>>>>>>>>>>>>  import
>>>>>>>>>>>>>>>>>>> org.apache.openmeetings.persistence.beans.OmEntity;
>>>>>>>>>>>>>>>>>>> @@ -69,7 +68,6 @@ public class Rooms implements
>>>>>>>>>>>>>>>>>>> Serializab
>>>>>>>>>>>>>>>>>>>         private String name;
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>         @Lob
>>>>>>>>>>>>>>>>>>> -       // @Basic(fetch=FetchType.LAZY)
>>>>>>>>>>>>>>>>>>>         @Column(name = "comment_field")
>>>>>>>>>>>>>>>>>>>         @Element(data = true, required = false)
>>>>>>>>>>>>>>>>>>>         private String comment;
>>>>>>>>>>>>>>>>>>> @@ -217,10 +215,8 @@ public class Rooms implements
>>>>>>>>>>>>>>>>>>> Serializab
>>>>>>>>>>>>>>>>>>>         @org.simpleframework.xml.Transient
>>>>>>>>>>>>>>>>>>>         private List<Rooms_Organisation>
>>>>>>>>>>>>>>>>>>> roomOrganisations = new ArrayList<Rooms_Organisation>();
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> -       /*
>>>>>>>>>>>>>>>>>>> -        * Non persistent attributes
>>>>>>>>>>>>>>>>>>> -        */
>>>>>>>>>>>>>>>>>>> -       @Transient
>>>>>>>>>>>>>>>>>>> +       @OneToMany(fetch = FetchType.LAZY)
>>>>>>>>>>>>>>>>>>> +       @JoinColumn(name = "room_id")
>>>>>>>>>>>>>>>>>>>         private List<RoomClient> currentusers;
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>         public String getComment() {
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Modified:
>>>>>>>>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarForm.java
>>>>>>>>>>>>>>>>>>> URL:
>>>>>>>>>>>>>>>>>>> http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarForm.java?rev=1400075&r1=1400074&r2=1400075&view=diff
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> ==============================================================================
>>>>>>>>>>>>>>>>>>> ---
>>>>>>>>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarForm.java
>>>>>>>>>>>>>>>>>>> (original)
>>>>>>>>>>>>>>>>>>> +++
>>>>>>>>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarForm.java
>>>>>>>>>>>>>>>>>>> Fri Oct 19 12:39:38 2012
>>>>>>>>>>>>>>>>>>> @@ -18,14 +18,36 @@
>>>>>>>>>>>>>>>>>>>   */
>>>>>>>>>>>>>>>>>>>  package
>>>>>>>>>>>>>>>>>>> org.apache.openmeetings.web.components.user.calendar;
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> +import java.util.ArrayList;
>>>>>>>>>>>>>>>>>>> +import java.util.List;
>>>>>>>>>>>>>>>>>>> +
>>>>>>>>>>>>>>>>>>> +import
>>>>>>>>>>>>>>>>>>> org.apache.openmeetings.data.calendar.daos.AppointmentReminderTypDaoImpl;
>>>>>>>>>>>>>>>>>>> +import org.apache.openmeetings.data.conference.RoomDAO;
>>>>>>>>>>>>>>>>>>> +import
>>>>>>>>>>>>>>>>>>> org.apache.openmeetings.data.conference.Roommanagement;
>>>>>>>>>>>>>>>>>>> +import
>>>>>>>>>>>>>>>>>>> org.apache.openmeetings.data.user.dao.UsersDaoImpl;
>>>>>>>>>>>>>>>>>>>  import
>>>>>>>>>>>>>>>>>>> org.apache.openmeetings.persistence.beans.calendar.Appointment;
>>>>>>>>>>>>>>>>>>> +import
>>>>>>>>>>>>>>>>>>> org.apache.openmeetings.persistence.beans.calendar.AppointmentReminderTyps;
>>>>>>>>>>>>>>>>>>> +import
>>>>>>>>>>>>>>>>>>> org.apache.openmeetings.persistence.beans.domain.Organisation_Users;
>>>>>>>>>>>>>>>>>>> +import
>>>>>>>>>>>>>>>>>>> org.apache.openmeetings.persistence.beans.rooms.RoomTypes;
>>>>>>>>>>>>>>>>>>> +import
>>>>>>>>>>>>>>>>>>> org.apache.openmeetings.persistence.beans.rooms.Rooms;
>>>>>>>>>>>>>>>>>>> +import org.apache.openmeetings.web.app.Application;
>>>>>>>>>>>>>>>>>>> +import org.apache.openmeetings.web.app.WebSession;
>>>>>>>>>>>>>>>>>>> +import org.apache.wicket.ajax.AjaxRequestTarget;
>>>>>>>>>>>>>>>>>>> +import
>>>>>>>>>>>>>>>>>>> org.apache.wicket.ajax.markup.html.form.AjaxCheckBox;
>>>>>>>>>>>>>>>>>>> +import
>>>>>>>>>>>>>>>>>>> org.apache.wicket.extensions.yui.calendar.DateTimeField;
>>>>>>>>>>>>>>>>>>> +import
>>>>>>>>>>>>>>>>>>> org.apache.wicket.markup.html.form.ChoiceRenderer;
>>>>>>>>>>>>>>>>>>> +import
>>>>>>>>>>>>>>>>>>> org.apache.wicket.markup.html.form.DropDownChoice;
>>>>>>>>>>>>>>>>>>>  import org.apache.wicket.markup.html.form.Form;
>>>>>>>>>>>>>>>>>>> +import
>>>>>>>>>>>>>>>>>>> org.apache.wicket.markup.html.form.PasswordTextField;
>>>>>>>>>>>>>>>>>>>  import
>>>>>>>>>>>>>>>>>>> org.apache.wicket.markup.html.form.RequiredTextField;
>>>>>>>>>>>>>>>>>>>  import org.apache.wicket.markup.html.form.TextArea;
>>>>>>>>>>>>>>>>>>> +import org.apache.wicket.markup.html.form.TextField;
>>>>>>>>>>>>>>>>>>>  import org.apache.wicket.model.IModel;
>>>>>>>>>>>>>>>>>>> +import org.apache.wicket.model.PropertyModel;
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>  public class CalendarForm extends Form<Appointment> {
>>>>>>>>>>>>>>>>>>>         private static final long serialVersionUID =
>>>>>>>>>>>>>>>>>>> -1764738237821487526L;
>>>>>>>>>>>>>>>>>>> +       private boolean createRoom = true;
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>         public CalendarForm(String id,
>>>>>>>>>>>>>>>>>>> IModel<Appointment> model) {
>>>>>>>>>>>>>>>>>>>                 super(id, model);
>>>>>>>>>>>>>>>>>>> @@ -33,5 +55,71 @@ public class CalendarForm extends
>>>>>>>>>>>>>>>>>>> Form<A
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>                 add(new
>>>>>>>>>>>>>>>>>>> RequiredTextField<String>("appointmentName"));
>>>>>>>>>>>>>>>>>>>                 add(new
>>>>>>>>>>>>>>>>>>> TextArea<String>("appointmentDescription"));
>>>>>>>>>>>>>>>>>>> +               add(new
>>>>>>>>>>>>>>>>>>> TextField<String>("appointmentLocation"));
>>>>>>>>>>>>>>>>>>> +               add(new
>>>>>>>>>>>>>>>>>>> DateTimeField("appointmentStarttime"));
>>>>>>>>>>>>>>>>>>> +               add(new
>>>>>>>>>>>>>>>>>>> DateTimeField("appointmentEndtime"));
>>>>>>>>>>>>>>>>>>> +               final PasswordTextField pwd = new
>>>>>>>>>>>>>>>>>>> PasswordTextField("password");
>>>>>>>>>>>>>>>>>>> +               pwd.setEnabled(isPwdProtected());
>>>>>>>>>>>>>>>>>>> +               pwd.setOutputMarkupId(true);
>>>>>>>>>>>>>>>>>>> +               add(pwd);
>>>>>>>>>>>>>>>>>>> +
>>>>>>>>>>>>>>>>>>> +               add(new
>>>>>>>>>>>>>>>>>>> DropDownChoice<AppointmentReminderTyps>(
>>>>>>>>>>>>>>>>>>> +                               "remind"
>>>>>>>>>>>>>>>>>>> +                               ,
>>>>>>>>>>>>>>>>>>> Application.getBean(AppointmentReminderTypDaoImpl.class).getAppointmentReminderTypList()
>>>>>>>>>>>>>>>>>>> +                               , new
>>>>>>>>>>>>>>>>>>> ChoiceRenderer<AppointmentReminderTyps>("name", "typId")));
>>>>>>>>>>>>>>>>>>> +
>>>>>>>>>>>>>>>>>>> +               final DropDownChoice<RoomTypes> roomType
>>>>>>>>>>>>>>>>>>> = new DropDownChoice<RoomTypes>(
>>>>>>>>>>>>>>>>>>> +                               "room.roomtype"
>>>>>>>>>>>>>>>>>>> +                               ,
>>>>>>>>>>>>>>>>>>> Application.getBean(Roommanagement.class).getAllRoomTypes()
>>>>>>>>>>>>>>>>>>> +                               , new
>>>>>>>>>>>>>>>>>>> ChoiceRenderer<RoomTypes>("name", "roomtypes_id"));
>>>>>>>>>>>>>>>>>>> +               roomType.setEnabled(createRoom);
>>>>>>>>>>>>>>>>>>> +               roomType.setOutputMarkupId(true);
>>>>>>>>>>>>>>>>>>> +               add(roomType);
>>>>>>>>>>>>>>>>>>> +
>>>>>>>>>>>>>>>>>>> +               final DropDownChoice<Rooms> room = new
>>>>>>>>>>>>>>>>>>> DropDownChoice<Rooms>(
>>>>>>>>>>>>>>>>>>> +                               "room"
>>>>>>>>>>>>>>>>>>> +                               , getRoomList()
>>>>>>>>>>>>>>>>>>> +                               , new
>>>>>>>>>>>>>>>>>>> ChoiceRenderer<Rooms>("name", "rooms_id"));
>>>>>>>>>>>>>>>>>>> +               room.setEnabled(!createRoom);
>>>>>>>>>>>>>>>>>>> +               room.setOutputMarkupId(true);
>>>>>>>>>>>>>>>>>>> +               add(room);
>>>>>>>>>>>>>>>>>>> +
>>>>>>>>>>>>>>>>>>> +               add(new AjaxCheckBox("createRoom", new
>>>>>>>>>>>>>>>>>>> PropertyModel<Boolean>(this, "createRoom")) {
>>>>>>>>>>>>>>>>>>> +                       private static final long
>>>>>>>>>>>>>>>>>>> serialVersionUID = -3743113990890386035L;
>>>>>>>>>>>>>>>>>>> +
>>>>>>>>>>>>>>>>>>> +                       @Override
>>>>>>>>>>>>>>>>>>> +                       protected void
>>>>>>>>>>>>>>>>>>> onUpdate(AjaxRequestTarget target) {
>>>>>>>>>>>>>>>>>>> +                               createRoom =
>>>>>>>>>>>>>>>>>>> getConvertedInput();
>>>>>>>>>>>>>>>>>>> +
>>>>>>>>>>>>>>>>>>> target.add(roomType.setEnabled(createRoom), 
>>>>>>>>>>>>>>>>>>> room.setEnabled(!createRoom));
>>>>>>>>>>>>>>>>>>> +                       }
>>>>>>>>>>>>>>>>>>> +               });
>>>>>>>>>>>>>>>>>>> +               add(new
>>>>>>>>>>>>>>>>>>> AjaxCheckBox("isPasswordProtected") {
>>>>>>>>>>>>>>>>>>> +                       private static final long
>>>>>>>>>>>>>>>>>>> serialVersionUID = 6041200584296439976L;
>>>>>>>>>>>>>>>>>>> +
>>>>>>>>>>>>>>>>>>> +                       @Override
>>>>>>>>>>>>>>>>>>> +                       protected void
>>>>>>>>>>>>>>>>>>> onUpdate(AjaxRequestTarget target) {
>>>>>>>>>>>>>>>>>>> +
>>>>>>>>>>>>>>>>>>> CalendarForm.this.getModelObject().setIsPasswordProtected(getConvertedInput());
>>>>>>>>>>>>>>>>>>> +
>>>>>>>>>>>>>>>>>>> pwd.setEnabled(isPwdProtected());
>>>>>>>>>>>>>>>>>>> +                               target.add(pwd);
>>>>>>>>>>>>>>>>>>> +                       }
>>>>>>>>>>>>>>>>>>> +               });
>>>>>>>>>>>>>>>>>>> +       }
>>>>>>>>>>>>>>>>>>> +
>>>>>>>>>>>>>>>>>>> +       private boolean isPwdProtected() {
>>>>>>>>>>>>>>>>>>> +               return
>>>>>>>>>>>>>>>>>>> Boolean.TRUE.equals(getModelObject().getIsPasswordProtected());
>>>>>>>>>>>>>>>>>>> +       }
>>>>>>>>>>>>>>>>>>> +
>>>>>>>>>>>>>>>>>>> +       private List<Rooms> getRoomList() {
>>>>>>>>>>>>>>>>>>> +               //FIXME need to be reviewed
>>>>>>>>>>>>>>>>>>> +               List<Rooms> result = new
>>>>>>>>>>>>>>>>>>> ArrayList<Rooms>();
>>>>>>>>>>>>>>>>>>> +               RoomDAO dao =
>>>>>>>>>>>>>>>>>>> Application.getBean(RoomDAO.class);
>>>>>>>>>>>>>>>>>>> +               result.addAll(dao.getPublicRooms());
>>>>>>>>>>>>>>>>>>> +               for (Organisation_Users ou :
>>>>>>>>>>>>>>>>>>> Application.getBean(UsersDaoImpl.class).get(WebSession.getUserId()).getOrganisation_users())
>>>>>>>>>>>>>>>>>>> {
>>>>>>>>>>>>>>>>>>> +
>>>>>>>>>>>>>>>>>>> result.addAll(dao.getOrganisationRooms(ou.getOrganisation().getOrganisation_id()));
>>>>>>>>>>>>>>>>>>> +               }
>>>>>>>>>>>>>>>>>>> +               if (getModelObject().getRoom() != null
>>>>>>>>>>>>>>>>>>> && getModelObject().getRoom().getAppointment()) { //FIXME 
>>>>>>>>>>>>>>>>>>> review
>>>>>>>>>>>>>>>>>>> +
>>>>>>>>>>>>>>>>>>> result.add(getModelObject().getRoom());
>>>>>>>>>>>>>>>>>>> +               }
>>>>>>>>>>>>>>>>>>> +               return result;
>>>>>>>>>>>>>>>>>>>         }
>>>>>>>>>>>>>>>>>>>  }
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Modified:
>>>>>>>>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarPanel.html
>>>>>>>>>>>>>>>>>>> URL:
>>>>>>>>>>>>>>>>>>> http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarPanel.html?rev=1400075&r1=1400074&r2=1400075&view=diff
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> ==============================================================================
>>>>>>>>>>>>>>>>>>> ---
>>>>>>>>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarPanel.html
>>>>>>>>>>>>>>>>>>> (original)
>>>>>>>>>>>>>>>>>>> +++
>>>>>>>>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarPanel.html
>>>>>>>>>>>>>>>>>>> Fri Oct 19 12:39:38 2012
>>>>>>>>>>>>>>>>>>> @@ -71,7 +71,7 @@
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> $('#appointment').dialog({
>>>>>>>>>>>>>>>>>>>                                         closeOnEscape:
>>>>>>>>>>>>>>>>>>> true
>>>>>>>>>>>>>>>>>>>                                         , resizable: true
>>>>>>>>>>>>>>>>>>> -                                       , width: 400
>>>>>>>>>>>>>>>>>>> +                                       , width: 450
>>>>>>>>>>>>>>>>>>>                                         , autoOpen: false
>>>>>>>>>>>>>>>>>>>                                         , modal: true
>>>>>>>>>>>>>>>>>>>                                 });
>>>>>>>>>>>>>>>>>>> @@ -89,53 +89,55 @@
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> <td><wicket:ommessage key="572" /></td>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> <td><input type="text" wicket:id="appointmentName" /></td>
>>>>>>>>>>>>>>>>>>>                                         </tr>
>>>>>>>>>>>>>>>>>>> -                                       <!-- tr>
>>>>>>>>>>>>>>>>>>> -
>>>>>>>>>>>>>>>>>>> <td>&nbsp;</td>
>>>>>>>>>>>>>>>>>>> -                                               <td>
>>>>>>>>>>>>>>>>>>> -
>>>>>>>>>>>>>>>>>>> <wicket:ommessage key="570" /><input type="text"
>>>>>>>>>>>>>>>>>>> wicket:id="appointmentStarttime" />
>>>>>>>>>>>>>>>>>>> -
>>>>>>>>>>>>>>>>>>> <wicket:ommessage key="571" /><input type="text"
>>>>>>>>>>>>>>>>>>> wicket:id="appointmentEndtime" />
>>>>>>>>>>>>>>>>>>> -                                               </td>
>>>>>>>>>>>>>>>>>>> +                                       <tr>
>>>>>>>>>>>>>>>>>>> +
>>>>>>>>>>>>>>>>>>> <td><wicket:ommessage key="570" /></td>
>>>>>>>>>>>>>>>>>>> +
>>>>>>>>>>>>>>>>>>> <td><span wicket:id="appointmentStarttime"></span></td>
>>>>>>>>>>>>>>>>>>> +                                       </tr>
>>>>>>>>>>>>>>>>>>> +                                       <tr>
>>>>>>>>>>>>>>>>>>> +
>>>>>>>>>>>>>>>>>>> <td><wicket:ommessage key="571" /></td>
>>>>>>>>>>>>>>>>>>> +
>>>>>>>>>>>>>>>>>>> <td><span wicket:id="appointmentEndtime"></span></td>
>>>>>>>>>>>>>>>>>>>                                         </tr>
>>>>>>>>>>>>>>>>>>>                                         <tr>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> <td><wicket:ommessage key="565" /></td>
>>>>>>>>>>>>>>>>>>> -
>>>>>>>>>>>>>>>>>>> <td><select wicket:id="notification" ></select></td>
>>>>>>>>>>>>>>>>>>> +
>>>>>>>>>>>>>>>>>>> <td><select wicket:id="remind" ></select></td>
>>>>>>>>>>>>>>>>>>>                                         </tr>
>>>>>>>>>>>>>>>>>>>                                         <tr>
>>>>>>>>>>>>>>>>>>>                                                 <td
>>>>>>>>>>>>>>>>>>> colspan="2"><input type="checkbox" wicket:id="createRoom"
>>>>>>>>>>>>>>>>>>> /><wicket:ommessage key="1509" /></td>
>>>>>>>>>>>>>>>>>>>                                         </tr>
>>>>>>>>>>>>>>>>>>>                                         <tr>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> <td><wicket:ommessage key="619" /></td>
>>>>>>>>>>>>>>>>>>> -
>>>>>>>>>>>>>>>>>>> <td><select wicket:id="roomType" ></select></td>
>>>>>>>>>>>>>>>>>>> +
>>>>>>>>>>>>>>>>>>> <td><select wicket:id="room.roomtype" ></select></td>
>>>>>>>>>>>>>>>>>>>                                         </tr>
>>>>>>>>>>>>>>>>>>>                                         <tr>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> <td><wicket:ommessage key="406" /></td>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> <td><select wicket:id="room" ></select></td>
>>>>>>>>>>>>>>>>>>>                                         </tr>
>>>>>>>>>>>>>>>>>>>                                         <tr>
>>>>>>>>>>>>>>>>>>> -                                               <td
>>>>>>>>>>>>>>>>>>> colspan="2"><input type="checkbox" 
>>>>>>>>>>>>>>>>>>> wicket:id="isPasswordProtected"
>>>>>>>>>>>>>>>>>>> /><wicket:ommessage key="1509" /></td>
>>>>>>>>>>>>>>>>>>> +                                               <td
>>>>>>>>>>>>>>>>>>> colspan="2"><input type="checkbox" 
>>>>>>>>>>>>>>>>>>> wicket:id="isPasswordProtected"
>>>>>>>>>>>>>>>>>>> /><wicket:ommessage key="524" /></td>
>>>>>>>>>>>>>>>>>>>                                         </tr>
>>>>>>>>>>>>>>>>>>>                                         <tr>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> <td><wicket:ommessage key="525" /></td>
>>>>>>>>>>>>>>>>>>> -
>>>>>>>>>>>>>>>>>>> <td><input type="text" wicket:id="password" /></td>
>>>>>>>>>>>>>>>>>>> +
>>>>>>>>>>>>>>>>>>> <td><input type="password" wicket:id="password" /></td>
>>>>>>>>>>>>>>>>>>>                                         </tr>
>>>>>>>>>>>>>>>>>>>                                         <tr>
>>>>>>>>>>>>>>>>>>>                                                 <td
>>>>>>>>>>>>>>>>>>> colspan="2"><wicket:ommessage key="1445" /></td>
>>>>>>>>>>>>>>>>>>>                                         </tr>
>>>>>>>>>>>>>>>>>>> +                                       <!--
>>>>>>>>>>>>>>>>>>>                                         <tr>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> <td><wicket:ommessage key="803" /></td>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> <td><select wicket:id="meetingMember" ></select></td>
>>>>>>>>>>>>>>>>>>> -                                       </tr>
>>>>>>>>>>>>>>>>>>> +                                       </tr -->
>>>>>>>>>>>>>>>>>>>                                         <tr>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> <td><wicket:ommessage key="569" /></td>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> <td><input type="text" wicket:id="appointmentLocation" 
>>>>>>>>>>>>>>>>>>> /></td>
>>>>>>>>>>>>>>>>>>> -                                       </tr-->
>>>>>>>>>>>>>>>>>>> +                                       </tr>
>>>>>>>>>>>>>>>>>>>                                         <tr>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> <td><wicket:ommessage key="573" /></td>
>>>>>>>>>>>>>>>>>>> -
>>>>>>>>>>>>>>>>>>> <td><input type="text" wicket:id="appointmentDescription" 
>>>>>>>>>>>>>>>>>>> /></td>
>>>>>>>>>>>>>>>>>>> +
>>>>>>>>>>>>>>>>>>> <td><textarea 
>>>>>>>>>>>>>>>>>>> wicket:id="appointmentDescription"></textarea></td>
>>>>>>>>>>>>>>>>>>>                                         </tr>
>>>>>>>>>>>>>>>>>>>                                         <!-- tr>
>>>>>>>>>>>>>>>>>>>                                                 <td
>>>>>>>>>>>>>>>>>>> colspan="2" style="text-align: right"><input type="button" 
>>>>>>>>>>>>>>>>>>> wicket:id="save"
>>>>>>>>>>>>>>>>>>> /><input type="button" wicket:id="cancel" /></td>
>>>>>>>>>>>>>>>>>>> -                                       </tr-->
>>>>>>>>>>>>>>>>>>> +                                       </tr -->
>>>>>>>>>>>>>>>>>>>                                 </table>
>>>>>>>>>>>>>>>>>>>                         </form>
>>>>>>>>>>>>>>>>>>>                 </div>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Modified:
>>>>>>>>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarPanel.java
>>>>>>>>>>>>>>>>>>> URL:
>>>>>>>>>>>>>>>>>>> http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarPanel.java?rev=1400075&r1=1400074&r2=1400075&view=diff
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> ==============================================================================
>>>>>>>>>>>>>>>>>>> ---
>>>>>>>>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarPanel.java
>>>>>>>>>>>>>>>>>>> (original)
>>>>>>>>>>>>>>>>>>> +++
>>>>>>>>>>>>>>>>>>> incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/calendar/CalendarPanel.java
>>>>>>>>>>>>>>>>>>> Fri Oct 19 12:39:38 2012
>>>>>>>>>>>>>>>>>>> @@ -150,6 +150,9 @@ public class CalendarPanel extends
>>>>>>>>>>>>>>>>>>> UserP
>>>>>>>>>>>>>>>>>>>                                 Calendar end =
>>>>>>>>>>>>>>>>>>> WebSession.getCalendar();
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> end.setTimeInMillis(getRequestCycle().getRequest().getRequestParameters().getParameterValue("_end").toLong());
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> +                               if (start.equals(end)) {
>>>>>>>>>>>>>>>>>>> +
>>>>>>>>>>>>>>>>>>> end.add(Calendar.HOUR_OF_DAY, 1);
>>>>>>>>>>>>>>>>>>> +                               }
>>>>>>>>>>>>>>>>>>>                                 Appointment a = new
>>>>>>>>>>>>>>>>>>> Appointment();
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> a.setAppointmentStarttime(start.getTime());
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> a.setAppointmentEndtime(end.getTime());
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>>>> Sebastian Wagner
>>>>>>>>>>>>>>>>>> https://twitter.com/#!/dead_lock
>>>>>>>>>>>>>>>>>> http://www.webbase-design.de
>>>>>>>>>>>>>>>>>> http://www.wagner-sebastian.com
>>>>>>>>>>>>>>>>>> [email protected]
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>>> Sebastian Wagner
>>>>>>>>>>>>>>>>> https://twitter.com/#!/dead_lock
>>>>>>>>>>>>>>>>> http://www.webbase-design.de
>>>>>>>>>>>>>>>>> http://www.wagner-sebastian.com
>>>>>>>>>>>>>>>>> [email protected]
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> --
>>>>>>>>>>>>>> Sebastian Wagner
>>>>>>>>>>>>>> https://twitter.com/#!/dead_lock
>>>>>>>>>>>>>> http://www.webbase-design.de
>>>>>>>>>>>>>> http://www.wagner-sebastian.com
>>>>>>>>>>>>>> [email protected]
>>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> --
>>>>>>>>>>>>> WBR
>>>>>>>>>>>>> Maxim aka solomax
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> --
>>>>>>>>>>>> Sebastian Wagner
>>>>>>>>>>>> https://twitter.com/#!/dead_lock
>>>>>>>>>>>> http://www.webbase-design.de
>>>>>>>>>>>> http://www.wagner-sebastian.com
>>>>>>>>>>>> [email protected]
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> --
>>>>>>>>>>> WBR
>>>>>>>>>>> Maxim aka solomax
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> Sebastian Wagner
>>>>>>>>>> https://twitter.com/#!/dead_lock
>>>>>>>>>> http://www.webbase-design.de
>>>>>>>>>> http://www.wagner-sebastian.com
>>>>>>>>>> [email protected]
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> WBR
>>>>>>>>> Maxim aka solomax
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> Sebastian Wagner
>>>>>>>> https://twitter.com/#!/dead_lock
>>>>>>>> http://www.webbase-design.de
>>>>>>>> http://www.wagner-sebastian.com
>>>>>>>> [email protected]
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Sebastian Wagner
>>>>>>> https://twitter.com/#!/dead_lock
>>>>>>> http://www.webbase-design.de
>>>>>>> http://www.wagner-sebastian.com
>>>>>>> [email protected]
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> WBR
>>>>>> Maxim aka solomax
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> 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

Reply via email to