package org.exoplatform.forum.service.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.container.PortalContainer;
import org.exoplatform.forum.common.conf.ManagedPlugin;
import org.exoplatform.forum.common.conf.RoleRulesPlugin;
import org.exoplatform.forum.common.user.ContactProvider;
import org.exoplatform.forum.service.DataStorage;
import org.exoplatform.management.ManagementAware;
import org.exoplatform.management.ManagementContext;
import org.exoplatform.management.annotations.Managed;
import org.exoplatform.management.annotations.ManagedDescription;
import org.exoplatform.management.jmx.annotations.NameTemplate;
import org.exoplatform.management.jmx.annotations.Property;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
@Managed
@NameTemplate(@Property(key = "service", value = "forum"))
@ManagedDescription("Forum management")
public class ForumServiceManaged implements ManagementAware {
private static final Log log = ExoLogger.getLogger(ForumServiceManaged.class);
private ForumServiceImpl forumService;
private ManagementContext context;
public ForumServiceManaged(ForumServiceImpl forumService) {
this.forumService = forumService;
this.forumService.setManagementView(this);
}
public void setContext(ManagementContext context) {
this.context = context;
}
@Managed
@ManagedDescription("list of currently connected users")
public List<String> getOnlineUsers() throws Exception {
return forumService.getOnlineUsers();
}
@Managed
@ManagedDescription("number of currently connected users")
public int countOnlineUsers() throws Exception {
return getOnlineUsers().size();
}
@Managed
@ManagedDescription("rules that define administrators")
public List<String> getAdminRules() {
List<String> adminRules = new ArrayList<String>();
List<RoleRulesPlugin> plugins = forumService.getStorage().getRulesPlugins();
for (RoleRulesPlugin plugin : plugins) {
Collection<List<String>> allrules = plugin.getAllRules().values();
for (List<String> rules : allrules) {
if (rules != null) {
adminRules.addAll(rules);
}
}
}
return adminRules;
}
@Managed
@ManagedDescription("evaluate is a user has administrator role")
public boolean hasForumAdminRole(String username) throws Exception {
return forumService.getStorage().isAdminRole(username);
}
@Managed
@ManagedDescription("get the configuration of the mail service used for notifications in KS")
public Map<String, String> getMailServiceConfig() {
return forumService.getStorage().getServerConfig();
}
@Managed
@ManagedDescription("Get the ContactProvider implementation")
public String getContactProvider() {
return ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(ContactProvider.class).toString();
}
@Managed
@ManagedDescription("Set the ContactProvider implementation")
public void setContactProvider(String fqn) {
Object instance = null;
try {
instance = Class.forName(fqn);
} catch (Exception e) {
log.error("Failed to register contact provider for " + fqn + ": " + e.getMessage());
return;
}
String name = PortalContainer.getCurrentPortalContainerName();
ExoContainerContext.getContainerByName(name).registerComponentInstance(ContactProvider.class, instance);
}
public void registerPlugin(ManagedPlugin plugin) {
if (context != null) {
context.register(plugin);
}
}
public void registerStorageManager(DataStorage storage) {
if (context != null) {
context.register(storage);
}
}
public void registerJobManager(JobManager jobManager) {
if (context != null) {
context.register(jobManager);
}
}
}