Package com.dotmarketing.portlets.folders.business

Source Code of com.dotmarketing.portlets.folders.business.FolderFactoryImpl$InternalCounter

package com.dotmarketing.portlets.folders.business;
// 1212
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Stack;
import java.util.StringTokenizer;
import java.util.TimeZone;
import java.util.regex.Matcher;

import com.dotcms.repackage.org.apache.commons.beanutils.BeanUtils;
import com.dotcms.repackage.org.apache.oro.text.regex.Pattern;
import com.dotcms.repackage.org.apache.oro.text.regex.Perl5Compiler;
import com.dotcms.repackage.org.apache.oro.text.regex.Perl5Matcher;

import com.dotmarketing.beans.Host;
import com.dotmarketing.beans.Identifier;
import com.dotmarketing.beans.Inode;
import com.dotmarketing.beans.WebAsset;
import com.dotmarketing.business.APILocator;
import com.dotmarketing.business.CacheLocator;
import com.dotmarketing.business.DotIdentifierStateException;
import com.dotmarketing.business.DotStateException;
import com.dotmarketing.business.IdentifierAPI;
import com.dotmarketing.business.PermissionAPI;
import com.dotmarketing.business.Permissionable;
import com.dotmarketing.business.Role;
import com.dotmarketing.business.Treeable;
import com.dotmarketing.cache.FolderCache;
import com.dotmarketing.cache.LiveCache;
import com.dotmarketing.cache.WorkingCache;
import com.dotmarketing.common.db.DotConnect;
import com.dotmarketing.db.DbConnectionFactory;
import com.dotmarketing.db.HibernateUtil;
import com.dotmarketing.exception.DotDataException;
import com.dotmarketing.exception.DotHibernateException;
import com.dotmarketing.exception.DotRuntimeException;
import com.dotmarketing.exception.DotSecurityException;
import com.dotmarketing.menubuilders.RefreshMenus;
import com.dotmarketing.portlets.contentlet.model.Contentlet;
import com.dotmarketing.portlets.fileassets.business.FileAsset;
import com.dotmarketing.portlets.fileassets.business.IFileAsset;
import com.dotmarketing.portlets.files.model.File;
import com.dotmarketing.portlets.folders.model.Folder;
import com.dotmarketing.portlets.htmlpages.factories.HTMLPageFactory;
import com.dotmarketing.portlets.htmlpages.model.HTMLPage;
import com.dotmarketing.portlets.links.factories.LinkFactory;
import com.dotmarketing.portlets.links.model.Link;
import com.dotmarketing.portlets.structure.model.Structure;
import com.dotmarketing.services.PageServices;
import com.dotmarketing.util.AssetsComparator;
import com.dotmarketing.util.InodeUtils;
import com.dotmarketing.util.Logger;
import com.dotmarketing.util.UUIDGenerator;
import com.dotmarketing.util.UtilMethods;
import com.liferay.portal.language.LanguageUtil;
import com.liferay.portal.model.User;

/**
*
* @author maria 2323
*/
public class FolderFactoryImpl extends FolderFactory {
  private int nodeId;

  private FolderCache fc = CacheLocator.getFolderCache();
  private java.text.DateFormat loginDateFormat;

  @Override
  protected boolean exists(String folderInode) throws DotDataException {
    DotConnect dc = new DotConnect();
    dc.setSQL("select inode  from folder where inode = ?");
    dc.addParam(folderInode);
    return dc.loadResults().size() > 0;

  }


  @Override
  protected void delete(Folder f) throws DotDataException {
    Identifier id = APILocator.getIdentifierAPI().find(f.getIdentifier());
    HibernateUtil.delete(f);
    fc.removeFolder(f, id);
    CacheLocator.getIdentifierCache().removeFromCacheByVersionable(f);
  }

  /*
   * protected boolean existsFolder(long folderInode) { return
   * existsFolder(Long.toString(folderInode)); }
   */
  @Override
  protected Folder find(String folderInode) throws DotDataException {
    Folder folder = fc.getFolder(folderInode);
    if (folder == null) {
      try{
        folder = (Folder) new HibernateUtil(Folder.class).load(folderInode);
        Identifier id = APILocator.getIdentifierAPI().find(folder.getIdentifier());
        fc.addFolder(folder, id);
      }
      catch(Exception e){
        throw new DotDataException(e.getMessage());
      }

    }
    return folder;
  }


  @SuppressWarnings("unchecked")
  @Override
  protected java.util.List<Folder> getSubFolders(Folder folder) throws DotStateException, DotDataException {

    Identifier id = APILocator.getIdentifierAPI().find(folder);

    HibernateUtil dh = new HibernateUtil(Folder.class);
    List<Folder> list = null;
    String query = "SELECT {folder.*} from folder folder, inode folder_1_, identifier identifier where folder.identifier = identifier.id and "
        + "folder_1_.type = 'folder' and folder_1_.inode = folder.inode and identifier.parent_path = ? and host_inode = ? order by name, sort_order";

    dh.setSQLQuery(query);
    dh.setParam(id.getPath());
    dh.setParam(id.getHostId());
    list = (java.util.List<Folder>) dh.list();
        Collections.sort(list,new Comparator<Folder>() {
            public int compare(Folder o1, Folder o2) {
                return o1.getTitle().compareToIgnoreCase(o2.getTitle());
            }
        });
    return list;
  }
  @SuppressWarnings("unchecked")
  @Override
  protected java.util.List<Folder> getSubFoldersTitleSort(Folder folder) throws DotDataException  {
    Identifier id = APILocator.getIdentifierAPI().find(folder);
    HibernateUtil dh = new HibernateUtil(Folder.class);
    List<Folder> folders = null;

    String query = "SELECT {folder.*} from folder folder, inode folder_1_, identifier identifier where folder.identifier = identifier.id and "
        + "folder_1_.type = 'folder' and folder_1_.inode = folder.inode and identifier.parent_path = ? and host_inode = ? order by folder.title";

    dh.setSQLQuery(query);
    dh.setParam(id.getPath());
    dh.setParam(id.getHostId());
    folders = (java.util.List<Folder>) dh.list();

    return folders;
  }

  @SuppressWarnings("unchecked")
  @Override
  protected List<Folder> findSubFolders(Folder folder, boolean showOnMenu) throws DotStateException, DotDataException {
    Identifier id = APILocator.getIdentifierAPI().find(folder);
    HibernateUtil dh = new HibernateUtil(Folder.class);
    String condition = "";
    if(UtilMethods.isSet(showOnMenu)){
      condition = "show_on_menu = " + com.dotmarketing.db.DbConnectionFactory.getDBTrue();
    }
    dh.setSQLQuery("SELECT {folder.*} from folder folder, inode folder_1_, identifier identifier where folder.identifier = identifier.id and "
        + "folder_1_.type = 'folder' and folder_1_.inode = folder.inode and identifier.parent_path = ? and host_inode = ? and "
        + condition + " order by sort_order, name");
    dh.setParam(id.getPath());
    dh.setParam(id.getHostId());
    return (java.util.List<Folder>)dh.list();

  }
  @SuppressWarnings("unchecked")
  @Override
  protected List<Folder> findSubFolders(Host host, boolean showOnMenu) throws DotHibernateException   {

    HibernateUtil dh = new HibernateUtil(Folder.class);
    String condition = "";
    if(UtilMethods.isSet(showOnMenu)){
      condition = "show_on_menu = " + com.dotmarketing.db.DbConnectionFactory.getDBTrue();
    }
    String query = "select {folder.*} from folder, inode folder_1_, identifier identifier where parent_path = '/' and "+
                   "folder_1_.type = 'folder' and folder.inode = folder_1_.inode and folder.identifier = identifier.id and host_inode = ? and "
             + condition + " order by sort_order, name";

    dh.setSQLQuery(query);
    dh.setParam(host.getIdentifier());

    return (java.util.List<Folder>)dh.list();
  }

