All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.globus.rsl.RslNode Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 1999-2006 University of Chicago
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.globus.rsl;

import java.util.*;

/**
 * This class represents a RSL parse tree. It is composed of variable definitions
 * (bindings), relations, and sub-specifications (sub nodes).
 */
/*
 * - when toRSL() explicit concatination is off, the quotes around Values
 *   might be wrong - fix this....
 */
public class RslNode extends AbstractRslNode {

    protected Map _relations;
    protected Map _bindings;

    public RslNode() {
	super();
    }

    public RslNode(int operator) {
	super(operator);
    }

    public Bindings put(Bindings bindings) {
	if (_bindings == null) _bindings = new HashMap();
	String attrName = bindings.getAttribute();
	return (Bindings)_bindings.put(canonicalize(attrName),
				       bindings);
    }

    public boolean add(Bindings bindings) {
	return (put(bindings) == null);
    }

    public NameOpValue put(NameOpValue relation) {
	if (_relations == null) _relations = new HashMap();
	String attrName = relation.getAttribute();
	return (NameOpValue)_relations.put(canonicalize(attrName),
					   relation);
    }

    public boolean add(NameOpValue relation) {
	return (put(relation) == null);
    }

    public void mergeTo(AbstractRslNode dstNode) {
	Iterator iter = null;
	String attr = null;

	super.mergeTo(dstNode);

	if (_relations != null) {
	    iter = _relations.keySet().iterator();
	    NameOpValue nov;
	    while(iter.hasNext()) {
		attr = (String)iter.next();
		nov = dstNode.getParam(attr);
		if (nov == null) {
		    dstNode.add( getParam(attr) );
		} else {
		    nov.merge( getParam(attr) );
		}
	    }
	}

        if (_bindings != null) {
            iter = _bindings.keySet().iterator();
            Bindings bind;
            while(iter.hasNext()) {
		attr = (String)iter.next();
		bind = dstNode.getBindings(attr);
		if (bind == null) {
		    dstNode.add( getBindings(attr) );
		} else {
		    bind.merge( getBindings(attr) );
		}
            }
        }

    }

    /**
     * Returns the relation associated with the given attribute.
     *
     * @param attribute the attribute of the relation.
     * @return the relation for the attribute. Null, if not found.
     */
    public NameOpValue getParam(String attribute) {
	if (_relations == null || attribute == null) return null;
	return (NameOpValue)_relations.get(canonicalize(attribute));
    }

    /**
     * Returns the variable definitions associated wit the given
     * attribute.
     *
     * @param attribute the attribute of the variable deinitions.
     * @return the variable deinitions for the attribute.
     *         Null, if not found.
     */
    public Bindings getBindings(String attribute) {
	if (_bindings == null || attribute == null) return null;
	return (Bindings)_bindings.get(canonicalize(attribute));
    }

    /**
     * Removes a relation for the specified attribute.
     *
     * @param attribute the attribute name for the
     *        relation to remove.
     * @return the relation that was removed.
     */
    public NameOpValue removeParam(String attribute) {
	if (_relations == null || attribute == null) return null;
	return (NameOpValue)_relations.remove(canonicalize(attribute));
    }

    /**
     * Removes a bindings list for the specified attribute.
     *
     * @param attribute the attribute name for the
     *        bindings.
     * @return the bindings that were removed.
     */
    public Bindings removeBindings(String attribute) {
        if (_relations == null || attribute == null) return null;
        return (Bindings)_bindings.remove(canonicalize(attribute));
    }

    /**
     * Returns the relations.
     *
     * @return the map of relations.
     */
    public Map getRelations() {
	return _relations;
    }

    /**
     * Returns the variable definitions.
     *
     * @return the map of variable definitions.
     */
    public Map getBindings() {
	return _bindings;
    }

    /**
     * Evalutes the rsl tree against the specified symbol table.
     * All the variable definitions are first evaluated because
     * they might update the symbol table. Then all the relations
     * followed by the sub-specifications are evaluated.
     *
     * @param symbolTable the symbol table to evalute variables against.
     * @return the evaluated rsl tree.
     * @exception RslEvaluationException If an error occured during
     *            rsl evaluation.
     */
    public AbstractRslNode evaluate(Map symbolTable)
	throws RslEvaluationException {

	if (symbolTable == null) symbolTable = new HashMap();

	Map localSymbolTable = null;
	Iterator iter;

	RslNode finalRsl = new RslNode(getOperator());

	if (_bindings != null && _bindings.size() > 0) {
	    localSymbolTable = new HashMap(symbolTable);
	    iter = _bindings.keySet().iterator();
	    Bindings binds;
	    while( iter.hasNext() ) {
		binds = getBindings( (String)iter.next() );
		finalRsl.put( binds.evaluate( localSymbolTable ) );
	    }
	} else {
	    localSymbolTable = symbolTable;
	}

	if (_relations != null && _relations.size() > 0) {
	    iter = _relations.keySet().iterator();
	    NameOpValue nov;
	    while(iter.hasNext()) {
		nov = getParam( (String)iter.next() );
		finalRsl.put( nov.evaluate(localSymbolTable) );
	    }
	}

	if (_specifications != null && _specifications.size() > 0) {
	    iter = _specifications.iterator();
	    AbstractRslNode node;
	    while(iter.hasNext()) {
		node = (AbstractRslNode)iter.next();
		finalRsl.add( node.evaluate(localSymbolTable) );
	    }
	}

	return finalRsl;
    }

    /**
     * Produces a RSL representation of node.
     *
     * @param buf buffer to add the RSL representation to.
     * @param explicitConcat if true explicit concatination will
     *        be used in RSL strings.
     */
    public void toRSL(StringBuffer buf, boolean explicitConcat) {
	Iterator iter;

	buf.append( getOperatorAsString() );

	if (_bindings != null && _bindings.size() > 0) {
	    iter = _bindings.keySet().iterator();
	    Bindings binds;
	    while( iter.hasNext() ) {
		binds = getBindings( (String)iter.next() );
		binds.toRSL(buf, explicitConcat);
	    }
	}

	if (_relations != null && _relations.size() > 0) {
	    iter = _relations.keySet().iterator();
	    NameOpValue nov;
	    while(iter.hasNext()) {
		nov = getParam( (String)iter.next() );
		nov.toRSL(buf, explicitConcat);
	    }
	}

	if (_specifications != null && _specifications.size() > 0) {
	    iter = _specifications.iterator();
	    AbstractRslNode node;
	    while(iter.hasNext()) {
		node = (AbstractRslNode)iter.next();
		buf.append(" (");
		node.toRSL(buf, explicitConcat);
		buf.append(" )");
	    }
	}
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy