/*******************************************************************************
* Copyright (c) 2004, 2007 Boeing.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Boeing - initial API and implementation
*******************************************************************************/
package org.eclipse.osee.framework.skynet.core.artifact.search;
import static org.eclipse.osee.framework.core.enums.DeletionFlag.EXCLUDE_DELETED;
import static org.eclipse.osee.framework.core.enums.DeletionFlag.INCLUDE_DELETED;
import static org.eclipse.osee.framework.core.enums.LoadLevel.ALL;
import static org.eclipse.osee.framework.skynet.core.artifact.LoadType.INCLUDE_CACHE;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.eclipse.osee.framework.core.data.IArtifactToken;
import org.eclipse.osee.framework.core.data.IArtifactType;
import org.eclipse.osee.framework.core.data.IAttributeType;
import org.eclipse.osee.framework.core.data.IOseeBranch;
import org.eclipse.osee.framework.core.data.IRelationType;
import org.eclipse.osee.framework.core.data.TokenFactory;
import org.eclipse.osee.framework.core.enums.CaseType;
import org.eclipse.osee.framework.core.enums.CoreAttributeTypes;
import org.eclipse.osee.framework.core.enums.DeletionFlag;
import org.eclipse.osee.framework.core.enums.LoadLevel;
import org.eclipse.osee.framework.core.enums.QueryOption;
import org.eclipse.osee.framework.core.enums.RelationSide;
import org.eclipse.osee.framework.core.enums.TokenDelimiterMatch;
import org.eclipse.osee.framework.core.enums.TokenOrderType;
import org.eclipse.osee.framework.core.exception.ArtifactDoesNotExist;
import org.eclipse.osee.framework.core.exception.MultipleArtifactsExist;
import org.eclipse.osee.framework.core.model.Branch;
import org.eclipse.osee.framework.core.model.TransactionRecord;
import org.eclipse.osee.framework.core.model.event.IBasicGuidArtifact;
import org.eclipse.osee.framework.core.model.type.ArtifactType;
import org.eclipse.osee.framework.jdk.core.type.HashCollection;
import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
import org.eclipse.osee.framework.jdk.core.type.ResultSet;
import org.eclipse.osee.framework.jdk.core.type.ResultSets;
import org.eclipse.osee.framework.jdk.core.util.Conditions;
import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
import org.eclipse.osee.framework.skynet.core.artifact.ArtifactCache;
import org.eclipse.osee.framework.skynet.core.artifact.ArtifactLoader;
import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
import org.eclipse.osee.framework.skynet.core.event.model.EventBasicGuidArtifact;
import org.eclipse.osee.framework.skynet.core.internal.ServiceUtil;
import org.eclipse.osee.framework.skynet.core.transaction.TransactionManager;
import org.eclipse.osee.orcs.rest.client.OseeClient;
import org.eclipse.osee.orcs.rest.client.QueryBuilder;
import org.eclipse.osee.orcs.rest.model.search.artifact.RequestType;
import org.eclipse.osee.orcs.rest.model.search.artifact.SearchMatch;
import org.eclipse.osee.orcs.rest.model.search.artifact.SearchParameters;
import org.eclipse.osee.orcs.rest.model.search.artifact.SearchResult;
/**
* @author Ryan D. Brooks
*/
public class ArtifactQuery {
public static Artifact getArtifactFromToken(IArtifactToken artifactToken, IOseeBranch branch) throws OseeCoreException {
return getArtifactFromId(artifactToken.getGuid(), branch);
}
public static Artifact getArtifactFromToken(EventBasicGuidArtifact guidArt) throws OseeCoreException {
return getArtifactFromId(guidArt.getGuid(), BranchManager.getBranchByUuid(guidArt.getBranchUuid()));
}
public static Artifact getArtifactFromToken(IBasicGuidArtifact guidArt) throws OseeCoreException {
return getArtifactFromId(guidArt.getGuid(), BranchManager.getBranchByUuid(guidArt.getBranchUuid()));
}
/**
* search for exactly one artifact by one its id - otherwise throw an exception
*
* @param artId the id of the desired artifact
* @return exactly one artifact by one its id - otherwise throw an exception
* @throws ArtifactDoesNotExist if no artifacts are found
*/
public static Artifact getArtifactFromId(int artId, IOseeBranch branch) throws OseeCoreException {
return getArtifactFromId(artId, branch, EXCLUDE_DELETED);
}
/**
* search for exactly one artifact by one its id - otherwise throw an exception
*
* @param artId the id of the desired artifact
* @param allowDeleted whether to return the artifact even if it has been deleted
* @return exactly one artifact by one its id - otherwise throw an exception
* @throws ArtifactDoesNotExist if no artifacts are found
*/
public static Artifact getArtifactFromId(int artId, IOseeBranch branch, DeletionFlag allowDeleted) throws OseeCoreException {
return getOrCheckArtifactFromId(artId, branch, allowDeleted, QueryType.GET);
}
private static Artifact getOrCheckArtifactFromId(int artId, IOseeBranch branch, DeletionFlag allowDeleted, QueryType queryType) throws OseeCoreException {
Artifact artifact = ArtifactCache.getActive(artId, branch);
if (artifact != null) {
if (artifact.isDeleted() && allowDeleted == EXCLUDE_DELETED) {
if (queryType == QueryType.CHECK) {
artifact = null;
} else {
throw new ArtifactDoesNotExist("Deleted artifact unexpectedly returned");
}
}
} else {
artifact = new ArtifactQueryBuilder(artId, branch, allowDeleted, ALL).getOrCheckArtifact(queryType);
}
return artifact;
}
/**
* Checks for existence of an artifact by id
*
* @param artifactId the id of the desired artifact
* @param allowDeleted whether to return the artifact even if it has been deleted
* @return one artifact by one its id if it exists, otherwise null
*/
public static Artifact checkArtifactFromId(int artifactId, IOseeBranch branch, DeletionFlag allowDeleted) throws OseeCoreException {
return getOrCheckArtifactFromId(artifactId, branch, allowDeleted, QueryType.CHECK);
}
/**
* Checks for existence of an artifact by one its guid - otherwise throw an exception
*
* @param guid either the guid of the desired artifact
* @param allowDeleted whether to return the artifact even if it has been deleted
* @return one artifact by one its id if it exists, otherwise null
*/
public static Artifact checkArtifactFromId(String guid, IOseeBranch branch, DeletionFlag allowDeleted) throws OseeCoreException {
return getOrCheckArtifactFromId(guid, branch, allowDeleted, QueryType.CHECK);
}
/**
* Checks for existence of an artifact by one its guid or human readable id - otherwise throw an exception
*
* @param guid of the desired artifact
* @return one artifact by its guid if it exists, otherwise null
*/
public static Artifact checkArtifactFromId(String guid, IOseeBranch branch) throws OseeCoreException {
return getOrCheckArtifactFromId(guid, branch, EXCLUDE_DELETED, QueryType.CHECK);
}
/**
* search for exactly one artifact by one its guid - otherwise throw an exception
*
* @param guid of the desired artifact
* @return exactly one artifact by one its guid - otherwise throw an exception
* @throws ArtifactDoesNotExist if no artifacts are found
* @throws MultipleArtifactsExist if more than one artifact is found
*/
public static Artifact getArtifactFromId(String guid, IOseeBranch branch) throws OseeCoreException {
return getOrCheckArtifactFromId(guid, branch, EXCLUDE_DELETED, QueryType.GET);
}
/**
* search for exactly one artifact by one its guid or human readable id - otherwise throw an exception
*
* @param the guid of the desired artifact
* @param allowDeleted whether to return the artifact even if it has been deleted
* @return exactly one artifact by one its guid or human readable id - otherwise throw an exception
* @throws ArtifactDoesNotExist if no artifacts are found
* @throws MultipleArtifactsExist if more than one artifact is found
*/
public static Artifact getArtifactFromId(String guid, IOseeBranch branch, DeletionFlag allowDeleted) throws OseeCoreException {
return getOrCheckArtifactFromId(guid, branch, allowDeleted, QueryType.GET);
}
private static Artifact getOrCheckArtifactFromId(String guid, IOseeBranch branch, DeletionFlag allowDeleted, QueryType queryType) throws OseeCoreException {
Artifact artifact = ArtifactCache.getActive(guid, branch);
if (artifact != null) {
if (artifact.isDeleted() && allowDeleted == EXCLUDE_DELETED) {
if (queryType == QueryType.CHECK) {
return null;
} else {
throw new ArtifactDoesNotExist("Deleted artifact unexpectedly returned");
}
}
return artifact;
}
return new ArtifactQueryBuilder(guid, branch, allowDeleted, ALL).getOrCheckArtifact(queryType);
}
/**
* search for exactly one artifact based on its type and name - otherwise throw an exception
*
* @return exactly one artifact based on its type and name - otherwise throw an exception
* @throws ArtifactDoesNotExist if no artifacts are found
* @throws MultipleArtifactsExist if more than one artifact is found
*/
public static Artifact getArtifactFromTypeAndName(IArtifactType artifactType, String artifactName, IOseeBranch branch, QueryOption... options) throws OseeCoreException {
return queryFromTypeAndAttribute(artifactType, CoreAttributeTypes.Name, artifactName, branch, options).getOrCheckArtifact(
QueryType.GET);
}
/**
* search for exactly one artifact based on its type and name - otherwise throw an exception
*
* @return exactly one artifact based on its type and name, otherwise null
* @throws MultipleArtifactsExist if more than one artifact is found
*/
public static Artifact getArtifactFromTypeAndNameNoException(IArtifactType artifactType, String artifactName, IOseeBranch branch, QueryOption... options) throws OseeCoreException {
try {
return queryFromTypeAndAttribute(artifactType, CoreAttributeTypes.Name, artifactName, branch, options).getOrCheckArtifact(
QueryType.GET);
} catch (ArtifactDoesNotExist ex) {
// do nothing
}
return null;
}
public static List selectArtifactIdsFromTypeAndName(IArtifactType artifactType, String artifactName, IOseeBranch branch, QueryOption... options) throws OseeCoreException {
return queryFromTypeAndAttribute(artifactType, CoreAttributeTypes.Name, artifactName, branch, options).selectArtifacts(
2);
}
public static List selectArtifactIdsFromTypeAndAttribute(IArtifactType artifactType, IAttributeType attributeType, String attributeValue, IOseeBranch branch, QueryOption... options) throws OseeCoreException {
return queryFromTypeAndAttribute(artifactType, attributeType, attributeValue, branch, options).selectArtifacts(
10000);
}
/**
* Checks for existence of an artifact based on its type and name
*
* @return one artifact based on its type and name if it exists, otherwise null
*/
public static Artifact checkArtifactFromTypeAndName(IArtifactType artifactTypeToken, String artifactName, IOseeBranch branch, QueryOption... options) throws OseeCoreException {
return queryFromTypeAndAttribute(artifactTypeToken, CoreAttributeTypes.Name, artifactName, branch, options).getOrCheckArtifact(
QueryType.CHECK);
}
/**
* search for un-deleted artifacts with any of the given artifact ids
*
* @return a collection of the artifacts found or an empty collection if none are found
*/
public static List getArtifactListFromIds(Collection artifactIds, IOseeBranch branch) throws OseeCoreException {
return ArtifactLoader.loadArtifacts(artifactIds, branch, LoadLevel.ALL, INCLUDE_CACHE, INCLUDE_DELETED);
}
/**
* search for artifacts with any of the given artifact ids
*
* @return a collection of the artifacts found or an empty collection if none are found
*/
public static List getArtifactListFromIds(Collection artifactIds, IOseeBranch branch, DeletionFlag allowDeleted) throws OseeCoreException {
return ArtifactLoader.loadArtifacts(artifactIds, branch, LoadLevel.ALL, INCLUDE_CACHE, allowDeleted);
}
/**
* search for artifacts with any of the given artifact guids
*
* @return a collection of the artifacts found or an empty collection if none are found
*/
public static List getArtifactListFromIds(List guids, IOseeBranch branch) throws OseeCoreException {
return new ArtifactQueryBuilder(guids, branch, ALL).getArtifacts(30, null);
}
public static List getArtifactListFromIds(List guids, IOseeBranch branch, DeletionFlag allowDeleted) throws OseeCoreException {
return new ArtifactQueryBuilder(guids, branch, allowDeleted, ALL).getArtifacts(30, null);
}
public static List getHistoricalArtifactListFromIds(List guids, TransactionRecord transactionId, DeletionFlag allowDeleted) throws OseeCoreException {
return new ArtifactQueryBuilder(guids, transactionId, allowDeleted, ALL).getArtifacts(30, null);
}
public static List getHistoricalArtifactListFromIds(Collection artifactIds, TransactionRecord transactionId, DeletionFlag allowDeleted) throws OseeCoreException {
return new ArtifactQueryBuilder(artifactIds, transactionId, allowDeleted, ALL).getArtifacts(30, null);
}
public static Artifact getHistoricalArtifactFromId(int artifactId, TransactionRecord transactionId, DeletionFlag allowDeleted) throws OseeCoreException {
return new ArtifactQueryBuilder(artifactId, transactionId, allowDeleted, ALL).getOrCheckArtifact(QueryType.GET);
}
public static Artifact getHistoricalArtifactFromId(String guid, TransactionRecord transactionId, DeletionFlag allowDeleted) throws OseeCoreException {
return new ArtifactQueryBuilder(Arrays.asList(guid), transactionId, allowDeleted, ALL).getOrCheckArtifact(QueryType.GET);
}
public static Artifact checkHistoricalArtifactFromId(int artifactId, TransactionRecord transactionId, DeletionFlag allowDeleted) throws OseeCoreException {
return new ArtifactQueryBuilder(artifactId, transactionId, allowDeleted, ALL).getOrCheckArtifact(QueryType.CHECK);
}
public static Artifact checkHistoricalArtifactFromId(String guid, TransactionRecord transactionId, DeletionFlag allowDeleted) throws OseeCoreException {
return new ArtifactQueryBuilder(Arrays.asList(guid), transactionId, allowDeleted, ALL).getOrCheckArtifact(QueryType.CHECK);
}
public static List getArtifactListFromName(String artifactName, IOseeBranch branch, DeletionFlag allowDeleted, QueryOption... options) throws OseeCoreException {
return new ArtifactQueryBuilder(branch, ALL, allowDeleted, new AttributeCriteria(CoreAttributeTypes.Name,
artifactName, options)).getArtifacts(30, null);
}
public static List getArtifactListFromTypeAndName(IArtifactType artifactType, String artifactName, IOseeBranch branch, QueryOption... options) throws OseeCoreException {
return getArtifactListFromTypeAndAttribute(artifactType, CoreAttributeTypes.Name, artifactName, branch, options);
}
/**
* search for exactly one artifact based on its type and an attribute of a given type and value - otherwise throw an
* exception
*
* @return a collection of the artifacts found or an empty collection if none are found
* @throws ArtifactDoesNotExist if no artifacts are found
* @throws MultipleArtifactsExist if more than one artifact is found
*/
public static Artifact getArtifactFromTypeAndAttribute(IArtifactType artifactType, IAttributeType attributeType, String attributeValue, IOseeBranch branch) throws OseeCoreException {
return queryFromTypeAndAttribute(artifactType, attributeType, attributeValue, branch).getOrCheckArtifact(
QueryType.GET);
}
/**
* search for exactly one artifact based on its type and an attribute of a given type and value - otherwise throw an
* exception
*
* @return a collection of the artifacts found or an empty collection if none are found
* @throws ArtifactDoesNotExist if no artifacts are found
* @throws MultipleArtifactsExist if more than one artifact is found
*/
public static Artifact getArtifactFromAttribute(IAttributeType attributeType, String attributeValue, IOseeBranch branch) throws OseeCoreException {
return new ArtifactQueryBuilder(branch, ALL, EXCLUDE_DELETED,
new AttributeCriteria(attributeType, attributeValue)).getOrCheckArtifact(QueryType.GET);
}
/**
* Does not return any inherited artifacts. Use getArtifactListFromTypeWithInheritence instead.
*
* @param artifactTypeToken
* @param branch
* @param allowDeleted
* @return
* @throws OseeCoreException
*/
public static List getArtifactListFromType(IArtifactType artifactTypeToken, IOseeBranch branch, DeletionFlag allowDeleted) throws OseeCoreException {
return new ArtifactQueryBuilder(artifactTypeToken, branch, ALL, allowDeleted).getArtifacts(1000, null);
}
public static List getArtifactListFromType(List artifactTypeTokens, IOseeBranch branch, DeletionFlag allowDeleted) throws OseeCoreException {
return new ArtifactQueryBuilder(artifactTypeTokens, branch, ALL, allowDeleted).getArtifacts(1000, null);
}
public static List getArtifactListFromType(IArtifactType artifactTypeToken, IOseeBranch branch) throws OseeCoreException {
return getArtifactListFromType(artifactTypeToken, branch, EXCLUDE_DELETED);
}
public static List getArtifactListFromBranch(IOseeBranch branch, DeletionFlag allowDeleted) throws OseeCoreException {
return new ArtifactQueryBuilder(branch, ALL, allowDeleted).getArtifacts(10000, null);
}
public static List selectArtifactListFromType(IArtifactType artifactTypeToken, IOseeBranch branch, DeletionFlag allowDeleted) throws OseeCoreException {
return new ArtifactQueryBuilder(artifactTypeToken, branch, ALL, allowDeleted).selectArtifacts(10000);
}
public static List selectArtifactListFromBranch(IOseeBranch branch, DeletionFlag allowDeleted) throws OseeCoreException {
return new ArtifactQueryBuilder(branch, ALL, allowDeleted).selectArtifacts(10000);
}
public static List getArtifactListFromBranch(IOseeBranch branch, LoadLevel loadLevel, DeletionFlag allowDeleted) throws OseeCoreException {
return new ArtifactQueryBuilder(branch, loadLevel, allowDeleted).getArtifacts(10000, null);
}
public static List reloadArtifactListFromBranch(IOseeBranch branch, DeletionFlag allowDeleted) throws OseeCoreException {
return new ArtifactQueryBuilder(branch, ALL, allowDeleted).reloadArtifacts(10000);
}
/**
* do not use this method if searching for a super type and its descendants, instead use getArtifactListFromTypeAnd
*/
public static List getArtifactListFromTypes(Collection extends IArtifactType> artifactTypes, IOseeBranch branch, DeletionFlag allowDeleted) throws OseeCoreException {
return new ArtifactQueryBuilder(artifactTypes, branch, ALL, allowDeleted).getArtifacts(1000, null);
}
public static List getArtifactListFromTypeWithInheritence(IArtifactType artifactType, IOseeBranch branch, DeletionFlag allowDeleted) throws OseeCoreException {
ArtifactType artifactTypeFull = ArtifactTypeManager.getType(artifactType);
Collection artifactTypes = artifactTypeFull.getAllDescendantTypes();
artifactTypes.add(artifactTypeFull);
return getArtifactListFromTypes(artifactTypes, branch, allowDeleted);
}
public static int getArtifactCountFromTypeWithInheritence(IArtifactType artifactType, IOseeBranch branch, DeletionFlag allowDeleted) throws OseeCoreException {
ArtifactType artifactTypeFull = ArtifactTypeManager.getType(artifactType);
Collection artifactTypes = artifactTypeFull.getAllDescendantTypes();
artifactTypes.add(artifactTypeFull);
return getArtifactCountFromTypes(artifactTypes, branch, allowDeleted);
}
public static int getArtifactCountFromTypes(Collection extends IArtifactType> artifactTypes, IOseeBranch branch, DeletionFlag allowDeleted) throws OseeCoreException {
return new ArtifactQueryBuilder(artifactTypes, branch, ALL, allowDeleted).countArtifacts();
}
/**
* search for artifacts of the given type on a particular branch that satisfy the given criteria
*
* @return a collection of the artifacts found or an empty collection if none are found
*/
public static List getArtifactListFromTypeAnd(IArtifactType artifactType, IOseeBranch branch, int artifactCountEstimate, List criteria) throws OseeCoreException {
return new ArtifactQueryBuilder(artifactType, branch, ALL, criteria).getArtifacts(artifactCountEstimate, null);
}
/**
* search for artifacts on a particular branch that satisfy the given criteria
*
* @return a collection of the artifacts found or an empty collection if none are found
*/
public static List getArtifactListFromCriteria(IOseeBranch branch, int artifactCountEstimate, List criteria) throws OseeCoreException {
return new ArtifactQueryBuilder(branch, ALL, criteria).getArtifacts(artifactCountEstimate, null);
}
/**
* search for artifacts on a particular branch that satisfy the given criteria
*
* @return a collection of the artifacts found or an empty collection if none are found
*/
public static List getArtifactListFromCriteria(IOseeBranch branch, int artifactCountEstimate, ArtifactSearchCriteria... criteria) throws OseeCoreException {
return new ArtifactQueryBuilder(branch, ALL, EXCLUDE_DELETED, criteria).getArtifacts(artifactCountEstimate, null);
}
/**
* search for artifacts related
*
* @return a collection of the artifacts found or an empty collection if none are found
*/
public static List getRelatedArtifactList(Artifact artifact, IRelationType relationType, RelationSide relationSide) throws OseeCoreException {
return new ArtifactQueryBuilder(artifact.getBranch(), ALL, EXCLUDE_DELETED, new RelationCriteria(
artifact.getArtId(), relationType, relationSide)).getArtifacts(1000, null);
}
/**
* search for artifacts by relation
*
* @return a collection of the artifacts found or an empty collection if none are found
*/
public static List getArtifactListFromRelation(IRelationType relationType, RelationSide relationSide, IOseeBranch branch) throws OseeCoreException {
return new ArtifactQueryBuilder(branch, ALL, EXCLUDE_DELETED, new RelationCriteria(relationType, relationSide)).getArtifacts(
1000, null);
}
/**
* search for artifacts of the given type with an attribute of the given type and value
*
* @return a collection of the artifacts found or an empty collection if none are found
*/
public static List getArtifactListFromTypeAndAttribute(IArtifactType artifactType, IAttributeType attributeType, String attributeValue, IOseeBranch branch, QueryOption... options) throws OseeCoreException {
return new ArtifactQueryBuilder(artifactType, branch, ALL, new AttributeCriteria(attributeType, attributeValue,
options)).getArtifacts(100, null);
}
public static List getArtifactListFromAttribute(IAttributeType attributeType, String attributeValue, IOseeBranch branch, QueryOption... options) throws OseeCoreException {
return new ArtifactQueryBuilder(branch, ALL, EXCLUDE_DELETED, new AttributeCriteria(attributeType,
attributeValue, options)).getArtifacts(300, null);
}
/**
* Return all artifacts that have one or more attributes of given type regardless of the value
*/
public static List getArtifactListFromAttributeType(IAttributeType attributeType, IOseeBranch branch) throws OseeCoreException {
return new ArtifactQueryBuilder(branch, ALL, EXCLUDE_DELETED, new AttributeCriteria(attributeType)).getArtifacts(
300, null);
}
private static ArtifactQueryBuilder queryFromTypeAndAttribute(IArtifactType artifactType, IAttributeType attributeType, String attributeValue, IOseeBranch branch, QueryOption... options) {
return new ArtifactQueryBuilder(artifactType, branch, ALL, new AttributeCriteria(attributeType, attributeValue,
options));
}
public static List getArtifactListFromTypeAndAttribute(IArtifactType artifactType, IAttributeType attributeType, Collection attributeValues, IOseeBranch branch, int artifactCountEstimate) throws OseeCoreException {
return new ArtifactQueryBuilder(artifactType, branch, ALL, new AttributeCriteria(attributeType, attributeValues)).getArtifacts(
artifactCountEstimate, null);
}
public static List getArtifactListFromAttributeValues(IAttributeType attributeType, Collection attributeValues, IOseeBranch branch, int artifactCountEstimate) throws OseeCoreException {
return new ArtifactQueryBuilder(branch, ALL, EXCLUDE_DELETED, new AttributeCriteria(attributeType,
attributeValues)).getArtifacts(artifactCountEstimate, null);
}
/**
* Searches for artifacts having attributes which contain matching keywords entered in the query string.
*
* Special characters such as (' '
, !
, "
, #
, $
,
* %
, (
, )
, *
, +
, ,
, -
,
* .
, /
, :
, ;
, <
, >
,
* ?
, @
, [
, \
, ]
, ^
, {
,
* |
, }
, ~
, _
) are assumed to be word separators.
*
*
* For example:
*
* - '
hello.world
' will be translated to 'hello
' and 'world
* '. The search will match attributes with 'hello
' and 'world
' keywords.
*
*
*
*
* @param queryString keywords to match
* @param matchWordOrder true ensures the query string words exist in order; false matches words in any
* order
* @param nameOnly true searches in name attributes only; false includes all tagged attribute types
* @param allowDeleted true includes deleted artifacts in results; false omits deleted artifacts
* @return a collection of the artifacts found or an empty collection if none are found
*/
public static List getArtifactListFromAttributeKeywords(IOseeBranch branch, String queryString, boolean isMatchWordOrder, DeletionFlag deletionFlag, boolean isCaseSensitive, IAttributeType... attributeTypes) throws OseeCoreException {
QueryBuilderArtifact queryBuilder = createQueryBuilder(branch);
queryBuilder.includeDeleted(deletionFlag.areDeletedAllowed());
QueryOption matchCase = CaseType.getCaseType(isCaseSensitive);
QueryOption matchWordOrder = TokenOrderType.getTokenOrderType(isMatchWordOrder);
Collection typesToSearch =
attributeTypes.length == 0 ? Collections.singleton(QueryBuilder.ANY_ATTRIBUTE_TYPE) : Arrays.asList(attributeTypes);
queryBuilder.and(typesToSearch, queryString, matchCase, matchWordOrder);
List toReturn = new LinkedList();
for (Artifact art : queryBuilder.getResults()) {
toReturn.add(art);
}
return toReturn;
}
/**
* Searches for keywords in attributes and returning match location information such as artifact where match was
* found, attribute containing the match and match location in attribute data.
*
* @see #getArtifactsFromAttributeWithKeywords
* @param findAllMatchLocations when set to true returns all match locations instead of just returning the
* first one. When returning all match locations, search performance may be slow.
*/
public static Iterable getArtifactMatchesFromAttributeKeywords(SearchRequest searchRequest) throws OseeCoreException {
QueryBuilderArtifact queryBuilder = createQueryBuilder(searchRequest.getBranch());
SearchOptions options = searchRequest.getOptions();
queryBuilder.includeDeleted(options.getDeletionFlag().areDeletedAllowed());
QueryOption matchCase = CaseType.getCaseType(options.isCaseSensitive());
QueryOption matchWordOrder = TokenOrderType.getTokenOrderType(options.isMatchWordOrder());
QueryOption matchExact = TokenDelimiterMatch.ANY;
if (options.isExactMatch()) {
matchCase = CaseType.MATCH_CASE;
matchWordOrder = TokenOrderType.MATCH_ORDER;
matchExact = TokenDelimiterMatch.EXACT;
}
Collection typesToSearch =
Conditions.hasValues(options.getAttributeTypeFilter()) ? options.getAttributeTypeFilter() : Collections.singleton(QueryBuilder.ANY_ATTRIBUTE_TYPE);
queryBuilder.and(typesToSearch, searchRequest.getRawSearch(), matchCase, matchWordOrder, matchExact);
return queryBuilder.getMatches();
}
public static Artifact reloadArtifactFromId(int artId, IOseeBranch branch) throws OseeCoreException {
ArtifactQueryBuilder query = new ArtifactQueryBuilder(artId, branch, INCLUDE_DELETED, ALL);
Artifact artifact = query.reloadArtifact();
OseeEventManager.kickLocalArtifactReloadEvent(query, Collections.singleton(artifact));
return artifact;
}
public static Collection extends Artifact> reloadArtifacts(Collection extends Artifact> artifacts) throws OseeCoreException {
Collection reloadedArts = new ArrayList(artifacts.size());
HashCollection branchMap = new HashCollection();
if (artifacts.isEmpty()) {
return artifacts;
}
for (Artifact artifact : artifacts) {
// separate/group artifacts by branch since ArtifactQueryBuilder only supports a single branch
branchMap.put(artifact.getBranch(), artifact);
}
Set artIds = new HashSet();
for (Entry> entrySet : branchMap.entrySet()) {
for (Artifact artifact : entrySet.getValue()) {
artIds.add(artifact.getArtId());
}
ArtifactQueryBuilder query = new ArtifactQueryBuilder(artIds, entrySet.getKey(), INCLUDE_DELETED, ALL);
reloadedArts.addAll(query.reloadArtifacts(artIds.size()));
OseeEventManager.kickLocalArtifactReloadEvent(query, reloadedArts);
artIds.clear();
}
return reloadedArts;
}
public static Artifact getOrCreate(String guid, IArtifactType type, IOseeBranch branch) throws OseeCoreException {
Artifact artifact = null;
try {
artifact = ArtifactQuery.getArtifactFromId(guid, branch);
} catch (ArtifactDoesNotExist ex) {
//do nothing since this is expected if the artifact does not exist
}
if (artifact == null) {
Branch fullBranch = BranchManager.getBranch(branch);
artifact = ArtifactTypeManager.addArtifact(type, fullBranch, null, guid);
}
if (artifact == null) {
throw new ArtifactDoesNotExist("Artifact of type [%s] does not exist on branch [%s]", type, branch);
}
return artifact;
}
public static QueryBuilderArtifact createQueryBuilder(IOseeBranch branch) throws OseeCoreException {
OseeClient client = ServiceUtil.getOseeClient();
QueryBuilder builder = client.createQueryBuilder(branch);
QueryBuilderProxy handler = new QueryBuilderProxy(builder);
Class>[] types = new Class>[] {QueryBuilderArtifact.class};
QueryBuilderArtifact query =
(QueryBuilderArtifact) Proxy.newProxyInstance(QueryBuilderArtifact.class.getClassLoader(), types, handler);
return query;
}
private static final class QueryBuilderProxy implements InvocationHandler {
private final QueryBuilder proxied;
public QueryBuilderProxy(QueryBuilder proxied) {
super();
this.proxied = proxied;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object toReturn = null;
Method localMethod = getMethodFor(this.getClass(), method);
try {
if (localMethod != null) {
toReturn = localMethod.invoke(this, args);
} else {
toReturn = invokeOnDelegate(proxied, method, args);
}
} catch (InvocationTargetException e) {
throw e.getCause();
}
return toReturn;
}
protected Object invokeOnDelegate(Object target, Method method, Object[] args) throws Throwable {
return method.invoke(target, args);
}
private Method getMethodFor(Class> clazz, Method method) {
Method toReturn = null;
try {
toReturn = clazz.getMethod(method.getName(), method.getParameterTypes());
} catch (Exception ex) {
// Do Nothing;
}
return toReturn;
}
// this method is called from invoke in the localMethod case
@SuppressWarnings("unused")
public ResultSet getResults() throws OseeCoreException {
SearchResult result = proxied.getSearchResult(RequestType.IDS);
SearchParameters searchParameters = result.getSearchParameters();
IOseeBranch branch = TokenFactory.createBranch(searchParameters.getBranchUuid(), "N/A");
TransactionRecord tx = null;
if (searchParameters.getFromTx() > 0) {
tx = TransactionManager.getTransactionId(searchParameters.getFromTx());
}
DeletionFlag deletionFlag =
searchParameters.isIncludeDeleted() ? DeletionFlag.INCLUDE_DELETED : DeletionFlag.EXCLUDE_DELETED;
List ids = result.getIds();
ResultSet toReturn;
if (ids != null && !ids.isEmpty()) {
List loadedArtifacts =
ArtifactLoader.loadArtifacts(ids, branch, LoadLevel.ALL, INCLUDE_CACHE, deletionFlag, tx);
toReturn = ResultSets.newResultSet(loadedArtifacts);
} else {
toReturn = ResultSets.emptyResultSet();
}
return toReturn;
}
// this method is called from invoke in the localMethod case
@SuppressWarnings("unused")
public ResultSet getMatches() throws OseeCoreException {
SearchResult result = proxied.getSearchResult(RequestType.MATCHES);
SearchParameters searchParameters = result.getSearchParameters();
IOseeBranch branch = TokenFactory.createBranch(searchParameters.getBranchUuid(), "N/A");
TransactionRecord tx = null;
if (searchParameters.getFromTx() > 0) {
tx = TransactionManager.getTransactionId(searchParameters.getFromTx());
}
DeletionFlag deletionFlag =
searchParameters.isIncludeDeleted() ? DeletionFlag.INCLUDE_DELETED : DeletionFlag.EXCLUDE_DELETED;
Map artIdToArtifact = new HashMap();
List loadedArtifacts =
ArtifactLoader.loadArtifacts(result.getIds(), branch, LoadLevel.ALL, INCLUDE_CACHE, deletionFlag, tx);
for (Artifact art : loadedArtifacts) {
artIdToArtifact.put(art.getArtId(), art);
}
Map matches = new HashMap();
for (SearchMatch match : result.getSearchMatches()) {
int artId = match.getArtId();
int attrId = match.getAttrId();
Artifact art = artIdToArtifact.get(artId);
if (art != null) {
ArtifactMatch toAddTo = matches.get(art);
if (toAddTo == null) {
toAddTo = new ArtifactMatch(art);
matches.put(art, toAddTo);
}
toAddTo.addMatchData(attrId, match.getLocations());
}
}
return ResultSets.newResultSet(matches.values());
}
}
}