/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/kernel/trunk/api/src/main/java/org/sakaiproject/util/ToolListener.java $
* $Id: ToolListener.java 105077 2012-02-24 22:54:29Z ottenhoff@longsight.com $
***********************************************************************************
*
* Copyright (c) 2005, 2006, 2008 Sakai Foundation
*
* Licensed under the Educational Community 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.opensource.org/licenses/ECL-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.sakaiproject.util;
import java.util.Iterator;
import java.util.Set;
import java.io.File;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.component.cover.ServerConfigurationService;
import org.sakaiproject.tool.cover.ActiveToolManager;
/**
* <p>
* Webapp listener to detect webapp-housed tool registration.<br/>
* SAK-8908:<br/>
* Re-wrote the contextInitialized() method to add tool localization files to the
* newly registered tool(s). These files are required to be in the /tool/ directory
* have have a name of the form [toolId][_][localCode].properties. This format allows
* tool litles (etc) to be localized even when multiple tool registrations are included.
* </p>
* This listener can be added to the web.xml file with a snippet like this:
* <p>
* <code>
* <listener><br/>
* <listener-class>org.sakaiproject.util.ToolListener</listener-class><br/>
* </listener><br/>
* </code>
* </p>
*/
public class ToolListener implements ServletContextListener
{
/** Our log (commons). */
private static Log M_log = LogFactory.getLog(ToolListener.class);
/**
* Initialize.
*/
public void contextInitialized(ServletContextEvent event)
{
// The the location of resource and registration files.
Set paths = event.getServletContext().getResourcePaths("/tools/");
final String sakaiHomePath = ServerConfigurationService.getSakaiHomePath();
// First Pass: Search for tool registration file.
if (paths == null) {
return;
}
int registered = 0;
for (Iterator i = paths.iterator(); i.hasNext();)
{
final String path = (String) i.next();
// skip directories
if (path.endsWith("/")) continue;
// If an XML file, use it as the tool registration file.
if (path.endsWith(".xml"))
{
final File f = new File(sakaiHomePath + path);
if(f.exists()) {
ActiveToolManager.register(f, event.getServletContext());
ToolListener.M_log.info("overriding tools configuration: registering tools from resource: " + sakaiHomePath + path);
} else {
M_log.info("registering tools from resource: " + path);
ActiveToolManager.register(event.getServletContext().getResourceAsStream(path), event.getServletContext());
}
registered++;
}
}
if (registered == 0)
{
// Probably misconfigured as we should have at least one registered.
M_log.warn("No tools found to be registered.");
}
// Second pass, search for message bundles. Two passes are necessary to make sure the tool is registered first.
for (Iterator j = paths.iterator(); j.hasNext();)
{
String path = (String) j.next();
// skip directories
if (path.endsWith("/")) continue;
// Check for a message properties file.
if (path.endsWith(".properties"))
{
// Extract the tool id from the resource file name.
File reg = new File (path);
String tn = reg.getName();
String tid = null;
if (tn.indexOf('_') == -1)
tid = tn.substring (0, tn.lastIndexOf('.')); // Default file.
else
tid = tn.substring (0, tn.indexOf('_')); // Locale-based file.
String msg = event.getServletContext().getRealPath(path.substring (0, path.lastIndexOf('.'))+".properties");
if (tid != null)
{
ActiveToolManager.setResourceBundle (tid, msg);
M_log.info("Added localization resources for " + tid);
}
}
}
}
/**
* Destroy.
*/
public void contextDestroyed(ServletContextEvent event)
{
}
}