Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
$URL: https://source.sakaiproject.org/svn/help/tags/sakai-10.4/help-component/src/java/org/sakaiproject/component/app/help/HelpManagerImpl.java $ $Id: HelpManagerImpl.java 311262 2014-07-29 20:38:43Z ottenhoff@longsight.com $ Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009 The 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.component.app.help;
  
  import java.io.File;
  import java.io.Reader;
  import java.net.URL;
  import java.util.Arrays;
  import java.util.Date;
  import java.util.HashMap;
  import java.util.HashSet;
  import java.util.List;
  import java.util.Locale;
  import java.util.Map;
  import java.util.Set;
  import java.util.TreeSet;
  
  
HelpManager provides database and search capabilitites for the Sakai help tool.

Author(s):
Jarrod Lannan
Version:
$Id: HelpManagerImpl.java 311262 2014-07-29 20:38:43Z ottenhoff@longsight.com $
 
 public class HelpManagerImpl extends HibernateDaoSupport implements HelpManager
 {
 
 	private static final String QUERY_GETRESOURCEBYDOCID = "query.getResourceByDocId";
 	private static final String QUERY_GETCATEGORYBYNAME = "query.getCategoryByName";
 	private static final String QUERY_GET_WELCOME_PAGE = "query.getWelcomePage";
 	private static final String DOCID = "docId";
 	private static final String WELCOME_PAGE = "welcomePage";
 	private static final String NAME = "name";
 
 	private static final String LUCENE_INDEX_PATH = System
 	.getProperty("java.io.tmpdir")
 	+ . + "sakai.help";
 
 	private static final String TOC_API = "org.sakaiproject.api.app.help.TableOfContents";
 
 
 	private static String EXTERNAL_URL;
 	private static String DEFAULT_HELP_FILE = "help.xml";
 	private static String HELP_BASENAME = "help";
 	private static String DEFAULT_LOCALE = "default";
 
 	private Map<StringListhelpContextConfig = new HashMap<StringList>();
 	private int contextSize;
 
 
 	// Map which contains all localized help toc
 
 	// All supported locales
 	private List<Stringlocales;
 
 	private Object initializedLock = new Object();
 
 	private Glossary glossary;
 
 
 	private static final Log LOG = LogFactory.getLog(HelpManagerImpl.class);

 
 	{
 	}

See also:
org.sakaiproject.api.app.help.HelpManager#setServerConfigurationService(org.sakaiproject.service.framework.config.ServerConfigurationService )
 
 	{
 	}
 
 
 	public void setPreferencesService(PreferencesService preferencesService) {
 		this. = preferencesService;
 	}
 
 	public void setUserDirectoryService(UserDirectoryService userDirectoryService) {
 		this. = userDirectoryService;
 	}
 
 	public List getContexts(String mappedView)
 	{
 		return (List.get(mappedView);
 	}
 
 	public List getActiveContexts(Map session)
 	{
 		List contexts = (Listsession.get("help_contexts");
 		if (contexts == null)
 		{
 			contexts = new SizedList(getContextSize());
 			session.put("help_contexts"contexts);
 		}
 		return contexts;
 	}
 
 	public void addContexts(Map sessionString mappedView)
 	{
 		List newContexts = getContexts(mappedView);
 		List contexts = getActiveContexts(session);
 		if (newContexts != null)
 		{
 			contexts.addAll(newContexts);
 		}
 	}

return list of resources matching context id

Parameters:
contextId
Returns:
 
 	public Set<ResourcegetResources(Long contextId)
 	{
 		return searchResources(new TermQuery(new Term("context""\"" + contextId
 				+ "\"")));
 	}

Store resource

See also:
org.sakaiproject.api.app.help.HelpManager#storeResource(org.sakaiproject.api.help.Entity )
 
 	public void storeResource(Resource resource)
 	{
 	}

 
 	public Resource getResource(Long id)
 	{
 	}

 
 	public void deleteResource(Long resourceId)
 	{
 		Resource resource = getResource(resourceId);
 		if (resource == null) {
 			return;
 		}
 	}

 
 	public Source getSource(Long id)
 	{
 		try
 		{
 			return (SourceBeangetHibernateTemplate().load(SourceBean.classid);
 		}
 		{
 			return null;
 		}
 	}

See also:
org.sakaiproject.api.app.help.HelpManager#storeSource(org.sakaiproject.api.help.Source )
 
 	public void storeSource(Source source)
 	{
 	}

 
 	public void deleteSource(Long sourceId)
 	{
 		Source source = getSource(sourceId);
 		if (source == null) {
 			return;
 		}
 	}

 
 	public Context getContext(Long id)
 	{
 		try
 		{
 		}
 		{
 			return null;
 		}
 	}

See also:
org.sakaiproject.api.app.help.HelpManager#storeContext(org.sakaiproject.api.help.Context )
 
 	public void storeContext(Context context)
 	{
 	}

 
 	public void deleteContext(Long contextId)
 	{
 		Context context = getContext(contextId);
 		if (context == null) {
 			return;
 		}
 	}

 
 	{
 		Map<StringSet<Resource>> resourceMap = new HashMap<StringSet<Resource>>();
 		List<StringactiveContexts = getActiveContexts(session);
 		for(String context : activeContexts)
 		{
 			try
 			{
 				Set<Resourceresources = searchResources(new TermQuery(new Term("context""\""
 						+ context + "\"")));
 				if (resources != null && resources.size() > 0)
 				{
 					resourceMap.put(contextresources);
 				}
 			}
 			catch (Exception e)
 			{
 				.error(e);
 			}
 		}
 		return resourceMap;
 	}

 
 	public Set<ResourcesearchResources(String queryStr)
 	{
 
 		try
 		{
 			return searchResources(queryStr"content");
 		}
 		catch (ParseException e)
 		{
 			.debug("ParseException parsing Help search query  " + queryStre);
 			return null;
 		}
 	}

 
 	{
 		return getToc();
 	}

See also:
org.sakaiproject.api.app.help.HelpManager#setTableOfContents(org.sakaiproject.api.help.TableOfContents )
 
 	public void setTableOfContents(TableOfContents toc)
 	{
 	}

 
 	public GlossaryEntry searchGlossary(String keyword)
 	{
 		return getGlossary().find(keyword);
 	}

Search Resources

Parameters:
query
Returns:
Set of matching results.
 
 	protected Set<ResourcesearchResources(Query query)
 	{
 		Set<Resourceresults = new HashSet<Resource>();
 
 		if (!.containsKey(locale)) {
 			locale = ;
 		}
 
 		String luceneFolder =  + . + locale;
 
         IndexReader reader = null;
 		FSDirectory dir = null;
 		try
 		{
 			dir = FSDirectory.open(new File(luceneFolder));
 			reader = DirectoryReader.open(dir);
 			IndexSearcher searcher = new IndexSearcher(reader);
 
 			.debug("Searching for: " + query.toString());
 
 			//Hits hits = searcher.search(query);
 			TopDocs topDocs = searcher.search(query, 1000);
 			ScoreDoc[] hits = topDocs.scoreDocs;
 			.debug(hits.length + " total matching documents");
 
 			for (ScoreDoc scoreDoc : hits) {
 				Document doc = searcher.doc(scoreDoc.doc);
 				resource.setScore(scoreDoc.score * 100);
 				results.add(resource);
 			}
 
 		}
 		catch (Exception e)
 		{
 			.error(e);
 		}
 		finally 
 		{
             //http://mail-archives.apache.org/mod_mbox/lucene-java-user/201304.mbox/%3CCAGaRif0agg+XCXbccdxUmB5h9v5dHqjEvwi5X_vmU3sMM20QZg@mail.gmail.com%3E
 			if (reader != null) {
 				try {
 					reader.close();
 				} catch (IOException e) {
 					//nothing to do
 				}
 			}
 			if (dir != null) {
 				dir.close();
 			}
 		}
 		return results;
 	}

Search Lucene

Parameters:
queryStr
defaultField
Returns:
Throws:
org.apache.lucene.queryparser.classic.ParseException
 
 	protected Set<ResourcesearchResources(String queryStrString defaultField)
 	{
 		QueryParser parser = new QueryParser(.defaultFieldanalyzer);
 		Query query = parser.parse(queryStr);
 		return searchResources(query);
 	}

Get Resource From Document.

Parameters:
document
Returns:
resource bean
 
 	{
 		Long id = new Long(document.getField("id").stringValue());
 		return (ResourceBeangetResource(id);
 	}

Get entire Collection of Resources.

Returns:
collection of resources
 
 	protected Collection<? extends ResourcegetResources()
 	{
 	}

Get ContextSize.

Returns:
size of Context.
 
 	public int getContextSize()
 	{
 		return ;
 	}

Set ContextSize

Parameters:
contextSize
 
 	public void setContextSize(int contextSize)
 	{
 		this. = contextSize;
 	}

Get Document.

Parameters:
resource
Returns:
document
Throws:
java.io.IOException
java.net.MalformedURLException
 
 	protected Document getDocument(ResourceBean resourcethrows IOExceptionMalformedURLException {
 
 		Document doc = new Document();
 		if (resource.getContexts() != null)
 		{
 			for (String context : resource.getContexts())
 			{
 				doc.add(new Field("context""\"" + context + "\""....));
 			}
 		}
 
 		URL urlResource;
 		URLConnection urlConnection = null;
 		//For local file override
 		
   		String localHelpPath = sakaiHomePath+.getString("help.localpath","/help/");
 		File localFile = new File(localHelpPath+resource.getLocation());
 		boolean localFileIsFile = false;
 		if(localFile.isFile()) { 
 			.debug("Local help file overrides: "+resource.getLocation());
 			localFileIsFile = true;
 		}
 		StringBuilder sb = new StringBuilder();
 		if (resource.getLocation() == null || resource.getLocation().startsWith("/"))
 		{
 			// handle REST content
 			{
 				urlResource = new URL(getRestConfiguration().getRestUrlInDomain() + resource.getDocId()
 						+ "?domain=" + getRestConfiguration().getRestDomain());
 				urlConnection = urlResource.openConnection();
 
 				String basicAuthUserPass = getRestConfiguration().getRestCredentials();
 				String encoding = Base64.encodeBase64(basicAuthUserPass.getBytes("utf-8")).toString();       
 				urlConnection.setRequestProperty("Authorization""Basic " + encoding);
 
 						urlConnection.getInputStream()), 512);
 				try {
 					int readReturn = 0;
 					char[] cbuf = new char[512];
 					while ((readReturn = br.read(cbuf, 0, 512)) != -1)
 					{
 						sb.append(cbuf, 0, readReturn);
 					}
 				} finally {
 					br.close();
 				}
 
 				// if document is coming from corpus then get document name from xml and assign to resource
 				resource.setName(resourceName);
 				storeResource(resource);
 			}
 			else if (!"".equals())
 			{
 				// handle external help location
 				urlResource = new URL( + resource.getLocation());
 			}
 			else
 			{
 				// Add the home folder file reading here
 				if(localFileIsFile) { 
 					urlResource = localFile.toURI().toURL();
 				}
 				else {
 				// handle classpath location
 					urlResource = getClass().getResource(resource.getLocation());
 				}
 			}
 		}
 		else
 		{
 			// handle external location specified in reg file
 			urlResource = new URL(resource.getLocation());
 		}
 
 		if (urlResource == null)
 		{
 			return null;
 		}
 
 		if (resource.getLocation() != null){
 			String resLocation = resource.getLocation();
 			if(localFileIsFile) { 
 				resLocation = localFile.getPath();
 			}
 			doc.add(new Field("location"resLocation....));
 		}
 
 
 		//doc.add(Field.Keyword("id", resource.getId().toString()));
 		doc.add(new Field("id"resource.getId().toString(), ....));
 
 		{
 			Reader reader = new BufferedReader(new InputStreamReader(urlResource.openStream()));
 			try {
 				int readReturn = 0;
 				char[] cbuf = new char[512];
 				while ((readReturn = reader.read(cbuf, 0, 512)) != -1)
 				{
 					sb.append(cbuf, 0, readReturn);
 				}
 			} finally {
 				reader.close();
 			}
 		}
 		//doc.add(Field.Text("content", sb.toString()));
 		doc.add(new Field("content"sb.toString(), ....));
 
 		return doc;
 	}

Get Table Of Contents Bean.

Returns:
table of contents bean
 
 	{
 		if ( == null)
 		{
 			return null;
 		}
 		if (.containsKey(locale)) {
 			return .get(locale);
 		}
 		else {
 		}
 	}

Set Table Of Contents Bean.

Parameters:
toc
 
 	public void setToc(TableOfContentsBean toc)
 	{
 		this..put(toc);
 	}

 
 	public Glossary getGlossary()
 	{
 		return ;
 	}

Set Glossary.

Parameters:
glossary
 
 	public void setGlossary(Glossary glossary)
 	{
 		this. = glossary;
 	}

See also:
org.sakaiproject.api.app.help.HelpManager#storeCategory(org.sakaiproject.api.help.Category )
 
 	public void storeCategory(Category category)
 	{
 	}

 
 	{
 		return new CategoryBean();
 	}

 
 	{
 		return new ResourceBean();
 	}

 
 	public Resource getResourceByDocId(final String docId)
 	{
 		{
 			public Object doInHibernate(Session sessionthrows HibernateException,
 			{
 				org.hibernate.Query q = session
 
 				q.setString(, (docId == null) ? null : docId.toLowerCase());
 				if (q.list().size() == 0){
 					return null;
 				}
 				else{
 					return (Resourceq.list().get(0);
 				}
 			}
 		};
 		Resource resource = (ResourcegetHibernateTemplate().execute(hcb);
 		return resource;
 	}

 
 	{
 		{
 			public Object doInHibernate(Session sessionthrows HibernateException,
 			{
 				org.hibernate.Query q = session
 				q.setString("true");
 				if (q.list().size() == 0){
 					return null;
 				}
 				else{
 					return ((Resourceq.list().get(0)).getDocId();
 				}
 			}
 		};
 		return (StringgetHibernateTemplate().execute(hcb);
 	}

Find a Category by name

Parameters:
name
Returns:
Category
 
 	public Category getCategoryByName(final String name)
 	{
 		{
 			public Object doInHibernate(Session sessionthrows HibernateException,
 			{
 				org.hibernate.Query q = session
 				q.setString(, (name == null) ? name : name.toLowerCase());
 				return q.uniqueResult();
 			}
 		};
 	}

Index Categories and Resources

Parameters:
categories
 
 	private void indexRecursive(IndexWriter indexWriterSet<Categorycategories)
 	{
 		for (Category categorycategories)
 		{
 			Set<ResourceresourcesList = category.getResources();
 
 			for (Resource resource : resourcesList) {
 				try
 				{
 					Document doc = getDocument((ResourceBean)resource);
 					if (doc != null)
 					{
 						indexWriter.addDocument(doc);
 						.debug("added resource '" + resource.getName() + "', doc count="
 								+ indexWriter.maxDoc());
 					}
 					else
 					{
 						.debug("failed to add resource '" + "' (" + resource.getName());
 					}
 				}
 				catch (IOException e)
 				{
 					.error("I/O error while adding resource '" + "' ("
 							+ resource.getName() + "): " + e.getMessage(), e);
 				}
 			}
 
 			Set<CategorysubCategories = category.getCategories();
 			indexRecursive(indexWritersubCategories);
 		}
 	}

Store the mapping of Categories and Resources

Parameters:
categories
 
 	private void storeRecursive(Set<Categorycategories)
 	{
 		for(Category categorycategories)
 		{
 			Set<ResourceresourcesList = category.getResources();
 			category.setResources(null);
 
 			for (Resource resourceresourcesList)
 			{
 				resource.setDocId(resource.getDocId().toLowerCase());
 				resource.setCategory(category);
 			}
 
 			category.setResources(resourcesList);
 			this.storeCategory(category);
 
 			Set<CategorysubCategories = category.getCategories();
 			storeRecursive(subCategories);
 		}
 	}

 
 	{
 	}

set Support Email Address.

Parameters:
email
 
 	public void setSupportEmailAddress(String email)
 	{
 		this. = email;
 	}

get tool manager

Returns:
Returns the toolManager.
 
 	{
 		return ;
 	}

set tool manager

Parameters:
toolManager The toolManager to set.
 
 	public void setToolManager(ToolManager toolManager)
 	{
 		this. = toolManager;
 	}

Parameters:
txManager The txManager to set.
 
 	public void setTxManager(HibernateTransactionManager txManager)
 	{
 		this. = txManager;
 	}

 
 	{
 	}

set REST configuration

Parameters:
restConfiguration
 
 	public void setRestConfiguration(RestConfiguration restConfiguration)
 	{
 		this. = restConfiguration;
 	}


Reinitialize help content from UI
 
 	public void reInitialize(){
 		synchronized ()
 		{   
 		}
 	}

Synchronize first access to tool.

 
 	public void initialize()
 	{
 		{
 			return;
 		}
 		else
 		{
 			synchronized ()
 			{
 				{
 
 					// handle external help content
 					"help.location");
 					if (!"".equals())
 					{
 						{
 							// remove trailing forward slash
 									.length() - 1);
 						}
 					}
 
 					// Get all supported locales
 					 = new ArrayList<String>();
 					for (Locale element : sl) {
 					    .add(element.toString()); // Locale toString should generate en_GB type identifiers
 					}
 
 					// Add default locale
 
 				}
 			}
 		}
 	}

 
 	{
 		return ;
 	}
 
 	private void dropExistingContent()
 	{
 		{
 			.debug("dropExistingContent()");
 		}
 
 		{
 			{
 				getHibernateTemplate().bulkUpdate("delete CategoryBean");
 				return null;
 			}
 		});
 	}

Returns the user locale

Parameters:
prefLocales The prefLocales to set.
 
 	private Locale getSelectedLocale() {
 
 		if (loc != null)
 		{
 			return loc;
 		} else {
 			return Locale.getDefault();
 		}
 	}

Register help content either locally or externally Index resources in Lucene
	private void registerHelpContent()
			.debug("registerHelpContent()");
		// register external help docs
		else
		// Create lucene indexes for each toc (which key is either a locale or 'default')
		for (String key : .keySet())
			String luceneIndexPath =  + . + key;
			TableOfContentsBean currentToc = .get(key);
			// create index in lucene
			IndexWriter writer = null;
			Date start = new Date();
			try
				//writer = new IndexWriter(luceneIndexPath, new StandardAnalyzer(Version.LUCENE_40), true);
				FSDirectory directory = FSDirectory.open(new File(luceneIndexPath));
                IndexWriterConfig config = new IndexWriterConfig(.new StandardAnalyzer(.));
				writer = new IndexWriter(directoryconfig);
			catch (IOException e)
				.error("failed to create IndexWriter " + e.getMessage(), e);
				return;
			// Index categories and resources
			indexRecursive(writercurrentToc.getCategories());
			try
				writer.commit();
				writer.close();
			catch (IOException e)
				.error("failed to close writer " + e.getMessage(), e);
			Date end = new Date();
			.info("finished initializing lucene for '" + key + "' in "
					+ (end.getTime() - start.getTime()) + " total milliseconds");
	}

register external help content build document from external reg file

Parameters:
externalHelpReg
	public void registerExternalHelpContent(String helpFile)
		Set<Categorycategories = new TreeSet<Category>();
		URL urlResource = null;
		InputStream ism = null;
		BufferedInputStream bis = null;
		try
			try {
				urlResource = new URL( + "/" + helpFile);
				ism = urlResource.openStream();
catch (IOException e) {
				// Try default help file
				helpFile = ;
				urlResource = new URL( + "/" + helpFile);
				ism = urlResource.openStream();
			bis = new BufferedInputStream(ism);
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			InputSource is = new org.xml.sax.InputSource(bis);
			org.w3c.dom.Document xmlDocument = builder.parse(is);
			Node helpRegNode = (NodexmlDocument.getDocumentElement();
			recursiveExternalReg(helpRegNodenullcategories);
			// handle corpus docs
				// get corpus document
				DocumentBuilderFactory dbfCorpus = DocumentBuilderFactory.newInstance();
				dbfCorpus.setNamespaceAware(true);
				DocumentBuilder builderCorpus = dbfCorpus.newDocumentBuilder();
				StringReader sReader = new StringReader(corpusXml);
				InputSource isCorpus = new org.xml.sax.InputSource(sReader);
				org.w3c.dom.Document xmlDocumentCorpus = builderCorpus.parse(isCorpus);
				registerCorpusDocs(xmlDocumentCorpus);
				sReader.close();
			.warn("Unable to load external URL: " +  + "/" + helpFilee);
		catch (IOException e)
			.warn("I/O error opening external URL: " +  + "/" + helpFilee);
		catch (SAXException e)
		finally
			try{
				if (bis != null){
					bis.close();
			catch (IOException e){
				.error("error closing stream"e);
		// Add to toc map
		externalToc.setCategories(categories);
		setTableOfContents(externalToc);
	}

Returns:
Locale based on its string representation (language_region)
	private Locale getLocaleFromString(String localeString) {
	}

Adds help for a specific locale

Parameters:
path
locale
	private void addToolHelp(String pathString locale)
		URL urlResource = null;
		String classpathUrl = null;
	    String localHelpPath = sakaiHomePath+.getString("help.localpath","/help/");
	    
	    File localFile = null;
	    
		// find default help file
		if ( locale.equals() ) {
			classpathUrl = path + "/" +  + ".xml";
			localFile = new File(localHelpPath+classpathUrl);
			if(localFile.isFile()) {
				try {
					urlResource = localFile.toURI().toURL();
catch (MalformedURLException e) {
					urlResource = getClass().getResource(classpathUrl);
else {
				urlResource = getClass().getResource(classpathUrl);
		// find localized help file
		else {
			classpathUrl = path + "/" +  + "_" + locale + ".xml";
			localFile = new File(localHelpPath+classpathUrl);
			if(localFile.isFile()) {
				try {
					urlResource = localFile.toURI().toURL();
catch (MalformedURLException e) {
					urlResource = getClass().getResource(classpathUrl);
else {
				urlResource = getClass().getResource(classpathUrl);
			// If language/region help file not found, look for language-only help file
			if ( urlResource == null ) {
				Locale nextLocale = getLocaleFromString(locale);
				classpathUrl = path + "/" +  + "_" + nextLocale.getLanguage() + ".xml";
				localFile = new File(localHelpPath+classpathUrl);
				if(localFile.isFile()) {
					try {
						urlResource = localFile.toURI().toURL();
catch (MalformedURLException e) {
						urlResource = getClass().getResource(classpathUrl);
else {
					urlResource = getClass().getResource(classpathUrl);
			// If language-only help file not found, look for default help file
			if ( urlResource == null ) {
				classpathUrl = path + "/" +  + ".xml";
				localFile = new File(localHelpPath+classpathUrl);
				if(localFile.isFile()) {
					try {
						urlResource = localFile.toURI().toURL();
catch (MalformedURLException e) {
						urlResource = getClass().getResource(classpathUrl);
else {
					urlResource = getClass().getResource(classpathUrl);
		// Url exists?
		if (urlResource != null)
			TableOfContentsBean localizedToc;
			// Add this tool categories to this tool toc
			try
					new UrlResource(urlResource);  
				BeanFactory beanFactory = new XmlBeanFactory(resource);
				TableOfContents tocTemp = (TableOfContentsbeanFactory.getBean();
				Set<Categorycategories = tocTemp.getCategories();
				storeRecursive(categories);
				// Get localized toc
				if (.containsKey(locale)) {
					localizedToc = .get(locale);
				else { // Create and add localized toc
					localizedToc = new TableOfContentsBean();
					.put(localelocalizedToc);
				// Update localized toc categories
				localizedToc.getCategories().addAll(categories);
			catch (Exception e)
				.warn("Unable to load help index from " + classpathUrl + " : " + e.getMessage());
	}


register local content
	public void registerStaticContent()
		//  register static content
		Set<TooltoolSet = .findTools(nullnull);
		// find out what we want to ignore
		List<StringhideHelp = Arrays.asList(StringUtils.split(.getString("help.hide"), ","));
		if (hideHelp == null) {
		    hideHelp = new ArrayList<String> ();
		for (Tool tool : toolSet) {
			if (tool != null && tool.getId() != null && !hideHelp.contains(tool.getId()))
				String[] extraCollections = {};
				if (toolHelpCollections != null) {
					extraCollections = StringUtils.split(toolHelpCollections",");
				// Loop throughout the locales list
				for (String locale : )