X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=source%2Fmircoders%2Fglobal%2FMirGlobal.java;h=2306d96d00e68b19babbebda87b4285851f5cc0d;hb=53f90aac81d2c47624f5a1a6d61a796355d2345f;hp=59c61e1900f55c1554e11272a7c0984b846292df;hpb=2b0e1c1d91eea7e201af61e1065ad12bf966d1ba;p=mir.git diff --git a/source/mircoders/global/MirGlobal.java b/source/mircoders/global/MirGlobal.java index 59c61e19..2306d96d 100755 --- a/source/mircoders/global/MirGlobal.java +++ b/source/mircoders/global/MirGlobal.java @@ -30,19 +30,30 @@ package mircoders.global; -import java.util.*; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Vector; +import mir.bundle.BasicBundleFactory; +import mir.bundle.BundleFactory; +import mir.bundle.CascadingBundleFactory; +import mir.bundle.PropertiesFileBundleLoader; import mir.config.MirPropertiesConfiguration; -import mir.config.MirPropertiesConfiguration.PropertiesConfigExc; +import mir.entity.adapter.EntityAdapter; +import mir.log.LoggerEngine; +import mir.log.LoggerWrapper; import mir.misc.ConfigException; +import mircoders.accesscontrol.AccessControl; +import mircoders.entity.EntityComment; +import mircoders.entity.EntityContent; +import mircoders.entity.EntityUsers; +import mircoders.localizer.MirAdminInterfaceLocalizer; import mircoders.localizer.MirCachingLocalizerDecorator; -import mircoders.localizer.*; -import mircoders.accesscontrol.*; -import mircoders.entity.*; -import mir.entity.adapter.*; +import mircoders.localizer.MirLocalizer; public class MirGlobal { - static private MirPropertiesConfiguration configuration; static private MirLocalizer localizer; static private ProducerEngine producerEngine; static private Abuse abuse; @@ -50,6 +61,18 @@ public class MirGlobal { static private AccessControl accessControl; static private Map articleOperations; static private Map commentOperations; + static private Map loggedInUsers = new HashMap(); + static private Map loggedInUserIds = new HashMap(); + static private LoggerWrapper logger = new LoggerWrapper("Global"); + static private LoggerWrapper adminUsageLogger = new LoggerWrapper("AdminUsage"); +// static private ChangeEngine changeEngine = new ChangeEngine(); + static private DatabaseEngine databaseEngine; + + static private BundleFactory bundleFactory = + new CascadingBundleFactory( + new BasicBundleFactory( + new PropertiesFileBundleLoader( + config().getHome()))); public synchronized static MirLocalizer localizer() { String localizerClassName; @@ -62,44 +85,66 @@ public class MirGlobal { localizerClass = Class.forName(localizerClassName); } catch (Throwable t) { - throw new ConfigException("localizer class '" + localizerClassName + "' not found: " + t.toString()); + throw new ConfigException("localizer class '" + + localizerClassName + "' not found: " + t.toString()); } if (!(MirLocalizer.class.isAssignableFrom(localizerClass))) - throw new ConfigException("localizer class '" + localizerClassName + "' is not assignable from MirLocalizer"); + throw new ConfigException("localizer class '" + + localizerClassName + "' is not assignable from MirLocalizer"); try { localizer = new MirCachingLocalizerDecorator((MirLocalizer) localizerClass.newInstance()); } catch (Throwable t) { - throw new ConfigException("localizer class '" + localizerClassName + "' cannot be instantiated: " + t.toString()); + throw new ConfigException("localizer class '" + + localizerClassName + "' cannot be instantiated: " + t.toString()); } } return localizer; } - public static Abuse abuse() { - if (abuse==null) { - synchronized(MirGlobal.class) { - if (abuse==null) - abuse = new Abuse(); - } - } + /** + * Returns a string that provides some global status information + */ + public static String getStatus() { + StringBuffer result = new StringBuffer(); + + result.append((Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory())/(1024*1024)); + result.append("M in use, "); + result.append(Thread.currentThread().activeCount()).append(" threads, "); + result.append(getDatabaseEngine().getStatus()); + + return result.toString(); + } + + public synchronized static Abuse abuse() { + if (abuse==null) + abuse = new Abuse(); return abuse; } + /** + * returns the global change engine (used to track changed files) + */ +// public static ChangeEngine getChangeEngine() { +// return changeEngine; +// } + public static MirPropertiesConfiguration config() { - try { - return MirPropertiesConfiguration.instance(); - } - catch (PropertiesConfigExc e) { - throw new RuntimeException(e.getMessage()); - } + return MirPropertiesConfiguration.instance(); + } + + public synchronized static DatabaseEngine getDatabaseEngine() { + if (databaseEngine==null) + databaseEngine = new DatabaseEngine(); + + return databaseEngine; } - public static ProducerEngine producerEngine() { + public static ProducerEngine getProducerEngine() { if (producerEngine == null) { producerEngine = new ProducerEngine(); } @@ -128,12 +173,18 @@ public class MirGlobal { MirAdminInterfaceLocalizer.MirSimpleEntityOperation operation = getArticleOperationForName(anOperation); try { + EntityAdapter user = null; + if (aUser!=null) + user = localizer().dataModel().adapterModel().makeEntityAdapter("user", aUser); + if (operation!=null) operation.perform( - localizer().dataModel().adapterModel().makeEntityAdapter("user", aUser), + user, localizer().dataModel().adapterModel().makeEntityAdapter("content", anArticle)); } catch (Throwable t) { + t.printStackTrace(logger.asPrintWriter(LoggerWrapper.DEBUG_MESSAGE)); + throw new RuntimeException(t.toString()); } } @@ -142,9 +193,13 @@ public class MirGlobal { MirAdminInterfaceLocalizer.MirSimpleEntityOperation operation = getCommentOperationForName(anOperation); try { + EntityAdapter user = null; + if (aUser!=null) + user = localizer().dataModel().adapterModel().makeEntityAdapter("user", aUser); + if (operation!=null) operation.perform( - localizer().dataModel().adapterModel().makeEntityAdapter("user", aUser), + user, localizer().dataModel().adapterModel().makeEntityAdapter("comment", aComment)); } catch (Throwable t) { @@ -152,13 +207,15 @@ public class MirGlobal { } } - private synchronized static MirAdminInterfaceLocalizer.MirSimpleEntityOperation getArticleOperationForName(String aName) { + private synchronized static MirAdminInterfaceLocalizer.MirSimpleEntityOperation + getArticleOperationForName(String aName) { try { if (articleOperations == null) { articleOperations = new HashMap(); Iterator i = localizer().adminInterface().simpleArticleOperations().iterator(); while (i.hasNext()) { - MirAdminInterfaceLocalizer.MirSimpleEntityOperation operation = (MirAdminInterfaceLocalizer.MirSimpleEntityOperation) i.next(); + MirAdminInterfaceLocalizer.MirSimpleEntityOperation operation = + (MirAdminInterfaceLocalizer.MirSimpleEntityOperation) i.next(); articleOperations.put(operation.getName(), operation); } } @@ -170,13 +227,15 @@ public class MirGlobal { } } - private synchronized static MirAdminInterfaceLocalizer.MirSimpleEntityOperation getCommentOperationForName(String aName) { + private synchronized static MirAdminInterfaceLocalizer.MirSimpleEntityOperation + getCommentOperationForName(String aName) { try { if (commentOperations == null) { commentOperations = new HashMap(); Iterator i = localizer().adminInterface().simpleCommentOperations().iterator(); while (i.hasNext()) { - MirAdminInterfaceLocalizer.MirSimpleEntityOperation operation = (MirAdminInterfaceLocalizer.MirSimpleEntityOperation) i.next(); + MirAdminInterfaceLocalizer.MirSimpleEntityOperation operation = + (MirAdminInterfaceLocalizer.MirSimpleEntityOperation) i.next(); commentOperations.put(operation.getName(), operation); } } @@ -188,6 +247,103 @@ public class MirGlobal { } } + public static boolean isUserLoggedIn(String anId) { + synchronized (loggedInUserIds) { + return loggedInUserIds.containsKey(anId); + } + } + + public static List getLoggedInUsers() { + List result = new Vector(); + + synchronized (loggedInUsers) { + Iterator i = loggedInUsers.entrySet().iterator(); + + while (i.hasNext()) { + Map.Entry entry = (Map.Entry) i.next(); + + Map item = new HashMap(); + item.put("name", entry.getKey()); + item.put("count", entry.getValue()); + result.add(item); + } + } + + return result; + } + + public static BundleFactory getBundleFactory() { + return bundleFactory; + } + + public static void registerLogin(String aName, String anId) { + modifyLoggedInCount(aName, anId, 1); + } + + public static void registerLogout(String aName, String anId) { + modifyLoggedInCount(aName, anId, -1); + } + + private static void modifyLoggedInCount(String aName, String anId, int aModifier) { + synchronized (loggedInUsers) { + Integer count = (Integer) loggedInUsers.get(aName); + if (count==null) + count = new Integer(0); + + if (count.intValue()+aModifier<=0) { + loggedInUsers.remove(aName); + } + else { + loggedInUsers.put(aName, new Integer(count.intValue() + aModifier)); + } + } + + synchronized (loggedInUserIds) { + Integer count = (Integer) loggedInUserIds.get(anId); + if (count==null) + count = new Integer(0); + + if (count.intValue()+aModifier<=0) { + loggedInUserIds.remove(anId); + } + else { + loggedInUserIds.put(anId, new Integer(count.intValue() + aModifier)); + } + } + } + + /** + * Called whenever a modifying admin action occurs. Used to log + * the action, if admin activity logging is turned on, + */ + public static void logAdminUsage(EntityUsers aUser, String anObject, String aDescription) { + try { + if (config().getString("Mir.Admin.LogAdminActivity", "0").equals("1")) { + String user = "unknown (" + aUser.toString() + ")"; + if (aUser != null) + user = aUser.getFieldValue("login"); + adminUsageLogger.info(user + " | " + anObject + " | " + aDescription); + } + } + catch (Throwable t) { + logger.error("Error while logging admin usage ("+ + aUser.toString()+", "+aDescription+"): " +t.toString()); + } + } + + /** + * Reloads all reloadable configurations, such as the producer subsystem. + */ + public static void reloadConfigurations() throws MirGlobalExc, MirGlobalFailure { + getProducerEngine().reloadConfiguration(); + try { + LoggerEngine.reload(); + } + catch (Throwable e) { + throw new MirGlobalFailure(e); + } + getBundleFactory().reload(); + } }