Search in sources :

Example 1 with MetadataSchema

use of com.linkedin.restli.restspec.MetadataSchema in project rest.li by linkedin.

the class SnapshotGenerator method findModelsFinder.

private void findModelsFinder(FinderSchema finderSchema, Map<String, NamedDataSchema> foundTypes, List<NamedDataSchema> typeOrder) {
    ParameterSchemaArray parameters = finderSchema.getParameters();
    if (parameters != null) {
        for (ParameterSchema parameterSchema : parameters) {
            findModelsParameter(parameterSchema, foundTypes, typeOrder);
        }
    }
    MetadataSchema metadata = finderSchema.getMetadata();
    if (metadata != null) {
        String type = metadata.getType();
        recordType(type, foundTypes, typeOrder);
    }
}
Also used : MetadataSchema(com.linkedin.restli.restspec.MetadataSchema) ParameterSchema(com.linkedin.restli.restspec.ParameterSchema) ParameterSchemaArray(com.linkedin.restli.restspec.ParameterSchemaArray)

Example 2 with MetadataSchema

use of com.linkedin.restli.restspec.MetadataSchema in project rest.li by linkedin.

the class ResourceModelEncoder method createFinders.

private FinderSchemaArray createFinders(final ResourceModel resourceModel) {
    FinderSchemaArray findersArray = new FinderSchemaArray();
    List<ResourceMethodDescriptor> resourceMethodDescriptors = resourceModel.getResourceMethodDescriptors();
    Collections.sort(resourceMethodDescriptors, RESOURCE_METHOD_COMPARATOR);
    for (ResourceMethodDescriptor resourceMethodDescriptor : resourceMethodDescriptors) {
        if (ResourceMethod.FINDER.equals(resourceMethodDescriptor.getType())) {
            FinderSchema finder = new FinderSchema();
            finder.setName(resourceMethodDescriptor.getFinderName());
            String doc = _docsProvider.getMethodDoc(resourceMethodDescriptor.getMethod());
            if (doc != null) {
                finder.setDoc(doc);
            }
            ParameterSchemaArray parameters = createParameters(resourceMethodDescriptor);
            if (parameters.size() > 0) {
                finder.setParameters(parameters);
            }
            StringArray assocKeys = createAssocKeyParameters(resourceMethodDescriptor);
            if (assocKeys.size() > 0) {
                finder.setAssocKeys(assocKeys);
            }
            if (resourceMethodDescriptor.getFinderMetadataType() != null) {
                Class<?> metadataType = resourceMethodDescriptor.getFinderMetadataType();
                MetadataSchema metadataSchema = new MetadataSchema();
                metadataSchema.setType(buildDataSchemaType(metadataType));
                finder.setMetadata(metadataSchema);
            }
            final DataMap customAnnotation = resourceMethodDescriptor.getCustomAnnotationData();
            String deprecatedDoc = _docsProvider.getMethodDeprecatedTag(resourceMethodDescriptor.getMethod());
            if (deprecatedDoc != null) {
                customAnnotation.put(DEPRECATED_ANNOTATION_NAME, deprecateDocToAnnotationMap(deprecatedDoc));
            }
            if (!customAnnotation.isEmpty()) {
                finder.setAnnotations(new CustomAnnotationContentSchemaMap(customAnnotation));
            }
            if (resourceMethodDescriptor.isPagingSupported()) {
                finder.setPagingSupported(true);
            }
            findersArray.add(finder);
        }
    }
    return findersArray;
}
Also used : StringArray(com.linkedin.data.template.StringArray) FinderSchemaArray(com.linkedin.restli.restspec.FinderSchemaArray) MetadataSchema(com.linkedin.restli.restspec.MetadataSchema) ParameterSchemaArray(com.linkedin.restli.restspec.ParameterSchemaArray) FinderSchema(com.linkedin.restli.restspec.FinderSchema) CustomAnnotationContentSchemaMap(com.linkedin.restli.restspec.CustomAnnotationContentSchemaMap) DataMap(com.linkedin.data.DataMap)

Example 3 with MetadataSchema

use of com.linkedin.restli.restspec.MetadataSchema in project rest.li by linkedin.

the class RestLiResourceRelationship method findDataModels.

