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>&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
>>>
>>
>>
>>
>> --
>> 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

Reply via email to