Author: vjrj Date: 2008-09-26 16:56:55 +0200 (Fri, 26 Sep 2008) New Revision: 886 Added: trunk/src/main/java/org/ourproject/kune/platf/server/content/ContentUtils.java trunk/src/main/java/org/ourproject/kune/platf/server/manager/impl/FileDownloadManager.java Modified: trunk/pom.xml trunk/src/main/java/org/ourproject/kune/app/server/KuneRackModule.java trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientModule.java trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentContentPresenter.java trunk/src/main/java/org/ourproject/kune/docs/client/cnt/reader/DocumentReader.java trunk/src/main/java/org/ourproject/kune/docs/client/cnt/reader/DocumentReaderPresenter.java trunk/src/main/java/org/ourproject/kune/platf/server/PlatformServerModule.java trunk/src/main/java/org/ourproject/kune/platf/server/auth/AuthorizatedMethodInterceptor.java trunk/src/main/java/org/ourproject/kune/platf/server/manager/impl/FileUploadManager.java trunk/src/main/java/org/ourproject/kune/platf/server/manager/impl/FileUtils.java trunk/src/main/java/org/ourproject/kune/platf/server/rpc/ContentRPC.java trunk/src/main/resources/db/liquibase_changelog.xml trunk/src/test/java/org/ourproject/kune/platf/server/manager/ContentManagerTest.java trunk/src/test/java/org/ourproject/kune/platf/server/manager/impl/FileUploadManagerTest.java trunk/src/test/java/org/ourproject/kune/platf/server/manager/impl/FileUtilsTest.java Log: liquibase migration, download servlet, content uploaded file show tests Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2008-09-26 01:40:25 UTC (rev 885) +++ trunk/pom.xml 2008-09-26 14:56:55 UTC (rev 886) @@ -224,8 +224,13 @@ <dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> - <version>1.4.1</version> + <version>1.7.0</version> </dependency> + <dependency> + <groupId>org.liquibase</groupId> + <artifactId>liquibase-plugin</artifactId> + <version>1.7.0.0</version> + </dependency> <!-- jetty dependencies --> <dependency> @@ -424,7 +429,7 @@ <plugin> <groupId>org.liquibase</groupId> <artifactId>liquibase-plugin</artifactId> - <version>1.4.1.0</version> + <version>1.7.0.0</version> <executions> <execution> <phase>process-resources</phase> @@ -447,7 +452,7 @@ </configuration> --> <goals> - <goal>migrate</goal> + <goal>update</goal> </goals> </execution> </executions> Modified: trunk/src/main/java/org/ourproject/kune/app/server/KuneRackModule.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/app/server/KuneRackModule.java 2008-09-26 01:40:25 UTC (rev 885) +++ trunk/src/main/java/org/ourproject/kune/app/server/KuneRackModule.java 2008-09-26 14:56:55 UTC (rev 886) @@ -28,6 +28,7 @@ import org.ourproject.kune.platf.client.rpc.SocialNetworkService; import org.ourproject.kune.platf.server.LoggerMethodInterceptor; import org.ourproject.kune.platf.server.PlatformServerModule; +import org.ourproject.kune.platf.server.manager.impl.FileDownloadManager; import org.ourproject.kune.platf.server.manager.impl.FileUploadManager; import org.ourproject.kune.platf.server.properties.PropertiesFileName; import org.ourproject.kune.platf.server.rest.ContentJSONService; @@ -96,7 +97,7 @@ UserService.class, SocialNetworkService.class, I18nService.class); builder.installRESTServices("^/kune/json/", TestJSONService.class, GroupJSONService.class, UserJSONService.class, I18nTranslationJSONService.class, ContentJSONService.class); - builder.installServlet("^/kune/servlets/", FileUploadManager.class); + builder.installServlet("^/kune/servlets/", FileUploadManager.class, FileDownloadManager.class); builder.at("^/kune/(.*)$").install(new ForwardFilter("^/kune/(.*)$", "/gwt/org.ourproject.kune.app.Kune/{0}")); } Modified: trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientModule.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientModule.java 2008-09-26 01:40:25 UTC (rev 885) +++ trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientModule.java 2008-09-26 14:56:55 UTC (rev 886) @@ -173,7 +173,8 @@ register(Singleton.class, new Factory<DocumentReader>(DocumentReader.class) { public DocumentReader create() { final DocumentReaderView view = new DocumentReaderPanel($(WorkspaceSkeleton.class)); - final DocumentReaderPresenter presenter = new DocumentReaderPresenter(view); + final DocumentReaderPresenter presenter = new DocumentReaderPresenter($(Session.class), view, + $(I18nUITranslationService.class)); return presenter; } }); Modified: trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentContentPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentContentPresenter.java 2008-09-26 01:40:25 UTC (rev 885) +++ trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentContentPresenter.java 2008-09-26 14:56:55 UTC (rev 886) @@ -203,9 +203,9 @@ private void showContent() { textEditorProvider.get().setToolbarVisible(false); if (content.hasDocument()) { - docReaderProvider.get().showDocument(content.getContent()); + docReaderProvider.get().showDocument(content.getStateToken(), content.getContent(), content.getTypeId(), + content.getMimeType()); textEditorProvider.get().reset(); - docReaderProvider.get().show(); } else { final FolderViewer viewer = folderViewerProvider.get(); viewer.setFolder(content.getContainer()); Modified: trunk/src/main/java/org/ourproject/kune/docs/client/cnt/reader/DocumentReader.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/docs/client/cnt/reader/DocumentReader.java 2008-09-26 01:40:25 UTC (rev 885) +++ trunk/src/main/java/org/ourproject/kune/docs/client/cnt/reader/DocumentReader.java 2008-09-26 14:56:55 UTC (rev 886) @@ -21,12 +21,12 @@ package org.ourproject.kune.docs.client.cnt.reader; import org.ourproject.kune.platf.client.View; +import org.ourproject.kune.platf.client.dto.BasicMimeTypeDTO; +import org.ourproject.kune.platf.client.dto.StateToken; public interface DocumentReader { View getView(); - void show(); - - void showDocument(String text); + void showDocument(StateToken token, String text, String typeId, BasicMimeTypeDTO mimeType); } Modified: trunk/src/main/java/org/ourproject/kune/docs/client/cnt/reader/DocumentReaderPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/docs/client/cnt/reader/DocumentReaderPresenter.java 2008-09-26 01:40:25 UTC (rev 885) +++ trunk/src/main/java/org/ourproject/kune/docs/client/cnt/reader/DocumentReaderPresenter.java 2008-09-26 14:56:55 UTC (rev 886) @@ -20,23 +20,47 @@ package org.ourproject.kune.docs.client.cnt.reader; +import org.ourproject.kune.docs.client.DocumentClientTool; import org.ourproject.kune.platf.client.View; +import org.ourproject.kune.platf.client.dto.BasicMimeTypeDTO; +import org.ourproject.kune.platf.client.dto.StateToken; +import org.ourproject.kune.platf.client.state.Session; +import org.ourproject.kune.workspace.client.i18n.I18nUITranslationService; public class DocumentReaderPresenter implements DocumentReader { private final DocumentReaderView view; + private final I18nUITranslationService i18n; + private final Session session; - public DocumentReaderPresenter(final DocumentReaderView view) { + public DocumentReaderPresenter(final Session session, final DocumentReaderView view, + final I18nUITranslationService i18n) { + this.session = session; this.view = view; + this.i18n = i18n; } public View getView() { return view; } - public void show() { + public void showDocument(final StateToken token, final String text, final String typeId, + final BasicMimeTypeDTO mimeType) { + if (typeId.equals(DocumentClientTool.TYPE_UPLOADEDFILE)) { + if (mimeType != null) { + final String url = "/kune/servlets/FileDownloadManager?token=" + token + "&hash=" + + session.getUserHash(); + if (mimeType.getType().equals("image")) { + view.setContent("<img src=\"" + url + "\">"); + } else if (mimeType.toString().equals("text/plain")) { + view.setContent(text); + } else { + view.setContent("<a href=\"" + url + "\">" + i18n.t("Download") + "</a>"); + } + } else { + view.setContent("<a href=\"" + "dd" + "\">" + i18n.t("Download") + "</a>"); + } + } else { + view.setContent(text); + } } - - public void showDocument(final String text) { - view.setContent(text); - } } Modified: trunk/src/main/java/org/ourproject/kune/platf/server/PlatformServerModule.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/PlatformServerModule.java 2008-09-26 01:40:25 UTC (rev 885) +++ trunk/src/main/java/org/ourproject/kune/platf/server/PlatformServerModule.java 2008-09-26 14:56:55 UTC (rev 886) @@ -63,6 +63,7 @@ import org.ourproject.kune.platf.server.manager.TagManager; import org.ourproject.kune.platf.server.manager.ToolConfigurationManager; import org.ourproject.kune.platf.server.manager.UserManager; +import org.ourproject.kune.platf.server.manager.impl.FileDownloadManager; import org.ourproject.kune.platf.server.manager.impl.FileManagerDefault; import org.ourproject.kune.platf.server.manager.impl.FileUploadManager; import org.ourproject.kune.platf.server.manager.impl.GroupManagerDefault; @@ -109,6 +110,7 @@ bind(Mapper.class).to(DozerMapper.class); bind(ToolRegistry.class); bind(FileUploadManager.class); + bind(FileDownloadManager.class); bindInterceptor(Matchers.any(), Matchers.annotatedWith(Authenticated.class), outermostCall(new AuthenticatedMethodInterceptor())); Modified: trunk/src/main/java/org/ourproject/kune/platf/server/auth/AuthorizatedMethodInterceptor.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/auth/AuthorizatedMethodInterceptor.java 2008-09-26 01:40:25 UTC (rev 885) +++ trunk/src/main/java/org/ourproject/kune/platf/server/auth/AuthorizatedMethodInterceptor.java 2008-09-26 14:56:55 UTC (rev 886) @@ -25,12 +25,12 @@ import org.aopalliance.intercept.MethodInvocation; import org.ourproject.kune.platf.client.dto.StateToken; import org.ourproject.kune.platf.client.errors.AccessViolationException; -import org.ourproject.kune.platf.client.errors.ContentNotFoundException; import org.ourproject.kune.platf.server.UserSession; import org.ourproject.kune.platf.server.access.AccessRights; import org.ourproject.kune.platf.server.access.AccessRightsService; import org.ourproject.kune.platf.server.access.AccessRol; import org.ourproject.kune.platf.server.access.AccessService; +import org.ourproject.kune.platf.server.content.ContentUtils; import org.ourproject.kune.platf.server.domain.Container; import org.ourproject.kune.platf.server.domain.Content; import org.ourproject.kune.platf.server.domain.Group; @@ -76,18 +76,20 @@ switch (actionLevel) { case content: default: - final Content content = accessService.accessToContent(parseId(token.getDocument()), user, accessRol); + final Content content = accessService.accessToContent(ContentUtils.parseId(token.getDocument()), user, + accessRol); if (!content.getContainer().getOwner().equals(group)) { throw new AccessViolationException(); } - if (!content.getContainer().getId().equals(parseId(token.getFolder()))) { + if (!content.getContainer().getId().equals(ContentUtils.parseId(token.getFolder()))) { throw new AccessViolationException(); } if (!content.getContainer().getToolName().equals(token.getTool())) { throw new AccessViolationException(); } case container: - final Container container = accessService.accessToContainer(parseId(token.getFolder()), user, accessRol); + final Container container = accessService.accessToContainer(ContentUtils.parseId(token.getFolder()), user, + accessRol); if (!container.getOwner().equals(group)) { throw new AccessViolationException(); } @@ -119,12 +121,4 @@ } } - private Long parseId(final String documentId) throws ContentNotFoundException { - try { - return new Long(documentId); - } catch (final NumberFormatException e) { - throw new ContentNotFoundException(); - } - } - } Added: trunk/src/main/java/org/ourproject/kune/platf/server/content/ContentUtils.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/content/ContentUtils.java 2008-09-26 01:40:25 UTC (rev 885) +++ trunk/src/main/java/org/ourproject/kune/platf/server/content/ContentUtils.java 2008-09-26 14:56:55 UTC (rev 886) @@ -0,0 +1,14 @@ +package org.ourproject.kune.platf.server.content; + +import org.ourproject.kune.platf.client.errors.ContentNotFoundException; + +public class ContentUtils { + + public static Long parseId(final String id) throws ContentNotFoundException { + try { + return new Long(id); + } catch (final NumberFormatException e) { + throw new ContentNotFoundException(); + } + } +} Added: trunk/src/main/java/org/ourproject/kune/platf/server/manager/impl/FileDownloadManager.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/manager/impl/FileDownloadManager.java 2008-09-26 01:40:25 UTC (rev 885) +++ trunk/src/main/java/org/ourproject/kune/platf/server/manager/impl/FileDownloadManager.java 2008-09-26 14:56:55 UTC (rev 886) @@ -0,0 +1,105 @@ +package org.ourproject.kune.platf.server.manager.impl; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.ourproject.kune.platf.client.dto.StateToken; +import org.ourproject.kune.platf.client.errors.ContentNotFoundException; +import org.ourproject.kune.platf.server.access.AccessRol; +import org.ourproject.kune.platf.server.auth.ActionLevel; +import org.ourproject.kune.platf.server.auth.Authenticated; +import org.ourproject.kune.platf.server.auth.Authorizated; +import org.ourproject.kune.platf.server.content.ContentManager; +import org.ourproject.kune.platf.server.content.ContentUtils; +import org.ourproject.kune.platf.server.domain.BasicMimeType; +import org.ourproject.kune.platf.server.domain.Content; +import org.ourproject.kune.platf.server.properties.KuneProperties; + +import com.google.inject.Inject; + +/** + * Some snippets from: + * http://www.onjava.com/pub/a/onjava/excerpt/jebp_3/index1.html?page=1 + * + */ +public class FileDownloadManager extends HttpServlet { + + private static final long serialVersionUID = 1L; + + @Inject + ContentManager contentManager; + @Inject + KuneProperties kuneProperties; + + public void returnFile(final String filename, final OutputStream out) throws FileNotFoundException, IOException { + InputStream in = null; + try { + in = new BufferedInputStream(new FileInputStream(filename)); + final byte[] buf = new byte[4 * 1024]; // 4K buffer + int bytesRead; + while ((bytesRead = in.read(buf)) != -1) { + out.write(buf, 0, bytesRead); + } + } finally { + if (in != null) { + in.close(); + } + } + } + + @Override + protected void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, + IOException { + + final String userHash = req.getParameter("hash"); + final StateToken stateToken = new StateToken(req.getParameter("token")); + final Content cnt = getContentForDownload(userHash, stateToken); + + final String absDir = kuneProperties.get(KuneProperties.UPLOAD_LOCATION) + FileUtils.toDir(stateToken); + final String filename = new String(cnt.getLastRevision().getBody()); + final String absFilename = absDir + filename; + + doBuildResp(resp, absFilename, cnt.getTitle(), cnt.getMimeType(), FileUtils + .getFileNameExtension(filename, true)); + } + + private void doBuildResp(final HttpServletResponse resp, final String filename, final String otherName, + final BasicMimeType mimeType, final String extension) throws FileNotFoundException, IOException { + final File file = new File(filename); + + resp.setContentLength((int) file.length()); + if (mimeType == null) { + resp.setContentType("application/x-download"); + } else if (mimeType.getType().equals("image") || mimeType.toString().equals("text/plain")) { + resp.setContentType(mimeType.toString()); + } else { + resp.setContentType("application/x-download"); + } + resp.setHeader("Content-Disposition", "attachment; filename=\"" + otherName + extension + "\""); + + final OutputStream out = resp.getOutputStream(); + returnFile(filename, out); + } + + @Authenticated(mandatory = false) + @Authorizated(accessRolRequired = AccessRol.Viewer, actionLevel = ActionLevel.content) + private Content getContentForDownload(final String userHash, final StateToken stateToken) throws ServletException { + try { + return contentManager.find(ContentUtils.parseId(stateToken.getDocument())); + } catch (final ContentNotFoundException e) { + // what response to send in this case ? + throw new ServletException(); + } + + } +} Modified: trunk/src/main/java/org/ourproject/kune/platf/server/manager/impl/FileUploadManager.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/manager/impl/FileUploadManager.java 2008-09-26 01:40:25 UTC (rev 885) +++ trunk/src/main/java/org/ourproject/kune/platf/server/manager/impl/FileUploadManager.java 2008-09-26 14:56:55 UTC (rev 886) @@ -3,9 +3,7 @@ import java.io.File; import java.io.IOException; import java.io.OutputStreamWriter; -import java.io.UnsupportedEncodingException; import java.io.Writer; -import java.net.URLEncoder; import java.util.Iterator; import java.util.List; @@ -37,6 +35,7 @@ import org.ourproject.kune.platf.server.auth.Authenticated; import org.ourproject.kune.platf.server.auth.Authorizated; import org.ourproject.kune.platf.server.content.ContentManager; +import org.ourproject.kune.platf.server.content.ContentUtils; import org.ourproject.kune.platf.server.domain.BasicMimeType; import org.ourproject.kune.platf.server.domain.Container; import org.ourproject.kune.platf.server.domain.Content; @@ -54,8 +53,6 @@ public static final Log log = LogFactory.getLog(FileUploadManager.class); - private static final String SLASH = File.separator; - private static final String UTF8 = "UTF-8"; private static final long serialVersionUID = 1L; @@ -118,7 +115,7 @@ file = item; } } - createFile(userHash, stateToken, fileName, file); + createUploadedFile(userHash, stateToken, fileName, file); } catch (final FileUploadException e) { jsonResponse = createJsonResponse(false, i18n.t("Error: File too large")); } catch (final Exception e) { @@ -136,47 +133,50 @@ @Authenticated @Authorizated(accessRolRequired = AccessRol.Editor, actionLevel = ActionLevel.container) @Transactional(type = TransactionType.READ_WRITE) - Content createFile(final String userHash, final StateToken stateToken, final String fileName, + Content createUploadedFile(final String userHash, final StateToken stateToken, final String fileName, final FileItem fileUploadItem) throws Exception { - final String relDir = calculateUploadDirLocation(stateToken, false); - final String relDirEncoded = calculateUploadDirLocation(stateToken, true); + final String relDir = FileUtils.toDir(stateToken); final String absDir = kuneProperties.get(KuneProperties.UPLOAD_LOCATION) + relDir; fileManager.mkdir(absDir); - final String filenameUTF8 = new String(fileName.getBytes(), UTF8); - final File file = fileManager.createFileWithSequentialName(absDir, filenameUTF8); - fileUploadItem.write(file); - // FIXME remove file if not success - String mimetype = "unknown/unknown"; - String extension = ""; + File file = null; try { - final MagicMatch magicMatch = fileManager.getMimeType(file); - extension = magicMatch.getExtension(); - mimetype = magicMatch.getMimeType(); - } catch (final MagicParseException e) { - log.info("Exception: " + e.getCause()); - } catch (final MagicMatchNotFoundException e) { - log.info("Exception: " + e.getCause()); - } catch (final MagicException e) { - log.info("Exception: " + e.getCause()); - } + final String filenameUTF8 = new String(fileName.getBytes(), UTF8); + file = fileManager.createFileWithSequentialName(absDir, filenameUTF8); + fileUploadItem.write(file); - // Persist - final User user = userSession.getUser(); - final Container container = accessService.accessToContainer(new Long(stateToken.getFolder()), user, - AccessRol.Editor); - final Content content = contentManager.createContent(FileUtils.getFileNameWithoutExtension(file.getName(), - extension), relDirEncoded + SLASH + URLEncoder.encode(filenameUTF8, UTF8), user, container); - content.setTypeId(DocumentServerTool.TYPE_UPLOADEDFILE); - content.setMimeType(new BasicMimeType(mimetype)); - return content; - } + log.info("fileItem mime type: " + fileUploadItem.getContentType()); - private String calculateUploadDirLocation(final StateToken stateToken, final boolean urlEncoded) - throws UnsupportedEncodingException { - final String group = stateToken.getGroup(); - return SLASH + (urlEncoded ? URLEncoder.encode(group, UTF8) : group) + SLASH + stateToken.getTool() + SLASH - + stateToken.getFolder(); + String mimetype = "unknown/unknown"; + String extension = ""; + try { + final MagicMatch magicMatch = fileManager.getMimeType(file); + + extension = magicMatch.getExtension(); + mimetype = magicMatch.getMimeType(); + } catch (final MagicParseException e) { + log.info("Exception: " + e.getCause()); + } catch (final MagicMatchNotFoundException e) { + log.info("Exception: " + e.getCause()); + } catch (final MagicException e) { + log.info("Exception: " + e.getCause()); + } + + // Persist + final User user = userSession.getUser(); + final Container container = accessService.accessToContainer(ContentUtils.parseId(stateToken.getFolder()), + user, AccessRol.Editor); + final Content content = contentManager.createContent(FileUtils.getFileNameWithoutExtension(file.getName(), + extension), filenameUTF8, user, container); + content.setTypeId(DocumentServerTool.TYPE_UPLOADEDFILE); + content.setMimeType(new BasicMimeType(mimetype)); + return content; + } catch (final Exception e) { + if (file != null && file.exists()) { + file.delete(); + } + throw e; + } } private JSONObject createJsonResponse(final boolean success, final String message) { Modified: trunk/src/main/java/org/ourproject/kune/platf/server/manager/impl/FileUtils.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/manager/impl/FileUtils.java 2008-09-26 01:40:25 UTC (rev 885) +++ trunk/src/main/java/org/ourproject/kune/platf/server/manager/impl/FileUtils.java 2008-09-26 14:56:55 UTC (rev 886) @@ -1,7 +1,35 @@ package org.ourproject.kune.platf.server.manager.impl; +import java.io.File; + +import org.ourproject.kune.platf.client.dto.StateToken; + public class FileUtils { + public static final String SLASH = File.separator; + + /** + * For filename extension info see: + * http://en.wikipedia.org/wiki/File_name_extension + * + * @param fileName + * @return + */ + public static String getFileNameExtension(final String fileName, final boolean withDot) { + // also we can use FilenameUtils + final int dotIndex = fileName.lastIndexOf("."); + if (dotIndex == -1 || dotIndex == 0) { + return ""; + } else { + if (withDot) { + final String ext = fileName.substring(dotIndex); + return ext.length() == 1 ? "" : ext; + } else { + return fileName.substring(dotIndex + 1); + } + } + } + public static String getFileNameWithoutExtension(final String fileName, final String extension) { final int extlength = extension.length(); if (extlength > 0) { @@ -36,4 +64,8 @@ return getNextSequentialFileName(fileName.substring(0, dotIndex)) + ext; } } + + public static String toDir(final StateToken stateToken) { + return SLASH + stateToken.getGroup() + SLASH + stateToken.getTool() + SLASH + stateToken.getFolder() + SLASH; + } } Modified: trunk/src/main/java/org/ourproject/kune/platf/server/rpc/ContentRPC.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/rpc/ContentRPC.java 2008-09-26 01:40:25 UTC (rev 885) +++ trunk/src/main/java/org/ourproject/kune/platf/server/rpc/ContentRPC.java 2008-09-26 14:56:55 UTC (rev 886) @@ -53,6 +53,7 @@ import org.ourproject.kune.platf.server.content.CommentManager; import org.ourproject.kune.platf.server.content.ContainerManager; import org.ourproject.kune.platf.server.content.ContentManager; +import org.ourproject.kune.platf.server.content.ContentUtils; import org.ourproject.kune.platf.server.content.CreationService; import org.ourproject.kune.platf.server.domain.AccessLists; import org.ourproject.kune.platf.server.domain.Comment; @@ -116,7 +117,7 @@ @Transactional(type = TransactionType.READ_WRITE) public void addAuthor(final String userHash, final StateToken token, final String authorShortName) throws DefaultException { - final Long contentId = parseId(token.getDocument()); + final Long contentId = ContentUtils.parseId(token.getDocument()); final UserSession userSession = getUserSession(); final User user = userSession.getUser(); contentManager.addAuthor(user, contentId, authorShortName); @@ -129,7 +130,7 @@ final String commentText) throws DefaultException { final UserSession userSession = getUserSession(); final User author = userSession.getUser(); - final Long contentId = parseId(token.getDocument()); + final Long contentId = ContentUtils.parseId(token.getDocument()); final Comment comment = commentManager.addComment(author, contentId, commentText, parentCommentId); return mapper.map(comment, CommentDTO.class); } @@ -141,7 +142,7 @@ throws DefaultException { final UserSession userSession = getUserSession(); final User author = userSession.getUser(); - final Long contentId = parseId(token.getDocument()); + final Long contentId = ContentUtils.parseId(token.getDocument()); final Comment comment = commentManager.addComment(author, contentId, commentText); return mapper.map(comment, CommentDTO.class); } @@ -155,8 +156,8 @@ final UserSession userSession = getUserSession(); final User user = userSession.getUser(); final boolean userIsLoggedIn = userSession.isUserLoggedIn(); - final Container container = accessService.accessToContainer(parseId(parentToken.getFolder()), user, - AccessRol.Editor); + final Container container = accessService.accessToContainer(ContentUtils.parseId(parentToken.getFolder()), + user, AccessRol.Editor); final Content addedContent = creationService.createContent(title, "", user, container); final Access access = accessService.getAccess(user, addedContent.getStateToken(), group, AccessRol.Editor); final State state = stateService.create(access); @@ -173,7 +174,8 @@ final UserSession userSession = getUserSession(); final User user = userSession.getUser(); final boolean userIsLoggedIn = userSession.isUserLoggedIn(); - final State state = createFolder(parentToken.getGroup(), parseId(parentToken.getFolder()), title, contentTypeId); + final State state = createFolder(parentToken.getGroup(), ContentUtils.parseId(parentToken.getFolder()), title, + contentTypeId); completeState(user, userIsLoggedIn, group, state); return mapState(state, user, group); } @@ -194,7 +196,7 @@ xmppManager.createRoom(connection, roomName, userShortName + userHash); xmppManager.disconnect(connection); try { - final State state = createFolder(groupShortName, parseId(parentToken.getFolder()), roomName, + final State state = createFolder(groupShortName, ContentUtils.parseId(parentToken.getFolder()), roomName, ChatServerTool.TYPE_ROOM); completeState(user, userIsLoggedIn, group, state); return mapState(state, user, group); @@ -214,7 +216,7 @@ @Authorizated(accessRolRequired = AccessRol.Administrator) @Transactional(type = TransactionType.READ_WRITE) public void delContent(final String userHash, final StateToken token) throws DefaultException { - final Long contentId = parseId(token.getDocument()); + final Long contentId = ContentUtils.parseId(token.getDocument()); final UserSession userSession = getUserSession(); final User user = userSession.getUser(); contentManager.delContent(user, contentId); @@ -264,7 +266,7 @@ throws DefaultException { final UserSession userSession = getUserSession(); final User informer = userSession.getUser(); - final Long contentId = parseId(token.getDocument()); + final Long contentId = ContentUtils.parseId(token.getDocument()); final Comment comment = commentManager.markAsAbuse(informer, contentId, commentId); return mapper.map(comment, CommentDTO.class); } @@ -275,7 +277,7 @@ public void rateContent(final String userHash, final StateToken token, final Double value) throws DefaultException { final UserSession userSession = getUserSession(); final User rater = userSession.getUser(); - final Long contentId = parseId(token.getDocument()); + final Long contentId = ContentUtils.parseId(token.getDocument()); if (userSession.isUserLoggedIn()) { contentManager.rateContent(rater, contentId, value); @@ -289,7 +291,7 @@ @Transactional(type = TransactionType.READ_WRITE) public void removeAuthor(final String userHash, final StateToken token, final String authorShortName) throws DefaultException { - final Long contentId = parseId(token.getDocument()); + final Long contentId = ContentUtils.parseId(token.getDocument()); final UserSession userSession = getUserSession(); final User user = userSession.getUser(); contentManager.removeAuthor(user, contentId, authorShortName); @@ -300,7 +302,7 @@ @Transactional(type = TransactionType.READ_WRITE) public String renameContainer(final String userHash, final StateToken token, final String newName) throws DefaultException { - return renameFolder(token.getGroup(), parseId(token.getFolder()), newName); + return renameFolder(token.getGroup(), ContentUtils.parseId(token.getFolder()), newName); } @Authenticated @@ -311,7 +313,7 @@ final UserSession userSession = getUserSession(); final User user = userSession.getUser(); try { - accessService.accessToContent(parseId(token.getDocument()), user, AccessRol.Editor); + accessService.accessToContent(ContentUtils.parseId(token.getDocument()), user, AccessRol.Editor); } catch (final NoResultException e) { throw new AccessViolationException(); } @@ -324,7 +326,7 @@ public Integer save(final String userHash, final StateToken token, final String textContent) throws DefaultException { - final Long contentId = parseId(token.getDocument()); + final Long contentId = ContentUtils.parseId(token.getDocument()); final UserSession userSession = getUserSession(); final User user = userSession.getUser(); final Content content = accessService.accessToContent(contentId, user, AccessRol.Editor); @@ -336,7 +338,7 @@ @Authorizated(accessRolRequired = AccessRol.Administrator) @Transactional(type = TransactionType.READ_WRITE) public ContentDTO setAsDefaultContent(final String userHash, final StateToken token) { - final Content content = contentManager.find(parseId(token.getDocument())); + final Content content = contentManager.find(ContentUtils.parseId(token.getDocument())); groupManager.setDefaultContent(token.getGroup(), content); return mapper.map(content, ContentDTO.class); } @@ -346,7 +348,7 @@ @Transactional(type = TransactionType.READ_WRITE) public I18nLanguageDTO setLanguage(final String userHash, final StateToken token, final String languageCode) throws DefaultException { - final Long contentId = parseId(token.getDocument()); + final Long contentId = ContentUtils.parseId(token.getDocument()); final UserSession userSession = getUserSession(); final User user = userSession.getUser(); return mapper.map(contentManager.setLanguage(user, contentId, languageCode), I18nLanguageDTO.class); @@ -357,7 +359,7 @@ @Transactional(type = TransactionType.READ_WRITE) public void setPublishedOn(final String userHash, final StateToken token, final Date publishedOn) throws DefaultException { - final Long contentId = parseId(token.getDocument()); + final Long contentId = ContentUtils.parseId(token.getDocument()); final UserSession userSession = getUserSession(); final User user = userSession.getUser(); contentManager.setPublishedOn(user, contentId, publishedOn); @@ -370,14 +372,14 @@ if (status.equals(ContentStatusDTO.publishedOnline) || status.equals(ContentStatusDTO.rejected)) { throw new AccessViolationException(); } - contentManager.setStatus(parseId(token.getDocument()), ContentStatus.valueOf(status.toString())); + contentManager.setStatus(ContentUtils.parseId(token.getDocument()), ContentStatus.valueOf(status.toString())); } @Authenticated @Authorizated(accessRolRequired = AccessRol.Administrator) @Transactional(type = TransactionType.READ_WRITE) public void setStatusAsAdmin(final String userHash, final StateToken token, final ContentStatusDTO status) { - contentManager.setStatus(parseId(token.getDocument()), ContentStatus.valueOf(status.toString())); + contentManager.setStatus(ContentUtils.parseId(token.getDocument()), ContentStatus.valueOf(status.toString())); } @Authenticated @@ -385,7 +387,7 @@ @Transactional(type = TransactionType.READ_WRITE) public List<TagResultDTO> setTags(final String userHash, final StateToken token, final String tags) throws DefaultException { - final Long contentId = parseId(token.getDocument()); + final Long contentId = ContentUtils.parseId(token.getDocument()); final UserSession userSession = getUserSession(); final User user = userSession.getUser(); final Group group = groupManager.findByShortName(token.getGroup()); @@ -400,14 +402,14 @@ final boolean votePositive) throws DefaultException { final UserSession userSession = getUserSession(); final User voter = userSession.getUser(); - final Long contentId = parseId(token.getDocument()); + final Long contentId = ContentUtils.parseId(token.getDocument()); final Comment comment = commentManager.vote(voter, contentId, commentId, votePositive); return mapper.map(comment, CommentDTO.class); } private void completeState(final User user, final boolean userIsLoggedIn, final Group group, final State state) { if (state.isRateable()) { - final Long contentId = parseId(state.getDocumentId()); + final Long contentId = ContentUtils.parseId(state.getDocumentId()); final Content content = contentManager.find(contentId); if (userIsLoggedIn) { state.setCurrentUserRate(contentManager.getRateContent(user, content)); @@ -462,17 +464,9 @@ return stateDTO; } - private Long parseId(final String id) throws ContentNotFoundException { - try { - return new Long(id); - } catch (final NumberFormatException e) { - throw new ContentNotFoundException(); - } - } - private String renameContent(final String documentId, final String newName) throws ContentNotFoundException, DefaultException { - final Long contentId = parseId(documentId); + final Long contentId = ContentUtils.parseId(documentId); final UserSession userSession = getUserSession(); final User user = userSession.getUser(); return contentManager.renameContent(user, contentId, newName); Modified: trunk/src/main/resources/db/liquibase_changelog.xml =================================================================== --- trunk/src/main/resources/db/liquibase_changelog.xml 2008-09-26 01:40:25 UTC (rev 885) +++ trunk/src/main/resources/db/liquibase_changelog.xml 2008-09-26 14:56:55 UTC (rev 886) @@ -1,8 +1,8 @@ <databaseChangeLog - xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.4" + xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.7" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.4 - http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.4.xsd"> + xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.7 + http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.7.xsd"> <preConditions> <!-- only execute this if the database exists (see DtabaInitializer.java --> <sqlCheck expectedResult="1"> Modified: trunk/src/test/java/org/ourproject/kune/platf/server/manager/ContentManagerTest.java =================================================================== --- trunk/src/test/java/org/ourproject/kune/platf/server/manager/ContentManagerTest.java 2008-09-26 01:40:25 UTC (rev 885) +++ trunk/src/test/java/org/ourproject/kune/platf/server/manager/ContentManagerTest.java 2008-09-26 14:56:55 UTC (rev 886) @@ -45,6 +45,8 @@ private License defLicense; public ContentManagerTest() { + // Testing with mysql because utf-8 normally fails with mysql and not in + // memory super("test_db", "kune.properties"); } @@ -86,6 +88,10 @@ createContentWithMime(mimetype); } + /** + * This normally fails with mysql (not configured for utf-8), see the + * INSTALL mysql section + */ @Test public void testUTF8Persist() { final Container container = Mockito.mock(Container.class); Modified: trunk/src/test/java/org/ourproject/kune/platf/server/manager/impl/FileUploadManagerTest.java =================================================================== --- trunk/src/test/java/org/ourproject/kune/platf/server/manager/impl/FileUploadManagerTest.java 2008-09-26 01:40:25 UTC (rev 885) +++ trunk/src/test/java/org/ourproject/kune/platf/server/manager/impl/FileUploadManagerTest.java 2008-09-26 14:56:55 UTC (rev 886) @@ -33,11 +33,11 @@ @Test(expected = SessionExpiredException.class) public void testSessionExp() throws Exception { - fileUploadManager.createFile("otherhash", null, null, null); + fileUploadManager.createUploadedFile("otherhash", null, null, null); } @Test(expected = UserMustBeLoggedException.class) public void testUserMustBeAuth() throws Exception { - fileUploadManager.createFile(null, null, null, null); + fileUploadManager.createUploadedFile(null, null, null, null); } } Modified: trunk/src/test/java/org/ourproject/kune/platf/server/manager/impl/FileUtilsTest.java =================================================================== --- trunk/src/test/java/org/ourproject/kune/platf/server/manager/impl/FileUtilsTest.java 2008-09-26 01:40:25 UTC (rev 885) +++ trunk/src/test/java/org/ourproject/kune/platf/server/manager/impl/FileUtilsTest.java 2008-09-26 14:56:55 UTC (rev 886) @@ -20,6 +20,36 @@ } @Test + public void getExtensionBasic() { + assertEquals("someext", FileUtils.getFileNameExtension("file.name.with.someext", false)); + } + + @Test + public void getExtensionWithDot() { + assertEquals("", FileUtils.getFileNameExtension("file name with no ext.", false)); + } + + @Test + public void getExtensionWithDotBasic() { + assertEquals(".someext", FileUtils.getFileNameExtension("file.name.with.someext", true)); + } + + @Test + public void getExtensionWithDotWithFinalDot() { + assertEquals("", FileUtils.getFileNameExtension("file name with no ext.", true)); + } + + @Test + public void getExtensionWithDotWithInitialDot() { + assertEquals("", FileUtils.getFileNameExtension(".file name with no ext", true)); + } + + @Test + public void getExtensionWithInitialDot() { + assertEquals("", FileUtils.getFileNameExtension(".file name with no ext", false)); + } + + @Test public void testFileNameWExtensionSimple() { assertEquals("test", FileUtils.getFileNameWithoutExtension("test.txt", "txt")); }