Search in sources :

Example 1 with ParamMeta

use of org.webpieces.router.api.extensions.ParamMeta in project webpieces by deanhiller.

the class HibernateLookup method findEntityImpl.

private <T> T findEntityImpl(ParamMeta paramMeta, ParamTreeNode tree, Function<Class<T>, T> beanCreate, EntityManager entityManager) {
    ParamMeta m = paramMeta;
    Class<T> paramTypeToCreate = (Class<T>) m.getFieldClass();
    Metamodel metamodel = entityManager.getMetamodel();
    ManagedType<T> managedType = metamodel.managedType(paramTypeToCreate);
    IdentifiableType<T> entityType = (IdentifiableType<T>) managedType;
    Class<?> idClazz = entityType.getIdType().getJavaType();
    SingularAttribute<? super T, ?> idAttribute = entityType.getId(idClazz);
    String name = idAttribute.getName();
    ParamNode paramNode = tree.get(name);
    String value = null;
    if (paramNode != null) {
        if (!(paramNode instanceof ValueNode))
            throw new IllegalStateException("The id field in the hibernate entity should have matched to a " + "ValueNode on incoming data and did not. node=" + paramNode + ".  bad multipart form?  (Please " + "let us know so we can pair with you on this and I can add better error messaging)");
        ValueNode node = (ValueNode) paramNode;
        value = node.getValue();
    }
    if (value == null)
        return beanCreate.apply(paramTypeToCreate);
    @SuppressWarnings("rawtypes") ObjectStringConverter unmarshaller = translator.getConverter(idClazz);
    Object id = unmarshaller.stringToObject(value);
    UseQuery namedQuery = fetchUseQuery(m.getAnnotations());
    if (namedQuery == null)
        return entityManager.find(paramTypeToCreate, id);
    Query query = entityManager.createNamedQuery(namedQuery.value());
    query.setParameter(namedQuery.id(), id);
    return (T) query.getSingleResult();
}
Also used : IdentifiableType(javax.persistence.metamodel.IdentifiableType) Query(javax.persistence.Query) ParamNode(org.webpieces.router.impl.params.ParamNode) ParamMeta(org.webpieces.router.api.extensions.ParamMeta) ValueNode(org.webpieces.router.impl.params.ValueNode) Metamodel(javax.persistence.metamodel.Metamodel) ObjectStringConverter(org.webpieces.router.api.extensions.ObjectStringConverter)

Example 2 with ParamMeta

use of org.webpieces.router.api.extensions.ParamMeta in project webpieces by deanhiller.

the class ParamToObjectTranslatorImpl method createArgsImpl.

protected XFuture<List<Object>> createArgsImpl(Method method, RequestContext ctx, BodyContentBinder binder) {
    RouterRequest req = ctx.getRequest();
    Parameter[] paramMetas = method.getParameters();
    Annotation[][] paramAnnotations = method.getParameterAnnotations();
    ParamTreeNode paramTree = new ParamTreeNode();
    // For multipart AND for query params such as ?var=xxx&var=yyy&var2=xxx AND for url path params /mypath/{var1}/account/{id}
    // query params first
    Map<String, String> queryParams = translate(req.queryParams);
    treeCreator.createTree(paramTree, queryParams, FromEnum.QUERY_PARAM);
    // next multi-part params
    Map<String, String> multiPartParams = translate(req.multiPartFields);
    treeCreator.createTree(paramTree, multiPartParams, FromEnum.FORM_MULTIPART);
    // lastly path params
    treeCreator.createTree(paramTree, ctx.getPathParams(), FromEnum.URL_PATH);
    List<Object> results = new ArrayList<>();
    XFuture<List<Object>> future = XFuture.completedFuture(results);
    for (int i = 0; i < paramMetas.length; i++) {
        Parameter paramMeta = paramMetas[i];
        Annotation[] annotations = paramAnnotations[i];
        ParamMeta fieldMeta = new ParamMeta(method, paramMeta, annotations);
        String name = fieldMeta.getName();
        ParamNode paramNode = paramTree.get(name);
        XFuture<Object> beanFuture;
        if (binder != null && isManagedBy(binder, fieldMeta)) {
            Object bean = binder.unmarshal(ctx, fieldMeta, req.body.createByteArray());
            beanFuture = XFuture.completedFuture(bean);
        } else {
            beanFuture = translate(req, method, paramNode, fieldMeta, ctx.getValidation());
        }
        future = future.thenCompose(list -> {
            return beanFuture.thenApply(bean -> {
                list.add(bean);
                return list;
            });
        });
    }
    return future;
}
Also used : SneakyThrow(org.webpieces.util.exceptions.SneakyThrow) HashMap(java.util.HashMap) Singleton(javax.inject.Singleton) ArrayList(java.util.ArrayList) Inject(javax.inject.Inject) NotFoundException(org.webpieces.http.exception.NotFoundException) RouterRequest(org.webpieces.ctx.api.RouterRequest) EntityLookup(org.webpieces.router.api.extensions.EntityLookup) RequestContext(org.webpieces.ctx.api.RequestContext) Meta(org.webpieces.router.api.extensions.Meta) Parameter(java.lang.reflect.Parameter) IllegalArgException(org.webpieces.router.api.exceptions.IllegalArgException) Map(java.util.Map) DataMismatchException(org.webpieces.router.api.exceptions.DataMismatchException) Method(java.lang.reflect.Method) BadRequestException(org.webpieces.http.exception.BadRequestException) Validation(org.webpieces.ctx.api.Validation) ParamMeta(org.webpieces.router.api.extensions.ParamMeta) Set(java.util.Set) Field(java.lang.reflect.Field) InvocationTargetException(java.lang.reflect.InvocationTargetException) List(java.util.List) HttpMethod(org.webpieces.ctx.api.HttpMethod) ParameterizedType(java.lang.reflect.ParameterizedType) XFuture(org.webpieces.util.futures.XFuture) Type(java.lang.reflect.Type) Annotation(java.lang.annotation.Annotation) ObjectStringConverter(org.webpieces.router.api.extensions.ObjectStringConverter) BodyContentBinder(org.webpieces.router.api.extensions.BodyContentBinder) ArrayList(java.util.ArrayList) Annotation(java.lang.annotation.Annotation) ParamMeta(org.webpieces.router.api.extensions.ParamMeta) Parameter(java.lang.reflect.Parameter) ArrayList(java.util.ArrayList) List(java.util.List) RouterRequest(org.webpieces.ctx.api.RouterRequest)

Example 3 with ParamMeta

use of org.webpieces.router.api.extensions.ParamMeta in project webpieces by deanhiller.

the class DtoLookup method find.

@SuppressWarnings("unchecked")
@Override
public <T> XFuture<T> find(Meta paramMeta, ParamTreeNode tree, Function<Class<T>, T> beanCreate) {
    if (!(paramMeta instanceof ParamMeta))
        throw new UnsupportedOperationException("this plugin does not support type=" + paramMeta.getClass());
    ParamMeta m = (ParamMeta) paramMeta;
    Class<T> paramTypeToCreate = (Class<T>) m.getFieldClass();
    Dto annotation = paramTypeToCreate.getAnnotation(Dto.class);
    // EntityManager entityManager = Em.get();
    // Metamodel metamodel = entityManager.getMetamodel();
    // ManagedType<T> managedType = metamodel.managedType(paramTypeToCreate);
    // IdentifiableType<T> entityType = (IdentifiableType<T>) managedType;
    Method method;
    try {
        method = paramTypeToCreate.getMethod("getId");
    } catch (NoSuchMethodException | SecurityException e) {
        throw new IllegalStateException("Class=" + paramTypeToCreate.getName() + " has an annotation @Dto and this requires that dto to have a method getId, but we could not find that method", e);
    }
    Class<?> idClazz = method.getReturnType();
    // SingularAttribute<? super T, ?> idAttribute = entityType.getId(idClazz);
    // String name = idAttribute.getName();
    String name = "id";
    ParamNode paramNode = tree.get(name);
    String value = null;
    if (paramNode != null) {
        if (!(paramNode instanceof ValueNode))
            throw new IllegalStateException("The id field in the DTO should have matched to a " + "ValueNode on incoming data and did not. node=" + paramNode + ".  bad multipart form?  (Please " + "let us know so we can pair with you on this and I can add better error messaging)");
        ValueNode node = (ValueNode) paramNode;
        value = node.getValue();
    }
    if (value == null) {
        T theBean = beanCreate.apply(paramTypeToCreate);
        return XFuture.completedFuture(theBean);
    }
    @SuppressWarnings("rawtypes") ObjectStringConverter unmarshaller = translator.getConverter(idClazz);
    Object id = unmarshaller.stringToObject(value);
    Class lookupClass = annotation.lookupClass();
    String function = annotation.function();
    Object instance = webInjector.getCurrentInjector().getInstance(lookupClass);
    Method lookupMethod;
    try {
        lookupMethod = lookupClass.getMethod(function, idClazz);
    } catch (NoSuchMethodException | SecurityException e) {
        throw new IllegalArgumentException("Your function in @Dto='XFuture<" + paramTypeToCreate + "> " + function + "(" + idClazz.getName() + ")' on class=" + lookupClass.getName() + " cannot be found.  We also did not find method='" + paramTypeToCreate + " " + function + "(" + idClazz.getName() + ")'");
    }
    Object result;
    try {
        result = lookupMethod.invoke(instance, id);
    } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
        throw new RuntimeException("Exception invoking lookup method", e);
    }
    if (result instanceof XFuture) {
        return (XFuture<T>) result;
    }
    return (XFuture<T>) XFuture.completedFuture(result);
}
Also used : XFuture(org.webpieces.util.futures.XFuture) ParamNode(org.webpieces.router.impl.params.ParamNode) Method(java.lang.reflect.Method) InvocationTargetException(java.lang.reflect.InvocationTargetException) ParamMeta(org.webpieces.router.api.extensions.ParamMeta) ValueNode(org.webpieces.router.impl.params.ValueNode) ObjectStringConverter(org.webpieces.router.api.extensions.ObjectStringConverter)

Aggregations

ObjectStringConverter (org.webpieces.router.api.extensions.ObjectStringConverter)3 ParamMeta (org.webpieces.router.api.extensions.ParamMeta)3 InvocationTargetException (java.lang.reflect.InvocationTargetException)2 Method (java.lang.reflect.Method)2 ParamNode (org.webpieces.router.impl.params.ParamNode)2 ValueNode (org.webpieces.router.impl.params.ValueNode)2 XFuture (org.webpieces.util.futures.XFuture)2 Annotation (java.lang.annotation.Annotation)1 Field (java.lang.reflect.Field)1 Parameter (java.lang.reflect.Parameter)1 ParameterizedType (java.lang.reflect.ParameterizedType)1 Type (java.lang.reflect.Type)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 List (java.util.List)1 Map (java.util.Map)1 Set (java.util.Set)1 Inject (javax.inject.Inject)1 Singleton (javax.inject.Singleton)1 Query (javax.persistence.Query)1