private void findDataModels() {
    final ResourceSchemaVisitior visitor = new BaseResourceSchemaVisitor() {

        @Override
        public void visitResourceSchema(VisitContext visitContext, ResourceSchema resourceSchema) {
            final String schema = resourceSchema.getSchema();
            // ActionSet resources do not have a schema
            if (schema != null) {
                final NamedDataSchema schemaSchema = extractSchema(schema);
                if (schemaSchema != null) {
                    connectSchemaToResource(visitContext, schemaSchema);
                }
            }
        }

        @Override
        public void visitCollectionResource(VisitContext visitContext, CollectionSchema collectionSchema) {
            connectErrorDetailTypeToResource(visitContext, collectionSchema);
            final IdentifierSchema id = collectionSchema.getIdentifier();
            final NamedDataSchema typeSchema = extractSchema(id.getType());
            if (typeSchema != null) {
                connectSchemaToResource(visitContext, typeSchema);
            }
            final String params = id.getParams();
            if (params != null) {
                final NamedDataSchema paramsSchema = extractSchema(params);
                if (paramsSchema != null) {
                    connectSchemaToResource(visitContext, paramsSchema);
                }
            }
        }

        @Override
        public void visitAssociationResource(VisitContext visitContext, AssociationSchema associationSchema) {
            connectErrorDetailTypeToResource(visitContext, associationSchema);
            for (AssocKeySchema key : associationSchema.getAssocKeys()) {
                final NamedDataSchema keyTypeSchema = extractSchema(key.getType());
                if (keyTypeSchema != null) {
                    connectSchemaToResource(visitContext, keyTypeSchema);
                }
            }
        }

        @Override
        public void visitSimpleResource(VisitContext visitContext, SimpleSchema simpleSchema) {
            connectErrorDetailTypeToResource(visitContext, simpleSchema);
        }

        @Override
        public void visitActionSetResource(VisitContext visitContext, ActionsSetSchema actionSetSchema) {
            connectErrorDetailTypeToResource(visitContext, actionSetSchema);
        }

        @Override
        public void visitParameter(VisitContext visitContext, RecordTemplate parentResource, Object parentMethodSchema, ParameterSchema parameterSchema) {
            String parameterTypeString = parameterSchema.getType();
            if (// the parameter type field contains a inline schema, so we traverse into it
            isInlineSchema(parameterTypeString)) {
                visitInlineSchema(visitContext, parameterTypeString);
            } else {
                final NamedDataSchema schema;
                // grab the schema name from it
                if (parameterSchema.hasItems()) {
                    schema = extractSchema(parameterSchema.getItems());
                } else // the only remaining possibility is that the type field contains the name of a data schema
                {
                    schema = extractSchema(parameterTypeString);
                }
                if (schema != null) {
                    connectSchemaToResource(visitContext, schema);
                }
            }
        }

        @Override
        public void visitRestMethod(VisitContext visitContext, RecordTemplate parentResource, RestMethodSchema restMethodSchema) {
            connectErrorDetailTypeToResource(visitContext, restMethodSchema);
        }

        @Override
        public void visitFinder(VisitContext visitContext, RecordTemplate parentResource, FinderSchema finderSchema) {
            connectErrorDetailTypeToResource(visitContext, finderSchema);
            final MetadataSchema metadata = finderSchema.getMetadata();
            if (metadata != null) {
                final NamedDataSchema metadataTypeSchema = extractSchema(metadata.getType());
                if (metadataTypeSchema != null) {
                    connectSchemaToResource(visitContext, metadataTypeSchema);
                }
            }
        }

        @Override
        public void visitBatchFinder(VisitContext visitContext, RecordTemplate parentResource, BatchFinderSchema batchFinderSchema) {
            connectErrorDetailTypeToResource(visitContext, batchFinderSchema);
            final MetadataSchema metadata = batchFinderSchema.getMetadata();
            if (metadata != null) {
                final NamedDataSchema metadataTypeSchema = extractSchema(metadata.getType());
                if (metadataTypeSchema != null) {
                    connectSchemaToResource(visitContext, metadataTypeSchema);
                }
            }
        }

        @Override
        public void visitAction(VisitContext visitContext, RecordTemplate parentResource, ResourceLevel resourceLevel, ActionSchema actionSchema) {
            connectErrorDetailTypeToResource(visitContext, actionSchema);
            final String returns = actionSchema.getReturns();
            if (returns != null) {
                if (// the parameter type field contains a inline schema, so we traverse into it
                isInlineSchema(returns)) {
                    visitInlineSchema(visitContext, returns);
                } else // otherwise the type field contains the name of a data schema
                {
                    final NamedDataSchema returnsSchema = extractSchema(returns);
                    if (returnsSchema != null) {
                        connectSchemaToResource(visitContext, returnsSchema);
                    }
                }
            }
            final StringArray throwsArray = actionSchema.getThrows();
            if (throwsArray != null) {
                for (String errorName : throwsArray) {
                    final NamedDataSchema errorSchema = extractSchema(errorName);
                    if (errorSchema != null) {
                        connectSchemaToResource(visitContext, errorSchema);
                    }
                }
            }
        }

        private boolean isInlineSchema(String schemaString) {
            return schemaString.startsWith("{");
        }

        private void visitInlineSchema(VisitContext visitContext, String schemaString) {
            DataSchema schema = DataTemplateUtil.parseSchema(schemaString, _schemaResolver, SchemaFormatType.PDSC);
            if (schema instanceof ArrayDataSchema) {
                DataSchema itemSchema = ((ArrayDataSchema) schema).getItems();
                if (itemSchema instanceof NamedDataSchema) {
                    connectSchemaToResource(visitContext, (NamedDataSchema) itemSchema);
                }
            }
            if (schema instanceof MapDataSchema) {
                DataSchema valueSchema = ((MapDataSchema) schema).getValues();
                if (valueSchema instanceof NamedDataSchema) {
                    connectSchemaToResource(visitContext, (NamedDataSchema) valueSchema);
                }
            }
        }

        private void connectSchemaToResource(VisitContext visitContext, final NamedDataSchema schema) {
            final Node<NamedDataSchema> schemaNode = _relationships.get(schema);
            _dataModels.put(schema.getFullName(), schema);
            final DataSchemaTraverse traveler = new DataSchemaTraverse();
            traveler.traverse(schema, (path, nestedSchema) -> {
                if (nestedSchema instanceof RecordDataSchema && nestedSchema != schema) {
                    final RecordDataSchema nestedRecordSchema = (RecordDataSchema) nestedSchema;
                    _dataModels.put(nestedRecordSchema.getFullName(), nestedRecordSchema);
                    final Node<RecordDataSchema> node = _relationships.get(nestedRecordSchema);
                    schemaNode.addAdjacentNode(node);
                }
            });
            final Node<ResourceSchema> resourceNode = _relationships.get(visitContext.getParentSchema());
            resourceNode.addAdjacentNode(schemaNode);
            schemaNode.addAdjacentNode(resourceNode);
        }

        /**
         * Given a record which includes {@link ServiceErrorsSchema}, scans for service errors and connects the error
         * detail type field (if any) to the resource.
         *
         * @param visitContext visit context
         * @param record record which includes {@link ServiceErrorsSchema}
         */
        private void connectErrorDetailTypeToResource(VisitContext visitContext, RecordTemplate record) {
            final ServiceErrorsSchema serviceErrorsSchema = new ServiceErrorsSchema(record.data());
            if (serviceErrorsSchema.getServiceErrors() != null) {
                for (ServiceErrorSchema serviceErrorSchema : serviceErrorsSchema.getServiceErrors()) {
                    if (serviceErrorSchema.hasErrorDetailType()) {
                        final NamedDataSchema errorDetailTypeSchema = extractSchema(serviceErrorSchema.getErrorDetailType());
                        if (errorDetailTypeSchema != null) {
                            connectSchemaToResource(visitContext, errorDetailTypeSchema);
                        }
                    }
                }
            }
        }
    };
    ResourceSchemaCollection.visitResources(_resourceSchemas.getResources().values(), visitor);
}
Also used : ResourceSchema(com.linkedin.restli.restspec.ResourceSchema) ResourceLevel(com.linkedin.restli.server.ResourceLevel) MapDataSchema(com.linkedin.data.schema.MapDataSchema) ParameterSchema(com.linkedin.restli.restspec.ParameterSchema) BatchFinderSchema(com.linkedin.restli.restspec.BatchFinderSchema) FinderSchema(com.linkedin.restli.restspec.FinderSchema) ActionsSetSchema(com.linkedin.restli.restspec.ActionsSetSchema) StringArray(com.linkedin.data.template.StringArray) IdentifierSchema(com.linkedin.restli.restspec.IdentifierSchema) ServiceErrorsSchema(com.linkedin.restli.restspec.ServiceErrorsSchema) RecordTemplate(com.linkedin.data.template.RecordTemplate) ServiceErrorSchema(com.linkedin.restli.restspec.ServiceErrorSchema) AssociationSchema(com.linkedin.restli.restspec.AssociationSchema) CollectionSchema(com.linkedin.restli.restspec.CollectionSchema) SimpleSchema(com.linkedin.restli.restspec.SimpleSchema) MetadataSchema(com.linkedin.restli.restspec.MetadataSchema) BatchFinderSchema(com.linkedin.restli.restspec.BatchFinderSchema) RestMethodSchema(com.linkedin.restli.restspec.RestMethodSchema) ActionSchema(com.linkedin.restli.restspec.ActionSchema) AssocKeySchema(com.linkedin.restli.restspec.AssocKeySchema) NamedDataSchema(com.linkedin.data.schema.NamedDataSchema) DataSchema(com.linkedin.data.schema.DataSchema) MapDataSchema(com.linkedin.data.schema.MapDataSchema) RecordDataSchema(com.linkedin.data.schema.RecordDataSchema) NamedDataSchema(com.linkedin.data.schema.NamedDataSchema) ArrayDataSchema(com.linkedin.data.schema.ArrayDataSchema) ArrayDataSchema(com.linkedin.data.schema.ArrayDataSchema) RecordDataSchema(com.linkedin.data.schema.RecordDataSchema) DataSchemaTraverse(com.linkedin.data.schema.DataSchemaTraverse)