  @Override
  protected Folder findFolderByPath(String path, Host host) throws DotDataException {

    if(host==null) return null;

    Folder folder = fc.getFolderByPathAndHost(path, host);
    if(folder ==null){
      String parentPath;
      String assetName;
      String hostId;
      try{
        if(path.equals("/") || path.equals("/System folder")) {
          parentPath="/System folder";
          assetName="system folder";
          hostId="SYSTEM_HOST";
        }
        else {
          // trailing / is removed
          if (path.endsWith("/"))
            path = path.substring(0, path.length()-1);
          // split path into parent and asset name
          int idx=path.lastIndexOf('/');
          parentPath=path.substring(0,idx+1);
          assetName=path.substring(idx+1);
          hostId=host.getIdentifier();
        }
        HibernateUtil dh = new HibernateUtil(Folder.class);
        dh.setSQLQuery("select {folder.*} from folder, inode folder_1_, identifier identifier where asset_name = ? and parent_path = ? and "
            + "folder_1_.type = 'folder' and folder.inode = folder_1_.inode and folder.identifier = identifier.id and host_inode = ?");
        dh.setParam(assetName);
        dh.setParam(parentPath);
        dh.setParam(hostId);
        folder = (Folder) dh.load();
        if(UtilMethods.isSet(folder) && UtilMethods.isSet(folder.getInode())) {
          // if it is found add it to folder cache
          Identifier id = APILocator.getIdentifierAPI().find(folder.getIdentifier());
          fc.addFolder(folder, id);
        }
      }
      catch(Exception e){
        throw new DotDataException(e.getMessage());
      }

    }
    return folder;
  }

  protected List<String> getFolderTree(String hostId, String openNodes, String view, String content, String structureInode, Locale locale,
      TimeZone timeZone, Role[] roles, boolean isAdminUser, User user) throws DotStateException, DotDataException,
      DotSecurityException {
    return getFolderTree(openNodes, view, content, structureInode, locale, timeZone, roles, isAdminUser, user);
  }

  protected List<Folder> getFoldersByParent(Folder folder, User user, boolean respectFrontendRoles) throws DotDataException {
    List<Folder> entries = new ArrayList<Folder>();
    List<Folder> elements = getSubFoldersTitleSort(folder);
    for (Folder childFolder : elements) {
      if (APILocator.getPermissionAPI().doesUserHavePermission(childFolder, PermissionAPI.PERMISSION_READ, user, respectFrontendRoles)) {
        entries.add(childFolder);
      }
    }
    return entries;
  }

  @SuppressWarnings("unchecked")
  protected java.util.List getMenuItems(Folder folder) throws DotDataException {
    return getMenuItems(folder, 1);
  }

  @SuppressWarnings("unchecked")
  protected java.util.List getMenuItems(Host host) throws DotDataException, DotSecurityException {
    return getMenuItems(host, 1);
  }

  @SuppressWarnings("unchecked")
  protected java.util.List getMenuItems(Folder folder, int orderDirection) throws  DotDataException{
    List<Folder> folders = new ArrayList<Folder>();
    folders.add(folder);
    return getMenuItems(folders, orderDirection);
  }

  @SuppressWarnings("unchecked")
  protected java.util.List getMenuItems(Host host, int orderDirection) throws DotDataException, DotSecurityException {
    List<Folder> subFolders = APILocator.getFolderAPI().findSubFolders(host,APILocator.getUserAPI().getSystemUser(),false);
    return getMenuItems(subFolders, orderDirection);
  }

  @SuppressWarnings("unchecked")
  private List getMenuItems(List<Folder> folders, int orderDirection) throws DotDataException {

    List menuList = new ArrayList();

    for (Folder folder : folders) {
        ChildrenCondition cond = new ChildrenCondition();
        cond.showOnMenu=true;

      // gets all subfolders
      List subFolders = getChildrenClass(folder, Folder.class, cond);

      cond.deleted=false;
      cond.live=true;

      // gets all links for this folder
      List linksListSubChildren = getChildrenClass(folder, Link.class, cond);

      // gets all html pages for this folder
      List htmlPagesSubListChildren = getChildrenClass(folder, HTMLPage.class, cond);

      // gets all files for this folder
      List filesListSubChildren = getChildrenClass(folder, File.class, cond);


      List<FileAsset> fileAssets = null;
      try {
        fileAssets = APILocator.getFileAssetAPI().findFileAssetsByFolder(folder, APILocator.getUserAPI().getSystemUser(), false);
        for(FileAsset fileAsset : fileAssets) {
          if(fileAsset.isShowOnMenu()){
            filesListSubChildren.add(fileAsset);
          }
        }
      } catch (DotSecurityException e) {}

      // gets all subitems
      menuList.addAll(subFolders);
      menuList.addAll(linksListSubChildren);
      menuList.addAll(htmlPagesSubListChildren);
      menuList.addAll(filesListSubChildren);

      Comparator comparator = new AssetsComparator(orderDirection);
      java.util.Collections.sort(menuList, comparator);
    }

    return menuList;
  }

  @SuppressWarnings("unchecked")
  protected java.util.List getAllMenuItems(Inode inode) throws DotStateException, DotDataException {
    return getAllMenuItems(inode, 1);
  }

  @SuppressWarnings("unchecked")
  protected java.util.List getAllMenuItems(Inode inode, int orderDirection) throws DotStateException, DotDataException {

    // gets all subfolders
    java.util.List folderListChildren = getChildrenClass((Folder)inode, Folder.class);

    ChildrenCondition cond=new ChildrenCondition();
    cond.showOnMenu=true;
    cond.deleted=false;
    cond.live=true;

    // gets all links for this folder
    java.util.List linksListSubChildren = getChildrenClass((Folder) inode, Link.class, cond);

    // gets all html pages for this folder
    java.util.List htmlPagesSubListChildren = getChildrenClass((Folder) inode, HTMLPage.class, cond);

    // gets all files for this folder
    java.util.List filesListSubChildren = getChildrenClass((Folder) inode, File.class, cond);

    List<FileAsset> fileAssets = null;
    try {
      fileAssets = APILocator.getFileAssetAPI().findFileAssetsByFolder((Folder) inode, APILocator.getUserAPI().getSystemUser(), false);
      filesListSubChildren.addAll(fileAssets);
    } catch (DotSecurityException e) {}

    // gets all subitems
    java.util.List menuList = new java.util.ArrayList();
    menuList.addAll(folderListChildren);
    menuList.addAll(linksListSubChildren);
    menuList.addAll(htmlPagesSubListChildren);
    menuList.addAll(filesListSubChildren);

    Comparator comparator = new AssetsComparator(orderDirection);
    java.util.Collections.sort(menuList, comparator);

    return menuList;
  }

