James Moger
2012-07-25 e4f49a0b6956c3000915bc89f7158abd7969f7fe
Real raw page for text, images, and binaries (issue-6, issue-114)
1 files deleted
4 files modified
209 ■■■■■ changed files
docs/04_releases.mkd 3 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/BlobPage.html 3 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/BlobPage.java 15 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/RawPage.html 13 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/RawPage.java 175 ●●●●● patch | view | raw | blame | history
docs/04_releases.mkd
@@ -11,11 +11,14 @@
#### fixes
- Output real RAW content, not simulated RAW content (issue 114)
- Fixed Lucene charset encoding bug when reindexing a repository (issue 112)
- Fixed null pointer in LdapUserSerivce if account has a null email address (issue 110)
#### changes
- Blob page now supports displaying images (issue 6)
- Non-image binary files can now be downloaded using the RAW link
- Updated Polish translation
**1.0.0** *released 2012-07-14*
src/com/gitblit/wicket/pages/BlobPage.html
@@ -29,6 +29,9 @@
        
        <!--  blob content -->
        <pre style="border:0px;" wicket:id="blobText">[blob content]</pre>
        <!--  blob image -->
        <img wicket:id="blobImage" style="padding-top:5px;"></img>
    
</body>
</wicket:extend>
src/com/gitblit/wicket/pages/BlobPage.java
@@ -21,6 +21,7 @@
import org.apache.wicket.Component;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.image.Image;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Repository;
@@ -30,6 +31,7 @@
import com.gitblit.Keys;
import com.gitblit.utils.JGitUtils;
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.ExternalImage;
import com.gitblit.wicket.WicketUtils;
import com.gitblit.wicket.panels.CommitHeaderPanel;
import com.gitblit.wicket.panels.PathBreadcrumbsPanel;
@@ -108,34 +110,41 @@
                    type = map.get(extension);
                }
                Component c = null;
                Component i = null;
                switch (type) {
                case 1:
                    // PrettyPrint blob text
                    c = new Label("blobText", JGitUtils.getStringContent(r, commit.getTree(),
                            blobPath, encodings));
                    WicketUtils.setCssClass(c, "prettyprint linenums");
                    i = new Image("blobImage").setVisible(false);
                    break;
                case 2:
                    // TODO image blobs
                    c = new Label("blobText", "Image File");
                    // image blobs
                    c = new Label("blobText").setVisible(false);
                    i = new ExternalImage("blobImage", urlFor(RawPage.class, WicketUtils.newPathParameter(repositoryName, objectId, blobPath)).toString());
                    break;
                case 3:
                    // TODO binary blobs
                    // binary blobs
                    c = new Label("blobText", "Binary File");
                    i = new Image("blobImage").setVisible(false);
                    break;
                default:
                    // plain text
                    c = new Label("blobText", JGitUtils.getStringContent(r, commit.getTree(),
                            blobPath, encodings));
                    WicketUtils.setCssClass(c, "plainprint");
                    i = new Image("blobImage").setVisible(false);
                }
                add(c);
                add(i);
            } else {
                // plain text
                Label blobLabel = new Label("blobText", JGitUtils.getStringContent(r,
                        commit.getTree(), blobPath, encodings));
                WicketUtils.setCssClass(blobLabel, "plainprint");
                add(blobLabel);
                add(new Image("blobImage").setVisible(false));
            }
        }
    }
src/com/gitblit/wicket/pages/RawPage.html
File was deleted
src/com/gitblit/wicket/pages/RawPage.java
@@ -15,15 +15,19 @@
 */
package com.gitblit.wicket.pages;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.apache.wicket.Component;
import org.apache.wicket.IRequestTarget;
import org.apache.wicket.PageParameters;
import org.apache.wicket.RequestCycle;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.protocol.http.WebResponse;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.gitblit.GitBlit;
import com.gitblit.Keys;
@@ -33,78 +37,125 @@
public class RawPage extends WebPage {
    public RawPage(PageParameters params) {
    private final Logger logger = LoggerFactory.getLogger(getClass().getSimpleName());
    public RawPage(final PageParameters params) {
        super(params);
        if (!params.containsKey("r")) {
            error(getString("gb.repositoryNotSpecified"));
            redirectToInterceptPage(new RepositoriesPage());
        }
        final String repositoryName = WicketUtils.getRepositoryName(params);
        final String objectId = WicketUtils.getObject(params);
        final String blobPath = WicketUtils.getPath(params);
        String [] encodings = GitBlit.getEncodings();
        Repository r = GitBlit.self().getRepository(repositoryName);
        if (r == null) {
            error(getString("gb.canNotLoadRepository") + " " + repositoryName);
            redirectToInterceptPage(new RepositoriesPage());
            return;
        }
        if (StringUtils.isEmpty(blobPath)) {
            // objectid referenced raw view
            Label blobLabel = new Label("rawText", JGitUtils.getStringContent(r, objectId, encodings));
            WicketUtils.setCssClass(blobLabel, "plainprint");
            add(blobLabel);
        } else {
            // standard raw blob view
            RevCommit commit = JGitUtils.getCommit(r, objectId);
            String extension = null;
            if (blobPath.lastIndexOf('.') > -1) {
                extension = blobPath.substring(blobPath.lastIndexOf('.') + 1);
        getRequestCycle().setRequestTarget(new IRequestTarget() {
            @Override
            public void detach(RequestCycle requestCycle) {
            }
            // Map the extensions to types
            Map<String, Integer> map = new HashMap<String, Integer>();
            for (String ext : GitBlit.getStrings(Keys.web.imageExtensions)) {
                map.put(ext.toLowerCase(), 2);
            }
            for (String ext : GitBlit.getStrings(Keys.web.binaryExtensions)) {
                map.put(ext.toLowerCase(), 3);
            }
            @Override
            public void respond(RequestCycle requestCycle) {
                WebResponse response = (WebResponse) requestCycle.getResponse();
            if (extension != null) {
                int type = 0;
                if (map.containsKey(extension)) {
                    type = map.get(extension);
                final String repositoryName = WicketUtils.getRepositoryName(params);
                final String objectId = WicketUtils.getObject(params);
                final String blobPath = WicketUtils.getPath(params);
                String[] encodings = GitBlit.getEncodings();
                Repository r = GitBlit.self().getRepository(repositoryName);
                if (r == null) {
                    error(getString("gb.canNotLoadRepository") + " " + repositoryName);
                    redirectToInterceptPage(new RepositoriesPage());
                    return;
                }
                Component c = null;
                switch (type) {
                case 2:
                    // TODO image blobs
                    c = new Label("rawText", "Image File");
                    break;
                case 3:
                    // TODO binary blobs
                    c = new Label("rawText", "Binary File");
                    break;
                default:
                    // plain text
                    c = new Label("rawText", JGitUtils.getStringContent(r, commit.getTree(),
                            blobPath, encodings));
                    WicketUtils.setCssClass(c, "plainprint");
                if (StringUtils.isEmpty(blobPath)) {
                    // objectid referenced raw view
                    byte [] binary = JGitUtils.getByteContent(r, objectId);
                    response.setContentType("application/octet-stream");
                    response.setContentLength(binary.length);
                    try {
                        response.getOutputStream().write(binary);
                    } catch (Exception e) {
                        logger.error("Failed to write binary response", e);
                    }
                } else {
                    // standard raw blob view
                    RevCommit commit = JGitUtils.getCommit(r, objectId);
                    String filename = blobPath;
                    if (blobPath.indexOf('/') > -1) {
                        filename = blobPath.substring(blobPath.lastIndexOf('/') + 1);
                    }
                    String extension = null;
                    if (blobPath.lastIndexOf('.') > -1) {
                        extension = blobPath.substring(blobPath.lastIndexOf('.') + 1);
                    }
                    // Map the extensions to types
                    Map<String, Integer> map = new HashMap<String, Integer>();
                    for (String ext : GitBlit.getStrings(Keys.web.imageExtensions)) {
                        map.put(ext.toLowerCase(), 2);
                    }
                    for (String ext : GitBlit.getStrings(Keys.web.binaryExtensions)) {
                        map.put(ext.toLowerCase(), 3);
                    }
                    if (extension != null) {
                        int type = 0;
                        if (map.containsKey(extension)) {
                            type = map.get(extension);
                        }
                        switch (type) {
                        case 2:
                            // image blobs
                            byte[] image = JGitUtils.getByteContent(r, commit.getTree(), blobPath);
                            response.setContentType("image/" + extension.toLowerCase());
                            response.setContentLength(image.length);
                            try {
                                response.getOutputStream().write(image);
                            } catch (IOException e) {
                                logger.error("Failed to write image response", e);
                            }
                            break;
                        case 3:
                            // binary blobs (download)
                            byte[] binary = JGitUtils.getByteContent(r, commit.getTree(), blobPath);
                            response.setContentLength(binary.length);
                            response.setContentType("application/octet-stream");
                            response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
                            try {
                                response.getOutputStream().write(binary);
                            } catch (IOException e) {
                                logger.error("Failed to write binary response", e);
                            }
                            break;
                        default:
                            // plain text
                            String content = JGitUtils.getStringContent(r, commit.getTree(),
                                    blobPath, encodings);
                            response.setContentType("text/plain; charset=UTF-8");
                            try {
                                response.getOutputStream().write(content.getBytes("UTF-8"));
                            } catch (Exception e) {
                                logger.error("Failed to write text response", e);
                            }
                        }
                    } else {
                        // plain text
                        String content = JGitUtils.getStringContent(r, commit.getTree(), blobPath,
                                encodings);
                        response.setContentType("text/plain; charset=UTF-8");
                        try {
                            response.getOutputStream().write(content.getBytes("UTF-8"));
                        } catch (Exception e) {
                            logger.error("Failed to write text response", e);
                        }
                    }
                }
                add(c);
            } else {
                // plain text
                Label blobLabel = new Label("rawText", JGitUtils.getStringContent(r,
                        commit.getTree(), blobPath, encodings));
                WicketUtils.setCssClass(blobLabel, "plainprint");
                add(blobLabel);
                r.close();
            }
        }
        r.close();
        });
    }
}