org.objectstyle.wolips.ruleeditor.model.RightHandSide.java Source code

Java tutorial

Introduction

Here is the source code for org.objectstyle.wolips.ruleeditor.model.RightHandSide.java

Source

/*
 * ====================================================================
 * 
 * The ObjectStyle Group Software License, Version 1.0
 * 
 * Copyright (c) 2005 The ObjectStyle Group and individual authors of the
 * software. All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 * 1. Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 * 
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 * 
 * 3. The end-user documentation included with the redistribution, if any, must
 * include the following acknowlegement: "This product includes software
 * developed by the ObjectStyle Group (http://objectstyle.org/)." Alternately,
 * this acknowlegement may appear in the software itself, if and wherever such
 * third-party acknowlegements normally appear.
 * 
 * 4. The names "ObjectStyle Group" and "Cayenne" must not be used to endorse or
 * promote products derived from this software without prior written permission.
 * For written permission, please contact andrus@objectstyle.org.
 * 
 * 5. Products derived from this software may not be called "ObjectStyle" nor
 * may "ObjectStyle" appear in their names without prior written permission of
 * the ObjectStyle Group.
 * 
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * OBJECTSTYLE GROUP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 * 
 * This software consists of voluntary contributions made by many individuals on
 * behalf of the ObjectStyle Group. For more information on the ObjectStyle
 * Group, please see <http://objectstyle.org/>.
 *  
 */
package org.objectstyle.wolips.ruleeditor.model;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;

/**
 * @author uli
 * @author <a href="mailto:hprange@moleque.com.br">Henrique Prange</a>
 * @author <a href="mailto:frederico@moleque.com.br">Frederico Lellis</a>
 * @author <a href="mailto:georg@moleque.com.br">Georg von Blow</a>
 */
public class RightHandSide extends AbstractRuleElement {

    protected static final String DEFAULT_ASSIGNMENT_CLASS_NAME = "com.webobjects.directtoweb.Assignment";

    protected static final String KEY_PATH_KEY = "keyPath";

    protected static final String VALUE_KEY = "value";

    private String keyPath;

    Object value;

    protected RightHandSide() {
        this(new HashMap<String, Object>());

        setAssignmentClassName(DEFAULT_ASSIGNMENT_CLASS_NAME);
        setValue("");
        setKeyPath("");
    }

    protected RightHandSide(final Map properties) {
        super(properties);

        value = properties.get(VALUE_KEY);
        keyPath = (String) properties.get(KEY_PATH_KEY);
    }

    public String getKeyPath() {
        return keyPath;
    }

    public String getValue() {
        return valueForObject(value);
    }

    private Object parseValueString(String value) {
        value = StringUtils.remove(value, "\"");

        // When its an Array
        if (value.startsWith("(")) {
            value = StringUtils.substring(value, 1, value.length() - 1);

            String[] arrayComponents = Pattern.compile(",").split(value);

            ArrayList<Object> array = new ArrayList<Object>();

            for (String expression : arrayComponents) {
                expression = expression.trim();

                if ("".equals(expression)) {
                    continue;
                }

                array.add(parseValueString(expression));
            }

            return array;
        }
        // When its a Dictionary
        else if (value.startsWith("{")) {
            Map<String, Object> dictionary = new HashMap<String, Object>();

            value = StringUtils.substring(value, 1, value.lastIndexOf(";"));

            String[] dictionaryComponents = Pattern.compile(";").split(value);

            for (String expression : dictionaryComponents) {
                String key = expression.substring(0, expression.indexOf("=")).trim();

                Object dictionaryValue = parseValueString(
                        expression.substring(expression.indexOf("=") + 1, expression.length()).trim());

                dictionary.put(key, dictionaryValue);
            }
            return dictionary;
        }

        // So its a String
        return value;
    }

    public void setKeyPath(final String keyPath) {
        String oldValue = this.keyPath;

        this.keyPath = keyPath;

        firePropertyChange(KEY_PATH_KEY, oldValue, this.keyPath);
    }

    public void setValue(final String newValue) {
        String oldValue = getValue();

        value = parseValueString(newValue.trim());

        firePropertyChange(VALUE_KEY, oldValue, newValue);
    }

    @Override
    public Map<String, Object> toMap() {
        Map<String, Object> rhsMap = new HashMap<String, Object>();

        rhsMap.put(CLASS_KEY, getAssignmentClassName());
        rhsMap.put(KEY_PATH_KEY, getKeyPath());
        rhsMap.put(VALUE_KEY, value);

        return rhsMap;
    }

    private String valueForObject(Object object) {
        if (object == null) {
            return null;
        }

        if (object instanceof Collection) {
            Collection<Object> arrayOfValues = (Collection<Object>) object;

            if (arrayOfValues.size() == 0) {
                return "()";
            }

            StringBuffer buffer = new StringBuffer();

            buffer.append("( ");

            for (Object value : arrayOfValues) {
                buffer.append(valueForObject(value));
                buffer.append(", ");
            }

            buffer.deleteCharAt(buffer.lastIndexOf(", "));
            buffer.append(")");

            return buffer.toString();
        }

        if (object instanceof Map) {
            Map<Comparable, ?> mapOfValues = (Map<Comparable, ?>) object;

            StringBuffer buffer = new StringBuffer();

            buffer.append("{ ");

            ArrayList<Comparable> list = new ArrayList<Comparable>();

            list.addAll(mapOfValues.keySet());

            Collections.sort(list);

            for (Object key : list) {
                buffer.append("\"");
                buffer.append(key);
                buffer.append("\" = ");
                buffer.append(valueForObject(mapOfValues.get(key)));
                buffer.append("; ");
            }

            buffer.append("}");

            return buffer.toString();
        }

        return "\"" + object.toString() + "\"";
    }
}