FileIndexer.java
package sk.iway.iwcm.findexer;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import sk.iway.iwcm.Constants;
import sk.iway.iwcm.DBPool;
import sk.iway.iwcm.Identity;
import sk.iway.iwcm.Logger;
import sk.iway.iwcm.SetCharacterEncodingFilter;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.common.CloudToolsForCore;
import sk.iway.iwcm.common.FileIndexerTools;
import sk.iway.iwcm.doc.DebugTimer;
import sk.iway.iwcm.doc.DocDB;
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 sk.iway.iwcm.users.UserDetails;
import sk.iway.iwcm.users.UsersDB;
/**
* FullText indexovanie suborov. Vytvari web stranku s obsahom textu daneho
* suboru a s presmerovanim na dany subor.
*
*@Title WebJET
*@Company Interway s.r.o. (www.interway.sk)
*@Copyright Interway s.r.o. (c) 2001-2002
*@author $Author: jeeff $
*@version $Revision: 1.3 $
*@created Utorok, 2004, január 20
*@modified $Date: 2004/01/25 13:31:09 $
*/
public class FileIndexer
{
protected FileIndexer() {
//utility class
}
/**
* Zaindexuje subor
* @param url - url suboru
* @param indexedFiles - zoznam do ktoreho sa zapise vysledok
* @param request
* @return
*
* @deprecated - use FileIndexerTools.indexFile
*/
@Deprecated
public static boolean indexFile(String url, List<ResultBean> indexedFiles, HttpServletRequest request)
{
return FileIndexerTools.indexFile(url, indexedFiles, request);
}
/**
* Zaindexuje cely adresar
* @param dirUrl - url adresa
* @param indexedFiles - zoznam do ktoreho sa zapisu zaindexovane subory
* @param request
*/
public static void indexDir(String dirUrl, List<ResultBean> indexedFiles, HttpServletRequest request)
{
indexDir(dirUrl, indexedFiles, request, null);
}
public static void indexDir(String dirUrl, List<ResultBean> indexedFiles, HttpServletRequest request, PrintWriter out)
{
Logger.println(FileIndexer.class,"index dir: " + dirUrl);
if (out != null)
{
out.println("<script type='text/javascript'>window.scrollBy(0, 1000);</script>");
}
disablePagesInDir(dirUrl);
if (dirUrl.contains("backup")) {
Logger.error(FileIndexer.class, dirUrl+" is BACKUP, skipping");
return;
}
IwcmFile dir = new IwcmFile(Tools.getRealPath(dirUrl));
IwcmFile[] files = dir.listFiles();
IwcmFile f;
int size = files.length;
int i;
DebugTimer dt = new DebugTimer("FileIndexer");
for (i=0; i<size; i++)
{
f = files[i];
Logger.debug(FileIndexer.class, "indexDir, i="+i+"/"+size+" f="+f.getAbsolutePath()+" dir="+f.isDirectory()+" canRead="+f.canRead());
if (f.isDirectory())
{
//rekurzia
indexDir(dirUrl + "/" + f.getName(), indexedFiles, request, out);
}
else if (f.canRead())
{
if (out != null)
{
out.println("<script type='text/javascript'>window.scrollBy(0, 1000);</script>");
out.flush();
}
boolean indexed = FileIndexerTools.indexFile(dirUrl + "/" + f.getName(), indexedFiles, request);
if (out != null && indexed)
{
out.println(dirUrl + "/" + f.getName());
long lastDiff = dt.diff(dirUrl + "/" + f.getName());
out.println(" (+"+lastDiff+" ms)<br/>");
out.println("<script type='text/javascript'>window.scrollBy(0, 1000);</script>");
out.flush();
}
}
}
deleteDisabledPagesInDir(dirUrl);
}
/**
* Pred reindexaciou adresara zakaze zobrazenie vsetkych web stranok, ktore sa nasledne vymazu (aby sa aktualizoval stav voci file systemu)
* @param dirUrl
*/
private static void disablePagesInDir(String dirUrl)
{
//otaguj stare web stranky aby sa vymazali neexistujuce stranky (subory)
GroupsDB groupsDB = GroupsDB.getInstance();
GroupDetails rootGroup = groupsDB.getGroupByPath(dirUrl);
if (rootGroup != null)
{
Connection db_conn = null;
PreparedStatement ps = null;
try
{
db_conn = DBPool.getConnection();
ps = db_conn.prepareStatement("UPDATE documents SET available=? WHERE group_id=?");
ps.setBoolean(1, false);
ps.setInt(2, rootGroup.getGroupId());
ps.execute();
ps.close();
db_conn.close();
ps = null;
db_conn = null;
DocDB.getInstance(true);
}
catch (Exception ex)
{
sk.iway.iwcm.Logger.error(ex);
}
finally
{
try
{
if (ps != null)
ps.close();
if (db_conn != null)
db_conn.close();
}
catch (Exception ex2)
{
}
}
}
}
/**
* Po reindexacii adresara vymaze neexistujuce subory (stranky)
* @param dirUrl
*/
private static void deleteDisabledPagesInDir(String dirUrl)
{
//otaguj stare web stranky aby sa vymazali neexistujuce stranky (subory)
GroupsDB groupsDB = GroupsDB.getInstance();
GroupDetails rootGroup = groupsDB.getGroupByPath(dirUrl);
if (rootGroup != null)
{
Connection db_conn = null;
PreparedStatement ps = null;
try
{
db_conn = DBPool.getConnection();
ps = db_conn.prepareStatement("DELETE FROM documents WHERE available=? AND group_id=?");
ps.setBoolean(1, false);
ps.setInt(2, rootGroup.getGroupId());
ps.execute();
ps.close();
db_conn.close();
ps = null;
db_conn = null;
DocDB.getInstance(true);
}
catch (Exception ex)
{
sk.iway.iwcm.Logger.error(ex);
}
finally
{
try
{
if (ps != null)
ps.close();
if (db_conn != null)
db_conn.close();
}
catch (Exception ex2)
{
}
}
}
}
/**
* Vrati docId pre zadanu URL adresu suboru (pre multidomain uz musi byt zdekodovana na filesystem URL)
* @param url
* @param request
* @return
*
* @deprecated - not used anymore
*/
@Deprecated
public static int getFileDocId(String url, HttpServletRequest request)
{
int docId = -1;
Connection db_conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try
{
db_conn = DBPool.getConnection(DBPool.getDBName(request));
ps = db_conn.prepareStatement("SELECT doc_id FROM documents WHERE virtual_path=? OR virtual_path=?");
ps.setString(1, url+".html");
ps.setString(2, Tools.replace(url, ".", "-")+".html");
rs = ps.executeQuery();
if (rs.next())
{
docId = rs.getInt("doc_id");
}
rs.close();
ps.close();
db_conn.close();
rs = null;
ps = null;
db_conn = null;
}
catch (Exception ex)
{
sk.iway.iwcm.Logger.error(ex);
}
finally
{
try
{
if (rs != null)
rs.close();
if (ps != null)
ps.close();
if (db_conn != null)
db_conn.close();
}
catch (Exception ex2)
{
}
}
return(docId);
}
public static boolean isFileIndexerConfigured()
{
if (GroupsDB.getInstance().checkExist(0, "files")) return true;
if (Constants.getBoolean("enableStaticFilesExternalDir"))
{
int domainId = CloudToolsForCore.getDomainId();
if (GroupsDB.getInstance().checkExist(domainId, "files")) return true;
}
return false;
}
/**
* @deprecated - use FileIndexerTools.indexFile
*/
@Deprecated
public static void indexFile(String url, UserDetails user){
FileIndexerTools.indexFile(url,user);
}
/**
* @deprecated - use FileIndexerTools.deleteIndexedFile
*/
@Deprecated
public static boolean deleteIndexedFile(String url){
return FileIndexerTools.deleteIndexedFile(url);
}
/**
* @deprecated - use FileIndexerTools.findGroup
*/
@Deprecated
public static GroupDetails findGroup(List<GroupDetails> groups, int parentGroupId, String name){
return FileIndexerTools.findGroup(groups,parentGroupId,name);
}
/**
* Index file or folder. If user is not logged redirect to logon.
*
* @param file - single file URL to index
* @param dir - URL of directory to index
* @param request
* @param response
* @throws IOException
* @throws ServletException
*/
public static void indexFileOrFolder(String file, String dir,
HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
//If user is not logged, redirect him to loggon
Identity user = UsersDB.getCurrentUser(request);
if (user == null || user.isAdmin() == false) {
response.sendRedirect("/admin/logon.jsp");
return;
}
if (Tools.isNotEmpty(file) && Tools.isEmpty(dir)) {
int last = file.lastIndexOf("/");
if (last > 0) dir = file.substring(0, last);
}
List<ResultBean> indexedFiles = new ArrayList<>();
response.setContentType("text/html; charset=" + SetCharacterEncodingFilter.getEncoding());
PrintWriter out = response.getWriter();
Prop prop = Prop.getInstance(request);
out.println("<html><head><LINK rel='stylesheet' href='/admin/css/style.css'></head><body>");
out.println("<strong>" + prop.getText("findexer.indexing") + "</strong><br/>");
if (user.isFolderWritable(dir)) {
if (Tools.isNotEmpty(file)) {
if(file.indexOf('/') == -1)
file = dir + "/" + file;
Logger.println(FileIndexer.class,"indexujem subor: " + file);
out.println(file);
out.println("<script type='text/javascript'>window.scrollBy(0, 1000);</script>");
out.flush();
DebugTimer dt = new DebugTimer("FileIndexer");
FileIndexerTools.indexFile(file, indexedFiles, request);
long lastDiff = dt.diff(file);
out.println(" (+"+lastDiff+" ms)<br/>");
out.println("<script type='text/javascript'>window.scrollBy(0, 1000);</script>");
out.flush();
dir = null;
}
if (Tools.isNotEmpty(dir) && dir != null && dir.contains("WEB-INF") == false) {
//budeme rovno vypisovat ak sa nejedna o hromadne indexovanie
sk.iway.iwcm.Encoding.setResponseEnc(request, response, "text/html");
for (int i = 0; i < 10; i++) {
out.println(" ");
}
out.flush();
FileIndexer.indexDir(dir, indexedFiles, request, out);
}
}
out.println("<hr>" + prop.getText("findex.done"));
out.println("<script type='text/javascript'>");
out.println("if (window.parent != null && typeof window.parent.hideButtons == 'function')");
out.println("{");
out.println("window.parent.hideButtons();");
out.println("}");
out.print("window.scrollBy(0, 1000);");
out.print("</script>");
out.println("</body></html>");
}
}