Skip to content

Package: ECPProjectManagerImpl

ECPProjectManagerImpl

nameinstructionbranchcomplexitylinemethod
ECPProjectManagerImpl()
M: 0 C: 6
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
ECPProjectManagerImpl(String)
M: 0 C: 6
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
changeProject(ECPProject, boolean, boolean)
M: 4 C: 16
80%
M: 1 C: 1
50%
M: 1 C: 1
50%
M: 1 C: 5
83%
M: 0 C: 1
100%
createProject(ECPProject, String)
M: 0 C: 11
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
createProject(ECPProvider, String)
M: 0 C: 6
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
createProject(ECPProvider, String, ECPProperties)
M: 14 C: 32
70%
M: 1 C: 3
75%
M: 1 C: 2
67%
M: 2 C: 5
71%
M: 0 C: 1
100%
createProject(ECPRepository, String, ECPProperties)
M: 0 C: 28
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 4
100%
M: 0 C: 1
100%
createProject(InternalProject)
M: 0 C: 12
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
doActivate()
M: 0 C: 7
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
doDeactivate()
M: 7 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
elementsChanged(Collection, Collection)
M: 0 C: 5
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
getInternalProject(Object)
M: 2 C: 29
94%
M: 3 C: 3
50%
M: 3 C: 1
25%
M: 1 C: 5
83%
M: 0 C: 1
100%
getProject(Object)
M: 5 C: 18
78%
M: 1 C: 3
75%
M: 1 C: 2
67%
M: 1 C: 6
86%
M: 0 C: 1
100%
getProject(String)
M: 0 C: 5
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
getProjects()
M: 0 C: 5
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
initializeFolder(String)
M: 0 C: 34
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 7
100%
M: 0 C: 1
100%
initializeProjects()
M: 6 C: 27
82%
M: 1 C: 5
83%
M: 1 C: 3
75%
M: 3 C: 6
67%
M: 0 C: 1
100%
isRemoveDisposedElements()
M: 2 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
loadElement(ObjectInput)
M: 5 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
notifyObjectsChanged(ECPProject, Collection, boolean)
M: 4 C: 26
87%
M: 1 C: 1
50%
M: 1 C: 1
50%
M: 1 C: 7
88%
M: 0 C: 1
100%
notifyObservers(Collection, Collection)
M: 0 C: 9
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
projectExists(String)
M: 0 C: 8
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
repositoriesChanged(Collection, Collection)
M: 32 C: 15
32%
M: 9 C: 1
10%
M: 5 C: 1
17%
M: 4 C: 4
50%
M: 0 C: 1
100%
setECPObserverBus(ECPObserverBus)
M: 0 C: 4
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%

Coverage

