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

org.cristalise.kernel.collection.Aggregation 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 org.cristalise.kernel.common.InvalidCollectionModification;
import org.cristalise.kernel.common.ObjectAlreadyExistsException;
import org.cristalise.kernel.common.ObjectNotFoundException;
import org.cristalise.kernel.common.PersistencyException;
import org.cristalise.kernel.graph.model.GraphModel;
import org.cristalise.kernel.graph.model.GraphPoint;
import org.cristalise.kernel.graph.model.TypeNameAndConstructionInfo;
import org.cristalise.kernel.graph.model.Vertex;
import org.cristalise.kernel.lookup.ItemPath;
import org.cristalise.kernel.persistency.ClusterType;
import org.cristalise.kernel.persistency.TransactionKey;
import org.cristalise.kernel.process.Gateway;
import org.cristalise.kernel.utils.CastorHashMap;

import lombok.extern.slf4j.Slf4j;

/**
 * A Collection with a graph layout
 */
@Slf4j
abstract public class Aggregation extends Collection {

    protected GraphModel mLayout = new GraphModel(new AggregationVertexOutlineCreator());

    private final TypeNameAndConstructionInfo[] mVertexTypeNameAndConstructionInfo = {
            new TypeNameAndConstructionInfo("Slot", "AggregationMember")
    };

    public Aggregation() {
        setName("Aggregation");
    }

    public Aggregation(String name) {
        setName(name);
    }

    public Aggregation(String name, Integer version) {
        setName(name);
        setVersion(version);
    }

    public GraphModel getLayout() {
        return mLayout;
    }

    public void setLayout(GraphModel layout) {
        mLayout = layout;
        layout.setVertexOutlineCreator(new AggregationVertexOutlineCreator());
    }

    public TypeNameAndConstructionInfo[] getVertexTypeNameAndConstructionInfo() {
        return mVertexTypeNameAndConstructionInfo;
    }

    public boolean exists(ItemPath itemPath) {
        for (int i = 0; i < size(); i++) {
            AggregationMember element = mMembers.list.get(i);
            if (element.getItemPath().equals(itemPath))
                return true;
        }
        return false;
    }

    public AggregationMember getMemberPair(int vertexID) {
        for (int i = 0; i < size(); i++) {
            AggregationMember element = mMembers.list.get(i);
            if (element.getID() == vertexID)
                return element;
        }
        return null;
    }

    public AggregationMember addSlot(CastorHashMap props, String classProps, GraphPoint location, int w, int h) {

        // Default geometry if not present
        if (location == null) location = new GraphPoint(100, 100 * getCounter());
        if (w < 0) w = 20;
        if (h < 0) h = 20;

        // Create new member object
        AggregationMember aggMem = new AggregationMember();
        aggMem.setProperties(props);
        aggMem.setClassProps(classProps);
        // create vertex
        Vertex vertex = new Vertex();
        vertex.setHeight(h);
        vertex.setWidth(w);
        mLayout.addVertexAndCreateId(vertex, location);
        aggMem.setCollection(this);
        aggMem.setID(vertex.getID());
        aggMem.setIsLayoutable(true);

        mMembers.list.add(aggMem);
        log.debug("addSlot() - new slot linked to vertexid " + vertex.getID());
        return aggMem;
    }

    public AggregationMember addMember(ItemPath itemPath, CastorHashMap props, String classProps, GraphPoint location, int w, int h, TransactionKey transactionKey)
            throws InvalidCollectionModification, ObjectAlreadyExistsException
    {
        AggregationMember aggMem = addSlot(props, classProps, location, w, h);
        if (itemPath != null) { // some clients use this method when not setting a member
            aggMem.assignItem(itemPath, transactionKey);
            aggMem.setIsComposite(getIsComposite(itemPath, getName(), transactionKey));
        }
        log.debug("addMember(" + itemPath + ") - assigned to new slot " + aggMem.getID());
        return aggMem;
    }

    @Override
    public AggregationMember addMember(ItemPath itemPath, CastorHashMap props, String classProps, TransactionKey transactionKey)
            throws InvalidCollectionModification, ObjectAlreadyExistsException
    {
        return addMember(itemPath, props, classProps, null, -1, -1, transactionKey);
    }

    public AggregationMember addMember(CastorHashMap props, String classProps, GraphPoint location, int w, int h, TransactionKey transactionKey)
            throws InvalidCollectionModification
    {
        try {
            return addMember(null, props, classProps, location, w, h, transactionKey);
        }
        catch (ObjectAlreadyExistsException e) { // not assigning an item so this won't happen
            return null;
        }
    }

    public AggregationMember addSlot(CastorHashMap props, String classProps) {
        return addSlot(props, classProps, null, -1, -1);
    }

    @Override
    public AggregationMember removeMember(int memberId) throws ObjectNotFoundException {
        for (AggregationMember element : mMembers.list) {
            if (element.getID() == memberId) {
                element.clearItem();
                mLayout.removeVertex(getLayout().getVertexById(memberId));
                return element;
            }
        }
        throw new ObjectNotFoundException("Member " + memberId + " not found");
    }

    static public boolean getIsComposite(ItemPath itemPath, String name, TransactionKey transactionKey) {
        if (itemPath == null) return false;
        try {
            for (String collName : Gateway.getStorage().getClusterContents(itemPath, ClusterType.COLLECTION, transactionKey)) {
                if (name == null || name.equals(collName)) return true;
            }
        }
        catch (PersistencyException e) {
            return false;
        }
        return false;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy