Search in sources :

Example 1 with Argument

use of lucee.runtime.type.scope.Argument in project Lucee by lucee.

the class Query method doEndTag.

@Override
public int doEndTag() throws PageException {
    if (hasChangedPSQ)
        pageContext.setPsq(orgPSQ);
    String strSQL = bodyContent.getString().trim();
    if (strSQL.isEmpty())
        throw new DatabaseException("no sql string defined, inside query tag", null, null, null);
    try {
        // cannot use attribute params and queryparam tag
        if (!items.isEmpty() && params != null)
            throw new DatabaseException("you cannot use the attribute params and sub tags queryparam at the same time", null, null, null);
        // create SQL
        SQL sql;
        if (params != null) {
            if (params instanceof Argument)
                sql = QueryParamConverter.convert(strSQL, (Argument) params);
            else if (Decision.isArray(params))
                sql = QueryParamConverter.convert(strSQL, Caster.toArray(params));
            else if (Decision.isStruct(params))
                sql = QueryParamConverter.convert(strSQL, Caster.toStruct(params));
            else
                throw new DatabaseException("value of the attribute [params] has to be a struct or a array", null, null, null);
        } else {
            sql = items.isEmpty() ? new SQLImpl(strSQL) : new SQLImpl(strSQL, items.toArray(new SQLItem[items.size()]));
        }
        // lucee.runtime.type.Query query=null;
        QueryResult queryResult = null;
        String cacheHandlerId = null;
        String cacheId = null;
        long exe = 0;
        boolean useCache = (cachedWithin != null) || (cachedAfter != null);
        CacheHandler cacheHandler = null;
        if (useCache) {
            cacheId = CacheHandlerCollectionImpl.createId(sql, datasource != null ? datasource.getName() : null, username, password, returntype);
            CacheHandlerCollectionImpl coll = (CacheHandlerCollectionImpl) pageContext.getConfig().getCacheHandlerCollection(Config.CACHE_TYPE_QUERY, null);
            cacheHandler = coll.getInstanceMatchingObject(cachedWithin, null);
            if (cacheHandler == null && cachedAfter != null)
                cacheHandler = coll.getTimespanInstance(null);
            if (cacheHandler != null) {
                // cacheHandlerId specifies to queryResult the cacheType and therefore whether the query is cached or
                cacheHandlerId = cacheHandler.id();
                if (cacheHandler instanceof CacheHandlerPro) {
                    CacheItem cacheItem = ((CacheHandlerPro) cacheHandler).get(pageContext, cacheId, (cachedWithin != null) ? cachedWithin : cachedAfter);
                    if (cacheItem instanceof QueryResultCacheItem)
                        queryResult = ((QueryResultCacheItem) cacheItem).getQueryResult();
                } else {
                    // FUTURE this else block can be removed when all cache handlers implement CacheHandlerPro
                    CacheItem cacheItem = cacheHandler.get(pageContext, cacheId);
                    if (cacheItem instanceof QueryResultCacheItem) {
                        QueryResultCacheItem queryCachedItem = (QueryResultCacheItem) cacheItem;
                        Date cacheLimit = cachedAfter;
                        if (cacheLimit == null || queryCachedItem.isCachedAfter(cacheLimit))
                            queryResult = queryCachedItem.getQueryResult();
                    }
                }
            } else {
                List<String> patterns = pageContext.getConfig().getCacheHandlerCollection(Config.CACHE_TYPE_QUERY, null).getPatterns();
                throw new ApplicationException("cachedwithin value [" + cachedWithin + "] is invalid, valid values are for example [" + ListUtil.listToList(patterns, ", ") + "]");
            }
        // query=pageContext.getQueryCache().getQuery(pageContext,sql,datasource!=null?datasource.getName():null,username,password,cachedafter);
        }
        // cache not found, process and cache result if needed
        if (queryResult == null) {
            // QoQ
            if ("query".equals(dbtype)) {
                lucee.runtime.type.Query q = executeQoQ(sql);
                if (returntype == RETURN_TYPE_ARRAY)
                    // TODO this should be done in queryExecute itself so we not have to convert afterwards
                    queryResult = QueryArray.toQueryArray(q);
                else if (returntype == RETURN_TYPE_STRUCT) {
                    if (columnName == null)
                        throw new ApplicationException("attribute columnKey is required when return type is set to struct");
                    // TODO this should be done in queryExecute itself so we not have to convert
                    queryResult = QueryStruct.toQueryStruct(q, columnName);
                // afterwards
                } else
                    queryResult = (QueryResult) q;
            } else // ORM and Datasource
            {
                long start = System.nanoTime();
                Object obj;
                if ("orm".equals(dbtype) || "hql".equals(dbtype))
                    obj = executeORM(sql, returntype, ormoptions);
                else
                    obj = executeDatasoure(sql, result != null, pageContext.getTimeZone());
                if (obj instanceof QueryResult) {
                    queryResult = (QueryResult) obj;
                } else {
                    if (setReturnVariable) {
                        rtn = obj;
                    } else if (!StringUtil.isEmpty(name)) {
                        pageContext.setVariable(name, obj);
                    }
                    if (result != null) {
                        Struct sct = new StructImpl();
                        sct.setEL(KeyConstants._cached, Boolean.FALSE);
                        long time = System.nanoTime() - start;
                        sct.setEL(KeyConstants._executionTime, Caster.toDouble(time / 1000000));
                        sct.setEL(KeyConstants._executionTimeNano, Caster.toDouble(time));
                        sct.setEL(KeyConstants._SQL, sql.getSQLString());
                        if (Decision.isArray(obj)) {
                        } else
                            sct.setEL(KeyConstants._RECORDCOUNT, Caster.toDouble(1));
                        pageContext.setVariable(result, sct);
                    } else
                        setExecutionTime((System.nanoTime() - start) / 1000000);
                    return EVAL_PAGE;
                }
            }
            if (cachedWithin != null) {
                CacheItem cacheItem = QueryResultCacheItem.newInstance(queryResult, tags, datasource, null);
                if (cacheItem != null)
                    cacheHandler.set(pageContext, cacheId, cachedWithin, cacheItem);
            }
            exe = queryResult.getExecutionTime();
        } else {
            queryResult.setCacheType(cacheHandlerId);
        }
        if (pageContext.getConfig().debug() && debug) {
            boolean logdb = ((ConfigImpl) pageContext.getConfig()).hasDebugOptions(ConfigImpl.DEBUG_DATABASE);
            if (logdb) {
                boolean debugUsage = DebuggerImpl.debugQueryUsage(pageContext, queryResult);
                DebuggerImpl di = (DebuggerImpl) pageContext.getDebugger();
                di.addQuery(debugUsage ? queryResult : null, datasource != null ? datasource.getName() : null, name, sql, queryResult.getRecordcount(), getPageSource(), exe);
            }
        }
        if (setReturnVariable) {
            rtn = queryResult;
        } else if ((queryResult.getColumncount() + queryResult.getRecordcount()) > 0 && !StringUtil.isEmpty(name)) {
            pageContext.setVariable(name, queryResult);
        }
        // Result
        if (result != null) {
            Struct sct = new StructImpl();
            sct.setEL(KeyConstants._cached, Caster.toBoolean(queryResult.isCached()));
            if ((queryResult.getColumncount() + queryResult.getRecordcount()) > 0) {
                String list = ListUtil.arrayToList(queryResult instanceof lucee.runtime.type.Query ? ((lucee.runtime.type.Query) queryResult).getColumnNamesAsString() : CollectionUtil.toString(queryResult.getColumnNames(), false), ",");
                sct.setEL(KeyConstants._COLUMNLIST, list);
            }
            int rc = queryResult.getRecordcount();
            if (rc == 0)
                rc = queryResult.getUpdateCount();
            sct.setEL(KeyConstants._RECORDCOUNT, Caster.toDouble(rc));
            sct.setEL(KeyConstants._executionTime, Caster.toDouble(queryResult.getExecutionTime() / 1000000));
            sct.setEL(KeyConstants._executionTimeNano, Caster.toDouble(queryResult.getExecutionTime()));
            sct.setEL(KeyConstants._SQL, sql.getSQLString());
            // GENERATED KEYS
            lucee.runtime.type.Query qi = Caster.toQuery(queryResult, null);
            if (qi != null) {
                lucee.runtime.type.Query qryKeys = qi.getGeneratedKeys();
                if (qryKeys != null) {
                    StringBuilder generatedKey = new StringBuilder(), sb;
                    Collection.Key[] columnNames = qryKeys.getColumnNames();
                    QueryColumn column;
                    for (int c = 0; c < columnNames.length; c++) {
                        column = qryKeys.getColumn(columnNames[c]);
                        sb = new StringBuilder();
                        int size = column.size();
                        for (int row = 1; row <= size; row++) {
                            if (row > 1)
                                sb.append(',');
                            sb.append(Caster.toString(column.get(row, null)));
                        }
                        if (sb.length() > 0) {
                            sct.setEL(columnNames[c], sb.toString());
                            if (generatedKey.length() > 0)
                                generatedKey.append(',');
                            generatedKey.append(sb);
                        }
                    }
                    if (generatedKey.length() > 0)
                        sct.setEL(GENERATEDKEY, generatedKey.toString());
                }
            }
            // sqlparameters
            SQLItem[] params = sql.getItems();
            if (params != null && params.length > 0) {
                Array arr = new ArrayImpl();
                sct.setEL(SQL_PARAMETERS, arr);
                for (int i = 0; i < params.length; i++) {
                    arr.append(params[i].getValue());
                }
            }
            pageContext.setVariable(result, sct);
        } else // cfquery.executiontime
        {
            setExecutionTime(exe / 1000000);
        }
        // listener
        ((ConfigWebImpl) pageContext.getConfig()).getActionMonitorCollector().log(pageContext, "query", "Query", exe, queryResult);
        // log
        Log log = pageContext.getConfig().getLog("datasource");
        if (log.getLogLevel() >= Log.LEVEL_INFO) {
            log.info("query tag", "executed [" + sql.toString().trim() + "] in " + DecimalFormat.call(pageContext, exe / 1000000D) + " ms");
        }
    } catch (PageException pe) {
        // log
        pageContext.getConfig().getLog("datasource").error("query tag", pe);
        throw pe;
    } finally {
        ((PageContextImpl) pageContext).setTimestampWithTSOffset(previousLiteralTimestampWithTSOffset);
        if (tmpTZ != null) {
            pageContext.setTimeZone(tmpTZ);
        }
    }
    return EVAL_PAGE;
}
Also used : SQLImpl(lucee.runtime.db.SQLImpl) Argument(lucee.runtime.type.scope.Argument) SimpleQuery(lucee.runtime.type.query.SimpleQuery) ArrayImpl(lucee.runtime.type.ArrayImpl) DebuggerImpl(lucee.runtime.debug.DebuggerImpl) SQLItem(lucee.runtime.db.SQLItem) QueryStruct(lucee.runtime.type.query.QueryStruct) Struct(lucee.runtime.type.Struct) QueryResult(lucee.runtime.type.query.QueryResult) CacheHandlerPro(lucee.runtime.cache.tag.CacheHandlerPro) PageException(lucee.runtime.exp.PageException) Log(lucee.commons.io.log.Log) PageContextImpl(lucee.runtime.PageContextImpl) QueryResultCacheItem(lucee.runtime.cache.tag.query.QueryResultCacheItem) Date(java.util.Date) SQL(lucee.runtime.db.SQL) Array(lucee.runtime.type.Array) QueryArray(lucee.runtime.type.query.QueryArray) ApplicationException(lucee.runtime.exp.ApplicationException) StructImpl(lucee.runtime.type.StructImpl) QueryColumn(lucee.runtime.type.QueryColumn) CacheHandlerCollectionImpl(lucee.runtime.cache.tag.CacheHandlerCollectionImpl) QueryResultCacheItem(lucee.runtime.cache.tag.query.QueryResultCacheItem) CacheItem(lucee.runtime.cache.tag.CacheItem) CacheHandler(lucee.runtime.cache.tag.CacheHandler) DatabaseException(lucee.runtime.exp.DatabaseException) ConfigImpl(lucee.runtime.config.ConfigImpl) Key(lucee.runtime.type.Collection.Key)

