Java tutorial
/* * 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() + ""; } }