EditLanguageFormAction.java
/*
* This software was designed and created by Jason Carroll.
* Copyright (c) 2002, 2003, 2004 Jason Carroll.
* The author can be reached at jcarroll@cowsultants.com
* ITracker website: http://www.cowsultants.com
* ITracker forums: http://www.cowsultants.com/phpBB/index.php
*
* This program is free software; you can redistribute it and/or modify
* it only under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
package org.itracker.web.actions.admin.language;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.log4j.Logger;
import org.apache.struts.action.*;
import org.itracker.core.resources.ITrackerResources;
import org.itracker.model.Language;
import org.itracker.model.util.PropertiesFileHandler;
import org.itracker.model.util.SystemConfigurationUtilities;
import org.itracker.services.ConfigurationService;
import org.itracker.web.actions.base.ItrackerBaseAction;
import org.itracker.web.forms.LanguageForm;
import org.itracker.web.util.Constants;
import org.itracker.web.util.ServletContextUtils;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.*;
public class EditLanguageFormAction extends ItrackerBaseAction {
private static final Logger log = Logger.getLogger(EditLanguageFormAction.class);
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ActionMessages errors = new ActionMessages();
try {
ConfigurationService configurationService = ServletContextUtils.getItrackerServices().getConfigurationService();
HttpSession session = request.getSession(true);
LanguageForm languageForm = (LanguageForm) form;
if (languageForm == null) {
languageForm = new LanguageForm();
}
String locale = (String) PropertyUtils.getSimpleProperty(form, "locale");
int localeType = SystemConfigurationUtilities.getLocaleType(locale);
if (localeType == SystemConfigurationUtilities.LOCALE_TYPE_INVALID) {
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("itracker.web.error.invalidlocale"));
} else {
if ("create".equals(PropertyUtils.getSimpleProperty(form, "action"))) {
// The locale passed in on a create action is actually the parent locale. Reset the parent
// locale, increment the type (since we are creating the next type, and clear the locale
localeType++;
languageForm.setParentLocale(locale);
if (localeType == SystemConfigurationUtilities.LOCALE_TYPE_LOCALE) {
languageForm.setLocale(locale + "_");
} else {
languageForm.setLocale("");
}
}
String[] sortedKeys = configurationService.getSortedKeys();
Map<String, String> baseItems = new HashMap<>();
Map<String, String> langItems = new HashMap<>();
Map<String, String> locItems = new HashMap<>();
Map<String, String> items = new HashMap<>();
log.debug("Loading language elements for edit. Edit type is " + localeType);
if (localeType >= SystemConfigurationUtilities.LOCALE_TYPE_BASE) {
baseItems = configurationService.getDefinedKeys(null);
// putPropertiesKeys(baseItems, ITrackerResources.BASE_LOCALE);
items = new HashMap<>();
log.debug("Base Locale has " + baseItems.size() + " keys defined.");
}
if (localeType >= SystemConfigurationUtilities.LOCALE_TYPE_LANGUAGE) {
if (!locale.equalsIgnoreCase(ITrackerResources.BASE_LOCALE)) {
String parentLocale = SystemConfigurationUtilities.getLocalePart(locale, SystemConfigurationUtilities.LOCALE_TYPE_LANGUAGE);
languageForm.setParentLocale(parentLocale);
langItems = configurationService.getDefinedKeys(parentLocale);
// putPropertiesKeys(langItems, parentLocale);
items = new HashMap<>();
log.debug("Language " + parentLocale + " has " + langItems.size() + " keys defined.");
}
}
if (localeType == SystemConfigurationUtilities.LOCALE_TYPE_LOCALE) {
locItems = configurationService.getDefinedKeys(locale);
// putPropertiesKeys(locItems, locale);
items = locItems;
log.debug("Locale " + locale + " has " + locItems.size() + " keys defined.");
}
if (!"create".equals(PropertyUtils.getSimpleProperty(form, "action"))) {
Map<String, String> formItems = new HashMap<>();
for (Enumeration<String> en = ITrackerResources.getBundle(locale).getKeys(); en.hasMoreElements(); ) {
String key = en.nextElement();
formItems.put(key, "");
}
formItems.putAll(items);
languageForm.setItems(new TreeMap<>(formItems));
} else {
String parentLocale = null;
if (!locale.equalsIgnoreCase(ITrackerResources.BASE_LOCALE)) {
parentLocale = SystemConfigurationUtilities.getLocalePart(locale, SystemConfigurationUtilities.LOCALE_TYPE_LANGUAGE);
}
langItems = configurationService.getDefinedKeys(parentLocale);
Map<String, String> formItems = new HashMap<>();
if (log.isDebugEnabled()) {
log.debug("putPropertiesKeys: items: " + items);
}
for (Enumeration<String> en = ITrackerResources.getBundle(locale).getKeys(); en.hasMoreElements(); ) {
String key = en.nextElement();
formItems.put(key, "");
}
formItems.putAll(items);
languageForm.setItems(new TreeMap<>(formItems));
}
Locale curLocale = ITrackerResources.getLocale(locale);
Language languageItem = new Language(locale, "itracker.locale.name",
ITrackerResources.getString("itracker.locale.name", curLocale));// configurationService.getLanguageItemByKey("itracker.locale.name", curLocale);
languageForm.setLocaleTitle(languageItem.getResourceValue());
languageItem = new Language(locale, "itracker.locale.name",
ITrackerResources.getString("itracker.locale.name." + locale, ITrackerResources.BASE_LOCALE));// configurationService.getLanguageItemByKey("itracker.locale.name", curLocale);
languageForm.setLocaleBaseTitle(languageItem.getResourceValue());
session.setAttribute(Constants.EDIT_LANGUAGE_KEYS_KEY, sortedKeys);
session.setAttribute(Constants.EDIT_LANGUAGE_BASE_KEY, baseItems);
session.setAttribute(Constants.EDIT_LANGUAGE_LANG_KEY, langItems);
session.setAttribute(Constants.EDIT_LANGUAGE_LOC_KEY, locItems);
session.setAttribute(Constants.EDIT_LANGUAGE_TYPE_KEY, localeType);
request.setAttribute("languageForm", languageForm);
if (log.isDebugEnabled()) {
log.debug("Locale = " + languageForm.getLocale());
}
saveToken(request);
return mapping.getInputForward();
}
} catch (RuntimeException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
log.error("Exception while creating edit language form.", e);
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("itracker.web.error.system"));
}
if (!errors.isEmpty()) {
saveErrors(request, errors);
}
return mapping.findForward("error");
}
@SuppressWarnings("unchecked")
void putPropertiesKeys(Map<String, String> locItems, String locale) {
try {
Hashtable<Object, Object> p;
try {
String path = File.separatorChar + ITrackerResources.RESOURCE_BUNDLE_NAME.replace('.', File.separatorChar) + (null != locale && !(ITrackerResources.BASE_LOCALE.equals(locale)) ? "_" + locale : "") + ".properties";
if (log.isDebugEnabled()) {
log.debug("putPropertiesKeys: loading: " + path);
}
p = new PropertiesFileHandler(path).getProperties();
p = new Hashtable<>(p);
if (log.isDebugEnabled()) {
log.debug("putPropertiesKeys: loaded properties: " + p);
}
} catch (Exception e) {
if (log.isDebugEnabled()) {
log.debug("putPropertiesKeys", e);
}
p = new Properties();
}
// overload properties by loc items from db
if (log.isDebugEnabled()) {
log.debug("putPropertiesKeys: overloading locItems: " + locItems);
}
p.putAll(locItems);
locItems.putAll(Collections.checkedMap((Map) p, String.class, String.class));
} catch (RuntimeException e) {
log.error("addPropertiesKeys: caught ", e);
}
}
}