1 /*
2 * Copyright 2006-2010 the original author or authors.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package net.sourceforge.domian.repository;
17
18
19 import static java.lang.Boolean.FALSE;
20 import static java.lang.Boolean.TRUE;
21
22 import org.apache.commons.lang.Validate;
23
24 import net.sourceforge.domian.entity.Entity;
25 import net.sourceforge.domian.specification.Specification;
26 import net.sourceforge.domian.util.concurrent.locks.Synchronizer;
27
28
29 /**
30 * ...
31 *
32 * @author Eirik Torske
33 * @since 0.4.2
34 */
35 public final class PartitionRepositoryReuseInvocationHandler<T extends Entity> extends PartitionRepositoryInvocationHandler<T> {
36
37 PartitionRepositoryReuseInvocationHandler(final Repository<T> repositoryDelegate) {
38 this(repositoryDelegate, null, FALSE);
39 }
40
41
42 PartitionRepositoryReuseInvocationHandler(final Repository<T> repositoryDelegate,
43 final Synchronizer synchronizer,
44 final Boolean executeOperationsExclusivelyOnly) {
45 super(repositoryDelegate, synchronizer, executeOperationsExclusivelyOnly);
46 }
47
48
49 /*
50 @Override
51 protected PartitionRepository wireUpPartition(Specification superPartitionSpecification,
52 final PartitionRepository superPartitionRepository,
53 final Specification partitionSpecification,
54 final PartitionRepository partitionRepository) {
55 if (superPartitionSpecification == null) {
56 // Default super spec, just to make isRootPartition to work...
57 superPartitionSpecification = allObjects();
58 }
59 partitionRepository.setSuperPartitionSpecification(superPartitionSpecification);
60 partitionRepository.setSuperPartitionRepository(superPartitionRepository);
61 partitionRepository.setPartitionSpecification(partitionSpecification);
62 return partitionRepository;
63 }
64 */
65
66
67 /*
68 @Override
69 public <V extends T> PartitionRepository<V> addPartitionFor(final Specification<V> partitionSpecification) {
70 return addPartitionFor(partitionSpecification, (String) null);
71 }
72 */
73
74
75 @Override
76 public <V extends T> PartitionRepository<V> addPartitionFor(final Specification<V> partitionSpecification,
77 final String repositoryId) {
78 //Validate.notNull(partitionSpecification, "Partition specification parameter cannot be null");
79 //final Object newRepositoryInstance;
80 //final Repository targetRepository = this.getTargetRepository();
81 //final Class<? extends Repository> targetRepositoryType = targetRepository.getClass();
82 /*
83 try {
84 if (canCastFrom_To(targetRepositoryType, PersistentRepository.class)) {
85 Validate.isTrue(isNotBlank(repositoryId), "Repository ID cannot be blank for persistent repositories");
86 final Constructor repositoryConstructor = targetRepositoryType.getConstructor(String.class, Synchronizer.class);
87 synchronized (this.synchronizer) {
88 newRepositoryInstance = repositoryConstructor.newInstance(repositoryId, this.synchronizer);
89 }
90 } else {
91 newRepositoryInstance = targetRepositoryType.newInstance();
92 }
93
94 } catch (NoSuchMethodException e1) {
95 throw new IllegalArgumentException("Repository implementation " + targetRepositoryType +
96 " lacks a public Constructor(java.lang.String repositoryId, net.sourceforge.domian.util.concurrent.locks.Synchronizer repositorySynchronizer)");
97 } catch (Exception e2) {
98 handlePartitionRepositoryException(e2, "addPartitionFor(Specification, String)");
99 return new NullRepository<V>().makePartition();
100 }
101 */
102 Validate.notNull(partitionSpecification, "Partition specification parameter cannot be null");
103 //Validate.notNull(partitionRepository, "Partition repository parameter cannot be null");
104 //log.info("The given repository partition-ID '" + repositoryId + "' will be disregarded as this partition repository instance is the same as the parent partition repository");
105 log.info("The given repository partition '" + repositoryId + "' will be disregarded as this partition repository instance will be the same as the parent partition repository");
106
107 //final Repository partitionRepository = this;
108 //if (partitionRepository instanceof PartitionRepository) {
109 //return addPartition(partitionSpecification, (PartitionRepository) this);
110 return addPartition(partitionSpecification, null);
111 //}
112 //return addPartition(partitionSpecification, ((AbstractRepository<V>) partitionRepository).makePartition());
113 }
114
115
116 @Override
117 public <V extends T> PartitionRepository<V> addPartitionFor(final Specification<V> partitionSpecification,
118 final Repository<? super V> partitionRepository) {
119 Validate.notNull(partitionRepository, "Partition repository parameter cannot be null");
120 final String repositoryDenomination;
121 if (partitionRepository instanceof PersistentRepository) {
122 repositoryDenomination = ((PersistentRepository) partitionRepository).getRepositoryId();
123 } else {
124 repositoryDenomination = "[repository.hashCode=" + this.hashCode() + "]";
125 }
126 if (partitionRepository instanceof PartitionRepository) {
127 if (((PartitionRepository) partitionRepository).getTargetRepository().getClass().getSimpleName().equals(getTargetRepository().getClass().getSimpleName())) {
128 return addPartitionFor(partitionSpecification, repositoryDenomination);
129 }
130 }
131 return super.addPartitionFor(partitionSpecification, partitionRepository);
132 }
133
134
135 /** Since partition repositories are common, no moving entities around between different repository implementations are necessary. */
136 @Override
137 public <V extends T> Boolean repartition(final V entity) {
138 Validate.notNull(entity, "Entity parameter cannot be null");
139 if (this.contains(entity)) {
140 return TRUE;
141 } else {
142 return FALSE;
143 }
144 }
145 }