  protected Folder createFolders(String path, Host host) throws DotDataException {

    StringTokenizer st = new StringTokenizer(path, "/");
    StringBuffer sb = new StringBuffer("/");

    Folder parent = null;

    while (st.hasMoreTokens()) {
      String name = st.nextToken();
      sb.append(name + "/");
      Folder f = findFolderByPath(sb.toString(), host);
      if (!InodeUtils.isSet(f.getInode())) {
        f.setName(name);
        f.setTitle(name);
        //f.setPath(sb.toString());
        f.setShowOnMenu(false);
        f.setSortOrder(0);
        f.setHostId(host.getIdentifier());
        Identifier ident;
        if(!UtilMethods.isSet(parent))
          ident = createIdentifierForFolder(f, "/");
        else {
          Identifier parentId=APILocator.getIdentifierAPI().find(parent.getIdentifier());
          ident = createIdentifierForFolder(f, parentId.getPath());
        }
        f.setIdentifier(ident.getId());
        HibernateUtil.saveOrUpdate(f);
      }
      parent = f;

    }
    return parent;

  }

    @SuppressWarnings ("unchecked")
    private void copy ( Folder folder, Host destination, Hashtable copiedObjects ) throws DotDataException, DotSecurityException, DotStateException, IOException {

        boolean rename = APILocator.getHostAPI().doesHostContainsFolder( destination, folder.getName() );

        Folder newFolder = new Folder();
        newFolder.copy( folder );
        newFolder.setName( folder.getName() );
        while ( rename ) {
            newFolder.setName( newFolder.getName() + "_copy" );
            rename = APILocator.getHostAPI().doesHostContainsFolder( destination, newFolder.getName() );
        }

        newFolder.setHostId( destination.getIdentifier() );

        Identifier newFolderId = createIdentifierForFolder( newFolder, null );
        newFolder.setIdentifier( newFolderId.getId() );
        newFolder.setModDate(new Date());

        save( newFolder );

        saveCopiedFolder( folder, newFolder, copiedObjects );
    }

    @SuppressWarnings ("unchecked")
    private void copy ( Folder folder, Folder destination, Hashtable copiedObjects ) throws DotDataException, DotStateException, DotSecurityException, IOException {

        boolean rename = folderContains( folder.getName(), destination );

        Folder newFolder = new Folder();
        newFolder.copy( folder );
        newFolder.setName( folder.getName() );
        while ( rename ) {
            newFolder.setName( newFolder.getName() + "_copy" );
            rename = folderContains( newFolder.getName(), (Folder) destination );
        }

        //newFolder.setPath(((Folder) destination).getPath() + newFolder.getName() + "/");
        newFolder.setHostId( destination.getHostId() );
        Identifier parentId = APILocator.getIdentifierAPI().find( destination.getIdentifier() );
        Identifier newFolderId = createIdentifierForFolder( newFolder, parentId.getPath() );
        newFolder.setIdentifier( newFolderId.getId() );
        newFolder.setModDate(new Date());

        save( newFolder );

        // TreeFactory.saveTree(new Tree(destination.getInode(),
        // newFolder.getInode()));

        saveCopiedFolder( folder, newFolder, copiedObjects );
    }

  private void saveCopiedFolder(Folder source, Folder newFolder, Hashtable copiedObjects) throws DotDataException, DotStateException, DotSecurityException, IOException {
    User systemUser = APILocator.getUserAPI().getSystemUser();

    if (copiedObjects == null)
      copiedObjects = new Hashtable();

    // Copying folder permissions
    APILocator.getPermissionAPI().copyPermissions(source, newFolder);

    // Copying children html pages
    Map<String, HTMLPage[]> pagesCopied;
    if (copiedObjects.get("HTMLPages") == null) {
      pagesCopied = new HashMap<String, HTMLPage[]>();
      copiedObjects.put("HTMLPages", pagesCopied);
    } else {
      pagesCopied = (Map<String, HTMLPage[]>) copiedObjects.get("HTMLPages");
    }

    List pages = getChildrenClass(source, HTMLPage.class);
    for (HTMLPage page : (List<HTMLPage>) pages) {
      if (page.isWorking()) {
        HTMLPage newPage = HTMLPageFactory.copyHTMLPage(page, newFolder);
        // Saving copied pages to update template - pages relationships
        // later
        pagesCopied.put(page.getInode(), new HTMLPage[] { page, newPage });
      }
    }

    // Copying Files
    Map<String, IFileAsset[]> filesCopied;
    if (copiedObjects.get("Files") == null) {
      filesCopied = new HashMap<String, IFileAsset[]>();
      copiedObjects.put("Files", filesCopied);
    } else {
      filesCopied = (Map<String, IFileAsset[]>) copiedObjects.get("Files");
    }

    List files = getChildrenClass(source, File.class);
    for (File file : (List<File>) files) {
      if (file.isWorking()) {
        File newFile = APILocator.getFileAPI().copyFile(file, newFolder, APILocator.getUserAPI().getSystemUser(), false);
        // Saving copied pages to update template - pages relationships
        // later
        filesCopied.put(file.getInode(), new File[] { file, newFile });
      }
    }

    //Content Files
    List<FileAsset> faConts = APILocator.getFileAssetAPI().findFileAssetsByFolder(source, APILocator.getUserAPI().getSystemUser(), false);
    for(FileAsset fa : faConts){
      if(fa.isWorking() && !fa.isArchived()){
        Contentlet cont = APILocator.getContentletAPI().find(fa.getInode(), APILocator.getUserAPI().getSystemUser(), false);
        APILocator.getContentletAPI().copyContentlet(cont, newFolder, APILocator.getUserAPI().getSystemUser(), false);
        filesCopied.put(cont.getInode(), new IFileAsset[] {fa , APILocator.getFileAssetAPI().fromContentlet(cont)});
      }
    }

    // issues/1736
    APILocator.getContentletAPI().refreshContentUnderFolder(newFolder);

    // Copying links
    Map<String, Link[]> linksCopied;
    if (copiedObjects.get("Links") == null) {
      linksCopied = new HashMap<String, Link[]>();
      copiedObjects.put("Links", linksCopied);
    } else {
      linksCopied = (Map<String, Link[]>) copiedObjects.get("Links");
    }

    List links = getChildrenClass(source,Link.class);
    for (Link link : (List<Link>) links) {
      if (link.isWorking()) {
        Link newLink = LinkFactory.copyLink(link, newFolder);
        // Saving copied pages to update template - pages relationships
        // later
        linksCopied.put(link.getInode(), new Link[] { link, newLink });
      }
    }

    // Copying Inner Folders
    List childrenFolder = APILocator.getFolderAPI().findSubFolders(source,systemUser,false);
    for (Folder childFolder : (List<Folder>) childrenFolder) {
      copy(childFolder, newFolder, copiedObjects);
    }

  }

  protected void copy(Folder folder, Host destination) throws DotDataException, DotSecurityException, DotStateException, IOException {
    copy(folder, destination, null);
  }

  protected void copy(Folder folder, Folder destination) throws DotDataException, DotStateException, DotSecurityException, IOException {
    copy(folder, destination, null);
  }

  @SuppressWarnings("unchecked")
  private boolean folderContains(String name, Folder destination) throws DotStateException, DotDataException, DotSecurityException {
    List<Folder> children = APILocator.getFolderAPI().findSubFolders(destination,APILocator.getUserAPI().getSystemUser(),false);
    for (Folder folder : children) {
      if (folder.getName().equals(name))
        return true;
    }
    return false;
  }

