| /***************************************************************************** |
| * Copyright (c) 2013, 2017 CEA LIST. |
| * |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * CEA LIST - Initial API and implementation |
| *****************************************************************************/ |
| package org.eclipse.papyrus.cdo.internal.core.importer; |
| |
| import static com.google.common.collect.Iterables.filter; |
| import static org.eclipse.papyrus.cdo.internal.core.importer.DependencyAdapter.getDIResource; |
| import static org.eclipse.papyrus.cdo.internal.core.importer.DependencyAdapter.isDIResource; |
| |
| import java.util.Arrays; |
| import java.util.Collection; |
| import java.util.Collections; |
| import java.util.Set; |
| |
| import org.eclipse.core.resources.IContainer; |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.IResourceProxy; |
| import org.eclipse.core.resources.IResourceProxyVisitor; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.emf.common.util.URI; |
| import org.eclipse.emf.ecore.resource.Resource; |
| import org.eclipse.emf.ecore.resource.ResourceSet; |
| import org.eclipse.papyrus.cdo.core.importer.IModelDependentsProvider; |
| import org.eclipse.papyrus.cdo.internal.core.Activator; |
| |
| import com.google.common.collect.ImmutableList; |
| import com.google.common.collect.Sets; |
| |
| /** |
| * This is the WorkspaceDIDependentsProvider type. Enjoy. |
| */ |
| public class WorkspaceDIDependentsProvider implements IModelDependentsProvider { |
| |
| private boolean completedScan; |
| |
| public WorkspaceDIDependentsProvider() { |
| super(); |
| } |
| |
| @Override |
| public Collection<URI> getDependents(Resource resource, IProgressMonitor monitor) { |
| |
| if (!completedScan) { |
| scanWorkspace(resource.getResourceSet()); |
| } |
| |
| Set<URI> result = Sets.newHashSet(); |
| |
| // if it's a DI resource, get its dependencies' dependents and find |
| // their dependents that are unique DIs |
| Resource di = getDIResource(resource); |
| if (di != null) { |
| // the DI's dependencies are the model components |
| for (Resource component : DependencyAdapter.getDependencies(di)) { |
| // the components' dependents in other models are what we are |
| // interested in |
| for (Resource next : DependencyAdapter.getDependents(component)) { |
| Resource dependentDI = getDIResource(next); |
| if ((dependentDI != null) && (dependentDI != di)) { |
| result.add(dependentDI.getURI()); |
| } |
| } |
| } |
| } |
| |
| return result; |
| } |
| |
| @Override |
| public Collection<URI> getComponents(Resource diResource, IProgressMonitor monitor) { |
| Collection<URI> result; |
| |
| if (!diResource.getURI().isPlatformResource()) { |
| result = Collections.emptyList(); |
| } else { |
| ImmutableList.Builder<URI> uris = ImmutableList.builder(); |
| |
| final URI baseURI = diResource.getURI().trimSegments(1); |
| final String baseName = diResource.getURI().trimFileExtension().lastSegment(); |
| final IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(diResource.getURI().toPlatformString(true))); |
| final IContainer container = file.getParent(); |
| |
| try { |
| for (IFile next : filter(Arrays.asList(container.members()), IFile.class)) { |
| if (!next.equals(file) && baseName.equals(next.getFullPath().removeFileExtension().lastSegment())) { |
| uris.add(baseURI.appendSegment(next.getName())); |
| } |
| } |
| } catch (CoreException e) { |
| Activator.log.error("Could not determine components of model " + diResource.getURI(), e); //$NON-NLS-1$ |
| } |
| |
| result = uris.build(); |
| } |
| |
| return result; |
| } |
| |
| private void scanWorkspace(final ResourceSet resourceSet) { |
| completedScan = true; |
| |
| IResourceProxyVisitor visitor = new IResourceProxyVisitor() { |
| |
| @Override |
| public boolean visit(IResourceProxy proxy) throws CoreException { |
| |
| if ((proxy.getType() == IResource.FILE) && proxy.getName().endsWith(".di")) { //$NON-NLS-1$ |
| |
| String path = proxy.requestFullPath().toString(); |
| |
| try { |
| Resource resource = resourceSet.getResource(URI.createPlatformResourceURI(path, true), true); |
| |
| if ((resource != null) && isDIResource(resource)) { |
| // it's a Papyrus model. Initialize the |
| // dependencies |
| DependencyAdapter.getInstance(resource); |
| } |
| } catch (Exception e) { |
| // not a valid model resource. That's OK. |
| Resource resource = resourceSet.getResource(URI.createPlatformResourceURI(path, true), false); |
| if (resource != null) { |
| resource.unload(); |
| resourceSet.getResources().remove(resource); |
| resource.eAdapters().clear(); |
| } |
| } |
| } |
| |
| return true; |
| } |
| }; |
| |
| try { |
| ResourcesPlugin.getWorkspace().getRoot().accept(visitor, 0); |
| } catch (CoreException e) { |
| // TODO: report to user? |
| Activator.log.error(e); |
| } |
| } |
| } |