01: /***************************************************************
02: * This file is part of the [fleXive](R) project.
03: *
04: * Copyright (c) 1999-2007
05: * UCS - unique computing solutions gmbh (http://www.ucs.at)
06: * All rights reserved
07: *
08: * The [fleXive](R) project is free software; you can redistribute
09: * it and/or modify it under the terms of the GNU General Public
10: * License as published by the Free Software Foundation;
11: * either version 2 of the License, or (at your option) any
12: * later version.
13: *
14: * The GNU General Public License can be found at
15: * http://www.gnu.org/copyleft/gpl.html.
16: * A copy is found in the textfile GPL.txt and important notices to the
17: * license from the author are found in LICENSE.txt distributed with
18: * these libraries.
19: *
20: * This library is distributed in the hope that it will be useful,
21: * but WITHOUT ANY WARRANTY; without even the implied warranty of
22: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23: * GNU General Public License for more details.
24: *
25: * For further information about UCS - unique computing solutions gmbh,
26: * please see the company website: http://www.ucs.at
27: *
28: * For further information about [fleXive](R), please see the
29: * project website: http://www.flexive.org
30: *
31: *
32: * This copyright notice MUST APPEAR in all copies of the file!
33: ***************************************************************/package com.flexive.faces.plugin;
34:
35: /**
36: * <p>
37: * The base interface for flexive plugins. A plugin acts as a singleton that is attached
38: * to one (or more) {@link ExtensionPoint ExtensionPoints}. The extension point is parameterized
39: * with a concrete interface or implementation of a {@link PluginExecutor}. When some code
40: * wants to use the plugins registered with an ExtensionPoint, it creates a PluginExecutor
41: * matching the ExtensionPoint's type parameter, and calls each registered plugin passing its
42: * PluginExecutor.
43: * </p>
44: * <p>
45: * A basic example, taken from the plugin test cases:
46: * <pre>
47: * // PluginExecutor interface
48: * private static interface TestExecutor extends PluginExecutor {
49: * void pushResult(int result);
50: * }
51: * <p/>
52: * // TestExecutor implementation
53: * private static class TestExecutorImpl implements TestExecutor {
54: * private final Stack<Integer> results = new Stack<Integer>();
55: * <p/>
56: * public void pushResult(int result) {
57: * results.push(result);
58: * }
59: * <p/>
60: * public int popResult() {
61: * return results.isEmpty() ? -1 : results.pop();
62: * }
63: * }
64: * <p/>
65: * // An extension point
66: * public static final ExtensionPoint<TestExecutor> EXTENSIONPOINT =
67: * new ExtensionPoint<TestExecutor>("Unique extension point name") { }</b>;
68: * <p/>
69: * // A sample plugin, provided by the plugin developer
70: * private static class TestPlugin implements Plugin<TestExecutor> {
71: * public void apply(TestExecutor executor) {
72: * executor.pushResult(42);
73: * }
74: * }
75: * </pre>
76: * </p>
77: *
78: * @author Daniel Lichtenberger (daniel.lichtenberger@flexive.com), UCS - unique computing solutions gmbh (http://www.ucs.at)
79: * @version $Rev: 1 $
80: */
81: public interface Plugin<PEX extends PluginExecutor> {
82: /**
83: * Execute the plugin callback on the given extension point.
84: *
85: * @param executor the executor that the plugin is applied to
86: */
87: void apply(PEX executor);
88: }
|