All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.modeshape.webdav.methods.DoGet Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 1999,2004 The Apache Software Foundation.
 *
 * Licensed 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.modeshape.webdav.methods;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.DateFormat;
import java.util.Arrays;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.modeshape.common.i18n.TextI18n;
import org.modeshape.webdav.IMimeTyper;
import org.modeshape.webdav.ITransaction;
import org.modeshape.webdav.IWebdavStore;
import org.modeshape.webdav.StoredObject;
import org.modeshape.webdav.WebdavStatus;
import org.modeshape.webdav.locking.ResourceLocks;

public class DoGet extends DoHead {

    public DoGet( IWebdavStore store,
                  String dftIndexFile,
                  String insteadOf404,
                  ResourceLocks resourceLocks,
                  IMimeTyper mimeTyper,
                  int contentLengthHeader ) {
        super(store, dftIndexFile, insteadOf404, resourceLocks, mimeTyper, contentLengthHeader);

    }

    @Override
    protected void doBody( ITransaction transaction,
                           HttpServletResponse resp,
                           String path ) {

        try {
            StoredObject so = store.getStoredObject(transaction, path);
            if (so == null) {
                resp.sendError(HttpServletResponse.SC_NOT_FOUND);
                return;
            }
            if (so.isNullResource()) {
                String methodsAllowed = DeterminableMethod.determineMethodsAllowed(so);
                resp.addHeader("Allow", methodsAllowed);
                resp.sendError(WebdavStatus.SC_METHOD_NOT_ALLOWED);
                return;
            }
            OutputStream out = resp.getOutputStream();
            InputStream in = store.getResourceContent(transaction, path);
            try {
                int read = -1;
                byte[] copyBuffer = new byte[BUF_SIZE];

                while ((read = in.read(copyBuffer, 0, copyBuffer.length)) != -1) {
                    out.write(copyBuffer, 0, read);
                }
            } finally {
                // flushing causes a IOE if a file is opened on the webserver
                // client disconnected before server finished sending response
                try {
                    in.close();
                } catch (Exception e) {
                    logger.warn(e, new TextI18n("Closing InputStream causes Exception!"));
                }
                try {
                    out.flush();
                    out.close();
                } catch (Exception e) {
                    logger.warn(e, new TextI18n("Flushing OutputStream causes Exception!"));
                }
            }
        } catch (Exception e) {
            logger.trace(e.toString());
        }
    }

    @Override
    protected void folderBody( ITransaction transaction,
                               String path,
                               HttpServletResponse resp,
                               HttpServletRequest req ) throws IOException {

        StoredObject so = store.getStoredObject(transaction, path);
        if (so == null) {
            resp.sendError(HttpServletResponse.SC_NOT_FOUND, req.getRequestURI());
        } else {

            if (so.isNullResource()) {
                String methodsAllowed = DeterminableMethod.determineMethodsAllowed(so);
                resp.addHeader("Allow", methodsAllowed);
                resp.sendError(WebdavStatus.SC_METHOD_NOT_ALLOWED);
                return;
            }

            if (so.isFolder()) {
                // TODO some folder response (for browsers, DAV tools use propfind) in html?
                DateFormat shortDF = getDateTimeFormat(req.getLocale());
                resp.setContentType("text/html");
                resp.setCharacterEncoding("UTF-8");
                OutputStream out = resp.getOutputStream();
                String[] children = store.getChildrenNames(transaction, path);
                // Make sure it's not null
                children = children == null ? new String[] {} : children;
                // Sort by name
                Arrays.sort(children);
                StringBuilder childrenTemp = new StringBuilder();
                childrenTemp.append("Content of folder");
                childrenTemp.append(path);
                childrenTemp.append("");
                childrenTemp.append("");
                childrenTemp.append(getHeader(transaction, path, resp, req));
                childrenTemp.append("");
                childrenTemp.append("");
                childrenTemp.append("");
                childrenTemp.append("");
                boolean isEven = false;
                for (String child : children) {
                    isEven = !isEven;
                    childrenTemp.append("");
                    childrenTemp.append("");
                    if (obj != null && obj.isFolder()) {
                        childrenTemp.append("");
                    } else {
                        childrenTemp.append("");
                    }
                    if (obj != null && obj.getCreationDate() != null) {
                        childrenTemp.append("");
                    } else {
                        childrenTemp.append("");
                    }
                    if (obj != null && obj.getLastModified() != null) {
                        childrenTemp.append("");
                    } else {
                        childrenTemp.append("");
                    }
                    childrenTemp.append("");
                }
                childrenTemp.append("
NameSizeCreatedModified
Parent
"); childrenTemp.append(""); childrenTemp.append(child); childrenTemp.append("Folder"); if (obj != null) { childrenTemp.append(obj.getResourceLength()); } else { childrenTemp.append("Unknown"); } childrenTemp.append(" Bytes"); childrenTemp.append(shortDF.format(obj.getCreationDate())); childrenTemp.append(""); childrenTemp.append(shortDF.format(obj.getLastModified())); childrenTemp.append("
"); childrenTemp.append(getFooter(transaction, path, resp, req)); childrenTemp.append(""); String response = childrenTemp.toString(); if (logger.isTraceEnabled()) { logger.trace("Sending response {0}", response); } out.write(response.getBytes("UTF-8")); } } } /** * Return the CSS styles used to display the HTML representation of the webdav content. * * @return the HTML body */ protected String getCSS() { // The default styles to use String retVal = "body {\n" + " font-family: Arial, Helvetica, sans-serif;\n" + "}\n" + "h1 {\n" + " font-size: 1.5em;\n" + "}\n" + "th {\n" + " background-color: #9DACBF;\n" + "}\n" + "table {\n" + " border-top-style: solid;\n" + " border-right-style: solid;\n" + " border-bottom-style: solid;\n" + " border-left-style: solid;\n" + "}\n" + "td {\n" + " margin: 0px;\n" + " padding-top: 2px;\n" + " padding-right: 5px;\n" + " padding-bottom: 2px;\n" + " padding-left: 5px;\n" + "}\n" + "tr.even {\n" + " background-color: #CCCCCC;\n" + "}\n" + "tr.odd {\n" + " background-color: #FFFFFF;\n" + "}\n" + ""; try { // Try loading one via class loader and use that one instead ClassLoader cl = getClass().getClassLoader(); InputStream iStream = cl.getResourceAsStream("webdav.css"); if (iStream != null) { // Found css via class loader, use that one StringBuilder out = new StringBuilder(); byte[] b = new byte[4096]; for (int n; (n = iStream.read(b)) != -1;) { out.append(new String(b, 0, n)); } retVal = out.toString(); } } catch (Exception ex) { logger.error(ex, new TextI18n("Error in reading webdav.css")); } return retVal; } /** * Return the header to be displayed in front of the folder content * * @param transaction * @param path * @param resp * @param req * @return the header string */ protected String getHeader( ITransaction transaction, String path, HttpServletResponse resp, HttpServletRequest req ) { return "

Content of folder " + path + "

"; } /** * Return the footer to be displayed after the folder content * * @param transaction * @param path * @param resp * @param req * @return the footer string */ protected String getFooter( ITransaction transaction, String path, HttpServletResponse resp, HttpServletRequest req ) { return ""; } /** * Return this as the Date/Time format for displaying Creation + Modification dates * * @param browserLocale * @return DateFormat used to display creation and modification dates */ protected DateFormat getDateTimeFormat( Locale browserLocale ) { return DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM, browserLocale); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy