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

org.cristalise.kernel.collection.DependencyMember Maven / Gradle / Ivy

/**
 * This file is part of the CRISTAL-iSE kernel.
 * Copyright (c) 2001-2015 The CRISTAL Consortium. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published
 * by the Free Software Foundation; either version 3 of the License, or (at
 * your option) any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; with out even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
 * License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this library; if not, write to the Free Software Foundation,
 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 *
 * http://www.fsf.org/licensing/licenses/lgpl.html
 */
package org.cristalise.kernel.collection;

import java.util.StringTokenizer;
import java.util.Map.Entry;

import org.cristalise.kernel.common.InvalidCollectionModification;
import org.cristalise.kernel.common.InvalidDataException;
import org.cristalise.kernel.common.ObjectNotFoundException;
import org.cristalise.kernel.entity.proxy.ItemProxy;
import org.cristalise.kernel.graph.model.BuiltInVertexProperties;
import org.cristalise.kernel.lookup.InvalidItemPathException;
import org.cristalise.kernel.lookup.ItemPath;
import org.cristalise.kernel.persistency.ClusterType;
import org.cristalise.kernel.process.Gateway;
import org.cristalise.kernel.property.Property;
import org.cristalise.kernel.scripting.Script;
import org.cristalise.kernel.scripting.ScriptingEngineException;
import org.cristalise.kernel.utils.CastorHashMap;
import org.cristalise.kernel.utils.KeyValuePair;
import org.cristalise.kernel.utils.LocalObjectLoader;
import org.cristalise.kernel.utils.Logger;

public class DependencyMember implements CollectionMember {
    private ItemPath      mItemPath   = null;
    private ItemProxy     mItem       = null;
    private int           mId         = -1;
    private CastorHashMap mProperties = null;
    private String        mClassProps;

    public DependencyMember() {
        mProperties = new CastorHashMap();
    }

    @Override
    public ItemPath getItemPath() {
        return mItemPath;
    }

    public void setProperties(CastorHashMap props) {
        mProperties = props;
    }

    @Override
    public CastorHashMap getProperties() {
        return mProperties;
    }

    public KeyValuePair[] getKeyValuePairs() {
        return mProperties.getKeyValuePairs();
    }

    public void setKeyValuePairs(KeyValuePair[] pairs) {
        mProperties.setKeyValuePairs(pairs);
    }

    @Override
    public int getID() {
        return mId;
    }

    public void setID(int id) {
        mId = id;
    }

    public void setClassProps(String props) {
        mClassProps = props;
    }

    @Override
    public String getClassProps() {
        return mClassProps;
    }

    @Override
    public void assignItem(ItemPath itemPath) throws InvalidCollectionModification {
        if (itemPath != null) {
            if (mClassProps == null || getProperties() == null)
                throw new InvalidCollectionModification("ClassProps not yet set. Cannot check membership validity.");

            // for each mandatory prop check if its in the member property and has the matching value
            StringTokenizer sub = new StringTokenizer(mClassProps, ",");

            while (sub.hasMoreTokens()) {
                String aClassProp = sub.nextToken();
                try {
                    String memberValue = (String) getProperties().get(aClassProp);
                    Property ItemProperty = (Property) Gateway.getStorage().get(itemPath, ClusterType.PROPERTY + "/" + aClassProp, null);

                    if (ItemProperty == null)
                        throw new InvalidCollectionModification("Property " + aClassProp + " does not exist for item " + itemPath);

                    if (!ItemProperty.getValue().equalsIgnoreCase(memberValue))
                        throw new InvalidCollectionModification("DependencyMember::checkProperty() Values of mandatory prop " + aClassProp
                                + " do not match " + ItemProperty.getValue() + "!=" + memberValue);
                }
                catch (Exception ex) {
                    Logger.error(ex);
                    throw new InvalidCollectionModification("Error checking properties");
                }
            }
        }

        mItemPath = itemPath;
        mItem = null;
    }

    @Override
    public void clearItem() {
        mItemPath = null;
        mItem = null;
    }

    @Override
    public ItemProxy resolveItem() throws ObjectNotFoundException {
        if (mItem == null && mItemPath != null)
            mItem = Gateway.getProxyManager().getProxy(mItemPath);
        return mItem;
    }

    public void setChildUUID(String uuid) throws InvalidCollectionModification, InvalidItemPathException {
        mItemPath = new ItemPath(uuid);
    }

    @Override
    public String getChildUUID() {
        return mItemPath.getUUID().toString();
    }

    public Object getBuiltInProperty(BuiltInVertexProperties prop) {
        return mProperties.get(prop.getName());
    }

    public void setBuiltInProperty(BuiltInVertexProperties prop, Object val) {
        mProperties.put(prop.getName(), val);
    }

    /**
     * 
     * @return either PropertyArrayList or CastorHashMap
     * 
     * @throws InvalidDataException
     * @throws ObjectNotFoundException
     */
    protected Object evaluateScript() throws InvalidDataException, ObjectNotFoundException {
        Logger.msg(5, "DependencyMember.evaluateScript() - memberUUID:" + getChildUUID());
        Script script = LocalObjectLoader.getScript(getProperties());

        try {
            script.setInputParamValue("dependencyMember", this);

            script.setInputParamValue("storage", Gateway.getStorage());
            script.setInputParamValue("proxy", Gateway.getProxyManager());
            script.setInputParamValue("lookup", Gateway.getLookup());

            return script.evaluate(getItemPath(), getProperties(), null, null);
        }
        catch (ScriptingEngineException e) {
            Logger.error(e);
            throw new InvalidDataException(e.getMessage());
        }
    }
    
    /**
     * Only update existing properties otherwise throw an exception
     * 
     * @param newProps the new properties 
     * @throws ObjectNotFoundException property does not exists for member
     * @throws InvalidCollectionModification cannot update class properties
     */
    public void updateProperties(CastorHashMap newProps) throws ObjectNotFoundException, InvalidCollectionModification {
        for (Entry newProp: newProps.entrySet()) {
            if (mClassProps.contains(newProp.getKey()))
                throw new InvalidCollectionModification("Dependency cannot change classProperties:"+mClassProps);

            if (getProperties().containsKey(newProp.getKey())) getProperties().put(newProp.getKey(), newProp.getValue());
            else
                throw new ObjectNotFoundException("Property "+newProp.getKey()+" does not exists for slotID:" + getID());
        }
        
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy