http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/Server.java ---------------------------------------------------------------------- diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/Server.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/Server.java deleted file mode 100644 index 046bc92..0000000 --- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/Server.java +++ /dev/null @@ -1,304 +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.db.entity.server; - -import java.util.Calendar; -import java.util.Date; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.Lob; -import javax.persistence.ManyToOne; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.Table; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlRootElement; - -import org.apache.openjpa.persistence.jdbc.ForeignKey; -import org.apache.openmeetings.db.entity.IDataProviderEntity; -import org.apache.openmeetings.db.entity.user.User; -import org.simpleframework.xml.Element; -import org.simpleframework.xml.Root; - -@Entity -@NamedQueries({ - @NamedQuery(name = "getAllServers", query = "SELECT s FROM Server s WHERE s.deleted = false ORDER BY s.id"), - @NamedQuery(name = "getServerCount", query = "SELECT COUNT(s) FROM Server s WHERE s.deleted = false"), - @NamedQuery(name = "getServerById", query = "SELECT s FROM Server s LEFT JOIN FETCH s.insertedby LEFT JOIN FETCH s.updatedby WHERE s.deleted = false AND s.id = :id"), - @NamedQuery(name = "getServerByName", query = "SELECT s FROM Server s WHERE s.deleted = false AND s.name LIKE :name"), - @NamedQuery(name = "getServerByAddress", query = "SELECT s FROM Server s WHERE s.deleted = false AND s.address LIKE :address"), - @NamedQuery(name = "getServersWithNoUsers", query = "SELECT s FROM Server s WHERE s.deleted = false AND s.id NOT IN (SELECT u.server.id FROM User u where u.server.id IS NOT NULL)"), - @NamedQuery(name = "getServerWithMinimumUsers", query = "SELECT s.id, COUNT(u) AS cnt FROM User u JOIN u.server s WHERE s.deleted = false GROUP BY s.id ORDER BY cnt"), - @NamedQuery(name = "getActiveServers", query = "SELECT s FROM Server s WHERE s.deleted = false AND s.active = true") // -}) -@Table(name = "server") -@Root -@XmlRootElement -@XmlAccessorType(XmlAccessType.FIELD) -public class Server implements IDataProviderEntity { - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "id") - @Element(data = true) - private Long id; - - @Column(name = "name") - @Element(data = true) - private String name; - - @Column(name = "address") - @Element(data = true) - private String address; - - @Column(name = "inserted") - public Date inserted; - - @Column(name = "updated") - public Date updated; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "insertedby_id", updatable = true, insertable = true) - @ForeignKey(enabled = true) - public User insertedby; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "updatedby_id", updatable = true, insertable = true) - @ForeignKey(enabled = true) - public User updatedby; - - @Lob - @Column(name = "comment", length = 2048) - @Element(data = true, required = false) - private String comment; - - @Column(name = "last_ping", nullable = true) - @Element(data = true, required = false) - private Calendar lastPing; - - @Column(name = "port", nullable = true) - @Element(data = true, required = false) - private int port; - - @Column(name = "protocol", nullable = true) - @Element(data = true, required = false) - private String protocol; - - @Column(name = "webapp", nullable = true) - @Element(data = true, required = false) - private String webapp; - - @Column(name = "login", nullable = true) - @Element(data = true, required = false) - private String user; - - @Column(name = "pass", nullable = true) - @Element(data = true, required = false) - private String pass; - - @Column(name = "active", nullable = false) - @Element(data = true, required = false) - private boolean active; - - @Column(name = "deleted", nullable = false) - @Element(data = true) - private boolean deleted = false; - - @Override - public Long getId() { - return id; - } - - @Override - public void setId(Long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getAddress() { - return address; - } - - public void setAddress(String address) { - this.address = address; - } - - public boolean isDeleted() { - return deleted; - } - - public void setDeleted(boolean deleted) { - this.deleted = deleted; - } - - public Date getInserted() { - return inserted; - } - - public void setInserted(Date inserted) { - this.inserted = inserted; - } - - public Date getUpdated() { - return updated; - } - - public void setUpdated(Date updated) { - this.updated = updated; - } - - public User getInsertedby() { - return insertedby; - } - - public void setInsertedby(User insertedby) { - this.insertedby = insertedby; - } - - public User getUpdatedby() { - return updatedby; - } - - public void setUpdatedby(User updatedby) { - this.updatedby = updatedby; - } - - public String getComment() { - return comment; - } - - public void setComment(String comment) { - this.comment = comment; - } - - public Calendar getLastPing() { - return lastPing; - } - - public void setLastPing(Calendar lastPing) { - this.lastPing = lastPing; - } - - public int getPort() { - return port; - } - - public void setPort(int port) { - this.port = port; - } - - public String getProtocol() { - return protocol; - } - - public void setProtocol(String protocol) { - this.protocol = protocol; - } - - public String getWebapp() { - return webapp; - } - - public void setWebapp(String webapp) { - this.webapp = webapp; - } - - public String getUser() { - return user; - } - - public void setUser(String user) { - this.user = user; - } - - public String getPass() { - return pass; - } - - public void setPass(String pass) { - this.pass = pass; - } - - public void setId(long id) { - this.id = id; - } - - public boolean isActive() { - return active; - } - - public void setActive(boolean active) { - this.active = active; - } - - @Override - public String toString() { - return "Server [id=" + id + ", name=" + name + ", address=" + address - + ", port=" + port + ", user=" + user + ", pass=" + pass - + ", protocol=" + protocol - + ", active=" + active + ", webapp=" + webapp + ", deleted=" - + deleted + "]"; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((address == null) ? 0 : address.hashCode()); - result = prime * result + ((id == null) ? 0 : id.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Server other = (Server) obj; - if (address == null) { - if (other.address != null) - return false; - } else if (!address.equals(other.address)) - return false; - if (id == null) { - if (other.id != null) - return false; - } else if (!id.equals(other.id)) - return false; - return true; - } -}
http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java ---------------------------------------------------------------------- diff --git a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java index 267d178..17bf2e7 100644 --- a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java +++ b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java @@ -49,7 +49,6 @@ import org.apache.openmeetings.db.dao.room.RoomDao; import org.apache.openmeetings.db.dao.room.RoomGroupDao; import org.apache.openmeetings.db.dao.server.LdapConfigDao; import org.apache.openmeetings.db.dao.server.OAuth2Dao; -import org.apache.openmeetings.db.dao.server.ServerDao; import org.apache.openmeetings.db.dao.user.GroupDao; import org.apache.openmeetings.db.dao.user.PrivateMessageDao; import org.apache.openmeetings.db.dao.user.PrivateMessageFolderDao; @@ -124,8 +123,6 @@ public class BackupExport { @Autowired private OAuth2Dao auth2Dao; @Autowired - private ServerDao serverDao; - @Autowired private GroupDao groupDao; @Autowired private RoomDao roomDao; @@ -249,12 +246,6 @@ public class BackupExport { progressHolder.setProgress(35); /* - * ##################### Cluster servers - */ - writeList(ser, zos, "servers.xml", "servers", serverDao.get(0, Integer.MAX_VALUE)); - progressHolder.setProgress(40); - - /* * ##################### OAuth2 servers */ writeList(ser, zos, "oauth2servers.xml", "oauth2servers", auth2Dao.get(0, Integer.MAX_VALUE)); http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java ---------------------------------------------------------------------- diff --git a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java index c4660c7..fad26ab 100644 --- a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java +++ b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java @@ -81,7 +81,6 @@ import org.apache.openmeetings.db.dao.room.RoomDao; import org.apache.openmeetings.db.dao.room.RoomGroupDao; import org.apache.openmeetings.db.dao.server.LdapConfigDao; import org.apache.openmeetings.db.dao.server.OAuth2Dao; -import org.apache.openmeetings.db.dao.server.ServerDao; import org.apache.openmeetings.db.dao.user.GroupDao; import org.apache.openmeetings.db.dao.user.PrivateMessageDao; import org.apache.openmeetings.db.dao.user.PrivateMessageFolderDao; @@ -104,7 +103,6 @@ import org.apache.openmeetings.db.entity.room.RoomPoll; import org.apache.openmeetings.db.entity.room.RoomPollAnswer; import org.apache.openmeetings.db.entity.server.LdapConfig; import org.apache.openmeetings.db.entity.server.OAuthServer; -import org.apache.openmeetings.db.entity.server.Server; import org.apache.openmeetings.db.entity.user.Address; import org.apache.openmeetings.db.entity.user.Group; import org.apache.openmeetings.db.entity.user.GroupUser; @@ -172,8 +170,6 @@ public class BackupImport { @Autowired private ChatDao chatDao; @Autowired - private ServerDao serverDao; - @Autowired private OAuth2Dao auth2Dao; @Autowired private GroupDao groupDao; @@ -519,19 +515,7 @@ public class BackupImport { } } - log.info("Meeting members import complete, starting cluster server import"); - /* - * ##################### Cluster servers - */ - { - List<Server> list = readList(simpleSerializer, f, "servers.xml", "servers", Server.class, true); - for (Server s : list) { - s.setId(null); - serverDao.update(s, null); - } - } - - log.info("Cluster servers import complete, starting recordings import"); + log.info("Meeting members import complete, starting recordings server import"); /* * ##################### Import Recordings */ http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java ---------------------------------------------------------------------- diff --git a/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java b/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java index 2780549..ce08026 100644 --- a/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java +++ b/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java @@ -165,8 +165,7 @@ public class ImportInitvalues { navimanagement.addMainStructure("adminModuleLDAP", null, 20, "1103", LEVEL_ADMIN, "Administration of LDAP Configs", admin.getId(), "1460"); navimanagement.addMainStructure("adminModuleOAuth", null, 21, "1571", LEVEL_ADMIN, "Administration of OAuth2 servers", admin.getId(), "1572"); navimanagement.addMainStructure("adminModuleBackup", null, 22, "367", LEVEL_ADMIN, "Administration of Backups", admin.getId(), "1461"); - navimanagement.addMainStructure("adminModuleServers", null, 23, "1498", LEVEL_ADMIN, "Administration of Servers", admin.getId(), "1499"); - navimanagement.addMainStructure("adminModuleEmail", null, 24, "main.menu.admin.email", LEVEL_ADMIN, "Administration of Emails", admin.getId(), "main.menu.admin.email.desc"); + navimanagement.addMainStructure("adminModuleEmail", null, 23, "main.menu.admin.email", LEVEL_ADMIN, "Administration of Emails", admin.getId(), "main.menu.admin.email.desc"); log.debug("MainMenu ADDED"); } http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-server/src/site/xdoc/Clustering.xml ---------------------------------------------------------------------- diff --git a/openmeetings-server/src/site/xdoc/Clustering.xml b/openmeetings-server/src/site/xdoc/Clustering.xml index e791f6e..a76ac5f 100644 --- a/openmeetings-server/src/site/xdoc/Clustering.xml +++ b/openmeetings-server/src/site/xdoc/Clustering.xml @@ -132,22 +132,12 @@ ]]></source> </li> <li> - <p>In the file <tt>/opt/red5/webapps/openmeetings/WEB-INF/classes/applicationContext.xml</tt>:</p> + <p>In the file <tt>/opt/red5/webapps/openmeetings/WEB-INF/classes/hazelcast.xml</tt>:</p> <ul> + <li>Set <tt>instance-name</tt> for each server to unique value</li> <li> - For each node uncomment line: - <source> -<![CDATA[ -<!-- Need to be uncommented and set to the real ID if in cluster mode--> -<property name="serverId" value="1" /> -]]> - </source> - and input the unique value for each node. - </li> - <li> - Replace <tt><ref bean="openmeetings.HashMapStore" /> <!-- Memory based session cache by default --></tt><br/> - with <tt><ref bean="openmeetings.DatabaseStore" /></tt> - (Currently commented out with following comment: <tt>"The following section should be used in clustering mode"</tt>) + In case there are more than one network interface with multicast support and/or additional hazelcast configuration is required + Based on the following documentation: <a href="http://docs.hazelcast.org/docs/3.8.3/manual/html-single/index.html">http://docs.hazelcast.org/docs/3.8.3/manual/html-single/index.html</a> </li> </ul> </li> http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java ---------------------------------------------------------------------- diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java index bcef9cf..489751d 100644 --- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java +++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java @@ -31,7 +31,7 @@ import java.util.Map; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.math.NumberUtils; import org.apache.openmeetings.core.data.whiteboard.WhiteboardCache; -import org.apache.openmeetings.core.session.SessionManager; +import org.apache.openmeetings.db.dao.server.ISessionManager; import org.apache.openmeetings.db.dao.server.SessiondataDao; import org.apache.openmeetings.db.dao.user.UserDao; import org.apache.openmeetings.db.dto.room.Whiteboard; @@ -52,7 +52,7 @@ public class CleanupJob extends AbstractJob { @Autowired private SessiondataDao sessionDao; @Autowired - private SessionManager sessionManager; + private ISessionManager sessionManager; @Autowired private WhiteboardCache wbManager; @Autowired @@ -128,7 +128,7 @@ public class CleanupJob extends AbstractJob { } } } - if (folder.isDirectory() && roomId != null && sessionManager.getClientListByRoom(roomId).isEmpty()) { + if (folder.isDirectory() && roomId != null && sessionManager.listByRoom(roomId).isEmpty()) { File[] files = folder.listFiles(); //TODO need to rework this and remove hardcodings if (files != null) { http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java ---------------------------------------------------------------------- diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java index 8d2a829..a42cbcc 100644 --- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java +++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java @@ -413,7 +413,7 @@ public class UserManager implements IUserManager { try { sessionDao.clearSessionByRoomId(roomId); - for (StreamClient rcl : sessionManager.getClientListByRoom(roomId)) { + for (StreamClient rcl : sessionManager.listByRoom(roomId)) { if (rcl == null) { return true; } @@ -436,9 +436,9 @@ public class UserManager implements IUserManager { } @Override - public boolean kickById(Long id) { + public boolean kickById(String uid) { try { - StreamClient rcl = sessionManager.get(id); + StreamClient rcl = sessionManager.get(uid); if (rcl == null) { return true; http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/pom.xml ---------------------------------------------------------------------- diff --git a/openmeetings-web/pom.xml b/openmeetings-web/pom.xml index 7e4a52c..7b41678 100644 --- a/openmeetings-web/pom.xml +++ b/openmeetings-web/pom.xml @@ -407,6 +407,11 @@ <version>${wickets.version}</version> </dependency> <dependency> + <groupId>org.wicketstuff</groupId> + <artifactId>wicketstuff-datastore-hazelcast</artifactId> + <version>${wickets.version}</version> + </dependency> + <dependency> <groupId>org.apache.wicket</groupId> <artifactId>wicket-auth-roles</artifactId> <version>${wicket.version}</version> http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java index c7426af..37e315d 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java @@ -27,10 +27,10 @@ import java.util.Iterator; import java.util.List; import org.apache.openmeetings.db.dao.server.ISessionManager; +import org.apache.openmeetings.db.dao.user.IUserManager; import org.apache.openmeetings.db.entity.basic.Client; import org.apache.openmeetings.db.entity.basic.IClient; import org.apache.openmeetings.db.entity.room.StreamClient; -import org.apache.openmeetings.service.user.UserManager; import org.apache.openmeetings.web.admin.AdminPanel; import org.apache.openmeetings.web.admin.SearchableDataView; import org.apache.openmeetings.web.app.Application; @@ -58,7 +58,7 @@ public class ConnectionsPanel extends AdminPanel { private List<IClient> list() { List<IClient> l = new ArrayList<>(); - l.addAll(getBean(ISessionManager.class).getClientsWithServer()); + l.addAll(getBean(ISessionManager.class).list()); l.addAll(Application.getClients()); return l; } @@ -90,8 +90,7 @@ public class ConnectionsPanel extends AdminPanel { protected void onSubmit(AjaxRequestTarget target) { IClient _c = item.getModelObject(); if (_c instanceof StreamClient) { - StreamClient c = (StreamClient)_c; - getBean(UserManager.class).kickById(c.getId()); + getBean(IUserManager.class).kickById(_c.getUid()); } else { Client c = (Client)_c; Application.get().invalidateClient(c.getUserId(), c.getSessionId()); @@ -105,7 +104,6 @@ public class ConnectionsPanel extends AdminPanel { item.add(new Label("login", c.getUsername())); item.add(new Label("since", c.getConnectedSince())); item.add(new Label("scope")); - item.add(new Label("server", c.getServer() == null ? "no cluster" : c.getServer().getAddress())); //FIXME localization confirm.setEnabled(!c.isSharing()); } else { Client c = (Client)_c; @@ -113,8 +111,8 @@ public class ConnectionsPanel extends AdminPanel { item.add(new Label("login", c.getUser().getLogin())); item.add(new Label("since", c.getConnectedSince())); item.add(new Label("scope", c.getRoomId() == null ? "html5" : "" + c.getRoomId())); - item.add(new Label("server", "")); } + item.add(new Label("server", _c.getServerId())); item.add(confirm); item.add(new AjaxEventBehavior("click") { private static final long serialVersionUID = 1L; http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java index 869b36d..1afba1d 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java @@ -96,7 +96,7 @@ public class RoomForm extends AdminBaseForm<Room> { @Override protected void onSubmit(AjaxRequestTarget target) { StreamClient c = item.getModelObject(); - getBean(UserManager.class).kickById(c.getId()); + getBean(UserManager.class).kickById(c.getUid()); updateClients(target); } }); @@ -321,7 +321,7 @@ public class RoomForm extends AdminBaseForm<Room> { void updateClients(AjaxRequestTarget target) { long roomId = (getModelObject().getId() != null ? getModelObject().getId() : 0); - final List<StreamClient> clientsInRoom = getBean(ISessionManager.class).getClientListByRoom(roomId); + final List<StreamClient> clientsInRoom = getBean(ISessionManager.class).listByRoom(roomId); clients.setDefaultModelObject(clientsInRoom); target.add(clientsContainer); } http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/servers/ServerForm.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/servers/ServerForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/servers/ServerForm.java deleted file mode 100644 index c40315e..0000000 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/servers/ServerForm.java +++ /dev/null @@ -1,140 +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.web.admin.servers; - -import static org.apache.openmeetings.util.OpenmeetingsVariables.WEB_DATE_PATTERN; -import static org.apache.wicket.datetime.markup.html.basic.DateLabel.forDatePattern; - -import org.apache.openmeetings.db.dao.server.ServerDao; -import org.apache.openmeetings.db.entity.server.Server; -import org.apache.openmeetings.web.admin.AdminBaseForm; -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.form.AjaxFormValidatingBehavior; -import org.apache.wicket.markup.html.WebMarkupContainer; -import org.apache.wicket.markup.html.basic.Label; -import org.apache.wicket.markup.html.form.CheckBox; -import org.apache.wicket.markup.html.form.Form; -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.CompoundPropertyModel; -import org.apache.wicket.model.Model; -import org.apache.wicket.util.time.Duration; - -/** - * Form component to insert/update/delete {@link Server} - * - * @author swagner - * - */ -public class ServerForm extends AdminBaseForm<Server> { - private final WebMarkupContainer listContainer; - private static final long serialVersionUID = 1L; - - public ServerForm(String id, WebMarkupContainer listContainer, final Server server) { - super(id, new CompoundPropertyModel<>(server)); - setOutputMarkupId(true); - this.listContainer = listContainer; - - add(new RequiredTextField<String>("name").setLabel(Model.of(Application.getString(1500)))); - add(new CheckBox("active")); - add(new RequiredTextField<String>("address").setLabel(Model.of(Application.getString(1501)))); - add(new TextField<Integer>("port")); - add(new TextField<String>("user")); - add(new TextField<String>("pass")); - add(new TextField<String>("webapp")); - add(new TextField<String>("protocol")); - add(forDatePattern("lastPing", WEB_DATE_PATTERN)); - //add(new Label("pingRunning")); - add(forDatePattern("inserted", WEB_DATE_PATTERN)); - add(new Label("insertedby.login")); - add(forDatePattern("updated", WEB_DATE_PATTERN)); - add(new Label("updatedby.login")); - add(new TextArea<String>("comment")); - - // attach an ajax validation behavior to all form component's keydown - // event and throttle it down to once per second - add(new AjaxFormValidatingBehavior("keydown", Duration.ONE_SECOND)); - } - - @Override - protected void onSaveSubmit(AjaxRequestTarget target, Form<?> form) { - Application.getBean(ServerDao.class).update(getModelObject(), WebSession.getUserId()); - Server server = Application.getBean(ServerDao.class).get(getModelObject().getId()); - setModelObject(server); - hideNewRecord(); - target.add(this); - target.add(listContainer); - target.appendJavaScript("adminPanelInit();"); - } - - @Override - protected void onNewSubmit(AjaxRequestTarget target, Form<?> form) { - Server s = new Server(); - s.setWebapp("openmeetings"); - s.setProtocol("http"); - setModelObject(s); - target.add(this); - target.appendJavaScript("adminPanelInit();"); - } - - @Override - protected void onRefreshSubmit(AjaxRequestTarget target, Form<?> form) { - Server server = getModelObject(); - if (server.getId() != null) { - server = Application.getBean(ServerDao.class).get(server.getId()); - } else { - server = new Server(); - } - setModelObject(server); - target.add(this); - target.appendJavaScript("adminPanelInit();"); - } - - @Override - protected void onDeleteSubmit(AjaxRequestTarget target, Form<?> form) { - Application.getBean(ServerDao.class).delete(getModelObject(), WebSession.getUserId()); - this.setModelObject(new Server()); - target.add(listContainer); - target.add(this); - target.appendJavaScript("adminPanelInit();"); - } - - @Override - protected void onSaveError(AjaxRequestTarget target, Form<?> form) { - // TODO Auto-generated method stub - } - - @Override - protected void onNewError(AjaxRequestTarget target, Form<?> form) { - // TODO Auto-generated method stub - } - - @Override - protected void onRefreshError(AjaxRequestTarget target, Form<?> form) { - // TODO Auto-generated method stub - } - - @Override - protected void onDeleteError(AjaxRequestTarget target, Form<?> form) { - // TODO Auto-generated method stub - } -} http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/servers/ServersPanel.html ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/servers/ServersPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/servers/ServersPanel.html deleted file mode 100644 index 187b748..0000000 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/servers/ServersPanel.html +++ /dev/null @@ -1,103 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - 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. - ---> -<html xmlns:wicket="http://wicket.apache.org"> -<wicket:extend> - <div class="adminPanelColumnTable"> - <span wicket:id="navigator">[dataview navigator]</span> - <table class="adminListTable"> - <thead> - <tr> - <th class="three_column_layout_column1 ui-widget-header"><span wicket:id="orderById"></span><wicket:message key="188" /></th> - <th class="three_column_layout_column2 ui-widget-header"><span wicket:id="orderByName"></span><wicket:message key="1500" /></th> - <th class="three_column_layout_column3 ui-widget-header"><span wicket:id="orderByAddress"></span><wicket:message key="1501" /></th> - </tr> - </thead> - </table> - <div class="tableWrapper" id="adminTable"> - <table class="adminListTable"> - <tbody wicket:id="listContainer"> - <tr wicket:id="serverList"> - <td class="three_column_layout_column1"><div class="three_column_layout_divcolumn1"><span wicket:id="id"></span></div></td> - <td class="three_column_layout_column2"><div class="three_column_layout_divcolumn2"><span wicket:id="name"></span></div></td> - <td class="three_column_layout_column3"><div class="three_column_layout_divcolumn3"><span wicket:id="address"></span></div></td> - </tr> - </tbody> - </table> - </div> - </div> - <div class="adminPanelColumnForm"> - <form wicket:id="form" class="adminForm"> - <div wicket:id="buttons"></div> - <div class="scrollcontent" id="adminForm"> - <fieldset class="ui-widget-content"> - <legend class="ui-widget-header"><wicket:message key="1502" /></legend> - <div class="formelement"> - <label wicket:for="name"><wicket:message key="1500" /></label><input type="text" wicket:id="name"/> - </div> - <div class="formelement"> - <label wicket:for="active"><wicket:message key="1525" /></label><input type="checkbox" class="formcheckbox" wicket:id="active" /> - </div> - <div class="formelement"> - <label wicket:for="address"><wicket:message key="1501" /></label><input type="text" wicket:id="address"/> - </div> - <div class="formelement"> - <label wicket:for="port"><wicket:message key="1519" /></label><input type="text" wicket:id="port"/> - </div> - <div class="formelement"> - <label wicket:for="user"><wicket:message key="1520" /></label><input type="text" wicket:id="user"/> - </div> - <div class="formelement"> - <label wicket:for="pass"><wicket:message key="1521" /></label><input type="text" wicket:id="pass"/> - </div> - <div class="formelement"> - <label wicket:for="webapp"><wicket:message key="1522" /></label><input type="text" wicket:id="webapp"/> - </div> - <div class="formelement"> - <label wicket:for="protocol"><wicket:message key="1523" /></label><input type="text" wicket:id="protocol"/> - </div> - <div class="formelement"> - <div class="info-text"><wicket:message key="1518" /></div> - <br/> - <label><wicket:message key="1517" /></label><span wicket:id="lastPing"/> - <!-- br/> - <label wicket:for="pingRunning"><wicket:message key="1524" /></label><span wicket:id="pingRunning"/--> - </div> - <div class="formelement"> - <label><wicket:message key="1110" /></label><span wicket:id="inserted"/> - </div> - <div class="formelement"> - <label><wicket:message key="1111" /></label><span wicket:id="insertedby.login"/> - </div> - <div class="formelement"> - <label><wicket:message key="1112" /></label><span wicket:id="updated"/> - </div> - <div class="formelement"> - <label><wicket:message key="1113" /></label><span wicket:id="updatedby.login"/> - </div> - <div class="formelement"> - <label wicket:for="comment"><wicket:message key="270" /></label><textarea wicket:id="comment"/> - </div> - </fieldset> - </div> - </form> - </div> -</wicket:extend> -</html> http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/servers/ServersPanel.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/servers/ServersPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/servers/ServersPanel.java deleted file mode 100644 index 1a60552..0000000 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/servers/ServersPanel.java +++ /dev/null @@ -1,95 +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.web.admin.servers; - -import org.apache.openmeetings.db.dao.server.ServerDao; -import org.apache.openmeetings.db.entity.server.Server; -import org.apache.openmeetings.web.admin.AdminPanel; -import org.apache.openmeetings.web.admin.SearchableDataView; -import org.apache.openmeetings.web.common.PagedEntityListPanel; -import org.apache.openmeetings.web.data.DataViewContainer; -import org.apache.openmeetings.web.data.OmOrderByBorder; -import org.apache.openmeetings.web.data.SearchableDataProvider; -import org.apache.wicket.AttributeModifier; -import org.apache.wicket.ajax.AjaxEventBehavior; -import org.apache.wicket.ajax.AjaxRequestTarget; -import org.apache.wicket.markup.html.WebMarkupContainer; -import org.apache.wicket.markup.html.basic.Label; -import org.apache.wicket.markup.repeater.Item; - -/** - * Form component with list and form to manipulate {@link Server} - * - * @author swagner - * - */ -public class ServersPanel extends AdminPanel { - private static final long serialVersionUID = 1L; - final WebMarkupContainer listContainer = new WebMarkupContainer("listContainer"); - private ServerForm form; - - public ServersPanel(String id) { - super(id); - SearchableDataView<Server> dataView = new SearchableDataView<Server>("serverList", - new SearchableDataProvider<>(ServerDao.class)) { - private static final long serialVersionUID = 1L; - - @Override - protected void populateItem(final Item<Server> item) { - final Server server = item.getModelObject(); - item.add(new Label("id")); - item.add(new Label("name")); - item.add(new Label("address")); - item.add(new AjaxEventBehavior("click") { - private static final long serialVersionUID = 1L; - - @Override - protected void onEvent(AjaxRequestTarget target) { - form.setModelObject(server); - form.hideNewRecord(); - target.add(form, listContainer); - target.appendJavaScript("adminPanelInit();"); - } - }); - item.add(AttributeModifier.replace("class", getRowClass(server.getId(), form.getModelObject().getId()))); - } - }; - - add(listContainer.add(dataView).setOutputMarkupId(true)); - PagedEntityListPanel navigator = new PagedEntityListPanel("navigator", dataView) { - private static final long serialVersionUID = 1L; - - @Override - protected void onEvent(AjaxRequestTarget target) { - target.add(listContainer); - } - }; - DataViewContainer<Server> container = new DataViewContainer<>(listContainer, dataView, navigator); - container.addLink(new OmOrderByBorder<>("orderById", "id", container)) - .addLink(new OmOrderByBorder<>("orderByName", "name", container)) - .addLink(new OmOrderByBorder<>("orderByAddress", "address", container)); - add(container.getLinks()); - add(navigator); - - form = new ServerForm("form", listContainer, new Server()); - form.showNewRecord(); - add(form); - - } -} http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java index aba8c43..03ca5cd 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java @@ -41,7 +41,6 @@ import java.util.Locale; import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; import java.util.function.Predicate; import org.apache.directory.api.util.Strings; @@ -90,6 +89,7 @@ import org.apache.openmeetings.web.user.record.Mp4RecordingResourceReference; import org.apache.openmeetings.web.util.GroupLogoResourceReference; import org.apache.openmeetings.web.util.ProfileImageResourceReference; import org.apache.openmeetings.web.util.UserDashboardPersister; +import org.apache.wicket.DefaultPageManagerProvider; import org.apache.wicket.Localizer; import org.apache.wicket.Page; import org.apache.wicket.RestartResponseException; @@ -102,6 +102,7 @@ import org.apache.wicket.core.request.handler.BookmarkableListenerRequestHandler import org.apache.wicket.core.request.handler.ListenerRequestHandler; import org.apache.wicket.core.request.mapper.MountedMapper; import org.apache.wicket.markup.html.WebPage; +import org.apache.wicket.pageStore.IDataStore; import org.apache.wicket.protocol.ws.WebSocketAwareCsrfPreventionRequestCycleListener; import org.apache.wicket.protocol.ws.api.WebSocketResponse; import org.apache.wicket.request.IRequestHandler; @@ -121,14 +122,23 @@ import org.wicketstuff.dashboard.WidgetRegistry; import org.wicketstuff.dashboard.web.DashboardContext; import org.wicketstuff.dashboard.web.DashboardContextInjector; import org.wicketstuff.dashboard.web.DashboardSettings; +import org.wicketstuff.datastores.hazelcast.HazelcastDataStore; + +import com.hazelcast.core.Hazelcast; +import com.hazelcast.core.HazelcastInstance; +import com.hazelcast.core.Member; +import com.hazelcast.core.MemberAttributeEvent; +import com.hazelcast.core.MembershipEvent; +import com.hazelcast.core.MembershipListener; public class Application extends AuthenticatedWebApplication implements IApplication { private static final Logger log = getLogger(Application.class, webAppRootKey); private static boolean isInstalled; - private static ConcurrentHashMap<String, Client> ONLINE_USERS = new ConcurrentHashMap<>(); - private static ConcurrentHashMap<String, String> UID_BY_SID = new ConcurrentHashMap<>(); - private static ConcurrentHashMap<String, Client> INVALID_SESSIONS = new ConcurrentHashMap<>(); - private static ConcurrentHashMap<Long, Set<String>> ROOMS = new ConcurrentHashMap<>(); + private final static String ONLINE_USERS_KEY = "ONLINE_USERS_KEY"; + private final static String UID_BY_SID_KEY = "UID_BY_SID_KEY"; + private final static String INVALID_SESSIONS_KEY = "INVALID_SESSIONS_KEY"; + private final static String ROOMS_KEY = "ROOMS_KEY"; + private final static String STREAM_CLIENT_KEY = "STREAM_CLIENT_KEY"; //additional maps for faster searching should be created private DashboardContext dashboardContext; private static Set<String> STRINGS_WITH_APP = new HashSet<>(); //FIXME need to be removed @@ -142,6 +152,7 @@ public class Application extends AuthenticatedWebApplication implements IApplica public static final String NOTINIT_MAPPING = "/notinited"; private String xFrameOptions = HEADER_XFRAME_SAMEORIGIN; private String contentSecurityPolicy = OpenmeetingsVariables.HEADER_CSP_SELF; + private final HazelcastInstance hazelcast = Hazelcast.newHazelcastInstance(); @Override protected void init() { @@ -149,6 +160,26 @@ public class Application extends AuthenticatedWebApplication implements IApplica getSecuritySettings().setAuthenticationStrategy(new OmAuthenticationStrategy()); getApplicationSettings().setAccessDeniedPage(AccessDeniedPage.class); + hazelcast.getCluster().addMembershipListener(new MembershipListener() { + @Override + public void memberRemoved(MembershipEvent membershipEvent) { + //server down, need to remove all online clients + } + + @Override + public void memberAttributeChanged(MemberAttributeEvent memberAttributeEvent) { + } + + @Override + public void memberAdded(MembershipEvent membershipEvent) { + } + }); + setPageManagerProvider(new DefaultPageManagerProvider(this) { + @Override + protected IDataStore newDataStore() { + return new HazelcastDataStore(hazelcast); + } + }); //Add custom resource loader at the beginning, so it will be checked first in the //chain of Resource Loaders, if not found it will search in Wicket's internal //Resource Loader for a the property key @@ -251,10 +282,43 @@ public class Application extends AuthenticatedWebApplication implements IApplica return get().dashboardContext; } + private Map<String, Client> getOnlineUsers() { + return hazelcast.getMap(ONLINE_USERS_KEY); + } + + private Map<String, String> getInvalidSessions() { + return hazelcast.getMap(INVALID_SESSIONS_KEY); + } + + private Map<Long, Set<String>> getRooms() { + return hazelcast.getMap(ROOMS_KEY); + } + + private Map<String, String> getUidBySid() { + return hazelcast.getMap(UID_BY_SID_KEY); + } + + @Override + public Set<Long> getActiveRoomIds() { + return getRooms().keySet(); + } + + @Override + public Map<String, StreamClient> getStreamClients() { + return hazelcast.getMap(STREAM_CLIENT_KEY); + } + + @Override + public StreamClient update(StreamClient c) { + hazelcast.getMap(STREAM_CLIENT_KEY).put(c.getUid(), c); + return c; + } + public static void addOnlineUser(Client c) { log.debug("Adding online client: {}, room: {}", c.getUid(), c.getRoomId()); - ONLINE_USERS.put(c.getUid(), c); - UID_BY_SID.put(c.getSid(), c.getUid()); + c.setServerId(get().getServerId()); + get().getOnlineUsers().put(c.getUid(), c); + get().getUidBySid().put(c.getSid(), c.getUid()); } public static void exitRoom(Client c) { @@ -273,7 +337,7 @@ public class Application extends AuthenticatedWebApplication implements IApplica @Override public void exit(String uid) { if (uid != null) { - exit(ONLINE_USERS.get(uid)); + exit(getOnlineUsers().get(uid)); } } @@ -283,8 +347,8 @@ public class Application extends AuthenticatedWebApplication implements IApplica exitRoom(c); } log.debug("Removing online client: {}, room: {}", c.getUid(), c.getRoomId()); - ONLINE_USERS.remove(c.getUid()); - UID_BY_SID.remove(c.getSid()); + get().getOnlineUsers().remove(c.getUid()); + get().getUidBySid().remove(c.getSid()); } } @@ -386,7 +450,7 @@ public class Application extends AuthenticatedWebApplication implements IApplica } public static Client getOnlineClient(String uid) { - return uid == null ? null : ONLINE_USERS.get(uid); + return uid == null ? null : get().getOnlineUsers().get(uid); } @Override @@ -395,17 +459,6 @@ public class Application extends AuthenticatedWebApplication implements IApplica } @Override - public List<Long> getActiveRooms() { - Set<Long> ids = new HashSet<>(); - for (Map.Entry<String, Client> e : ONLINE_USERS.entrySet()) { - if (e.getValue().getRoomId() != null) { - ids.add(e.getValue().getRoomId()); - } - } - return new ArrayList<>(ids); - } - - @Override public Client getOmClientBySid(String sid) { return getClientBySid(sid); } @@ -414,13 +467,13 @@ public class Application extends AuthenticatedWebApplication implements IApplica if (sid == null) { return null; } - String uid = UID_BY_SID.get(sid); - return uid == null ? null : ONLINE_USERS.get(uid); + String uid = get().getUidBySid().get(sid); + return uid == null ? null : get().getOnlineUsers().get(uid); } public static boolean isUserOnline(Long userId) { boolean isUserOnline = false; - for (Map.Entry<String, Client> e : ONLINE_USERS.entrySet()) { + for (Map.Entry<String, Client> e : get().getOnlineUsers().entrySet()) { if (e.getValue().getUserId().equals(userId)) { isUserOnline = true; break; @@ -430,12 +483,12 @@ public class Application extends AuthenticatedWebApplication implements IApplica } public static List<Client> getClients() { - return new ArrayList<>(ONLINE_USERS.values()); + return new ArrayList<>(get().getOnlineUsers().values()); } public static List<Client> getClients(Long userId) { List<Client> result = new ArrayList<>(); - for (Map.Entry<String, Client> e : ONLINE_USERS.entrySet()) { + for (Map.Entry<String, Client> e : get().getOnlineUsers().entrySet()) { if (e.getValue().getUserId().equals(userId)) { result.add(e.getValue()); break; @@ -446,7 +499,7 @@ public class Application extends AuthenticatedWebApplication implements IApplica public static Client getClientByKeys(Long userId, String sessionId) { Client client = null; - for (Map.Entry<String, Client> e : ONLINE_USERS.entrySet()) { + for (Map.Entry<String, Client> e : get().getOnlineUsers().entrySet()) { Client c = e.getValue(); if (c.getUserId().equals(userId) && c.getSessionId().equals(sessionId)) { client = c; @@ -460,27 +513,37 @@ public class Application extends AuthenticatedWebApplication implements IApplica public void invalidateClient(Long userId, String sessionId) { Client client = getClientByKeys(userId, sessionId); if (client != null) { - if (!INVALID_SESSIONS.containsKey(client.getSessionId())) { - INVALID_SESSIONS.put(client.getSessionId(), client); + Map<String, String> invalid = getInvalidSessions(); + if (!invalid.containsKey(client.getSessionId())) { + invalid.put(client.getSessionId(), client.getUid()); exit(client); } } } public static boolean isInvaldSession(String sessionId) { - return sessionId == null ? false : INVALID_SESSIONS.containsKey(sessionId); + return sessionId == null ? false : get().getInvalidSessions().containsKey(sessionId); } public static void removeInvalidSession(String sessionId) { if (sessionId != null){ - INVALID_SESSIONS.remove(sessionId); + get().getInvalidSessions().remove(sessionId); } } + public static Client update(Client c) { + get().getOnlineUsers().put(c.getUid(), c); // update in storage + return c; + } + public static Client addUserToRoom(Client c) { log.debug("Adding online room client: {}, room: {}", c.getUid(), c.getRoomId()); - ROOMS.putIfAbsent(c.getRoomId(), new ConcurrentHashSet<String>()); - ROOMS.get(c.getRoomId()).add(c.getUid()); + Map<Long, Set<String>> rooms = get().getRooms(); + rooms.putIfAbsent(c.getRoomId(), new ConcurrentHashSet<String>()); + Set<String> set = rooms.get(c.getRoomId()); + set.add(c.getUid()); + rooms.put(c.getRoomId(), set); + update(c); return c; } @@ -488,13 +551,13 @@ public class Application extends AuthenticatedWebApplication implements IApplica Long roomId = c.getRoomId(); log.debug("Removing online room client: {}, room: {}", c.getUid(), roomId); if (roomId != null) { - Set<String> clients = ROOMS.get(roomId); + Set<String> clients = get().getRooms().get(roomId); if (clients != null) { clients.remove(c.getUid()); - c.setRoomId(null); } getBean(ScopeApplicationAdapter.class).roomLeaveByScope(c.getUid(), roomId); c.clear(); + update(c); } return c; } @@ -515,7 +578,7 @@ public class Application extends AuthenticatedWebApplication implements IApplica public static List<Client> getRoomClients(Long roomId, Predicate<Client> filter) { List<Client> clients = new ArrayList<>(); if (roomId != null) { - Set<String> uids = ROOMS.get(roomId); + Set<String> uids = get().getRooms().get(roomId); if (uids != null) { for (String uid : uids) { Client c = getOnlineClient(uid); @@ -530,7 +593,7 @@ public class Application extends AuthenticatedWebApplication implements IApplica public static Set<Long> getUserRooms(Long userId) { Set<Long> result = new HashSet<>(); - for (Entry<Long, Set<String>> me : ROOMS.entrySet()) { + for (Entry<Long, Set<String>> me : get().getRooms().entrySet()) { for (String uid : me.getValue()) { Client c = getOnlineClient(uid); if (c != null && c.getUserId().equals(userId)) { @@ -542,7 +605,7 @@ public class Application extends AuthenticatedWebApplication implements IApplica } public static boolean isUserInRoom(long roomId, long userId) { - Set<String> clients = ROOMS.get(roomId); + Set<String> clients = get().getRooms().get(roomId); if (clients != null) { for (String uid : clients) { if (getOnlineClient(uid).getUserId().equals(userId)) { @@ -731,4 +794,13 @@ public class Application extends AuthenticatedWebApplication implements IApplica public void setContentSecurityPolicy(String contentSecurityPolicy) { this.contentSecurityPolicy = contentSecurityPolicy; } + + @Override + public String getServerId() { + return hazelcast.getName(); + } + + public List<Member> getServers() { + return new ArrayList<>(hazelcast.getCluster().getMembers()); + } } http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java index c0af7b7..688a57d 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java @@ -20,10 +20,10 @@ package org.apache.openmeetings.web.room; import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; import static org.apache.openmeetings.web.app.Application.getBean; +import static org.apache.openmeetings.web.app.Application.update; import org.apache.openmeetings.core.remote.ScopeApplicationAdapter; -import org.apache.openmeetings.core.session.SessionManager; -import org.apache.openmeetings.db.dto.server.ClientSessionInfo; +import org.apache.openmeetings.db.dao.server.ISessionManager; import org.apache.openmeetings.db.entity.basic.Client; import org.apache.openmeetings.db.entity.room.StreamClient; import org.apache.openmeetings.web.app.Application; @@ -34,8 +34,7 @@ public class RoomBroadcaster { private static final Logger log = Red5LoggerFactory.getLogger(RoomBroadcaster.class, webAppRootKey); public static StreamClient getClient(String publicSid) { - ClientSessionInfo csi = getBean(SessionManager.class).getClientByUidAnyServer(publicSid); - return csi == null ? null : csi.getRcl(); + return getBean(ISessionManager.class).get(publicSid); } public static void broadcast(String publicSid, String method, Object obj) { @@ -61,8 +60,9 @@ public class RoomBroadcaster { } // Put the mod-flag to true for this client - getBean(SessionManager.class).update(rcl); + getBean(ISessionManager.class).update(rcl); // Notify all clients of the same scope (room) broadcast(client.getRoomId(), "clientUpdated", rcl); + update(client); } } http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java index ee6c671..cac817e 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java @@ -25,6 +25,7 @@ import static org.apache.openmeetings.web.app.Application.getBean; import static org.apache.openmeetings.web.app.Application.getClientBySid; import static org.apache.openmeetings.web.app.Application.getOnlineClient; import static org.apache.openmeetings.web.app.Application.getRoomClients; +import static org.apache.openmeetings.web.app.Application.update; import static org.apache.openmeetings.web.app.WebSession.getDateFormat; import static org.apache.openmeetings.web.app.WebSession.getUserId; import static org.apache.openmeetings.web.room.wb.WbPanel.WB_JS_REFERENCE; @@ -160,7 +161,7 @@ public class RoomPanel extends BasePanel { for (Client c: getRoomClients(getRoom().getId()) ) { boolean self = getClient().getUid().equals(c.getUid()); for (Client.Stream s : c.getStreams()) { - JSONObject jo = RoomHelper.videoJson(c, self, c.getSid(), getBean(ISessionManager.class), s.getStreamClientId()); + JSONObject jo = RoomHelper.videoJson(c, self, c.getSid(), getBean(ISessionManager.class), s.getUid()); sb.append(String.format("VideoManager.play(%s);", jo)); } } @@ -173,7 +174,7 @@ public class RoomPanel extends BasePanel { protected void onInitialize() { super.onInitialize(); //let's refresh user in client - getClient().updateUser(getBean(UserDao.class)); + update(getClient().updateUser(getBean(UserDao.class))); Component accessDenied = new WebMarkupContainer(ACCESS_DENIED_ID).setVisible(false); Component eventDetail = new WebMarkupContainer(EVENT_DETAILS_ID).setVisible(false); @@ -341,7 +342,7 @@ public class RoomPanel extends BasePanel { return; } recordingUser = null; - c.remove(Client.Activity.record); + update(c.remove(Client.Activity.record)); menu.update(handler); } break; @@ -354,7 +355,7 @@ public class RoomPanel extends BasePanel { return; } recordingUser = uid; - c.set(Client.Activity.record); + update(c.set(Client.Activity.record)); menu.update(handler); } break; @@ -415,14 +416,14 @@ public class RoomPanel extends BasePanel { return; } boolean self = getClient().getUid().equals(uid); - String broadcastId = obj.getString("stream"); - Long streamClientId = obj.getLong("streamClientId"); + String broadcastId = obj.getString("streamName"); + Long streamId = obj.getLong("streamId"); if (!self) { - JSONObject jo = RoomHelper.videoJson(c, self, getClient().getSid(), getBean(ISessionManager.class), streamClientId); + JSONObject jo = RoomHelper.videoJson(c, self, getClient().getSid(), getBean(ISessionManager.class), uid); handler.appendJavaScript(String.format("VideoManager.play(%s);", jo)); } if (getClient().getSid().equals(c.getSid())) { - c.addStream(streamClientId, broadcastId, share); + c.addStream(uid, streamId, broadcastId, share); } } break; @@ -519,11 +520,13 @@ public class RoomPanel extends BasePanel { SOAPLogin soap = WebSession.get().getSoapLogin(); if (soap != null && soap.isModerator()) { c.allow(Right.superModerator); + update(c); } else { //FIXME TODO !!! c.getUser != getUserId Set<Right> rr = AuthLevelUtil.getRoomRight(c.getUser(), r, r.isAppointment() ? getBean(AppointmentDao.class).getByRoom(r.getId()) : null, getRoomClients(r.getId()).size()); if (!rr.isEmpty()) { c.allow(rr); + update(c); } } } @@ -604,7 +607,7 @@ public class RoomPanel extends BasePanel { return; } else { // we found no-one we can ask, allow right - broadcast(getClient().allow(right)); + broadcast(update(getClient().allow(right))); } } // ask @@ -646,6 +649,7 @@ public class RoomPanel extends BasePanel { public void allowRight(Client client, Right... rights) { client.allow(rights); + update(client); broadcast(client); } @@ -659,6 +663,7 @@ public class RoomPanel extends BasePanel { if (client.hasActivity(Client.Activity.broadcastV) && !client.hasRight(Right.video)) { client.remove(Client.Activity.broadcastV); } + update(client); broadcast(client); } http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java index 23c03b0..6e82ac3 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java @@ -27,8 +27,13 @@ import static org.apache.openmeetings.web.app.Application.getBean; import static org.apache.wicket.RuntimeConfigurationType.DEVELOPMENT; import java.net.URL; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; import org.apache.openmeetings.core.remote.ScopeApplicationAdapter; +import org.apache.openmeetings.db.dao.room.RoomDao; +import org.apache.openmeetings.db.dao.server.ISessionManager; import org.apache.openmeetings.web.app.Application; import org.apache.openmeetings.web.common.BasePanel; import org.apache.openmeetings.web.common.OmAjaxClientInfoBehavior; @@ -49,6 +54,9 @@ import org.slf4j.Logger; import com.github.openjson.JSONArray; import com.github.openjson.JSONObject; +import com.hazelcast.core.HazelcastInstance; +import com.hazelcast.core.Member; +import com.hazelcast.instance.MemberImpl; public class SwfPanel extends BasePanel { private static final long serialVersionUID = 1L; @@ -163,4 +171,47 @@ public class SwfPanel extends BasePanel { } return arr.toString(); } + + private static PageParameters addServer(PageParameters pp, Member m) { + //TODO check this return pp.add("protocol", s.getProtocol()).add("host", s.getAddress()).add("port", s.getPort()).add("context", s.getWebapp()); + return pp; + } + + private static PageParameters addServer(Long roomId, boolean addBasic) { + PageParameters pp = new PageParameters(); + if (addBasic) { + //pp.add("wicketsid", getSid()).add(WICKET_ROOM_ID, roomId).add("language", getLanguage()); + } + + long minimum = -1; + Member result = null; + Map<Member, Set<Long>> activeRoomsMap = new HashMap<>(); + for (Member _m : Application.get(). getServers()) { + String serverId = null; + MemberImpl m = (MemberImpl)_m; + try { + HazelcastInstance ins = (HazelcastInstance)MemberImpl.class.getDeclaredField("instance").get(m); + serverId = ins.getName(); + } catch (Exception e) { + //no-op + } + Set<Long> roomIds = getBean(ISessionManager.class).getActiveRoomIds(serverId); + if (roomIds.contains(roomId)) { + // if the room is already opened on a server, redirect the user to that one, + log.debug("Room is already opened on a server {}", m.getAddress()); + return addServer(pp, m); + } + activeRoomsMap.put(m, roomIds); + } + for (Map.Entry<Member, Set<Long>> entry : activeRoomsMap.entrySet()) { + Set<Long> roomIds = entry.getValue(); + long capacity = getBean(RoomDao.class).getRoomsCapacityByIds(roomIds); + if (minimum < 0 || capacity < minimum) { + minimum = capacity; + result = entry.getKey(); + } + log.debug("Checking server: {} Number of rooms {} RoomIds: {} max(Sum): {}", entry.getKey(), roomIds.size(), roomIds, capacity); + } + return result == null ? pp : addServer(pp, result); + } } http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java index 73ff489..d003fff 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java @@ -317,13 +317,13 @@ public class RoomMenuPanel extends Panel { StringBuilder roomTitle = new StringBuilder(); if (room.getRecordingUser() != null) { ISessionManager sessMngr = getBean(ISessionManager.class); - StreamClient recUser = sessMngr.getClientByUid(room.getRecordingUser(), null); //TODO check server + StreamClient recUser = sessMngr.get(room.getRecordingUser()); if (recUser != null) { roomTitle.append(String.format("%s %s %s %s %s", getString("419") , recUser.getUsername(), recUser.getFirstname(), recUser.getLastname(), df.format(recUser.getConnectedSince()))); roomClass.append(" screen"); } - StreamClient pubUser = sessMngr.getClientByUid(room.getPublishingUser(), null); //TODO check server + StreamClient pubUser = sessMngr.get(room.getPublishingUser()); if (pubUser != null) { if (recUser != null) { roomTitle.append('\n'); http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java index 3f935a6..0f05691 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java @@ -32,10 +32,10 @@ import static org.apache.wicket.util.time.Duration.NONE; import java.io.InputStream; import org.apache.commons.io.IOUtils; -import org.apache.openmeetings.core.session.SessionManager; import org.apache.openmeetings.db.dao.basic.ConfigurationDao; import org.apache.openmeetings.db.dao.label.LabelDao; import org.apache.openmeetings.db.dao.room.RoomDao; +import org.apache.openmeetings.db.dao.server.ISessionManager; import org.apache.openmeetings.db.entity.basic.Client; import org.apache.openmeetings.db.entity.room.Room; import org.apache.openmeetings.web.app.Application; @@ -96,7 +96,7 @@ public class StartSharingButton extends OmButton { String _url = s.getString(VideoSettings.URL); long roomId = c.getRoomId(); Room room = getBean(RoomDao.class).get(roomId); - SessionManager sessionManager = getBean(SessionManager.class); + ISessionManager sessionManager = getBean(ISessionManager.class); app = app.replace("$native", "" + s.getBoolean(FLASH_NATIVE_SSL)) .replace("$codebase", WebSession.get().getExtendedProperties().getCodebase()) .replace("$applicationName", cfgDao.getAppName()) http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java index 3897ca9..8233ac9 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java @@ -21,6 +21,7 @@ package org.apache.openmeetings.web.room.sidebar; import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; import static org.apache.openmeetings.web.app.Application.getOnlineClient; import static org.apache.openmeetings.web.app.Application.getRoomClients; +import static org.apache.openmeetings.web.room.RoomBroadcaster.sendUpdatedClient; import static org.apache.openmeetings.web.util.CallbackFunctionHelper.getNamedFunction; import static org.apache.wicket.ajax.attributes.CallbackParameter.explicit; @@ -38,7 +39,6 @@ import org.apache.openmeetings.web.app.WebSession; import org.apache.openmeetings.web.common.ConfirmableAjaxBorder; import org.apache.openmeetings.web.common.ConfirmableAjaxBorder.ConfirmableBorderDialog; import org.apache.openmeetings.web.common.NameDialog; -import org.apache.openmeetings.web.room.RoomBroadcaster; import org.apache.openmeetings.web.room.RoomPanel; import org.apache.openmeetings.web.room.RoomPanel.Action; import org.apache.openmeetings.web.room.VideoSettings; @@ -141,6 +141,7 @@ public class RoomSidebar extends Panel { } else { c.remove(Activity.broadcastA); } + Application.update(c); room.broadcast(c); } } @@ -223,7 +224,7 @@ public class RoomSidebar extends Panel { toggleActivity(c, Activity.broadcastAV); } } - RoomBroadcaster.sendUpdatedClient(c); + sendUpdatedClient(c); room.broadcast(c); } } @@ -393,11 +394,14 @@ public class RoomSidebar extends Panel { if (c == null) { return; } + boolean updated = false; if (!activityAllowed(c, a, room.getRoom()) && room.getClient().hasRight(Right.moderator)) { if (a == Activity.broadcastA || a == Activity.broadcastAV) { + updated = true; c.allow(Room.Right.audio); } if (!room.getRoom().isAudioOnly() && (a == Activity.broadcastV || a == Activity.broadcastAV)) { + updated = true; c.allow(Room.Right.video); } } @@ -412,6 +416,7 @@ public class RoomSidebar extends Panel { return; } Pod pod = c.getPod(); + updated = true; c.setPod(getRequest().getRequestParameters().getParameterValue(PARAM_POD).toOptionalInteger()); if (pod != null && pod != Pod.none && pod != c.getPod()) { //pod has changed, no need to toggle @@ -421,6 +426,9 @@ public class RoomSidebar extends Panel { } room.broadcast(c); } + if (updated) { + Application.update(c); + } } public static boolean activityAllowed(Client c, Activity a, Room room) { http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OmUrlFragment.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OmUrlFragment.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OmUrlFragment.java index 6f74dda..9ca152f 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OmUrlFragment.java +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OmUrlFragment.java @@ -37,7 +37,6 @@ import org.apache.openmeetings.web.admin.labels.LangPanel; import org.apache.openmeetings.web.admin.ldaps.LdapsPanel; import org.apache.openmeetings.web.admin.oauth.OAuthPanel; import org.apache.openmeetings.web.admin.rooms.RoomsPanel; -import org.apache.openmeetings.web.admin.servers.ServersPanel; import org.apache.openmeetings.web.admin.users.UsersPanel; import org.apache.openmeetings.web.common.BasePanel; import org.apache.openmeetings.web.room.RoomPanel; @@ -67,7 +66,6 @@ public class OmUrlFragment implements Serializable { public static final String TYPE_LANG = "lang"; public static final String TYPE_LDAP = "ldap"; public static final String TYPE_BACKUP = "backup"; - public static final String TYPE_SERVER = "server"; public static final String TYPE_OAUTH2 = "oauth2"; public static final String TYPE_EMAIL = "email"; public static final OmUrlFragment DASHBOARD = new OmUrlFragment(AreaKeys.user, TYPE_DASHBOARD); @@ -100,7 +98,6 @@ public class OmUrlFragment implements Serializable { , adminModuleLanguages , adminModuleLDAP , adminModuleBackup - , adminModuleServers , adminModuleOAuth , adminModuleEmail } @@ -198,10 +195,6 @@ public class OmUrlFragment implements Serializable { setArea(AreaKeys.admin); setType(TYPE_BACKUP); break; - case adminModuleServers: - setArea(AreaKeys.admin); - setType(TYPE_SERVER); - break; case adminModuleOAuth: setArea(AreaKeys.admin); setType(TYPE_OAUTH2); @@ -249,8 +242,6 @@ public class OmUrlFragment implements Serializable { basePanel = new LdapsPanel(CHILD_ID); } else if (TYPE_BACKUP.equals(type)) { basePanel = new BackupPanel(CHILD_ID); - } else if (TYPE_SERVER.equals(type)) { - basePanel = new ServersPanel(CHILD_ID); } else if (TYPE_OAUTH2.equals(type)) { basePanel = new OAuthPanel(CHILD_ID); } else if (TYPE_EMAIL.equals(type)) { http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/db2_persistence.xml ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/db2_persistence.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/db2_persistence.xml index 1355008..9d68e0d 100644 --- a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/db2_persistence.xml +++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/db2_persistence.xml @@ -32,7 +32,6 @@ <class>org.apache.openmeetings.db.entity.basic.Navimain</class> <class>org.apache.openmeetings.db.entity.server.Sessiondata</class> <class>org.apache.openmeetings.db.entity.server.SOAPLogin</class> - <class>org.apache.openmeetings.db.entity.server.Server</class> <class>org.apache.openmeetings.db.entity.calendar.Appointment</class> <class>org.apache.openmeetings.db.entity.calendar.MeetingMember</class> <class>org.apache.openmeetings.db.entity.calendar.OmCalendar</class> @@ -46,7 +45,6 @@ <class>org.apache.openmeetings.db.entity.log.ConferenceLog</class> <class>org.apache.openmeetings.db.entity.room.RoomPoll</class> <class>org.apache.openmeetings.db.entity.room.RoomPollAnswer</class> - <class>org.apache.openmeetings.db.entity.room.StreamClient</class> <class>org.apache.openmeetings.db.entity.room.RoomModerator</class> <class>org.apache.openmeetings.db.entity.room.Room</class> <class>org.apache.openmeetings.db.entity.room.RoomGroup</class> http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/derby_persistence.xml ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/derby_persistence.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/derby_persistence.xml index 3be6772..f0600aa 100644 --- a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/derby_persistence.xml +++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/derby_persistence.xml @@ -32,7 +32,6 @@ <class>org.apache.openmeetings.db.entity.basic.Navimain</class> <class>org.apache.openmeetings.db.entity.server.Sessiondata</class> <class>org.apache.openmeetings.db.entity.server.SOAPLogin</class> - <class>org.apache.openmeetings.db.entity.server.Server</class> <class>org.apache.openmeetings.db.entity.calendar.Appointment</class> <class>org.apache.openmeetings.db.entity.calendar.MeetingMember</class> <class>org.apache.openmeetings.db.entity.calendar.OmCalendar</class> @@ -46,7 +45,6 @@ <class>org.apache.openmeetings.db.entity.log.ConferenceLog</class> <class>org.apache.openmeetings.db.entity.room.RoomPoll</class> <class>org.apache.openmeetings.db.entity.room.RoomPollAnswer</class> - <class>org.apache.openmeetings.db.entity.room.StreamClient</class> <class>org.apache.openmeetings.db.entity.room.RoomModerator</class> <class>org.apache.openmeetings.db.entity.room.Room</class> <class>org.apache.openmeetings.db.entity.room.RoomGroup</class> http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mssql_persistence.xml ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mssql_persistence.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mssql_persistence.xml index 1cac922..1d1fce9 100644 --- a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mssql_persistence.xml +++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mssql_persistence.xml @@ -32,7 +32,6 @@ <class>org.apache.openmeetings.db.entity.basic.Navimain</class> <class>org.apache.openmeetings.db.entity.server.Sessiondata</class> <class>org.apache.openmeetings.db.entity.server.SOAPLogin</class> - <class>org.apache.openmeetings.db.entity.server.Server</class> <class>org.apache.openmeetings.db.entity.calendar.Appointment</class> <class>org.apache.openmeetings.db.entity.calendar.MeetingMember</class> <class>org.apache.openmeetings.db.entity.calendar.OmCalendar</class> @@ -46,7 +45,6 @@ <class>org.apache.openmeetings.db.entity.log.ConferenceLog</class> <class>org.apache.openmeetings.db.entity.room.RoomPoll</class> <class>org.apache.openmeetings.db.entity.room.RoomPollAnswer</class> - <class>org.apache.openmeetings.db.entity.room.StreamClient</class> <class>org.apache.openmeetings.db.entity.room.RoomModerator</class> <class>org.apache.openmeetings.db.entity.room.Room</class> <class>org.apache.openmeetings.db.entity.room.Whiteboard</class> http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mysql_persistence.xml ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mysql_persistence.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mysql_persistence.xml index c7000f2..ee81c1c 100644 --- a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mysql_persistence.xml +++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mysql_persistence.xml @@ -32,7 +32,6 @@ <class>org.apache.openmeetings.db.entity.basic.Navimain</class> <class>org.apache.openmeetings.db.entity.server.Sessiondata</class> <class>org.apache.openmeetings.db.entity.server.SOAPLogin</class> - <class>org.apache.openmeetings.db.entity.server.Server</class> <class>org.apache.openmeetings.db.entity.calendar.Appointment</class> <class>org.apache.openmeetings.db.entity.calendar.MeetingMember</class> <class>org.apache.openmeetings.db.entity.calendar.OmCalendar</class> @@ -46,7 +45,6 @@ <class>org.apache.openmeetings.db.entity.log.ConferenceLog</class> <class>org.apache.openmeetings.db.entity.room.RoomPoll</class> <class>org.apache.openmeetings.db.entity.room.RoomPollAnswer</class> - <class>org.apache.openmeetings.db.entity.room.StreamClient</class> <class>org.apache.openmeetings.db.entity.room.RoomModerator</class> <class>org.apache.openmeetings.db.entity.room.Room</class> <class>org.apache.openmeetings.db.entity.room.RoomGroup</class> http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/oracle_persistence.xml ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/oracle_persistence.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/oracle_persistence.xml index f8dd5dd..0105a43 100644 --- a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/oracle_persistence.xml +++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/oracle_persistence.xml @@ -32,7 +32,6 @@ <class>org.apache.openmeetings.db.entity.basic.Navimain</class> <class>org.apache.openmeetings.db.entity.server.Sessiondata</class> <class>org.apache.openmeetings.db.entity.server.SOAPLogin</class> - <class>org.apache.openmeetings.db.entity.server.Server</class> <class>org.apache.openmeetings.db.entity.calendar.Appointment</class> <class>org.apache.openmeetings.db.entity.calendar.MeetingMember</class> <class>org.apache.openmeetings.db.entity.calendar.OmCalendar</class> @@ -46,7 +45,6 @@ <class>org.apache.openmeetings.db.entity.log.ConferenceLog</class> <class>org.apache.openmeetings.db.entity.room.RoomPoll</class> <class>org.apache.openmeetings.db.entity.room.RoomPollAnswer</class> - <class>org.apache.openmeetings.db.entity.room.StreamClient</class> <class>org.apache.openmeetings.db.entity.room.RoomModerator</class> <class>org.apache.openmeetings.db.entity.room.Room</class> <class>org.apache.openmeetings.db.entity.room.RoomGroup</class> http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/postgresql_persistence.xml ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/postgresql_persistence.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/postgresql_persistence.xml index 95f7d00..2cab5de 100644 --- a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/postgresql_persistence.xml +++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/postgresql_persistence.xml @@ -32,7 +32,6 @@ <class>org.apache.openmeetings.db.entity.basic.Navimain</class> <class>org.apache.openmeetings.db.entity.server.Sessiondata</class> <class>org.apache.openmeetings.db.entity.server.SOAPLogin</class> - <class>org.apache.openmeetings.db.entity.server.Server</class> <class>org.apache.openmeetings.db.entity.calendar.Appointment</class> <class>org.apache.openmeetings.db.entity.calendar.MeetingMember</class> <class>org.apache.openmeetings.db.entity.calendar.OmCalendar</class> @@ -46,7 +45,6 @@ <class>org.apache.openmeetings.db.entity.log.ConferenceLog</class> <class>org.apache.openmeetings.db.entity.room.RoomPoll</class> <class>org.apache.openmeetings.db.entity.room.RoomPollAnswer</class> - <class>org.apache.openmeetings.db.entity.room.StreamClient</class> <class>org.apache.openmeetings.db.entity.room.RoomModerator</class> <class>org.apache.openmeetings.db.entity.room.Room</class> <class>org.apache.openmeetings.db.entity.room.RoomGroup</class> http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml index 5990b80..53db861 100644 --- a/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml +++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml @@ -40,35 +40,12 @@ <context:annotation-config /> <context:component-scan base-package="org.apache.openmeetings" /> - <!-- New Class for the Streaming Handlers --> <bean id="web.handler" class="org.apache.openmeetings.core.remote.ScopeApplicationAdapter" /> - <!-- Session configuration start --> - - <bean id="openmeetings.SessionManager" class="org.apache.openmeetings.core.session.SessionManager"> - <property name="cache"> - <!-- Memory based session cache by default --> - <ref bean="openmeetings.HashMapStore" /> - <!-- The following section should be used in clustering mode - <ref bean="openmeetings.DatabaseStore" /> - --> - </property> - </bean> - - <!-- Singleton for memory based cache --> - <bean id="openmeetings.HashMapStore" scope="singleton" class="org.apache.openmeetings.core.session.store.HashMapStore" /> - <!-- Database cache --> - <bean id="openmeetings.DatabaseStore" class="org.apache.openmeetings.core.session.store.DatabaseStore" /> + <bean id="openmeetings.SessionManager" class="org.apache.openmeetings.core.session.SessionManager"/> <bean id="whiteboardCache" scope="singleton" class="org.apache.openmeetings.core.data.whiteboard.WhiteboardCache" /> - <!-- Cluster related config start --> - <bean id="openmeetings.ServerUtil" scope="singleton" class="org.apache.openmeetings.core.session.ServerUtil"> - <!-- Need to be uncommented and set to the real ID if in cluster mode - <property name="serverId" value="1" /> - --> - </bean> - <!-- Start of Services --> <bean id="xmlcrm.service" class="org.apache.openmeetings.core.remote.MainService" /> <bean id="openmeetings.FileProcessor" class="org.apache.openmeetings.core.data.file.FileProcessor" /> @@ -79,7 +56,6 @@ <bean id="openmeetings.InterviewConverterTask" class="org.apache.openmeetings.core.data.record.converter.InterviewConverterTask" /> <bean id="openmeetings.InterviewConverter" class="org.apache.openmeetings.core.converter.InterviewConverter" /> <bean id="openmeetings.RecordingConverter" class="org.apache.openmeetings.core.converter.RecordingConverter" /> - <bean id="openmeetings.SlaveHTTPConnectionManager" class="org.apache.openmeetings.webservice.cluster.SlaveHTTPConnectionManager" /> <!-- 5000 == 5 sec @@ -197,9 +173,7 @@ <bean id="soapLoginDao" class="org.apache.openmeetings.db.dao.server.SOAPLoginDao" /> <bean id="userContactDao" class="org.apache.openmeetings.db.dao.user.UserContactDao" /> <bean id="userDao" class="org.apache.openmeetings.db.dao.user.UserDao" /> - <bean id="serverDao" class="org.apache.openmeetings.db.dao.server.ServerDao" /> <bean id="chatDao" class="org.apache.openmeetings.db.dao.basic.ChatDao" /> - <bean id="clientDao" class="org.apache.openmeetings.db.dao.room.ClientDao" /> <bean id="mailMessageDao" class="org.apache.openmeetings.db.dao.basic.MailMessageDao" /> <bean id="oauth2Dao" class="org.apache.openmeetings.db.dao.server.OAuth2Dao" /> <bean id="omCalendarDao" class="org.apache.openmeetings.db.dao.calendar.OmCalendarDao" /> http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/main/webapp/WEB-INF/classes/cxf-servlet.xml ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/cxf-servlet.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/cxf-servlet.xml index 3fc11be..6387bad 100644 --- a/openmeetings-web/src/main/webapp/WEB-INF/classes/cxf-servlet.xml +++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/cxf-servlet.xml @@ -38,7 +38,6 @@ <bean id="infoWebService" class="org.apache.openmeetings.webservice.InfoWebService" /> <bean id="recordWebService" class="org.apache.openmeetings.webservice.RecordingWebService" /> <bean id="roomWebService" class="org.apache.openmeetings.webservice.RoomWebService" /> - <bean id="serverWebService" class="org.apache.openmeetings.webservice.ServerWebService" /> <bean id="userWebService" class="org.apache.openmeetings.webservice.UserWebService"/> <bean id="netTestWebService" class="org.apache.openmeetings.webservice.NetTestWebService" /> @@ -52,7 +51,6 @@ <ref bean="infoWebService"/> <ref bean="recordWebService"/> <ref bean="roomWebService"/> - <ref bean="serverWebService"/> <ref bean="userWebService"/> <ref bean="netTestWebService"/> <!-- JaxRs only --> </jaxrs:serviceBeans> @@ -69,6 +67,5 @@ <jaxws:endpoint id="fileServiceWS" address="/FileService" implementor="#fileWebService" /> <jaxws:endpoint id="recordServiceWS" address="/RecordService" implementor="#recordWebService" /> <jaxws:endpoint id="roomServiceWS" address="/RoomService" implementor="#roomWebService" /> - <jaxws:endpoint id="serverServiceWS" address="/ServerService" implementor="#serverWebService" /> <jaxws:endpoint id="userServiceWS" address="/UserService" implementor="#userWebService" /> </beans> http://git-wip-us.apache.org/repos/asf/openmeetings/blob/bbcdbf7e/openmeetings-web/src/main/webapp/WEB-INF/classes/hazelcast.xml ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/hazelcast.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/hazelcast.xml new file mode 100644 index 0000000..dfb8d92 --- /dev/null +++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/hazelcast.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + 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. + +--> +<hazelcast + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns="http://www.hazelcast.com/schema/config" + xsi:schemaLocation="http://www.hazelcast.com/schema/config https://hazelcast.com/schema/config/hazelcast-config-3.9.xsd" + > + <instance-name>server-1</instance-name><!-- MAKE SURE THIS ONE IS UNIQUE --> + <!--network> + <interfaces enabled="true"> + <interface>192.168.1.*</interface> + </interfaces> + </network--> +</hazelcast>
