// Copyright 2009 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.enterprise.connector.util.diffing;
import com.google.enterprise.connector.spi.AuthenticationManager;
import com.google.enterprise.connector.spi.AuthorizationManager;
import com.google.enterprise.connector.spi.Connector;
import com.google.enterprise.connector.spi.ConnectorShutdownAware;
import com.google.enterprise.connector.spi.Session;
import com.google.enterprise.connector.spi.TraversalManager;
import java.util.logging.Logger;
/**
* Diffing connector implementation of the SPI {@link Connector} interface.
*
* @since 2.8
*/
public class DiffingConnector implements Connector,
ConnectorShutdownAware, Session {
private static final Logger LOG = Logger.getLogger(
DiffingConnector.class.getName());
private final AuthorizationManager authorizationManager;
private final DocumentSnapshotRepositoryMonitorManager repositoryMonitorManager;
private final TraversalContextManager traversalContextManager;
private DiffingConnectorTraversalManager traversalManager = null;
/**
* Creates a DiffingConnector.
*
* @param authorizationManager an AuthorizationManager
* @param repositoryMonitorManager a DocumentSnapshotRepositoryMonitorManager
* @param traversalContextManager a TraversalContextManager
*/
public DiffingConnector(AuthorizationManager authorizationManager,
DocumentSnapshotRepositoryMonitorManager repositoryMonitorManager,
TraversalContextManager traversalContextManager) {
this.authorizationManager = authorizationManager;
this.repositoryMonitorManager = repositoryMonitorManager;
this.traversalContextManager = traversalContextManager;
}
/**
* Shut down this connector: interrupt the background threads and wait for
* them to terminate.
*/
@Override
public void shutdown() {
LOG.info("Shutting down connector");
deactivate();
LOG.info("Connector shutdown complete");
}
/**
* Delete the snapshot and persistent storage for this connector.
* Invokes shutdown() first.
*/
@Override
public void delete() {
LOG.info("Deleting connector");
shutdown();
repositoryMonitorManager.clean();
LOG.info("Connector deletion complete");
}
@Override
public Session login() {
return this;
}
@Override
public AuthenticationManager getAuthenticationManager() {
return null;
}
@Override
public AuthorizationManager getAuthorizationManager() {
return authorizationManager;
}
private synchronized void deactivate() {
if (null != traversalManager) {
traversalManager.deactivate();
traversalManager = null;
}
}
/**
* Creates and returns a {@link TraversalManager} which can start and
* resume traversals. Getting a traversal manager invalidates
* previously acquired TraversalManagers. This operation
* has the expense of stopping current crawls, forcing them
* to be restarted (at initial or resume points) when further docs
* are requested via returned TraversalManager.
*
* @return a Diffing Connector {@link TraversalManager}
*/
@Override
public synchronized TraversalManager getTraversalManager() {
if (traversalManager != null) {
deactivate();
}
traversalManager = new DiffingConnectorTraversalManager(
repositoryMonitorManager, traversalContextManager);
return traversalManager;
}
}