/*
* Copyright 2000-2004 The Apache Software Foundation.
*
* 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 org.apache.jetspeed.portal.expire;
//jetspeed stuff
import org.apache.jetspeed.cache.disk.DiskCacheEntry;
import org.apache.jetspeed.cache.disk.DiskCacheUtils;
import org.apache.jetspeed.cache.disk.JetspeedDiskCache;
import org.apache.jetspeed.services.logging.JetspeedLogFactoryService;
import org.apache.jetspeed.services.logging.JetspeedLogger;
//java stuff
import java.io.IOException;
import java.io.Serializable;
/**
A generic class for watching a file and determining if it has changed.
@author <a href="mailto:burton@apache.org">Kevin A. Burton</a>
@version $Id: FileWatcher.java,v 1.16 2004/02/23 03:24:40 jford Exp $
*/
public class FileWatcher implements Serializable
{
/**
* Static initialization of the logger for this class
*/
private static final JetspeedLogger logger = JetspeedLogFactoryService.getLogger(FileWatcher.class.getName());
//BEGIN Exception index
public static final String EXCEPTION_URL_NOT_NULL =
"URL can NOT be null here.";
public static final String EXCEPTION_URL_NOT_IN_CACHE =
"The URL you specified within the disk cache does not exist: ";
//END Exception index
/**
The URL on which this FileWatchExpire is based.
*/
private String url = "";
/**
The last time this files URL has been modified on disk.
*/
private long lastModified = 0;
/**
The object that relies on this FileWatcher
*/
private String parent = "";
/**
Create a FileWatcher with no parent info.
@see #FileWatcher( String, String )
@author <a href="mailto:burton@apache.org">Kevin A. Burton</a>
@version $Id: FileWatcher.java,v 1.16 2004/02/23 03:24:40 jford Exp $
*/
public FileWatcher( String url ) throws IOException {
this( url, null );
}
/**
Create a new FileWatcher to watch the given URL.
@author <a href="mailto:burton@apache.org">Kevin A. Burton</a>
@version $Id: FileWatcher.java,v 1.16 2004/02/23 03:24:40 jford Exp $
*/
public FileWatcher( String url,
String parent ) throws IOException {
if ( url == null ) {
throw new IOException( EXCEPTION_URL_NOT_NULL );
}
if ( DiskCacheUtils.isRemote( url ) &&
DiskCacheUtils.isCached( url ) == false ) {
throw new IOException( EXCEPTION_URL_NOT_IN_CACHE + url );
}
//Try to set last modified when creating FileWatcher objet
try {
this.lastModified = JetspeedDiskCache.getInstance().getEntry( url ).
getLastModified();
} catch (Throwable e)
{
logger.error( "Unable to set last modified on url " + url, e );
}
this.url = url;
this.parent = parent;
}
/**
Return true if the URL on which this is based has changed.
@author <a href="mailto:burton@apache.org">Kevin A. Burton</a>
@version $Id: FileWatcher.java,v 1.16 2004/02/23 03:24:40 jford Exp $
*/
public boolean hasChanged() {
try {
//initially set the lastModified data
if ( this.lastModified == 0 ) {
DiskCacheEntry entry = JetspeedDiskCache.getInstance().getEntry( url );
this.lastModified = entry.getLastModified();
return false;
}
//the recent modification... if there was one. otherwise it will
// == this.lastModified
long recent = JetspeedDiskCache.getInstance()
.getEntry( url ).getLastModified();
// 0 means always modified
if ( recent == 0 ||
this.lastModified < recent ) {
if ( logger.isInfoEnabled() )
{
String message = "";
if ( this.parent != null ) {
message = this.parent + ": ";
}
message += "REFRESH: Expiring Portlet because it's URL has been modified on disk -> " + url;
logger.info( message );
}
return true;
}
} catch ( IOException e ) {
logger.error("Exception", e );
return false;
}
//default should be to not expire. This is set if the URL is null
return false;
}
}