package br.ufrgs.inf.dsmoura.repository.controller.search;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.ajax4jsf.model.KeepAlive;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import br.ufrgs.inf.dsmoura.repository.controller.asset.NavigationMB;
import br.ufrgs.inf.dsmoura.repository.controller.solr.SolrConversionUtil;
import br.ufrgs.inf.dsmoura.repository.controller.util.JSFUtil;
import br.ufrgs.inf.dsmoura.repository.model.entity.ApplicationDomain;
import br.ufrgs.inf.dsmoura.repository.model.entity.ApplicationSubdomain;
import br.ufrgs.inf.dsmoura.repository.model.entity.Asset;
import br.ufrgs.inf.dsmoura.repository.model.entity.ConsumptionDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.DesignPatternDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.FunctionalRequirementDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.InterfaceSpecDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.InternationalizationTypeDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.NonFunctionalRequirementDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.OperationDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.OperationalSystemTypeDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.OrganizationDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.ProgrammingLanguageDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.ProjectDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.RelatedAsset;
import br.ufrgs.inf.dsmoura.repository.model.entity.SourceCodeDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.TestMethodTypeDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.TestTypeDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.UserDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.UserInterfaceDTO;
@KeepAlive
public class AdvancedSearchMB extends SearchMB {
private static final long serialVersionUID = 1L;
final Log logger = LogFactory.getLog(getClass());
private String advancedQuery;
private Asset asset;
private ApplicationDomain applicationDomainAux;
private ApplicationSubdomain applicationSubdomainAux;
private OrganizationDTO organizationDTOAux;
private ProjectDTO projectDTOAux;
private DesignPatternDTO designPatternDTOAux;
private ProgrammingLanguageDTO programmingLanguageDTOAux;
private InternationalizationTypeDTO internationalizationTypeDTOAux;
private TestMethodTypeDTO testMethodTypeDTOAux;
private TestTypeDTO testTypeDTOAux;
private OperationalSystemTypeDTO operationalSystemTypeDTOAux;
private RelatedAsset relatedAssetAux;
private InterfaceSpecDTO interfaceSpecDTOAUx;
private OperationDTO operationDTOAux;
private SourceCodeDTO sourceCodeDTOAux;
private UserInterfaceDTO userInterfaceDTOAux;
private FunctionalRequirementDTO functionalRequirementDTOAux;
private NonFunctionalRequirementDTO nonFunctionalRequirementDTOAux;
private UserDTO consumerUserDTOAux;
{
reinitSearch();
}
public String advancedSearch() {
super.reinitSearch();
prepareToAdvancedSearch();
try {
advancedSearchQuery();
}
catch(IllegalArgumentException iAE) {
FacesContext.getCurrentInstance().addMessage("termToSearchID", new FacesMessage("Enter the search terms."));
return clearResults();
}
return NavigationMB.ADVANCED_SEARCH;
}
/** @throws IllegalArgumentException */
private void advancedSearchQuery() {
this.advancedQuery = SolrConversionUtil.fromAssetToQuery(asset);
if (this.advancedQuery.trim().isEmpty()) {
throw new IllegalArgumentException("There are not search terms.");
}
this.saveUserQuery(advancedQuery);
searchTime = System.currentTimeMillis();
assetResultList = this.queryDismax(this.advancedQuery, indexCurrentStart, pageSize);
searchTime = System.currentTimeMillis() - searchTime;
}
public String newAdvancedSearch() {
reinitSearch();
return NavigationMB.ADVANCED_SEARCH;
}
public String nextPage() {
indexCurrentStart += pageSize;
advancedSearchQuery();
return "";
}
public String previousPage() {
indexCurrentStart -= pageSize;
advancedSearchQuery();
return "";
}
private void prepareToAdvancedSearch() {
/* Application Domains */
this.asset.getClassification().getApplicationSubdomains().clear();
if (applicationDomainAux != null &&
applicationSubdomainAux == null) {
ApplicationSubdomain applicationSubdomain = new ApplicationSubdomain();
applicationSubdomain.setApplicationDomain(applicationDomainAux);
this.asset.getClassification().getApplicationSubdomains().add(applicationSubdomain);
} else if (applicationSubdomainAux != null) {
this.asset.getClassification().getApplicationSubdomains().add(applicationSubdomainAux);
}
/* Projects */
this.asset.getClassification().getProjectDTOs().clear();
if (organizationDTOAux != null &&
projectDTOAux == null) {
ProjectDTO proj = new ProjectDTO();
proj.setOrganizationDTO(organizationDTOAux);
this.asset.getClassification().getProjectDTOs().add(proj);
} else if (projectDTOAux != null) {
this.asset.getClassification().getProjectDTOs().add(projectDTOAux);
}
/* Internationalization */
this.asset.getSolution().getRequirements().getInternationalizationTypeDTOs().clear();
if (internationalizationTypeDTOAux != null) {
this.asset.getSolution().getRequirements().getInternationalizationTypeDTOs().add(internationalizationTypeDTOAux);
}
/* Operational System */
this.asset.getSolution().getRequirements().getOperationalSystemTypeDTOs().clear();
if (operationalSystemTypeDTOAux != null) {
this.asset.getSolution().getRequirements().getOperationalSystemTypeDTOs().add(operationalSystemTypeDTOAux);
}
/* Programming Languages */
this.asset.getSolution().getImplementation().getProgrammingLanguageDTOs().clear();
if (programmingLanguageDTOAux != null) {
this.asset.getSolution().getImplementation().getProgrammingLanguageDTOs().add(programmingLanguageDTOAux);
}
/* Design Patterns */
this.asset.getSolution().getImplementation().getDesignPatternDTOs().clear();
if (designPatternDTOAux != null) {
this.asset.getSolution().getImplementation().getDesignPatternDTOs().add(designPatternDTOAux);
}
/* Test Type */
this.asset.getSolution().getTest().getTestTypeDTOs().clear();
if (testTypeDTOAux != null) {
this.asset.getSolution().getTest().getTestTypeDTOs().add(testTypeDTOAux);
}
/* Test Method Type */
this.asset.getSolution().getTest().getTestMethodTypeDTOs().clear();
if (testMethodTypeDTOAux != null) {
this.asset.getSolution().getTest().getTestMethodTypeDTOs().add(testMethodTypeDTOAux);
}
/* Related Assets */
this.asset.getRelatedAssets().clear();
if (relatedAssetAux != null) {
this.asset.getRelatedAssets().add(relatedAssetAux);
}
/* Interface Spec */
this.asset.getSolution().getDesign().getInterfaceSpecDTOs().clear();
if (interfaceSpecDTOAUx != null) {
this.asset.getSolution().getDesign().getInterfaceSpecDTOs().add(interfaceSpecDTOAUx);
if (operationDTOAux != null) {
this.asset.getSolution().getDesign().getInterfaceSpecDTOs().get(0).getOperationDTOs().add(operationDTOAux);
}
}
/* Source Code Type */
/* Software License */
this.asset.getSolution().getImplementation().getSourceCodeDTOs().clear();
if (sourceCodeDTOAux != null) {
this.asset.getSolution().getImplementation().getSourceCodeDTOs().add(sourceCodeDTOAux);
}
/* User Interface Type */
this.asset.getSolution().getImplementation().getUserInterfaceDTOs().clear();
if (userInterfaceDTOAux != null) {
this.asset.getSolution().getImplementation().getUserInterfaceDTOs().add(userInterfaceDTOAux);
}
/* Functional Requirement Type */
this.asset.getSolution().getRequirements().getFunctionalRequirementDTOs().clear();
if (functionalRequirementDTOAux != null) {
this.asset.getSolution().getRequirements().getFunctionalRequirementDTOs().add(functionalRequirementDTOAux);
}
/* Non Functional Requirement Type */
this.asset.getSolution().getRequirements().getNonFunctionalRequirementDTOs().clear();
if (nonFunctionalRequirementDTOAux != null) {
this.asset.getSolution().getRequirements().getNonFunctionalRequirementDTOs().add(nonFunctionalRequirementDTOAux);
}
/* Consumers */
this.asset.getUsage().getConsumptionDTOs().clear();
if (consumerUserDTOAux != null) {
ConsumptionDTO consumptionDTO = new ConsumptionDTO();
consumptionDTO.setConsumerUserDTO(consumerUserDTOAux);
this.asset.getUsage().getConsumptionDTOs().add(consumptionDTO);
}
}
protected void reinitSearch() {
super.reinitSearch();
this.advancedQuery = "";
this.asset = new Asset();
this.asset.getUsage().setAuthorUserDTO(new UserDTO());
this.asset.getUsage().setCertifierUserDTO(new UserDTO());
this.applicationDomainAux = new ApplicationDomain();
this.applicationSubdomainAux = new ApplicationSubdomain();
this.organizationDTOAux = new OrganizationDTO();
this.projectDTOAux = new ProjectDTO();
this.designPatternDTOAux = new DesignPatternDTO();
this.programmingLanguageDTOAux = new ProgrammingLanguageDTO();
this.internationalizationTypeDTOAux = new InternationalizationTypeDTO();
this.operationalSystemTypeDTOAux = new OperationalSystemTypeDTO();
this.testMethodTypeDTOAux = new TestMethodTypeDTO();
this.testTypeDTOAux = new TestTypeDTO();
this.relatedAssetAux = new RelatedAsset();
this.interfaceSpecDTOAUx = new InterfaceSpecDTO();
this.operationDTOAux = new OperationDTO();
this.sourceCodeDTOAux = new SourceCodeDTO();
this.userInterfaceDTOAux = new UserInterfaceDTO();
this.functionalRequirementDTOAux = new FunctionalRequirementDTO();
this.nonFunctionalRequirementDTOAux = new NonFunctionalRequirementDTO();
this.consumerUserDTOAux = new UserDTO();
}
public Boolean getHasSearched() {
if (this.advancedQuery.length() > 0) {
return true;
}
return false;
}
public String getResultsMessage() {
if (assetResultList.isEmpty()) {
return "Your search did not match any results.";
} else {
return assetResultList.size() + " results (" + getSearchTime() + " seconds)";
}
}
public List<SelectItem> getApplicationSubdomainList() {
if (applicationDomainAux == null) {
applicationDomainAux = new ApplicationDomain();
}
if ((applicationDomainAux.getApplicationSubdomains() == null) ||
(applicationDomainAux.getApplicationSubdomains().isEmpty())) {
List<SelectItem> list = new ArrayList<SelectItem>();
list.add(new SelectItem(null, "Select application domain."));
return list;
}
return JSFUtil.toSelectItem(applicationDomainAux.getApplicationSubdomains(), "name");
}
public List<SelectItem> getProjectDTOList() {
if (organizationDTOAux == null) {
organizationDTOAux = new OrganizationDTO();
}
if ((organizationDTOAux.getProjectDTOs() == null) ||
(organizationDTOAux.getProjectDTOs().isEmpty())) {
List<SelectItem> list = new ArrayList<SelectItem>();
list.add(new SelectItem(null, "Select organization."));
return list;
}
return JSFUtil.toSelectItem(organizationDTOAux.getProjectDTOs(), "name");
}
public Asset getAsset() {
return asset;
}
public void setAsset(Asset asset) {
this.asset = asset;
}
public ApplicationDomain getApplicationDomainAux() {
return applicationDomainAux;
}
public void setApplicationDomainAux(ApplicationDomain applicationDomainAux) {
this.applicationDomainAux = applicationDomainAux;
}
public ApplicationSubdomain getApplicationSubdomainAux() {
return applicationSubdomainAux;
}
public void setApplicationSubdomainAux(
ApplicationSubdomain applicationSubdomainAux) {
this.applicationSubdomainAux = applicationSubdomainAux;
}
public OrganizationDTO getOrganizationDTOAux() {
return organizationDTOAux;
}
public void setOrganizationDTOAux(OrganizationDTO organizationDTOAux) {
this.organizationDTOAux = organizationDTOAux;
}
public ProjectDTO getProjectDTOAux() {
return projectDTOAux;
}
public void setProjectDTOAux(ProjectDTO projectDTOAux) {
this.projectDTOAux = projectDTOAux;
}
public DesignPatternDTO getDesignPatternDTOAux() {
return designPatternDTOAux;
}
public void setDesignPatternDTOAux(DesignPatternDTO designPatternDTOAux) {
this.designPatternDTOAux = designPatternDTOAux;
}
public ProgrammingLanguageDTO getProgrammingLanguageDTOAux() {
return programmingLanguageDTOAux;
}
public void setProgrammingLanguageDTOAux(
ProgrammingLanguageDTO programmingLanguageDTOAux) {
this.programmingLanguageDTOAux = programmingLanguageDTOAux;
}
public InternationalizationTypeDTO getInternationalizationTypeDTOAux() {
return internationalizationTypeDTOAux;
}
public void setInternationalizationTypeDTOAux(
InternationalizationTypeDTO internationalizationTypeDTOAux) {
this.internationalizationTypeDTOAux = internationalizationTypeDTOAux;
}
public OperationalSystemTypeDTO getOperationalSystemTypeDTOAux() {
return operationalSystemTypeDTOAux;
}
public void setOperationalSystemTypeDTOAux(
OperationalSystemTypeDTO operationalSystemTypeDTOAux) {
this.operationalSystemTypeDTOAux = operationalSystemTypeDTOAux;
}
public TestMethodTypeDTO getTestMethodTypeDTOAux() {
return testMethodTypeDTOAux;
}
public void setTestMethodTypeDTOAux(TestMethodTypeDTO testMethodTypeDTOAux) {
this.testMethodTypeDTOAux = testMethodTypeDTOAux;
}
public TestTypeDTO getTestTypeDTOAux() {
return testTypeDTOAux;
}
public void setTestTypeDTOAux(TestTypeDTO testTypeDTOAux) {
this.testTypeDTOAux = testTypeDTOAux;
}
public RelatedAsset getRelatedAssetAux() {
return relatedAssetAux;
}
public void setRelatedAssetAux(RelatedAsset relatedAssetAux) {
this.relatedAssetAux = relatedAssetAux;
}
public InterfaceSpecDTO getInterfaceSpecDTOAUx() {
return interfaceSpecDTOAUx;
}
public void setInterfaceSpecDTOAUx(InterfaceSpecDTO interfaceSpecDTOAUx) {
this.interfaceSpecDTOAUx = interfaceSpecDTOAUx;
}
public OperationDTO getOperationDTOAux() {
return operationDTOAux;
}
public void setOperationDTOAux(OperationDTO operationDTOAux) {
this.operationDTOAux = operationDTOAux;
}
public SourceCodeDTO getSourceCodeDTOAux() {
return sourceCodeDTOAux;
}
public void setSourceCodeDTOAux(SourceCodeDTO sourceCodeDTOAux) {
this.sourceCodeDTOAux = sourceCodeDTOAux;
}
public UserInterfaceDTO getUserInterfaceDTOAux() {
return userInterfaceDTOAux;
}
public void setUserInterfaceDTOAux(UserInterfaceDTO userInterfaceDTOAux) {
this.userInterfaceDTOAux = userInterfaceDTOAux;
}
public FunctionalRequirementDTO getFunctionalRequirementDTOAux() {
return functionalRequirementDTOAux;
}
public void setFunctionalRequirementDTOAux(
FunctionalRequirementDTO functionalRequirementDTOAux) {
this.functionalRequirementDTOAux = functionalRequirementDTOAux;
}
public NonFunctionalRequirementDTO getNonFunctionalRequirementDTOAux() {
return nonFunctionalRequirementDTOAux;
}
public void setNonFunctionalRequirementDTOAux(
NonFunctionalRequirementDTO nonFunctionalRequirementDTOAux) {
this.nonFunctionalRequirementDTOAux = nonFunctionalRequirementDTOAux;
}
public UserDTO getConsumerUserDTOAux() {
return consumerUserDTOAux;
}
public void setConsumerUserDTOAux(UserDTO consumerUserDTOAux) {
this.consumerUserDTOAux = consumerUserDTOAux;
}
}