Skip to content

Commit

Permalink
Draft for update infra of plant hier
Browse files Browse the repository at this point in the history
  • Loading branch information
oberlehner committed Jan 8, 2025
1 parent 8ca8d16 commit 281f523
Show file tree
Hide file tree
Showing 16 changed files with 616 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,10 @@ Require-Bundle: org.eclipse.core.resources,
org.eclipse.fordiac.ide.ui,
org.eclipse.fordiac.ide.typemanagement,
org.eclipse.ui.ide,
org.eclipse.ui.views.properties.tabbed
org.eclipse.emf.mwe.core,
org.eclipse.ui.views.properties.tabbed,
org.eclipse.fordiac.ide.model.commands,
org.eclipse.gef
Bundle-Vendor: Eclipse 4diac Project
Automatic-Module-Name: org.eclipse.fordiac.ide.hierarchymanager.ui
Bundle-RequiredExecutionEnvironment: JavaSE-21
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -274,4 +274,8 @@
</description>
</decorator>
</extension>
<extension
point="org.eclipse.fordiac.ide.model.commands.QualNameChangeListener">
<listener class = "org.eclipse.fordiac.ide.hierarchymanager.ui.listeners.HierachyManagerUpdateListener"/>
</extension>
</plugin>
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
/*******************************************************************************
* Copyright (c) 2024 Primetals Technology Austria GmbH
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Michael Oberlehner - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.fordiac.ide.hierarchymanager.ui.listeners;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.core.commands.operations.AbstractOperation;
import org.eclipse.core.resources.IProject;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.ecore.xmi.impl.XMLMapImpl;
import org.eclipse.fordiac.ide.hierarchymanager.model.hierarchy.HierarchyPackage;
import org.eclipse.fordiac.ide.hierarchymanager.model.hierarchy.Leaf;
import org.eclipse.fordiac.ide.hierarchymanager.model.hierarchy.RootLevel;
import org.eclipse.fordiac.ide.hierarchymanager.model.hierarchy.util.HierarchyResourceFactoryImpl;
import org.eclipse.fordiac.ide.hierarchymanager.ui.handlers.AbstractHierarchyHandler;
import org.eclipse.fordiac.ide.hierarchymanager.ui.operations.AbstractChangeHierarchyOperation;
import org.eclipse.fordiac.ide.hierarchymanager.ui.operations.UpdateLeafRefOperation;
import org.eclipse.fordiac.ide.hierarchymanager.ui.util.HierarchyManagerUtil;
import org.eclipse.fordiac.ide.hierarchymanager.ui.view.PlantHierarchyView;
import org.eclipse.fordiac.ide.model.commands.QualNameChange;
import org.eclipse.fordiac.ide.model.commands.QualNameChangeListener;
import org.eclipse.fordiac.ide.model.libraryElement.INamedElement;
import org.eclipse.fordiac.ide.model.libraryElement.UntypedSubApp;
import org.eclipse.fordiac.ide.model.typelibrary.TypeEntry;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;

public class HierachyManagerUpdateListener extends QualNameChangeListener {

private static EObject loadPlantHierachy(final IProject project) {
final Map<String, Object> loadOptions = new HashMap<>();
final ResourceSet hierarchyResouceSet = new ResourceSetImpl();
hierarchyResouceSet.getResourceFactoryRegistry().getExtensionToFactoryMap()
.put(PlantHierarchyView.PLANT_HIERARCHY_FILE_NAME_EXTENSION, new HierarchyResourceFactoryImpl());
loadOptions.put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
final XMLMapImpl map = new XMLMapImpl();
map.setNoNamespacePackage(HierarchyPackage.eINSTANCE);
loadOptions.put(XMLResource.OPTION_XML_MAP, map);
hierarchyResouceSet.getLoadOptions().put(XMLResource.OPTION_XML_MAP, map);
return PlantHierarchyView.loadHierachyForProject(project, hierarchyResouceSet, loadOptions);
}

@Override
public List<AbstractOperation> constructExecutableUndoOperations(final QualNameChange change, final Object o) {
// TODO Auto-generated method stub
return null;
}

@Override
protected List<AbstractOperation> constructExecutableOperations(final QualNameChange qualNameChange,
final Object rootLevel) {

final String identifier = qualNameChange.oldQualName();

final List<AbstractOperation> result = new ArrayList<>();

final List<Leaf> leafs = HierarchyManagerUtil.searchLeaf((RootLevel) rootLevel,
leafRef -> leafRef.contains(identifier));
if (leafs == null || leafs.isEmpty()) {
return null; // leaf may have been deleted in the meantime
}

final String newRef = qualNameChange.newQualName();

for (final Leaf leaf : leafs) {
result.add(new UpdateLeafRefOperation(leaf, newRef));
}

return result;
}

@Override
protected Object getReceiver(final TypeEntry key) {
return getPlantHierachy(key);
}

@Override
protected void executeOperation(final AbstractOperation op) {
AbstractHierarchyHandler.executeOperation((AbstractChangeHierarchyOperation) op);
}

private static RootLevel getPlantHierachy(final TypeEntry key) {
final IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
if (page != null) {
final PlantHierarchyView view = (PlantHierarchyView) page
.findView("org.eclipse.fordiac.ide.hierarchymanager.view"); //$NON-NLS-1$
if (view != null) {
return (RootLevel) view.getCommonViewer().getInput();
}
}
final IProject project = key.getFile().getProject();
return (RootLevel) loadPlantHierachy(project);
}

@Override
protected boolean isEnabled(final INamedElement element) {
return element instanceof UntypedSubApp;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/*******************************************************************************
* Copyright (c) 2024 Primetals Technology Austria GmbH
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Michael Oberlehner - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.fordiac.ide.hierarchymanager.ui.operations;

import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.fordiac.ide.hierarchymanager.model.hierarchy.Leaf;

public class UpdateLeafRefOperation extends AbstractChangeHierarchyOperation {

private final Leaf leaf;
private final String newRef;
private final String oldRef;

public UpdateLeafRefOperation(final Leaf level, final String newRef) {
super("Update Reference");
this.leaf = level;
this.newRef = newRef;
this.oldRef = leaf.getRef();
}

@Override
public IStatus execute(final IProgressMonitor monitor, final IAdaptable info) throws ExecutionException {
final String replace = leaf.getRef().replace(oldRef, newRef);

leaf.setRef(replace);

saveHierarchy(leaf, monitor);
return Status.OK_STATUS;
}

@Override
public IStatus redo(final IProgressMonitor monitor, final IAdaptable info) throws ExecutionException {
leaf.setRef(leaf.getRef().replace(oldRef, newRef));
saveHierarchy(leaf, monitor);
return Status.OK_STATUS;
}

@Override
public IStatus undo(final IProgressMonitor monitor, final IAdaptable info) throws ExecutionException {
leaf.setRef(leaf.getRef().replace(newRef, oldRef));
saveHierarchy(leaf, monitor);
return Status.OK_STATUS;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,17 @@
*******************************************************************************/
package org.eclipse.fordiac.ide.hierarchymanager.ui.util;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.fordiac.ide.hierarchymanager.model.hierarchy.Leaf;
import org.eclipse.fordiac.ide.hierarchymanager.model.hierarchy.Level;
import org.eclipse.fordiac.ide.hierarchymanager.model.hierarchy.Node;
import org.eclipse.fordiac.ide.hierarchymanager.model.hierarchy.RootLevel;
import org.eclipse.fordiac.ide.model.libraryElement.Application;
import org.eclipse.fordiac.ide.model.libraryElement.AutomationSystem;
import org.eclipse.fordiac.ide.model.libraryElement.Device;
Expand Down Expand Up @@ -96,4 +101,31 @@ public static EObject parseSubappPath(FBNetwork network, final String[] path) {
}
return retVal;
}