  @SuppressWarnings("unchecked")
  private boolean move(Folder folder, Object destination) throws DotDataException, DotStateException, DotSecurityException {

    folder = (Folder) HibernateUtil.load(Folder.class, folder.getInode());
    IdentifierAPI identAPI = APILocator.getIdentifierAPI();
    Identifier folderId = identAPI.find(folder.getIdentifier());

        //Clean up the cache
        if ( folder.isShowOnMenu() ) {
            CacheLocator.getNavToolCache().removeNav( folder.getHostId(), folder.getInode() );
        }
        CacheLocator.getNavToolCache().removeNavByPath( folderId.getHostId(), folderId.getParentPath() );
        fc.removeFolder( folder, folderId );

    User systemUser = APILocator.getUserAPI().getSystemUser();
    boolean contains = false;
    String newParentPath;
    String newParentHostId;
    if (destination instanceof Folder) {
      contains = folderContains(folder.getName(), (Folder) destination);
      Identifier destinationId = identAPI.find(((Folder) destination).getIdentifier());
      newParentPath = destinationId.getPath();
      newParentHostId = destinationId.getHostId();
      if(!contains)
          CacheLocator.getNavToolCache().removeNavByPath(destinationId.getHostId(), destinationId.getPath());
    } else {
      contains = APILocator.getHostAPI().doesHostContainsFolder((Host) destination, folder.getName());
      newParentPath = "/";
      newParentHostId = ((Host)destination).getIdentifier();
      if(!contains)
          CacheLocator.getNavToolCache().removeNav(newParentHostId, FolderAPI.SYSTEM_FOLDER);
    }
    if (contains)
      return false;

    List<Folder> subFolders = getSubFolders(folder);
    List htmlPages = getChildrenClass(folder, HTMLPage.class);
    List files = getChildrenClass(folder, File.class);
    List links = getChildrenClass(folder, Link.class);
    List<Contentlet> contentlets = APILocator.getContentletAPI().findContentletsByFolder(folder, systemUser, false);


    folderId.setParentPath(newParentPath);
    folderId.setHostId(newParentHostId);
    identAPI.save(folderId);

    for (Object page : htmlPages) {
      APILocator.getHTMLPageAPI().movePage((HTMLPage) page, folder, systemUser, false);
    }

    for (Object file : files) {
      APILocator.getFileAPI().moveFile((File) file, folder, systemUser, false);
    }

    for (Object link : links) {
      if (((Link) link).isWorking()) {
        LinkFactory.moveLink((Link) link, folder);
      }
    }

    for(Contentlet cont : contentlets){
        if(cont.getStructure().getStructureType()==Structure.STRUCTURE_TYPE_FILEASSET) {
            APILocator.getFileAssetAPI().moveFile(cont, folder, systemUser, false);
        }
        else {
          boolean isLive = cont.isLive();
          cont.setFolder(folder.getInode());
          cont.setInode(null);
          Contentlet newCont = APILocator.getContentletAPI().checkin(cont, systemUser, false);
          if(isLive){
            APILocator.getContentletAPI().publish(newCont, systemUser, false);
          }
        }
    }

    for(Folder subFolder : subFolders){
      move(subFolder, (Object)folder);
    }

    CacheLocator.getIdentifierCache().removeFromCacheByIdentifier(folderId.getId());

    if(folder.isShowOnMenu())
      RefreshMenus.deleteMenu(folder);


    folder.setModDate(new Date());
    save(folder);

    return true;
  }

  /***
   * This methos update recursively the inner folders of the specified folder
   *
   * @param folder
   * @throws DotDataException
   * @throws DotStateException
   * @throws DotSecurityException
   */
  @SuppressWarnings("unchecked")
  private void moveRecursiveFolders(Folder oldFolder, Folder newFolder) throws DotStateException, DotDataException, DotSecurityException {
    Stack<Folder> innerFolders = new Stack();

    innerFolders.addAll(APILocator.getFolderAPI().findSubFolders(oldFolder, APILocator.getUserAPI().getSystemUser(), false));
    while (!innerFolders.empty()) {
      Folder nextFolder = innerFolders.pop();
      Host destinationHost = APILocator.getHostAPI().findParentHost(newFolder, APILocator.getUserAPI().getSystemUser(), false);
      String newPath = APILocator.getIdentifierAPI().find(newFolder).getPath()+nextFolder.getName()+"/";
      Folder nextNewFolder = APILocator.getFolderAPI().createFolders(newPath, destinationHost, APILocator.getUserAPI().getSystemUser(), false);

      List htmlPages = getChildrenClass(nextFolder, HTMLPage.class);
      List files = getChildrenClass(nextFolder,File.class);
      List links = getChildrenClass(nextFolder,Link.class);

      updateMovedFolderAssets(nextFolder, nextNewFolder, htmlPages, files, links);
      moveRecursiveFolders(nextFolder, nextNewFolder);
    }
  }

  /**
   * this method updates the asset info for the new paths
   *
   * @param theFolder
   *            the folder moved
   * @throws DotDataException
   * @throws DotSecurityException
   * @throws DotStateException
   */
  @SuppressWarnings({ "unchecked", "deprecation" })
  protected void updateMovedFolderAssets(Folder theFolder) throws DotDataException, DotStateException, DotSecurityException {

    User systemUser;
    Host newHost;
    try {
      systemUser = APILocator.getUserAPI().getSystemUser();
      newHost = APILocator.getHostAPI().findParentHost(theFolder, systemUser, false);
    } catch (DotDataException e) {
      Logger.error(FolderFactoryImpl.class, e.getMessage(), e);
      throw new DotRuntimeException(e.getMessage(), e);
    } catch (DotSecurityException e) {
      Logger.error(FolderFactoryImpl.class, e.getMessage(), e);
      throw new DotRuntimeException(e.getMessage(), e);
    }

    List htmlPages = getChildrenClass(theFolder,HTMLPage.class);
    for (HTMLPage page : (List<HTMLPage>) htmlPages) {
      Identifier identifier = APILocator.getIdentifierAPI().find(page);

      if (page.isWorking()) {
        // updating caches
        WorkingCache.removeAssetFromCache(page);
        CacheLocator.getIdentifierCache().removeFromCacheByVersionable(page);
      }

      if (page.isLive()) {
        LiveCache.removeAssetFromCache(page);
      }

      if (page.isWorking()) {
        // gets identifier for this webasset and changes the uri and
        // persists it
        identifier.setHostId(newHost.getIdentifier());
        identifier.setURI(page.getURI(theFolder));
        APILocator.getIdentifierAPI().save(identifier);
        CacheLocator.getIdentifierCache().removeFromCacheByIdentifier(identifier.getId());
      }

      // Add to Preview and Live Cache
      if (page.isLive()) {
        LiveCache.removeAssetFromCache(page);
        LiveCache.addToLiveAssetToCache(page);
      }
      if (page.isWorking()) {
        WorkingCache.removeAssetFromCache(page);
        WorkingCache.addToWorkingAssetToCache(page);
        CacheLocator.getIdentifierCache().removeFromCacheByVersionable(page);

      }

      // republishes the page to reset the VTL_SERVLETURI variable
      if (page.isLive()) {
        PageServices.invalidate(page);
      }

    }

    List<File> files = APILocator.getFolderAPI().getFiles(theFolder, systemUser, false);
    for (File file : files) {
      Identifier identifier = APILocator.getIdentifierAPI().find(file);

      // assets cache
      if (file.isLive())
        LiveCache.removeAssetFromCache(file);

      if (file.isWorking())
        WorkingCache.removeAssetFromCache(file);

      if (file.isWorking()) {
        // gets identifier for this webasset and changes the uri and
        // persists it
        identifier.setHostId(newHost.getIdentifier());
        identifier.setURI(file.getURI(theFolder));
        APILocator.getIdentifierAPI().save(identifier);
        CacheLocator.getIdentifierCache().removeFromCacheByIdentifier(identifier.getId());
      }

      // Add to Preview and Live Cache
      if (file.isLive()) {
        LiveCache.addToLiveAssetToCache(file);
      }
      if (file.isWorking())
        WorkingCache.addToWorkingAssetToCache(file);

    }
    List<FileAsset> fileAssets = APILocator.getFileAssetAPI().findFileAssetsByFolder(theFolder, APILocator.getUserAPI().getSystemUser(), false);
    for(FileAsset fa : fileAssets){
      Identifier identifier = APILocator.getIdentifierAPI().find(fa);
      Contentlet fileAssetCont = APILocator.getContentletAPI().find(fa.getInode(), APILocator.getUserAPI().getSystemUser(), false);

      // assets cache
      if (fileAssetCont.isLive())
        LiveCache.removeAssetFromCache(fa);

      if (fileAssetCont.isWorking())
        WorkingCache.removeAssetFromCache(fa);

      if (fileAssetCont.isWorking()) {
        // gets identifier for this webasset and changes the uri and
        // persists it
        identifier.setHostId(newHost.getIdentifier());
        Identifier folderIdentifier  = APILocator.getIdentifierAPI().find(theFolder);
        identifier.setParentPath(folderIdentifier.getPath());
        APILocator.getIdentifierAPI().save(identifier);
        CacheLocator.getIdentifierCache().removeFromCacheByIdentifier(identifier.getId());
      }

      // Add to Preview and Live Cache
      if (fileAssetCont.isLive()) {
        LiveCache.addToLiveAssetToCache(fileAssetCont);
      }
      if (fileAssetCont.isWorking())
        WorkingCache.addToWorkingAssetToCache(fileAssetCont);

    }

    List<Link> links = APILocator.getFolderAPI().getLinks(theFolder, systemUser, false);
    for (Link link : links) {
      if (link.isWorking()) {

        Identifier identifier = APILocator.getIdentifierAPI().find(link);

        // gets identifier for this webasset and changes the uri and
        // persists it
        identifier.setHostId(newHost.getIdentifier());
        identifier.setURI(link.getURI(theFolder));
        APILocator.getIdentifierAPI().save(identifier);
        CacheLocator.getIdentifierCache().removeFromCacheByIdentifier(identifier.getId());
      }

    }
  }

  /**
   * this method updates the asset info for the new paths
   *
   * @param oldFolder
   *            the folder moved
   * @throws DotDataException
   * @throws DotSecurityException
   * @throws DotStateException
   */
  @SuppressWarnings({ "unchecked", "deprecation" })
  private void updateMovedFolderAssets(Folder oldFolder, Folder newFolder, List<HTMLPage> htmlPages, List<File> files, List<Link> links)
      throws DotDataException, DotStateException, DotSecurityException {

    User systemUser;

    try {
      systemUser = APILocator.getUserAPI().getSystemUser();
    } catch (DotDataException e) {
      Logger.error(FolderFactoryImpl.class, e.getMessage(), e);
      throw new DotRuntimeException(e.getMessage(), e);
    }

    for (HTMLPage page : htmlPages) {
      APILocator.getHTMLPageAPI().movePage(page, newFolder, systemUser, false);
    }

    for (File file : files) {
      APILocator.getFileAPI().moveFile(file, newFolder, systemUser, false);
    }

    for (Link link : links) {
      if (link.isWorking()) {
        LinkFactory.moveLink(link, newFolder);
      }
    }

    List<FileAsset> fileAssets = APILocator.getFileAssetAPI().findFileAssetsByFolder(oldFolder, APILocator.getUserAPI().getSystemUser(), false);
    for(FileAsset fa : fileAssets){
      boolean appendCopyToFileName = false;
      Contentlet newFileAsset = APILocator.getContentletAPI().copyContentlet(fa, newFolder, systemUser, appendCopyToFileName, false);
      if(fa.isLive()){
        APILocator.getVersionableAPI().setLive(newFileAsset);
        LiveCache.addToLiveAssetToCache(newFileAsset);
      }
    }
  }

  protected boolean move(Folder folder, Folder destination) throws DotDataException, DotSecurityException {
    return move(folder, (Object) destination);
  }

  protected boolean move(Folder folder, Host destination) throws DotDataException, DotSecurityException {
    return move(folder, (Object) destination);
  }

  /**
   * Checks if folder1 is child of folder2
   *
   * @param folder1
   * @param folder2
   * @return
   * @throws DotDataException
   * @throws DotIdentifierStateException
   * @throws DotSecurityException
   */
  protected boolean isChildFolder(Folder folder1, Folder folder2) throws  DotDataException, DotSecurityException {
    Folder parentFolder = (Folder) APILocator.getFolderAPI().findParentFolder(folder1,APILocator.getUserAPI().getSystemUser(),false);
    if (parentFolder==null || !InodeUtils.isSet(parentFolder.getInode()))
      return false;
    else {
      if (parentFolder.getInode().equalsIgnoreCase(folder2.getInode())) {
        return true;
      }
      return isChildFolder(parentFolder, folder2);
    }
  }

  @Override
  protected boolean renameFolder(Folder folder, String newName, User user, boolean respectFrontEndPermissions) throws DotDataException, DotSecurityException {
    // checking if already exists
    Identifier ident = APILocator.getIdentifierAPI().loadFromDb(folder.getIdentifier());
    String newPath=ident.getParentPath()+newName;
    Host host = APILocator.getHostAPI().find(folder.getHostId(),user,respectFrontEndPermissions);
    Folder nFolder=findFolderByPath(newPath, host);
    if(UtilMethods.isSet(nFolder.getInode()) && !folder.getIdentifier().equals(nFolder.getIdentifier()))
      return false;

    CacheLocator.getIdentifierCache().removeFromCacheByVersionable(folder);
    CacheLocator.getFolderCache().removeFolder(folder, ident);

    final ArrayList<String> childIdents=new ArrayList<String>();
    DotConnect dc=new DotConnect();
    dc.setSQL("select id from identifier where parent_path like ? and host_inode=?");
    dc.addParam(ident.getPath()+"%");
    dc.addParam(ident.getHostId());
    for(Map<String,Object> rr : (List<Map<String,Object>>)dc.loadResults()) {
        childIdents.add((String)rr.get("id"));
    }
    HibernateUtil.addCommitListener(new Runnable() {
            public void run() {
                for(String id : childIdents) {
                    CacheLocator.getIdentifierCache().removeFromCacheByIdentifier(id);
                }
            }
    });

        Folder ff=(Folder) HibernateUtil.load(Folder.class, folder.getInode());
    ff.setName(newName);
    ff.setTitle(newName);
    ff.setModDate(new Date());

    save(ff);

    HibernateUtil.getSession().clear();

    return true;
  }

  protected boolean matchFilter(Folder folder, String fileName) {
    // return value
    Perl5Matcher p5m = new Perl5Matcher();
    Perl5Compiler p5c = new Perl5Compiler();
    boolean match = false;
    try {
      // Obtain the filters
      String filesMasks = folder.getFilesMasks();
      filesMasks = (filesMasks != null ? filesMasks.trim() : filesMasks);

      if (UtilMethods.isSet(filesMasks)) {
        String[] filesMasksArray = filesMasks.split(",");
        int length = filesMasksArray.length;

        // Try to match de filters
        for (int i = 0; i < length; i++) {
          String regex = filesMasksArray[i];
          regex = regex.replace(".", "\\.");
          regex = regex.replace("*", ".*");
          regex = "^" + regex.trim() + "$";
          Pattern pattern = p5c.compile(regex, Perl5Compiler.CASE_INSENSITIVE_MASK);
          match = match || p5m.matches(fileName, pattern);
          if (match) {
            break;
          }
        }
      } else {
        match = true;
      }
    } catch (Exception ex) {
      Logger.debug(FolderFactoryImpl.class, ex.toString());
    }
    return match;
  }

