1 /** 2 * Copyright 2003-2006 Greg Luck 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 17 package net.sf.ehcache.distribution; 18 19 import net.sf.ehcache.event.CacheEventListener; 20 import net.sf.ehcache.event.CacheEventListenerFactory; 21 import net.sf.ehcache.util.PropertyUtil; 22 23 import java.util.Properties; 24 25 /** 26 * Creates an RMICacheReplicator using properties. Config lines look like: 27 * <pre><cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" 28 * properties=" 29 * replicateAsynchronously=true, 30 * replicatePuts=true 31 * replicateUpdates=true 32 * replicateUpdatesViaCopy=true 33 * replicateRemovals=true 34 * "/></pre> 35 * 36 * @author <a href="mailto:gluck@thoughtworks.com">Greg Luck</a> 37 * @version $Id: RMICacheReplicatorFactory.java 52 2006-04-24 14:50:03Z gregluck $ 38 */ 39 public final class RMICacheReplicatorFactory extends CacheEventListenerFactory { 40 private static final String REPLICATE_PUTS = "replicatePuts"; 41 private static final String REPLICATE_UPDATES = "replicateUpdates"; 42 private static final String REPLICATE_UPDATES_VIA_COPY = "replicateUpdatesViaCopy"; 43 private static final String REPLICATE_REMOVALS = "replicateRemovals"; 44 private static final String REPLICATE_ASYNCHRONOUSLY = "replicateAsynchronously"; 45 46 /** 47 * Create a <code>CacheEventListener</code> which is also a CacheReplicator. 48 * <p/> 49 * The defaults if properties are not specified are: 50 * <ul> 51 * <li>replicatePuts=true 52 * <li>replicateUpdates=true 53 * <li>replicateUpdatesViaCopy=true 54 * <li>replicateRemovals=true; 55 * <li>replicateAsynchronously=true 56 * </ul> 57 * 58 * @param properties implementation specific properties. These are configured as comma 59 * separated name value pairs in ehcache.xml e.g. 60 * <p/> 61 * <code> 62 * <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" 63 * properties=" 64 * replicateAsynchronously=true, 65 * replicatePuts=true 66 * replicateUpdates=true 67 * replicateUpdatesViaCopy=true 68 * replicateRemovals=true 69 * "/></code> 70 * @return a constructed CacheEventListener 71 */ 72 public final CacheEventListener createCacheEventListener(Properties properties) { 73 boolean replicatePuts = extractReplicatePuts(properties); 74 boolean replicateUpdates = extractReplicateUpdates(properties); 75 boolean replicateUpdatesViaCopy = extractReplicateUpdatesViaCopy(properties); 76 boolean replicateRemovals = extractReplicateRemovals(properties); 77 boolean replicateAsynchronously = extractReplicateAsynchronously(properties); 78 79 if (replicateAsynchronously) { 80 return new RMIAsynchronousCacheReplicator( 81 replicatePuts, 82 replicateUpdates, 83 replicateUpdatesViaCopy, 84 replicateRemovals); 85 } else { 86 return new RMISynchronousCacheReplicator( 87 replicatePuts, 88 replicateUpdates, 89 replicateUpdatesViaCopy, 90 replicateRemovals); 91 } 92 } 93 94 private static boolean extractReplicateAsynchronously(Properties properties) { 95 boolean replicateAsynchronously; 96 String replicateAsynchronouslyString = PropertyUtil.extractAndLogProperty(REPLICATE_ASYNCHRONOUSLY, properties); 97 if (replicateAsynchronouslyString != null) { 98 replicateAsynchronously = parseBoolean(replicateAsynchronouslyString); 99 } else { 100 replicateAsynchronously = true; 101 } 102 return replicateAsynchronously; 103 } 104 105 private static boolean extractReplicateRemovals(Properties properties) { 106 boolean replicateRemovals; 107 String replicateRemovalsString = PropertyUtil.extractAndLogProperty(REPLICATE_REMOVALS, properties); 108 if (replicateRemovalsString != null) { 109 replicateRemovals = parseBoolean(replicateRemovalsString); 110 } else { 111 replicateRemovals = true; 112 } 113 return replicateRemovals; 114 } 115 116 private static boolean extractReplicateUpdatesViaCopy(Properties properties) { 117 boolean replicateUpdatesViaCopy; 118 String replicateUpdatesViaCopyString = PropertyUtil.extractAndLogProperty(REPLICATE_UPDATES_VIA_COPY, properties); 119 if (replicateUpdatesViaCopyString != null) { 120 replicateUpdatesViaCopy = parseBoolean(replicateUpdatesViaCopyString); 121 } else { 122 replicateUpdatesViaCopy = true; 123 } 124 return replicateUpdatesViaCopy; 125 } 126 127 private static boolean extractReplicateUpdates(Properties properties) { 128 boolean replicateUpdates; 129 String replicateUpdatesString = PropertyUtil.extractAndLogProperty(REPLICATE_UPDATES, properties); 130 if (replicateUpdatesString != null) { 131 replicateUpdates = parseBoolean(replicateUpdatesString); 132 } else { 133 replicateUpdates = true; 134 } 135 return replicateUpdates; 136 } 137 138 private static boolean extractReplicatePuts(Properties properties) { 139 boolean replicatePuts; 140 String replicatePutsString = PropertyUtil.extractAndLogProperty(REPLICATE_PUTS, properties); 141 if (replicatePutsString != null) { 142 replicatePuts = parseBoolean(replicatePutsString); 143 } else { 144 replicatePuts = true; 145 } 146 return replicatePuts; 147 } 148 149 private static boolean parseBoolean(String name) { 150 return ((name != null) && name.equalsIgnoreCase("true")); 151 } 152 }