Author: adamw Date: 2005-10-09 10:44:15 -0400 (Sun, 09 Oct 2005) New Revision: 1350 Added: trunk/forge/portal-extensions/shotoku/shotoku-svn/src/etc/ trunk/forge/portal-extensions/shotoku/shotoku-svn/src/etc/mime-types.txt Removed: trunk/forge/portal-extensions/forge-file-access/src/etc/ Modified: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/ForgeHelper.java trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/Projects.java trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/ProjectsHelper.java trunk/forge/portal-extensions/forge-file-access/project.xml trunk/forge/portal-extensions/forge-file-access/src/java/org/jboss/forge/fileaccess/FileAccessFilter.java trunk/forge/portal-extensions/forge-freezone/src/java/org/jboss/forge/projects/freezone/Freezone.java trunk/forge/portal-extensions/forge-freezone/src/web/WEB-INF/portlet.xml trunk/forge/portal-extensions/forge-navigation/src/java/org/jboss/forge/navigation/NavigationTools.java trunk/forge/portal-extensions/forge-portal-attr/src/java/org/jboss/forge/portal/AttributesFilter.java trunk/forge/portal-extensions/forge-root-redirect/src/java/org/jboss/forge/redirect/RootRedirectFilter.java trunk/forge/portal-extensions/portal-default/src/web/WEB-INF/default-portal.xml trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/Node.java trunk/forge/portal-extensions/shotoku/shotoku-svn/project.xml trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnHeadNode.java trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnHistoricNode.java trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnNode.java Log: JBLAB-397: Friendly URLs for freezone w/ redirects and some shotoku enhancements (mime types) Modified: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/ForgeHelper.java =================================================================== --- trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/ForgeHelper.java 2005-10-09 10:37:33 UTC (rev 1349) +++ trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/ForgeHelper.java 2005-10-09 14:44:15 UTC (rev 1350) @@ -18,6 +18,7 @@ import javax.mail.internet.MimeMessage; import javax.management.MalformedObjectNameException; import javax.portlet.PortalContext; +import javax.portlet.PortletRequest; import org.jboss.forge.common.blog.BlogUpdater; import org.jboss.forge.common.service.ForgeManagement; @@ -73,11 +74,14 @@ */ public final static String FORGE_SERVICE_NAME = "forge:service=cacheAndUpdate"; /** - * <code>FREEZONE_SEPARATOR</code> - separator used in requests insted of - * file-name components separator /. + * <code>FREEZONE_PREPEND</code> - string to prepend to all freezone links. */ - public final static String FREEZONE_SEPARATOR = "+"; - + public final static String FREEZONE_PREPEND = "/portal/"; + /** + * <code>LABS_PORTAL</code> - name of the portal where the labs page is. + */ + public final static String LABS_PORTAL = "default"; + private static ForgeProperties props; static { @@ -244,7 +248,7 @@ * Corresponding request. * @return Name of the current portal. */ - public static String getPortalName(JBossRenderRequest request) { + public static String getPortalName(PortletRequest request) { PortalContext portalCtx = request.getPortalContext(); String portalName = portalCtx .getProperty("org.jboss.portal.property.name"); @@ -332,12 +336,7 @@ * @return A link to the given page. */ public static String createFreezonePageLink(String portalName, String page) { - String pageLink = replace(page, "/", FREEZONE_SEPARATOR); - if (pageLink.charAt(0) == '+') - pageLink = pageLink.substring(1); - - return "/portal/index.html?ctrl:id=page." + portalName - + ".freezone&page=" + pageLink; + return FREEZONE_PREPEND + page; } /** Modified: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/Projects.java =================================================================== --- trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/Projects.java 2005-10-09 10:37:33 UTC (rev 1349) +++ trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/Projects.java 2005-10-09 14:44:15 UTC (rev 1350) @@ -142,6 +142,26 @@ } /** + * Checks if a project with the given id exists. + * @param projectId Id of the project to check. + * @return True iff a project with the given id exists. + */ + public boolean projectExists(String projectId) { + return getProjectsDescriptor().getProjectDescriptor(projectId) != null; + } + + /** + * Checks if a project with the given id exists and is accessible with the + * given permissions. + * @param pc Permissions checker to use. + * @param projectId Id of the project to check. + * @return True iff a project with the given id exists. + */ + public boolean projectExists(PermissionsChecker pc, String projectId) { + return getProjectsDescriptor().getProjectContext(pc, projectId) != null; + } + + /** * Searches for the given string in project's names and descriptions. * * @param pc Permissions checker to use. Modified: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/ProjectsHelper.java =================================================================== --- trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/ProjectsHelper.java 2005-10-09 10:37:33 UTC (rev 1349) +++ trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/ProjectsHelper.java 2005-10-09 14:44:15 UTC (rev 1350) @@ -170,13 +170,7 @@ */ public static String createFreezonePageLink(String portalName, String projectId, String page) { - String pageLink = ForgeHelper.replace(page, "/", ForgeHelper.FREEZONE_SEPARATOR); - if (pageLink.charAt(0) == '+') - pageLink = pageLink.substring(1); - - return "/portal/index.html?ctrl:id=page." + portalName - + ".freezone&project=" + projectId + "&page=" - + pageLink; + return ForgeHelper.FREEZONE_PREPEND + projectId + "/" + page; } /** Modified: trunk/forge/portal-extensions/forge-file-access/project.xml =================================================================== --- trunk/forge/portal-extensions/forge-file-access/project.xml 2005-10-09 10:37:33 UTC (rev 1349) +++ trunk/forge/portal-extensions/forge-file-access/project.xml 2005-10-09 14:44:15 UTC (rev 1350) @@ -43,21 +43,5 @@ <version>1.0</version> <jar>javax.servlet.jar</jar> </dependency> - - <dependency> - <groupId>jboss</groupId> - <artifactId>activation</artifactId> - <version>1.0</version> - <jar>activation.jar</jar> - </dependency> </dependencies> - - <build> - <resources> - <resource> - <directory>src/etc/</directory> - <include>**/*</include> - </resource> - </resources> - </build> </project> Modified: trunk/forge/portal-extensions/forge-file-access/src/java/org/jboss/forge/fileaccess/FileAccessFilter.java =================================================================== --- trunk/forge/portal-extensions/forge-file-access/src/java/org/jboss/forge/fileaccess/FileAccessFilter.java 2005-10-09 10:37:33 UTC (rev 1349) +++ trunk/forge/portal-extensions/forge-file-access/src/java/org/jboss/forge/fileaccess/FileAccessFilter.java 2005-10-09 14:44:15 UTC (rev 1350) @@ -13,7 +13,6 @@ import java.io.OutputStream; import java.net.URLDecoder; -import javax.activation.MimetypesFileTypeMap; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -61,11 +60,9 @@ @Inject private ContentManager contentManager; - private MimetypesFileTypeMap mimeTypes; public void init(FilterConfig conf) { - mimeTypes = new MimetypesFileTypeMap( - FileAccessFilter.class.getResourceAsStream("/mime-types.txt")); + } private void checkResource(String resource) throws Exception { @@ -107,23 +104,17 @@ requestedRes = URLDecoder.decode(requestedRes, "utf-8"); } - // The last token is the filename. - String[] tokens = requestURI.split("[/]"); - try { // Checking if we can allow access to this resource. checkResource(requestedRes); - // Computing the mime type of the resource. - String mimeType = mimeTypes - .getContentType(tokens[tokens.length - 1]); - Node requestedNode = contentManager.getNode(requestedRes); + String mimeType = requestedNode.getMimeType(); // Getting the input stream for the requested resource. InputStream is = requestedNode.getContentInputStream(); - // Setting response paramters + // Setting response parameters response.setContentType(mimeType); response.setContentLength((int) requestedNode.getLength()); Modified: trunk/forge/portal-extensions/forge-freezone/src/java/org/jboss/forge/projects/freezone/Freezone.java =================================================================== --- trunk/forge/portal-extensions/forge-freezone/src/java/org/jboss/forge/projects/freezone/Freezone.java 2005-10-09 10:37:33 UTC (rev 1349) +++ trunk/forge/portal-extensions/forge-freezone/src/java/org/jboss/forge/projects/freezone/Freezone.java 2005-10-09 14:44:15 UTC (rev 1350) @@ -9,16 +9,23 @@ package org.jboss.forge.projects.freezone; import java.io.IOException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; +import javax.portlet.PortletException; +import javax.portlet.PortletSecurityException; + import org.jboss.forge.common.ForgeHelper; import org.jboss.forge.common.projects.ProjectsHelper; +import org.jboss.forge.common.projects.permissions.ActionRequestPermissionsChecker; +import org.jboss.portal.core.CoreConstants; +import org.jboss.portlet.JBossActionRequest; +import org.jboss.portlet.JBossActionResponse; import org.jboss.portlet.JBossPortlet; import org.jboss.portlet.JBossRenderRequest; import org.jboss.portlet.JBossRenderResponse; import org.jboss.shotoku.ContentManager; +import org.jboss.shotoku.Node; import org.jboss.shotoku.aop.Inject; +import org.jboss.shotoku.exceptions.ResourceDoesNotExist; /** * A portlet for a project freezone. @@ -31,268 +38,106 @@ * page is selected. */ private final static String DEFAULT_PAGE = "index.html"; + + private final static String DEFAULT_DIR = "default"; + + private final static String PATH_PARAM = "path"; - private final static String ANCHOR_PATTERN = "<a[^<]*href[^>]*>"; - - private final static String IMG_PATTERN = "<img[^<]*src[^>]*>"; - - private final static String ATTRIBUTE_PATTERN = - " *= *[\"']? ?[^ \"'>]* ?[\"']?"; - - private final static String HREF_PATTERN = "href" + ATTRIBUTE_PATTERN; - - private final static String SRC_PATTERN = "src" + ATTRIBUTE_PATTERN; - @Inject private ContentManager cm; - /** - * Figures out if a link shouldn't be changed: this is the case when either - * it is an off-site link, or it starts with '/'. This recognizes the most - * common protocols by checking how it starts (clears all white space in - * case the link starts with '\n' or [space]). - * - * @author Janne Jalkanen - * @author adamw - */ - private boolean isOutsideLink(String link) { - link = link.trim(); - return link.startsWith("/") || ForgeHelper.isOutsideLink(link); + private void sendResponseNotFound(JBossRenderResponse response) throws IOException { + response.setContentType("text/html"); + response.getWriter().println("404 - Not found."); } - - // modifies path to page/resource so folder structure can be supported - private String modifyPath(String path, String element) { - int start, end; - String mainPath = ""; - if (element.startsWith("#")) { - return path + element; - - } else if (element.startsWith("./")) { - element = element.substring(2); - }// ignore ./ only clutters the code - - int pre = path.lastIndexOf('/'); - if (pre == -1)// we are in root dir - { - return element; - } else { - mainPath = path.substring(0, pre); - }// main path to page - - if (element.startsWith("/")) - return element.substring(1); // base path, start with WEB-root - - if (element.indexOf('/') != -1) { - if (element.indexOf("../") != -1)// need to go up a few levels - { - while (element.indexOf("../") != -1) // do we need to go more - { - if (mainPath.equals("")) - return DEFAULT_PAGE; // trying to go too far up - else { - start = element.lastIndexOf("../");// go one level up - end = mainPath.lastIndexOf("/");// find last level - if (end == -1) { - end = 0; - } // we have reached last level - element = element.substring(0, start) - + element.substring(start + 3, - element.length()); - mainPath = mainPath.substring(0, end); - - }// else - - }// while - - }// if ../ - + + public void doView(JBossRenderRequest request, JBossRenderResponse response) + throws IOException { + String requestedPath = request.getParameter(PATH_PARAM); + if (requestedPath == null) { + sendResponseNotFound(response); + return; } - - return mainPath + '/' + element; + + Node requestedNode; + try { + requestedNode = cm.getNode(requestedPath); + } catch (ResourceDoesNotExist e) { + sendResponseNotFound(response); + return; + } + + response.setContentType("text/html"); + response.getWriter().write(requestedNode.getContent()); } - /** - * Prepares a link for transforming - cuts off unnecessary spaces and - * removes any ' or " around it. - * - * @param link - * Link to prepare. - * @return A trimmed link with ' and " cut off from the beginning/end. - */ - private String prepareLink(String link) { - link = link.trim(); - - // Cutting off the ' or " from the beginning and end of - // the link. - if (('\'' == link.charAt(0)) || ('\"' == link.charAt(0))) - link = link.substring(1); - - int linkLength = link.length(); - if ((linkLength >= 1) - && (('\'' == link.charAt(linkLength - 1)) || ('\"' == link - .charAt(linkLength - 1)))) - link = link.substring(0, linkLength - 1); - - link = link.trim(); - - return link; - } - - public void doView(JBossRenderRequest request, JBossRenderResponse response) - throws IOException { - response.setContentType("text/html"); - + @Override + protected void processAction(JBossActionRequest request, JBossActionResponse response) + throws PortletException, PortletSecurityException, IOException { + String portalName = ForgeHelper.getPortalName(request); + + // Getting the requested path. + String reqPath = request.getParameter(CoreConstants.REQ_ACTION_PARAM_PATH); + + // No path/ invalid path - nothing to display. + if ((reqPath == null) || (reqPath.contains(".."))) + return; + + // For "root" requests, redirecting to a default page. + if (("".equals(reqPath)) || ("/".equals(reqPath))) { + response.sendRedirect(ForgeHelper.createPageLink(ForgeHelper.LABS_PORTAL, "default")); + return; + } + + // Ignoring any possible parameters. + int qmIndex = reqPath.indexOf('?'); + if (qmIndex != -1) + reqPath = reqPath.substring(0, qmIndex); + + // Checking if the first part of the path is a project name. + String[] tokens = reqPath.split("[/]"); + boolean isProjectLink = false; + if (tokens.length > 1) + isProjectLink = + ProjectsHelper.getProjects(portalName).projectExists( + new ActionRequestPermissionsChecker(request), tokens[1]); + + // If the requested path references a project, getting the page from + // the project's freezone dir. Otherwise, getting the page from the + // default directory. + String cmsPath = portalName + "/" + ProjectsHelper.MEMBERS_DIR + "/"; + if (isProjectLink) { + cmsPath += tokens[1] + "/" + ProjectsHelper.FREEZONE_DIR + "/" + + reqPath.split("[/]", 3)[2]; + } else { + cmsPath += DEFAULT_DIR + "/" + ProjectsHelper.FREEZONE_DIR + + reqPath; + } + + // Checking if we don't have to add a default page to the constructed + // path. + if (!cmsPath.contains(".")) { + if (!cmsPath.endsWith("/")) + cmsPath += "/"; + + cmsPath += DEFAULT_PAGE; + } + + // Getting the node and its content type. If it the same as the + // content type of the response, passing it for rendering. Otherwise, + // sending bytes. + Node requestedNode; try { - String portalName = ForgeHelper.getPortalName(request); - - // Getting the selected project - String projectId = ProjectsHelper.getSelectedProjectId(request, - true); - - // Getting the name of the requested page - String pagePath = ForgeHelper.getRequestParameter(request, "page"); - if (pagePath == null) - pagePath = DEFAULT_PAGE; - else - pagePath = ForgeHelper.replace(pagePath, - ForgeHelper.FREEZONE_SEPARATOR, "/"); - - // If the user tried to break into other files, denying access to - // him. - if (pagePath.indexOf("..") != -1) - throw new Exception(); - - // Reading the file. - String pageContent = cm.getNode(portalName + "/" - + ProjectsHelper.MEMBERS_DIR + "/" + projectId + "/" - + ProjectsHelper.FREEZONE_DIR + "/" - + pagePath).getContent(); - if (pageContent == null) - throw new Exception(); - - int patternFlags = Pattern.CASE_INSENSITIVE | Pattern.DOTALL - | Pattern.MULTILINE; - - Pattern anchor = Pattern.compile(ANCHOR_PATTERN, patternFlags); - Pattern href = Pattern.compile(HREF_PATTERN, patternFlags); - Pattern img = Pattern.compile(IMG_PATTERN, patternFlags); - Pattern src = Pattern.compile(SRC_PATTERN, patternFlags); - - // This should be prepended to all links that want to read - // from file-access. - String fileAccessPrepend = "/file-access/" + portalName + "/" - + ProjectsHelper.MEMBERS_DIR + "/" + projectId + "/" - + ProjectsHelper.FREEZONE_DIR + "/"; - - // REPLACING ANCHORS - Matcher anchorMatcher = anchor.matcher(pageContent); - - // Here we will build the freezone-parsed page content. - StringBuffer replacedPageContent = new StringBuffer(); - - // First we iterate over all anchors. (<a ...>) - while (anchorMatcher.find()) { - String nextAnchor = pageContent.substring( - anchorMatcher.start(), anchorMatcher.end()); - - StringBuffer nextAnchorReplacement; - - // Parsing the anchor to get the href element. - Matcher hrefMatcher = href.matcher(nextAnchor); - if (hrefMatcher.find()) { - // Now we have the href attribute. We must get the - // link from it, and if it is not an outside or / - // link, then transform it to a freezone one. - String nextHref = nextAnchor.substring(hrefMatcher.start(), - hrefMatcher.end()); - - // Getting the proper link from the href. - String link = - nextHref.substring(nextHref.indexOf('=') + 1); - - link = prepareLink(link); - - // Prepending necessary things to the link. - if (!isOutsideLink(link)) { - link = modifyPath(pagePath, link); - if (link.endsWith(".css")) { - link = fileAccessPrepend + link; - } else if (!((link.contains(".html")) || (link - .contains(".htm")))) { - // Must be an image or other media. - link = fileAccessPrepend + link - + "\" target=\"_blank"; - } else - // Must be a html page. - link = ProjectsHelper.createFreezonePageLink( - portalName, projectId, link); - } - - // Replacing the old link with a new one. - nextAnchorReplacement = new StringBuffer(); - hrefMatcher.appendReplacement(nextAnchorReplacement, - "href=\"" + link + "\""); - hrefMatcher.appendTail(nextAnchorReplacement); - } else { - nextAnchorReplacement = new StringBuffer(nextAnchor); - } - - anchorMatcher.appendReplacement(replacedPageContent, - nextAnchorReplacement.toString()); - } - - anchorMatcher.appendTail(replacedPageContent); - - // REPLACING IMAGES - pageContent = replacedPageContent.toString(); - Matcher imgMatcher = img.matcher(pageContent); - - replacedPageContent = new StringBuffer(); - - // Iterating over all image references (<img ...>). - while (imgMatcher.find()) { - String nextImg = pageContent.substring(imgMatcher.start(), - imgMatcher.end()); - - StringBuffer nextImgReplacement; - - // Parsing the image to get the src element. - Matcher srcMatcher = src.matcher(nextImg); - if (srcMatcher.find()) { - String nextSrc = nextImg.substring(srcMatcher.start(), - srcMatcher.end()); - - // Getting the proper link from the src. - String link = nextSrc.substring(nextSrc.indexOf('=') + 1); - - link = prepareLink(link); - - // Modifying the link. - if (!isOutsideLink(link)) { - link = modifyPath(pagePath, link); - link = fileAccessPrepend + link; - } - - // Replacing the old link with a new one. - nextImgReplacement = new StringBuffer(); - srcMatcher.appendReplacement(nextImgReplacement, "src=\"" - + link + "\""); - srcMatcher.appendTail(nextImgReplacement); - } else { - nextImgReplacement = new StringBuffer(nextImg); - } - - imgMatcher.appendReplacement(replacedPageContent, - nextImgReplacement.toString()); - } - - imgMatcher.appendTail(replacedPageContent); - - response.getWriter().write(replacedPageContent.toString()); - } catch (Exception e) { - e.printStackTrace(); - response.getWriter().write( - "The page you requested cannot be accessed"); + requestedNode = cm.getNode(cmsPath); + } catch (ResourceDoesNotExist e) { + return; } + + String mimeType = requestedNode.getMimeType(); + if (request.getResponseContentType().equalsIgnoreCase(mimeType)) { + response.setRenderParameter(PATH_PARAM, cmsPath); + } else { + response.sendRedirect("/" + ForgeHelper.FILE_ACCESS_DIR + "/" + cmsPath); + } } } Modified: trunk/forge/portal-extensions/forge-freezone/src/web/WEB-INF/portlet.xml =================================================================== --- trunk/forge/portal-extensions/forge-freezone/src/web/WEB-INF/portlet.xml 2005-10-09 10:37:33 UTC (rev 1349) +++ trunk/forge/portal-extensions/forge-freezone/src/web/WEB-INF/portlet.xml 2005-10-09 14:44:15 UTC (rev 1350) @@ -1,18 +1,18 @@ -<?xml version="1.0" encoding="UTF-8"?> -<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd" - version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"> - <portlet> - <description>Forge project freezone portlet</description> - <portlet-name>PrjFreezonePortlet</portlet-name> - <display-name>Project freezone</display-name> - <portlet-class>org.jboss.forge.projects.freezone.Freezone</portlet-class> - <supports> - <mime-type>text/html</mime-type> - <portlet-mode>VIEW</portlet-mode> - </supports> - <portlet-info> - <title>Project freezone</title> - </portlet-info> - </portlet> - </portlet-app> +<?xml version="1.0" encoding="UTF-8"?> +<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd" + version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"> + <portlet> + <description>Forge project freezone portlet</description> + <portlet-name>PrjFreezonePortlet</portlet-name> + <display-name>Project freezone</display-name> + <portlet-class>org.jboss.forge.projects.freezone.Freezone</portlet-class> + <supports> + <mime-type>text/html</mime-type> + <portlet-mode>VIEW</portlet-mode> + </supports> + <portlet-info> + <title>Project freezone</title> + </portlet-info> + </portlet> + </portlet-app> Modified: trunk/forge/portal-extensions/forge-navigation/src/java/org/jboss/forge/navigation/NavigationTools.java =================================================================== --- trunk/forge/portal-extensions/forge-navigation/src/java/org/jboss/forge/navigation/NavigationTools.java 2005-10-09 10:37:33 UTC (rev 1349) +++ trunk/forge/portal-extensions/forge-navigation/src/java/org/jboss/forge/navigation/NavigationTools.java 2005-10-09 14:44:15 UTC (rev 1350) @@ -42,7 +42,7 @@ return desc; } - private static String NO_PROJECT_PARAM = "&noproject=true"; + private static String NO_PROJECT_PARAM = "noproject=true"; static String prepareLinkForDisplay(String link) { if (link == null) @@ -51,8 +51,13 @@ // To each link, adding a noproject param, unless it's a project link. if ((!link.contains(NO_PROJECT_PARAM)) && (!link.contains("project=")) && - (!ForgeHelper.isOutsideLink(link))) - return link + NO_PROJECT_PARAM; + (!ForgeHelper.isOutsideLink(link))) { + // Checking if this is a first parameter. + if (link.contains("?")) + return link + "&" + NO_PROJECT_PARAM; + else + return link + "?" + NO_PROJECT_PARAM; + } return link; } @@ -66,16 +71,12 @@ return ForgeHelper.createPageLink(portalName, "default"); // Deleting the noproject parameter, as it is not present in the generated links. - int i = link.indexOf(NO_PROJECT_PARAM); - if (i != -1) - link = link.substring(0, i); + // There are three possibilites: it is the first parameter and there are no more + // parameters, there are more parameters, or it is a not-first parameter. + link = link.replace("?" + NO_PROJECT_PARAM + "&", "?"); + link = link.replace("?" + NO_PROJECT_PARAM, ""); + link = link.replace("&" + NO_PROJECT_PARAM, ""); - // Deleting the project=default parameter from freezone link, as it is a dummy - // project and not present in the generated links. - if (link.contains("freezone")) { - link = link.replace("&project=default", ""); - } - return link; } } Modified: trunk/forge/portal-extensions/forge-portal-attr/src/java/org/jboss/forge/portal/AttributesFilter.java =================================================================== --- trunk/forge/portal-extensions/forge-portal-attr/src/java/org/jboss/forge/portal/AttributesFilter.java 2005-10-09 10:37:33 UTC (rev 1349) +++ trunk/forge/portal-extensions/forge-portal-attr/src/java/org/jboss/forge/portal/AttributesFilter.java 2005-10-09 14:44:15 UTC (rev 1350) @@ -10,11 +10,14 @@ import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; +import org.jboss.forge.common.ForgeHelper; +import org.jboss.forge.common.projects.ProjectsHelper; + public class AttributesFilter implements Filter { public void init(FilterConfig config) throws ServletException { } - + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { @@ -24,6 +27,16 @@ // Getting the request parameters. String project = request.getParameter("project"); String noproject = request.getParameter("noproject"); + + // The project doesn't have to be passed as a parameter. It can be + // passed in the requestURI, when accessing freezone pages. This + // only applies to the default portal. + String requestURI = httpRequest.getRequestURI(); + String[] tokens = requestURI.split("[/]"); + if ((tokens.length > 2) && + (ProjectsHelper.getProjects( + ForgeHelper.LABS_PORTAL).projectExists(tokens[2]))) + project = tokens[2]; if ("true".equals(noproject)) { // Removing project from session info. @@ -44,7 +57,7 @@ } // Putting the full requested url into session for navigation. - String fullUrl = httpRequest.getRequestURI(); + String fullUrl = requestURI; if (httpRequest.getQueryString() != null) fullUrl += "?" + httpRequest.getQueryString(); Modified: trunk/forge/portal-extensions/forge-root-redirect/src/java/org/jboss/forge/redirect/RootRedirectFilter.java =================================================================== --- trunk/forge/portal-extensions/forge-root-redirect/src/java/org/jboss/forge/redirect/RootRedirectFilter.java 2005-10-09 10:37:33 UTC (rev 1349) +++ trunk/forge/portal-extensions/forge-root-redirect/src/java/org/jboss/forge/redirect/RootRedirectFilter.java 2005-10-09 14:44:15 UTC (rev 1350) @@ -14,16 +14,13 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.jboss.forge.common.ForgeHelper; import org.jboss.forge.common.projects.ProjectsHelper; /** * @author adamw */ public class RootRedirectFilter implements Filter { - /** - * <code>DEFAULT_PORTAL</code> - Name of the portal in which forge pages are in. - */ - private final static String FORGE_PORTAL = "default"; private final static String WRONG_REQ_RESP = "Error accessing the requested resource."; public void init(FilterConfig conf) { @@ -34,6 +31,10 @@ return "projects".equals(token) || "products".equals(token); } + private boolean checkUriMainPage(String uri) { + return "".equals(uri) || "/".equals(uri); + } + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException { if ((request instanceof HttpServletRequest) @@ -46,20 +47,12 @@ String redirectTo; - if ((tokens.length > 3) && (!"".equals(tokens[3])) && (checkFirstToken(tokens[1]))) { - String freezonePage = tokens[3]; - - if (!freezonePage.contains(".")) { - if (!freezonePage.endsWith("/")) freezonePage += "/"; - freezonePage += "index.html"; - } - - redirectTo = ProjectsHelper.createFreezonePageLink(FORGE_PORTAL, - tokens[2], freezonePage); - } else if ((tokens.length > 2) && (!"".equals(tokens[2])) && (checkFirstToken(tokens[1]))) { - redirectTo = ProjectsHelper.getProjects(FORGE_PORTAL).getProjectLink(tokens[2]); - } else if ((tokens.length > 1) && (!"".equals(tokens[1]))) { - redirectTo = "/portal/" + FORGE_PORTAL; + if ((tokens.length > 2) && (!"".equals(tokens[2])) && (checkFirstToken(tokens[1]))) { + // Project redirect. + redirectTo = ProjectsHelper.getProjects(ForgeHelper.LABS_PORTAL).getProjectLink(tokens[2]); + } else if (checkUriMainPage(requestURI)) { + // Main page redirect. + redirectTo = ForgeHelper.createPageLink(ForgeHelper.LABS_PORTAL, "default"); } else { redirectTo = "/portal"+requestURI; } Modified: trunk/forge/portal-extensions/portal-default/src/web/WEB-INF/default-portal.xml =================================================================== --- trunk/forge/portal-extensions/portal-default/src/web/WEB-INF/default-portal.xml 2005-10-09 10:37:33 UTC (rev 1349) +++ trunk/forge/portal-extensions/portal-default/src/web/WEB-INF/default-portal.xml 2005-10-09 14:44:15 UTC (rev 1350) @@ -17,7 +17,6 @@ <window-state>maximized</window-state> </supported-window-states> <properties> - <!-- Set the default window for request of the type /a/b/c --> <property> <name>org.jboss.portal.property.layout</name> <value>JBossForge</value> @@ -26,6 +25,11 @@ <name>org.jboss.portal.property.renderSet</name> <value>jbfRenderer</value> </property> + <!-- Set the default window for request of the type /a/b/c --> + <property> + <name>org.jboss.portal.property.action</name> + <value>FreezonePortletWindowDefaultFreezone</value> + </property> <!-- set the default strategy name (used by the strategy interceptor) --> <!-- see also portal-strategies.xml --> <property> Modified: trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/Node.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/Node.java 2005-10-09 10:37:33 UTC (rev 1349) +++ trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/Node.java 2005-10-09 14:44:15 UTC (rev 1350) @@ -60,7 +60,7 @@ * @throws RepositoryException */ public InputStream getContentInputStream() throws RepositoryException; - + /** * Gets the length of this node's content. * @@ -76,4 +76,11 @@ * @throws RepositoryException */ public long getLastModfication() throws RepositoryException; + + /** + * Gets the mime type of this node. + * + * @return Mime type of this node. + */ + public String getMimeType(); } Modified: trunk/forge/portal-extensions/shotoku/shotoku-svn/project.xml =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/project.xml 2005-10-09 10:37:33 UTC (rev 1349) +++ trunk/forge/portal-extensions/shotoku/shotoku-svn/project.xml 2005-10-09 14:44:15 UTC (rev 1350) @@ -28,15 +28,22 @@ <artifactId>jboss-jmx</artifactId> <version>1.0</version> <jar>jboss-jmx.jar</jar> - </dependency> + </dependency> + + <dependency> + <groupId>jboss</groupId> + <artifactId>activation</artifactId> + <version>1.0</version> + <jar>activation.jar</jar> + </dependency> </dependencies> <build> <sourceDirectory>src/java</sourceDirectory> <resources> <resource> - <directory>src/etc/</directory> - <include>**/*.xml</include> + <directory>src/etc</directory> + <include>**/*</include> </resource> </resources> </build> Added: trunk/forge/portal-extensions/shotoku/shotoku-svn/src/etc/mime-types.txt =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/etc/mime-types.txt 2005-10-09 10:37:33 UTC (rev 1349) +++ trunk/forge/portal-extensions/shotoku/shotoku-svn/src/etc/mime-types.txt 2005-10-09 14:44:15 UTC (rev 1350) @@ -0,0 +1,714 @@ +############################################################################### +# +# MIME-TYPES and the extensions that represent them +# +# This file is part of the "mime-support" package. Please send email (not a +# bug report) to mim...@pa... if you would like new types +# and/or extensions to be added. +# +# Users can add their own types if they wish by creating a ".mime.types" +# file in their home directory. Definitions included there will take +# precedence over those listed here. +# +# Note: Compression schemes like "gzip", "bzip", and "compress" are not +# actually "mime-types". They are "encodings" and hence must _not_ have +# entries in this file to map their extensions. The "mime-type" of an +# encoded file refers to the type of data that has been encoded, not the +# type of the encoding. +# +############################################################################### + + +application/activemessage +application/andrew-inset ez +application/applefile +application/atomicmail +application/batch-SMTP +application/beep+xml +application/cals-1840 +application/commonground +application/cu-seeme cu +application/cybercash +application/dca-rft +application/dec-dx +application/docbook+xml +application/dsptype tsp +application/dvcs +application/edi-consent +application/edi-x12 +application/edifact +application/eshop +application/font-tdpfr +application/futuresplash spl +application/ghostview +application/hta hta +application/http +application/hyperstudio +application/iges +application/index +application/index.cmd +application/index.obj +application/index.response +application/index.vnd +application/iotp +application/ipp +application/isup +application/mac-binhex40 hqx +application/mac-compactpro cpt +application/macwriteii +application/marc +application/mathematica nb +application/mathematica-old +application/msaccess mdb +application/msword doc dot +application/news-message-id +application/news-transmission +application/ocsp-request +application/ocsp-response +application/octet-stream bin +application/oda oda +application/ogg ogg +application/parityfec +application/pdf pdf +application/pgp-encrypted +application/pgp-keys key +application/pgp-signature pgp +application/pics-rules prf +application/pkcs10 +application/pkcs7-mime +application/pkcs7-signature +application/pkix-cert +application/pkix-crl +application/pkixcmp +application/postscript ps ai eps +application/prs.alvestrand.titrax-sheet +application/prs.cww +application/prs.nprend +application/qsig +application/rar rar +application/rdf+xml rdf +application/remote-printing +application/riscos +application/rss+xml rss +application/rtf +application/sdp +application/set-payment +application/set-payment-initiation +application/set-registration +application/set-registration-initiation +application/sgml +application/sgml-open-catalog +application/sieve +application/slate +application/smil smi smil +application/timestamp-query +application/timestamp-reply +application/vemmi +application/whoispp-query +application/whoispp-response +application/wita +application/wordperfect5.1 wp5 +application/x400-bp +application/xhtml+xml xhtml xht +application/xml xml xsl +application/xml-dtd +application/xml-external-parsed-entity +application/zip zip +application/vnd.3M.Post-it-Notes +application/vnd.accpac.simply.aso +application/vnd.accpac.simply.imp +application/vnd.acucobol +application/vnd.aether.imp +application/vnd.anser-web-certificate-issue-initiation +application/vnd.anser-web-funds-transfer-initiation +application/vnd.audiograph +application/vnd.bmi +application/vnd.businessobjects +application/vnd.canon-cpdl +application/vnd.canon-lips +application/vnd.cinderella cdy +application/vnd.claymore +application/vnd.commerce-battelle +application/vnd.commonspace +application/vnd.comsocaller +application/vnd.contact.cmsg +application/vnd.cosmocaller +application/vnd.ctc-posml +application/vnd.cups-postscript +application/vnd.cups-raster +application/vnd.cups-raw +application/vnd.cybank +application/vnd.dna +application/vnd.dpgraph +application/vnd.dxr +application/vnd.ecdis-update +application/vnd.ecowin.chart +application/vnd.ecowin.filerequest +application/vnd.ecowin.fileupdate +application/vnd.ecowin.series +application/vnd.ecowin.seriesrequest +application/vnd.ecowin.seriesupdate +application/vnd.enliven +application/vnd.epson.esf +application/vnd.epson.msf +application/vnd.epson.quickanime +application/vnd.epson.salt +application/vnd.epson.ssf +application/vnd.ericsson.quickcall +application/vnd.eudora.data +application/vnd.fdf +application/vnd.ffsns +application/vnd.flographit +application/vnd.framemaker +application/vnd.fsc.weblaunch +application/vnd.fujitsu.oasys +application/vnd.fujitsu.oasys2 +application/vnd.fujitsu.oasys3 +application/vnd.fujitsu.oasysgp +application/vnd.fujitsu.oasysprs +application/vnd.fujixerox.ddd +application/vnd.fujixerox.docuworks +application/vnd.fujixerox.docuworks.binder +application/vnd.fut-misnet +application/vnd.grafeq +application/vnd.groove-account +application/vnd.groove-identity-message +application/vnd.groove-injector +application/vnd.groove-tool-message +application/vnd.groove-tool-template +application/vnd.groove-vcard +application/vnd.hhe.lesson-player +application/vnd.hp-HPGL +application/vnd.hp-PCL +application/vnd.hp-PCLXL +application/vnd.hp-hpid +application/vnd.hp-hps +application/vnd.httphone +application/vnd.hzn-3d-crossword +application/vnd.ibm.MiniPay +application/vnd.ibm.afplinedata +application/vnd.ibm.modcap +application/vnd.informix-visionary +application/vnd.intercon.formnet +application/vnd.intertrust.digibox +application/vnd.intertrust.nncp +application/vnd.intu.qbo +application/vnd.intu.qfx +application/vnd.irepository.package+xml +application/vnd.is-xpr +application/vnd.japannet-directory-service +application/vnd.japannet-jpnstore-wakeup +application/vnd.japannet-payment-wakeup +application/vnd.japannet-registration +application/vnd.japannet-registration-wakeup +application/vnd.japannet-setstore-wakeup +application/vnd.japannet-verification +application/vnd.japannet-verification-wakeup +application/vnd.koan +application/vnd.lotus-1-2-3 +application/vnd.lotus-approach +application/vnd.lotus-freelance +application/vnd.lotus-notes +application/vnd.lotus-organizer +application/vnd.lotus-screencam +application/vnd.lotus-wordpro +application/vnd.mcd +application/vnd.mediastation.cdkey +application/vnd.meridian-slingshot +application/vnd.mif +application/vnd.minisoft-hp3000-save +application/vnd.mitsubishi.misty-guard.trustweb +application/vnd.mobius.daf +application/vnd.mobius.dis +application/vnd.mobius.msl +application/vnd.mobius.plc +application/vnd.mobius.txf +application/vnd.motorola.flexsuite +application/vnd.motorola.flexsuite.adsi +application/vnd.motorola.flexsuite.fis +application/vnd.motorola.flexsuite.gotap +application/vnd.motorola.flexsuite.kmr +application/vnd.motorola.flexsuite.ttc +application/vnd.motorola.flexsuite.wem +application/vnd.mozilla.xul+xml xul +application/vnd.ms-artgalry +application/vnd.ms-asf +application/vnd.ms-excel xls xlb xlt +application/vnd.ms-lrm +application/vnd.ms-pki.seccat cat +application/vnd.ms-pki.stl stl +application/vnd.ms-powerpoint ppt pps +application/vnd.ms-project +application/vnd.ms-tnef +application/vnd.ms-works +application/vnd.mseq +application/vnd.msign +application/vnd.music-niff +application/vnd.musician +application/vnd.netfpx +application/vnd.noblenet-directory +application/vnd.noblenet-sealer +application/vnd.noblenet-web +application/vnd.novadigm.EDM +application/vnd.novadigm.EDX +application/vnd.novadigm.EXT +application/vnd.oasis.opendocument.chart odc +application/vnd.oasis.opendocument.database odb +application/vnd.oasis.opendocument.formula odf +application/vnd.oasis.opendocument.graphics odg +application/vnd.oasis.opendocument.graphics-template otg +application/vnd.oasis.opendocument.image odi +application/vnd.oasis.opendocument.presentation odp +application/vnd.oasis.opendocument.presentation-template otp +application/vnd.oasis.opendocument.spreadsheet ods +application/vnd.oasis.opendocument.spreadsheet-template ots +application/vnd.oasis.opendocument.text odt +application/vnd.oasis.opendocument.text-master odm +application/vnd.oasis.opendocument.text-template ott +application/vnd.oasis.opendocument.text-web oth +application/vnd.osa.netdeploy +application/vnd.palm +application/vnd.pg.format +application/vnd.pg.osasli +application/vnd.powerbuilder6 +application/vnd.powerbuilder6-s +application/vnd.powerbuilder7 +application/vnd.powerbuilder7-s +application/vnd.powerbuilder75 +application/vnd.powerbuilder75-s +application/vnd.previewsystems.box +application/vnd.publishare-delta-tree +application/vnd.pvi.ptid1 +application/vnd.pwg-xhtml-print+xml +application/vnd.rapid +application/vnd.rim.cod cod +application/vnd.s3sms +application/vnd.seemail +application/vnd.shana.informed.formdata +application/vnd.shana.informed.formtemplate +application/vnd.shana.informed.interchange +application/vnd.shana.informed.package +application/vnd.smaf mmf +application/vnd.sss-cod +application/vnd.sss-dtf +application/vnd.sss-ntf +application/vnd.stardivision.calc sdc +application/vnd.stardivision.draw sda +application/vnd.stardivision.impress sdd sdp +application/vnd.stardivision.math smf +application/vnd.stardivision.writer sdw vor +application/vnd.stardivision.writer-global sgl +application/vnd.street-stream +application/vnd.sun.xml.calc sxc +application/vnd.sun.xml.calc.template stc +application/vnd.sun.xml.draw sxd +application/vnd.sun.xml.draw.template std +application/vnd.sun.xml.impress sxi +application/vnd.sun.xml.impress.template sti +application/vnd.sun.xml.math sxm +application/vnd.sun.xml.writer sxw +application/vnd.sun.xml.writer.global sxg +application/vnd.sun.xml.writer.template stw +application/vnd.svd +application/vnd.swiftview-ics +application/vnd.symbian.install sis +application/vnd.triscape.mxs +application/vnd.trueapp +application/vnd.truedoc +application/vnd.tve-trigger +application/vnd.ufdl +application/vnd.uplanet.alert +application/vnd.uplanet.alert-wbxml +application/vnd.uplanet.bearer-choice +application/vnd.uplanet.bearer-choice-wbxml +application/vnd.uplanet.cacheop +application/vnd.uplanet.cacheop-wbxml +application/vnd.uplanet.channel +application/vnd.uplanet.channel-wbxml +application/vnd.uplanet.list +application/vnd.uplanet.list-wbxml +application/vnd.uplanet.listcmd +application/vnd.uplanet.listcmd-wbxml +application/vnd.uplanet.signal +application/vnd.vcx +application/vnd.vectorworks +application/vnd.vidsoft.vidconference +application/vnd.visio vsd +application/vnd.vividence.scriptfile +application/vnd.wap.sic +application/vnd.wap.slc +application/vnd.wap.wbxml wbxml +application/vnd.wap.wmlc wmlc +application/vnd.wap.wmlscriptc wmlsc +application/vnd.webturbo +application/vnd.wrq-hp3000-labelled +application/vnd.wt.stf +application/vnd.xara +application/vnd.xfdl +application/vnd.yellowriver-custom-menu +application/x-123 wk +application/x-apple-diskimage dmg +application/x-bcpio bcpio +application/x-bittorrent torrent +application/x-cdf cdf +application/x-cdlink vcd +application/x-chess-pgn pgn +application/x-core +application/x-cpio cpio +application/x-csh csh +application/x-debian-package deb +application/x-director dcr dir dxr +application/x-dms dms +application/x-doom wad +application/x-dvi dvi +application/x-executable +application/x-flac flac +application/x-font pfa pfb gsf pcf pcf.Z +application/x-futuresplash spl +application/x-gnumeric gnumeric +application/x-go-sgf sgf +application/x-graphing-calculator gcf +application/x-gtar gtar tgz taz +application/x-hdf hdf +application/x-httpd-php phtml pht php +application/x-httpd-php-source phps +application/x-httpd-php3 php3 +application/x-httpd-php3-preprocessed php3p +application/x-httpd-php4 php4 +application/x-ica ica +application/x-internet-signup ins isp +application/x-iphone iii +application/x-iso9660-image iso +application/x-java-applet +application/x-java-archive jar +application/x-java-bean +application/x-java-jnlp-file jnlp +application/x-java-serialized-object ser +application/x-java-vm class +application/x-javascript js +application/x-jmol jmz +application/x-kchart chrt +application/x-kdelnk +application/x-killustrator kil +application/x-koan skp skd skt skm +application/x-kpresenter kpr kpt +application/x-kspread ksp +application/x-kword kwd kwt +application/x-latex latex +application/x-lha lha +application/x-lzh lzh +application/x-lzx lzx +application/x-maker frm maker frame fm fb book fbdoc +application/x-mif mif +application/x-ms-wmd wmd +application/x-ms-wmz wmz +application/x-msdos-program com exe bat dll +application/x-msi msi +application/x-netcdf nc +application/x-ns-proxy-autoconfig pac +application/x-nwc nwc +application/x-object o +application/x-oz-application oza +application/x-pkcs7-certreqresp p7r +application/x-pkcs7-crl crl +application/x-python-code pyc pyo +application/x-quicktimeplayer qtl +application/x-redhat-package-manager rpm +application/x-rx +application/x-sh sh +application/x-shar shar +application/x-shellscript +application/x-shockwave-flash swf swfl +application/x-stuffit sit +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-tar tar +application/x-tcl tcl +application/x-tex-gf gf +application/x-tex-pk pk +application/x-texinfo texinfo texi +application/x-trash ~ % bak old sik +application/x-troff t tr roff +application/x-troff-man man +application/x-troff-me me +application/x-troff-ms ms +application/x-ustar ustar +application/x-videolan +application/x-wais-source src +application/x-wingz wz +application/x-x509-ca-cert crt +application/x-xcf xcf +application/x-xfig fig + +audio/32kadpcm +audio/basic au snd +audio/g.722.1 +audio/l16 +audio/midi mid midi kar +audio/mp4a-latm +audio/mpa-robust +audio/mpeg mpga mpega mp2 mp3 m4a +audio/mpegurl m3u +audio/parityfec +audio/prs.sid sid +audio/telephone-event +audio/tone +audio/vnd.cisco.nse +audio/vnd.cns.anp1 +audio/vnd.cns.inf1 +audio/vnd.digital-winds +audio/vnd.everad.plj +audio/vnd.lucent.voice +audio/vnd.nortel.vbk +audio/vnd.nuera.ecelp4800 +audio/vnd.nuera.ecelp7470 +audio/vnd.nuera.ecelp9600 +audio/vnd.octel.sbc +audio/vnd.qcelp +audio/vnd.rhetorex.32kadpcm +audio/vnd.vmx.cvsd +audio/x-aiff aif aiff aifc +audio/x-gsm gsm +audio/x-mpegurl m3u +audio/x-ms-wma wma +audio/x-ms-wax wax +audio/x-pn-realaudio-plugin +audio/x-pn-realaudio ra rm ram +audio/x-realaudio ra +audio/x-scpls pls +audio/x-sd2 sd2 +audio/x-wav wav + +chemical/x-alchemy alc +chemical/x-cache cac cache +chemical/x-cache-csf csf +chemical/x-cactvs-binary cbin cascii ctab +chemical/x-cdx cdx +chemical/x-cerius cer +chemical/x-chem3d c3d +chemical/x-chemdraw chm +chemical/x-cif cif +chemical/x-cmdf cmdf +chemical/x-cml cml +chemical/x-compass cpa +chemical/x-crossfire bsd +chemical/x-csml csml csm +chemical/x-ctx ctx +chemical/x-cxf cxf cef +#chemical/x-daylight-smiles smi +chemical/x-embl-dl-nucleotide emb embl +chemical/x-galactic-spc spc +chemical/x-gamess-input inp gam gamin +chemical/x-gaussian-checkpoint fch fchk +chemical/x-gaussian-cube cub +chemical/x-gaussian-input gau gjc gjf +chemical/x-gaussian-log gal +chemical/x-gcg8-sequence gcg +chemical/x-genbank gen +chemical/x-hin hin +chemical/x-isostar istr ist +chemical/x-jcamp-dx jdx dx +chemical/x-kinemage kin +chemical/x-macmolecule mcm +chemical/x-macromodel-input mmd mmod +chemical/x-mdl-molfile mol +chemical/x-mdl-rdfile rd +chemical/x-mdl-rxnfile rxn +chemical/x-mdl-sdfile sd sdf +chemical/x-mdl-tgf tgf +#chemical/x-mif mif +chemical/x-mmcif mcif +chemical/x-mol2 mol2 +chemical/x-molconn-Z b +chemical/x-mopac-graph gpt +chemical/x-mopac-input mop mopcrt mpc dat zmt +chemical/x-mopac-out moo +chemical/x-mopac-vib mvb +chemical/x-ncbi-asn1 asn +chemical/x-ncbi-asn1-ascii prt ent +chemical/x-ncbi-asn1-binary val aso +chemical/x-ncbi-asn1-spec asn +chemical/x-pdb pdb ent +chemical/x-rosdal ros +chemical/x-swissprot sw +chemical/x-vamas-iso14976 vms +chemical/x-vmd vmd +chemical/x-xtel xtel +chemical/x-xyz xyz + +image/cgm +image/g3fax +image/gif gif +image/ief ief +image/jpeg jpeg jpg jpe +image/naplps +image/pcx pcx +image/png png +image/prs.btif +image/prs.pti +image/svg+xml svg svgz +image/tiff tiff tif +image/vnd.cns.inf2 +image/vnd.djvu djvu djv +image/vnd.dwg +image/vnd.dxf +image/vnd.fastbidsheet +image/vnd.fpx +image/vnd.fst +image/vnd.fujixerox.edmics-mmr +image/vnd.fujixerox.edmics-rlc +image/vnd.mix +image/vnd.net-fpx +image/vnd.svf +image/vnd.wap.wbmp wbmp +image/vnd.xiff +image/x-cmu-raster ras +image/x-coreldraw cdr +image/x-coreldrawpattern pat +image/x-coreldrawtemplate cdt +image/x-corelphotopaint cpt +image/x-icon ico +image/x-jg art +image/x-jng jng +image/x-ms-bmp bmp +image/x-photoshop psd +image/x-portable-anymap pnm +image/x-portable-bitmap pbm +image/x-portable-graymap pgm +image/x-portable-pixmap ppm +image/x-rgb rgb +image/x-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd + +inode/chardevice +inode/blockdevice +inode/directory-locked +inode/directory +inode/fifo +inode/socket + +message/delivery-status +message/disposition-notification +message/external-body +message/http +message/s-http +message/news +message/partial +message/rfc822 + +model/iges igs iges +model/mesh msh mesh silo +model/vnd.dwf +model/vnd.flatland.3dml +model/vnd.gdl +model/vnd.gs-gdl +model/vnd.gtw +model/vnd.mts +model/vnd.vtu +model/vrml wrl vrml + +multipart/alternative +multipart/appledouble +multipart/byteranges +multipart/digest +multipart/encrypted +multipart/form-data +multipart/header-set +multipart/mixed +multipart/parallel +multipart/related +multipart/report +multipart/signed +multipart/voice-message + +text/calendar ics icz +text/comma-separated-values csv +text/css css +text/directory +text/english +text/enriched +text/h323 323 +text/html html htm shtml +text/iuls uls +text/mathml mml +text/parityfec +text/plain asc txt text diff pot +text/prs.lines.tag +text/rfc822-headers +text/richtext rtx +text/rtf rtf +text/scriptlet sct wsc +text/t140 +text/texmacs tm ts +text/tab-separated-values tsv +text/uri-list +text/vnd.abc +text/vnd.curl +text/vnd.DMClientScript +text/vnd.flatland.3dml +text/vnd.fly +text/vnd.fmi.flexstor +text/vnd.in3d.3dml +text/vnd.in3d.spot +text/vnd.IPTC.NewsML +text/vnd.IPTC.NITF +text/vnd.latex-z +text/vnd.motorola.reflex +text/vnd.ms-mediapackage +text/vnd.sun.j2me.app-descriptor jad +text/vnd.wap.si +text/vnd.wap.sl +text/vnd.wap.wml wml +text/vnd.wap.wmlscript wmls +text/x-c++hdr h++ hpp hxx hh +text/x-c++src c++ cpp cxx cc +text/x-chdr h +text/x-crontab +text/x-csh csh +text/x-csrc c +text/x-java java +text/x-makefile +text/x-moc moc +text/x-pascal p pas +text/x-pcs-gcd gcd +text/x-perl pl pm +text/x-python py +text/x-server-parsed-html +text/x-setext etx +text/x-sh sh +text/x-tcl tcl tk +text/x-tex tex ltx sty cls +text/x-vcalendar vcs +text/x-vcard vcf + +video/dl dl +video/fli fli +video/gl gl +video/mpeg mpeg mpg mpe +video/mp4 mp4 +video/quicktime qt mov +video/mp4v-es +video/parityfec +video/pointer +video/vnd.fvt +video/vnd.motorola.video +video/vnd.motorola.videop +video/vnd.mpegurl mxu +video/vnd.mts +video/vnd.nokia.interleaved-multimedia +video/vnd.vivo +video/x-dv dif dv +video/x-la-asf lsf lsx +video/x-mng mng +video/x-ms-asf asf asx +video/x-ms-wm wm +video/x-ms-wmv wmv +video/x-ms-wmx wmx +video/x-ms-wvx wvx +video/x-msvideo avi +video/x-sgi-movie movie + +x-conference/x-cooltalk ice + +x-world/x-vrml vrm vrml wrl Modified: trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnHeadNode.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnHeadNode.java 2005-10-09 10:37:33 UTC (rev 1349) +++ trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnHeadNode.java 2005-10-09 14:44:15 UTC (rev 1350) @@ -31,11 +31,9 @@ fc.read(buff); buff.flip(); - String ret = Charset.forName( + return Charset.forName( System.getProperty("file.encoding")).decode( buff).toString(); - - return ret; } catch (IOException e) { throw new RepositoryException(e); } Modified: trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnHistoricNode.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnHistoricNode.java 2005-10-09 10:37:33 UTC (rev 1349) +++ trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnHistoricNode.java 2005-10-09 14:44:15 UTC (rev 1350) @@ -6,7 +6,6 @@ import java.util.Date; import java.util.Map; -import org.jboss.shotoku.Directory; import org.jboss.shotoku.exceptions.NodeReadOnly; import org.jboss.shotoku.exceptions.RepositoryException; @@ -71,11 +70,7 @@ return properties.get(name); } - - public Directory getParent() { - throw new RuntimeException("Operation not yet implemented"); - } - + public String getLogMessage() { return logMessage; } Modified: trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnNode.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnNode.java 2005-10-09 10:37:33 UTC (rev 1349) +++ trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnNode.java 2005-10-09 14:44:15 UTC (rev 1350) @@ -4,15 +4,22 @@ import java.util.ArrayList; import java.util.List; +import javax.activation.MimetypesFileTypeMap; + import org.jboss.shotoku.History; import org.jboss.shotoku.Node; import org.jboss.shotoku.NodeList; import org.jboss.shotoku.exceptions.RepositoryException; public abstract class SvnNode extends AbstractSvnResource implements Node { + private MimetypesFileTypeMap mimeTypes; + public SvnNode(String id, String fullPath, File file, String name, SvnContentManager svnCm) { super(id, fullPath, file, name, svnCm); + + mimeTypes = new MimetypesFileTypeMap( + SvnNode.class.getResourceAsStream("/mime-types.txt")); } public History getHistory() { @@ -34,4 +41,8 @@ return new SvnHistory(new NodeList(nodes)); } + + public String getMimeType() { + return mimeTypes.getContentType(getName()); + } } |