RepreZen / KaiZen-OpenAPI-Editor

Eclipse Editor for the Swagger-OpenAPI Description Language
Eclipse Public License 1.0
115 stars 13 forks source link

Error shown when opening editor #51

Closed tedepstein closed 8 years ago

tedepstein commented 8 years ago

I somehow (not sure how) introduced a "mapping values not allowed here" error in my swagger spec. When I closed and re-opened the document, it showed a dialog box with the same error shown twice:

image

Here's the model that produced the error:

swagger: '2.0'
info:
   title: Uber API
   description: Move your app forward with the Uber API
   version: 1.0.0
host: api.uber.com
schemes:
   - https
basePath: /v1
produces:
   - application/json
paths:
   /products:
      get:
         summary: Product Types
         description: |
            The Products endpoint returns information about the *Uber* products
            offered at a given location. The response includes the display name
            and other details about each product, and lists the products in the
            proper display order.
         parameters:
            - name: latitude
               in: query
               description: Latitude component of location.
               required: true
               type: number
               format: double
            - name: longitude
               in: query
               description: Longitude component of location.
               required: true
               type: number
               format: double
         tags:
            - Products
         responses:
            '200':
               description: An array of products
               schema:
                  type: array
                  items:
                     $ref: '#/definitions/Product'
            default:
               description: Unexpected error
               schema:
                  $ref: '#/definitions/Error'
   /estimates/price:
      get:
         summary: Price Estimates
         description: >
            The Price Estimates endpoint returns an estimated price range

            for each product offered at a given location. The price estimate is

            provided as a formatted string with the full price range and the
            localized

            currency symbol.<br><br>The response also includes low and high
            estimates,

            and the [ISO 4217](http://en.wikipedia.org/wiki/ISO_4217) currency code
            for

            situations requiring currency conversion. When surge is active for
            a particular

            product, its surge_multiplier will be greater than 1, but the price
            estimate

            already factors in this multiplier.
         parameters:
            - name: start_latitude
               in: query
               description: Latitude component of start location.
               required: true
               type: number
               format: double
            - name: start_longitude
               in: query
               description: Longitude component of start location.
               required: true
               type: number
               format: double
            - name: end_latitude
               in: query
               description: Latitude component of end location.
               required: true
               type: number
               format: double
            - name: end_longitude
               in: query
               description: Longitude component of end location.
               required: true
               type: number
               format: double
         tags:
            - Estimates
         responses:
            '200':
               description: An array of price estimates by product
               schema:
                  type: array
                  items:
                     $ref: '#/definitions/PriceEstimate'
            default:
               description: Unexpected error
               schema:
                  $ref: '#/definitions/Error'
   /estimates/time:
      get:
         summary: Time Estimates
         description: 'The Time Estimates endpoint returns ETAs for all products offered at a given location, with the responses expressed as integers in seconds. We recommend that this endpoint be called every minute to provide the most accurate, up-to-date ETAs.'
         parameters:
            - name: start_latitude
               in: query
               description: Latitude component of start location.
               required: true
               type: number
               format: double
            - name: start_longitude
               in: query
               description: Longitude component of start location.
               required: true
               type: number
               format: double
            - name: customer_uuid
               in: query
               type: string
               format: uuid
               description: Unique customer identifier to be used for experience customization.
            - name: product_id
               in: query
               type: string
               description: 'Unique identifier representing a specific product for a given latitude & longitude.'
         tags:
            - Estimates
         responses:
            '200':
               description: An array of products
               schema:
                  type: array
                  items:
                     $ref: '#/definitions/Product'
            default:
               description: Unexpected error
               schema:
                  $ref: '#/definitions/Error'
   /me:
      get:
         summary: User Profile
         description: The User Profile endpoint returns information about the Uber user that has authorized with the application.
         tags:
            - User
         responses:
            '200':
               description: Profile information for a user
               schema:
                  $ref: '#/definitions/Profile'
            default:
               description: Unexpected error
               schema:
                  $ref: '#/definitions/Error'
   /history:
      get:
         summary: User Activity
         description: "The User Activity endpoint returns data about a user's lifetime activity with Uber. The response will include pickup locations and times, dropoff locations and times, the distance of past requests, and information about which products were requested.<br><br>The history array in the response will have a maximum length based on the limit parameter. The response value count may exceed limit, therefore subsequent API requests may be necessary."
         parameters:
            - name: offset
               in: query
               type: integer
               format: int32
               description: Offset the list of returned results by this amount. Default is zero.
            - name: limit
               in: query
               type: integer
               format: int32
               description: 'Number of items to retrieve. Default is 5, maximum is 100.'
         tags:
            - User
         responses:
            '200':
               description: History information for the given user
               schema:
                  $ref: '#/definitions/Activities'
            default:
               description: Unexpected error
               schema:
                  $ref: '#/definitions/Error'
definitions:
   Product:
      type: object
      properties:
         product_id:
            type: string
            description: 'Unique identifier representing a specific product for a given latitude & longitude. For example, uberX in San Francisco will have a different product_id than uberX in Los Angeles.'
         description:
            type: string
            description: Description of product.
         display_name:
            type: string
            description: Display name of product.
         capacity:
            type: string
            description: 'Capacity of product. For example, 4 people.'
         image:
            type: string
            description: Image URL representing the product.
   PriceEstimate:
      type: object
      properties:
         product_id:
            type: string
            description: 'Unique identifier representing a specific product for a given latitude & longitude. For example, uberX in San Francisco will have a different product_id than uberX in Los Angeles'
         currency_code:
            type: string
            description: '[ISO 4217](http://en.wikipedia.org/wiki/ISO_4217) currency code.'
         display_name:
            type: string
            description: Display name of product.
         estimate:
            type: string
            description: 'Formatted string of estimate in local currency of the start location. Estimate could be a range, a single number (flat rate) or "Metered" for TAXI.'
         low_estimate:
            type: number
            description: Lower bound of the estimated price.
         high_estimate:
            type: number
            description: Upper bound of the estimated price.
         surge_multiplier:
            type: number
            description: Expected surge multiplier. Surge is active if surge_multiplier is greater than 1. Price estimate already factors in the surge multiplier.
   Profile:
      type: object
      properties:
         first_name:
            type: string
            description: First name of the Uber user.
         last_name:
            type: string
            description: Last name of the Uber user.
         email:
            type: string
            description: Email address of the Uber user
         picture:
            type: string
            description: Image URL of the Uber user.
         promo_code:
            type: string
            description: Promo code of the Uber user.
   Activity:
      type: object
      properties:
         uuid:
            type: string
            description: Unique identifier for the activity
   Activities:
      type: object
      properties:
         offset:
            type: integer
            format: int32
            description: Position in pagination.
         limit:
            type: integer
            format: int32
            description: Number of items to retrieve (100 max).
         count:
            type: integer
            format: int32
            description: Total number of items available.
         history:
            type: array
            items:
               $ref: '#/definitions/Activity'
   Error:
      type: object
      properties:
         code:
            type: integer
            format: int32
         message:
            type: string
         fields:
            type: string
tedepstein commented 8 years ago

To clarify: validation errors in the Swagger Spec should not result in a modal dialog appearing when we the user opens the file. The fact that the same error is reported twice in the dialog box is just another, smaller issue. The main issue is, we should not have this kind of exception reporting when trying to open a file.

ghillairet commented 8 years ago

I think this has to do with the introduction of live validation (see #38), error markers are not reset when file is reopen.

tfesenko commented 8 years ago

I was able to reproduce this issue too on the latest RepreZen master build (RepreZen+SwagEdit integration). The dialog is not shown when you create the error in the editor (I just pasted the code), but it appears when you close and open the SwagEdit editor.

ghillairet commented 8 years ago

I don't have any dialog box showing up when reopening the file, and don't have the same error twice, but 2 different errors.

screen shot 2016-01-07 at 18 16 36

tfesenko commented 8 years ago

@ghillairet , I reproduced it on a RepreZen build with SwagEdit integration, e.g. http://products.modelsolv.com:8111/repository/download/bt5/6113:id/product/com.modelsolv.reprezen.product-macosx.cocoa.x86_64.zip . Can you please try it on this build? If you still don't see an error box I can show it to you at tomorrow's call.

ghillairet commented 8 years ago

If you look at the log, looks like the error is not catch by the swagedit live plugin in class SwagEditorSource (line 233).

Caused by: mapping values are not allowed here
 in 'reader', line 23, column 18:
                   in: query
                     ^

    at com.fasterxml.jackson.dataformat.yaml.snakeyaml.scanner.ScannerImpl.fetchValue(ScannerImpl.java:871)
    at com.fasterxml.jackson.dataformat.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:360)
    at com.fasterxml.jackson.dataformat.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:226)
    at com.fasterxml.jackson.dataformat.yaml.snakeyaml.parser.ParserImpl$ParseBlockMappingKey.produce(ParserImpl.java:558)
    at com.fasterxml.jackson.dataformat.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:158)
    at com.fasterxml.jackson.dataformat.yaml.snakeyaml.parser.ParserImpl.getEvent(ParserImpl.java:168)
    at com.fasterxml.jackson.dataformat.yaml.YAMLParser.nextToken(YAMLParser.java:331)
    at com.fasterxml.jackson.databind.deser.std.BaseNodeDeserializer.deserializeObject(JsonNodeDeserializer.java:218)
    at com.fasterxml.jackson.databind.deser.std.BaseNodeDeserializer.deserializeArray(JsonNodeDeserializer.java:267)
    at com.fasterxml.jackson.databind.deser.std.BaseNodeDeserializer.deserializeObject(JsonNodeDeserializer.java:227)
    at com.fasterxml.jackson.databind.deser.std.BaseNodeDeserializer.deserializeObject(JsonNodeDeserializer.java:224)
    at com.fasterxml.jackson.databind.deser.std.BaseNodeDeserializer.deserializeObject(JsonNodeDeserializer.java:224)
    at com.fasterxml.jackson.databind.deser.std.BaseNodeDeserializer.deserializeObject(JsonNodeDeserializer.java:224)
    at com.fasterxml.jackson.databind.deser.std.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:62)
    at com.fasterxml.jackson.databind.deser.std.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:14)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3562)
    at com.fasterxml.jackson.databind.ObjectMapper.readTree(ObjectMapper.java:2136)
    at com.modelsolv.reprezen.swagedit.live.SwagEditorSource$SwagEditorState.getSwaggerJson(SwagEditorSource.java:233)
    at com.modelsolv.reprezen.swagedit.live.SwagEditorSource$SwagEditorState.hasErrors(SwagEditorSource.java:226)
    at com.modelsolv.reprezen.gentemplates.common.ui.view.BrowserViewPage.sourceChanged(BrowserViewPage.java:307)
    at com.modelsolv.reprezen.swagedit.live.SwagEditorSource$DocumentIdleListenerAdapter.editorIdle(SwagEditorSource.java:151)
    at org.dadacoalition.yedit.editor.IdleTimer$2.run(IdleTimer.java:147)
    at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
    at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:135)
    ... 23 more
tedepstein commented 8 years ago

Fix in RepreZen PR 813 has passed QA.