r775 - trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action
Author: tchemit Date: 2008-07-24 14:08:09 +0000 (Thu, 24 Jul 2008) New Revision: 775 Added: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/provider/ Modified: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactory.java trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactoryFromProvider.java trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionProvider.java trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionProviderFromProperties.java Log: refactore code Modified: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactory.java =================================================================== --- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactory.java 2008-07-24 14:05:02 UTC (rev 774) +++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactory.java 2008-07-24 14:08:09 UTC (rev 775) @@ -22,7 +22,10 @@ import jaxx.runtime.swing.JAXXToggleButton; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import static org.codelutin.i18n.I18n._; +import org.codelutin.jaxx.action.initializer.ActionConfigInitializer; +import org.codelutin.jaxx.action.initializer.ActionInitializer; +import org.codelutin.jaxx.action.initializer.SelectActionConfigInitializer; +import org.codelutin.jaxx.action.initializer.ToggleActionConfigInitializer; import javax.swing.AbstractAction; import javax.swing.AbstractButton; @@ -30,6 +33,9 @@ import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JComboBox; +import javax.swing.JComponent; +import java.awt.event.ActionEvent; +import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -49,25 +55,42 @@ * * @author chemit */ -public abstract class ActionFactory { +public abstract class ActionFactory<A extends MyAbstractAction> { protected static Log log = LogFactory.getLog(ActionFactory.class); + /** class of encapsuling action */ + protected Class<A> baseImpl; + /** dictionary of known actions implementations */ - private Map<String, Class<? extends AbstractAction>> impls; + private Map<String, Class<? extends MyAbstractAction>> impls; + /** dictionary of instanciated actions */ - private Map<String, AbstractAction> cache; + private Map<String, MyAbstractAction> cache; + protected final ActionConfigInitializer actionConfigInitializer; + protected final ToggleActionConfigInitializer toggleActionConfigInitializer; + protected final SelectActionConfigInitializer selectActionConfigInitializer; + /** * Method to init the dictionary of knwon action implementations. * * @return the dictionary of known action implementations */ - protected abstract Map<String, Class<? extends AbstractAction>> init(); + protected abstract Map<String, Class<? extends MyAbstractAction>> init(); - protected ActionFactory() { - impls = init(); - cache = new TreeMap<String, AbstractAction>(); + protected List<ActionInitializer> registredInitializers; + + + protected ActionFactory(Class<A> baseImpl) { + this.baseImpl = baseImpl; + this.impls = init(); + this.cache = new TreeMap<String, MyAbstractAction>(); + this.registredInitializers = new java.util.ArrayList<ActionInitializer>(); + + this.toggleActionConfigInitializer = registerInitializer(ToggleActionConfigInitializer.class); + this.actionConfigInitializer = registerInitializer(ActionConfigInitializer.class); + this.selectActionConfigInitializer = registerInitializer(SelectActionConfigInitializer.class); } public void resetCache() { @@ -81,23 +104,28 @@ impls.clear(); } - public AbstractAction get(String actionKey) { + public MyAbstractAction get(String actionKey) { return cache.get(actionKey); } - public AbstractAction[] loadActions(JAXXObject ui) { - List<AbstractAction> result = new ArrayList<AbstractAction>(); - for (Map.Entry<String, Class<? extends AbstractAction>> entry : implsEntrySet()) { + public MyAbstractAction[] loadActions(JAXXObject ui) { + if (log.isDebugEnabled()) { + log.debug("for ui " + ui.getClass()); + } + List<MyAbstractAction> result = new ArrayList<MyAbstractAction>(); + for (Map.Entry<String, Class<? extends MyAbstractAction>> entry : implsEntrySet()) { String actionKey = entry.getKey(); Object comp = ui.getObjectById(actionKey); if (comp == null || !(comp instanceof AbstractButton || comp instanceof JComboBox)) { // nothing to do continue; } - + if (log.isTraceEnabled()) { + log.trace("detect action " + actionKey); + } if (comp instanceof AbstractButton) { AbstractButton component = (AbstractButton) comp; - AbstractAction action = newAction(actionKey, component); + MyAbstractAction action = newAction(actionKey, component); component.setAction(action); @@ -126,36 +154,27 @@ result.add(action); continue; } + // is JComboBox + JComboBox component = (JComboBox) comp; + MyAbstractAction action = newAction(actionKey, component); - if (comp instanceof JComboBox) { - JComboBox component = (JComboBox) comp; - AbstractAction action = newAction(actionKey, component); - - component.setAction(action); - Integer val = (Integer) action.getValue("selectedIndex"); - if (val != null && val != -1 && val < component.getItemCount() && val != component.getSelectedIndex()) { - component.setSelectedIndex(val); - } - result.add(action); + component.setAction(action); + Integer val = (Integer) action.getValue("selectedIndex"); + if (val != null && val != -1 && val < component.getItemCount() && val != component.getSelectedIndex()) { + component.setSelectedIndex(val); } + result.add(action); } - return result.toArray(new AbstractAction[result.size()]); + return result.toArray(new MyAbstractAction[result.size()]); } - public AbstractAction newAction0(String actionKey) { - // on v�rifie que l'action existe bien - checkRegistredAction(actionKey); - - // try in cache - if (cache.containsKey(actionKey)) { - // use cached action - AbstractAction action = cache.get(actionKey); - if (log.isDebugEnabled()) { - log.debug("use cache action " + action); - } - return action; + public static ImageIcon createImageIcon(String path) { + java.net.URL imgURL = org.codelutin.jaxx.action.ActionFactory.class.getResource("/icons/" + path); + if (imgURL != null) { + return new ImageIcon(imgURL); + } else { + throw new RuntimeException("could not find icon " + path); } - return null; } /** @@ -164,224 +183,207 @@ * @param component le button o� rattacher l'action * @return une nouvelle instance de l'action associ�e � sa clef. */ - public AbstractAction newAction(String actionKey, AbstractButton component) { - + public MyAbstractAction newAction(String actionKey, JComponent component) { // try first in cache - AbstractAction result = newAction0(actionKey); + MyAbstractAction result = getActionFromCache(actionKey); if (result != null) { return result; } - // on r�cup�re la classe d'implantation de l'action - Class<? extends AbstractAction> klazz = impls.get(actionKey); try { - result = klazz.getConstructor(String.class).newInstance(actionKey); - result.putValue(Action.ACTION_COMMAND_KEY, actionKey); + result = newActionInstance(actionKey); + } catch (Exception e) { + throw new RuntimeException(e); + } - if (log.isDebugEnabled()) { - log.debug("create action " + actionKey + " : " + result); - } - // recherche de l'annotation de configuration - ActionConfig anno = initActionConfig(component, result); + if (log.isDebugEnabled()) { + log.debug("create <" + actionKey + " : " + result + ">"); + } - if (anno == null) { - ToggleActionConfig anno2 = initToggleActionConfig(component, result); - if (anno2 == null && component != null) { - result.putValue(Action.ACTION_COMMAND_KEY, component.getName()); - result.putValue(Action.SHORT_DESCRIPTION, component.getToolTipText()); - result.putValue(Action.SMALL_ICON, component.getIcon()); - result.putValue(Action.NAME, component.getText()); - result.putValue(Action.MNEMONIC_KEY, component.getMnemonic()); - result.putValue("hideActionText", component.getHideActionText()); - if (component instanceof JAXXToggleButton) { - JAXXToggleButton glueComponent = (JAXXToggleButton) component; - result.putValue(Action.SHORT_DESCRIPTION, glueComponent.getNormalTooltipText()); - result.putValue(Action.NAME, glueComponent.getNormalText()); - result.putValue(Action.SMALL_ICON, glueComponent.getIcon()); - result.putValue(Action.MNEMONIC_KEY, glueComponent.getNormalMnemonic()); - result.putValue(Action.SHORT_DESCRIPTION + 2, glueComponent.getGlueTooltipText()); - result.putValue(Action.NAME + 2, glueComponent.getGlueText()); - result.putValue(Action.SMALL_ICON + 2, glueComponent.getSelectedIcon()); - result.putValue(Action.MNEMONIC_KEY + 2, glueComponent.getGlueMnemonic()); - } + // recherche de l'annotation de configuration + ActionInitializer<?, ?> initializer = findInitializer(result.getClass()); + + if (initializer != null) { + initializer.initAction(component, result); + } + + try { + + if (initializer != null) { + if (AbstractButton.class.isAssignableFrom(initializer.getComponentImpl())) { + finalizeNewAction((AbstractButton) component, result, initializer); } - } - String text = (String) result.getValue(Action.NAME); - Integer mnemo = (Integer) result.getValue(Action.MNEMONIC_KEY); - if (mnemo != null && mnemo != '\0') { - int pos = text.indexOf((char) mnemo.intValue()); - if (pos == -1) { - pos = text.indexOf(Character.toLowerCase((char) mnemo.intValue())); + if (JComboBox.class.isAssignableFrom(initializer.getComponentImpl())) { + finalizeNewAction((JComboBox) component, result, initializer); } - result.putValue(Action.DISPLAYED_MNEMONIC_INDEX_KEY, pos); + + return result; } + + if (component == null || component instanceof AbstractButton) { + finalizeNewAction((AbstractButton) component, result, initializer); + return result; + } + + if (component instanceof JComboBox) { + finalizeNewAction((JComboBox) component, result, initializer); + } + } finally { + // save result in cache cache.put(actionKey, result); - return result; - } catch (Exception e) { - throw new RuntimeException(e); } + + return result; } + public String[] getActionNames() { + return impls.keySet().toArray(new String[impls.size()]); + } + + public Set<Map.Entry<String, Class<? extends MyAbstractAction>>> implsEntrySet() { + return impls.entrySet(); + } + + public Set<Map.Entry<String, MyAbstractAction>> cacheEntrySet() { + return cache.entrySet(); + } + + public void fireAction(String actionKey, Object source, JComponent component) { + AbstractAction action = newAction(actionKey, component); + fireAction0(actionKey, source, action); + } + + /** - * @param actionKey le nom de l'action tel que d�finie dans le fichier - * de mapping (sans le prefix action.) - * @param component le button o� rattacher l'action - * @return une nouvelle instance de l'action associ�e � sa clef. + * @param actionKey la clef de l'action + * @return l'action deja stockee dans le cache d'action, ou <code>null</code> si non trouv�e. */ - public AbstractAction newAction(String actionKey, JComboBox component) { + public MyAbstractAction getActionFromCache(String actionKey) { + // on v�rifie que l'action existe bien + checkRegistredAction(actionKey); - // try first in cache - AbstractAction result = newAction0(actionKey); - if (result != null) { - return result; + // try in cache + if (cache.containsKey(actionKey)) { + // use cached action + MyAbstractAction action = cache.get(actionKey); + if (log.isDebugEnabled()) { + log.debug("use cache action " + action); + } + return action; } + return null; + } - // on r�cup�re la classe d'implantation de l'action - Class<? extends AbstractAction> klazz = impls.get(actionKey); + public void dispose() { - try { - result = klazz.getConstructor(String.class).newInstance(actionKey); - result.putValue(Action.ACTION_COMMAND_KEY, actionKey); - - log.debug(actionKey + " : " + result); - // recherche de l'annotation de configuration - SelectActionConfig anno = initSelectActionConfig(component, result); - if (anno == null) { - result.putValue(Action.ACTION_COMMAND_KEY, component.getName()); - result.putValue(Action.SHORT_DESCRIPTION, component.getToolTipText()); - //result.putValue("selectedIndex", component.getSelectedIndex()); + for (String actionKey : getActionNames()) { + MyAbstractAction action = getActionFromCache(actionKey); + if (action != null) { + action.disposeUI(); } - cache.put(actionKey, result); - return result; - } catch (Exception e) { - throw new RuntimeException(e); } + resetCache(); } - public static ToggleActionConfig initToggleActionConfig(AbstractButton component, AbstractAction result) { - ToggleActionConfig anno = result.getClass().getAnnotation(ToggleActionConfig.class); - if (anno != null) { - // inject les donn�es - if (!anno.name().isEmpty()) { - //System.out.println("found action with name : " + anno.name()); - result.putValue(Action.NAME, _(anno.name())); - } - if (!anno.name2().isEmpty()) { - //System.out.println("found action with name2 : " + anno.name2()); - result.putValue(Action.NAME + "2", _(anno.name2())); - } + /** + * @param component le button o� rattacher l'action + * @param action action + * @param initializer initializer + */ + protected void finalizeNewAction(AbstractButton component, MyAbstractAction action, ActionInitializer<?, ?> initializer) { - if (!anno.shortDescription().isEmpty()) { - result.putValue(Action.SHORT_DESCRIPTION, _(anno.shortDescription())); + if (initializer == null) { + // no initializer matching, + if (component != null) { + action.putValue(Action.ACTION_COMMAND_KEY, component.getName()); + action.putValue(Action.SHORT_DESCRIPTION, component.getToolTipText()); + action.putValue(Action.SMALL_ICON, component.getIcon()); + action.putValue(Action.NAME, component.getText()); + action.putValue(Action.MNEMONIC_KEY, component.getMnemonic()); + action.putValue("hideActionText", component.getHideActionText()); + if (component instanceof JAXXToggleButton) { + JAXXToggleButton glueComponent = (JAXXToggleButton) component; + action.putValue(Action.SHORT_DESCRIPTION, glueComponent.getNormalTooltipText()); + action.putValue(Action.NAME, glueComponent.getNormalText()); + action.putValue(Action.SMALL_ICON, glueComponent.getIcon()); + action.putValue(Action.MNEMONIC_KEY, glueComponent.getNormalMnemonic()); + action.putValue(Action.SHORT_DESCRIPTION + 2, glueComponent.getGlueTooltipText()); + action.putValue(Action.NAME + 2, glueComponent.getGlueText()); + action.putValue(Action.SMALL_ICON + 2, glueComponent.getSelectedIcon()); + action.putValue(Action.MNEMONIC_KEY + 2, glueComponent.getGlueMnemonic()); + } } - if (!anno.shortDescription2().isEmpty()) { - result.putValue(Action.SHORT_DESCRIPTION + "2", _(anno.shortDescription2())); - } - if (!anno.smallIcon().isEmpty()) { - result.putValue(Action.SMALL_ICON, createImageIcon(anno.smallIcon())); - } - if (!anno.smallIcon2().isEmpty()) { - result.putValue(Action.SMALL_ICON + "2", createImageIcon(anno.smallIcon2())); - } + } - if (anno.mnemonic() != '\0') { - result.putValue(Action.MNEMONIC_KEY, anno.mnemonic()); - } else if (component != null) { - result.putValue(Action.MNEMONIC_KEY, component.getMnemonic()); + String text = (String) action.getValue(Action.NAME); + Integer mnemo = (Integer) action.getValue(Action.MNEMONIC_KEY); + if (mnemo != null && mnemo != '\0') { + int pos = text.indexOf((char) mnemo.intValue()); + if (pos == -1) { + pos = text.indexOf(Character.toLowerCase((char) mnemo.intValue())); } - if (anno.mnemonic2() != '\0') { - result.putValue(Action.MNEMONIC_KEY + "2", anno.mnemonic2()); - } - //TODO Convert it from String result.putValue(Action.ACCELERATOR_KEY, anno.accelerator()); + action.putValue(Action.DISPLAYED_MNEMONIC_INDEX_KEY, pos); + } + } - result.putValue("hideActionText", anno.hideActionText()); - result.putValue(Action.SELECTED_KEY, anno.selected()); - result.setEnabled(anno.enabled()); + /** + * @param component le select box o� rattacher l'action + * @param action action + * @param initializer initializer + */ + protected void finalizeNewAction(JComboBox component, MyAbstractAction action, ActionInitializer<?, ?> initializer) { + + if (initializer == null) { + action.putValue(Action.ACTION_COMMAND_KEY, component.getName()); + action.putValue(Action.SHORT_DESCRIPTION, component.getToolTipText()); + //result.putValue("selectedIndex", component.getSelectedIndex()); } - return anno; + } - public static ActionConfig initActionConfig(AbstractButton component, AbstractAction result) { - ActionConfig anno = result.getClass().getAnnotation(ActionConfig.class); - if (anno != null) { - // inject les donn�es - if (!anno.name().isEmpty()) { - //System.out.println("found action with name : " + anno.name()); - result.putValue(Action.NAME, _(anno.name())); + protected ActionInitializer findInitializer(Class<? extends AbstractAction> action) { + for (ActionInitializer registredInitializer : registredInitializers) { + if (registredInitializer.getAnnotation(action) != null) { + return registredInitializer; } - //if (!anno.shortDescription().isEmpty()) { - result.putValue(Action.SHORT_DESCRIPTION, _(anno.shortDescription())); - //} - if (!anno.smallIcon().isEmpty()) { - result.putValue(Action.SMALL_ICON, createImageIcon(anno.smallIcon())); - } - if (anno.mnemonic() != '\0') { - result.putValue(Action.MNEMONIC_KEY, anno.mnemonic()); - } else if (component != null) { - result.putValue(Action.MNEMONIC_KEY, component.getMnemonic()); - } - //TODO Convert it from String result.putValue(Action.ACCELERATOR_KEY, anno.accelerator()); + } + return null; + } - if (component == null) { - result.putValue("hideActionText", anno.hideActionText()); - } else { - boolean actionText = component.getHideActionText(); - result.putValue("hideActionText", anno.hideActionText() || actionText); - } - result.putValue(Action.SELECTED_KEY, anno.selected()); - result.setEnabled(anno.enabled()); - + protected <I extends ActionInitializer> I registerInitializer(Class<I> initizalizer) { + try { + I instance = initizalizer.newInstance(); + registredInitializers.add(instance); + return instance; + } catch (Exception e) { + throw new RuntimeException(e); } - return anno; } - public static SelectActionConfig initSelectActionConfig(JComboBox component, AbstractAction result) { - SelectActionConfig anno = result.getClass().getAnnotation(SelectActionConfig.class); - if (anno != null) { - // inject les donn�es - if (!anno.name().isEmpty()) { - result.putValue(Action.NAME, _(anno.name())); - } - if (!anno.shortDescription().isEmpty()) { - result.putValue(Action.SHORT_DESCRIPTION, _(anno.shortDescription())); - } else { - result.putValue(Action.SHORT_DESCRIPTION, _(component.getToolTipText())); - } - result.putValue("selectedIndex", anno.selectedIndex()); - //TODO Convert it from String result.putValue(Action.ACCELERATOR_KEY, anno.accelerator()); - result.setEnabled(anno.enabled()); + protected void fireAction0(String actionKey, Object source, AbstractAction action) { + if (action == null) { + log.warn("could not find action " + actionKey); + return; } - return anno; + ActionEvent event = new ActionEvent(source, ActionEvent.ACTION_FIRST, actionKey); + action.actionPerformed(event); } - protected void checkRegistredAction(String actionKey) { if (!impls.containsKey(actionKey)) { throw new IllegalStateException("can not find a registered action for key " + actionKey); } } - public String[] getActionNames() { - return impls.keySet().toArray(new String[impls.size()]); - } - public Set<Map.Entry<String, Class<? extends AbstractAction>>> implsEntrySet() { - return impls.entrySet(); + protected MyAbstractAction newActionInstance(String actionKey) throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException { + Class<? extends MyAbstractAction> klazz = impls.get(actionKey); + MyAbstractAction result; + result = klazz.getConstructor(String.class).newInstance(actionKey); + result.putValue(Action.ACTION_COMMAND_KEY, actionKey); + return result; } - - public Set<Map.Entry<String, AbstractAction>> cacheEntrySet() { - return cache.entrySet(); - } - - public static ImageIcon createImageIcon(String path) { - java.net.URL imgURL = org.codelutin.jaxx.action.ActionFactory.class.getResource("/icons/" + path); - if (imgURL != null) { - return new ImageIcon(imgURL); - } else { - throw new RuntimeException("could not find icon " + path); - } - } } \ No newline at end of file Modified: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactoryFromProvider.java =================================================================== --- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactoryFromProvider.java 2008-07-24 14:05:02 UTC (rev 774) +++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactoryFromProvider.java 2008-07-24 14:08:09 UTC (rev 775) @@ -17,7 +17,6 @@ * ##% */ package org.codelutin.jaxx.action; -import javax.swing.AbstractAction; import java.util.Map; import java.util.ServiceLoader; import java.util.TreeMap; @@ -33,24 +32,27 @@ * * @author chemit */ -public class ActionFactoryFromProvider extends ActionFactory { +public class ActionFactoryFromProvider<A extends MyAbstractAction> extends ActionFactory<A> { - /** real file where to load actions mapping */ - protected String actionFilePath; + public static <A extends MyAbstractAction> ActionFactoryFromProvider<A> newInstance(Class<A> klazz) { + return new ActionFactoryFromProvider<A>(klazz); + } - public ActionFactoryFromProvider() { - super(); + protected ActionFactoryFromProvider(Class<A> baseClass) { + super(baseClass); } - - protected Map<String, Class<? extends AbstractAction>> init() { + protected Map<String, Class<? extends MyAbstractAction>> init() { + if (log.isDebugEnabled()) { + log.debug("start loading " + this); + } // obtain a ServiceLoader on ActionProvider ServiceLoader<ActionProvider> loader = ServiceLoader.load(ActionProvider.class); - Map<String, Class<? extends AbstractAction>> cache = new TreeMap<String, Class<? extends AbstractAction>>(); + Map<String, Class<? extends MyAbstractAction>> cache = new TreeMap<String, Class<? extends MyAbstractAction>>(); for (ActionProvider<?> actionProvider : loader) { if (log.isDebugEnabled()) { - log.debug("load action provider " + actionProvider); + log.debug("found " + actionProvider); } cache.putAll(actionProvider.getClasses()); } Modified: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionProvider.java =================================================================== --- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionProvider.java 2008-07-24 14:05:02 UTC (rev 774) +++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionProvider.java 2008-07-24 14:08:09 UTC (rev 775) @@ -19,7 +19,7 @@ * * @author chemit */ -public interface ActionProvider<A extends javax.swing.AbstractAction> { +public interface ActionProvider<A extends MyAbstractAction> { /** @return the name of the provider */ String getName(); Modified: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionProviderFromProperties.java =================================================================== --- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionProviderFromProperties.java 2008-07-24 14:05:02 UTC (rev 774) +++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionProviderFromProperties.java 2008-07-24 14:08:09 UTC (rev 775) @@ -16,7 +16,6 @@ import static org.codelutin.i18n.I18n._; -import javax.swing.AbstractAction; import java.io.IOException; import java.io.InputStream; import java.util.Map; @@ -24,7 +23,7 @@ import java.util.TreeMap; /** @author chemit */ -public class ActionProviderFromProperties<A extends AbstractAction> extends AbstractActionProvider<A> { +public class ActionProviderFromProperties<A extends MyAbstractAction> extends AbstractActionProvider<A> { /** default prefix for an entryin mapping file. */ protected static final String ACTION_KEY_PREFIX = "action."; @@ -46,6 +45,9 @@ try { inputStream = getClass().getResourceAsStream(propertiesPath); + if (inputStream == null) { + throw new NullPointerException("could not find action file " + propertiesPath); + } log.info("load " + propertiesPath); properties.load(inputStream); } catch (IOException e) { @@ -64,16 +66,17 @@ Map<String, Class<? extends A>> cache = new TreeMap<String, Class<? extends A>>(); int prefix = ACTION_KEY_PREFIX.length(); - for (Map.Entry<Object, Object> objectObjectEntry : properties.entrySet()) { - String key = objectObjectEntry.getKey() + ""; - String qfn = objectObjectEntry.getValue() + ""; + for (Map.Entry<Object, Object> entry : properties.entrySet()) { + String key = entry.getKey() + ""; + String qfn = entry.getValue() + ""; try { Class<? extends A> implCass; implCass = (Class<? extends A>) Class.forName(qfn); - log.debug("found action " + implCass); - cache.put(key.substring(prefix), implCass); + String actionKey = key.substring(prefix); + log.debug("found action <" + actionKey + " : " + implCass + ">"); + cache.put(actionKey, implCass); } catch (ClassNotFoundException e) { - throw new RuntimeException(_("jaxx.error.load.actions.class", key, qfn)); + throw new RuntimeException(_("jaxx.error.load.actions.class", key, qfn), e); } }
participants (1)
-
tchemit@users.labs.libre-entreprise.org