All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.hasor.dataql.runtime.inset.ASM Maven / Gradle / Ivy

There is a newer version: 4.2.5
Show newest version
/*
 * Copyright 2008-2009 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package net.hasor.dataql.runtime.inset;
import net.hasor.dataql.InvokerProcessException;
import net.hasor.dataql.ProcessException;
import net.hasor.dataql.domain.compiler.Instruction;
import net.hasor.dataql.result.ObjectModel;
import net.hasor.dataql.runtime.InsetProcess;
import net.hasor.dataql.runtime.InstFilter;
import net.hasor.dataql.runtime.InstSequence;
import net.hasor.dataql.runtime.ProcessContet;
import net.hasor.dataql.runtime.mem.MemStack;
import net.hasor.dataql.runtime.mem.StackStruts;
import net.hasor.dataql.runtime.struts.ObjectResultStruts;
import net.hasor.utils.StringUtils;

import java.util.concurrent.atomic.AtomicInteger;
/**
 * ASM,指令处理器。用于将结果作为对象进行处理。如果结果是集合,那么按照对象处理。
 *
 * 与 ASM 指令配对的还有一个对应的 ASE,在这一对 ASM -> ASE 范围内的指令。
 *
 * TODO 后续可以考虑优化这个代码,让对象的每个字段的处理做成并发。
 *
 * @author 赵永春([email protected])
 * @version : 2017-07-19
 */
class ASM implements InsetProcess {
    @Override
    public int getOpcode() {
        return ASM;
    }
    @Override
    public void doWork(InstSequence sequence, MemStack memStack, StackStruts local, ProcessContet context) throws ProcessException {
        //
        // .读取返回值并包装成 ResultStruts
        String typeString = sequence.currentInst().getString(0);
        Class objectType = null;
        if (StringUtils.isNotBlank(typeString)) {
            try {
                objectType = context.loadType(typeString);
            } catch (Exception e) {
                throw new InvokerProcessException(getOpcode(), "load type failed -> " + typeString, e);
            }
        } else {
            objectType = ObjectModel.class;
        }
        Object toType = null;
        try {
            toType = objectType.newInstance();
        } catch (Exception e) {
            throw new InvokerProcessException(getOpcode(), "newInstance -> " + objectType.getName(), e);
        }
        Object result = memStack.pop();
        memStack.push(new ObjectResultStruts(toType));
        //
        // .圈定处理结果集的指令集
        final AtomicInteger dogs = new AtomicInteger(0);
        InstSequence subSequence = sequence.findSubSequence(new InstFilter() {
            public boolean isExit(Instruction inst) {
                //
                if (ASM == inst.getInstCode() || ASA == inst.getInstCode()) {
                    dogs.incrementAndGet();
                    return false;
                }
                //
                if (ASE == inst.getInstCode()) {
                    dogs.decrementAndGet();
                    if (dogs.get() == 0) {
                        return true;
                    }
                }
                return false;
            }
        });
        //
        // .对结果集进行迭代处理
        subSequence.reset();    // 重置执行序列
        local.push(result);     // 设置DS
        context.processInset(subSequence, memStack, local);// 执行序列
        local.pop();            // 销毁DS
        //
        // .处理完毕跳到出口
        sequence.jumpTo(subSequence.exitPosition());
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy