blob: e441ca16e5d3774b2572f8d698a756bc1c77c9cb [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.axis2.deployment.repository.util;
import org.apache.axis2.deployment.Deployer;
import org.apache.axis2.deployment.DeploymentConstants;
import org.apache.axis2.deployment.DeploymentEngine;
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class WSInfoList implements DeploymentConstants {
/**
* This is to store all the jar files in a specified folder (WEB_INF)
*/
private List jarList = new ArrayList();
/**
* All the currently updated jars
*/
public Map currentJars = new HashMap();
/**
* Reference to DeploymentEngine to make update
*/
private boolean locked = false;
private final DeploymentEngine deploymentEngine;
public WSInfoList(DeploymentEngine deploy_engine) {
deploymentEngine = deploy_engine;
}
/**
* First checks whether the file is already available by the
* system call fileExists. If it is not deployed yet then adds to the jarList
* and to the deployment engine as a new service or module.
* While adding new item to jarList, first creates the WSInfo object and
* then adds to the jarlist and actual jar file is added to DeploymentEngine.
* <p/>
* If the files already exists, then checks whether it has been updated
* then changes the last update date of the wsInfo and adds two entries to
* DeploymentEngine - one for new deployment and other for undeployment.
*
* @param file actual jar files for either Module or service
*/
public synchronized void addWSInfoItem(File file, Deployer deployer , int type) {
WSInfo info = (WSInfo) currentJars.get(file.getAbsolutePath());
if (info != null) {
if (deploymentEngine.isHotUpdate() && isModified(file, info)) {
WSInfo wsInfo = new WSInfo(info.getFileName(), info.getLastModifiedDate(), deployer,type);
deploymentEngine.addWSToUndeploy(wsInfo); // add entry to undeploy list
DeploymentFileData deploymentFileData = new DeploymentFileData(file, deployer);
deploymentEngine.addWSToDeploy(deploymentFileData); // add entry to deploylist
}
} else {
info = getFileItem(file, deployer, type);
setLastModifiedDate(file, info);
}
jarList.add(info.getFileName());
}
public synchronized void addWSInfoItem(URL url, Deployer deployer, int type) {
// There is no way to set hot-update.
// Here file.getAbsolutePath() = info.getFileName()
WSInfo info = (WSInfo) currentJars.get(url.getPath());
if (info != null) {
if (deploymentEngine.isHotUpdate()) {
WSInfo wsInfo = new WSInfo(info.getFileName(), info.getLastModifiedDate(),
deployer, type);
deploymentEngine.addWSToUndeploy(wsInfo); // add entry to undeploy list
DeploymentFileData deploymentFileData = new DeploymentFileData(url, deployer, null);
deploymentEngine.addWSToDeploy(deploymentFileData); // add entry to deploylist
}
} else {
info = getFileItem(url, deployer, type);
}
jarList.add(info.getFileName());
}
/**
* Checks undeployed Services. Checks old jars files and current jars.
* If name of the old jar file does not exist in the current jar
* list then it is assumed that the jar file has been removed
* and that is hot undeployment.
*/
private synchronized void checkForUndeployedServices() {
if(!locked) {
locked = true;
} else{
return;
}
Iterator infoItems = currentJars.keySet().iterator();
List tobeRemoved = new ArrayList();
while (infoItems.hasNext()) {
String fileName = (String) infoItems.next();
WSInfo infoItem = (WSInfo) currentJars.get(fileName);
if (infoItem.getType() == WSInfo.TYPE_MODULE) {
continue;
}
//seems like someone has deleted the file , so need to undeploy
boolean found = false;
for (int i = 0; i < jarList.size(); i++) {
String s = (String) jarList.get(i);
if(fileName.equals(s)){
found = true;
}
}
if(!found){
tobeRemoved.add(fileName);
deploymentEngine.addWSToUndeploy(infoItem);
}
}
for (int i = 0; i < tobeRemoved.size(); i++) {
String fileName = (String) tobeRemoved.get(i);
currentJars.remove(fileName);
}
tobeRemoved.clear();
jarList.clear();
locked = false;
}
/**
* Clears the jarlist.
*/
public void init() {
jarList.clear();
}
/**
*
*/
public void update() {
synchronized (deploymentEngine) {
checkForUndeployedServices();
deploymentEngine.unDeploy();
deploymentEngine.doDeploy();
}
}
/**
* Gets the WSInfo object related to a file if it exists, null otherwise.
*
*/
private WSInfo getFileItem(File file , Deployer deployer , int type) {
String fileName = file.getName();
WSInfo info = (WSInfo) currentJars.get(fileName);
if(info==null){
info = new WSInfo(file.getAbsolutePath(), file.lastModified(), deployer ,type);
currentJars.put(file.getAbsolutePath(), info);
DeploymentFileData fileData = new DeploymentFileData(file, deployer);
deploymentEngine.addWSToDeploy(fileData);
}
return info;
}
/**
* Gets the WSInfo object related to a file if it exists, null otherwise.
*
*/
private WSInfo getFileItem(URL url, Deployer deployer, int type) {
WSInfo info = (WSInfo) currentJars.get(url.getPath());
if (info == null) {
info = new WSInfo(url.getPath(), 0, deployer, type);
currentJars.put(url.getPath(), info);
DeploymentFileData fileData = new DeploymentFileData(url, deployer, null);
deploymentEngine.addWSToDeploy(fileData);
}
return info;
}
/**
* Checks if a file has been modified by comparing the last update date of
* both files and WSInfo. If they are different, the file is assumed to have
* been modified.
*
* @param file
* @param wsInfo
*/
private boolean isModified(File file, WSInfo wsInfo) {
long currentTimeStamp = wsInfo.getLastModifiedDate();
setLastModifiedDate(file, wsInfo);
return (currentTimeStamp != wsInfo.getLastModifiedDate());
}
/**
* Obtains the newest (as compared with timestamp stored in wsInfo)
* timestamp and stores it in WSInfo.
*/
private void setLastModifiedDate(File file, WSInfo wsInfo) {
if (file.isDirectory()) {
File files [] = file.listFiles();
for (int i = 0; i < files.length; i++) {
File fileItem = files[i];
if (fileItem.isDirectory()) {
setLastModifiedDate(fileItem, wsInfo);
}
else if(wsInfo.getLastModifiedDate() < fileItem.lastModified()) {
wsInfo.setLastModifiedDate(fileItem.lastModified());
}
}
}
else if(wsInfo.getLastModifiedDate() < file.lastModified()) {
wsInfo.setLastModifiedDate(file.lastModified());
}
}
}