/*
* 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.index;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.ecore.resource.Resource;
import org.teiid.core.designer.util.CoreArgCheck;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.TransactionRunnable;
import org.teiid.designer.core.builder.ModelBuildUtil;
import org.teiid.designer.core.transaction.UnitOfWork;
import org.teiid.designer.core.util.Util;
import org.teiid.designer.core.workspace.ModelResource;
import org.teiid.designer.metamodels.core.ModelAnnotation;
import org.teiid.designer.metamodels.core.ModelImport;
/**
* ModelResourceIndexSelector finds all index files associated with any projects and resources within the model workspace
*
* @since 8.0
*/
public class ModelResourceIndexSelector extends AbstractIndexSelector {
private static final Index[] EMPTY_INDEX_ARRAY = new Index[0];
private Resource resource;
// private Index[] indexes;
/**
* Construct an instance of ModelResourceIndexSelector
*/
public ModelResourceIndexSelector( final Resource resource ) {
CoreArgCheck.isNotNull(resource);
this.resource = resource;
}
// ==================================================================================
// I N T E R F A C E M E T H O D S
// ==================================================================================
/* (non-Javadoc)
* @See org.teiid.designer.core.index.IndexSelector#getIndexes()
*/
@Override
public Index[] getIndexes() {
// update indexes if needed
updateIndexes();
// boolean indexesUpdated = updateIndexes();
// if(indexesUpdated ) {
// ArrayList tmp = new ArrayList();
List modelImports = this.getModelImports();
File[] indexFiles = this.getIndexFiles(modelImports);
return IndexUtil.getExistingIndexes(indexFiles);
// }
// for (int i = 0; i < indexFiles.length; i++) {
// final File indexFile = indexFiles[i];
// if (IndexUtil.indexFileExists(indexFile.getAbsolutePath())) {
// Index theIndex = IndexUtil.getIndexFile(indexFile.getName(), indexFile.getAbsolutePath(),
// this.resource.getURI().lastSegment());
// if(theIndex != null ) {
// tmp.add(theIndex);
// }
// }
// }
//
// this.indexes = new Index[tmp.size()];
// tmp.copyInto(this.indexes);
// }
//
// return this.indexes;
}
// ==================================================================================
// P U B L I C M E T H O D S
// ==================================================================================
/**
* Return all the imports to resources that are being looked up for index info.
*
* @return List The list of model imports.
*/
public List getModelImports() {
ModelAnnotation model = Util.getModelAnnotation(this.resource);
if (model != null) {
return model.getModelImports();
}
return Collections.EMPTY_LIST;
}
/**
* Return all the imports to resources that are being looked up for index info.
*
* @return List The list of model imports.
*/
public Collection getNonIndexedResources() {
List imports = getModelImports();
Collection iResources = new ArrayList(imports.size() + 1);
for (final Iterator importIter = imports.iterator(); importIter.hasNext();) {
ModelImport mdlImport = (ModelImport)importIter.next();
String importedResourcePath = mdlImport.getPath();
if (importedResourcePath != null) {
ModelResource importResource = ModelerCore.getModelWorkspace().findModelResource(new Path(importedResourcePath));
if (importResource != null && importResource.getIndexType() != ModelResource.INDEXED
&& importResource.getIndexType() != ModelResource.METADATA_INDEXED) {
iResources.add(importResource.getResource());
}
}
}
ModelResource modelResource = ModelerCore.getModelWorkspace().findModelResource(this.getResource());
if (modelResource.getIndexType() != ModelResource.INDEXED
&& modelResource.getIndexType() != ModelResource.METADATA_INDEXED) {
iResources.add(modelResource.getResource());
}
return iResources;
}
/**
* Update the indexes by indexing any dependent models in the workspace that need to be indexed.
*
* @since 4.2
*/
private boolean updateIndexes() {
try {
// Gather a list of all ModelResource instance in the workspace
// that have unsaved changes
final Collection nonIndexedResources = getNonIndexedResources();
if (nonIndexedResources != null && !nonIndexedResources.isEmpty()) {
// If there are models with unsaved changes create temporary index files
// for use in query validation and resolution
final TransactionRunnable runnable = new TransactionRunnable() {
@Override
public Object run( final UnitOfWork uow ) {
ModelBuildUtil.createModelIndexes(null, nonIndexedResources);
return null;
}
};
// Execute the indexing within a transaction as this operation may open resources
// and create new EObjects
ModelerCore.getModelEditor().executeAsTransaction(runnable, "Updating ModelIndexes", false, false, this); //$NON-NLS-1$
return true;
}
} catch (CoreException e) {
ModelerCore.Util.log(IStatus.ERROR, e, ModelerCore.Util.getString("ModelResourceIndexSelector.0")); //$NON-NLS-1$
}
return false;
}
/**
* Return the reference to the EMF resource used to construct this IndexSelector
*
* @return Resource
*/
public Resource getResource() {
return this.resource;
}
@Override
public String toString() {
final StringBuffer sb = new StringBuffer(100);
sb.append("ModelResourceIndexSelector ["); //$NON-NLS-1$
Index[] indexes = EMPTY_INDEX_ARRAY;
indexes = getIndexes();
for (int i = 0; i < indexes.length; i++) {
if (i > 0) {
sb.append(", "); //$NON-NLS-1$
}
sb.append(indexes[i].getIndexFile());
}
sb.append("]"); //$NON-NLS-1$
return sb.toString();
}
// ==================================================================================
// P R I V A T E M E T H O D S
// ==================================================================================
private File[] getIndexFiles( final List modelImports ) {
CoreArgCheck.isNotNull(modelImports);
ArrayList tmp = new ArrayList();
// get the index files name for the imports followed by
// the index files for the resource itsels. (Defect 13933)
for (Iterator iter = modelImports.iterator(); iter.hasNext();) {
final ModelImport modelImport = (ModelImport)iter.next();
if (modelImport != null) {
File indexFile = getIndexFile(modelImport);
if (indexFile != null && indexFile.exists()) {
tmp.add(indexFile);
}
}
}
File rsrcIndexFile = new File(IndexUtil.INDEX_PATH, IndexUtil.getRuntimeIndexFileName(this.resource));
if (rsrcIndexFile.exists()) {
tmp.add(rsrcIndexFile);
}
File[] result = new File[tmp.size()];
tmp.toArray(result);
return result;
}
private File getIndexFile( final ModelImport modelImport ) {
String indexFileName = null;
try {
indexFileName = IndexUtil.getRuntimeIndexFileName(modelImport.getPath());
} catch (Exception e) {
// Exception here means that the index file for the import wasnt found
// Result is that the returned file will be null
}
if (indexFileName != null) {
return new File(IndexUtil.INDEX_PATH, indexFileName);
}
return null;
}
}