1: /*******************************************************************************
2: * Copyright (c) 2011-2012 EclipseSource Muenchen GmbH and others.
3: *
4: * All rights reserved. This program and the accompanying materials
5: * are made available under the terms of the Eclipse Public License 2.0
6: * which accompanies this distribution, and is available at
7: * https://www.eclipse.org/legal/epl-2.0/
8: *
9: * SPDX-License-Identifier: EPL-2.0
10: *
11: * Contributors:
12: * Eike Stepper - initial API and implementation
13: * Eugen Neufeld - JavaDoc and changes
14: *******************************************************************************/
15: package org.eclipse.emf.ecp.internal.core;
16:
17: import java.io.File;
18: import java.io.IOException;
19: import java.io.ObjectInput;
20: import java.util.Collection;
21: import java.util.Collections;
22: import java.util.HashSet;
23: import java.util.Set;
24:
25: import org.eclipse.core.runtime.IStatus;
26: import org.eclipse.emf.ecp.core.ECPProject;
27: import org.eclipse.emf.ecp.core.ECPProjectManager;
28: import org.eclipse.emf.ecp.core.ECPProvider;
29: import org.eclipse.emf.ecp.core.ECPRepository;
30: import org.eclipse.emf.ecp.core.exceptions.ECPProjectWithNameExistsException;
31: import org.eclipse.emf.ecp.core.util.ECPContainer;
32: import org.eclipse.emf.ecp.core.util.ECPProjectAware;
33: import org.eclipse.emf.ecp.core.util.ECPProperties;
34: import org.eclipse.emf.ecp.core.util.ECPUtil;
35: import org.eclipse.emf.ecp.core.util.observer.ECPObserver;
36: import org.eclipse.emf.ecp.core.util.observer.ECPObserverBus;
37: import org.eclipse.emf.ecp.core.util.observer.ECPProjectContentChangedObserver;
38: import org.eclipse.emf.ecp.core.util.observer.ECPProjectContentTouchedObserver;
39: import org.eclipse.emf.ecp.core.util.observer.ECPProjectOpenClosedObserver;
40: import org.eclipse.emf.ecp.core.util.observer.ECPProjectsChangedObserver;
41: import org.eclipse.emf.ecp.core.util.observer.ECPRepositoriesChangedObserver;
42: import org.eclipse.emf.ecp.internal.core.util.InternalUtil;
43: import org.eclipse.emf.ecp.internal.core.util.PropertiesStore;
44: import org.eclipse.emf.ecp.spi.core.InternalProject;
45: import org.eclipse.emf.ecp.spi.core.InternalProvider;
46: import org.eclipse.emf.ecp.spi.core.InternalProvider.LifecycleEvent;
47: import org.eclipse.emf.ecp.spi.core.InternalRepository;
48: import org.eclipse.net4j.util.AdapterUtil;
49:
50: /**
51: * This class manages the available {@link ECPProject ECPProjects}.
52: *
53: * @author Eike Stepper
54: * @author Eugen Neufeld
55: */
56: public final class ECPProjectManagerImpl extends PropertiesStore<InternalProject, ECPObserver> implements
57:         ECPProjectManager, ECPRepositoriesChangedObserver {
58:
59:         private static final String PROJECT_FOLDERNAME = "projects"; //$NON-NLS-1$
60:
61:         /**
62:          * This variable defines whether the projects where already initialized. Default value is false.
63:          */
64:         private boolean initializedProjects;
65:
66:         private ECPObserverBus ecpObserverBus;
67:
68:         /**
69:          * Should not be called directly, use service instead.
70:          */
71:         public ECPProjectManagerImpl() {
72:                 initializeFolder(null);
73:         }
74:
75:         /**
76:          * @param sessionId Will be appended to the folder name so that there are different folders for each session
77:          */
78:         public ECPProjectManagerImpl(String sessionId) {
79:                 initializeFolder(sessionId);
80:         }
81:
82:         private void initializeFolder(String sessionId) {
83:
84:                 final File stateLocation = Activator.getInstance().getStateLocation().toFile();
85:                 setFolder(new File(stateLocation, PROJECT_FOLDERNAME));
86:                 String finalFolderName = PROJECT_FOLDERNAME;
87:•                if (sessionId != null) {
88:                         finalFolderName += "-" + sessionId; //$NON-NLS-1$
89:                 }
90:                 setFolder(new File(stateLocation, finalFolderName));
91:         }
92:
93:         /**
94:          * Bindes the ECPObserverBus.
95:          *
96:          * @param ecpObserverBus the bus
97:          */
98:         public void setECPObserverBus(ECPObserverBus ecpObserverBus) {
99:                 this.ecpObserverBus = ecpObserverBus;
100:         }
101:
102:         /** {@inheritDoc} */
103:         @Override
104:         public ECPProject createProject(ECPProvider provider, String name) throws ECPProjectWithNameExistsException {
105:                 return this.createProject(provider, name, ECPUtil.createProperties());
106:         }
107:
108:         /** {@inheritDoc} */
109:         @Override
110:         public ECPProject createProject(ECPProvider provider, String name, ECPProperties properties)
111:                 throws ECPProjectWithNameExistsException {
112:•                if (projectExists(name)) {
113:                         throw new ECPProjectWithNameExistsException("A project with name " + name + " already exists"); //$NON-NLS-1$ //$NON-NLS-2$
114:                 }
115:•                if (!provider.hasCreateProjectWithoutRepositorySupport()) {
116:                         throw new UnsupportedOperationException("The provider " + provider.getLabel() //$NON-NLS-1$
117:                                 + " doesn't support the creation of projects without an ECPRepository (aka offline project)."); //$NON-NLS-1$
118:                 }
119:                 final InternalProject project = new ECPProjectImpl((InternalProvider) provider, name, properties);
120:                 return createProject(project);
121:         }
122:
123:         /** {@inheritDoc} */
124:         @Override
125:         public ECPProject createProject(ECPRepository repository, String name, ECPProperties properties)
126:                 throws ECPProjectWithNameExistsException {
127:•                if (projectExists(name)) {
128:                         throw new ECPProjectWithNameExistsException("A project with name " + name + " already exists"); //$NON-NLS-1$ //$NON-NLS-2$
129:                 }
130:                 final InternalProject project = new ECPProjectImpl(repository, name, properties);
131:                 return createProject(project);
132:         }
133:
134:         /** {@inheritDoc} */
135:         @Override
136:         public ECPProject createProject(ECPProject project, String name) {
137:                 final InternalProject internalProject = (InternalProject) project;
138:                 final InternalProject newProject = internalProject.clone(name);
139:                 return createProject(newProject);
140:         }
141:
142:         private boolean projectExists(String name) {
143:•                return getProject(name) != null;
144:         }
145:
146:         private ECPProject createProject(InternalProject project) {
147:                 project.getProvider().handleLifecycle(project, LifecycleEvent.CREATE);
148:                 changeElements(null, Collections.singleton(project));
149:
150:                 return project;
151:         }
152:
153:         /** {@inheritDoc} */
154:         @Override
155:         public InternalProject getProject(Object adaptable) {
156:•                if (adaptable instanceof ECPProjectAware) {
157:                         final ECPProjectAware projectAware = (ECPProjectAware) adaptable;
158:                         return (InternalProject) projectAware.getProject();
159:                 }
160:                 final InternalProject result = getInternalProject(adaptable);
161:•                if (result != null) {
162:                         return result;
163:                 }
164:                 return AdapterUtil.adapt(adaptable, InternalProject.class);
165:         }
166:
167:         private InternalProject getInternalProject(Object object) {
168:•                for (final ECPProvider provider : ECPUtil.getECPProviderRegistry().getProviders()) {
169:                         final InternalProvider internalProvider = (InternalProvider) ECPUtil.getResolvedElement(provider);
170:                         final ECPContainer modelContext = internalProvider.getModelContext(object);
171:•                        if (modelContext != null && InternalProject.class.isInstance(modelContext)) {
172:                                 return (InternalProject) modelContext;
173:                         }
174:                 }
175:
176:                 return null;
177:         }
178:
179:         /** {@inheritDoc} */
180:         @Override
181:         public InternalProject getProject(String name) {
182:                 return getElement(name);
183:         }
184:
185:         /** {@inheritDoc} */
186:         @Override
187:         public Collection<ECPProject> getProjects() {
188:                 initializeProjects();
189:                 return (Collection) getElements();
190:         }
191:
192:         /**
193:          * @param projects
194:          */
195:         private void initializeProjects() {
196:•                if (!initializedProjects) {
197:
198:•                        for (final InternalProject project : getElements()) {
199:
200:•                                if (!project.getProvider().modelExists(project)) {
201:                                         project.close();
202:                                         Activator.log(IStatus.ERROR, "Project Data was deleted since last start. Project is now closed."); //$NON-NLS-1$
203:
204:                                         continue;
205:                                 }
206:                                 project.notifyProvider(LifecycleEvent.INIT);
207:                         }
208:                         initializedProjects = true;
209:                 }
210:         }
211:
212:         /**
213:          * This is called by projects to notify observers if a project gets openes or closed.
214:          *
215:          * @param project the project that called this method
216:          * @param opened whether the project is open
217:          * @param store whether to store the change
218:          */
219:         public void changeProject(ECPProject project, boolean opened, boolean store) {
220:•                if (store) {
221:                         storeElement((InternalProject) project);
222:                 }
223:
224:                 try {
225:                         ecpObserverBus.notify(ECPProjectOpenClosedObserver.class).projectChanged(project, opened);
226:                 } catch (final RuntimeException ex) {
227:                         Activator.log(ex);
228:                 }
229:         }
230:
231:         /**
232:          * This is called by projects to notify observers about object changes.
233:          * First the {@link ECPProjectContentChangedObserver IECPProjectObjectsChangedObservers} are notified then the
234:          * {@link ECPProjectsChangedObserver IECPProjectsChangedUIObservers}.
235:          *
236:          * @param project the project that called this method
237:          * @param objects the objects that changed
238:          * @param structural whether the changes where structural
239:          */
240:         public void notifyObjectsChanged(ECPProject project, Collection<Object> objects, boolean structural) {
241:
242:                 final Collection<Object> affected = ecpObserverBus.notify(ECPProjectContentChangedObserver.class)
243:                         .objectsChanged(project, objects);
244:                 final Set<Object> toUpdate = new HashSet<Object>(objects);
245:•                if (affected != null) {
246:                         toUpdate.addAll(affected);
247:                 }
248:                 ecpObserverBus.notify(ECPProjectContentTouchedObserver.class)
249:                         .contentTouched(project, toUpdate, structural);
250:
251:         }
252:
253:         /** {@inheritDoc} */
254:         @Override
255:         public void repositoriesChanged(Collection<ECPRepository> oldRepositories,
256:                 Collection<ECPRepository> newRepositories) {
257:                 final Set<ECPRepository> addedRepositories = InternalUtil.getAddedElements(oldRepositories, newRepositories);
258:                 final Collection<InternalProject> projects = getElements();
259:
260:•                for (final ECPRepository repository : addedRepositories) {
261:•                        for (final InternalProject project : projects) {
262:•                                if (!project.isOpen() && project.getRepository() != null
263:•                                        && repository.getName().equals(project.getRepository().getName())) {
264:                                         project.undispose((InternalRepository) repository);
265:                                 }
266:                         }
267:                 }
268:         }
269:
270:         @Override
271:         protected void elementsChanged(Collection<InternalProject> oldElements, Collection<InternalProject> newElements) {
272:                 super.elementsChanged(oldElements, newElements);
273:         }
274:
275:         @Override
276:         protected void doActivate() throws Exception {
277:                 super.doActivate();
278:                 ecpObserverBus.register(this);
279:         }
280:
281:         @Override
282:         protected void doDeactivate() throws Exception {
283:                 ecpObserverBus.unregister(this);
284:                 super.doDeactivate();
285:         }
286:
287:         @Override
288:         protected InternalProject loadElement(ObjectInput in) throws IOException {
289:                 return new ECPProjectImpl(in);
290:         }
291:
292:         // @Override
293:         // protected InternalProject[] createElementArray(int size) {
294:         // return new InternalProject[size];
295:         // }
296:
297:         @Override
298:         protected void notifyObservers(Collection<InternalProject> oldElements, Collection<InternalProject> newElements)
299:                 throws Exception {
300:                 ecpObserverBus.notify(ECPProjectsChangedObserver.class)
301:                         .projectsChanged((Collection) oldElements, (Collection) newElements);
302:         }
303:
304:         @Override
305:         protected boolean isRemoveDisposedElements() {
306:                 return false;
307:         }
308:
309: }