001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017: package org.apache.cocoon.woody.binding;
018:
019: import java.util.HashMap;
020: import java.util.Map;
021:
022: import org.apache.avalon.framework.CascadingRuntimeException;
023: import org.apache.cocoon.components.CocoonComponentManager;
024: import org.apache.cocoon.woody.formmodel.Widget;
025: import org.apache.cocoon.woody.util.JavaScriptHelper;
026: import org.apache.commons.jxpath.JXPathContext;
027: import org.apache.commons.jxpath.Pointer;
028: import org.mozilla.javascript.Script;
029:
030: /**
031: *
032: * @author <a href="http://www.apache.org/~sylvain/">Sylvain Wallez</a>
033: * @version CVS $Id: JavaScriptJXPathBinding.java 433543 2006-08-22 06:22:54Z crossley $
034: */
035: public class JavaScriptJXPathBinding extends JXPathBindingBase {
036:
037: private final String id;
038: private final String path;
039: private final Script loadScript;
040: private final Script saveScript;
041:
042: public JavaScriptJXPathBinding(
043: JXPathBindingBuilderBase.CommonAttributes commonAtts,
044: String id, String path, Script loadScript, Script saveScript) {
045: super (commonAtts);
046: this .id = id;
047: this .path = path;
048: this .loadScript = loadScript;
049: this .saveScript = saveScript;
050: }
051:
052: public void doLoad(Widget frmModel, JXPathContext jctx) {
053: if (this .loadScript != null) {
054: Widget widget = frmModel.getWidget(this .id);
055:
056: // Move to widget context
057: Pointer pointer = jctx.getPointer(this .path);
058:
059: // FIXME: remove this ugly hack and get the request from the
060: // Avalon context once binding builder are real components
061: Map objectModel = CocoonComponentManager
062: .getCurrentEnvironment().getObjectModel();
063:
064: try {
065: Map values = new HashMap(3);
066: values.put("widget", widget);
067: values.put("jxpathPointer", pointer);
068: if (pointer.getNode() != null) {
069: values.put("jxpathContext", jctx
070: .getRelativeContext(pointer));
071: }
072:
073: JavaScriptHelper.execScript(this .loadScript, values,
074: objectModel);
075:
076: } catch (RuntimeException re) {
077: // rethrow
078: throw re;
079: } catch (Exception e) {
080: throw new CascadingRuntimeException(
081: "Error invoking JavaScript event handler", e);
082: }
083: } else {
084: if (this .getLogger().isInfoEnabled()) {
085: this .getLogger().info(
086: "[Javascript Binding] - loadForm: No javascript code avaliable. Widget id="
087: + this .getId());
088: }
089: }
090: }
091:
092: public void doSave(Widget frmModel, JXPathContext jctx)
093: throws BindingException {
094: if (this .saveScript != null) {
095: Widget widget = frmModel.getWidget(this .id);
096:
097: // Move to widget context and create the path if needed
098: Pointer pointer = jctx.createPath(this .path);
099: JXPathContext widgetCtx = jctx.getRelativeContext(pointer);
100: try {
101: // FIXME: remove this ugly hack and get the request from the Avalon context once
102: // binding builder are real components
103: Map objectModel = CocoonComponentManager
104: .getCurrentEnvironment().getObjectModel();
105:
106: Map values = new HashMap();
107: values.put("widget", widget);
108: values.put("jxpathContext", widgetCtx);
109: values.put("jxpathPointer", pointer);
110:
111: JavaScriptHelper.execScript(this .saveScript, values,
112: objectModel);
113:
114: } catch (RuntimeException re) {
115: // rethrow
116: throw re;
117: } catch (Exception e) {
118: throw new CascadingRuntimeException(
119: "Error invoking JavaScript event handler", e);
120: }
121: } else {
122: if (this .getLogger().isInfoEnabled()) {
123: this
124: .getLogger()
125: .info(
126: "[Javascript Binding] - saveForm: No javascript code avaliable. <wb:javascript id="
127: + this .getId() + ">");
128: }
129: }
130: }
131: }
|