001: /*
002: * Copyright 2004-2006 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.compass.gps.impl;
018:
019: import java.util.Iterator;
020:
021: import org.compass.core.Compass;
022: import org.compass.core.CompassCallback;
023: import org.compass.core.CompassException;
024: import org.compass.core.CompassTemplate;
025: import org.compass.core.engine.SearchEngineException;
026: import org.compass.core.engine.SearchEngineIndexManager;
027: import org.compass.core.mapping.CascadeMapping;
028: import org.compass.core.mapping.ResourceMapping;
029: import org.compass.core.spi.InternalCompass;
030: import org.compass.gps.CompassGpsDevice;
031: import org.compass.gps.CompassGpsException;
032:
033: /**
034: * <p>A {@link org.compass.gps.CompassGps} implementation that holds two
035: * <code>Compass</code> instances. One, called <code>indexCompass</code> is
036: * responsible for index operation. The other, called <code>mirrorCompass</code>
037: * is responsible for mirror operations.
038: *
039: * <p>The index compass settings should probably work in batch insert mode and
040: * disable cascading.
041: *
042: * @author kimchy
043: */
044: public class DualCompassGps extends AbstractCompassGps {
045:
046: private Compass indexCompass;
047:
048: private CompassTemplate indexCompassTemplate;
049:
050: private Compass mirrorCompass;
051:
052: private CompassTemplate mirrorCompassTemplate;
053:
054: public DualCompassGps() {
055:
056: }
057:
058: public DualCompassGps(Compass indexCompass, Compass mirrorCompass) {
059: this .indexCompass = indexCompass;
060: this .mirrorCompass = mirrorCompass;
061: }
062:
063: protected void doStart() throws CompassGpsException {
064: if (indexCompass == null) {
065: throw new IllegalArgumentException(
066: "Must set the indexCompass property (for batch indexing)");
067: }
068: this .indexCompassTemplate = new CompassTemplate(indexCompass);
069: if (mirrorCompass != null) {
070: this .mirrorCompassTemplate = new CompassTemplate(
071: mirrorCompass);
072: }
073: }
074:
075: protected void doStop() throws CompassGpsException {
076: }
077:
078: protected void doIndex() throws CompassGpsException {
079: if (mirrorCompass != null) {
080: ((InternalCompass) mirrorCompass).stop();
081: }
082: ((InternalCompass) indexCompass).stop();
083:
084: indexCompass.getSearchEngineIndexManager().clearCache();
085: indexCompass.getSearchEngineIndexManager().deleteIndex();
086: indexCompass.getSearchEngineIndexManager().createIndex();
087:
088: mirrorCompass.getSearchEngineIndexManager().replaceIndex(
089: indexCompass.getSearchEngineIndexManager(),
090: new SearchEngineIndexManager.ReplaceIndexCallback() {
091: public void buildIndexIfNeeded()
092: throws SearchEngineException {
093: for (Iterator it = devices.values().iterator(); it
094: .hasNext();) {
095: CompassGpsDevice device = (CompassGpsDevice) it
096: .next();
097: device.index();
098: }
099: }
100: });
101:
102: if (mirrorCompass != null) {
103: ((InternalCompass) mirrorCompass).start();
104: }
105: ((InternalCompass) indexCompass).start();
106:
107: if (mirrorCompass.getSpellCheckManager() != null) {
108: log.info("Rebulding spell check index ...");
109: try {
110: mirrorCompass.getSpellCheckManager()
111: .concurrentRebuild();
112: log.info("Spell check index rebuilt");
113: } catch (Exception e) {
114: log
115: .info(
116: "Spell check index failed, will rebuilt it next time",
117: e);
118: }
119: }
120: }
121:
122: public void executeForIndex(CompassCallback callback)
123: throws CompassException {
124: indexCompassTemplate.execute(callback);
125: }
126:
127: public void executeForMirror(CompassCallback callback)
128: throws CompassException {
129: mirrorCompassTemplate.execute(callback);
130: }
131:
132: public boolean hasMappingForEntityForIndex(Class clazz)
133: throws CompassException {
134: return hasRootMappingForEntity(clazz, indexCompass);
135: }
136:
137: public boolean hasMappingForEntityForIndex(String name)
138: throws CompassException {
139: return hasRootMappingForEntity(name, indexCompass);
140: }
141:
142: public boolean hasMappingForEntityForMirror(Class clazz,
143: CascadeMapping.Cascade cascade) throws CompassException {
144: return hasMappingForEntity(clazz, mirrorCompass, cascade);
145: }
146:
147: public boolean hasMappingForEntityForMirror(String name,
148: CascadeMapping.Cascade cascade) throws CompassException {
149: return hasMappingForEntity(name, mirrorCompass, cascade);
150: }
151:
152: public ResourceMapping getMappingForEntityForIndex(String name)
153: throws CompassException {
154: return getRootMappingForEntity(name, indexCompass);
155: }
156:
157: public ResourceMapping getMappingForEntityForIndex(Class clazz)
158: throws CompassException {
159: return getRootMappingForEntity(clazz, indexCompass);
160: }
161:
162: public Compass getIndexCompass() {
163: return indexCompass;
164: }
165:
166: /**
167: * Sets the index compass instance, used for the indexing operations.
168: */
169: public void setIndexCompass(Compass indexCompass) {
170: this .indexCompass = indexCompass;
171: }
172:
173: public Compass getMirrorCompass() {
174: return mirrorCompass;
175: }
176:
177: /**
178: * Sets the mirror compass instance, used for the mirroring operations.
179: */
180: public void setMirrorCompass(Compass mirrorCompass) {
181: this .mirrorCompass = mirrorCompass;
182: }
183:
184: public CompassTemplate getIndexCompassTemplate() {
185: return indexCompassTemplate;
186: }
187:
188: public CompassTemplate getMirrorCompassTemplate() {
189: return mirrorCompassTemplate;
190: }
191:
192: }
|