Is there a hook present to fire actions on a project scan that identifies changes?
I have a module that is compiling some side-content in a gateway that depends on certain resources, and I dont really want to setup a custom thing to watch those resources, but ideally to just leverage a pre-existing hook that sees new resources.
Ideal state would be this:
- Project Scan Starts
- Project Scan identifies 3 new resources
- Project Scan does whatever it needs to do to the resources
- Project Scan finishes that, and fires said mystery
OnProjectScanCompleteHook
- Said hook gives me a list of resources that were just identified, and I can go on about my business with them.
I have dug around in the javadocs and haven't found anything yet that could mirror this setup.
Not exactly like you're asking for, but you'll probably want to look at 3 things:
ProjectManagerBase::addProjectListener
and ::removeProjectListener
(ProjectManagerBase)
Project::addProjectResourceListener
and ::removeProjectResourceListener
(Project)
ProjectLifecycle
and ProjectLifecycleFactory
, which are things you can use to not deal with the "raw" listeners and instead just get notified when resources you're interested in get created/updated/deleted. (ProjectLifecycle and ProjectLifecycleFactory)
1 Like
Here's a fairly simple example of what implementing a ProjectLifecycle and ProjectLifecycleFactory look like:
private static final ResourceFilter PIPELINE_RESOURCE_FILTER = new ResourceFilter(
ApplicationScope.GATEWAY,
Collections.singletonList(PipelineDescriptor.RESOURCE_TYPE));
private class PipelineLifecycleFactory extends ProjectLifecycleFactory<PipelineLifecycle> {
PipelineLifecycleFactory(ProjectManager projectManager) {
super(projectManager);
}
@Override
public PipelineLifecycle createProjectLifecycle(RuntimeProject project) {
return new PipelineLifecycle(project);
}
@Override
protected ResourceFilter getResourceFilter() {
return PIPELINE_RESOURCE_FILTER;
}
@Override
public Predicate<RuntimeProject> getProjectFilter() {
return project -> project.hasResourcesOfType(PipelineDescriptor.RESOURCE_TYPE);
}
}
private class PipelineLifecycle extends ProjectLifecycle {
PipelineLifecycle(RuntimeProject project) {
super(project);
}
@Override
protected void onStartup(List<ProjectResource> resources) {
startPipelinesFromResources(resources);
}
@Override
protected void onShutdown(List<ProjectResourceId> resourceIds) {
retirePipelinesFromResources(resourceIds);
}
@Override
protected void onResourcesCreated(List<ProjectResource> resources) {
startPipelinesFromResources(resources);
}
@Override
protected void onResourcesModified(List<ProjectResource> resources) {
// Modifications to a pipeline are basically stop the old one and start a new one.
// startPipelinesFromResources() will retire an existing pipeline before starting
// an updated pipeline.
startPipelinesFromResources(resources);
}
@Override
protected void onResourcesDeleted(List<ProjectResourceId> resourceIds) {
retirePipelinesFromResources(resourceIds);
}
}
Elsewhere the factory gets instantiated and startup()
is called on it, then eventually shutdown()
.
You may just want the listeners if you don't care about the lifecycle of the project as well as the resources.
2 Likes
This is perfect!
Thanks, I will try it out.