This is an automated email from the ASF dual-hosted git repository. marat pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel-karavan.git
commit f9a5d7c81c839adf8b7c441b4fbb2cf9f5a542ac Author: Marat Gubaidullin <marat.gubaidul...@gmail.com> AuthorDate: Sun Sep 18 12:23:16 2022 -0400 Generate REST API stubs from openapi yaml --- .../camel/karavan/api/ProjectFileResource.java | 2 +- .../camel/karavan/service/GeneratorService.java | 23 +++++++++++++++++++--- karavan-app/src/main/webapp/src/Main.tsx | 7 +++---- karavan-app/src/main/webapp/src/api/KaravanApi.tsx | 2 +- .../src/main/webapp/src/projects/UploadModal.tsx | 4 ++-- 5 files changed, 27 insertions(+), 11 deletions(-) diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java b/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java index 5b4bbf9..acd66c0 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java @@ -81,7 +81,7 @@ public class ProjectFileResource { @PathParam("generateRoutes") boolean generateRoutes, ProjectFile file) throws Exception { infinispanService.saveProjectFile(file); if (generateRest) { - String yaml = generatorService.generate(file.getCode(), generateRoutes); + String yaml = generatorService.generate(file.getName(), file.getCode(), generateRoutes); ProjectFile integration = new ProjectFile(integrationName, yaml, file.getProjectId()); infinispanService.saveProjectFile(integration); return file; diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/service/GeneratorService.java b/karavan-app/src/main/java/org/apache/camel/karavan/service/GeneratorService.java index 0e64f19..9c7d931 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/service/GeneratorService.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/service/GeneratorService.java @@ -26,8 +26,14 @@ import org.apache.camel.impl.lw.LightweightCamelContext; import org.apache.camel.karavan.model.Project; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.jboss.logging.Logger; +import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.constructor.SafeConstructor; import javax.enterprise.context.ApplicationScoped; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.nio.file.Paths; +import java.util.Map; @ApplicationScoped public class GeneratorService { @@ -46,15 +52,26 @@ public class GeneratorService { private static final Logger LOGGER = Logger.getLogger(GeneratorService.class.getName()); - public String generate(String openApi, boolean generateRoutes) throws Exception { - final ObjectMapper mapper = new ObjectMapper(); - final JsonNode node = mapper.readTree(openApi); + public String generate(String fileName, String openApi, boolean generateRoutes) throws Exception { + final JsonNode node = fileName.endsWith("json") ? readNodeFromJson(openApi) : readNodeFromYaml(openApi); OasDocument document = (OasDocument) Library.readDocument(node); try (CamelContext context = new LightweightCamelContext()) { return RestDslGenerator.toYaml(document).generate(context, generateRoutes); } } + private JsonNode readNodeFromJson(String openApi) throws Exception { + final ObjectMapper mapper = new ObjectMapper(); + return mapper.readTree(openApi); + } + + private JsonNode readNodeFromYaml(String openApi) throws FileNotFoundException { + final ObjectMapper mapper = new ObjectMapper(); + Yaml loader = new Yaml(new SafeConstructor()); + Map map = loader.load(openApi); + return mapper.convertValue(map, JsonNode.class); + } + public String getDefaultApplicationProperties(Project project){ StringBuilder s = new StringBuilder(); s.append("camel.jbang.project-id=").append(project.getProjectId()).append(System.lineSeparator()); diff --git a/karavan-app/src/main/webapp/src/Main.tsx b/karavan-app/src/main/webapp/src/Main.tsx index 166a442..bd4af70 100644 --- a/karavan-app/src/main/webapp/src/Main.tsx +++ b/karavan-app/src/main/webapp/src/Main.tsx @@ -161,7 +161,6 @@ export class Main extends React.Component<Props, State> { new MenuItem("eip", "Enterprise Integration Patterns", <EipIcon/>), new MenuItem("kamelets", "Kamelets", <KameletsIcon/>), new MenuItem("components", "Components", <ComponentsIcon/>), - new MenuItem("acl", "Access Control", <UsersIcon/>), new MenuItem("configuration", "Configuration", <ConfigurationIcon/>) ] return (<Flex className="nav-buttons" direction={{default: "column"}} style={{height:"100%"}} spaceItems={{default:"spaceItemsNone"}}> @@ -183,9 +182,9 @@ export class Main extends React.Component<Props, State> { <FlexItem flex={{default:"flex_2"}} alignSelf={{default:"alignSelfCenter"}}> <Divider/> </FlexItem> - <FlexItem alignSelf={{default:"alignSelfCenter"}}> + {KaravanApi.authType !== 'public' && <FlexItem alignSelf={{default:"alignSelfCenter"}}> <UserIcon className="avatar"/> - </FlexItem> + </FlexItem>} </Flex>) } @@ -288,7 +287,7 @@ export class Main extends React.Component<Props, State> { <Spinner className="spinner" isSVG diameter="140px" aria-label="Loading..." /> <div className="logo-placeholder">{Icon()}</div> </Bullseye>} - {KaravanApi.isAuthorized && this.getMain()} + {(KaravanApi.isAuthorized || KaravanApi.authType === 'public') && this.getMain()} {!KaravanApi.isAuthorized && KaravanApi.authType === 'basic' && <MainLogin config={this.state.config} onLogin={this.onLogin}/>} {this.state.alerts.map((e: ToastMessage) => ( <Alert key={e.id} className="main-alert" variant={e.variant} title={e.title} diff --git a/karavan-app/src/main/webapp/src/api/KaravanApi.tsx b/karavan-app/src/main/webapp/src/api/KaravanApi.tsx index b465c04..ffb22b1 100644 --- a/karavan-app/src/main/webapp/src/api/KaravanApi.tsx +++ b/karavan-app/src/main/webapp/src/api/KaravanApi.tsx @@ -393,7 +393,7 @@ export class KaravanApi { } static async postOpenApi(file: ProjectFile, generateRest: boolean, generateRoutes: boolean, integrationName: string, after: (res: AxiosResponse<any>) => void) { - const uri = `/file/openapi/${generateRest}/${generateRoutes}/${integrationName}`; + const uri = `/api/file/openapi/${generateRest}/${generateRoutes}/${integrationName}`; instance.post(encodeURI(uri), file) .then(res => { after(res); diff --git a/karavan-app/src/main/webapp/src/projects/UploadModal.tsx b/karavan-app/src/main/webapp/src/projects/UploadModal.tsx index b515ca9..7fb778a 100644 --- a/karavan-app/src/main/webapp/src/projects/UploadModal.tsx +++ b/karavan-app/src/main/webapp/src/projects/UploadModal.tsx @@ -84,7 +84,7 @@ export class UploadModal extends React.Component<Props, State> { const isDisabled = this.state.type === 'integration' ? fileNotUploaded : !(!fileNotUploaded && this.state.integrationName !== undefined && this.state.integrationName.endsWith(".yaml")); - const accept = this.state.type === 'integration' ? '.yaml' : '.json'; + const accept = this.state.type === 'integration' ? '.yaml' : '.json, .yaml'; return ( <Modal title="Upload" @@ -101,7 +101,7 @@ export class UploadModal extends React.Component<Props, State> { <Radio value="Integration" label="Integration yaml" name="Integration" id="Integration" isChecked={this.state.type === 'integration'} onChange={(_, event) => this.setState({ type: _ ? 'integration': 'openapi' })} />{' '} - <Radio value="OpenAPI" label="OpenAPI json" name="OpenAPI" id="OpenAPI" isChecked={this.state.type === 'openapi'} + <Radio value="OpenAPI" label="OpenAPI json/yaml" name="OpenAPI" id="OpenAPI" isChecked={this.state.type === 'openapi'} onChange={(_, event) => this.setState({ type: _ ? 'openapi' : 'integration' })} /> </FormGroup>