package org.openntf.domino.formula; import java.util.Map; import java.util.NoSuchElementException; import org.openntf.domino.Database; import org.openntf.domino.Document; import org.openntf.formula.FormulaContext; import org.openntf.formula.Function; import org.openntf.formula.FunctionFactory; import org.openntf.formula.FunctionSet; import org.openntf.formula.ValueHolder; import org.openntf.formula.annotation.ParamCount; public enum DominoFunctions { ; public static class Functions extends FunctionSet { private static final Map<String, Function> functionSet = FunctionFactory.getFunctions(DominoFunctions.class); @Override public Map<String, Function> getFunctions() { return functionSet; } } /*----------------------------------------------------------------------------*/ @ParamCount({ 1, 2 }) public static ValueHolder atEnvironment(final FormulaContext ctx, final ValueHolder[] params) { ValueHolder vh = params[0]; String value = (params.length == 1) ? null : params[1].getString(0); ValueHolder ret = ValueHolder.createValueHolder(String.class, vh.size); for (int i = 0; i < vh.size; i++) { String key = vh.getString(i); //String keyLC = key.toLowerCase(); ret.add(ctx.getEnv(key)); if (value != null) ctx.setEnv(key, value); } return ret; } /*----------------------------------------------------------------------------*/ @ParamCount(2) public static ValueHolder atSetEnvironment(final FormulaContext ctx, final ValueHolder[] params) { return atEnvironment(ctx, params); } /*----------------------------------------------------------------------------*/ @ParamCount(2) public static ValueHolder atGetDocField(final FormulaContextNotes ctx, final ValueHolder[] params) { Database db = ctx.getDatabase(); if (db == null) throw new UnsupportedOperationException("No database set: Can't execute @GetDocField"); String unid = params[0].getString(0); Map<String, Object> doc; if (unid.equals(ctx.getDocument().getUniversalID())) { doc = ctx.getDocument(); } else if ((doc = db.getDocumentByUNID(unid)) == null) { return ValueHolder.valueDefault(); } return ValueHolder.valueOf(doc.get(params[1].getString(0))); } /*----------------------------------------------------------------------------*/ @ParamCount(3) public static ValueHolder atSetDocField(final FormulaContextNotes ctx, final ValueHolder[] params) { Database db = ctx.getDatabase(); if (db == null) throw new UnsupportedOperationException("No database set: Can't execute @SetDocField"); String unid = params[0].getString(0); Map<String, Object> doc; if (unid.equals(ctx.getDocument().getUniversalID())) { doc = ctx.getDocument(); } else if ((doc = db.getDocumentByUNID(unid)) == null) { throw new NoSuchElementException("Document with UNID '" + unid + "' not found"); } doc.put(params[1].getString(0), params[2]); if (doc != ctx.getDocument()) ((Document) doc).save(); return params[2]; } /*----------------------------------------------------------------------------*/ }