This is an automated email from the ASF dual-hosted git repository.

sureshanaparti pushed a commit to branch api-docs-improvements
in repository https://gitbox.apache.org/repos/asf/cloudstack.git

commit 958e1b47f3d50dccb0efbdcd594559a8a50634fb
Author: Suresh Kumar Anaparti <[email protected]>
AuthorDate: Mon Jan 5 13:24:40 2026 +0530

    API docs improvements
    - Proper category alignments during API docs generation
    - Since attribute for API, Request & Response parameters
    - Code improvements/cleanup
---
 .../command/admin/storage/ListStorageTagsCmd.java  |   2 +-
 .../api/commands/AddOpenDaylightControllerCmd.java |   2 +-
 .../commands/DeleteOpenDaylightControllerCmd.java  |   2 +-
 .../commands/ListOpenDaylightControllersCmd.java   |   2 +-
 .../java/com/cloud/api/doc/ApiXmlDocWriter.java    |  84 +--------
 tools/apidoc/gen_toc.py                            | 153 +++++++---------
 tools/apidoc/generatecommand.xsl                   | 194 ---------------------
 tools/apidoc/generatecommands.xsl                  |  77 ++++++--
 tools/apidoc/generatecustomcommand.xsl             |  64 -------
 tools/apidoc/generategenericcommand.xsl            |  56 ------
 10 files changed, 139 insertions(+), 497 deletions(-)

diff --git 
a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/ListStorageTagsCmd.java
 
b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/ListStorageTagsCmd.java
index d9bb5d4cd93..6b45fd71ad1 100644
--- 
a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/ListStorageTagsCmd.java
+++ 
b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/ListStorageTagsCmd.java
@@ -24,7 +24,7 @@ import org.apache.cloudstack.api.BaseListCmd;
 import org.apache.cloudstack.api.response.ListResponse;
 import org.apache.cloudstack.api.response.StorageTagResponse;
 
