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((QueryableFieldDescription) value, 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((QueryableFieldDescription) value, 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 }
|