/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.core.search.commands; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.emf.common.util.URI; import org.teiid.core.designer.id.ObjectID; import org.teiid.core.designer.util.CoreArgCheck; import org.teiid.core.designer.util.CoreStringUtil; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.core.index.IEntryResult; import org.teiid.designer.core.index.IndexConstants; import org.teiid.designer.core.index.IndexSelector; import org.teiid.designer.core.index.IndexUtil; import org.teiid.designer.core.index.ModelWorkspaceSearchIndexSelector; import org.teiid.designer.core.resource.xmi.MtkXmiResourceImpl; import org.teiid.designer.core.search.runtime.SearchRuntimeAdapter; /** * FindRelatedObjectsCommandImpl.java * * @since 8.0 */ public class FindRelatedObjectsCommandImpl implements FindRelatedObjectsCommand { private String modelObjectUri; private Collection relatedObjInfo; private IndexSelector selector; /* (non-Javadoc) * @See org.teiid.designer.relationship.search.commands.RelationshipSearchCommand#canExecute() */ @Override public boolean canExecute() { return true; } /* (non-Javadoc) * @See org.teiid.designer.relationship.search.commands.RelationshipSearchCommand#execute() */ @Override public IStatus execute() { // uuid of the object whose related record is lookedup String objectUUID = null; // find the uuid of the object if(!CoreStringUtil.isEmpty(this.modelObjectUri)) { URI objectUri = URI.createURI(this.modelObjectUri); // fragment of the uri is an UUID objectUUID = objectUri.fragment(); // get the correct form of uuid(replace / with : delimiter) objectUUID = objectUUID.replace(MtkXmiResourceImpl.UUID_PROTOCOL_DELIMITER, ObjectID.DELIMITER); } // search the indexes based on the UUID of the object String searchPrefix = IndexUtil.getPrefixPattern(IndexConstants.SEARCH_RECORD_TYPE.RELATED_OBJECT, objectUUID); // get all related node info based of the UUID of the object try { IEntryResult[] results = IndexUtil.queryIndex(getIndexSelector().getIndexes(), searchPrefix.toCharArray(), true, true); relatedObjInfo = new ArrayList(results.length); for(int i=0; i < results.length; i++) { IEntryResult result = results[i]; relatedObjInfo.add(SearchRuntimeAdapter.createRelatedObjectRecord(result.getWord())); } } catch (Exception e) { ModelerCore.Util.log(e); return new Status(IStatus.ERROR, ModelerCore.PLUGIN_ID, 0, ModelerCore.Util.getString("FindRelatedObjectsCommandImpl.Error_trying_to_execute_command,_problem_trying_to_query_relationship_search_indexes._1"), e); //$NON-NLS-1$ } return new Status(IStatus.OK, ModelerCore.PLUGIN_ID, 0, "", null); //$NON-NLS-1$ } /* (non-Javadoc) * @See org.teiid.designer.relationship.search.commands.FindRelatedObjectsCommand#getRelatedObjectInfo() */ @Override public Collection getRelatedObjectInfo() { if(this.relatedObjInfo == null) { return Collections.EMPTY_LIST; } return this.relatedObjInfo; } /* (non-Javadoc) * @See org.teiid.designer.relationship.search.commands.FindRelatedObjectsCommand#setModelObjectUri(String) */ @Override public void setModelObjectUri(String object) { CoreArgCheck.isNotEmpty(object); this.modelObjectUri = object; } /** * @see org.teiid.designer.core.search.commands.FindRelationshipsCommand#getIndexSelector() */ private IndexSelector getIndexSelector() { // selector used to lookup relationship indexes this.selector = this.selector != null ? this.selector : new ModelWorkspaceSearchIndexSelector(); return this.selector; } /* (non-Javadoc) * @See org.teiid.designer.core.search.commands.FindRelatedObjectsCommand#setIndexSelector(org.teiid.designer.core.index.IndexSelector) */ @Override public void setIndexSelector(IndexSelector selector) { this.selector = selector; } }