-@APICommand(name = "listStorageTags", description = "Lists storage tags", 
responseObject = StorageTagResponse.class, requestHasSensitiveInfo = false, 
responseHasSensitiveInfo = false)
+@APICommand(name = "listStorageTags", description = "Lists storage pool tags", 
responseObject = StorageTagResponse.class, requestHasSensitiveInfo = false, 
responseHasSensitiveInfo = false)
 public class ListStorageTagsCmd extends BaseListCmd {
 
 
diff --git 
a/plugins/network-elements/opendaylight/src/main/java/org/apache/cloudstack/network/opendaylight/api/commands/AddOpenDaylightControllerCmd.java
 
b/plugins/network-elements/opendaylight/src/main/java/org/apache/cloudstack/network/opendaylight/api/commands/AddOpenDaylightControllerCmd.java
index 44cfded880d..176ec8b909c 100644
--- 
a/plugins/network-elements/opendaylight/src/main/java/org/apache/cloudstack/network/opendaylight/api/commands/AddOpenDaylightControllerCmd.java
+++ 
b/plugins/network-elements/opendaylight/src/main/java/org/apache/cloudstack/network/opendaylight/api/commands/AddOpenDaylightControllerCmd.java
@@ -38,7 +38,7 @@ import com.cloud.exception.NetworkRuleConflictException;
 import com.cloud.exception.ResourceAllocationException;
 import com.cloud.exception.ResourceUnavailableException;
 
-@APICommand(name = "addOpenDaylightController", responseObject = 
OpenDaylightControllerResponse.class, description = "Adds an OpenDyalight 
controler",
+@APICommand(name = "addOpenDaylightController", responseObject = 
OpenDaylightControllerResponse.class, description = "Adds an OpenDaylight 
controller",
         requestHasSensitiveInfo = true, responseHasSensitiveInfo = false)
 public class AddOpenDaylightControllerCmd extends BaseAsyncCmd {
 
diff --git 
a/plugins/network-elements/opendaylight/src/main/java/org/apache/cloudstack/network/opendaylight/api/commands/DeleteOpenDaylightControllerCmd.java
 
b/plugins/network-elements/opendaylight/src/main/java/org/apache/cloudstack/network/opendaylight/api/commands/DeleteOpenDaylightControllerCmd.java
index ce02e64fdd1..52afd97bbaf 100644
--- 
a/plugins/network-elements/opendaylight/src/main/java/org/apache/cloudstack/network/opendaylight/api/commands/DeleteOpenDaylightControllerCmd.java
+++ 
b/plugins/network-elements/opendaylight/src/main/java/org/apache/cloudstack/network/opendaylight/api/commands/DeleteOpenDaylightControllerCmd.java
@@ -40,7 +40,7 @@ import com.cloud.exception.NetworkRuleConflictException;
 import com.cloud.exception.ResourceAllocationException;
 import com.cloud.exception.ResourceUnavailableException;
 
-@APICommand(name = "deleteOpenDaylightController", responseObject = 
OpenDaylightControllerResponse.class, description = "Removes an OpenDyalight 
controler",
+@APICommand(name = "deleteOpenDaylightController", responseObject = 
OpenDaylightControllerResponse.class, description = "Removes an OpenDaylight 
controller",
         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
 public class DeleteOpenDaylightControllerCmd extends BaseAsyncCmd {
     @Inject
diff --git 
a/plugins/network-elements/opendaylight/src/main/java/org/apache/cloudstack/network/opendaylight/api/commands/ListOpenDaylightControllersCmd.java
 
b/plugins/network-elements/opendaylight/src/main/java/org/apache/cloudstack/network/opendaylight/api/commands/ListOpenDaylightControllersCmd.java
index 4bbc2ffb046..fbe2eeb1c8d 100644
--- 
a/plugins/network-elements/opendaylight/src/main/java/org/apache/cloudstack/network/opendaylight/api/commands/ListOpenDaylightControllersCmd.java
+++ 
b/plugins/network-elements/opendaylight/src/main/java/org/apache/cloudstack/network/opendaylight/api/commands/ListOpenDaylightControllersCmd.java
@@ -42,7 +42,7 @@ import com.cloud.exception.NetworkRuleConflictException;
 import com.cloud.exception.ResourceAllocationException;
 import com.cloud.exception.ResourceUnavailableException;
 
-@APICommand(name = "listOpenDaylightControllers", responseObject = 
OpenDaylightControllerResponse.class, description = "Lists OpenDyalight 
controllers",
+@APICommand(name = "listOpenDaylightControllers", responseObject = 
OpenDaylightControllerResponse.class, description = "Lists OpenDaylight 
controllers",
         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
 public class ListOpenDaylightControllersCmd extends BaseCmd {
     @Inject
diff --git a/server/src/main/java/com/cloud/api/doc/ApiXmlDocWriter.java 
b/server/src/main/java/com/cloud/api/doc/ApiXmlDocWriter.java
index 87d88df79e3..e8e2373d4a1 100644
--- a/server/src/main/java/com/cloud/api/doc/ApiXmlDocWriter.java
+++ b/server/src/main/java/com/cloud/api/doc/ApiXmlDocWriter.java
@@ -41,8 +41,6 @@ import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
 
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.ObjectOutputStream;
@@ -50,19 +48,14 @@ import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import java.util.Properties;
 import java.util.Set;
 import java.util.TreeMap;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
 
 public class ApiXmlDocWriter {
     protected static Logger LOGGER = 
LogManager.getLogger(ApiXmlDocWriter.class);
@@ -93,8 +86,8 @@ public class ApiXmlDocWriter {
                 "org.apache.cloudstack.api.command.admin.zone", 
"org.apache.cloudstack.network.contrail.api.command"});
 
         for (Class<?> cmdClass : cmdClasses) {
-            if(cmdClass.getAnnotation(APICommand.class)==null){
-               System.out.println("Warning, API Cmd class " + 
cmdClass.getName() + " has no APICommand annotation ");
+            if (cmdClass.getAnnotation(APICommand.class) == null) {
+               System.out.println("Warning: API Cmd class " + 
cmdClass.getName() + " has no APICommand annotation ");
                continue;
             }
             String apiName = cmdClass.getAnnotation(APICommand.class).name();
@@ -105,11 +98,9 @@ public class ApiXmlDocWriter {
                     // api_cmd map always keep the admin cmd class to get full 
response and parameters
                     s_apiNameCmdClassMap.put(apiName, cmdClass);
                 } else if (cmdClass.isAssignableFrom(curCmd)) {
-                    // just skip this one without warning
-                    continue;
+                    System.out.println("Info: API Cmd class " + 
cmdClass.getName() + " is assignable from " + curCmd.getName() + ", skip this 
one");
                 } else {
-                    System.out.println("Warning, API Cmd class " + 
cmdClass.getName() + " has non-unique apiname " + apiName);
-                    continue;
+                    System.out.println("Warning: API Cmd class " + 
cmdClass.getName() + " has non-unique apiname " + apiName);
                 }
             } else {
                 s_apiNameCmdClassMap.put(apiName, cmdClass);
@@ -178,8 +169,6 @@ public class ApiXmlDocWriter {
 
     private static void writeCommand(ObjectOutputStream out, String command) 
throws ClassNotFoundException, IOException {
         Class<?> clas = Class.forName(s_allApiCommands.get(command));
-        ArrayList<Argument> request = new ArrayList<Argument>();
-        ArrayList<Argument> response = new ArrayList<Argument>();
 
         // Create a new command, set name/description/usage
         Command apiCommand = new Command();
@@ -220,19 +209,19 @@ public class ApiXmlDocWriter {
 
             Set<Field> fields = ReflectUtil.getAllFieldsForClass(clas, new 
Class<?>[] {BaseCmd.class, BaseAsyncCmd.class, BaseAsyncCreateCmd.class});
 
-            request = setRequestFields(fields);
+            ArrayList<Argument> request = setRequestFields(fields);
 
             // Get response parameters
             Class<?> responseClas = impl.responseObject();
             Field[] responseFields = responseClas.getDeclaredFields();
-            response = setResponseFields(responseFields, responseClas);
+            ArrayList<Argument> response = setResponseFields(responseFields, 
responseClas);
 
             apiCommand.setRequest(request);
             apiCommand.setResponse(response);
 
             out.writeObject(apiCommand);
         } else {
-            LOGGER.debug("Command " + command + " is not exposed in api doc");
+            LOGGER.debug("Command {} is not exposed in api doc", command);
         }
     }
 
@@ -361,49 +350,6 @@ public class ApiXmlDocWriter {
         return arguments;
     }
 
-    private static void zipDir(String zipFileName, String dir) throws 
Exception {
-        File dirObj = new File(dir);
-        ZipOutputStream out = new ZipOutputStream(new 
FileOutputStream(zipFileName));
-        addDir(dirObj, out);
-        out.close();
-    }
-
-    static void addDir(File dirObj, ZipOutputStream out) throws IOException {
-        File[] files = dirObj.listFiles();
-        byte[] tmpBuf = new byte[1024];
-        String pathToDir = s_dirName;
-
-        for (int i = 0; i < files.length; i++) {
-            if (files[i].isDirectory()) {
-                addDir(files[i], out);
-                continue;
-            }
-            try(FileInputStream in = new FileInputStream(files[i].getPath());) 
{
-                out.putNextEntry(new 
ZipEntry(files[i].getPath().substring(pathToDir.length())));
-                int len;
-                while ((len = in.read(tmpBuf)) > 0) {
-                    out.write(tmpBuf, 0, len);
-                }
-                out.closeEntry();
-            }catch(IOException ex)
-            {
-                LOGGER.error("addDir:Exception:"+ ex.getMessage(),ex);
-            }
-        }
-    }
-
-    private static void deleteDir(File dir) {
-        if (dir.isDirectory()) {
-            String[] children = dir.list();
-            if (children != null) {
-                for (int i = 0; i < children.length; i++) {
-                    deleteDir(new File(dir, children[i]));
-                }
-            }
-        }
-        dir.delete();
-    }
-
     private static void writeAlertTypes(String dirName) {
         XStream xs = new XStream();
         xs.alias("alert", Alert.class);
@@ -421,20 +367,4 @@ public class ApiXmlDocWriter {
             LOGGER.error("Failed to read alert fields ", e);
         }
     }
-
-    private static class LinkedProperties extends Properties {
-        private final LinkedList<Object> keys = new LinkedList<Object>();
-
-        @Override
-        public Enumeration<Object> keys() {
-            return Collections.<Object> enumeration(keys);
-        }
-
-        @Override
-        public Object put(Object key, Object value) {
-            // System.out.println("Adding key" + key);
-            keys.add(key);
-            return super.put(key, value);
-        }
-    }
 }
diff --git a/tools/apidoc/gen_toc.py b/tools/apidoc/gen_toc.py
index e41a04ff2e1..1988f4052c8 100644
--- a/tools/apidoc/gen_toc.py
+++ b/tools/apidoc/gen_toc.py
@@ -46,6 +46,9 @@ dirname_to_dirname = {
 
 
 known_categories = {
+    # Use the category definition formats below:
+    # keyword or api: category - to choose category based on keyword or api in 
the api call
+    # api: (category, True|False) - True - use the category defined (i.e. 
direct api to category mapping), False - choose category same as above
     'Cisco' : 'External Device',
     'SystemVm': 'System VM',
     'VirtualMachine': 'Virtual Machine',
@@ -53,7 +56,7 @@ known_categories = {
     'Vnf': 'Virtual Network Functions',
     'VnfTemplate': 'Virtual Network Functions',
     'GuestSubnet': 'Routing',
-    'HypervisorGuestOsNames': 'Guest OS',
+    'GuestOs': 'Guest OS',
     'Domain': 'Domain',
     'Template': 'Template',
     'Iso': 'ISO',
@@ -66,10 +69,14 @@ known_categories = {
     'IpForwarding': 'NAT',
     'Host': 'Host',
     'HostTags': 'Host',
+    'cancelHostMaintenance': 'Host',
+    'prepareHostForMaintenance': 'Host',
+    'startRollingMaintenance': 'Host',
     'OutOfBandManagement': 'Out-of-band Management',
     'Cluster': 'Cluster',
     'Account': 'Account',
     'Role': 'Role',
+    'VMSnapshot': 'VM Snapshot',
     'Snapshot': 'Snapshot',
     'User': 'User',
     'UserData': 'User Data',
@@ -85,38 +92,34 @@ known_categories = {
     'ManagementNetworkIpRange': 'Pod',
     'PublicIpRange': 'Network',
     'Zone': 'Zone',
-    'Vmware' : 'Zone',
+    'VmwareDc' : 'Zone',
     'NetworkOffering': 'Network Offering',
     'NetworkACL': 'Network ACL',
-    'NetworkAclItem': 'Network ACL',
     'Network': 'Network',
-    'CiscoNexus': 'Network',
-    'OpenDaylight': 'Network',
+    'CiscoNexusVSM': 'Cisco Nexus VSM',
+    'OpenDaylightController': 'OpenDaylight Controller',
     'createServiceInstance': 'Network',
     'addGloboDnsHost': 'Network',
     'TungstenFabric': 'Tungsten',
-    'listNsxControllers': 'NSX',
-    'addNsxController': 'NSX',
-    'deleteNsxController': 'NSX',
+    'NsxController': 'NSX',
     'NetrisProvider': 'Netris',
     'Vpn': 'VPN',
     'Limit': 'Resource Limit',
     'Netscaler': 'Netscaler',
-    'NetscalerControlCenter': 'Netscaler',
-    'NetscalerLoadBalancer': 'Netscaler',
     'SolidFire': 'SolidFire',
     'PaloAlto': 'Palo Alto',
-    'ResourceCount': 'Limit',
+    'ResourceCount': 'Resource Limit',
     'CloudIdentifier': 'Cloud Identifier',
     'InstanceGroup': 'VM Group',
     'StorageMaintenance': 'Storage Pool',
     'StoragePool': 'Storage Pool',
+    'StorageTags': 'Storage Pool',
     'StorageProvider': 'Storage Pool',
     'StorageScope' : 'Storage Pool',
     'updateStorageCapabilities' : 'Storage Pool',
     'SecurityGroup': 'Security Group',
-    'SSH': 'SSH',
-    'AsyncJob': 'Async job',
+    'SSHKeyPair': 'SSH KeyPair',
+    'AsyncJob': 'Async Job',
     'Certificate': 'Certificate',
     'Hypervisor': 'Configuration',
     'Alert': 'Alert',
@@ -126,13 +129,10 @@ known_categories = {
     'saml': 'Authentication',
     'getSPMetadata': 'Authentication',
     'listIdps': 'Authentication',
-    'authorizeSamlSso': 'Authentication',
-    'listSamlAuthorization': 'Authentication',
+    # 'authorizeSamlSso': 'Authentication',
+    # 'listSamlAuthorization': 'Authentication',
     'oauthlogin': 'Authentication',
-    'deleteOauthProvider': 'Oauth',
-    'listOauthProvider': 'Oauth',
-    'registerOauthProvider': 'Oauth',
-    'updateOauthProvider': 'Oauth',
+    'OauthProvider': 'OAuth',
     'quota': 'Quota',
     'emailTemplate': 'Quota',
     'Capacity': 'System Capacity',
@@ -144,7 +144,6 @@ known_categories = {
     'TrafficType': 'Network',
     'Product': 'Product',
     'LB': 'Load Balancer',
-    'ldap': 'LDAP',
     'Ldap': 'LDAP',
     'Swift': 'Image Store',
     'S3' : 'S3',
@@ -156,9 +155,9 @@ known_categories = {
     'VPCOffering': 'VPC Offering',
     'PrivateGateway': 'VPC',
     'migrateVpc': 'VPC',
-    'Simulator': 'simulator',
+    'Simulator': 'Simulator',
     'StaticRoute': 'VPC',
-    'Tags': 'Resource tags',
+    'Tags': 'Resource Tags',
     'Icon': 'Resource Icon',
     'NiciraNvpDevice': 'Nicira NVP',
     'BrocadeVcsDevice': 'Brocade VCS',
@@ -169,21 +168,14 @@ known_categories = {
     'Api': 'API Discovery',
     'ApiLimit': 'Configuration',
     'Region': 'Region',
-    'Detail': 'Resource metadata',
-    'addIpToNic': 'Nic',
-    'removeIpFromNic': 'Nic',
-    'updateVmNicIp': 'Nic',
-    'listNics':'Nic',
+    'Detail': 'Resource Metadata',
+    'addIpToNic': 'NIC',
+    'removeIpFromNic': 'NIC',
+    'updateVmNicIp': 'NIC',
+    'listNics':'NIC',
     'AffinityGroup': 'Affinity Group',
     'ImageStore': 'Image Store',
-    'addImageStore': 'Image Store',
-    'listImageStore': 'Image Store',
-    'deleteImageStore': 'Image Store',
-    'createSecondaryStagingStore': 'Image Store',
-    'deleteSecondaryStagingStore': 'Image Store',
-    'listSecondaryStagingStores': 'Image Store',
-    'updateImageStore': 'Image Store',
-    'downloadImageStoreObject': 'Image Store',
+    'SecondaryStagingStore': 'Image Store',
     'InternalLoadBalancer': 'Internal LB',
        'DeploymentPlanners': 'Configuration',
        'ObjectStore': 'Image Store',
@@ -192,98 +184,77 @@ known_categories = {
     'releaseDedicatedHost': 'Dedicate Resources',
     'Baremetal' : 'Baremetal',
     'UCS' : 'UCS',
-    'Ucs' : 'UCS',
-    'CacheStores' : 'Cache Stores',
     'CacheStore' : 'Cache Store',
     'OvsElement' : 'Ovs Element',
-    'StratosphereSsp' : 'Misc Network Service Providers',
+    'StratosphereSsp' : 'Stratosphere SSP',
     'Metrics' : 'Metrics',
-    'listClustersMetrics': 'Cluster',
     'VpnUser': 'VPN',
-    'listZonesMetrics': 'Metrics',
     'Infrastructure' : 'Metrics',
     'listRegisteredServicePackages': 'Load Balancer',
-    'listNsVpx' : 'Load Balancer',
-    'destroyNsVPx': 'Load Balancer',
-    'deployNetscalerVpx' : 'Load Balancer',
-    'stopNetScalerVpx' : 'Load Balancer',
+    'NsVpx' : 'Load Balancer',
+    'NetscalerVpx' : 'Load Balancer',
     'deleteServicePackageOffering' : 'Load Balancer',
-    'destroyNsVpx' : 'Load Balancer',
-    'startNsVpx' : 'Load Balancer',
-    'listAnnotations' : 'Annotations',
-    'addAnnotation' : 'Annotations',
-    'removeAnnotation' : 'Annotations',
-    'updateAnnotationVisibility' : 'Annotations',
+    'Annotation' : 'Annotations',
     'CA': 'Certificate',
-    'listElastistorInterface': 'Misc',
+    'Elastistor': 'Elastistor',
     'cloudian': 'Cloudian',
     'Sioc' : 'Sioc',
     'Diagnostics': 'Diagnostics',
-    'Management': 'Management',
+    'ManagementServer': 'Management Server',
     'Backup' : 'Backup and Recovery',
     'Restore' : 'Backup and Recovery',
     'UnmanagedInstance': 'Virtual Machine',
-    'KubernetesSupportedVersion': 'Kubernetes Service',
-    'KubernetesCluster': 'Kubernetes Service',
+    'Kubernetes': 'Kubernetes Service',
     'Rolling': 'Rolling Maintenance',
-    'importVsphereStoragePolicies' : 'vSphere storage policies',
-    'listVsphereStoragePolicies' : 'vSphere storage policies',
+    'vsphereStoragePolicy' : 'vSphere storage policies',
+    'vsphereStoragePolicies' : 'vSphere storage policies',
     'createConsoleEndpoint': 'Console Session',
     'listConsoleSessions': 'Console Session',
     'importVm': 'Virtual Machine',
-    'revertToVMSnapshot': 'Virtual Machine',
-    'listQuarantinedIp': 'IP Quarantine',
-    'updateQuarantinedIp': 'IP Quarantine',
-    'removeQuarantinedIp': 'IP Quarantine',
-    'Shutdown': 'Maintenance',
-    'Maintenance': 'Maintenance',
-    'addObjectStoragePool': 'Object Store',
-    'listObjectStoragePools': 'Object Store',
-    'deleteObjectStoragePool': 'Object Store',
-    'updateObjectStoragePool': 'Object Store',
-    'createBucket': 'Object Store',
-    'updateBucket': 'Object Store',
-    'deleteBucket': 'Object Store',
-    'listBuckets': 'Object Store',
+    'ImportVmTask': 'Virtual Machine',
     'listVmsForImport': 'Virtual Machine',
+    'revertToVMSnapshot': 'Virtual Machine',
+    'QuarantinedIp': 'IP Quarantine',
+    'Shutdown': 'Management Server',
+    'Maintenance': 'Management Server',
+    'ObjectStoragePool': 'Object Store',
+    'Bucket': 'Object Store',
     'SharedFS': 'Shared FileSystem',
     'SharedFileSystem': 'Shared FileSystem',
     'Webhook': 'Webhook',
-    'Webhooks': 'Webhook',
     'purgeExpungedResources': 'Resource',
     'forgotPassword': 'Authentication',
     'resetPassword': 'Authentication',
     'BgpPeer': 'BGP Peer',
-    'createASNRange': 'AS Number Range',
-    'listASNRange': 'AS Number Range',
-    'deleteASNRange': 'AS Number Range',
-    'listASNumbers': 'AS Number',
-    'releaseASNumber': 'AS Number',
-    'addNodesToKubernetesCluster': 'Kubernetes Service',
-    'removeNodesFromKubernetesCluster': 'Kubernetes Service',
-    'configureStorageAccess': 'Storage Access Groups',
-    'listStorageAccessGroups': 'Storage Access Groups',
-    'listGuiThemes': 'GUI Theme',
-    'createGuiTheme': 'GUI Theme',
-    'updateGuiTheme': 'GUI Theme',
-    'removeGuiTheme': 'GUI Theme',
-    'Gpu': 'GPU',
-    'Vgpu': 'GPU',
+    'changeBgpPeersForNetwork': 'BGP Peer',
+    'ASNRange': 'AS Number Range',
+    'ASNumber': 'AS Number',
+    'StorageAccess': 'Storage Access Groups',
+    'GuiTheme': 'GUI Theme',
+    'GPU': 'GPU',
+    'vGPU': 'GPU',
+    'GPUCard': 'GPU',
     'Extension' : 'Extension',
-    'Extensions' : 'Extension',
-    'CustomAction' : 'Extension',
-    'CustomActions' : 'Extension',
-    'ImportVmTask': 'Import VM Task'
+    'CustomAction' : 'Extension'
 }
 
 
 categories = {}
 
+choosing_category = 1
+
 
 def choose_category(fn):
+    global choosing_category
+    print("choosing_category - " + str(choosing_category) + " , for fn: " + fn)
+    choosing_category = choosing_category + 1
     possible_known_categories = []
+    i = 1
     for k, v in known_categories.items():
-        if k in fn:
+        print(str(i) + " - k:" + k + ", v:" + v + " fn: " + fn + "\n")
+        i = i + 1
+        if k.lower() in fn.lower():
+            print("add to possible_known_categories - " + k + "\n")
             possible_known_categories.append(k)
 
     if len(possible_known_categories) > 0:
diff --git a/tools/apidoc/generatecommand.xsl b/tools/apidoc/generatecommand.xsl
deleted file mode 100644
index 9cc22102200..00000000000
--- a/tools/apidoc/generatecommand.xsl
+++ /dev/null
@@ -1,194 +0,0 @@
-<?xml version="1.0"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you 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.
--->
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
-version="1.0">
-<xsl:output method="html" doctype-public="-//W3C//DTD HTML 1.0 
Transitional//EN"/>
-<xsl:template match="/">
-<html xmlns="http://www.w3.org/1999/xhtml";><head>
-<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
-<link rel= "stylesheet" href="../includes/main.css" type="text/css" />
-<link rel="shortcut icon" href="../favicon.ico" type="image/x-icon" />
-
-<title>CloudStack API Reference</title>
-</head>
-
-<body>
-<div id="insidetopbg">
-<div id="inside_wrapper">
-       <div class="uppermenu_panel">
-            <div class="uppermenu_box"><!-- #BeginLibraryItem 
"/libraries/uppermenu.lbi" -->
-
-<div class="uppermenu">
-       <a href="libraries/learn_download.html">Downloads</a> | <a 
href="libraries/company_news.html">News</a> | <a href="#">Contact Us</a>
-</div><!-- #EndLibraryItem --></div>
-        </div>
-
-        <div id="main_controller">
-            <div id="inside_header">
-
-                <div class="header_top">
-                    <a class="cloud_logo" href="index.html"></a>
-                    <div class="mainemenu_panel">
-
-                    </div>
-                </div>
-                <div class="insideheader_bot">
-                       <div class="insideheader_botleft">
-                       <h1></h1>
-                    </div>
-
-                    <div class="insideheader_botright">
-                       <div class="insideheader_button">
-                               <a class="insjoincomm_button" href="#"></a>
-                            <a class="insdownload_button" href="#"></a>
-                        </div>
-                        <div class="insheader_buttonshadow"></div>
-                    </div>
-                </div>
-
-            </div>
-
-            <div id="main_content">
-
-                <div class="inside_apileftpanel">
-                       <div class="inside_contentpanel" style="width:930px;">
-                       <div class="api_titlebox">
-                               <div class="api_titlebox_left">
-                               <xsl:for-each select="command/command">
-                                <h1><xsl:value-of select="name"/></h1>
-                                <span><xsl:value-of 
select="description"/></span>
-                               </xsl:for-each>
-                            </div>
-
-
-                            <div class="api_titlebox_right">
-                               <a class="api_backbutton" href="#"></a>
-                            </div>
-                        </div>
-                       <div class="api_tablepanel">
-                               <h2>Request parameters</h2>
-                               <table class="apitable">
-                               <tr class="hed">
-                                       <td 
style="width:200px;"><strong>Parameter Name</strong></td>
-
-                                    <td style="width:500px;">Description</td>
-                                    <td style="width:180px;">Required</td>
-                                </tr>
-                               <xsl:for-each 
select="command/command/request/arg">
-                                <tr>
-                                       <td 
style="width:200px;"><strong><xsl:value-of select="name"/></strong></td>
-                                    <td style="width:500px;"><xsl:value-of 
select="description"/></td>
-                                    <td style="width:180px;"><xsl:value-of 
select="required"/></td>
-
-                                </tr>
-                               </xsl:for-each>
-                            </table>
-                        </div>
-
-
-                         <div class="api_tablepanel">
-                               <h2>Response Tags</h2>
-                               <table class="apitable">
-                               <tr class="hed">
-                                       <td 
style="width:200px;"><strong>Response Name</strong></td>
-                                    <td style="width:500px;">Description</td>
-                                </tr>
-
-                               <xsl:for-each 
select="command/command/response/arg">
-                                <tr>
-                                       <td 
style="width:200px;"><strong><xsl:value-of select="name"/></strong></td>
-                                    <td style="width:500px;"><xsl:value-of 
select="description"/></td>
-                                       <xsl:for-each select="./arguments/arg">
-                                       <tr>
-                                       <td 
style="width:200px;"><strong><xsl:value-of select="name"/></strong></td>
-                                       <td style="width:500px;"><xsl:value-of 
select="description"/></td>
-                                       </tr>
-                                               <xsl:for-each 
select="./arguments/arg">
-                                               <tr>
-                                               <td 
style="width:200px;"><strong><xsl:value-of select="name"/></strong></td>
-                                               <td 
style="width:500px;"><xsl:value-of select="description"/></td>
-                                               </tr>
-                                       </xsl:for-each>
-                                       </xsl:for-each>
-                                </tr>
-                               </xsl:for-each>
-
-
-
-
-
-                            </table>
-
-                        </div>
-
-
-                </div>
-                </div>
-
-
-            </div>
-        </div><!-- #BeginLibraryItem "/libraries/footer.lbi" -->
-<div id="footer">
-
-               <div id="footer_maincontroller">
-               <ul class="footer_linksbox">
-                       <li><strong> Main </strong></li>
-                    <li> <a href="index.html"> Home</a> </li>
-                    <li> <a href="learn_whatcloud.html"> Learn</a> </li>
-
-                    <li> <a href="products_cloudplatform.html"> Products</a> 
</li>
-                    <li> <a href="#"> Community</a> </li>
-                    <li> <a href="service_overview.html"> Services</a> </li>
-
-                    <li> <a href="Partners_Main.html"> Partners</a> </li>
-                    <li> <a href="company_about.html"> Company</a> </li>
-                </ul>
-                <ul class="footer_linksbox">
-                       <li><strong> Sub </strong> </li>
-
-                    <li> <a href="learn_videos.html"> Tour</a> </li>
-                    <li> <a href="learn_download.html"> Downloads</a> </li>
-                    <li> <a href="learn_FAQ.html"> FAQs</a> </li>
-
-                    <li> <a href="#"> Blog</a> </li>
-                    <li> <a href="#"> Contacts</a> </li>
-
-                </ul>
-                <ul class="footer_linksbox">
-                       <li><strong> Site Info </strong> </li>
-
-                    <li> <a href="#"> Privacy Policy</a> </li>
-                    <li> <a href="#"> Term of Use</a> </li>
-                    <li> <a href="#"> Contacts</a> </li>
-
-                </ul>
-                <p>Copyright © 2015 The Apache Software Foundation, Licensed 
under the
-                   <a href="http://www.apache.org/licenses/LICENSE-2.0";>Apache 
License, Version 2.0.</a> <br />
-                Apache, CloudStack, Apache CloudStack, the Apache CloudStack 
logo, the CloudMonkey logo  and the Apache feather logo are trademarks of The 
Apache Software Foundation.</p>
-
-            </div>
-        </div>
-
-  </div>
- </div>
-</body>
-</html>
-</xsl:template>
-</xsl:stylesheet>
diff --git a/tools/apidoc/generatecommands.xsl 
b/tools/apidoc/generatecommands.xsl
index ce8dc0eb8ba..e6def6007dd 100644
--- a/tools/apidoc/generatecommands.xsl
+++ b/tools/apidoc/generatecommands.xsl
@@ -60,7 +60,18 @@ version="1.0">
                                        </span>
                                        <p></p>
                                        <h1><xsl:value-of select="name"/></h1>
-                                       <p><xsl:value-of 
select="description"/></p>
+                    <xsl:if test="sinceVersion">
+                        <h1>(since: <xsl:value-of select="sinceVersion"/>)</h1>
+                        <h2>(since: <xsl:value-of select="sinceVersion"/>)</h2>
+                        <h2>since: <xsl:value-of select="sinceVersion"/></h2>
+                        <h3>(since: <xsl:value-of select="sinceVersion"/>)</h3>
+                    </xsl:if>
+                    <span>
+                        <xsl:value-of select="description"/>
+                        <xsl:if test="sinceVersion">
+                            <xsl:text> </xsl:text>(since: <xsl:value-of 
select="sinceVersion"/>)
+                        </xsl:if>
+                    </span>
                                </xsl:for-each>
                             </div>
 
@@ -70,7 +81,7 @@ version="1.0">
                             </div>
                         </div>
                        <div class="api_tablepanel">
-                               <h2>Request parameters</h2>
+                               <h2>Request Parameters</h2>
                                <table class="apitable">
                                <tr class="hed">
                                        <td 
style="width:200px;"><strong>Parameter Name</strong></td>
@@ -81,13 +92,37 @@ version="1.0">
                                <xsl:for-each 
select="command/command/request/arg">
                                 <tr>
                                    <xsl:if test="required='true'">
-                                    <td 
style="width:200px;"><strong><xsl:value-of select="name"/></strong></td>
-                                   <td 
style="width:500px;"><strong><xsl:value-of select="description"/></strong></td>
+                                    <td style="width:200px;">
+                                        <strong><xsl:value-of 
select="name"/></strong>
+                                        <xsl:if test="sinceVersion">
+                                            <xsl:text> </xsl:text>(since: 
<xsl:value-of select="sinceVersion"/>)
+                                        </xsl:if>
+                                    </td>
+                                   <td style="width:500px;">
+                        <strong>
+                            <xsl:value-of select="description"/>
+                            <xsl:if test="sinceVersion">
+                                <xsl:text> </xsl:text>(since: <xsl:value-of 
select="sinceVersion"/>)
+                            </xsl:if>
+                        </strong>
+                    </td>
                                     <td 
style="width:180px;"><strong><xsl:value-of select="required"/></strong></td>
                                    </xsl:if>
                                    <xsl:if test="required='false'">
-                                       <td 
style="width:200px;"><i><xsl:value-of select="name"/></i></td>
-                                    <td style="width:500px;"><i><xsl:value-of 
select="description"/></i></td>
+                                       <td style="width:200px;">
+                        <i><xsl:value-of select="name"/></i>
+                        <xsl:if test="sinceVersion">
+                            <xsl:text> </xsl:text>(since: <xsl:value-of 
select="sinceVersion"/>)
+                        </xsl:if>
+                    </td>
+                                    <td style="width:500px;">
+                                        <i>
+                                            <xsl:value-of 
select="description"/>
+                                            <xsl:if test="sinceVersion">
+                                                <xsl:text> </xsl:text>(since: 
<xsl:value-of select="sinceVersion"/>)
+                                            </xsl:if>
+                                        </i>
+                                    </td>
                                     <td style="width:180px;"><i><xsl:value-of 
select="required"/></i></td>
                                    </xsl:if>
                                 </tr>
@@ -97,7 +132,7 @@ version="1.0">
 
 
                          <div class="api_tablepanel">
-                               <h2>Response Tags</h2>
+                               <h2>Response Parameters</h2>
                                <table class="apitable">
                                <tr class="hed">
                                        <td 
style="width:200px;"><strong>Response Name</strong></td>
@@ -106,17 +141,37 @@ version="1.0">
 
                                <xsl:for-each 
select="command/command/response/arg">
                                 <tr>
-                                       <td 
style="width:200px;"><strong><xsl:value-of select="name"/></strong></td>
-                                    <td style="width:500px;"><xsl:value-of 
select="description"/></td>
+                                       <td style="width:200px;">
+                        <strong><xsl:value-of select="name"/></strong>
+                        <xsl:if test="sinceVersion">
+                            <xsl:text> </xsl:text>(since: <xsl:value-of 
select="sinceVersion"/>)
+                        </xsl:if>
+                    </td>
+                                    <td style="width:500px;">
+                                        <xsl:value-of select="description"/>
+                                        <xsl:if test="sinceVersion">
+                                            <xsl:text> </xsl:text>(since: 
<xsl:value-of select="sinceVersion"/>)
+                                        </xsl:if>
+                                    </td>
                                        <xsl:for-each select="./arguments/arg">
                                        <tr>
-                                       <td style="width:180px; 
padding-left:25px;"><strong><xsl:value-of select="name"/></strong></td>
+                                       <td style="width:180px; 
padding-left:25px;">
+                        <strong><xsl:value-of select="name"/></strong>
+                        <xsl:if test="sinceVersion">
+                            <xsl:text> </xsl:text>(since: <xsl:value-of 
select="sinceVersion"/>)
+                        </xsl:if>
+                    </td>
                                        <td style="width:500px;"><xsl:value-of 
select="description"/></td>
                                        </tr>
                                                <xsl:for-each 
select="./arguments/arg">
                                                <tr>
                                                <td style="width:165px; 
padding-left:40px;"><xsl:value-of select="name"/></td>
-                                               <td 
style="width:500px;"><xsl:value-of select="description"/></td>
+                                               <td style="width:500px;">
+                            <xsl:value-of select="description"/>
+                            <xsl:if test="sinceVersion">
+                                <xsl:text> </xsl:text>(since: <xsl:value-of 
select="sinceVersion"/>)
+                            </xsl:if>
+                        </td>
                                                </tr>
                                        </xsl:for-each>
                                        </xsl:for-each>
diff --git a/tools/apidoc/generatecustomcommand.xsl 
b/tools/apidoc/generatecustomcommand.xsl
deleted file mode 100644
index ae480bcab0e..00000000000
--- a/tools/apidoc/generatecustomcommand.xsl
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you 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.
--->
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
-version="1.0">
-<xsl:template match="/">
-<html>
-<head><title>Cloudstack API</title></head>
-<body>
-<table border="1">
-<tr>
-<th>Name</th>
-<th>Description</th>
-<th>Request Parameters</th>
-<th>Response Parameters</th>
-</tr>
-<xsl:for-each select="command/command">
-<tr>
-<td><xsl:value-of select="name"/></td>
-<td><xsl:value-of select="description"/></td>
-<td>
-<xsl:for-each select="./request/arg">
-<br><b>Name:</b><xsl:value-of select="name"/></br>
-<b>Description:</b><xsl:value-of select="description"/>
-<br><b>Required:</b><xsl:value-of select="required"/></br>
-</xsl:for-each>
-</td>
-<td>
-<xsl:for-each select="./response/arg">
-<br><b>Name:</b><xsl:value-of select="name"/></br>
-<b>Description:</b><xsl:value-of select="description"/>
-<xsl:for-each select="./arguments/arg">
-<br><b>Name:</b><xsl:value-of select="name"/></br>
-<b>Description:</b><xsl:value-of select="description"/>
-<xsl:for-each select="./arguments/arg">
-<br><b>Name:</b><xsl:value-of select="name"/></br>
-<b>Description:</b><xsl:value-of select="description"/>
-</xsl:for-each>
-</xsl:for-each>
-<br></br>
-</xsl:for-each>
-</td>
-</tr>
-</xsl:for-each>
-</table>
-</body></html>
-</xsl:template>
-</xsl:stylesheet>
diff --git a/tools/apidoc/generategenericcommand.xsl 
b/tools/apidoc/generategenericcommand.xsl
deleted file mode 100644
index 0e936673b56..00000000000
--- a/tools/apidoc/generategenericcommand.xsl
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you 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.
--->
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
-version="1.0">
-<xsl:template match="/">
-<html>
-<head><title>Cloudstack API</title></head>
-<body>
-<table border="1">
-<tr>
-<th>Name</th>
-<th>Description</th>
-<th>Request Parameters</th>
-<th>Response Parameters</th>
-</tr>
-<xsl:for-each select="command/command">
-<tr>
-<td><xsl:value-of select="name"/></td>
-<td><xsl:value-of select="description"/></td>
-<td>
-<xsl:for-each select="./request/arg">
-<br><b>Name:</b><xsl:value-of select="name"/></br>
-<b>Description:</b><xsl:value-of select="description"/>
-<br><b>Required:</b><xsl:value-of select="required"/></br>
-</xsl:for-each>
-</td>
-<td>
-<xsl:for-each select="./response/arg">
-<br><b>Name:</b><xsl:value-of select="name"/></br>
-<b>Description:</b><xsl:value-of select="description"/>
-<br></br>
-</xsl:for-each>
-</td>
-</tr>
-</xsl:for-each>
-</table>
-</body></html>
-</xsl:template>
-</xsl:stylesheet>


Reply via email to