|
6 | 6 | package io.openapiparser; |
7 | 7 |
|
8 | 8 | import io.openapiprocessor.jsonschema.converter.StringNotNullConverter; |
9 | | -import io.openapiprocessor.jsonschema.schema.Bucket; |
10 | | -import io.openapiprocessor.jsonschema.schema.Resolver; |
11 | | -import io.openapiprocessor.jsonschema.schema.ResolverResult; |
| 9 | +import io.openapiprocessor.jsonschema.schema.*; |
12 | 10 |
|
13 | 11 | import java.net.URI; |
14 | 12 |
|
15 | 13 | import static io.openapiparser.Keywords.OPENAPI; |
16 | | -import static io.openapiprocessor.jsonschema.converter.Types.asMap; |
17 | 14 | import static io.openapiprocessor.jsonschema.support.Nullness.nonNull; |
18 | 15 |
|
19 | 16 | public class OpenApiParser { |
20 | | - private final Resolver resolver; |
| 17 | + private final DocumentStore documents; |
| 18 | + private final DocumentLoader loader; |
21 | 19 |
|
22 | | - public OpenApiParser (Resolver resolver) { |
23 | | - this.resolver = resolver; |
| 20 | + public OpenApiParser (DocumentStore documents, DocumentLoader loader) { |
| 21 | + this.documents = documents; |
| 22 | + this.loader = loader; |
24 | 23 | } |
25 | 24 |
|
26 | | - public OpenApiResult parse(URI baseUri) throws Exception { |
| 25 | + public OpenApiResult parse(URI baseUri) { |
27 | 26 | try { |
28 | | - return createResult (resolver.resolve (baseUri)); |
| 27 | + return parse(baseUri, loader.loadDocument(baseUri)); |
29 | 28 | } catch (Exception e) { |
30 | | - throw new ParserException (e); |
| 29 | + throw new ParserException (baseUri, e); |
31 | 30 | } |
32 | 31 | } |
33 | 32 |
|
34 | 33 | public OpenApiResult parse(String resource) { |
35 | 34 | try { |
36 | | - return createResult (resolver.resolve (resource)); |
| 35 | + return parse(URI.create (resource), loader.loadDocument(resource)); |
| 36 | + } catch (Exception e) { |
| 37 | + throw new ParserException (e); |
| 38 | + } |
| 39 | + } |
| 40 | + |
| 41 | + public OpenApiResult parse(URI baseUri, Object document) { |
| 42 | + try { |
| 43 | + return parseVersion(baseUri, document); |
37 | 44 | } catch (Exception e) { |
38 | 45 | throw new ParserException (e); |
39 | 46 | } |
40 | 47 | } |
41 | 48 |
|
42 | | - private OpenApiResult createResult (ResolverResult result) { |
43 | | - Object document = result.getDocument (); |
44 | | - Bucket api = new Bucket (result.getScope (), asMap (document)); |
45 | | - String version = getVersion (api); |
46 | | - |
47 | | - if (isVersion30 (version)) { |
48 | | - return new OpenApiResult30 ( |
49 | | - new Context (result.getScope (), result.getRegistry ()), api, result.getDocuments ()); |
50 | | - } else if (isVersion31 (version)) { |
51 | | - return new OpenApiResult31 ( |
52 | | - new Context (result.getScope (), result.getRegistry ()), api, result.getDocuments ()); |
| 49 | + private OpenApiResult parseVersion(URI baseUri, Object document) { |
| 50 | + String version = getVersion(baseUri, document); |
| 51 | + |
| 52 | + if (isVersion30(version)) { |
| 53 | + return parse30(baseUri, document); |
| 54 | + |
| 55 | + } else if (isVersion31(version)) { |
| 56 | + return parse31(baseUri, document); |
| 57 | + |
53 | 58 | } else { |
54 | | - throw new UnknownVersionException (version); |
| 59 | + throw new UnknownVersionException(version); |
55 | 60 | } |
56 | 61 | } |
57 | 62 |
|
58 | | - private String getVersion (Bucket api) { |
59 | | - return nonNull (api.convert (OPENAPI, new StringNotNullConverter ())); |
| 63 | + private OpenApiResult31 parse31(URI baseUri, Object document) { |
| 64 | + Resolver resolver = new Resolver(documents, loader); |
| 65 | + ResolverResult result = resolver.resolve(baseUri, document, new Resolver.Settings(SchemaVersion.Draft202012)); |
| 66 | + |
| 67 | + return new OpenApiResult31( |
| 68 | + new Context(result.getScope(), result.getRegistry()), |
| 69 | + Bucket.toBucket(result.getScope(), document), |
| 70 | + documents); |
| 71 | + } |
| 72 | + |
| 73 | + private OpenApiResult30 parse30(URI baseUri, Object document) { |
| 74 | + Resolver resolver = new Resolver(documents, loader); |
| 75 | + ResolverResult result = resolver.resolve(baseUri, document, new Resolver.Settings(SchemaVersion.Draft4)); |
| 76 | + |
| 77 | + return new OpenApiResult30( |
| 78 | + new Context(result.getScope(), result.getRegistry()), |
| 79 | + Bucket.toBucket(result.getScope(), document), |
| 80 | + documents); |
| 81 | + } |
| 82 | + |
| 83 | + private String getVersion(URI baseUri, Object document) { |
| 84 | + Scope scope = Scope.createScope(baseUri, document, SchemaVersion.getLatest()); |
| 85 | + Bucket api = nonNull(Bucket.toBucket(scope, document)); |
| 86 | + return api.convert (OPENAPI, new StringNotNullConverter ()); |
60 | 87 | } |
61 | 88 |
|
62 | 89 | private boolean isVersion30(String version) { |
|
0 commit comments