Skip to content

Commit

Permalink
Merge pull request #24 from elvisisking/teiiddes-1403-retry
Browse files Browse the repository at this point in the history
TEIIDDES-1403 VDB Reuse
  • Loading branch information
blafond committed Sep 17, 2012
2 parents 89c23e1 + 42f49a5 commit 07bcf1e
Show file tree
Hide file tree
Showing 71 changed files with 2,135 additions and 608 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,16 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IExtension;
Expand Down Expand Up @@ -93,29 +96,86 @@ public static void buildResources( final IProgressMonitor monitor,
// not modified
final List modifiedResources = getModifiedResources();

// collection of models dependent on the models being validated
Set<IResource> dependentModels = new HashSet<IResource>();
Map<IProject, Collection<IResource>> projToResMap = getProjectToResourcesMap(iResources);

for (final Iterator rsourceIter = iResources.iterator(); rsourceIter.hasNext();) {
IResource resource = (IResource)rsourceIter.next();
Collection models = WorkspaceResourceFinderUtil.getResourcesThatUse(resource);
models.removeAll(iResources);
dependentModels.addAll(models);
// collection of models dependent on the models being validated
Set<IResource> indexedResources = new HashSet<IResource>();

for( IProject proj : projToResMap.keySet() ) {
Collection<IResource> projectIResources = projToResMap.get(proj);
Set<IResource> dependentModels = new HashSet<IResource>();

for (final Iterator resourceIter = projectIResources.iterator(); resourceIter.hasNext();) {
IResource resource = (IResource)resourceIter.next();
Collection models = WorkspaceResourceFinderUtil.getResourcesThatUse(resource);
models.removeAll(projectIResources);
dependentModels.addAll(models);
}

// index all the resources
// Filter out any IResources that have already been indexed
Set<IResource> unIndexedResources = new HashSet<IResource>();
for( IResource theRes : projectIResources ) {
if( !indexedResources.contains(theRes) ) {
unIndexedResources.add(theRes);
}
}
indexResources(monitor, unIndexedResources);
indexedResources.addAll(unIndexedResources);

unIndexedResources = new HashSet<IResource>();
for( IResource theRes : dependentModels ) {
if( !indexedResources.contains(theRes) ) {
unIndexedResources.add(theRes);
}
}
indexResources(monitor, unIndexedResources);
indexedResources.addAll(unIndexedResources);
}

// index all the resources
indexResources(monitor, iResources);
indexResources(monitor, dependentModels);

// Reset the modified state of all EMF resources to what it was
// prior to indexing. This needs to be done since indexing may
// mark an XSD resource as modified causing the XSDResourceValidator
// to not validate it.
setModifiedResources(modifiedResources);

// validate all the resources
validateResources(monitor, iResources, container, validateInContext);
validateResources(monitor, dependentModels, container, validateInContext);
// collection of models dependent on the models being validated
Set<IResource> validatedResources = new HashSet<IResource>();

for( IProject proj : projToResMap.keySet() ) {
Collection<IResource> projectIResources = projToResMap.get(proj);
Set<IResource> dependentModels = new HashSet<IResource>();

for (final Iterator resourceIter = projectIResources.iterator(); resourceIter.hasNext();) {
IResource resource = (IResource)resourceIter.next();
Collection models = WorkspaceResourceFinderUtil.getResourcesThatUse(resource);
models.removeAll(projectIResources);
dependentModels.addAll(models);
}

// index all the resources
// Filter out any IResources that have already been indexed
Set<IResource> unValidatedResources = new HashSet<IResource>();
for( IResource theRes : projectIResources ) {
if( !validatedResources.contains(theRes) ) {
unValidatedResources.add(theRes);
}
}

validateResources(monitor, unValidatedResources, container, validateInContext);
validatedResources.addAll(unValidatedResources);

unValidatedResources = new HashSet<IResource>();
for( IResource theRes : dependentModels ) {
if( !validatedResources.contains(theRes) ) {
unValidatedResources.add(theRes);
}
}

validateResources(monitor, unValidatedResources, container, validateInContext);
validatedResources.addAll(unValidatedResources);
}


// Reset the modified state of all EMF resources to what it was prior to validating
setModifiedResources(modifiedResources);
Expand Down Expand Up @@ -603,6 +663,8 @@ public static void validateResources( final IProgressMonitor monitor,

// set the resource scope (all model resources in open model projects)
final ModelWorkspace workspace = ModelerCore.getModelWorkspace();

// Find project for each IResource

try {
final Resource[] resourcesInScope = getWorkspaceResourcesInScope(workspace);
Expand Down Expand Up @@ -689,5 +751,22 @@ public static void validateResources( final IProgressMonitor monitor,
// #############################################################################
// # Protected methods
// #############################################################################

private static Map<IProject, Collection<IResource>> getProjectToResourcesMap(Collection iResources) {
Map<IProject, Collection<IResource>> map = new HashMap<IProject, Collection<IResource>>(10);

for( Object res : iResources ) {
IResource iResource = (IResource)res;
IProject proj = iResource.getProject();
Collection<IResource> resList = map.get(proj);
if( resList == null ) {
resList = new ArrayList<IResource>(10);
}
resList.add(iResource);
map.put(proj, resList);
}

return map;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ public boolean isReadOnly() {
if (this.file == null) {
return this.readonly;
}
return this.file.isReadOnly();
return ModelUtil.isIResourceReadOnly(this.file);
}

/**
Expand Down Expand Up @@ -468,7 +468,7 @@ public void save( final IProgressMonitor progress,
return;
}

if (this.file.isReadOnly()) {
if (! ModelUtil.isLockedSourceObject(file) && ModelUtil.isIResourceReadOnly(file)) {
final String pathInProj = this.file.getProject().getName() + IPath.SEPARATOR + this.file.getProjectRelativePath();
final Object[] params = new Object[] {pathInProj};
throw new ModelWorkspaceException(ModelerCore.Util.getString("ModelBufferImpl.Model_is_readonly", params)); //$NON-NLS-1$
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,9 @@ public boolean isReadOnly() {
// There are never errors if not opened ...
return true;
}
if( this.isLoaded() && ModelUtil.isLockedSourceObject(this)) {
return true;
}
return ModelUtil.isIResourceReadOnly(getResource());
}

Expand Down

0 comments on commit 07bcf1e

Please sign in to comment.