{
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)
{
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 visitParameter(VisitContext visitContext,
RecordTemplate parentResource,
Object parentMethodSchema,
ParameterSchema parameterSchema)
{
String parameterTypeString = parameterSchema.getType();
if (isInlineSchema(parameterTypeString)) // the parameter type field contains a inline schema, so we traverse into it
{
visitInlineSchema(visitContext, parameterTypeString);
}
else
{
final NamedDataSchema schema;
// else if the parameter is using the legacy format or representing maps and lists with a separate "items" field,
// 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 visitFinder(VisitContext visitContext,
RecordTemplate parentResource,
FinderSchema finderSchema)
{
final MetadataSchema metadata = finderSchema.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)
{
final String returns = actionSchema.getReturns();
if (returns != null)
{
if (isInlineSchema(returns)) // the parameter type field contains a inline schema, so we traverse into it
{
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);
}
}