OK no problem lets remove it can you please write RPC call performing user count retrieving?
On Fri, Oct 26, 2012 at 2:55 PM, [email protected] < [email protected]> wrote: > I agree however that are more comfortable way of getting RoomClients by > RoomId might be needed. > However this is a very different issue. > This is no argument for moving it to the database. > You can organize the data structure in the memory more efficiently, make > several Lists for fast access et cetera. > Or for example store it using EHCache. I thought also that it was our plan > that at some point we will externalize the session vars to EHCache, so that > you have the chance to configure the session storage size and externalize > it to disk in case needed. > > Sebastian > > 2012/10/26 [email protected] <[email protected]> > > the standard call to get a room client is not to get the roomclients by >> its roomid. >> The standard call to get a room client is to get the roomclient by its >> streamid !!! >> And this call is done for every RoomClient per sync method. >> So if there are 100 clients in a room = 100 db calls per sync. >> I thought I have tried to explain the calculation. >> >> I just don't understand this whole discussion, we have a single >> requirement: >> Calculate the list of users per room. >> And now we need to switch a session object to the database? >> >> I don't see a need for a hybrid solution to have session objects twice. >> There will be multiple issues in syncing the information in the session >> objects: >> A single user can create 2 or 3 RTMP connection to the server. >> It will not be get simpler by your solution: >> If the users connects as "Screensharing Client" your logic will not >> detect it. >> If the user connects as "Audio/Video Client" your logic will not detect >> it. >> So actually you will have multiple methods in the ScopeApplicationAdapter >> where you will have to sync the session object to the database otherwise >> the database object is of quite limited use. >> >> I really don't think splitting up that logic to database and session >> makes things more easy. >> All you want is to use a query like "SELECT ROOM JOIN FETCH ROOMATTENDEE" >> ;) >> Just for having such a query we are not going to switch around a session >> object to the database. >> It just has too many drawbacks. >> >> >> Sebastian >> >> 2012/10/26 Maxim Solodovnik <[email protected]> >> >>> 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> </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 >>> >> >> >> >> -- >> 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
