private String key;
private EntityAdapterModel model;
private String definition;
+ private String skip;
+ private String limit;
public EntityEnumeratingProducerNode(
String aKey,
EntityAdapterModel aModel, String aDefinition,
ProducerNode aSubNode) {
-
super(aSubNode);
defaultVerb = null;
EntityAdapterModel aModel, String aDefinition,
String aDefaultWhereClause, String aDefaultOrderByClause,
ProducerNode aSubNode) {
+ this(aKey, aModel, aDefinition, aDefaultWhereClause, aDefaultOrderByClause, "", "", aSubNode);
+ }
+
+ public EntityEnumeratingProducerNode(
+ String aKey,
+ EntityAdapterModel aModel, String aDefinition,
+ String aDefaultWhereClause, String aDefaultOrderByClause,
+ String aLimit, String aSkip,
+ ProducerNode aSubNode) {
this(aKey, aModel, aDefinition, aSubNode);
+ limit= aLimit;
+ skip = aSkip;
defaultVerb = new EntityEnumeratingProducerNodeVerb(aDefaultWhereClause, aDefaultOrderByClause);
}
ParameterExpander.expandExpression( aValueMap, verb.orderByClause ),
100,
model,
- definition );
+ definition,
+ ParameterExpander.evaluateIntegerExpressionWithDefault( aValueMap, limit, -1),
+ ParameterExpander.evaluateIntegerExpressionWithDefault( aValueMap, skip, 0));
while (browser.hasNext()) {
ParameterExpander.setValueForKey( aValueMap, key, browser.next());
private int batchSize;
private EntityAdapterModel model;
private String definition;
- private int limit;
- private int skip;
+ private String limitExpression;
+ private String skipExpression;
public EntityListProducerNode(String aKey,
EntityAdapterModel aModel, String aDefinition,
String aWhereClause, String anOrderByClause,
- int aLimit, int aSkip, ProducerNode aSubNode) {
+ String aLimitExpression, String aSkipExpression, ProducerNode aSubNode) {
super(aSubNode);
model = aModel;
key = aKey;
whereClause = aWhereClause;
orderByClause = anOrderByClause;
- limit = aLimit;
- skip = aSkip;
+ limitExpression = aLimitExpression;
+ skipExpression = aSkipExpression;
+ }
+
+ public EntityListProducerNode(String aKey,
+ EntityAdapterModel aModel, String aDefinition,
+ String aWhereClause, String anOrderByClause,
+ int aLimit, int aSkip, ProducerNode aSubNode) {
+ this(aKey, aModel, aDefinition, aWhereClause, anOrderByClause,
+ Integer.toString(aLimit), Integer.toString(aSkip), aSubNode);
}
public void produce(Map aValueMap, String aVerb, PrintWriter aLogger) throws ProducerFailure {
try {
+ int limit = ParameterExpander.evaluateIntegerExpressionWithDefault(aValueMap, limitExpression, -1);
+ int skip = ParameterExpander.evaluateIntegerExpressionWithDefault(aValueMap, skipExpression, 0);
+
+ if (skipExpression != null && !skipExpression.trim().equals(""))
+ skip = ParameterExpander.evaluateIntegerExpression(aValueMap, skipExpression);
+
ParameterExpander.setValueForKey(
aValueMap,
key,
};
public ProducerNode constructNode() {
- return new EvaluatedAssignmentProducerNode(key, value);
+ return new ExpandedAssignmentProducerNode(key, value);
};
}
////////////////////////////////////////////////////////////////////////////////
public static class EnumeratingProducerNodeBuilder extends AbstractProducerNodeBuilder {
- // ML: add limit, skip!
private final static String ENUMERATION_KEY_ATTRIBUTE = KEY_ATTRIBUTE;
private final static String ENUMERATION_DEFINITION_ATTRIBUTE = DEFINITION_ATTRIBUTE;
private final static String ENUMERATION_SELECTION_ATTRIBUTE = SELECTION_ATTRIBUTE;
private final static String ENUMERATION_ORDER_ATTRIBUTE = ORDER_ATTRIBUTE;
private final static String ENUMERATION_DEFAULT_SUBNODE = "default";
+ private final static String ENUMERATION_LIMIT_ATTRIBUTE = LIMIT_ATTRIBUTE;
+ private final static String ENUMERATION_SKIP_ATTRIBUTE = SKIP_ATTRIBUTE;
private final static String[] ENUMERATION_REQUIRED_ATTRIBUTES = { ENUMERATION_KEY_ATTRIBUTE, ENUMERATION_DEFINITION_ATTRIBUTE };
- private final static String[] ENUMERATION_OPTIONAL_ATTRIBUTES = { ENUMERATION_SELECTION_ATTRIBUTE, ENUMERATION_ORDER_ATTRIBUTE};
+ private final static String[] ENUMERATION_OPTIONAL_ATTRIBUTES = { ENUMERATION_SELECTION_ATTRIBUTE, ENUMERATION_ORDER_ATTRIBUTE, ENUMERATION_LIMIT_ATTRIBUTE, ENUMERATION_SKIP_ATTRIBUTE};
private final static String[] ENUMERATION_SUBNODES = {ENUMERATION_DEFAULT_SUBNODE};
private String key;
private String definition;
private String selection;
private String order;
+ private String limit;
+ private String skip;
private EntityAdapterModel model;
public EnumeratingProducerNodeBuilder(EntityAdapterModel aModel) {
definition = (String) anAttributes.get(ENUMERATION_DEFINITION_ATTRIBUTE);
selection = (String) anAttributes.get(ENUMERATION_SELECTION_ATTRIBUTE);
order = (String) anAttributes.get(ENUMERATION_ORDER_ATTRIBUTE);
+ limit = (String) anAttributes.get(ENUMERATION_LIMIT_ATTRIBUTE);
+ skip = (String) anAttributes.get(ENUMERATION_SKIP_ATTRIBUTE);
};
public ProducerNode constructNode() {
- return new EntityEnumeratingProducerNode(key, model, definition, selection, order, getSubNode(ENUMERATION_DEFAULT_SUBNODE ));
+ return new EntityEnumeratingProducerNode(key, model, definition, selection, order, limit, skip, getSubNode(ENUMERATION_DEFAULT_SUBNODE ));
};
public static class factory implements ProducerNodeBuilderFactory {
private String definition;
private String selection;
private String order;
- private int limit;
- private int skip;
+ private String limit;
+ private String skip;
private EntityAdapterModel model;
public ListProducerNodeBuilder(EntityAdapterModel aModel) {
}
public void setAttributes(Map anAttributes) throws ProducerConfigExc {
- String limitString;
- String skipString;
-
ReaderTool.checkAttributes(anAttributes, LIST_REQUIRED_ATTRIBUTES, LIST_OPTIONAL_ATTRIBUTES);
key = (String) anAttributes.get(LIST_KEY_ATTRIBUTE);
definition = (String) anAttributes.get(LIST_DEFINITION_ATTRIBUTE);
selection = (String) anAttributes.get(LIST_SELECTION_ATTRIBUTE);
order = (String) anAttributes.get(LIST_ORDER_ATTRIBUTE);
- skip = 0;
- limit = -1;
-
- limitString = (String) anAttributes.get(LIST_LIMIT_ATTRIBUTE);
- if (limitString!=null) {
- try {
- limit = Integer.parseInt(limitString);
- }
- catch (Throwable t) {
- throw new ProducerConfigExc("invalid value for list parameter: " + limitString);
- }
- }
- skipString = (String) anAttributes.get(LIST_SKIP_ATTRIBUTE);
- if (skipString!=null) {
- try {
- skip = Integer.parseInt(skipString);
- }
- catch (Throwable t) {
- throw new ProducerConfigExc("invalid value for skip parameter: " + skipString);
- }
- }
+ limit = (String) anAttributes.get(LIST_LIMIT_ATTRIBUTE);
+ skip = (String) anAttributes.get(LIST_SKIP_ATTRIBUTE);
};
public ProducerNode constructNode() {
private final static String[] BATCHER_OPTIONAL_ATTRIBUTES = { BATCHER_SELECTION_ATTRIBUTE, BATCHER_ORDER_ATTRIBUTE, BATCHER_MINBATCHSIZE_ATTRIBUTE, BATCHER_SKIP_ATTRIBUTE };
private final static String[] BATCHER_SUBNODES = { BATCHER_BATCH_SUBNODE, BATCHER_BATCHLIST_SUBNODE };
+ // ML: batchSize, minBatchSize, skip should be expressions!
+
private EntityAdapterModel model;
private String batchDataKey;
private String batchInfoKey;
public class ParameterExpander {
final static String NODE_SEPARATOR = ".";
+ final static char STRING_ESCAPE_CHARACTER = '\\';
public static List splitString(String aString, String aSeparator) {
List result= new Vector();
public static String expandExpression(Map aMap, String anExpression) throws Exception {
int previousPosition = 0;
int position;
- int endOfNamePosition;
+ int endOfExpressionPosition;
StringBuffer result = new StringBuffer();
while ((position=anExpression.indexOf("$", previousPosition))>=0) {
else
{
if (anExpression.charAt(position+1) == '{') {
- endOfNamePosition=anExpression.indexOf('}', position);
- if (endOfNamePosition>=0) {
- result.append(findStringForKey(aMap, anExpression.substring(position+2, endOfNamePosition)));
- previousPosition=endOfNamePosition+1;
+ endOfExpressionPosition=position+2;
+ while (endOfExpressionPosition<anExpression.length() && anExpression.charAt(endOfExpressionPosition) != '}') {
+ if (anExpression.charAt(endOfExpressionPosition)=='\'' || anExpression.charAt(endOfExpressionPosition)=='"') {
+ char boundary = anExpression.charAt(endOfExpressionPosition);
+
+ endOfExpressionPosition++;
+ while (endOfExpressionPosition<anExpression.length() && anExpression.charAt(endOfExpressionPosition) != boundary) {
+ if (anExpression.charAt(endOfExpressionPosition) == STRING_ESCAPE_CHARACTER)
+ endOfExpressionPosition++;
+ endOfExpressionPosition++;
+ }
+ if (endOfExpressionPosition<anExpression.length()) {
+ throw new ParameterExpanderExc("Unterminated string in {1}",new Object[]{anExpression});
+ }
+ }
+ endOfExpressionPosition++;
+ }
+ if (endOfExpressionPosition<anExpression.length()) {
+ result.append(evaluateStringExpression(aMap, anExpression.substring(position+2, endOfExpressionPosition)));
+// findStringForKey(aMap, anExpression.substring(position+2, endOfExpressionPosition))
+// );
+ previousPosition=endOfExpressionPosition+1;
}
else {
throw new ParameterExpanderExc("Missing } in {1}",new Object[]{anExpression});
return parser.parseBoolean();
}
+ public static String evaluateStringExpression(Map aMap, String anExpression) throws Exception {
+ Parser parser = new Parser(anExpression, aMap);
+
+ return parser.parseString();
+ }
+
+ public static int evaluateIntegerExpressionWithDefault(Map aMap, String anExpression, int aDefault) throws Exception {
+ if (anExpression == null || anExpression.trim().equals(""))
+ return aDefault;
+ else
+ return evaluateIntegerExpression(aMap, anExpression);
+ }
+
+ public static int evaluateIntegerExpression(Map aMap, String anExpression) throws Exception {
+ Parser parser = new Parser(anExpression, aMap);
+
+ return parser.parseInteger();
+ }
+
public static Object evaluateExpression(Map aMap, String anExpression) throws Exception {
Parser parser = new Parser(anExpression, aMap);
delimiter = reader.getNext();
while (reader.hasNext() && !reader.peek().equals(delimiter)) {
- result.append(reader.getNext());
+ if (reader.peek().charValue()==STRING_ESCAPE_CHARACTER) {
+ reader.getNext();
+ if (reader.hasNext())
+ result.append(reader.getNext());
+ }
+ else {
+ result.append(reader.getNext());
+ }
}
if (!reader.hasNext())
}
try {
- return new LiteralToken(Integer.getInteger(result.toString()));
+ return new LiteralToken(new Integer(Integer.parseInt(result.toString())));
}
catch (NumberFormatException e) {
throw new RuntimeException("Invalid number: " + e.getMessage());
}
}
+ public int parseInteger() {
+ try {
+ return interpretAsInteger(parseWhole());
+ }
+ catch (Throwable t) {
+ t.printStackTrace(System.out);
+ throw new RuntimeException("Parser error at position "+getLocation()+":"+t.getMessage());
+ }
+ }
+
public String parseString() {
try {
return interpretAsString(parseWhole());
}
private int interpretAsInteger(Object aValue) {
+ System.out.println(" interpret: " + aValue );
+
if (aValue instanceof Integer)
return ((Integer) aValue).intValue();
+ if (aValue instanceof String) {
+ try {
+ return Integer.parseInt((String) aValue);
+ }
+ catch (Throwable t) {
+ }
+ }
+
throw new RuntimeException("Not an integer");
}
configMap.put("imagePath", MirGlobal.getConfigProperty("Producer.Image.Path"));
configMap.put("mirVersion", MirGlobal.getConfigProperty("Mir.Version"));
configMap.put("defEncoding", MirGlobal.getConfigProperty("Mir.DefaultEncoding"));
+ configMap.put("all", Configuration.getConfs());
utilityMap.put("compressWhitespace", new freemarker.template.utility.CompressWhitespace() );
utilityMap.put("encodeHTML", new GeneratorHTMLFunctions.encodeHTMLGeneratorFunction());
EntityList languageList=null;
try {
- ModuleLinksImcs linksImcsModule = new ModuleLinksImcs(DatabaseLinksImcs.getInstance());
+// ModuleLinksImcs linksImcsModule = new ModuleLinksImcs(DatabaseLinksImcs.getInstance());
ModuleTopics topicsModule = new ModuleTopics(DatabaseTopics.getInstance());
ModuleLanguage languageModule = new ModuleLanguage(DatabaseLanguage.getInstance());
topicList = topicsModule.getTopicsList();
- entityList = linksImcsModule.getByWhereClause("", "sortpriority, title", -1);
- parentList = linksImcsModule.getByWhereClause("to_parent_id=NULL", "sortpriority, title", -1);
+// entityList = linksImcsModule.getByWhereClause("", "sortpriority, title", -1);
+// parentList = linksImcsModule.getByWhereClause("to_parent_id=NULL", "sortpriority, title", -1);
languageList = languageModule.getByWhereClause("", "id", -1);
}
catch (Throwable t) {