Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 5 additions & 57 deletions src/main/java/com/knowledgepixels/nanodash/NanodashSession.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package com.knowledgepixels.nanodash;

import com.knowledgepixels.nanodash.component.NanopubResults;
import com.knowledgepixels.nanodash.component.PublishForm;
import com.knowledgepixels.nanodash.domain.User;
import com.knowledgepixels.nanodash.page.OrcidLoginPage;
import com.knowledgepixels.nanodash.page.ProfilePage;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import jakarta.xml.bind.DatatypeConverter;
import org.apache.commons.io.FileUtils;
import org.apache.wicket.PageReference;
import org.apache.wicket.Session;
import org.apache.wicket.protocol.http.WebSession;
import org.apache.wicket.request.Request;
Expand All @@ -28,8 +28,6 @@
import java.nio.charset.StandardCharsets;
import java.security.KeyPair;
import java.util.Date;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
Expand Down Expand Up @@ -86,59 +84,6 @@ public NanodashSession(Request request) {

private Date lastTimeIntroPublished = null;

// We should store here some sort of form model and not the forms themselves, but I couldn't figure
// how to do it, so doing it like this for the moment...
private static final int MAX_FORMS = 20;
private final Map<String, PublishForm> formMap = Collections.synchronizedMap(new LinkedHashMap<>(16, 0.75f, true) {
@Override
protected boolean removeEldestEntry(Map.Entry<String, PublishForm> eldest) {
boolean evict = size() > MAX_FORMS;
if (evict) {
logger.info("Evicting form from session LRU (formobj={}, cap={})", eldest.getKey(), MAX_FORMS);
}
return evict;
}
});

/**
* Associates a form object with a specific ID.
*
* @param formObjId The ID of the form object.
* @param formObj The form object to associate.
*/
public void setForm(String formObjId, PublishForm formObj) {
formMap.put(formObjId, formObj);
}

/**
* Checks if a form object with the given ID exists.
*
* @param formObjId The ID of the form object.
* @return True if the form object exists, false otherwise.
*/
public boolean hasForm(String formObjId) {
return formMap.containsKey(formObjId);
}

/**
* Retrieves the form object associated with the given ID.
*
* @param formObjId The ID of the form object.
* @return The associated form object, or null if not found.
*/
public PublishForm getForm(String formObjId) {
return formMap.get(formObjId);
}

/**
* Removes the form object associated with the given ID.
*
* @param formObjId The ID of the form object to remove.
*/
public void removeForm(String formObjId) {
formMap.remove(formObjId);
}

/**
* Loads profile information for the user.
* Initializes user-related data such as keys and introductions.
Expand Down Expand Up @@ -499,18 +444,21 @@ public static class PreviewNanopub implements Serializable {
private final PageParameters pageParams;
private final Class<? extends WebPage> confirmPageClass;
private final boolean consentChecked;
private final PageReference sourcePageRef;

public PreviewNanopub(Nanopub nanopub, PageParameters pageParams, Class<? extends WebPage> confirmPageClass, boolean consentChecked) {
public PreviewNanopub(Nanopub nanopub, PageParameters pageParams, Class<? extends WebPage> confirmPageClass, boolean consentChecked, PageReference sourcePageRef) {
this.nanopub = nanopub;
this.pageParams = pageParams;
this.confirmPageClass = confirmPageClass;
this.consentChecked = consentChecked;
this.sourcePageRef = sourcePageRef;
}

public Nanopub getNanopub() { return nanopub; }
public PageParameters getPageParams() { return pageParams; }
public Class<? extends WebPage> getConfirmPageClass() { return confirmPageClass; }
public boolean isConsentChecked() { return consentChecked; }
public PageReference getSourcePageRef() { return sourcePageRef; }
}

private ConcurrentMap<String, PreviewNanopub> previewMap = new ConcurrentHashMap<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ public PublishForm(String id, final PageParameters pageParams, Class<? extends W
if (!assertionContext.getTemplateId().equals(latestAssertionId)) {
add(new Label("newversion", "There is a new version of this assertion template:"));
PageParameters params = new PageParameters(pageParams);
params.set("template", latestAssertionId).remove("formobj");
params.set("template", latestAssertionId);
add(new BookmarkablePageLink<Void>("newversionlink", publishPageClass, params));
if ("latest".equals(pageParams.get("template-version").toString())) {
throw new RestartResponseException(publishPageClass, params);
Expand Down Expand Up @@ -775,7 +775,7 @@ public void onSubmit() {
Nanopub signedNp = SignNanopub.signAndTransform(np, tc);
String previewId = signedNp.getUri().stringValue();
NanodashSession.get().setPreviewNanopub(previewId,
new NanodashSession.PreviewNanopub(signedNp, pageParams, confirmPageClass, Boolean.TRUE.equals(consentCheck.getModelObject())));
new NanodashSession.PreviewNanopub(signedNp, pageParams, confirmPageClass, Boolean.TRUE.equals(consentCheck.getModelObject()), getPage().getPageReference()));
throw new RestartResponseException(PreviewPage.class, new PageParameters().set("id", previewId));
} catch (RestartResponseException ex) {
throw ex;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
package com.knowledgepixels.nanodash.connector;

import com.knowledgepixels.nanodash.NanodashPageRef;
import com.knowledgepixels.nanodash.NanodashSession;
import com.knowledgepixels.nanodash.component.PublishForm;
import com.knowledgepixels.nanodash.component.TitleBar;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.html.basic.Label;
Expand All @@ -13,18 +11,12 @@
import org.apache.wicket.markup.html.link.ExternalLink;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.request.resource.PackageResourceReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Random;

/**
* Page for publishing a nanopublication.
*/
public class GenPublishPage extends ConnectorPage {

private static final Logger logger = LoggerFactory.getLogger(GenPublishPage.class);

/**
* Mount path for this page.
*/
Expand All @@ -47,7 +39,6 @@ public GenPublishPage(final PageParameters parameters) {
super(parameters);
add(new Label("pagetitle", getConfig().getJournalName() + ": Publish Nanopublication | nanodash"));

final NanodashSession session = NanodashSession.get();
PageParameters journalParam = new PageParameters().set("journal", getConnectorId());
add(new TitleBar("titlebar", this, "connectors",
new NanodashPageRef(GenOverviewPage.class, journalParam, getConfig().getJournalName()),
Expand All @@ -57,18 +48,8 @@ public GenPublishPage(final PageParameters parameters) {
add(new Image("logo", new PackageResourceReference(getConfig().getClass(), getConfig().getLogoFileName())));

if (parameters.get("template").toString() != null) {
if (!parameters.contains("formobj")) {
throw new RestartResponseException(getClass(), parameters.set("formobj", Math.abs(new Random().nextLong()) + ""));
}
parameters.set("template-version", "latest");
String formObjId = parameters.get("formobj").toString();
if (!session.hasForm(formObjId)) {
logger.warn("Form object not found in session (formobj={}, template={}); creating new form",
formObjId, parameters.get("template"));
PublishForm publishForm = new PublishForm("form", parameters, getClass(), GenConnectPage.class);
session.setForm(formObjId, publishForm);
}
add(session.getForm(formObjId));
add(new PublishForm("form", parameters, getClass(), GenConnectPage.class));
} else {
throw new RuntimeException("no template parameter");
}
Expand Down
14 changes: 9 additions & 5 deletions src/main/java/com/knowledgepixels/nanodash/page/PreviewPage.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
import com.knowledgepixels.nanodash.domain.IndividualAgent;
import com.knowledgepixels.nanodash.repository.MaintainedResourceRepository;
import com.knowledgepixels.nanodash.repository.SpaceRepository;
import org.apache.wicket.Page;
import org.apache.wicket.PageReference;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
Expand Down Expand Up @@ -72,10 +74,6 @@ protected void onSubmit() {
logger.info("Nanopublication published from preview: {}", npUrl);
Utils.cacheNanopub(signedNp);
NanodashSession.get().removePreviewNanopub(previewId);
String formObjId = pageParams.get("formobj").toString(null);
if (formObjId != null) {
NanodashSession.get().removeForm(formObjId);
}

if (!pageParams.get("refresh-upon-publish").isEmpty()) {
String toRefresh = pageParams.get("refresh-upon-publish").toString();
Expand Down Expand Up @@ -138,7 +136,13 @@ public void validate(IValidatable<Boolean> validatable) {
@Override
public void onSubmit() {
NanodashSession.get().removePreviewNanopub(previewId);
throw new RestartResponseException(PublishPage.class, new PageParameters(pageParams));
PageReference ref = preview.getSourcePageRef();
Page sourcePage = (ref != null) ? ref.getPage() : null;
if (sourcePage != null) {
setResponsePage(sourcePage);
} else {
throw new RestartResponseException(PublishPage.class, new PageParameters(pageParams));
}
}
};
discardButton.setDefaultFormProcessing(false);
Expand Down
21 changes: 2 additions & 19 deletions src/main/java/com/knowledgepixels/nanodash/page/PublishPage.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,17 @@
import com.knowledgepixels.nanodash.component.PublishForm;
import com.knowledgepixels.nanodash.component.TemplateList;
import com.knowledgepixels.nanodash.component.TitleBar;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Random;

/**
* The PublishPage class is responsible for rendering the application's publish page.
* It allows users to publish content based on templates and manage forms.
*/
public class PublishPage extends NanodashPage {

private static final Logger logger = LoggerFactory.getLogger(PublishPage.class);

/**
* The mount path for the PublishPage.
*/
Expand All @@ -41,7 +34,7 @@ public String getMountPath() {
/**
* Constructs a new PublishPage with the given parameters.
*
* @param parameters The parameters for the page, which may include template and form object identifiers.
* @param parameters The parameters for the page, which may include a template identifier.
*/
public PublishPage(final PageParameters parameters) {
super(parameters);
Expand All @@ -53,17 +46,7 @@ public PublishPage(final PageParameters parameters) {
if (!parameters.get("sigkey").isNull() && !parameters.get("sigkey").toString().equals(session.getPubkeyString())) {
add(new DifferentKeyErrorItem("form", parameters));
} else {
if (!parameters.contains("formobj")) {
throw new RestartResponseException(getClass(), parameters.set("formobj", Math.abs(new Random().nextLong()) + ""));
}
String formObjId = parameters.get("formobj").toString();
if (!session.hasForm(formObjId)) {
logger.warn("Form object not found in session (formobj={}, template={}); creating new form",
formObjId, parameters.get("template"));
PublishForm publishForm = new PublishForm("form", parameters, getClass(), ExplorePage.class);
session.setForm(formObjId, publishForm);
}
add(session.getForm(formObjId));
add(new PublishForm("form", parameters, getClass(), ExplorePage.class));
}
add(new Label("templatelist").setVisible(false));
} else {
Expand Down