FilePathTools.java

package sk.iway.iwcm.common;

import java.io.File;
import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import sk.iway.iwcm.Constants;
import sk.iway.iwcm.InitServlet;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.form.FormMailAction;
import sk.iway.iwcm.io.IwcmFile;

/**
 *  FilePathTools.java - trieda pre preklad ciest k statickym suborom Cloudu
 *
 *@Title        webjet7
 *@Company      Interway s.r.o. (www.interway.sk)
 *@Copyright    Interway s.r.o. (c) 2001-2013
 *@author       $Author: jeeff jeeff $
 *@version      $Revision: 1.3 $
 *@created      Date: 14.2.2013 15:34:12
 *@modified     $Date: 2004/08/16 06:26:11 $
 */
public class FilePathTools
{
	private static String normalizeVirtualPath(String virtualPath)
	{
		if (Tools.isEmpty(virtualPath)) return "/";

		if (virtualPath.indexOf("//")!=-1) virtualPath = Tools.replace(virtualPath, "//", "/");
		if (virtualPath.indexOf("\\")!=-1) virtualPath = Tools.replace(virtualPath, "\\", "/");
		if (virtualPath.length()==0 || virtualPath.charAt(0)!='/') virtualPath ='/' + virtualPath;

		return virtualPath;
	}

	/**
	 * Pre zadanu virtual path vrati true ak sa jedna o cestu k externym suborom (/images, /files, /css, /jscripts)
	 * @param virtualPath
	 * @return
	 */
	public static boolean isExternalDir(String virtualPath)
	{
		if (InitServlet.isTypeCloud() || Constants.getBoolean("enableStaticFilesExternalDir"))
		{
			if (Tools.isNotEmpty(Constants.getString("cloudStaticFilesDir")))
			{
				virtualPath = normalizeVirtualPath(virtualPath);
				String virtualPathLC = virtualPath.toLowerCase();
				//jeeff: toto som zrusil aby sme nemuseli pri uprave CSS menit X webov || virtualPathLC.startsWith("/css") || virtualPathLC.startsWith("/jscripts")
				if (virtualPathLC.startsWith("/images") ||
					 virtualPathLC.startsWith("/files") ||
					 virtualPathLC.startsWith("/shared") ||
					 virtualPath.startsWith(Constants.getString("thumbServletCacheDir")) ||
					 virtualPath.startsWith(FormMailAction.FORM_FILE_DIR) ||
					 //kvoli pentestom, tu mozu byt rozbalovane importy, mali by byt pre kazdy host separe (okrem cloudu, kde to nechceme)
					 ("cloud".equals(Constants.getInstallName())==false && virtualPathLC.startsWith("/web-inf/tmp/"))
					) return true;
			}
		}
		return false;
	}

	/**
	 * Hellper pre ziskanie virtual path z realnej cesty, nepouzivat napriamo, len cez IwcmFsDB.getVirtualPath
	 * @param realPath
	 * @return
	 */
	public static String getVirtualPathHellper(String realPath)
	{
		String domainBaseFolder = getDomainBaseFolder();
		if (realPath.equals(domainBaseFolder))
		{
			return "/";
		}
		if (realPath.startsWith(domainBaseFolder)==false && realPath.contains(File.separatorChar+"shared"))
		{
			//ak realPath obsahuje shared, tak skusme pouzit shared folder
			domainBaseFolder = getDomainBaseFolder("shared");
			//its shared domain base folder, e.g. .../static-files/shared/ (not .../static-files/sharer/shared) so virtualPath is root
			if (domainBaseFolder.equals(realPath)) return "/";
		}
		if (realPath.startsWith(domainBaseFolder))
		{
			String virtualPath = realPath.substring(domainBaseFolder.length());
			virtualPath = virtualPath.replace('\\', '/');
			if (isExternalDir(virtualPath))
			{
				return virtualPath;
			}
		}

		return null;
	}

	/**
	 * Vrati meno adresara pre aktualnu domenu (bez celej cesty)
	 * @return
	 */
	private static String getDomainFolderName(String domain)
	{
		if (Constants.getBoolean("multiDomainEnabled")==false)
		{
			return "defaulthost";
		}

		domain = domain.toLowerCase();

		if (domain.startsWith("www.")) domain = domain.substring(4);

		if (domain.length() > 3 && "cloud".equals(Constants.getInstallName()))
		{
			domain = domain.charAt(0)+File.separator+domain.charAt(1)+File.separator+domain.charAt(2)+File.separator+domain;
		}

		return domain;
	}

	/**
	 * Vrati cestu k adresaru pre aktualnu domenu
	 * @return
	 */
	public static String getDomainBaseFolder()
	{
		return getDomainBaseFolder(CloudToolsForCore.getDomainName());
	}

	/**
	 * Vrati cestu k adresaru pre zadanu domenu
	 * @param domain
	 * @return
	 */
	public static String getDomainBaseFolder(String domain)
	{
		String cloudStaticFilesDir = Constants.getString("cloudStaticFilesDir");
		final String FILE_ROOT_MACRO = "{FILE_ROOT}";
		if (cloudStaticFilesDir.startsWith(FILE_ROOT_MACRO)) {
			String root = Tools.getRealPath("/");
			if (root.endsWith(""+File.separatorChar)==false) root = root+File.separatorChar;

			cloudStaticFilesDir = root + cloudStaticFilesDir.substring(FILE_ROOT_MACRO.length());

			if (cloudStaticFilesDir.endsWith(""+File.separatorChar)==false) cloudStaticFilesDir = cloudStaticFilesDir+File.separatorChar;
		}
		return cloudStaticFilesDir+getDomainFolderName(domain);
	}

	public static boolean writeFileOut(String path, HttpServletRequest req, HttpServletResponse res)
	{
		//pre cloud WebJET posielame inu cestu k suborom
		IwcmFile f = new IwcmFile(Tools.getRealPath(path));
		return writeFileOut(f, req, res);
	}

	/**
	 * Zapise dany subor na vystup vratane riesenia RANGE http hlavicky a odpovede
	 * nastavi korektne aj content-type, riesi if-modified-since hlavicku
	 * @param f
	 * @param req
	 * @param res
	 * @return
	 * @throws IOException
	 */
	public static boolean writeFileOut(IwcmFile f, HttpServletRequest req, HttpServletResponse res)
	{
		if (f.exists() && f.isFile())
		{
			if (f.getName().toLowerCase().endsWith(".jsp") || f.getName().toLowerCase().endsWith(".class"))
			{
				//toto nevieme, nerob nic
			}
			else
			{
					try
					{
						MultipartFileSender.fromFile(f)
						.with(req)
						.with(res)
						.serveResource();

						return true;
					}
					catch (Exception ex)
					{
						if (ex.getMessage().contains("java.io.IOException: Broken pipe"))
						{
							System.err.println(ex.getMessage());
							return true;
						}
						else sk.iway.iwcm.Logger.error(ex);
					}
			}
		}
		return false;
	}
}