Skip to content

Package: ECPProjectImpl$Disposed

ECPProjectImpl$Disposed

nameinstructionbranchcomplexitylinemethod
ECPProjectImpl.Disposed(String)
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
addDisposeListener(ECPDisposable.DisposeListener)
M: 1 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
canDelete()
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%
compareTo(ECPElement)
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%
delete()
M: 1 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
dispose()
M: 1 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getDescription()
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%
getLabel()
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%
getName()
M: 3 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getProperties()
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%
getProvider()
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%
getProviderSpecificData()
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%
isDisposed()
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%
isStorable()
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%
notifyObjectsChanged(Collection)
M: 1 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
removeDisposeListener(ECPDisposable.DisposeListener)
M: 1 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
setDescription(String)
M: 1 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
setLabel(String)
M: 1 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
setProviderSpecificData(Object)
M: 1 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
write(ObjectOutput)
M: 1 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%

Coverage

1: /*******************************************************************************
2: * Copyright (c) 2011-2015 Eike Stepper (Berlin, Germany) 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: *
14: *******************************************************************************/
15: package org.eclipse.emf.ecp.internal.core;
16:
17: import java.io.IOException;
18: import java.io.ObjectInput;
19: import java.io.ObjectOutput;
20: import java.util.ArrayList;
21: import java.util.Collection;
22: import java.util.Collections;
23: import java.util.HashSet;
24: import java.util.Iterator;
25: import java.util.List;
26: import java.util.Map.Entry;
27: import java.util.Set;
28:
29: import org.eclipse.core.runtime.CoreException;
30: import org.eclipse.core.runtime.IConfigurationElement;
31: import org.eclipse.core.runtime.IExtension;
32: import org.eclipse.core.runtime.IExtensionPoint;
33: import org.eclipse.core.runtime.Platform;
34: import org.eclipse.emf.common.notify.Notifier;
35: import org.eclipse.emf.common.util.EList;
36: import org.eclipse.emf.ecore.EClass;
37: import org.eclipse.emf.ecore.EClassifier;
38: import org.eclipse.emf.ecore.EObject;
39: import org.eclipse.emf.ecore.EPackage;
40: import org.eclipse.emf.ecore.EPackage.Registry;
41: import org.eclipse.emf.ecore.EReference;
42: import org.eclipse.emf.ecp.core.ECPRepository;
43: import org.eclipse.emf.ecp.core.util.ECPElement;
44: import org.eclipse.emf.ecp.core.util.ECPFilterProvider;
45: import org.eclipse.emf.ecp.core.util.ECPModelContextAdapter;
46: import org.eclipse.emf.ecp.core.util.ECPProperties;
47: import org.eclipse.emf.ecp.core.util.ECPUtil;
48: import org.eclipse.emf.ecp.core.util.observer.ECPProjectPreDeleteObserver;
49: import org.eclipse.emf.ecp.internal.core.util.PropertiesElement;
50: import org.eclipse.emf.ecp.spi.core.InternalProject;
51: import org.eclipse.emf.ecp.spi.core.InternalProvider;
52: import org.eclipse.emf.ecp.spi.core.InternalProvider.LifecycleEvent;
53: import org.eclipse.emf.ecp.spi.core.InternalRepository;
54: import org.eclipse.emf.ecp.spi.core.util.ECPDisposable;
55: import org.eclipse.emf.ecp.spi.core.util.ECPDisposable.DisposeListener;
56: import org.eclipse.emf.edit.domain.EditingDomain;
57:
58: /**
59: * @author Eike Stepper
60: * @author Eugen Neufeld
61: */
62: public final class ECPProjectImpl extends PropertiesElement implements InternalProject, DisposeListener {
63:
64:         private static final String PACKAGEFILTERS_EXTENSIONPOINT = "org.eclipse.emf.ecp.core.filters"; //$NON-NLS-1$
65:
66:         private InternalRepository repository;
67:
68:         private InternalProvider provider;
69:
70:         private Object providerSpecificData;
71:
72:         private Set<EPackage> filteredEPackages = Collections.emptySet();
73:
74:         private Set<EClass> filteredEClasses = Collections.emptySet();
75:
76:         private EditingDomain editingDomain;
77:
78:         private boolean open;
79:
80:         private boolean initialized;
81:
82:         /**
83:          * Constructor used when an offline project is created.
84:          *
85:          * @param provider the {@link InternalProvider} of this project
86:          * @param name the name of the project
87:          * @param properties the properties of the project
88:          */
89:         public ECPProjectImpl(InternalProvider provider, String name, ECPProperties properties) {
90:                 super(name, properties);
91:                 this.provider = provider;
92:                 open = true;
93:                 setupFilteredEPackages();
94:                 notifyProvider(LifecycleEvent.INIT);
95:         }
96:
97:         /**
98:          * Constructor used when an online project is created.
99:          *
100:          * @param repository the {@link ECPRepository} of this project
101:          * @param name the name of the project
102:          * @param properties the properties of the project
103:          */
104:         public ECPProjectImpl(ECPRepository repository, String name, ECPProperties properties) {
105:                 super(name, properties);
106:
107:                 if (repository == null) {
108:                         throw new IllegalArgumentException("Repository is null"); //$NON-NLS-1$
109:                 }
110:
111:                 setRepository((InternalRepository) repository);
112:                 provider = getRepository().getProvider();
113:                 open = true;
114:                 setupFilteredEPackages();
115:                 notifyProvider(LifecycleEvent.INIT);
116:         }
117:
118:         /**
119:          * Constructor used to load persisted projects on startup.
120:          *
121:          * @param in the {@link ObjectInput} to parse
122:          * @throws IOException is thrown when file can't be read.
123:          */
124:         public ECPProjectImpl(ObjectInput in) throws IOException {
125:                 super(in);
126:
127:                 final boolean shared = in.readBoolean();
128:                 if (shared) {
129:                         final String repositoryName = in.readUTF();
130:                         InternalRepository repository = (InternalRepository) ECPUtil.getECPRepositoryManager().getRepository(
131:                                 repositoryName);
132:                         if (repository == null) {
133:                                 repository = new Disposed(repositoryName);
134:                         }
135:
136:                         setRepository(repository);
137:                         provider = repository.getProvider();
138:                 } else {
139:                         final String providerName = in.readUTF();
140:                         provider = (InternalProvider) ECPUtil.getECPProviderRegistry().getProvider(providerName);
141:                         if (provider == null) {
142:                                 throw new IllegalStateException("Provider not found: " + providerName); //$NON-NLS-1$
143:                         }
144:                 }
145:
146:                 open = in.readBoolean();
147:
148:                 final int filteredPackageSize = in.readInt();
149:                 filteredEPackages = new HashSet<EPackage>();
150:                 for (int i = 0; i < filteredPackageSize; i++) {
151:                         final EPackage ePackage = Registry.INSTANCE.getEPackage(in.readUTF());
152:                         if (ePackage != null) {
153:                                 filteredEPackages.add(ePackage);
154:                         }
155:                 }
156:                 final int filteredEClassSize = in.readInt();
157:                 filteredEClasses = new HashSet<EClass>();
158:                 for (int i = 0; i < filteredEClassSize; i++) {
159:                         final EPackage ePackage = Registry.INSTANCE.getEPackage(in.readUTF());
160:                         final EClassifier eClassifier = ePackage.getEClassifier(in.readUTF());
161:                         if (eClassifier instanceof EClass) {
162:                                 filteredEClasses.add((EClass) eClassifier);
163:                         }
164:                 }
165:
166:                 // do not initialize on startup, will be initializes by view
167:                 // notifyProvider(LifecycleEvent.INIT);
168:         }
169:
170:         /**
171:          * this method sets all known {@link EPackage}s as the filter.
172:          */
173:         private void setupFilteredEPackages() {
174:                 final List<ECPFilterProvider> filterProviders = new ArrayList<ECPFilterProvider>();
175:                 final IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(
176:                         PACKAGEFILTERS_EXTENSIONPOINT);
177:                 for (final IExtension extension : extensionPoint.getExtensions()) {
178:                         final IConfigurationElement configurationElement = extension.getConfigurationElements()[0];
179:                         try {
180:                                 final ECPFilterProvider filterProvider = (ECPFilterProvider) configurationElement
181:                                         .createExecutableExtension("class"); //$NON-NLS-1$
182:                                 filterProviders.add(filterProvider);
183:                         } catch (final CoreException ex) {
184:                                 Activator.log(ex);
185:                         }
186:                 }
187:
188:                 final Set<EPackage> ePackages = new HashSet<EPackage>();
189:                 final Set<String> filteredNsUris = new HashSet<String>();
190:                 for (final ECPFilterProvider filterProvider : filterProviders) {
191:                         filteredNsUris.addAll(filterProvider.getHiddenPackages());
192:                 }
193:
194:                 final Set<String> relevantURIs = new HashSet<String>(Registry.INSTANCE.keySet());
195:                 relevantURIs.removeAll(filteredNsUris);
196:
197:                 for (final String nsUri : relevantURIs) {
198:                         final EPackage ePackage = Registry.INSTANCE.getEPackage(nsUri);
199:                         ePackages.add(ePackage);
200:                 }
201:
202:                 setVisiblePackages(ePackages);
203:         }
204:
205:         @Override
206:         public void write(ObjectOutput out) throws IOException {
207:                 super.write(out);
208:                 if (repository != null) {
209:                         out.writeBoolean(true);
210:                         out.writeUTF(repository.getName());
211:                 } else if (provider != null) {
212:                         out.writeBoolean(false);
213:                         out.writeUTF(provider.getName());
214:                 }
215:
216:                 out.writeBoolean(open);
217:
218:                 out.writeInt(filteredEPackages.size());
219:                 for (final EPackage ePackage : filteredEPackages) {
220:                         if (ePackage == null) {
221:                                 Activator.log("There was a null EPackage in the list of filteredEPackages!"); //$NON-NLS-1$
222:                                 continue;
223:                         }
224:                         out.writeUTF(ePackage.getNsURI());
225:                 }
226:                 out.writeInt(filteredEClasses.size());
227:                 for (final EClass eClass : filteredEClasses) {
228:
229:                         out.writeUTF(eClass.getEPackage().getNsURI());
230:                         out.writeUTF(eClass.getName());
231:                 }
232:         }
233:
234:         /** {@inheritDoc} */
235:         @Override
236:         public String getType() {
237:                 return TYPE;
238:         }
239:
240:         /** {@inheritDoc} */
241:         @Override
242:         public void disposed(ECPDisposable disposable) {
243:                 if (disposable == repository) {
244:                         dispose();
245:                 }
246:         }
247:
248:         /** {@inheritDoc} */
249:         @Override
250:         public boolean isStorable() {
251:                 return true;
252:         }
253:
254:         /** {@inheritDoc} */
255:         @Override
256:         public InternalProject getProject() {
257:                 return this;
258:         }
259:
260:         /** {@inheritDoc} */
261:         @Override
262:         public InternalRepository getRepository() {
263:                 return repository;
264:         }
265:
266:         private void setRepository(InternalRepository repository) {
267:                 if (this.repository != null) {
268:                         this.repository.removeDisposeListener(this);
269:                 }
270:
271:                 this.repository = repository;
272:
273:                 if (this.repository != null) {
274:
275:                         this.repository.addDisposeListener(this);
276:                 }
277:         }
278:
279:         /** {@inheritDoc} */
280:         @Override
281:         public InternalProvider getProvider() {
282:                 return provider;
283:         }
284:
285:         /** {@inheritDoc} */
286:         @Override
287:         public Object getProviderSpecificData() {
288:                 return providerSpecificData;
289:         }
290:
291:         /** {@inheritDoc} */
292:         @Override
293:         public void setProviderSpecificData(Object providerSpecificData) {
294:                 this.providerSpecificData = providerSpecificData;
295:         }
296:
297:         /** {@inheritDoc} */
298:         @Override
299:         public void notifyObjectsChanged(Collection<Object> objects, boolean structural) {
300:                 if (objects != null && objects.size() != 0) {
301:                         // if (getProvider().isDirty(this)) {
302:                         // getProvider().doSave(this);
303:                         // }
304:                         ((ECPProjectManagerImpl) ECPUtil.getECPProjectManager()).notifyObjectsChanged(this, objects, structural);
305:                 }
306:         }
307:
308:         /** {@inheritDoc} */
309:         @Override
310:         public synchronized EditingDomain getEditingDomain() {
311:                 if (editingDomain == null) {
312:                         editingDomain = getProvider().createEditingDomain(this);
313:                 }
314:
315:                 return editingDomain;
316:         }
317:
318:         /**
319:          * Returns an object which is an instance of the given class associated with this object. Returns <code>null</code>
320:          * if
321:          * no such object can be found.
322:          * <p>
323:          * This implementation of the method declared by <code>IAdaptable</code> passes the request along to the platform's
324:          * adapter manager; roughly <code>Platform.getAdapterManager().getAdapter(this, adapter)</code>. Subclasses may
325:          * override this method (however, if they do so, they should invoke the method on their superclass to ensure that
326:          * the Platform's adapter manager is consulted).
327:          * </p>
328:          *
329:          * @param adapterType
330:          * the class to adapt to
331:          * @return the adapted object or <code>null</code>
332:          * @see org.eclipse.core.runtime.IAdaptable#getAdapter(Class) IAdaptable#getAdapter(Class)
333:          */
334:         @SuppressWarnings({ "unchecked", "rawtypes" })
335:         public Object getAdapter(Class adapterType) {
336:                 final InternalProvider provider = getProvider();
337:                 if (provider != null && !provider.isDisposed()) {
338:                         final Object result = provider.getAdapter(this, adapterType);
339:                         if (result != null) {
340:                                 return result;
341:                         }
342:                 }
343:
344:                 return Platform.getAdapterManager().getAdapter(this, adapterType);
345:         }
346:
347:         /** {@inheritDoc} */
348:         @Override
349:         public boolean canDelete() {
350:                 return true;
351:         }
352:
353:         /** {@inheritDoc} */
354:         @Override
355:         public void delete() {
356:                 ECPUtil.getECPObserverBus().notify(ECPProjectPreDeleteObserver.class).projectDelete(this);
357:                 // FIXME https://bugs.eclipse.org/bugs/show_bug.cgi?id=462399
358:                 cleanup();
359:                 getProvider().handleLifecycle(this, LifecycleEvent.REMOVE);
360:                 ((ECPProjectManagerImpl) ECPUtil.getECPProjectManager()).changeElements(Collections.singleton(getName()), null);
361:         }
362:
363:         /** {@inheritDoc} */
364:         @Override
365:         public synchronized boolean isOpen() {
366:                 return !isRepositoryDisposed() && open;
367:         }
368:
369:         /** {@inheritDoc} */
370:         @Override
371:         public synchronized void open() {
372:                 if (!isRepositoryDisposed()) {
373:                         setOpen(true);
374:                 }
375:         }
376:
377:         /** {@inheritDoc} */
378:         @Override
379:         public synchronized void close() {
380:                 if (!isRepositoryDisposed()) {
381:                         setOpen(false);
382:                 }
383:         }
384:
385:         private boolean isRepositoryDisposed() {
386:                 return repository != null && repository.isDisposed();
387:         }
388:
389:         private void setOpen(boolean open) {
390:                 boolean modified = false;
391:                 synchronized (this) {
392:                         if (open != this.open) {
393:                                 this.open = open;
394:                                 modified = true;
395:
396:                                 notifyProvider(open ? LifecycleEvent.INIT : LifecycleEvent.DISPOSE);
397:
398:                                 if (!open) {
399:                                         providerSpecificData = null;
400:                                         editingDomain = null;
401:                                 }
402:                         }
403:                 }
404:
405:                 if (modified) {
406:                         ((ECPProjectManagerImpl) ECPUtil.getECPProjectManager()).changeProject(this, open, true);
407:                 }
408:         }
409:
410:         /** {@inheritDoc} */
411:         @Override
412:         public void notifyProvider(LifecycleEvent event) {
413:                 // guard to prevent multiple initializations
414:                 if (event == LifecycleEvent.INIT && initialized) {
415:                         return;
416:                 }
417:                 final InternalProvider provider = getProvider();
418:
419:                 provider.handleLifecycle(this, event);
420:                 if (event == LifecycleEvent.INIT) {
421:                         initialized = true;
422:                         final Notifier root = provider.getRoot(this);
423:                         if (root != null) {
424:                                 root.eAdapters().add(new ECPModelContextAdapter(this));
425:                         }
426:                 }
427:         }
428:
429:         /** {@inheritDoc} */
430:         @Override
431:         public void undispose(InternalRepository repository) {
432:                 setRepository(repository);
433:                 notifyProvider(LifecycleEvent.INIT);
434:
435:                 if (open) {
436:                         ((ECPProjectManagerImpl) ECPUtil.getECPProjectManager()).changeProject(this, true, true);
437:                 }
438:         }
439:
440:         private void dispose() {
441:                 notifyProvider(LifecycleEvent.DISPOSE);
442:                 if (repository != null) {
443:                         setRepository(new Disposed(repository.getName()));
444:                 }
445:
446:                 providerSpecificData = null;
447:                 editingDomain = null;
448:
449:                 ((ECPProjectManagerImpl) ECPUtil.getECPProjectManager()).changeProject(this, false, false);
450:         }
451:
452:         /**
453:          * @author Eike Stepper
454:          */
455:         private static final class Disposed implements InternalRepository {
456:                 private final String name;
457:
458:                 Disposed(String name) {
459:                         this.name = name;
460:                 }
461:
462:                 /** {@inheritDoc} */
463:                 @Override
464:                 public String getName() {
465:                         return name;
466:                 }
467:
468:                 /** {@inheritDoc} */
469:                 @Override
470:                 public boolean isDisposed() {
471:                         return true;
472:                 }
473:
474:                 /** {@inheritDoc} */
475:                 @Override
476:                 public String getLabel() {
477:                         return null;
478:                 }
479:
480:                 /** {@inheritDoc} */
481:                 @Override
482:                 public String getDescription() {
483:                         return null;
484:                 }
485:
486:                 /** {@inheritDoc} */
487:                 @Override
488:                 public int compareTo(ECPElement o) {
489:                         return 0;
490:                 }
491:
492:                 /** {@inheritDoc} */
493:                 @Override
494:                 public ECPProperties getProperties() {
495:                         return null;
496:                 }
497:
498:                 /** {@inheritDoc} */
499:                 @Override
500:                 public boolean canDelete() {
501:                         return false;
502:                 }
503:
504:                 /** {@inheritDoc} */
505:                 @Override
506:                 public void delete() {
507:                 }
508:
509:                 /** {@inheritDoc} */
510:                 @Override
511:                 public boolean isStorable() {
512:                         return false;
513:                 }
514:
515:                 /** {@inheritDoc} */
516:                 @Override
517:                 public void write(ObjectOutput out) throws IOException {
518:                 }
519:
520:                 /** {@inheritDoc} */
521:                 @Override
522:                 public void setLabel(String label) {
523:                 }
524:
525:                 /** {@inheritDoc} */
526:                 @Override
527:                 public void setDescription(String description) {
528:                 }
529:
530:                 /** {@inheritDoc} */
531:                 @Override
532:                 public void dispose() {
533:                 }
534:
535:                 /** {@inheritDoc} */
536:                 @Override
537:                 public void addDisposeListener(DisposeListener listener) {
538:                 }
539:
540:                 /** {@inheritDoc} */
541:                 @Override
542:                 public void removeDisposeListener(DisposeListener listener) {
543:                 }
544:
545:                 /** {@inheritDoc} */
546:                 @Override
547:                 public InternalProvider getProvider() {
548:                         return null;
549:                 }
550:
551:                 /** {@inheritDoc} */
552:                 @Override
553:                 public Object getProviderSpecificData() {
554:                         return null;
555:                 }
556:
557:                 /** {@inheritDoc} */
558:                 @Override
559:                 public void setProviderSpecificData(Object data) {
560:                 }
561:
562:                 /** {@inheritDoc} */
563:                 @Override
564:                 public void notifyObjectsChanged(Collection<Object> objects) {
565:                 }
566:         }
567:
568:         /** {@inheritDoc} */
569:         @Override
570:         @SuppressWarnings("unchecked")
571:         public EList<Object> getContents() {
572:                 return (EList<Object>) getProvider().getElements(this);
573:         }
574:
575:         /** {@inheritDoc} */
576:         @Override
577:         public Set<EPackage> getUnsupportedEPackages() {
578:                 return getProvider().getUnsupportedEPackages(ECPUtil.getAllRegisteredEPackages(), getRepository());
579:         }
580:
581:         /** {@inheritDoc} */
582:         @Override
583:         public void setVisiblePackages(Set<EPackage> filteredPackages) {
584:                 filteredEPackages = filteredPackages;
585:                 ((ECPProjectManagerImpl) ECPUtil.getECPProjectManager()).storeElement(this);
586:         }
587:
588:         /** {@inheritDoc} */
589:         @Override
590:         public Set<EPackage> getVisiblePackages() {
591:                 return filteredEPackages;
592:         }
593:
594:         /** {@inheritDoc} */
595:         @Override
596:         public Set<EClass> getVisibleEClasses() {
597:                 return filteredEClasses;
598:         }
599:
600:         /** {@inheritDoc} */
601:         @Override
602:         public void setVisibleEClasses(Set<EClass> filteredEClasses) {
603:                 this.filteredEClasses = filteredEClasses;
604:                 ((ECPProjectManagerImpl) ECPUtil.getECPProjectManager()).storeElement(this);
605:         }
606:
607:         /** {@inheritDoc} */
608:         @Override
609:         public Iterator<EObject> getReferenceCandidates(EObject modelElement, EReference eReference) {
610:                 return getProvider().getLinkElements(this, modelElement, eReference);
611:         }
612:
613:         /** {@inheritDoc} */
614:         @Override
615:         public void saveContents() {
616:                 getProvider().doSave(this);
617:         }
618:
619:         /** {@inheritDoc} */
620:         @Override
621:         public boolean hasDirtyContents() {
622:                 return getProvider().isDirty(this);
623:         }
624:
625:         /** {@inheritDoc} */
626:         @Override
627:         public void deleteElements(Collection<Object> objects) {
628:                 getProvider().delete(this, objects);
629:                 notifyObjectsChanged(Collections.singleton((Object) this), true);
630:         }
631:
632:         /** {@inheritDoc} */
633:         @Override
634:         public InternalProject clone(String name) {
635:                 try {
636:                         super.clone();
637:                 } catch (final CloneNotSupportedException ex) {
638:                         Activator.log(ex);
639:                 }
640:                 final InternalProject project = new ECPProjectImpl(getProvider(), name, ECPUtil.createProperties());
641:                 project.setVisibleEClasses(getVisibleEClasses());
642:                 project.setVisiblePackages(getVisiblePackages());
643:                 getProvider().cloneProject(this, project);
644:                 return project;
645:         }
646:
647:         @Override
648:         protected void propertiesChanged(Collection<Entry<String, String>> oldProperties,
649:                 Collection<Entry<String, String>> newProperties) {
650:                 ((ECPProjectManagerImpl) ECPUtil.getECPProjectManager()).storeElement(this);
651:         }
652:
653:         /**
654:          * You must not call this anymore as properties are save automatically now.
655:          */
656:         @Override
657:         @Deprecated
658:         public void saveProperties() {
659:                 ((ECPProjectManagerImpl) ECPUtil.getECPProjectManager()).storeElement(this);
660:         }
661:
662:         /** {@inheritDoc} */
663:         @Override
664:         public boolean isModelRoot(Object object) {
665:                 return getProvider().getRoot(this).equals(object);
666:         }
667:
668:         /** {@inheritDoc} */
669:         @Override
670:         public boolean contains(Object object) {
671:                 return getProvider().contains(this, object);
672:         }
673: }