public Writer getWriter(final Writer out, Map args) {
//Profiler.begin("Limited");
final StringBuilder buf = new StringBuilder();
final Environment env = Environment.getCurrentEnvironment();
final Map templateRoot = FreeMarkerWorker.createEnvironmentMap(env);
final GenericDelegator delegator = (GenericDelegator) FreeMarkerWorker.getWrappedObject("delegator", env);
final HttpServletRequest request = (HttpServletRequest) FreeMarkerWorker.getWrappedObject("request", env);
FreeMarkerWorker.getSiteParameters(request, templateRoot);
final Map savedValuesUp = FastMap.newInstance();
FreeMarkerWorker.saveContextValues(templateRoot, upSaveKeyNames, savedValuesUp);
final Map savedValues = FastMap.newInstance();
FreeMarkerWorker.overrideWithArgs(templateRoot, args);
String contentAssocTypeId = (String) templateRoot.get("contentAssocTypeId");
if (UtilValidate.isEmpty(contentAssocTypeId)) {
contentAssocTypeId = "SUB_CONTENT";
templateRoot.put("contentAssocTypeId ", contentAssocTypeId);
}
final Map pickedEntityIds = FastMap.newInstance();
List assocTypes = StringUtil.split(contentAssocTypeId, "|");
String contentPurposeTypeId = (String) templateRoot.get("contentPurposeTypeId");
List purposeTypes = StringUtil.split(contentPurposeTypeId, "|");
templateRoot.put("purposeTypes", purposeTypes);
Locale locale = (Locale) templateRoot.get("locale");
if (locale == null) {
locale = Locale.getDefault();
templateRoot.put("locale", locale);
}
Map whenMap = FastMap.newInstance();
whenMap.put("followWhen", (String) templateRoot.get("followWhen"));
whenMap.put("pickWhen", (String) templateRoot.get("pickWhen"));
whenMap.put("returnBeforePickWhen", (String) templateRoot.get("returnBeforePickWhen"));
whenMap.put("returnAfterPickWhen", (String) templateRoot.get("returnAfterPickWhen"));
templateRoot.put("whenMap", whenMap);
String fromDateStr = (String) templateRoot.get("fromDateStr");
Timestamp fromDate = null;
if (UtilValidate.isNotEmpty(fromDateStr)) {
fromDate = UtilDateTime.toTimestamp(fromDateStr);
}
if (fromDate == null)
fromDate = UtilDateTime.nowTimestamp();
String limitSize = (String) templateRoot.get("limitSize");
final int returnLimit = Integer.parseInt(limitSize);
// limitMode will be "random" to begin with
String limitMode = (String) templateRoot.get("limitMode");
final GenericValue userLogin = (GenericValue) FreeMarkerWorker.getWrappedObject("userLogin", env);
List globalNodeTrail = (List) templateRoot.get("globalNodeTrail");
String strNullThruDatesOnly = (String) templateRoot.get("nullThruDatesOnly");
String orderBy = (String) templateRoot.get("orderBy");
Boolean nullThruDatesOnly = (strNullThruDatesOnly != null && strNullThruDatesOnly.equalsIgnoreCase("true")) ? Boolean.TRUE : Boolean.FALSE;
// NOTE this was looking for subContentId, but that doesn't make ANY sense, so changed to contentId
String contentId = (String) templateRoot.get("contentId");
templateRoot.put("contentId", null);
templateRoot.put("subContentId", null);
final String contentIdTo = contentId;
Map results = null;
//if (Debug.infoOn()) Debug.logInfo("in LimitedSubContentCache(0), assocTypes ." + assocTypes, module);
String contentAssocPredicateId = (String) templateRoot.get("contentAssocPredicateId");
try {
results = ContentServicesComplex.getAssocAndContentAndDataResourceCacheMethod(delegator, contentId, null, "From", fromDate, null, assocTypes, null, Boolean.TRUE, contentAssocPredicateId, orderBy);
} catch (MiniLangException e2) {
throw new RuntimeException(e2.getMessage());
} catch (GenericEntityException e) {
throw new RuntimeException(e.getMessage());
}
List longList = (List) results.get("entityList");
templateRoot.put("entityList", longList);
//if (Debug.infoOn()) Debug.logInfo("in limited, longList:" + longList , "");
return new LoopWriter(out) {
public void write(char cbuf[], int off, int len) {
buf.append(cbuf, off, len);
//StringBuilder ctxBuf = (StringBuilder) templateRoot.get("buf");
//ctxBuf.append(cbuf, off, len);
}
public void flush() throws IOException {
out.flush();
}
public int onStart() throws TemplateModelException, IOException {
List globalNodeTrail = (List) templateRoot.get("globalNodeTrail");
String trailCsv = ContentWorker.nodeTrailToCsv(globalNodeTrail);
boolean inProgress = false;
//if (Debug.infoOn()) Debug.logInfo("in limited, returnLimit:" + returnLimit , "");
//if (Debug.infoOn()) Debug.logInfo("in limited, pickedEntityIds:" + pickedEntityIds , "");
if (pickedEntityIds.size() < returnLimit) {
inProgress = getNextMatchingEntity(templateRoot, delegator, env);
}
FreeMarkerWorker.saveContextValues(templateRoot, saveKeyNames, savedValues);
if (inProgress) {
return TransformControl.EVALUATE_BODY;
} else {
return TransformControl.SKIP_BODY;
}
}
public int afterBody() throws TemplateModelException, IOException {
FreeMarkerWorker.reloadValues(templateRoot, savedValues, env);
List list = (List) templateRoot.get("globalNodeTrail");
List subList = list.subList(0, list.size() - 1);
templateRoot.put("globalNodeTrail", subList);
env.setVariable("globalNodeTrail", FreeMarkerWorker.autoWrap(subList, env));
//if (Debug.infoOn()) Debug.logInfo("highIndex(2):" + highIndexInteger , "");
//if (Debug.infoOn()) Debug.logInfo("in limited, returnLimit(2):" + returnLimit , "");
//if (Debug.verboseOn()) Debug.logVerbose("in limited, pickedEntityIds(2):" + pickedEntityIds , "");
boolean inProgress = false;
if (pickedEntityIds.size() < returnLimit) {
inProgress = getNextMatchingEntity(templateRoot, delegator, env);
}
FreeMarkerWorker.saveContextValues(templateRoot, saveKeyNames, savedValues);
if (inProgress) {
return TransformControl.REPEAT_EVALUATION;
} else {
return TransformControl.END_EVALUATION;
}
}
public void close() throws IOException {
FreeMarkerWorker.reloadValues(templateRoot, savedValuesUp, env);
String wrappedContent = buf.toString();
out.write(wrappedContent);
//try {
//Profiler.end("Limited");
//FileOutputStream fw = new FileOutputStream(FileUtil.getFile("/usr/local/agi/ofbiz/hot-deploy/sfmp/misc/profile.data"));
//Profiler.print(fw);
//fw.close();
//} catch (IOException e) {
//Debug.logError("[PROFILER] " + e.getMessage(),"");
//}
}
public boolean prepCtx(GenericDelegator delegator, Map ctx, Environment env, GenericValue view) throws GeneralException {
String dataResourceId = (String) view.get("drDataResourceId");
String subContentIdSub = (String) view.get("contentId");
// This order is taken so that the dataResourceType can be overridden in the transform arguments.
String subDataResourceTypeId = (String) ctx.get("subDataResourceTypeId");
if (UtilValidate.isEmpty(subDataResourceTypeId)) {
subDataResourceTypeId = (String) view.get("drDataResourceTypeId");
// TODO: If this value is still empty then it is probably necessary to get a value from
// the parent context. But it will already have one and it is the same context that is
// being passed.
}
String mimeTypeId = ContentWorker.getMimeTypeId(delegator, view, ctx);
Map trailNode = ContentWorker.makeNode(view);
Map whenMap = (Map) ctx.get("whenMap");
Locale locale = (Locale) ctx.get("locale");
if (locale == null) {
locale = Locale.getDefault();
}
GenericValue assocContent = null;
ContentWorker.checkConditions(delegator, trailNode, assocContent, whenMap);
Boolean isReturnBeforeObj = (Boolean) trailNode.get("isReturnBefore");
Boolean isReturnAfterObj = (Boolean) trailNode.get("isReturnAfter");
Boolean isPickObj = (Boolean) trailNode.get("isPick");
Boolean isFollowObj = (Boolean) trailNode.get("isFollow");
//if (Debug.infoOn()) Debug.logInfo("in LimitedSubContentCache, isReturnBeforeObj" + isReturnBeforeObj + " isPickObj:" + isPickObj + " isFollowObj:" + isFollowObj + " isReturnAfterObj:" + isReturnAfterObj, module);
if ((isReturnBeforeObj == null || !isReturnBeforeObj.booleanValue()) && ((isPickObj != null &&
isPickObj.booleanValue()) || (isFollowObj != null && isFollowObj.booleanValue()))) {
List globalNodeTrail = (List) ctx.get("globalNodeTrail");
if (globalNodeTrail == null) {
globalNodeTrail = FastList.newInstance();
}
globalNodeTrail.add(trailNode);
ctx.put("globalNodeTrail", globalNodeTrail);
String csvTrail = ContentWorker.nodeTrailToCsv(globalNodeTrail);
ctx.put("nodeTrailCsv", csvTrail);
//if (Debug.infoOn()) Debug.logInfo("prepCtx, csvTrail(2):" + csvTrail, "");
int indentSz = globalNodeTrail.size();
ctx.put("indent", Integer.valueOf(indentSz));
ctx.put("subDataResourceTypeId", subDataResourceTypeId);
ctx.put("mimeTypeId", mimeTypeId);
ctx.put("subContentId", subContentIdSub);
ctx.put("content", view);
env.setVariable("subDataResourceTypeId", FreeMarkerWorker.autoWrap(subDataResourceTypeId, env));
env.setVariable("indent", FreeMarkerWorker.autoWrap(Integer.valueOf(indentSz), env));
env.setVariable("nodeTrailCsv", FreeMarkerWorker.autoWrap(csvTrail, env));
env.setVariable("globalNodeTrail", FreeMarkerWorker.autoWrap(globalNodeTrail, env));
env.setVariable("content", FreeMarkerWorker.autoWrap(view, env));
env.setVariable("mimeTypeId", FreeMarkerWorker.autoWrap(mimeTypeId, env));
env.setVariable("subContentId", FreeMarkerWorker.autoWrap(subContentIdSub, env));
return true;
} else {
return false;
}
}