Java tutorial
/* $HeadURL:: $ * $Id$ * * Copyright (c) 2006-2010 by Public Library of Science * http://plos.org * http://ambraproject.org * * Licensed under the Apache 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.apache.org/licenses/LICENSE-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.ambraproject.freemarker; import org.ambraproject.web.VirtualJournalContextFilter; import org.apache.commons.configuration.CombinedConfiguration; import org.apache.commons.configuration.Configuration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.text.DateFormat; import java.text.ParseException; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.StringTokenizer; /** * Class to configure the FreeMarker templates with css and javascript files and the title of page. Used so that we can * have just one or two main templates and swap out the body section with a Struts 2 result. * * @author Stephen Cheng */ public class AmbraFreemarkerConfig { private static final Logger log = LoggerFactory.getLogger(AmbraFreemarkerConfig.class); private static final String[] DEFAULT_CSS_FILES = { "/css/iepc.css", "/css/screen.css" }; private static final String[] DEFAULT_JS_FILES = { "/javascript/all.js" }; private static final String DEFAULT_TITLE = "Journal"; private static String DEFAULT_JOURNAL_NAME_CONFIG_KEY = "ambra.virtualJournals.default"; private static int DEFAULT_TEMPLATE_UPDATE_DELAY = 600; private static int DEFAULT_TEMPLATE_CACHE_STRONG = 350; private static int DEFAULT_TEMPLATE_CACHE_SOFT = 100; private final boolean debug; private Map<String, JournalConfig> journals; private Map<String, JournalConfig> journalsByIssn; private Map<String, String> journalUrls; private Map<String, String> journalsUrlsByIssn; private Configuration freemarkerProperties; private String dirPrefix; private String subdirPrefix; private String host; private String casLoginURL; private String casLogoutURL; private String registrationURL; private String changePasswordURL; private String doiResolverURL; private String changeEmailURL; private String defaultJournalName; private String orgName; private String feedbackEmail; private String nedProfileURL; private String nedRegistrationURL; private Date cisStartDate; private int cache_storage_strong; private int cache_storage_soft; private int templateUpdateDelay; /** * Constructor that loads the list of css and javascript files and page titles for pages which follow the standard * templates. Creates its own composite configuration by iterating over each of the configs in the config to assemble * a union of pages defined. * * @param configuration Ambra configuration * @throws Exception Exception */ public AmbraFreemarkerConfig(Configuration configuration) throws Exception { if (log.isDebugEnabled()) { log.debug("Creating FreeMarker configuration"); } debug = configuration.getBoolean("struts.devMode"); dirPrefix = configuration.getString("ambra.platform.appContext"); subdirPrefix = configuration.getString("ambra.platform.resourceSubDir"); host = configuration.getString("ambra.platform.host"); casLoginURL = configuration.getString("ambra.services.cas.url.login"); casLogoutURL = configuration.getString("ambra.services.cas.url.logout"); registrationURL = configuration.getString("ambra.services.registration.url.registration"); changePasswordURL = configuration.getString("ambra.services.registration.url.change-password"); changeEmailURL = configuration.getString("ambra.services.registration.url.change-email"); doiResolverURL = configuration.getString("ambra.services.crossref.plos.doiurl"); defaultJournalName = configuration.getString(DEFAULT_JOURNAL_NAME_CONFIG_KEY); journals = new HashMap<String, JournalConfig>(); journalsByIssn = new HashMap<String, JournalConfig>(); orgName = configuration.getString("ambra.platform.name"); feedbackEmail = configuration.getString("ambra.platform.email.feedback"); cache_storage_strong = configuration.getInt("ambra.platform.template_cache.strong", DEFAULT_TEMPLATE_CACHE_STRONG); cache_storage_soft = configuration.getInt("ambra.platform.template_cache.soft", DEFAULT_TEMPLATE_CACHE_SOFT); templateUpdateDelay = configuration.getInt("ambra.platform.template_cache.update_delay", DEFAULT_TEMPLATE_UPDATE_DELAY); String date = configuration.getString("ambra.platform.cisStartDate"); freemarkerProperties = configuration.subset("ambra.platform.freemarker"); nedProfileURL = configuration.getString("ned.profile"); nedRegistrationURL = configuration.getString("ned.registration"); if (date == null) { throw new Exception("Could not find the cisStartDate node in the " + "ambra platform configuration. Make sure the " + "ambra/platform/cisStartDate node exists."); } try { cisStartDate = DateFormat.getDateInstance(DateFormat.SHORT).parse(date); } catch (ParseException ex) { throw new Exception("Could not parse the cisStartDate value of \"" + date + "\" in the ambra platform configuration. Make sure the cisStartDate is in the " + "following format: dd/mm/yyyy", ex); } loadConfig(configuration); processVirtualJournalConfig(configuration); // Now that the "journals" Map exists, index that map by Eissn to populate "journalsByEissn". if (journals.entrySet() != null && journals.entrySet().size() > 0) { for (Entry<String, JournalConfig> e : journals.entrySet()) { JournalConfig j = e.getValue(); journalsByIssn.put(j.getIssn(), j); } } journalUrls = buildUrlMap(journals); journalsUrlsByIssn = buildUrlMap(journalsByIssn); if (log.isTraceEnabled()) { for (Entry<String, JournalConfig> e : journals.entrySet()) { JournalConfig j = e.getValue(); log.trace("Journal: " + e.getKey()); log.trace("Journal url: " + j.getUrl()); log.trace("Default Title: " + j.getDefaultTitle()); log.trace("Default CSS: " + printArray(j.getDefaultCss())); log.trace("Default JavaScript: " + printArray(j.getDefaultCss())); Map<String, String[]> map = j.getCssFiles(); for (Entry<String, String[]> entry : map.entrySet()) { log.trace("PageName: " + entry.getKey()); log.trace("CSS FILES: " + printArray(entry.getValue())); } map = j.getJavaScriptFiles(); for (Entry<String, String[]> entry : map.entrySet()) { log.trace("PageName: " + entry.getKey()); log.trace("JS FILES: " + printArray(entry.getValue())); } for (Entry<String, String> entry : j.getTitles().entrySet()) { log.trace("PageName: " + entry.getKey()); log.trace("Title: " + entry.getValue()); } } log.trace("Dir Prefix: " + dirPrefix); log.trace("SubDir Prefix: " + subdirPrefix); log.trace("Host: " + host); log.trace("Cas url login: " + casLoginURL); log.trace("Case url logout: " + casLogoutURL); log.trace("Registration URL: " + registrationURL); log.trace("Registration Change Pass URL: " + changePasswordURL); log.trace("Registration Change EMail URL: " + changeEmailURL); log.trace("DOI Resolver URL: " + doiResolverURL); log.trace("Default Journal Name: " + defaultJournalName); log.trace("NED Profile URL: " + nedProfileURL); log.trace("NED Registration URL: " + nedRegistrationURL); } if (log.isDebugEnabled()) { log.debug("End FreeMarker Configuration Reading"); } } private void loadConfig(Configuration myConfig) { if (!(myConfig instanceof CombinedConfiguration)) loadConfig2(myConfig); else { int numConfigs = ((CombinedConfiguration) myConfig).getNumberOfConfigurations(); for (int c = 0; c < numConfigs; c++) loadConfig(((CombinedConfiguration) myConfig).getConfiguration(c)); } } private void loadConfig2(Configuration configuration) { int numJournals = configuration.getList("ambra.freemarker.journal.name").size(); for (int k = 0; k < numJournals; k++) { final String journal = "ambra.freemarker.journal(" + k + ")"; final String journalName = configuration.getString(journal + ".name"); if (log.isDebugEnabled()) { log.debug("reading journal name: " + journalName); } JournalConfig jc = journals.get(journalName); if (jc == null) { if (log.isDebugEnabled()) { log.debug("journal Not found, creating: " + journalName); } jc = new JournalConfig(); journals.put(journalName, jc); } if (jc.getDefaultTitle() == null) { final String title = configuration.getString(journal + ".default.title"); if (title != null) { jc.setDefaultTitle(title); } } if (jc.getMetaDescription() == null) { final String metaDescription = configuration.getString(journal + ".metaDescription"); if (metaDescription != null) { jc.setMetaDescription(metaDescription); } } if (jc.getMetaKeywords() == null) { final String metaKeywords = configuration.getString(journal + ".metaKeywords"); if (metaKeywords != null) { jc.setMetaKeywords(metaKeywords); } } if (jc.getHashTag() == null) { final String hashtag = configuration.getString(journal + ".hashTag"); if (hashtag != null) { jc.setHashTag(hashtag); } } if (jc.getDisplayName() == null) { final String displayName = configuration.getString(journal + ".displayName"); if (displayName != null) { jc.setDisplayName(displayName); } } if (jc.getArticleTitlePrefix() == null) { final String articleTitlePrefix = configuration.getString(journal + ".articleTitlePrefix"); if (articleTitlePrefix != null) { jc.setArticleTitlePrefix(articleTitlePrefix); } } if (jc.getDefaultCss() == null) { final List fileList = configuration.getList(journal + ".default.css.file"); String[] defaultCss; if (fileList.size() > 0) { defaultCss = new String[fileList.size()]; Iterator iter = fileList.iterator(); for (int i = 0; i < fileList.size(); i++) { defaultCss[i] = dirPrefix + subdirPrefix + iter.next(); } jc.setDefaultCss(defaultCss); } } if (jc.getDefaultJavaScript() == null) { final List fileList = configuration.getList(journal + ".default.javascript.file"); String javascriptFile; String[] defaultJavaScript; if (fileList.size() > 0) { defaultJavaScript = new String[fileList.size()]; Iterator iter = fileList.iterator(); for (int i = 0; i < fileList.size(); i++) { javascriptFile = (String) iter.next(); if (javascriptFile.endsWith(".ftl")) { defaultJavaScript[i] = subdirPrefix + javascriptFile; } else { defaultJavaScript[i] = dirPrefix + subdirPrefix + javascriptFile; } } jc.setDefaultJavaScript(defaultJavaScript); } } final int numPages = configuration.getList(journal + ".page.name").size(); for (int i = 0; i < numPages; i++) { String page = journal + ".page(" + i + ")"; String pageName = configuration.getString(page + ".name"); if (log.isDebugEnabled()) log.debug("Reading config for page name: " + pageName); if (!jc.getTitles().containsKey(pageName)) { final String title = configuration.getString(page + ".title"); if (title != null) { jc.getTitles().put(pageName, title); } } if (!jc.getCssFiles().containsKey(pageName)) { List<String> list = configuration.getList(page + ".css.file"); String[] cssArray = new String[list.size()]; int j = 0; for (String fileName : list) { cssArray[j++] = dirPrefix + subdirPrefix + fileName; } if (cssArray.length > 0 || cssArray.length == 0 && configuration.getProperty(page + ".css") != null) { jc.getCssFiles().put(pageName, cssArray); } } if (!jc.getJavaScriptFiles().containsKey(pageName)) { List<String> list = configuration.getList(page + ".javascript.file"); String[] javaScriptArray = new String[list.size()]; int j = 0; for (String fileName : list) { if (fileName.endsWith(".ftl")) { javaScriptArray[j++] = subdirPrefix + fileName; } else { javaScriptArray[j++] = dirPrefix + subdirPrefix + fileName; } } if (javaScriptArray.length > 0 || javaScriptArray.length == 0 && configuration.getProperty(page + ".javascript") != null) { jc.getJavaScriptFiles().put(pageName, javaScriptArray); } } } } } private String printArray(String[] in) { StringBuilder s = new StringBuilder(); if (in != null) { for (String i : in) { s.append(i); s.append(", "); } } return s.toString(); } private void processVirtualJournalConfig(Configuration configuration) { final Collection<String> virtualJournals = configuration .getList(VirtualJournalContextFilter.CONF_VIRTUALJOURNALS_JOURNALS); String defaultVirtualJournal = configuration .getString(VirtualJournalContextFilter.CONF_VIRTUALJOURNALS_DEFAULT + ".journal"); JournalConfig jour; if ((defaultVirtualJournal != null) && (!"".equals(defaultVirtualJournal))) { jour = journals.get(defaultVirtualJournal); if (jour != null) { jour.setUrl( configuration.getString(VirtualJournalContextFilter.CONF_VIRTUALJOURNALS_DEFAULT + ".url")); jour.setIssn(configuration .getString(VirtualJournalContextFilter.CONF_VIRTUALJOURNALS_DEFAULT + ".eIssn")); } } for (final String journalName : virtualJournals) { jour = journals.get(journalName); if (jour != null) { jour.setUrl(configuration .getString(VirtualJournalContextFilter.CONF_VIRTUALJOURNALS + "." + journalName + ".url")); jour.setIssn(configuration.getString( VirtualJournalContextFilter.CONF_VIRTUALJOURNALS + "." + journalName + ".eIssn")); } } } /** * Gets the title for the given template and journal name. Return the default value if not defined * * @param templateName Template name * @param journalName Journal name * @return Returns the title given a template name. */ public String getTitle(String templateName, String journalName) { JournalConfig jc = journals.get(journalName); JournalConfig defaultJc = journals.get(defaultJournalName); String defaultTemplateName = "/" + trimJournalFromTemplatePath(templateName); String title = null; // Try to find title for template if (jc != null) title = jc.getTitles().get(defaultTemplateName); if (title != null) return title; // Try to find title for template in default journal if (defaultJc != null) title = defaultJc.getTitles().get(defaultTemplateName); if (title != null) return title; // Try default title in current journal if (jc != null) title = jc.getDefaultTitle(); if (title != null) return title; // Try default title in default journal if (defaultJc != null) title = defaultJc.getDefaultTitle(); if (title != null) return title; // Use hardcoded default title return DEFAULT_TITLE; } /** * @return <code>true</code> if struts is in dev mode */ public boolean getDebug() { return debug; } /** * Gets title for page defined in templateName and uses the defaultJournal name * * @param templateName Template name * @return page title */ public String getTitle(String templateName) { return getTitle(templateName, defaultJournalName); } /** * Gets the array of CSS files associated with templateName and journalName or returns the default values if not * available. * * @param templateName Template name * @param journalName Journal name * @return Returns list of css files given a template name. */ public String[] getCss(String templateName, String journalName) { JournalConfig jc = journals.get(journalName); boolean usingDefault = false; if (jc == null) { usingDefault = true; jc = journals.get(defaultJournalName); } String defaultTemplateName = "/" + trimJournalFromTemplatePath(templateName); String[] retVal = getCssForJournal(jc, templateName, defaultTemplateName); if (retVal != null) return retVal; if (!usingDefault) { JournalConfig defaultJc = journals.get(defaultJournalName); retVal = getCssForJournal(defaultJc, templateName, defaultTemplateName); } return retVal != null ? retVal : DEFAULT_CSS_FILES; } private String[] getCssForJournal(JournalConfig jc, String templateName, String defaultTemplateName) { String[] retVal = jc.getCssFiles().get(templateName); if (retVal != null) return retVal; retVal = jc.getCssFiles().get(defaultTemplateName); if (retVal != null) return retVal; return jc.getDefaultCss(); } /** * Retrieves css files for given page in the default journal * * @param templateName Template name * @return array of css filename for the page */ public String[] getCss(String templateName) { return getCss(templateName, defaultJournalName); } /** * Gets the array of JavaScript files associated with templateName and journalName or returns the default values if * not available. * * @param templateName Template name * @param journalName Journal name * @return Returns the list of JavaScript files given a template name. */ public String[] getJavaScript(String templateName, String journalName) { JournalConfig jc = journals.get(journalName); boolean usingDefault = false; if (jc == null) { usingDefault = true; jc = journals.get(defaultJournalName); } String defaultTemplateName = "/" + trimJournalFromTemplatePath(templateName); String[] retVal = getJavascriptsForJournal(jc, templateName, defaultTemplateName); if (retVal != null) return retVal; if (!usingDefault) { JournalConfig defaultJc = journals.get(defaultJournalName); retVal = getJavascriptsForJournal(defaultJc, templateName, defaultTemplateName); } return retVal != null ? retVal : DEFAULT_JS_FILES; } private String[] getJavascriptsForJournal(JournalConfig jc, String templateName, String defaultTemplateName) { String[] retVal = jc.getJavaScriptFiles().get(templateName); if (retVal != null) return retVal; retVal = jc.getJavaScriptFiles().get(defaultTemplateName); if (retVal != null) return retVal; return jc.getDefaultJavaScript(); } /** * Gets the array of javascript files for the default journal and the specificed page name * * @param templateName Template name * @return list of javascript files for the given page */ public String[] getJavaScript(String templateName) { return getJavaScript(templateName, defaultJournalName); } /** * Gets meta keywords for journal * * @param journalName Journal name * @return meta keywords */ public String getMetaKeywords(String journalName) { JournalConfig jc = journals.get(journalName); boolean usingDefault = false; if (jc == null) { usingDefault = true; jc = journals.get(defaultJournalName); } String retVal = jc.getMetaKeywords(); if ((retVal == null) && !usingDefault) { jc = journals.get(defaultJournalName); retVal = jc.getMetaKeywords(); } return retVal != null ? retVal : ""; } /** * gets meta description for journal * * @param journalName Journal name * @return meta description */ public String getMetaDescription(String journalName) { JournalConfig jc = journals.get(journalName); boolean usingDefault = false; if (jc == null) { usingDefault = true; jc = journals.get(defaultJournalName); } String retVal = jc.getMetaDescription(); if ((retVal == null) && !usingDefault) { jc = journals.get(defaultJournalName); retVal = jc.getMetaDescription(); } return retVal != null ? retVal : ""; } /** * Gets hashTag for social media for the journal * * @param journalName Journal name * @return hashTag for social media */ public String getHashTag(String journalName) { JournalConfig jc = journals.get(journalName); boolean usingDefault = false; if (jc == null) { usingDefault = true; jc = journals.get(defaultJournalName); } String retVal = jc.getHashTag(); if ((retVal == null) && !usingDefault) { jc = journals.get(defaultJournalName); retVal = jc.getHashTag(); } return retVal != null ? retVal : ""; } /** * Gets display name for journal * * @param journalName Journal name * @return display name */ public String getDisplayName(String journalName) { JournalConfig jc = journals.get(journalName); boolean usingDefault = false; if (jc == null) { usingDefault = true; jc = journals.get(defaultJournalName); } String retVal = jc.getDisplayName(); if ((retVal == null) && !usingDefault) { jc = journals.get(defaultJournalName); retVal = jc.getDisplayName(); } return retVal != null ? retVal : ""; } /** * Gets display name for journal * * @param eissn Journal eissn * @return display name */ public String getDisplayNameByEissn(String eissn) { JournalConfig jc = journalsByIssn.get(eissn); boolean usingDefault = false; if (jc == null) { usingDefault = true; jc = journals.get(defaultJournalName); } String retVal = jc.getDisplayName(); if ((retVal == null) && !usingDefault) { jc = journals.get(defaultJournalName); retVal = jc.getDisplayName(); } return retVal != null ? retVal : ""; } /** * Get the issn which is the unique identifier for this journal * * @param journalName The name of the journal for which an issn is sought * @return The issn which is the unique identifier for this journal */ public String getIssn(String journalName) { JournalConfig jc = journals.get(journalName); boolean usingDefault = false; if (jc == null) { usingDefault = true; jc = journals.get(defaultJournalName); } String retVal = jc.getIssn(); if ((retVal == null) && !usingDefault) { jc = journals.get(defaultJournalName); retVal = jc.getIssn(); } return retVal != null ? retVal : ""; } /** * gets prefix for article title * * @param journalName Journal name * @return article title prefix */ public String getArticleTitlePrefix(String journalName) { JournalConfig jc = journals.get(journalName); boolean usingDefault = false; if (jc == null) { usingDefault = true; jc = journals.get(defaultJournalName); } String retVal = jc.getArticleTitlePrefix(); if ((retVal == null) && !usingDefault) { jc = journals.get(defaultJournalName); retVal = jc.getArticleTitlePrefix(); } return retVal != null ? retVal : ""; } public String getContext() { return dirPrefix + subdirPrefix; } /** * Build a map from the provided map's keys to the journal URLs. * * @param journals a map of journals with arbitrary keys * @return an unmodifiable map from the same keys to journal URLs */ private static Map<String, String> buildUrlMap(Map<String, JournalConfig> journals) { Map<String, String> urls = new HashMap<String, String>(journals.size() * 4 / 3); for (Entry<String, JournalConfig> entry : journals.entrySet()) { urls.put(entry.getKey(), entry.getValue().getUrl()); } return Collections.unmodifiableMap(urls); } /** * Get the custom settings defined in the configuration file under the xml node: * <p/> * ambra/platform/freemarker * <p/> * These nodes will be listed out as named value pairs that can later be referenced by freemarker The XML node will be * the key, and the value paired with this key. * * @return the key to search for. */ public String get(String setting) { if (freemarkerProperties != null) { if (freemarkerProperties.containsKey(setting)) { return freemarkerProperties.getString(setting); } } return ""; } /** * @return Returns the dirPrefix. */ public String getDirPrefix() { return dirPrefix; } /** * @param dirPrefix The dirPrefix to set. */ public void setDirPrefix(String dirPrefix) { this.dirPrefix = dirPrefix; } /** * @return Returns the subdirPrefix. */ public String getSubdirPrefix() { return subdirPrefix; } /** * @param subdirPrefix The subdirPrefix to set. */ public void setSubdirPrefix(String subdirPrefix) { this.subdirPrefix = subdirPrefix; } /** * @return Returns the casLoginURL. */ public String getCasLoginURL() { return casLoginURL; } /** * @param casLoginURL The casLoginURL to set. */ public void setCasLoginURL(String casLoginURL) { this.casLoginURL = casLoginURL; } /** * @return Returns the host. */ public String getHost() { return host; } /** * @param host The ambra hostname to set. */ public void setHost(String host) { this.host = host; } /** * @return Returns the casLogoutURL. */ public String getCasLogoutURL() { return casLogoutURL; } /** * @param casLogoutURL The casLogoutURL to set. */ public void setCasLogoutURL(String casLogoutURL) { this.casLogoutURL = casLogoutURL; } /** * @return Returns the registrationURL. */ public String getRegistrationURL() { return registrationURL; } /** * @param registrationURL The registrationURL to set. */ public void setRegistrationURL(String registrationURL) { this.registrationURL = registrationURL; } /** * Getter for changePasswordURL. * * @return Value of changePasswordURL. */ public String getChangePasswordURL() { return changePasswordURL; } /** * Setter for changePasswordURL. * * @param changePasswordURL Value to set for changePasswordURL. */ public void setChangePasswordURL(final String changePasswordURL) { this.changePasswordURL = changePasswordURL; } /** * @return Returns the changeEmailURL. */ public String getChangeEmailURL() { return changeEmailURL; } /** * @param changeEmailURL The changeEmailURL to set. */ public void setChangeEmailURL(String changeEmailURL) { this.changeEmailURL = changeEmailURL; } /** * @return Returns the doiResolverURL. */ public String getDoiResolverURL() { return doiResolverURL; } /** * @param doiResolverURL The doiResolverURL to set. */ public void setDoiResolverURL(String doiResolverURL) { this.doiResolverURL = doiResolverURL; } /** * @return Returns the journalContextAttributeKey */ public String getJournalContextAttributeKey() { return org.ambraproject.web.VirtualJournalContext.PUB_VIRTUALJOURNAL_CONTEXT; } /** * @return Returns the user attribute key */ public String getUserAttributeKey() { return org.ambraproject.Constants.AMBRA_USER_KEY; } /** * Returns the URL for a given journal given its key * * @param journalKey Journal key * @return URL of journal */ public String getJournalUrl(String journalKey) { JournalConfig jc = journals.get(journalKey); String url = ""; if (jc != null) { url = jc.getUrl(); } return url; } /** * Returns the URL for a journal given that journal's ISSN value * * @param journalIssn Journal ISSN * @return URL of journal */ public String getJournalUrlFromIssn(String journalIssn) { JournalConfig jc = journalsByIssn.get(journalIssn); String url = ""; if (jc != null) { url = jc.getUrl(); } return url; } /** * Utility procedure that takes out journal-specific beggining of template name. For example templateName * /journals/plosone/index.ftl becomes index.ftl * * @param templateName Freemarker template name * @return Freemarker template name without leading journal path */ public static String trimJournalFromTemplatePath(String templateName) { // Trim the beginning "journals/<journal_name>" StringTokenizer tokenizer = new StringTokenizer(templateName, "/"); StringBuilder stringBuilder = new StringBuilder(); while (tokenizer.hasMoreTokens()) { String token = tokenizer.nextToken(); if (token.equals("journals")) { // skip next tokenizer.nextToken(); } else { if (stringBuilder.length() != 0) stringBuilder.append('/'); stringBuilder.append(token); } } return stringBuilder.toString(); } /** * Get the maximum number of templates to store in the soft cache * * @return cache_storage_soft */ public int getCache_storage_soft() { return cache_storage_soft; } /** * Set the maximum number of templates to store in the soft cache * * @param cache_storage_soft cache_storage_soft */ public void setCache_storage_soft(int cache_storage_soft) { this.cache_storage_soft = cache_storage_soft; } /** * Get the maximum number of templates to store in the strong cache * * @return cache_storage_strong */ public int getCache_storage_strong() { return cache_storage_strong; } /** * Get the maximum number of templates to store in the strong cache * * @param cache_storage_strong cache_storage_strong */ public void setCache_storage_strong(int cache_storage_strong) { this.cache_storage_strong = cache_storage_strong; } private static class JournalConfig { private Map<String, String[]> cssFiles; private Map<String, String[]> javaScriptFiles; private Map<String, String> titles; private String[] defaultCss; private String[] defaultJavaScript; private String defaultTitle; private String metaKeywords; private String metaDescription; private String articleTitlePrefix; private String displayName; private String hashTag; private String url; private String issn; public JournalConfig() { cssFiles = new HashMap<String, String[]>(); javaScriptFiles = new HashMap<String, String[]>(); titles = new HashMap<String, String>(); } /** * @return Returns the cssFiles. */ public Map<String, String[]> getCssFiles() { return cssFiles; } /** * @param cssFiles The cssFiles to set. */ public void setCssFiles(Map<String, String[]> cssFiles) { this.cssFiles = cssFiles; } /** * @return Returns the defaultCss. */ public String[] getDefaultCss() { return defaultCss; } /** * @param defaultCss The defaultCss to set. */ public void setDefaultCss(String[] defaultCss) { this.defaultCss = defaultCss; } /** * @return Returns the defaultJavaScript. */ public String[] getDefaultJavaScript() { return defaultJavaScript; } /** * @param defaultJavaScript The defaultJavaScript to set. */ public void setDefaultJavaScript(String[] defaultJavaScript) { this.defaultJavaScript = defaultJavaScript; } /** * @return Returns the defaultTitle. */ public String getDefaultTitle() { return defaultTitle; } /** * @param defaultTitle The defaultTitle to set. */ public void setDefaultTitle(String defaultTitle) { this.defaultTitle = defaultTitle; } /** * @return Returns the javaScriptFiles. */ public Map<String, String[]> getJavaScriptFiles() { return javaScriptFiles; } /** * @param javaScriptFiles The javaScriptFiles to set. */ public void setJavaScriptFiles(Map<String, String[]> javaScriptFiles) { this.javaScriptFiles = javaScriptFiles; } /** * @return Returns the titles. */ public Map<String, String> getTitles() { return titles; } /** * @param titles The titles to set. */ public void setTitles(Map<String, String> titles) { this.titles = titles; } /** * @return Returns the articleTitlePrefix. */ public String getArticleTitlePrefix() { return articleTitlePrefix; } /** * @param articleTitlePrefix The articleTitlePrefix to set. */ public void setArticleTitlePrefix(String articleTitlePrefix) { this.articleTitlePrefix = articleTitlePrefix; } /** * @return Returns the metaDescription. */ public String getMetaDescription() { return metaDescription; } /** * @param metaDescription The metaDescription to set. */ public void setMetaDescription(String metaDescription) { this.metaDescription = metaDescription; } /** * @return Returns the metaKeywords. */ public String getMetaKeywords() { return metaKeywords; } /** * @param metaKeywords The metaKeywords to set. */ public void setMetaKeywords(String metaKeywords) { this.metaKeywords = metaKeywords; } /** * @return Returns the displayName. */ public String getDisplayName() { return displayName; } /** * @param displayName The displayName to set. */ public void setDisplayName(String displayName) { this.displayName = displayName; } /** * @return Returns the url. */ public String getUrl() { return url; } /** * @param url The url to set. */ public void setUrl(String url) { this.url = url; } /** * Get the issn which is the unique identifier for this journal * * @return The issn which is the unique identifier for this journal */ public String getIssn() { return issn; } /** * Set the issn which is the unique identifier for this journal * * @param issn The issn which is the unique identifier for this journal */ public void setIssn(String issn) { this.issn = issn; } /** * Get the hashtag to use for social media * * @return the hashtag to use for social media */ public String getHashTag() { return hashTag; } /** * Set the hashtag to use for social media * * @param hashTag the hashtag to use for social media */ public void setHashTag(String hashTag) { this.hashTag = hashTag; } } /** * @return the orgName */ public String getOrgName() { return orgName; } /** * @param orgName the orgName to set */ public void setOrgName(String orgName) { this.orgName = orgName; } /** * @return the feedbackEmail */ public String getFeedbackEmail() { return feedbackEmail; } /** * @param feedbackEmail the feedbackEmail to set */ public void setFeedbackEmail(String feedbackEmail) { this.feedbackEmail = feedbackEmail; } /** * Get the CIS Starting date * * @return the CIS start date */ public Date getCisStartDate() { return this.cisStartDate; } /** * Get the CIS Starting date in milliseconds * * @return the CIS start date in milliseconds */ public long getCisStartDateMillis() { return this.cisStartDate.getTime(); } public String getDefaultJournalName() { return defaultJournalName; } /** * Return the current template update delay setting * * @return */ public int getTemplateUpdateDelay() { return templateUpdateDelay; } /** * Return a full map of journal URLs. Getting values from this map is functionally interchangeable with {@link * #getJournalUrl(String)} (assuming the key is present). This method is a convenience in FreeMarker, where the map * can be accessed as a FreeMarker hash variable. * * @return the map from journal keys to URLs */ public Map<String, String> getJournalUrls() { return journalUrls; } /** * Return a full map of journal URLs, keyed by eIssn. * * @return the map from eIssns to URLs */ public Map<String, String> getJournalsUrlsByIssn() { return journalsUrlsByIssn; } }