Example 2 with Argument

use of lucee.runtime.type.scope.Argument in project Lucee by lucee.

the class ChildThreadImpl method execute.

public PageException execute(Config config) {
    PageContext oldPc = ThreadLocalPageContext.get();
    Page p = page;
    PageContextImpl pc = null;
    try {
        // deamon
        if (this.pc != null) {
            pc = this.pc;
            ThreadLocalPageContext.register(pc);
        } else // task
        {
            ConfigWebImpl cwi;
            try {
                cwi = (ConfigWebImpl) config;
                DevNullOutputStream os = DevNullOutputStream.DEV_NULL_OUTPUT_STREAM;
                pc = ThreadUtil.createPageContext(cwi, os, serverName, requestURI, queryString, SerializableCookie.toCookies(cookies), headers, null, parameters, attributes, true, -1);
                pc.setRequestTimeout(requestTimeout);
                p = PageSourceImpl.loadPage(pc, cwi.getPageSources(oldPc == null ? pc : oldPc, null, template, false, false, true));
            // p=cwi.getPageSources(oldPc,null, template, false,false,true).loadPage(cwi);
            } catch (PageException e) {
                return e;
            }
            pc.addPageSource(p.getPageSource(), true);
        }
        threadScope = pc.getThreadScope(KeyConstants._cfthread, null);
        pc.setCurrentThreadScope(new ThreadsImpl(this));
        pc.setThread(Thread.currentThread());
        // String encodings = pc.getHttpServletRequest().getHeader("Accept-Encoding");
        Undefined undefined = pc.us();
        Argument newArgs = new ArgumentThreadImpl((Struct) Duplicator.duplicate(attrs, false));
        LocalImpl newLocal = pc.getScopeFactory().getLocalInstance();
        // Key[] keys = attrs.keys();
        Iterator<Entry<Key, Object>> it = attrs.entryIterator();
        Entry<Key, Object> e;
        while (it.hasNext()) {
            e = it.next();
            newArgs.setEL(e.getKey(), e.getValue());
        }
        newLocal.setEL(KEY_ATTRIBUTES, newArgs);
        Argument oldArgs = pc.argumentsScope();
        Local oldLocal = pc.localScope();
        int oldMode = undefined.setMode(Undefined.MODE_LOCAL_OR_ARGUMENTS_ALWAYS);
        pc.setFunctionScopes(newLocal, newArgs);
        try {
            p.threadCall(pc, threadIndex);
        } catch (Throwable t) {
            ExceptionUtil.rethrowIfNecessary(t);
            if (!Abort.isSilentAbort(t)) {
                ConfigWeb c = pc.getConfig();
                if (c instanceof ConfigImpl) {
                    ConfigImpl ci = (ConfigImpl) c;
                    Log log = ci.getLog("thread");
                    if (log != null)
                        LogUtil.log(log, Log.LEVEL_ERROR, this.getName(), t);
                }
                PageException pe = Caster.toPageException(t);
                if (!serializable)
                    catchBlock = pe.getCatchBlock(pc.getConfig());
                return pe;
            }
        } finally {
            completed = true;
            pc.setFunctionScopes(oldLocal, oldArgs);
            undefined.setMode(oldMode);
            // pc.getScopeFactory().recycle(newArgs);
            pc.getScopeFactory().recycle(pc, newLocal);
            if (pc.getHttpServletResponse() instanceof HttpServletResponseDummy) {
                HttpServletResponseDummy rsp = (HttpServletResponseDummy) pc.getHttpServletResponse();
                pc.flush();
                contentType = rsp.getContentType();
                Pair<String, Object>[] _headers = rsp.getHeaders();
                if (_headers != null)
                    for (int i = 0; i < _headers.length; i++) {
                        if (_headers[i].getName().equalsIgnoreCase("Content-Encoding"))
                            contentEncoding = Caster.toString(_headers[i].getValue(), null);
                    }
            }
        }
    } finally {
        pc.getConfig().getFactory().releaseLuceePageContext(pc, true);
        pc = null;
        if (oldPc != null)
            ThreadLocalPageContext.register(oldPc);
    }
    return null;
}
Also used : Argument(lucee.runtime.type.scope.Argument) Page(lucee.runtime.Page) Entry(java.util.Map.Entry) ThreadLocalPageContext(lucee.runtime.engine.ThreadLocalPageContext) PageContext(lucee.runtime.PageContext) LocalImpl(lucee.runtime.type.scope.LocalImpl) Pair(lucee.commons.lang.Pair) PageException(lucee.runtime.exp.PageException) Undefined(lucee.runtime.type.scope.Undefined) Log(lucee.commons.io.log.Log) Local(lucee.runtime.type.scope.Local) PageContextImpl(lucee.runtime.PageContextImpl) ConfigWeb(lucee.runtime.config.ConfigWeb) DevNullOutputStream(lucee.commons.io.DevNullOutputStream) ArgumentThreadImpl(lucee.runtime.type.scope.ArgumentThreadImpl) ConfigWebImpl(lucee.runtime.config.ConfigWebImpl) HttpServletResponseDummy(lucee.runtime.net.http.HttpServletResponseDummy) Key(lucee.runtime.type.Collection.Key) ConfigImpl(lucee.runtime.config.ConfigImpl)