  /**
   * Gets the tree containing all the items in the list. If the item is a
   * folder, gets the files and folders contained by the folder. It is
   * executed recursively until reaching the depth specified. This method will
   * change later
   *
   * @param items
   * @param ids
   * @param level
   * @param counter
   * @param depth
   * @throws DotDataException
   */
  protected List getNavigationTree(List items, List<Integer> ids, int level, InternalCounter counter, int depth, User user)
      throws DotDataException {
    boolean show = true;
    StringBuffer sb = new StringBuffer();
    List v = new ArrayList<Object>();
    int internalCounter = counter.getCounter();
    String className = "class" + internalCounter;
    String id = "list" + internalCounter;
    ids.add(internalCounter);
    counter.setCounter(++internalCounter);

    sb.append("<ul id='" + id + "' >\n");
    Iterator itemsIter = items.iterator();
    while (itemsIter.hasNext()) {
      Permissionable item = (Permissionable) itemsIter.next();
      String title = "";
      String inode = "";
      if (item instanceof Folder) {
        Folder folder = ((Folder) item);
        title = folder.getTitle();
        title = retrieveTitle(title, user);
        inode = folder.getInode();
        if (folder.isShowOnMenu()) {
          if (!APILocator.getPermissionAPI().doesUserHavePermission(folder, PermissionAPI.PERMISSION_PUBLISH, user, false)) {
            show = false;
          }
          if (APILocator.getPermissionAPI().doesUserHavePermission(folder, PermissionAPI.PERMISSION_READ, user, false)) {

            sb.append("<li class=\"" + className + "\" id=\"inode_" + inode + "\" >\n" + title + "\n");
            List childs = getMenuItems(folder);
            if (childs.size() > 0) {

              int nextLevel = level + 1;

              if (depth > 1) {
                sb.append(getNavigationTree(childs, ids, nextLevel, counter, depth-1, user).get(0));
              }
            }
            sb.append("</li>\n");
          }
        }
      } else {
        if(item instanceof FileAsset){
          FileAsset fa =(FileAsset)item;
          title = fa.getTitle();
          title = retrieveTitle(title, user);
          inode = fa.getInode();
          if (fa.isShowOnMenu()) {
            if (!APILocator.getPermissionAPI().doesUserHavePermission(fa, PermissionAPI.PERMISSION_PUBLISH, user, false)) {
              show = false;
            }
            if (APILocator.getPermissionAPI().doesUserHavePermission(fa, PermissionAPI.PERMISSION_READ, user, false)) {
              sb.append("<li class=\"" + className + "\" id=\"inode_" + inode + "\" >" + title + "</li>\n");
            }
          }
        }else{
          WebAsset asset = ((WebAsset) item);
          title = asset.getTitle();
          title = retrieveTitle(title, user);
          inode = asset.getInode();
          if (asset.isShowOnMenu()) {
            if (!APILocator.getPermissionAPI().doesUserHavePermission(asset, PermissionAPI.PERMISSION_PUBLISH, user, false)) {
              show = false;
            }
            if (APILocator.getPermissionAPI().doesUserHavePermission(asset, PermissionAPI.PERMISSION_READ, user, false)) {
              sb.append("<li class=\"" + className + "\" id=\"inode_" + inode + "\" >" + title + "</li>\n");
            }
          }
        }
      }
    }
    sb.append("</ul>\n");
    v.add(sb);
    v.add(new Boolean(show));

    return v;
  }

  /**
   * Builds the navigation tree containing all the items in the list and the
   * files, HTML pages, links, folders contained recursively by those items
   * until the specified depth. This method will change later
   *
   * @param items
   * @param depth
   * @throws DotDataException
   */
  protected List<Object> buildNavigationTree(List items, int depth, User user) throws DotDataException {
    depth = depth - 1;
    int level = 0;
    List<Object> v = new ArrayList<Object>();
    InternalCounter counter = new FolderFactoryImpl().new InternalCounter();
    counter.setCounter(0);
    List<Integer> ids = new ArrayList<Integer>();
    List l = buildNavigationTree(items, ids, level, counter, depth, user);
    StringBuffer sb = new StringBuffer("");
    if (l != null && l.size() > 0) {
      sb = (StringBuffer) l.get(0);
      sb.append("<script language='javascript'>\n");
      for (int i = ids.size() - 1; i >= 0; i--) {
        int internalCounter = (Integer) ids.get(i);
        String id = "list" + internalCounter;
        String className = "class" + internalCounter;
        String sortCreate = "Sortable.create(\"" + id + "\",{dropOnEmpty:true,tree:true,constraint:false,only:\"" + className
            + "\"});\n";
        sb.append(sortCreate);
      }

      sb.append("\n");
      sb.append("function serialize(){\n");
      sb.append("var values = \"\";\n");
      for (int i = 0; i < ids.size(); i++) {
        int internalCounter = (Integer) ids.get(i);
        String id = "list" + internalCounter;
        String sortCreate = "values += \"&\" + Sortable.serialize('" + id + "');\n";
        sb.append(sortCreate);
      }
      sb.append("values = values.replace(/\\[/g, '__');\n");
      sb.append("values = values.replace(/\\]/g, '---');\n");
      sb.append("return values;\n");
      sb.append("}\n");

      sb.append("</script>\n");

      sb.append("<style>\n");
      for (int i = 0; i < ids.size(); i++) {
        int internalCounter = (Integer) ids.get(i);
        String className = "class" + internalCounter;
        String style = "li." + className + " { cursor: move;}\n";
        sb.append(style);
      }
      sb.append("</style>\n");
    }
    v.add(sb.toString());
    if (l != null && l.size() > 0) {
      v.add(l.get(1));
    } else {
      v.add(new Boolean(false));
    }

    return v;
  }

