⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sequencebuiltins.java

📁 freemaker安装软件
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
                            } else {
                                throw e;
                            }
                        }
                    }
                } else if (keyType == KEY_TYPE_DATE) {
                    for (i = 0; i < ln; i++) {
                        item = seq.get(i);
                        try {
                            res.add(new KVP(
                                    ((TemplateDateModel) item).getAsDate(),
                                    item));
                        } catch (ClassCastException e) {
                            if (!(item instanceof TemplateNumberModel)) {
                                throw new TemplateModelException(
                                        startErrorMessage(keys)
                                        + "All values in the sequence must be "
                                        + "date/time values, because the first "
                                        + "value was a date/time. "
                                        + "The value at index " + i
                                        + " is not date/time.");
                            } else {
                                throw e;
                            }
                        }
                    }
                } else {
                    throw new RuntimeException("FreeMarker bug: Bad key type");
                }
            } else {
                for (i = 0; i < ln; i++) {
                    item = seq.get(i);
                    Object key = item;
                    for (int j = 0; j < keyCnt; j++) {
                        try {
                            key = ((TemplateHashModel) key).get(keys[j]);
                        } catch (ClassCastException e) {
                            if (!(key instanceof TemplateHashModel)) {
                                throw new TemplateModelException(
                                        startErrorMessage(keys)
                                        + "Problem with the sequence item at index " + i + ": "
                                        + "Can't get the " + StringUtil.jQuote(keys[j])
                                        + " subvariable, because the value is not a hash.");
                            } else {
                                throw e;
                            }
                        }
                        if (key == null) {
                            throw new TemplateModelException(
                                    startErrorMessage(keys)
                                    + "Problem with the sequence item at index " + i + ": "
                                    + "The " + StringUtil.jQuote(keys[j])
                                    + " subvariable was not found.");
                        }
                    }
                    if (keyType == KEY_TYPE_STRING) {
                        try {
                            res.add(new KVP(
                                    ((TemplateScalarModel) key).getAsString(),
                                    item));
                        } catch (ClassCastException e) {
                            if (!(key instanceof TemplateScalarModel)) {
                                throw new TemplateModelException(
                                        startErrorMessage(keys)
                                        + "All key values in the sequence must be "
                                        + "date/time values, because the first key "
                                        + "value was a date/time. The key value at "
                                        + "index " + i + " is not a date/time.");
                            } else {
                                throw e;
                            }
                        }
                    } else if (keyType == KEY_TYPE_NUMBER) {
                        try {
                            res.add(new KVP(
                                    ((TemplateNumberModel) key).getAsNumber(),
                                    item));
                        } catch (ClassCastException e) {
                            if (!(key instanceof TemplateNumberModel)) {
                                throw new TemplateModelException(
                                        startErrorMessage(keys)
                                        + "All key values in the sequence must be "
                                        + "numbers, because the first key "
                                        + "value was a number. The key value at "
                                        + "index " + i + " is not a number.");
                            }
                        }
                    } else if (keyType == KEY_TYPE_DATE) {
                        try {
                            res.add(new KVP(
                                    ((TemplateDateModel) key).getAsDate(),
                                    item));
                        } catch (ClassCastException e) {
                            if (!(key instanceof TemplateDateModel)) {
                                throw new TemplateModelException(
                                        startErrorMessage(keys)
                                        + "All key values in the sequence must be "
                                        + "dates, because the first key "
                                        + "value was a date. The key value at "
                                        + "index " + i + " is not a date.");
                            }
                        }
                    } else {
                        throw new RuntimeException("FreeMarker bug: Bad key type");
                    }
                }
            }

            Comparator cmprtr;
            if (keyType == KEY_TYPE_STRING) {
                cmprtr = new LexicalKVPComparator(
                        Environment.getCurrentEnvironment().getCollator());
            } else if (keyType == KEY_TYPE_NUMBER) {
                cmprtr = new NumericalKVPComparator(
                        Environment.getCurrentEnvironment()
                                .getArithmeticEngine());
            } else if (keyType == KEY_TYPE_DATE) {
                cmprtr = new DateKVPComparator();
            } else {
                throw new RuntimeException("FreeMarker bug: Bad key type");
            }

            try {
                Collections.sort(res, cmprtr);
            } catch (ClassCastException exc) {
                throw new TemplateModelException(
                        startErrorMessage(keys)
                        + "Unexpected error while sorting:" + exc, exc);
            }

            for (i = 0; i < ln; i++) {
                res.set(i, ((KVP) res.get(i)).value);
            }

            return new TemplateModelListSequence(res);
        }

        private static class KVP {
            private KVP(Object key, Object value) {
                this.key = key;
                this.value = value;
            }

            private Object key;
            private Object value;
        }

        private static class NumericalKVPComparator implements Comparator {
            private ArithmeticEngine ae;

            private NumericalKVPComparator(ArithmeticEngine ae) {
                this.ae = ae;
            }

            public int compare(Object arg0, Object arg1) {
                try {
                    return ae.compareNumbers(
                            (Number) ((KVP) arg0).key,
                            (Number) ((KVP) arg1).key);
                } catch (TemplateException e) {
                    throw new ClassCastException(
                        "Failed to compare numbers: " + e);
                }
            }
        }

        private static class LexicalKVPComparator implements Comparator {
            private Collator collator;

            LexicalKVPComparator(Collator collator) {
                this.collator = collator;
            }

            public int compare(Object arg0, Object arg1) {
                return collator.compare(
                        ((KVP) arg0).key, ((KVP) arg1).key);
            }
        }
        
        private static class DateKVPComparator implements Comparator {

            public int compare(Object arg0, Object arg1) {
                return ((Date) ((KVP) arg0).key).compareTo(
                        (Date) ((KVP) arg1).key);
            }
        }
        
    }
    
    static class sort_byBI extends sortBI {
        TemplateModel calculateResult(TemplateSequenceModel seq)
        {
            return new BIMethod(seq);
        }
        
        static class BIMethod implements TemplateMethodModelEx {
            TemplateSequenceModel seq;
            
            BIMethod(TemplateSequenceModel seq) {
                this.seq = seq;
            }
            
            public Object exec(List params)
                    throws TemplateModelException {
                if (params.size() == 0) {
                    throw new TemplateModelException(
                            "?sort_by(key) needs exactly 1 argument.");
                }
                String[] subvars;
                Object obj = params.get(0);
                if (obj instanceof TemplateScalarModel) {
                    subvars = new String[]{((TemplateScalarModel) obj).getAsString()};
                } else if (obj instanceof TemplateSequenceModel) {
                    TemplateSequenceModel seq = (TemplateSequenceModel) obj;
                    int ln = seq.size();
                    subvars = new String[ln];
                    for (int i = 0; i < ln; i++) {
                        Object item = seq.get(i);
                        try {
                            subvars[i] = ((TemplateScalarModel) item)
                                    .getAsString();
                        } catch (ClassCastException e) {
                            if (!(item instanceof TemplateScalarModel)) {
                                throw new TemplateModelException(
                                        "The argument to ?sort_by(key), when it "
                                        + "is a sequence, must be a sequence of "
                                        + "strings, but the item at index " + i
                                        + " is not a string." );
                            }
                        }
                    }
                } else {
                    throw new TemplateModelException(
                            "The argument to ?sort_by(key) must be a string "
                            + "(the name of the subvariable), or a sequence of "
                            + "strings (the \"path\" to the subvariable).");
                }
                return sort(seq, subvars); 
            }
        }
    }

    static class seq_containsBI extends BuiltIn {
        TemplateModel _getAsTemplateModel(Environment env)
                throws TemplateException {
            TemplateModel model = target.getAsTemplateModel(env);
            if (model instanceof TemplateSequenceModel) {
                return new BIMethodForSequence((TemplateSequenceModel) model, env);
            } else if (model instanceof TemplateCollectionModel) {
                return new BIMethodForCollection((TemplateCollectionModel) model, env);
            } else {
                throw invalidTypeException(model, target, env, "sequence or collection");
            }
        }

        private class BIMethodForSequence implements TemplateMethodModelEx {
            private TemplateSequenceModel m_seq;
            private Environment m_env;

            private BIMethodForSequence(TemplateSequenceModel seq, Environment env) {
                m_seq = seq;
                m_env = env;
            }

            public Object exec(List args)
                    throws TemplateModelException {
                if (args.size() != 1)
                    throw new TemplateModelException("?seq_contains(...) expects one argument.");
                TemplateModel arg = (TemplateModel) args.get(0);
                int size = m_seq.size();
                for (int i = 0; i < size; i++) {
                    if (modelsEqual(m_seq.get(i), arg, m_env))
                        return TemplateBooleanModel.TRUE;
                }
                return TemplateBooleanModel.FALSE;
            }

        }
    
        private class BIMethodForCollection implements TemplateMethodModelEx {
            private TemplateCollectionModel m_coll;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -