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.forms.samples.bindings;
018:
019: import org.apache.cocoon.forms.binding.AbstractCustomBinding;
020: import org.apache.cocoon.forms.binding.Binding;
021: import org.apache.cocoon.forms.binding.BindingException;
022: import org.apache.cocoon.forms.formmodel.Widget;
023: import org.apache.cocoon.forms.util.DomHelper;
024: import org.apache.commons.jxpath.JXPathContext;
025: import org.w3c.dom.Element;
026:
027: /**
028: * CustomValueWrapBinding
029: */
030: public class CustomValueWrapBinding extends AbstractCustomBinding {
031:
032: private static final char DEFAULT_DELIMITER = '*';
033: private final String prefix;
034: private final String suffix;
035:
036: public CustomValueWrapBinding() {
037: this (DEFAULT_DELIMITER);
038: }
039:
040: public CustomValueWrapBinding(char delimiter) {
041: this (delimiter, delimiter);
042: }
043:
044: public CustomValueWrapBinding(char prefix, char suffix) {
045: this .prefix = "" + prefix + prefix;
046: this .suffix = "" + suffix + suffix;
047: }
048:
049: /**
050: * This unwraps the value from the model by removing the 2 prefix and suffix-chars
051: * before setting it onto the model
052: *
053: * Method signature and semantics complies to {@link AbstractCustomBinding#doLoad(Widget, JXPathContext)}
054: */
055: public void doLoad(Widget frmModel, JXPathContext jxpc)
056: throws BindingException {
057: String appValue = (String) jxpc.getValue(getXpath());
058: String formValue = null;
059: if (appValue.startsWith(this .prefix)
060: && appValue.endsWith(suffix)
061: && appValue.length() >= this .prefix.length()
062: + this .suffix.length()) {
063: formValue = appValue.substring(this .prefix.length(),
064: appValue.length() - this .suffix.length());
065: }
066: frmModel.setValue(formValue);
067: }
068:
069: /**
070: * This wraps the value from the form between 2 prefix and suffix-chars
071: * before saving to the model
072: *
073: * Method signature and semantics complies to {@link AbstractCustomBinding#doSave(Widget, JXPathContext)}
074: */
075: public void doSave(Widget frmModel, JXPathContext jxpc)
076: throws BindingException {
077: Object formValue = frmModel.getValue();
078: jxpc.setValue(getXpath(), "" + this .prefix + formValue
079: + this .suffix);
080: }
081:
082: /**
083: * Builds the actual binding class based on its XML config.
084: *
085: * @param config the {@link Element} holding the config for the binding to create.
086: * @return the configured binding
087: * @throws BindingException when the creation fails
088: */
089: public static Binding createBinding(Element config)
090: throws BindingException {
091:
092: try {
093: String pfx = DomHelper.getAttribute(config, "prefixchar",
094: null);
095: String sfx = DomHelper.getAttribute(config, "suffixchar",
096: null);
097:
098: final char prefixChar = (pfx != null) ? pfx.charAt(0)
099: : DEFAULT_DELIMITER;
100: final char suffixChar = (sfx != null) ? sfx.charAt(0)
101: : DEFAULT_DELIMITER;
102:
103: return new CustomValueWrapBinding(prefixChar, suffixChar);
104: } catch (Exception e) {
105: throw new BindingException(
106: "Could not create instance of CustomValueWrapBinding.",
107: e);
108: }
109: }
110: }
|