001: /*
002: * JFolder, Copyright 2001-2006 Gary Steinmetz
003: *
004: * Distributable under LGPL license.
005: * See terms of license at gnu.org.
006: */
007:
008: package org.jfolder.common.function.v1;
009:
010: //base classes
011: import java.math.BigDecimal;
012:
013: //project specific classes
014: import org.jfolder.common.SelfArgumentlessConstructor;
015: import org.jfolder.common.StandardDataTypes;
016: import org.jfolder.common.UnexpectedSystemException;
017: import org.jfolder.common.function.BaseCommonFunctionCompatibilityTag;
018: import org.jfolder.common.function.WebPageTagInstanceViewContext;
019: import org.jfolder.common.function.WebPageTagInstanceViewContextInfo;
020: import org.jfolder.common.tagging.AppraiseConceptTagContext;
021: import org.jfolder.common.tagging.ConceptTagCharacteristic;
022: import org.jfolder.common.tagging.ConceptTagConstraint;
023: import org.jfolder.common.tagging.ConceptTagConstraintHolder;
024: import org.jfolder.common.tagging.ConceptTagFlagsHelper;
025: import org.jfolder.common.tagging.DetermineClassConceptTagContext;
026: import org.jfolder.common.tagging.DetermineValueAndClassConceptTagContext;
027: import org.jfolder.common.tagging.DetermineValueAndClassConceptTagException;
028: import org.jfolder.common.tagging.DynamicConceptTagConstraintContext;
029: import org.jfolder.common.tagging.InitializeConceptTagContext;
030: import org.jfolder.common.tagging.ReturnableConceptTag;
031: import org.jfolder.common.tagging.SelectionCriteriaForReturnableConceptTag;
032: import org.jfolder.common.tagging.StaticConceptTagConstraintContext;
033: import org.jfolder.common.tagging.StudioConceptTagCreParInfoContext;
034: import org.jfolder.common.tagging.StudioConceptTagInstanceInfoContext;
035: import org.jfolder.common.tagging.StudioConceptTagTypeInfoContext;
036: import org.jfolder.common.tagging.ValueAndClassForConceptTag;
037: import org.jfolder.common.utils.misc.CommonExpressions;
038: import org.jfolder.common.utils.misc.MiscHelper;
039:
040: //other classes
041:
042: public class CommonFunctionMathAddTag extends
043: BaseCommonFunctionCompatibilityTag implements
044: SelfArgumentlessConstructor {
045:
046: //characteristics
047: private ConceptTagCharacteristic addendCtchar = null;
048:
049: //addend details
050: private final static String ADDEND_CTCON = "addend";
051: private final static String ADDEND_TITLE = "Addends";
052: private final static String ADDEND_SHORT_DESCRIPTION = "Numbers to be added to produce the sum";
053:
054: public void initialize(InitializeConceptTagContext inIctc) {
055:
056: //
057: ConceptTagConstraintHolder rootCtconh = ConceptTagConstraintHolder
058: .newInstance(inIctc);
059:
060: //constrain "addend"
061: ConceptTagConstraint addendCtcon = ConceptTagConstraint
062: .newInstance(ADDEND_CTCON, rootCtconh);
063: addendCtcon.setMinimumLength(2);
064: addendCtcon.setLengthUnbounded(true);
065: addendCtcon.setTitle(ADDEND_TITLE);
066: addendCtcon.setShortDescription(ADDEND_SHORT_DESCRIPTION);
067: //
068: StaticConceptTagConstraintContext addendSctcc = StaticConceptTagConstraintContext
069: .newInstance(addendCtcon);
070: addendSctcc.setRegularExpression(CommonExpressions.DECIMAL);
071: //
072: DynamicConceptTagConstraintContext addendDctcc = DynamicConceptTagConstraintContext
073: .newInstance(addendCtcon);
074: addendDctcc.getValidator().allowReturnOfOnlyDecimal();
075: addendDctcc.getValidator().filterDirectChildOfRootAndHtml();
076: //
077: addendSctcc.addDefaultValue("0");
078: addendSctcc.addDefaultValue("0");
079:
080: //
081: ConceptTagFlagsHelper
082: .pushNonIterativeCommonFunctionDepth(inIctc);
083: inIctc.initialize();
084: ConceptTagFlagsHelper
085: .popNonIterativeCommonFunctionDepth(inIctc);
086:
087: //initialize characteristics
088: this .addendCtchar = addendCtcon.getCharacteristic();
089: this .removeThisInitialized = true;
090: }
091:
092: private boolean removeThisInitialized = false;
093:
094: public void appraise(AppraiseConceptTagContext inActc) {
095:
096: if (inActc instanceof StudioConceptTagInstanceInfoContext) {
097:
098: if (this .addendCtchar == null) {
099: MiscHelper
100: .println("ComFuncMathAddTag appraise null found");
101: }
102:
103: StudioConceptTagInstanceInfoContext sctiic = (StudioConceptTagInstanceInfoContext) inActc;
104:
105: StringBuffer titleSb = new StringBuffer("");
106: StringBuffer descSb = new StringBuffer("");
107: for (int i = 0; i < this .addendCtchar.getValueLength(); i++) {
108: if (i > 0) {
109: titleSb.append(" + ");
110: descSb.append(" + ");
111: }
112: if (this .addendCtchar.isHolderWithConceptTag(i, inActc)) {
113: StudioConceptTagInstanceInfoContext nextStiic = this .addendCtchar
114: .getInstanceInformation(i);
115: titleSb.append(nextStiic.getInstanceTitle());
116: descSb.append(nextStiic.getInstanceDescription());
117: } else if (this .addendCtchar.isStatic(i, inActc)) {
118: titleSb.append(this .addendCtchar.getValueAsString(
119: i, inActc));
120: descSb.append(this .addendCtchar.getValueAsString(i,
121: inActc));
122: }
123: }
124: sctiic.setInstanceTitle(titleSb.toString());
125: sctiic.setInstanceDescription(descSb.toString());
126: } else if (inActc instanceof StudioConceptTagTypeInfoContext) {
127:
128: StudioConceptTagTypeInfoContext scttic = (StudioConceptTagTypeInfoContext) inActc;
129:
130: scttic.setTypeTitle("Add");
131: scttic.setTypeDescription("Add two or more numbers");
132: } else if (inActc instanceof WebPageTagInstanceViewContext) {
133:
134: WebPageTagInstanceViewContext wptivc = (WebPageTagInstanceViewContext) inActc;
135:
136: WebPageTagInstanceViewContextInfo info = wptivc
137: .getInfoAsNonHtml();
138:
139: //
140: info.setNonHtmlContent("Add(", ")");
141: for (int i = 0; i < this .addendCtchar.getValueLength(); i++) {
142: //
143: WebPageTagInstanceViewContextInfo nextAddendInfo = info
144: .createNonHtmlInfo();
145: if (i > 0) {
146: nextAddendInfo.setNonHtmlContent(" + ");
147: }
148: WebPageTagInstanceViewContext.displayView(
149: this .addendCtchar, nextAddendInfo, wptivc, i,
150: i + 1);
151: }
152: //
153: if (this .addendCtchar.getValueLength() == 0) {
154: WebPageTagInstanceViewContextInfo subInfo = info
155: .createNonHtmlInfo(ADDEND_CTCON);
156: subInfo.setNonHtmlContent("???");
157: }
158: ////
159: //MiscHelper.println("ComFunMathAddTag remove test");
160: //WebPageTagInstanceViewContextInfo testInfo =
161: // info.createIterativeNonHtmlInfo();
162: //for (int i = 0; i < 5; i++) {
163: // WebPageTagInstanceViewContextInfo nextSubTestInfo =
164: // testInfo.createNonHtmlInfo();
165: // nextSubTestInfo.setStartContent("if (" + i + ") {");
166: // WebPageTagInstanceViewContextInfo nextSubSubTestInfo =
167: // nextSubTestInfo.createNonHtmlInfo();
168: // nextSubSubTestInfo.setStartContent("Hello = " + i);
169: // nextSubTestInfo.setEndContent("}");
170: //}
171: ////
172: //WebPageTagInstanceViewContextInfo test2Info =
173: // info.createIterativeNonHtmlInfo();
174: //for (int i = 0; i < 5; i++) {
175: // WebPageTagInstanceViewContextInfo nextSubTestInfo =
176: // test2Info.createNonHtmlInfo();
177: // nextSubTestInfo.setStartContent("2if (" + i + ") {");
178: // WebPageTagInstanceViewContextInfo nextSubSubTestInfo =
179: // nextSubTestInfo.createHtmlInfo();
180: // nextSubSubTestInfo.setStartContent("2Grand = " + i);
181: // nextSubTestInfo.setEndContent("2}");
182: //}
183: //
184: ////
185: //info.setEndContent(")");
186: } else if (inActc instanceof SelectionCriteriaForReturnableConceptTag) {
187:
188: SelectionCriteriaForReturnableConceptTag scfrct = (SelectionCriteriaForReturnableConceptTag) inActc;
189:
190: scfrct.canReturnDecimal();
191: scfrct.declareFormatAsPlain();
192: } else if (inActc instanceof StudioConceptTagCreParInfoContext) {
193:
194: StudioConceptTagCreParInfoContext scpc = (StudioConceptTagCreParInfoContext) inActc;
195: }
196: }
197:
198: public void determineValueAndClass(
199: DetermineValueAndClassConceptTagContext inDvacctc) {
200:
201: try {
202: ValueAndClassForConceptTag vacfct = null;
203:
204: //ComponentsForReturnableWorkflowTemplateTag wcfrt =
205: // ScriptTagHelper.getComponentsForReturnableScriptTag(inRvacc);
206:
207: BigDecimal sumBd = new BigDecimal(0);
208:
209: for (int i = 0; i < this .addendCtchar.getValueLength(); i++) {
210: if (this .addendCtchar.isStatic(i, inDvacctc)) {
211: BigDecimal bd = new BigDecimal(this .addendCtchar
212: .getValueAsString(i, inDvacctc));
213: sumBd = sumBd.add(bd);
214: } else {
215: ValueAndClassForConceptTag addendVac = this .addendCtchar
216: .getDetermineValueAndClass(i, inDvacctc);
217: Object v = addendVac.getValue();
218: BigDecimal bd = MiscHelper
219: .fromNumberToBigDecimal(v);
220: sumBd = sumBd.add(bd);
221: }
222: }
223: vacfct = ValueAndClassForConceptTag.newDecimal(sumBd);
224:
225: inDvacctc.setDetermineValueAndClass(vacfct);
226: } catch (DetermineValueAndClassConceptTagException dvaccte) {
227: inDvacctc.setDetermineException(dvaccte);
228: }
229: }
230:
231: public void determineClass(DetermineClassConceptTagContext inDcctc) {
232: inDcctc.setDetermineClass(StandardDataTypes.getDecimalClass());
233: }
234:
235: public Object createUninitializedSelf() {
236: return new CommonFunctionMathAddTag();
237: }
238: }
|