@FunctionalInterface
public interface LeafMatcher {
boolean match(String s);
}

public static List<Leaf> searchLeaf(final RootLevel rootLevel, final LeafMatcher matcher) {
final List<Leaf> result = new ArrayList<>();

for (final Level level : rootLevel.getLevels()) {
searchLeaf(level, result, matcher);
}
return result;
}

public static List<Leaf> searchLeaf(final Level level, final List<Leaf> result, final LeafMatcher matcher) {
for (final Node node : level.getChildren()) {
if (node instanceof final Level l) {
searchLeaf(l, result, matcher);
}
if (node instanceof final Leaf leaf && matcher.match(leaf.getRef())) {
result.add(leaf);
}
}
return result;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ public class PlantHierarchyView extends CommonNavigator implements ITabbedProper

private static final String PLANT_HIERARCHY_PROJECT = "PlantHierarchy.Project"; //$NON-NLS-1$
private static final String PLANT_HIERARCHY_FILE_NAME = ".plant.hier"; //$NON-NLS-1$
private static final String PLANT_HIERARCHY_FILE_NAME_EXTENSION = "hier"; //$NON-NLS-1$
public static final String PLANT_HIERARCHY_FILE_NAME_EXTENSION = "hier"; //$NON-NLS-1$

/** The PROPERTY_CONTRIBUTOR_ID. */
public static final String PROPERTY_CONTRIBUTOR_ID = "org.eclipse.fordiac.ide.hierarchymanager.ui.view"; //$NON-NLS-1$
Expand Down Expand Up @@ -117,7 +117,7 @@ protected Object getInitialInput() {
// we can not use setInput here as getInitialInput is interacting with the
// viewer in the base class
currentProject = project;
return loadHierachyForProject(currentProject);
return loadHierachyForProject(currentProject, hierarchyResouceSet, loadOptions);
}
}
}
Expand All @@ -141,11 +141,11 @@ public IProject getCurrentProject() {
return currentProject;
}

