blob: 13a8f462f2c4b5620e9007ee547ad915ce90a8c8 [file] [log] [blame]
/*
* Copyright 2018-present Open Networking 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.
*/
package org.onosproject.workflow.api;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.MissingNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.node.TextNode;
import com.google.common.base.MoreObjects;
import java.net.URI;
import static org.onosproject.workflow.api.CheckCondition.check;
/**
* Class for default workflow description.
*/
public final class DefaultWorkflowDescription implements WorkflowDescription {
/**
* Workplace Name.
*/
private String workplaceName;
/**
* Workflow ID.
*/
private URI id;
/**
* Workflow data model.
*/
private JsonNode data;
/**
* Constructor of workflow description.
* @param builder workflow description builder
*/
private DefaultWorkflowDescription(Builder builder) {
this.workplaceName = builder.workplaceName;
this.id = builder.id;
this.data = builder.data;
}
@Override
public String workplaceName() {
return this.workplaceName;
}
@Override
public URI id() {
return this.id;
}
@Override
public String workflowContextName() {
return DefaultWorkflowContext.nameBuilder(id(), workplaceName());
}
@Override
public JsonNode data() {
return this.data;
}
/**
* Creating workflow description from json tree.
* @param root root node for workflow description
* @return workflow description
* @throws WorkflowException workflow exception
*/
public static DefaultWorkflowDescription valueOf(JsonNode root) throws WorkflowException {
JsonNode node = root.at(ptr(WF_WORKPLACE));
if (!(node instanceof TextNode)) {
throw new WorkflowException("invalid workflow workplace for " + root);
}
String wfWorkplaceName = node.asText();
node = root.at(ptr(WF_ID));
if (!(node instanceof TextNode)) {
throw new WorkflowException("invalid workflow id for " + root);
}
URI wfId = URI.create(node.asText());
node = root.at(ptr(WF_DATA));
if (node instanceof MissingNode) {
throw new WorkflowException("invalid workflow data for " + root);
}
JsonNode wfData = node;
return builder()
.workplaceName(wfWorkplaceName)
.id(wfId)
.data(wfData)
.build();
}
private static String ptr(String field) {
return "/" + field;
}
@Override
public JsonNode toJson() {
ObjectNode root = JsonNodeFactory.instance.objectNode();
root.put(WF_WORKPLACE, workplaceName());
root.put(WF_ID, id().toString());
root.put(WF_DATA, data());
return root;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("workplace", workplaceName())
.add("id", id())
.add("data", data())
.toString();
}
/**
* Gets builder instance.
* @return builder instance
*/
public static Builder builder() {
return new Builder();
}
/**
* Builder for workflow description.
*/
public static class Builder {
/**
* Workplace name.
*/
private String workplaceName;
/**
* Workflow ID.
*/
private URI id;
/**
* Workflow data model.
*/
private JsonNode data;
/**
* Sets workplace name.
* @param workplaceName workplace name
* @return builder
*/
public Builder workplaceName(String workplaceName) {
this.workplaceName = workplaceName;
return this;
}
/**
* Sets workflow id.
* @param id workflow ID
* @return builder
*/
public Builder id(URI id) {
this.id = id;
return this;
}
/**
* Sets workflow id.
* @param id workflow ID string
* @return builder
*/
public Builder id(String id) {
this.id = URI.create(id);
return this;
}
/**
* Sets workflow data model.
* @param data workflow data model
* @return builder
*/
public Builder data(JsonNode data) {
this.data = data;
return this;
}
/**
* Builds workflow description from builder.
* @return instance of workflow description
* @throws WorkflowException workflow exception
*/
public DefaultWorkflowDescription build() throws WorkflowException {
check(workplaceName != null, "workplaceName is invalid");
check(id != null, "id is invalid");
check(data != null, "data is invalid");
return new DefaultWorkflowDescription(this);
}
}
}