Java源码示例:freemarker.template.TemplateSequenceModel
示例1
@SuppressWarnings("unchecked")
static Collection<String> getAsRawSequence(TemplateModel elems) throws TemplateModelException {
if (elems == null || elems instanceof TemplateBooleanModel) {
return Collections.emptyList();
} else if (elems instanceof TemplateCollectionModel || elems instanceof TemplateSequenceModel) {
return (Collection<String>) LangFtlUtil.unwrapAlways(elems);
} else if (elems instanceof TemplateHashModelEx) {
return (Collection<String>) LangFtlUtil.getMapKeys(elems);
} else {
throw new TemplateModelException("invalid parameter type, can't interpret as sequence: " + elems.getClass());
}
}
示例2
/**
* Shallow-copies map or list. Note: won't preserve order for maps.
*
* @param object
* @param targetType if true, converts to simple FTL type instead of beans, where possible
* @return
* @throws TemplateModelException
*/
public static Object copyObject(TemplateModel object, TemplateValueTargetType targetType, ObjectWrapper objectWrapper) throws TemplateModelException {
if (targetType == null) {
targetType = TemplateValueTargetType.PRESERVE;
}
if (OfbizFtlObjectType.COMPLEXMAP.isObjectType(object) || (object instanceof TemplateHashModelEx && OfbizFtlObjectType.MAP.isObjectType(object))) {
return LangFtlUtil.copyMap(object, null, null, targetType, objectWrapper);
} else if (object instanceof TemplateCollectionModel || object instanceof TemplateSequenceModel) {
return LangFtlUtil.copyList(object, targetType, objectWrapper);
} else {
throw new TemplateModelException("object is not cloneable");
}
}
示例3
@SuppressWarnings({ "unchecked", "unused" })
@Deprecated
private static TemplateSequenceModel toSimpleSequence(TemplateModel object, ObjectWrapper objectWrapper) throws TemplateModelException {
if (object instanceof TemplateSequenceModel) {
return (TemplateSequenceModel) object;
}
else if (object instanceof WrapperTemplateModel) {
WrapperTemplateModel wrapperModel = (WrapperTemplateModel) object;
// WARN: bypasses auto-escaping
Object wrappedObject = wrapperModel.getWrappedObject();
if (wrappedObject instanceof List) {
return DefaultListAdapter.adapt((List<Object>) wrappedObject, (RichObjectWrapper) objectWrapper);
}
else if (wrappedObject instanceof Object[]) {
return DefaultArrayAdapter.adapt((Object[]) wrappedObject, (ObjectWrapperAndUnwrapper) objectWrapper);
}
else if (wrappedObject instanceof Set) {
throw new UnsupportedOperationException("Not yet implemented");
}
else if (wrappedObject instanceof Collection) {
throw new UnsupportedOperationException("Not yet implemented");
}
else if (wrappedObject instanceof Iterable) {
throw new UnsupportedOperationException("Not yet implemented");
}
else {
throw new TemplateModelException("Cannot convert bean-wrapped object of type " + (object != null ? object.getClass() : "null") + " to simple sequence");
}
} else if (object instanceof TemplateCollectionModel) {
TemplateCollectionModel collModel = (TemplateCollectionModel) object;
SimpleSequence res = new SimpleSequence(objectWrapper);
TemplateModelIterator it = collModel.iterator();
while(it.hasNext()) {
res.add(it.next());
}
return res;
} else {
throw new TemplateModelException("Cannot convert object of type " + (object != null ? object.getClass() : "null") + " to simple sequence");
}
}
示例4
/**
* Adds all the elements in the given collection to a new set.
* <p>
* NOTE: This method does NOT handle string escaping explicitly; you may want {@link #toStringSet} instead.
*/
@SuppressWarnings("unchecked")
public static <T> Set<T> toSet(TemplateModel object) throws TemplateModelException {
if (object instanceof WrapperTemplateModel && ((WrapperTemplateModel) object).getWrappedObject() instanceof Set) {
return (Set<T>) ((WrapperTemplateModel) object).getWrappedObject();
} else if (object instanceof TemplateCollectionModel) {
return toSet((TemplateCollectionModel) object);
} else if (object instanceof TemplateSequenceModel) {
return toSet((TemplateSequenceModel) object);
} else {
throw new TemplateModelException("Cannot convert object of type " + (object != null ? object.getClass() : "null") + " to set");
}
}
示例5
/**
* Adds all the elements in the given collection to a new set.
* <p>
* NOTE: This method does NOT handle string escaping explicitly; you may want {@link #toStringSet} instead.
*/
public static <T> Set<T> toSet(TemplateSequenceModel object) throws TemplateModelException {
TemplateSequenceModel seqModel = (TemplateSequenceModel) object;
Set<Object> res = new HashSet<>();
for(int i=0; i < seqModel.size(); i++) {
res.add(LangFtlUtil.unwrapAlways(seqModel.get(i)));
}
return UtilGenerics.cast(res);
}
示例6
/**
* Adds all the elements in the given collection to a new set, as TemplateModels.
* <p>
* NOTE: This method does NOT handle string escaping explicitly; you may want {@link #toStringSet} instead.
*/
public static <T extends TemplateModel> Set<T> toSetNoUnwrap(TemplateSequenceModel object) throws TemplateModelException {
TemplateSequenceModel seqModel = (TemplateSequenceModel) object;
Set<Object> res = new HashSet<>();
for(int i=0; i < seqModel.size(); i++) {
res.add(seqModel.get(i));
}
return UtilGenerics.cast(res);
}
示例7
/**
* Adds all the elements in the given collection to a new list.
* <p>
* NOTE: This method does NOT handle string escaping explicitly; you may want {@link #toStringSet} instead.
*/
public static <T> List<T> toList(TemplateSequenceModel seqModel) throws TemplateModelException {
List<Object> res = new ArrayList<>();
for(int i=0; i < seqModel.size(); i++) {
res.add(LangFtlUtil.unwrapAlways(seqModel.get(i)));
}
return UtilGenerics.cast(res);
}
示例8
/**
* Adds all the elements in the given collection to a new list, as TemplateModels.
* <p>
* NOTE: This method does NOT handle string escaping explicitly; you may want {@link #toStringSet} instead.
*/
public static <T extends TemplateModel> List<T> toListNoUnwrap(TemplateSequenceModel seqModel) throws TemplateModelException {
List<Object> res = new ArrayList<>();
for(int i=0; i < seqModel.size(); i++) {
res.add(seqModel.get(i));
}
return UtilGenerics.cast(res);
}
示例9
/**
* To string set.
* <p>
* WARN: bypasses auto-escaping, caller handles.
* (e.g. the object wrapper used to rewrap the result).
*/
public static Set<String> toStringSet(TemplateSequenceModel seqModel) throws TemplateModelException {
Set<String> set = new HashSet<String>();
for(int i=0; i < seqModel.size(); i++) {
set.add(getAsStringNonEscaping((TemplateScalarModel) seqModel.get(i)));
}
return set;
}
示例10
/**
* Gets collection as a keys.
* <p>
* WARN: This bypasses auto-escaping in all cases. Caller must decide how to handle.
* (e.g. the object wrapper used to rewrap the result).
*/
public static Set<String> getAsStringSet(TemplateModel model) throws TemplateModelException {
Set<String> exKeys = null;
if (model != null) {
if (model instanceof BeanModel && ((BeanModel) model).getWrappedObject() instanceof Set) {
// WARN: bypasses auto-escaping
exKeys = UtilGenerics.cast(((BeanModel) model).getWrappedObject());
}
else if (model instanceof TemplateCollectionModel) {
exKeys = new HashSet<String>();
TemplateModelIterator keysIt = ((TemplateCollectionModel) model).iterator();
while(keysIt.hasNext()) {
exKeys.add(getAsStringNonEscaping((TemplateScalarModel) keysIt.next()));
}
}
else if (model instanceof TemplateSequenceModel) {
TemplateSequenceModel seqModel = (TemplateSequenceModel) model;
exKeys = new HashSet<String>(seqModel.size());
for(int i=0; i < seqModel.size(); i++) {
exKeys.add(getAsStringNonEscaping((TemplateScalarModel) seqModel.get(i)));
}
}
else {
throw new TemplateModelException("Include/exclude keys argument not a collection or set of strings");
}
}
return exKeys;
}
示例11
public static void addToSimpleList(SimpleSequence dest, TemplateModel source) throws TemplateModelException {
if (source instanceof TemplateCollectionModel) {
addToSimpleList(dest, (TemplateCollectionModel) source);
}
else if (source instanceof TemplateSequenceModel) {
addToSimpleList(dest, (TemplateSequenceModel) source);
}
else {
throw new TemplateModelException("Can't add to simple list from source type (non-list type): " + source.getClass());
}
}
示例12
@SuppressWarnings("unchecked")
public void execute(Environment env, Map params, TemplateModel[] loopVars,
TemplateDirectiveBody body) throws TemplateException, IOException {
// 此处的权限判断有可能和拦截器的不一致,有没有关系?大部分应该没有关系,因为不需要判断权限的可以不加这个标签。
// 光一个perms可能还不够,至少还有一个是否只浏览的问题。这个是否可以不管?可以!
// 是否控制权限这个总是要的吧?perms为null代表无需控制权限。
String url = DirectiveUtils.getString(PARAM_URL, params);
boolean pass = false;
if (StringUtils.isBlank(url)) {
// url为空,则认为有权限。
pass = true;
} else {
TemplateSequenceModel perms = getPerms(env);
if (perms == null) {
// perms为null,则代表不需要判断权限。
pass = true;
} else {
String perm;
for (int i = 0, len = perms.size(); i < len; i++) {
perm = ((TemplateScalarModel) perms.get(i)).getAsString();
if (url.startsWith(perm)) {
pass = true;
break;
}
}
}
}
if (pass) {
body.render(env.getOut());
}
}
示例13
private TemplateSequenceModel getPerms(Environment env)
throws TemplateModelException {
TemplateModel model = env.getDataModel().get(PERMISSION_MODEL);
if (model == null) {
return null;
}
if (model instanceof TemplateSequenceModel) {
return (TemplateSequenceModel) model;
} else {
throw new TemplateModelException(
"'perms' in data model not a TemplateSequenceModel");
}
}
示例14
@Override
public TemplateSequenceModel getChildNodes() throws TemplateModelException {
if (node instanceof Branch) {
List childNodes = ((Branch) node).content();
if (childNodes != null) {
return new SimpleSequence(childNodes, wrapper);
} else {
return null;
}
} else {
return new SimpleSequence(Collections.emptyList(), wrapper);
}
}
示例15
@Override
public Object exec(@SuppressWarnings("rawtypes") List args) throws TemplateModelException {
if (args == null || args.size() < 1 || args.size() > 2 ) {
throw new TemplateModelException("Invalid number of arguments (expected: 1-2)");
}
ObjectWrapper objectWrapper = CommonFtlUtil.getCurrentEnvironment().getObjectWrapper();
// support empty list (ignore, treat as empty hash)
TemplateModel argsObj = (TemplateModel) args.get(0);
if (argsObj instanceof TemplateSequenceModel) {
TemplateSequenceModel argsSeq = (TemplateSequenceModel) argsObj;
if (argsSeq.size() == 0) {
argsObj = TemplateHashModelEx.NOTHING;
} else {
throw new TemplateModelException("Invalid argument type (sequence) - expected hash");
}
}
TemplateHashModelEx argsMap = (TemplateHashModelEx) argsObj;
// caller-supplied excludes
TemplateModel excludesModel = (args.size() >=2) ? (TemplateModel) args.get(1) : null;
Set<String> excludes;
if (excludesModel != null) {
excludes = LangFtlUtil.getAsStringSet(excludesModel);
} else {
excludes = new HashSet<>();
}
SimpleHash res = null;
final Boolean useExclude = Boolean.FALSE;
// put attribs from explicit attribs map first, if any
TemplateModel attribsModel = argsMap.get("attribs");
if (attribsModel != null && OfbizFtlObjectType.isObjectType(OfbizFtlObjectType.MAP, attribsModel)) {
if (OfbizFtlObjectType.isObjectType(OfbizFtlObjectType.COMPLEXMAP, attribsModel)) {
attribsModel = LangFtlUtil.toSimpleMap(attribsModel, false, objectWrapper);
}
res = LangFtlUtil.copyMapToSimple((TemplateHashModel) attribsModel, excludes, useExclude, objectWrapper);
}
// to get inline attribs, add list of all arg names to excludes as well as the lists themselves
TemplateModel allArgNamesModel = argsMap.get("allArgNames");
if (allArgNamesModel != null) {
excludes.addAll(LangFtlUtil.getAsStringSet(allArgNamesModel));
}
excludes.add("allArgNames");
excludes.add("localArgNames");
excludes.add("attribs"); // 2020-02-12: in most cases this was automatically added by makeArgMaps from default args list, but custom usages need this now
// add the inline attribs over the attribs map (if any)
if (res == null) {
res = LangFtlUtil.copyMapToSimple(argsMap, excludes, useExclude, objectWrapper);
} else {
LangFtlUtil.putAll(res, argsMap, excludes, useExclude, objectWrapper);
}
return res;
}
示例16
public static SimpleHash makeSimpleMap(TemplateHashModel map, TemplateSequenceModel keys, ObjectWrapper objectWrapper) throws TemplateModelException {
SimpleHash res = new SimpleHash(objectWrapper);
addToSimpleMap(res, map, LangFtlUtil.toStringSet(keys));
return res;
}
示例17
public static void addToSimpleList(SimpleSequence dest, TemplateSequenceModel source) throws TemplateModelException {
for(int i=0; i < source.size(); i++) {
dest.add(source.get(0));
}
}
示例18
/**
* Add to string set.
* <p>
* WARN: bypasses auto-escaping, caller handles.
* (e.g. the object wrapper used to rewrap the result).
*/
public static void addToStringSet(Set<String> dest, TemplateSequenceModel seqModel) throws TemplateModelException {
for(int i=0; i < seqModel.size(); i++) {
dest.add(getAsStringNonEscaping(((TemplateScalarModel) seqModel.get(i))));
}
}