diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/META-INF/MANIFEST.MF b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/META-INF/MANIFEST.MF
index dc12051b..3cb67110 100644
--- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/META-INF/MANIFEST.MF
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %Bundle-Name
Bundle-Vendor: %Bundle-Vendor
-Bundle-SymbolicName: org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests
+Bundle-SymbolicName: org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests;singleton:=true
Bundle-Version: 0.1.9.qualifier
Bundle-Localization: plugin
Bundle-ActivationPolicy: lazy
@@ -29,6 +29,7 @@ Export-Package: org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core
org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.stubs.webapp,
org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.utils
Import-Package: com.fasterxml.jackson.annotation,
+ com.fasterxml.jackson.core,
com.fasterxml.jackson.jaxrs.base,
com.fasterxml.jackson.jaxrs.json,
com.google.common.base,
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/build.properties b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/build.properties
index cf036607..e3b4e858 100644
--- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/build.properties
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/build.properties
@@ -14,4 +14,6 @@ output.. = bin/
bin.includes = META-INF/,\
.,\
about.html,\
- plugin.properties
+ plugin.properties,\
+ plugin.xml,\
+ schema/
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/plugin.xml b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/plugin.xml
new file mode 100644
index 00000000..d740c328
--- /dev/null
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/plugin.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/schema/custom-execution-analysis.json b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/schema/custom-execution-analysis.json
new file mode 100644
index 00000000..6b0ea73c
--- /dev/null
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/schema/custom-execution-analysis.json
@@ -0,0 +1,30 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://org.eclipse.tracecompass/custom-execution-analysis.json",
+ "title": "Custom Execution Analysis",
+ "description": "Custom Execution Analysis schema",
+ "type": "object",
+ "properties": {
+ "cpus": {
+ "description": "array of integer",
+ "type": "array",
+ "items": {
+ "type": "number"
+ }
+ },
+ "thread": {
+ "description": "Thread regular expression pattern",
+ "type": "string"
+ },
+ "phone": {
+ "description": "Phone number",
+ "type": "string",
+ "pattern": "^(\\([0-9]{3}\\))?[0-9]{3}-[0-9]{4}$"
+ },
+ "label": {
+ "description": "Optional label text",
+ "type": "string"
+ }
+ },
+ "required": ["thread"]
+}
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/ConfigurationManagerServiceTest.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/ConfigurationManagerServiceTest.java
index 2c36d480..83874849 100644
--- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/ConfigurationManagerServiceTest.java
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/ConfigurationManagerServiceTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2023 Ericsson
+ * Copyright (c) 2023, 2024 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
@@ -50,6 +50,8 @@
import org.junit.Test;
import org.osgi.framework.Bundle;
+import com.fasterxml.jackson.databind.JsonNode;
+
/**
* Basic test for the {@link ConfigurationManagerService}.
*
@@ -142,6 +144,14 @@ public void testSourceType() {
assertEquals(EXPECTED_DATA_TYPE, desc.getDataType());
assertEquals(EXPECTED_PARAM_DESCRIPTION, desc.getDescription());
assertTrue(desc.isRequired());
+
+ // Verify configuration source type with schema
+ Optional optional2 = configurations.stream().filter(config -> config.getId().equals("org.eclipse.tracecompass.tmf.core.config.testschemasourcetype")).findAny();
+ assertTrue(optional2.isPresent());
+ TmfConfigurationSourceTypeStub type2 = optional2.get();
+ JsonNode schema = type2.getSchema();
+ // Verify that schema exists
+ assertNotNull(schema);
}
/**
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/TmfConfigurationSourceTypeStub.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/TmfConfigurationSourceTypeStub.java
index 0eab6972..291f755d 100644
--- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/TmfConfigurationSourceTypeStub.java
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/TmfConfigurationSourceTypeStub.java
@@ -23,6 +23,7 @@
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.JsonNode;
/**
* Basic Implementation of the serialized {@link ITmfConfigurationSourceType} model used by clients.
@@ -36,6 +37,7 @@ public class TmfConfigurationSourceTypeStub implements Serializable, ITmfConfigu
*/
private static final long serialVersionUID = 6934234848155424428L;
private final ITmfConfigurationSourceType fConfig;
+ private final JsonNode fSchema;
/**
* {@link JsonCreator} Constructor for final fields
@@ -46,7 +48,9 @@ public class TmfConfigurationSourceTypeStub implements Serializable, ITmfConfigu
* the name
* @param description
* the help text
- * @param queryParamKeys
+ * @param schema
+ * the JSON schema JsonNode
+ * @param parameterDescriptors
* the list of keys
*
*/
@@ -55,6 +59,7 @@ public class TmfConfigurationSourceTypeStub implements Serializable, ITmfConfigu
public TmfConfigurationSourceTypeStub(@JsonProperty("id") String id,
@JsonProperty("name") String name,
@JsonProperty("description") String description,
+ @JsonProperty("schema") JsonNode schema,
@JsonProperty("parameterDescriptors") List parameterDescriptors) {
super();
@@ -66,8 +71,15 @@ public TmfConfigurationSourceTypeStub(@JsonProperty("id") String id,
builder.setConfigParamDescriptors(parameterDescriptors.stream().map(stub -> stub.getConfig()).collect(Collectors.toList()));
}
fConfig = builder.build();
+ fSchema = schema;
}
+ /**
+ * @return the JSON schema string
+ */
+ public JsonNode getSchema() {
+ return fSchema;
+ }
ITmfConfigurationSourceType getConfig() {
return fConfig;
@@ -75,24 +87,16 @@ ITmfConfigurationSourceType getConfig() {
@Override
public int hashCode() {
- return fConfig.hashCode();
+ return Objects.hash(fConfig, fSchema == null ? "null" : fSchema);
}
@Override
public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null) {
+ if (!(obj instanceof TmfConfigurationSourceTypeStub)) {
return false;
}
- if (obj instanceof TmfConfigurationSourceTypeStub) {
- return Objects.equals(this.getConfig(), ((TmfConfigurationSourceTypeStub) obj).getConfig());
- }
- if (obj instanceof TmfConfigurationSourceType) {
- return Objects.equals(this.getConfig(), obj);
- }
- return false;
+ TmfConfigurationSourceTypeStub other = (TmfConfigurationSourceTypeStub) obj;
+ return Objects.equals(fConfig, other.fConfig) && Objects.equals(fSchema, other.fSchema);
}
@Override
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/config/TestSchemaConfigurationSource.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/config/TestSchemaConfigurationSource.java
new file mode 100644
index 00000000..c7f6d438
--- /dev/null
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/config/TestSchemaConfigurationSource.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2023 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License 2.0 which
+ * accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.stubs.config;
+
+import static org.eclipse.tracecompass.common.core.NonNullUtils.nullToEmptyString;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.tracecompass.tmf.core.config.ITmfConfiguration;
+import org.eclipse.tracecompass.tmf.core.config.ITmfConfigurationSource;
+import org.eclipse.tracecompass.tmf.core.config.ITmfConfigurationSourceType;
+import org.eclipse.tracecompass.tmf.core.config.TmfConfigurationSourceType;
+import org.eclipse.tracecompass.tmf.core.exceptions.TmfConfigurationException;
+import org.osgi.framework.Bundle;
+
+/**
+ * Test class
+ */
+public class TestSchemaConfigurationSource implements ITmfConfigurationSource {
+
+ private static final @NonNull ITmfConfigurationSourceType fType;
+
+ private static final @NonNull String TEST_ANALYSIS_TYPE_ID = "org.eclipse.tracecompass.tmf.core.config.testschemasourcetype"; //$NON-NLS-1$
+ private static final @NonNull String NAME = nullToEmptyString("Test Schema Type"); //$NON-NLS-1$
+ private static final @NonNull String DESCRIPTION = nullToEmptyString("Test Type with schema"); //$NON-NLS-1$
+
+ static {
+ Bundle bundle = Platform.getBundle("org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests");
+ IPath defaultPath = new org.eclipse.core.runtime.Path("schema/custom-execution-analysis.json"); //$NON-NLS-1$
+ URL url = FileLocator.find(bundle, defaultPath, null);
+ File schemaFile = null;
+ try {
+ schemaFile = new File(FileLocator.toFileURL(url).toURI());
+ } catch (URISyntaxException | IOException e) {
+ e.printStackTrace();
+ }
+ fType = new TmfConfigurationSourceType.Builder()
+ .setId(TEST_ANALYSIS_TYPE_ID)
+ .setDescription(DESCRIPTION)
+ .setName(NAME)
+ .setSchemaFile(schemaFile)
+ .setConfigParamDescriptors(Collections.emptyList()).build();
+ }
+
+ /**
+ * Constructor
+ */
+ public TestSchemaConfigurationSource() {
+ }
+
+ @Override
+ public @NonNull ITmfConfigurationSourceType getConfigurationSourceType() {
+ return fType;
+ }
+
+ @Override
+ public @NonNull ITmfConfiguration create(@NonNull Map<@NonNull String, @NonNull Object> parameters) throws TmfConfigurationException {
+ throw new TmfConfigurationException("Not implemented yet"); //$NON-NLS-1$
+ }
+
+ @Override
+ public @NonNull ITmfConfiguration update(@NonNull String id, @NonNull Map<@NonNull String, @NonNull Object> parameters) throws TmfConfigurationException {
+ throw new TmfConfigurationException("Not implemented yet"); //$NON-NLS-1$
+ }
+
+ @Override
+ public @Nullable ITmfConfiguration get(@NonNull String id) {
+ return null;
+ }
+
+ @Override
+ public @Nullable ITmfConfiguration remove(@NonNull String id) {
+ return null;
+ }
+
+ @Override
+ public boolean contains(@NonNull String id) {
+ return false;
+ }
+
+ @Override
+ public @NonNull List<@NonNull ITmfConfiguration> getConfigurations() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public void dispose() {
+ }
+}
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/TmfConfigurationSourceTypeSerializer.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/TmfConfigurationSourceTypeSerializer.java
index a8c33101..35bcbd5a 100644
--- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/TmfConfigurationSourceTypeSerializer.java
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/TmfConfigurationSourceTypeSerializer.java
@@ -11,11 +11,16 @@
package org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.webapp;
+import java.io.File;
+import java.io.FileInputStream;
import java.io.IOException;
+import java.io.InputStream;
import org.eclipse.tracecompass.tmf.core.config.ITmfConfigurationSourceType;
import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
@@ -48,6 +53,15 @@ public void serialize(ITmfConfigurationSourceType value, JsonGenerator gen, Seri
if (!value.getConfigParamDescriptors().isEmpty()) {
gen.writeObjectField("parameterDescriptors", value.getConfigParamDescriptors()); //$NON-NLS-1$
}
+ File schemaFile = value.getSchemaFile();
+ if (schemaFile != null) {
+ try (InputStream inputStream = new FileInputStream(schemaFile)) {
+ ObjectMapper mapper = new ObjectMapper();
+ JsonNode schema = mapper.readTree(inputStream);
+ gen.writeFieldName("schema"); //$NON-NLS-1$
+ gen.writeTree(schema);
+ }
+ }
gen.writeEndObject();
}
}