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>

Reply via email to