Skip to content

Commit d9d17fa

Browse files
committed
tmf: add capabilities data structure to IDataProviderDescriptor
With this a data provider factory instance can advertise special capabilities that can be applied for the given data provider. This commit adds code for that and implements the "canCreate" and "canDelete" capability. "canCreate" indicates that this instance can create a derived data provider. Use the IDataProviderFactory method getAdapter(ITmfDataProviderConfigurator.class) to obtains an instance of ITmfDataProviderConfigurator. This interface has methods to get List<ITmfConfigurationSourceType> describing the parameters needed to create a derived data provider using method ITmfDataProviderConfigurator#createDataProvider. "canDelete" indicates a the data provider can be deleted using method ITmfDataProviderConfigurator#deleteDataProviderDescriptor. [Added] capabilities data structure to IDataProviderDescriptor Signed-off-by: Bernd Hufmann <[email protected]>
1 parent 0524fb9 commit d9d17fa

File tree

6 files changed

+340
-5
lines changed

6 files changed

+340
-5
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
/**********************************************************************
2+
* Copyright (c) 2025 Ericsson
3+
*
4+
* All rights reserved. This program and the accompanying materials are
5+
* made available under the terms of the Eclipse Public License 2.0 which
6+
* accompanies this distribution, and is available at
7+
* https://www.eclipse.org/legal/epl-2.0/
8+
*
9+
* SPDX-License-Identifier: EPL-2.0
10+
**********************************************************************/
11+
package org.eclipse.tracecompass.tmf.core.tests.model;
12+
13+
import static org.junit.Assert.assertEquals;
14+
import static org.junit.Assert.assertFalse;
15+
import static org.junit.Assert.assertNotEquals;
16+
import static org.junit.Assert.assertTrue;
17+
18+
import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderCapabilities;
19+
import org.eclipse.tracecompass.tmf.core.model.DataProviderCapabilities;
20+
import org.junit.Test;
21+
22+
/**
23+
* JUnit Test class to test {@link DataProviderCapabilities}
24+
*
25+
* @author Bernd Hufmann
26+
*/
27+
public class DataProviderCapabilitiesTest {
28+
29+
private static final String EXPECTED_TO_STRING = "DataProviderCapabilities[canCreate=true, canDelete=true]";
30+
31+
// ------------------------------------------------------------------------
32+
// Tests
33+
// ------------------------------------------------------------------------
34+
/**
35+
* Test builder, constructor and getter/setters.
36+
*/
37+
@Test
38+
public void testBuilder() {
39+
DataProviderCapabilities.Builder builder = new DataProviderCapabilities.Builder()
40+
.setCanCreate(true)
41+
.setCanDelete(true);
42+
IDataProviderCapabilities capabilities = builder.build();
43+
assertTrue(capabilities.canCreate());
44+
assertTrue(capabilities.canDelete());
45+
}
46+
47+
/**
48+
* Test {@Link DataProviderCapabilities#equals()}
49+
*/
50+
@Test
51+
public void testEquality() {
52+
DataProviderCapabilities.Builder builder = new DataProviderCapabilities.Builder()
53+
.setCanCreate(true)
54+
.setCanDelete(true);
55+
IDataProviderCapabilities baseCapabilities = builder.build();
56+
57+
// Make sure it is equal to itself
58+
IDataProviderCapabilities testCapabilities = builder.build();
59+
assertEquals(baseCapabilities, testCapabilities);
60+
assertEquals(testCapabilities, baseCapabilities);
61+
62+
// Change each of the variable and make sure result is not equal
63+
builder.setCanCreate(false);
64+
testCapabilities = builder.build();
65+
assertNotEquals(baseCapabilities, testCapabilities);
66+
assertNotEquals(testCapabilities, baseCapabilities);
67+
68+
builder.setCanCreate(true);
69+
builder.setCanDelete(false);
70+
testCapabilities = builder.build();
71+
assertNotEquals(baseCapabilities, testCapabilities);
72+
assertNotEquals(testCapabilities, baseCapabilities);
73+
74+
builder.setCanCreate(false);
75+
builder.setCanDelete(false);
76+
testCapabilities = builder.build();
77+
assertNotEquals(baseCapabilities, testCapabilities);
78+
assertNotEquals(testCapabilities, baseCapabilities);
79+
80+
// Different objects with same content
81+
assertFalse(testCapabilities == DataProviderCapabilities.NULL_INSTANCE);
82+
83+
// Equal by content
84+
assertEquals(DataProviderCapabilities.NULL_INSTANCE, testCapabilities);
85+
}
86+
87+
/**
88+
* Test {@Link TmfConfiguration#toString()}
89+
**/
90+
@Test
91+
public void testToString() {
92+
DataProviderCapabilities.Builder builder = new DataProviderCapabilities.Builder()
93+
.setCanCreate(true)
94+
.setCanDelete(true);
95+
assertEquals(EXPECTED_TO_STRING, builder.build().toString());
96+
}
97+
98+
/**
99+
* Test {@Link TmfConfiguration#hashCode()}
100+
*/
101+
@Test
102+
public void testHashCode() {
103+
DataProviderCapabilities.Builder builder = new DataProviderCapabilities.Builder()
104+
.setCanCreate(true)
105+
.setCanDelete(true);
106+
107+
IDataProviderCapabilities capabilities1 = builder.build();
108+
IDataProviderCapabilities capabilities2 = DataProviderCapabilities.NULL_INSTANCE;
109+
110+
assertEquals(capabilities1.hashCode(), capabilities1.hashCode());
111+
assertEquals(capabilities2.hashCode(), capabilities2.hashCode());
112+
assertNotEquals(capabilities1.hashCode(), capabilities2.hashCode());
113+
}
114+
}

tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/model/DataProviderDescriptorTest.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**********************************************************************
2-
* Copyright (c) 2020 École Polytechnique de Montréal
2+
* Copyright (c) 2020, 2025 École Polytechnique de Montréal, Ericsson
33
*
44
* All rights reserved. This program and the accompanying materials are
55
* made available under the terms of the Eclipse Public License 2.0 which
@@ -16,8 +16,10 @@
1616
import org.eclipse.jdt.annotation.NonNullByDefault;
1717
import org.eclipse.tracecompass.tmf.core.config.ITmfConfiguration;
1818
import org.eclipse.tracecompass.tmf.core.config.TmfConfiguration;
19+
import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderCapabilities;
1920
import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderDescriptor;
2021
import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderDescriptor.ProviderType;
22+
import org.eclipse.tracecompass.tmf.core.model.DataProviderCapabilities;
2123
import org.eclipse.tracecompass.tmf.core.model.DataProviderDescriptor;
2224
import org.junit.Test;
2325

@@ -77,6 +79,22 @@ public void testEquality() {
7779
.setConfiguration(config);
7880
assertFalse(baseDescriptor.equals(builder.build()));
7981

82+
// Check for NULL_INSTANCE (object equality)
83+
assertTrue(baseDescriptor.getCapabilities() == DataProviderCapabilities.NULL_INSTANCE);
84+
85+
// Change capabilities
86+
builder.setCapabilities(new IDataProviderCapabilities() {
87+
@Override
88+
public boolean canDelete() {
89+
return true;
90+
}
91+
@Override
92+
public boolean canCreate() {
93+
return false;
94+
}
95+
});
96+
assertFalse(baseDescriptor.equals(builder.build()));
97+
8098
// Make sure it is equal to itself (with parent id and config)
8199
baseDescriptor = builder.build();
82100
assertTrue(baseDescriptor.equals(builder.build()));
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2025 Ericsson
3+
*
4+
* All rights reserved. This program and the accompanying materials are made
5+
* available under the terms of the Eclipse Public License 2.0 which
6+
* accompanies this distribution, and is available at
7+
* https://www.eclipse.org/legal/epl-2.0/
8+
*
9+
* SPDX-License-Identifier: EPL-2.0
10+
*******************************************************************************/
11+
package org.eclipse.tracecompass.tmf.core.dataprovider;
12+
13+
import org.eclipse.tracecompass.tmf.core.config.ITmfDataProviderConfigurator;
14+
15+
/**
16+
* Interface to implement to indicate capabilities of a data provider, such as
17+
* "canCreate" and "canDelete" capability.
18+
*
19+
* "canCreate" indicates that a given data provider can create a derived data
20+
* provider. "canDelete" indicates that a given data provider can be deleted.
21+
*
22+
* Call method {@link IDataProviderFactory#getAdapter(Class)} with class
23+
* {@link ITmfDataProviderConfigurator} to obtain an instance of
24+
* {@link ITmfDataProviderConfigurator}, which implements the "canCreate" and
25+
* "canDelete" capabilities.
26+
*
27+
* @since 9.5
28+
* @author Bernd Hufmann
29+
*/
30+
public interface IDataProviderCapabilities {
31+
/**
32+
* Whether the data provider can create derived data providers.
33+
*
34+
* @return {@code true} if this data provider can create a derived data
35+
* provider, else {@code false}
36+
*/
37+
boolean canCreate();
38+
39+
/**
40+
* Whether the data provider can be deleted.
41+
*
42+
* @return {@code true} if this data provider can be deleted, else
43+
* {@code false}
44+
*/
45+
boolean canDelete();
46+
}

tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/dataprovider/IDataProviderDescriptor.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2019, 2020 Ericsson
2+
* Copyright (c) 2019, 2025 Ericsson
33
*
44
* All rights reserved. This program and the accompanying materials are made
55
* available under the terms of the Eclipse Public License 2.0 which
@@ -14,6 +14,7 @@
1414
import org.eclipse.jdt.annotation.NonNullByDefault;
1515
import org.eclipse.jdt.annotation.Nullable;
1616
import org.eclipse.tracecompass.tmf.core.config.ITmfConfiguration;
17+
import org.eclipse.tracecompass.tmf.core.model.DataProviderCapabilities;
1718

1819
/**
1920
* Data Provider description, used to list the available providers for a trace
@@ -115,4 +116,12 @@ public enum ProviderType {
115116
default @Nullable ITmfConfiguration getConfiguration() {
116117
return null;
117118
}
119+
120+
/**
121+
* @return The data provider capabilities instance
122+
* @since 9.5
123+
*/
124+
default IDataProviderCapabilities getCapabilities() {
125+
return DataProviderCapabilities.NULL_INSTANCE;
126+
}
118127
}
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2025 Ericsson
3+
*
4+
* All rights reserved. This program and the accompanying materials are made
5+
* available under the terms of the Eclipse Public License 2.0 which
6+
* accompanies this distribution, and is available at
7+
* https://www.eclipse.org/legal/epl-2.0/
8+
*
9+
* SPDX-License-Identifier: EPL-2.0
10+
*******************************************************************************/
11+
package org.eclipse.tracecompass.tmf.core.model;
12+
13+
import java.util.Objects;
14+
15+
import org.eclipse.jdt.annotation.Nullable;
16+
import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderCapabilities;
17+
18+
/**
19+
* An instance of data provider capabilities, indicating what capabilities a
20+
* data provider has.
21+
*
22+
* @since 9.5
23+
* @author Bernd Hufmann
24+
*/
25+
public class DataProviderCapabilities implements IDataProviderCapabilities {
26+
27+
/** The NullCapabilities instance */
28+
public static final IDataProviderCapabilities NULL_INSTANCE = new DataProviderCapabilities.Builder().build();
29+
30+
private final boolean canCreate;
31+
private final boolean canDelete;
32+
33+
/**
34+
* Constructor
35+
*
36+
* @param builder
37+
* a builder instance
38+
*/
39+
public DataProviderCapabilities(Builder builder) {
40+
canCreate = builder.canCreate;
41+
canDelete = builder.canDelete;
42+
}
43+
44+
@Override
45+
public boolean canCreate() {
46+
return canCreate;
47+
}
48+
49+
@Override
50+
public boolean canDelete() {
51+
return canDelete;
52+
}
53+
54+
@Override
55+
@SuppressWarnings("nls")
56+
public String toString() {
57+
return new StringBuilder(getClass().getSimpleName())
58+
.append("[")
59+
.append("canCreate=").append(canCreate())
60+
.append(", canDelete=").append(canDelete())
61+
.append("]").toString();
62+
}
63+
64+
@Override
65+
public int hashCode() {
66+
return Objects.hash(canCreate, canDelete);
67+
}
68+
69+
@Override
70+
public boolean equals(@Nullable Object obj) {
71+
if (this == obj) {
72+
return true;
73+
}
74+
if (!(obj instanceof DataProviderCapabilities)) {
75+
return false;
76+
}
77+
DataProviderCapabilities other = (DataProviderCapabilities) obj;
78+
return canCreate == other.canCreate && canDelete == other.canDelete;
79+
}
80+
81+
/**
82+
* Builder class to build a IDataProviderCapabilities instance
83+
*/
84+
public static class Builder {
85+
private boolean canCreate = false;
86+
private boolean canDelete = false;
87+
88+
/**
89+
* Sets canCreate flag
90+
*
91+
* @param canCreate
92+
* {@code true} if this data provider can create a derived
93+
* data provider, else {@code false}
94+
* @return the builder instance.
95+
*/
96+
public Builder setCanCreate(boolean canCreate) {
97+
this.canCreate = canCreate;
98+
return this;
99+
}
100+
101+
/**
102+
* Sets canDelete flag
103+
*
104+
* @param canDelete
105+
* {@code true} if this data provider can be deleted, else
106+
* {@code false}
107+
* @return the builder instance.
108+
*/
109+
public Builder setCanDelete(boolean canDelete) {
110+
this.canDelete = canDelete;
111+
return this;
112+
}
113+
114+
/**
115+
* The method to construct an instance of
116+
* {@link IDataProviderCapabilities}
117+
*
118+
* @return a {@link IDataProviderCapabilities} instance
119+
*/
120+
public IDataProviderCapabilities build() {
121+
return new DataProviderCapabilities(this);
122+
}
123+
}
124+
}

0 commit comments

Comments
 (0)