/* * Copyright (C) 2003-2008 eXo Platform SAS. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see<http://www.gnu.org/licenses/>. */ package org.exoplatform.ecm.connector.fckeditor; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import javax.annotation.security.RolesAllowed; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.Session; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.QueryParam; import javax.ws.rs.core.CacheControl; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.exoplatform.common.http.HTTPStatus; import org.exoplatform.container.ExoContainerContext; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.jcr.core.ManageableRepository; import org.exoplatform.services.jcr.ext.app.ThreadLocalSessionProviderService; import org.exoplatform.services.jcr.ext.common.SessionProvider; import org.exoplatform.services.rest.resource.ResourceContainer; import org.w3c.dom.Document; import org.w3c.dom.Element; /** * Gets a list of files and folders, and creates a folder and uploads files. * * @LevelAPI Provisional * @anchor FCKCoreRESTConnector */ @Path("/fckconnector/jcr/") public class FCKCoreRESTConnector implements ResourceContainer { private FCKFileHandler fileHandler; private FCKFolderHandler folderHandler; private FileUploadHandler fileUploadHandler; private ThreadLocalSessionProviderService sessionProviderService; private RepositoryService repositoryService; /** * Instantiates a new FCK core REST connector. * * @param repositoryService The repository service. * @param providerService The provider service. */ public FCKCoreRESTConnector(RepositoryService repositoryService, ThreadLocalSessionProviderService providerService) { this.repositoryService = repositoryService; this.sessionProviderService = providerService; this.fileHandler = new FCKFileHandler(ExoContainerContext.getCurrentContainer()); this.folderHandler = new FCKFolderHandler(ExoContainerContext.getCurrentContainer()); this.fileUploadHandler = new FileUploadHandler(ExoContainerContext.getCurrentContainer()); } /** * Returns folders and files in the current folder. * * @param repoName The repository name. * @param workspaceName The workspace name. * @param currentFolder The current folder. * @param command The command to get files/folders. * @param type The file type. * @return The folders and files. * @throws Exception The exception * * @anchor FCKCoreRESTConnector.getFoldersAndFiles */ @GET @Path("/getFoldersAndFiles/") // @OutputTransformer(XMLOutputTransformer.class) public Response getFoldersAndFiles( @QueryParam("repositoryName") String repoName, @QueryParam("workspaceName") String workspaceName, @QueryParam("currentFolder") String currentFolder, @QueryParam("command") String command, @QueryParam("type") String type) throws Exception { Session session = getSession(workspaceName); Node currentNode = (Node)session.getItem(currentFolder); String ftype = folderHandler.getFolderType(currentNode); if(ftype == null) { return Response.status(HTTPStatus.BAD_REQUEST).build(); } Element root = FCKUtils.createRootElement(command,currentNode,ftype); Document document = root.getOwnerDocument(); Element folders = root.getOwnerDocument().createElement("Folders"); Element files = root.getOwnerDocument().createElement("Files"); for(NodeIterator iterator = currentNode.getNodes();iterator.hasNext();) { Node child = iterator.nextNode(); if(child.isNodeType(FCKUtils.EXO_HIDDENABLE)) continue; String folderType = folderHandler.getFolderType(child); if(folderType != null) { Element folder = folderHandler.createFolderElement(document,child,folderType); folders.appendChild(folder); } String fileType = fileHandler.getFileType(child,type); if(fileType != null) { Element file = fileHandler.createFileElement(document,child,fileType); files.appendChild(file); } } root.appendChild(folders); root.appendChild(files); CacheControl cacheControl = new CacheControl(); cacheControl.setNoCache(true); DateFormat dateFormat = new SimpleDateFormat(FCKUtils.IF_MODIFIED_SINCE_DATE_FORMAT); return Response.ok(document, new MediaType("text", "xml")) .cacheControl(cacheControl) .header(FCKUtils.LAST_MODIFIED_PROPERTY, dateFormat.format(new Date())) .build(); } /** * Creates a folder under the current folder. * * @param repositoryName The repository name. * @param workspaceName The workspace name. * @param currentFolder The current folder. * @param newFolderName The name of the new folder. * @param language The language. * @return The response. * @throws Exception The exception * * @anchor FCKCoreRESTConnector.createFolder */ @GET @Path("/createFolder/") @RolesAllowed("users") //@OutputTransformer(XMLOutputTransformer.class) public Response createFolder( @QueryParam("repositoryName") String repositoryName, @QueryParam("workspaceName") String workspaceName, @QueryParam("currentFolder") String currentFolder, @QueryParam("newFolderName") String newFolderName, @QueryParam("language") String language) throws Exception { Session session = getSession(workspaceName); Node currentNode = (Node)session.getItem(currentFolder); return folderHandler.createNewFolder(currentNode, newFolderName, language); } /** * Uploads a file with the HttpServletRequest. * * @return The response * * @anchor FCKCoreRESTConnector.uploadFile */ @POST @Path("/uploadFile/upload/") @RolesAllowed("users") //@InputTransformer(PassthroughInputTransformer.class) //@OutputTransformer(XMLOutputTransformer.class) public Response uploadFile(@Context HttpServletRequest servletRequest) throws Exception { return fileUploadHandler.upload(servletRequest); } /** * Controls the process of uploading a file, such as aborting, deleting or progressing the file. * * @param action The action. * @param uploadId The Id of upload. * @param language The language. * @return The response * * @anchor FCKCoreRESTConnector.processUpload */ @GET @Path("/uploadFile/control/") @RolesAllowed("users") // @OutputTransformer(XMLOutputTransformer.class) public Response processUpload( @QueryParam("repositoryName") String repositoryName, @QueryParam("workspaceName") String workspaceName, @QueryParam("currentFolder") String currentFolder, @QueryParam("action") String action, @QueryParam("language") String language, @QueryParam("fileName") String fileName, @QueryParam("uploadId") String uploadId) throws Exception { if(FileUploadHandler.SAVE_ACTION.equals(action)) { Session session = getSession(workspaceName); Node currentNode = (Node)session.getItem(currentFolder); return fileUploadHandler.saveAsNTFile(currentNode, uploadId, fileName, language); } return fileUploadHandler.control(uploadId,action); } private Session getSession(String workspaceName) throws Exception { ManageableRepository manageableRepository = repositoryService.getCurrentRepository(); if(workspaceName == null) { workspaceName = manageableRepository.getConfiguration().getDefaultWorkspaceName(); } SessionProvider sessionProvider = sessionProviderService.getSessionProvider(null); return sessionProvider.getSession(workspaceName,manageableRepository); } }