/*
* Copyright (c) 2013 Data Harmonisation Panel
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution. If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
* Data Harmonisation Panel <http://www.dhpanel.eu>
*/
package eu.esdihumboldt.hale.server.templates.war.pages;
import java.util.Iterator;
import javax.servlet.http.HttpServletResponse;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.link.ExternalLink;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.http.flow.AbortWithHttpErrorCodeException;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.util.string.StringValue;
import org.pegdown.Extensions;
import org.pegdown.PegDownProcessor;
import com.tinkerpop.blueprints.Direction;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.blueprints.impls.orient.OrientGraph;
import de.agilecoders.wicket.core.markup.html.bootstrap.components.PopoverConfig;
import de.agilecoders.wicket.core.markup.html.bootstrap.components.TooltipConfig.Placement;
import de.fhg.igd.slf4jplus.ALogger;
import de.fhg.igd.slf4jplus.ALoggerFactory;
import eu.esdihumboldt.hale.server.db.orient.DatabaseHelper;
import eu.esdihumboldt.hale.server.model.Template;
import eu.esdihumboldt.hale.server.model.User;
import eu.esdihumboldt.hale.server.templates.TemplateScavenger;
import eu.esdihumboldt.hale.server.templates.war.TemplateLocations;
import eu.esdihumboldt.hale.server.templates.war.components.DeleteTemplateLink;
import eu.esdihumboldt.hale.server.templates.war.components.ProjectURLPopover;
import eu.esdihumboldt.hale.server.templates.war.components.ResourcesPanel;
import eu.esdihumboldt.hale.server.webapp.components.bootstrap.HTMLPopoverBehavior;
import eu.esdihumboldt.hale.server.webapp.pages.BasePage;
import eu.esdihumboldt.hale.server.webapp.util.PageDescription;
import eu.esdihumboldt.hale.server.webapp.util.UserUtil;
import eu.esdihumboldt.util.blueprints.entities.NonUniqueResultException;
/**
* Page displaying a single template.
*
* @author Simon Templer
*/
@PageDescription(title = "Template Details")
public class TemplatePage extends BasePage {
private static final long serialVersionUID = 596965328223399419L;
private static final ALogger log = ALoggerFactory.getLogger(TemplatePage.class);
@SpringBean
private TemplateScavenger scavenger;
/**
* Default constructor.
*/
public TemplatePage() {
super();
}
/**
* Constructor.
*
* @param parameters the page parameters
*/
public TemplatePage(PageParameters parameters) {
super(parameters);
}
@SuppressWarnings("serial")
@Override
protected void addControls(boolean loggedIn) {
super.addControls(loggedIn);
StringValue idParam = getPageParameters().get(0);
if (!idParam.isNull() && !idParam.isEmpty()) {
String templateId = idParam.toString();
OrientGraph graph = DatabaseHelper.getGraph();
try {
Template template = null;
try {
template = Template.getByTemplateId(graph, templateId);
} catch (NonUniqueResultException e) {
log.error("Duplicate template representation: " + templateId, e);
}
if (template != null) {
// name
Label name = new Label("name", template.getName());
add(name);
// download
String href = TemplateLocations.getTemplateDownloadUrl(templateId);
ExternalLink download = new ExternalLink("download", href);
add(download);
// project location
WebMarkupContainer project = new WebMarkupContainer("project");
project.add(AttributeModifier.replace("value",
TemplateLocations.getTemplateProjectUrl(scavenger, templateId)));
add(project);
// author
Label author = new Label("author", template.getAuthor());
add(author);
// edit-buttons container
WebMarkupContainer editButtons = new WebMarkupContainer("edit-buttons");
editButtons.setVisible(false);
add(editButtons);
// deleteDialog container
WebMarkupContainer deleteDialog = new WebMarkupContainer("deleteDialog");
deleteDialog.setVisible(false);
add(deleteDialog);
// user
String userName;
Vertex v = template.getV();
boolean showEditPart = UserUtil.isAdmin();
Iterator<Vertex> owners = v.getVertices(Direction.OUT, "owner").iterator();
if (owners.hasNext()) {
User user = new User(owners.next(), graph);
userName = UserUtil.getDisplayName(user);
showEditPart = loggedIn && UserUtil.getLogin().equals(user.getLogin());
}
else {
userName = "Unregistered user";
}
// edit buttons
if (showEditPart) {
editButtons.setVisible(true);
deleteDialog.setVisible(true);
// edit
editButtons.add(new BookmarkablePageLink<>("edit", EditTemplatePage.class,
new PageParameters().set(0, templateId)));
// update
editButtons.add(new BookmarkablePageLink<>("update",
UpdateTemplatePage.class, new PageParameters().set(0, templateId)));
// delete
deleteDialog.add(new DeleteTemplateLink("delete", templateId));
}
Label user = new Label("user", userName);
add(user);
// description
String descr = template.getDescription();
String htmlDescr = null;
if (descr == null || descr.isEmpty()) {
descr = "No description for the project template available.";
}
else {
// convert markdown to
htmlDescr = new PegDownProcessor(Extensions.AUTOLINKS
| Extensions.SUPPRESS_ALL_HTML | Extensions.HARDWRAPS
| Extensions.SMARTYPANTS).markdownToHtml(descr);
}
// description in pre
Label description = new Label("description", descr);
description.setVisible(htmlDescr == null);
add(description);
// description in div
Label htmlDescription = new Label("html-description", htmlDescr);
htmlDescription.setVisible(htmlDescr != null);
htmlDescription.setEscapeModelStrings(false);
add(htmlDescription);
// invalid
WebMarkupContainer statusInvalid = new WebMarkupContainer("invalid");
statusInvalid.setVisible(!template.isValid());
add(statusInvalid);
// resources
ResourcesPanel resources = new ResourcesPanel("resources", templateId);
add(resources);
// project popover
WebMarkupContainer projectPopover = new WebMarkupContainer("project-popover");
projectPopover.add(new HTMLPopoverBehavior(Model.of("Load template in HALE"),
new PopoverConfig().withPlacement(Placement.bottom)) {
@Override
public Component newBodyComponent(String markupId) {
return new ProjectURLPopover(markupId);
}
});
add(projectPopover);
}
else {
throw new AbortWithHttpErrorCodeException(HttpServletResponse.SC_NOT_FOUND,
"Template not found.");
}
} finally {
graph.shutdown();
}
}
else
throw new AbortWithHttpErrorCodeException(HttpServletResponse.SC_BAD_REQUEST,
"Template identifier must be specified.");
}
/**
* @see eu.esdihumboldt.hale.server.webapp.pages.BasePage#renderHead(org.apache.wicket.markup.head.IHeaderResponse)
*/
@Override
public void renderHead(IHeaderResponse response) {
super.renderHead(response);
}
}