Example 3 with Argument

use of lucee.runtime.type.scope.Argument in project Lucee by lucee.

the class UDFImpl method _call.

private Object _call(PageContext pc, Collection.Key calledName, Object[] args, Struct values, boolean doIncludePath) throws PageException {
    // print.out(count++);
    PageContextImpl pci = (PageContextImpl) pc;
    Argument newArgs = pci.getScopeFactory().getArgumentInstance();
    newArgs.setFunctionArgumentNames(properties.getArgumentsSet());
    LocalImpl newLocal = pci.getScopeFactory().getLocalInstance();
    Undefined undefined = pc.undefinedScope();
    Argument oldArgs = pc.argumentsScope();
    Local oldLocal = pc.localScope();
    Collection.Key oldCalledName = pci.getActiveUDFCalledName();
    pc.setFunctionScopes(newLocal, newArgs);
    pci.setActiveUDFCalledName(calledName);
    int oldCheckArgs = undefined.setMode(pc.getCurrentTemplateDialect() == CFMLEngine.DIALECT_CFML ? (properties.getLocalMode() == null ? pc.getApplicationContext().getLocalMode() : properties.getLocalMode().intValue()) : Undefined.MODE_LOCAL_OR_ARGUMENTS_ALWAYS);
    PageSource ps = null;
    PageSource psInc = null;
    try {
        ps = properties.getPageSource();
        if (doIncludePath)
            psInc = ps;
        if (doIncludePath && getOwnerComponent() != null) {
            psInc = ComponentUtil.getPageSource(getOwnerComponent());
            if (psInc == pci.getCurrentTemplatePageSource()) {
                psInc = null;
            }
        }
        if (ps != null)
            pci.addPageSource(ps, psInc);
        pci.addUDF(this);
        // ////////////////////////////////////////
        BodyContent bc = null;
        Boolean wasSilent = null;
        boolean bufferOutput = getBufferOutput(pci);
        if (!getOutput()) {
            if (bufferOutput)
                bc = pci.pushBody();
            else
                wasSilent = pc.setSilent() ? Boolean.TRUE : Boolean.FALSE;
        }
        UDF parent = null;
        if (ownerComponent != null) {
            parent = pci.getActiveUDF();
            pci.setActiveUDF(this);
        }
        Object returnValue = null;
        try {
            if (args != null)
                defineArguments(pc, getFunctionArguments(), args, newArgs);
            else
                defineArguments(pc, getFunctionArguments(), values, newArgs);
            returnValue = implementation(pci);
            if (ownerComponent != null)
                pci.setActiveUDF(parent);
        } catch (Throwable t) {
            ExceptionUtil.rethrowIfNecessary(t);
            if (ownerComponent != null)
                pci.setActiveUDF(parent);
            if (!getOutput()) {
                if (bufferOutput)
                    BodyContentUtil.flushAndPop(pc, bc);
                else if (!wasSilent)
                    pc.unsetSilent();
            }
            // BodyContentUtil.flushAndPop(pc,bc);
            throw Caster.toPageException(t);
        }
        if (!getOutput()) {
            if (bufferOutput)
                BodyContentUtil.clearAndPop(pc, bc);
            else if (!wasSilent)
                pc.unsetSilent();
        }
        if (returnValue == null && pc.getConfig().getFullNullSupport())
            return returnValue;
        if (properties.getReturnType() == CFTypes.TYPE_ANY || !((PageContextImpl) pc).getTypeChecking())
            return returnValue;
        if (Decision.isCastableTo(properties.getReturnTypeAsString(), returnValue, false, false, -1))
            return returnValue;
        throw new UDFCasterException(this, properties.getReturnTypeAsString(), returnValue);
    // REALCAST return Caster.castTo(pageContext,returnType,returnValue,false);
    // ////////////////////////////////////////
    } finally {
        if (ps != null)
            pc.removeLastPageSource(psInc != null);
        pci.removeUDF();
        pci.setFunctionScopes(oldLocal, oldArgs);
        pci.setActiveUDFCalledName(oldCalledName);
        undefined.setMode(oldCheckArgs);
        pci.getScopeFactory().recycle(pci, newArgs);
        pci.getScopeFactory().recycle(pci, newLocal);
    }
}
Also used : Undefined(lucee.runtime.type.scope.Undefined) Argument(lucee.runtime.type.scope.Argument) Local(lucee.runtime.type.scope.Local) PageContextImpl(lucee.runtime.PageContextImpl) PageSource(lucee.runtime.PageSource) BodyContent(javax.servlet.jsp.tagext.BodyContent) Key(lucee.runtime.type.Collection.Key) LocalImpl(lucee.runtime.type.scope.LocalImpl) UDFCasterException(lucee.runtime.exp.UDFCasterException)

