summaryrefslogtreecommitdiff
path: root/src/main/java/com/c2kernel/collection/Aggregation.java
blob: 6791b7724e418c74d5c18e31744711a4e51b03a9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
package com.c2kernel.collection;

import com.c2kernel.common.ObjectNotFoundException;
import com.c2kernel.graph.model.GraphModel;
import com.c2kernel.graph.model.GraphPoint;
import com.c2kernel.graph.model.TypeNameAndConstructionInfo;
import com.c2kernel.graph.model.Vertex;
import com.c2kernel.lookup.ItemPath;
import com.c2kernel.persistency.ClusterStorage;
import com.c2kernel.process.Gateway;
import com.c2kernel.utils.CastorHashMap;
import com.c2kernel.utils.Language;
import com.c2kernel.utils.Logger;

/**
 * @version $Revision: 1.59 $ $Date: 2004/08/10 07:56:08 $
 * @author  $Author: abranson $
 */

abstract public class Aggregation extends Collection<AggregationMember>
{

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

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

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


    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);
        Logger.msg(8, "AggregationDescription::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)
        throws MembershipException
    {
    	AggregationMember aggMem = addSlot(props, classProps, location, w, h);
        if (itemPath != null) { // some clients use this method when not setting a member
        	aggMem.assignItem(itemPath);
        	aggMem.setIsComposite( getIsComposite(itemPath, getName())  );
        }
        Logger.msg(8, "AggregationDescription::addMember(" + itemPath + ") assigned to new slot " + aggMem.getID());
        return aggMem;
    }


    @Override
	public AggregationMember addMember(ItemPath itemPath, CastorHashMap props, String classProps) throws MembershipException
    {
        return addMember(itemPath, props, classProps, null, -1, -1);
    }
    
	public AggregationMember addSlot(CastorHashMap props, String classProps)
    {
        return addSlot(props, classProps, null, -1, -1);
    }

    @Override
	public AggregationMember addMember(ItemPath itemPath) throws MembershipException {
        throw new MembershipException("Aggregations cannot accept arbitrary members without type info");

    }

    @Override
	public void removeMember(int memberId) throws MembershipException {
        for (AggregationMember element : mMembers.list) {
            if (element.getID() == memberId) {
                element.clearItem();
                mLayout.removeVertex(getLayout().getVertexById(memberId));
                return;
            }
        }
        throw new MembershipException("Member "+memberId+" not found");
    }
    
	static public boolean getIsComposite(ItemPath itemPath, String name)
	{
        if (itemPath == null) return false;
       	try {
			for(String collName: Gateway.getProxyManager().getProxy(itemPath).getContents(ClusterStorage.COLLECTION) )
					if (name == null || name.equals(collName)) return true;
		} catch (ObjectNotFoundException e) {
			return false;
		}
		return false;
	}

}