com.concursive.connect.web.webdav.resources.WebdavResource.java Source code

Java tutorial

Introduction

Here is the source code for com.concursive.connect.web.webdav.resources.WebdavResource.java

Source

/*
 * ConcourseConnect
 * Copyright 2009 Concursive Corporation
 * http://www.concursive.com
 *
 * This file is part of ConcourseConnect, an open source social business
 * software and community platform.
 *
 * Concursive ConcourseConnect is free software: you can redistribute it and/or
 * modify it under the terms of the GNU Affero General Public License as published
 * by the Free Software Foundation, version 3 of the License.
 *
 * Under the terms of the GNU Affero General Public License you must release the
 * complete source code for any application that uses any part of ConcourseConnect
 * (system header files and libraries used by the operating system are excluded).
 * These terms must be included in any work that has ConcourseConnect components.
 * If you are developing and distributing open source applications under the
 * GNU Affero General Public License, then you are free to use ConcourseConnect
 * under the GNU Affero General Public License.
 *
 * If you are deploying a web site in which users interact with any portion of
 * ConcourseConnect over a network, the complete source code changes must be made
 * available.  For example, include a link to the source archive directly from
 * your web site.
 *
 * For OEMs, ISVs, SIs and VARs who distribute ConcourseConnect with their
 * products, and do not license and distribute their source code under the GNU
 * Affero General Public License, Concursive provides a flexible commercial
 * license.
 *
 * To anyone in doubt, we recommend the commercial license. Our commercial license
 * is competitively priced and will eliminate any confusion about how
 * ConcourseConnect can be used and distributed.
 *
 * ConcourseConnect 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 Affero General Public License for more
 * details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with ConcourseConnect.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Attribution Notice: ConcourseConnect is an Original Work of software created
 * by Concursive Corporation
 */

package com.concursive.connect.web.webdav.resources;

import com.bradmcevoy.http.*;
import com.bradmcevoy.http.Request.Method;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Map;

/**
 * Description
 *
 * @author matt rajkowski
 * @created Dec 6, 2008 12:11:55 AM
 */
public class WebdavResource implements PostableResource, GetableResource, PropFindableResource, DeletableResource,
        MoveableResource, CopyableResource {
    private static Log LOG = LogFactory.getLog(WebdavResource.class);

    String name;
    Date modDate;
    Date createdDate;
    WebdavFolderResource parent;

    private String user;
    private String password;

    public WebdavResource(WebdavFolderResource parent, String name) {
        this.parent = parent;
        this.name = name;
        modDate = new Date();
        createdDate = new Date();
        if (parent != null) {
            parent.children.add(this);
        }
    }

    public void setSecure(String user, String password) {
        this.user = user;
        this.password = password;
    }

    public String getHref() {
        if (parent == null) {
            return "/files/";
        } else {
            String s = parent.getHref();
            if (!s.endsWith("/"))
                s = s + "/";
            s = s + name;
            if (this instanceof CollectionResource)
                s = s + "/";
            return s;
        }
    }

    public void sendContent(OutputStream out, Range range, Map<String, String> params) throws IOException {
        PrintWriter printer = new PrintWriter(out, true);
        sendContentStart(printer);
        sendContentMiddle(printer);
        sendContentFinish(printer);
    }

    protected void sendContentMiddle(final PrintWriter printer) {
        printer.print("rename");
        printer.print("<form method='POST' action='" + this.getHref() + "'><input type='text' name='name' value='"
                + this.getName() + "'/><input type='submit'></form>");
    }

    protected void sendContentFinish(final PrintWriter printer) {
        printer.print("</body></html>");
        printer.flush();
    }

    protected void sendContentStart(final PrintWriter printer) {
        printer.print("<html><body>");
        printer.print("<h1>" + getName() + "</h1>");
        sendContentMenu(printer);
    }

    protected void sendContentMenu(final PrintWriter printer) {
        printer.print("<ul>");
        for (WebdavResource r : parent.children) {
            printer.print("<li><a href='" + r.getHref() + "'>" + r.getName() + "</a>");
        }
        printer.print("</ul>");
    }

    public Long getContentLength() {
        return null;
    }

    public String getContentType(String accept) {
        return Response.ContentType.HTTP.toString();
    }

    public String checkRedirect(Request request) {
        return null;
    }

    public String processForm(Map<String, String> parameters, Map<String, FileItem> files) {
        LOG.debug("processForm: " + parameters.size());
        for (String nm : parameters.keySet()) {
            LOG.debug(" - param: " + nm);
        }
        String name = parameters.get("name");
        if (name != null) {
            this.name = name;
        }
        return null;
    }

    public Long getMaxAgeSeconds() {
        return (long) 10;
    }

    public void moveTo(CollectionResource rDest, String name) {
        LOG.debug("moving..");
        WebdavFolderResource d = (WebdavFolderResource) rDest;
        this.parent.children.remove(this);
        this.parent = d;
        this.parent.children.add(this);
        this.name = name;
    }

    public Date getCreateDate() {
        return createdDate;
    }

    public String getName() {
        return name;
    }

    public Object authenticate(String user, String password) {
        if (this.user == null)
            return true;
        return (user.equals(this.user)) && (password != null && password.equals(this.password));
    }

    public boolean authorise(Request request, Method method, Auth auth) {
        if (auth == null) {
            return this.user == null;
        } else {
            return (this.user == null || auth.user.equals(this.user));
        }
    }

    public String getRealm() {
        return "mockRealm";
    }

    public Date getModifiedDate() {
        return modDate;
    }

    public void delete() {
        if (this.parent == null)
            throw new RuntimeException("attempt to delete root");
        if (this.parent.children == null)
            throw new NullPointerException("children is null");
        this.parent.children.remove(this);
    }

    public void copyTo(CollectionResource toCollection, String name) {
        WebdavResource rClone;
        rClone = (WebdavResource) this.clone((WebdavFolderResource) toCollection);
        rClone.name = name;
    }

    protected Object clone(WebdavFolderResource newParent) {
        return new WebdavResource(newParent, name);
    }

    public int compareTo(Resource o) {
        if (o instanceof WebdavResource) {
            WebdavResource res = (WebdavResource) o;
            return this.getName().compareTo(res.getName());
        } else {
            return -1;
        }
    }

    public String getUniqueId() {
        return this.hashCode() + "";
    }

}