Example 4 with Argument

use of lucee.runtime.type.scope.Argument in project Lucee by lucee.

the class Evaluate method call.

public static Object call(PageContext pc, Object[] objs, boolean preciseMath) throws PageException {
    // define a ohter enviroment for the function
    if (objs.length > 1 && objs[objs.length - 1] instanceof Scope) {
        // Variables Scope
        Variables var = null;
        Local lcl = null, cLcl = null;
        Argument arg = null, cArg = null;
        if (objs[objs.length - 1] instanceof Variables) {
            var = (Variables) objs[objs.length - 1];
        } else if (objs[objs.length - 1] instanceof CallerImpl) {
            CallerImpl ci = ((CallerImpl) objs[objs.length - 1]);
            var = ci.getVariablesScope();
            lcl = ci.getLocalScope();
            arg = ci.getArgumentsScope();
        }
        if (var != null) {
            Variables cVar = pc.variablesScope();
            pc.setVariablesScope(var);
            if (lcl != null && !(lcl instanceof LocalNotSupportedScope)) {
                cLcl = pc.localScope();
                cArg = pc.argumentsScope();
                pc.setFunctionScopes(lcl, arg);
            }
            try {
                return _call(pc, objs, objs.length - 1, preciseMath);
            } finally {
                pc.setVariablesScope(cVar);
                if (cLcl != null)
                    pc.setFunctionScopes(cLcl, cArg);
            }
        } else // Undefined Scope
        if (objs[objs.length - 1] instanceof Undefined) {
            PageContextImpl pci = (PageContextImpl) pc;
            Undefined undefined = (Undefined) objs[objs.length - 1];
            boolean check = undefined.getCheckArguments();
            Variables orgVar = pc.variablesScope();
            Argument orgArgs = pc.argumentsScope();
            Local orgLocal = pc.localScope();
            pci.setVariablesScope(undefined.variablesScope());
            if (check)
                pci.setFunctionScopes(undefined.localScope(), undefined.argumentsScope());
            try {
                return _call(pc, objs, objs.length - 1, preciseMath);
            } finally {
                pc.setVariablesScope(orgVar);
                if (check)
                    pci.setFunctionScopes(orgLocal, orgArgs);
            }
        }
    }
    return _call(pc, objs, objs.length, preciseMath);
}
Also used : Variables(lucee.runtime.type.scope.Variables) Undefined(lucee.runtime.type.scope.Undefined) CallerImpl(lucee.runtime.type.scope.CallerImpl) Scope(lucee.runtime.type.scope.Scope) LocalNotSupportedScope(lucee.runtime.type.scope.LocalNotSupportedScope) Argument(lucee.runtime.type.scope.Argument) LocalNotSupportedScope(lucee.runtime.type.scope.LocalNotSupportedScope) Local(lucee.runtime.type.scope.Local) PageContextImpl(lucee.runtime.PageContextImpl)

