DirectOpenposting=yes
# Default timezone to display times in in admin, producers
-#
-# Leave empty to use the system's default
-Mir.DefaultTimezone=
+Mir.DefaultTimezone= UTC
# Default date/time format
Mir.DefaultDateTimeFormat = yyyy-MM-dd HH:mm
# For missing values, the FallbackLanguage is used as default
Mir.Admin.FallbackLanguage=en
+# Show who's logged in?
+Mir.Admin.ShowLoggedinUsers=1
+
# the templates
Mir.Localizer.Producer.GeneratorLibrary= default=freemarker(etc/producer/)
Mir.Localizer.Admin.GeneratorLibrary= default=freemarker(templates/admin/)
Mir.Localizer.Admin.AllowDeleteArticle=1
-# Article Preview Link URL (Link to produced articles from within admin)
-ContentList.ArticleLink=http://production.indy.code-foo.org/en/${date.formatted.yyyy}/${date.formatted.MM}/${id}.shtml
-CommentList.ArticleLink=http://production.indy.code-foo.org/en/${co_content.date.formatted.yyyy}/${to_content.date.formatted.MM}/${to_content.id}.shtml
+# Article Preview Link URL (Link to produced articles from within admin)
+Comment.PublicUrl=http://production.indy.code-foo.org/en/${date.formatted.yyyy}/${date.formatted.MM}/${id}.shtml
+Article.PublicUrl=http://production.indy.code-foo.org/en/${co_content.date.formatted.yyyy}/${to_content.date.formatted.MM}/${to_content.id}.shtml
# Which producers need to be called after an article (resp. a comment) is posted
PDF.PageSize=A4
-
-
-
#
# edit with caution below this line
######################################################################
Database.Password=
Database.Host=localhost
Database.Name=Mir
+Database.Port=5432
+Database.Driver=org.postgresql.Driver
-#
-# this sets the adaptor to be used
-
-Database.Adaptor=mir.storage.DatabaseAdaptorPostgresql
-
-#
-# configuration for adaptor postgres
-# In this example, "Mir" is the dbname
-
-Adaptor.PostgreSQL.URL=jdbc:postgresql://localhost:5432/Mir
-Adaptor.PostgreSQL.Driver=org.postgresql.Driver
-
-# how many articles should be shown on a list-page
-Lists.Max.Items=10
#
# Servlet / Module configurations
import java.util.Locale;\r
import java.util.Map;\r
import java.util.Vector;\r
-import javax.servlet.ServletConfig;\r
+import javax.servlet.*;\r
import javax.servlet.ServletException;\r
import javax.servlet.UnavailableException;\r
-import javax.servlet.http.HttpServletRequest;\r
+import javax.servlet.http.*;\r
import javax.servlet.http.HttpServletResponse;\r
import javax.servlet.http.HttpSession;\r
\r
* Mir.java - main servlet, that dispatches to servletmodules\r
*\r
* @author $Author: zapata $\r
- * @version $Id: Mir.java,v 1.49.2.6 2003/09/03 17:49:38 zapata Exp $\r
+ * @version $Id: Mir.java,v 1.49.2.7 2003/09/04 03:11:42 zapata Exp $\r
*\r
*/\r
public class Mir extends AbstractServlet {\r
if (username != null && password != null) {\r
user = usersModule.getUserForLogin(username, password);\r
\r
-\r
- ServletHelper.setUser(aRequest, user);\r
+ if (user!=null) {\r
+ ServletHelper.setUser(aRequest, user);\r
+ aRequest.getSession().setAttribute("sessiontracker", new SessionTracker(username));\r
+ }\r
}\r
\r
return user;\r
public String getServletInfo() {\r
return "Mir " + configuration.getString("Mir.Version");\r
}\r
+\r
+ private class SessionTracker implements HttpSessionBindingListener {\r
+ private String name;\r
+\r
+ public SessionTracker(String aUserName) {\r
+ name = aUserName;\r
+ }\r
+\r
+ public void valueBound(HttpSessionBindingEvent anEvent) {\r
+ MirGlobal.registerLogin(name);\r
+ }\r
+\r
+ public void valueUnbound(HttpSessionBindingEvent anEvent) {\r
+ MirGlobal.registerLogout(name);\r
+ }\r
+ }\r
}\r
# For missing values, the FallbackLanguage is used as default
Mir.Admin.FallbackLanguage=en
+# Show who's logged in?
+Mir.Admin.ShowLoggedinUsers=1
+
# Which usernames have admin priviliges (, seperated usernames)
AccessControl.SuperUsers = admin
Mir.Localizer.Admin.AllowDeleteArticle=1
# Article Preview Link URL (Link to produced articles from within admin)
-ContentList.ArticleLink=http://production.indy.code-foo.org/en/${date.formatted.yyyy}/${date.formatted.MM}/${id}.shtml
-CommentList.ArticleLink=http://production.indy.code-foo.org/en/${co_content.date.formatted.yyyy}/${to_content.date.formatted.MM}/${to_content.id}.shtml
+Comment.PublicUrl=/en/${date.formatted.yyyy}/${date.formatted.MM}/${id}.shtml
+Article.PublicUrl=/en/${co_content.date.formatted.yyyy}/${to_content.date.formatted.MM}/${to_content.id}.shtml
# enable deletion of comments/articles?
Mir.Localizer.Admin.AdministerOperations= \
# DATABASE SETUP
#
-#
-# specify your database
-
Database.poolMin=1
Database.poolMax=10
Database.poolResetTime=1.0
static private AccessControl accessControl;\r
static private Map articleOperations;\r
static private Map commentOperations;\r
+ static private Map loggedInUsers = new HashMap();\r
\r
public synchronized static MirLocalizer localizer() {\r
String localizerClassName;\r
}\r
}\r
\r
+\r
+ public static List getLoggedInUsers() {\r
+ List result = new Vector();\r
+\r
+ synchronized (loggedInUsers) {\r
+ Iterator i = loggedInUsers.entrySet().iterator();\r
+\r
+ while (i.hasNext()) {\r
+ Map.Entry entry = (Map.Entry) i.next();\r
+\r
+ Map item = new HashMap();\r
+ item.put("name", entry.getKey());\r
+ item.put("count", entry.getValue());\r
+ result.add(item);\r
+ }\r
+ }\r
+\r
+ return result;\r
+ }\r
+\r
+ public static void registerLogin(String aName) {\r
+ modifyLoggedInCount(aName, 1);\r
+ }\r
+\r
+ public static void registerLogout(String aName) {\r
+ modifyLoggedInCount(aName, -1);\r
+ }\r
+\r
+ private static void modifyLoggedInCount(String aName, int aModifier) {\r
+ synchronized (loggedInUsers) {\r
+ Integer count = (Integer) loggedInUsers.get(aName);\r
+ if (count==null)\r
+ count = new Integer(0);\r
+\r
+ if (count.intValue()+aModifier<=0) {\r
+ loggedInUsers.remove(aName);\r
+ }\r
+ else {\r
+ loggedInUsers.put(aName, new Integer(count.intValue() + aModifier));\r
+ }\r
+ }\r
+ }\r
}\r
\r
\r
\r
\r
public class ServletHelper {\r
- static LoggerWrapper logger = new LoggerWrapper("ServletModule.Helper");\r
-\r
+ private static LoggerWrapper logger = new LoggerWrapper("ServletModule.Helper");\r
\r
public static Map makeGenerationData(HttpServletRequest aRequest, HttpServletResponse aResponse, Locale[] aLocales) throws ServletModuleExc {\r
return makeGenerationData(aRequest, aResponse, aLocales, "bundles.adminlocal", "bundles.admin");\r
}\r
\r
public static Map makeGenerationData(HttpServletRequest aRequest, HttpServletResponse aResponse, Locale[] aLocales, String aBundle, String aDefaultBundle) throws ServletModuleExc {\r
-\r
try {\r
+ MirPropertiesConfiguration configuration = MirPropertiesConfiguration.instance();\r
Map result = new HashMap();\r
\r
MirGlobal.localizer().producerAssistant().initializeGenerationValueSet(result);\r
result.put("returnurl", null);\r
result.put("login_user", getUserAdapter(aRequest));\r
\r
+ if (configuration.getString("Mir.Admin.ShowLoggedinUsers").equals("1")) {\r
+ result.put("loggedinusers", MirGlobal.getLoggedInUsers());\r
+ }\r
+ else\r
+ result.put("loggedinusers", null);\r
+\r
Object languages =\r
new CachingRewindableIterator(\r
new EntityIteratorAdapter( "", "id", 30,\r
</tr>
</table>
<hr>
+<if loggedinusers>
+ logged in:
+ <list loggedinusers as u>
+ ${u.name} (${u.count})
+ </list>
+<hr>
+</if>