| package org.eclipse.capra.ui.adapters; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| import java.util.stream.Collectors; |
| |
| import org.eclipse.capra.core.adapters.TracePersistenceAdapter; |
| import org.eclipse.capra.core.helpers.ArtifactHelper; |
| import org.eclipse.capra.core.helpers.ExtensionPointHelper; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.EStructuralFeature; |
| import org.eclipse.emf.ecore.resource.ResourceSet; |
| import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; |
| import org.eclipse.ui.views.properties.IPropertyDescriptor; |
| import org.eclipse.ui.views.properties.IPropertySource; |
| import org.eclipse.ui.views.properties.PropertyDescriptor; |
| import org.eclipse.ui.views.properties.TextPropertyDescriptor; |
| |
| /** |
| * An {@link IPropertySource} for artifacts. It provides access to all |
| * properties of the {@link EObject} representing the artifact. In practice, |
| * that means that it either shows the properties of the {@link ArtifactWrapper} |
| * or the {@code EObject} that is linked to. |
| * |
| * @author Jan-Philipp Steghöfer |
| * |
| */ |
| public class ArtifactAdapter implements IPropertySource { |
| |
| private static enum DescriptorIDs { |
| LABEL, LOCATION |
| } |
| |
| private static final String CATEGORY_NAME = "General"; |
| |
| private final EObject artifact; |
| |
| private final ArtifactHelper artifactHelper; |
| |
| /** |
| * Creates a new {@link ArtifactAdapter} that represents the provided artifact. |
| * |
| * @param theItem the artifact this adapter represents. |
| */ |
| public ArtifactAdapter(EObject theItem) { |
| this.artifact = theItem; |
| |
| TracePersistenceAdapter persistenceAdapter = ExtensionPointHelper.getTracePersistenceAdapter().get(); |
| ResourceSet resourceSet = new ResourceSetImpl(); |
| EObject artifactModel = persistenceAdapter.getArtifactWrappers(resourceSet); |
| artifactHelper = new ArtifactHelper(artifactModel); |
| } |
| |
| @Override |
| public Object getEditableValue() { |
| return this; |
| } |
| |
| @Override |
| public IPropertyDescriptor[] getPropertyDescriptors() { |
| List<IPropertyDescriptor> propertyDescriptors = new ArrayList<>(); |
| if (!isArtifactWrapper(artifact)) { |
| PropertyDescriptor labelDescriptor = new PropertyDescriptor(DescriptorIDs.LABEL, "Label"); |
| labelDescriptor.setCategory(CATEGORY_NAME); |
| propertyDescriptors.add(labelDescriptor); |
| PropertyDescriptor locationDescriptor = new PropertyDescriptor(DescriptorIDs.LOCATION, "Location"); |
| locationDescriptor.setCategory(CATEGORY_NAME); |
| propertyDescriptors.add(locationDescriptor); |
| } |
| propertyDescriptors.addAll(artifact.eClass().getEAllAttributes().stream() |
| .map(attribute -> new TextPropertyDescriptor(attribute.getName(), attribute.getName())) |
| .collect(Collectors.toList())); |
| |
| IPropertyDescriptor[] dummyList = new IPropertyDescriptor[propertyDescriptors.size()]; |
| return propertyDescriptors.toArray(dummyList); |
| } |
| |
| @Override |
| public Object getPropertyValue(Object id) { |
| if (id.equals(DescriptorIDs.LABEL)) { |
| return artifactHelper.getArtifactLabel(artifact); |
| } else if (id.equals(DescriptorIDs.LOCATION)) { |
| return artifactHelper.getArtifactLocation(artifact); |
| } else { |
| EStructuralFeature a = artifact.eClass().getEStructuralFeature((String) id); |
| return artifact.eGet(a); |
| } |
| } |
| |
| @Override |
| public boolean isPropertySet(Object id) { |
| return false; |
| } |
| |
| @Override |
| public void resetPropertyValue(Object id) { |
| // Deliberately do nothing |
| } |
| |
| @Override |
| public void setPropertyValue(Object id, Object value) { |
| EStructuralFeature feature = artifact.eClass().getEStructuralFeature((String) id); |
| artifact.eSet(feature, value); |
| } |
| |
| private boolean isArtifactWrapper(EObject artifact) { |
| return !artifact.equals(artifactHelper.unwrapWrapper(artifact)); |
| } |
| |
| } |