blob: 682622ec97e1cad199896ea931e8107dcca0a39d [file] [log] [blame]
/*****************************************************************************
* 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.ui.views;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.PlatformObject;
import org.eclipse.emf.cdo.CDOObject;
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.eresource.CDOResourceFolder;
import org.eclipse.emf.cdo.eresource.CDOResourceNode;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.papyrus.cdo.internal.ui.Activator;
import org.eclipse.papyrus.cdo.internal.ui.SharedImages;
import org.eclipse.swt.graphics.Image;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
/**
* This is the DIModel type. Enjoy.
*/
public class DIModel extends PlatformObject implements Adapter {
private final CDOResource resource;
public DIModel(CDOResource resource) {
this.resource = resource;
// ensure that I am the only adapter
for (Iterator<Adapter> iter = resource.eAdapters().iterator(); iter.hasNext();) {
if (iter.next() instanceof DIModel) {
iter.remove();
}
}
resource.eAdapters().add(this);
}
public final CDOResource getResource() {
return resource;
}
public static DIModel getInstance(CDOResource resource, boolean create) {
DIModel result = (DIModel) EcoreUtil.getExistingAdapter(resource, DIModel.class);
if ((result == null) && create) {
result = new DIModel(resource);
}
return result;
}
@Override
@SuppressWarnings("rawtypes")
public Object getAdapter(Class adapter) {
if ((adapter == CDOResourceNode.class) || (adapter == CDOResource.class) || (adapter == CDOObject.class) || (adapter == EObject.class)) {
return getResource();
}
return super.getAdapter(adapter);
}
public String getName() {
return resource.getURI().trimFileExtension().lastSegment();
}
public Image getImage() {
return SharedImages.getImage(Activator.ICON_PAPYRUS_MODEL);
}
public Object[] getChildren() {
List<CDOResource> result = Lists.newArrayListWithExpectedSize(3);
String name = getName();
if (name != null) {
Collection<? extends EObject> nodes;
CDOResourceFolder folder = getResource().getFolder();
if (folder != null) {
nodes = folder.getNodes();
} else {
CDOResource root = getResource().cdoResource();
if ((root != null) && root.isRoot()) {
nodes = root.getContents();
} else {
nodes = Collections.emptyList();
}
}
for (CDOResource next : Iterables.filter(nodes, CDOResource.class)) {
if (name.equals(next.getURI().trimFileExtension().lastSegment())) {
result.add(next);
}
}
}
return result.toArray();
}
@Override
public void notifyChanged(Notification notification) {
// pass
}
@Override
public Notifier getTarget() {
return resource;
}
@Override
public void setTarget(Notifier newTarget) {
// pass
}
@Override
public boolean isAdapterForType(Object type) {
return type == DIModel.class;
}
}