Skip to content

Commit

Permalink
Made resource http scanning configurable
Browse files Browse the repository at this point in the history
  • Loading branch information
Willem Elbers committed Mar 31, 2022
1 parent ddf8717 commit a88f9b0
Show file tree
Hide file tree
Showing 6 changed files with 97 additions and 41 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,6 @@ public interface VcrConfig {
public Locale getLocale();
public void logConfig();
public boolean isForkingEnabled();

public boolean isHttpReferenceScanningEnabled();
}
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,9 @@ public class VcrConfigImpl implements VcrConfig {
@Value("${eu.clarin.cmdi.vcr.forking.enabled:false}")
private boolean forkingEnabled;

@Value("${eu.clarin.cmdi.vcr.reference_scanning.enabled:false}")
private boolean referenceScanningEnabled;

private String getEndpointWithoutTrailingSlash(String endpoint) {
if(endpoint == null) {
return null;
Expand Down Expand Up @@ -142,6 +145,11 @@ public boolean isForkingEnabled() {
return forkingEnabled;
}

@Override
public boolean isHttpReferenceScanningEnabled() {
return referenceScanningEnabled;
}

@Override
public void logConfig() {
logger.info("Configuration:");
Expand All @@ -154,5 +162,9 @@ public void logConfig() {
logger.info(" Download integration:");
logger.info(" downloadEndpoint: {}", downloadEndpoint);
logger.info(" downloadEnable: {}", downloadEnable);
logger.info(" Reference scanning: {}", referenceScanningEnabled);
if(referenceScanningEnabled) {
// logger.info(" downloadEnable: {}", downloadEnable);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ public class BasePage extends WebPage {
private PiwikConfig piwikConfig;

@SpringBean
private VcrConfig vcrConfig;
protected VcrConfig vcrConfig;

public static final String BETA_MODE = "eu.clarin.cmdi.virtualcollectionregistry.beta_mode";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ public void handleEvent(final Event event) {
});
add(modal);

final CreateAndEditPanel crud = new CreateAndEditPanel("create_and_edit_panel", modal);
final CreateAndEditPanel crud = new CreateAndEditPanel("create_and_edit_panel", modal, vcrConfig);
crud.addListener(new Listener<VirtualCollection>() {
@Override
public void handleEvent(Event<VirtualCollection> event) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.util.*;

import eu.clarin.cmdi.virtualcollectionregistry.config.VcrConfig;
import eu.clarin.cmdi.virtualcollectionregistry.gui.ApplicationSession;
import eu.clarin.cmdi.virtualcollectionregistry.gui.pages.crud.v2.editor.editors.ActionablePanel;
import eu.clarin.cmdi.virtualcollectionregistry.gui.pages.crud.v2.editor.editors.authors.AuthorsEditor;
Expand Down Expand Up @@ -83,8 +84,8 @@ public static enum Mode {
* @param id
* @param dialog
*/
public CreateAndEditPanel(String id, ModalConfirmDialog dialog) {
this(id, null, dialog);
public CreateAndEditPanel(String id, ModalConfirmDialog dialog, VcrConfig vcrConfig) {
this(id, null, dialog, vcrConfig);
}

/**
Expand All @@ -95,7 +96,7 @@ public CreateAndEditPanel(String id, ModalConfirmDialog dialog) {
* @param collection
* @param dialog
*/
public CreateAndEditPanel(String id, VirtualCollection collection, ModalConfirmDialog dialog) {
public CreateAndEditPanel(String id, VirtualCollection collection, ModalConfirmDialog dialog, VcrConfig vcrConfig) {
super(id);
//this.dialog = dialog;
this.setOutputMarkupId(true);
Expand Down Expand Up @@ -231,7 +232,7 @@ public void handleEvent(Event event) {
this.authorsEditor = new AuthorsEditor("authors", "Authors");
addRequiredField(this.authorsEditor, new Mode[]{Mode.SIMPLE, Mode.ADVANCED});

this.referencesEditor = new ReferencesEditor("references", "Resources", advancedEditorModeModel, vExtensional);
this.referencesEditor = new ReferencesEditor("references", "Resources", advancedEditorModeModel, vExtensional, vcrConfig);
addRequiredField(this.referencesEditor, new Mode[]{Mode.SIMPLE, Mode.ADVANCED});

addOptionalField(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import eu.clarin.cmdi.virtualcollectionregistry.config.VcrConfig;
import eu.clarin.cmdi.virtualcollectionregistry.gui.HandleLinkModel;
import eu.clarin.cmdi.virtualcollectionregistry.gui.pages.crud.v2.editor.CreateAndEditPanel;
import eu.clarin.cmdi.virtualcollectionregistry.gui.pages.crud.v2.editor.editors.CancelEventHandler;
Expand Down Expand Up @@ -70,19 +71,70 @@
public class ReferencesEditor extends ComposedField {
private static Logger logger = LoggerFactory.getLogger(ReferencesEditor.class);

//private final List<ReferenceJob> references = Collections.synchronizedList(new ArrayList<ReferenceJob>());//new CopyOnWriteArrayList<>();

private final JobManager jobs = new JobManager();
private final JobManager jobs;

private class JobManager implements IModel<List<ReferenceJob>>, Serializable {
private Logger logger = LoggerFactory.getLogger(JobManager.class);

private final List<ReferenceJob> jobs = Collections.synchronizedList(new ArrayList<ReferenceJob>());

private Worker worker;

private final VcrConfig vcrConfig;

public JobManager(VcrConfig vcrConfig) {
this.vcrConfig = vcrConfig;
}

private void startWorker() {
if(vcrConfig.isHttpReferenceScanningEnabled()) {
if (worker == null) {
worker = new Worker(this);
}

if (!worker.isRunning()) {
worker.start();
new Thread(worker).start();
logger.debug("Reference validation worker thread started");
} else {
logger.debug("Reference validation worker thread already running");
}
}
}

private void stop() {
if(worker != null) {
worker.stop();
}
}

public synchronized void add(ReferenceJob job) {
this.jobs.add(job);
startWorker();
}

public synchronized void addAll(List<ReferenceJob> jobs) {
this.jobs.addAll(jobs);
startWorker();
}

private State getResourceInitialState() {
if(vcrConfig.isHttpReferenceScanningEnabled()) {
return State.INITIALIZED;
}
return State.DONE;
}

public synchronized void addResource(Resource r) {
this.jobs.add(new ReferenceJob(r, getResourceInitialState()));
startWorker();
}

public synchronized void addAllResources(List<Resource> resources) {
for(Resource r : resources) {
jobs.add(new ReferenceJob(r, getResourceInitialState()));
}
startWorker();
}

public List<ReferenceJob> getJobs() {
Expand All @@ -91,6 +143,7 @@ public List<ReferenceJob> getJobs() {

public synchronized void updateJobState(int index, State state) {
jobs.get(index).setState(state);
logger.trace("job idx={}, ref={}, state={}", index, jobs.get(index).getReference().getRef(), jobs.get(index).getState());
}

public boolean isEmpty() {
Expand Down Expand Up @@ -120,6 +173,11 @@ public void sort() {

@Override
public List<ReferenceJob> getObject() {
logger.trace("getObject (size={})", jobs.size());
for(int i = 0; i < jobs.size(); i++) {
ReferenceJob job = jobs.get(i);
logger.trace(" job idx={}, ref={}, state={}", i, job.getReference().getRef(), job.getState());
}
return getJobs();
}

Expand All @@ -138,9 +196,7 @@ public void detach() {

final Label lblNoReferences;
final ListView listview;

private Worker worker;// = new Worker();


private int edit_index = -1;

private final ReferenceEditor editor;
Expand Down Expand Up @@ -188,8 +244,9 @@ public String getErrorMessage() {
}
}

public ReferencesEditor(String id, String label, Model<Boolean> advancedEditorMode, VisabilityUpdater updater) {
public ReferencesEditor(String id, String label, Model<Boolean> advancedEditorMode, VisabilityUpdater updater, VcrConfig vcrConfig) {
super(id, "References", null, updater);
this.jobs = new JobManager(vcrConfig);
setOutputMarkupId(true);
Component componentToUpdate = this;

Expand Down Expand Up @@ -263,7 +320,7 @@ public void handleCancelEvent(AjaxRequestTarget target) {
@Override
protected void populateItem(ListItem item) {
ReferenceJob ref = (ReferenceJob)item.getModel().getObject();
logger.debug("List ref={}, state={}", ref.getReference().getRef(), ref.getState());
logger.trace("List ref={}, state={}", ref.getReference().getRef(), ref.getState());
ReferencePanel c = new ReferencePanel("pnl_reference", ref, advancedEditorMode, getMaxDisplayOrder());
c.addMoveListEventHandler(new MoveListEventHandler() {
@Override
Expand Down Expand Up @@ -403,8 +460,8 @@ public void onBeforeRender() {
*/
@Override
protected void onRemove() {
logger.info("Removing Reference editor");
worker.stop();
logger.trace("Removing Reference editor");
jobs.stop();
}

@Override
Expand All @@ -417,14 +474,14 @@ public boolean completeSubmit(AjaxRequestTarget target) {
if(handleUrl(value)) {
Resource r = new Resource(Resource.Type.RESOURCE, value, title);
r.setDisplayOrder(getNextDisplayOrder());
jobs.add(new ReferenceJob(r));
jobs.addResource(r);
data.setObject("");
mdlReferenceTitle.setObject("");
} else if(handlePid(value)) {
String actionableValue = HandleLinkModel.getActionableUri(value);
Resource r = new Resource(Resource.Type.RESOURCE, actionableValue, title);
r.setDisplayOrder(getNextDisplayOrder());
jobs.add(new ReferenceJob(r));
jobs.addResource(r);
data.setObject("");
mdlReferenceTitle.setObject("");
} else {
Expand All @@ -434,8 +491,6 @@ public boolean completeSubmit(AjaxRequestTarget target) {
return false;
}

startWorker();

fireEvent(new DataUpdatedEvent(target));

if(target != null) {
Expand All @@ -446,20 +501,6 @@ public boolean completeSubmit(AjaxRequestTarget target) {
}
return false;
}

private void startWorker() {
if(worker == null) {
worker = new Worker(jobs);
}

if( !worker.isRunning()) {
worker.start();
new Thread(worker).start();
logger.debug("Reference validation worker thread started");
} else {
logger.debug("Reference validation worker thread already running");
}
}

private boolean handleUrl(String value) {
boolean result = false;
Expand Down Expand Up @@ -499,24 +540,24 @@ public List<Resource> getData() {
public void setData(List<Resource> data) {
logger.info("Set resource data: {} reference(s)", data.size());
jobs.clear();
for(Resource r : data) {
jobs.add(new ReferenceJob(r));
}
jobs.addAllResources(data);
lblNoReferences.setVisible(jobs.isEmpty());
listview.setVisible(!jobs.isEmpty());

startWorker();
}

public class ReferenceJob implements Serializable, Comparable{
private Resource ref;
protected State state;

public ReferenceJob(Resource ref) {
this(ref, State.INITIALIZED);
}

public ReferenceJob(Resource ref, State state) {
this.ref = ref;
this.state = State.INITIALIZED;
this.state = state;
}

public State getState() {
return this.state;
}
Expand Down

0 comments on commit a88f9b0

Please sign in to comment.