package br.ufrgs.inf.dsmoura.repository.controller.solr;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Scanner;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.lucene.index.Term;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.sax.BodyContentHandler;
import org.xml.sax.ContentHandler;
import br.ufrgs.inf.dsmoura.repository.controller.util.FieldsUtil;
import br.ufrgs.inf.dsmoura.repository.model.entity.AdjustmentDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.ApplicationSubdomain;
import br.ufrgs.inf.dsmoura.repository.model.entity.ArtifactDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.Artifactable;
import br.ufrgs.inf.dsmoura.repository.model.entity.Asset;
import br.ufrgs.inf.dsmoura.repository.model.entity.AssetSolrDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.ConsumptionDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.DescriptorGroupDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.DesignPatternDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.FreeFormDescriptorDTO;
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.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.TagDTO;
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.UseCaseDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.UserCommentDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.UserInterfaceDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.WsdlDTO;
public class SolrConversionUtil {
final static Log logger = LogFactory.getLog(SolrConversionUtil.class);
public static SolrInputDocument fromAssetToSolrInputDocument(Asset asset) {
/* ASSET */
SolrInputDocument doc = new SolrInputDocument();
addNotNull(doc, SolrField.ASSET_PK.getName(), asset.getAssetPk().toString());
addNotNull(doc, SolrField.ID.getName(), asset.getId());
addNotNull(doc, SolrField.NAME.getName(), asset.getName());
if (asset.getDate() != null) {
addNotNull(doc, SolrField.DATE.getName(), asset.getDate().getTime());
}
if (asset.getCreationDate() != null) {
addNotNull(doc, SolrField.CREATION_DATE.getName(), asset.getCreationDate().getTime());
}
if (asset.getType() != null) {
addNotNull(doc, SolrField.TYPE.getName(), asset.getType().getName());
if (FieldsUtil.isValidType(asset.getType()) &&
asset.getType().getName().equalsIgnoreCase("Other")) {
addNotNull(doc, SolrField.OTHER_TYPE.getName(), asset.getOtherType());
}
}
if (asset.getState() != null) {
addNotNull(doc, SolrField.STATE.getName(), asset.getState().getName());
}
if (asset.getSoftwareLicenseDTO() != null) {
addNotNull(doc, SolrField.SOFTWARE_LICENSE_ASSET.getName(), asset.getSoftwareLicenseDTO().getName());
if (FieldsUtil.isValidSoftwareLicense(asset.getSoftwareLicenseDTO()) &&
asset.getSoftwareLicenseDTO().getName().equalsIgnoreCase("Other")) {
addNotNull(doc, SolrField.OTHER_SOFTWARE_LICENSE_ASSET.getName(), asset.getOtherSoftwareLicense());
}
}
addNotNull(doc, SolrField.VERSION.getName(), asset.getVersion());
addNotNull(doc, SolrField.SHORT_DESCRIPTION.getName(), asset.getShortDescription());
addNotNull(doc, SolrField.DESCRIPTION.getName(), asset.getDescription());
/* USAGE */
addNotNull(doc, SolrField.USAGE_DESCRIPTION.getName(), asset.getUsage().getDescription());
addNotNull(doc, SolrField.AUTHOR_NAME.getName(), asset.getUsage().getAuthorUserDTO().getName());
addNotNull(doc, SolrField.AUTHOR_USERNAME.getName(), asset.getUsage().getAuthorUserDTO().getUsername());
Collection<String> authorsUsernames = FieldsUtil.extractUsernames(asset.getUsage().getCreatorUsername());
for (String authorUsername : authorsUsernames) {
addNotNull(doc, SolrField.AUTHOR_USERNAME.getName(), authorUsername);
}
addNotNull(doc, SolrField.CREATOR_NAME.getName(), asset.getUsage().getCreatorUsername());
if (asset.getUsage().getCertifierUserDTO() != null) {
addNotNull(doc, SolrField.CERTIFIER_USERNAME.getName(), asset.getUsage().getCertifierUserDTO().getUsername());
addNotNull(doc, SolrField.CERTIFIER_NAME.getName(), asset.getUsage().getCertifierUserDTO().getName());
}
if (asset.getUsage().getCertificationDate() != null) {
addNotNull(doc, SolrField.CERTIFICATION_DATE.getName(), asset.getUsage().getCertificationDate().getTime());
}
for (ConsumptionDTO consumptionDTO : asset.getUsage().getConsumptionDTOs()) {
addNotNull(doc, SolrField.CONSUMER_USERNAME.getName(), consumptionDTO.getConsumerUserDTO().getUsername());
addNotNull(doc, SolrField.CONSUMER_NAME.getName(), consumptionDTO.getConsumerUserDTO().getName());
}
for (AdjustmentDTO adjustmentDTO : asset.getUsage().getAdjustmentDTOs()) {
addNotNull(doc, SolrField.ADJUSTMENT_DESCRIPTION.getName(), adjustmentDTO.getDescription());
}
for (UserCommentDTO userCommentDTO : asset.getUsage().getUserCommentDTOs()) {
addNotNull(doc, SolrField.USER_COMMENT.getName(), userCommentDTO.getComment());
addNotNull(doc, SolrField.USER_COMMENT_USERNAME.getName(), userCommentDTO.getUserDTO().getUsername());
addNotNull(doc, SolrField.USER_COMMENT_USER_NAME.getName(), userCommentDTO.getUserDTO().getName());
}
/* CLASSIFICATION */
if (asset.getClassification().getAverageScore() == null) {
addNotNull(doc, SolrField.AVERAGE_SCORE.getName(), -1);
} else {
addNotNull(doc, SolrField.AVERAGE_SCORE.getName(), asset.getClassification().getAverageScore());
}
addNotNull(doc, SolrField.REUSE_COUNTER.getName(), asset.getClassification().getReuseCounter());
for (ApplicationSubdomain asd : asset.getClassification().getApplicationSubdomains()) {
addNotNull(doc, SolrField.APPLICATION_DOMAIN.getName(), asd.getApplicationDomain().getName());
addNotNull(doc, SolrField.APPLICATION_SUBDOMAIN.getName(), asd.getName());
if (FieldsUtil.isValidApplicationSubdomain(asd) &&
asd.getName().equalsIgnoreCase("Other")) {
addNotNull(doc, SolrField.OTHER_APPLICATION_DOMAIN.getName(), asset.getClassification().getOtherApplicationDomain());
addNotNull(doc, SolrField.OTHER_APPLICATION_SUBDOMAIN.getName(), asset.getClassification().getOtherApplicationSubdomain());
}
}
for (ProjectDTO projDTO : asset.getClassification().getProjectDTOs()) {
addNotNull(doc, SolrField.ORGANIZATION.getName(), projDTO.getOrganizationDTO().getName());
addNotNull(doc, SolrField.PROJECT.getName(), projDTO.getName());
}
for (DescriptorGroupDTO groupDTO : asset.getClassification().getDescriptorGroupDTOs()) {
addNotNull(doc, SolrField.DESCRIPTOR_GROUP.getName(), groupDTO.getName());
for (FreeFormDescriptorDTO descriptorDTO : groupDTO.getFreeFormDescriptorDTOs()) {
addNotNull(doc, SolrField.DESCRIPTOR_NAME.getName(), descriptorDTO.getName());
addNotNull(doc, SolrField.DESCRIPTOR_VALUE.getName(), descriptorDTO.getFreeFormValue());
}
}
for (TagDTO tag : asset.getClassification().getTagDTOs()) {
addNotNull(doc, SolrField.TAG.getName(), tag.getName());
}
/* REQUIREMENTS */
for (FunctionalRequirementDTO functionalReq : asset.getSolution().getRequirements().getFunctionalRequirementDTOs()) {
addArtifactable(doc, functionalReq);
}
for (UseCaseDTO useCaseDTO : asset.getSolution().getRequirements().getUseCaseDTOs()) {
addArtifactable(doc, useCaseDTO);
}
for (UserInterfaceDTO userInterfaceDTO : asset.getSolution().getRequirements().getUserInterfaceDTOs()) {
addArtifactable(doc, userInterfaceDTO);
}
for (NonFunctionalRequirementDTO nonFunctionalReq : asset.getSolution().getRequirements().getNonFunctionalRequirementDTOs()) {
addArtifactable(doc, nonFunctionalReq);
}
for (InternationalizationTypeDTO language : asset.getSolution().getRequirements().getInternationalizationTypeDTOs()) {
addNotNull(doc, SolrField.LANGUAGE.getName(), language.getName());
}
for (OperationalSystemTypeDTO operSyst : asset.getSolution().getRequirements().getOperationalSystemTypeDTOs()) {
addNotNull(doc, SolrField.OPERATIONAL_SYSTEM.getName(), operSyst.getName());
}
/* ANALYSIS */
for (InterfaceSpecDTO intSpecDTO : asset.getSolution().getAnalysis().getInterfaceSpecDTOs()) {
addNotNull(doc, SolrField.INTERFACE_SPEC.getName(), intSpecDTO.getName());
for (OperationDTO operationDTO : intSpecDTO.getOperationDTOs()) {
addNotNull(doc, SolrField.OPERATION_NAME.getName(), operationDTO.getName());
addNotNull(doc, SolrField.OPERATION_DESCRIPTION.getName(), operationDTO.getDescription());
}
}
for (UseCaseDTO useCaseDTO : asset.getSolution().getAnalysis().getUseCaseDTOs()) {
addArtifactable(doc, useCaseDTO);
}
for (UserInterfaceDTO userInterfaceDTO : asset.getSolution().getAnalysis().getUserInterfaceDTOs()) {
addArtifactable(doc, userInterfaceDTO);
}
for (ArtifactDTO artifactDTO : asset.getSolution().getAnalysis().getArtifactDTOs()) {
addArtifactable(doc, artifactDTO);
}
/* DESIGN */
for (InterfaceSpecDTO intSpecDTO : asset.getSolution().getDesign().getInterfaceSpecDTOs()) {
addNotNull(doc, SolrField.INTERFACE_SPEC.getName(), intSpecDTO.getName());
for (OperationDTO operationDTO : intSpecDTO.getOperationDTOs()) {
addNotNull(doc, SolrField.OPERATION_NAME.getName(), operationDTO.getName());
addNotNull(doc, SolrField.OPERATION_DESCRIPTION.getName(), operationDTO.getDescription());
}
}
for (DesignPatternDTO desPatDTO : asset.getSolution().getDesign().getDesignPatternDTOs()) {
addNotNull(doc, SolrField.DESIGN_PATTERN.getName(), desPatDTO.getName());
}
for (Artifactable artifactDTO : asset.getSolution().getDesign().getArtifactDTOs()) {
addArtifactable(doc, artifactDTO);
}
for (UserInterfaceDTO userInterfaceDTO : asset.getSolution().getDesign().getUserInterfaceDTOs()) {
addArtifactable(doc, userInterfaceDTO);
}
/* IMPLEMENTATION */
for (DesignPatternDTO desPatDTO : asset.getSolution().getImplementation().getDesignPatternDTOs()) {
addNotNull(doc, SolrField.DESIGN_PATTERN.getName(), desPatDTO.getName());
}
for (ProgrammingLanguageDTO progLangDTO : asset.getSolution().getImplementation().getProgrammingLanguageDTOs()) {
addNotNull(doc, SolrField.PROGRAMMING_LANGUAGE.getName(), progLangDTO.getName());
if (FieldsUtil.isValidProgrammingLanguage(progLangDTO) &&
progLangDTO.getName().equalsIgnoreCase("Other")) {
addNotNull(doc, SolrField.OTHER_PROGRAMMING_LANGUAGE.getName(), asset.getSolution().getImplementation().getOtherProgrammingLanguage());
}
}
for (Artifactable artifactDTO : asset.getSolution().getImplementation().getArtifactDTOs()) {
addArtifactable(doc, artifactDTO);
}
for (Artifactable wsdlDTO : asset.getSolution().getImplementation().getWsdlDTOs()) {
addArtifactable(doc, wsdlDTO);
}
for (SourceCodeDTO sourceCodeDTO : asset.getSolution().getImplementation().getSourceCodeDTOs()) {
addArtifactable(doc, sourceCodeDTO);
}
for (UserInterfaceDTO userInterfaceDTO : asset.getSolution().getImplementation().getUserInterfaceDTOs()) {
addArtifactable(doc, userInterfaceDTO);
}
/* TEST */
for (TestTypeDTO testTypeDTO : asset.getSolution().getTest().getTestTypeDTOs()) {
addNotNull(doc, SolrField.TEST_TYPE.getName(), testTypeDTO.getName());
}
for (TestMethodTypeDTO testMethodTypeDTO : asset.getSolution().getTest().getTestMethodTypeDTOs()) {
addNotNull(doc, SolrField.TEST_METHOD_TYPE.getName(), testMethodTypeDTO.getName());
}
for (DesignPatternDTO desPatDTO : asset.getSolution().getTest().getDesignPatternDTOs()) {
addNotNull(doc, SolrField.DESIGN_PATTERN.getName(), desPatDTO.getName());
}
for (ProgrammingLanguageDTO progLangDTO : asset.getSolution().getTest().getProgrammingLanguageDTOs()) {
addNotNull(doc, SolrField.PROGRAMMING_LANGUAGE.getName(), progLangDTO.getName());
if (FieldsUtil.isValidProgrammingLanguage(progLangDTO) &&
progLangDTO.getName().equalsIgnoreCase("Other")) {
addNotNull(doc, SolrField.OTHER_PROGRAMMING_LANGUAGE.getName(), asset.getSolution().getTest().getOtherProgrammingLanguage());
}
}
for (Artifactable artifactDTO : asset.getSolution().getTest().getArtifactDTOs()) {
addArtifactable(doc, artifactDTO);
}
for (SourceCodeDTO sourceCodeDTO : asset.getSolution().getTest().getSourceCodeDTOs()) {
addArtifactable(doc, sourceCodeDTO);
}
/* USAGE */
for (Artifactable artifactDTO : asset.getUsage().getArtifactDTOs()) {
addArtifactable(doc, artifactDTO);
}
/* RELATED ASSETS */
for (RelatedAsset relatedAsset : asset.getRelatedAssets()) {
addNotNull(doc, SolrField.RELATED_ASSET_ID.getName(), relatedAsset.getId());
addNotNull(doc, SolrField.RELATED_ASSET_NAME.getName(), relatedAsset.getName());
addNotNull(doc, SolrField.RELATED_ASSET_VERSION.getName(), relatedAsset.getVersion());
addNotNull(doc, SolrField.REFERENCE.getName(), relatedAsset.getReference());
if (relatedAsset.getRelatedAssetTypeDTO() != null) {
addNotNull(doc, SolrField.RELATED_ASSET_TYPE.getName(), relatedAsset.getRelatedAssetTypeDTO().getName());
}
}
return doc;
}
private static void addFileNotNull(SolrInputDocument doc, Artifactable file) {
if (file == null || file.getFile() == null) {
return;
}
ContentHandler textHandler = new BodyContentHandler(10*1024*1024);
Metadata metadata = new Metadata();
ParseContext context = new ParseContext();
InputStream input = new ByteArrayInputStream(file.getFile());
try {
new AutoDetectParser().parse(input, textHandler, metadata, context);
} catch (Exception e) {
logger.error(("File parsing failed: " + file.getName()), e);
return;
}
doc.addField(SolrField.ARTIFACT_TEXT.getName(), textHandler.toString());
logger.info(SolrField.ARTIFACT_TEXT.getName() + " : " + textHandler.toString());
}
public static List<AssetSolrDTO> fromSolrDocumentListToAsset(SolrDocumentList solrAssetDocs) {
return fromSolrDocumentListToAsset(solrAssetDocs, null);
}
public static List<AssetSolrDTO> fromSolrDocumentListToAsset(SolrDocumentList solrAssetDocs, Float maxScore) {
List<AssetSolrDTO> assets = new ArrayList<AssetSolrDTO>();
for (SolrDocument d : solrAssetDocs) {
AssetSolrDTO assetSolrDTO = new AssetSolrDTO();
assetSolrDTO.setScore( (Float) d.getFieldValue(SolrField.SCORE.getName()) );
assetSolrDTO.setAverageScore( (Float) d.getFieldValue(SolrField.AVERAGE_SCORE.getName()) );
assetSolrDTO.setReuseCounter( (Integer) d.getFieldValue(SolrField.REUSE_COUNTER.getName()) );
assetSolrDTO.setAssetPk( (String) d.getFieldValue(SolrField.ASSET_PK.getName()) );
assetSolrDTO.setId( (String) d.getFieldValue(SolrField.ID.getName()) );
assetSolrDTO.setName( (String) d.getFieldValue(SolrField.NAME.getName()) );
if (d.getFieldValue(SolrField.DATE.getName()) != null) {
Calendar c = Calendar.getInstance();
c.setTime((Date)d.getFieldValue(SolrField.DATE.getName()));
assetSolrDTO.setDate(c);
}
assetSolrDTO.setVersion( (String) d.getFieldValue(SolrField.VERSION.getName()) );
assetSolrDTO.setType( (String) d.getFieldValue(SolrField.TYPE.getName()) );
if (assetSolrDTO.getType().equalsIgnoreCase("OTHER")) {
assetSolrDTO.setType( assetSolrDTO.getType() + " (" + (String) d.getFieldValue(SolrField.OTHER_TYPE.getName()) + ")" );
}
assetSolrDTO.setState( (String) d.getFieldValue(SolrField.STATE.getName()) );
assetSolrDTO.setSoftwareLicense( (String) d.getFieldValue(SolrField.SOFTWARE_LICENSE_ASSET.getName()) );
assetSolrDTO.setShortDescription( (String) d.getFieldValue(SolrField.SHORT_DESCRIPTION.getName()) );
assetSolrDTO.setDescription( (String) d.getFieldValue(SolrField.DESCRIPTION.getName()) );
if (d.getFieldValue(SolrField.CERTIFICATION_DATE.getName()) != null) {
Calendar c = Calendar.getInstance();
c.setTime((Date)d.getFieldValue(SolrField.CERTIFICATION_DATE.getName()));
assetSolrDTO.setCertificationDate(c);
}
assets.add(assetSolrDTO);
}
/* Normalize the relevance of the query */
if (maxScore == null) {
maxScore = solrAssetDocs.getMaxScore();
}
for (AssetSolrDTO a : assets) {
float r = 1 + ( a.getScore() * 9f ) / maxScore;
a.setStars((int)r);
}
return assets;
}
/** Returns a query with fields and texts. */
public static String fromAssetToQuery(Asset asset) {
List<Term> terms = fromAssetToTerms(asset);
return fromTermsToQuery(terms);
}
/** Returns a query with just texts. */
public static String fromAssetToTextQuery(Asset asset) {
List<Term> terms = fromAssetToTerms(asset);
return fromTermsToQueryText(terms);
}
public static String fromStringToQuery(String value) {
String query = "";
boolean isOpenedQuote = false;
Scanner sc = new Scanner(value);
while (sc.hasNext()) {
String next = sc.next();
if (next.contains("\"") || isOpenedQuote) {
query += next;
if (next.contains("\"")) {
isOpenedQuote = !isOpenedQuote;
}
}
else {
if (next.contains(":")) {
query += next.replace(":", ":*") + "*";
} else {
query += "*" + next + "*";
}
}
if (!isOpenedQuote) {
query += " OR ";
} else {
query += " ";
}
}
if (query.endsWith(" OR ")) {
return query.substring(0, query.lastIndexOf(" OR "));
}
else {
return query;
}
}
public static List<Term> fromAssetToTerms(Asset asset) {
ArrayList<Term> terms = new ArrayList<Term>();
terms.addAll( extractTerms(SolrField.ID.getName(), asset.getId(), true) );
terms.addAll( extractTerms(SolrField.NAME.getName(), asset.getName(), false) );
terms.addAll( extractTerms(SolrField.VERSION.getName(), asset.getVersion(), false) );
if (asset.getType() != null) {
terms.addAll( extractTerms(SolrField.TYPE.getName(), asset.getType().getName(), true) );
if (FieldsUtil.isValidType(asset.getType()) &&
asset.getType().getName().equalsIgnoreCase("Other")) {
terms.addAll( extractTerms(SolrField.OTHER_TYPE.getName(), asset.getOtherType(), true) );
}
}
if (asset.getState() != null) {
terms.addAll( extractTerms(SolrField.STATE.getName(), asset.getState().getName(), true) );
}
if (asset.getSoftwareLicenseDTO() != null) {
terms.addAll( extractTerms(SolrField.SOFTWARE_LICENSE_ASSET.getName(), asset.getSoftwareLicenseDTO().getName(), true) );
if (FieldsUtil.isValidSoftwareLicense(asset.getSoftwareLicenseDTO()) &&
asset.getSoftwareLicenseDTO().getName().equalsIgnoreCase("Other")) {
terms.addAll( extractTerms(SolrField.OTHER_SOFTWARE_LICENSE_ASSET.getName(), asset.getOtherSoftwareLicense(), true) );
}
}
/* USAGE */
if (asset.getUsage().getCreatorUsername() != null) {
terms.addAll( extractTerms(SolrField.CREATOR_NAME.getName(), asset.getUsage().getCreatorUsername(), true) );
}
if (asset.getUsage().getAuthorUserDTO() != null) {
terms.addAll( extractTerms(SolrField.AUTHOR_USERNAME.getName(), asset.getUsage().getAuthorUserDTO().getUsername(), true) );
terms.addAll( extractTerms(SolrField.AUTHOR_NAME.getName(), asset.getUsage().getAuthorUserDTO().getName(), true) );
}
if (asset.getUsage().getCertifierUserDTO() != null) {
terms.addAll( extractTerms(SolrField.CERTIFIER_USERNAME.getName(), asset.getUsage().getCertifierUserDTO().getUsername(), true) );
terms.addAll( extractTerms(SolrField.CERTIFIER_NAME.getName(), asset.getUsage().getCertifierUserDTO().getName(), true) );
}
for (ConsumptionDTO consumptionDTO : asset.getUsage().getConsumptionDTOs()) {
terms.addAll( extractTerms(SolrField.CONSUMER_USERNAME.getName(), consumptionDTO.getConsumerUserDTO().getUsername(), true) );
terms.addAll( extractTerms(SolrField.CONSUMER_NAME.getName(), consumptionDTO.getConsumerUserDTO().getName(), true) );
}
for (UserCommentDTO userCommentDTO : asset.getUsage().getUserCommentDTOs()) {
terms.addAll( extractTerms(SolrField.USER_COMMENT_USERNAME.getName(), userCommentDTO.getUserDTO().getUsername(), true) );
terms.addAll( extractTerms(SolrField.USER_COMMENT_USER_NAME.getName(), userCommentDTO.getUserDTO().getName(), true) );
}
/* CLASSIFICATION */
for (ApplicationSubdomain applicationSubdomain : asset.getClassification().getApplicationSubdomains()) {
if (applicationSubdomain.getName() != null) {
terms.addAll( extractTerms(SolrField.APPLICATION_SUBDOMAIN.getName(), applicationSubdomain.getName(), true) );
}
if (applicationSubdomain.getApplicationDomain() != null &&
applicationSubdomain.getApplicationDomain().getName() != null) {
terms.addAll( extractTerms(SolrField.APPLICATION_DOMAIN.getName(), applicationSubdomain.getApplicationDomain().getName(), true) );
}
if (FieldsUtil.isValidApplicationSubdomain(applicationSubdomain) &&
applicationSubdomain.getName().equalsIgnoreCase("Other")) {
terms.addAll( extractTerms(SolrField.OTHER_APPLICATION_DOMAIN.getName(), asset.getClassification().getOtherApplicationDomain(), true) );
terms.addAll( extractTerms(SolrField.OTHER_APPLICATION_SUBDOMAIN.getName(), asset.getClassification().getOtherApplicationSubdomain(), true) );
}
}
for (ProjectDTO project : asset.getClassification().getProjectDTOs()) {
if (project.getName() != null) {
terms.addAll( extractTerms(SolrField.PROJECT.getName(), project.getName(), true) );
}
if (project.getOrganizationDTO().getName() != null) {
terms.addAll( extractTerms(SolrField.ORGANIZATION.getName(), project.getOrganizationDTO().getName(), true) );
}
}
for (TagDTO tagDTO : asset.getClassification().getTagDTOs()) {
if (tagDTO != null) {
terms.addAll( extractTerms(SolrField.TAG.getName(), tagDTO.getName(), true) );
}
}
/* REQUIREMENTS */
for (InternationalizationTypeDTO internat : asset.getSolution().getRequirements().getInternationalizationTypeDTOs()) {
if (internat != null) {
terms.addAll( extractTerms(SolrField.LANGUAGE.getName(), internat.getName(), true) );
}
}
for (OperationalSystemTypeDTO operSyst : asset.getSolution().getRequirements().getOperationalSystemTypeDTOs()) {
if (operSyst != null) {
terms.addAll( extractTerms(SolrField.OPERATIONAL_SYSTEM.getName(), operSyst.getName(), true) );
}
}
for (FunctionalRequirementDTO functional : asset.getSolution().getRequirements().getFunctionalRequirementDTOs()) {
if (functional != null && functional.getFunctionalRequirementTypeDTO() != null) {
terms.addAll( extractTerms(SolrField.FUNCTIONAL_REQUIREMENT_TYPE.getName(), functional.getFunctionalRequirementTypeDTO().getName(), true) );
}
}
for (NonFunctionalRequirementDTO nonFunctional : asset.getSolution().getRequirements().getNonFunctionalRequirementDTOs()) {
if (nonFunctional != null && nonFunctional.getNonFunctionalRequirementTypeDTO() != null) {
terms.addAll( extractTerms(SolrField.NON_FUNCTIONAL_REQUIREMENT_TYPE.getName(), nonFunctional.getNonFunctionalRequirementTypeDTO().getName(), true) );
}
}
/* DESIGN */
for (InterfaceSpecDTO specDTO : asset.getSolution().getDesign().getInterfaceSpecDTOs()) {
if (specDTO != null) {
terms.addAll( extractTerms(SolrField.INTERFACE_SPEC.getName(), specDTO.getName(), false) );
if (specDTO.getOperationDTOs().size() > 0) {
OperationDTO operationDTO = specDTO.getOperationDTOs().get(0);
if (operationDTO != null) {
terms.addAll( extractTerms(SolrField.OPERATION_NAME.getName(), operationDTO.getName(), false) );
}
}
}
}
/* IMPLEMENTATION */
for (ProgrammingLanguageDTO progrLang : asset.getSolution().getImplementation().getProgrammingLanguageDTOs()) {
if (progrLang != null) {
terms.addAll( extractTerms(SolrField.PROGRAMMING_LANGUAGE.getName(), progrLang.getName(), true) );
}
if (FieldsUtil.isValidProgrammingLanguage(progrLang) &&
progrLang.getName().equalsIgnoreCase("Other")) {
terms.addAll( extractTerms(SolrField.OTHER_PROGRAMMING_LANGUAGE.getName(), asset.getSolution().getImplementation().getOtherProgrammingLanguage(), true) );
}
}
for (DesignPatternDTO designPatternDTO : asset.getSolution().getImplementation().getDesignPatternDTOs()) {
if (designPatternDTO != null) {
terms.addAll( extractTerms(SolrField.DESIGN_PATTERN.getName(), designPatternDTO.getName(), true) );
}
}
for (SourceCodeDTO sourceCodeDTO : asset.getSolution().getImplementation().getSourceCodeDTOs()) {
if (sourceCodeDTO != null) {
if (sourceCodeDTO.getSourceCodeTypeDTO() != null) {
terms.addAll( extractTerms(SolrField.SOURCE_CODE_TYPE.getName(), sourceCodeDTO.getName(), true) );
}
if (sourceCodeDTO.getSoftwareLicenseDTO() != null) {
terms.addAll( extractTerms(SolrField.SOFTWARE_LICENSE.getName(), sourceCodeDTO.getName(), true) );
}
}
}
for (UserInterfaceDTO uiDTO : asset.getSolution().getImplementation().getUserInterfaceDTOs()) {
if (uiDTO != null) {
if (uiDTO.getUserInterfaceTypeDTO() != null) {
terms.addAll( extractTerms(SolrField.USER_INTERFACE_TYPE.getName(), uiDTO.getName(), true) );
}
}
}
/* TEST */
for (TestTypeDTO testTypeDTO : asset.getSolution().getTest().getTestTypeDTOs()) {
if (testTypeDTO != null) {
terms.addAll( extractTerms(SolrField.TEST_TYPE.getName(), testTypeDTO.getName(), true) );
}
}
for (TestMethodTypeDTO testMethodTypeDTO : asset.getSolution().getTest().getTestMethodTypeDTOs()) {
if (testMethodTypeDTO != null) {
terms.addAll( extractTerms(SolrField.TEST_METHOD_TYPE.getName(), testMethodTypeDTO.getName(), true) );
}
}
for (ProgrammingLanguageDTO progrLang : asset.getSolution().getTest().getProgrammingLanguageDTOs()) {
if (progrLang != null) {
terms.addAll( extractTerms(SolrField.PROGRAMMING_LANGUAGE.getName(), progrLang.getName(), true) );
if (FieldsUtil.isValidProgrammingLanguage(progrLang) &&
progrLang.getName().equalsIgnoreCase("Other")) {
terms.addAll( extractTerms(SolrField.OTHER_PROGRAMMING_LANGUAGE.getName(), asset.getSolution().getTest().getOtherProgrammingLanguage(), true) );
}
}
}
for (DesignPatternDTO designPatternDTO : asset.getSolution().getTest().getDesignPatternDTOs()) {
if (designPatternDTO != null) {
terms.addAll( extractTerms(SolrField.DESIGN_PATTERN.getName(), designPatternDTO.getName(), true) );
}
}
for (RelatedAsset relatedAsset : asset.getRelatedAssets()) {
if (relatedAsset != null) {
terms.addAll( extractTerms(SolrField.RELATED_ASSET_ID.getName(), relatedAsset.getId(), true) );
terms.addAll( extractTerms(SolrField.RELATED_ASSET_NAME.getName(), relatedAsset.getName(), false) );
terms.addAll( extractTerms(SolrField.RELATED_ASSET_VERSION.getName(), relatedAsset.getVersion(), false) );
if (relatedAsset.getRelatedAssetTypeDTO() != null) {
terms.addAll( extractTerms(SolrField.RELATED_ASSET_TYPE.getName(), relatedAsset.getRelatedAssetTypeDTO().getName(), true) );
}
}
}
if (terms.size() == 0) {
logger.warn("term list is empty!");
} else {
logger.info("terms: " + terms);
}
return terms;
}
private static List<Term> extractTerms(String fieldName, String value, boolean doubleQuote) {
if ((value == null) || (value.trim().length() == 0)) {
return new ArrayList<Term>();
}
if (fieldName == null) {
throw new RuntimeException("null fieldName");
}
if (doubleQuote) {
/* Value between double quotes */
List<Term> terms = new ArrayList<Term>();
terms.add( new Term(fieldName, '\"' + value + '\"') );
return terms;
}
else {
/* Value between wildcards */
List<Term> terms = new ArrayList<Term>();
Scanner sc = new Scanner(value);
while (sc.hasNext()) {
terms.add(new Term(fieldName, "*" + sc.next() + "*"));
}
return terms;
}
}
private static String fromTermsToQuery(List<Term> terms) {
if (terms.size() == 0) {
throw new IllegalArgumentException("Empty terms.");
}
String query = "";
for (Term t : terms) {
query += t.toString() + " OR ";
}
return query.substring(0, query.lastIndexOf(" OR "));
}
private static String fromTermsToQueryText(List<Term> terms) {
if (terms.size() == 0) {
throw new IllegalArgumentException("Empty terms.");
}
String query = "";
for (Term t : terms) {
query += t.text();
float boost = SolrField.getFieldByName(t.field()).getBoost();
if (boost != SolrFieldBoost.DEFAULT_BOOST) {
query += "^" + boost;
}
query += " OR ";
}
return query.substring(0, query.lastIndexOf(" OR "));
}
private static void addArtifactable(SolrInputDocument doc, Artifactable artifactable) {
addNotNull(doc, SolrField.ARTIFACT_NAME.getName(), artifactable.getName());
addNotNull(doc, SolrField.REFERENCE.getName(), artifactable.getReference());
addNotNull(doc, SolrField.ARTIFACT_DESCRIPTION.getName(), artifactable.getDescription());
if (artifactable.getSoftwareLicenseDTO() != null) {
addNotNull(doc, SolrField.SOFTWARE_LICENSE.getName(), artifactable.getSoftwareLicenseDTO().getName());
}
addFileNotNull(doc, artifactable);
if (artifactable instanceof ArtifactDTO ||
artifactable instanceof UseCaseDTO ||
artifactable instanceof WsdlDTO) {
//nothing
}
else if (artifactable instanceof FunctionalRequirementDTO) {
if ( ((FunctionalRequirementDTO) artifactable).getFunctionalRequirementTypeDTO() != null) {
addNotNull(doc,
SolrField.FUNCTIONAL_REQUIREMENT_TYPE.getName(),
((FunctionalRequirementDTO) artifactable).getFunctionalRequirementTypeDTO().getName());
}
}
else if (artifactable instanceof NonFunctionalRequirementDTO) {
if ( ((NonFunctionalRequirementDTO) artifactable).getNonFunctionalRequirementTypeDTO() != null) {
addNotNull(doc,
SolrField.NON_FUNCTIONAL_REQUIREMENT_TYPE.getName(),
((NonFunctionalRequirementDTO) artifactable).getNonFunctionalRequirementTypeDTO().getName());
}
}
else if (artifactable instanceof SourceCodeDTO) {
if ( ((SourceCodeDTO) artifactable).getSourceCodeTypeDTO() != null) {
addNotNull(doc,
SolrField.SOURCE_CODE_TYPE.getName(),
((SourceCodeDTO) artifactable).getSourceCodeTypeDTO().getName());
}
}
else if (artifactable instanceof UserInterfaceDTO) {
if ( ((UserInterfaceDTO) artifactable).getUserInterfaceTypeDTO() != null) {
addNotNull(doc,
SolrField.USER_INTERFACE_TYPE.getName(),
((UserInterfaceDTO) artifactable).getUserInterfaceTypeDTO().getName());
}
}
else {
throw new IllegalArgumentException("Class type of artifact unrecognized: " + artifactable.getClass());
}
}
private static void addNotNull(SolrInputDocument doc, String id, Object o) {
if (o != null) {
if (o instanceof String) {
if ( ((String) o).length() > 0) {
doc.addField(id, o);
}
}
else {
doc.addField(id, o);
}
}
}
}