Create a JavaScript file in src/test/resources that will respond to scan events. You can copy the example script as a starting point:
/* * Copyright 2020 Mark Adamcin * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * 1. Implement the optional listener functions stubbed out below to perform your Oak package acceptance tests. * * 2. Use the oakpal global object to report violations * * For MINOR violations: * oakpal.minorViolation(description, packageId); * * For MAJOR violations: * oakpal.majorViolation(description, packageId); * * For SEVERE violations: * oakpal.severeViolation(description, packageId); * * 3. If configuration parameters are available, they can be accessed using the "config" global object. * * Java type imports for reference: * * import org.apache.jackrabbit.vault.packaging.PackageId; * import org.apache.jackrabbit.vault.packaging.PackageProperties; * import org.apache.jackrabbit.vault.fs.config.MetaInf; * import java.io.File; * import java.util.jar.Manifest; * import javax.jcr.Node; * import javax.jcr.Session; * import net.adamcin.oakpal.api.PathAction; * import net.adamcin.oakpal.api.SlingSimulator; * import net.adamcin.oakpal.api.SlingInstallable; * import net.adamcin.oakpal.api.EmbeddedPackageInstallable; */ /*** * Optionally implement this function to return a label for your check. */ /* function getCheckName() { return "ACME Example Check"; } */ /** * Override this method to accept a SlingSimulator to request installation of JCR resources like * FileVault packages and RepositoryInitializer factory configs, as if running within a Sling repository instance. * <p> * Also provided are the set of simulated Sling Run Modes. These are intended to drive construction of JCR path * patterns to select embedded resources for installation upon receiving a matching * importedPath(PackageId, String, Node, PathAction) event, but these run modes may also be * used as a global configuration hint for progress checks that support modal behavior outside of their explicit * JSON config format. NOTE: this set will always be empty by default, and must be populated in the plan or * overridden at runtime in the execution layer. * * @param slingSimulator the sling simulator * @param runModes the simulated sling run modes * @since 2.2.0 */ function simulateSling(slingSimulator /* SlingSimulator */, runModes /* String[] */) { } /** * Called once at the beginning of the scan. */ function startedScan() { } /** * Called after the package is uploaded to the package manager at the beginning of the scan. Track subsequent * events using the package ID provided to this method. * * @param packageId the package ID of the newly opened package * @param file the package file that will be opened */ function identifyPackage(packageId /* PackageId */, file /* File */) { } /** * Called after each subpackage is opened. Track subsequent events using the package ID provided to this method. * * @param packageId the package ID of the newly opened subpackage * @param parentId the package ID of the parent package. */ function identifySubpackage(packageId /* PackageId */, parentId /* PackageId */) { } /** * Called when a package has a jar manifest that can be read for additional metadata, like Export-Package. * * @param packageId the package ID of the newly opened package * @param manifest the parsed manifest * @since 1.3.0 */ function readManifest(packageId /* PackageId */, manifest /* Manifest */) { } /** * Called for each package before it is extracted. * * @param packageId the package ID of the newly opened package * @param inspectSession session providing access to repository state * @param packageProperties the package properties * @param metaInf the package meta information * @param subpackages extracted subpackages */ function beforeExtract(packageId /* PackageId */, inspectSession /* Session */, packageProperties /* PackageProperties */, metaInf /* MetaInf */, subpackages /* PackageId[] */) { } /** * Notified when package importer adds, modifies, or leaves a node untouched. * * @param packageId the current package * @param path the imported path * @param node the imported JCR node * @param action the import action (NOOP, ADDED, MODIFIED, or REPLACED) */ function importedPath(packageId /* PackageId */, path /* String */, node /* Node */, action /* PathAction */) { } /** * Notified when package importer deletes an existing node. * * @param packageId the current package * @param path deleted path * @param inspectSession session providing access to repository state */ function deletedPath(packageId /* PackageId */, path /* String */, inspectSession /* Session */) { } /** * Provides an opportunity to inspect repository state between packages. * * @param packageId the current package * @param inspectSession session providing access to repository state */ function afterExtract(packageId /* PackageId */, inspectSession /* Session */) { } /** * Provides an opportunity to inspect repository state before installing a resource submitted to the * SlingSimulator. * * @param scanPackageId the last preinstall or scan package * @param slingInstallable the sling installable * @param inspectSession session providing access to repository state * @since 2.2.0 */ function beforeSlingInstall(scanPackageId /* PackageId */, slingInstallable /* SlingInstallable */, inspectSession /* Session */) { } /** * Called after each embedded package is opened, if it has been submitted to the SlingSimulator. Track * subsequent events using the package ID provided to this method. Conceptually, at least for the purposes of * enforcing acceptance criteria against packaged JCR content, this is analogous to * identifySubpackage(packageId, parentId). * * @param packageId the embedded package id * @param parentPackageId the parent packageId * @param slingInstallable the embedded package slingInstallable that was previously provided to the * beforeSlingInstall() event. * @since 2.2.0 */ function identifyEmbeddedPackage(packageId /* PackageId */, parentPackageId /* PackageId */, slingInstallable /* EmbeddedPackageInstallable */) { } /** * Provides an opportunity to inspect repository state after installing a RepoInit scripts resource submitted to the * SlingSimulator. * * @param scanPackageId the last preinstall or scan package * @param scripts the repoinit scripts that were applied * @param slingInstallable the associated SlingInstallable identifying the source JCR event that provided * the repo init scripts * @param inspectSession session providing access to repository state * @since 2.2.0 */ function appliedRepoInitScripts(scanPackageId /* PackageId */, scripts /* String[] */, slingInstallable /* SlingInstallable */, inspectSession /* Session */) { } /** * Provides an opportunity to inspect repository state after complete installation (including its content, * subpackages, and Sling installable paths) of a package explicitly listed for scanning. This method is NOT called * for any of its subpackages or embedded packages. * * @param scanPackageId the scanned package id * @param inspectSession session providing access to repository state * @since 2.2.0 */ function afterScanPackage(scanPackageId /* PackageId */, inspectSession /* Session */) { } /** * Called once at the end of the scan. */ function finishedScan() { }
Add the path to the file as a <checks>/<check>/<impl> parameter to your oakpal-maven-plugin configuration with the path to the file.
<plugin> <groupId>net.adamcin.oakpal</groupId> <artifactId>oakpal-maven-plugin</artifactId> <version>2.2.2</version> <configuration> <checks> <check> <impl>[your-script-filename]</impl> </check> </checks> </configuration> <executions> <execution> <goals> <goal>scan</goal> </goals> </execution> </executions> </plugin>