Example 5 with Argument

use of lucee.runtime.type.scope.Argument in project Lucee by lucee.

the class UDFUtil method argumentCollection.

public static void argumentCollection(Struct values, FunctionArgument[] funcArgs) {
    Object value = values.removeEL(KeyConstants._argumentCollection);
    if (value != null) {
        value = Caster.unwrap(value, value);
        if (value instanceof Argument) {
            Argument argColl = (Argument) value;
            Iterator<Key> it = argColl.keyIterator();
            Key k;
            int i = -1;
            while (it.hasNext()) {
                i++;
                k = it.next();
                if (funcArgs.length > i && k instanceof ArgumentIntKey) {
                    if (!values.containsKey(funcArgs[i].getName()))
                        values.setEL(funcArgs[i].getName(), argColl.get(k, Argument.NULL));
                    else
                        values.setEL(k, argColl.get(k, Argument.NULL));
                } else if (!values.containsKey(k)) {
                    values.setEL(k, argColl.get(k, Argument.NULL));
                }
            }
        } else if (value instanceof Collection) {
            Collection argColl = (Collection) value;
            // Collection.Key[] keys = argColl.keys();
            Iterator<Key> it = argColl.keyIterator();
            Key k;
            while (it.hasNext()) {
                k = it.next();
                if (!values.containsKey(k)) {
                    values.setEL(k, argColl.get(k, Argument.NULL));
                }
            }
        } else if (value instanceof Map) {
            Map map = (Map) value;
            Iterator it = map.entrySet().iterator();
            Map.Entry entry;
            Key key;
            while (it.hasNext()) {
                entry = (Entry) it.next();
                key = Caster.toKey(entry.getKey(), null);
                if (!values.containsKey(key)) {
                    values.setEL(key, entry.getValue());
                }
            }
        } else if (value instanceof java.util.List) {
            java.util.List list = (java.util.List) value;
            Iterator it = list.iterator();
            Object v;
            int index = 0;
            Key k;
            while (it.hasNext()) {
                v = it.next();
                k = ArgumentIntKey.init(++index);
                if (!values.containsKey(k)) {
                    values.setEL(k, v);
                }
            }
        } else {
            values.setEL(KeyConstants._argumentCollection, value);
        }
    }
}
Also used : Entry(java.util.Map.Entry) Argument(lucee.runtime.type.scope.Argument) FunctionArgument(lucee.runtime.type.FunctionArgument) Iterator(java.util.Iterator) Collection(lucee.runtime.type.Collection) ArgumentIntKey(lucee.runtime.type.scope.ArgumentIntKey) ArrayList(java.util.ArrayList) Map(java.util.Map) Key(lucee.runtime.type.Collection.Key) ArgumentIntKey(lucee.runtime.type.scope.ArgumentIntKey)

Aggregations

Argument (lucee.runtime.type.scope.Argument)7 PageContextImpl (lucee.runtime.PageContextImpl)5 Key (lucee.runtime.type.Collection.Key)4 Local (lucee.runtime.type.scope.Local)4 Undefined (lucee.runtime.type.scope.Undefined)4 Iterator (java.util.Iterator)2 Entry (java.util.Map.Entry)2 Log (lucee.commons.io.log.Log)2 ConfigImpl (lucee.runtime.config.ConfigImpl)2 PageException (lucee.runtime.exp.PageException)2 FunctionArgument (lucee.runtime.type.FunctionArgument)2 ArgumentIntKey (lucee.runtime.type.scope.ArgumentIntKey)2 LocalImpl (lucee.runtime.type.scope.LocalImpl)2 ArrayList (java.util.ArrayList)1 Date (java.util.Date)1 Map (java.util.Map)1 BodyContent (javax.servlet.jsp.tagext.BodyContent)1 DevNullOutputStream (lucee.commons.io.DevNullOutputStream)1 Pair (lucee.commons.lang.Pair)1 Page (lucee.runtime.Page)1