package org.flowerplatform.editor.model.properties;
import org.eclipse.emf.ecore.EObject;
import org.flowerplatform.communication.CommunicationPlugin;
import org.flowerplatform.communication.command.AbstractServerCommand;
import org.flowerplatform.communication.service.ServiceInvocationContext;
import org.flowerplatform.communication.stateful_service.ServiceInvocationContextUpgradedToStatefulServiceInvocationContext;
import org.flowerplatform.editor.model.properties.remote.DiagramSelectedItem;
import org.flowerplatform.editor.model.remote.DiagramEditableResource;
import org.flowerplatform.editor.model.remote.DiagramEditorStatefulService;
import org.flowerplatform.emf_model.notation.View;
import org.flowerplatform.properties.providers.IPropertiesProvider;
import org.flowerplatform.properties.remote.SelectedItem;
/**
* @author Cristian Spiescu
*/
public abstract class AbstractModelPropertiesProvider<RES_SEL_ITEM extends EObject> implements IPropertiesProvider {
protected DiagramEditorStatefulService getDiagramEditorStatefulService(DiagramSelectedItem selectedItem) {
String diagramEditorStatefulServiceId = selectedItem.getEditorStatefulServiceId();
return (DiagramEditorStatefulService) CommunicationPlugin.getInstance().getServiceRegistry().getService(diagramEditorStatefulServiceId);
}
@SuppressWarnings("unchecked")
public RES_SEL_ITEM resolveSelectedItem(DiagramSelectedItem selectedItem) {
return (RES_SEL_ITEM) getViewById(selectedItem);
}
protected View getViewById(DiagramSelectedItem selectedItem) {
String diagramEditableResourcePath = selectedItem.getDiagramEditableResourcePath();
String id = selectedItem.getXmiID();
DiagramEditableResource diagramEditableResource = (DiagramEditableResource) getDiagramEditorStatefulService(selectedItem).getEditableResource(diagramEditableResourcePath);
return (View) diagramEditableResource.getEObjectById(id);
}
@Override
public boolean setProperty(ServiceInvocationContext context, final SelectedItem selectedItem, final String propertyName, final Object propertyValue) {
final RES_SEL_ITEM resolvedSelectedItem = resolveSelectedItem((DiagramSelectedItem) selectedItem);
return getDiagramEditorStatefulService((DiagramSelectedItem) selectedItem).attemptUpdateEditableResourceContent(
new ServiceInvocationContextUpgradedToStatefulServiceInvocationContext(context),
((DiagramSelectedItem) selectedItem).getDiagramEditableResourcePath(),
new AbstractServerCommand() {
@Override
public void executeCommand() {
doSetProperty((DiagramSelectedItem) selectedItem, resolvedSelectedItem, propertyName, propertyValue);
}
});
}
/**
* This method is executed under the {@link DiagramEditorStatefulService} shell. I.e. lock logic happens, change recording, etc.
*/
abstract protected void doSetProperty(DiagramSelectedItem selectedItem, RES_SEL_ITEM resolvedSelectedItem, String propertyName, Object propertyValue);
}