/*
GanttProject is an opensource project management tool.
Copyright (C) 2003-2011 GanttProject Team
This program 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.
This program 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 this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package net.sourceforge.ganttproject.document.webdav;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.net.URISyntaxException;
import net.sourceforge.ganttproject.GPLogger;
import net.sourceforge.ganttproject.document.AbstractURLDocument;
import net.sourceforge.ganttproject.document.Document;
import net.sourceforge.ganttproject.document.webdav.WebDavResource.WebDavException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import biz.ganttproject.core.option.StringOption;
/**
* This class implements the interface Document for file access on HTTP-servers
* and WebDAV-enabled-servers.
*
* @author Michael Haeusler (michael at akatose.de)
*/
public class HttpDocument extends AbstractURLDocument {
static final int NO_LOCK = -1;
private String lastError;
private final WebDavResource webdavResource;
private boolean locked = false;
private boolean malformedURL = false;
private final String myUsername;
private final String myPassword;
private final int myTimeout;
public HttpDocument(String url, String username, String password, StringOption proxyOption) throws IOException, WebDavException {
this(new MiltonResourceFactory(username, password, proxyOption).createResource(new WebDavUri(url)), username, password, -1);
}
public HttpDocument(WebDavResource webdavResource, String username, String password, int lockTimeout) throws IOException {
this.webdavResource = webdavResource;
myUsername = username;
myPassword = password;
myTimeout = lockTimeout;
}
WebDavResource getWebdavResource() {
return webdavResource;
}
@Override
public String getFileName() {
return getWebdavResource().getUrl();
}
@Override
public boolean canRead() {
WebDavResource res = getWebdavResource();
try {
return (null == res ? false : (res.exists() && !res.isCollection()));
} catch (WebDavException e) {
return false;
}
}
@Override
public IStatus canWrite() {
WebDavResource res = getWebdavResource();
boolean exists = false;
try {
exists = res.exists();
} catch (WebDavException e) {
exists = false;
}
try {
if (exists) {
if (res.isCollection()) {
return new Status(IStatus.ERROR, Document.PLUGIN_ID, Document.ErrorCode.IS_DIRECTORY.ordinal(), res.getUrl(), null);
}
if (res.isWritable()) {
return Status.OK_STATUS;
}
return new Status(IStatus.ERROR, Document.PLUGIN_ID, Document.ErrorCode.NOT_WRITABLE.ordinal(), res.getUrl(), null);
}
} catch (WebDavException e) {
return new Status(IStatus.ERROR, Document.PLUGIN_ID, Document.ErrorCode.GENERIC_NETWORK_ERROR.ordinal(), res.getUrl(), e);
}
try {
WebDavResource parent = res.getParent();
if (!parent.exists() || !parent.isCollection()) {
return new Status(IStatus.ERROR, Document.PLUGIN_ID, Document.ErrorCode.PARENT_IS_NOT_DIRECTORY.ordinal(),
parent.getUrl(), null);
}
return Status.OK_STATUS;
} catch (WebDavException e) {
return new Status(IStatus.ERROR, Document.PLUGIN_ID, Document.ErrorCode.GENERIC_NETWORK_ERROR.ordinal(),
e.getMessage(), e);
}
}
@Override
public boolean isValidForMRU() {
return (!malformedURL);
}
@Override
public boolean acquireLock() {
if (locked || myTimeout < 0) {
return true;
}
if (null == getWebdavResource()) {
return false;
}
try {
if (!getWebdavResource().exists()) {
return true;
}
getWebdavResource().lock(myTimeout * 60);
locked = true;
return locked;
} catch (WebDavException e) {
if (!GPLogger.log(e)) {
e.printStackTrace(System.err);
}
}
return false;
}
@Override
public void releaseLock() {
if (null == getWebdavResource()) {
return;
}
try {
locked = false;
if (!getWebdavResource().isLocked()) {
return;
}
getWebdavResource().unlock();
} catch (WebDavException e) {
if (!GPLogger.log(e)) {
e.printStackTrace(System.err);
}
}
}
@Override
public InputStream getInputStream() throws IOException {
try {
return getWebdavResource().getInputStream();
} catch (WebDavException e) {
throw new IOException(e);
}
}
@Override
public OutputStream getOutputStream() throws IOException {
if (null == getWebdavResource()) {
throw new IOException(lastError);
}
return new HttpDocumentOutputStream(this);
}
@Override
public String getPath() {
return getFileName();
}
@Override
public String getUsername() {
return myUsername;
}
@Override
public String getPassword() {
return myPassword;
}
@Override
public String getLastError() {
return lastError;
}
// public static void setLockDAVMinutes(int i) {
// // FIXME should not be static, as each derived object should have its own
// // setting
// lockDAVMinutes = i;
// }
@Override
public void write() throws IOException {
// TODO Auto-generated method stub
}
@Override
public URI getURI() {
try {
return new URI(webdavResource.getUrl());
} catch (URISyntaxException e) {
return null;
}
}
@Override
public boolean isLocal() {
return false;
}
public static String getHTTPError(int code) {
// TODO Use language dependent texts
switch (code) {
case 401:
return "Unauthorized (401)";
default:
return "<unspecified> (" + code + ")";
}
}
}