Example 4 with MetadataSchema

use of com.linkedin.restli.restspec.MetadataSchema in project rest.li by linkedin.

the class ResourceModelEncoder method createMetadataSchema.

private MetadataSchema createMetadataSchema(final ResourceMethodDescriptor resourceMethodDescriptor) {
    Class<?> metadataType = resourceMethodDescriptor.getCollectionCustomMetadataType();
    MetadataSchema metadataSchema = new MetadataSchema();
    metadataSchema.setType(buildDataSchemaType(metadataType));
    return metadataSchema;
}
Also used : MetadataSchema(com.linkedin.restli.restspec.MetadataSchema)

Aggregations

MetadataSchema (com.linkedin.restli.restspec.MetadataSchema)4 StringArray (com.linkedin.data.template.StringArray)2 FinderSchema (com.linkedin.restli.restspec.FinderSchema)2 ParameterSchema (com.linkedin.restli.restspec.ParameterSchema)2 ParameterSchemaArray (com.linkedin.restli.restspec.ParameterSchemaArray)2 DataMap (com.linkedin.data.DataMap)1 ArrayDataSchema (com.linkedin.data.schema.ArrayDataSchema)1 DataSchema (com.linkedin.data.schema.DataSchema)1 DataSchemaTraverse (com.linkedin.data.schema.DataSchemaTraverse)1 MapDataSchema (com.linkedin.data.schema.MapDataSchema)1 NamedDataSchema (com.linkedin.data.schema.NamedDataSchema)1 RecordDataSchema (com.linkedin.data.schema.RecordDataSchema)1 RecordTemplate (com.linkedin.data.template.RecordTemplate)1 ActionSchema (com.linkedin.restli.restspec.ActionSchema)1 ActionsSetSchema (com.linkedin.restli.restspec.ActionsSetSchema)1 AssocKeySchema (com.linkedin.restli.restspec.AssocKeySchema)1 AssociationSchema (com.linkedin.restli.restspec.AssociationSchema)1 BatchFinderSchema (com.linkedin.restli.restspec.BatchFinderSchema)1 CollectionSchema (com.linkedin.restli.restspec.CollectionSchema)1 CustomAnnotationContentSchemaMap (com.linkedin.restli.restspec.CustomAnnotationContentSchemaMap)1