package edu.asu.spring.quadriga.web.search; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import edu.asu.spring.quadriga.conceptpower.IConceptpowerConnector; import edu.asu.spring.quadriga.domain.enums.EProjectAccessibility; import edu.asu.spring.quadriga.domain.enums.ETextAccessibility; import edu.asu.spring.quadriga.domain.impl.ConceptpowerReply; import edu.asu.spring.quadriga.domain.impl.ConceptpowerReply.ConceptEntry; import edu.asu.spring.quadriga.domain.impl.networks.CreationEvent; import edu.asu.spring.quadriga.domain.impl.networks.ElementEventsType; import edu.asu.spring.quadriga.domain.workbench.IProject; import edu.asu.spring.quadriga.domain.workspace.ITextFile; import edu.asu.spring.quadriga.qstore.IMarshallingService; import edu.asu.spring.quadriga.qstore.IQStoreConnector; import edu.asu.spring.quadriga.service.network.IJsonCreator; import edu.asu.spring.quadriga.service.network.INetworkTransformationManager; import edu.asu.spring.quadriga.service.network.domain.ITransformedNetwork; import edu.asu.spring.quadriga.service.textfile.ITextFileManager; import edu.asu.spring.quadriga.service.workbench.IRetrieveProjectManager; import edu.asu.spring.quadriga.web.network.INetworkStatus; @Controller public class TextConceptSearchController { @Autowired private IConceptpowerConnector conceptpowerConnector; @Autowired private IQStoreConnector qStoreConnector; @Autowired private IMarshallingService marshallingService; @Autowired private ITextFileManager textFileManager; @Autowired private IRetrieveProjectManager projectManager; @Autowired private INetworkTransformationManager transformationManager; @Autowired private IJsonCreator jsonCreator; @RequestMapping(value = "search/texts") public String search(@RequestParam(defaultValue = "") String conceptId, Model model) throws Exception { String conceptUri = conceptId; if (!conceptId.isEmpty()) { ConceptpowerReply reply = conceptpowerConnector.getById(conceptId); List<ConceptEntry> entries = reply.getConceptEntry(); ConceptEntry entry = null; if (entries != null && !entries.isEmpty()) { entry = entries.get(0); entry.setId(conceptUri); } if (conceptId.startsWith("http://")) { int lastIdx = conceptId.lastIndexOf("/"); conceptId = conceptId.substring(lastIdx + 1); } String results = qStoreConnector.searchNodesByConcept(conceptId); if (results != null && !results.isEmpty()) { ElementEventsType events = marshallingService.unMarshalXmlToElementEventsType(results); List<CreationEvent> eventList = events.getRelationEventOrAppellationEvent(); if (entry.getWordnetId() != null && !entry.getWordnetId().isEmpty()) { results = qStoreConnector.searchNodesByConcept(entry.getWordnetId()); events = marshallingService.unMarshalXmlToElementEventsType(results); eventList.addAll(events.getRelationEventOrAppellationEvent()); } Set<String> references = new HashSet<String>(); List<ITextFile> texts = new ArrayList<ITextFile>(); List<String> handles = new ArrayList<String>(); for (CreationEvent event : eventList) { String sourceRef = event.getSourceReference(); // if we haven't seen the reference yet if (references.add(sourceRef)) { ITextFile txtFile = textFileManager.getTextFileByUri(sourceRef); if (txtFile == null || txtFile.getAccessibility() == ETextAccessibility.PRIVATE) { handles.add(sourceRef); } else { if (txtFile.getAccessibility() == ETextAccessibility.PUBLIC) { texts.add(txtFile); textFileManager.loadFile(txtFile); txtFile.setSnippetLength(40); } } } } model.addAttribute("references", handles); model.addAttribute("texts", texts); List<IProject> projects = projectManager.getProjectListByAccessibility(EProjectAccessibility.PUBLIC); List<String> projectIds = new ArrayList<String>(); projects.forEach(p -> projectIds.add(p.getProjectId())); ITransformedNetwork transformedNetwork = transformationManager .getSearchTransformedNetworkMultipleProjects(projectIds, conceptUri, INetworkStatus.APPROVED); String json = null; if (transformedNetwork != null) { json = jsonCreator.getJson(transformedNetwork.getNodes(), transformedNetwork.getLinks()); } if (transformedNetwork == null || transformedNetwork.getNodes().size() == 0) { model.addAttribute("isNetworkEmpty", true); } model.addAttribute("jsonstring", json); } model.addAttribute("concept", entry); } return "search/texts"; } }