Repository: openmeetings Updated Branches: refs/heads/master 7e29189eb -> c6e0db165
http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/main/webapp/WEB-INF/classes/logback-config.xml ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/logback-config.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/logback-config.xml index 2106686..3c55b02 100644 --- a/openmeetings-web/src/main/webapp/WEB-INF/classes/logback-config.xml +++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/logback-config.xml @@ -7,18 +7,17 @@ to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 - + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ---> +--> <configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <contextName>${current_openmeetings_context_name}</contextName> http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/main/webapp/WEB-INF/classes/rebel-remote.xml ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/rebel-remote.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/rebel-remote.xml index 0dce654..25f4a7f 100644 --- a/openmeetings-web/src/main/webapp/WEB-INF/classes/rebel-remote.xml +++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/rebel-remote.xml @@ -7,16 +7,16 @@ to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 - + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - + --> <rebel-remote> <id>Openmeetings</id> http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/main/webapp/WEB-INF/classes/rebel.xml ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/rebel.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/rebel.xml index 747b192..a693fbe 100644 --- a/openmeetings-web/src/main/webapp/WEB-INF/classes/rebel.xml +++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/rebel.xml @@ -7,16 +7,16 @@ to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 - + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - + --> <application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSession.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSession.java b/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSession.java deleted file mode 100644 index 675a4e2..0000000 --- a/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSession.java +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License") + you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.openmeetings.test.session; - -import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; -import static org.junit.Assert.assertEquals; - -import java.util.List; - -import org.apache.openmeetings.db.dao.room.ClientDao; -import org.apache.openmeetings.db.dao.server.ServerDao; -import org.apache.openmeetings.db.entity.room.StreamClient; -import org.apache.openmeetings.db.entity.server.Server; -import org.apache.openmeetings.test.AbstractJUnitDefaults; -import org.junit.Before; -import org.junit.Test; -import org.red5.logging.Red5LoggerFactory; -import org.slf4j.Logger; -import org.springframework.beans.factory.annotation.Autowired; - -public class TestDbSession extends AbstractJUnitDefaults { - protected static final Logger log = Red5LoggerFactory.getLogger(TestDbSession.class, webAppRootKey); - - @Autowired - private ServerDao serverDao; - - @Autowired - private ClientDao clientDao; - private Server server = null; - StreamClient cl1, cl2, cl3; - - @Before - public void setup() { - List<Server> serverList = serverDao.getActiveServers(); - - if (serverList.size() > 0) { - server = serverList.get(0); - } else { - server = new Server(); - server.setName("Test Server"); - server.setActive(true); - serverDao.update(server, null); - } - - clientDao.cleanAllClients(); - - cl1 = new StreamClient(); - cl1.setServer(null); - cl1.setUserId(1L); - cl1.setScope("1"); - cl1.setUid("public1"); - clientDao.add(cl1); - - cl2 = new StreamClient(); - cl2.setServer(null); - cl2.setScope("1"); - cl2.setUserId(2L); - cl2.setUid("public2"); - clientDao.add(cl2); - - cl3 = new StreamClient(); - cl3.setServer(server); - cl3.setScope("3"); - cl3.setUserId(3L); - cl3.setUid("public3"); - clientDao.add(cl3); - } - - @Test - public void testByUidAndServer() { - List<StreamClient> clTest_Pub_1_list = clientDao.getClientsByUidAndServer(null, "public1"); - assertEquals(cl1.getId(), clTest_Pub_1_list.get(0).getId()); - - List<StreamClient> clTest_Pub_3_list = clientDao.getClientsByUidAndServer(server, "public3"); - assertEquals(cl3.getId(), clTest_Pub_3_list.get(0).getId()); - - List<StreamClient> clTest_Fail_list = clientDao.getClientsByUidAndServer(null, "public3"); - assertEquals(0, clTest_Fail_list.size()); - } - - @Test - public void testByUid() { - List<StreamClient> clTest_PubAll_1_list = clientDao.getClientsByUid("public1"); - assertEquals(cl1.getId(), clTest_PubAll_1_list.get(0).getId()); - - List<StreamClient> clTest_PubAll_3_list = clientDao.getClientsByUid("public3"); - assertEquals(cl3.getId(), clTest_PubAll_3_list.get(0).getId()); - - List<StreamClient> clTest_FailAll_list = clientDao.getClientsByUid("public4"); - assertEquals(0, clTest_FailAll_list.size()); - } - - - @Test - public void testByServer() { - List<StreamClient> clientsByServerNull = clientDao.getClientsByServer(null); - assertEquals(2, clientsByServerNull.size()); - - List<StreamClient> clientsByServer = clientDao.getClientsByServer(server); - assertEquals(1, clientsByServer.size()); - - //count by server - int clTest_Count_1_list = clientDao.countClientsByServer(null); - assertEquals(2, clTest_Count_1_list); - - int clTest_Count_3_list = clientDao.countClientsByServer(server); - assertEquals(1, clTest_Count_3_list); - } - - @Test - public void testByUser() { - //by userid - List<StreamClient> clTest_User_1_list = clientDao.getClientsByUserId(null, 1L); - assertEquals(cl1.getId(), clTest_User_1_list.get(0).getId()); - - List<StreamClient> clTest_User_3_list = clientDao.getClientsByUserId(server, 3L); - assertEquals(cl3.getId(), clTest_User_3_list.get(0).getId()); - - List<StreamClient> clTest_UserFail_list = clientDao.getClientsByUserId(null, 3L); - assertEquals(0, clTest_UserFail_list.size()); - } - - @Test - public void testByRoom() { - //by roomid - List<StreamClient> clTest_Room_1_list = clientDao.getClientsByRoomId(1L); - assertEquals(2, clTest_Room_1_list.size()); - - List<StreamClient> clTest_Room_3_list = clientDao.getClientsByRoomId(3L); - assertEquals(cl3.getId(), clTest_Room_3_list.get(0).getId()); - - List<StreamClient> clTest_RoomFail_list = clientDao.getClientsByRoomId(2L); - assertEquals(0, clTest_RoomFail_list.size()); - } - - @Test - public void testAll() { - //all - List<StreamClient> clientsAll = clientDao.getClients(); - assertEquals(3, clientsAll.size()); - - int countAll = clientDao.countClients(); - assertEquals(3, countAll); - } - - @Test - public void testRemove() { - //remove by id - clientDao.delete(cl1); - - int clTest_Count_Delete_list = clientDao.countClientsByServer(null); - assertEquals(1, clTest_Count_Delete_list); - - clTest_Count_Delete_list = clientDao.countClientsByServer(server); - assertEquals(1, clTest_Count_Delete_list); - - //delete all - clientDao.cleanAllClients(); - - int countAll = clientDao.countClients(); - assertEquals(0, countAll); - } -} http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSessionGetRoomIds.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSessionGetRoomIds.java b/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSessionGetRoomIds.java deleted file mode 100644 index 3225508..0000000 --- a/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestDbSessionGetRoomIds.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License") + you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.openmeetings.test.session; - -import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; -import static org.junit.Assert.assertEquals; - -import java.util.List; - -import org.apache.openmeetings.db.dao.room.ClientDao; -import org.apache.openmeetings.db.dao.server.ServerDao; -import org.apache.openmeetings.db.entity.room.StreamClient; -import org.apache.openmeetings.db.entity.server.Server; -import org.apache.openmeetings.test.AbstractJUnitDefaults; -import org.junit.Test; -import org.red5.logging.Red5LoggerFactory; -import org.slf4j.Logger; -import org.springframework.beans.factory.annotation.Autowired; - -public class TestDbSessionGetRoomIds extends AbstractJUnitDefaults { - protected static final Logger log = Red5LoggerFactory.getLogger(TestDbSessionGetRoomIds.class, webAppRootKey); - - @Autowired - private ServerDao serverDao; - - @Autowired - private ClientDao clientDao; - - @Test - public void testDbSessionFunctions() { - clientDao.cleanAllClients(); - - List<Server> serverList = serverDao.getActiveServers(); - - Server server = null; - if (serverList.size() > 0) { - server = serverList.get(0); - } else { - server = new Server(); - server.setName("Test Server"); - server.setActive(true); - serverDao.update(server, null); - } - - StreamClient cl1 = new StreamClient(); - cl1.setServer(server); - cl1.setUserId(1L); - cl1.setScope("1"); - cl1.setUid("public1"); - clientDao.add(cl1); - - StreamClient cl2 = new StreamClient(); - cl2.setServer(server); - cl2.setScope("1"); - cl2.setUserId(2L); - cl2.setUid("public2"); - clientDao.add(cl2); - - StreamClient cl3 = new StreamClient(); - cl3.setServer(server); - cl3.setScope("3"); - cl3.setUserId(3L); - cl3.setUid("public3"); - clientDao.add(cl3); - - List<Long> roomids = clientDao.getRoomsIdsByServer(server); - - assertEquals(2, roomids.size()); - - //delete all - clientDao.cleanAllClients(); - - int countAll = clientDao.countClients(); - assertEquals(0, countAll); - } -} http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestHashMapSession.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestHashMapSession.java b/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestHashMapSession.java deleted file mode 100644 index 58024a3..0000000 --- a/openmeetings-web/src/test/java/org/apache/openmeetings/test/session/TestHashMapSession.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License") + you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.openmeetings.test.session; - -import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; -import static org.junit.Assert.assertEquals; - -import java.util.Arrays; -import java.util.Date; -import java.util.UUID; - -import org.apache.openmeetings.core.session.store.HashMapStore; -import org.apache.openmeetings.core.session.store.IClientPersistenceStore; -import org.apache.openmeetings.db.entity.room.StreamClient; -import org.apache.openmeetings.test.AbstractJUnitDefaults; -import org.junit.Test; -import org.red5.logging.Red5LoggerFactory; -import org.slf4j.Logger; -import org.springframework.beans.factory.annotation.Autowired; - -public class TestHashMapSession extends AbstractJUnitDefaults { - protected static final Logger log = Red5LoggerFactory.getLogger(TestHashMapSession.class, webAppRootKey); - - @Autowired - private HashMapStore cache; - - @Test - public void testHashMapSession() { - //make sure the cache is empty before starting the test - cache.clear(); - - for (int i = 0; i < 20; i++) { - Long id = (long)i; - - StreamClient rcm = new StreamClient(); - rcm.setId(id); - rcm.setConnectedSince(new Date()); - rcm.setScope("scopeName"); - - rcm.setUid(UUID.randomUUID().toString()); - - rcm.setUserport(0); - rcm.setUserip("remoteAddress"); - rcm.setSwfurl("swfUrl"); - rcm.setMod(false); - - if (cache.containsKey(id)) { - log.error("Tried to add an existing Client " + id); - break; - } - cache.remove(id); - } - String logString = cache.getDebugInformation(Arrays.asList(IClientPersistenceStore.DEBUG_DETAILS.SIZE)); - log.debug("######## \n\r "+ logString + " \n\r ########"); - assertEquals(0, cache.size()); - } -} http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java ---------------------------------------------------------------------- diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java index 0d2807f..50595c5 100644 --- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java +++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java @@ -43,6 +43,7 @@ import org.apache.openmeetings.IApplication; import org.apache.openmeetings.core.util.WebSocketHelper; import org.apache.openmeetings.db.dao.room.InvitationDao; import org.apache.openmeetings.db.dao.room.RoomDao; +import org.apache.openmeetings.db.dao.user.IUserManager; import org.apache.openmeetings.db.dto.basic.ServiceResult; import org.apache.openmeetings.db.dto.basic.ServiceResult.Type; import org.apache.openmeetings.db.dto.room.InvitationDTO; @@ -55,7 +56,6 @@ import org.apache.openmeetings.db.entity.server.Sessiondata; import org.apache.openmeetings.db.entity.user.User; import org.apache.openmeetings.db.util.AuthLevelUtil; import org.apache.openmeetings.service.room.InvitationManager; -import org.apache.openmeetings.service.user.UserManager; import org.apache.openmeetings.util.OpenmeetingsVariables; import org.apache.openmeetings.util.message.RoomMessage; import org.apache.openmeetings.webservice.error.ServiceException; @@ -387,7 +387,7 @@ public class RoomWebService extends BaseWebService { public ServiceResult kick(@WebParam(name="sid") @QueryParam("sid") String sid, @WebParam(name="id") @PathParam("id") long id) throws ServiceException { try { if (AuthLevelUtil.hasWebServiceLevel(getRights(sid))) { - boolean result = getBean(UserManager.class).kickUsersByRoomId(id); + boolean result = getBean(IUserManager.class).kickUsersByRoomId(id); return new ServiceResult(result ? 1L : 0L, "Kicked", Type.SUCCESS); } else { throw new ServiceException("Insufficient permissions"); //TODO code -26 http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/ServerWebService.java ---------------------------------------------------------------------- diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/ServerWebService.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/ServerWebService.java deleted file mode 100644 index 7c66512..0000000 --- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/ServerWebService.java +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License") + you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.openmeetings.webservice; - -import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; -import static org.apache.openmeetings.webservice.Constants.TNS; - -import java.util.List; - -import javax.jws.WebMethod; -import javax.jws.WebParam; -import javax.jws.WebService; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.MediaType; - -import org.apache.cxf.feature.Features; -import org.apache.openmeetings.db.dao.server.ServerDao; -import org.apache.openmeetings.db.dto.basic.ServiceResult; -import org.apache.openmeetings.db.dto.basic.ServiceResult.Type; -import org.apache.openmeetings.db.dto.server.ServerDTO; -import org.apache.openmeetings.db.entity.server.Server; -import org.apache.openmeetings.db.entity.server.Sessiondata; -import org.apache.openmeetings.db.util.AuthLevelUtil; -import org.apache.openmeetings.webservice.error.ServiceException; -import org.red5.logging.Red5LoggerFactory; -import org.slf4j.Logger; - -/** - * This class provides method implementations necessary for OM to manage servers - * participating in cluster. - * - * @author solomax, sebawagner - * - */ -@WebService(serviceName="org.apache.openmeetings.webservice.ServerWebService", targetNamespace = TNS) -@Features(features = "org.apache.cxf.feature.LoggingFeature") -@Produces({MediaType.APPLICATION_JSON}) -@Path("/server") -public class ServerWebService extends BaseWebService { - private static final Logger log = Red5LoggerFactory.getLogger(ServerWebService.class, webAppRootKey); - - private static ServerDao getDao() { - return getBean(ServerDao.class); - } - - /** - * Method to retrieve the list of the servers participating in cluster - * - * @param sid - * - session id to identify the user making request - * @param start - * - server index to start with - * @param max - * - Maximum server count - * @return The list of servers participating in cluster - */ - @WebMethod - @GET - @Path("/{start}/{max}") - public List<ServerDTO> getServers(@QueryParam("sid") @WebParam(name="sid") String sid - , @PathParam("start") @WebParam(name="start") int start - , @PathParam("max") @WebParam(name="max") int max - ) throws ServiceException - { - log.debug("getServers enter"); - if (AuthLevelUtil.hasWebServiceLevel(getRights(sid))) { - return ServerDTO.list(getDao().get(start, max)); - } else { - log.warn("Insuffisient permissions"); - throw new ServiceException("Insufficient permissions"); //TODO code -26 - } - } - - /** - * Method to retrieve the total count of the servers participating in - * cluster - * - * @param sid - * - session id to identify the user making request - * @return total count of the servers participating in cluster - */ - @WebMethod - @GET - @Path("/count") - public long count(@QueryParam("sid") @WebParam(name="sid") String sid) throws ServiceException { - log.debug("getServerCount enter"); - if (AuthLevelUtil.hasWebServiceLevel(getRights(sid))) { - return getDao().count(); - } else { - throw new ServiceException("Insufficient permissions"); //TODO code -26 - } - } - - /** - * Method to add/update server - * - * @param sid - * - session id to identify the user making request - * @param server - * - server to add/update - * @return the id of saved server - */ - @WebMethod - @POST - @Path("/") - public ServerDTO add(@WebParam(name="sid") @QueryParam("sid") String sid, @WebParam(name="server") @QueryParam("server") ServerDTO server) throws ServiceException { - log.debug("saveServerCount enter"); - Sessiondata sd = check(sid); - Long userId = sd.getUserId(); - if (AuthLevelUtil.hasWebServiceLevel(getRights(userId))) { - Server s = server.get(); - return new ServerDTO(getDao().update(s, userId)); - } else { - log.warn("Insuffisient permissions"); - throw new ServiceException("Insufficient permissions"); //TODO code -26 - } - } - - /** - * Method to delete server - * - * @param sid - * - session id to identify the user making request - * @param id - * - the id of the server to delete - * @return true if the server was deleted, false otherwise - */ - @WebMethod - @DELETE - @Path("/{id}") - public ServiceResult delete(@WebParam(name="sid") @QueryParam("sid") String sid, @WebParam(name="id") @PathParam("id") long id) throws ServiceException { - log.debug("saveServerCount enter"); - Sessiondata sd = check(sid); - Long userId = sd.getUserId(); - - if (AuthLevelUtil.hasWebServiceLevel(getRights(userId))) { - ServerDao serverDao = getDao(); - Server s = serverDao.get(id); - if (s != null) { - serverDao.delete(s, userId); - return new ServiceResult(id, "Deleted", Type.SUCCESS); - } - return new ServiceResult(0L, "Not found", Type.SUCCESS); - } else { - log.warn("Insuffisient permissions"); - throw new ServiceException("Insufficient permissions"); //TODO code -26 - } - } -} http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/UserWebService.java ---------------------------------------------------------------------- diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/UserWebService.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/UserWebService.java index 594196b..80d4813 100644 --- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/UserWebService.java +++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/UserWebService.java @@ -26,10 +26,8 @@ import static org.apache.openmeetings.webservice.Constants.USER_SERVICE_NAME; import static org.apache.openmeetings.webservice.Constants.USER_SERVICE_PORT_NAME; import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Locale; -import java.util.Map; import javax.jws.WebMethod; import javax.jws.WebParam; @@ -46,18 +44,16 @@ import javax.ws.rs.core.MediaType; import org.apache.cxf.feature.Features; import org.apache.openmeetings.IApplication; -import org.apache.openmeetings.core.remote.ScopeApplicationAdapter; -import org.apache.openmeetings.core.session.SessionManager; import org.apache.openmeetings.core.util.StrongPasswordValidator; import org.apache.openmeetings.db.dao.basic.ConfigurationDao; import org.apache.openmeetings.db.dao.server.SOAPLoginDao; +import org.apache.openmeetings.db.dao.user.IUserManager; import org.apache.openmeetings.db.dao.user.UserDao; import org.apache.openmeetings.db.dto.basic.ServiceResult; import org.apache.openmeetings.db.dto.basic.ServiceResult.Type; import org.apache.openmeetings.db.dto.room.RoomOptionsDTO; import org.apache.openmeetings.db.dto.user.ExternalUserDTO; import org.apache.openmeetings.db.dto.user.UserDTO; -import org.apache.openmeetings.db.entity.room.StreamClient; import org.apache.openmeetings.db.entity.server.RemoteSessionObject; import org.apache.openmeetings.db.entity.server.Sessiondata; import org.apache.openmeetings.db.entity.user.Address; @@ -67,7 +63,6 @@ import org.apache.openmeetings.db.util.AuthLevelUtil; import org.apache.openmeetings.service.user.UserManager; import org.apache.openmeetings.util.OmException; import org.apache.openmeetings.util.OpenmeetingsVariables; -import org.apache.openmeetings.webservice.cluster.UserService; import org.apache.openmeetings.webservice.error.ServiceException; import org.apache.wicket.Application; import org.apache.wicket.util.string.Strings; @@ -76,7 +71,6 @@ import org.apache.wicket.validation.IValidator; import org.apache.wicket.validation.Validatable; import org.apache.wicket.validation.ValidationError; import org.red5.logging.Red5LoggerFactory; -import org.red5.server.api.scope.IScope; import org.slf4j.Logger; /** @@ -91,13 +85,15 @@ import org.slf4j.Logger; @Features(features = "org.apache.cxf.feature.LoggingFeature") @Produces({MediaType.APPLICATION_JSON}) @Path("/user") -public class UserWebService extends BaseWebService implements UserService { +public class UserWebService extends BaseWebService { private static final Logger log = Red5LoggerFactory.getLogger(UserWebService.class, webAppRootKey); - /* (non-Javadoc) - * @see org.apache.openmeetings.webservice.cluster.UserService#login(java.lang.String, java.lang.String) + /** + * @param user - login or email of Openmeetings user with admin or SOAP-rights + * @param pass - password + * + * @return - {@link ServiceResult} with error code or SID and userId */ - @Override @WebMethod @GET @Path("/login") @@ -120,10 +116,15 @@ public class UserWebService extends BaseWebService implements UserService { } } - /* (non-Javadoc) - * @see org.apache.openmeetings.webservice.cluster.UserService#get(java.lang.String) + /** + * Lists all users in the system! + * + * @param sid + * The SID from getSession + * + * @return - list of users + * @throws ServiceException */ - @Override @WebMethod @GET @Path("/") @@ -140,10 +141,20 @@ public class UserWebService extends BaseWebService implements UserService { } } - /* (non-Javadoc) - * @see org.apache.openmeetings.webservice.cluster.UserService#add(java.lang.String, org.apache.openmeetings.db.dto.user.UserDTO, java.lang.Boolean) + /** + * Adds a new User like through the Frontend, but also does activates the + * Account To do SSO see the methods to create a hash and use those ones! + * + * @param sid + * The SID from getSession + * @param user + * user object + * @param confirm + * whatever or not to send email, leave empty for auto-send + * + * @return - id of the user added or error code + * @throws ServiceException */ - @Override @WebMethod @POST @Path("/") @@ -224,10 +235,18 @@ public class UserWebService extends BaseWebService implements UserService { //FIXME no update - /* (non-Javadoc) - * @see org.apache.openmeetings.webservice.cluster.UserService#delete(java.lang.String, long) + /** + * + * Delete a certain user by its id + * + * @param sid + * The SID from getSession + * @param id + * the openmeetings user id + * + * @return - id of the user deleted, error code otherwise + * @throws ServiceException */ - @Override @WebMethod @DELETE @Path("/{id}") @@ -248,10 +267,20 @@ public class UserWebService extends BaseWebService implements UserService { } } - /* (non-Javadoc) - * @see org.apache.openmeetings.webservice.cluster.UserService#deleteExternal(java.lang.String, java.lang.String, java.lang.String) + /** + * + * Delete a certain user by its external user id + * + * @param sid + * The SID from getSession + * @param externalId + * externalUserId + * @param externalType + * externalUserId + * + * @return - id of user deleted, or error code + * @throws ServiceException */ - @Override @DELETE @Path("/{externaltype}/{externalid}") public ServiceResult deleteExternal( @@ -279,10 +308,21 @@ public class UserWebService extends BaseWebService implements UserService { } } - /* (non-Javadoc) - * @see org.apache.openmeetings.webservice.cluster.UserService#getRoomHash(java.lang.String, org.apache.openmeetings.db.dto.user.ExternalUserDTO, org.apache.openmeetings.db.dto.room.RoomOptionsDTO) + /** + * Description: sets the SessionObject for a certain SID, after setting this + * Session-Object you can use the SID + a RoomId to enter any Room. ... + * Session-Hashs are deleted 15 minutes after the creation if not used. + * + * @param sid + * The SID from getSession + * @param user + * user details to set + * @param options + * room options to set + * + * @return - secure hash or error code + * @throws ServiceException */ - @Override @WebMethod @POST @Path("/hash") @@ -333,50 +373,20 @@ public class UserWebService extends BaseWebService implements UserService { } /** - * Kick a user by its publicSID.<br/> - * <br/> - * <i>Note:</i> - * This method will not perform a call to the slave, cause this call can only be - * invoked from inside the conference room, that means all clients are on the - * same server, no matter if clustered or not. + * Kick a user by its public SID * * @param sid - * @param uid - * @return - true in case user have sufficient permissions, null otherwise + * The SID from getSession + * @param uid the uid of the client + * @return - <code>true</code> if user was kicked */ - private static boolean kickUserByUid(String uid) { - StreamClient rcl = getBean(SessionManager.class).getClientByUid(uid, null); - - if (rcl == null) { - return true; - } - String scopeName = "hibernate"; - if (rcl.getRoomId() != null) { - scopeName = rcl.getRoomId().toString(); - } - ScopeApplicationAdapter apapter = getBean(ScopeApplicationAdapter.class); - IScope currentScope = apapter.getRoomScope(scopeName); - - Map<Integer, String> messageObj = new HashMap<>(); - messageObj.put(0, "kick"); - - apapter.sendMessageById(messageObj, rcl.getId(), currentScope); - apapter.roomLeaveByScope(rcl, currentScope); - - return true; - } - - /* (non-Javadoc) - * @see org.apache.openmeetings.webservice.cluster.UserService#kick(java.lang.String, java.lang.String) - */ - @Override @WebMethod @POST @Path("/kick/{uid}") public ServiceResult kick(@WebParam(name="sid") @QueryParam("sid") String sid, @WebParam(name="uid") @PathParam("uid") String uid) throws ServiceException { try { if (AuthLevelUtil.hasWebServiceLevel(getRights(sid))) { - boolean success = kickUserByUid(uid); + boolean success = getBean(IUserManager.class).kickById(uid); return new ServiceResult(Boolean.TRUE.equals(success) ? 1L : 0L, Boolean.TRUE.equals(success) ? "deleted" : "not deleted", Type.SUCCESS); } else { @@ -388,10 +398,14 @@ public class UserWebService extends BaseWebService implements UserService { } } - /* (non-Javadoc) - * @see org.apache.openmeetings.webservice.cluster.UserService#count(java.lang.String, java.lang.Long) + /** + * Returns the count of users currently in the Room with given id + * No admin rights are necessary for this call + * + * @param sid The SID from UserService.getSession + * @param roomId id of the room to get users + * @return number of users as int */ - @Override @WebMethod @GET @Path("/count/{roomid}") http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/cluster/RestClient.java ---------------------------------------------------------------------- diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/cluster/RestClient.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/cluster/RestClient.java deleted file mode 100644 index 856beea..0000000 --- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/cluster/RestClient.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License") + you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.openmeetings.webservice.cluster; - -import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; -import static org.apache.openmeetings.webservice.Constants.TNS; -import static org.apache.openmeetings.webservice.Constants.USER_SERVICE_NAME; -import static org.apache.openmeetings.webservice.Constants.USER_SERVICE_PORT_NAME; - -import java.net.URL; - -import javax.xml.namespace.QName; -import javax.xml.ws.Service; - -import org.apache.openmeetings.db.dto.basic.ServiceResult; -import org.apache.openmeetings.db.entity.server.Server; -import org.red5.logging.Red5LoggerFactory; -import org.slf4j.Logger; - -/** - * - * Performs call to the WebService Gateway to load the server load from the - * slave's of the cluster - * - * @author sebawagner - * - */ -public class RestClient { - private static final Logger log = Red5LoggerFactory.getLogger(RestClient.class, webAppRootKey); - private final static QName USER_SERVICE_QNAME = new QName(TNS, USER_SERVICE_NAME); - private final static QName USER_SERVICE_PORT_QNAME = new QName(TNS, USER_SERVICE_PORT_NAME); - - private enum Action { - //kick the user from the server - KICK_USER, - } - - private final String host; - private final int port; - private final String protocol; - private final String webapp; - private final String user; - private final String pass; - - private boolean loginSuccess = false; - private String sessionId; - - private String publicSID; - - private String getUserServiceWsdl() { - return String.format("%s://%s:%s/%s/services/UserService?wsdl", protocol, host, port, webapp); - } - - /** - * The observerInstance will be notified whenever a ping was completed - * - * @param observerInstance - * @param host - * @param port - * @param protocol - * @param webapp - * @param user - * @param pass - */ - public RestClient(Server server) { - this.host = server.getAddress(); - this.port = server.getPort(); - this.protocol = server.getProtocol(); - this.webapp = server.getWebapp(); - this.user = server.getUser(); - this.pass = server.getPass(); - } - - /** - * Main method to perform tests - * - * @param strings - */ - public static void main(String... strings) { - RestClient rClient = new RestClient("127.0.0.1", 5080, "http", "openmeetings", "admin", "12345"); - try { - rClient.loginUser(Action.KICK_USER); - } catch (Exception e) { - log.error("Error", e); - } - } - - /** - * for simple testing this method provides a version of the constructor - * without need for a server entity.<br/> - * <br/> - * There is no spring or JPA enhanced class in use here. This Object is - * stored in session/memory - * - * @param host - * @param port - * @param protocol - * @param webapp - * @param user - * @param pass - */ - private RestClient(String host, int port, String protocol, String webapp, String user, String pass) { - this.host = host; - this.port = port; - this.protocol = protocol; - this.webapp = webapp; - this.user = user; - this.pass = pass; - } - - /** - * compare if the details here and the one stored are still the same - * - * @param server2 - * @return - */ - public boolean hasServerDetailsChanged(Server server2) { - return !host.equals(server2.getAddress()) - || port != server2.getPort() - || !user.equals(server2.getUser()) - || !pass.equals(server2.getPass()) - || !webapp.equals(server2.getWebapp()) - || !protocol.equals(server2.getProtocol()); - } - - private UserService getUserClient() throws Exception { - URL wsdlURL = new URL(getUserServiceWsdl()); - Service service = Service.create(wsdlURL, USER_SERVICE_QNAME); - return service.getPort(USER_SERVICE_PORT_QNAME, UserService.class); - } - - /** - * Login the user via REST - * - * @throws Exception - */ - public void loginUser(Action action) throws Exception { - UserService client = getUserClient(); - - ServiceResult result = client.login(user, pass); - - loginSuccess = result.getCode() > 0; - - switch (action) { - case KICK_USER: - kickUserInternl(); - break; - default: - throw new Exception("No action defined"); - } - } - - /** - * sets the publicSID and removes a user from a slave host by calling a REST service - * - * @param publicSID - */ - public void kickUser(String publicSID) { - this.publicSID = publicSID; - kickUserInternl(); - } - - private void kickUserInternl() { - try { - if (!loginSuccess) { - loginUser(Action.KICK_USER); - } - - UserService client = getUserClient(); - ServiceResult result = client.kick(sessionId, publicSID); - - if (result.getCode() == 0) { - throw new Exception("Could not delete user from slave host"); - } - - } catch (Exception err) { - log.error("[kickUser failed]", err); - } - } -} http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/cluster/SlaveHTTPConnectionManager.java ---------------------------------------------------------------------- diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/cluster/SlaveHTTPConnectionManager.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/cluster/SlaveHTTPConnectionManager.java deleted file mode 100644 index 1f83615..0000000 --- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/cluster/SlaveHTTPConnectionManager.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License") + you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.openmeetings.webservice.cluster; - -import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import org.apache.openmeetings.core.remote.ISlaveHTTPConnectionManager; -import org.apache.openmeetings.db.entity.server.Server; -import org.red5.logging.Red5LoggerFactory; -import org.slf4j.Logger; - -/** - * Manages connections to the other nodes of the cluster. - * - * Use-case: When you kick a user via the admin-panel, it is probably on anther server. - * So you need to perform a REST call to the node and let that node do the actual disconnect. - * - * @author sebawagner - * - */ -public class SlaveHTTPConnectionManager implements ISlaveHTTPConnectionManager { - private static Logger log = Red5LoggerFactory.getLogger(SlaveHTTPConnectionManager.class, webAppRootKey); - - /** - * We store the list of RestClients in the memory, so that we can simply - * call ping to get the load, without the need to get a new session Hash and - * to login again. <br/> - * There can be only one RestClient per server, so we use the primary key of - * the server to store the RestClient. - */ - private static Map<Long, RestClient> restClientsSessionStore = new ConcurrentHashMap<>(); - - /** - * Synchronized, cause nobody should manipulate the object while another - * process requests it, the scheduler could run several times and request - * the same object, add or remove it.<br/> - * If there is no object yet, create one. - * - * @param server - */ - private static RestClient getRestClient(Server server) { - RestClient restClient = restClientsSessionStore.get(server.getId()); - - // check if any values of the server have been changed, - // if yes, we need a new RestClient to make sure it will re-login to the - // changed server details - if (restClient != null && restClient.hasServerDetailsChanged(server)) { - log.debug("Server details changed, get new rest client"); - restClient = null; - } - - if (restClient == null) { - restClient = new RestClient(server); - restClientsSessionStore.put(server.getId(), restClient); - } - return restClient; - } - - /** - * Gets the current {@link RestClient} from the session store and then - * performs a kickUser on that. It is not possible that there is no - * {@link RestClient}, because if you want to kick a user from a slave, the - * master <i>must</i> already have loaded the sessions from the slave, so - * there logically <i>must</i> by a {@link RestClient} available that has an - * open connection to that slave / {@link Server} - * - * @param serverId - * @param publicSID - */ - @Override - public void kickSlaveUser(Server server, String publicSID) throws Exception { - RestClient rClient = getRestClient(server); - - if (rClient == null) { - throw new Exception("No RestClient found for server " + server); - } - - rClient.kickUser(publicSID); - } -} http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/cluster/UserService.java ---------------------------------------------------------------------- diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/cluster/UserService.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/cluster/UserService.java deleted file mode 100644 index ee26d20..0000000 --- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/cluster/UserService.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License") + you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.openmeetings.webservice.cluster; - -import static org.apache.openmeetings.webservice.Constants.TNS; -import static org.apache.openmeetings.webservice.Constants.USER_SERVICE_NAME; -import static org.apache.openmeetings.webservice.Constants.USER_SERVICE_PORT_NAME; - -import java.util.List; - -import javax.jws.WebParam; -import javax.jws.WebService; -import javax.ws.rs.FormParam; -import javax.ws.rs.PathParam; -import javax.ws.rs.QueryParam; - -import org.apache.openmeetings.db.dto.basic.ServiceResult; -import org.apache.openmeetings.db.dto.room.RoomOptionsDTO; -import org.apache.openmeetings.db.dto.user.ExternalUserDTO; -import org.apache.openmeetings.db.dto.user.UserDTO; -import org.apache.openmeetings.webservice.error.ServiceException; - -/** - * This interface is required for RestClient - */ -@WebService(serviceName = USER_SERVICE_NAME, targetNamespace = TNS, portName = USER_SERVICE_PORT_NAME) -public interface UserService { - - /** - * @param user - login or email of Openmeetings user with admin or SOAP-rights - * @param pass - password - * - * @return - {@link ServiceResult} with error code or SID and userId - */ - ServiceResult login(@WebParam(name="user") @QueryParam("user") String user, @WebParam(name="pass") @QueryParam("pass") String pass); - - /** - * Lists all users in the system! - * - * @param sid - * The SID from getSession - * - * @return - list of users - * @throws ServiceException - */ - List<UserDTO> get(@WebParam(name="sid") @QueryParam("sid") String sid) throws ServiceException; - - /** - * Adds a new User like through the Frontend, but also does activates the - * Account To do SSO see the methods to create a hash and use those ones! - * - * @param sid - * The SID from getSession - * @param user - * user object - * @param confirm - * whatever or not to send email, leave empty for auto-send - * - * @return - id of the user added or error code - * @throws ServiceException - */ - UserDTO add( - @WebParam(name="sid") @QueryParam("sid") String sid - , @WebParam(name="user") @QueryParam("user") UserDTO user - , @WebParam(name="confirm") @QueryParam("confirm") Boolean confirm - ) throws ServiceException; - - /** - * - * Delete a certain user by its id - * - * @param sid - * The SID from getSession - * @param id - * the openmeetings user id - * - * @return - id of the user deleted, error code otherwise - * @throws ServiceException - */ - ServiceResult delete(@WebParam(name="sid") @QueryParam("sid") String sid, @WebParam(name="id") @PathParam("id") long id) throws ServiceException; - - /** - * - * Delete a certain user by its external user id - * - * @param sid - * The SID from getSession - * @param externalId - * externalUserId - * @param externalType - * externalUserId - * - * @return - id of user deleted, or error code - * @throws ServiceException - */ - ServiceResult deleteExternal( - @WebParam(name="sid") @QueryParam("sid") String sid - , @WebParam(name="externaltype") @PathParam("externaltype") String externalType - , @WebParam(name="externalid") @PathParam("externalid") String externalId - ) throws ServiceException; - - /** - * Description: sets the SessionObject for a certain SID, after setting this - * Session-Object you can use the SID + a RoomId to enter any Room. ... - * Session-Hashs are deleted 15 minutes after the creation if not used. - * - * @param sid - * The SID from getSession - * @param user - * user details to set - * @param options - * room options to set - * - * @return - secure hash or error code - * @throws ServiceException - */ - ServiceResult getRoomHash( - @WebParam(name="sid") @QueryParam("sid") String sid - , @WebParam(name="user") @FormParam("user") ExternalUserDTO user - , @WebParam(name="options") @FormParam("options") RoomOptionsDTO options - ) throws ServiceException; - - /** - * Kick a user by its public SID - * - * @param sid - * The SID from getSession - * @param uid the uid of the client - * @return - <code>true</code> if user was kicked - */ - ServiceResult kick(@WebParam(name="sid") @QueryParam("sid") String sid, @WebParam(name="uid") @PathParam("uid") String uid) throws ServiceException; - - /** - * Returns the count of users currently in the Room with given id - * No admin rights are necessary for this call - * - * @param sid The SID from UserService.getSession - * @param roomId id of the room to get users - * @return number of users as int - */ - ServiceResult count(@WebParam(name="sid") @QueryParam("sid") String sid, @WebParam(name="roomid") @PathParam("roomid") Long roomId); -}
