package edu.asu.spring.quadriga.web.publicwebsite;
import java.security.Principal;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import edu.asu.spring.quadriga.aspects.annotations.CheckAccess;
import edu.asu.spring.quadriga.aspects.annotations.CheckPublicAccess;
import edu.asu.spring.quadriga.aspects.annotations.InjectProject;
import edu.asu.spring.quadriga.aspects.annotations.InjectProjectByName;
import edu.asu.spring.quadriga.aspects.annotations.ProjectIdentifier;
import edu.asu.spring.quadriga.domain.projectblog.IProjectBlogEntry;
import edu.asu.spring.quadriga.domain.workbench.IProject;
import edu.asu.spring.quadriga.domain.workbench.IPublicPage;
import edu.asu.spring.quadriga.exceptions.QuadrigaStorageException;
import edu.asu.spring.quadriga.service.network.ID3Creator;
import edu.asu.spring.quadriga.service.network.INetworkManager;
import edu.asu.spring.quadriga.service.network.INetworkTransformationManager;
import edu.asu.spring.quadriga.service.projectblog.IProjectBlogEntryManager;
import edu.asu.spring.quadriga.service.publicwebsite.IPublicPageBlockLinkTargets;
import edu.asu.spring.quadriga.service.workbench.IPublicPageManager;
import edu.asu.spring.quadriga.service.workbench.IRetrieveProjectManager;
/**
* This controller has all the mappings required to view the external website of
* a project, view all the networks in that project and visualize the networks
*
* @author Sayalee Mehendale
*
*/
@PropertySource(value = "classpath:/settings.properties")
@Controller
public class WebsiteProjectController {
@Autowired
private Environment env;
@Autowired
private IPublicPageManager publicPageManager;
@Autowired
private IProjectBlogEntryManager projectBlogEntryManager;
private static final int WORD_COUNT = 30;
/**
* This method displays the public or external Website for the particular
* project
*
* If the project has been set to 'accessible', then the public website page
* is displayed. If the project does not exist then an error page is shown.
*
* @param unixName
* unix name that is given to the project at the time of its
* creation
* @param model
* Model object to map values to view
* @return returns a string to access the external website main page
* @throws QuadrigaStorageException
* Database storage exception thrown
*/
@CheckPublicAccess
@InjectProjectByName
@RequestMapping(value = "sites/{ProjectUnixName}", method = RequestMethod.GET)
public String showProject(Model model, @ProjectIdentifier @PathVariable("ProjectUnixName") String unixName,
Principal principal, @CheckAccess @InjectProject IProject project) throws QuadrigaStorageException {
model.addAttribute("project_baseurl", env.getProperty("project.cite.baseurl"));
List<IPublicPage> publicPages = publicPageManager.retrievePublicPageContent(project.getProjectId());
Collections.sort(publicPages, new Comparator<IPublicPage>() {
@Override
public int compare(IPublicPage o1, IPublicPage o2) {
return o1.getOrder() - o2.getOrder();
}
});
Map<String, String> linkToMap = getLinkTargetMap();
publicPages.forEach(item -> item.setLinkTo(linkToMap.get(item.getLinkTo())));
// Fetch blog entries for a project identified by project unix name
List<IProjectBlogEntry> latestProjectBlogEntryList = projectBlogEntryManager.getProjectBlogEntryList(project.getProjectId(),
1);
if (latestProjectBlogEntryList.size() > 0 ) {
model.addAttribute("latestProjectBlogEntry", latestProjectBlogEntryList.get(0));
model.addAttribute("latestProjectBlogEntrySnippet",latestProjectBlogEntryList.get(0).getSnippet(WORD_COUNT));
}
model.addAttribute("blocks", publicPages);
model.addAttribute("project", project);
return "sites/website";
}
/*
* This is kind of ugly and should be replaced with a better solution. But
* well, it works.
*/
private Map<String, String> getLinkTargetMap() {
Map<String, String> linkTypes = new HashMap<String, String>();
linkTypes.put(IPublicPageBlockLinkTargets.ABOUT, "about");
linkTypes.put(IPublicPageBlockLinkTargets.BLOG, "projectBlog");
linkTypes.put(IPublicPageBlockLinkTargets.BROWSE, "browsenetworks");
linkTypes.put(IPublicPageBlockLinkTargets.EXPLORE, "networks");
linkTypes.put(IPublicPageBlockLinkTargets.SEARCH, "search");
linkTypes.put(IPublicPageBlockLinkTargets.STATS, "statistics");
return linkTypes;
}
}