From 2812fb4f38b04778d2cf9827384170c3a60c120a Mon Sep 17 00:00:00 2001 From: nirikash <141118539+nirikash@users.noreply.github.com> Date: Wed, 18 Sep 2024 19:33:03 +0200 Subject: [PATCH] feat: Added OSGi hooks example (#33) * feat: Added OSGi hooks example Refs: #31 * fix: Fixed parent pom Refs: #31 * fix: Fixed parent pom Refs: #31 * fix: Fixed code smell Refs: #31 * fix: Fixed code smell Refs: #31 * fix: Workaround for duplicated code Refs: #31 * fix: Added settings property, renamed OSGi hook class Refs: #31 * fix: Added version in OSGi hook sample constructor Refs: #31 --- .../README.md | 11 +++ .../pom.xml | 76 +++++++++++++++++++ ...leteNonResolvedModuleCommentsHookOSGi.java | 42 ++++++++++ .../osgi/HookBundleActivator.java | 38 ++++++++++ .../hook_samples/osgi/HookServlet.java | 25 ++++++ .../src/main/resources/META-INF/MANIFEST.MF | 15 ++++ .../src/main/resources/plugin.xml | 11 +++ .../src/main/resources/webapp/WEB-INF/web.xml | 66 ++++++++++++++++ .../src/main/resources/webapp/hookExample.jsp | 18 +++++ .../pom.xml | 2 +- .../DeleteNonResolvedModuleCommentsHook.java | 6 +- hook-samples/delete-work-records/pom.xml | 2 +- .../DeleteWorkRecordsHook.java | 5 +- hook-samples/module-save-time-logger/pom.xml | 2 +- hook-samples/only-assignee-can-delete/pom.xml | 2 +- hook-samples/plan-save/pom.xml | 2 +- hook-samples/single-assignee/pom.xml | 2 +- hook-samples/testrun/pom.xml | 2 +- hook-samples/title-length-check/pom.xml | 2 +- pom.xml | 8 +- 20 files changed, 322 insertions(+), 15 deletions(-) create mode 100644 hook-samples-osgi/delete-non-resolved-module-comments/README.md create mode 100644 hook-samples-osgi/delete-non-resolved-module-comments/pom.xml create mode 100644 hook-samples-osgi/delete-non-resolved-module-comments/src/main/java/ch/sbb/polarion/extension/interceptor/hook_samples/osgi/DeleteNonResolvedModuleCommentsHookOSGi.java create mode 100644 hook-samples-osgi/delete-non-resolved-module-comments/src/main/java/ch/sbb/polarion/extension/interceptor/hook_samples/osgi/HookBundleActivator.java create mode 100644 hook-samples-osgi/delete-non-resolved-module-comments/src/main/java/ch/sbb/polarion/extension/interceptor/hook_samples/osgi/HookServlet.java create mode 100644 hook-samples-osgi/delete-non-resolved-module-comments/src/main/resources/META-INF/MANIFEST.MF create mode 100644 hook-samples-osgi/delete-non-resolved-module-comments/src/main/resources/plugin.xml create mode 100644 hook-samples-osgi/delete-non-resolved-module-comments/src/main/resources/webapp/WEB-INF/web.xml create mode 100644 hook-samples-osgi/delete-non-resolved-module-comments/src/main/resources/webapp/hookExample.jsp diff --git a/hook-samples-osgi/delete-non-resolved-module-comments/README.md b/hook-samples-osgi/delete-non-resolved-module-comments/README.md new file mode 100644 index 0000000..d379875 --- /dev/null +++ b/hook-samples-osgi/delete-non-resolved-module-comments/README.md @@ -0,0 +1,11 @@ +# Hook in Custom Polarion Extension + +This hook allows for the removal of unresolved comments from the document only. The example demonstrates the technique for registering a hook in a custom Polarion extension. In this case, the hook implementation should be registered as an OSGi service and will be discovered by the interceptor-manager. +To register a hook as an OSGi service in any Polarion extension, follow these steps: +1. Add the dependency org.osgi/org.osgi.framework in your Maven or Gradle build with the provided scope. +2. Create a BundleActivator class that implements the org.osgi.framework.BundleActivator interface. This class must register the hook implementation as an OSGi service under the IActionHook interface. See [HookBundleActivator.java](https://github.com/SchweizerischeBundesbahnen/ch.sbb.polarion.extension.interceptor-manager.hook-samples/blob/main/hook-samples-osgi/delete-non-resolved-module-comments/src/main/java/ch/sbb/polarion/extension/interceptor/hook_samples/osgi/HookBundleActivator.java) for details. +3. Add the following three entries to MANIFEST.MF: +``` Bundle-Activator: + Bundle-ActivationPolicy: lazy + Import-Package: org.osgi.framework +``` diff --git a/hook-samples-osgi/delete-non-resolved-module-comments/pom.xml b/hook-samples-osgi/delete-non-resolved-module-comments/pom.xml new file mode 100644 index 0000000..cd2422f --- /dev/null +++ b/hook-samples-osgi/delete-non-resolved-module-comments/pom.xml @@ -0,0 +1,76 @@ + + + 4.0.0 + + + ch.sbb.polarion.extensions + ch.sbb.polarion.extension.interceptor-manager.hook-samples + 3.0.2-SNAPSHOT + ../../pom.xml + + + ch.sbb.polarion.extension.hook-samples.osgi.delete-non-resolved-module-comments + jar + + + 17 + 17 + 2404 + 1.10.0 + ${env.POLARION_HOME}/polarion/extensions/${project.artifactId}/eclipse/plugins + + + + + com.polarion.alm.projects + projects + ${polarion.version} + provided + + + com.polarion.alm.tracker + tracker + ${polarion.version} + provided + + + com.polarion.platform.persistence + platform-persistence + ${polarion.version} + provided + + + com.polarion.core.util + util + ${polarion.version} + provided + + + com.polarion.thirdparty + javax.servlet_4.0.0 + ${polarion.version} + provided + + + org.osgi + org.osgi.framework + ${org.osgi.framework.version} + provided + + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + src/main/resources/META-INF/MANIFEST.MF + + + + + + + diff --git a/hook-samples-osgi/delete-non-resolved-module-comments/src/main/java/ch/sbb/polarion/extension/interceptor/hook_samples/osgi/DeleteNonResolvedModuleCommentsHookOSGi.java b/hook-samples-osgi/delete-non-resolved-module-comments/src/main/java/ch/sbb/polarion/extension/interceptor/hook_samples/osgi/DeleteNonResolvedModuleCommentsHookOSGi.java new file mode 100644 index 0000000..0e7ad1b --- /dev/null +++ b/hook-samples-osgi/delete-non-resolved-module-comments/src/main/java/ch/sbb/polarion/extension/interceptor/hook_samples/osgi/DeleteNonResolvedModuleCommentsHookOSGi.java @@ -0,0 +1,42 @@ +package ch.sbb.polarion.extension.interceptor.hook_samples.osgi; + +import ch.sbb.polarion.extension.interceptor_manager.model.ActionHook; +import ch.sbb.polarion.extension.interceptor_manager.model.HookExecutor; +import ch.sbb.polarion.extension.interceptor_manager.util.PropertiesUtils; +import com.polarion.alm.tracker.model.IModuleComment; +import com.polarion.core.util.logging.Logger; +import com.polarion.platform.persistence.model.IPObject; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("unused") +public class DeleteNonResolvedModuleCommentsHookOSGi extends ActionHook implements HookExecutor { + private static final Logger logger = Logger.getLogger(DeleteNonResolvedModuleCommentsHookOSGi.class); + + private static final String DESCRIPTION = "Allow the removal of only unresolved comments from the document. Loaded using OSGi services"; + private static final String COMMENT_MESSAGE = "CommentMessage"; + private static final String RESOLVED_CANNOT_BE_DELETED = "'Resolved' comments can not be deleted."; + private static final String VERSION = "1.0.0"; + + public DeleteNonResolvedModuleCommentsHookOSGi() { + super(ItemType.MODULE_COMMENT, ActionType.DELETE, VERSION, DESCRIPTION); + } + + @Override + public String preAction(@NotNull IPObject object) { + if (((IModuleComment) object).isResolvedComment()) { + return RESOLVED_CANNOT_BE_DELETED; + } else { + return null; + } + } + + @Override + public String getDefaultSettings() { + return PropertiesUtils.build(COMMENT_MESSAGE, RESOLVED_CANNOT_BE_DELETED); + } + + @Override + public @NotNull HookExecutor getExecutor() { + return this; + } +} diff --git a/hook-samples-osgi/delete-non-resolved-module-comments/src/main/java/ch/sbb/polarion/extension/interceptor/hook_samples/osgi/HookBundleActivator.java b/hook-samples-osgi/delete-non-resolved-module-comments/src/main/java/ch/sbb/polarion/extension/interceptor/hook_samples/osgi/HookBundleActivator.java new file mode 100644 index 0000000..d13df75 --- /dev/null +++ b/hook-samples-osgi/delete-non-resolved-module-comments/src/main/java/ch/sbb/polarion/extension/interceptor/hook_samples/osgi/HookBundleActivator.java @@ -0,0 +1,38 @@ +package ch.sbb.polarion.extension.interceptor.hook_samples.osgi; + +import ch.sbb.polarion.extension.interceptor_manager.model.IActionHook; +import com.polarion.core.util.logging.Logger; +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceRegistration; + +import java.util.Hashtable; + +public class HookBundleActivator implements BundleActivator { + private static final Logger logger = Logger.getLogger(HookBundleActivator.class); + + private ServiceRegistration actionHookRegistration; + + @Override + public void start(BundleContext context) { + logger.info("Registering action hooks services."); + Hashtable keys = new Hashtable<>(); + keys.put("hook-name", "delete-non-resolved-module-comments"); + + actionHookRegistration = context.registerService( + IActionHook.class, + new DeleteNonResolvedModuleCommentsHookOSGi(), + keys); + + logger.info("Sample action hook service have been registered."); + } + + @Override + public void stop(BundleContext context) { + logger.info("Unregistering action hook service."); + + actionHookRegistration.unregister(); + + logger.info("Action hook service have been unregistered."); + } +} \ No newline at end of file diff --git a/hook-samples-osgi/delete-non-resolved-module-comments/src/main/java/ch/sbb/polarion/extension/interceptor/hook_samples/osgi/HookServlet.java b/hook-samples-osgi/delete-non-resolved-module-comments/src/main/java/ch/sbb/polarion/extension/interceptor/hook_samples/osgi/HookServlet.java new file mode 100644 index 0000000..3683e81 --- /dev/null +++ b/hook-samples-osgi/delete-non-resolved-module-comments/src/main/java/ch/sbb/polarion/extension/interceptor/hook_samples/osgi/HookServlet.java @@ -0,0 +1,25 @@ +package ch.sbb.polarion.extension.interceptor.hook_samples.osgi; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class HookServlet extends HttpServlet { + + @Override + protected void doGet(final HttpServletRequest req, final HttpServletResponse resp) { + try { + getServletContext().getRequestDispatcher("/hookExample.jsp").forward(req, resp); + } catch (ServletException | IOException e) { + try { + log("doGet failed: " + e.getMessage(), e); + resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "An internal error occurred"); + } catch (IOException ex) { + log("IOException occurred by sending error response: "+ e.getMessage(), e); + } + } + } +} + diff --git a/hook-samples-osgi/delete-non-resolved-module-comments/src/main/resources/META-INF/MANIFEST.MF b/hook-samples-osgi/delete-non-resolved-module-comments/src/main/resources/META-INF/MANIFEST.MF new file mode 100644 index 0000000..f04ddd7 --- /dev/null +++ b/hook-samples-osgi/delete-non-resolved-module-comments/src/main/resources/META-INF/MANIFEST.MF @@ -0,0 +1,15 @@ +Manifest-Version: 1.0 +Automatic-Module-Name: ch.sbb.polarion.extension.osgi.hook.example +Bundle-ManifestVersion: 2 +Bundle-SymbolicName: ch.sbb.polarion.extension.osgi.hook.example;singleton:=true +Bundle-Vendor: SBB AG +Bundle-Version: 1.0.0 +Bundle-Name: OSGi Hook example +Bundle-Activator: ch.sbb.polarion.extension.interceptor.hook_samples.osgi.HookBundleActivator +Bundle-ActivationPolicy: lazy +Require-Bundle: com.polarion.alm.tracker, + com.polarion.alm.ui, + com.polarion.portal.tomcat, + ch.sbb.polarion.extension.interceptor-manager +Import-Package: org.osgi.framework + diff --git a/hook-samples-osgi/delete-non-resolved-module-comments/src/main/resources/plugin.xml b/hook-samples-osgi/delete-non-resolved-module-comments/src/main/resources/plugin.xml new file mode 100644 index 0000000..3dda76a --- /dev/null +++ b/hook-samples-osgi/delete-non-resolved-module-comments/src/main/resources/plugin.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/hook-samples-osgi/delete-non-resolved-module-comments/src/main/resources/webapp/WEB-INF/web.xml b/hook-samples-osgi/delete-non-resolved-module-comments/src/main/resources/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..96bd798 --- /dev/null +++ b/hook-samples-osgi/delete-non-resolved-module-comments/src/main/resources/webapp/WEB-INF/web.xml @@ -0,0 +1,66 @@ + + + + + osgi-hook-example + + + DoAsFilter + com.polarion.portal.tomcat.servlets.DoAsFilter + + + DoAsFilter + /* + + + + 30 + + + + log + text/plain + + + + osgi-hook-example + ch.sbb.polarion.extension.interceptor.hook_samples.osgi.HookServlet + + + debug + 0 + + 1 + + + + osgi-hook-example + /ui/* + + + + + All + /* + + + user + + + + + + FORM + PolarionRealm + + /login/login + /login/error + + + diff --git a/hook-samples-osgi/delete-non-resolved-module-comments/src/main/resources/webapp/hookExample.jsp b/hook-samples-osgi/delete-non-resolved-module-comments/src/main/resources/webapp/hookExample.jsp new file mode 100644 index 0000000..0fc3d14 --- /dev/null +++ b/hook-samples-osgi/delete-non-resolved-module-comments/src/main/resources/webapp/hookExample.jsp @@ -0,0 +1,18 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + + Action Hook Example + + + +

Delete non-resolved module comments

+ + \ No newline at end of file diff --git a/hook-samples/delete-non-resolved-module-comments/pom.xml b/hook-samples/delete-non-resolved-module-comments/pom.xml index 9364706..cad06c9 100644 --- a/hook-samples/delete-non-resolved-module-comments/pom.xml +++ b/hook-samples/delete-non-resolved-module-comments/pom.xml @@ -5,7 +5,7 @@ ch.sbb.polarion.extensions ch.sbb.polarion.extension.interceptor-manager.hook-samples - 3.0.2 + 3.0.2-SNAPSHOT ../../pom.xml diff --git a/hook-samples/delete-non-resolved-module-comments/src/main/java/ch/sbb/polarion/extension/interceptor/hook_samples/delete_non_resolved_module_comments/DeleteNonResolvedModuleCommentsHook.java b/hook-samples/delete-non-resolved-module-comments/src/main/java/ch/sbb/polarion/extension/interceptor/hook_samples/delete_non_resolved_module_comments/DeleteNonResolvedModuleCommentsHook.java index 0fa326e..570b228 100644 --- a/hook-samples/delete-non-resolved-module-comments/src/main/java/ch/sbb/polarion/extension/interceptor/hook_samples/delete_non_resolved_module_comments/DeleteNonResolvedModuleCommentsHook.java +++ b/hook-samples/delete-non-resolved-module-comments/src/main/java/ch/sbb/polarion/extension/interceptor/hook_samples/delete_non_resolved_module_comments/DeleteNonResolvedModuleCommentsHook.java @@ -14,6 +14,8 @@ public class DeleteNonResolvedModuleCommentsHook extends ActionHook implements H public static final String DESCRIPTION = "Allow the removal of only unresolved comments from the document."; public static final Logger logger = Logger.getLogger(DeleteNonResolvedModuleCommentsHook.class); + public static final String COMMENT_MESSAGE = "CommentMessage"; + public static final String RESOLVED_COMMENT_CONTENT = "'Resolved' comments can not be deleted."; public DeleteNonResolvedModuleCommentsHook() { super(ItemType.MODULE_COMMENT, ActionType.DELETE, DESCRIPTION); @@ -24,7 +26,7 @@ public String preAction(@NotNull IPObject object) { IModuleComment moduleComment = (IModuleComment) object; if (moduleComment.isResolvedComment()) { - return "'Resolved' comments can not be deleted."; + return RESOLVED_COMMENT_CONTENT; } else { return null; } @@ -37,6 +39,6 @@ public String preAction(@NotNull IPObject object) { @Override public String getDefaultSettings() { - return PropertiesUtils.build(); + return PropertiesUtils.build(COMMENT_MESSAGE, RESOLVED_COMMENT_CONTENT); } } diff --git a/hook-samples/delete-work-records/pom.xml b/hook-samples/delete-work-records/pom.xml index 197e4e7..06164a2 100644 --- a/hook-samples/delete-work-records/pom.xml +++ b/hook-samples/delete-work-records/pom.xml @@ -5,7 +5,7 @@ ch.sbb.polarion.extensions ch.sbb.polarion.extension.interceptor-manager.hook-samples - 3.0.2 + 3.0.2-SNAPSHOT ../../pom.xml diff --git a/hook-samples/delete-work-records/src/main/java/ch/sbb/polarion/extension/interceptor/hook_samples/delete_work_records/DeleteWorkRecordsHook.java b/hook-samples/delete-work-records/src/main/java/ch/sbb/polarion/extension/interceptor/hook_samples/delete_work_records/DeleteWorkRecordsHook.java index 261b712..1ed906f 100644 --- a/hook-samples/delete-work-records/src/main/java/ch/sbb/polarion/extension/interceptor/hook_samples/delete_work_records/DeleteWorkRecordsHook.java +++ b/hook-samples/delete-work-records/src/main/java/ch/sbb/polarion/extension/interceptor/hook_samples/delete_work_records/DeleteWorkRecordsHook.java @@ -18,6 +18,7 @@ public class DeleteWorkRecordsHook extends ActionHook implements HookExecutor { public static final String DESCRIPTION = "Allow deletion of work records only from the current month."; public static final Logger logger = Logger.getLogger(DeleteWorkRecordsHook.class); + public static final String WORK_RECORDS_WARNING = "Only work records added in the current month can be deleted."; public DeleteWorkRecordsHook() { super(ItemType.WORK_RECORD, ActionType.DELETE, DESCRIPTION); @@ -29,7 +30,7 @@ public String preAction(@NotNull IPObject object) { DateOnly workRecordDate = workRecord.getDate(); if (!isDateInCurrentMonth(workRecordDate.getDate())) { - return "Only work records added in the current month can be deleted."; + return WORK_RECORDS_WARNING; } else { return null; } @@ -52,6 +53,6 @@ private static boolean isDateInCurrentMonth(@NotNull Date date) { @Override public String getDefaultSettings() { - return PropertiesUtils.build(); + return PropertiesUtils.build(WORK_RECORDS_WARNING); } } diff --git a/hook-samples/module-save-time-logger/pom.xml b/hook-samples/module-save-time-logger/pom.xml index 19c4fc3..4ac9b0c 100644 --- a/hook-samples/module-save-time-logger/pom.xml +++ b/hook-samples/module-save-time-logger/pom.xml @@ -5,7 +5,7 @@ ch.sbb.polarion.extensions ch.sbb.polarion.extension.interceptor-manager.hook-samples - 3.0.2 + 3.0.2-SNAPSHOT ../../pom.xml diff --git a/hook-samples/only-assignee-can-delete/pom.xml b/hook-samples/only-assignee-can-delete/pom.xml index 9fb3578..fb3323c 100644 --- a/hook-samples/only-assignee-can-delete/pom.xml +++ b/hook-samples/only-assignee-can-delete/pom.xml @@ -5,7 +5,7 @@ ch.sbb.polarion.extensions ch.sbb.polarion.extension.interceptor-manager.hook-samples - 3.0.2 + 3.0.2-SNAPSHOT ../../pom.xml diff --git a/hook-samples/plan-save/pom.xml b/hook-samples/plan-save/pom.xml index d92b45a..2a2cfa6 100644 --- a/hook-samples/plan-save/pom.xml +++ b/hook-samples/plan-save/pom.xml @@ -5,7 +5,7 @@ ch.sbb.polarion.extensions ch.sbb.polarion.extension.interceptor-manager.hook-samples - 3.0.2 + 3.0.2-SNAPSHOT ../../pom.xml diff --git a/hook-samples/single-assignee/pom.xml b/hook-samples/single-assignee/pom.xml index 9d8b28b..277af2b 100644 --- a/hook-samples/single-assignee/pom.xml +++ b/hook-samples/single-assignee/pom.xml @@ -5,7 +5,7 @@ ch.sbb.polarion.extensions ch.sbb.polarion.extension.interceptor-manager.hook-samples - 3.0.2 + 3.0.2-SNAPSHOT ../../pom.xml diff --git a/hook-samples/testrun/pom.xml b/hook-samples/testrun/pom.xml index 6d72f59..6bb0cfa 100644 --- a/hook-samples/testrun/pom.xml +++ b/hook-samples/testrun/pom.xml @@ -5,7 +5,7 @@ ch.sbb.polarion.extensions ch.sbb.polarion.extension.interceptor-manager.hook-samples - 3.0.2 + 3.0.2-SNAPSHOT ../../pom.xml diff --git a/hook-samples/title-length-check/pom.xml b/hook-samples/title-length-check/pom.xml index 30655c0..d329c11 100644 --- a/hook-samples/title-length-check/pom.xml +++ b/hook-samples/title-length-check/pom.xml @@ -5,7 +5,7 @@ ch.sbb.polarion.extensions ch.sbb.polarion.extension.interceptor-manager.hook-samples - 3.0.2 + 3.0.2-SNAPSHOT ../../pom.xml diff --git a/pom.xml b/pom.xml index b5d9411..ffcd99b 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ ch.sbb.polarion.extensions ch.sbb.polarion.extension.interceptor-manager.hook-samples - 3.0.2 + 3.0.2-SNAPSHOT pom @@ -16,6 +16,7 @@ hook-samples/single-assignee hook-samples/testrun hook-samples/title-length-check + hook-samples-osgi/delete-non-resolved-module-comments @@ -47,6 +48,7 @@ ${project.artifact.selectedVersion.majorVersion}.${project.artifact.selectedVersion.minorVersion}.${project.artifact.selectedVersion.incrementalVersion} + ${env.POLARION_HOME}/polarion/extensions/${interceptor-manager.artifactId}/eclipse/plugins/${hooks.folder.name} @@ -61,7 +63,7 @@ - ${env.POLARION_HOME}/polarion/extensions/${interceptor-manager.artifactId}/eclipse/plugins/${hooks.folder.name} + ${target.hooks.directory} *${maven-jar-plugin.Extension-Context}*.jar @@ -91,7 +93,7 @@ ${project.packaging} - ${env.POLARION_HOME}/polarion/extensions/${interceptor-manager.artifactId}/eclipse/plugins/${hooks.folder.name} + ${target.hooks.directory}