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

org.cristalise.kernel.property.PropertyUtility 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.property;

import static org.cristalise.kernel.persistency.ClusterType.VIEWPOINT;
import static org.cristalise.kernel.process.resource.BuiltInResources.PROPERTY_DESC_RESOURCE;
import static org.cristalise.kernel.property.BuiltInItemProperties.NAME;
import static org.cristalise.kernel.property.BuiltInItemProperties.TYPE;
import java.util.ArrayList;
import java.util.Iterator;
import org.apache.commons.lang3.StringUtils;
import org.cristalise.kernel.common.ObjectCannotBeUpdated;
import org.cristalise.kernel.common.ObjectNotFoundException;
import org.cristalise.kernel.common.PersistencyException;
import org.cristalise.kernel.lookup.ItemPath;
import org.cristalise.kernel.persistency.ClusterType;
import org.cristalise.kernel.persistency.outcome.Outcome;
import org.cristalise.kernel.process.Gateway;
import org.cristalise.kernel.utils.CastorHashMap;
import org.cristalise.kernel.utils.LocalObjectLoader;
import org.cristalise.kernel.utils.Logger;

/**
 * Utility class to handle operations of ItemProperties and their description
 */
public class PropertyUtility {
    
    /**
     * Reads the default value of the Property
     * 
     * @param pdlist the list of Properties to search
     * @param name name of the Property to search for
     * @return the defeult value of the property. Can be null.
     * @deprecated badly named method, use getDefaultValue() instead
     */
    static public String getValue(ArrayList pdlist, String name) {
        return getDefaultValue(pdlist, name);
    }

    /**
     * Reads the default value of the Property
     * 
     * @param pdlist the list of Properties to search
     * @param name name of the Property to search for
     * @return the defeult value of the property. Can be null.
     */
    static public String getDefaultValue(ArrayList pdlist, String name) {
        for (PropertyDescription pd : pdlist) {
            if (name.equalsIgnoreCase(pd.getName())) return pd.getDefaultValue();
        }
        return null;
    }

    /**
     * 
     * @param itemPath
     * @param propName
     * @param locker
     * @return
     */
    public static boolean propertyExists(ItemPath itemPath, String propName, Object locker) {
        try {
            String[] contents = Gateway.getStorage().getClusterContents(itemPath, ClusterType.PROPERTY);

            for (String name: contents) if(name.equals(propName)) return true;
        }
        catch (PersistencyException e) {
            Logger.error(e);
        }
        return false;
    }

    /**
     * 
     * @param itemPath
     * @param prop
     * @param locker
     * @return
     * @throws ObjectNotFoundException
     */
    public static Property getProperty(ItemPath itemPath, BuiltInItemProperties prop, Object locker) throws ObjectNotFoundException {
        return getProperty(itemPath, prop.getName(), locker);
    }

    /**
     * 
     * @param itemPath
     * @param propName
     * @param locker
     * @return
     * @throws ObjectNotFoundException
     */
    public static Property getProperty(ItemPath itemPath, String propName, Object locker) throws ObjectNotFoundException {
        try {
            return (Property)Gateway.getStorage().get(itemPath, ClusterType.PROPERTY+"/"+propName, locker);
        }
        catch (PersistencyException e) {
            Logger.error(e);
        }
        return null;
    }

    /**
     * 
     * @param pdlist
     * @return
     */
    static public String getNames(ArrayList pdlist) {
        StringBuffer names = new StringBuffer();

        for (PropertyDescription value : pdlist)
            names.append(value.getDefaultValue()).append(" ");

        return names.toString();
    }

    /**
     * 
     * @param pdlist
     * @return
     */
    static public String getClassIdNames(ArrayList pdlist) {
        StringBuffer names = new StringBuffer();

        for (Iterator iter = pdlist.iterator(); iter.hasNext();) {
            PropertyDescription pd = iter.next();

            if (pd.getIsClassIdentifier()) names.append(pd.getName());
            if (iter.hasNext()) names.append(",");
        }
        return names.toString();
    }

