Search in sources :

Example 6 with InboundVariable

use of org.directwebremoting.extend.InboundVariable in project ma-core-public by infiniteautomation.

the class ArrayConverter method convertInbound.

/* (non-Javadoc)
     * @see org.directwebremoting.Converter#convertInbound(java.lang.Class, org.directwebremoting.InboundVariable, org.directwebremoting.InboundContext)
     */
public Object convertInbound(Class paramType, InboundVariable iv, InboundContext inctx) throws MarshallException {
    if (!paramType.isArray()) {
        throw new MarshallException(paramType);
    }
    String value = iv.getValue();
    if (value.startsWith(ProtocolConstants.INBOUND_ARRAY_START)) {
        value = value.substring(1);
    }
    if (value.endsWith(ProtocolConstants.INBOUND_ARRAY_END)) {
        value = value.substring(0, value.length() - 1);
    }
    StringTokenizer st = new StringTokenizer(value, ProtocolConstants.INBOUND_ARRAY_SEPARATOR);
    int size = st.countTokens();
    Class componentType = paramType.getComponentType();
    // componentType = LocalUtil.getNonPrimitiveType(componentType);
    Object array = Array.newInstance(componentType, size);
    // We should put the new object into the working map in case it
    // is referenced later nested down in the conversion process.
    inctx.addConverted(iv, paramType, array);
    InboundContext incx = iv.getLookup();
    for (int i = 0; i < size; i++) {
        String token = st.nextToken();
        String[] split = ParseUtil.splitInbound(token);
        String splitType = split[LocalUtil.INBOUND_INDEX_TYPE];
        String splitValue = split[LocalUtil.INBOUND_INDEX_VALUE];
        InboundVariable nested = new InboundVariable(incx, null, splitType, splitValue);
        Object output = converterManager.convertInbound(componentType, nested, inctx, inctx.getCurrentTypeHintContext());
        Array.set(array, i, output);
    }
    return array;
}
Also used : StringTokenizer(java.util.StringTokenizer) InboundContext(org.directwebremoting.extend.InboundContext) MarshallException(org.directwebremoting.extend.MarshallException) InboundVariable(org.directwebremoting.extend.InboundVariable)

Example 7 with InboundVariable

use of org.directwebremoting.extend.InboundVariable in project ma-core-public by infiniteautomation.

the class MapConverter method convertInbound.

/* (non-Javadoc)
     * @see org.directwebremoting.Converter#convertInbound(java.lang.Class, org.directwebremoting.InboundVariable, org.directwebremoting.InboundContext)
     */
public Object convertInbound(Class paramType, InboundVariable iv, InboundContext inctx) throws MarshallException {
    String value = iv.getValue();
    // If the text is null then the whole bean is null
    if (value.trim().equals(ProtocolConstants.INBOUND_NULL)) {
        return null;
    }
    if (!value.startsWith(ProtocolConstants.INBOUND_MAP_START)) {
        throw new IllegalArgumentException(Messages.getString("MapConverter.FormatError", ProtocolConstants.INBOUND_MAP_START));
    }
    if (!value.endsWith(ProtocolConstants.INBOUND_MAP_END)) {
        throw new IllegalArgumentException(Messages.getString("MapConverter.FormatError", ProtocolConstants.INBOUND_MAP_END));
    }
    value = value.substring(1, value.length() - 1);
    try {
        // Maybe we ought to check that the paramType isn't expecting a more
        // distinct type of Map and attempt to create that?
        Map map;
        // If paramType is concrete then just use whatever we've got.
        if (!paramType.isInterface() && !Modifier.isAbstract(paramType.getModifiers())) {
            // If there is a problem creating the type then we have no way
            // of completing this - they asked for a specific type and we
            // can't create that type. I don't know of a way of finding
            // subclasses that might be instaniable so we accept failure.
            map = (Map) paramType.newInstance();
        } else {
            map = new HashMap();
        }
        // Get the extra type info
        TypeHintContext thc = inctx.getCurrentTypeHintContext();
        TypeHintContext keyThc = thc.createChildContext(0);
        Class keyType = keyThc.getExtraTypeInfo();
        TypeHintContext valThc = thc.createChildContext(1);
        Class valType = valThc.getExtraTypeInfo();
        // We should put the new object into the working map in case it
        // is referenced later nested down in the conversion process.
        inctx.addConverted(iv, paramType, map);
        InboundContext incx = iv.getLookup();
        // Loop through the property declarations
        StringTokenizer st = new StringTokenizer(value, ",");
        int size = st.countTokens();
        for (int i = 0; i < size; i++) {
            String token = st.nextToken();
            if (token.trim().length() == 0) {
                continue;
            }
            int colonpos = token.indexOf(ProtocolConstants.INBOUND_MAP_ENTRY);
            if (colonpos == -1) {
                throw new MarshallException(paramType, Messages.getString("MapConverter.MissingSeparator", ProtocolConstants.INBOUND_MAP_ENTRY, token));
            }
            // Convert the value part of the token by splitting it into the
            // type and value (as passed in by Javascript)
            String valStr = token.substring(colonpos + 1).trim();
            String[] splitIv = ParseUtil.splitInbound(valStr);
            String splitIvValue = splitIv[LocalUtil.INBOUND_INDEX_VALUE];
            String splitIvType = splitIv[LocalUtil.INBOUND_INDEX_TYPE];
            InboundVariable valIv = new InboundVariable(incx, null, splitIvType, splitIvValue);
            Object val = config.convertInbound(valType, valIv, inctx, valThc);
            // Keys (unlike values) do not have type info passed with them
            // Could we have recurrsive key? - I don't think so because keys
            // must be strings in Javascript
            String keyStr = token.substring(0, colonpos).trim();
            // String[] keySplit = LocalUtil.splitInbound(keyStr);
            // InboundVariable keyIv = new InboundVariable(incx, splitIv[LocalUtil.INBOUND_INDEX_TYPE], splitIv[LocalUtil.INBOUND_INDEX_VALUE]);
            InboundVariable keyIv = new InboundVariable(incx, null, ProtocolConstants.TYPE_STRING, keyStr);
            Object key = config.convertInbound(keyType, keyIv, inctx, keyThc);
            map.put(key, val);
        }
        return map;
    } catch (MarshallException ex) {
        throw ex;
    } catch (Exception ex) {
        throw new MarshallException(paramType, ex);
    }
}
Also used : TypeHintContext(org.directwebremoting.extend.TypeHintContext) HashMap(java.util.HashMap) InboundContext(org.directwebremoting.extend.InboundContext) InboundVariable(org.directwebremoting.extend.InboundVariable) MarshallException(org.directwebremoting.extend.MarshallException) StringTokenizer(java.util.StringTokenizer) MarshallException(org.directwebremoting.extend.MarshallException) HashMap(java.util.HashMap) Map(java.util.Map)

Example 8 with InboundVariable

use of org.directwebremoting.extend.InboundVariable in project ma-core-public by infiniteautomation.

the class BaseCallMarshaller method marshallInbound.

/* (non-Javadoc)
     * @see org.directwebremoting.extend.Marshaller#marshallInbound(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
     */
public Calls marshallInbound(HttpServletRequest request, HttpServletResponse response) throws IOException, ServerException {
    // We must parse the parameters before we setup the conduit because it's
    // only after doing this that we know the scriptSessionId
    WebContext webContext = WebContextFactory.get();
    Batch batch = (Batch) request.getAttribute(ATTRIBUTE_BATCH);
    if (batch == null) {
        batch = new Batch(request, crossDomainSessionSecurity, allowGetForSafariButMakeForgeryEasier, sessionCookieName);
        // Save calls for retry exception
        request.setAttribute(ATTRIBUTE_BATCH, batch);
    }
    // Various bits of the Batch need to be stashed away places
    storeParsedRequest(request, webContext, batch);
    Calls calls = batch.getCalls();
    // Debug the environment
    if (log.isDebugEnabled() && calls.getCallCount() > 0) {
        // We can just use 0 because they are all shared
        InboundContext inctx = (InboundContext) batch.getInboundContexts().get(0);
        StringBuffer buffer = new StringBuffer();
        for (Iterator it = inctx.getInboundVariableNames(); it.hasNext(); ) {
            String key = (String) it.next();
            InboundVariable value = inctx.getInboundVariable(key);
            if (key.startsWith(ProtocolConstants.INBOUND_CALLNUM_PREFIX) && key.indexOf(ProtocolConstants.INBOUND_CALLNUM_SUFFIX + ProtocolConstants.INBOUND_KEY_ENV) != -1) {
                buffer.append(key);
                buffer.append('=');
                buffer.append(value.toString());
                buffer.append(", ");
            }
        }
        if (buffer.length() > 0) {
            log.debug("Environment:  " + buffer.toString());
        }
    }
    callLoop: for (int callNum = 0; callNum < calls.getCallCount(); callNum++) {
        Call call = calls.getCall(callNum);
        InboundContext inctx = (InboundContext) batch.getInboundContexts().get(callNum);
        // Get a list of the available matching methods with the coerced
        // parameters that we will use to call it if we choose to use
        // that method.
        Creator creator = creatorManager.getCreator(call.getScriptName());
        // Which method are we using?
        Method method = findMethod(call, inctx);
        if (method == null) {
            String name = call.getScriptName() + '.' + call.getMethodName();
            String error = Messages.getString("BaseCallMarshaller.UnknownMethod", name);
            log.warn("Marshalling exception: " + error);
            call.setMethod(null);
            call.setParameters(null);
            call.setException(new IllegalArgumentException(error));
            continue callLoop;
        }
        call.setMethod(method);
        // Check this method is accessible
        accessControl.assertExecutionIsPossible(creator, call.getScriptName(), method);
        // Convert all the parameters to the correct types
        Object[] params = new Object[method.getParameterTypes().length];
        for (int j = 0; j < method.getParameterTypes().length; j++) {
            try {
                Class paramType = method.getParameterTypes()[j];
                InboundVariable param = inctx.getParameter(callNum, j);
                TypeHintContext incc = new TypeHintContext(converterManager, method, j);
                params[j] = converterManager.convertInbound(paramType, param, inctx, incc);
            } catch (MarshallException ex) {
                log.warn("Marshalling exception", ex);
                call.setMethod(null);
                call.setParameters(null);
                call.setException(ex);
                continue callLoop;
            }
        }
        call.setParameters(params);
    }
    return calls;
}
Also used : Call(org.directwebremoting.extend.Call) WebContext(org.directwebremoting.WebContext) TypeHintContext(org.directwebremoting.extend.TypeHintContext) InboundContext(org.directwebremoting.extend.InboundContext) Calls(org.directwebremoting.extend.Calls) InboundVariable(org.directwebremoting.extend.InboundVariable) Creator(org.directwebremoting.extend.Creator) Method(java.lang.reflect.Method) MarshallException(org.directwebremoting.extend.MarshallException) Iterator(java.util.Iterator)

Aggregations

InboundVariable (org.directwebremoting.extend.InboundVariable)8 MarshallException (org.directwebremoting.extend.MarshallException)8 TypeHintContext (org.directwebremoting.extend.TypeHintContext)7 Map (java.util.Map)5 Iterator (java.util.Iterator)4 Property (org.directwebremoting.extend.Property)4 StringTokenizer (java.util.StringTokenizer)3 TreeMap (java.util.TreeMap)3 InboundContext (org.directwebremoting.extend.InboundContext)3 ArrayList (java.util.ArrayList)2 HashMap (java.util.HashMap)2 DynaClass (org.apache.commons.beanutils.DynaClass)2 FlexClass (org.jaffa.flexfields.FlexClass)2 Method (java.lang.reflect.Method)1 Collection (java.util.Collection)1 HashSet (java.util.HashSet)1 Entry (java.util.Map.Entry)1 Set (java.util.Set)1 SortedSet (java.util.SortedSet)1 TreeSet (java.util.TreeSet)1