Wiki-Quellcode von Plugin-Bundle-Properties
Zeige letzte Bearbeiter
author | version | line-number | content |
---|---|---|---|
1 | {{content/}} | ||
2 | |||
3 | Die Bundle-Properties bieten dem Plugin-Entwickler die Möglichkeit Plugins von außen zu konfigurieren und damit das Laufzeitverhalten der entwickelten Plugins zu steuern. | ||
4 | |||
5 | Die Bundle-Properties können beispielsweise verwendet werden, um Adressen und Zugangsinformationen von Webservice-Endpoints konfigurierbar zu gestalten. | ||
6 | |||
7 | Sie eignen sich dafür, bestimmte Plugin-Typen, wie das //IPluginFormPreRender-Plugin //oder das //IPluginServletAction-Plugin//, die selbst über keine eigene Konfigurationsoberfläche in {{formcycle case="dat"/}} verfügen, von außen zu beeinflussen. | ||
8 | |||
9 | == Definition von Bundle-Properties durch den Plugin-Entwickler == | ||
10 | |||
11 | Die Oberfläche von {{formcycle case="dat"/}} bietet die Möglichkeit neue Properties mit Namen und Wert am jeweiligen Plugin-Bundle zu pflegen. | ||
12 | In den meisten Fällen ist es jedoch sinnvoll, wenn der Name (Zugriffsschlüssel, muss eindeutig innerhalb der Bundle-Properties sein) | ||
13 | und gegebenenfalls ein Default-Wert für ein Property, bereits durch den Plugin-Entwickler festgelegt werden. | ||
14 | \\Damit werden zum einen Schreibfehler beim Anlegen der Zugriffsschlüssels durch den Plugin-Benutzer ausgeschlossen und | ||
15 | zum Anderen erhält der Plugin-Benutzer eine Sicht auf alle durch den Plugin-Entwickler unterstützten Konfigurationswerte ohne Dokumentationen lesen zu müssen. | ||
16 | |||
17 | === Interface IBundleProperties === | ||
18 | |||
19 | {{figure image="plugin_props_config_ui.png" title="FORMCYCLE Bundle-Properties: Darstellung in Oberfläche" width="500"}} | ||
20 | Durch Einbinden des Interfaces //IBundleProperties// können konfigurierbare Optionen in der Oberfläche von {{formcycle case="dat"/}} angezeigt werden. | ||
21 | {{/figure}} | ||
22 | |||
23 | Das Interface //IBundleProperties //bietet mit der Schnittstellen-Methode //getConfigProperties()// die Möglichkeit Bundle-Properties | ||
24 | vorzukonfigurieren. | ||
25 | Die Methode muss eine Map mit Objekten vom Typ //IBundleConfigParam// zurückliefern. | ||
26 | Es existieren zwei mögliche Implementierung von //IBundleConfigParam//: | ||
27 | |||
28 | |||
29 | * {{litem title="BundleConfigGroupItem"}}Dieses Element kann zur Strukturierung der Listendarstellung in der Oberfläche von {{formcycle case="dat"/}} verwendet werden.{{/litem}} | ||
30 | * {{litem title="BundleConfigParam"}}Dient zur Definition eines Bundle-Properties. Es können die folgenden Eigenschaften definiert werden.{{/litem}} | ||
31 | ** {{litem title="name"}}Der Name oder Zugriffsschlüssel einer Property.{{/litem}} | ||
32 | ** {{litem title="description"}}Beschreibung zu einer Property. Wird per //Mouseover// über den //Property//-Namen in der Oberfläche eingeblendet. Kann verwendet werden, um dem Nutzer des Plugins nähere Information zur Verwendung oder möglicher Wertebereiche des Parameters anzuzeigen.{{/litem}} | ||
33 | ** {{litem title="mandatory"}}Legt fest, ob der Parameter in der Oberfläche als Pflichtparameter dargestellt wird und ein Validierung auf Vorhandensein eines Wertes beim Abspeichern durchgeführt wird.{{/litem}} | ||
34 | ** {{litem title="crypticValue"}}Legt fest, ob der Wert der Property wie bei einem Passwordfeld maskiert werden soll. Standardwert ist {{code}}false{{/code}}.{{/litem}} | ||
35 | ** {{litem title="defaultValue"}}Ermöglicht die Festlegung eines Defaultwertes durch den Entwickler. Standardwert ist {{code}}null{{/code}}.{{/litem}} | ||
36 | |||
37 | Das nachfolgende Codebeispiel zeigt eine mögliche Implementierung: | ||
38 | |||
39 | {{code language="java" title=""}} | ||
40 | @SuppressWarnings("serial") | ||
41 | public class MyBundleProperties implements IBundleProperties { | ||
42 | |||
43 | /** | ||
44 | * Returns a map with definitions of bundle configuration parameters. Key is the parameter name, value is a bundle | ||
45 | * parameter definition of type {@link IBundleConfigParam}. | ||
46 | * @param resHelper ResourceHelper to determine i18n values from the plugin bundle, if they exists | ||
47 | * @param currentLocale the current locale | ||
48 | * @return {@link Map} with objects of type {@link IBundleConfigParam} or <code>null</code> | ||
49 | */ | ||
50 | @Override | ||
51 | public Map<String, IBundleConfigParam> getConfigProperties(IPluginResourceHelper resHelper, Locale currentLocale) { | ||
52 | Map<String, IBundleConfigParam> config = new LinkedHashMap<>(); | ||
53 | config.put("Group", new BundleConfigGroupItem("Unterstützte Parameter:")); | ||
54 | config.put("Parameter1", new BundleConfigParam("Parameter1", "Pflichtparameter im Scope des Plugins mit Defaultwert", true, "Defaultwert")); | ||
55 | config.put("Parameter2", new BundleConfigParam("Parameter2", "Pflichtparameter im Scope des Plugins", true)); | ||
56 | config.put("Parameter3", new BundleConfigParam("Parameter3", "Parameter im Scope des Plugins mit Defaultwert", false, "Initialwert")); | ||
57 | config.put("Parameter4", new BundleConfigParam("Parameter4", "Parameter im Scope des Plugins", false)); | ||
58 | return config; | ||
59 | } | ||
60 | |||
61 | } | ||
62 | |||
63 | {{/code}} | ||
64 | |||
65 | == Zugriff auf Bundle-Properties innerhalb der Plugin-Logik == | ||
66 | |||
67 | Der Zugriff auf Bundle-Properties innerhalb von Plugins kann über die Einbindung der abstrakten Klasse //AFCPlugin// erfolgen. | ||
68 | Diese Klasse liefert mit der Methode //getProperties()// ein //java.util.Properties//-Objekt zurück, was den Zugriff auf die Properties ermöglicht. | ||
69 | |||
70 | == Beispiele zur Nutzung von Bundle-Properties == | ||
71 | |||
72 | Ausschnitt aus der //execute//-Methode einer //IPluginFormPreRender//-Implementierung. Ein PreRender-Plugin wird standardmäßig bei allen Formularaufrufen im Scope des Mandanten, in dem er registriert wurde, ausgeführt. | ||
73 | |||
74 | Wenn man zum Beispiel möchte, dass der //PreRenderer// nur beim Aufruf bestimmter Formulare ausgeführt wird, so kann man dies mittels //Bundle-Properties// konfigurierbar gestalten. Das nachfolgende Codebeispiel liest den Wert der //Bundle-Property// {{code}}activate.form.alias{{/code}} aus, welcher die Namen von Formularen mit Komma getrennt enthält, und | ||
75 | vergleicht diese mit den Namen des aktuellen Formulars, in dessen Anwendungsbereich der //PreRenderer// gerade ausgeführt wird. | ||
76 | |||
77 | Wenn der Name des aktuellen Formulars nicht mit einen Namen aus der konfigurierten Liste übereinstimmt, wird die weitere Verarbeitung des PreRenderers abgebrochen. | ||
78 | |||
79 | {{code language="java" title=""}} | ||
80 | public class MyPreRenderer extends AFCPlugin implements IPluginFormPreRender { | ||
81 | @Override | ||
82 | public IPluginFormPreRenderRetVal execute(IPluginFormPreRenderParams preRenderParams) throws FCPluginException { | ||
83 | // Bundle-Property 'activate.form.alias' auslesen | ||
84 | Set<String> alias = getConfiguredFormAlias("activate.form.alias"); | ||
85 | |||
86 | // Ist PreRender-Plugin für aktuelle Formularinstanz freigeschalten? | ||
87 | IExtendedFormRequestContext ctx = (IExtendedFormRequestContext)preRenderParams.getFormRequestContext(); | ||
88 | if(!alias.contains(ctx.getProjekt().getName())) return null; | ||
89 | |||
90 | // weitere PreRender-Implementierung | ||
91 | // .... | ||
92 | |||
93 | return null; | ||
94 | } | ||
95 | |||
96 | protected Set<String> getConfiguredFormAlias(String propertyName) { | ||
97 | String formAlias = getProperties().getProperty(propertyName, null); | ||
98 | if(StringUtils.isBlank(formAlias)) { | ||
99 | return Collections.emptySet(); | ||
100 | } | ||
101 | String[] arr = StringUtils.split(formAlias, ","); | ||
102 | return new HashSet<String>(Arrays.asList(arr)); | ||
103 | } | ||
104 | } | ||
105 | {{/code}} |