    /**
     * Reads the PropertyDescriptionList either from a built-in type of Item using LocalObjectLoader 
     * or from the 'last' Viewpoint of the 'PropertyDescription' Outcome in the Item (very likely a Factory Item).
     * 
     * @param itemPath the Item containing the PropertyDescriptionList
     * @param descVer the version of the PropertyDescriptionList
     * @param locker transaction key
     * @return the PropertyDescriptionList
     * @throws ObjectNotFoundException PropertyDescriptionList cannot be retrieved
     */
    static public PropertyDescriptionList getPropertyDescriptionOutcome(ItemPath itemPath, String descVer, Object locker) throws ObjectNotFoundException {
        try {
            //the type of the Item is a PropertyDesc
            if (getProperty(itemPath, TYPE, locker).getValue().equals(PROPERTY_DESC_RESOURCE.getSchemaName())) {
                String name = getProperty(itemPath, NAME, locker).getValue();

                int version = getVersionID(itemPath, descVer, PROPERTY_DESC_RESOURCE.getSchemaName(), locker);

                return LocalObjectLoader.getPropertyDescriptionList(name, version);
            }
            else  {
                //the type of the Item is very likely a Factory
                Outcome outc = (Outcome) Gateway.getStorage().get(itemPath, VIEWPOINT+"/PropertyDescription/"+descVer+"/data", locker);
                return (PropertyDescriptionList) Gateway.getMarshaller().unmarshall(outc.getData());
            }
        }
        catch (Exception ex) {
            Logger.error(ex);
            throw new ObjectNotFoundException("Could not fetch PropertyDescription from '"+itemPath+"' error:"+ex.getMessage());
        }
    }

    /**
     * 
     * @param itemPath
     * @param descVer
     * @param schema
     * @param locker
     * @return
     * @throws PersistencyException
     * @throws ObjectNotFoundException
     */
    private static int getVersionID(ItemPath itemPath, String descVer, String schema, Object locker)
        throws PersistencyException, ObjectNotFoundException
    {
        int version = 0;

        //find the 'last' version
        if ("last".equals(descVer)) {
            String[] views = Gateway.getStorage().getClusterContents(itemPath, VIEWPOINT+"/"+schema, locker);
            version = -1;

            for (int i = 0; i < views.length; i ++) {
                if (StringUtils.isNumeric(views[i])) {
                    int aVersion = Integer.parseInt(views[i]);
                    if (version < aVersion) version = aVersion;
                }
            }

            if (version == -1)
                throw new ObjectNotFoundException(String.format("itemPath:%s schema:%s does not have any version", itemPath, schema));
        }
        else {
            if (StringUtils.isNumeric(descVer)) version = Integer.parseInt(descVer);
            else throw new ObjectNotFoundException("descVer:'"+descVer+"' must be 'last' or positive integer");
        }

        return version;
    }

    /**
     * Converts transitive PropertyDescriptions to VertexProprties (CastorHashMap). ClassIdentifiers are transitive by default.
     * 
     * @param pdList the PropertyDescriptions to be used
     * @return the initialised CastorHashMap
     */
    static public CastorHashMap convertTransitiveProperties(PropertyDescriptionList pdList) {
        CastorHashMap props = new CastorHashMap();

        for (int i = 0; i < pdList.list.size(); i++) {
            PropertyDescription pd = pdList.list.get(i);

            if (pd.isTransitive()) props.put(pd.getName(), pd.getDefaultValue());
        }
        return props;
    }

    /**
     * Updates (writes) the value of an exitng Property
     * 
     * @param item the Path (UUID) of actual Item
     * @param name the name of the Property to write
     * @param value the value of the Property
     * @param locker transaction key
     * @throws PersistencyException something went wrong updating the database
     * @throws ObjectCannotBeUpdated the Property is immutable
     * @throws ObjectNotFoundException there is no Property with the given name
     */
    public static void writeProperty(ItemPath item, String name, String value, Object locker)
            throws PersistencyException, ObjectCannotBeUpdated, ObjectNotFoundException
    {
        Property prop = (Property) Gateway.getStorage().get(item, ClusterType.PROPERTY + "/" + name, locker);

        if (!prop.isMutable())
            throw new ObjectCannotBeUpdated("WriteProperty: Property '" + name + "' is not mutable.");

        //only update if the value was changed
        if (!value.equals(prop.getValue())) {
            prop.setValue(value);

            Gateway.getStorage().put(item, prop, locker);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy