diff options
| author | Andrew Branson <andrew.branson@cern.ch> | 2014-10-07 09:18:11 +0200 |
|---|---|---|
| committer | Andrew Branson <andrew.branson@cern.ch> | 2014-10-07 09:18:11 +0200 |
| commit | 0ed2c1124cf1b9e49a2ec1fa0126a8df09f9e758 (patch) | |
| tree | e3a56cee83865f8c703deb790c15d3e79e871a82 /src/main/java/org/cristalise/kernel/collection/Dependency.java | |
| parent | 50aa8aaab42fa62267aa1ae6a6070013096f5082 (diff) | |
Repackage to org.cristalise
Diffstat (limited to 'src/main/java/org/cristalise/kernel/collection/Dependency.java')
| -rw-r--r-- | src/main/java/org/cristalise/kernel/collection/Dependency.java | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/src/main/java/org/cristalise/kernel/collection/Dependency.java b/src/main/java/org/cristalise/kernel/collection/Dependency.java new file mode 100644 index 0000000..1641756 --- /dev/null +++ b/src/main/java/org/cristalise/kernel/collection/Dependency.java @@ -0,0 +1,147 @@ +/**
+ * This file is part of the CRISTAL-iSE kernel.
+ * Copyright (c) 2001-2014 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.lookup.ItemPath;
+import org.cristalise.kernel.utils.CastorHashMap;
+import org.cristalise.kernel.utils.KeyValuePair;
+import org.cristalise.kernel.utils.Logger;
+
+
+/**
+ * A Collection implementation that contains a variable number of members of the
+ * same type, like a variable-length array. CollectionMembers are created and
+ * destroyed as needed. A Dependency never contains empty slots, nor duplicated
+ * members.
+ *
+ * <p>ClassProps are stored at the collection level and duplicated in each slot.
+ * Slots may still have their own individual properties annotating their link.
+ *
+ * Predefined steps managing Dependencies:
+ *
+ * <ul>
+ * <li>
+ */
+public class Dependency extends Collection<DependencyMember>
+{
+
+ protected CastorHashMap mProperties = new CastorHashMap();
+ protected String mClassProps = "";
+
+ public Dependency()
+ {
+ setName("Dependency");
+ }
+
+ public Dependency(String name)
+ {
+ setName(name);
+ }
+
+ public CastorHashMap getProperties() {
+ return mProperties;
+ }
+
+ public void setProperties(CastorHashMap props) {
+ mProperties = props;
+ }
+
+ public KeyValuePair[] getKeyValuePairs()
+ {
+ return mProperties.getKeyValuePairs();
+ }
+ public void setKeyValuePairs(KeyValuePair[] pairs)
+ {
+ mProperties.setKeyValuePairs(pairs);
+ }
+
+ public void setClassProps(String classProps) {
+ this.mClassProps = classProps;
+ }
+
+ public String getClassProps() {
+ return mClassProps;
+ }
+
+ public DependencyMember addMember(ItemPath itemPath) throws InvalidCollectionModification, ObjectAlreadyExistsException {
+ if (contains(itemPath)) throw new ObjectAlreadyExistsException("Item "+itemPath+" already exists in Dependency "+getName());
+ // create member object
+ DependencyMember depMember = new DependencyMember();
+ depMember.setID(getCounter());
+ depMember.setProperties((CastorHashMap)mProperties.clone());
+ depMember.setClassProps(mClassProps);
+
+ // assign entity
+ depMember.assignItem(itemPath);
+ mMembers.list.add(depMember);
+ Logger.msg(8, "Dependency::addMember(" + itemPath + ") added to children.");
+ return depMember;
+ }
+
+ @Override
+ public DependencyMember addMember(ItemPath itemPath, CastorHashMap props, String classProps)
+ throws InvalidCollectionModification, ObjectAlreadyExistsException
+ {
+ if (contains(itemPath)) throw new ObjectAlreadyExistsException("Item "+itemPath+" already exists in Dependency "+getName());
+ if (classProps != null && !classProps.equals(mClassProps))
+ throw new InvalidCollectionModification("Cannot change classProps in dependency member");
+ DependencyMember depMember = new DependencyMember();
+ depMember.setID(getCounter());
+
+ // merge props
+ CastorHashMap newProps = new CastorHashMap();
+ for (Object name : props.keySet()) {
+ String key = (String)name;
+ newProps.put(key, props.get(key));
+
+ }
+ // class props override local
+ for (Object name : mProperties.keySet()) {
+ String key = (String)name;
+ newProps.put(key, mProperties.get(key));
+
+ }
+ depMember.setProperties(newProps);
+ depMember.setClassProps(mClassProps);
+
+ // assign entity
+ depMember.assignItem(itemPath);
+ mMembers.list.add(depMember);
+ Logger.msg(8, "Dependency::addMember(" + itemPath + ") added to children.");
+ return depMember;
+ }
+
+ @Override
+ public void removeMember(int memberId) throws ObjectNotFoundException {
+ for (DependencyMember element : mMembers.list) {
+ if (element.getID() == memberId) {
+ mMembers.list.remove(element);
+ return;
+ }
+ }
+ throw new ObjectNotFoundException("Member "+memberId+" not found");
+ }
+
+}
|
