浏览代码

[jasperserver axis] 实现移动接口

sunyj 8 年之前
父节点
当前提交
bc7fb7ebcd

+ 6 - 0
src/main/java/com/uas/report/axis/Argument.java

@@ -59,6 +59,12 @@ public class Argument {
 	// marks to skip uploading blob from DB
 	public static final String NO_RESOURCE_DATA_ATTACHMENT = "NO_ATTACHMENT";
 
+	/**
+	 * Argument used to pass the destination URI for the resource/folder
+	 * copy/move operations.
+	 */
+	public static final String DESTINATION_URI = "DESTINATION_URI";
+
 	private String name;
 	private String value;
 

+ 9 - 2
src/main/java/com/uas/report/axis/BasicResourceHandler.java

@@ -281,9 +281,8 @@ public class BasicResourceHandler implements ResourceHandler {
 	}
 
 	@Override
-	public ResourceDescriptor move(Request request) {
+	public void move(Request request) throws IOException, WSException {
 		// default implementation does nothing
-		return null;
 	}
 
 	@Override
@@ -298,4 +297,12 @@ public class BasicResourceHandler implements ResourceHandler {
 		// default implementation does nothing
 		return null;
 	}
+
+	protected String getDestinationURI(Request request) throws WSException {
+		String destinationURI = request.getArgumentValue(Argument.DESTINATION_URI);
+		if (destinationURI == null) {
+			throw new WSException(WSException.GENERAL_REQUEST_ERROR, "未传递参数DESTINATION_URI");
+		}
+		return destinationURI;
+	}
 }

+ 16 - 0
src/main/java/com/uas/report/axis/FileResourceHandler.java

@@ -39,10 +39,26 @@ public class FileResourceHandler extends BasicResourceHandler {
 
 	@Override
 	public void delete(ResourceDescriptor descriptor) throws IOException {
+		if (descriptor == null) {
+			return;
+		}
 		File file = getFile(descriptor.getUriString());
 		if (file.isDirectory()) {
 			throw new IOException("资源为文件夹!");
 		}
 		FileUtils.delete(file);
 	}
+
+	@Override
+	public void move(Request request) throws IOException, WSException {
+		if (request == null) {
+			return;
+		}
+		File file = getFile(request.getResourceDescriptor().getUriString());
+		if (file.isDirectory()) {
+			throw new IOException("资源为文件夹!");
+		}
+		String destinationURI = getDestinationURI(request);
+		FileUtils.move(file, new File(getFile(destinationURI), file.getName()));
+	}
 }

+ 13 - 0
src/main/java/com/uas/report/axis/FolderHandler.java

@@ -23,4 +23,17 @@ public class FolderHandler extends BasicResourceHandler {
 		}
 		FileUtils.deleteDir(file, true);
 	}
+
+	@Override
+	public void move(Request request) throws IOException, WSException {
+		if (request == null) {
+			return;
+		}
+		File file = getFile(request.getResourceDescriptor().getUriString());
+		if (!file.isDirectory()) {
+			throw new IOException("资源并非文件夹!");
+		}
+		String destinationURI = getDestinationURI(request);
+		FileUtils.move(file, new File(getFile(destinationURI), file.getName()));
+	}
 }

+ 1 - 1
src/main/java/com/uas/report/axis/ResourceHandler.java

@@ -14,7 +14,7 @@ public interface ResourceHandler {
 
 	public void delete(ResourceDescriptor descriptor) throws IOException;
 
-	public ResourceDescriptor move(Request request);
+	public void move(Request request) throws IOException, WSException;
 
 	public ResourceDescriptor copy(Request request);
 

+ 41 - 2
src/main/java/com/uas/report/axis/repository/RepositoryManagementServiceImpl.java

@@ -434,8 +434,47 @@ public class RepositoryManagementServiceImpl implements RepositoryManagementServ
 
 	@Override
 	public String move(String requestXmlString) {
-		// TODO Auto-generated method stub
-		return null;
+		OperationResult or = new OperationResult();
+		or.setVersion(VERSION);
+		// or.setReturnCode(OperationResult.SUCCESS);
+		try {
+			// Request request = (Request)
+			// Unmarshaller.unmarshalXml(requestXmlString);
+			StringReader xmlStringReader = new StringReader(requestXmlString);
+			Request request = (Request) Unmarshaller.unmarshal(xmlStringReader);
+			// createAuditEvent(request.getOperationName(),
+			// request.getResourceDescriptor().getWsType(),
+			// request.getResourceDescriptor().getIsNew());
+			setLocale(request.getLocale());
+
+			// ResourceDescriptor resource =
+			// createRequestResourceDescriptor(request);
+			ResourceDescriptor resourceDescriptor = basicResourceHandler
+					.locateResourceDescriptor(request.getResourceDescriptor().getUriString());
+			String wsType = resourceDescriptor.getWsType();
+			if (logger.isDebugEnabled()) {
+				logger.debug("Move WS type: " + wsType);
+			}
+			// ResourceHandler handler =
+			// getHandlerRegistry().getHandler(wsType);
+			// handler.move(request, this);
+			BasicResourceHandler handler = resourceHandlerRegistry.getHandler(wsType);
+			handler.move(request);
+			// if (or.getReturnCode() != 0) {
+			// addExceptionToAllAuditEvents(new Exception(or.getMessage()));
+			// }
+		} catch (WSException e) {
+			or.setReturnCode(e.getErrorCode());
+			or.setMessage(e.getMessage());
+			// addExceptionToAllAuditEvents(e);
+		} catch (Exception e) {
+			logger.error(e.getMessage(), e);
+			or.setReturnCode(1);
+			or.setMessage(e.getMessage());
+			// addExceptionToAllAuditEvents(e);
+		}
+
+		return marshalResponse(or);
 	}
 
 	@Override

+ 83 - 15
src/main/java/com/uas/report/util/FileUtils.java

@@ -159,9 +159,48 @@ public class FileUtils {
 		}
 	}
 
