MetadataCleaner.java
package sk.iway.iwcm.system.metadata;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import sk.iway.iwcm.Constants;
import sk.iway.iwcm.Logger;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.io.IwcmFile;
import sk.iway.iwcm.io.IwcmFsDB;
public class MetadataCleaner {
public static boolean removeMetadata(String virtualPath)
{
IwcmFile file = new IwcmFile(Constants.getServletContext().getRealPath(virtualPath));
return removeMetadata(file);
}
public static boolean removeMetadata(IwcmFile file)
{
String metadataRemoverCommand = Constants.getString("metadataRemoverCommand");
String metadataRemoverParams = Constants.getString("metadataRemoverParams");
String metadataRemoverExtensions = Constants.getString("metadataRemoverExtensions");
boolean result = false;
try
{
if (Tools.isNotEmpty(metadataRemoverCommand))
{
File f = new File(metadataRemoverCommand);
if (f.exists() && f.canRead())
{
//overi, ci sa pripona suboru nachadza medzi filtrovanymi priponami.
String fileExtension = file.getName().substring(file.getName().lastIndexOf(".")+1, file.getName().length()).toLowerCase();
if (Arrays.asList(Tools.getTokens(metadataRemoverExtensions.toLowerCase(), ",")).contains(fileExtension))
{
waitForGfs();
Logger.println(MetadataCleaner.class, "executing metadata remover: " + metadataRemoverCommand);
Runtime rt = Runtime.getRuntime();
String[] params = Tools.getTokens(metadataRemoverParams, " ");
String[] args = new String[params.length+1];
int index=0;
args[index++] = metadataRemoverCommand;
//naseka argumenty do pola
for (int i=0; i<params.length; i++)
{
if (params[i].indexOf("{filePath}")!=-1)
{
//ak je DBFS, vytvori lokalnu kopiu na disku, na konci ju ulozi opat do DB.
if (IwcmFsDB.useDBStorage(file.getVirtualPath()))
{
IwcmFsDB.writeFileToDisk(new File(file.getPath()),new File(IwcmFsDB.getTempFilePath(file.getPath())));
args[index++] = IwcmFsDB.getTempFilePath(file.getPath());
}
else
{
args[index++] = file.getPath();
}
}
else
{
args[index++] = params[i];
}
}
String cmdString = "";
if (args != null)
{
for (int i = 0; i < args.length; i++)
{
if (Tools.isNotEmpty(args[i]))
cmdString += " " + args[i];
}
}
Logger.println(MetadataCleaner.class, "CMD:\n" + cmdString);
Process proc = rt.exec(args);
InputStream stderr = proc.getErrorStream();
BufferedReader br = new BufferedReader(new InputStreamReader(stderr, Constants.FILE_ENCODING));
String line = null;
while ((line = br.readLine()) != null)
{
Logger.println(MetadataCleaner.class, line);
}
br.close();
int exitValue = proc.waitFor();
//ak ide o subor z DBFS, ulozi ho naspat do DB
if (IwcmFsDB.useDBStorage(file.getVirtualPath()))
{
IwcmFsDB.writeFileToDB(new File(IwcmFsDB.getTempFilePath(file.getVirtualPath())), new File(file.getVirtualPath()));
new File(IwcmFsDB.getTempFilePath(file.getVirtualPath())).delete();
}
if (exitValue==0)
result = true;
Logger.println(MetadataCleaner.class, "ExitValue: " + exitValue);
}
else
result = true;
}
}
}
catch (Exception ex)
{
sk.iway.iwcm.Logger.error(ex);
}
return result;
}
public static void waitForGfs()
{
int metadataWaitTime = Constants.getInt("metadataWaitTime");
if (metadataWaitTime > 0)
{
try
{
//kvoli GFS a tomu, ze menime existujuci subor je potrebne pockat aby nevznikol konflikt
Thread.sleep(metadataWaitTime);
}
catch (Exception e)
{
sk.iway.iwcm.Logger.error(e);
}
}
}
}