diff options
Diffstat (limited to 'gui-editors/gui-editor-apex/src/main/java/org/onap')
34 files changed, 5785 insertions, 0 deletions
diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/ApexEditor.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/ApexEditor.java new file mode 100644 index 0000000..4741346 --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/ApexEditor.java @@ -0,0 +1,82 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2016-2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2019-2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest; + +import org.glassfish.grizzly.http.server.HttpServer; +import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory; +import org.glassfish.jersey.server.ResourceConfig; +import org.onap.policy.common.utils.validation.Assertions; +import org.slf4j.ext.XLogger; +import org.slf4j.ext.XLoggerFactory; + +/** + * This class is used to launch the editor. It creates a Grizzly embedded web + * server and runs the editor. + */ +public class ApexEditor { + // Logger for this class + private static final XLogger LOGGER = XLoggerFactory.getXLogger(ApexEditor.class); + + // The HTTP server exposing JAX-RS resources defined in this application. + private final HttpServer server; + + /** + * Starts the HTTP server for the Apex editor on the default base URI and with + * the default REST packages. + */ + public ApexEditor() { + this(new ApexEditorParameters()); + } + + /** + * Starts the HTTP server for the Apex editor. + * + * @param parameters the parameters + */ + public ApexEditor(final ApexEditorParameters parameters) { + Assertions.argumentNotNull(parameters, "parameters may not be null"); + + LOGGER.debug("Apex RESTful editor starting . . ."); + + // Create a resource configuration that scans for JAX-RS resources and providers + final ResourceConfig rc = new ResourceConfig().packages(parameters.getRestPackages()); + + // create and start a new instance of grizzly http server + // exposing the Jersey application at BASE_URI + server = GrizzlyHttpServerFactory.createHttpServer(parameters.getBaseUri(), rc); + + // Add static content + server.getServerConfiguration().addHttpHandler(new org.glassfish.grizzly.http.server.CLStaticHttpHandler( + ApexEditorMain.class.getClassLoader(), "/webapp/"), parameters.getStaticPath()); + + LOGGER.debug("Apex RESTful editor started"); + } + + /** + * Shut down the web server. + */ + public void shutdown() { + LOGGER.debug("Apex RESTful editor shutting down . . ."); + server.shutdown(); + LOGGER.debug("Apex RESTful editor shut down"); + } +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/ApexEditorException.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/ApexEditorException.java new file mode 100644 index 0000000..a1bd28d --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/ApexEditorException.java @@ -0,0 +1,74 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2016-2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest; + +import org.onap.policy.apex.model.basicmodel.concepts.ApexException; + +/** + * Exceptions from the Apex editor. + * + * @author Liam Fallon (liam.fallon@ericsson.com) + */ +public class ApexEditorException extends ApexException { + private static final long serialVersionUID = 4867385591967018254L; + + /** + * Instantiates a new apex editor exception. + * + * @param message the message on the exception + */ + public ApexEditorException(final String message) { + super(message); + } + + /** + * Instantiates a new apex editor exception. + * + * @param message the message on the exception + * @param object the object that the exception was thrown on + */ + public ApexEditorException(final String message, final Object object) { + super(message, object); + } + + /** + * Instantiates a new apex editor exception. + * + * @param message the message on the exception + * @param ex the exception that caused this Apex exception + */ + public ApexEditorException(final String message, final Exception ex) { + super(message, ex); + } + + /** + * Instantiates a new apex editor exception. + * + * @param message the message on the exception + * @param ex the exception that caused this Apex exception + * @param object the object that the exception was thrown on + */ + public ApexEditorException(final String message, final Exception ex, final Object object) { + super(message, ex, object); + } + +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/ApexEditorMain.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/ApexEditorMain.java new file mode 100644 index 0000000..481f0af --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/ApexEditorMain.java @@ -0,0 +1,212 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2016-2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2019-2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest; + +import java.io.PrintStream; +import org.slf4j.ext.XLogger; +import org.slf4j.ext.XLoggerFactory; + +/** + * This class is the main class that is used to launch the Apex editor from the + * command line. + * + */ +public class ApexEditorMain { + // Logger for this class + private static final XLogger LOGGER = XLoggerFactory.getXLogger(ApexEditorMain.class); + + // Recurring string constants + private static final String REST_ENDPOINT_PREFIX = "Apex Editor REST endpoint ("; + + /** + * The Enum EditorState holds the current state of the editor. + */ + // Editor state + public enum EditorState { + /** The editor is stopped. */ + STOPPED, + /** The editor is ready to run. */ + READY, + /** The editor is getting ready to run. */ + INITIALIZING, + /** The editor is running. */ + RUNNING + } + + private static final int EDITOR_RNNING_CHECK_TIMEOUT = 1000; + + private EditorState state = EditorState.STOPPED; + + // The Apex editor this class is running + private ApexEditor apexEditor = null; + + // The parameters for the editor + private ApexEditorParameters parameters = null; + + // Output and error streams for messages + private final PrintStream outStream; + + /** + * Constructor, kicks off the editor. + * + * @param args The command line arguments for the editor + * @param outStream The stream for output messages + */ + public ApexEditorMain(final String[] args, final PrintStream outStream) { + // Save the streams for output and error + this.outStream = outStream; + + // Editor parameter parsing + final ApexEditorParameterParser parser = new ApexEditorParameterParser(); + + try { + // Get and check the parameters + parameters = parser.parse(args); + } catch (final ApexEditorParameterException e) { + throw new ApexEditorParameterException(REST_ENDPOINT_PREFIX + this.toString() + ") parameter error, " + + e.getMessage() + '\n' + parser.getHelp(ApexEditorMain.class.getName()), e); + } + + if (parameters.isHelpSet()) { + throw new ApexEditorParameterException(parser.getHelp(ApexEditorMain.class.getName())); + } + + // Validate the parameters + final String validationMessage = parameters.validate(); + if (validationMessage.length() > 0) { + throw new ApexEditorParameterException(REST_ENDPOINT_PREFIX + this.toString() + ") parameters invalid, " + + validationMessage + '\n' + parser.getHelp(ApexEditorMain.class.getName())); + } + + state = EditorState.READY; + } + + /** + * Initialize the Apex editor. + */ + public void init() { + outStream.println( + REST_ENDPOINT_PREFIX + this.toString() + ") starting at " + parameters.getBaseUri().toString() + " . . ."); + + try { + state = EditorState.INITIALIZING; + + // Start the editor + apexEditor = new ApexEditor(parameters); + + // Add a shutdown hook to shut down the editor when the process is exiting + Runtime.getRuntime().addShutdownHook(new Thread(new ApexEditorShutdownHook())); + + state = EditorState.RUNNING; + + if (parameters.getTimeToLive() == ApexEditorParameters.INFINITY_TIME_TO_LIVE) { + outStream.println( + REST_ENDPOINT_PREFIX + this.toString() + ") started at " + parameters.getBaseUri().toString()); + } else { + outStream.println(REST_ENDPOINT_PREFIX + this.toString() + ") started"); + } + + // Find out how long is left to wait + long timeRemaining = parameters.getTimeToLive(); + while (timeRemaining == ApexEditorParameters.INFINITY_TIME_TO_LIVE || timeRemaining > 0) { + // decrement the time to live in the non-infinity case + if (timeRemaining > 0) { + timeRemaining--; + } + + // Wait for a second + Thread.sleep(EDITOR_RNNING_CHECK_TIMEOUT); + } + } catch (final Exception e) { + String message = REST_ENDPOINT_PREFIX + this.toString() + ") failed at with error: " + e.getMessage(); + outStream.println(message); + LOGGER.warn(message, e); + } finally { + if (apexEditor != null) { + apexEditor.shutdown(); + apexEditor = null; + } + state = EditorState.STOPPED; + } + } + + /** + * Get the editor state. + * + * @return the state + */ + public EditorState getState() { + return state; + } + + /** + * {@inheritDoc}. + */ + @Override + public String toString() { + final StringBuilder ret = new StringBuilder(); + ret.append(this.getClass().getSimpleName()).append(": Config=[").append(parameters).append("], State=") + .append(this.getState()); + return ret.toString(); + } + + /** + * Explicitly shut down the editor. + */ + public void shutdown() { + if (apexEditor != null) { + outStream.println(REST_ENDPOINT_PREFIX + this.toString() + ") shutting down"); + apexEditor.shutdown(); + } + state = EditorState.STOPPED; + outStream.println(REST_ENDPOINT_PREFIX + this.toString() + ") shut down"); + } + + /** + * This class is a shutdown hook for the Apex editor command. + */ + private class ApexEditorShutdownHook implements Runnable { + /** + * {@inheritDoc}. + */ + @Override + public void run() { + if (apexEditor != null) { + apexEditor.shutdown(); + } + } + } + + /** + * Main method, main entry point for command. + * + * @param args The command line arguments for the editor + */ + public static void main(final String[] args) { + try { + final ApexEditorMain editorMain = new ApexEditorMain(args, System.out); + editorMain.init(); + } catch (final Exception e) { + LOGGER.error("start failed", e); + } + } +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/ApexEditorParameterException.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/ApexEditorParameterException.java new file mode 100644 index 0000000..f59a5eb --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/ApexEditorParameterException.java @@ -0,0 +1,50 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2016-2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest; + +/** + * A run time exception used to report parsing and parameter input errors. + * + * @author Liam Fallon (liam.fallon@ericsson.com) + */ +public class ApexEditorParameterException extends IllegalArgumentException { + private static final long serialVersionUID = 6520231162404452427L; + + /** + * Create an ApexEditorParameterException with a message. + * + * @param message the message + */ + public ApexEditorParameterException(final String message) { + super(message); + } + + /** + * Create an ApexEditorParameterException with a message and an exception. + * + * @param message the message + * @param th the Throwable instance + */ + public ApexEditorParameterException(final String message, final Throwable th) { + super(message, th); + } +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/ApexEditorParameterParser.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/ApexEditorParameterParser.java new file mode 100644 index 0000000..0033bcb --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/ApexEditorParameterParser.java @@ -0,0 +1,130 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2016-2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.Arrays; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.DefaultParser; +import org.apache.commons.cli.HelpFormatter; +import org.apache.commons.cli.Option; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.ParseException; + +/** + * This class reads and handles command line parameters to the Apex CLI editor. + * + * @author Liam Fallon (liam.fallon@ericsson.com) + */ +public class ApexEditorParameterParser { + // Apache Commons CLI options + private Options options; + + private static final int COMMAND_HELP_MAX_LINE_WIDTH = 120; + + /** + * Construct the options for the CLI editor. + */ + public ApexEditorParameterParser() { + options = new Options(); + options.addOption("h", "help", false, "outputs the usage of this command"); + options + .addOption(Option.builder("p").longOpt("port").desc("port to use for the Apex RESTful editor REST calls.") + .hasArg().argName("PORT").required(false).type(Number.class).build()); + options.addOption(Option.builder("t").longOpt("time-to-live") + .desc("the amount of time in seconds that the server will run for before terminating. " + + "Default value is " + ApexEditorParameters.INFINITY_TIME_TO_LIVE + " to run indefinitely.") + .hasArg().argName("TIME_TO_LIVE").required(false).type(Number.class).build()); + options.addOption(Option.builder("l").longOpt("listen") + .desc("the IP address to listen on. Default value is " + ApexEditorParameters.DEFAULT_SERVER_URI_ROOT + + " to restrict access to the local machine only.") + .hasArg().argName("ADDRESS").required(false).type(String.class).build()); + } + + /** + * Parse the command line options. + * + * @param args The arguments + * @return the apex editor parameters + */ + public ApexEditorParameters parse(final String[] args) { + CommandLine commandLine = null; + try { + commandLine = new DefaultParser().parse(options, args); + } catch (final ParseException e) { + throw new ApexEditorParameterException("invalid command line arguments specified : " + e.getMessage()); + } + + final ApexEditorParameters parameters = new ApexEditorParameters(); + final String[] remainingArgs = commandLine.getArgs(); + + if (commandLine.getArgs().length > 0) { + throw new ApexEditorParameterException( + "too many command line arguments specified : " + Arrays.toString(remainingArgs)); + } + + if (commandLine.hasOption('h')) { + parameters.setHelp(true); + } + try { + if (commandLine.hasOption('p')) { + parameters.setRestPort(((Number) commandLine.getParsedOptionValue("port")).intValue()); + } + } catch (final ParseException e) { + throw new ApexEditorParameterException("error parsing argument \"port\" :" + e.getMessage(), e); + } + try { + if (commandLine.hasOption('t')) { + parameters.setTimeToLive(((Number) commandLine.getParsedOptionValue("time-to-live")).longValue()); + } + } catch (final ParseException e) { + throw new ApexEditorParameterException("error parsing argument \"time-to-live\" :" + e.getMessage(), e); + } + try { + if (commandLine.hasOption('l')) { + parameters.setListenAddress(commandLine.getParsedOptionValue("listen").toString()); + } + } catch (final ParseException e) { + throw new ApexEditorParameterException("error parsing argument \"listen-address\" :" + e.getMessage(), e); + } + + return parameters; + } + + /** + * Get help information. + * + * @param mainClassName the main class name + * @return the help + */ + public String getHelp(final String mainClassName) { + final StringWriter stringWriter = new StringWriter(); + final PrintWriter stringPrintWriter = new PrintWriter(stringWriter); + + final HelpFormatter helpFormatter = new HelpFormatter(); + helpFormatter.printHelp(stringPrintWriter, COMMAND_HELP_MAX_LINE_WIDTH, mainClassName + " [options...] ", null, + options, 0, 1, ""); + + return stringWriter.toString(); + } +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/ApexEditorParameters.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/ApexEditorParameters.java new file mode 100644 index 0000000..c4c36ff --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/ApexEditorParameters.java @@ -0,0 +1,229 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2016-2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest; + +import java.net.URI; +import java.net.URISyntaxException; +import org.slf4j.ext.XLogger; +import org.slf4j.ext.XLoggerFactory; + +/** + * This class reads and handles command line parameters to the Apex CLI editor. + * + * @author Liam Fallon (liam.fallon@ericsson.com) + */ +public class ApexEditorParameters { + // Logger for this class + private static final XLogger LOGGER = XLoggerFactory.getXLogger(ApexEditorParameters.class); + + /** The default port for connecting to the Web editor on. */ + public static final int DEFAULT_REST_PORT = 18989; + + /** The connection is held up until killed on demand. */ + public static final int INFINITY_TIME_TO_LIVE = -1; + + // Base URI the HTTP server will listen on + private static final String DEFAULT_SERVER_URI_PREFIX = "http://"; + /** The server listens on localhost by default. */ + public static final String DEFAULT_SERVER_URI_ROOT = "localhost"; + private static final String DEFAULT_REST_PATH = "/apexservices/"; + private static final String DEFAULT_STATIC_PATH = "/"; + + // Constants for port checks + private static final int MIN_USER_PORT = 1024; + private static final int MAX_USER_PORT = 65535; + + // Package that will field REST requests + private static final String[] DEFAULT_PACKAGES = new String[] { "org.onap.policy.gui.editors.apex.rest" }; + + // The editor parameters + private boolean helpSet = false; + private int restPort = DEFAULT_REST_PORT; + private long timeToLive = INFINITY_TIME_TO_LIVE; + private String listenAddress = DEFAULT_SERVER_URI_ROOT; + + /** + * Validate. + * + * @return the string + */ + public String validate() { + String validationMessage = ""; + validationMessage += validatePort(); + validationMessage += validateTimeToLive(); + validationMessage += validateUrl(); + + return validationMessage; + } + + /** + * Gets the base URI. + * + * @return the base URI + */ + public URI getBaseUri() { + return URI.create(DEFAULT_SERVER_URI_PREFIX + listenAddress + ':' + restPort + DEFAULT_REST_PATH); + } + + /** + * Gets the REST packages. + * + * @return the REST packages + */ + public String[] getRestPackages() { + return DEFAULT_PACKAGES; + } + + /** + * Gets the static path. + * + * @return the static path + */ + public String getStaticPath() { + return DEFAULT_STATIC_PATH; + } + + /** + * Validate port. + * + * @return a warning string, or an empty string + */ + private String validatePort() { + if (restPort < MIN_USER_PORT || restPort > MAX_USER_PORT) { + return "port must be between " + MIN_USER_PORT + " and " + MAX_USER_PORT + "\n"; + } else { + return ""; + } + } + + /** + * Validate URL. + * + * @return a warning string, or an empty string + */ + private String validateUrl() { + try { + new URI(getBaseUri().toString()).parseServerAuthority(); + return ""; + } catch (final URISyntaxException e) { + String message = "listen address is not valid. " + e.getMessage() + "\n"; + LOGGER.warn(message, e); + return message; + } + } + + /** + * Validate time to live. + * + * @return the string + */ + private String validateTimeToLive() { + if (timeToLive < -1) { + return "time to live must be greater than -1 (set to -1 to wait forever)\n"; + } else { + return ""; + } + } + + /** + * Checks if is help set. + * + * @return true, if checks if is help set + */ + public boolean isHelpSet() { + return helpSet; + } + + /** + * Sets the help. + * + * @param help the help + */ + public void setHelp(final boolean help) { + this.helpSet = help; + } + + /** + * Gets the REST port. + * + * @return the REST port + */ + public int getRestPort() { + return restPort; + } + + /** + * Sets the REST port. + * + * @param incomingRestPort the REST port + */ + public void setRestPort(final int incomingRestPort) { + this.restPort = incomingRestPort; + } + + /** + * Gets the time to live. + * + * @return the time to live + */ + public long getTimeToLive() { + return timeToLive; + } + + /** + * Sets the time to live. + * + * @param timeToLive the time to live + */ + public void setTimeToLive(final long timeToLive) { + this.timeToLive = timeToLive; + } + + /** + * {@inheritDoc}. + */ + @Override + public String toString() { + final StringBuilder ret = new StringBuilder(); + ret.append(this.getClass().getSimpleName()).append(": URI=").append(this.getBaseUri()).append(", TTL=") + .append(this.getTimeToLive()).append("sec"); + return ret.toString(); + } + + /** + * Gets the base address to listen on. + * + * @return the listenAddress + */ + public String getListenAddress() { + return listenAddress; + } + + /** + * Sets the base address to listen on. + * + * @param listenAddress the new listenAddress + */ + public void setListenAddress(final String listenAddress) { + this.listenAddress = listenAddress; + } +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/ApexEditorRestResource.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/ApexEditorRestResource.java new file mode 100644 index 0000000..ef5c57a --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/ApexEditorRestResource.java @@ -0,0 +1,815 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2016-2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling; + +import java.io.IOException; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; +import org.onap.policy.apex.model.modelapi.ApexApiResult; +import org.onap.policy.apex.model.modelapi.ApexApiResult.Result; +import org.onap.policy.common.utils.resources.TextFileUtils; +import org.slf4j.ext.XLogger; +import org.slf4j.ext.XLoggerFactory; + +/** + * The class represents the root resource exposed at the base URL<br> The url to access this resource would be in the + * form {@code <baseURL>/rest/<session>/....} <br> For example: a PUT request to the following URL + * {@code http://localhost:8080/apex/rest/109/ContextSchema/Update}, with a JSON string payload containing the new + * {@code Schema} in the body, can be explained as: <ul> <li>The server or servlet is running at the base URL + * {@code http://localhost:8080/apex} <li>This resource {@code ApexRestEditorResource} is used because the path + * {@code rest/109} matches the {@code Path} filter specification for this Resource ({@code @Path("rest/{session}")}), + * where the {@code int} path parameter {@code session} is assigned the {@code int} value {@code 109} <li>The path + * {@code ContextSchema/Update} redirects this call to the method {@link #updateContextSchema(String)}, which should be + * a {@link javax.ws.rs.PUT}, with a single String in the body/payload which gets mapped to the single String parameter + * for the method. <li>So, in summary, the REST request updates a {@code ContextSchema} as specified in the payload for + * {@code session} number {@code 109} </ul> + * + * <b>Note:</b> An allocated {@code Session} identifier must be included in (almost) all requests. Models for different + * {@code Session} identifiers are completely isolated from one another. + * + * <b>Note:</b> To create a new {@code Session}, and have a new session ID allocated use {@link javax.ws.rs.GET} request + * to {@code <baseURL>/rest/-1/Session/Create} (for example: {@code http://localhost:8080/apex/rest/-1/Session/Create} ) + * + */ +@Path("editor/{session}") +@Produces({MediaType.APPLICATION_JSON}) +@Consumes({MediaType.APPLICATION_JSON}) + +public class ApexEditorRestResource implements RestCommandHandler { + // Get a reference to the logger + private static final XLogger LOGGER = XLoggerFactory.getXLogger(ApexEditorRestResource.class); + + // Location of the periodi event template + private static final String PERIODIC_EVENT_TEMPLATE = "src/main/resources/templates/PeriodicEventTemplate.json"; + + // Recurring string constants + private static final String NAME = "name"; + private static final String VERSION = "version"; + private static final String REST_COMMAND_NOT_RECOGNISED = "REST command not recognised"; + private static final String OK = ": OK"; + private static final String NOT_OK = ": Not OK"; + private static final String SESSION_CREATE = "Session/Create"; + private static final String SESSION_CREATE_NOT_OK = "Session/Create: Not OK"; + + // The session handler for sessions on the Apex editor + private static final RestSessionHandler SESSION_HANDLER = new RestSessionHandler(); + + // Handlers for the various parts of an Apex model + //@formatter:off + private static final ModelHandler MODEL_HANDLER = new ModelHandler(); + private static final KeyInfoHandler KEY_INFO_HANDLER = new KeyInfoHandler(); + private static final ContextSchemaHandler CONTEXT_SCHEMA_HANDLER = new ContextSchemaHandler(); + private static final ContextAlbumHandler CONTEXT_ALBUM_HANDLER = new ContextAlbumHandler(); + private static final EventHandler EVENT_HANDLER = new EventHandler(); + private static final TaskHandler TASK_HANDLER = new TaskHandler(); + private static final PolicyHandler POLICY_HANDLER = new PolicyHandler(); + //@formatter:on + + // The ID of this session. This gets injected from the URL. + @PathParam("session") + private int sessionId = -1; + + /** + * Creates a new session. Always call this method with sessionID -1, whereby a new sessionID will be allocated. If + * successful the new sessionID will be available in the first message in the result. + * + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()}. This includes the session id + * for this session. + */ + @GET + @Path("Session/Create") + public ApexApiResult createSession() { + if (sessionId != -1) { + return new ApexApiResult(Result.FAILED, "Session ID must be set to -1 to create sessions: " + sessionId); + } + + ApexApiResult result = new ApexApiResult(); + SESSION_HANDLER.createSession(result); + return result; + } + + /** + * Load the model from a JSON string for this session. + * + * @param jsonString the JSON string to be parsed. The returned value(s) will be similar to {@code AxPolicyModel}, + * with merged {@code AxKeyInfo} for the root object. + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @PUT + @Path("/Model/Load") + public ApexApiResult loadFromString(final String jsonString) { + return processRestCommand(RestCommandType.MODEL, RestCommand.LOAD, jsonString); + } + + /** + * Analyse the model and return analysis results. If successful the analysis results will be available in the + * messages in the result. + * + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @GET + @Path("Model/Analyse") + public ApexApiResult analyse() { + return processRestCommand(RestCommandType.MODEL, RestCommand.ANALYSE); + } + + /** + * Validate the model and return validation results. If successful the validation results will be available in the + * messages in the result. + * + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @GET + @Path("Model/Validate") + public ApexApiResult validate() { + return processRestCommand(RestCommandType.MODEL, RestCommand.VALIDATE); + } + + /** + * Creates the new model model for this session. + * + * @param jsonString the JSON string to be parsed containing the new model. See {@code BeanModel} + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @POST + @Path("Model/Create") + public ApexApiResult createModel(final String jsonString) { + return processRestCommand(RestCommandType.MODEL, RestCommand.CREATE, jsonString); + } + + /** + * Update the model for this session. + * + * @param jsonString the JSON string to be parsed containing the updated model. See {@code BeanModel} + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @PUT + @Path("Model/Update") + public ApexApiResult updateModel(final String jsonString) { + return processRestCommand(RestCommandType.MODEL, RestCommand.UPDATE, jsonString); + } + + /** + * Gets the key for the model for this session. If successful the model key will be available in the first message + * in the result. See {@code AxKey} + * + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @GET + @Path("Model/GetKey") + public ApexApiResult getModelKey() { + return processRestCommand(RestCommandType.MODEL, RestCommand.GET_KEY); + } + + /** + * Retrieve the model for this session. If successful the model will be available in the first message in the + * result. The returned value will be similar to a {@code AxPolicyModel}, with merged {@code AxKeyInfo} for the root + * object. + * + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @GET + @Path("Model/Get") + public ApexApiResult listModel() { + return processRestCommand(RestCommandType.MODEL, RestCommand.LIST); + } + + /** + * Download the model for this session as a String. + * + * @return the model represented as a JSON string. See {@code AxPolicyModel} + */ + @GET + @Path("Model/Download") + public String downloadModel() { + ApexApiResult result = processRestCommand(RestCommandType.MODEL, RestCommand.DOWNLOAD); + if (result != null && result.isOk()) { + return result.getMessage(); + } else { + return null; + } + } + + /** + * Delete the model for this session. + * + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @DELETE + @Path("Model/Delete") + public ApexApiResult deleteModel() { + return processRestCommand(RestCommandType.MODEL, RestCommand.DELETE); + } + + /** + * List key information with the given key names/versions. If successful the result(s) will be available in the + * result messages. See {@code AxKeyInfo} + * + * @param name the name to search for. If null or empty, then all names will be queried + * @param version the version to search for. If null then all versions will be searched for. + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @GET + @Path("KeyInformation/Get") + public ApexApiResult listKeyInformation(@QueryParam(NAME) final String name, + @QueryParam(VERSION) final String version) { + return processRestCommand(RestCommandType.KEY_INFO, RestCommand.LIST, name, version); + } + + /** + * Creates a context schema with the information in the JSON string passed. + * + * @param jsonString the JSON string to be parsed. See {@code BeanContextSchema} + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @POST + @Path("ContextSchema/Create") + public ApexApiResult createContextSchema(final String jsonString) { + return processRestCommand(RestCommandType.CONTEXT_SCHEMA, RestCommand.CREATE, jsonString); + } + + /** + * Update a context schema with the information in the JSON string passed. + * + * @param jsonString the JSON string to be parsed. See {@code BeanContextSchema} + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @PUT + @Path("ContextSchema/Update") + public ApexApiResult updateContextSchema(final String jsonString) { + return processRestCommand(RestCommandType.CONTEXT_SCHEMA, RestCommand.UPDATE, jsonString); + } + + /** + * List context schemas with the given key names/versions. If successful the result(s) will be available in the + * result messages. The returned value(s) will be similar to {@code AxContextSchema}, with merged {@code AxKeyInfo} + * for the root object. + * + * @param name the name to search for. If null or empty, then all names will be queried + * @param version the version to search for. If null then all versions will be searched for. + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @GET + @Path("ContextSchema/Get") + public ApexApiResult listContextSchemas(@QueryParam(NAME) final String name, + @QueryParam(VERSION) final String version) { + return processRestCommand(RestCommandType.CONTEXT_SCHEMA, RestCommand.LIST, name, version); + } + + /** + * Delete context schemas with the given key names/versions. + * + * @param name the name to search for. If null or empty, then all names will be queried + * @param version the version to search for. If null then all versions will be searched for. + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @DELETE + @Path("ContextSchema/Delete") + public ApexApiResult deleteContextSchema(@QueryParam(NAME) final String name, + @QueryParam(VERSION) final String version) { + return processRestCommand(RestCommandType.CONTEXT_SCHEMA, RestCommand.DELETE, name, version); + } + + /** + * Validate context schemas with the given key names/versions. The result(s) will be available in the result + * messages. + * + * @param name the name to search for. If null or empty, then all names will be queried + * @param version the version to search for. If null then all versions will be searched for. + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @GET + @Path("Validate/ContextSchema") + public ApexApiResult validateContextSchemas(@QueryParam(NAME) final String name, + @QueryParam(VERSION) final String version) { + return processRestCommand(RestCommandType.CONTEXT_SCHEMA, RestCommand.VALIDATE, name, version); + } + + /** + * Creates a context album with the information in the JSON string passed. + * + * @param jsonString the JSON string to be parsed. See {@code BeanContextAlbum} + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @POST + @Path("ContextAlbum/Create") + public ApexApiResult createContextAlbum(final String jsonString) { + return processRestCommand(RestCommandType.CONTEXT_ALBUM, RestCommand.CREATE, jsonString); + } + + /** + * Update a context album with the information in the JSON string passed. + * + * @param jsonString the JSON string to be parsed. See {@code BeanContextAlbum} + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @PUT + @Path("ContextAlbum/Update") + public ApexApiResult updateContextAlbum(final String jsonString) { + return processRestCommand(RestCommandType.CONTEXT_ALBUM, RestCommand.UPDATE, jsonString); + } + + /** + * List context albums with the given key names/versions. If successful the result(s) will be available in the + * result messages. The returned value(s) will be similar to {@code AxContextAlbum}, with merged {@code AxKeyInfo} + * for the root object. + * + * @param name the name to search for. If null or empty, then all names will be queried + * @param version the version to search for. If null then all versions will be searched for. + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @GET + @Path("ContextAlbum/Get") + public ApexApiResult listContextAlbums(@QueryParam(NAME) final String name, + @QueryParam(VERSION) final String version) { + return processRestCommand(RestCommandType.CONTEXT_ALBUM, RestCommand.LIST, name, version); + } + + /** + * Delete context albums with the given key names/versions. + * + * @param name the name to search for. If null or empty, then all names will be queried + * @param version the version to search for. If null then all versions will be searched for. + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @DELETE + @Path("ContextAlbum/Delete") + public ApexApiResult deleteContextAlbum(@QueryParam(NAME) final String name, + @QueryParam(VERSION) final String version) { + return processRestCommand(RestCommandType.CONTEXT_ALBUM, RestCommand.DELETE, name, version); + } + + /** + * Validate context albums with the given key names/versions. The result(s) will be available in the result + * messages. + * + * @param name the name to search for. If null or empty, then all names will be queried + * @param version the version to search for. If null then all versions will be searched for. + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @GET + @Path("Validate/ContextAlbum") + public ApexApiResult validateContextAlbums(@QueryParam(NAME) final String name, + @QueryParam(VERSION) final String version) { + return processRestCommand(RestCommandType.CONTEXT_ALBUM, RestCommand.VALIDATE, name, version); + } + + /** + * Creates an event with the information in the JSON string passed. + * + * @param jsonString the JSON string to be parsed. See {@code BeanEvent} + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @POST + @Path("Event/Create") + public ApexApiResult createEvent(final String jsonString) { + return processRestCommand(RestCommandType.EVENT, RestCommand.CREATE, jsonString); + } + + /** + * Update an event with the information in the JSON string passed. + * + * @param jsonString the JSON string to be parsed. See {@code BeanEvent} + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @PUT + @Path("Event/Update") + public ApexApiResult updateEvent(final String jsonString) { + return processRestCommand(RestCommandType.EVENT, RestCommand.UPDATE, jsonString); + } + + /** + * List events with the given key names/versions. If successful the result(s) will be available in the result + * messages. The returned value(s) will be similar to {@code AxEvent}, with merged {@code AxKeyInfo} for the root + * object. + * + * @param name the name to search for. If null or empty, then all names will be queried + * @param version the version to search for. If null then all versions will be searched for. + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @GET + @Path("Event/Get") + public ApexApiResult listEvent(@QueryParam(NAME) final String name, @QueryParam(VERSION) final String version) { + return processRestCommand(RestCommandType.EVENT, RestCommand.LIST, name, version); + } + + /** + * Delete events with the given key names/versions. + * + * @param name the name to search for. If null or empty, then all names will be queried + * @param version the version to search for. If null then all versions will be searched for. + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @DELETE + @Path("Event/Delete") + public ApexApiResult deleteEvent(@QueryParam(NAME) final String name, @QueryParam(VERSION) final String version) { + return processRestCommand(RestCommandType.EVENT, RestCommand.DELETE, name, version); + } + + /** + * Validate events with the given key names/versions. The result(s) will be available in the result messages. + * + * @param name the name to search for. If null or empty, then all names will be queried + * @param version the version to search for. If null then all versions will be searched for. + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @GET + @Path("Validate/Event") + public ApexApiResult validateEvent(@QueryParam(NAME) final String name, @QueryParam(VERSION) final String version) { + return processRestCommand(RestCommandType.EVENT, RestCommand.VALIDATE, name, version); + } + + /** + * Creates a task with the information in the JSON string passed. + * + * @param jsonString the JSON string to be parsed. See {@code BeanTask} + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @POST + @Path("Task/Create") + public ApexApiResult createTask(final String jsonString) { + return processRestCommand(RestCommandType.TASK, RestCommand.CREATE, jsonString); + } + + /** + * Update a task with the information in the JSON string passed. + * + * @param jsonString the JSON string to be parsed. See {@code BeanTask} + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @PUT + @Path("Task/Update") + public ApexApiResult updateTask(final String jsonString) { + return processRestCommand(RestCommandType.TASK, RestCommand.UPDATE, jsonString); + } + + /** + * List tasks with the given key names/versions. If successful the result(s) will be available in the result + * messages. The returned value(s) will be similar to {@code AxTask}, with merged {@code AxKeyInfo} for the root + * object. + * + * @param name the name to search for. If null or empty, then all names will be queried + * @param version the version to search for. If null then all versions will be searched for. + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @GET + @Path("Task/Get") + public ApexApiResult listTask(@QueryParam(NAME) final String name, @QueryParam(VERSION) final String version) { + return processRestCommand(RestCommandType.TASK, RestCommand.LIST, name, version); + } + + /** + * Delete tasks with the given key names/versions. + * + * @param name the name to search for. If null or empty, then all names will be queried + * @param version the version to search for. If null then all versions will be searched for. + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @DELETE + @Path("Task/Delete") + public ApexApiResult deleteTask(@QueryParam(NAME) final String name, @QueryParam(VERSION) final String version) { + return processRestCommand(RestCommandType.TASK, RestCommand.DELETE, name, version); + } + + /** + * Validate tasks with the given key names/versions. The result(s) will be available in the result messages. + * + * @param name the name to search for. If null or empty, then all names will be queried + * @param version the version to search for. If null then all versions will be searched for. + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @GET + @Path("Validate/Task") + public ApexApiResult validateTask(@QueryParam(NAME) final String name, @QueryParam(VERSION) final String version) { + return processRestCommand(RestCommandType.TASK, RestCommand.VALIDATE, name, version); + } + + // CHECKSTYLE:OFF: MethodLength + /** + * Creates a policy with the information in the JSON string passed. + * + * @param jsonString the JSON string to be parsed See {@code BeanPolicy} + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @POST + @Path("Policy/Create") + public ApexApiResult createPolicy(final String jsonString) { + return processRestCommand(RestCommandType.POLICY, RestCommand.CREATE, jsonString); + } + + /** + * Update a policy with the information in the JSON string passed. + * + * @param firstStatePeriodic indicates if periodic event should be created and added to model + * @param jsonString the JSON string to be parsed. See {@code BeanPolicy} + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @PUT + @Path("Policy/Update") + public ApexApiResult updatePolicy(@QueryParam("firstStatePeriodic") final boolean firstStatePeriodic, + final String jsonString) { + + ApexApiResult result = processRestCommand(RestCommandType.POLICY, RestCommand.UPDATE, jsonString); + if (result != null && result.isOk() && firstStatePeriodic) { + result = createPeriodicEvent(); + } + return result; + } + + /** + * List policies with the given key names/versions. If successful the result(s) will be available in the result + * messages. The returned value(s) will be similar to {@code AxPolicy}, with merged {@code AxKeyInfo} for the root + * object. + * + * @param name the name to search for. If null or empty, then all names will be queried + * @param version the version to search for. If null then all versions will be searched for. + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @GET + @Path("Policy/Get") + public ApexApiResult listPolicy(@QueryParam(NAME) final String name, @QueryParam(VERSION) final String version) { + return processRestCommand(RestCommandType.POLICY, RestCommand.LIST, name, version); + } + + /** + * Delete policies with the given key names/versions. + * + * @param name the name to search for. If null or empty, then all names will be queried + * @param version the version to search for. If null then all versions will be searched for. + * @return an ApexAPIResult object. If successful then {@link ApexApiResult#isOk()} will return true. Any + * messages/errors can be retrieved using {@link ApexApiResult#getMessages()} + */ + @DELETE + @Path("Policy/Delete") + public ApexApiResult deletePolicy(@QueryParam(NAME) final String name, @QueryParam(VERSION) final String version) { + return processRestCommand(RestCommandType.POLICY, RestCommand.DELETE, name, version); + } + + /** + * This method routes REST commands that take no parameters to their caller. + * + * @param commandType the type of REST command to process + * @param command the REST command to process + * @return the result of the REST command + */ + private ApexApiResult processRestCommand(final RestCommandType commandType, final RestCommand command) { + LOGGER.entry(commandType); + try { + ApexApiResult result = new ApexApiResult(); + RestSession session = SESSION_HANDLER.getSession(sessionId, result); + if (session == null) { + return result; + } + result = executeRestCommand(session, commandType, command); + LOGGER.exit(SESSION_CREATE + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } catch (final Exception e) { + LOGGER.catching(e); + LOGGER.exit(SESSION_CREATE_NOT_OK); + throw e; + } + } + + /** + * This method routes REST commands that take a JSON string to their caller. + * + * @param commandType the type of REST command to process + * @param command the REST command to process + * @param jsonString the JSON string received in the REST request + * @return the result of the REST command + */ + private ApexApiResult processRestCommand(final RestCommandType commandType, final RestCommand command, + final String jsonString) { + LOGGER.entry(commandType, jsonString); + try { + ApexApiResult result = new ApexApiResult(); + RestSession session = SESSION_HANDLER.getSession(sessionId, result); + if (session == null) { + return result; + } + result = executeRestCommand(session, commandType, command, jsonString); + LOGGER.exit(SESSION_CREATE + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } catch (final Exception e) { + LOGGER.catching(e); + LOGGER.exit(SESSION_CREATE_NOT_OK); + throw e; + } + } + + /** + * This method routes REST commands that take a name and version to their caller. + * + * @param commandType the type of REST command to process + * @param command the REST command to process + * @param name the name received in the REST request + * @param version the name received in the REST request + * @return the result of the REST command + */ + private ApexApiResult processRestCommand(final RestCommandType commandType, final RestCommand command, + final String name, final String version) { + LOGGER.entry(commandType, name, version); + try { + ApexApiResult result = new ApexApiResult(); + RestSession session = SESSION_HANDLER.getSession(sessionId, result); + if (session == null) { + return result; + } + result = executeRestCommand(session, commandType, command, name, version); + LOGGER.exit(SESSION_CREATE + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } catch (final Exception e) { + LOGGER.catching(e); + LOGGER.exit(SESSION_CREATE_NOT_OK); + throw e; + } + } + + /** + * This method invokes callers to run REST commands that take no parameters. + * + * @param session the Apex editor session + * @param commandType the type of REST command to process + * @param command the REST command to process + * @return the result of the REST command + */ + @Override + public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType, + final RestCommand command) { + switch (commandType) { + case MODEL: + return MODEL_HANDLER.executeRestCommand(session, commandType, command); + case KEY_INFO: + return KEY_INFO_HANDLER.executeRestCommand(session, commandType, command); + case CONTEXT_SCHEMA: + return CONTEXT_SCHEMA_HANDLER.executeRestCommand(session, commandType, command); + case CONTEXT_ALBUM: + return CONTEXT_ALBUM_HANDLER.executeRestCommand(session, commandType, command); + case EVENT: + return EVENT_HANDLER.executeRestCommand(session, commandType, command); + case TASK: + return TASK_HANDLER.executeRestCommand(session, commandType, command); + case POLICY: + return POLICY_HANDLER.executeRestCommand(session, commandType, command); + default: + return new ApexApiResult(Result.FAILED, REST_COMMAND_NOT_RECOGNISED); + } + } + + /** + * This method invokes callers to run REST commands that take a JSON string. + * + * @param session the Apex editor session + * @param commandType the type of REST command to process + * @param command the REST command to process + * @param jsonString the JSON string received in the REST request + * @return the result of the REST command + */ + @Override + public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType, + final RestCommand command, final String jsonString) { + switch (commandType) { + case MODEL: + return MODEL_HANDLER.executeRestCommand(session, commandType, command, jsonString); + case KEY_INFO: + return KEY_INFO_HANDLER.executeRestCommand(session, commandType, command, jsonString); + case CONTEXT_SCHEMA: + return CONTEXT_SCHEMA_HANDLER.executeRestCommand(session, commandType, command, jsonString); + case CONTEXT_ALBUM: + return CONTEXT_ALBUM_HANDLER.executeRestCommand(session, commandType, command, jsonString); + case EVENT: + return EVENT_HANDLER.executeRestCommand(session, commandType, command, jsonString); + case TASK: + return TASK_HANDLER.executeRestCommand(session, commandType, command, jsonString); + case POLICY: + return POLICY_HANDLER.executeRestCommand(session, commandType, command, jsonString); + default: + return new ApexApiResult(Result.FAILED, REST_COMMAND_NOT_RECOGNISED); + } + } + + /** + * This method invokes callers to run REST commands that take a name and version. + * + * @param session the Apex editor session + * @param commandType the type of REST command to process + * @param command the REST command to process + * @param name the name received in the REST request + * @param version the name received in the REST request + * @return the result of the REST command + */ + @Override + public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType, + final RestCommand command, final String name, final String version) { + switch (commandType) { + case MODEL: + return MODEL_HANDLER.executeRestCommand(session, commandType, command, name, version); + case KEY_INFO: + return KEY_INFO_HANDLER.executeRestCommand(session, commandType, command, name, version); + case CONTEXT_SCHEMA: + return CONTEXT_SCHEMA_HANDLER.executeRestCommand(session, commandType, command, name, version); + case CONTEXT_ALBUM: + return CONTEXT_ALBUM_HANDLER.executeRestCommand(session, commandType, command, name, version); + case EVENT: + return EVENT_HANDLER.executeRestCommand(session, commandType, command, name, version); + case TASK: + return TASK_HANDLER.executeRestCommand(session, commandType, command, name, version); + case POLICY: + return POLICY_HANDLER.executeRestCommand(session, commandType, command, name, version); + default: + return new ApexApiResult(Result.FAILED, REST_COMMAND_NOT_RECOGNISED); + } + } + + /** + * Create a periodic event from the periodic event template. + */ + private ApexApiResult createPeriodicEvent() { + String periodicEventJsonString; + try { + periodicEventJsonString = TextFileUtils.getTextFileAsString(PERIODIC_EVENT_TEMPLATE); + } catch (IOException ioException) { + String message = "read of periodic event tempalte from " + PERIODIC_EVENT_TEMPLATE + "failed: " + + ioException.getMessage(); + LOGGER.debug(message, ioException); + return new ApexApiResult(Result.FAILED, message); + } + + return processRestCommand(RestCommandType.EVENT, RestCommand.CREATE, periodicEventJsonString); + } + + /* + * This method is used only for testing and is used to cause an exception on calls from unit test to test exception + * handling. + */ + protected static int createCorruptSession() { + final ApexEditorRestResource apexEditorRestResource = new ApexEditorRestResource(); + final ApexApiResult result = apexEditorRestResource.createSession(); + final int corruptSessionId = Integer.parseInt(result.getMessages().get(0)); + + SESSION_HANDLER.setCorruptSession(corruptSessionId); + + return corruptSessionId; + } + +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/ContextAlbumHandler.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/ContextAlbumHandler.java new file mode 100644 index 0000000..abf81b8 --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/ContextAlbumHandler.java @@ -0,0 +1,219 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling; + +import org.onap.policy.apex.model.basicmodel.concepts.AxKeyInfo; +import org.onap.policy.apex.model.contextmodel.concepts.AxContextAlbum; +import org.onap.policy.apex.model.modelapi.ApexApiResult; +import org.onap.policy.gui.editors.apex.rest.handling.bean.BeanContextAlbum; +import org.slf4j.ext.XLogger; +import org.slf4j.ext.XLoggerFactory; + +/** + * This class handles commands on context albums in Apex models. + */ +public class ContextAlbumHandler implements RestCommandHandler { + // Get a reference to the logger + private static final XLogger LOGGER = XLoggerFactory.getXLogger(ContextAlbumHandler.class); + + // Recurring string constants + private static final String OK = ": OK"; + private static final String NOT_OK = ": Not OK"; + + /** + * {@inheritDoc}. + */ + @Override + public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType, + final RestCommand command) { + return getUnsupportedCommandResultMessage(session, commandType, command); + } + + /** + * {@inheritDoc}. + */ + @Override + public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType, + final RestCommand command, final String jsonString) { + if (!RestCommandType.CONTEXT_ALBUM.equals(commandType)) { + return getUnsupportedCommandResultMessage(session, commandType, command); + } + + switch (command) { + case CREATE: + return createContextAlbum(session, jsonString); + case UPDATE: + return updateContextAlbum(session, jsonString); + default: + return getUnsupportedCommandResultMessage(session, commandType, command); + } + } + + /** + * {@inheritDoc}. + */ + @Override + public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType, + final RestCommand command, final String name, final String version) { + if (!RestCommandType.CONTEXT_ALBUM.equals(commandType)) { + return getUnsupportedCommandResultMessage(session, commandType, command); + } + + switch (command) { + case LIST: + return listContextAlbums(session, name, version); + case DELETE: + return deleteContextAlbum(session, name, version); + case VALIDATE: + return validateContextAlbum(session, name, version); + default: + return getUnsupportedCommandResultMessage(session, commandType, command); + } + } + + /** + * Creates a context album with the information in the JSON string passed. + * + * @param session the Apex model editing session + * @param jsonString the JSON string to be parsed. See + * {@linkplain BeanContextAlbum} + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult createContextAlbum(final RestSession session, final String jsonString) { + LOGGER.entry(jsonString); + + session.editModel(); + + final BeanContextAlbum jsonbean = RestUtils.getJsonParameters(jsonString, BeanContextAlbum.class); + + ApexApiResult result = session.getApexModelEdited().createContextAlbum(jsonbean.getName(), + jsonbean.getVersion(), jsonbean.getScope(), Boolean.toString(jsonbean.getWriteable()), + jsonbean.getItemSchema().getName(), jsonbean.getItemSchema().getVersion(), jsonbean.getUuid(), + jsonbean.getDescription()); + + session.finishSession(result.isOk()); + + LOGGER.exit("ContextAlbum/Create" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + + /** + * Update a context album with the information in the JSON string passed. + * + * @param session the Apex model editing session + * @param jsonString the JSON string to be parsed. See + * {@linkplain BeanContextAlbum} + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult updateContextAlbum(final RestSession session, final String jsonString) { + LOGGER.entry(jsonString); + + session.editModel(); + + final BeanContextAlbum jsonbean = RestUtils.getJsonParameters(jsonString, BeanContextAlbum.class); + + ApexApiResult result = session.getApexModelEdited().updateContextAlbum(jsonbean.getName(), + jsonbean.getVersion(), jsonbean.getScope(), Boolean.toString(jsonbean.getWriteable()), + jsonbean.getItemSchema().getName(), jsonbean.getItemSchema().getVersion(), jsonbean.getUuid(), + jsonbean.getDescription()); + + session.finishSession(result.isOk()); + + LOGGER.exit("ContextAlbum/Update" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + + /** + * List context albums with the given key names/versions. If successful the + * result(s) will be available in the result messages. The returned value(s) + * will be similar to {@link AxContextAlbum}, with merged {@linkplain AxKeyInfo} + * for the root object. + * + * @param session the Apex model editing session + * @param name the name to search for. If null or empty, then all names will + * be queried + * @param version the version to search for. If null then all versions will be + * searched for. + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult listContextAlbums(final RestSession session, final String name, final String version) { + LOGGER.entry(name, version); + + ApexApiResult result = session.getApexModel().listContextAlbum(blank2Null(name), blank2Null(version)); + + LOGGER.exit("ContextAlbum/Get" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + + /** + * Delete context albums with the given key names/versions. + * + * @param session the Apex model editing session + * @param name the name to search for. If null or empty, then all names will + * be queried + * @param version the version to search for. If null then all versions will be + * searched for. + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult deleteContextAlbum(final RestSession session, final String name, final String version) { + LOGGER.entry(name, version); + + session.editModel(); + + ApexApiResult result = session.getApexModelEdited().deleteContextAlbum(blank2Null(name), blank2Null(version)); + + session.finishSession(result.isOk()); + + LOGGER.exit("ContextAlbum/Delete" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + + /** + * Validate context albums with the given key names/versions. The result(s) will + * be available in the result messages. + * + * @param session the Apex model editing session + * @param name the name to search for. If null or empty, then all names will + * be queried + * @param version the version to search for. If null then all versions will be + * searched for. + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult validateContextAlbum(final RestSession session, final String name, final String version) { + LOGGER.entry(name, version); + + ApexApiResult result = session.getApexModel().validateContextAlbum(blank2Null(name), blank2Null(version)); + + LOGGER.exit("Validate/ContextAlbum" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/ContextSchemaHandler.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/ContextSchemaHandler.java new file mode 100644 index 0000000..65aa2fd --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/ContextSchemaHandler.java @@ -0,0 +1,192 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling; + +import org.onap.policy.apex.model.modelapi.ApexApiResult; +import org.onap.policy.gui.editors.apex.rest.handling.bean.BeanContextSchema; +import org.slf4j.ext.XLogger; +import org.slf4j.ext.XLoggerFactory; + +/** + * This class handles commands on context schemas in Apex models. + */ +public class ContextSchemaHandler implements RestCommandHandler { + // Get a reference to the logger + private static final XLogger LOGGER = XLoggerFactory.getXLogger(ContextSchemaHandler.class); + + // Recurring string constants + private static final String OK = ": OK"; + private static final String NOT_OK = ": Not OK"; + + /** + * {@inheritDoc}. + */ + @Override + public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType, + final RestCommand command) { + return getUnsupportedCommandResultMessage(session, commandType, command); + } + + /** + * {@inheritDoc}. + */ + @Override + public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType, + final RestCommand command, final String jsonString) { + if (!RestCommandType.CONTEXT_SCHEMA.equals(commandType)) { + return getUnsupportedCommandResultMessage(session, commandType, command); + } + + switch (command) { + case CREATE: + return createContextSchema(session, jsonString); + case UPDATE: + return updateContextSchema(session, jsonString); + default: + return getUnsupportedCommandResultMessage(session, commandType, command); + } + } + + /** + * {@inheritDoc}. + */ + @Override + public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType, + final RestCommand command, final String name, final String version) { + if (!RestCommandType.CONTEXT_SCHEMA.equals(commandType)) { + return getUnsupportedCommandResultMessage(session, commandType, command); + } + + switch (command) { + case LIST: + return listContextSchemas(session, name, version); + case DELETE: + return deleteContextSchema(session, name, version); + case VALIDATE: + return validateContextSchemas(session, name, version); + default: + return getUnsupportedCommandResultMessage(session, commandType, command); + } + } + + /** + * Creates a context schema. + * + * @param session the session holding the Apex model + * @param jsonString the JSON string with the context schema parameters + * @return the result of the operation + */ + private ApexApiResult createContextSchema(final RestSession session, final String jsonString) { + LOGGER.entry(jsonString); + + session.editModel(); + + final BeanContextSchema jsonbean = RestUtils.getJsonParameters(jsonString, BeanContextSchema.class); + ApexApiResult result = session.getApexModelEdited().createContextSchema(jsonbean.getName(), + jsonbean.getVersion(), jsonbean.getSchemaFlavour(), jsonbean.getSchemaDefinition(), jsonbean.getUuid(), + jsonbean.getDescription()); + + session.finishSession(result.isOk()); + + LOGGER.exit("ContextSchema/create" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + + /** + * Update a context schema. + * + * @param session the session holding the Apex model + * @param jsonString the JSON string with the context schema parameters + * @return the result of the operation + */ + private ApexApiResult updateContextSchema(final RestSession session, final String jsonString) { + LOGGER.entry(jsonString); + + session.editModel(); + + final BeanContextSchema jsonbean = RestUtils.getJsonParameters(jsonString, BeanContextSchema.class); + + ApexApiResult result = session.getApexModelEdited().updateContextSchema(jsonbean.getName(), + jsonbean.getVersion(), jsonbean.getSchemaFlavour(), jsonbean.getSchemaDefinition(), jsonbean.getUuid(), + jsonbean.getDescription()); + + session.finishSession(result.isOk()); + + LOGGER.exit("ContextSchema/Update" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + + /** + * List context schemas. + * + * @param session the session holding the Apex model + * @param name the context schema name to operate on + * @param version the context schema version to operate on + * @return the result of the operation + */ + private ApexApiResult listContextSchemas(final RestSession session, final String name, final String version) { + LOGGER.entry(name, version); + + ApexApiResult result = session.getApexModel().listContextSchemas(blank2Null(name), blank2Null(version)); + + LOGGER.exit("ContextSchema/Get" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + + /** + * Delete a context schema. + * + * @param session the session holding the Apex model + * @param name the context schema name to operate on + * @param version the context schema version to operate on + * @return the result of the operation + */ + private ApexApiResult deleteContextSchema(final RestSession session, final String name, final String version) { + LOGGER.entry(name, version); + + session.editModel(); + + ApexApiResult result = session.getApexModelEdited().deleteContextSchema(blank2Null(name), blank2Null(version)); + + session.finishSession(result.isOk()); + + LOGGER.exit("ContextSchema/Delete" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + + /** + * Validate a context schema. + * + * @param session the session holding the Apex model + * @param name the context schema name to operate on + * @param version the context schema version to operate on + * @return the result of the operation + */ + private ApexApiResult validateContextSchemas(final RestSession session, final String name, final String version) { + LOGGER.entry(name, version); + + ApexApiResult result = session.getApexModel().validateContextSchemas(blank2Null(name), blank2Null(version)); + + LOGGER.exit("Validate/ContextSchema" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/EventHandler.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/EventHandler.java new file mode 100644 index 0000000..a1e2ff9 --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/EventHandler.java @@ -0,0 +1,276 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2019-2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling; + +import java.util.Map.Entry; +import org.onap.policy.apex.model.basicmodel.concepts.AxKeyInfo; +import org.onap.policy.apex.model.eventmodel.concepts.AxEvent; +import org.onap.policy.apex.model.modelapi.ApexApiResult; +import org.onap.policy.apex.model.modelapi.ApexApiResult.Result; +import org.onap.policy.gui.editors.apex.rest.handling.bean.BeanEvent; +import org.onap.policy.gui.editors.apex.rest.handling.bean.BeanField; +import org.slf4j.ext.XLogger; +import org.slf4j.ext.XLoggerFactory; + +/** + * This class handles commands on events in Apex models. + */ +public class EventHandler implements RestCommandHandler { + // Get a reference to the logger + private static final XLogger LOGGER = XLoggerFactory.getXLogger(EventHandler.class); + + // Recurring string constants + private static final String OK = ": OK"; + private static final String NOT_OK = ": Not OK"; + + /** + * {@inheritDoc}. + */ + @Override + public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType, + final RestCommand command) { + return getUnsupportedCommandResultMessage(session, commandType, command); + } + + /** + * {@inheritDoc}. + */ + @Override + public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType, + final RestCommand command, final String jsonString) { + if (!RestCommandType.EVENT.equals(commandType)) { + return getUnsupportedCommandResultMessage(session, commandType, command); + } + + switch (command) { + case CREATE: + return createEvent(session, jsonString); + case UPDATE: + return updateEvent(session, jsonString); + default: + return getUnsupportedCommandResultMessage(session, commandType, command); + } + } + + /** + * {@inheritDoc}. + */ + @Override + public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType, + final RestCommand command, final String name, final String version) { + if (!RestCommandType.EVENT.equals(commandType)) { + return getUnsupportedCommandResultMessage(session, commandType, command); + } + + switch (command) { + case LIST: + return listEvents(session, name, version); + case DELETE: + return deleteEvent(session, name, version); + case VALIDATE: + return validateEvent(session, name, version); + default: + return getUnsupportedCommandResultMessage(session, commandType, command); + } + } + + /** + * Creates an event with the information in the JSON string passed. + * + * @param session the Apex model editing session + * @param jsonString the JSON string to be parsed. See {@linkplain BeanEvent} + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult createEvent(final RestSession session, final String jsonString) { + LOGGER.entry(jsonString); + + final BeanEvent jsonbean = RestUtils.getJsonParameters(jsonString, BeanEvent.class); + + session.editModel(); + + ApexApiResult result = session.getApexModelEdited().createEvent(jsonbean.getName(), jsonbean.getVersion(), + jsonbean.getNameSpace(), jsonbean.getSource(), jsonbean.getTarget(), jsonbean.getUuid(), + jsonbean.getDescription()); + + if (result.isOk()) { + result = createEventParameters(session, jsonbean); + } + + session.finishSession(result.isOk()); + + LOGGER.exit("Event/Create" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + + /** + * Create the parameters on an event. + * + * @param session the Apex editor session + * @param jsonbean the JSON bean holding the parameters + * @return result the result of the parameter creation operation + */ + private ApexApiResult createEventParameters(final RestSession session, final BeanEvent jsonbean) { + ApexApiResult result = new ApexApiResult(); + + if (jsonbean.getParameters() == null || jsonbean.getParameters().isEmpty()) { + return result; + } + + for (final Entry<String, BeanField> parameterEntry : jsonbean.getParameters().entrySet()) { + if (parameterEntry.getValue() == null) { + result.setResult(Result.FAILED); + result.addMessage("Null event parameter information for parameter \"" + parameterEntry.getKey() + + "\" in event " + jsonbean.getName() + ":" + jsonbean.getVersion() + + ". The event was created, but there was an error adding the event parameters." + + " The event has only been partially defined."); + continue; + } + + final ApexApiResult createParResult = session.getApexModelEdited().createEventPar(jsonbean.getName(), + jsonbean.getVersion(), parameterEntry.getKey(), parameterEntry.getValue().getName(), + parameterEntry.getValue().getVersion(), parameterEntry.getValue().getOptional()); + if (createParResult.isNok()) { + result.setResult(createParResult.getResult()); + result.addMessage("Failed to add event parameter information for parameter \"" + parameterEntry.getKey() + + "\" in event " + jsonbean.getName() + ":" + jsonbean.getVersion() + + ". The event was created, but there was an error adding the event parameters." + + " The event has only been partially defined."); + } + } + + return result; + } + + /** + * Update an event with the information in the JSON string passed. + * + * @param session the Apex model editing session + * @param jsonString the JSON string to be parsed. See {@linkplain BeanEvent} + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult updateEvent(final RestSession session, final String jsonString) { + LOGGER.entry(jsonString); + + final BeanEvent jsonbean = RestUtils.getJsonParameters(jsonString, BeanEvent.class); + + if (blank2Null(jsonbean.getName()) == null || blank2Null(jsonbean.getVersion()) == null) { + LOGGER.exit("Event/Update" + NOT_OK); + return new ApexApiResult(Result.FAILED, "Null/Empty event name/version (\"" + jsonbean.getName() + ":" + + jsonbean.getVersion() + "\" passed to UpdateEvent"); + } + + session.editModel(); + + ApexApiResult result = session.getApexModelEdited().deleteEvent(blank2Null(jsonbean.getName()), + blank2Null(jsonbean.getVersion())); + + if (result.isOk()) { + result = session.getApexModelEdited().createEvent(jsonbean.getName(), jsonbean.getVersion(), + jsonbean.getNameSpace(), jsonbean.getSource(), jsonbean.getTarget(), jsonbean.getUuid(), + jsonbean.getDescription()); + + if (result.isOk() && jsonbean.getParameters() != null) { + result = createEventParameters(session, jsonbean); + } + } + + session.finishSession(result.isOk()); + + LOGGER.exit("Event/Update" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + + /** + * List events with the given key names/versions. If successful the result(s) + * will be available in the result messages. The returned value(s) will be + * similar to {@link AxEvent}, with merged {@linkplain AxKeyInfo} for the root + * object. + * + * @param session the Apex model editing session + * @param name the name to search for. If null or empty, then all names will + * be queried + * @param version the version to search for. If null then all versions will be + * searched for. + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult listEvents(final RestSession session, final String name, final String version) { + LOGGER.entry(name, version); + + ApexApiResult result = session.getApexModel().listEvent(blank2Null(name), blank2Null(version)); + + LOGGER.exit("Event/Get" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + + /** + * Delete events with the given key names/versions. + * + * @param session the Apex model editing session + * @param name the name to search for. If null or empty, then all names will + * be queried + * @param version the version to search for. If null then all versions will be + * searched for. + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult deleteEvent(final RestSession session, final String name, final String version) { + LOGGER.entry(name, version); + + session.editModel(); + + ApexApiResult result = session.getApexModelEdited().deleteEvent(blank2Null(name), blank2Null(version)); + + session.finishSession(result.isOk()); + + LOGGER.exit("Event/Delete" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + + /** + * Validate events with the given key names/versions. The result(s) will be + * available in the result messages. + * + * @param session the Apex model editing session + * @param name the name to search for. If null or empty, then all names will + * be queried + * @param version the version to search for. If null then all versions will be + * searched for. + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult validateEvent(final RestSession session, final String name, final String version) { + LOGGER.entry(name, version); + + ApexApiResult result = session.getApexModel().validateEvent(blank2Null(name), blank2Null(version)); + + LOGGER.exit("Validate/Event" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/KeyInfoHandler.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/KeyInfoHandler.java new file mode 100644 index 0000000..eec8e6c --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/KeyInfoHandler.java @@ -0,0 +1,73 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling; + +import org.onap.policy.apex.model.modelapi.ApexApiResult; + +/** + * This class handles commands on key information in Apex models. + */ +public class KeyInfoHandler implements RestCommandHandler { + /** + * {@inheritDoc}. + */ + @Override + public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType, + final RestCommand command) { + return getUnsupportedCommandResultMessage(session, commandType, command); + } + + /** + * {@inheritDoc}. + */ + @Override + public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType, + final RestCommand command, final String jsonString) { + return getUnsupportedCommandResultMessage(session, commandType, command); + } + + /** + * {@inheritDoc}. + */ + @Override + public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType, + final RestCommand command, final String name, final String version) { + + if (RestCommandType.KEY_INFO.equals(commandType) && RestCommand.LIST.equals(command)) { + return listKeyInformation(session, name, version); + } else { + return getUnsupportedCommandResultMessage(session, commandType, command); + } + } + + /** + * Get the key information for a concept with the given name and version. + * + * @param session the editor session containing the Apex model + * @param name the name for the search + * @param version the version for the search + * @return the key information + */ + private ApexApiResult listKeyInformation(final RestSession session, final String name, final String version) { + return session.getApexModel().listKeyInformation(blank2Null(name), blank2Null(version)); + } +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/ModelHandler.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/ModelHandler.java new file mode 100644 index 0000000..667d771 --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/ModelHandler.java @@ -0,0 +1,461 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2019-2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import java.util.ArrayList; +import java.util.List; +import org.onap.policy.apex.model.basicmodel.concepts.AxKey; +import org.onap.policy.apex.model.basicmodel.concepts.AxKeyInfo; +import org.onap.policy.apex.model.modelapi.ApexApiResult; +import org.onap.policy.apex.model.modelapi.ApexApiResult.Result; +import org.onap.policy.apex.model.policymodel.concepts.AxPolicyModel; +import org.onap.policy.gui.editors.apex.rest.handling.bean.BeanModel; +import org.slf4j.ext.XLogger; +import org.slf4j.ext.XLoggerFactory; + +/** + * This class handles commands on Apex models. + */ +public class ModelHandler implements RestCommandHandler { + + // Get a reference to the logger + private static final XLogger LOGGER = XLoggerFactory.getXLogger(ModelHandler.class); + + // Recurring string constants + private static final String OK = ": OK"; + private static final String NOT_OK = ": Not OK"; + private static final String KEY = "key"; + private static final String NAME = "name"; + private static final String VERSION = "version"; + private static final String UUID = "uuid"; + private static final String DESCRIPTION = "description"; + private static final String POLICY_KEY = "policyKey"; + private static final String APEX_KEY_INFO = "apexKeyInfo"; + + /** + * {@inheritDoc}. + */ + @Override + public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType, + final RestCommand command) { + if (!RestCommandType.MODEL.equals(commandType)) { + return getUnsupportedCommandResultMessage(session, commandType, command); + } + + switch (command) { + case ANALYSE: + return analyse(session); + case VALIDATE: + return validate(session); + case GET_KEY: + return getModelKey(session); + case LIST: + return listModel(session); + case DOWNLOAD: + return downloadModel(session); + case DELETE: + return deleteModel(session); + default: + return getUnsupportedCommandResultMessage(session, commandType, command); + } + } + + /** + * {@inheritDoc}. + */ + @Override + public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType, + final RestCommand command, final String jsonString) { + if (!RestCommandType.MODEL.equals(commandType)) { + return getUnsupportedCommandResultMessage(session, commandType, command); + } + + switch (command) { + case LOAD: + return loadFromString(session, jsonString); + case CREATE: + return createModel(session, jsonString); + case UPDATE: + return updateModel(session, jsonString); + default: + return getUnsupportedCommandResultMessage(session, commandType, command); + } + } + + /** + * {@inheritDoc}. + */ + @Override + public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType, + final RestCommand command, final String name, final String version) { + return getUnsupportedCommandResultMessage(session, commandType, command); + } + + /** + * Load the model from a JSON string for this session. + * + * @param session the Apex model editing session + * @param jsonString the JSON string to be parsed. The returned value(s) will be + * similar to {@link AxPolicyModel}, with merged + * {@linkplain AxKeyInfo} for the root object. + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult loadFromString(final RestSession session, final String jsonString) { + LOGGER.entry(jsonString); + + session.editModel(); + + ApexApiResult result = session.getApexModelEdited().loadFromString(jsonString); + + session.finishSession(result.isOk()); + + LOGGER.exit("Model/Load" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + + /** + * Analyse the model and return analysis results. If successful the analysis + * results will be available in the messages in the result. + * + * @param session the Apex model editing session + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult analyse(final RestSession session) { + LOGGER.entry(); + + ApexApiResult result = session.getApexModel().analyse(); + + LOGGER.exit("Model/Analyse" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + + /** + * Validate the model and return validation results. If successful the + * validation results will be available in the messages in the result. + * + * @param session the Apex model editing session + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult validate(final RestSession session) { + LOGGER.entry(); + + ApexApiResult result = session.getApexModel().validate(); + + LOGGER.exit("Model/Validate" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + + /** + * Creates the new model model for this session. + * + * @param session the Apex model editing session + * @param jsonString the JSON string to be parsed containing the new model. See + * {@linkplain BeanModel} + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult createModel(final RestSession session, final String jsonString) { + LOGGER.entry(jsonString); + + final BeanModel jsonbean = RestUtils.getJsonParameters(jsonString, BeanModel.class); + + session.editModel(); + + ApexApiResult result = session.getApexModelEdited().createModel(jsonbean.getName(), jsonbean.getVersion(), + jsonbean.getUuid(), jsonbean.getDescription()); + + session.finishSession(result.isOk()); + + LOGGER.exit("Model/Create" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + + /** + * Update the model for this session. + * + * @param session the Apex model editing session + * @param jsonString the JSON string to be parsed containing the updated model. + * See {@linkplain BeanModel} + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult updateModel(final RestSession session, final String jsonString) { + LOGGER.entry(jsonString); + + final BeanModel jsonbean = RestUtils.getJsonParameters(jsonString, BeanModel.class); + + session.editModel(); + + ApexApiResult result = session.getApexModelEdited().updateModel(jsonbean.getName(), jsonbean.getVersion(), + jsonbean.getUuid(), jsonbean.getDescription()); + + session.finishSession(result.isOk()); + + LOGGER.exit("Model/Update" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + + /** + * Gets the key for the model for this session. If successful the model key will + * be available in the first message in the result. See {@linkplain AxKey} + * + * @param session the Apex model editing session + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult getModelKey(final RestSession session) { + LOGGER.entry(); + + ApexApiResult result = session.getApexModel().getModelKey(); + + LOGGER.exit("Model/GetKey" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + + /** + * Retrieve the model for this session. If successful the model will be + * available in the first message in the result. The returned value will be + * similar to a {@link AxPolicyModel}, with merged {@linkplain AxKeyInfo} for + * the root object. + * + * @param session the Apex model editing session + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult listModel(final RestSession session) { + LOGGER.entry(); + + ApexApiResult result = session.getApexModel().listModel(); + + result = addKeyInfo2Messages(session, result); + + LOGGER.exit("Model/Get" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + + /** + * Download the model for this session as a String. + * + * @param session the Apex model editing session + * @return the model represented as a JSON string. See + * {@linkplain AxPolicyModel} + */ + private ApexApiResult downloadModel(final RestSession session) { + LOGGER.entry(); + + ApexApiResult result = session.getApexModel().listModel(); + + LOGGER.exit("Model/Download" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + + /** + * Delete the model for this session. + * + * @param session the Apex model editing session + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult deleteModel(final RestSession session) { + LOGGER.entry(); + + session.editModel(); + + ApexApiResult result = session.getApexModel().deleteModel(); + + session.finishSession(result.isOk()); + + LOGGER.exit("Model/Delete" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + + /** + * The json strings representing the objects listed, stored in + * result.messages[], does not contain the AxKeyInformation for that object. + * This utility method retrieves the AxKeyInfo for each object and adds it to + * the json for the object. + * + * @param session the Apex model editing session + * @param incomingResult The list result, containing JSON representations of + * objects stored in its "messages" array + * @return The list result, containing JSON augmented representations of objects + * stored in its "messages" array + */ + private ApexApiResult addKeyInfo2Messages(final RestSession session, final ApexApiResult incomingResult) { + final ApexApiResult result = new ApexApiResult(incomingResult.getResult()); + result.setMessages(incomingResult.getMessages()); + + final List<String> messages = incomingResult.getMessages(); + final List<String> augmentedMessages = new ArrayList<>(messages.size()); + + for (final String message : messages) { + augmentedMessages.add(addKeyInfo2Message(session, message)); + } + result.setMessages(augmentedMessages); + + if (messages.size() != augmentedMessages.size()) { + result.setResult(Result.OTHER_ERROR); + result.addMessage("Failed to add KeyInfo to all results. Results are not complete"); + } + + return result; + } + + /** + * Augment a message with key information. + * + * @param session the Apex model editing session + * @param message The message to augment + * @return the augmented message + */ + private String addKeyInfo2Message(final RestSession session, final String message) { + final Gson gson = new GsonBuilder().serializeNulls().enableComplexMapKeySerialization().create(); + + JsonObject jsonObject = gson.fromJson(message, JsonObject.class); + if (jsonObject == null) { + return message; + } + + String name = readFieldFromJsonObject(jsonObject, NAME, null); + String version = readFieldFromJsonObject(jsonObject, VERSION, null); + + if (name == null && version == null) { + JsonObject newJsonObject = getSubJsonObject(jsonObject); + + if (newJsonObject != null) { + jsonObject = newJsonObject; + name = readFieldFromJsonObject(jsonObject, NAME, name); + version = readFieldFromJsonObject(jsonObject, VERSION, version); + } + } + + if (name == null || version == null || !setUuidAndDescription(session, jsonObject, name, version)) { + jsonObject.addProperty(UUID, (String) null); + jsonObject.addProperty(DESCRIPTION, (String) null); + } + + return gson.toJson(jsonObject); + } + + /** + * Get an embedded JSON object for the given JSON object. + * + * @param jsonObject the input JSON object + * @return the embedded JSON object + */ + private JsonObject getSubJsonObject(JsonObject jsonObject) { + if (jsonObject.entrySet() != null && !jsonObject.entrySet().isEmpty()) { + return (JsonObject) jsonObject.entrySet().iterator().next().getValue(); + } else { + return null; + } + } + + /** + * Condition a field so its key information can be looked up. + * + * @param jsonObject the object to query + * @param fieldTag the tag of the field to condition + * @param fieldValue the value of the field to condition + * @return field read from the json + */ + private String readFieldFromJsonObject(final JsonObject jsonObject, final String fieldTag, final String value) { + String lookedupValue = value; + + if (jsonObject != null && jsonObject.get(KEY) != null && jsonObject.get(KEY).isJsonObject() + && jsonObject.getAsJsonObject(KEY).get(fieldTag) != null) { + lookedupValue = jsonObject.getAsJsonObject(KEY).get(fieldTag).getAsString(); + } else if (jsonObject != null && jsonObject.get(POLICY_KEY) != null && jsonObject.get(POLICY_KEY).isJsonObject() + && jsonObject.getAsJsonObject(POLICY_KEY).get(fieldTag) != null) { + lookedupValue = jsonObject.getAsJsonObject(POLICY_KEY).get(fieldTag).getAsString(); + } + return lookedupValue; + } + + /** + * Look up the UUID and description in the key information for a concept. + * + * @param session the Apex editor session + * @param jsonObject the JSON object to place the fields in + * @param name the concept name to look up + * @param version the concept version to look up + */ + private boolean setUuidAndDescription(final RestSession session, JsonObject jsonObject, String name, + String version) { + // Look up the key information for the name and version + JsonObject keyInfoJsonObject = lookupKeyInfo(session, name, version); + if (keyInfoJsonObject == null || keyInfoJsonObject.get(APEX_KEY_INFO) != null) { + return false; + } + + if (keyInfoJsonObject.get(APEX_KEY_INFO).getAsJsonObject().get("UUID") != null) { + jsonObject.addProperty(UUID, + keyInfoJsonObject.get(APEX_KEY_INFO).getAsJsonObject().get("UUID").getAsString()); + } else { + jsonObject.addProperty(UUID, (String) null); + } + + if (keyInfoJsonObject.get(APEX_KEY_INFO).getAsJsonObject().get(DESCRIPTION) != null) { + jsonObject.addProperty(DESCRIPTION, + keyInfoJsonObject.get(APEX_KEY_INFO).getAsJsonObject().get(DESCRIPTION).getAsString()); + } else { + jsonObject.addProperty(DESCRIPTION, (String) null); + } + + return true; + } + + /** + * Look up the key information for the given concept name and value. + * + * @param session the Apex editor session + * @param name the concept name to look up + * @param version the concept version to look up + * @return a JSON version of the concept key information + */ + private JsonObject lookupKeyInfo(final RestSession session, final String name, final String version) { + final ApexApiResult keyInfoResult = session.getApexModel().listKeyInformation(name, version); + final List<String> keyInfoMessages = keyInfoResult.getMessages(); + + if (keyInfoResult.isNok() || keyInfoMessages == null || keyInfoMessages.isEmpty()) { + return null; + } + + final Gson gson = new GsonBuilder().serializeNulls().enableComplexMapKeySerialization().create(); + final String keyInfoJson = keyInfoMessages.get(0); + return gson.fromJson(keyInfoJson, JsonObject.class); + } +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/PolicyHandler.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/PolicyHandler.java new file mode 100644 index 0000000..19130aa --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/PolicyHandler.java @@ -0,0 +1,589 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling; + +import java.util.Map; +import org.onap.policy.apex.model.basicmodel.concepts.AxKey; +import org.onap.policy.apex.model.modelapi.ApexApiResult; +import org.onap.policy.apex.model.modelapi.ApexApiResult.Result; +import org.onap.policy.apex.model.policymodel.concepts.AxPolicy; +import org.onap.policy.gui.editors.apex.rest.handling.bean.BeanKeyRef; +import org.onap.policy.gui.editors.apex.rest.handling.bean.BeanLogic; +import org.onap.policy.gui.editors.apex.rest.handling.bean.BeanPolicy; +import org.onap.policy.gui.editors.apex.rest.handling.bean.BeanState; +import org.onap.policy.gui.editors.apex.rest.handling.bean.BeanStateOutput; +import org.onap.policy.gui.editors.apex.rest.handling.bean.BeanStateTaskRef; +import org.slf4j.ext.XLogger; +import org.slf4j.ext.XLoggerFactory; + +/** + * This class handles commands on policies in Apex models. + */ +public class PolicyHandler implements RestCommandHandler { + // Get a reference to the logger + private static final XLogger LOGGER = XLoggerFactory.getXLogger(PolicyHandler.class); + + // Recurring string constants + private static final String OK = ": OK"; + private static final String NOT_OK = ": Not OK"; + private static final String POLICY_WAS_CREATED = "\". The policy was created, "; + private static final String POLICY_STATE_CREATED = "\". The policy and state were created, "; + private static final String POLICY_PARTIALLY_DEFINED = " The policy has only been partially defined."; + private static final String FOR_POLICY = "\" for policy \""; + private static final String IN_STATE = "\" in state \""; + private static final String POLICY_CREATED_STATE_ERROR = POLICY_WAS_CREATED + + "but there was an error adding the state."; + private static final String POLICY_STATE_CREATED_OTHER_ERROR = POLICY_STATE_CREATED + + "but there was an error adding the"; + + /** + * {@inheritDoc}. + */ + @Override + public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType, + final RestCommand command) { + return getUnsupportedCommandResultMessage(session, commandType, command); + } + + /** + * {@inheritDoc}. + */ + @Override + public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType, + final RestCommand command, final String jsonString) { + + if (!RestCommandType.POLICY.equals(commandType)) { + return getUnsupportedCommandResultMessage(session, commandType, command); + } + + switch (command) { + case CREATE: + return createPolicy(session, jsonString); + case UPDATE: + return updatePolicy(session, jsonString); + default: + return getUnsupportedCommandResultMessage(session, commandType, command); + } + } + + /** + * {@inheritDoc}. + */ + @Override + public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType, + final RestCommand command, final String name, final String version) { + if (!RestCommandType.POLICY.equals(commandType)) { + return getUnsupportedCommandResultMessage(session, commandType, command); + } + + switch (command) { + case LIST: + return listPolicies(session, name, version); + case DELETE: + return deletePolicy(session, name, version); + default: + return getUnsupportedCommandResultMessage(session, commandType, command); + } + } + + /** + * Creates a policy with the information in the JSON string passed. + * + * @param session the Apex model editing session + * @param jsonString the JSON string to be parsed See {@linkplain BeanPolicy} + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + public ApexApiResult createPolicy(final RestSession session, final String jsonString) { + LOGGER.entry(jsonString); + + final BeanPolicy jsonbean = RestUtils.getJsonParameters(jsonString, BeanPolicy.class); + + session.editModel(); + + ApexApiResult result = session.getApexModelEdited().createPolicy(jsonbean.getName(), jsonbean.getVersion(), + jsonbean.getTemplate(), jsonbean.getFirstState(), jsonbean.getUuid(), jsonbean.getDescription()); + + if (result.isOk()) { + result = createPolicyContent(session, jsonbean); + } + + session.finishSession(result.isOk()); + + LOGGER.exit("Policy/Create" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + + /** + * Create the content of the policy. + * + * @param session the Apex model editing session + * @param jsonString the JSON string to be parsed See {@linkplain BeanPolicy} + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult createPolicyContent(RestSession session, BeanPolicy jsonbean) { + ApexApiResult result = new ApexApiResult(); + + if (jsonbean.getStates() == null || jsonbean.getStates().isEmpty()) { + result.setResult(Result.FAILED); + result.addMessage("Null or empty state map; no states defined for policy \"" + jsonbean.getName() + ":" + + jsonbean.getVersion() + "\". The policy was created, but there was an error adding states." + + POLICY_PARTIALLY_DEFINED); + return result; + } + + // States reference each other so all states must be created before they are + // populated + for (final Map.Entry<String, BeanState> stateEntry : jsonbean.getStates().entrySet()) { + ApexApiResult stateCreateResult = createState(session, jsonbean.getName(), jsonbean.getVersion(), + stateEntry.getKey(), stateEntry.getValue()); + + if (stateCreateResult.isNok()) { + result.setResult(stateCreateResult.getResult()); + result.addMessage(stateCreateResult.getMessage()); + } + } + + // Bale out if the state creation did not work + if (result.isNok()) { + return result; + } + + // Now create the content of each state + for (final Map.Entry<String, BeanState> stateEntry : jsonbean.getStates().entrySet()) { + ApexApiResult stateContentCreateResult = createStateContent(session, jsonbean.getName(), + jsonbean.getVersion(), stateEntry.getKey(), stateEntry.getValue()); + + if (stateContentCreateResult.isNok()) { + result.setResult(stateContentCreateResult.getResult()); + result.addMessage(stateContentCreateResult.getMessage()); + } + } + + return result; + } + + /** + * Create a state on the policy. + * + * @param session the Apex model editing session + * @param policyName the policy name + * @param policVersion the policy version + * @param stateName the name of the state + * @param stateBean the information on the state to create + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult createState(final RestSession session, final String policyName, final String policyVersion, + final String stateName, final BeanState stateBean) { + + if (stateBean == null) { + return new ApexApiResult(Result.FAILED, + "Null or invalid state information for state \"" + stateName + FOR_POLICY + policyName + ":" + + policyVersion + POLICY_CREATED_STATE_ERROR + POLICY_PARTIALLY_DEFINED); + } + + if (stateBean.getTrigger() == null) { + return new ApexApiResult(Result.FAILED, + "Null or invalid state trigger for state \"" + stateName + FOR_POLICY + policyName + ":" + policyVersion + + POLICY_CREATED_STATE_ERROR + POLICY_PARTIALLY_DEFINED); + } + + if (stateBean.getDefaultTask() == null) { + return new ApexApiResult(Result.FAILED, "Null or invalid default task for state \"" + stateName + FOR_POLICY + + policyName + ":" + policyVersion + POLICY_CREATED_STATE_ERROR + POLICY_PARTIALLY_DEFINED); + } + + return session.getApexModelEdited().createPolicyState(policyName, policyVersion, stateName, + stateBean.getTrigger().getName(), stateBean.getTrigger().getVersion(), stateBean.getDefaultTask().getName(), + stateBean.getDefaultTask().getVersion()); + } + + /** + * Create the content of a state on the policy. + * + * @param session the Apex model editing session + * @param policyName the policy name + * @param policVersion the policy version + * @param stateName the name of the state + * @param stateBean the information on the state to create + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult createStateContent(final RestSession session, final String policyName, + final String policyVersion, final String stateName, final BeanState stateBean) { + + ApexApiResult ret = createStateTaskSelectionLogic(session, policyName, policyVersion, stateName, stateBean); + + if (ret.isOk()) { + ret = createStateContextReferences(session, policyName, policyVersion, stateName, stateBean); + } + + if (ret.isOk()) { + ret = createStateFinalizers(session, policyName, policyVersion, stateName, stateBean); + } + + if (ret.isOk()) { + ret = createStateOutputs(session, policyName, policyVersion, stateName, stateBean); + } + + if (ret.isOk()) { + ret = createStateTaskReferences(session, policyName, policyVersion, stateName, stateBean); + } + + return ret; + } + + /** + * Create the task selection logic for the state. + * + * @param session the Apex model editing session + * @param policyName the policy name + * @param policVersion the policy version + * @param stateName the name of the state + * @param stateBean the information on the state to create + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult createStateTaskSelectionLogic(final RestSession session, final String policyName, + final String policyVersion, final String stateName, final BeanState stateBean) { + + final BeanLogic tsl = stateBean.getTaskSelectionLogic(); + if (tsl == null) { + return new ApexApiResult(); + } + + ApexApiResult result = session.getApexModelEdited().createPolicyStateTaskSelectionLogic(policyName, + policyVersion, stateName, tsl.getLogicFlavour(), tsl.getLogic()); + + if (result.isNok()) { + result.addMessage("Failed to add task selection logic for state \"" + stateName + "\" for" + " policy \"" + + policyName + ":" + policyVersion + POLICY_WAS_CREATED + + "but there was an error adding the task selection logic " + + "for the state. The policy has only been partially defined."); + } + return result; + } + + /** + * Create the context references for the state. + * + * @param session the Apex model editing session + * @param policyName the policy name + * @param policVersion the policy version + * @param stateName the name of the state + * @param stateBean the information on the state to create + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult createStateContextReferences(final RestSession session, final String policyName, + final String policyVersion, final String stateName, final BeanState stateBean) { + + ApexApiResult result = new ApexApiResult(); + + final BeanKeyRef[] contextReferences = stateBean.getContexts(); + if (contextReferences == null || contextReferences.length == 0) { + return result; + } + + for (final BeanKeyRef contextReference : contextReferences) { + if (contextReference == null) { + result.setResult(Result.FAILED); + result.addMessage("Null or invalid context reference \"" + contextReference + "\" for" + " state \"" + + stateName + FOR_POLICY + policyName + ":" + policyVersion + + "\". The policy was created, but there was an error adding the context " + + "reference for the state. The policy has only been partially defined."); + continue; + } + + ApexApiResult contextRefResult = session.getApexModelEdited().createPolicyStateContextRef(policyName, + policyVersion, stateName, contextReference.getName(), contextReference.getVersion()); + + if (contextRefResult.isNok()) { + result.setResult(contextRefResult.getResult()); + result.addMessage("Failed to add context reference \"" + contextReference + "\" for state \"" + + stateName + FOR_POLICY + policyName + ":" + policyVersion + POLICY_WAS_CREATED + + "but there was an error adding the context reference " + + "for the state. The policy has only been partially defined."); + } + } + + return result; + } + + /** + * Create the state finalizers for the state. + * + * @param session the Apex model editing session + * @param policyName the policy name + * @param policVersion the policy version + * @param stateName the name of the state + * @param stateBean the information on the state to create + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult createStateFinalizers(final RestSession session, final String policyName, + final String policyVersion, final String stateName, final BeanState stateBean) { + + ApexApiResult result = new ApexApiResult(); + + final Map<String, BeanLogic> finalizers = stateBean.getFinalizers(); + if (finalizers == null || finalizers.isEmpty()) { + return result; + } + + for (final Map.Entry<String, BeanLogic> finalizerEntry : finalizers.entrySet()) { + if (finalizerEntry.getKey() == null || finalizerEntry.getValue() == null) { + result.setResult(Result.FAILED); + result.addMessage("Null or invalid finalizer information for finalizer " + "named \"" + + finalizerEntry.getKey() + IN_STATE + stateName + FOR_POLICY + policyName + ":" + policyVersion + + POLICY_STATE_CREATED_OTHER_ERROR + " finalizer. The policy has only " + + "been partially defined."); + continue; + } + + ApexApiResult finalizerResult = session.getApexModelEdited().createPolicyStateFinalizerLogic(policyName, + policyVersion, stateName, finalizerEntry.getKey(), finalizerEntry.getValue().getLogicFlavour(), + finalizerEntry.getValue().getLogic()); + + if (finalizerResult.isNok()) { + result.setResult(finalizerResult.getResult()); + result.addMessage("Failed to add finalizer information for finalizer named \"" + finalizerEntry.getKey() + + "\" in" + " state \"" + stateName + FOR_POLICY + policyName + ":" + policyVersion + + POLICY_STATE_CREATED_OTHER_ERROR + " finalizer. The policy has only been partially defined."); + } + } + + return result; + } + + /** + * Create the state outputs for the state. + * + * @param session the Apex model editing session + * @param policyName the policy name + * @param policVersion the policy version + * @param stateName the name of the state + * @param stateBean the information on the state to create + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult createStateOutputs(final RestSession session, final String policyName, + final String policyVersion, final String stateName, final BeanState stateBean) { + + ApexApiResult result = new ApexApiResult(); + + final Map<String, BeanStateOutput> stateOutputs = stateBean.getStateOutputs(); + if (stateOutputs == null || stateOutputs.isEmpty()) { + result.setResult(Result.FAILED); + result.addMessage("No state outputs have been defined in state \"" + stateName + FOR_POLICY + policyName + + ":" + policyVersion + "\". The policy and state were created, but there was an error adding state" + + " outputs. The policy has only been partially defined."); + return result; + } + + for (final Map.Entry<String, BeanStateOutput> stateOutput : stateOutputs.entrySet()) { + final String outputName = stateOutput.getKey(); + final BeanStateOutput output = stateOutput.getValue(); + + if (outputName == null || output == null || output.getEvent() == null) { + result.setResult(Result.FAILED); + result.addMessage("Null or invalid output information for output named \"" + outputName + IN_STATE + + stateName + FOR_POLICY + policyName + ":" + policyVersion + POLICY_STATE_CREATED_OTHER_ERROR + + " output. The policy has only been partially defined."); + continue; + } + + ApexApiResult outputResult = session.getApexModelEdited().createPolicyStateOutput(policyName, policyVersion, + stateName, outputName, output.getEvent().getName(), output.getEvent().getVersion(), + output.getNextState()); + + if (outputResult.isNok()) { + result.setResult(outputResult.getResult()); + result.addMessage("Failed to add output information for output named \"" + outputName + IN_STATE + + stateName + FOR_POLICY + policyName + ":" + policyVersion + POLICY_STATE_CREATED + + "but there was an error adding the output." + POLICY_PARTIALLY_DEFINED); + } + } + + return result; + } + + /** + * Create the task references for the state. + * + * @param session the Apex model editing session + * @param policyName the policy name + * @param policVersion the policy version + * @param stateName the name of the state + * @param stateBean the information on the state to create + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult createStateTaskReferences(final RestSession session, final String policyName, + final String policyVersion, final String stateName, final BeanState stateBean) { + + ApexApiResult result = new ApexApiResult(); + + final Map<String, BeanStateTaskRef> taskMap = stateBean.getTasks(); + if (taskMap == null || taskMap.isEmpty()) { + result.setResult(Result.FAILED); + result.addMessage("No tasks have been defined in state \"" + stateName + FOR_POLICY + policyName + ":" + + policyVersion + "\". The policy and state were created, but there was an error adding tasks." + + POLICY_PARTIALLY_DEFINED); + return result; + } + + for (final Map.Entry<String, BeanStateTaskRef> taskEntry : taskMap.entrySet()) { + final String taskLocalName = taskEntry.getKey(); + final BeanStateTaskRef taskReference = taskEntry.getValue(); + + if (taskLocalName == null || taskReference == null || taskReference.getTask() == null) { + result.setResult(Result.FAILED); + result.addMessage("Null or invalid task information for task named \"" + taskLocalName + IN_STATE + + stateName + "\" for for policy \"" + policyName + ":" + policyVersion + + "\". The policy and state were created, but there was an error adding the " + + "task. The policy has only been partially defined."); + continue; + } + + ApexApiResult taskRefResult = session.getApexModelEdited().createPolicyStateTaskRef(policyName, + policyVersion, stateName, taskLocalName, taskReference.getTask().getName(), + taskReference.getTask().getVersion(), taskReference.getOutputType(), taskReference.getOutputName()); + + if (taskRefResult.isNok()) { + result.setResult(taskRefResult.getResult()); + result.addMessage("Failed to add task reference \"" + taskEntry + "\" for state \"" + stateName + + FOR_POLICY + policyName + ":" + policyVersion + POLICY_WAS_CREATED + + "but there was an error adding the task reference for" + + " the state. The policy has only been partially defined."); + } + } + + return result; + } + + /** + * Update a policy with the information in the JSON string passed. + * + * @param session the Apex model editing session + * @param jsonString the JSON string to be parsed. See {@linkplain BeanPolicy} + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult updatePolicy(final RestSession session, final String jsonString) { + + LOGGER.entry(jsonString); + + final BeanPolicy jsonbean = RestUtils.getJsonParameters(jsonString, BeanPolicy.class); + + if (blank2Null(jsonbean.getName()) == null || blank2Null(jsonbean.getVersion()) == null) { + LOGGER.exit("Task/Update" + NOT_OK); + return new ApexApiResult(Result.FAILED, "Null/Empty Policy name/version (\"" + jsonbean.getName() + ":" + + jsonbean.getVersion() + "\" passed to UpdatePolicy"); + } + + session.editModel(); + + ApexApiResult result = session.getApexModelEdited().deletePolicy(jsonbean.getName(), jsonbean.getVersion()); + + if (result.isOk()) { + result = session.getApexModelEdited().createPolicy(jsonbean.getName(), jsonbean.getVersion(), + jsonbean.getTemplate(), jsonbean.getFirstState(), jsonbean.getUuid(), jsonbean.getDescription()); + + if (result.isOk()) { + result = createPolicyContent(session, jsonbean); + } + } + + session.finishSession(result.isOk()); + + LOGGER.exit("Policy/Update" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + + } + + /** + * List policies with the given key names/versions. If successful the result(s) + * will be available in the result messages. The returned value(s) will be + * similar to {@link AxPolicy}, with merged {@linkplain AxKey Info} for the root + * object. + * + * @param session the Apex model editing session + * @param name the name to search for. If null or empty, then all names will + * be queried + * @param version the version to search for. If null then all versions will be + * searched for. + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult listPolicies(final RestSession session, final String name, final String version) { + LOGGER.entry(name, version); + + ApexApiResult result = session.getApexModel().listPolicy(blank2Null(name), blank2Null(version)); + + LOGGER.exit("Policy/Get" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + + /** + * Delete policies with the given key names/versions. + * + * @param session the Apex model editing session + * @param name the name to search for. If null or empty, then all names will + * be queried + * @param version the version to search for. If null then all versions will be + * searched for. + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult deletePolicy(final RestSession session, final String name, final String version) { + LOGGER.entry(name, version); + + session.editModel(); + + // all input/output fields, parameters, logic, context references is + // "owned"/contained + // in the task, so + // deleting the task removes all of these + ApexApiResult result = session.getApexModelEdited().deletePolicy(blank2Null(name), blank2Null(version)); + + session.finishSession(result.isOk()); + + LOGGER.exit("Policy/Delete" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/RestCommand.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/RestCommand.java new file mode 100644 index 0000000..0b6a012 --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/RestCommand.java @@ -0,0 +1,65 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling; + +/** + * This enum maps REST calls to the handlers that process them. + * + */ +public enum RestCommand { + /** + * Create the target. + */ + CREATE, + /** + * Update the target. + */ + UPDATE, + /** + * List the target. + */ + LIST, + /** + * Delete the target. + */ + DELETE, + /** + * Validate the target. + */ + VALIDATE, + /** + * Load the target. + */ + LOAD, + /** + * Analyse the target. + */ + ANALYSE, + /** + * Get the key of the currently loaded apex model. + */ + GET_KEY, + /** + * Download the currently loaded apex model. + */ + DOWNLOAD +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/RestCommandHandler.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/RestCommandHandler.java new file mode 100644 index 0000000..4086298 --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/RestCommandHandler.java @@ -0,0 +1,103 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling; + +import org.onap.policy.apex.model.modelapi.ApexApiResult; +import org.onap.policy.apex.model.modelapi.ApexApiResult.Result; + +/** + * This interface defines the methods that a REST handler must implement to + * handle REST editor commands. + * + */ +public interface RestCommandHandler { + + /** + * Process a REST command. + * + * @param session the Apex editor session + * @param commandType the type of REST command to execute + * @param command the REST command to execute + * @return the apex api result the result of the execution + */ + public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType, + final RestCommand command); + + /** + * Process a REST command. + * + * @param session the Apex editor session + * @param commandType the type of REST command to execute + * @param command the REST command to execute + * @param jsonString the json string to use to execute the command + * @return the apex api result the result of the execution + */ + public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType, + final RestCommand command, final String jsonString); + + /** + * Process a REST command. + * + * @param session the Apex editor session + * @param commandType the type of REST command to execute + * @param command the REST command to execute + * @param name the concept name on which to execute + * @param version the concept version the version on which to execute + * @return the apex api result the result of the execution + */ + public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType, + final RestCommand command, final String name, final String version); + + /** + * Get an unsupported command result message. + * + * @param session the Apex editor session + * @param commandType the type of REST command to execute + * @param command the REST command to execute + * @return the apex api result the result of the execution + */ + public default ApexApiResult getUnsupportedCommandResultMessage(final RestSession session, + final RestCommandType commandType, final RestCommand command) { + return new ApexApiResult(Result.FAILED, + "session " + session.getSessionId() + ", command type " + commandType + ", command" + command + " invalid"); + } + + /** + * Convert blank incoming fields to nulls. + * + * @param incomingField the field to check + * @return null if the field is blank, otherwise, the field trimmed + */ + public default String blank2Null(final String incomingField) { + if (incomingField == null) { + return null; + } + + final String trimmedField = incomingField.trim(); + + if (trimmedField.isEmpty()) { + return null; + } else { + return trimmedField; + } + } +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/RestCommandType.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/RestCommandType.java new file mode 100644 index 0000000..a521f69 --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/RestCommandType.java @@ -0,0 +1,57 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling; + +/** + * This enum maps REST calls to the handlers that process them. + * + */ +public enum RestCommandType { + /** + * Model commands. + */ + MODEL, + /** + * Key Information commands. + */ + KEY_INFO, + /** + * Context schema commands. + */ + CONTEXT_SCHEMA, + /** + * Context album commands. + */ + CONTEXT_ALBUM, + /** + * Event Commands. + */ + EVENT, + /** + * Task commands. + */ + TASK, + /** + * Policy commands. + */ + POLICY +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/RestSession.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/RestSession.java new file mode 100644 index 0000000..6e12648 --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/RestSession.java @@ -0,0 +1,131 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling; + +import org.onap.policy.apex.model.modelapi.ApexApiResult; +import org.onap.policy.apex.model.modelapi.ApexApiResult.Result; +import org.onap.policy.apex.model.modelapi.ApexModel; +import org.onap.policy.apex.model.modelapi.ApexModelFactory; + +/** + * This class represents an ongoing editor session in the Apex editor and holds + * the information for the session. + * + */ +public class RestSession { + // The ID of the session + private int sessionId; + + // The Apex policy model of the session + private ApexModel apexModel; + + // The Apex policy model being edited + private ApexModel apexModelEdited; + + public RestSession(final int sessionId) { + this.sessionId = sessionId; + this.apexModel = new ApexModelFactory().createApexModel(null, true); + } + + /** + * Commence making changes to the Apex model. + * + * @return the result of the edit commencement operation + */ + public synchronized ApexApiResult editModel() { + if (apexModelEdited != null) { + return new ApexApiResult(Result.FAILED, "model is already being edited"); + } + + apexModelEdited = apexModel.clone(); + return new ApexApiResult(); + } + + /** + * Commit the changes to the Apex model. + * + * @return the result of the commit operation + */ + public synchronized ApexApiResult commitChanges() { + if (apexModelEdited == null) { + return new ApexApiResult(Result.FAILED, "model is not being edited"); + } + + apexModel = apexModelEdited; + apexModelEdited = null; + return new ApexApiResult(); + } + + /** + * Discard the changes to the Apex model. + * + * @return the result of the discard operation + */ + public synchronized ApexApiResult discardChanges() { + if (apexModelEdited == null) { + return new ApexApiResult(Result.FAILED, "model is not being edited"); + } + + apexModelEdited = null; + return new ApexApiResult(); + } + + /** + * Finish a session by committing or discarding the changes. + * + * @param commitFlag if ture, commit changes otherwise discard them + */ + public void finishSession(boolean commitFlag) { + if (commitFlag) { + commitChanges(); + } else { + discardChanges(); + } + } + + /** + * Get the session ID of the session. + * + * @return the sessionId + */ + public int getSessionId() { + return sessionId; + } + + /** + * Get the Apex model of the session. + * + * @return the apexModel + */ + public ApexModel getApexModel() { + return apexModel; + } + + /** + * Get the edited Apex model of the session. + * + * @return the apexModel + */ + public ApexModel getApexModelEdited() { + return apexModelEdited; + } +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/RestSessionHandler.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/RestSessionHandler.java new file mode 100644 index 0000000..2afd5bd --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/RestSessionHandler.java @@ -0,0 +1,113 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling; + +import java.util.Map; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import org.onap.policy.apex.model.modelapi.ApexApiResult; +import org.onap.policy.apex.model.modelapi.ApexApiResult.Result; +import org.slf4j.ext.XLogger; +import org.slf4j.ext.XLoggerFactory; + +/** + * This class carries out session handling for Apex REST editor sessions. + */ +public class RestSessionHandler { + // Get a reference to the logger + private static final XLogger LOGGER = XLoggerFactory.getXLogger(RestSessionHandler.class); + + // The next session will have this number, stating at 0 + private AtomicInteger nextSessionId = new AtomicInteger(); + + // All REST editor sessions being handled by this handler + private final Map<Integer, RestSession> sessionMap = new TreeMap<>(); + + /** + * Create a new session. + * + * @param result the result of session creation + * @return the new session object + */ + public RestSession createSession(ApexApiResult result) { + LOGGER.entry("creating session"); + + // Create the session with the next session ID + final int newSessionId = nextSessionId.getAndIncrement(); + sessionMap.put(newSessionId, new RestSession(newSessionId)); + + result.addMessage(Integer.toString(newSessionId)); + + LOGGER.exit("created session with ID: " + newSessionId); + return sessionMap.get(newSessionId); + } + + /** + * Get a session for the given session ID. + * + * @param sessionId the session ID of the session we require + * @param result the result of the session get + * @return the session + */ + public RestSession getSession(final int sessionId, ApexApiResult result) { + LOGGER.entry("finding session: " + sessionId); + + // Check for valid session IDs + if (sessionId < 0) { + result.setResult(Result.FAILED); + result.addMessage("Session ID \"" + sessionId + "\" is negative"); + LOGGER.exit(result.getMessage()); + return null; + } + + // Check if session exits + if (!sessionMap.containsKey(sessionId)) { + result.setResult(Result.FAILED); + result.addMessage("A session with session ID \"" + sessionId + "\" does not exist"); + LOGGER.exit(result.getMessage()); + return null; + } + + RestSession session = sessionMap.get(sessionId); + + // Check if session is valid + if (session == null) { + result.setResult(Result.FAILED); + result.addMessage("The session with session ID \"" + sessionId + "\" is corrupt"); + LOGGER.exit(result.getMessage()); + return null; + } + + // Return the session + LOGGER.exit("session found: " + sessionId); + return session; + } + + /* + * This is a test method to set a corrupt session ID in the session map + * + * @param corruptSessionId the ID of the corrupt session + */ + protected void setCorruptSession(int corruptSessionId) { + sessionMap.put(corruptSessionId, null); + } +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/RestUtils.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/RestUtils.java new file mode 100644 index 0000000..819657f --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/RestUtils.java @@ -0,0 +1,185 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2016-2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling; + +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonNull; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; +import java.io.StringReader; +import java.util.Map; +import java.util.Map.Entry; +import java.util.TreeMap; +import javax.ws.rs.core.MediaType; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBElement; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; +import javax.xml.transform.stream.StreamSource; +import org.eclipse.persistence.jaxb.MarshallerProperties; +import org.onap.policy.apex.model.basicmodel.concepts.AxConcept; +import org.onap.policy.gui.editors.apex.rest.handling.bean.BeanBase; + +/** + * Utilities for handling RESTful communication for Apex. + * + * @author Liam Fallon (liam.fallon@ericsson.com) + */ +public abstract class RestUtils { + // Regular expressions for checking input types + private static final String XML_INPUT_TYPE_REGEXP = "^\\s*<\\?xml.*>\\s*"; // starts with <?xml...> + /** + * starts with some kind of bracket [ or ( or {, then has something, then has + * bracket. + */ + private static final String JSON_INPUT_TYPE_REGEXP = "^\\s*[\\(\\{\\[][\\s+\\S]*[\\)\\}\\]]"; + + /** + * Constructor, block inheritance. + */ + private RestUtils() { + // Private constructor to block subclassing + } + + /** + * HTTP POST requests can't send nulls so we interpret blanks as nulls. + * + * @param parameter the parameter to convert from blank to null + * @return null if the parameter us blank, otherwise the original parameter + */ + private static String blank2null(final String parameter) { + return (parameter.length() == 0 ? null : parameter); + } + + /** + * HTTP POST requests can't send nulls so we interpret blanks as nulls. + * + * @param val the val + * @return null if the parameter us blank, otherwise the original parameter + */ + private static JsonElement blank2null(final JsonElement val) { + if (val == null) { + return JsonNull.INSTANCE; + } + if (val.isJsonPrimitive() && ((JsonPrimitive) val).isString()) { + final String v = ((JsonPrimitive) val).getAsString(); + if (v == null || "".equals(v)) { + return JsonNull.INSTANCE; + } + } + if (val.isJsonArray()) { + final JsonArray arr = val.getAsJsonArray(); + for (int i = 0; i < arr.size(); i++) { + arr.set(i, blank2null(arr.get(i))); + } + } + if (val.isJsonObject()) { + final JsonObject o = val.getAsJsonObject(); + for (final Entry<String, JsonElement> e : o.entrySet()) { + e.setValue(blank2null(e.getValue())); + } + } + return val; + } + + /** + * Apex HTTP PUT requests send simple single level JSON strings, this method + * reads those strings into a map. + * + * @param jsonString the incoming JSON string + * @return a map of the JSON strings + */ + public static Map<String, String> getJsonParameters(final String jsonString) { + final GsonBuilder gb = new GsonBuilder(); + gb.serializeNulls().enableComplexMapKeySerialization(); + final JsonObject jsonObject = gb.create().fromJson(jsonString, JsonObject.class); + + final Map<String, String> jsonMap = new TreeMap<>(); + for (final Entry<String, JsonElement> jsonEntry : jsonObject.entrySet()) { + jsonMap.put(jsonEntry.getKey(), + (jsonEntry.getValue() == JsonNull.INSTANCE ? null : blank2null(jsonEntry.getValue().getAsString()))); + } + return jsonMap; + } + + /** + * Apex HTTP PUT requests send simple single level JSON strings, this method + * reads those strings into a map. + * + * @param <C> the generic type + * @param jsonString the incoming JSON string + * @param clz the clz + * @return a map of the JSON strings + */ + public static <C extends BeanBase> C getJsonParameters(final String jsonString, final Class<C> clz) { + final GsonBuilder gb = new GsonBuilder(); + gb.serializeNulls().enableComplexMapKeySerialization(); + final JsonObject jsonObject = gb.create().fromJson(jsonString, JsonObject.class); + + for (final Entry<String, JsonElement> jsonEntry : jsonObject.entrySet()) { + final JsonElement val = jsonEntry.getValue(); + jsonEntry.setValue(blank2null(val)); + } + return gb.create().fromJson(jsonObject, clz); + } + + /** + * Gets the concept from JSON. + * + * @param <C> the generic type + * @param jsonString the json string + * @param clz the clz + * @return the concept from JSON + * @throws JAXBException the JAXB exception + */ + public static <C extends AxConcept> C getConceptFromJson(final String jsonString, final Class<C> clz) + throws JAXBException { + Unmarshaller unmarshaller = null; + final JAXBContext jaxbContext = JAXBContext.newInstance(clz); + unmarshaller = jaxbContext.createUnmarshaller(); + if (jsonString.matches(JSON_INPUT_TYPE_REGEXP)) { + unmarshaller.setProperty(MarshallerProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON); + unmarshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, true); + } else if (jsonString.matches(XML_INPUT_TYPE_REGEXP)) { + unmarshaller.setProperty(MarshallerProperties.MEDIA_TYPE, MediaType.APPLICATION_XML); + } else { + return null; + } + final StreamSource source = new StreamSource(new StringReader(jsonString)); + final JAXBElement<C> rootElement = unmarshaller.unmarshal(source, clz); + return rootElement.getValue(); + } + + /** + * Gets the JSO nfrom concept. + * + * @param object the object + * @return the JSO nfrom concept + */ + public static String getJsonfromConcept(final Object object) { + final GsonBuilder gb = new GsonBuilder(); + gb.serializeNulls().enableComplexMapKeySerialization(); + return gb.create().toJson(object); + } +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/TaskHandler.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/TaskHandler.java new file mode 100644 index 0000000..8a52a03 --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/TaskHandler.java @@ -0,0 +1,468 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling; + +import java.util.Map.Entry; +import org.onap.policy.apex.model.basicmodel.concepts.AxKeyInfo; +import org.onap.policy.apex.model.modelapi.ApexApiResult; +import org.onap.policy.apex.model.modelapi.ApexApiResult.Result; +import org.onap.policy.apex.model.policymodel.concepts.AxTask; +import org.onap.policy.gui.editors.apex.rest.handling.bean.BeanField; +import org.onap.policy.gui.editors.apex.rest.handling.bean.BeanKeyRef; +import org.onap.policy.gui.editors.apex.rest.handling.bean.BeanLogic; +import org.onap.policy.gui.editors.apex.rest.handling.bean.BeanTask; +import org.onap.policy.gui.editors.apex.rest.handling.bean.BeanTaskParameter; +import org.slf4j.ext.XLogger; +import org.slf4j.ext.XLoggerFactory; + +/** + * This class handles commands on tasks in Apex models. + */ +public class TaskHandler implements RestCommandHandler { + // Get a reference to the logger + private static final XLogger LOGGER = XLoggerFactory.getXLogger(TaskHandler.class); + + // Recurring string constants + private static final String OK = ": OK"; + private static final String NOT_OK = ": Not OK"; + private static final String IN_TASK = "\" in task "; + private static final String TASK_PARTIALLY_DEFINED = " The task has only been partially defined."; + + /** + * {@inheritDoc}. + */ + @Override + public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType, + final RestCommand command) { + return getUnsupportedCommandResultMessage(session, commandType, command); + } + + /** + * {@inheritDoc}. + */ + @Override + public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType, + final RestCommand command, final String jsonString) { + if (!RestCommandType.TASK.equals(commandType)) { + return getUnsupportedCommandResultMessage(session, commandType, command); + } + + switch (command) { + case CREATE: + return createTask(session, jsonString); + case UPDATE: + return updateTask(session, jsonString); + default: + return getUnsupportedCommandResultMessage(session, commandType, command); + } + } + + /** + * {@inheritDoc}. + */ + @Override + public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType, + final RestCommand command, final String name, final String version) { + if (!RestCommandType.TASK.equals(commandType)) { + return getUnsupportedCommandResultMessage(session, commandType, command); + } + + switch (command) { + case LIST: + return listTasks(session, name, version); + case DELETE: + return deleteTask(session, name, version); + case VALIDATE: + return validateTask(session, name, version); + default: + return getUnsupportedCommandResultMessage(session, commandType, command); + } + } + + /** + * Creates a task with the information in the JSON string passed. + * + * @param session the Apex model editing session + * @param jsonString the JSON string to be parsed. See {@linkplain BeanTask} + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult createTask(final RestSession session, final String jsonString) { + LOGGER.entry(jsonString); + + final BeanTask jsonbean = RestUtils.getJsonParameters(jsonString, BeanTask.class); + + session.editModel(); + + ApexApiResult result = session.getApexModelEdited().createTask(jsonbean.getName(), jsonbean.getVersion(), + jsonbean.getUuid(), jsonbean.getDescription()); + + if (result.isOk()) { + result = createTaskContent(session, jsonbean); + } + + session.finishSession(result.isOk()); + + LOGGER.exit("Task/Create" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + + /** + * Create the content of the task. + * + * @param session the Apex model editing session + * @param jsonString the JSON string to be parsed. See {@linkplain BeanTask} + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult createTaskContent(final RestSession session, final BeanTask jsonbean) { + ApexApiResult result = createInputFields(session, jsonbean); + + if (result.isOk()) { + result = createOutputFields(session, jsonbean); + } + + if (result.isOk()) { + result = createTaskLogic(session, jsonbean); + } + + if (result.isOk()) { + result = createTaskParameters(session, jsonbean); + } + + if (result.isOk()) { + result = createContextReferences(session, jsonbean); + } + return result; + } + + /** + * Create the input fields for the task. + * + * @param session the Apex model editing session + * @param jsonbean the ban containing the fields + * @return the result of the operation + */ + private ApexApiResult createInputFields(final RestSession session, final BeanTask jsonbean) { + ApexApiResult result = new ApexApiResult(); + + if (jsonbean.getInputFields() == null || jsonbean.getInputFields().isEmpty()) { + return result; + } + + for (final Entry<String, BeanField> fieldEntry : jsonbean.getInputFields().entrySet()) { + if (fieldEntry.getValue() == null) { + result.setResult(Result.FAILED); + result.addMessage("Null task input field information for field \"" + fieldEntry.getKey() + IN_TASK + + jsonbean.getName() + ":" + jsonbean.getVersion() + + ". The task was created, but there was an error adding the input fields." + + TASK_PARTIALLY_DEFINED); + continue; + } + + if (fieldEntry.getKey() == null || !fieldEntry.getKey().equals(fieldEntry.getValue().getLocalName())) { + result.setResult(Result.FAILED); + result.addMessage("Invalid task input field information for field \"" + fieldEntry.getKey() + IN_TASK + + jsonbean.getName() + ":" + jsonbean.getVersion() + ". The localName of the field (\"" + + fieldEntry.getValue().getLocalName() + "\") is not the same as the field name. " + + "The task was created, but there was an error adding the input fields." + TASK_PARTIALLY_DEFINED); + } else { + ApexApiResult fieldCreationResult = session.getApexModelEdited().createTaskInputField( + jsonbean.getName(), jsonbean.getVersion(), fieldEntry.getKey(), fieldEntry.getValue().getName(), + fieldEntry.getValue().getVersion(), fieldEntry.getValue().getOptional()); + + if (fieldCreationResult.isNok()) { + result.setResult(fieldCreationResult.getResult()); + result.addMessage("Failed to add task input field information for field \"" + fieldEntry.getKey() + + IN_TASK + jsonbean.getName() + ":" + jsonbean.getVersion() + + ". The task was created, but there was an error adding the input fields." + + TASK_PARTIALLY_DEFINED); + } + } + } + + return result; + } + + /** + * Create the output fields for the task. + * + * @param session the Apex model editing session + * @param jsonbean the ban containing the fields + * @return the result of the operation + */ + private ApexApiResult createOutputFields(final RestSession session, final BeanTask jsonbean) { + ApexApiResult result = new ApexApiResult(); + + if (jsonbean.getOutputFields() == null || jsonbean.getOutputFields().isEmpty()) { + return result; + } + + for (final Entry<String, BeanField> fieldEntry : jsonbean.getOutputFields().entrySet()) { + if (fieldEntry.getValue() == null) { + result.setResult(Result.FAILED); + result.addMessage("Null task output field information for field \"" + fieldEntry.getKey() + IN_TASK + + jsonbean.getName() + ":" + jsonbean.getVersion() + + ". The task was created, but there was an error adding the output fields." + + TASK_PARTIALLY_DEFINED); + continue; + } + + if (fieldEntry.getKey() == null || !fieldEntry.getKey().equals(fieldEntry.getValue().getLocalName())) { + result.setResult(Result.FAILED); + result.addMessage("Invalid task output field information for field \"" + fieldEntry.getKey() + IN_TASK + + jsonbean.getName() + ":" + jsonbean.getVersion() + ". The localName of the field (\"" + + fieldEntry.getValue().getLocalName() + "\") is not the same as the field name. " + + "The task was created, but there was an error adding the output fields." + + TASK_PARTIALLY_DEFINED); + } else { + ApexApiResult fieldCreationResult = session.getApexModelEdited().createTaskOutputField( + jsonbean.getName(), jsonbean.getVersion(), fieldEntry.getKey(), fieldEntry.getValue().getName(), + fieldEntry.getValue().getVersion(), fieldEntry.getValue().getOptional()); + if (fieldCreationResult.isNok()) { + result.setResult(fieldCreationResult.getResult()); + result.addMessage("Failed to add task output field information for field \"" + fieldEntry.getKey() + + IN_TASK + jsonbean.getName() + ":" + jsonbean.getVersion() + + ". The task was created, but there was an error adding the output fields." + + TASK_PARTIALLY_DEFINED); + } + } + } + + return result; + } + + /** + * Create the task logic for the task. + * + * @param session the Apex model editing session + * @param jsonbean the bean containing the logic + * @return the result of the operation + */ + private ApexApiResult createTaskLogic(final RestSession session, final BeanTask jsonbean) { + ApexApiResult result = new ApexApiResult(); + + if (jsonbean.getTaskLogic() == null) { + return result; + } + + final BeanLogic logic = jsonbean.getTaskLogic(); + result = session.getApexModelEdited().createTaskLogic(jsonbean.getName(), jsonbean.getVersion(), + logic.getLogicFlavour(), logic.getLogic()); + + if (result.isNok()) { + result.addMessage("Failed to add task logic in task " + jsonbean.getName() + ":" + jsonbean.getVersion() + + ". The task was created, but there was an error adding the logic." + TASK_PARTIALLY_DEFINED); + } + + return result; + } + + /** + * Create the task parameters for the task. + * + * @param session the Apex model editing session + * @param jsonbean the bean containing the parameters + * @return the result of the operation + */ + private ApexApiResult createTaskParameters(final RestSession session, final BeanTask jsonbean) { + ApexApiResult result = new ApexApiResult(); + + if (jsonbean.getParameters() == null || jsonbean.getParameters().isEmpty()) { + return result; + } + + for (final Entry<String, BeanTaskParameter> parameterEntry : jsonbean.getParameters().entrySet()) { + if (parameterEntry.getKey() == null || parameterEntry.getValue() == null + || !parameterEntry.getKey().equals(parameterEntry.getValue().getParameterName())) { + result.setResult(Result.FAILED); + result + .addMessage("Null or invalid task parameter information for parameter \"" + parameterEntry.getKey() + + IN_TASK + jsonbean.getName() + ":" + jsonbean.getVersion() + ". The task was created, " + + "but there was an error adding the parameters." + TASK_PARTIALLY_DEFINED); + continue; + } + ApexApiResult createParResult = session.getApexModelEdited().createTaskParameter(jsonbean.getName(), + jsonbean.getVersion(), parameterEntry.getValue().getParameterName(), + parameterEntry.getValue().getDefaultValue()); + if (createParResult.isNok()) { + result.setResult(createParResult.getResult()); + result.addMessage("Failed to add task parameter \"" + parameterEntry.getKey() + IN_TASK + + jsonbean.getName() + ":" + jsonbean.getVersion() + + ". The task was created, but there was an error adding the parameters." + TASK_PARTIALLY_DEFINED); + } + } + + return result; + } + + /** + * Create the context references for the task. + * + * @param session the Apex model editing session + * @param jsonbean the bean containing the context references + * @return the result of the operation + */ + private ApexApiResult createContextReferences(final RestSession session, final BeanTask jsonbean) { + ApexApiResult result = new ApexApiResult(); + + if (jsonbean.getContexts() == null || jsonbean.getContexts().length == 0) { + return result; + } + + for (final BeanKeyRef contextalbum : jsonbean.getContexts()) { + if (contextalbum.getName() == null || contextalbum.getVersion() == null) { + result.setResult(Result.FAILED); + result.addMessage("Null or invalid context album reference information in task " + jsonbean.getName() + + ":" + jsonbean.getVersion() + ". The task was created, but there was an error adding the" + + " context album reference. " + "The task has only been partially defined."); + continue; + } + ApexApiResult createRefResult = session.getApexModelEdited().createTaskContextRef(jsonbean.getName(), + jsonbean.getVersion(), contextalbum.getName(), contextalbum.getVersion()); + if (createRefResult.isNok()) { + result.setResult(createRefResult.getResult()); + result.addMessage("Failed to add context album reference information in task " + jsonbean.getName() + + ":" + jsonbean.getVersion() + ". The task was created, but there was an error adding the" + + " context album reference. " + "The task has only been partially defined."); + } + } + + return result; + } + + /** + * Update a task with the information in the JSON string passed. + * + * @param session the Apex model editing session + * @param jsonString the JSON string to be parsed. See {@linkplain BeanTask} + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult updateTask(final RestSession session, final String jsonString) { + LOGGER.entry(jsonString); + + final BeanTask jsonbean = RestUtils.getJsonParameters(jsonString, BeanTask.class); + + if (blank2Null(jsonbean.getName()) == null || blank2Null(jsonbean.getVersion()) == null) { + LOGGER.exit("Task/Update" + NOT_OK); + return new ApexApiResult(Result.FAILED, "Null/Empty task name/version (\"" + jsonbean.getName() + ":" + + jsonbean.getVersion() + "\" passed to UpdateTask"); + } + + session.editModel(); + + ApexApiResult result = session.getApexModelEdited().deleteTask(jsonbean.getName(), jsonbean.getVersion()); + + if (result.isOk()) { + result = session.getApexModelEdited().createTask(jsonbean.getName(), jsonbean.getVersion(), + jsonbean.getUuid(), jsonbean.getDescription()); + + if (result.isOk()) { + result = createTaskContent(session, jsonbean); + } + } + + session.finishSession(result.isOk()); + + LOGGER.exit("Task/Update" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + + /** + * List tasks with the given key names/versions. If successful the result(s) + * will be available in the result messages. The returned value(s) will be + * similar to {@link AxTask}, with merged {@linkplain AxKeyInfo} for the root + * object. + * + * @param session the Apex model editing session + * @param name the name to search for. If null or empty, then all names will + * be queried + * @param version the version to search for. If null then all versions will be + * searched for. + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult listTasks(final RestSession session, final String name, final String version) { + LOGGER.entry(name, version); + + ApexApiResult result = session.getApexModel().listTask(blank2Null(name), blank2Null(version)); + + LOGGER.exit("Task/Get" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + + /** + * Delete tasks with the given key names/versions. + * + * @param session the Apex model editing session + * @param name the name to search for. If null or empty, then all names will + * be queried + * @param version the version to search for. If null then all versions will be + * searched for. + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult deleteTask(final RestSession session, final String name, final String version) { + LOGGER.entry(name, version); + + session.editModel(); + + // all input/output fields, parameters, logic, context references is + // "owned"/contained + // in the task, so + // deleting the task removes all of these + ApexApiResult result = session.getApexModelEdited().deleteTask(blank2Null(name), blank2Null(version)); + + session.finishSession(result.isOk()); + + LOGGER.exit("Task/Delete" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } + + /** + * Validate tasks with the given key names/versions. The result(s) will be + * available in the result messages. + * + * @param session the Apex model editing session + * @param name the name to search for. If null or empty, then all names will + * be queried + * @param version the version to search for. If null then all versions will be + * searched for. + * @return an ApexAPIResult object. If successful then + * {@link ApexApiResult#isOk()} will return true. Any messages/errors + * can be retrieved using {@link ApexApiResult#getMessages()} + */ + private ApexApiResult validateTask(final RestSession session, final String name, final String version) { + LOGGER.entry(name, version); + + ApexApiResult result = session.getApexModel().validateTask(blank2Null(name), blank2Null(version)); + + LOGGER.exit("Validate/Task" + (result != null && result.isOk() ? OK : NOT_OK)); + return result; + } +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanBase.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanBase.java new file mode 100644 index 0000000..261cbae --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanBase.java @@ -0,0 +1,82 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2016-2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling.bean; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +/** + * The base class for Beans. + */ +public abstract class BeanBase { + // Recurring string constants + private static final String PROBLEM_RETRIEVING_FIELD_PREFIX = "Problem retrieving field called ('"; + private static final String JSON_BEAN_SUFFIX = "') from JSON bean "; + + // Magic numbers + private static final int GET_LENGTH = 3; + + /** + * Gets a named field from the bean. + * + * @param field the field name + * @return the value for the field + */ + public String get(final String field) { + // use getter preferably + for (final Method method : this.getClass().getMethods()) { + if (method.getName().startsWith("get") && method.getName().length() == (field.length() + GET_LENGTH) + && method.getName().toLowerCase().endsWith(field.toLowerCase())) { + return invokeGetterMethod(field, method); + } + } + + // Use field approach + if (field != null) { + try { + final Field f = this.getClass().getDeclaredField(field); + if (f != null) { + f.setAccessible(true); + return (String) (f.get(this)); + } + } catch (final Exception e) { + throw new IllegalArgumentException(PROBLEM_RETRIEVING_FIELD_PREFIX + field + JSON_BEAN_SUFFIX + this, + e); + } + } + throw new IllegalArgumentException(PROBLEM_RETRIEVING_FIELD_PREFIX + field + JSON_BEAN_SUFFIX + this); + } + + /** + * Invoke a getter method on a bean. + * + * @param field the field that the getter gets a value for + * @param method the method to invoke + */ + private String invokeGetterMethod(final String field, final Method method) { + try { + return (String) method.invoke(this); + } catch (final Exception e) { + throw new IllegalArgumentException(PROBLEM_RETRIEVING_FIELD_PREFIX + field + JSON_BEAN_SUFFIX + this, e); + } + } +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanContextAlbum.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanContextAlbum.java new file mode 100644 index 0000000..51ccafb --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanContextAlbum.java @@ -0,0 +1,110 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2016-2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling.bean; + +import javax.xml.bind.annotation.XmlType; + +/** + * The ContextAlbum Bean. + */ +@XmlType +public class BeanContextAlbum extends BeanBase { + private String name = null; + private String version = null; + private String scope = null; + private String uuid = null; + private String description = null; + private BeanKeyRef itemSchema = null; + private boolean writeable; + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Gets the version. + * + * @return the version + */ + public String getVersion() { + return version; + } + + /** + * Gets the scope. + * + * @return the scope + */ + public String getScope() { + return scope; + } + + /** + * Gets the uuid. + * + * @return the uuid + */ + public String getUuid() { + return uuid; + } + + /** + * Gets the description. + * + * @return the description + */ + public String getDescription() { + return description; + } + + /** + * Gets the item schema. + * + * @return the item schema + */ + public BeanKeyRef getItemSchema() { + return itemSchema; + } + + /** + * Gets the writeable. + * + * @return the writeable + */ + public boolean getWriteable() { + return writeable; + } + + /** + * {@inheritDoc}. + */ + @Override + public String toString() { + return "ContextAlbum [name=" + name + ", version=" + version + ", scope=" + scope + ", uuid=" + uuid + + ", description=" + description + ", itemSchema=" + itemSchema + ", writeable=" + writeable + "]"; + } +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanContextSchema.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanContextSchema.java new file mode 100644 index 0000000..bec3fcd --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanContextSchema.java @@ -0,0 +1,100 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2016-2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling.bean; + +import javax.xml.bind.annotation.XmlType; + +/** + * The ContextSchema Bean. + */ +@XmlType +public class BeanContextSchema extends BeanBase { + private String name = null; + private String version = null; + private String schemaFlavour = null; + private String schemaDefinition = null; + private String uuid = null; + private String description = null; + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Gets the version. + * + * @return the version + */ + public String getVersion() { + return version; + } + + /** + * Gets the uuid. + * + * @return the uuid + */ + public String getUuid() { + return uuid; + } + + /** + * Gets the description. + * + * @return the description + */ + public String getDescription() { + return description; + } + + /** + * Gets the schema flavour. + * + * @return the schema flavour + */ + public String getSchemaFlavour() { + return schemaFlavour; + } + + /** + * Gets the schema definition. + * + * @return the schema definition + */ + public String getSchemaDefinition() { + return schemaDefinition; + } + + /** + * {@inheritDoc}. + */ + @Override + public String toString() { + return "ContextSchema [name=" + name + ", version=" + version + ", schemaFlavour=" + schemaFlavour + + ", schemaDefinition=" + schemaDefinition + ", uuid=" + uuid + ", description=" + description + "]"; + } +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanEvent.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanEvent.java new file mode 100644 index 0000000..2e14f72 --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanEvent.java @@ -0,0 +1,136 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2016-2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling.bean; + +import java.util.Map; +import javax.xml.bind.annotation.XmlType; + +/** + * The Event Bean. + */ +@XmlType +public class BeanEvent extends BeanBase { + private String name = null; + private String version = null; + private String nameSpace = null; + private String source = null; + private String target = null; + private String uuid = null; + private String description = null; + private Map<String, BeanField> parameters = null; + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Gets the version. + * + * @return the version + */ + public String getVersion() { + return version; + } + + /** + * Gets the name space. + * + * @return the name space + */ + public String getNameSpace() { + return nameSpace; + } + + /** + * Gets the source. + * + * @return the source + */ + public String getSource() { + return source; + } + + /** + * Gets the target. + * + * @return the target + */ + public String getTarget() { + return target; + } + + /** + * Gets the uuid. + * + * @return the uuid + */ + public String getUuid() { + return uuid; + } + + /** + * Gets the description. + * + * @return the description + */ + public String getDescription() { + return description; + } + + /** + * Gets the parameters. + * + * @return the parameters + */ + public Map<String, BeanField> getParameters() { + return parameters; + } + + /** + * Gets the parameter. + * + * @param ps the parameter string + * @return the parameter + */ + public BeanField getParameter(final String ps) { + if (parameters != null) { + return parameters.get(ps); + } + return null; + } + + /** + * {@inheritDoc}. + */ + @Override + public String toString() { + return "Event [name=" + name + ", version=" + version + ", nameSpace=" + nameSpace + ", source=" + source + + ", target=" + target + ", uuid=" + uuid + ", description=" + description + ", parameters=" + + getParameters() + "]"; + } + +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanField.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanField.java new file mode 100644 index 0000000..0a9042c --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanField.java @@ -0,0 +1,62 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2016-2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling.bean; + +import javax.xml.bind.annotation.XmlType; + +/** + * The Field Bean. + */ +@XmlType +public class BeanField extends BeanKeyRef { + + private boolean optional = true; + private String localName = null; + + /** + * Gets the local name for this field. + * + * @return the local name for this field. + */ + public String getLocalName() { + return localName; + } + + /** + * Gets the optional flag. + * + * @return the optional flag + */ + public boolean getOptional() { + return optional; + } + + /** + * {@inheritDoc}. + */ + @Override + public String toString() { + return "Field [localName=" + getLocalName() + ", name=" + getName() + ", version=" + getVersion() + + ", optional=" + getOptional() + "]"; + } + +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanKeyRef.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanKeyRef.java new file mode 100644 index 0000000..6238b3c --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanKeyRef.java @@ -0,0 +1,60 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2016-2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling.bean; + +import javax.xml.bind.annotation.XmlType; + +/** + * The Key Reference Bean. + */ +@XmlType +public class BeanKeyRef extends BeanBase { + private String name = null; + private String version = null; + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Gets the version. + * + * @return the version + */ + public String getVersion() { + return version; + } + + /** + * {@inheritDoc}. + */ + @Override + public String toString() { + return "KeyRef [name=" + name + ", version=" + version + "]"; + } + +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanLogic.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanLogic.java new file mode 100644 index 0000000..a11b768 --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanLogic.java @@ -0,0 +1,59 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2016-2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling.bean; + +import javax.xml.bind.annotation.XmlType; + +/** + * The Logic Bean. + */ +@XmlType +public class BeanLogic extends BeanBase { + private String logic = null; + private String logicFlavour = null; + + /** + * Gets the logic flavour. + * + * @return the logic flavour + */ + public String getLogicFlavour() { + return logicFlavour; + } + + /** + * Gets the logic. + * + * @return the logic + */ + public String getLogic() { + return logic; + } + + /** + * {@inheritDoc}. + */ + @Override + public String toString() { + return "Logic [logicFlavour=" + logicFlavour + ", logic=" + logic + "]"; + } +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanModel.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanModel.java new file mode 100644 index 0000000..fdb3c9b --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanModel.java @@ -0,0 +1,81 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2016-2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling.bean; + +import javax.xml.bind.annotation.XmlType; + +/** + * The Model Bean. + */ +@XmlType +public class BeanModel extends BeanBase { + + private String name = null; + private String version = null; + private String uuid = null; + private String description = null; + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Gets the version. + * + * @return the version + */ + public String getVersion() { + return version; + } + + /** + * Gets the uuid. + * + * @return the uuid + */ + public String getUuid() { + return uuid; + } + + /** + * Gets the description. + * + * @return the description + */ + public String getDescription() { + return description; + } + + /** + * {@inheritDoc}. + */ + @Override + public String toString() { + return "Model [name=" + name + ", version=" + version + ", uuid=" + uuid + ", description=" + description + "]"; + } + +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanPolicy.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanPolicy.java new file mode 100644 index 0000000..be67402 --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanPolicy.java @@ -0,0 +1,112 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2016-2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling.bean; + +import java.util.Map; +import javax.xml.bind.annotation.XmlType; + +/** + * The Policy Bean. + */ +@XmlType +public class BeanPolicy extends BeanBase { + private String name = null; + private String version = null; + private String uuid = null; + private String description = null; + private String firstState = null; + private String template = null; + private Map<String, BeanState> states = null; + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Gets the version. + * + * @return the version + */ + public String getVersion() { + return version; + } + + /** + * Gets the uuid. + * + * @return the uuid + */ + public String getUuid() { + return uuid; + } + + /** + * Gets the description. + * + * @return the description + */ + public String getDescription() { + return description; + } + + /** + * Gets the first state. + * + * @return the first state + */ + public String getFirstState() { + return firstState; + } + + /** + * Gets the template. + * + * @return the template + */ + public String getTemplate() { + return template; + } + + /** + * Gets the states. + * + * @return the states + */ + public Map<String, BeanState> getStates() { + return states; + } + + /** + * {@inheritDoc}. + */ + @Override + public String toString() { + return "Policy [name=" + name + ", version=" + version + ", uuid=" + uuid + ", description=" + description + + ", firstState=" + firstState + ", template=" + template + ", states=" + states + "]"; + } + +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanState.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanState.java new file mode 100644 index 0000000..e1a5c68 --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanState.java @@ -0,0 +1,134 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2016-2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling.bean; + +import java.util.Arrays; +import java.util.Map; +import javax.xml.bind.annotation.XmlType; + +/** + * The State Bean. + */ +@XmlType +public class BeanState extends BeanBase { + + private String name = null; + private BeanKeyRef trigger = null; + private BeanKeyRef defaultTask = null; + private BeanKeyRef[] contexts = null; + private BeanLogic taskSelectionLogic = null; + private Map<String, BeanStateTaskRef> tasks = null; + private Map<String, BeanLogic> finalizers = null; + private Map<String, BeanStateOutput> stateOutputs = null; + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Gets the trigger. + * + * @return the trigger + */ + public BeanKeyRef getTrigger() { + return trigger; + } + + /** + * Gets the contexts. + * + * @return the contexts + */ + public BeanKeyRef[] getContexts() { + return contexts; + } + + /** + * Gets the task selection logic. + * + * @return the task selection logic + */ + public BeanLogic getTaskSelectionLogic() { + return taskSelectionLogic; + } + + /** + * Gets the tasks. + * + * @return the tasks + */ + public Map<String, BeanStateTaskRef> getTasks() { + return tasks; + } + + /** + * Gets the finalizers. + * + * @return the finalizers + */ + public Map<String, BeanLogic> getFinalizers() { + return finalizers; + } + + /** + * Gets the state outputs. + * + * @return the state outputs + */ + public Map<String, BeanStateOutput> getStateOutputs() { + return stateOutputs; + } + + /** + * Gets the default task. + * + * @return the default task + */ + public BeanKeyRef getDefaultTask() { + return defaultTask; + } + + /** + * Sets the default task. + * + * @param defaultTask the new default task + */ + public void setDefaultTask(final BeanKeyRef defaultTask) { + this.defaultTask = defaultTask; + } + + /** + * {@inheritDoc}. + */ + @Override + public String toString() { + return "State [name=" + name + ", trigger=" + trigger + ", defaultTask=" + defaultTask + ", contexts=" + + Arrays.toString(contexts) + ", taskSelectionLogic=" + taskSelectionLogic + ", tasks=" + tasks + + ", finalizers=" + finalizers + ", stateOutputs=" + stateOutputs + "]"; + } + +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanStateOutput.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanStateOutput.java new file mode 100644 index 0000000..ee4c3fc --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanStateOutput.java @@ -0,0 +1,61 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2016-2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling.bean; + +import javax.xml.bind.annotation.XmlType; + +/** + * The StateOutput Bean. + */ +@XmlType +public class BeanStateOutput extends BeanBase { + + private BeanKeyRef event = null; + private String nextState = null; + + /** + * Gets the event. + * + * @return the event + */ + public BeanKeyRef getEvent() { + return event; + } + + /** + * Gets the next state. + * + * @return the next state + */ + public String getNextState() { + return nextState; + } + + /** + * {@inheritDoc}. + */ + @Override + public String toString() { + return "StateOutput [event=" + event + ", nextState=" + nextState + "]"; + } + +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanStateTaskRef.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanStateTaskRef.java new file mode 100644 index 0000000..9b31dad --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanStateTaskRef.java @@ -0,0 +1,70 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2016-2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling.bean; + +import javax.xml.bind.annotation.XmlType; + +/** + * The State Task Reference Bean. + */ +@XmlType +public class BeanStateTaskRef extends BeanBase { + private BeanKeyRef task = null; + private String outputType = null; + private String outputName = null; + + /** + * Gets the task. + * + * @return the task + */ + public BeanKeyRef getTask() { + return task; + } + + /** + * Gets the output type. + * + * @return the output type + */ + public String getOutputType() { + return outputType; + } + + /** + * Gets the output name. + * + * @return the output name + */ + public String getOutputName() { + return outputName; + } + + /** + * {@inheritDoc}. + */ + @Override + public String toString() { + return "StateTaskRef [task=" + task + ", outputType=" + outputType + ", outputName=" + outputName + "]"; + } + +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanTask.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanTask.java new file mode 100644 index 0000000..010745e --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanTask.java @@ -0,0 +1,133 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2016-2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling.bean; + +import java.util.Arrays; +import java.util.Map; +import javax.xml.bind.annotation.XmlType; + +/** + * The Task Bean. + */ +@XmlType +public class BeanTask extends BeanBase { + private String name = null; + private String version = null; + private String uuid = null; + private String description = null; + private BeanLogic taskLogic = null; + private Map<String, BeanField> inputFields = null; + private Map<String, BeanField> outputFields = null; + private Map<String, BeanTaskParameter> parameters = null; + private BeanKeyRef[] contexts = null; + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Gets the version. + * + * @return the version + */ + public String getVersion() { + return version; + } + + /** + * Gets the uuid. + * + * @return the uuid + */ + public String getUuid() { + return uuid; + } + + /** + * Gets the description. + * + * @return the description + */ + public String getDescription() { + return description; + } + + /** + * Gets the task logic. + * + * @return the task logic + */ + public BeanLogic getTaskLogic() { + return taskLogic; + } + + /** + * Gets the input fields. + * + * @return the input fields + */ + public Map<String, BeanField> getInputFields() { + return inputFields; + } + + /** + * Gets the output fields. + * + * @return the output fields + */ + public Map<String, BeanField> getOutputFields() { + return outputFields; + } + + /** + * Gets the parameters. + * + * @return the parameters + */ + public Map<String, BeanTaskParameter> getParameters() { + return parameters; + } + + /** + * Gets the contexts. + * + * @return the contexts + */ + public BeanKeyRef[] getContexts() { + return contexts; + } + + /** + * {@inheritDoc}. + */ + @Override + public String toString() { + return "BeanTask [name=" + name + ", version=" + version + ", uuid=" + uuid + ", description=" + description + + ", taskLogic=" + taskLogic + ", inputFields=" + inputFields + ", outputFields=" + outputFields + + ", parameters=" + parameters + ", contexts=" + Arrays.toString(contexts) + "]"; + } +} diff --git a/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanTaskParameter.java b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanTaskParameter.java new file mode 100644 index 0000000..5210a48 --- /dev/null +++ b/gui-editors/gui-editor-apex/src/main/java/org/onap/policy/gui/editors/apex/rest/handling/bean/BeanTaskParameter.java @@ -0,0 +1,61 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2016-2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.editors.apex.rest.handling.bean; + +import javax.xml.bind.annotation.XmlType; + +/** + * The Task Parameter Bean. + */ +@XmlType +public class BeanTaskParameter extends BeanBase { + + private String parameterName = null; + private String defaultValue = null; + + /** + * Gets the parameter name. + * + * @return the parameter name + */ + public String getParameterName() { + return parameterName; + } + + /** + * Gets the default value. + * + * @return the default value + */ + public String getDefaultValue() { + return defaultValue; + } + + /** + * {@inheritDoc}. + */ + @Override + public String toString() { + return "TaskParameter [parameterName=" + parameterName + ", defaultValue=" + defaultValue + "]"; + } + +} |