+	/**
+	 * 移动文件(夹)
+	 * 
+	 * @param src
+	 *            源文件(夹)
+	 * @param dest
+	 *            目的文件(夹)
+	 * @throws IOException
+	 */
 	public static void move(File src, File dest) throws IOException {
-		copy(src, dest);
-		delete(src);
+		if (src.equals(dest)) {
+			throw new IOException("不可移动到相同路径下");
+		}
+		if (!src.isFile() && !dest.isFile() && isSub(src, dest)) {
+			throw new IOException("不可移动到子路径下");
+		}
+		if (!dest.exists()) {
+			if (dest.isDirectory()) {
+				dest.mkdirs();
+			} else {
+				dest.getParentFile().mkdirs();
+			}
+		}
+		if (src.isFile()) {
+			if (dest.isDirectory()) {
+				dest = new File(dest, src.getName());
+				if (src.equals(dest)) {
+					throw new IOException("移动的源路径与目的路径不可相同");
+				}
+			}
+			copy(src, dest);
+			delete(src);
+		} else {
+			if (dest.isFile()) {
+				throw new IOException("不可将文件夹移动到文件");
+			}
+			File[] files = src.listFiles();
+			for (File file : files) {
+				move(file, new File(dest, file.getName()));
+			}
+			src.delete();
+		}
 	}
 
 	public static void copy(File src, File dest) throws IOException {
@@ -179,19 +218,6 @@ public class FileUtils {
 		out.close();
 	}
 
-	public static boolean delete(File f) {
-		boolean deleted = true;
-		if ((f != null) && (f.exists())) {
-			logger.trace("delete() Deleting file: {}", f);
-			System.gc();
-			System.runFinalization();
-			deleted = f.delete();
-		} else {
-			logger.trace("delete() File doesn't exist: {}", f);
-		}
-		return deleted;
-	}
-
 	private static void copyChannel(ReadableByteChannel source, WritableByteChannel dest) throws IOException {
 		ByteBuffer buffer = ByteBuffer.allocateDirect(32768);
 
@@ -209,6 +235,48 @@ public class FileUtils {
 			dest.write(buffer);
 	}
 
+	public static boolean delete(File f) {
+		boolean deleted = true;
+		if ((f != null) && (f.exists())) {
+			logger.trace("delete() Deleting file: {}", f);
+			System.gc();
+			System.runFinalization();
+			deleted = f.delete();
+		} else {
+			logger.trace("delete() File doesn't exist: {}", f);
+		}
+		return deleted;
+	}
+
+	/**
+	 * 检查后面的文件夹是否是前面的文件夹的路径下
+	 * 
+	 * @param dir
+	 * @param dir2
+	 * @return
+	 * @throws IOException
+	 */
+	private static boolean isSub(File dir, File dir2) throws IOException {
+		if (dir.equals(dir2)) {
+			throw new IOException("路径相同");
+		}
+		if (dir.isFile() || dir2.isFile()) {
+			throw new IOException("只对文件夹进行检测");
+		}
+		File parentFile = dir2.getParentFile();
+		if (parentFile == null) {
+			return false;
+		}
+		if (parentFile.equals(dir)) {
+			return true;
+		} else {
+			if (!dir2.equals(parentFile)) {
+				return isSub(dir, parentFile);
+			}
+		}
+		return false;
+	}
+
 	/**
 	 * 检查文件
 	 *