├── .gitignore
├── .travis.yml
├── LICENSE
├── README.md
├── demo
├── README.md
├── pf4j-web-demo-api
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── org
│ │ └── pf4j
│ │ └── demo
│ │ └── api
│ │ ├── ExporterBase.java
│ │ └── model
│ │ └── Person.java
├── pf4j-web-demo-app
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ └── org
│ │ │ └── pf4j
│ │ │ └── demo
│ │ │ └── web
│ │ │ └── mbean
│ │ │ ├── PersonMBean.java
│ │ │ └── PluginsMBean.java
│ │ ├── resources
│ │ └── log4j.properties
│ │ └── webapp
│ │ ├── WEB-INF
│ │ └── web.xml
│ │ ├── about.xhtml
│ │ ├── default.xhtml
│ │ ├── plugins.xhtml
│ │ └── resources
│ │ ├── css
│ │ └── custom-style.css
│ │ └── js
│ │ └── ga.js
├── pf4j-web-demo-csv-plugin
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── assembly
│ │ └── assembly.xml
│ │ └── java
│ │ └── org
│ │ └── pf4j
│ │ └── demo
│ │ └── csv
│ │ └── plugin
│ │ ├── CSVExporter.java
│ │ ├── CSVExporterPlugin.java
│ │ └── model
│ │ └── PersonCSV.java
├── pf4j-web-demo-json-plugin
│ ├── plugin.properties
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── assembly
│ │ └── assembly.xml
│ │ └── java
│ │ └── org
│ │ └── pf4j
│ │ └── demo
│ │ └── json
│ │ └── plugin
│ │ ├── JSonExporter.java
│ │ └── JSonExporterPlugin.java
├── pf4j-web-demo-xml-plugin
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── assembly
│ │ └── assembly.xml
│ │ └── java
│ │ └── org
│ │ └── pf4j
│ │ └── demo
│ │ └── xml
│ │ └── plugin
│ │ ├── PersonList.java
│ │ ├── XMLExporter.java
│ │ └── XMLExporterPlugin.java
├── pom.xml
└── update.sh
└── pf4j-web
├── pom.xml
└── src
└── main
└── java
└── org
└── pf4j
└── web
├── PluginManagerHolder.java
└── PluginManagerInitializer.java
/.gitignore:
--------------------------------------------------------------------------------
1 | */target
2 | .project
3 | /bin
4 | .classpath
5 | .settings
6 | .idea/
7 | *.iml
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: java
2 | jdk:
3 | # JDK7 is not supported anymore; https://github.com/travis-ci/travis-ci/issues/7884#issuecomment-308451879
4 | # - oraclejdk7
5 | - openjdk7
6 | - oraclejdk8
7 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "{}"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright {yyyy} {name of copyright owner}
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # pf4j-web
2 |
3 | [](https://travis-ci.org/pf4j/pf4j-web)
4 |
5 | Web module for pf4j. The main goal of this module is allows developers use pf4j in web applications.
6 |
7 | ## How to use
8 | ### Maven
9 | Define the pf4j-web dependency in your pom.xml:
10 |
11 | ```xml
12 |
13 |
14 | org.pf4j.web
15 | pf4j-web
16 | 1.0.0
17 |
18 |
19 | ```
20 |
21 | ### Web.xml configuration
22 | It's necessary to define a listener class in your web.xml:
23 |
24 |
25 | ```xml
26 |
27 |
28 | org.pf4j.web.PluginManagerInitializer
29 |
30 |
31 | ```
32 |
33 | ### Plugin's home
34 | It's possible to define a custom folder for the plugin's home. So, in this case it's necessary to add a context-param in your web.xml with param name "*pf4j.pluginsDir*". If that value is not defined, the plugins home will be created on the same directory of the executable file. For example, if you are using Apache Tomcat as application server, the plugins home will be created inside of the bin folder.
35 |
36 | ```xml
37 |
38 |
39 | pf4j.pluginsDir
40 | /path/to/plugins
41 |
42 |
43 | ```
44 |
45 | ## PF4J Documentation
46 | For a more detailed documentation about pf4j core, please visit: [https://github.com/pf4j/pf4j](https://github.com/pf4j/pf4j)
47 |
48 | ## Demo
49 | Visit the demo here: [https://github.com/pf4j/pf4j-web/demo](https://github.com/pf4j/pf4j-web/demo)
50 |
51 | # History
52 | Initial version by [Rui Rodrigues](https://github.com/rmrodrigues)
53 |
54 | ## License
55 | This software is under [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0).
56 | ## Suggestions
57 | Any suggestions are welcome.
58 |
--------------------------------------------------------------------------------
/demo/README.md:
--------------------------------------------------------------------------------
1 | # pf4j-web-demo
2 |
3 | The main goal of this application is to demonstrate how simple is to develop a modular web application using [https://github.com/pf4j/pf4j](https://github.com/pf4j/pf4j)
4 |
5 | ## Application Goal
6 | As a DEMO, this Web Application cantains a list of person data that can be downloaded in varios formats such as:
7 | * COSTUM (pf4j-web-demo-costom-plugin)
8 | * CSV (pf4j-web-demo-csv-plugin)
9 | * JSON (pf4j-web-demo-json-plugin)
10 | * XML (pf4j-web-demo-xml-plugin)
11 |
12 | Each plugin provides two methods, one to download a single person object and another to download an array os persons.
13 |
14 | ## Demo
15 |
16 | Run script `update.sh` to run demo locally.
17 |
18 | ## Project Structure
19 | * pf4j-web-demo/ (Maven Project)
20 | * pf4j-web-demo-api -> This project contains all needed classes to develop a plugin.
21 | * pf4j-web-demo-app -> This is the web application project.
22 | * pf4j-web-demo-costum-plugin -> This plugin allows users to download person data in a costum format.
23 | * pf4j-web-demo-csv-plugin -> This plugin allows users to download person data in a CSV format.
24 | * pf4j-web-demo-json-plugin -> This plugin allows users to download person data in a JSON format.
25 | * pf4j-web-demo-xml-plugin -> This plugin allows users to download person data in a XML format.
26 | * Plugins/ (Contains the plugins)
27 |
--------------------------------------------------------------------------------
/demo/pf4j-web-demo-api/pom.xml:
--------------------------------------------------------------------------------
1 |
2 | 4.0.0
3 |
4 | org.pf4j.web.demo
5 | pf4j-web-demo
6 | 1.0.0
7 |
8 | pf4j-web-demo-api
9 |
10 |
11 | PF4J
12 | https://github.com/pf4j/pf4j-web/demo
13 |
14 |
15 |
16 |
17 | org.pf4j
18 | pf4j
19 | ${pf4j.version}
20 |
21 |
22 |
--------------------------------------------------------------------------------
/demo/pf4j-web-demo-api/src/main/java/org/pf4j/demo/api/ExporterBase.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (C) 2012-present the original author or authors.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 | package org.pf4j.demo.api;
17 |
18 | import java.util.List;
19 |
20 | import org.pf4j.demo.api.model.Person;
21 |
22 | import org.pf4j.ExtensionPoint;
23 |
24 | /**
25 | * The Class ExporterBase.
26 | *
27 | * @author rmrodrigues
28 | */
29 | public abstract class ExporterBase implements ExtensionPoint {
30 |
31 | /**
32 | * The name.
33 | */
34 | private String name;
35 |
36 | /**
37 | * The content type.
38 | */
39 | private String contentType;
40 |
41 | /**
42 | * Instantiates a new exporter base.
43 | *
44 | * @param name the name
45 | * @param contentType the content type
46 | */
47 | public ExporterBase(String name, String contentType) {
48 | this.name = name;
49 | this.contentType = contentType;
50 | }
51 |
52 | /**
53 | * (non-Javadoc)
54 | *
55 | * @see org.pf4j.demo.api.PluginBase#getName()
56 | *
57 | * Gets the name.
58 | *
59 | * @return the name
60 | */
61 | public String getName() {
62 | return name;
63 | }
64 |
65 | /**
66 | * Gets the content type.
67 | *
68 | * @return the content type
69 | */
70 | public String getContentType() {
71 | return contentType;
72 | }
73 |
74 | /**
75 | * Sets the content type.
76 | *
77 | * @param contentType the new content type
78 | */
79 | public void setContentType(String contentType) {
80 | this.contentType = contentType;
81 | }
82 |
83 | /**
84 | * Sets the name.
85 | *
86 | * @param name the new name
87 | */
88 | public void setName(String name) {
89 | this.name = name;
90 | }
91 |
92 | /**
93 | * (non-Javadoc)
94 | *
95 | * @see
96 | * org.pf4j.demo.api.PluginBase#export(org.pf4j.demo.api.model.Person)
97 | *
98 | * Export.
99 | *
100 | * @param person the person
101 | * @return the byte[]
102 | */
103 | public abstract byte[] export(Person person);
104 |
105 | /**
106 | * Export.
107 | *
108 | * @param persons the persons
109 | * @return the byte[]
110 | */
111 | public abstract byte[] export(List persons);
112 |
113 | }
114 |
--------------------------------------------------------------------------------
/demo/pf4j-web-demo-api/src/main/java/org/pf4j/demo/api/model/Person.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (C) 2012-present the original author or authors.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 | package org.pf4j.demo.api.model;
17 |
18 | import java.util.Date;
19 |
20 | // TODO: Auto-generated Javadoc
21 | /**
22 | * The Class Person.
23 | *
24 | * @author rmrodrigues
25 | */
26 | public class Person {
27 |
28 | /**
29 | * The first name.
30 | */
31 | private String firstName;
32 |
33 | /**
34 | * The last name.
35 | */
36 | private String lastName;
37 |
38 | /**
39 | * The age.
40 | */
41 | private int age;
42 |
43 | /**
44 | * The birthdate.
45 | */
46 | private Date birthdate;
47 |
48 | /**
49 | * The address.
50 | */
51 | private String address;
52 |
53 | /**
54 | * Instantiates a new person.
55 | *
56 | * @param firstName the first name
57 | * @param lastName the last name
58 | * @param age the age
59 | * @param birthdate the birthdate
60 | * @param address the address
61 | */
62 | public Person(String firstName, String lastName, int age, Date birthdate,
63 | String address) {
64 | super();
65 | this.firstName = firstName;
66 | this.lastName = lastName;
67 | this.age = age;
68 | this.birthdate = birthdate;
69 | this.address = address;
70 | }
71 |
72 | /**
73 | * Gets the first name.
74 | *
75 | * @return the first name
76 | */
77 | public String getFirstName() {
78 | return firstName;
79 | }
80 |
81 | /**
82 | * Sets the first name.
83 | *
84 | * @param firstName the new first name
85 | */
86 | public void setFirstName(String firstName) {
87 | this.firstName = firstName;
88 | }
89 |
90 | /**
91 | * Gets the last name.
92 | *
93 | * @return the last name
94 | */
95 | public String getLastName() {
96 | return lastName;
97 | }
98 |
99 | /**
100 | * Sets the last name.
101 | *
102 | * @param lastName the new last name
103 | */
104 | public void setLastName(String lastName) {
105 | this.lastName = lastName;
106 | }
107 |
108 | /**
109 | * Gets the age.
110 | *
111 | * @return the age
112 | */
113 | public int getAge() {
114 | return age;
115 | }
116 |
117 | /**
118 | * Sets the age.
119 | *
120 | * @param age the new age
121 | */
122 | public void setAge(int age) {
123 | this.age = age;
124 | }
125 |
126 | /**
127 | * Gets the birthdate.
128 | *
129 | * @return the birthdate
130 | */
131 | public Date getBirthdate() {
132 | return birthdate;
133 | }
134 |
135 | /**
136 | * Sets the birthdate.
137 | *
138 | * @param birthdate the new birthdate
139 | */
140 | public void setBirthdate(Date birthdate) {
141 | this.birthdate = birthdate;
142 | }
143 |
144 | /**
145 | * Gets the address.
146 | *
147 | * @return the address
148 | */
149 | public String getAddress() {
150 | return address;
151 | }
152 |
153 | /**
154 | * Sets the address.
155 | *
156 | * @param address the new address
157 | */
158 | public void setAddress(String address) {
159 | this.address = address;
160 | }
161 |
162 | }
163 |
--------------------------------------------------------------------------------
/demo/pf4j-web-demo-app/pom.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 | 4.0.0
6 |
7 | org.pf4j.web.demo
8 | pf4j-web-demo
9 | 1.0.0
10 |
11 | pf4j-web-demo-app
12 | war
13 |
14 |
15 | PF4J
16 | https://github.com/pf4j/pf4j-web/demo
17 |
18 |
19 |
20 |
21 | log4j
22 | log4j
23 | 1.2.17
24 |
25 |
26 |
27 |
28 | org.pf4j
29 | pf4j
30 | ${pf4j.version}
31 |
32 |
33 | org.pf4j.web
34 | pf4j-web
35 | ${pf4j.web.version}
36 |
37 |
38 | org.pf4j.web.demo
39 | pf4j-web-demo-api
40 | 1.0.0
41 |
42 |
43 | org.apache.myfaces.tomahawk
44 | tomahawk20
45 | 1.1.10
46 |
47 |
48 | commons-io
49 | commons-io
50 | 2.4
51 |
52 |
53 | org.glassfish
54 | javax.faces
55 | 2.2.16
56 |
57 |
58 |
59 | org.glassfish
60 | javax.servlet
61 | 3.1.1
62 | provided
63 |
64 |
65 |
66 |
67 |
68 | pf4j-web-demo-web
69 |
70 |
71 |
72 | org.apache.maven.plugins
73 | maven-compiler-plugin
74 | 3.7.0
75 |
76 | 1.7
77 | 1.7
78 |
79 |
80 |
81 | org.eclipse.jetty
82 | jetty-maven-plugin
83 | 9.4.9.v20180320
84 |
85 |
86 |
87 |
88 |
--------------------------------------------------------------------------------
/demo/pf4j-web-demo-app/src/main/java/org/pf4j/demo/web/mbean/PersonMBean.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (C) 2012-present the original author or authors.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 | package org.pf4j.demo.web.mbean;
17 |
18 | import java.io.IOException;
19 | import java.io.Serializable;
20 | import java.util.ArrayList;
21 | import java.util.Date;
22 | import java.util.List;
23 |
24 | import javax.faces.bean.ManagedBean;
25 | import javax.faces.bean.SessionScoped;
26 | import javax.faces.context.FacesContext;
27 | import javax.servlet.ServletOutputStream;
28 | import javax.servlet.http.HttpServletResponse;
29 |
30 | import org.pf4j.demo.api.ExporterBase;
31 | import org.pf4j.demo.api.model.Person;
32 | import org.pf4j.web.PluginManagerHolder;
33 |
34 | /**
35 | * The Class PersonMBean.
36 | *
37 | * @author rmrodrigues
38 | */
39 | @ManagedBean(name = "personMBean")
40 | @SessionScoped
41 | public class PersonMBean implements Serializable {
42 |
43 | /**
44 | * The Constant serialVersionUID.
45 | */
46 | private static final long serialVersionUID = -3314761395244493023L;
47 |
48 | /**
49 | * The Constant personList.
50 | */
51 | private static final List personList = new ArrayList() {
52 | {
53 | add(new Person("Steve", "Jobs", 56, new Date(), "Palo Alto"));
54 | add(new Person("Mark", "Smidth", 16, new Date(), "New York"));
55 | add(new Person("Gustavo", "Martiez", 56, new Date(), "Boston"));
56 | add(new Person("Emilia", "Ortega", 54, new Date(), "Oporto"));
57 | add(new Person("Nora", "Scott", 75, new Date(), "Viana do Castelo"));
58 | add(new Person("Paul", "Walker", 30, new Date(), "Barcelona"));
59 | add(new Person("Michael", "James", 45, new Date(), "Braga"));
60 | }
61 | };
62 |
63 | /**
64 | * Gets the person list.
65 | *
66 | * @return the person list
67 | */
68 | public List getPersonList() {
69 | return personList;
70 | }
71 |
72 | /**
73 | * Download.
74 | *
75 | * @param p the p
76 | * @param plugin the plugin
77 | * @return the string
78 | */
79 | public String download(Person p, ExporterBase plugin) {
80 |
81 | FacesContext fc = FacesContext.getCurrentInstance();
82 | HttpServletResponse response = (HttpServletResponse) fc
83 | .getExternalContext().getResponse();
84 | ServletOutputStream out = null;
85 | try {
86 | out = response.getOutputStream();
87 |
88 | out.write(plugin.export(p));
89 | response.setContentType(plugin.getContentType());
90 | response.addHeader("Content-Disposition",
91 | "attachment; filename=\"Person\"");
92 | out.flush();
93 | } catch (IOException e1) {
94 | }
95 | try {
96 | if (out != null) {
97 | out.close();
98 | }
99 | FacesContext.getCurrentInstance().responseComplete();
100 | } catch (IOException e) {
101 |
102 | }
103 |
104 | return "";
105 | }
106 |
107 | /**
108 | * Download all.
109 | *
110 | * @param plugin the plugin
111 | * @return the string
112 | */
113 | public String downloadAll(ExporterBase plugin) {
114 | FacesContext fc = FacesContext.getCurrentInstance();
115 | HttpServletResponse response = (HttpServletResponse) fc
116 | .getExternalContext().getResponse();
117 | ServletOutputStream out = null;
118 | try {
119 | out = response.getOutputStream();
120 |
121 | out.write(plugin.export(getPersonList()));
122 | response.setContentType(plugin.getContentType());
123 | response.addHeader("Content-Disposition",
124 | "attachment; filename=\"Person\"");
125 | out.flush();
126 | } catch (IOException e1) {
127 | }
128 | try {
129 | if (out != null) {
130 | out.close();
131 | }
132 | FacesContext.getCurrentInstance().responseComplete();
133 | } catch (IOException e) {
134 |
135 | }
136 |
137 | return "";
138 | }
139 |
140 | /**
141 | * Gets the plugins.
142 | *
143 | * @return the plugins
144 | */
145 | public List getPlugins() {
146 | return PluginManagerHolder.getPluginManager().getExtensions(
147 | ExporterBase.class);
148 | }
149 |
150 | }
151 |
--------------------------------------------------------------------------------
/demo/pf4j-web-demo-app/src/main/java/org/pf4j/demo/web/mbean/PluginsMBean.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (C) 2012-present the original author or authors.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 | package org.pf4j.demo.web.mbean;
17 |
18 | import java.io.File;
19 | import java.io.FileOutputStream;
20 | import java.io.IOException;
21 | import java.io.Serializable;
22 | import java.util.List;
23 |
24 | import javax.faces.application.FacesMessage;
25 | import javax.faces.bean.ManagedBean;
26 | import javax.faces.bean.SessionScoped;
27 | import javax.faces.context.FacesContext;
28 | import javax.servlet.ServletOutputStream;
29 | import javax.servlet.http.HttpServletResponse;
30 |
31 | import org.apache.commons.io.FilenameUtils;
32 | import org.apache.myfaces.custom.fileupload.UploadedFile;
33 | import org.pf4j.demo.api.ExporterBase;
34 | import org.pf4j.demo.api.model.Person;
35 | import org.pf4j.web.PluginManagerHolder;
36 |
37 | import org.pf4j.PluginState;
38 | import org.pf4j.PluginWrapper;
39 |
40 | /**
41 | * The Class PluginsMBean.
42 | *
43 | * @author rmrodrigues
44 | */
45 | @ManagedBean(name = "pluginsMBean")
46 | @SessionScoped
47 | public class PluginsMBean implements Serializable {
48 |
49 | /**
50 | * The Constant serialVersionUID.
51 | */
52 | private static final long serialVersionUID = 7473027855852017369L;
53 |
54 | /**
55 | * Gets the plugins.
56 | *
57 | * @return the plugins
58 | */
59 | public List getPlugins() {
60 | return PluginManagerHolder.getPluginManager().getPlugins();
61 | }
62 |
63 | /**
64 | * Checks if is active.
65 | *
66 | * @param pluginWrapper the plugin wrapper
67 | * @return true, if is active
68 | */
69 | public boolean isActive(PluginWrapper pluginWrapper) {
70 | return pluginWrapper.getPluginState().equals(PluginState.STARTED);
71 |
72 | }
73 |
74 | /**
75 | * Disable.
76 | *
77 | * @param pluginWrapper the plugin wrapper
78 | * @return the string
79 | */
80 | public String disable(PluginWrapper pluginWrapper) {
81 | PluginManagerHolder.getPluginManager().stopPlugin(
82 | pluginWrapper.getPluginId());
83 | return "";
84 | }
85 |
86 | /**
87 | * Delete.
88 | *
89 | * @param pluginWrapper the plugin wrapper
90 | * @return the string
91 | */
92 | public String delete(PluginWrapper pluginWrapper) {
93 | PluginManagerHolder.getPluginManager().deletePlugin(
94 | pluginWrapper.getPluginId());
95 | return "";
96 | }
97 |
98 | /**
99 | * Enable.
100 | *
101 | * @param pluginWrapper the plugin wrapper
102 | * @return the string
103 | */
104 | public String enable(PluginWrapper pluginWrapper) {
105 | PluginManagerHolder.getPluginManager().enablePlugin(
106 | pluginWrapper.getPluginId());
107 | PluginManagerHolder.getPluginManager().startPlugin(
108 | pluginWrapper.getPluginId());
109 | return "";
110 | }
111 |
112 | /**
113 | * Download.
114 | *
115 | * @param p the p
116 | * @param plugin the plugin
117 | * @return the string
118 | */
119 | public String download(Person p, ExporterBase plugin) {
120 |
121 | FacesContext fc = FacesContext.getCurrentInstance();
122 | HttpServletResponse response = (HttpServletResponse) fc
123 | .getExternalContext().getResponse();
124 | ServletOutputStream out = null;
125 | try {
126 | out = response.getOutputStream();
127 |
128 | out.write(plugin.export(p));
129 | response.setContentType(plugin.getContentType());
130 | response.addHeader("Content-Disposition",
131 | "attachment; filename=\"Person\"");
132 | out.flush();
133 | } catch (IOException e1) {
134 | }
135 | try {
136 | if (out != null) {
137 | out.close();
138 | }
139 | FacesContext.getCurrentInstance().responseComplete();
140 | } catch (IOException e) {
141 |
142 | }
143 |
144 | return "";
145 | }
146 |
147 | /**
148 | * The uploaded file.
149 | */
150 | private UploadedFile uploadedFile;
151 |
152 | /**
153 | * Submit.
154 | *
155 | * @throws IOException Signals that an I/O exception has occurred.
156 | */
157 | public void submit() throws IOException {
158 | String fileName = FilenameUtils.getName(uploadedFile.getName());
159 | String pluginsHome = System.getProperty("pf4j.pluginsDir", "plugins");
160 | byte[] bytes = uploadedFile.getBytes();
161 | FileOutputStream out = new FileOutputStream(pluginsHome + "/"
162 | + fileName);
163 | out.write(bytes);
164 | out.close();
165 | String newPluginID = PluginManagerHolder.getPluginManager().loadPlugin(
166 | new File(pluginsHome + "/" + fileName).toPath());
167 |
168 | PluginManagerHolder.getPluginManager().enablePlugin(newPluginID);
169 |
170 | PluginManagerHolder.getPluginManager().startPlugin(newPluginID);
171 |
172 | FacesContext.getCurrentInstance().addMessage(
173 | null,
174 | new FacesMessage(String.format(
175 | "Plugin '%s' successfully installed!", fileName)));
176 | }
177 |
178 | /**
179 | * Gets the uploaded file.
180 | *
181 | * @return the uploaded file
182 | */
183 | public UploadedFile getUploadedFile() {
184 | return uploadedFile;
185 | }
186 |
187 | /**
188 | * Sets the uploaded file.
189 | *
190 | * @param uploadedFile the new uploaded file
191 | */
192 | public void setUploadedFile(UploadedFile uploadedFile) {
193 | this.uploadedFile = uploadedFile;
194 | }
195 |
196 | }
197 |
--------------------------------------------------------------------------------
/demo/pf4j-web-demo-app/src/main/resources/log4j.properties:
--------------------------------------------------------------------------------
1 | log4j.rootLogger=INFO, stdout
2 |
3 | log4j.appender.stdout=org.apache.log4j.ConsoleAppender
4 | log4j.appender.stdout.Target=System.out
5 | log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
6 | log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
7 |
8 |
9 | log4j.logger.org.rmrodrigues=INFO
--------------------------------------------------------------------------------
/demo/pf4j-web-demo-app/src/main/webapp/WEB-INF/web.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 | JavaServerFaces
9 |
10 |
12 |
13 |
14 |
15 | javax.faces.PROJECT_STAGE
16 | Development
17 |
18 |
19 |
20 |
21 | default.xhtml
22 | faces/default.xhtml
23 |
24 |
25 |
26 |
27 | Faces Servlet
28 | javax.faces.webapp.FacesServlet
29 | 1
30 |
31 |
32 |
33 |
34 | Faces Servlet
35 | /faces/*
36 |
37 |
38 | Faces Servlet
39 | *.jsf
40 |
41 |
42 | Faces Servlet
43 | *.faces
44 |
45 |
46 | Faces Servlet
47 | *.xhtml
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 | pf4j.pluginsDir
56 | /Users/rmrodrigues/git/pf4j-web-demo/plugins
57 |
58 |
59 |
60 | MyFacesExtensionsFilter
61 | org.apache.myfaces.webapp.filter.ExtensionsFilter
62 |
63 |
64 | MyFacesExtensionsFilter
65 | Faces Servlet
66 |
67 |
68 |
69 |
--------------------------------------------------------------------------------
/demo/pf4j-web-demo-app/src/main/webapp/about.xhtml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
9 |
10 |
11 |
12 |
13 |
14 |
44 | The main goal of this application is to demonstrate how simple is
45 | to develop a modular web application using PF4j (Plugin Framework
47 | for JAVA).
48 |