Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: 969d8ceca8978f172cc5ec6fcc7a8ec44b85955c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*****************************************************************************
 * Copyright (c) 2013 CEA LIST and others.
 * 
 * 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:
 *   CEA LIST - Initial API and implementation
 *   Christian W. Damus (CEA LIST) - Extracted some of the ScopeCollector implementation.
 *   
 *****************************************************************************/
package org.eclipse.papyrus.views.search.scope;

import java.util.Collection;
import java.util.Collections;

import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.papyrus.infra.core.resource.ModelMultiException;
import org.eclipse.papyrus.infra.core.resource.ModelSet;
import org.eclipse.papyrus.infra.core.resource.NotFoundException;
import org.eclipse.papyrus.infra.core.resource.sasheditor.SashModel;
import org.eclipse.papyrus.infra.emf.utils.BusinessModelResolver;
import org.eclipse.papyrus.infra.onefile.model.IPapyrusFile;
import org.eclipse.papyrus.views.search.Activator;
import org.eclipse.papyrus.views.search.Messages;
import org.eclipse.papyrus.views.search.utils.ModelUtils;


/**
 * The most basic scope-provider implementation, getting scopes for workspace resources.
 */
public class WorkspaceScopeProvider implements IScopeProvider {

	public WorkspaceScopeProvider() {
		super();
	}

	public Collection<URI> getScope() {
		//Go through the workspace root
		IResource root = ResourcesPlugin.getWorkspace().getRoot();

		return findPapyrusModels(root);
	}

	public Collection<URI> getScope(Object object) {
		Collection<URI> results;

		if(object instanceof IPapyrusFile) {
			results = findPapyrusModels(((IPapyrusFile)object).getMainFile());
		} else if(object instanceof IResource) {
			results = findPapyrusModels((IResource)object);
		} else {
			Object element = BusinessModelResolver.getInstance().getBusinessModel(object);
			if(element instanceof EObject) {
				// CDO resource *are* EObjects
				Resource eResource = (element instanceof Resource) ? (Resource) element : ((EObject)element).eResource();
				if(eResource != null) {
					ModelSet modelSet = null;
					
					try {
						modelSet = ModelUtils.openResource(eResource.getURI());
						SashModel sashModel = (SashModel)modelSet.getModelChecked(SashModel.MODEL_ID);
						Resource diResource = sashModel.getResource();
						if (diResource != null) {
							results = Collections.singletonList(diResource.getURI());
						} else {
							results = Collections.emptyList();
						}
					} catch (ModelMultiException e) {
						results = Collections.emptyList();
					} catch (NotFoundException e) {
						results = Collections.emptyList();
					} finally {
						if (modelSet != null) {
							try {
								modelSet.unload();
							} catch (Exception e) {
								Activator.log.error(e);
							}
						}
					}
					
				} else {
					results = Collections.emptyList();
				}

			} else {
				results = Collections.emptyList();
			}

		}
		
		return results;
	}

	/**
	 * Find all Papyrus models from a specific root
	 * 
	 * @param res
	 *        the root
	 * @return
	 *         the found Papyrus models
	 */
	static Collection<URI> findPapyrusModels(IResource res) {
		ResourceVisitor visitor = new ResourceVisitor();
		try {
			res.accept(visitor, IResource.DEPTH_INFINITE);
		} catch (CoreException e) {
			Activator.log.warn(Messages.ScopeCollector_0 + res);
		}

		return visitor.getParticipantURIs();
	}

}

Back to the top