  /**
   * Builds the navigation tree containing all the items and the files, HTML
   * pages, links, folders contained recursively by those items in the list
   * until the specified depth. This method will change later
   *
   * @param items
   * @param ids
   * @param level
   * @param counter
   * @param depth
   * @throws DotDataException
   */
  protected List buildNavigationTree(List items, List<Integer> ids, int level, InternalCounter counter, int depth, User user)
      throws DotDataException {
    boolean show = true;
    StringBuffer sb = new StringBuffer();
    List v = new ArrayList<Object>();
    int internalCounter = counter.getCounter();
    String className = "class" + internalCounter;
    String id = "list" + internalCounter;
    ids.add(internalCounter);
    counter.setCounter(++internalCounter);

    sb.append("<ul id='" + id + "' >\n");
    if (items != null) {
      Iterator itemsIter = items.iterator();
      while (itemsIter.hasNext()) {
        Permissionable item = (Permissionable) itemsIter.next();
        String title = "";
        String inode = "";
        if (item instanceof Folder) {
          Folder folder = ((Folder) item);
          title = folder.getTitle();
          title = retrieveTitle(title, user);
          inode = folder.getInode();
          if (folder.isShowOnMenu()) {
            if (!APILocator.getPermissionAPI().doesUserHavePermission(folder, PermissionAPI.PERMISSION_PUBLISH, user, false)) {
              show = false;
            }
            if (APILocator.getPermissionAPI().doesUserHavePermission(folder, PermissionAPI.PERMISSION_READ, user, false)) {

              sb.append("<li class=\"" + className + "\" id=\"inode_" + inode + "\" >\n" + title + "\n");
              List childs = getMenuItems(folder);
              if (childs.size() > 0) {
                int nextLevel = level + 1;
                if (depth > 0) {
                  List<Object> l = getNavigationTree(childs, ids, nextLevel, counter, depth, user);
                  if (show) {
                    show = ((Boolean) l.get(1)).booleanValue();
                  }
                  sb.append((StringBuffer) (l.get(0)));
                }
              }
              sb.append("</li>\n");
            }
          }
        } else {
          if(item instanceof FileAsset){
            FileAsset fa =(FileAsset)item;
            title = fa.getTitle();
            title = retrieveTitle(title, user);
            inode = fa.getInode();
            if (fa.isShowOnMenu()) {
              if (!APILocator.getPermissionAPI().doesUserHavePermission(fa, PermissionAPI.PERMISSION_PUBLISH, user, false)) {
                show = false;
              }
              if (APILocator.getPermissionAPI().doesUserHavePermission(fa, PermissionAPI.PERMISSION_READ, user, false)) {
                sb.append("<li class=\"" + className + "\" id=\"inode_" + inode + "\" >" + title + "</li>\n");
              }
            }
          }else{
            WebAsset asset = ((WebAsset) item);
            title = asset.getTitle();
            title = retrieveTitle(title, user);
            inode = asset.getInode();
            if (asset.isShowOnMenu()) {
              if (!APILocator.getPermissionAPI().doesUserHavePermission(asset, PermissionAPI.PERMISSION_PUBLISH, user, false)) {
                show = false;
              }
              if (APILocator.getPermissionAPI().doesUserHavePermission(asset, PermissionAPI.PERMISSION_READ, user, false)) {
                sb.append("<li class=\"" + className + "\" id=\"inode_" + inode + "\" >" + title + "</li>\n");
              }
            }
          }
        }
      }
    }

    sb.append("</ul>\n");
    v.add(sb);
    v.add(new Boolean(show));

    return v;
  }

  private String retrieveTitle(String title, User user) {
    try {
      String regularExpressionString = "(.*)\\$glossary.get\\('(.*)'\\)(.*)";
      java.util.regex.Pattern pattern = java.util.regex.Pattern.compile(regularExpressionString);
      Matcher matcher = pattern.matcher(title);
      if (matcher.matches()) {
        String tempTitle = matcher.group(2);
        tempTitle = matcher.group(1) + LanguageUtil.get(user, tempTitle) + matcher.group(3);
        title = tempTitle;
      }
    } catch (Exception ex) {
      Logger.warn(FolderFactoryImpl.class, "retrieveTitle failed:" + ex);
    }
    return title;
  }

  private boolean isOpenNode(String[] openNodes, String node) {
    boolean returnValue = false;
    for (String actualNode : openNodes) {
      if (actualNode.equals(node)) {
        returnValue = true;
        break;
      }
    }
    return returnValue;
  }

  // http://jira.dotmarketing.net/browse/DOTCMS-3232
  protected Folder findSystemFolder() throws DotDataException {
    Folder folder = new Folder();
    folder = fc.getFolder(FolderAPI.SYSTEM_FOLDER);
    if (folder!=null && folder.getInode().equalsIgnoreCase(FolderAPI.SYSTEM_FOLDER)) {
      return folder;
    } else {
      folder = find(FolderAPI.SYSTEM_FOLDER);
    }
    if (UtilMethods.isSet(folder.getInode()) && folder.getInode().equalsIgnoreCase(FolderAPI.SYSTEM_FOLDER)) {
      fc.addFolder(folder,APILocator.getIdentifierAPI().find(folder.getIdentifier()));
      return folder;
    } else {
      DotConnect dc = new DotConnect();
      Folder folder1 = new Folder();
      String hostInode = "";
      folder1.setInode(FolderAPI.SYSTEM_FOLDER);
      folder1.setName("system folder");
      folder1.setTitle("System folder");
      try {
        hostInode = APILocator.getHostAPI().findSystemHost(APILocator.getUserAPI().getSystemUser(), true).getIdentifier();
      } catch (DotSecurityException e) {
        Logger.error(FolderFactoryImpl.class, e.getMessage(), e);
        throw new DotDataException(e.getMessage(), e);
      }
      folder1.setFilesMasks("");
      folder1.setSortOrder(0);
      folder1.setShowOnMenu(false);

      String IdentifierQuery = "INSERT INTO IDENTIFIER(ID,PARENT_PATH,ASSET_NAME,HOST_INODE,ASSET_TYPE) VALUES(?,?,?,?,?)";
      String uuid = UUIDGenerator.generateUuid();
      dc.setSQL(IdentifierQuery);
      dc.addParam(uuid);
      dc.addParam("/System folder");
      dc.addParam(folder1.getName());
      dc.addParam(hostInode);
      dc.addParam(folder1.getType());
      dc.loadResult();

      String InodeQuery = "INSERT INTO INODE(INODE, OWNER, IDATE, TYPE) VALUES (?,null,?,?)";
      dc.setSQL(InodeQuery);
      dc.addParam(folder1.getInode());
      dc.addParam(folder1.getiDate());
      dc.addParam(folder1.getType());
      dc.loadResult();
      String hostQuery = "INSERT INTO FOLDER(INODE, NAME,TITLE, SHOW_ON_MENU, SORT_ORDER,FILES_MASKS,IDENTIFIER) VALUES (?,?,?,?,?,?,?,?)";
      dc.setSQL(hostQuery);
      dc.addParam(folder1.getInode());
      dc.addParam(folder1.getName());
      dc.addParam(folder1.getTitle());
      dc.addParam(folder1.isShowOnMenu());
      dc.addParam(folder1.getSortOrder());
      dc.addParam(folder1.getFilesMasks());
      dc.addParam(uuid);
      dc.loadResult();
      fc.addFolder(folder1,APILocator.getIdentifierAPI().find(folder1.getIdentifier()));
      return folder1;
    }
  }

  @SuppressWarnings("unchecked")
  protected List<Folder> findFoldersByHost(Host host) throws DotHibernateException {
    HibernateUtil dh = new HibernateUtil(Folder.class);
    dh.setSQLQuery("SELECT {folder.*} from folder folder,identifier ident, inode folder_1_ where folder_1_.inode = folder.inode "
          + "and folder.identifier = ident.id and ident.host_inode = ? and ident.parent_path='/' order by folder.title");
    dh.setParam(host.getIdentifier());
    List<Folder> folderList=dh.list();
    Collections.sort(folderList,new Comparator<Folder>() {
        public int compare(Folder o1, Folder o2) {
            return o1.getName().compareToIgnoreCase(o2.getName());
        }
        });
    return folderList;
  }

  @SuppressWarnings("unchecked")
  protected List<Folder> findThemesByHost(Host host) throws DotHibernateException {
    HibernateUtil dh = new HibernateUtil(Folder.class);
    dh.setSQLQuery("SELECT {folder.*} from folder folder,identifier ident, inode folder_1_ where folder_1_.inode = folder.inode "
          + "and folder.identifier = ident.id and ident.host_inode = ? and ident.parent_path='/application/themes/' order by folder.title");
    dh.setParam(host.getIdentifier());
    List<Folder> folderList=dh.list();
    Collections.sort(folderList,new Comparator<Folder>() {
        public int compare(Folder o1, Folder o2) {
            return o1.getName().compareToIgnoreCase(o2.getName());
        }
        });
    return folderList;
  }

