/*
* Copyright to the original author or authors.
*
* 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.rioproject.monitor.service.handlers;
import org.rioproject.monitor.service.DeploymentVerifier;
import org.rioproject.impl.opstring.OAR;
import org.rioproject.impl.opstring.OARException;
import org.rioproject.impl.opstring.OARUtil;
import org.rioproject.opstring.OperationalString;
import org.rioproject.impl.util.FileUtils;
import java.io.File;
import java.io.IOException;
import java.util.*;
/**
* A {@link DeployHandler} that handles OAR files. This <tt>DeployHandler</tt>
* uses two directories; a <tt>dropDirectory</tt>, and a
* <tt>installDirectory</tt>.
*
* <p>The <tt>dropDirectory</tt> is polled for files ending in ".oar". If found,
* the OAR files are installed to the <tt>installDirectory</tt>, where
* {@link org.rioproject.opstring.OperationalString}s are created and returned.
*
*/
public class FileSystemOARDeployHandler extends AbstractOARDeployHandler {
private File dropDirectory;
private File installDirectory;
private final Map<String, Date> badOARs = new HashMap<String, Date>();
/**
* Create a FileSystemOARDeployHandler with the same drop and install
* directory
*
* @param dir The drop and installation directory for OAR files
* @param deploymentVerifier The {@link DeploymentVerifier} to use
*/
public FileSystemOARDeployHandler(File dir, DeploymentVerifier deploymentVerifier) {
this(dir, dir, deploymentVerifier);
}
/**
* Create a FileSystemOARDeployHandler with drop and install
* directories
*
* @param dropDirectory The directory where OAR files will be dropped
* @param installDirectory The directory to install OARs into
* @param deploymentVerifier The {@link DeploymentVerifier} to use
*/
public FileSystemOARDeployHandler(File dropDirectory,
File installDirectory,
DeploymentVerifier deploymentVerifier) {
super();
this.deploymentVerifier = deploymentVerifier;
this.dropDirectory = dropDirectory;
this.installDirectory = installDirectory;
if(!dropDirectory.exists()) {
if(dropDirectory.mkdirs()) {
if(logger.isDebugEnabled()) {
logger.debug("Created dropDeployDir " +FileUtils.getFilePath(dropDirectory));
}
}
}
if(!installDirectory.exists()) {
if(installDirectory.mkdirs()) {
if(logger.isDebugEnabled()) {
logger.debug("Created installDir " +FileUtils.getFilePath(installDirectory));
}
}
}
if(logger.isDebugEnabled()) {
logger.debug("OARs will be scanned for in this directory: "+FileUtils.getFilePath(dropDirectory));
logger.debug("OARs will be installed into this directory: "+FileUtils.getFilePath(installDirectory));
}
}
protected List<OperationalString> look(Date from) {
List<OperationalString> list = new ArrayList<OperationalString>();
File[] files = dropDirectory.listFiles();
for (File file : files) {
if (!file.isDirectory()) {
if (file.getName().endsWith("oar") &&!isBad(file)) {
try {
install(file, installDirectory);
} catch (IOException e) {
logger.warn("Could not install ["+file.getName()+"] " +
"to ["+installDirectory.getName()+"]",
e);
badOARs.put(file.getName(), new Date(file.lastModified()));
} catch (Exception e) {
logger.warn("The ["+file.getName()+"] is an " +
"invalid OAR and cannot be installed, "+
e.getClass().getName()+": "+e.getMessage());
badOARs.put(file.getName(), new Date(file.lastModified()));
}
}
}
}
files = installDirectory.listFiles();
for (File file : files) {
if (file.isDirectory()) {
try {
OAR oar = OARUtil.getOAR(file);
if (oar!=null && oar.getActivationType().equals(OAR.AUTOMATIC)) {
list.addAll(parseOAR(oar, from));
}
} catch (IOException e) {
logger.warn("Loading [" + file.getName() + "]", e);
} catch (OARException e) {
logger.warn("Unable to install [" + file.getName() + "]", e);
}
}
}
return list;
}
private boolean isBad(File oar) {
Date badOar = null;
for(Map.Entry<String, Date> entry : badOARs.entrySet()) {
if(entry.getKey().equals(oar.getName())) {
badOar = entry.getValue();
break;
}
}
boolean isBad = false;
if(badOar!=null) {
Date oarDate = new Date(oar.lastModified());
if (oarDate.after(badOar)) {
badOARs.remove(oar.getName());
} else {
isBad = true;
}
}
return isBad;
}
}