SearchResourcesTask.groovy
001 /*
002  * SPDX-License-Identifier: Apache-2.0
003  *
004  * Copyright 2019-2022 Andres Almiray.
005  *
006  * Licensed under the Apache License, Version 2.0 (the "License");
007  * you may not use this file except in compliance with the License.
008  * You may obtain a copy of the License at
009  *
010  *     http://www.apache.org/licenses/LICENSE-2.0
011  *
012  * Unless required by applicable law or agreed to in writing, software
013  * distributed under the License is distributed on an "AS IS" BASIS,
014  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015  * See the License for the specific language governing permissions and
016  * limitations under the License.
017  */
018 package org.kordamp.gradle.plugin.oci.tasks.query
019 
020 import com.oracle.bmc.resourcesearch.ResourceSearch
021 import com.oracle.bmc.resourcesearch.model.QueryableFieldDescription
022 import com.oracle.bmc.resourcesearch.model.ResourceType
023 import com.oracle.bmc.resourcesearch.requests.GetResourceTypeRequest
024 import com.oracle.bmc.resourcesearch.requests.ListResourceTypesRequest
025 import com.oracle.bmc.resourcesearch.responses.GetResourceTypeResponse
026 import com.oracle.bmc.resourcesearch.responses.ListResourceTypesResponse
027 import groovy.transform.CompileStatic
028 import org.gradle.api.provider.Property
029 import org.gradle.api.provider.Provider
030 import org.gradle.api.tasks.Input
031 import org.gradle.api.tasks.Internal
032 import org.gradle.api.tasks.Optional
033 import org.gradle.api.tasks.options.Option
034 import org.kordamp.gradle.plugin.oci.tasks.AbstractOCITask
035 import org.kordamp.gradle.plugin.oci.tasks.interfaces.OCITask
036 import org.kordamp.jipsy.annotations.TypeProviderFor
037 
038 import static org.kordamp.gradle.PropertyUtils.stringProvider
039 import static org.kordamp.gradle.util.StringUtils.isBlank
040 
041 /**
042  @author Andres Almiray
043  @since 0.1.0
044  */
045 @CompileStatic
046 @TypeProviderFor(OCITask)
047 class SearchResourcesTask extends AbstractOCITask {
048     static final String TASK_DESCRIPTION = 'Lists information on resource types.'
049 
050     @Internal
051     final Property<String> resourceType = project.objects.property(String)
052 
053     @Input
054     @Optional
055     final Provider<String> resolvedResourceType = stringProvider(
056         'OCI_RESOURCE_TYPE',
057         'oci.resource.type',
058         getResourceType(),
059         project,
060         this)
061 
062     @Option(option = 'resource-type', description = 'The type to search (OPTIONAL).')
063     void setResourceType(String resourceType) {
064         getResourceType().set(resourceType)
065     }
066 
067     @Override
068     protected void doExecuteTask() {
069         ResourceSearch client = createResourceSearchClient()
070         if (isBlank(getResolvedResourceType().orNull)) {
071             listTypes(client)
072         else {
073             getTypeDetails(client, getResolvedResourceType().get())
074         }
075     }
076 
077     private void listTypes(ResourceSearch client) {
078         ListResourceTypesRequest request = ListResourceTypesRequest.builder().build()
079         ListResourceTypesResponse response = client.listResourceTypes(request)
080 
081         println('Total resources: ' + console.cyan(response.items.size().toString()))
082         println(' ')
083         for (ResourceType resourceType : response.items) {
084             println('Resource: ' + state(resourceType.name))
085         }
086     }
087 
088     private void getTypeDetails(ResourceSearch client, String typeName) {
089         GetResourceTypeRequest request = GetResourceTypeRequest.builder().name(typeName).build()
090         GetResourceTypeResponse response = client.getResourceType(request)
091 
092         println('Resource: ' + state(response.resourceType.name))
093         println('fields:')
094         doPrint(response.resourceType.fields, 0)
095     }
096 
097     @Override
098     protected void doPrint(Object value, int offset) {
099         if (value instanceof QueryableFieldDescription) {
100             doPrintQueryableFieldDescription((QueryableFieldDescriptionvalue, offset)
101         else {
102             super.doPrint(value, offset)
103         }
104     }
105 
106     @Override
107     protected void doPrintElement(Object value, int offset) {
108         if (value instanceof QueryableFieldDescription) {
109             doPrintQueryableFieldDescription((QueryableFieldDescriptionvalue, offset)
110         else {
111             super.doPrintElement(value, offset)
112         }
113     }
114 
115     private void doPrintQueryableFieldDescription(QueryableFieldDescription desc, int offset) {
116         println(('    ' * (offset + 1)) + desc.fieldName + ':')
117         doPrintMapEntry('type', desc.fieldType, offset + 2)
118         if (desc.objectProperties?.size()) {
119             println(('    ' * (offset + 2)) 'fields:')
120             doPrint(desc.objectProperties, offset + 2)
121         }
122     }
123 }