  protected Identifier createIdentifierForFolder(Folder folder, String parentPath) throws DotDataException {
    Identifier identifier = new Identifier();
    if (InodeUtils.isSet(folder.getIdentifier())) {
      try {
        identifier = APILocator.getIdentifierAPI().find(folder.getIdentifier());
      } catch (Exception e) {
        Logger.error(FolderFactoryImpl.class, e.getMessage(), e);
        throw new DotRuntimeException(e.getMessage(), e);
      }
    }
    identifier.setAssetType(folder.getType());
    identifier.setAssetName(folder.getName());
    identifier.setHostId(folder.getHostId());
    if(InodeUtils.isSet(folder.getIdentifier())){
      identifier.setParentPath(APILocator.getIdentifierAPI().find(folder).getParentPath()+ folder.getName() + "/");
    }else{
      if(parentPath==null)
        identifier.setParentPath("/");
      else
        identifier.setParentPath(parentPath);
    }
    APILocator.getIdentifierAPI().save(identifier);
    CacheLocator.getIdentifierCache().removeFromCacheByVersionable(folder);

    return identifier;
  }

  protected List<Treeable> getChildrenClass(Folder parent, Class clazz) throws DotStateException, DotDataException {
    return getChildrenClass(parent, clazz, null, null, 0, 1000);
  }

    protected List<Treeable> getChildrenClass ( Host host, Class clazz ) throws DotStateException, DotDataException {
        Identifier identifier = APILocator.getIdentifierAPI().find( host.getIdentifier() );
        return getChildrenClass( identifier, clazz, null, null, 0, 1000 );
    }

    protected List<Treeable> getChildrenClass ( Host host, Class clazz, ChildrenCondition cond ) throws DotStateException, DotDataException {
        Identifier identifier = APILocator.getIdentifierAPI().find( host.getIdentifier() );
        return getChildrenClass( identifier, clazz, cond, null, 0, 1000 );
    }

    protected List<Treeable> getChildrenClass ( Folder parent, Class clazz, ChildrenCondition cond ) throws DotStateException, DotDataException {
        return getChildrenClass( parent, clazz, cond, null, 0, 1000 );
    }

    protected List<Treeable> getChildrenClass ( Folder parent, Class clazz, ChildrenCondition condition, String orderby ) throws DotStateException,
            DotDataException {
        return getChildrenClass( parent, clazz, condition, orderby, 0, 1000 );
    }

    protected List<Treeable> getChildrenClass ( Folder parent, Class clazz, ChildrenCondition cond, String orderBy, int offset, int limit ) throws DotStateException, DotDataException {
        Identifier identifier = APILocator.getIdentifierAPI().find( parent.getIdentifier() );
        return getChildrenClass( identifier, clazz, cond, orderBy, offset, limit );
    }

    protected List<Treeable> getChildrenClass ( Identifier identifier, Class clazz, ChildrenCondition cond, String orderBy, int offset, int limit ) throws DotStateException, DotDataException {

        String tableName;

        try {
            Object obj;
            obj = clazz.newInstance();

            if ( obj instanceof Treeable ) {
                tableName = ((Treeable) obj).getType();
            } else {
                throw new DotStateException( "Unable to getType for child asset" );
            }
        } catch ( InstantiationException e ) {
            throw new DotStateException( "Unable to getType for child asset" );
        } catch ( IllegalAccessException e ) {
            throw new DotStateException( "Unable to getType for child asset" );
        }

        String versionTable = UtilMethods.getVersionInfoTableName( tableName );

        HibernateUtil dh = new HibernateUtil( clazz );
        String sql = "SELECT {" + tableName + ".*} " + " from " + tableName + " " + tableName + ",  inode " + tableName
                + "_1_, identifier " + tableName + "_2_ ";

        if ( cond != null && versionTable != null && (cond.deleted != null || cond.working != null || cond.live != null) )
            sql += ", " + versionTable;

        sql += " where " + tableName + "_2_.parent_path = ? " + " and " + tableName
                + ".identifier = " + tableName + "_2_.id " + " and " + tableName + "_1_.inode = " + tableName + ".inode " + " and ";

        if ( cond != null && cond.deleted != null )
            if ( versionTable != null )
                sql += versionTable + ".deleted=" + ((cond.deleted) ? DbConnectionFactory.getDBTrue() : DbConnectionFactory.getDBFalse()) + " and ";
            else
                sql += " deleted=" + ((cond.deleted) ? DbConnectionFactory.getDBTrue() : DbConnectionFactory.getDBFalse()) + " and ";

        if ( cond != null && cond.working != null )
            if ( versionTable != null )
                sql += versionTable + ".working_inode" + (cond.working ? "=" : "<>") + tableName + "_1_.inode and ";
            else
                sql += " working=" + ((cond.working) ? DbConnectionFactory.getDBTrue() : DbConnectionFactory.getDBFalse()) + " and ";

        if ( cond != null && cond.live != null )
            if ( versionTable != null )
                sql += versionTable + ".live_inode" + (cond.live ? "=" : "<>") + tableName + "_1_.inode and ";
            else
                sql += " live=" + ((cond.live) ? DbConnectionFactory.getDBTrue() : DbConnectionFactory.getDBFalse()) + " and ";

        sql += tableName + "_1_.type = '" + tableName + "' " + " and " + tableName + "_2_.host_inode = ? ";

        if ( cond != null && cond.showOnMenu != null )
            sql += " and " + tableName + ".show_on_menu=" + (cond.showOnMenu ? DbConnectionFactory.getDBTrue() : DbConnectionFactory.getDBFalse());

        if ( orderBy != null ) {
            sql = sql + " order by " + orderBy;
        }

        dh.setSQLQuery( sql );
        dh.setFirstResult( offset );
        dh.setMaxResults( limit );
        if ( identifier.getHostId().equals( Host.SYSTEM_HOST ) ) {
            dh.setParam( "/" );
            dh.setParam( identifier.getId() );
        } else {
            dh.setParam( identifier.getURI() + "/" );
            dh.setParam( identifier.getHostId() );
        }

        return dh.list();
    }

  private class InternalCounter
  {
    private int counter;

    public int getCounter()
    {
      return counter;
    }

    public void setCounter(int counter)
    {
      this.counter = counter;
    }
  }


  @Override
  protected void save(Folder folderInode) throws DotDataException {
    HibernateUtil.saveOrUpdate(folderInode);
  }

  @Override
  protected void save(Folder folderInode, String existingId) throws DotDataException {
    if(existingId==null){
      Folder folderToSave = folderInode;
      if(UtilMethods.isSet(folderInode.getInode())) {
        folderToSave = (Folder) new HibernateUtil(Folder.class).load(folderInode.getInode());
        try{
          BeanUtils.copyProperties(folderToSave, folderInode);
        }
        catch (Exception e) {
          throw new DotDataException(e.getMessage(), e);
        }
      }
      HibernateUtil.saveOrUpdate(folderToSave);
      fc.removeFolder(folderToSave, APILocator.getIdentifierAPI().find(folderToSave.getIdentifier()));
    }else{
      folderInode.setInode(existingId);
      HibernateUtil.saveWithPrimaryKey(folderInode, existingId);
    }
  }

}
TOP

Related Classes of com.dotmarketing.portlets.folders.business.FolderFactoryImpl$InternalCounter

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.