/*******************************************************************************
* Copyright 2009, 2010 Innovation Gate GmbH. All Rights Reserved.
*
* This file is part of the OpenWGA server platform.
*
* OpenWGA is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* In addition, a special exception is granted by the copyright holders
* of OpenWGA called "OpenWGA plugin exception". You should have received
* a copy of this exception along with OpenWGA in file COPYING.
* If not, see <http://www.openwga.com/gpl-plugin-exception>.
*
* OpenWGA is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenWGA in file COPYING.
* If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package de.innovationgate.wgpublisher.design.sync;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import org.apache.commons.vfs.FileObject;
import org.apache.commons.vfs.FileSystemException;
import org.apache.log4j.Logger;
import de.innovationgate.webgate.api.WGAPIException;
import de.innovationgate.webgate.api.WGDatabase;
import de.innovationgate.webgate.api.WGDocument;
import de.innovationgate.webgate.api.WGException;
import de.innovationgate.wgpublisher.design.fs.AbstractDesignFile;
import de.innovationgate.wgpublisher.design.fs.FileSystemDesignManager;
public abstract class DesignDeployment extends AbstractDesignFile {
protected long _timestampOfCodeFile = 0;
protected long _timestampOfMetadataFile = 0;
private transient long _codeFileSize = -1;
private String _documentKey;
private transient int _failures = 0;
protected DesignSyncStatus _parent;
public DesignDeployment(DesignSyncStatus parent, int type, String documentKey, FileObject codeFile) throws IOException, WGDesignSyncException {
super(parent.getManager(), codeFile, type);
_parent = parent;
_documentKey = documentKey;
}
/**
* Private No-args constructor. For serialisation only
*/
protected DesignDeployment() {
}
public boolean isUpdated() throws InstantiationException, IllegalAccessException, IOException, WGDesignSyncException {
FileObject metadataFile = getMetadataFile();
FileObject codeFile = getCodeFile();
if (_codeFileSize == -1) {
_codeFileSize = codeFile.getContent().getSize();
}
return ((
metadataFile.exists() &&
metadataFile.getContent().getLastModifiedTime() != _timestampOfMetadataFile) ||
codeFile.getContent().getLastModifiedTime() != _timestampOfCodeFile ||
codeFile.getContent().getSize() != _codeFileSize
);
}
public boolean isDeleted() throws FileSystemException, WGDesignSyncException {
return !getCodeFile().exists();
}
public abstract void performUpdate(WGDatabase db) throws WGException, IOException, InstantiationException, IllegalAccessException, WGDesignSyncException;
@Override
public FileSystemDesignManager getManager() {
return _parent.getManager();
}
/**
* @return Returns the timestampOfCodeFile.
*/
public long getTimestampOfCodeFile() {
return _timestampOfCodeFile;
}
/**
* @return Returns the timestampOfMetadataFile.
*/
public long getTimestampOfMetadataFile() {
return _timestampOfMetadataFile;
}
public void resetUpdateInformation() throws InstantiationException, IllegalAccessException, IOException, WGDesignSyncException {
_timestampOfCodeFile = getCodeFile().getContent().getLastModifiedTime();
_codeFileSize = getCodeFile().getContent().getSize();
FileObject metadataFile = getMetadataFile();
if (metadataFile.exists()) {
_timestampOfMetadataFile = metadataFile.getContent().getLastModifiedTime();
}
}
/**
* @return Returns the documentKey.
*/
public String getDocumentKey() {
return _documentKey;
}
public void performDeletion(WGDatabase db) throws WGException {
WGDocument doc = getDocument(db);
if (doc != null) {
doc.remove();
}
}
@Override
protected Logger getLog() {
return getManager().getLog();
}
public WGDocument getDocument(WGDatabase db) throws WGAPIException {
return db.getDocumentByDocumentKey(getDocumentKey());
}
/**
* @return Returns the parent.
*/
public DesignSyncStatus getParent() {
return _parent;
}
/**
* @param parent The parent to set.
*/
public void setParent(DesignSyncStatus parent) {
_parent = parent;
}
public void doAttachFile(WGDocument doc, FileObject file) throws WGDesignSyncException {
try {
if (!file.exists()) {
throw new WGDesignSyncException("Attaching file '" + file.getName().getPath() + "' to document '" + doc.getDocumentKey() + "' failed because the file does not exist.");
}
if (!doc.attachFile(file.getContent().getInputStream(), file.getName().getBaseName())) {
throw new WGDesignSyncException("Attaching file '" + file.getName().getPath() + "' to document '" + doc.getDocumentKey() + "' failed.");
}
}
catch (Exception e) {
throw new WGDesignSyncException("Attaching file '" + file.getName().getPath() + "' to document '" + doc.getDocumentKey() + "' failed.", e);
}
}
public void doSaveDocument(WGDocument doc) throws WGDesignSyncException {
try {
if (!doc.save()) {
throw new WGDesignSyncException("Saving document '" + doc.getDocumentKey() + "' failed.");
}
}
catch (WGAPIException e) {
throw new WGDesignSyncException("Saving document '" + doc.getDocumentKey() + "' failed because of wgapi exception: " + e.getMessage(), e);
}
}
public void doRemoveFile(WGDocument doc, String fileName) throws WGDesignSyncException {
try {
if (!doc.removeFile(fileName)) {
throw new WGDesignSyncException("Removing file '" + fileName + "' from document '" + doc.getDocumentKey() + "' failed.");
}
} catch (WGAPIException e) {
throw new WGDesignSyncException("Removing file '" + fileName + "' from document '" + doc.getDocumentKey() + "' failed bc. of backend exception: " + e.getMessage(), e);
}
}
protected boolean addFailure() {
_failures++;
if (_failures >= 5) {
_failures = 0;
return true;
}
else {
return false;
}
}
@Override
protected void createMetadataFile(FileObject metadataFile) throws InstantiationException, IllegalAccessException, UnsupportedEncodingException, FileSystemException, IOException {
super.createMetadataFile(metadataFile);
_timestampOfMetadataFile = metadataFile.getContent().getLastModifiedTime();
}
private Object readResolve() {
_codeFileSize = -1;
return this;
}
}