diff --git a/bundles/org.eclipse.e4.emf.xpath/.settings/.api_filters b/bundles/org.eclipse.e4.emf.xpath/.settings/.api_filters
new file mode 100644
index 00000000000..8c85f39506c
--- /dev/null
+++ b/bundles/org.eclipse.e4.emf.xpath/.settings/.api_filters
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/bundles/org.eclipse.e4.emf.xpath/META-INF/MANIFEST.MF b/bundles/org.eclipse.e4.emf.xpath/META-INF/MANIFEST.MF
index 34efac90f62..74cc46b7049 100644
--- a/bundles/org.eclipse.e4.emf.xpath/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.e4.emf.xpath/META-INF/MANIFEST.MF
@@ -2,13 +2,17 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %Bundle-Name
Bundle-SymbolicName: org.eclipse.e4.emf.xpath
-Bundle-Version: 0.4.300.qualifier
+Bundle-Version: 0.5.0.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-17
-Require-Bundle: org.apache.commons.jxpath;bundle-version="1.2.0",
- org.eclipse.emf.ecore;bundle-version="2.35.0",
+Require-Bundle: org.eclipse.emf.ecore;bundle-version="2.35.0",
org.eclipse.core.runtime;bundle-version="3.29.0"
Export-Package: org.eclipse.e4.emf.internal.xpath;x-internal:=true,
org.eclipse.e4.emf.internal.xpath.helper;x-friends:="org.eclipse.e4.emf.xpath.test,org.eclipse.e4.ui.model.workbench,org.eclipse.e4.ui.workbench",
org.eclipse.e4.emf.xpath
+Import-Package: org.apache.commons.jxpath;version="[1.3.0,2.0.0)",
+ org.apache.commons.jxpath.ri;version="[1.3.0,2.0.0)",
+ org.apache.commons.jxpath.ri.compiler;version="[1.3.0,2.0.0)",
+ org.apache.commons.jxpath.ri.model;version="[1.3.0,2.0.0)",
+ org.apache.commons.jxpath.util;version="[1.3.0,2.0.0)"
Bundle-Vendor: %Bundle-Vendor
Automatic-Module-Name: org.eclipse.e4.emf.xpath
diff --git a/bundles/org.eclipse.e4.emf.xpath/src/org/eclipse/e4/emf/internal/xpath/JXPathContextFactoryImpl.java b/bundles/org.eclipse.e4.emf.xpath/src/org/eclipse/e4/emf/internal/xpath/JXPathContextFactoryImpl.java
index 7d533fbffdb..a07e323ea7c 100644
--- a/bundles/org.eclipse.e4.emf.xpath/src/org/eclipse/e4/emf/internal/xpath/JXPathContextFactoryImpl.java
+++ b/bundles/org.eclipse.e4.emf.xpath/src/org/eclipse/e4/emf/internal/xpath/JXPathContextFactoryImpl.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010, 2015 BestSolution.at and others.
+ * Copyright (c) 2010, 2024 BestSolution.at and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -20,10 +20,9 @@
/**
* Factory creating context using JXPath
*
- * @param
- * the object the XPath is created for
+ * @param the object the XPath is created for
*/
-public class JXPathContextFactoryImpl extends XPathContextFactory {
+public class JXPathContextFactoryImpl extends XPathContextFactory {
@Override
public XPathContext newContext(XPathContext parentContext, Object contextBean) {
@@ -31,7 +30,7 @@ public XPathContext newContext(XPathContext parentContext, Object contextBean) {
}
@Override
- public XPathContext newContext(Type contextBean) {
+ public XPathContext newContext(T contextBean) {
return new JXPathContextImpl(contextBean);
}
diff --git a/bundles/org.eclipse.e4.emf.xpath/src/org/eclipse/e4/emf/internal/xpath/JXPathContextImpl.java b/bundles/org.eclipse.e4.emf.xpath/src/org/eclipse/e4/emf/internal/xpath/JXPathContextImpl.java
index d00443ff6c6..bb35950e263 100644
--- a/bundles/org.eclipse.e4.emf.xpath/src/org/eclipse/e4/emf/internal/xpath/JXPathContextImpl.java
+++ b/bundles/org.eclipse.e4.emf.xpath/src/org/eclipse/e4/emf/internal/xpath/JXPathContextImpl.java
@@ -21,6 +21,7 @@
import org.apache.commons.jxpath.JXPathContext;
import org.apache.commons.jxpath.NodeSet;
import org.apache.commons.jxpath.Pointer;
+import org.apache.commons.jxpath.util.TypeUtils;
import org.eclipse.e4.emf.xpath.XPathContext;
import org.eclipse.emf.ecore.EObject;
@@ -84,12 +85,15 @@ public Object getValue(String xpath) {
}
@Override
- public Object getValue(String xpath, Class> requiredType) {
- return context.getValue(xpath, requiredType);
+ public T getValue(String xpath, Class requiredType) {
+ Object value = context.getValue(xpath, requiredType);
+ @SuppressWarnings("unchecked")
+ T typedValue = (T) TypeUtils.convert(value, requiredType);
+ return typedValue;
}
@Override
- public Iterator iterate(String xpath) {
+ public Iterator iterate(String xpath) {
return context.iterate(xpath);
}
diff --git a/bundles/org.eclipse.e4.emf.xpath/src/org/eclipse/e4/emf/xpath/XPathContext.java b/bundles/org.eclipse.e4.emf.xpath/src/org/eclipse/e4/emf/xpath/XPathContext.java
index b0347132093..41ead7162c3 100644
--- a/bundles/org.eclipse.e4.emf.xpath/src/org/eclipse/e4/emf/xpath/XPathContext.java
+++ b/bundles/org.eclipse.e4.emf.xpath/src/org/eclipse/e4/emf/xpath/XPathContext.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010, 2015 BestSolution.at and others.
+ * Copyright (c) 2010, 2024 BestSolution.at and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -14,6 +14,12 @@
package org.eclipse.e4.emf.xpath;
import java.util.Iterator;
+import java.util.Spliterator;
+import java.util.Spliterators;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
+
+import org.apache.commons.jxpath.util.TypeUtils;
/**
* Context in which the xpath is executed
@@ -42,19 +48,35 @@ public interface XPathContext {
* required type
* @return Object found
*/
- Object getValue(String xpath, Class> requiredType);
+ T getValue(String xpath, Class requiredType);
/**
* Traverses the xpath and returns an Iterator of all results found for the
- * path. If the xpath matches no properties in the graph, the Iterator will
- * be empty, but not null.
+ * path. If the xpath matches no properties in the graph, the Iterator will be
+ * empty, but not null.
*
- * @param
- * the expected object type
+ * @param the expected object type
*
- * @param xpath
- * to iterate
+ * @param xpath to iterate
* @return Iterator<Object>
*/
- Iterator iterate(String xpath);
+ Iterator iterate(String xpath);
+
+ /**
+ * Traverses the xpath and returns an {@link Stream} of all results found for
+ * the path. If the xpath matches no properties in the graph, the stream will be
+ * empty.
+ *
+ * @param the expected object type
+ * @param xpath the xpath expression to iterate
+ * @param type the type of elements in the returned stream
+ * @return a stream of elements matching the specified xpath and of the given
+ * type
+ * @since 0.5
+ */
+ default Stream stream(String xpath, Class type) {
+ Iterator> iterator = iterate(xpath);
+ return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false)
+ .filter(e -> TypeUtils.canConvert(e, type)).map(e -> TypeUtils.convert(e, type)).map(type::cast);
+ }
}
diff --git a/bundles/org.eclipse.e4.emf.xpath/src/org/eclipse/e4/emf/xpath/XPathContextFactory.java b/bundles/org.eclipse.e4.emf.xpath/src/org/eclipse/e4/emf/xpath/XPathContextFactory.java
index d120c199701..5689f782614 100644
--- a/bundles/org.eclipse.e4.emf.xpath/src/org/eclipse/e4/emf/xpath/XPathContextFactory.java
+++ b/bundles/org.eclipse.e4.emf.xpath/src/org/eclipse/e4/emf/xpath/XPathContextFactory.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010, 2015 BestSolution.at and others.
+ * Copyright (c) 2010, 2024 BestSolution.at and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -18,39 +18,34 @@
/**
* Factory responsible to create an XPath-Context
*
- * @param
- * the object type the XPath is created for
+ * @param the object type the XPath is created for
*/
-public abstract class XPathContextFactory {
+public abstract class XPathContextFactory {
/**
* Creates a new XPathContext with the specified object as the root node.
*
- * @param contextBean
- * Object
+ * @param contextBean Object
* @return XPathContext
*/
- public abstract XPathContext newContext(Type contextBean);
+ public abstract XPathContext newContext(T contextBean);
/**
- * Creates a new XPathContext with the specified bean as the root node and
- * the specified parent context. Variables defined in a parent context can
- * be referenced in XPaths passed to the child context.
+ * Creates a new XPathContext with the specified bean as the root node and the
+ * specified parent context. Variables defined in a parent context can be
+ * referenced in XPaths passed to the child context.
*
- * @param parentContext
- * parent context
- * @param contextBean
- * Object
+ * @param parentContext parent context
+ * @param contextBean Object
* @return XPathContext
*/
- public abstract XPathContext newContext(XPathContext parentContext, Type contextBean);
+ public abstract XPathContext newContext(XPathContext parentContext, T contextBean);
/**
- * @param
- * the object type the xpath is created for
+ * @param the object type the xpath is created for
* @return Create a new XPath-Factory
*/
- public static XPathContextFactory newInstance() {
+ public static XPathContextFactory newInstance() {
return new JXPathContextFactoryImpl<>();
}
}
diff --git a/bundles/org.eclipse.e4.ui.model.workbench/META-INF/MANIFEST.MF b/bundles/org.eclipse.e4.ui.model.workbench/META-INF/MANIFEST.MF
index e5ee3efa821..5bae0a2e538 100644
--- a/bundles/org.eclipse.e4.ui.model.workbench/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.e4.ui.model.workbench/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.e4.ui.model.workbench;singleton:=true
-Bundle-Version: 2.4.300.qualifier
+Bundle-Version: 2.4.400.qualifier
Bundle-Vendor: %providerName
Bundle-Localization: plugin
Bundle-RequiredExecutionEnvironment: JavaSE-17
diff --git a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/fragment/impl/StringModelFragmentImpl.java b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/fragment/impl/StringModelFragmentImpl.java
index 895d3b0663a..fe5007880e1 100644
--- a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/fragment/impl/StringModelFragmentImpl.java
+++ b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/fragment/impl/StringModelFragmentImpl.java
@@ -16,8 +16,6 @@
package org.eclipse.e4.ui.model.fragment.impl;
import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
import java.util.List;
import java.util.regex.Pattern;
import org.eclipse.e4.emf.xpath.EcoreXPathContextFactory;
@@ -355,22 +353,14 @@ private void mergeIdList(MApplication application, List ret
private void mergeXPath(MApplication application, List ret, String xPath) {
List targetElements;
if ("/".equals(xPath)) {
- targetElements = Collections.singletonList(application);
+ targetElements = List.of(application);
} else {
XPathContextFactory f = EcoreXPathContextFactory.newInstance();
XPathContext xpathContext = f.newContext((EObject) application);
- Iterator