private void setInput(final IProject proj) {
public void setInput(final IProject proj) {
if (currentProject != proj) {
// the new project is different set
currentProject = proj;
getCommonViewer().setInput(loadHierachyForProject(proj));
getCommonViewer().setInput(loadHierachyForProject(proj, hierarchyResouceSet, loadOptions));
setPartName(getConfigurationElement().getAttribute("name")); //$NON-NLS-1$
}
}
Expand All @@ -171,12 +171,13 @@ private static IProject getProjectFromEObject(final EObject eObj) {
return null;
}

private EObject loadHierachyForProject(final IProject proj) {
public static EObject loadHierachyForProject(final IProject proj, final ResourceSet hierarchyResouceSet,
final Map<String, Object> loadOptions) {
final IFile file = proj.getFile(PLANT_HIERARCHY_FILE_NAME);
final URI uri = URI.createPlatformResourceURI(file.getFullPath().toString(), true);
if (!file.exists()) {
// try to create a new file
return createNewHierarchyFile(file, uri);
return createNewHierarchyFile(file, uri, hierarchyResouceSet);
}
// we don't want to load the resource content as we can not give the mapping
// options
Expand All @@ -194,7 +195,8 @@ private EObject loadHierachyForProject(final IProject proj) {
return null;
}

public EObject createNewHierarchyFile(final IFile file, final URI uri) {
public static EObject createNewHierarchyFile(final IFile file, final URI uri,
final ResourceSet hierarchyResouceSet) {
Resource resource = hierarchyResouceSet.getResource(uri, false);
if (resource == null) {
resource = new HierarchyResourceImpl(uri);
Expand Down
9 changes: 9 additions & 0 deletions plugins/org.eclipse.fordiac.ide.model.commands/plugin.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.2"?>
<plugin>
<extension-point
id="QualNameChangeListener"
name="Full Qualified Name Change Listener"
schema="schema/QualNameChangeListener.exsd">
</extension-point>
</plugin>
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Schema file written by PDE -->
<schema targetNamespace="org.eclipse.fordiac.ide.model.commands" xmlns="http://www.w3.org/2001/XMLSchema">
<annotation>
<appinfo>
<meta.schema plugin="org.eclipse.fordiac.ide.model.commands" id="org.eclipse.fordiac.ide.model.commands.QualNameChangeListener" name="Extension point for listening on changes of the full qualified name of an org.eclipse.fordiac.ide.model.libraryElement.INamedElement"/>
</appinfo>
<documentation>

</documentation>
</annotation>

<element name="listener">
<complexType>
<attribute name="class" type="java:org.eclipse.core.runtime.IExecutableExtension" use="required">
<annotation>
<documentation>

</documentation>
</annotation>
</attribute>
</complexType>
</element>

</schema>
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/*******************************************************************************
* Copyright (c) 2024 Primetals Technology Austria GmbH
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Michael Oberlehner - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.fordiac.ide.model.commands;

import org.eclipse.core.runtime.Assert;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.fordiac.ide.model.libraryElement.INamedElement;
import org.eclipse.fordiac.ide.model.libraryElement.LibraryElement;
import org.eclipse.fordiac.ide.model.typelibrary.TypeEntry;
import org.eclipse.gef.commands.Command;

public abstract class QualNameAffectedCommand extends Command implements ScopedCommand {

private final String oldQualName;

protected QualNameAffectedCommand(final String oldQualName) {
this.oldQualName = oldQualName;
}

protected String getOldQualName() {
return oldQualName;
}

protected abstract String getNewQualName();

protected abstract INamedElement getNotifier();

/**
* encapsulate the change to not provide the command to the receiver
*/
public QualNameChange getQualNameChange() {
return new QualNameChange(getOldQualName(), getNewQualName(), getNotifier(), getTypeEntry(getNotifier()));
}

protected static TypeEntry getTypeEntry(final INamedElement notifier) {
final EObject rootContainer = EcoreUtil.getRootContainer(notifier);
Assert.isTrue(rootContainer instanceof LibraryElement);
if (rootContainer instanceof final LibraryElement element) {
return element.getTypeEntry();
}
return null;
}

}
Loading

0 comments on commit 281f523

Please sign in to comment.