/*
* (C) Copyright 2006-2011 Nuxeo SA (http://nuxeo.com/) and others.
*
* 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.
*
* Contributors:
* bstefanescu
*/
package org.nuxeo.ecm.automation;
import java.io.Serializable;
import java.util.Arrays;
import org.nuxeo.common.xmap.annotation.XNode;
import org.nuxeo.common.xmap.annotation.XNodeList;
import org.nuxeo.common.xmap.annotation.XObject;
import org.nuxeo.ecm.automation.core.Constants;
import org.nuxeo.ecm.automation.core.OperationChainContribution;
import org.nuxeo.ecm.platform.forms.layout.api.WidgetDefinition;
/**
* @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a>
* @author <a href="mailto:grenard@nuxeo.com">Guillaume Renard</a>
*/
public class OperationDocumentation implements Comparable<OperationDocumentation>, Serializable {
private static final long serialVersionUID = 1L;
public String id;
/**
* @since 7.1
*/
public String[] aliases;
/**
* an array of size multiple of 2. Each pair in the array is the input and output type of a method.
*/
public String[] signature;
public String category;
public String label;
public String requires;
public String since;
/**
* @since 5.9.1
*/
public String deprecatedSince;
/**
* @since 5.9.1
*/
public boolean addToStudio;
/**
* @since 5.9.1
*/
public String implementationClass;
public String description;
public Param[] params;
public WidgetDefinition[] widgetDefinitions;
/**
* The operations listing in case of a chain.
*/
public OperationChainContribution.Operation[] operations;
// optional URL indicating the relative path (relative to the automation
// service home)
// of the page where the operation is exposed
public String url;
/**
* Returns a simple copy of an {@link OperationDocumentation} for an alias.
* <p>
* Array fields of {@code od} are shallow copied.
*
* @since 9.1
*/
public static OperationDocumentation copyForAlias(OperationDocumentation od, String alias) {
OperationDocumentation documentation = new OperationDocumentation(alias);
documentation.signature = od.signature;
documentation.category = od.category;
documentation.label = od.label;
documentation.requires = od.requires;
documentation.since = od.since;
documentation.deprecatedSince = od.deprecatedSince;
documentation.addToStudio = od.addToStudio;
documentation.implementationClass = od.implementationClass;
documentation.description = od.description;
documentation.params = od.params;
documentation.widgetDefinitions = od.widgetDefinitions;
return documentation;
}
public OperationDocumentation(String id) {
this.id = id;
url = id;
}
@XObject("param")
public static class Param implements Serializable, Comparable<Param> {
private static final long serialVersionUID = 1L;
@XNode("@name")
public String name;
@XNode("@description")
public String description;
@XNode("@type")
public String type; // the data type
// is this useful (?)
public String widget; // the widget type
// is this useful (?)
@XNodeList(value = "value", type = String[].class, componentType = String.class)
public String[] values; // the default values
// is this useful (?)
@XNode("@order")
public int order;
// is this useful (?)
@XNode("@required")
public boolean required;
public Param() {
}
public String getName() {
return name;
}
/**
* @since 5.7.3
*/
public String getDescription() {
return description;
}
public String getType() {
return type;
}
public String getWidget() {
return widget;
}
public String[] getValues() {
return values;
}
public boolean isRequired() {
return required;
}
public int getOrder() {
return order;
}
@Override
public String toString() {
return name + " [" + type + "] " + (required ? "required" : "optional");
}
@Override
public int compareTo(Param o) {
if (order != 0 && o.order != 0) {
if (order < o.order) {
return -1;
} else if (order > o.order) {
return 1;
}
}
if (required && !o.required) {
return -1;
}
if (o.required && !required) {
return 1;
}
return name.compareTo(o.name);
}
}
@Override
public int compareTo(OperationDocumentation o) {
String s1 = label == null ? id : label;
String s2 = o.label == null ? o.id : o.label;
return s1.compareTo(s2);
}
public String getDescription() {
return description;
}
/**
* @since 5.9.1
*/
public String getSince() {
return since;
}
/**
* @since 5.9.1
*/
public String getDeprecatedSince() {
return deprecatedSince;
}
/**
* @since 5.9.1
*/
public boolean isAddToStudio() {
return addToStudio;
}
/**
* @since 5.9.1
*/
public String getImplementationClass() {
return implementationClass;
}
/**
* @since 5.9.4
*/
public boolean isChain() {
return (id != null && id.startsWith(Constants.CHAIN_ID_PREFIX)) || Constants.CAT_CHAIN.equals(category);
}
public String[] getSignature() {
return signature;
}
public String getCategory() {
return category;
}
public String getId() {
return id;
}
public String getUrl() {
return url;
}
public String getLabel() {
return label;
}
public String getRequires() {
return requires;
}
public Param[] getParams() {
return params;
}
public String[] getAliases() {
return aliases;
}
public void setAliases(String[] aliases) {
this.aliases = aliases;
}
public OperationChainContribution.Operation[] getOperations() {
return operations;
}
@Override
public String toString() {
return category + " > " + label + " [" + id + ": " + Arrays.asList(signature) + "] (" + params + ")\n"
+ description;
}
}