protected void resolveResourceType(App app, ApiConfigurator c , Route route) { Class<?> resourceType = null; Resource resource = route.getAction().searchAnnotation(Resource.class); if(null != resource) { resourceType = resource.value(); } if(null != route.getAction().getController()) { ResourceWrapper rw = route.getAction().getControllerAnnotation(ResourceWrapper.class); if(null != rw) { Class<?> cls = route.getAction().getController().getClass(); if(cls.getTypeParameters().length == 1) { resourceType = cls.getTypeParameters()[0].getGenericDeclaration(); }else { Class<?>[] types = Types.getActualTypeArguments(cls.getGenericSuperclass()); if(types.length == 1) { resourceType = types[0]; } } } } if(null != resourceType) { c.setResourceType(route, resourceType); resolveResourcePermissions(app, c, route, resourceType); } }
protected MApiResponseBuilder createApiResponse(ApiMetadataContext context, ApiMetadataBuilder m, Route route, Response a) { MApiResponseBuilder resp = new MApiResponseBuilder(); resp.setStatus(a.status()); if(!route.getAction().hasReturnValue()) { return resp; } Class<?> returnType = a.type(); Type genericType = a.genericType(); if(Void.class.equals(returnType)) { returnType = route.getAction().getReturnType(); genericType = route.getAction().getGenericReturnType(); } resolveApiResponseType(context, m, route.getAction().getControllerClass(), returnType, genericType, resp); return resp; }
private String[] tryGetProfiles(MApiOperation o) { if(null == o || null == o.getRoute() || null == o.getRoute().getAction() || null == o.getRoute().getAction().getMethod() || null == o.getRoute().getAction().getMethod().getAnnotation(Doc.class)) { return null; } String[] profiles = o.getRoute().getAction().getMethod().getAnnotation(Doc.class).profile(); return Arrays2.isNotEmpty(profiles) ? profiles : null; }
protected void createApiResponses(ApiMetadataContext context, ApiMetadataBuilder m, Route route, MApiOperationBuilder op) { MApiResponseBuilder[] resps = route.getAction().getExtension(MApiResponseBuilder[].class); if(null != resps && resps.length > 0) { for(MApiResponseBuilder resp : resps) { route.getAction().getAnnotationsByType(Response.class); if(route.getAction().hasReturnValue()) { Class<?> returnType = route.getAction().getReturnType(); Type genericReturnType = route.getAction().getGenericReturnType(); resolveApiResponseType(context, m, route.getAction().getControllerClass(), returnType, genericReturnType, resp);
protected void injectApiBeans(App app, Api api) { Set<Object> controllers = new HashSet<>(); for(ApiRoute ar : api.getConfig().getApiRoutes()) { Route route = ar.getRoute(); //Inject ApiConfig & ApiMetadata. Object controller = route.getAction().getController(); if(null != controller && !controllers.contains(controller)) { controllers.add(controller); ReflectClass rc = ReflectClass.of(controller.getClass()); for(ReflectField rf : rc.getFields()) { if(rf.getType().equals(ApiConfig.class)) { rf.setValue(controller, api.getConfig()); break; } if(rf.getType().equals(ApiMetadata.class)) { rf.setValue(controller, api.getMetadata()); } } if(controller instanceof ApiInitializable) { ((ApiInitializable) controller).postApiInitialized(api); } } } controllers.clear(); }
protected void processOperation(ApiMetadataContext context, MApiOperationBuilder o) { ReflectMethod method = o.getRoute().getAction().getMethod(); //operation if(null != method) { Doc doc = method.getAnnotation(Doc.class); if(null == doc) { doc = searchUp(method); } if(null != doc) { resolveDoc(context, o, doc); } } //parameters o.getParameters().forEach((param) -> processParameter(context, param, method)); }
protected void setApiMethod(ApiMetadataContext context, ApiMetadataBuilder m, Route route, MApiOperationBuilder op) { String method = route.getMethod(); if("*".equals(method)) { boolean hasBodyParameter = false; for(Argument a : route.getAction().getArguments()) { if(a.getLocation() == Location.REQUEST_BODY || a.getLocation() == Location.PART_PARAM) { hasBodyParameter = true; } } if(hasBodyParameter) { op.setMethod(HTTP.Method.POST); }else{ op.setMethod(HTTP.Method.GET); } }else{ op.setMethod(HTTP.Method.valueOf(method)); } }
@Override public MApiOperationBuilder createOperation(ApiMetadataContext context, ApiMetadataBuilder m, Route route) { MApiOperationBuilder op = route.getAction().getExtension(MApiOperationBuilder.class); if(null != op){ op.setRoute(route); return op; } op = new MApiOperationBuilder(route); op.setName(route.getAction().getName()); op.setCorsEnabled(route.isCorsEnabled()); //Set http method setApiMethod(context, m, route, op); log.debug(" {}", op.getMethod()); //Create security createApiSecurity(context, m, route, op); //Create parameters. createApiParameters(context, m, route, op); //Create responses. createApiResponses(context, m, route, op); return op; }
MApiTag[] tags = route.getAction().removeExtension(MApiTag[].class); if(null != tags) { for(MApiTag tag : tags) {
protected boolean isOperationExists(RestdContext context, RouteBuilder route) { for(ApiRoute ar : context.getApiConfig().getApiRoutes()) { Route route1 = ar.getRoute(); if(route.getMethod().equalsIgnoreCase(route1.getMethod()) && route.getPathTemplate().getTemplate().equals(route1.getPathTemplate().getTemplate())) { route.setAction(route1.getAction()); route.setEnabled(false); return true; } } for(RestdOperationSupport support : operationSupports) { if(support.isOperationExists(context, route)) { if(null == route.getEnabled()) { route.setEnabled(false); } return route.isDisabledExplicitly(); } } return false; }
protected void processOperation(ApiMetadataContext context, Map<Class<?>, ClassDoc> docs, MApiOperationBuilder o) { ReflectMethod method = o.getRoute().getAction().getMethod(); //operation if(null != method) { ClassDoc cdoc = resolveClassDoc(docs, method.getDeclaringClass(), false); MethodDoc mdoc = cdoc.methods.get(method.getName()); if(null != mdoc) { if(!Strings.isEmpty(mdoc.description)) { o.setDescription(mdoc.description); } if(!Strings.isEmpty(mdoc.response)) { for(MApiResponseBuilder resp : o.getResponses()) { if(resp.getStatus() >= 200 && resp.getStatus() < 300) { resp.setDescription(mdoc.response); break; } } } //parameters o.getParameters().forEach((param) -> processParameter(context, docs, mdoc, param, method)); } } }
protected void createApiParameters(ApiMetadataContext context, ApiMetadataBuilder m, Route route, MApiOperationBuilder op) { Action action = route.getAction(); log.trace(" Parameters({})", action.getArguments().length); for(Argument a : action.getArguments()) { MApiParameterBuilder p = a.getExtension(MApiParameterBuilder.class); if(null != p) { op.addParameter(p); continue; } if(a.isWrapper()) { createApiWrapperParameter(context, m, route, op, a); if(!a.isRequestBody()) { continue; } } if(!a.isContextual()) { createApiParameter(context, m, route, op, a); } } }
protected void createApiPath(ApiMetadataContext context, ApiMetadataBuilder md, Route route) { PathTemplate pt = route.getPathTemplate(); String pathTemplate = Strings.removeStart(pt.getTemplate(), md.getBasePath()); if(!Strings.startsWith(pathTemplate,"/")){ pathTemplate = "/"+pathTemplate; } MApiPathBuilder path = md.getPath(pathTemplate); if(null == path) { path = new MApiPathBuilder(); path.setPathTemplate(pathTemplate); md.addPath(path); } log.debug("Path {} -> {} :", pt, route.getAction()); path.addOperation(createOperation(context, md, route)); }
protected MApiParameterBuilder createApiParameter(ApiMetadataContext context, ApiMetadataBuilder m, Route route, MApiOperationBuilder op, Argument a) { MApiParameterBuilder p = new MApiParameterBuilder(); p.setName(a.getName()); p.setArgument(a); log.trace("{}", a.getName(), p.getLocation()); if(isParameterFileType(a.getType())) { p.setType(MSimpleTypes.BINARY); p.setFile(true); op.addConsume(MimeTypes.MULTIPART_FORM_DATA); }else{ p.setType(createMType(context, m, route.getAction().getControllerClass(), a.getType(), a.getGenericType())); } p.setLocation(getParameterLocation(context, route.getAction(), a, op, p)); if (null != a.getRequired()) { p.setRequired(a.getRequired()); } else if (p.getLocation() == MApiParameter.Location.PATH) { p.setRequired(true); } if(a.getType().isEnum()){ p.setEnumValues(Enums.getValues(a.getType())); } op.addParameter(p); return p; }
Action action = route.getAction(); if(action instanceof CombinedAction) { action = ((CombinedAction) action).getAction();