FileArchivatorInsertLater.java
package sk.iway.iwcm.components.file_archiv;
import sk.iway.iwcm.*;
import sk.iway.iwcm.common.CloudToolsForCore;
import sk.iway.iwcm.doc.GroupDetails;
import sk.iway.iwcm.doc.GroupsDB;
import sk.iway.iwcm.i18n.Prop;
import sk.iway.iwcm.io.IwcmFile;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.List;
public class FileArchivatorInsertLater
{
public static void main(String[] args)
{
try
{
List<FileArchivatorBean> filesToUpload = FileArchivatorDB.getFilesToUpload();
for(FileArchivatorBean fab : filesToUpload)
{
RequestBean currentRequestBean = SetCharacterEncodingFilter.getCurrentRequestBean();
if (currentRequestBean == null) {
SetCharacterEncodingFilter.registerDataContext(null);
currentRequestBean = SetCharacterEncodingFilter.getCurrentRequestBean();
}
int domainId = fab.getDomainId();
if (domainId > -1) {
GroupDetails group = GroupsDB.getInstance().getGroup(domainId);
if (group != null) {
currentRequestBean.setDomain(group.getDomainName());
}
}
//test if file exist's maybe it's on another cluster node
IwcmFile file = new IwcmFile(Tools.getRealPath(fab.getFilePath()+fab.getFileName()));
if(!file.exists())
{
//skip this file
continue;
}
//subor, ktory sme sa v minulosti pokusili nahrat neuspesne
if(fab.getUploaded()==-2)
continue;
if(fab != null)
{
int stav = 0;
//ulozime subor na nove miesto
String uniqueFileName = renameFile(fab);
if(uniqueFileName==null)
{
stav = 1;
fab.setUploaded(-2);
fab.save();
}
else
{
//vymazeme prazdne priecinky
if( !removeEmptyDirs(fab.getFilePath(), "archiv_insert_later") )
stav = 4;
}
sendMail(fab, stav);
}
}
}
catch (Exception e)
{
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
Adminlog.add(Adminlog.TYPE_CRON, "FileArchivatorInsertLater error:"+e.getMessage()+"\n"+sw.toString(), -1, -1);
sk.iway.iwcm.Logger.error(e);
}
finally
{
Cache.getInstance().removeObjectStartsWithName(FileArchivatorDB.getCachePrefix()+"getWaitingFileList");
}
SetCharacterEncodingFilter.unRegisterDataContext();
}
/**
* zamena obsahu suborov dirPath+fileName <-> oldFileBean.getFilePath()+oldFileBean.getFileName()
* BHR: musel som prerobit z Tools.renameFile, pretoze sa stalo, ze niekedy nezmazalo zdrojovy subor a teda sa premenovanie nedokoncilo
*/
public static String renameFile(FileArchivatorBean scheduledBean)
{
//String dirPath, String fileName, FileArchivatorBean oldFileBean
//get old bean
FileArchivatorBean oldFileBean = FileArchivatorDB.getInstance().getById(scheduledBean.getReferenceId());
if (oldFileBean == null) {
//it's first file scheduled to publish
oldFileBean = new FileArchivatorBean();
oldFileBean.setFileName(scheduledBean.getFileName());
oldFileBean.setFilePath(newPath(scheduledBean.getFilePath()));
}
boolean renamed = true;
IwcmFile oldFile = new IwcmFile(Tools.getRealPath(oldFileBean.getFilePath()+oldFileBean.getFileName()));
IwcmFile newFile = new IwcmFile(Tools.getRealPath(scheduledBean.getFilePath()+scheduledBean.getFileName()));
String uniqueFileName = FileArchivatorKit.getUniqueFileName(oldFileBean.getFileName(), oldFileBean.getFilePath(), FileArchivatorKit.getDateStampAsString(oldFileBean.getDateInsert()));
IwcmFile oldFileArchived = new IwcmFile(Tools.getRealPath(oldFileBean.getFilePath()+uniqueFileName));
try
{
//copy old file to temp file for later usage
if (oldFileBean.getId()>0) {
if(FileTools.copyFile(oldFile, oldFileArchived) == false)
{
Logger.error(FileArchivatorInsertLater.class, "renameFile1: nepodarilo sa premenovat "+oldFile.getVirtualPath()+" > "+oldFileArchived.getVirtualPath());
renamed = false;
}
}
//owerwrite old file with new file
if(FileTools.copyFile(newFile, oldFile) == false)
{
Logger.error(FileArchivatorInsertLater.class, "renameFile2: nepodarilo sa premenovat "+newFile.getVirtualPath()+" > "+oldFile.getVirtualPath());
renamed = false;
}
if (renamed) {
scheduledBean.setFileName(oldFileBean.getFileName());
scheduledBean.setFilePath(oldFileBean.getFilePath());
scheduledBean.setUploaded(-1);
scheduledBean.setReferenceId(-1);
scheduledBean.save();
Adminlog.add(Adminlog.TYPE_FILE_ARCHIVE, "EDIT: File Archiv (Planovana aktualizacia existujuceho suboru) ulozenie:\n"+scheduledBean.toString(true), scheduledBean.getId(), -1);
if (oldFileBean.getId()>0) {
oldFileBean.setFileName(uniqueFileName);
oldFileBean.setReferenceId(scheduledBean.getId());
oldFileBean.save();
FileArchivatorKit.reSetReference(oldFileBean.getId(), scheduledBean.getId());
}
//delete newFile in archive folder
newFile.delete();
return oldFileBean.getFileName();
}
}
catch(Exception e)
{
renamed = false;
sk.iway.iwcm.Logger.error(e);
}
return null;
}
/**
* vrati domenu na zaklade domainId
*/
private static String getDomainByFab(FileArchivatorBean fab)
{
String domainName = CloudToolsForCore.getDomainName();
if(Constants.getBoolean("multiDomainEnabled"))
{
GroupDetails root = GroupsDB.getInstance().getGroup(fab.getDomainId());
if (root != null) {
return root.getDomainName();
}
}
return domainName;
}
private static String newPath(String oldPath)
{
return oldPath.replace(FileArchivatorKit.getFullInsertLaterPath(), "");
}
private static void sendMail(FileArchivatorBean fileArchivatorBean, int stav)
{
Prop prop = Prop.getInstance();
StringBuilder text = new StringBuilder();
text.append("<html><head>");
text.append("<style>");
text.append("body{");
text.append("font-family: Arial;");
text.append("font-size: 11pt;");
text.append('}');
text.append("</style></head><body>");
text.append(prop.getText("components.file_archiv.FileArchivatorInsertLater.java.nasledujici_soubor_bol_uspesne_nacitany")).append(":<br/><br/>");
if(stav!=0)
text = new StringBuilder(prop.getText("components.file_archiv.FileArchivatorInsertLater.java.pri_nahravani_suboru_nastala_nasledujuca_chyba")).append(": ");
if(stav==1)
text.append(prop.getText("components.file_archiv.FileArchivatorInsertLater.java.soubor_sa_nepodarilo_ulozit_na_disk")).append("<br/><br/>");
if(stav==2)
text.append(prop.getText("components.file_archiv.FileArchivatorInsertLater.java.zaznam_o_soubore_sa_nepodarilo_ulozit_do_databazy")).append("<br/><br/>");
if(stav==3)
text.append(prop.getText("components.file_archiv.FileArchivatorInsertLater.java.nepodarilo_sa_vymazat_docasny_soubor_alebo_zaznam_o_nom_z_databazy")).append("<br/><br/>");
if(stav==4)
text.append(prop.getText("components.file_archiv.FileArchivatorInsertLater.java.nepodarilo_se_vymazat_prazdne_adresare")).append("<br/><br/>");
FileArchivatorBean fab = fileArchivatorBean;
String emails = fab.getEmails();
//Ak tento subor nie je novy, a je aktualizaciou starsieho suboru, potrebujeme vypisat v jeho vlastnosti.
if(fab.getReferenceId() != -1)
{
FileArchivatorBean fabByReference = FileArchivatorDB.getInstance().getById(fab.getReferenceId());
// referencia na neho sameho s novym ID ale v archive
if(fabByReference != null)
{
fab = fabByReference;
//referencia na hlavny subor
fabByReference = FileArchivatorDB.getInstance().getById(fab.getReferenceId());
if(fabByReference != null)
fab = fabByReference;
}
}
String subject = prop.getText("components.file_archiv.FileArchivatorInsertLater.java.soubor_bol_uspesne_nahrany") +" "+ fab.getVirtualFileName();
if(stav!=0)
subject = prop.getText("components.file_archiv.FileArchivatorInsertLater.java.pozor_nastala_chyba_pri_ukladani_souboru_") +" "+ fab.getVirtualFileName();
String dir = "";
if(Tools.isNotEmpty(newPath(fab.getFilePath())))
dir = newPath(fab.getFilePath());
if(Tools.isNotEmpty(fab.getVirtualFileName()))
text.append(prop.getText("components.file_archiv.FileArchivatorInsertLater.java.virtualne_meno")).append(": ")
.append(fab.getVirtualFileName()).append("<br/>");
if(Tools.isNotEmpty(fab.getFileName()))
text.append(prop.getText("components.file_archiv.FileArchivatorInsertLater.java.realne_meno")).append(": ")
.append(fab.getFileName()).append("<br/>");
if(Tools.isNotEmpty(dir))
text.append("Adresář: ").append(dir).append("<br/>");
if(fab.getValidFrom()!=null)
text.append(prop.getText("components.file_archiv.FileArchivatorInsertLater.java.datum_od")).append(": ")
.append(Tools.formatDate(fab.getValidFrom())).append("<br/>");
if(fab.getValidTo()!=null)
text.append(prop.getText("components.file_archiv.FileArchivatorInsertLater.java.datum_od_1")).append(": ")
.append(Tools.formatDate(fab.getValidTo())).append("<br/>");
if(Tools.isNotEmpty(fab.getProduct()))
text.append(prop.getText("components.file_archiv.product")).append(": ")
.append(fab.getProduct()).append("<br/>");
if(Tools.isNotEmpty(fab.getCategory()))
text.append(prop.getText("components.bazar.category")).append(": ")
.append(fab.getCategory()).append("<br/>");
if(Tools.isNotEmpty(fab.getProductCode()))
text.append(prop.getText("components.file_archiv.code")).append(": ")
.append(fab.getProductCode()).append("<br/>");
if(fab.getShowFile())
text.append(prop.getText("editor.show")).append(":").append(prop.getText("qa.publishOnWeb.yes")).append("<br/>");
else
text.append(prop.getText("editor.show")).append(":").append(prop.getText("qa.publishOnWeb.no")).append("<br />");
text.append(prop.getText("components.banner.priority")).append(": ")
.append(fab.getPriority()).append("<br/>");
if(Tools.isNotEmpty(fab.getReferenceToMain()))
text.append(prop.getText("components.file_archiv.pattern")).append(": ").append(fab.getReferenceToMain()).append("<br/>");
text.append(prop.getText("components.file_archiv.reference")).append(": ").append(fab.getReferenceId()).append("<br/>");
String baseHref = "http://"+getDomainByFab(fab);
text.append("<br/>").append(prop.getText("components.file_archiv.link_on_file")).append(": <a href=\"").append(baseHref).append("/")
.append(dir).append(fab.getFileName()).append("\">").append(baseHref).append("/").append(dir).append(fab.getFileName())
.append("</a>");
text.append("</body></html>");
String fromName = prop.getText("components.file_archiv.title");
String fromEmail = "no-reply@"+getDomainByFab(fab).replace("www.", "");
if(Tools.isNotEmpty(Constants.getString("fileArchivFromMail")) && Tools.isEmail(Constants.getString("fileArchivFromMail")))
fromEmail = Constants.getString("fileArchivFromMail");
if(Tools.isEmpty(emails))
emails = Constants.getString("fileArchivSupportEmails");
String[] emailsArray = Tools.getTokens(emails, ",", true);
for (String recipient : emailsArray)
SendMail.send(fromName, fromEmail, recipient, subject, text.toString());
}
/**
* vymaze vsetky prazdne priecinky od startDir po stopDir vratane
*
* @param startDir
* @param stopDir
* @return
*/
public static boolean removeEmptyDirs(String startDir, String stopDir)
{
boolean result = true;
if( Tools.isEmpty(startDir) || Tools.isEmpty(stopDir) )
return result;
IwcmFile startDirFile = new IwcmFile(Tools.getRealPath(startDir));
IwcmFile stopDirFile = new IwcmFile(Tools.getRealPath(stopDir));
if(!startDirFile.isDirectory())
return result;
int numberOfFiles = startDirFile.listFiles().length;
if(numberOfFiles!=0)
return result;
IwcmFile helpFile = startDirFile;
IwcmFile deleteFile = startDirFile;
//kym je adresar prazdny, alebo iba s jednym suborom - inym prazdnym Dirom
//a sucasne jeho nazov nie je stopDir
while( numberOfFiles<=1 && !helpFile.getName().equals(stopDirFile.getName()) )
{
deleteFile = helpFile;
helpFile = helpFile.getParentFile();
numberOfFiles = helpFile.listFiles().length;
}
//rekurzivne vymaze vsetky subory nadol, vratane zadaneho adresara
result = FileTools.deleteDirTree(deleteFile);
Logger.debug(FileArchivatorInsertLater.class, "Vymazanie prazdnych adresarov, zaciatok(vratane): "+deleteFile.getAbsolutePath());
return result;
}
}