View Javadoc

1   package org.sourceforge.jemm.database.components.types.util;
2   
3   import java.util.List;
4   
5   import org.sourceforge.jemm.collections.internal.ContainsRequest;
6   import org.sourceforge.jemm.collections.internal.ContainsResponse;
7   import org.sourceforge.jemm.collections.internal.RemoveRequest;
8   import org.sourceforge.jemm.collections.internal.RemoveResponse;
9   import org.sourceforge.jemm.collections.internal.StoredValue;
10  import org.sourceforge.jemm.collections.internal.set.SetAddRequest;
11  import org.sourceforge.jemm.collections.internal.set.SetAddResponse;
12  
13  public class HashedSetBucket extends HashedBucket<SetEntry> {
14  	private static final long serialVersionUID = 1L;
15  
16  	public HashedSetBucket(int hashCode) {
17  		super(hashCode);
18  	}
19  	
20  	public SetAddResponse add(SetAddRequest addRequest) {
21  		StoredValue value = addRequest.getValue();
22  
23  		if(containsExactMatch(value))
24  			return new SetAddResponse(false);
25  		
26  		if(isDistinctFromAll(addRequest.getDistinctFrom())) {
27  			head = new SetEntry(value,head);
28  			return new SetAddResponse(true);		
29  		}
30  
31  		return new SetAddResponse(toArray());
32  	}
33  
34  	private boolean isDistinctFromAll(StoredValue[] distinctFrom) {
35  		SetEntry current = head;
36  		while(current != null) {
37  			if(!valueInDistinctSet(current.value,distinctFrom))
38  				return false;
39  			current = current.next;
40  		}
41  		return true;
42  	}
43  
44  	private boolean valueInDistinctSet(StoredValue value, StoredValue[] distinctFrom) {
45  		if(distinctFrom == null)
46  			return false;
47  		
48  		for (StoredValue distinctItem : distinctFrom)
49  			if(value.equals(distinctItem))
50  				return true;
51  		return false;
52  	}
53  
54  	private boolean containsExactMatch(StoredValue value) {
55  		SetEntry current = head;
56  		while(current != null) {
57  			if(value.equals(current.value))
58  				return true;
59  			current = current.next;
60  		}
61  
62  		return false;
63  	}
64  
65  	private StoredValue[] toArray() {
66  		if(head == null)
67  			return new StoredValue[0];
68  
69  		StoredValue values[] = new StoredValue[size()];
70  		head.addToArray(0, values);
71  		return values;
72  	}
73  
74  	private Object[] toValueArray() {
75  	    
76  	    int size = size();		
77  		Object values[] = new Object[size];
78  		
79  		
80  		SetEntry current = head;
81  		for(int i=0;i<size;i++) {
82  		    values[i] = current.value.getValue();
83  		    current = current.next;
84  		}
85  		return values;
86  	}
87  
88  	public ContainsResponse contains(ContainsRequest req) {
89  		if(head == null)
90  			return new ContainsResponse(false);
91  
92  		StoredValue cValue = req.getValue();
93  
94  		if(head.contains(cValue,null))
95  			return new ContainsResponse(true);
96  		else
97  			return new ContainsResponse(false,toArray());
98  	}
99  
100 	public RemoveResponse remove(RemoveRequest req) {
101 		StoredValue toRemove = req.getValue();
102 		
103 		if(head == null)
104 			return new RemoveResponse(false);
105 		
106 		// check whether the head is what we are looking for
107 		if(toRemove.equals(head.value)) {
108 			head = head.next;
109 			return new RemoveResponse(true);
110 		}
111 		
112 		// recursively try and remove it from below head
113 		boolean removed = head.remove(toRemove);
114 		if(removed)
115 			return new RemoveResponse(true);
116 		else
117 			return new RemoveResponse(false,toValueArray());
118 	}
119 
120 	public void addValuesToList(List<Object> l) {
121 		if(head != null)
122 			head.addValuesToList(l);
123 	}
124 
125 	public void addRaw(StoredValue value) {
126 		head = new SetEntry(value,head);
127 	}
128 }