├── .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 | [![Travis CI Build Status](https://travis-ci.org/pf4j/pf4j-web.png)](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 | 35 | 36 |
37 | 38 |
39 |

About This Demo

40 | 41 |

pf4j-web-demo

42 | 43 |

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 |

49 |

50 | See the documentation on GitHub 52 |

53 | 54 |
55 |
56 | 57 | 58 | 65 | 66 | 67 | 69 | 70 | 71 | 73 | 74 | 76 | 77 | 78 | 80 | 81 |
82 | 83 |
-------------------------------------------------------------------------------- /demo/pf4j-web-demo-app/src/main/webapp/default.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 10 | 11 | 12 | 13 | 14 | 35 | 36 |
37 | 38 |
39 |

Person Repo

40 | 41 |
42 | 46 | 54 | 55 |
56 |
57 | 59 | 60 | 61 | 62 | Fist Name 63 | 64 | #{p.firstName} 65 | 66 | 67 | 68 | Last Name 69 | #{p.lastName} 70 | 71 | 72 | 73 | Age 74 | #{p.age} 75 | 76 | 77 | 78 | City 79 | #{p.address} 80 | 81 | 82 | 83 | Download/Format 84 | 85 | 86 | 87 | 88 |    89 | 90 | 91 | 92 | 93 | 94 | 95 |
96 | 97 |
98 | You can found plugins to install here. 100 | Donwload and upload on plugin's page. 101 |
102 | 103 |
104 | 105 | 112 | 113 | 115 | 116 | 117 | 119 | 120 | 122 | 123 | 124 | 126 | 127 |
128 | 129 |
-------------------------------------------------------------------------------- /demo/pf4j-web-demo-app/src/main/webapp/plugins.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 10 | 11 | 12 | 13 | 14 | 35 | 36 |
37 | 38 |
39 |

Plugin Manager

40 | 41 | 43 | 44 | 45 | 46 | Plugin ID 47 | 48 | #{plugin.descriptor.pluginId} 49 | 50 | 51 | 52 | Plugin Descriptor 53 | #{plugin.descriptor.pluginDescription} 54 | 55 | 56 | 57 | Version 58 | #{plugin.descriptor.version} 59 | 60 | 61 | 62 | Provider 63 | #{plugin.descriptor.provider} 64 | 65 | 66 | Status 67 | #{plugin.pluginState} 68 | 69 | 70 | 71 | Operations 72 | 73 | Disable 75 |    76 | Enable 78 |    79 | Delete 80 |    81 | 82 | 83 | 84 | 85 | 87 |
88 | 89 | 91 | 93 | 94 |
95 |
96 |
97 |
98 |
99 | You can found plugins to install here. 101 |
102 |
103 | 104 |
105 | 106 | 113 | 114 | 116 | 117 | 118 | 120 | 121 | 123 | 124 | 125 | 127 | 128 |
129 | 130 |
-------------------------------------------------------------------------------- /demo/pf4j-web-demo-app/src/main/webapp/resources/css/custom-style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding-top: 50px; 3 | } 4 | 5 | .starter-template { 6 | padding: 40px 15px; 7 | } 8 | 9 | #footer { 10 | position: absolute; 11 | bottom: 0; 12 | width: 100%; 13 | /* Set the fixed height of the footer here */ 14 | height: 60px; 15 | background-color: #f5f5f5; 16 | } 17 | 18 | #footer .container { 19 | text-align: center; 20 | } -------------------------------------------------------------------------------- /demo/pf4j-web-demo-app/src/main/webapp/resources/js/ga.js: -------------------------------------------------------------------------------- 1 | (function (i, s, o, g, r, a, m) { 2 | i['GoogleAnalyticsObject'] = r; 3 | i[r] = i[r] || function () { 4 | (i[r].q = i[r].q || []).push(arguments) 5 | }, i[r].l = 1 * new Date(); 6 | a = s.createElement(o), m = s.getElementsByTagName(o)[0]; 7 | a.async = 1; 8 | a.src = g; 9 | m.parentNode.insertBefore(a, m) 10 | })(window, document, 'script', 11 | '//www.google-analytics.com/analytics.js', 'ga'); 12 | 13 | ga('create', 'UA-51646769-1', 'pf4jdemo-rmrodrigues.rhcloud.com'); 14 | ga('send', 'pageview'); -------------------------------------------------------------------------------- /demo/pf4j-web-demo-csv-plugin/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4.0.0 4 | 5 | org.pf4j.web.demo 6 | pf4j-web-demo 7 | 1.0.0 8 | 9 | pf4j-web-demo-csv-plugin 10 | 11 | 12 | PF4J 13 | https://github.com/pf4j/pf4j-web/demo 14 | 15 | 16 | 17 | 18 | pf4j-web-demo-csv-plugin 19 | org.pf4j.demo.csv.plugin.CSVExporterPlugin 20 | 1.0.0 21 | RMRdrigues 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | org.pf4j.web.demo 30 | pf4j-web-demo-api 31 | 1.0.0 32 | provided 33 | 34 | 35 | org.jsefa 36 | jsefa 37 | 0.9.2 38 | 39 | 40 | 41 | 42 | 43 | 44 | org.apache.maven.plugins 45 | maven-antrun-plugin 46 | 1.6 47 | 48 | 49 | unzip jar file 50 | package 51 | 52 | 53 | 55 | 56 | 57 | 58 | run 59 | 60 | 61 | 62 | 63 | 64 | 65 | maven-assembly-plugin 66 | 2.3 67 | 68 | 69 | 70 | src/main/assembly/assembly.xml 71 | 72 | 73 | false 74 | 75 | 76 | 77 | make-assembly 78 | package 79 | 80 | attached 81 | 82 | 83 | 84 | 85 | 86 | 87 | org.apache.maven.plugins 88 | maven-jar-plugin 89 | 2.4 90 | 91 | 92 | 93 | ${plugin.id} 94 | ${plugin.class} 95 | ${plugin.version} 96 | ${plugin.provider} 97 | ${plugin.dependencies} 98 | 99 | 100 | 101 | 102 | 103 | 104 | maven-deploy-plugin 105 | 106 | true 107 | 108 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /demo/pf4j-web-demo-csv-plugin/src/main/assembly/assembly.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | plugin 9 | 10 | zip 11 | 12 | false 13 | 14 | 15 | false 16 | runtime 17 | lib 18 | 19 | *:jar:* 20 | 21 | 22 | 23 | 31 | 32 | 33 | target/plugin-classes 34 | classes 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /demo/pf4j-web-demo-csv-plugin/src/main/java/org/pf4j/demo/csv/plugin/CSVExporter.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.csv.plugin; 17 | 18 | import java.io.StringWriter; 19 | import java.util.ArrayList; 20 | import java.util.List; 21 | 22 | import org.jsefa.Serializer; 23 | import org.jsefa.csv.CsvIOFactory; 24 | import org.pf4j.demo.api.ExporterBase; 25 | import org.pf4j.demo.api.model.Person; 26 | import org.pf4j.demo.csv.plugin.model.PersonCSV; 27 | 28 | import org.pf4j.Extension; 29 | 30 | /** 31 | * The Class CSVExporter. 32 | * 33 | * @author rmrodrigues 34 | */ 35 | @Extension 36 | public class CSVExporter extends ExporterBase { 37 | 38 | /** 39 | * The Constant NAME. 40 | */ 41 | private static final String NAME = "CSV"; 42 | 43 | /** 44 | * The Constant CONTENTTYPE. 45 | */ 46 | private static final String CONTENTTYPE = "application/CSV"; 47 | 48 | /** 49 | * Instantiates a new cSV exporter. 50 | */ 51 | public CSVExporter() { 52 | super(NAME, CONTENTTYPE); 53 | } 54 | 55 | 56 | /** (non-Javadoc) 57 | * @see org.pf4j.demo.api.ExporterBase#export(org.pf4j.demo.api.model.Person) 58 | */ 59 | public byte[] export(Person person) { 60 | PersonCSV personCSV = mapPerson(person); 61 | 62 | Serializer serializer = CsvIOFactory.createFactory(PersonCSV.class) 63 | .createSerializer(); 64 | StringWriter writer = new StringWriter(); 65 | serializer.open(writer); 66 | serializer.write(personCSV); 67 | serializer.close(true); 68 | return writer.toString().getBytes(); 69 | 70 | } 71 | 72 | /** (non-Javadoc) 73 | * @see org.pf4j.demo.api.ExporterBase#export(java.util.List) 74 | */ 75 | public byte[] export(List person) { 76 | List personCSVList = mapPerson(person); 77 | 78 | Serializer serializer = CsvIOFactory.createFactory(PersonCSV.class) 79 | .createSerializer(); 80 | StringWriter writer = new StringWriter(); 81 | serializer.open(writer); 82 | for (PersonCSV personCSV : personCSVList) { 83 | serializer.write(personCSV); 84 | } 85 | 86 | serializer.close(true); 87 | return writer.toString().getBytes(); 88 | 89 | } 90 | 91 | /** 92 | * Map person. 93 | * 94 | * @param personList the person list 95 | * @return the list 96 | */ 97 | private List mapPerson(List personList) { 98 | List result = new ArrayList(); 99 | for (Person curPerson : personList) { 100 | result.add(mapPerson(curPerson)); 101 | } 102 | 103 | return result; 104 | } 105 | 106 | /** 107 | * Map person. 108 | * 109 | * @param person the person 110 | * @return the person csv 111 | */ 112 | private PersonCSV mapPerson(Person person) { 113 | return new PersonCSV(person.getFirstName(), person.getLastName(), 114 | person.getAge(), person.getBirthdate(), person.getAddress()); 115 | } 116 | 117 | } 118 | -------------------------------------------------------------------------------- /demo/pf4j-web-demo-csv-plugin/src/main/java/org/pf4j/demo/csv/plugin/CSVExporterPlugin.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.csv.plugin; 17 | 18 | import org.pf4j.Plugin; 19 | import org.pf4j.PluginWrapper; 20 | 21 | /** 22 | * The Class CSVExporterPlugin. 23 | * 24 | * @author rmrodrigues 25 | */ 26 | public class CSVExporterPlugin extends Plugin { 27 | 28 | /** 29 | * Instantiates a new cSV exporter plugin. 30 | * 31 | * @param wrapper the wrapper 32 | */ 33 | public CSVExporterPlugin(PluginWrapper wrapper) { 34 | super(wrapper); 35 | 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /demo/pf4j-web-demo-csv-plugin/src/main/java/org/pf4j/demo/csv/plugin/model/PersonCSV.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.csv.plugin.model; 17 | 18 | import java.util.Date; 19 | import org.jsefa.csv.annotation.CsvDataType; 20 | import org.jsefa.csv.annotation.CsvField; 21 | 22 | /** 23 | * The Class PersonCSV. 24 | * 25 | * @author rmrodrigues 26 | */ 27 | @CsvDataType() 28 | public class PersonCSV { 29 | 30 | /** 31 | * The first name. 32 | */ 33 | @CsvField(pos = 1) 34 | private String firstName; 35 | 36 | /** 37 | * The last name. 38 | */ 39 | @CsvField(pos = 2) 40 | private String lastName; 41 | 42 | /** 43 | * The age. 44 | */ 45 | @CsvField(pos = 3) 46 | private int age; 47 | 48 | /** 49 | * The birthdate. 50 | */ 51 | @CsvField(pos = 4) 52 | private Date birthdate; 53 | 54 | /** 55 | * The address. 56 | */ 57 | @CsvField(pos = 5, format = "dd/MM/yyyy") 58 | private String address; 59 | 60 | /** 61 | * Instantiates a new person csv. 62 | * 63 | * @param firstName the first name 64 | * @param lastName the last name 65 | * @param age the age 66 | * @param birthdate the birthdate 67 | * @param address the address 68 | */ 69 | public PersonCSV(String firstName, String lastName, int age, 70 | Date birthdate, String address) { 71 | super(); 72 | this.firstName = firstName; 73 | this.lastName = lastName; 74 | this.age = age; 75 | this.birthdate = birthdate; 76 | this.address = address; 77 | } 78 | 79 | /** 80 | * Instantiates a new person csv. 81 | */ 82 | public PersonCSV() { 83 | super(); 84 | } 85 | 86 | /** 87 | * Gets the first name. 88 | * 89 | * @return the first name 90 | */ 91 | public String getFirstName() { 92 | return firstName; 93 | } 94 | 95 | /** 96 | * Sets the first name. 97 | * 98 | * @param firstName the new first name 99 | */ 100 | public void setFirstName(String firstName) { 101 | this.firstName = firstName; 102 | } 103 | 104 | /** 105 | * Gets the last name. 106 | * 107 | * @return the last name 108 | */ 109 | public String getLastName() { 110 | return lastName; 111 | } 112 | 113 | /** 114 | * Sets the last name. 115 | * 116 | * @param lastName the new last name 117 | */ 118 | public void setLastName(String lastName) { 119 | this.lastName = lastName; 120 | } 121 | 122 | /** 123 | * Gets the age. 124 | * 125 | * @return the age 126 | */ 127 | public int getAge() { 128 | return age; 129 | } 130 | 131 | /** 132 | * Sets the age. 133 | * 134 | * @param age the new age 135 | */ 136 | public void setAge(int age) { 137 | this.age = age; 138 | } 139 | 140 | /** 141 | * Gets the birthdate. 142 | * 143 | * @return the birthdate 144 | */ 145 | public Date getBirthdate() { 146 | return birthdate; 147 | } 148 | 149 | /** 150 | * Sets the birthdate. 151 | * 152 | * @param birthdate the new birthdate 153 | */ 154 | public void setBirthdate(Date birthdate) { 155 | this.birthdate = birthdate; 156 | } 157 | 158 | /** 159 | * Gets the address. 160 | * 161 | * @return the address 162 | */ 163 | public String getAddress() { 164 | return address; 165 | } 166 | 167 | /** 168 | * Sets the address. 169 | * 170 | * @param address the new address 171 | */ 172 | public void setAddress(String address) { 173 | this.address = address; 174 | } 175 | 176 | } 177 | -------------------------------------------------------------------------------- /demo/pf4j-web-demo-json-plugin/plugin.properties: -------------------------------------------------------------------------------- 1 | plugin.id=json-exporter 2 | plugin.class=org.pf4j.demo.json.plugin.JSonExporterPlugin 3 | plugin.version=1.0.0 4 | plugin.provider=RMRdrigues 5 | plugin.dependencies= 6 | -------------------------------------------------------------------------------- /demo/pf4j-web-demo-json-plugin/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4.0.0 4 | 5 | org.pf4j.web.demo 6 | pf4j-web-demo 7 | 1.0.0 8 | 9 | pf4j-web-demo-json-plugin 10 | 11 | 12 | PF4J 13 | https://github.com/pf4j/pf4j-web/demo 14 | 15 | 16 | 17 | pf4j-web-demo-json-plugin 18 | pf4j-web-demo-json-plugin 19 | org.pf4j.demo.json.plugin.JSonExporterPlugin 20 | 1.0.0 21 | RMRdrigues 22 | 23 | 24 | 25 | 26 | 27 | com.google.code.gson 28 | gson 29 | 2.2.4 30 | 31 | 32 | 33 | org.pf4j.web.demo 34 | pf4j-web-demo-api 35 | 1.0.0 36 | provided 37 | 38 | 39 | 40 | 41 | 42 | 43 | org.apache.maven.plugins 44 | maven-antrun-plugin 45 | 1.6 46 | 47 | 48 | unzip jar file 49 | package 50 | 51 | 52 | 54 | 55 | 56 | 57 | run 58 | 59 | 60 | 61 | 62 | 63 | 64 | maven-assembly-plugin 65 | 2.3 66 | 67 | 68 | 69 | src/main/assembly/assembly.xml 70 | 71 | 72 | false 73 | 74 | 75 | 76 | make-assembly 77 | package 78 | 79 | attached 80 | 81 | 82 | 83 | 84 | 85 | 86 | org.apache.maven.plugins 87 | maven-jar-plugin 88 | 2.4 89 | 90 | 91 | 92 | ${plugin.id} 93 | ${plugin.class} 94 | ${plugin.version} 95 | ${plugin.provider} 96 | ${plugin.dependencies} 97 | 98 | 99 | 100 | 101 | 102 | 103 | maven-deploy-plugin 104 | 105 | true 106 | 107 | 108 | 109 | 110 | -------------------------------------------------------------------------------- /demo/pf4j-web-demo-json-plugin/src/main/assembly/assembly.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | plugin 9 | 10 | zip 11 | 12 | false 13 | 14 | 15 | false 16 | runtime 17 | lib 18 | 19 | *:jar:* 20 | 21 | 22 | 23 | 31 | 32 | 33 | target/plugin-classes 34 | classes 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /demo/pf4j-web-demo-json-plugin/src/main/java/org/pf4j/demo/json/plugin/JSonExporter.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.json.plugin; 17 | 18 | import java.lang.reflect.Type; 19 | import java.util.List; 20 | 21 | import org.pf4j.demo.api.ExporterBase; 22 | import org.pf4j.demo.api.model.Person; 23 | 24 | import org.pf4j.Extension; 25 | 26 | import com.google.gson.Gson; 27 | import com.google.gson.reflect.TypeToken; 28 | 29 | /** 30 | * The Class JSonExporter. 31 | * 32 | * @author rmrodrigues 33 | */ 34 | @Extension 35 | public class JSonExporter extends ExporterBase { 36 | 37 | /** 38 | * The Constant NAME. 39 | */ 40 | private static final String NAME = "JSON"; 41 | 42 | /** 43 | * The Constant CONTENTTYPE. 44 | */ 45 | private static final String CONTENTTYPE = "application/json"; 46 | 47 | /** 48 | * Instantiates a new j son exporter. 49 | */ 50 | public JSonExporter() { 51 | super(NAME, CONTENTTYPE); 52 | } 53 | 54 | /** (non-Javadoc) 55 | * @see org.pf4j.demo.api.ExporterBase#export(org.pf4j.demo.api.model.Person) 56 | */ 57 | public byte[] export(Person person) { 58 | Gson gson = new Gson(); 59 | 60 | return gson.toJson(person).toString().getBytes(); 61 | 62 | } 63 | 64 | /** (non-Javadoc) 65 | * @see org.pf4j.demo.api.ExporterBase#export(java.util.List) 66 | */ 67 | public byte[] export(List personList) { 68 | Gson gson = new Gson(); 69 | Type listType = new TypeToken>() { 70 | }.getType(); 71 | return gson.toJson(personList, listType).toString().getBytes(); 72 | 73 | } 74 | 75 | } 76 | -------------------------------------------------------------------------------- /demo/pf4j-web-demo-json-plugin/src/main/java/org/pf4j/demo/json/plugin/JSonExporterPlugin.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.json.plugin; 17 | 18 | import org.pf4j.Plugin; 19 | import org.pf4j.PluginWrapper; 20 | 21 | /** 22 | * @author rmrodrigues 23 | * 24 | */ 25 | public class JSonExporterPlugin extends Plugin { 26 | 27 | public JSonExporterPlugin(PluginWrapper wrapper) { 28 | super(wrapper); 29 | // TODO Auto-generated constructor stub 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /demo/pf4j-web-demo-xml-plugin/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4.0.0 4 | 5 | org.pf4j.web.demo 6 | pf4j-web-demo 7 | 1.0.0 8 | 9 | org.pf4j.web.demo.xml 10 | pf4j-web-demo-xml-plugin 11 | 12 | 13 | PF4J 14 | https://github.com/pf4j/pf4j-web/demo 15 | 16 | 17 | 18 | pf4j-web-demo-xml-plugin 19 | pf4j-web-demo-xml-plugin 20 | org.pf4j.demo.xml.plugin.XMLExporterPlugin 21 | 1.0.0 22 | RMRdrigues 23 | 24 | 25 | 26 | 27 | 28 | org.pf4j.web.demo 29 | pf4j-web-demo-api 30 | 1.0.0 31 | provided 32 | 33 | 34 | xstream 35 | xstream 36 | 1.2.2 37 | 38 | 39 | 40 | 41 | 42 | 43 | org.apache.maven.plugins 44 | maven-antrun-plugin 45 | 1.6 46 | 47 | 48 | unzip jar file 49 | package 50 | 51 | 52 | 54 | 55 | 56 | 57 | run 58 | 59 | 60 | 61 | 62 | 63 | 64 | maven-assembly-plugin 65 | 2.3 66 | 67 | 68 | 69 | src/main/assembly/assembly.xml 70 | 71 | 72 | false 73 | 74 | 75 | 76 | make-assembly 77 | package 78 | 79 | attached 80 | 81 | 82 | 83 | 84 | 85 | 86 | org.apache.maven.plugins 87 | maven-jar-plugin 88 | 2.4 89 | 90 | 91 | 92 | ${plugin.id} 93 | ${plugin.class} 94 | ${plugin.version} 95 | ${plugin.provider} 96 | ${plugin.dependencies} 97 | 98 | 99 | 100 | 101 | 102 | 103 | maven-deploy-plugin 104 | 105 | true 106 | 107 | 108 | 109 | 110 | -------------------------------------------------------------------------------- /demo/pf4j-web-demo-xml-plugin/src/main/assembly/assembly.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | plugin 9 | 10 | zip 11 | 12 | false 13 | 14 | 15 | false 16 | runtime 17 | lib 18 | 19 | *:jar:* 20 | 21 | 22 | 23 | 31 | 32 | 33 | target/plugin-classes 34 | classes 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /demo/pf4j-web-demo-xml-plugin/src/main/java/org/pf4j/demo/xml/plugin/PersonList.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.xml.plugin; 17 | 18 | import java.util.List; 19 | 20 | import org.pf4j.demo.api.model.Person; 21 | 22 | /** 23 | * The Class PersonList. 24 | * 25 | * @author rmrodrigues 26 | */ 27 | public class PersonList { 28 | 29 | /** 30 | * The list. 31 | */ 32 | private List list; 33 | 34 | /** 35 | * Instantiates a new person list. 36 | * 37 | * @param listIN the list in 38 | */ 39 | public PersonList(List listIN) { 40 | this.list = listIN; 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /demo/pf4j-web-demo-xml-plugin/src/main/java/org/pf4j/demo/xml/plugin/XMLExporter.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.xml.plugin; 17 | 18 | import java.util.List; 19 | 20 | import org.pf4j.demo.api.ExporterBase; 21 | import org.pf4j.demo.api.model.Person; 22 | 23 | import org.pf4j.Extension; 24 | 25 | import com.thoughtworks.xstream.XStream; 26 | 27 | /** 28 | * The Class XMLExporter. 29 | * 30 | * @author rmrodrigues 31 | */ 32 | @Extension 33 | public class XMLExporter extends ExporterBase { 34 | 35 | /** 36 | * The Constant NAME. 37 | */ 38 | private static final String NAME = "XML"; 39 | 40 | /** 41 | * The Constant CONTENTTYPE. 42 | */ 43 | private static final String CONTENTTYPE = "application/xml"; 44 | 45 | /** 46 | * Instantiates a new xML exporter. 47 | */ 48 | public XMLExporter() { 49 | super(NAME, CONTENTTYPE); 50 | } 51 | 52 | /* (non-Javadoc) 53 | * @see org.pf4j.demo.api.ExporterBase#export(org.pf4j.demo.api.model.Person) 54 | */ 55 | public byte[] export(Person person) { 56 | XStream xstream = new XStream(); 57 | xstream.alias("person", Person.class); 58 | String xml = xstream.toXML(person); 59 | return xml.getBytes(); 60 | 61 | } 62 | 63 | /* (non-Javadoc) 64 | * @see org.pf4j.demo.api.ExporterBase#export(java.util.List) 65 | */ 66 | public byte[] export(List person) { 67 | PersonList personList = new PersonList(person); 68 | XStream xstream = new XStream(); 69 | xstream.alias("person", Person.class); 70 | xstream.alias("persons", PersonList.class); 71 | xstream.addImplicitCollection(PersonList.class, "list"); 72 | String xml = xstream.toXML(personList); 73 | return xml.getBytes(); 74 | 75 | } 76 | 77 | } 78 | -------------------------------------------------------------------------------- /demo/pf4j-web-demo-xml-plugin/src/main/java/org/pf4j/demo/xml/plugin/XMLExporterPlugin.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.xml.plugin; 17 | 18 | import org.pf4j.Plugin; 19 | import org.pf4j.PluginWrapper; 20 | 21 | /** 22 | * The Class XMLExporterPlugin. 23 | * 24 | * @author rmrodrigues 25 | */ 26 | public class XMLExporterPlugin extends Plugin { 27 | 28 | /** 29 | * Instantiates a new xML exporter plugin. 30 | * 31 | * @param wrapper the wrapper 32 | */ 33 | public XMLExporterPlugin(PluginWrapper wrapper) { 34 | super(wrapper); 35 | 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /demo/pom.xml: -------------------------------------------------------------------------------- 1 | 5 | 4.0.0 6 | org.pf4j.web.demo 7 | pf4j-web-demo 8 | 1.0.0 9 | pom 10 | 11 | pf4j-web-demo-api 12 | pf4j-web-demo-json-plugin 13 | pf4j-web-demo-csv-plugin 14 | pf4j-web-demo-app 15 | pf4j-web-demo-xml-plugin 16 | 17 | 18 | 19 | 2.2.0 20 | 1.0.0 21 | 22 | 23 | PF4J 24 | https://github.com/pf4j/pf4j-web/demo 25 | 26 | 27 | 28 | 29 | maven-compiler-plugin 30 | 31 | 1.7 32 | 1.7 33 | -Dfile.encoding=UTF-8 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /demo/update.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | #Build 3 | mvn clean package 4 | 5 | # create the plugins folder 6 | rm -rf plugins 7 | mkdir plugins 8 | 9 | # copy artifacts to plugins folder 10 | cp pf4j-web-demo-csv-plugin/target/*.zip plugins/ 11 | cp pf4j-web-demo-json-plugin/target/*.zip plugins/ 12 | cp pf4j-web-demo-xml-plugin/target/*.zip plugins/ 13 | 14 | cd pf4j-web-demo-app 15 | mvn clean jetty:run 16 | cd .. 17 | -------------------------------------------------------------------------------- /pf4j-web/pom.xml: -------------------------------------------------------------------------------- 1 | 6 | 4.0.0 7 | org.pf4j.web 8 | pf4j-web 9 | 1.0.0 10 | pf4j-web 11 | PF4J web module 12 | https://github.com/pf4j/pf4j-web 13 | 14 | 2.2.0 15 | 16 | 17 | 18 | 19 | org.apache.maven.plugins 20 | maven-compiler-plugin 21 | 3.7.0 22 | 23 | 1.7 24 | 1.7 25 | 26 | 27 | 28 | 29 | 30 | 31 | org.pf4j 32 | pf4j 33 | ${pf4j.version} 34 | 35 | 36 | javax.servlet 37 | servlet-api 38 | 2.5 39 | provided 40 | 41 | 42 | -------------------------------------------------------------------------------- /pf4j-web/src/main/java/org/pf4j/web/PluginManagerHolder.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.web; 17 | 18 | import java.io.File; 19 | 20 | import org.slf4j.Logger; 21 | import org.slf4j.LoggerFactory; 22 | 23 | import org.pf4j.DefaultPluginManager; 24 | import org.pf4j.PluginManager; 25 | 26 | /** 27 | * The Class PluginManagerHolder. 28 | * 29 | * @author rmrodrigues 30 | */ 31 | public class PluginManagerHolder { 32 | 33 | /** The plugin manager. */ 34 | private static PluginManager pluginManager = null; 35 | 36 | /** The Constant logger. */ 37 | private static final Logger logger = LoggerFactory 38 | .getLogger(PluginManagerHolder.class); 39 | 40 | /** 41 | * Inits the. 42 | * 43 | * @param pluginsHome 44 | * the plugins home 45 | */ 46 | static void init(String pluginsHome) { 47 | if (pluginsHome != null) { 48 | pluginManager = new DefaultPluginManager(new File(pluginsHome)); 49 | } else { 50 | pluginManager = new DefaultPluginManager(); 51 | } 52 | 53 | } 54 | 55 | /** 56 | * Gets the plugin manager. 57 | * 58 | * @return the plugin manager 59 | */ 60 | public static PluginManager getPluginManager() { 61 | if (pluginManager == null) { 62 | logger.error("pf4j-web: you must add the PluginManagerInitializer in web.xml."); 63 | logger.error("pf4j-web: See more details: https://github.com/rmrodrigues/pf4j-web"); 64 | throw new RuntimeException( 65 | "You must add the PluginManagerInitializer in web.xml.\nSee more details: https://github.com/rmrodrigues/pf4j-web"); 66 | } 67 | return pluginManager; 68 | } 69 | 70 | } 71 | -------------------------------------------------------------------------------- /pf4j-web/src/main/java/org/pf4j/web/PluginManagerInitializer.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.web; 17 | 18 | import javax.servlet.ServletContext; 19 | import javax.servlet.ServletContextEvent; 20 | import javax.servlet.ServletContextListener; 21 | 22 | import org.slf4j.Logger; 23 | import org.slf4j.LoggerFactory; 24 | 25 | import org.pf4j.PluginManager; 26 | 27 | /** 28 | * The Class PluginManagerInitializer. 29 | * 30 | * @author rmrodrigues 31 | */ 32 | public class PluginManagerInitializer implements ServletContextListener { 33 | 34 | /** The Constant logger. */ 35 | private static final Logger logger = LoggerFactory 36 | .getLogger(PluginManagerInitializer.class); 37 | 38 | /** The Constant CONST_CONFIG_PARAM_NAME. */ 39 | private static final String CONST_CONFIG_PARAM_NAME = "pf4j.pluginsDir"; 40 | 41 | public void contextDestroyed(ServletContextEvent servletContextEvent) { 42 | logger.debug("contextDestroyed start."); 43 | logger.debug("get plugin manager"); 44 | final PluginManager pluginManager = PluginManagerHolder 45 | .getPluginManager(); 46 | 47 | logger.info("Stopping plugins..."); 48 | pluginManager.stopPlugins(); 49 | logger.info("Plugins stopped."); 50 | logger.debug("contextDestroyed end."); 51 | } 52 | 53 | public void contextInitialized(ServletContextEvent servletContextEvent) { 54 | logger.debug("contextInitialized start."); 55 | logger.info("Initializing plugin manager."); 56 | PluginManagerHolder.init(getPluginsHome(servletContextEvent)); 57 | 58 | final PluginManager pluginManager = PluginManagerHolder 59 | .getPluginManager(); 60 | logger.info("Plugin Manager initialized."); 61 | logger.debug("Plugin Manager initialized."); 62 | pluginManager.loadPlugins(); 63 | logger.debug("Plugins loaded."); 64 | logger.debug("contextInitialized end."); 65 | } 66 | 67 | /** 68 | * Gets the plugins home. 69 | * 70 | * @param servletContextEvent 71 | * the servlet context event 72 | * @return the plugins home 73 | */ 74 | private String getPluginsHome(ServletContextEvent servletContextEvent) { 75 | ServletContext context = servletContextEvent.getServletContext(); 76 | if (context != null) { 77 | return context.getInitParameter(CONST_CONFIG_PARAM_NAME); 78 | } 79 | return null; 80 | } 81 | 82 | } 83 | --------------------------------------------------------------------------------