1 10 package org.mmbase.security.implementation.cloudcontext.builders; 11 12 import org.mmbase.security.implementation.cloudcontext.*; 13 import java.util.*; 14 import org.mmbase.module.core.*; 15 import org.mmbase.module.corebuilders.*; 16 import org.mmbase.cache.Cache; 17 import org.mmbase.util.logging.Logger; 18 import org.mmbase.util.logging.Logging; 19 import org.mmbase.storage.search.implementation.*; 20 import org.mmbase.storage.search.*; 21 22 31 public class Groups extends MMObjectBuilder { 32 private static final Logger log = Logging.getLoggerInstance(Groups.class); 33 34 35 protected static Cache containsCache = new Cache(500) { 36 public String getName() { return "CCS:ContainedBy"; } 37 public String getDescription() { return "group + group/user --> boolean"; } 38 }; 39 40 41 public boolean init() { 43 containsCache.putCache(); 44 CacheInvalidator.getInstance().addCache(containsCache); 45 mmb.addLocalObserver(getTableName(), CacheInvalidator.getInstance()); 46 mmb.addRemoteObserver(getTableName(), CacheInvalidator.getInstance()); 47 return super.init(); 48 } 49 50 51 54 public static Groups getBuilder() { 55 return (Groups) MMBase.getMMBase().getBuilder("mmbasegroups"); 56 } 57 58 62 public boolean contains(MMObjectNode group, User user) { 63 return contains(group, user.getNode()); 64 } 65 66 protected boolean contains(MMObjectNode containingGroup, MMObjectNode groupOrUser) { 67 return contains(containingGroup, groupOrUser.getNumber()); 68 } 69 70 73 protected boolean contains(MMObjectNode containingGroupNode, int containedObject) { 74 return contains(containingGroupNode, containedObject, new HashSet()); 75 } 76 77 78 82 protected boolean contains(MMObjectNode containingGroupNode, int containedObject, Set recurse) { 83 int containingGroup = containingGroupNode.getNumber(); 84 String key = "" + containingGroup + "/" + containedObject; 85 Boolean result = (Boolean ) containsCache.get(key); 86 87 if (result == null) { 88 int role = mmb.getRelDef().getNumberByName("contains"); 89 InsRel insrel = mmb.getRelDef().getBuilder(role); 90 91 MMObjectBuilder object = mmb.getBuilder("object"); 92 BasicSearchQuery query = new BasicSearchQuery(); 93 Step step = query.addStep(object); 94 BasicStepField numberStepField = new BasicStepField(step, object. getField("number")); 95 BasicFieldValueConstraint numberConstraint = new BasicFieldValueConstraint(numberStepField, new Integer (containedObject)); 96 97 BasicRelationStep relationStep = query.addRelationStep(insrel, this); 98 relationStep.setDirectionality(RelationStep.DIRECTIONS_SOURCE); 99 100 query.setConstraint(numberConstraint); 101 query.addFields(relationStep.getNext()); 102 103 List resultList; 104 try { 105 resultList = storageConnector.getNodes(query, false); 106 } catch (SearchQueryException sqe) { 107 log.error(sqe.getMessage()); 108 resultList = new ArrayList(); 109 } 110 111 Iterator i = resultList.iterator(); 112 113 result = Boolean.FALSE; 114 while (i.hasNext()) { 115 MMObjectNode group = (MMObjectNode) i.next(); 116 117 if (group.getNumber() == containingGroup) { 118 log.trace("yes!"); 119 result = Boolean.TRUE; 120 break; 121 } else if (recurse != null) { 122 log.trace("recursively"); 123 Integer groupNumber = new Integer (group.getNumber()); 124 if (! recurse.contains(groupNumber)) { 125 recurse.add(groupNumber); 126 if (contains(containingGroupNode, group.getNumber(), recurse)) { 127 result = Boolean.TRUE; 128 break; 129 } 130 } 131 } 132 } 133 134 containsCache.put(key, result); 135 } 136 137 return result.booleanValue(); 138 } 139 140 143 144 public SortedSet getGroups(int containedObject) { 145 SortedSet result = new TreeSet(); 146 try { 147 Iterator nodes = getNodes(new NodeSearchQuery(this)).iterator(); 148 while (nodes.hasNext()) { 149 MMObjectNode group = (MMObjectNode) nodes.next(); 150 if (contains(group, containedObject)) { 151 result.add(new Integer (group.getNumber())); 152 } else { 153 } 154 } 155 } catch (org.mmbase.storage.search.SearchQueryException sqe) { 156 log.error(sqe.toString()); 157 } 158 return result; 159 } 160 161 177 178 public void setDefaults(MMObjectNode node) { 179 setUniqueValue(node, "name", "group"); 180 } 181 182 183 public String toString(MMObjectNode n) { 184 return n.getStringValue("name"); 185 } 186 187 188 public boolean equals(MMObjectNode o1, MMObjectNode o2) { 190 return o1.getNumber() == o2.getNumber(); 191 } 192 193 194 } 195 | Popular Tags |