Verification of a Liferay Document library




written by Marco Ferretti on February 06, 2012, at 02:57 PM

I was in the unhappy situation of having an inconsistent document library in Liferay; unfortunately I realized I had the problem when I tried to upgrade to Liferay 6.0.6 .

The whole process consists of using webdavclient4j in order to access the document library through web dav and testing the files for read.

Here's the code :

/**
 * Checkes a Liferay document library for consistency ( Files listed are actually available ) 
 * 
 */
package com.fermasoft.liferay.dl;

import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.vfs.FileObject;
import org.apache.commons.vfs.FileSystemException;
import org.apache.commons.vfs.FileSystemManager;
import org.apache.commons.vfs.FileType;
import org.apache.commons.vfs.VFS;
import org.apache.commons.vfs.provider.webdav.WebdavFileObject;
import org.apache.log4j.Logger;

/**
 * @author <a href="mailto:marco.ferretti@gmail.com">Marco Ferretti</a>
 *
 */
public class DAVFsChecker {
	/**
	 * the protocol
	 */
	private static final String protocol = "webdav://";
	/**
	 * the logger
	 */
	private static transient Logger logger = Logger.getLogger(DAVFsChecker.class);
	/**
	 * the username for connecting
	 */
	String username = "XXXX";
	/**
	 * the password
	 */
	String password = "XXXXX";
	/**
	 * webdav server
	 */
	private String server = "your.server.whatever";
	/**
	 * port
	 */
	private String port = "port";
	/**
	 * root of document library to check ( within webdav ) 
	 */
	private String root="/tunnel-web/secure/webdav/liferay.com/<your community>/document_library";

	/**
	 * used internally
	 */
	String initial_path =null;
	/**
	 * the writer for the list of files that cause problems
	 */
	PrintWriter writer = null;

	public static void main(String[] args ) throws Exception {
		DAVFsChecker checker = new DAVFsChecker();
		checker.init();
		checker.test();
		checker.finish();
	}

	/**
	 * initializes the variables and the printwriter
	 * @throws Exception
	 */
	public void init() throws Exception{
		initial_path = server;
		if ( port != null ) 
			initial_path += ":" + port;
		if ( root != null ) 
			initial_path += root;
		else
			initial_path += "/";
		writer = new PrintWriter(new FileWriter("/tmp/corrupted.log"));
		writer.print("Starting test on ");
		writer.println(new SimpleDateFormat("dd/MM/yyyy HH:mm").format(new Date(System.currentTimeMillis())));

	}
	/**
	 * flushes the printwriter and closes nicely
	 * @throws Exception
	 */
	public void finish() throws Exception{
		writer.print("Ending test on ");
		writer.println(new SimpleDateFormat("dd/MM/yyyy HH:mm").format(new Date(System.currentTimeMillis())));
		writer.flush();
		writer.close();
	}

	/**
	 * opens the connection and tests the document library 
	 * @throws IOException
	 */
	public void test ( ) throws IOException {
		String s = protocol+username+":"+password+"@"+initial_path;
		 FileSystemManager fsManager = VFS.getManager();
		 WebdavFileObject resource = (WebdavFileObject)fsManager.resolveFile( s );
		 testLibrary(resource);
	}

	/**
	 * tests an object. If the object is a directory, it traverses it and tests 
	 * every children; if it's a file it tries to read it
	 * @param file the object to test
	 * @throws IOException
	 */
	void testLibrary(WebdavFileObject file ) throws IOException {
		 if ( isFolder(file) ) {
			 FileObject[] children =  file.getChildren();
			 for(FileObject o : children){
				 testLibrary((WebdavFileObject)o);
			 }
		 } else {
			 try{
				 logger.info(canRead(file));
			 } catch(IOException e ){
				 log(file);
			 }
		 }
	}
	/**
	 * tests a {@link FileObject} by calling getType and confronting
	 * the result with {@link FileType#FOLDER}	
	 * @param file the {@link FileObject} to test
	 * @return true if the file is a directory
	 * @throws FileSystemException
	 */
	boolean isFolder(FileObject file) throws FileSystemException{
		return file.getType().equals(FileType.FOLDER);
	}
	/**
	 * Tries to read the {@link FileObject}. If the {@link FileObject} can 
	 * be read it returns true, else it propagates an {@link IOException}
	 * @param file
	 * @return
	 * @throws IOException
	 */
	boolean canRead(FileObject file) throws IOException{
		WebdavFileObject resource = (WebdavFileObject)file;
		InputStream in = resource.getInputStream();
		in.read(new byte[1024]);
		in.close();
		return true;
	}
	/**
	 * Writes in the application's result log
	 * @param file
	 */
	void log(WebdavFileObject file){
		writer.println(file.getName().getPath());
		writer.flush();
	}

}


Happy checking !

Leave a comment

Name (required)
E-mail (required, will not be published)
Website
Comment

Enter value: Captcha