@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()); } }
/** * Shallow-copies map or list. Note: won't preserve order for maps. * * @param object * @param toSimpleType 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"); } }
/** * Adds to simple hash from source map. * <p> * <em>WARN</em>: This is not BeanModel-aware (complex map). */ public static void addToSimpleMap(SimpleHash dest, TemplateHashModelEx source) throws TemplateModelException { TemplateCollectionModel keysModel = source.keys(); TemplateModelIterator modelIt = keysModel.iterator(); while(modelIt.hasNext()) { String key = getAsStringNonEscaping((TemplateScalarModel) modelIt.next()); dest.put(key, source.get(key)); } }
/** * Adds the still-wrapped TemplateModels in hash to a java Map. * <p> * <em>WARN</em>: This is not BeanModel-aware (complex map). */ public static void addModelsToMap(Map<String, ? super TemplateModel> dest, TemplateHashModelEx source) throws TemplateModelException { TemplateCollectionModel keysModel = source.keys(); TemplateModelIterator modelIt = keysModel.iterator(); while(modelIt.hasNext()) { String key = getAsStringNonEscaping((TemplateScalarModel) modelIt.next()); dest.put(key, source.get(key)); } }
/** * 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(TemplateCollectionModel collModel) throws TemplateModelException { Set<String> set = new HashSet<String>(); TemplateModelIterator modelIt = collModel.iterator(); while(modelIt.hasNext()) { set.add(getAsStringNonEscaping((TemplateScalarModel) modelIt.next())); } return set; }
/** * 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, TemplateCollectionModel collModel) throws TemplateModelException { TemplateModelIterator modelIt = collModel.iterator(); while(modelIt.hasNext()) { dest.add(getAsStringNonEscaping((TemplateScalarModel) modelIt.next())); } }
/** * 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; }
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()); } }
@Override public TemplateCollectionModel keys() throws TemplateModelException { List<String> names = descriptor.state().properties() .map( descriptor -> descriptor.qualifiedName().name() ) .collect( Collectors.toList() ); return (TemplateCollectionModel) wrapper.wrap( names.iterator() ); }
/** Return a collection representing all values in the context. @return The collection of values @throws TemplateModelException */ public TemplateCollectionModel values() throws TemplateModelException { Object[] arr = context.getKeys(); arr = (Object[]) arr.clone(); for (int i = 0; i < arr.length; i++) { arr[i] = context.get(arr[i].toString()); } return (TemplateCollectionModel) wrapAsTemplateModel(arr); }
@Override public TemplateCollectionModel keys() throws TemplateModelException { return new CollectionModel(map.keySet(), (BeansWrapper) Environment.getCurrentEnvironment().getObjectWrapper()); }
@Override public TemplateCollectionModel values() throws TemplateModelException { return new CollectionModel(map.values(), (BeansWrapper) Environment.getCurrentEnvironment().getObjectWrapper()); }
/** * Supposed to convert to simple sequence. * <p> * WARN: Bypasses auto-escaping for complex maps, caller must decide how to handle. * (e.g. the object wrapper used to rewrap the result). * <p> * DEV NOTE: I stopped writing/testing this when found out most of the problems w.r.t. collections are not * the FTL types this time but the way they're used in Ofbiz templates. * FTL's CollectionModel (subclass of TemplateCollectionModel) is supposed to cover everything and * won't suffer from the same problems maps have. */ @SuppressWarnings("unchecked") @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"); } }
public static SimpleHash makeSimpleMap(TemplateHashModel map, TemplateCollectionModel keys, ObjectWrapper objectWrapper) throws TemplateModelException { SimpleHash res = new SimpleHash(objectWrapper); addToSimpleMap(res, map, LangFtlUtil.toStringSet(keys)); return res; }
public static void addToSimpleList(SimpleSequence dest, TemplateCollectionModel source) throws TemplateModelException { TemplateModelIterator it = source.iterator(); while(it.hasNext()) { dest.add(it.next()); } }
public TemplateCollectionModel values() { return new CollectionAndSequence(new SimpleSequence(((Map) object).values(), wrapper)); }
@Override public TemplateCollectionModel keys() throws TemplateModelException { return new SimpleCollection(jsonObject.fieldNames(), getObjectWrapper()); }
@Override public TemplateCollectionModel values() throws TemplateModelException { return new SimpleCollection(jsonObject.getMap().values(), getObjectWrapper()); }
@Override public TemplateCollectionModel keys() throws TemplateModelException { return new JSONArrayTemplateCollectionModel(toWrap.names(), wrapper); }
@Override public TemplateCollectionModel values() throws TemplateModelException { return new SimpleCollection(toWrap.keys(), wrapper); }
/** Return a collection representing all keys in the context. @return The collection of keys @throws TemplateModelException */ public TemplateCollectionModel keys() throws TemplateModelException { return (TemplateCollectionModel) wrapAsTemplateModel(context.getKeys()); }