client/ftpd/src/se/lu/thep/coreftpd/ftp_server/MyLS.java

Code
Comments
Other
Rev Date Author Line
741 10 Oct 06 olle 1 /*
1652 22 May 07 gregory 2  $Id$
741 10 Oct 06 olle 3
1916 31 Aug 07 jari 4  Copyright (C) 2006 Olle Mansson
1916 31 Aug 07 jari 5  Copyright (C) 2007 Gregory Vincic, Olle Mansson
741 10 Oct 06 olle 6
1652 22 May 07 gregory 7  This file is part of Proteios.
1652 22 May 07 gregory 8  Available at http://www.proteios.org/
741 10 Oct 06 olle 9
1652 22 May 07 gregory 10  Proteios is free software; you can redistribute it and/or modify it
1652 22 May 07 gregory 11  under the terms of the GNU General Public License as published by
1652 22 May 07 gregory 12  the Free Software Foundation; either version 2 of the License, or
1652 22 May 07 gregory 13  (at your option) any later version.
741 10 Oct 06 olle 14
1652 22 May 07 gregory 15  Proteios is distributed in the hope that it will be useful, but
1652 22 May 07 gregory 16  WITHOUT ANY WARRANTY; without even the implied warranty of
1652 22 May 07 gregory 17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1652 22 May 07 gregory 18  General Public License for more details.
741 10 Oct 06 olle 19
1652 22 May 07 gregory 20  You should have received a copy of the GNU General Public License
1652 22 May 07 gregory 21  along with this program; if not, write to the Free Software
1652 22 May 07 gregory 22  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
1652 22 May 07 gregory 23  02111-1307, USA.
1652 22 May 07 gregory 24  */
741 10 Oct 06 olle 25 //  Xerver Free Web Server
741 10 Oct 06 olle 26 //  Copyright (C) 2002-2005 Omid Rouhani
741 10 Oct 06 olle 27 //
741 10 Oct 06 olle 28 //
741 10 Oct 06 olle 29 //  This program is free software; you can redistribute it and/or
741 10 Oct 06 olle 30 //  modify it under the terms of the GNU General Public License
741 10 Oct 06 olle 31 //  as published by the Free Software Foundation; either version 2
741 10 Oct 06 olle 32 //  of the License, or (at your option) any later version.
741 10 Oct 06 olle 33 //
741 10 Oct 06 olle 34 //  This program is distributed in the hope that it will be useful,
741 10 Oct 06 olle 35 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
741 10 Oct 06 olle 36 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
741 10 Oct 06 olle 37 //  GNU General Public License for more details.
741 10 Oct 06 olle 38 //
741 10 Oct 06 olle 39 //  You should have received a copy of the GNU General Public License
741 10 Oct 06 olle 40 //  along with this program; if not, write to the Free Software
741 10 Oct 06 olle 41 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
741 10 Oct 06 olle 42 //
741 10 Oct 06 olle 43 //
741 10 Oct 06 olle 44 //  #############################################################
741 10 Oct 06 olle 45 //  ##  YOU CAN CONTACT THE AUTHOR (OMID ROUHANI) AT:          ##
741 10 Oct 06 olle 46 //  ##  HTTP://WWW.JAVASCRIPT.NU/XERVER/                       ##
741 10 Oct 06 olle 47 //  ##                                                         ##
741 10 Oct 06 olle 48 //  ##  IF YOUR SOFTWARE IS NOT RELEASED UNDER THE             ##
741 10 Oct 06 olle 49 //  ##  GNU GENERAL PUBLIC LICENSE (GPL),                      ##
741 10 Oct 06 olle 50 //  ##  PLEASE DO NOT COPY ANYTHING FROM THIS SOURCE CODE!!!   ##
741 10 Oct 06 olle 51 //  ##                                                         ##
741 10 Oct 06 olle 52 //  ##  FOR FULL LICENSE, PLEASE READ "XERVER LICENSE".        ##
741 10 Oct 06 olle 53 //  #############################################################
1652 22 May 07 gregory 54 package se.lu.thep.coreftpd.ftp_server;
741 10 Oct 06 olle 55
790 23 Oct 06 olle 56 import org.proteios.core.DbControl;
931 16 Nov 06 olle 57 import org.proteios.core.Include;
1656 22 May 07 gregory 58 import org.proteios.core.ItemFactory;
790 23 Oct 06 olle 59 import org.proteios.core.ItemQuery;
790 23 Oct 06 olle 60 import org.proteios.core.ItemResultList;
1216 18 Feb 07 gregory 61 import org.proteios.core.Path.Type;
3469 02 Nov 09 olle 62 import org.proteios.core.Project;
3458 23 Oct 09 olle 63 import org.proteios.core.QueryFactory;
1676 25 May 07 olle 64 import org.proteios.core.SessionControl;
3458 23 Oct 09 olle 65 import org.proteios.core.query.Expressions;
3458 23 Oct 09 olle 66 import org.proteios.core.query.Hql;
3458 23 Oct 09 olle 67 import org.proteios.core.query.Restrictions;
791 23 Oct 06 olle 68 import se.lu.thep.coreftpd.common.MyGregorianCalendar;
791 23 Oct 06 olle 69 import se.lu.thep.coreftpd.common.MyString;
791 23 Oct 06 olle 70 import se.lu.thep.coreftpd.webserver.PathInfo;
741 10 Oct 06 olle 71 import java.io.DataOutputStream;
741 10 Oct 06 olle 72 import java.io.File;
3458 23 Oct 09 olle 73 import java.util.ArrayList;
741 10 Oct 06 olle 74 import java.util.Arrays;
1650 21 May 07 olle 75 import java.util.Date;
741 10 Oct 06 olle 76 import java.util.GregorianCalendar;
3458 23 Oct 09 olle 77 import java.util.List;
741 10 Oct 06 olle 78
741 10 Oct 06 olle 79 /**
1652 22 May 07 gregory 80  * <B>About this class:</B> <BR>
741 10 Oct 06 olle 81  * This is doing a directory listing with the format used by DIR in MS-DOS.
1652 22 May 07 gregory 82  * 
741 10 Oct 06 olle 83  * @author <a href="http://www.JavaScript.nu/xerver/" TARGET="_top">Omid Rouhani</a>
741 10 Oct 06 olle 84  * @version 1.0
741 10 Oct 06 olle 85  */
1656 22 May 07 gregory 86 final public class MyLS
1656 22 May 07 gregory 87 {
3469 02 Nov 09 olle 88   public static final String coreSeparator = FTPNewConnection.coreSeparator;
3469 02 Nov 09 olle 89   public static final String sharedProjectsFolderName = FTPNewConnection.sharedProjectsFolderName;
1652 22 May 07 gregory 90   private File f_folder;
741 10 Oct 06 olle 91   private String s_path;
1652 22 May 07 gregory 92   private boolean isValidDirectory = false;
1652 22 May 07 gregory 93   private final static boolean b_showErrors = false;
931 16 Nov 06 olle 94   /*
931 16 Nov 06 olle 95    * Instance variables not in original Xerver code.
931 16 Nov 06 olle 96    */
1676 25 May 07 olle 97   private SessionControl sc = null;
1652 22 May 07 gregory 98   private org.proteios.core.Directory coreDir = null;
1652 22 May 07 gregory 99   private org.proteios.core.File coreFile = null;
3469 02 Nov 09 olle 100   private boolean inSharedProjectsFolder = false;
4047 01 Dec 10 olle 101   private boolean textBasedFTPClientType = false;
790 23 Oct 06 olle 102   /**
790 23 Oct 06 olle 103    * Logger used. Used to log specific events.
790 23 Oct 06 olle 104    */
790 23 Oct 06 olle 105   private static final org.apache.log4j.Logger log = org.apache.log4j.LogManager
1656 22 May 07 gregory 106     .getLogger("se.lu.thep.coreftpd.ftp_server");
790 23 Oct 06 olle 107
1656 22 May 07 gregory 108
1676 25 May 07 olle 109   /**
3469 02 Nov 09 olle 110    * Get inSharedProjectsFolder flag.
3469 02 Nov 09 olle 111    * 
3469 02 Nov 09 olle 112    * @return boolean True if in shared projects folder, else false.
3469 02 Nov 09 olle 113    */
3469 02 Nov 09 olle 114   public boolean isInSharedProjectsFolder()
3469 02 Nov 09 olle 115   {
3469 02 Nov 09 olle 116     return this.inSharedProjectsFolder;
3469 02 Nov 09 olle 117   }
3469 02 Nov 09 olle 118
3469 02 Nov 09 olle 119
3469 02 Nov 09 olle 120   /**
3469 02 Nov 09 olle 121    * Set inSharedProjectsFolder flag.
3469 02 Nov 09 olle 122    * 
3469 02 Nov 09 olle 123    * @param inSharedProjectsFolder The inSharedProjectsFolder flag to set.
3469 02 Nov 09 olle 124    */
3469 02 Nov 09 olle 125   public void setInSharedProjectsFolder(boolean inSharedProjectsFolder)
3469 02 Nov 09 olle 126   {
3469 02 Nov 09 olle 127     this.inSharedProjectsFolder = inSharedProjectsFolder;
3469 02 Nov 09 olle 128   }
3469 02 Nov 09 olle 129
3469 02 Nov 09 olle 130
3469 02 Nov 09 olle 131   /**
4047 01 Dec 10 olle 132    * Get flag indicating a text-based FTP client type.
4047 01 Dec 10 olle 133    * 
4047 01 Dec 10 olle 134    * @return textBasedFTPClientType boolean Flag indicating a text-based FTP client type.
4047 01 Dec 10 olle 135    */
4047 01 Dec 10 olle 136   public boolean isTextBasedFTPClientType()
4047 01 Dec 10 olle 137   {
4047 01 Dec 10 olle 138     return this.textBasedFTPClientType;
4047 01 Dec 10 olle 139   }
4047 01 Dec 10 olle 140   
4047 01 Dec 10 olle 141
4047 01 Dec 10 olle 142   /**
4047 01 Dec 10 olle 143    * Set flag indicating a text-based FTP client type.
4047 01 Dec 10 olle 144    * 
4047 01 Dec 10 olle 145    * @param textBasedFTPClientType boolean Flag to set indicating a text-based FTP client type.
4047 01 Dec 10 olle 146    */
4047 01 Dec 10 olle 147   public void setTextBasedFTPClientType(boolean textBasedFTPClientType)
4047 01 Dec 10 olle 148   {
4047 01 Dec 10 olle 149     this.textBasedFTPClientType = textBasedFTPClientType;
4047 01 Dec 10 olle 150   }
4047 01 Dec 10 olle 151
4047 01 Dec 10 olle 152   
4047 01 Dec 10 olle 153   /**
1676 25 May 07 olle 154    * Get the SessionControl object.
1676 25 May 07 olle 155    * 
1676 25 May 07 olle 156    * @return the SessionControl object
1676 25 May 07 olle 157    */
1676 25 May 07 olle 158   public SessionControl getSessionControl() {
1676 25 May 07 olle 159     return this.sc;
1676 25 May 07 olle 160   }
1676 25 May 07 olle 161
1676 25 May 07 olle 162
1676 25 May 07 olle 163   /**
1676 25 May 07 olle 164    * Set the SessionControl object.
1676 25 May 07 olle 165    * 
1676 25 May 07 olle 166    * @param sc the SessionControl object to set.
1676 25 May 07 olle 167    */
1676 25 May 07 olle 168   public void setSessionControl(SessionControl sc) {
1676 25 May 07 olle 169     this.sc = sc;
1676 25 May 07 olle 170   }
1676 25 May 07 olle 171
1676 25 May 07 olle 172
4047 01 Dec 10 olle 173   public MyLS(String argPath, SessionControl newSc, boolean textBasedFTPClientTypeInput)
1656 22 May 07 gregory 174   {
790 23 Oct 06 olle 175     // *** Debug Info
3469 02 Nov 09 olle 176     log.info("MyLS::MyLS(): Start - argPath = \"" + argPath + "\" isInSharedProjectsFolder() = " +  isInSharedProjectsFolder());
3469 02 Nov 09 olle 177     // Check if path corresponds to shared projects folder
3469 02 Nov 09 olle 178     if (pathIsSharedProjectsFolder(argPath))
3469 02 Nov 09 olle 179     {
3469 02 Nov 09 olle 180       setInSharedProjectsFolder(true);
3469 02 Nov 09 olle 181       argPath = fetchHomeDirectoryPath(argPath);
3469 02 Nov 09 olle 182     }
3469 02 Nov 09 olle 183     log.info("MyLS::MyLS(): argPath = \"" + argPath + "\"");
1652 22 May 07 gregory 184     s_path = argPath;
4047 01 Dec 10 olle 185     setTextBasedFTPClientType(textBasedFTPClientTypeInput);
4047 01 Dec 10 olle 186     log.info("MyLS::MyLS(): isTextBasedFTPClientType() = " + isTextBasedFTPClientType());
1676 25 May 07 olle 187     setSessionControl(newSc);
1652 22 May 07 gregory 188     // f_folder=new File(s_path);
1652 22 May 07 gregory 189     // if (f_folder.isDirectory())
1652 22 May 07 gregory 190     // isValidDirectory=true;
790 23 Oct 06 olle 191     boolean pathIsValidCoreDirectory = false;
931 16 Nov 06 olle 192     /*
1652 22 May 07 gregory 193      * When checking for a valid core directory in the constructor, we
1652 22 May 07 gregory 194      * ignore if the directory is tagged as removed.
931 16 Nov 06 olle 195      */
1680 25 May 07 olle 196     DbControl dc = getSessionControl().newDbControl();
1656 22 May 07 gregory 197     ItemFactory factory = new ItemFactory(dc);
931 16 Nov 06 olle 198     pathIsValidCoreDirectory = isValidCoreDirectory(s_path, true);
1656 22 May 07 gregory 199     log
1656 22 May 07 gregory 200       .info("MyLS::MyLS(): pathIsValidCoreDirectory = " + pathIsValidCoreDirectory);
1656 22 May 07 gregory 201     if (pathIsValidCoreDirectory)
1656 22 May 07 gregory 202     {
790 23 Oct 06 olle 203       /*
790 23 Oct 06 olle 204        * Path equals directory.
790 23 Oct 06 olle 205        */
1652 22 May 07 gregory 206       org.proteios.core.Path coreDirPath = new org.proteios.core.Path(
1656 22 May 07 gregory 207         s_path, Type.DIRECTORY);
1656 22 May 07 gregory 208       try
1656 22 May 07 gregory 209       {
1656 22 May 07 gregory 210         coreDir = factory.getByPath(coreDirPath);
790 23 Oct 06 olle 211         /*
790 23 Oct 06 olle 212          * If no exceptions, core directory is valid.
790 23 Oct 06 olle 213          */
790 23 Oct 06 olle 214         isValidDirectory = true;
2845 12 Sep 08 olle 215         
2845 12 Sep 08 olle 216         /*
2845 12 Sep 08 olle 217          * If core directory is the home directory, deactivate any active project
2845 12 Sep 08 olle 218          */
2845 12 Sep 08 olle 219         log
2845 12 Sep 08 olle 220           .info("MyLS::MyLS(): coreDir.isHomeDirectory() = " + coreDir.isHomeDirectory());
2845 12 Sep 08 olle 221         if (coreDir.isHomeDirectory())
2845 12 Sep 08 olle 222         {
4047 01 Dec 10 olle 223           log.info("MyLS::MyLS(): isTextBasedFTPClientType() = " + isTextBasedFTPClientType());
4047 01 Dec 10 olle 224           if (isTextBasedFTPClientType())
4047 01 Dec 10 olle 225           {
4047 01 Dec 10 olle 226             getSessionControl().setActiveProject(null);
4047 01 Dec 10 olle 227             log.info("MyLS::MyLS(): getSessionControl().setActiveProject(null)");
4047 01 Dec 10 olle 228           }
2845 12 Sep 08 olle 229         }
2845 12 Sep 08 olle 230
2845 12 Sep 08 olle 231         /*
2845 12 Sep 08 olle 232          * If core directory is a project directory, make project active
2845 12 Sep 08 olle 233          */
2845 12 Sep 08 olle 234         log
2845 12 Sep 08 olle 235           .info("MyLS::MyLS(): coreDir.isProjectDirectory() = " + coreDir.isProjectDirectory());
2845 12 Sep 08 olle 236         if (coreDir.isProjectDirectory())
2845 12 Sep 08 olle 237         {
2845 12 Sep 08 olle 238           org.proteios.core.Project project = coreDir.getProjectDirectoryProject();
2845 12 Sep 08 olle 239           if (project != null)
2845 12 Sep 08 olle 240           {
2845 12 Sep 08 olle 241             getSessionControl().setActiveProject(project);
4046 01 Dec 10 olle 242             log.info("MyLS::MyLS(): getSessionControl().setActiveProject(project id = " + project.getId() + ")");
2845 12 Sep 08 olle 243           }
2845 12 Sep 08 olle 244           log
2845 12 Sep 08 olle 245             .info("MyLS::MyLS(): project = " + project);
2845 12 Sep 08 olle 246         }
1656 22 May 07 gregory 247       }
1656 22 May 07 gregory 248       catch (Exception e)
1656 22 May 07 gregory 249       {
1652 22 May 07 gregory 250         log
1656 22 May 07 gregory 251           .info("MyLS::MyLS(): Exception when trying to get coreDir from path: " + e);
790 23 Oct 06 olle 252       }
1656 22 May 07 gregory 253       log
1656 22 May 07 gregory 254         .info("MyLS::MyLS(): coreDir.getName() = \"" + coreDir
1656 22 May 07 gregory 255           .getName() + "\"");
2845 12 Sep 08 olle 256       log
2845 12 Sep 08 olle 257         .info("MyLS::MyLS(): getSessionControl().getActiveProjectId() = " + getSessionControl().getActiveProjectId());
1656 22 May 07 gregory 258     }
1656 22 May 07 gregory 259     else
1656 22 May 07 gregory 260     {
790 23 Oct 06 olle 261       /*
790 23 Oct 06 olle 262        * Path equals file.
790 23 Oct 06 olle 263        */
790 23 Oct 06 olle 264       log.info("MyLS::MyLS(): Trying to get coreFilePath");
1652 22 May 07 gregory 265       org.proteios.core.Path coreFilePath = new org.proteios.core.Path(
1656 22 May 07 gregory 266         s_path, Type.FILE);
1656 22 May 07 gregory 267       log
1656 22 May 07 gregory 268         .info("MyLS::MyLS(): coreFilePath.toString() = \"" + coreFilePath
1656 22 May 07 gregory 269           .toString() + "\"");
1656 22 May 07 gregory 270       try
1656 22 May 07 gregory 271       {
790 23 Oct 06 olle 272         log.info("MyLS::MyLS(): Trying to get coreFile");
1656 22 May 07 gregory 273         coreFile = factory.getByPath(coreFilePath, false);
1656 22 May 07 gregory 274         log.info("MyLS::MyLS(): coreFile.toString() = \"" + coreFile
1656 22 May 07 gregory 275           .toString() + "\"");
790 23 Oct 06 olle 276         /*
790 23 Oct 06 olle 277          * If no exceptions, core file is valid.
790 23 Oct 06 olle 278          */
790 23 Oct 06 olle 279         isValidDirectory = false;
1656 22 May 07 gregory 280       }
1656 22 May 07 gregory 281       catch (Exception e)
1656 22 May 07 gregory 282       {
1652 22 May 07 gregory 283         log
1656 22 May 07 gregory 284           .info("MyLS::MyLS(): Exception when trying to get coreFile from path: " + e);
790 23 Oct 06 olle 285       }
3464 26 Oct 09 olle 286       if (coreFile != null)
3464 26 Oct 09 olle 287       {
3464 26 Oct 09 olle 288         log.info("MyLS::MyLS(): coreFile.getName() = \"" + coreFile
3464 26 Oct 09 olle 289           .getName() + "\"");
3464 26 Oct 09 olle 290       }
3469 02 Nov 09 olle 291       else
3469 02 Nov 09 olle 292       {
3469 02 Nov 09 olle 293         log.info("MyLS::MyLS(): Unable to get either valid core directory or core file from path \"" + s_path + "\"");
3469 02 Nov 09 olle 294         // Try to get home directory path
3469 02 Nov 09 olle 295         String homePath = fetchHomeDirectoryPath(s_path);
3469 02 Nov 09 olle 296         log.info("MyLS::MyLS(): s_path = \"" + s_path + "\" homePath = \"" + homePath + "\"");
3469 02 Nov 09 olle 297         if (homePath != null)
3469 02 Nov 09 olle 298         {
3469 02 Nov 09 olle 299           // Try to get home directory from path
3469 02 Nov 09 olle 300           try
3469 02 Nov 09 olle 301           {
3469 02 Nov 09 olle 302             org.proteios.core.Path coreDirPath = new org.proteios.core.Path(
3469 02 Nov 09 olle 303               homePath, Type.DIRECTORY);
3469 02 Nov 09 olle 304             coreDir = factory.getByPath(coreDirPath);
3469 02 Nov 09 olle 305             log.info("MyLS::MyLS(): homePath = \"" + homePath + "\" coreDir = " + coreDir);
3469 02 Nov 09 olle 306             // If core directory is the home directory, deactivate any active project
3469 02 Nov 09 olle 307             log.info("MyLS::MyLS(): coreDir.isHomeDirectory() = " + coreDir.isHomeDirectory());
3469 02 Nov 09 olle 308             if (coreDir.isHomeDirectory())
3469 02 Nov 09 olle 309             {
4047 01 Dec 10 olle 310               log.info("MyLS::MyLS(): isTextBasedFTPClientType() = " + isTextBasedFTPClientType());
4047 01 Dec 10 olle 311               if (isTextBasedFTPClientType())
4047 01 Dec 10 olle 312               {
4047 01 Dec 10 olle 313                 getSessionControl().setActiveProject(null);
4047 01 Dec 10 olle 314                 log.info("MyLS::MyLS(): getSessionControl().setActiveProject(null)");
4047 01 Dec 10 olle 315               }
3469 02 Nov 09 olle 316             }
3469 02 Nov 09 olle 317           }
3469 02 Nov 09 olle 318           catch (Exception e)
3469 02 Nov 09 olle 319           {
3469 02 Nov 09 olle 320             log.info("MyLS::MyLS(): Exception when trying to get coreDir from path \"" + homePath + "\" : " + e);
3469 02 Nov 09 olle 321           }
3469 02 Nov 09 olle 322         }
3469 02 Nov 09 olle 323       }
790 23 Oct 06 olle 324     }
1680 25 May 07 olle 325     /*
1680 25 May 07 olle 326      * Close DbControl.
1680 25 May 07 olle 327      */
1680 25 May 07 olle 328     dc.close();
741 10 Oct 06 olle 329   }
741 10 Oct 06 olle 330
1656 22 May 07 gregory 331
790 23 Oct 06 olle 332   /**
3469 02 Nov 09 olle 333    * Convenience method that checks if path
3469 02 Nov 09 olle 334    * corresponds to shared projects folder.
3469 02 Nov 09 olle 335    * Method not part of original Xerver code.
3469 02 Nov 09 olle 336    * 
3469 02 Nov 09 olle 337    * @param path String The path string to check.
3469 02 Nov 09 olle 338    * return boolean True if path corresponds to shared projects folder, else false.
3469 02 Nov 09 olle 339    */
3469 02 Nov 09 olle 340   private boolean pathIsSharedProjectsFolder(String path)
3469 02 Nov 09 olle 341   {
3469 02 Nov 09 olle 342     log.info("MyLS::pathIsSharedProjectsFolder(): path = \"" + path + "\"");
3469 02 Nov 09 olle 343     boolean result = false;
3469 02 Nov 09 olle 344     if (path != null && !path.equals(""))
3469 02 Nov 09 olle 345     {
3469 02 Nov 09 olle 346       String tmpPath = new String(path);
3469 02 Nov 09 olle 347       // Remove ending core separator
3469 02 Nov 09 olle 348       if (path.endsWith(coreSeparator))
3469 02 Nov 09 olle 349       {
3469 02 Nov 09 olle 350         tmpPath = tmpPath.substring(0, tmpPath.length() - 1);
3469 02 Nov 09 olle 351       }
3469 02 Nov 09 olle 352       log.info("MyLS::pathIsSharedProjectsFolder(): tmpPath = \"" + tmpPath + "\"");
3469 02 Nov 09 olle 353       if (tmpPath.endsWith(sharedProjectsFolderName))
3469 02 Nov 09 olle 354       {
3469 02 Nov 09 olle 355         result = true;
3469 02 Nov 09 olle 356       }
3469 02 Nov 09 olle 357     }
3469 02 Nov 09 olle 358     log.info("MyLS::pathIsSharedProjectsFolder(): result = " + result);
3469 02 Nov 09 olle 359     return result;
3469 02 Nov 09 olle 360   }
3469 02 Nov 09 olle 361
3469 02 Nov 09 olle 362
3469 02 Nov 09 olle 363   /**
3469 02 Nov 09 olle 364    * Convenience method that fetches the home
3469 02 Nov 09 olle 365    * directory path from an absolute path.
3469 02 Nov 09 olle 366    * Method not part of original Xerver code.
3469 02 Nov 09 olle 367    * 
3469 02 Nov 09 olle 368    * @param path String The absolute path string to process.
3469 02 Nov 09 olle 369    * return String The home directory path, or null if it could not be obtained.
3469 02 Nov 09 olle 370    */
3469 02 Nov 09 olle 371   private String fetchHomeDirectoryPath(String path)
3469 02 Nov 09 olle 372   {
3469 02 Nov 09 olle 373     log.info("MyLS::fetchHomeDirectoryPath(): path = \"" + path + "\"");
3469 02 Nov 09 olle 374     String homePath = null;
3469 02 Nov 09 olle 375     if (path != null && !path.equals(""))
3469 02 Nov 09 olle 376     {
3469 02 Nov 09 olle 377       String testStr = coreSeparator + "home" + coreSeparator;
3469 02 Nov 09 olle 378       if (path.startsWith(testStr))
3469 02 Nov 09 olle 379       {
3469 02 Nov 09 olle 380         // Remove /home/ from start of path
3469 02 Nov 09 olle 381         String tmpPath = path.substring(testStr.length());
3469 02 Nov 09 olle 382         log.info("MyLS::fetchHomeDirectoryPath(): path \"" + path + "\" tmpPath = \"" + tmpPath + "\"");
3469 02 Nov 09 olle 383         if (tmpPath != null)
3469 02 Nov 09 olle 384         {
3469 02 Nov 09 olle 385           // Find location of first separator
3469 02 Nov 09 olle 386           int separatorIndex = tmpPath.indexOf(coreSeparator);
3469 02 Nov 09 olle 387           if (separatorIndex >= 0)
3469 02 Nov 09 olle 388           {
3469 02 Nov 09 olle 389             // Remove part after first separator
3469 02 Nov 09 olle 390             tmpPath = tmpPath.substring(0, separatorIndex);
3469 02 Nov 09 olle 391             log.info("MyLS::fetchHomeDirectoryPath(): path \"" + path + "\" tmpPath = \"" + tmpPath + "\"");
3469 02 Nov 09 olle 392             if (tmpPath != null)
3469 02 Nov 09 olle 393             {
3469 02 Nov 09 olle 394               // Construct path for home directory
3469 02 Nov 09 olle 395               homePath = coreSeparator + "home" + coreSeparator + tmpPath;
3469 02 Nov 09 olle 396             }
3469 02 Nov 09 olle 397           }
3469 02 Nov 09 olle 398         }
3469 02 Nov 09 olle 399       }
3469 02 Nov 09 olle 400     }
3469 02 Nov 09 olle 401     log.info("MyLS::fetchHomeDirectoryPath(): homePath = \"" + homePath + "\"");
3469 02 Nov 09 olle 402     return homePath;
3469 02 Nov 09 olle 403   }
3469 02 Nov 09 olle 404
3469 02 Nov 09 olle 405
3469 02 Nov 09 olle 406   /**
1652 22 May 07 gregory 407    * Convenience method not part of original Xerver code. Does not include
1652 22 May 07 gregory 408    * removed core directories.
790 23 Oct 06 olle 409    * 
1656 22 May 07 gregory 410    * @param path String path to check if it represents a core directory.
790 23 Oct 06 olle 411    * @return boolean true if path represents a core directory, else false.
790 23 Oct 06 olle 412    */
1676 25 May 07 olle 413   public boolean isValidCoreDirectory(String path)
1656 22 May 07 gregory 414   {
790 23 Oct 06 olle 415     // *** Debug Info
1656 22 May 07 gregory 416     log
1656 22 May 07 gregory 417       .info("MyLS::isValidCoreDirectory(): Start - path = \"" + path + "\"");
931 16 Nov 06 olle 418     boolean includeRemoved = false;
931 16 Nov 06 olle 419     return isValidCoreDirectory(path, includeRemoved);
931 16 Nov 06 olle 420   }
931 16 Nov 06 olle 421
1656 22 May 07 gregory 422
931 16 Nov 06 olle 423   /**
931 16 Nov 06 olle 424    * Convenience method not part of original Xerver code.
931 16 Nov 06 olle 425    * 
1656 22 May 07 gregory 426    * @param path String path to check if it represents a core directory.
1656 22 May 07 gregory 427    * @param includeRemoved boolean flag indicating if removed core directories
1656 22 May 07 gregory 428    *        should be included.
931 16 Nov 06 olle 429    * @return boolean true if path represents a core directory, else false.
931 16 Nov 06 olle 430    */
1676 25 May 07 olle 431   public boolean isValidCoreDirectory(String path,
1656 22 May 07 gregory 432       boolean includeRemoved)
1656 22 May 07 gregory 433   {
931 16 Nov 06 olle 434     // *** Debug Info
1656 22 May 07 gregory 435     log
1656 22 May 07 gregory 436       .info("MyLS::isValidCoreDirectory(): Start - path = \"" + path + "\" includeRemoved = " + includeRemoved);
790 23 Oct 06 olle 437     boolean pathIsValidCoreDirectory = false;
1676 25 May 07 olle 438     DbControl dc = getSessionControl().newDbControl();
1656 22 May 07 gregory 439     ItemFactory factory = new ItemFactory(dc);
790 23 Oct 06 olle 440     /*
790 23 Oct 06 olle 441      * Check if path is a valid core directory.
790 23 Oct 06 olle 442      */
1656 22 May 07 gregory 443     try
1656 22 May 07 gregory 444     {
1652 22 May 07 gregory 445       org.proteios.core.Path testCoreDirPath = new org.proteios.core.Path(
1656 22 May 07 gregory 446         path, Type.DIRECTORY);
1656 22 May 07 gregory 447       org.proteios.core.Directory testCoreDir = factory
1656 22 May 07 gregory 448         .getByPath(testCoreDirPath);
790 23 Oct 06 olle 449       /*
931 16 Nov 06 olle 450        * If no exceptions, core directory may be valid.
790 23 Oct 06 olle 451        */
790 23 Oct 06 olle 452       pathIsValidCoreDirectory = true;
1656 22 May 07 gregory 453       if (!includeRemoved)
1656 22 May 07 gregory 454       {
931 16 Nov 06 olle 455         /*
1652 22 May 07 gregory 456          * Core directories only counted as valid, if not tagged as
1652 22 May 07 gregory 457          * removed.
931 16 Nov 06 olle 458          */
1656 22 May 07 gregory 459         if (testCoreDir.isRemoved())
1656 22 May 07 gregory 460         {
931 16 Nov 06 olle 461           pathIsValidCoreDirectory = false;
931 16 Nov 06 olle 462         }
931 16 Nov 06 olle 463       }
1656 22 May 07 gregory 464     }
1656 22 May 07 gregory 465     catch (Exception e)
1656 22 May 07 gregory 466     {
790 23 Oct 06 olle 467       /*
937 20 Nov 06 olle 468        * Exception was thrown, path is not a valid core directory.
790 23 Oct 06 olle 469        */
790 23 Oct 06 olle 470       pathIsValidCoreDirectory = false;
790 23 Oct 06 olle 471     }
1680 25 May 07 olle 472     /*
1680 25 May 07 olle 473      * Close DbControl.
1680 25 May 07 olle 474      */
1680 25 May 07 olle 475     dc.close();
790 23 Oct 06 olle 476     return pathIsValidCoreDirectory;
790 23 Oct 06 olle 477   }
790 23 Oct 06 olle 478
1656 22 May 07 gregory 479
1656 22 May 07 gregory 480   public boolean isValidDirectory()
1656 22 May 07 gregory 481   {
741 10 Oct 06 olle 482     return isValidDirectory;
741 10 Oct 06 olle 483   }
741 10 Oct 06 olle 484
1656 22 May 07 gregory 485
741 10 Oct 06 olle 486   /**
3464 26 Oct 09 olle 487    * Convenience method not part of original Xerver code. Does not include
3464 26 Oct 09 olle 488    * removed core files.
3464 26 Oct 09 olle 489    * 
3464 26 Oct 09 olle 490    * @param path String path to check if it represents a core file.
3464 26 Oct 09 olle 491    * @return boolean true if path represents a core file, else false.
3464 26 Oct 09 olle 492    */
3464 26 Oct 09 olle 493   public boolean isValidCoreFile(String path)
3464 26 Oct 09 olle 494   {
3464 26 Oct 09 olle 495     // *** Debug Info
3464 26 Oct 09 olle 496     log
3464 26 Oct 09 olle 497       .info("MyLS::isValidCoreFile(): Start - path = \"" + path + "\"");
3464 26 Oct 09 olle 498     boolean includeRemoved = false;
3464 26 Oct 09 olle 499     return isValidCoreFile(path, includeRemoved);
3464 26 Oct 09 olle 500   }
3464 26 Oct 09 olle 501
3464 26 Oct 09 olle 502
3464 26 Oct 09 olle 503   /**
3464 26 Oct 09 olle 504    * Convenience method not part of original Xerver code.
3464 26 Oct 09 olle 505    * 
3464 26 Oct 09 olle 506    * @param path String path to check if it represents a core file.
3464 26 Oct 09 olle 507    * @param includeRemoved boolean flag indicating if removed core files
3464 26 Oct 09 olle 508    *        should be included.
3464 26 Oct 09 olle 509    * @return boolean true if path represents a core file, else false.
3464 26 Oct 09 olle 510    */
3464 26 Oct 09 olle 511   public boolean isValidCoreFile(String path,
3464 26 Oct 09 olle 512       boolean includeRemoved)
3464 26 Oct 09 olle 513   {
3464 26 Oct 09 olle 514     // *** Debug Info
3464 26 Oct 09 olle 515     log
3464 26 Oct 09 olle 516       .info("MyLS::isValidCoreFile(): Start - path = \"" + path + "\" includeRemoved = " + includeRemoved);
3464 26 Oct 09 olle 517     boolean pathIsValidCoreFile = false;
3464 26 Oct 09 olle 518     DbControl dc = getSessionControl().newDbControl();
3464 26 Oct 09 olle 519     ItemFactory factory = new ItemFactory(dc);
3464 26 Oct 09 olle 520     /*
3464 26 Oct 09 olle 521      * Check if path is a valid core file.
3464 26 Oct 09 olle 522      */
3464 26 Oct 09 olle 523     try
3464 26 Oct 09 olle 524     {
3464 26 Oct 09 olle 525       org.proteios.core.Path testCoreFilePath = new org.proteios.core.Path(
3464 26 Oct 09 olle 526         path, Type.FILE);
3464 26 Oct 09 olle 527       org.proteios.core.File testCoreFile = factory
3464 26 Oct 09 olle 528         .getByPath(testCoreFilePath, false);
3464 26 Oct 09 olle 529       /*
3464 26 Oct 09 olle 530        * If no exceptions, core file may be valid.
3464 26 Oct 09 olle 531        */
3464 26 Oct 09 olle 532       pathIsValidCoreFile = true;
3464 26 Oct 09 olle 533       if (!includeRemoved)
3464 26 Oct 09 olle 534       {
3464 26 Oct 09 olle 535         /*
3464 26 Oct 09 olle 536          * Core files only counted as valid, if not tagged as
3464 26 Oct 09 olle 537          * removed.
3464 26 Oct 09 olle 538          */
3464 26 Oct 09 olle 539         if (testCoreFile.isRemoved())
3464 26 Oct 09 olle 540         {
3464 26 Oct 09 olle 541           pathIsValidCoreFile = false;
3464 26 Oct 09 olle 542         }
3464 26 Oct 09 olle 543       }
3464 26 Oct 09 olle 544     }
3464 26 Oct 09 olle 545     catch (Exception e)
3464 26 Oct 09 olle 546     {
3464 26 Oct 09 olle 547       /*
3464 26 Oct 09 olle 548        * Exception was thrown, path is not a valid core file.
3464 26 Oct 09 olle 549        */
3464 26 Oct 09 olle 550       pathIsValidCoreFile = false;
3464 26 Oct 09 olle 551     }
3464 26 Oct 09 olle 552     /*
3464 26 Oct 09 olle 553      * Close DbControl.
3464 26 Oct 09 olle 554      */
3464 26 Oct 09 olle 555     dc.close();
3464 26 Oct 09 olle 556     return pathIsValidCoreFile;
3464 26 Oct 09 olle 557   }
3464 26 Oct 09 olle 558
3464 26 Oct 09 olle 559
3464 26 Oct 09 olle 560   /**
1652 22 May 07 gregory 561    * Send the line that is related to this file when we do a normal folder
1652 22 May 07 gregory 562    * listing. Does not include removed core files.
931 16 Nov 06 olle 563    * 
1656 22 May 07 gregory 564    * @param bos DataOutputStream data output stream to send listing to.
931 16 Nov 06 olle 565    */
1656 22 May 07 gregory 566   public void sendFileInfo(DataOutputStream bos)
1656 22 May 07 gregory 567       throws Exception
1656 22 May 07 gregory 568   {
790 23 Oct 06 olle 569     // *** Debug Info
790 23 Oct 06 olle 570     log.info("MyLS::sendFileInfo(): Start");
931 16 Nov 06 olle 571     boolean includeRemoved = false;
931 16 Nov 06 olle 572     sendFileInfo(bos, includeRemoved);
931 16 Nov 06 olle 573   }
1652 22 May 07 gregory 574
1656 22 May 07 gregory 575
931 16 Nov 06 olle 576   /**
1652 22 May 07 gregory 577    * Send the line that is related to this file when we do a normal folder
1652 22 May 07 gregory 578    * listing.
931 16 Nov 06 olle 579    * 
1656 22 May 07 gregory 580    * @param bos DataOutputStream data output stream to send listing to.
1656 22 May 07 gregory 581    * @param includeRemoved boolean flag indicating if removed core files
1656 22 May 07 gregory 582    *        should be included.
931 16 Nov 06 olle 583    */
1652 22 May 07 gregory 584   public void sendFileInfo(DataOutputStream bos, boolean includeRemoved)
1656 22 May 07 gregory 585       throws Exception
1656 22 May 07 gregory 586   {
931 16 Nov 06 olle 587     // *** Debug Info
1652 22 May 07 gregory 588     log
1656 22 May 07 gregory 589       .info("MyLS::sendFileInfo(): Start - includeRemoved = " + includeRemoved);
1656 22 May 07 gregory 590     log
1656 22 May 07 gregory 591       .info("MyLS::sendFileInfo(): isValidDirectory = " + isValidDirectory);
1656 22 May 07 gregory 592     if (isValidDirectory)
1656 22 May 07 gregory 593     {
931 16 Nov 06 olle 594       /*
1652 22 May 07 gregory 595        * If the argument gave a folder, list the content of the folder
931 16 Nov 06 olle 596        */
931 16 Nov 06 olle 597       sendListing(bos, includeRemoved, null);
1656 22 May 07 gregory 598     }
1656 22 May 07 gregory 599     else
1656 22 May 07 gregory 600     {
1652 22 May 07 gregory 601       MyGregorianCalendar tmpDate = new MyGregorianCalendar();
741 10 Oct 06 olle 602       int hour, minute, sec, year, day, month, length, am_pm;
741 10 Oct 06 olle 603       String tmpStr;
741 10 Oct 06 olle 604       StringBuffer sb_tmpStr;
741 10 Oct 06 olle 605       String tmpLengthAsString;
790 23 Oct 06 olle 606       /*
1652 22 May 07 gregory 607        * The date and time format has been modified to the YYYY-MM-DD
1652 22 May 07 gregory 608        * hh:mm format (using 24-hour time format).
790 23 Oct 06 olle 609        */
1652 22 May 07 gregory 610       sb_tmpStr = new StringBuffer(70); // Example, "06-06-01 04:51AM 84
1656 22 May 07 gregory 611       // MYFILE1.TXT" is 50 chars
1652 22 May 07 gregory 612       // tmpDate.mySetTimeInMillis(f_folder.lastModified());
790 23 Oct 06 olle 613       tmpDate.mySetTimeInMillis(coreFile.getCreated().getTime());
1652 22 May 07 gregory 614       hour = tmpDate.get(GregorianCalendar.HOUR);
1652 22 May 07 gregory 615       minute = tmpDate.get(GregorianCalendar.MINUTE);
1652 22 May 07 gregory 616       day = tmpDate.get(GregorianCalendar.DAY_OF_MONTH);
1652 22 May 07 gregory 617       month = tmpDate.get(GregorianCalendar.MONTH);
1652 22 May 07 gregory 618       year = tmpDate.get(GregorianCalendar.YEAR);
1652 22 May 07 gregory 619       am_pm = tmpDate.get(GregorianCalendar.AM_PM);
1652 22 May 07 gregory 620       // year=year%100;
1652 22 May 07 gregory 621       sb_tmpStr.append(year + "-");
741 10 Oct 06 olle 622       month++;
1652 22 May 07 gregory 623       if (month < 10)
741 10 Oct 06 olle 624         sb_tmpStr.append(0);
1652 22 May 07 gregory 625       sb_tmpStr.append(month + "-");
1652 22 May 07 gregory 626       if (day < 10)
741 10 Oct 06 olle 627         sb_tmpStr.append(0);
1652 22 May 07 gregory 628       // sb_tmpStr.append(day+"-");
1652 22 May 07 gregory 629       sb_tmpStr.append(day + "  ");
1652 22 May 07 gregory 630       // if (year<10)
1652 22 May 07 gregory 631       // sb_tmpStr.append(0);
1652 22 May 07 gregory 632       // sb_tmpStr.append(year+" ");
1656 22 May 07 gregory 633       if (hour < 12 && am_pm == GregorianCalendar.PM)
1656 22 May 07 gregory 634       {
790 23 Oct 06 olle 635         hour = hour + 12;
790 23 Oct 06 olle 636       }
1652 22 May 07 gregory 637       if (hour < 10)
741 10 Oct 06 olle 638         sb_tmpStr.append(0);
1652 22 May 07 gregory 639       sb_tmpStr.append(hour + ":");
1652 22 May 07 gregory 640       if (minute < 10)
741 10 Oct 06 olle 641         sb_tmpStr.append(0);
741 10 Oct 06 olle 642       sb_tmpStr.append(minute);
1652 22 May 07 gregory 643       // if (am_pm==GregorianCalendar.PM)
1652 22 May 07 gregory 644       // sb_tmpStr.append("PM ");
1652 22 May 07 gregory 645       // else
1652 22 May 07 gregory 646       // sb_tmpStr.append("AM ");
1652 22 May 07 gregory 647       // Note, here we know that f_folder is a file, not a directory...
1652 22 May 07 gregory 648       // tmpLengthAsString=""+f_folder.length();
1652 22 May 07 gregory 649       // tmpLengthAsString=""+coreFile.getBytes();
790 23 Oct 06 olle 650       /*
790 23 Oct 06 olle 651        * Fill in blanks at left to right-align size value.
790 23 Oct 06 olle 652        */
1652 22 May 07 gregory 653       // int timesToLoop=14-tmpLengthAsString.length();
1652 22 May 07 gregory 654       // for (int j=0; j<timesToLoop; j++)
1652 22 May 07 gregory 655       // {
1652 22 May 07 gregory 656       // sb_tmpStr.append(" ");
1652 22 May 07 gregory 657       // }
1652 22 May 07 gregory 658       // sb_tmpStr.append(tmpLengthAsString+" ");
1656 22 May 07 gregory 659       if (!coreFile.isRemoved())
1656 22 May 07 gregory 660       {
1652 22 May 07 gregory 661         // tmpLengthAsString=""+f_folder.length();
2444 10 Dec 07 gregory 662         tmpLengthAsString = "" + coreFile.getSizeInBytes();
931 16 Nov 06 olle 663         /*
931 16 Nov 06 olle 664          * Fill in blanks at left to right-align size value.
931 16 Nov 06 olle 665          */
1652 22 May 07 gregory 666         int timesToLoop = 14 - tmpLengthAsString.length();
1656 22 May 07 gregory 667         for (int j = 0; j < timesToLoop; j++)
1656 22 May 07 gregory 668         {
931 16 Nov 06 olle 669           sb_tmpStr.append(" ");
931 16 Nov 06 olle 670         }
1652 22 May 07 gregory 671         sb_tmpStr.append(tmpLengthAsString + " ");
1656 22 May 07 gregory 672       }
1656 22 May 07 gregory 673       else
1656 22 May 07 gregory 674       {
1652 22 May 07 gregory 675         sb_tmpStr.append("     <REMOVED> ");
741 10 Oct 06 olle 676       }
1652 22 May 07 gregory 677       // sb_tmpStr.append(f_folder.getName());
790 23 Oct 06 olle 678       sb_tmpStr.append(coreFile.getName());
1652 22 May 07 gregory 679       bos.writeBytes(sb_tmpStr.toString() + "\r\n");
741 10 Oct 06 olle 680     }
790 23 Oct 06 olle 681     /*
1652 22 May 07 gregory 682      * Added flush of output stream to original Xerver code, in accordance
1652 22 May 07 gregory 683      * with code for sendListing(DataOutputStream bos).
790 23 Oct 06 olle 684      */
790 23 Oct 06 olle 685     bos.flush();
741 10 Oct 06 olle 686   }
741 10 Oct 06 olle 687
1656 22 May 07 gregory 688
741 10 Oct 06 olle 689   /**
1652 22 May 07 gregory 690    * Send the directory listing to bos. Does not include removed core files.
931 16 Nov 06 olle 691    * 
1656 22 May 07 gregory 692    * @param bos DataOutputStream data output stream to send listing to.
931 16 Nov 06 olle 693    */
1656 22 May 07 gregory 694   public void sendListing(DataOutputStream bos)
1656 22 May 07 gregory 695       throws Exception
1656 22 May 07 gregory 696   {
790 23 Oct 06 olle 697     // *** Debug Info
790 23 Oct 06 olle 698     log.info("MyLS::sendListing(): Start");
931 16 Nov 06 olle 699     boolean includeRemoved = false;
931 16 Nov 06 olle 700     sendListing(bos, includeRemoved, null);
931 16 Nov 06 olle 701   }
931 16 Nov 06 olle 702
1656 22 May 07 gregory 703
931 16 Nov 06 olle 704   /**
931 16 Nov 06 olle 705    * Send the directory listing to bos.
931 16 Nov 06 olle 706    * 
1656 22 May 07 gregory 707    * @param bos DataOutputStream data output stream to send listing to.
1656 22 May 07 gregory 708    * @param includeRemoved boolean flag indicating if removed files should be
1656 22 May 07 gregory 709    *        included.
1656 22 May 07 gregory 710    * @param prefix String optional prefix string at start of response string.
931 16 Nov 06 olle 711    */
1652 22 May 07 gregory 712   public void sendListing(DataOutputStream bos, boolean includeRemoved,
1656 22 May 07 gregory 713       String prefix)
1656 22 May 07 gregory 714       throws Exception
1656 22 May 07 gregory 715   {
931 16 Nov 06 olle 716     // *** Debug Info
1656 22 May 07 gregory 717     log
3469 02 Nov 09 olle 718       .info("MyLS::sendListing(): Start - includeRemoved = " + includeRemoved + " prefix = \"" + prefix + "\" isInSharedProjectsFolder() = " + isInSharedProjectsFolder());
1680 25 May 07 olle 719     DbControl dc = getSessionControl().newDbControl();
790 23 Oct 06 olle 720     /*
790 23 Oct 06 olle 721      * First list all subdirectories in current core directory.
790 23 Oct 06 olle 722      */
1652 22 May 07 gregory 723     // writeDirListing(bos);
3469 02 Nov 09 olle 724     //writeDirListing(bos, includeRemoved, prefix);
3469 02 Nov 09 olle 725     // If in shared projects folder, write shared projects directories
3469 02 Nov 09 olle 726     if (isInSharedProjectsFolder())
3469 02 Nov 09 olle 727     {
3469 02 Nov 09 olle 728       writeSharedProjectsDirListing(bos, includeRemoved, prefix);
3469 02 Nov 09 olle 729     }
3469 02 Nov 09 olle 730     else
3469 02 Nov 09 olle 731     {
3469 02 Nov 09 olle 732       writeDirListing(bos, includeRemoved, prefix);
3469 02 Nov 09 olle 733     }
1652 22 May 07 gregory 734     // try {
1652 22 May 07 gregory 735     String[] as_allFilesAndFolders;
741 10 Oct 06 olle 736     int i_numberOfFiles;
790 23 Oct 06 olle 737     /*
790 23 Oct 06 olle 738      * Get ItemQuery for core files in core directory
790 23 Oct 06 olle 739      */
790 23 Oct 06 olle 740     ItemQuery fileQuery = coreDir.getFileQuery();
1656 22 May 07 gregory 741     if (includeRemoved)
1656 22 May 07 gregory 742     {
931 16 Nov 06 olle 743       fileQuery.include(Include.REMOVED, Include.NOT_REMOVED);
931 16 Nov 06 olle 744     }
790 23 Oct 06 olle 745     int nFiles = fileQuery.count(dc);
790 23 Oct 06 olle 746     log.info("MyLS::sendListing(): fileQuery.count(dc) = " + nFiles);
931 16 Nov 06 olle 747     /*
931 16 Nov 06 olle 748      * The ItemResultList may exclude some items.
931 16 Nov 06 olle 749      */
931 16 Nov 06 olle 750     ItemResultList fileList = fileQuery.list(dc);
931 16 Nov 06 olle 751     log.info("MyLS::sendListing(): fileList.size() = " + fileList.size());
931 16 Nov 06 olle 752     nFiles = fileList.size();
3469 02 Nov 09 olle 753     //
3469 02 Nov 09 olle 754     // If in shared projects folder, reset number of files to zero to prevent file listing
3469 02 Nov 09 olle 755     if (isInSharedProjectsFolder())
3469 02 Nov 09 olle 756     {
3469 02 Nov 09 olle 757       nFiles = 0;
3469 02 Nov 09 olle 758     }
790 23 Oct 06 olle 759     as_allFilesAndFolders = new String[nFiles];
1656 22 May 07 gregory 760     for (int i = 0; i < nFiles; i++)
1656 22 May 07 gregory 761     {
1652 22 May 07 gregory 762       org.proteios.core.File tmpCoreFile = (org.proteios.core.File) fileList
1656 22 May 07 gregory 763         .get(i);
790 23 Oct 06 olle 764       as_allFilesAndFolders[i] = tmpCoreFile.getName();
1656 22 May 07 gregory 765       log
1656 22 May 07 gregory 766         .info("MyLS::sendListing(): as_allFilesAndFolders[" + i + "] = \"" + as_allFilesAndFolders[i] + "\" + isRemoved = " + tmpCoreFile
1656 22 May 07 gregory 767           .isRemoved());
790 23 Oct 06 olle 768     }
1652 22 May 07 gregory 769     // as_allFilesAndFolders=f_folder.list();
1652 22 May 07 gregory 770     i_numberOfFiles = as_allFilesAndFolders.length;
790 23 Oct 06 olle 771     log.info("MyLS::sendListing(): i_numberOfFiles = " + i_numberOfFiles);
1652 22 May 07 gregory 772     // If we had wanted to sort: Arrays.sort(allFilesAndFolders, new
1652 22 May 07 gregory 773     // ComparatorIgnoreCase());
1652 22 May 07 gregory 774     // File tmpFile;
1652 22 May 07 gregory 775     MyGregorianCalendar tmpDate = new MyGregorianCalendar();
741 10 Oct 06 olle 776     int hour, minute, sec, year, day, month, length, am_pm;
741 10 Oct 06 olle 777     String tmpStr;
741 10 Oct 06 olle 778     StringBuffer sb_tmpStr;
741 10 Oct 06 olle 779     String tmpLengthAsString;
1656 22 May 07 gregory 780     for (int i = 0; i < i_numberOfFiles; i++)
1656 22 May 07 gregory 781     {
1652 22 May 07 gregory 782       // Example, "-rw-r--r-- 84 2006-06-01 16:51 MYFILE1.TXT" is 54 chars
1652 22 May 07 gregory 783       sb_tmpStr = new StringBuffer(81);
1650 21 May 07 olle 784       // Standard output for normal file
1650 21 May 07 olle 785       sb_tmpStr.append("-rw-r--r-- ");
1650 21 May 07 olle 786       // Standard output links, user, group for normal file
1650 21 May 07 olle 787       sb_tmpStr.append("1 100 100 ");
1650 21 May 07 olle 788       // Size (dummy value for directory listing)
1652 22 May 07 gregory 789       org.proteios.core.File tmpCoreFile = (org.proteios.core.File) fileList
1656 22 May 07 gregory 790         .get(i);
2444 10 Dec 07 gregory 791       tmpLengthAsString = "" + tmpCoreFile.getSizeInBytes();
790 23 Oct 06 olle 792       /*
1650 21 May 07 olle 793        * Fill in blanks at left to right-align size value.
1650 21 May 07 olle 794        */
1652 22 May 07 gregory 795       int timesToLoop = 14 - tmpLengthAsString.length();
1656 22 May 07 gregory 796       for (int j = 0; j < timesToLoop; j++)
1656 22 May 07 gregory 797       {
1650 21 May 07 olle 798         sb_tmpStr.append(" ");
1650 21 May 07 olle 799       }
1652 22 May 07 gregory 800       sb_tmpStr.append(tmpLengthAsString + " ");
1650 21 May 07 olle 801       /*
1652 22 May 07 gregory 802        * The date and time format has been modified to the YYYY-MM-DD
1652 22 May 07 gregory 803        * hh:mm format (using 24-hour time format).
790 23 Oct 06 olle 804        */
1652 22 May 07 gregory 805       // sb_tmpStr=new StringBuffer(70); //Example, "06-06-01 04:51AM 84
1652 22 May 07 gregory 806       // MYFILE1.TXT" is 50 chars
1652 22 May 07 gregory 807       // tmpFile=new File(s_path+as_allFilesAndFolders[i]);
1652 22 May 07 gregory 808       // org.proteios.core.File tmpCoreFile = (org.proteios.core.File)
1652 22 May 07 gregory 809       // fileList.get(i);
1652 22 May 07 gregory 810       // tmpDate.mySetTimeInMillis(tmpFile.lastModified());
790 23 Oct 06 olle 811       tmpDate.mySetTimeInMillis(tmpCoreFile.getCreated().getTime());
1652 22 May 07 gregory 812       hour = tmpDate.get(GregorianCalendar.HOUR);
1652 22 May 07 gregory 813       minute = tmpDate.get(GregorianCalendar.MINUTE);
1652 22 May 07 gregory 814       day = tmpDate.get(GregorianCalendar.DAY_OF_MONTH);
1652 22 May 07 gregory 815       month = tmpDate.get(GregorianCalendar.MONTH);
1652 22 May 07 gregory 816       year = tmpDate.get(GregorianCalendar.YEAR);
1652 22 May 07 gregory 817       am_pm = tmpDate.get(GregorianCalendar.AM_PM);
1652 22 May 07 gregory 818       // year=year%100;
1652 22 May 07 gregory 819       // sb_tmpStr.append(year+"-");
1652 22 May 07 gregory 820       // sb_tmpStr.append(year+" ");
741 10 Oct 06 olle 821       month++;
1652 22 May 07 gregory 822       // if (month<10)
1652 22 May 07 gregory 823       // sb_tmpStr.append(0);
1652 22 May 07 gregory 824       // sb_tmpStr.append(month+"-");
1652 22 May 07 gregory 825       sb_tmpStr.append(monthAbbr(month) + " ");
1652 22 May 07 gregory 826       if (day < 10)
741 10 Oct 06 olle 827         sb_tmpStr.append(0);
1652 22 May 07 gregory 828       // sb_tmpStr.append(day+"-");
1652 22 May 07 gregory 829       // sb_tmpStr.append(day+" ");
1652 22 May 07 gregory 830       sb_tmpStr.append(day + " ");
1652 22 May 07 gregory 831       // if (year<10)
1652 22 May 07 gregory 832       // sb_tmpStr.append(0);
1652 22 May 07 gregory 833       // sb_tmpStr.append(year+" ");
1656 22 May 07 gregory 834       if (hour < 12 && am_pm == GregorianCalendar.PM)
1656 22 May 07 gregory 835       {
790 23 Oct 06 olle 836         hour = hour + 12;
790 23 Oct 06 olle 837       }
1656 22 May 07 gregory 838       if (!isYearOld(tmpCoreFile.getCreated()))
1656 22 May 07 gregory 839       {
1652 22 May 07 gregory 840         if (hour < 10)
1650 21 May 07 olle 841           sb_tmpStr.append(0);
1652 22 May 07 gregory 842         sb_tmpStr.append(hour + ":");
1652 22 May 07 gregory 843         if (minute < 10)
1650 21 May 07 olle 844           sb_tmpStr.append(0);
1650 21 May 07 olle 845         sb_tmpStr.append(minute);
1656 22 May 07 gregory 846       }
1656 22 May 07 gregory 847       else
1656 22 May 07 gregory 848       {
1650 21 May 07 olle 849         sb_tmpStr.append(year);
1650 21 May 07 olle 850       }
1650 21 May 07 olle 851       /*
1656 22 May 07 gregory 852        * if (hour<10) sb_tmpStr.append(0); sb_tmpStr.append(hour+":"); if
1656 22 May 07 gregory 853        * (minute<10) sb_tmpStr.append(0); sb_tmpStr.append(minute);
1652 22 May 07 gregory 854        */
1652 22 May 07 gregory 855       // if (am_pm==GregorianCalendar.PM)
1652 22 May 07 gregory 856       // sb_tmpStr.append("PM ");
1652 22 May 07 gregory 857       // else
1652 22 May 07 gregory 858       // sb_tmpStr.append("AM ");
1650 21 May 07 olle 859       sb_tmpStr.append(" ");
1652 22 May 07 gregory 860       // if (tmpFile.isDirectory())
1656 22 May 07 gregory 861       if (false)
1656 22 May 07 gregory 862       {
741 10 Oct 06 olle 863         sb_tmpStr.append("<DIR>          ");
1656 22 May 07 gregory 864       }
1656 22 May 07 gregory 865       else
1656 22 May 07 gregory 866       {
1656 22 May 07 gregory 867         if (!tmpCoreFile.isRemoved())
1656 22 May 07 gregory 868         {
1652 22 May 07 gregory 869           // tmpLengthAsString=""+tmpFile.length();
1652 22 May 07 gregory 870           // tmpLengthAsString=""+tmpCoreFile.getBytes();
931 16 Nov 06 olle 871           /*
931 16 Nov 06 olle 872            * Fill in blanks at left to right-align size value.
931 16 Nov 06 olle 873            */
1650 21 May 07 olle 874           /*
1652 22 May 07 gregory 875            * int timesToLoop=14-tmpLengthAsString.length(); for (int
1652 22 May 07 gregory 876            * j=0; j<timesToLoop; j++) { sb_tmpStr.append(" "); }
1652 22 May 07 gregory 877            * sb_tmpStr.append(tmpLengthAsString+" ");
1652 22 May 07 gregory 878            */
1656 22 May 07 gregory 879         }
1656 22 May 07 gregory 880         else
1656 22 May 07 gregory 881         {
1652 22 May 07 gregory 882           sb_tmpStr.append("     <REMOVED> ");
741 10 Oct 06 olle 883         }
741 10 Oct 06 olle 884       }
741 10 Oct 06 olle 885       sb_tmpStr.append(as_allFilesAndFolders[i]);
931 16 Nov 06 olle 886       /*
1652 22 May 07 gregory 887        * Start response string with optional prefix. Example: prefix =
1652 22 May 07 gregory 888        * "213-".
931 16 Nov 06 olle 889        */
1656 22 May 07 gregory 890       if (prefix != null)
1656 22 May 07 gregory 891       {
1652 22 May 07 gregory 892         bos.writeBytes(prefix + sb_tmpStr.toString() + "\r\n");
1656 22 May 07 gregory 893       }
1656 22 May 07 gregory 894       else
1656 22 May 07 gregory 895       {
1652 22 May 07 gregory 896         bos.writeBytes(sb_tmpStr.toString() + "\r\n");
931 16 Nov 06 olle 897       }
1652 22 May 07 gregory 898       // bos.writeBytes("+s1234,\t"+as_allFilesAndFolders[i]+"\r\n");
741 10 Oct 06 olle 899     }
1652 22 May 07 gregory 900     // } catch (Exception e) {if (b_showErrors)System.out.println("Error @
1652 22 May 07 gregory 901     // sendListing:\n"+e);}
741 10 Oct 06 olle 902     bos.flush();
1680 25 May 07 olle 903     /*
1680 25 May 07 olle 904      * Close DbControl.
1680 25 May 07 olle 905      */
1680 25 May 07 olle 906     dc.close();
741 10 Oct 06 olle 907   }
741 10 Oct 06 olle 908
1656 22 May 07 gregory 909
790 23 Oct 06 olle 910   /**
1652 22 May 07 gregory 911    * Write the listing of subdirectories to bos, but do not flush it. Does not
1652 22 May 07 gregory 912    * include removed core directories. Method not in the original Xerver code.
931 16 Nov 06 olle 913    * 
1656 22 May 07 gregory 914    * @param bos DataOutputStream data output stream to write list to.
931 16 Nov 06 olle 915    */
1656 22 May 07 gregory 916   public void writeDirListing(DataOutputStream bos)
1656 22 May 07 gregory 917       throws Exception
1656 22 May 07 gregory 918   {
790 23 Oct 06 olle 919     // *** Debug Info
790 23 Oct 06 olle 920     log.info("MyLS::writeDirListing(): Start");
931 16 Nov 06 olle 921     boolean includeRemoved = false;
931 16 Nov 06 olle 922     writeDirListing(bos, includeRemoved, null);
931 16 Nov 06 olle 923   }
931 16 Nov 06 olle 924
1656 22 May 07 gregory 925
931 16 Nov 06 olle 926   /**
1652 22 May 07 gregory 927    * Write the listing of subdirectories to bos, but do not flush it. Method
1652 22 May 07 gregory 928    * not in the original Xerver code.
931 16 Nov 06 olle 929    * 
1656 22 May 07 gregory 930    * @param bos DataOutputStream data output stream to write list to.
1656 22 May 07 gregory 931    * @param includeRemoved boolean flag indicating if removed files should be
1656 22 May 07 gregory 932    *        included.
1656 22 May 07 gregory 933    * @param prefix String optional prefix string at start of response string.
931 16 Nov 06 olle 934    */
1652 22 May 07 gregory 935   public void writeDirListing(DataOutputStream bos, boolean includeRemoved,
1656 22 May 07 gregory 936       String prefix)
1656 22 May 07 gregory 937       throws Exception
1656 22 May 07 gregory 938   {
931 16 Nov 06 olle 939     // *** Debug Info
1656 22 May 07 gregory 940     log
3469 02 Nov 09 olle 941       .info("MyLS::writeDirListing(): Start - includeRemoved = " + includeRemoved + " prefix = \"" + prefix + "\" + isInSharedProjectsFolder() = " + isInSharedProjectsFolder());
3469 02 Nov 09 olle 942     //
3469 02 Nov 09 olle 943     // Add "Shared Projects" entry if home directory
3469 02 Nov 09 olle 944     if (coreDir.isHomeDirectory())
3469 02 Nov 09 olle 945     {
3469 02 Nov 09 olle 946       String dirEntryStr = fetchDirectoryEntry(sharedProjectsFolderName, new Date());
3469 02 Nov 09 olle 947       /*
3469 02 Nov 09 olle 948        * Start response string with optional prefix. Example: prefix =
3469 02 Nov 09 olle 949        * "213-".
3469 02 Nov 09 olle 950        */
3469 02 Nov 09 olle 951       if (prefix != null)
3469 02 Nov 09 olle 952       {
3469 02 Nov 09 olle 953         bos.writeBytes(prefix + dirEntryStr + "\r\n");
3469 02 Nov 09 olle 954       }
3469 02 Nov 09 olle 955       else
3469 02 Nov 09 olle 956       {
3469 02 Nov 09 olle 957         bos.writeBytes(dirEntryStr + "\r\n");
3469 02 Nov 09 olle 958       }
3469 02 Nov 09 olle 959     }
1652 22 May 07 gregory 960     // try {
1652 22 May 07 gregory 961     String[] as_allFolders;
790 23 Oct 06 olle 962     int i_numberOfDirs;
1680 25 May 07 olle 963     DbControl dc = getSessionControl().newDbControl();
3458 23 Oct 09 olle 964     log.info("MyLS::writeDirListing(): coreDir = " + coreDir);
3458 23 Oct 09 olle 965     //
3458 23 Oct 09 olle 966     // Get list of own sub-directories in input directory
3458 23 Oct 09 olle 967     List<org.proteios.core.Directory> ownDirList = fetchOwnDirList(dc, coreDir, includeRemoved);
3458 23 Oct 09 olle 968     int nOwnDirs = ownDirList.size();
3458 23 Oct 09 olle 969     log.info("MyLS::writeDirListing(): nOwnDirs = " + nOwnDirs);
3458 23 Oct 09 olle 970     //
3458 23 Oct 09 olle 971     // Get list of directories shared to input directory
3466 28 Oct 09 olle 972     List<org.proteios.core.Directory> sharedDirList = fetchSharedDirList(dc, coreDir, ownDirList);
3458 23 Oct 09 olle 973     int nSharedDirs = sharedDirList.size();
3458 23 Oct 09 olle 974     log.info("MyLS::writeDirListing(): nSharedDirs = " + nSharedDirs);
3458 23 Oct 09 olle 975     //
3458 23 Oct 09 olle 976     // Prepare full directory list, including shared, for input directory.
3458 23 Oct 09 olle 977     List<org.proteios.core.Directory> dirList = new ArrayList<org.proteios.core.Directory>(0);
3458 23 Oct 09 olle 978     int nDirs = nOwnDirs + nSharedDirs;
3458 23 Oct 09 olle 979     log.info("MyLS::writeDirListing(): nDirs = " + nDirs);
3458 23 Oct 09 olle 980     //
3458 23 Oct 09 olle 981     // Allocate size of directory string array
3467 28 Oct 09 olle 982     as_allFolders = new String[nDirs];
3458 23 Oct 09 olle 983     //
3458 23 Oct 09 olle 984     // Add own sub-directories in input directory
3458 23 Oct 09 olle 985     for (int i = 0; i < nOwnDirs; i++)
1656 22 May 07 gregory 986     {
3458 23 Oct 09 olle 987       org.proteios.core.Directory tmpCoreDir =
3458 23 Oct 09 olle 988         (org.proteios.core.Directory) ownDirList.get(i);
3458 23 Oct 09 olle 989       // Specify own sub-directory by name
3458 23 Oct 09 olle 990       String ownDirName = tmpCoreDir.getName();
3458 23 Oct 09 olle 991       //log.info("MyLS::writeDirListing(): tmpCoreDir = " + tmpCoreDir + " ownDirName = " + ownDirName);
3458 23 Oct 09 olle 992       as_allFolders[i] = ownDirName;
3458 23 Oct 09 olle 993       log
3458 23 Oct 09 olle 994         .info("MyLS::writeDirListing(): as_allFolders[" + i + "] = \"" + as_allFolders[i] + "\" isRemoved = " + tmpCoreDir
3458 23 Oct 09 olle 995           .isRemoved());
3458 23 Oct 09 olle 996       // Add directory to full directory list
3458 23 Oct 09 olle 997       dirList.add(tmpCoreDir);
931 16 Nov 06 olle 998     }
3458 23 Oct 09 olle 999     i_numberOfDirs = as_allFolders.length;
3458 23 Oct 09 olle 1000     log.info("MyLS::writeDirListing(): i_numberOfDirs = " + i_numberOfDirs);
3458 23 Oct 09 olle 1001     //
3458 23 Oct 09 olle 1002     // Add shared directories in input directory
3458 23 Oct 09 olle 1003     for (int i = 0; i < nSharedDirs; i++)
1656 22 May 07 gregory 1004     {
3458 23 Oct 09 olle 1005       org.proteios.core.Directory tmpCoreDir =
3458 23 Oct 09 olle 1006         (org.proteios.core.Directory) sharedDirList.get(i);
3458 23 Oct 09 olle 1007       // Specify shared directory by absolute path
3458 23 Oct 09 olle 1008       String sharedDirPath = tmpCoreDir.getPath().toString();
3458 23 Oct 09 olle 1009       //log.info("MyLS::writeDirListing(): tmpCoreDir = " + tmpCoreDir + " sharedDirPath = " + sharedDirPath);
3458 23 Oct 09 olle 1010       as_allFolders[nOwnDirs + i] = sharedDirPath;
1656 22 May 07 gregory 1011       log
3458 23 Oct 09 olle 1012         .info("MyLS::writeDirListing(): as_allFolders[" + (nOwnDirs + i) + "] = \"" + as_allFolders[nOwnDirs + i] + "\" isRemoved = " + tmpCoreDir
1656 22 May 07 gregory 1013           .isRemoved());
3458 23 Oct 09 olle 1014       // Add directory to full directory list
3458 23 Oct 09 olle 1015       dirList.add(tmpCoreDir);
790 23 Oct 06 olle 1016     }
1652 22 May 07 gregory 1017     i_numberOfDirs = as_allFolders.length;
790 23 Oct 06 olle 1018     log.info("MyLS::writeDirListing(): i_numberOfDirs = " + i_numberOfDirs);
3458 23 Oct 09 olle 1019     //
1652 22 May 07 gregory 1020     // If we had wanted to sort: Arrays.sort(allFolders, new
1652 22 May 07 gregory 1021     // ComparatorIgnoreCase());
1652 22 May 07 gregory 1022     MyGregorianCalendar tmpDate = new MyGregorianCalendar();
790 23 Oct 06 olle 1023     int hour, minute, sec, year, day, month, length, am_pm;
790 23 Oct 06 olle 1024     String tmpStr;
790 23 Oct 06 olle 1025     StringBuffer sb_tmpStr;
790 23 Oct 06 olle 1026     String tmpLengthAsString;
3467 28 Oct 09 olle 1027     for (int i = 0; i < nDirs; i++)
1656 22 May 07 gregory 1028     {
1652 22 May 07 gregory 1029       // Example, "-rw-r--r-- 84 2006-06-01 16:51 MYFILE1.TXT" is 54 chars
3458 23 Oct 09 olle 1030       sb_tmpStr = new StringBuffer(255);
1650 21 May 07 olle 1031       // Standard output for directory
1650 21 May 07 olle 1032       sb_tmpStr.append("drwxr-xr-x ");
1650 21 May 07 olle 1033       // Standard output links, user, group for directory
1650 21 May 07 olle 1034       sb_tmpStr.append("2 100 100 ");
1650 21 May 07 olle 1035       // Size (dummy value for directory listing)
1652 22 May 07 gregory 1036       tmpLengthAsString = "4096";
1650 21 May 07 olle 1037       // Fill in blanks at left to right-align size value.
1652 22 May 07 gregory 1038       int timesToLoop = 14 - tmpLengthAsString.length();
1656 22 May 07 gregory 1039       for (int j = 0; j < timesToLoop; j++)
1656 22 May 07 gregory 1040       {
1650 21 May 07 olle 1041         sb_tmpStr.append(" ");
1650 21 May 07 olle 1042       }
1652 22 May 07 gregory 1043       sb_tmpStr.append(tmpLengthAsString + " ");
790 23 Oct 06 olle 1044       /*
1652 22 May 07 gregory 1045        * The date and time format has been modified to the YYYY-MM-DD
1652 22 May 07 gregory 1046        * hh:mm format (using 24-hour time format).
790 23 Oct 06 olle 1047        */
1652 22 May 07 gregory 1048       // sb_tmpStr=new StringBuffer(70); //Example, "06-06-01 04:51AM 84
1652 22 May 07 gregory 1049       // MYFILE1.TXT" is 50 chars
1652 22 May 07 gregory 1050       // tmpFile=new File(s_path+as_allFilesAndFolders[i]);
1652 22 May 07 gregory 1051       org.proteios.core.Directory tmpCoreDir = (org.proteios.core.Directory) dirList
1656 22 May 07 gregory 1052         .get(i);
1652 22 May 07 gregory 1053       // tmpDate.mySetTimeInMillis(tmpFile.lastModified());
790 23 Oct 06 olle 1054       tmpDate.mySetTimeInMillis(tmpCoreDir.getCreated().getTime());
1652 22 May 07 gregory 1055       hour = tmpDate.get(GregorianCalendar.HOUR);
1652 22 May 07 gregory 1056       minute = tmpDate.get(GregorianCalendar.MINUTE);
1652 22 May 07 gregory 1057       day = tmpDate.get(GregorianCalendar.DAY_OF_MONTH);
1652 22 May 07 gregory 1058       month = tmpDate.get(GregorianCalendar.MONTH);
1652 22 May 07 gregory 1059       year = tmpDate.get(GregorianCalendar.YEAR);
1652 22 May 07 gregory 1060       am_pm = tmpDate.get(GregorianCalendar.AM_PM);
1652 22 May 07 gregory 1061       // year=year%100;
1652 22 May 07 gregory 1062       // sb_tmpStr.append(year+"-");
1652 22 May 07 gregory 1063       // sb_tmpStr.append(year+" ");
790 23 Oct 06 olle 1064       month++;
1652 22 May 07 gregory 1065       // if (month<10)
1652 22 May 07 gregory 1066       // sb_tmpStr.append(0);
1652 22 May 07 gregory 1067       // sb_tmpStr.append(month+"-");
1652 22 May 07 gregory 1068       sb_tmpStr.append(monthAbbr(month) + " ");
1652 22 May 07 gregory 1069       if (day < 10)
790 23 Oct 06 olle 1070         sb_tmpStr.append(0);
1652 22 May 07 gregory 1071       // sb_tmpStr.append(day+"-");
1652 22 May 07 gregory 1072       // sb_tmpStr.append(day+" ");
1652 22 May 07 gregory 1073       sb_tmpStr.append(day + " ");
1652 22 May 07 gregory 1074       // if (year<10)
1652 22 May 07 gregory 1075       // sb_tmpStr.append(0);
1652 22 May 07 gregory 1076       // sb_tmpStr.append(year+" ");
1656 22 May 07 gregory 1077       if (hour < 12 && am_pm == GregorianCalendar.PM)
1656 22 May 07 gregory 1078       {
790 23 Oct 06 olle 1079         hour = hour + 12;
790 23 Oct 06 olle 1080       }
1656 22 May 07 gregory 1081       if (!isYearOld(tmpCoreDir.getCreated()))
1656 22 May 07 gregory 1082       {
1652 22 May 07 gregory 1083         if (hour < 10)
1650 21 May 07 olle 1084           sb_tmpStr.append(0);
1652 22 May 07 gregory 1085         sb_tmpStr.append(hour + ":");
1652 22 May 07 gregory 1086         if (minute < 10)
1650 21 May 07 olle 1087           sb_tmpStr.append(0);
1650 21 May 07 olle 1088         sb_tmpStr.append(minute);
1656 22 May 07 gregory 1089       }
1656 22 May 07 gregory 1090       else
1656 22 May 07 gregory 1091       {
1650 21 May 07 olle 1092         sb_tmpStr.append(year);
1650 21 May 07 olle 1093       }
1650 21 May 07 olle 1094       /*
1656 22 May 07 gregory 1095        * if (hour<10) sb_tmpStr.append(0); sb_tmpStr.append(hour+":"); if
1656 22 May 07 gregory 1096        * (minute<10) sb_tmpStr.append(0); sb_tmpStr.append(minute);
1652 22 May 07 gregory 1097        */
1652 22 May 07 gregory 1098       // if (am_pm==GregorianCalendar.PM)
1652 22 May 07 gregory 1099       // sb_tmpStr.append("PM ");
1652 22 May 07 gregory 1100       // else
1652 22 May 07 gregory 1101       // sb_tmpStr.append("AM ");
1650 21 May 07 olle 1102       sb_tmpStr.append(" ");
1652 22 May 07 gregory 1103       // if (tmpFile.isDirectory())
1656 22 May 07 gregory 1104       if (false)
1656 22 May 07 gregory 1105       {
1652 22 May 07 gregory 1106         // sb_tmpStr.append("<DIR> ");
1656 22 May 07 gregory 1107         if (!tmpCoreDir.isRemoved())
1656 22 May 07 gregory 1108         {
1652 22 May 07 gregory 1109           sb_tmpStr.append("<DIR>          ");
1656 22 May 07 gregory 1110         }
1656 22 May 07 gregory 1111         else
1656 22 May 07 gregory 1112         {
1652 22 May 07 gregory 1113           sb_tmpStr.append("<DIR><REMOVED> ");
931 16 Nov 06 olle 1114         }
1656 22 May 07 gregory 1115       }
1656 22 May 07 gregory 1116       else
1656 22 May 07 gregory 1117       {
1652 22 May 07 gregory 1118         // tmpLengthAsString=""+tmpFile.length();
1652 22 May 07 gregory 1119         // tmpLengthAsString=""+tmpCoreFile.getBytes();
790 23 Oct 06 olle 1120         /*
790 23 Oct 06 olle 1121          * Fill in blanks at left to right-align size value.
790 23 Oct 06 olle 1122          */
1650 21 May 07 olle 1123         /*
1652 22 May 07 gregory 1124          * int timesToLoop=14-tmpLengthAsString.length(); for (int j=0;
1652 22 May 07 gregory 1125          * j<timesToLoop; j++) { sb_tmpStr.append(" "); }
1652 22 May 07 gregory 1126          * sb_tmpStr.append(tmpLengthAsString+" ");
1652 22 May 07 gregory 1127          */
790 23 Oct 06 olle 1128       }
1652 22 May 07 gregory 1129       // sb_tmpStr.append(as_allFolders[i]);
1656 22 May 07 gregory 1130       if (as_allFolders[i] != null)
1656 22 May 07 gregory 1131       {
931 16 Nov 06 olle 1132         sb_tmpStr.append(as_allFolders[i]);
1656 22 May 07 gregory 1133       }
1656 22 May 07 gregory 1134       else
1656 22 May 07 gregory 1135       {
1656 22 May 07 gregory 1136         if (tmpCoreDir.getName() != null)
1656 22 May 07 gregory 1137         {
931 16 Nov 06 olle 1138           sb_tmpStr.append(tmpCoreDir.getName() + " = (null)");
1656 22 May 07 gregory 1139         }
1656 22 May 07 gregory 1140         else
1656 22 May 07 gregory 1141         {
931 16 Nov 06 olle 1142           sb_tmpStr.append("(null)");
931 16 Nov 06 olle 1143         }
931 16 Nov 06 olle 1144       }
931 16 Nov 06 olle 1145       /*
1652 22 May 07 gregory 1146        * Start response string with optional prefix. Example: prefix =
1652 22 May 07 gregory 1147        * "213-".
931 16 Nov 06 olle 1148        */
1656 22 May 07 gregory 1149       if (prefix != null)
1656 22 May 07 gregory 1150       {
1652 22 May 07 gregory 1151         bos.writeBytes(prefix + sb_tmpStr.toString() + "\r\n");
1656 22 May 07 gregory 1152       }
1656 22 May 07 gregory 1153       else
1656 22 May 07 gregory 1154       {
1652 22 May 07 gregory 1155         bos.writeBytes(sb_tmpStr.toString() + "\r\n");
931 16 Nov 06 olle 1156       }
1652 22 May 07 gregory 1157       // bos.writeBytes("+s1234,\t"+as_allFilesAndFolders[i]+"\r\n");
790 23 Oct 06 olle 1158     }
1652 22 May 07 gregory 1159     // bos.flush();
1680 25 May 07 olle 1160     /*
1680 25 May 07 olle 1161      * Close DbControl.
1680 25 May 07 olle 1162      */
1680 25 May 07 olle 1163     dc.close();
790 23 Oct 06 olle 1164   }
790 23 Oct 06 olle 1165
1656 22 May 07 gregory 1166
3458 23 Oct 09 olle 1167   /**
3469 02 Nov 09 olle 1168    * Write the listing of project directories for shared projects to bos, but do not flush it.
3469 02 Nov 09 olle 1169    * Only includes projects owned by other users than current directory.
3469 02 Nov 09 olle 1170    * Method not in the original Xerver code.
3469 02 Nov 09 olle 1171    * 
3469 02 Nov 09 olle 1172    * @param bos DataOutputStream data output stream to write list to.
3469 02 Nov 09 olle 1173    * @param includeRemoved boolean flag indicating if removed files should be
3469 02 Nov 09 olle 1174    *        included.
3469 02 Nov 09 olle 1175    * @param prefix String optional prefix string at start of response string.
3469 02 Nov 09 olle 1176    */
3469 02 Nov 09 olle 1177   private void writeSharedProjectsDirListing(DataOutputStream bos, boolean includeRemoved,
3469 02 Nov 09 olle 1178       String prefix)
3469 02 Nov 09 olle 1179       throws Exception
3469 02 Nov 09 olle 1180   {
3469 02 Nov 09 olle 1181     // *** Debug Info
3469 02 Nov 09 olle 1182     log
3469 02 Nov 09 olle 1183       .info("MyLS::writeSharedProjectsDirListing(): Start - includeRemoved = " + includeRemoved + " prefix = \"" + prefix + "\" + isInSharedProjectsFolder() = " + isInSharedProjectsFolder());
3469 02 Nov 09 olle 1184     // try {
3469 02 Nov 09 olle 1185     String[] as_allFolders;
3469 02 Nov 09 olle 1186     int i_numberOfDirs;
3469 02 Nov 09 olle 1187     DbControl dc = getSessionControl().newDbControl();
3469 02 Nov 09 olle 1188     log.info("MyLS::writeSharedProjectsDirListing(): coreDir = " + coreDir);
3469 02 Nov 09 olle 1189     //
3469 02 Nov 09 olle 1190     // Get list of project directories for shared projects
3469 02 Nov 09 olle 1191     List<org.proteios.core.Directory> sharedProjectsDirList = fetchSharedProjectsDirList(dc, coreDir);
3469 02 Nov 09 olle 1192     int nDirs = sharedProjectsDirList.size();
3469 02 Nov 09 olle 1193     log.info("MyLS::writeSharedProjectsDirListing(): nDirs = " + nDirs);
3469 02 Nov 09 olle 1194     //
3469 02 Nov 09 olle 1195     for (int i = 0; i < nDirs; i++)
3469 02 Nov 09 olle 1196     {
3469 02 Nov 09 olle 1197       org.proteios.core.Directory tmpCoreDir = (org.proteios.core.Directory) sharedProjectsDirList
3469 02 Nov 09 olle 1198         .get(i);
3469 02 Nov 09 olle 1199       //String dirName = tmpCoreDir.getName();
3469 02 Nov 09 olle 1200       // Specify shared directory by absolute path
3469 02 Nov 09 olle 1201       String sharedDirPath = tmpCoreDir.getPath().toString();
3469 02 Nov 09 olle 1202       Date timeCreated = tmpCoreDir.getCreated();
3469 02 Nov 09 olle 1203       String dirEntryStr = fetchDirectoryEntry(sharedDirPath, timeCreated);
3469 02 Nov 09 olle 1204       if (prefix != null)
3469 02 Nov 09 olle 1205       {
3469 02 Nov 09 olle 1206         bos.writeBytes(prefix + dirEntryStr + "\r\n");
3469 02 Nov 09 olle 1207       }
3469 02 Nov 09 olle 1208       else
3469 02 Nov 09 olle 1209       {
3469 02 Nov 09 olle 1210         bos.writeBytes(dirEntryStr + "\r\n");
3469 02 Nov 09 olle 1211       }
3469 02 Nov 09 olle 1212     }
3469 02 Nov 09 olle 1213     // bos.flush();
3469 02 Nov 09 olle 1214     /*
3469 02 Nov 09 olle 1215      * Close DbControl.
3469 02 Nov 09 olle 1216      */
3469 02 Nov 09 olle 1217     dc.close();
3469 02 Nov 09 olle 1218   }
3469 02 Nov 09 olle 1219
3469 02 Nov 09 olle 1220
3469 02 Nov 09 olle 1221   /**
3469 02 Nov 09 olle 1222    * Fetches a directory entry for use in a directory listing.
3469 02 Nov 09 olle 1223    * 
3469 02 Nov 09 olle 1224    * @return String A directory entry for use in a directory listing. 
3469 02 Nov 09 olle 1225    */
3469 02 Nov 09 olle 1226   private String fetchDirectoryEntry(String dirName, Date timeCreated)
3469 02 Nov 09 olle 1227   {
3469 02 Nov 09 olle 1228     log.info("MyLS::fetchDirectoryEntry(): dirName = \"" + dirName + "\" timeCreated = " + timeCreated);
3469 02 Nov 09 olle 1229     MyGregorianCalendar tmpDate = new MyGregorianCalendar();
3469 02 Nov 09 olle 1230     int hour, minute, sec, year, day, month, length, am_pm;
3469 02 Nov 09 olle 1231     StringBuffer sb_tmpStr;
3469 02 Nov 09 olle 1232     String tmpLengthAsString;
3469 02 Nov 09 olle 1233     //
3469 02 Nov 09 olle 1234     // If no create time given, use current time
3469 02 Nov 09 olle 1235     if (timeCreated == null)
3469 02 Nov 09 olle 1236     {
3469 02 Nov 09 olle 1237       timeCreated = new Date();
3469 02 Nov 09 olle 1238     }
3469 02 Nov 09 olle 1239     // Example, "drwxr-xr-x 2 100 100           4096 2006-06-01 16:51 myDir" is 57 chars
3469 02 Nov 09 olle 1240     sb_tmpStr = new StringBuffer(255);
3469 02 Nov 09 olle 1241     // Standard output for directory
3469 02 Nov 09 olle 1242     sb_tmpStr.append("drwxr-xr-x ");
3469 02 Nov 09 olle 1243     // Standard output links, user, group for directory
3469 02 Nov 09 olle 1244     sb_tmpStr.append("2 100 100 ");
3469 02 Nov 09 olle 1245     // Size (dummy value for directory listing)
3469 02 Nov 09 olle 1246     tmpLengthAsString = "4096";
3469 02 Nov 09 olle 1247     // Fill in blanks at left to right-align size value.
3469 02 Nov 09 olle 1248     int timesToLoop = 14 - tmpLengthAsString.length();
3469 02 Nov 09 olle 1249     for (int j = 0; j < timesToLoop; j++)
3469 02 Nov 09 olle 1250     {
3469 02 Nov 09 olle 1251       sb_tmpStr.append(" ");
3469 02 Nov 09 olle 1252     }
3469 02 Nov 09 olle 1253     sb_tmpStr.append(tmpLengthAsString + " ");
3469 02 Nov 09 olle 1254     /*
3469 02 Nov 09 olle 1255      * The date and time format has been modified to the YYYY-MM-DD
3469 02 Nov 09 olle 1256      * hh:mm format (using 24-hour time format).
3469 02 Nov 09 olle 1257      */
3469 02 Nov 09 olle 1258     tmpDate.mySetTimeInMillis(timeCreated.getTime());
3469 02 Nov 09 olle 1259     hour = tmpDate.get(GregorianCalendar.HOUR);
3469 02 Nov 09 olle 1260     minute = tmpDate.get(GregorianCalendar.MINUTE);
3469 02 Nov 09 olle 1261     day = tmpDate.get(GregorianCalendar.DAY_OF_MONTH);
3469 02 Nov 09 olle 1262     month = tmpDate.get(GregorianCalendar.MONTH);
3469 02 Nov 09 olle 1263     year = tmpDate.get(GregorianCalendar.YEAR);
3469 02 Nov 09 olle 1264     am_pm = tmpDate.get(GregorianCalendar.AM_PM);
3469 02 Nov 09 olle 1265     // year=year%100;
3469 02 Nov 09 olle 1266     // sb_tmpStr.append(year+"-");
3469 02 Nov 09 olle 1267     // sb_tmpStr.append(year+" ");
3469 02 Nov 09 olle 1268     month++;
3469 02 Nov 09 olle 1269     // if (month<10)
3469 02 Nov 09 olle 1270     // sb_tmpStr.append(0);
3469 02 Nov 09 olle 1271     // sb_tmpStr.append(month+"-");
3469 02 Nov 09 olle 1272     sb_tmpStr.append(monthAbbr(month) + " ");
3469 02 Nov 09 olle 1273     if (day < 10)
3469 02 Nov 09 olle 1274       sb_tmpStr.append(0);
3469 02 Nov 09 olle 1275     // sb_tmpStr.append(day+"-");
3469 02 Nov 09 olle 1276     // sb_tmpStr.append(day+" ");
3469 02 Nov 09 olle 1277     sb_tmpStr.append(day + " ");
3469 02 Nov 09 olle 1278     // if (year<10)
3469 02 Nov 09 olle 1279     // sb_tmpStr.append(0);
3469 02 Nov 09 olle 1280     // sb_tmpStr.append(year+" ");
3469 02 Nov 09 olle 1281     if (hour < 12 && am_pm == GregorianCalendar.PM)
3469 02 Nov 09 olle 1282     {
3469 02 Nov 09 olle 1283       hour = hour + 12;
3469 02 Nov 09 olle 1284     }
3469 02 Nov 09 olle 1285     if (!isYearOld(timeCreated))
3469 02 Nov 09 olle 1286     {
3469 02 Nov 09 olle 1287       if (hour < 10)
3469 02 Nov 09 olle 1288         sb_tmpStr.append(0);
3469 02 Nov 09 olle 1289       sb_tmpStr.append(hour + ":");
3469 02 Nov 09 olle 1290       if (minute < 10)
3469 02 Nov 09 olle 1291         sb_tmpStr.append(0);
3469 02 Nov 09 olle 1292       sb_tmpStr.append(minute);
3469 02 Nov 09 olle 1293     }
3469 02 Nov 09 olle 1294     else
3469 02 Nov 09 olle 1295     {
3469 02 Nov 09 olle 1296       sb_tmpStr.append(year);
3469 02 Nov 09 olle 1297     }
3469 02 Nov 09 olle 1298     /*
3469 02 Nov 09 olle 1299      * if (hour<10) sb_tmpStr.append(0); sb_tmpStr.append(hour+":"); if
3469 02 Nov 09 olle 1300      * (minute<10) sb_tmpStr.append(0); sb_tmpStr.append(minute);
3469 02 Nov 09 olle 1301      */
3469 02 Nov 09 olle 1302     // if (am_pm==GregorianCalendar.PM)
3469 02 Nov 09 olle 1303     // sb_tmpStr.append("PM ");
3469 02 Nov 09 olle 1304     // else
3469 02 Nov 09 olle 1305     // sb_tmpStr.append("AM ");
3469 02 Nov 09 olle 1306     sb_tmpStr.append(" ");
3469 02 Nov 09 olle 1307     // sb_tmpStr.append(as_allFolders[i]);
3469 02 Nov 09 olle 1308     if (dirName != null)
3469 02 Nov 09 olle 1309     {
3469 02 Nov 09 olle 1310       sb_tmpStr.append(dirName);
3469 02 Nov 09 olle 1311     }
3469 02 Nov 09 olle 1312     else
3469 02 Nov 09 olle 1313     {
3469 02 Nov 09 olle 1314       sb_tmpStr.append("(null)");
3469 02 Nov 09 olle 1315     }
3469 02 Nov 09 olle 1316     log.info("MyLS::fetchDirectoryEntry(): return = \"" + sb_tmpStr.toString() + "\"");
3469 02 Nov 09 olle 1317     return sb_tmpStr.toString();
3469 02 Nov 09 olle 1318   }
3469 02 Nov 09 olle 1319
3469 02 Nov 09 olle 1320
3469 02 Nov 09 olle 1321   /**
3458 23 Oct 09 olle 1322    * Fetch list of sub-directories, excluding shared, to a parent directory.
3458 23 Oct 09 olle 1323    * Method not in the original Xerver code.
3458 23 Oct 09 olle 1324    * 
3458 23 Oct 09 olle 1325    * @param dc DbControl The DbControl to use.
3458 23 Oct 09 olle 1326    * @param dir org.proteios.core.Directory The directory to get sub-directories for.
3458 23 Oct 09 olle 1327    * @param includeRemoved boolean Flag indicating if removed files should be included.
3458 23 Oct 09 olle 1328    * @return List<org.proteios.core.Directory> A list of core sub-directories in input directory. 
3458 23 Oct 09 olle 1329    */
3458 23 Oct 09 olle 1330   private List<org.proteios.core.Directory> fetchOwnDirList(DbControl dc, org.proteios.core.Directory dir, boolean includeRemoved)
3458 23 Oct 09 olle 1331   {
3458 23 Oct 09 olle 1332     //log.info("MyLS::fetchOwnDirList(): Start - includeRemoved = " + includeRemoved);
3458 23 Oct 09 olle 1333     // Get ItemQuery for core subdirectories in core directory
3458 23 Oct 09 olle 1334     //log.info("MyLS::fetchOwnDirList(): dir = " + dir);
3518 09 Dec 09 olle 1335     ItemQuery<org.proteios.core.Directory> dirQuery = dir.getSubDirectories();
3458 23 Oct 09 olle 1336     if (includeRemoved)
3458 23 Oct 09 olle 1337     {
3458 23 Oct 09 olle 1338       dirQuery.include(Include.REMOVED, Include.NOT_REMOVED);
3458 23 Oct 09 olle 1339     }
3458 23 Oct 09 olle 1340     int nDirs = dirQuery.count(dc);
3458 23 Oct 09 olle 1341     //log.info("MyLS::fetchOwnDirList(): dirQuery.count(dc) = " + nDirs);
3458 23 Oct 09 olle 1342     // The list may exclude some items.
3458 23 Oct 09 olle 1343     List<org.proteios.core.Directory> tmpDirList = dirQuery.list(dc);
3458 23 Oct 09 olle 1344     List<org.proteios.core.Directory> dirList = new ArrayList<org.proteios.core.Directory>(0);
3458 23 Oct 09 olle 1345     for (int i=0; i < nDirs; i++)
3458 23 Oct 09 olle 1346     {
3458 23 Oct 09 olle 1347       org.proteios.core.Directory tmpCoreDir =
3458 23 Oct 09 olle 1348         (org.proteios.core.Directory) tmpDirList.get(i);
3458 23 Oct 09 olle 1349       try
3458 23 Oct 09 olle 1350       {
3458 23 Oct 09 olle 1351         dirList.add(tmpCoreDir);
3458 23 Oct 09 olle 1352       }
3458 23 Oct 09 olle 1353       catch (Exception e)
3458 23 Oct 09 olle 1354       {
3458 23 Oct 09 olle 1355         log.info("MyLS::fetchOwnDirList(): Exception when trying to execute dirList.add(tmpCoreDir): " + e);
3458 23 Oct 09 olle 1356       }
3458 23 Oct 09 olle 1357     }
3458 23 Oct 09 olle 1358     //log.info("MyLS::fetchOwnDirList(): (0) dirList.size() = " + dirList.size());
3458 23 Oct 09 olle 1359     return dirList;
3458 23 Oct 09 olle 1360   }
3458 23 Oct 09 olle 1361
3458 23 Oct 09 olle 1362
3458 23 Oct 09 olle 1363   /**
3458 23 Oct 09 olle 1364    * Fetch list of directories shared to a parent directory.
3466 28 Oct 09 olle 1365    * Excludes a shared directory equal to the input parent
3466 28 Oct 09 olle 1366    * directory or any sub-directory of the latter.
3458 23 Oct 09 olle 1367    * Method not in the original Xerver code.
3458 23 Oct 09 olle 1368    * 
3458 23 Oct 09 olle 1369    * @param dc DbControl The DbControl to use.
3458 23 Oct 09 olle 1370    * @param dir org.proteios.core.Directory The directory to get shared directories for.
3458 23 Oct 09 olle 1371    * @return List<org.proteios.core.Directory> A list of shared core directories in input directory. 
3458 23 Oct 09 olle 1372    */
3458 23 Oct 09 olle 1373   private List<org.proteios.core.Directory> fetchSharedDirList(DbControl dc, org.proteios.core.Directory dir)
3458 23 Oct 09 olle 1374   {
3458 23 Oct 09 olle 1375     //log.info("MyLS::fetchSharedDirList(): dir = " + dir);
3466 28 Oct 09 olle 1376     boolean includeRemoved = false;
3466 28 Oct 09 olle 1377     List<org.proteios.core.Directory> ownDirList = fetchOwnDirList(dc, dir, includeRemoved);
3466 28 Oct 09 olle 1378     List<org.proteios.core.Directory> dirList = fetchSharedDirList(dc, dir, ownDirList);
3466 28 Oct 09 olle 1379     return dirList;
3466 28 Oct 09 olle 1380   }
3466 28 Oct 09 olle 1381
3466 28 Oct 09 olle 1382
3466 28 Oct 09 olle 1383   /**
3466 28 Oct 09 olle 1384    * Fetch list of directories shared to a parent directory.
3466 28 Oct 09 olle 1385    * Excludes a shared directory equal to the input parent
3466 28 Oct 09 olle 1386    * directory or any sub-directory of the latter.
3466 28 Oct 09 olle 1387    * Method not in the original Xerver code.
3466 28 Oct 09 olle 1388    * 
3466 28 Oct 09 olle 1389    * @param dc DbControl The DbControl to use.
3466 28 Oct 09 olle 1390    * @param dir org.proteios.core.Directory The directory to get shared directories for.
3466 28 Oct 09 olle 1391    * @param ownDirList List<org.proteios.core.Directory> A list of own sub-directories to input directory. 
3466 28 Oct 09 olle 1392    * @return List<org.proteios.core.Directory> A list of shared core directories in input directory. 
3466 28 Oct 09 olle 1393    */
3466 28 Oct 09 olle 1394   private List<org.proteios.core.Directory> fetchSharedDirList(DbControl dc, org.proteios.core.Directory dir,
3466 28 Oct 09 olle 1395     List<org.proteios.core.Directory> ownDirList)
3466 28 Oct 09 olle 1396   {
3466 28 Oct 09 olle 1397     //log.info("MyLS::fetchSharedDirList(): dir = " + dir);
3458 23 Oct 09 olle 1398     List<org.proteios.core.Directory> dirList = new ArrayList<org.proteios.core.Directory>(0);
3458 23 Oct 09 olle 1399     // Get ItemQuery for core shared directories in core directory
3518 09 Dec 09 olle 1400     ItemQuery<org.proteios.core.Directory> sharedDirQuery = fetchSharedDirectoryQuery(dc, dir);
3458 23 Oct 09 olle 1401     if (sharedDirQuery != null)
3458 23 Oct 09 olle 1402     {
3458 23 Oct 09 olle 1403       List<org.proteios.core.Directory> sharedDirList = sharedDirQuery.list(dc);
3458 23 Oct 09 olle 1404       //log.info("MyLS::fetchSharedDirList(): sharedDirList.size() = " + sharedDirList.size());
3458 23 Oct 09 olle 1405       int nSharedDirs = sharedDirList.size();
3458 23 Oct 09 olle 1406       if (nSharedDirs > 0)
3458 23 Oct 09 olle 1407       {
3458 23 Oct 09 olle 1408         for (int i=0; i < nSharedDirs; i++)
3458 23 Oct 09 olle 1409         {
3458 23 Oct 09 olle 1410           org.proteios.core.Directory tmpCoreDir =
3458 23 Oct 09 olle 1411             (org.proteios.core.Directory) sharedDirList.get(i);
3466 28 Oct 09 olle 1412           // Check if shared directory should be used
3466 28 Oct 09 olle 1413           boolean useSharedDirectory = true;
3466 28 Oct 09 olle 1414           // Exclude shared directory equal to input directory
3466 28 Oct 09 olle 1415           if (tmpCoreDir.getId() == dir.getId())
3458 23 Oct 09 olle 1416           {
3466 28 Oct 09 olle 1417             useSharedDirectory = false;
3458 23 Oct 09 olle 1418           }
3466 28 Oct 09 olle 1419           // Exclude shared directory equal to sub-directory of input directory
3466 28 Oct 09 olle 1420           if (ownDirList != null)
3458 23 Oct 09 olle 1421           {
3466 28 Oct 09 olle 1422             for (int j=0; j < ownDirList.size(); j++)
3466 28 Oct 09 olle 1423             {
3466 28 Oct 09 olle 1424               org.proteios.core.Directory subDir =
3466 28 Oct 09 olle 1425                 (org.proteios.core.Directory) ownDirList.get(j);
3466 28 Oct 09 olle 1426               if (tmpCoreDir.getId() == subDir.getId())
3466 28 Oct 09 olle 1427               {
3466 28 Oct 09 olle 1428                 useSharedDirectory = false;
3466 28 Oct 09 olle 1429               }
3466 28 Oct 09 olle 1430             }
3458 23 Oct 09 olle 1431           }
3466 28 Oct 09 olle 1432           //
3466 28 Oct 09 olle 1433           if (useSharedDirectory)
3466 28 Oct 09 olle 1434           {
3466 28 Oct 09 olle 1435             // Add shared directory to list
3466 28 Oct 09 olle 1436             try
3466 28 Oct 09 olle 1437             {
3466 28 Oct 09 olle 1438               dirList.add(tmpCoreDir);
3466 28 Oct 09 olle 1439             }
3466 28 Oct 09 olle 1440             catch (Exception e)
3466 28 Oct 09 olle 1441             {
3466 28 Oct 09 olle 1442               log.info("MyLS::fetchSharedDirList(): Exception when trying to execute dirList.add(tmpCoreDir): " + e);
3466 28 Oct 09 olle 1443             }
3466 28 Oct 09 olle 1444           }
3458 23 Oct 09 olle 1445           //log.info("MyLS::fetchSharedDirList(): (1) dirList.size() = " + dirList.size());
3458 23 Oct 09 olle 1446         }
3458 23 Oct 09 olle 1447       }
3458 23 Oct 09 olle 1448     }
3458 23 Oct 09 olle 1449     else
3458 23 Oct 09 olle 1450     {
3458 23 Oct 09 olle 1451       log.info("MyLS::fetchSharedDirList(): sharedDirQuery = null");
3458 23 Oct 09 olle 1452     }
3458 23 Oct 09 olle 1453     //log.info("MyLS::fetchSharedDirList(): dirList.size() = " + dirList.size());
3458 23 Oct 09 olle 1454     return dirList;
3458 23 Oct 09 olle 1455   }
3458 23 Oct 09 olle 1456
3458 23 Oct 09 olle 1457
3458 23 Oct 09 olle 1458   /**
3469 02 Nov 09 olle 1459    * Fetch list of project directories for shared projects.
3469 02 Nov 09 olle 1460    * Excludes a project owned by the owner of the input directory.
3469 02 Nov 09 olle 1461    * Method not in the original Xerver code.
3469 02 Nov 09 olle 1462    * 
3469 02 Nov 09 olle 1463    * @param dc DbControl The DbControl to use.
3469 02 Nov 09 olle 1464    * @param dir org.proteios.core.Directory The directory to get shared project directories for.
3469 02 Nov 09 olle 1465    * @return List<org.proteios.core.Directory> A list of shared project directories. 
3469 02 Nov 09 olle 1466    */
3469 02 Nov 09 olle 1467   private List<org.proteios.core.Directory> fetchSharedProjectsDirList(DbControl dc, org.proteios.core.Directory dir)
3469 02 Nov 09 olle 1468   {
3469 02 Nov 09 olle 1469     log.info("MyLS::fetchSharedProjectsDirList(): dir = " + dir);
3469 02 Nov 09 olle 1470     DbControl tmpDc = null;
3469 02 Nov 09 olle 1471     try
3469 02 Nov 09 olle 1472     {
3469 02 Nov 09 olle 1473       tmpDc = dir.getDbControl();
3469 02 Nov 09 olle 1474     }
3469 02 Nov 09 olle 1475     catch (Exception e)
3469 02 Nov 09 olle 1476     {
3469 02 Nov 09 olle 1477       log.info("MyLS::fetchSharedProjectsDirList(): Exception when calling dir.getDbControl() : " + e);      
3469 02 Nov 09 olle 1478     }
3469 02 Nov 09 olle 1479     if (tmpDc == null || tmpDc.isClosed() || !tmpDc.isConnected())
3469 02 Nov 09 olle 1480     {
3469 02 Nov 09 olle 1481       // Create new instance of directory
3469 02 Nov 09 olle 1482       tmpDc = getSessionControl().newDbControl();
3469 02 Nov 09 olle 1483       int dirId = dir.getId();
3469 02 Nov 09 olle 1484       log.info("MyLS::fetchSharedProjectsDirList(): dirId = " + dirId);
3469 02 Nov 09 olle 1485       ItemFactory factory = new ItemFactory(tmpDc);
3469 02 Nov 09 olle 1486       dir = factory.getById(org.proteios.core.Directory.class, dirId);
3469 02 Nov 09 olle 1487     }
3469 02 Nov 09 olle 1488     List<org.proteios.core.Directory> dirList = new ArrayList<org.proteios.core.Directory>(0);
3469 02 Nov 09 olle 1489     // Get ItemQuery for shared projects
3469 02 Nov 09 olle 1490     ItemQuery<Project> projectQuery = Project.getQuery();
3469 02 Nov 09 olle 1491     projectQuery.include(Include.SHARED);
3469 02 Nov 09 olle 1492     projectQuery.include(Include.MINE);
3469 02 Nov 09 olle 1493     projectQuery.restrict(Restrictions.neq(Hql.property("closed"),
3469 02 Nov 09 olle 1494       Expressions.parameter("closed")));
3469 02 Nov 09 olle 1495     projectQuery.setParameter("closed", true, null);
3469 02 Nov 09 olle 1496     //
3469 02 Nov 09 olle 1497     List<Project> sharedProjectsList = projectQuery.list(tmpDc);
3469 02 Nov 09 olle 1498     int nSharedProjects = sharedProjectsList.size();
3469 02 Nov 09 olle 1499     log.info("MyLS::fetchSharedProjectsDirList(): nSharedProjects = " + nSharedProjects);
3469 02 Nov 09 olle 1500     if (nSharedProjects > 0)
3469 02 Nov 09 olle 1501     {
3469 02 Nov 09 olle 1502       int dirOwnerId = 0;
3469 02 Nov 09 olle 1503       try
3469 02 Nov 09 olle 1504       {
3469 02 Nov 09 olle 1505         if (dir != null)
3469 02 Nov 09 olle 1506         {
3469 02 Nov 09 olle 1507           dirOwnerId = dir.getOwner().getId();
3469 02 Nov 09 olle 1508         }
3469 02 Nov 09 olle 1509       }
3469 02 Nov 09 olle 1510       catch (Exception e)
3469 02 Nov 09 olle 1511       {
3469 02 Nov 09 olle 1512         log.info("MyLS::fetchSharedProjectsDirList(): Exception when trying to get owner id for dir = " + dir + " : " + e);
3469 02 Nov 09 olle 1513       }
3469 02 Nov 09 olle 1514       log.info("MyLS::fetchSharedProjectsDirList(): dir = " + dir + " dirOwnerId = " + dirOwnerId);
3469 02 Nov 09 olle 1515       for (int i=0; i < nSharedProjects; i++)
3469 02 Nov 09 olle 1516       {
3469 02 Nov 09 olle 1517         Project tmpProject = (Project) sharedProjectsList.get(i);
3469 02 Nov 09 olle 1518         org.proteios.core.Directory tmpCoreDir = tmpProject.getProjectDirectory();
3469 02 Nov 09 olle 1519         //log.info("MyLS::fetchSharedProjectsDirList(): tmpCoreDir = " + tmpCoreDir);
3469 02 Nov 09 olle 1520         boolean useSharedDirectory = true;
3469 02 Nov 09 olle 1521         // Exclude shared directory equal to input directory
3469 02 Nov 09 olle 1522         int tmpCoreDirOwnerId = 0;
3469 02 Nov 09 olle 1523         try
3469 02 Nov 09 olle 1524         {
3469 02 Nov 09 olle 1525           if (tmpCoreDir != null)
3469 02 Nov 09 olle 1526           {
3469 02 Nov 09 olle 1527             tmpCoreDirOwnerId = tmpCoreDir.getOwner().getId();
3469 02 Nov 09 olle 1528           }
3469 02 Nov 09 olle 1529         }
3469 02 Nov 09 olle 1530         catch (Exception e)
3469 02 Nov 09 olle 1531         {
3469 02 Nov 09 olle 1532           log.info("MyLS::fetchSharedProjectsDirList(): Exception when trying to get owner id for tmpCoreDir = " + tmpCoreDir + " : " + e);
3469 02 Nov 09 olle 1533           useSharedDirectory = false;
3469 02 Nov 09 olle 1534         }
3469 02 Nov 09 olle 1535         //log.info("MyLS::fetchSharedProjectsDirList(): tmpCoreDir = " + tmpCoreDir + " tmpCoreDirOwnerId = " + tmpCoreDirOwnerId);
3469 02 Nov 09 olle 1536         if (dirOwnerId > 0 && tmpCoreDirOwnerId > 0 && tmpCoreDirOwnerId == dirOwnerId)
3469 02 Nov 09 olle 1537         {
3469 02 Nov 09 olle 1538           useSharedDirectory = false;
3469 02 Nov 09 olle 1539         }
3469 02 Nov 09 olle 1540         //log.info("MyLS::fetchSharedProjectsDirList(): tmpCoreDir = " + tmpCoreDir + " useSharedDirectory = " + useSharedDirectory);
3469 02 Nov 09 olle 1541         //
3469 02 Nov 09 olle 1542         if (useSharedDirectory)
3469 02 Nov 09 olle 1543         {
3469 02 Nov 09 olle 1544           // Add shared directory to list
3469 02 Nov 09 olle 1545           try
3469 02 Nov 09 olle 1546           {
3469 02 Nov 09 olle 1547             dirList.add(tmpCoreDir);
3469 02 Nov 09 olle 1548           }
3469 02 Nov 09 olle 1549           catch (Exception e)
3469 02 Nov 09 olle 1550           {
3469 02 Nov 09 olle 1551             log.info("MyLS::fetchSharedProjectsDirList(): Exception when trying to execute dirList.add(tmpCoreDir): " + e);
3469 02 Nov 09 olle 1552           }
3469 02 Nov 09 olle 1553         }
3469 02 Nov 09 olle 1554         //log.info("MyLS::fetchSharedProjectsDirList(): (1) dirList.size() = " + dirList.size());
3469 02 Nov 09 olle 1555       }
3469 02 Nov 09 olle 1556     }
3469 02 Nov 09 olle 1557     log.info("MyLS::fetchSharedProjectsDirList(): dirList.size() = " + dirList.size());
3469 02 Nov 09 olle 1558     return dirList;
3469 02 Nov 09 olle 1559   }
3469 02 Nov 09 olle 1560
3469 02 Nov 09 olle 1561
3469 02 Nov 09 olle 1562   /**
3469 02 Nov 09 olle 1563    * Fetches the absolute path of shared projects directory
3469 02 Nov 09 olle 1564    * given the input directory path.
3469 02 Nov 09 olle 1565    * Method not in the original Xerver code.
3469 02 Nov 09 olle 1566    * 
3469 02 Nov 09 olle 1567    * @param inputDirPath String The path of the shared projects directory to find absolute path for.
3469 02 Nov 09 olle 1568    * @return String The absolute path of the input shared projects directory, or null if not found.
3469 02 Nov 09 olle 1569    */
3469 02 Nov 09 olle 1570   public String fetchSharedProjectsDirectoryPath(String inputDirPath)
3469 02 Nov 09 olle 1571   {
3469 02 Nov 09 olle 1572     // *** Debug Info
3469 02 Nov 09 olle 1573     log.info("MyLS::fetchSharedProjectsDirectoryPath(): Start - inputDirPath = \"" + inputDirPath + "\" isInSharedProjectsFolder() = " + isInSharedProjectsFolder());
3469 02 Nov 09 olle 1574     /*
3469 02 Nov 09 olle 1575      * Note: Input path might be e.g.
3469 02 Nov 09 olle 1576      * "Demo2_Shared_Directory1",
3469 02 Nov 09 olle 1577      * "/_Shared_Projects/Demo2_Shared_Directory1",
3469 02 Nov 09 olle 1578      * "/_Shared_Projects/Demo2_Shared_Directory1/Cool_Stuff",
3469 02 Nov 09 olle 1579      * where "Demo2_Shared_Directory1" is a project directory
3469 02 Nov 09 olle 1580      * for another user than the current one corresponding
3469 02 Nov 09 olle 1581      * to the shared projects directory.
3469 02 Nov 09 olle 1582      */
3469 02 Nov 09 olle 1583     if (inputDirPath == null)
3469 02 Nov 09 olle 1584     {
3469 02 Nov 09 olle 1585       return null;
3469 02 Nov 09 olle 1586     }
3469 02 Nov 09 olle 1587     String dirPath = new String(inputDirPath);
3469 02 Nov 09 olle 1588     // Remove ending separator from directory path
3469 02 Nov 09 olle 1589     if (dirPath.endsWith(coreSeparator))
3469 02 Nov 09 olle 1590     {
3469 02 Nov 09 olle 1591       dirPath = dirPath.substring(0, dirPath.length() - 1);
3469 02 Nov 09 olle 1592     }
3469 02 Nov 09 olle 1593     log.info("MyLS::fetchSharedProjectsDirectoryPath(): dirPath = \"" + dirPath + "\"");
3469 02 Nov 09 olle 1594     // Remove starting shared projects folder from directory path
3469 02 Nov 09 olle 1595     String sharedProjectsTestStr = new String(sharedProjectsFolderName + coreSeparator);
3469 02 Nov 09 olle 1596     int sharedProjectsIndex = dirPath.indexOf(sharedProjectsTestStr);
3469 02 Nov 09 olle 1597     if (sharedProjectsIndex >= 0)
3469 02 Nov 09 olle 1598     {
3469 02 Nov 09 olle 1599       dirPath = dirPath.substring(sharedProjectsIndex + sharedProjectsTestStr.length());
3469 02 Nov 09 olle 1600     }
3469 02 Nov 09 olle 1601     log.info("MyLS::fetchSharedProjectsDirectoryPath(): dirPath = \"" + dirPath + "\"");
3469 02 Nov 09 olle 1602     // Get project directory name
3469 02 Nov 09 olle 1603     String dirName = new String(dirPath);
3469 02 Nov 09 olle 1604     String subDirPath = null;
3469 02 Nov 09 olle 1605     int separatorIndex = dirName.indexOf(coreSeparator);
3469 02 Nov 09 olle 1606     if (separatorIndex >= 0)
3469 02 Nov 09 olle 1607     {
3469 02 Nov 09 olle 1608       dirName = dirPath.substring(0, separatorIndex);
3469 02 Nov 09 olle 1609       subDirPath = dirPath.substring(separatorIndex);
3469 02 Nov 09 olle 1610     }
3469 02 Nov 09 olle 1611     log.info("MyLS::fetchSharedProjectsDirectoryPath(): dirPath = \"" + dirPath + "\" dirName = \"" + dirName + "\" subDirPath = \"" + subDirPath + "\"");
3469 02 Nov 09 olle 1612     //
3469 02 Nov 09 olle 1613     DbControl dc = getSessionControl().newDbControl();
3469 02 Nov 09 olle 1614     log.info("MyLS::fetchSharedProjectsDirectoryPath(): coreDir = " + coreDir);
3469 02 Nov 09 olle 1615     //
3469 02 Nov 09 olle 1616     // Get list of project directories for shared projects
3469 02 Nov 09 olle 1617     List<org.proteios.core.Directory> sharedProjectsDirList = fetchSharedProjectsDirList(dc, coreDir);
3469 02 Nov 09 olle 1618     int nDirs = sharedProjectsDirList.size();
3469 02 Nov 09 olle 1619     log.info("MyLS::fetchSharedProjectsDirectoryPath(): nDirs = " + nDirs);
3469 02 Nov 09 olle 1620     String sharedProjectsDirPath = null;
3469 02 Nov 09 olle 1621     //
3469 02 Nov 09 olle 1622     for (int i = 0; i < nDirs; i++)
3469 02 Nov 09 olle 1623     {
3469 02 Nov 09 olle 1624       org.proteios.core.Directory tmpCoreDir = (org.proteios.core.Directory) sharedProjectsDirList
3469 02 Nov 09 olle 1625         .get(i);
3469 02 Nov 09 olle 1626       if (dirName != null && tmpCoreDir != null && dirName.equals(tmpCoreDir.getName()))
3469 02 Nov 09 olle 1627       {
3469 02 Nov 09 olle 1628         sharedProjectsDirPath = tmpCoreDir.getPath().toString();
3469 02 Nov 09 olle 1629         break;
3469 02 Nov 09 olle 1630       }
3469 02 Nov 09 olle 1631     }
3469 02 Nov 09 olle 1632     log.info("MyLS::fetchSharedProjectsDirectoryPath(): dirPath = \"" + dirPath + "\" dirName = \"" + dirName + "\" subDirPath = \"" + subDirPath + "\" sharedProjectsDirPath = \"" + sharedProjectsDirPath + "\"");
3469 02 Nov 09 olle 1633     // Add optional sub-directory path
3469 02 Nov 09 olle 1634     if (sharedProjectsDirPath != null && subDirPath != null)
3469 02 Nov 09 olle 1635     {
3469 02 Nov 09 olle 1636       sharedProjectsDirPath = sharedProjectsDirPath + subDirPath;
3469 02 Nov 09 olle 1637     }
3469 02 Nov 09 olle 1638     // Close DbControl.
3469 02 Nov 09 olle 1639     dc.close();
3469 02 Nov 09 olle 1640     //
3469 02 Nov 09 olle 1641     log.info("MyLS::fetchSharedProjectsDirectoryPath(): dirPath = \"" + dirPath + "\" dirName = \"" + dirName + "\" subDirPath = \"" + subDirPath + "\" sharedProjectsDirPath = \"" + sharedProjectsDirPath + "\"");
3469 02 Nov 09 olle 1642     return sharedProjectsDirPath;
3469 02 Nov 09 olle 1643   }
3469 02 Nov 09 olle 1644
3469 02 Nov 09 olle 1645
3469 02 Nov 09 olle 1646   /**
3458 23 Oct 09 olle 1647    * Fetch full list of directories, including shared, to a parent directory.
3458 23 Oct 09 olle 1648    * Method not in the original Xerver code.
3458 23 Oct 09 olle 1649    * 
3458 23 Oct 09 olle 1650    * @param dc DbControl The DbControl to use.
3458 23 Oct 09 olle 1651    * @param dir org.proteios.core.Directory The directory to get sub-directories and shared directories for.
3458 23 Oct 09 olle 1652    * @param includeRemoved boolean Flag indicating if removed files should be included.
3458 23 Oct 09 olle 1653    * @return List<org.proteios.core.Directory> A list of core directories in input directory. 
3458 23 Oct 09 olle 1654    */
3458 23 Oct 09 olle 1655   private List<org.proteios.core.Directory> fetchFullDirList(DbControl dc, org.proteios.core.Directory dir, boolean includeRemoved)
3458 23 Oct 09 olle 1656   {
3458 23 Oct 09 olle 1657     log.info("MyLS::fetchFullDirList(): Start - dir = " + dir + " includeRemoved = " + includeRemoved);
3458 23 Oct 09 olle 1658     List<org.proteios.core.Directory> dirList = fetchOwnDirList(dc, dir, includeRemoved);
3466 28 Oct 09 olle 1659     List<org.proteios.core.Directory> sharedDirList = fetchSharedDirList(dc, dir, dirList);
3458 23 Oct 09 olle 1660     log.info("MyLS::fetchFullDirList(): (1)  dirList.size() = " + dirList.size());
3458 23 Oct 09 olle 1661     log.info("MyLS::fetchFullDirList(): (1) sharedDirList.size() = " + sharedDirList.size());
3458 23 Oct 09 olle 1662     for (int i=0; i < sharedDirList.size(); i++)
3458 23 Oct 09 olle 1663     {
3458 23 Oct 09 olle 1664       org.proteios.core.Directory tmpCoreDir =
3458 23 Oct 09 olle 1665         (org.proteios.core.Directory) sharedDirList.get(i);
3458 23 Oct 09 olle 1666       try
3458 23 Oct 09 olle 1667       {
3458 23 Oct 09 olle 1668         dirList.add(tmpCoreDir);
3458 23 Oct 09 olle 1669       }
3458 23 Oct 09 olle 1670       catch (Exception e)
3458 23 Oct 09 olle 1671       {
3458 23 Oct 09 olle 1672         log.info("MyLS::fetchFullDirList(): Exception when trying to execute dirList.add(tmpCoreDir): " + e);
3458 23 Oct 09 olle 1673       }
3458 23 Oct 09 olle 1674       //log.info("MyLS::fetchFullDirList(): (1) dirList.size() = " + dirList.size());
3458 23 Oct 09 olle 1675     }
3458 23 Oct 09 olle 1676     //log.info("MyLS::fetchFullDirList(): dirList.size() = " + dirList.size());
3458 23 Oct 09 olle 1677     return dirList;
3458 23 Oct 09 olle 1678   }
3458 23 Oct 09 olle 1679
3458 23 Oct 09 olle 1680
3458 23 Oct 09 olle 1681   /**
3458 23 Oct 09 olle 1682    * Fetches an ItemQuery for obtaining directories
3458 23 Oct 09 olle 1683    * shared to an input directory.
3458 23 Oct 09 olle 1684    * Method not in the original Xerver code.
3458 23 Oct 09 olle 1685    * 
3458 23 Oct 09 olle 1686    * @param dc DbControl The DbControl to use.
3458 23 Oct 09 olle 1687    * @param dir org.proteios.core.Directory The directory to get sub-directories and shared directories for.
3518 09 Dec 09 olle 1688    * @return ItemQuery<org.proteios.core.Directory> A query for obtaining directories shared to the input directory.
3458 23 Oct 09 olle 1689    */
3518 09 Dec 09 olle 1690   private ItemQuery<org.proteios.core.Directory> fetchSharedDirectoryQuery(DbControl dc, org.proteios.core.Directory dir)
3458 23 Oct 09 olle 1691   {
3458 23 Oct 09 olle 1692     //log.info("MyLS::fetchSharedDirectoryQuery(): dir = " + dir);
3458 23 Oct 09 olle 1693     if (dc == null || dir == null)
3458 23 Oct 09 olle 1694     {
3458 23 Oct 09 olle 1695       return null;
3458 23 Oct 09 olle 1696     }
3458 23 Oct 09 olle 1697     // DbControl used to create directory may have been closed
3458 23 Oct 09 olle 1698     try
3458 23 Oct 09 olle 1699     {
3458 23 Oct 09 olle 1700       DbControl tmpDc = dir.getDbControl();
3458 23 Oct 09 olle 1701       //log.info("MyLS::fetchSharedDirectoryQuery(): dir.getDbControl() = " + tmpDc);
3458 23 Oct 09 olle 1702     }
3458 23 Oct 09 olle 1703     catch (Exception e)
3458 23 Oct 09 olle 1704     {
3458 23 Oct 09 olle 1705       // Create new instance of directory
3458 23 Oct 09 olle 1706       //log.info("MyLS::fetchSharedDirectoryQuery(): Exception when executing dir.getDbControl(): " + e);
3458 23 Oct 09 olle 1707       int dirId = dir.getId();
3458 23 Oct 09 olle 1708       //log.info("MyLS::fetchSharedDirectoryQuery(): dirId = " + dirId);
3458 23 Oct 09 olle 1709       ItemFactory factory = new ItemFactory(dc);
3458 23 Oct 09 olle 1710       dir = factory.getById(org.proteios.core.Directory.class, dirId);
3458 23 Oct 09 olle 1711     }
3458 23 Oct 09 olle 1712     //
3458 23 Oct 09 olle 1713     ItemQuery<org.proteios.core.Directory> query = null;
3467 28 Oct 09 olle 1714     boolean directoryIsProjectDirectory = directoryIsProjectDirectory(dir);
3467 28 Oct 09 olle 1715     if (directoryIsProjectDirectory)
3458 23 Oct 09 olle 1716     {      
3458 23 Oct 09 olle 1717       dir.getProjectKey();
3458 23 Oct 09 olle 1718       QueryFactory qf = new QueryFactory();
3458 23 Oct 09 olle 1719       query = qf.select(org.proteios.core.Directory.class);
3458 23 Oct 09 olle 1720       query.exclude(Include.MINE);
3458 23 Oct 09 olle 1721       query.include(Include.IN_PROJECT);
3458 23 Oct 09 olle 1722       List<org.proteios.core.Directory> allDirs = query.list(dc);
3458 23 Oct 09 olle 1723       List<Integer> excludeDirs = new ArrayList<Integer>();
3458 23 Oct 09 olle 1724       boolean use = false;
3458 23 Oct 09 olle 1725       // Only list the top directories, do not include the
3458 23 Oct 09 olle 1726       // current directory or directories with it as parent.
3458 23 Oct 09 olle 1727       for (org.proteios.core.Directory currentDir : allDirs)
3458 23 Oct 09 olle 1728       {
3458 23 Oct 09 olle 1729         if (!allDirs.contains(currentDir.getParent()) &&
3458 23 Oct 09 olle 1730             !currentDir.equals(dir) && !currentDir.getParent().equals(dir))
3458 23 Oct 09 olle 1731         {
3458 23 Oct 09 olle 1732           //log.debug("Included dir: " + currentDir.getName());
3458 23 Oct 09 olle 1733           use = true;
3458 23 Oct 09 olle 1734         }
3458 23 Oct 09 olle 1735         else
3458 23 Oct 09 olle 1736         {
3458 23 Oct 09 olle 1737           excludeDirs.add(currentDir.getId());
3458 23 Oct 09 olle 1738           //log.debug("Excluded dir: " + currentDir.getName());
3458 23 Oct 09 olle 1739         }
3458 23 Oct 09 olle 1740       }
3458 23 Oct 09 olle 1741       query.reset();
3458 23 Oct 09 olle 1742       // Add directories if there are any
3458 23 Oct 09 olle 1743       if (use)
3458 23 Oct 09 olle 1744       {
3458 23 Oct 09 olle 1745         for (Integer id : excludeDirs)
3458 23 Oct 09 olle 1746         {
3458 23 Oct 09 olle 1747           query.restrict(Restrictions.neq(Hql.property("id"),
3458 23 Oct 09 olle 1748             Expressions.integer(id.intValue())));
3458 23 Oct 09 olle 1749         }
3458 23 Oct 09 olle 1750       }
3458 23 Oct 09 olle 1751     }
3458 23 Oct 09 olle 1752     return query;
3458 23 Oct 09 olle 1753   }
3458 23 Oct 09 olle 1754
3458 23 Oct 09 olle 1755
3464 26 Oct 09 olle 1756   /**
3467 28 Oct 09 olle 1757    * Checks if core directory is project directory.
3467 28 Oct 09 olle 1758    * 
3467 28 Oct 09 olle 1759    * @param dir org.proteios.core.Directory The core directory to check.
3467 28 Oct 09 olle 1760    * @return boolean Returns true if the core directory is a project directory, else false.
3467 28 Oct 09 olle 1761    */
3467 28 Oct 09 olle 1762   private boolean directoryIsProjectDirectory(org.proteios.core.Directory dir)
3467 28 Oct 09 olle 1763   {    
3467 28 Oct 09 olle 1764     boolean directoryIsProjectDirectoryFlag = false;
3467 28 Oct 09 olle 1765     // DbControl used to create directory may have been closed
3467 28 Oct 09 olle 1766     try
3467 28 Oct 09 olle 1767     {
3467 28 Oct 09 olle 1768       directoryIsProjectDirectoryFlag = dir.isProjectDirectory();
3467 28 Oct 09 olle 1769       //log.info("MyLS::directoryIsProjectDirectory(): dir.isProjectDirectory() = " + directoryIsProjectDirectoryFlag);
3467 28 Oct 09 olle 1770     }
3467 28 Oct 09 olle 1771     catch (Exception e)
3467 28 Oct 09 olle 1772     {
3467 28 Oct 09 olle 1773       //log.info("MyLS::directoryIsProjectDirectory(): Exception when executing dir.isProjectDirectory(): " + e);
3467 28 Oct 09 olle 1774     }
3467 28 Oct 09 olle 1775     return directoryIsProjectDirectoryFlag;
3467 28 Oct 09 olle 1776   }
3467 28 Oct 09 olle 1777
3467 28 Oct 09 olle 1778
3467 28 Oct 09 olle 1779   /**
3464 26 Oct 09 olle 1780    * Checks if a directory name corresponds to a shared
3464 26 Oct 09 olle 1781    * directory for an input project directory, and if so,
3464 26 Oct 09 olle 1782    * returns the absolute core path of the shared directory, else null.
3464 26 Oct 09 olle 1783    * Method not in the original Xerver code.
3464 26 Oct 09 olle 1784    * 
3464 26 Oct 09 olle 1785    * @param parentDirPath String Path to directory to which a directory may be shared.
3464 26 Oct 09 olle 1786    * @param sharedDirName String Name of potential shared directory.
3464 26 Oct 09 olle 1787    * @return String Return the absolute core path of a shared directory.
3464 26 Oct 09 olle 1788    */
3464 26 Oct 09 olle 1789   public String fetchSharedDirectoryAbsoluteCorePath(String parentDirPath, String sharedDirName)
3464 26 Oct 09 olle 1790   {
3464 26 Oct 09 olle 1791     // *** Debug Info
3464 26 Oct 09 olle 1792     log.info("MyLS::fetchSharedDirectoryAbsoluteCorePath(): Start - parentDirPath = \"" + parentDirPath + "\" sharedDirName = \"" + sharedDirName + "\"");
3464 26 Oct 09 olle 1793     if (!isValidCoreDirectory(parentDirPath))
3464 26 Oct 09 olle 1794     {
3464 26 Oct 09 olle 1795       // Path is not valid core directory, return null
3464 26 Oct 09 olle 1796       return null;
3464 26 Oct 09 olle 1797     }
3464 26 Oct 09 olle 1798     if (sharedDirName == null || sharedDirName.equals(""))
3464 26 Oct 09 olle 1799     {
3464 26 Oct 09 olle 1800       return null;
3464 26 Oct 09 olle 1801     }
3464 26 Oct 09 olle 1802     DbControl dc = getSessionControl().newDbControl();
3464 26 Oct 09 olle 1803     ItemFactory factory = new ItemFactory(dc);
3464 26 Oct 09 olle 1804     org.proteios.core.Directory parentCoreDir = null;
3464 26 Oct 09 olle 1805     try
3464 26 Oct 09 olle 1806     {
3464 26 Oct 09 olle 1807       org.proteios.core.Path parentCoreDirPath = new org.proteios.core.Path(
3464 26 Oct 09 olle 1808         parentDirPath, Type.DIRECTORY);
3464 26 Oct 09 olle 1809       parentCoreDir = factory.getByPath(parentCoreDirPath);
3464 26 Oct 09 olle 1810       if (parentCoreDir.isRemoved())
3464 26 Oct 09 olle 1811       {
3464 26 Oct 09 olle 1812         log.info("MyLS::fetchSharedDirectoryAbsoluteCorePath(): Directory for path \"" + parentDirPath + "\" is removed.");
3464 26 Oct 09 olle 1813         parentCoreDir = null;
3464 26 Oct 09 olle 1814       }
3464 26 Oct 09 olle 1815     }
3464 26 Oct 09 olle 1816     catch (Exception e)
3464 26 Oct 09 olle 1817     {
3464 26 Oct 09 olle 1818       log.info("MyLS::fetchSharedDirectoryAbsoluteCorePath(): Exception when trying to get directory for path \"" + parentDirPath + "\": " + e);
3464 26 Oct 09 olle 1819     }
3464 26 Oct 09 olle 1820     if (parentCoreDir == null)
3464 26 Oct 09 olle 1821     {
3464 26 Oct 09 olle 1822       return null;
3464 26 Oct 09 olle 1823     }
3464 26 Oct 09 olle 1824     log.info("MyLS::fetchSharedDirectoryAbsoluteCorePath(): parentCoreDir = " + parentCoreDir);
3464 26 Oct 09 olle 1825     //
3464 26 Oct 09 olle 1826     // Get list of directories shared to input directory
3464 26 Oct 09 olle 1827     List<org.proteios.core.Directory> sharedDirList = fetchSharedDirList(dc, parentCoreDir);
3464 26 Oct 09 olle 1828     int nSharedDirs = sharedDirList.size();
3464 26 Oct 09 olle 1829     log.info("MyLS::fetchSharedDirectoryAbsoluteCorePath(): nSharedDirs = " + nSharedDirs);
3464 26 Oct 09 olle 1830     //
3464 26 Oct 09 olle 1831     // Check if input directory name is in list of shared directories
3464 26 Oct 09 olle 1832     String sharedDirPath = null;
3464 26 Oct 09 olle 1833     for (int i = 0; i < nSharedDirs; i++)
3464 26 Oct 09 olle 1834     {
3464 26 Oct 09 olle 1835       org.proteios.core.Directory tmpCoreDir =
3464 26 Oct 09 olle 1836         (org.proteios.core.Directory) sharedDirList.get(i);
3464 26 Oct 09 olle 1837       log.info("MyLS::fetchSharedDirectoryAbsoluteCorePath(): tmpCoreDir = " + tmpCoreDir);
3464 26 Oct 09 olle 1838       if (tmpCoreDir.getName().equals(sharedDirName))
3464 26 Oct 09 olle 1839       {
3464 26 Oct 09 olle 1840         sharedDirPath = tmpCoreDir.getPath().toString();
3464 26 Oct 09 olle 1841         break;
3464 26 Oct 09 olle 1842       }
3464 26 Oct 09 olle 1843     }
3464 26 Oct 09 olle 1844     log.info("MyLS::fetchSharedDirectoryAbsoluteCorePath(): sharedDirPath = \"" + sharedDirPath + "\"");
3464 26 Oct 09 olle 1845     return sharedDirPath;
3464 26 Oct 09 olle 1846   }
3464 26 Oct 09 olle 1847
3464 26 Oct 09 olle 1848
1656 22 May 07 gregory 1849   public String monthAbbr(int m)
1656 22 May 07 gregory 1850   {
1650 21 May 07 olle 1851     String result = null;
1656 22 May 07 gregory 1852     if (m == 1)
1656 22 May 07 gregory 1853     {
1650 21 May 07 olle 1854       result = new String("Jan");
1656 22 May 07 gregory 1855     }
1656 22 May 07 gregory 1856     else if (m == 2)
1656 22 May 07 gregory 1857     {
1650 21 May 07 olle 1858       result = new String("Feb");
1656 22 May 07 gregory 1859     }
1656 22 May 07 gregory 1860     else if (m == 3)
1656 22 May 07 gregory 1861     {
1650 21 May 07 olle 1862       result = new String("Mar");
1656 22 May 07 gregory 1863     }
1656 22 May 07 gregory 1864     else if (m == 4)
1656 22 May 07 gregory 1865     {
1650 21 May 07 olle 1866       result = new String("Apr");
1656 22 May 07 gregory 1867     }
1656 22 May 07 gregory 1868     else if (m == 5)
1656 22 May 07 gregory 1869     {
1650 21 May 07 olle 1870       result = new String("May");
1656 22 May 07 gregory 1871     }
1656 22 May 07 gregory 1872     else if (m == 6)
1656 22 May 07 gregory 1873     {
1650 21 May 07 olle 1874       result = new String("Jun");
1656 22 May 07 gregory 1875     }
1656 22 May 07 gregory 1876     else if (m == 7)
1656 22 May 07 gregory 1877     {
1650 21 May 07 olle 1878       result = new String("Jul");
1656 22 May 07 gregory 1879     }
1656 22 May 07 gregory 1880     else if (m == 8)
1656 22 May 07 gregory 1881     {
1650 21 May 07 olle 1882       result = new String("Aug");
1656 22 May 07 gregory 1883     }
1656 22 May 07 gregory 1884     else if (m == 9)
1656 22 May 07 gregory 1885     {
1650 21 May 07 olle 1886       result = new String("Sep");
1656 22 May 07 gregory 1887     }
1656 22 May 07 gregory 1888     else if (m == 10)
1656 22 May 07 gregory 1889     {
1650 21 May 07 olle 1890       result = new String("Oct");
1656 22 May 07 gregory 1891     }
1656 22 May 07 gregory 1892     else if (m == 11)
1656 22 May 07 gregory 1893     {
1650 21 May 07 olle 1894       result = new String("Nov");
1656 22 May 07 gregory 1895     }
1656 22 May 07 gregory 1896     else if (m == 12)
1656 22 May 07 gregory 1897     {
1650 21 May 07 olle 1898       result = new String("Dec");
1650 21 May 07 olle 1899     }
1650 21 May 07 olle 1900     return result;
1650 21 May 07 olle 1901   }
1652 22 May 07 gregory 1902
1656 22 May 07 gregory 1903
1656 22 May 07 gregory 1904   public boolean isYearOld(Date date)
1656 22 May 07 gregory 1905   {
1650 21 May 07 olle 1906     MyGregorianCalendar tmpDate = new MyGregorianCalendar();
1650 21 May 07 olle 1907     int hour_today, min_today, sec_today, year_today, day_today, mon_today, am_pm_today;
1650 21 May 07 olle 1908     int hour, minute, sec, year, day, month, length, am_pm;
1650 21 May 07 olle 1909     boolean result = false;
1650 21 May 07 olle 1910     /*
1650 21 May 07 olle 1911      * Get today's date
1650 21 May 07 olle 1912      */
1650 21 May 07 olle 1913     Date today = new Date();
1650 21 May 07 olle 1914     tmpDate.mySetTimeInMillis(today.getTime());
1650 21 May 07 olle 1915     hour_today = tmpDate.get(GregorianCalendar.HOUR);
1650 21 May 07 olle 1916     min_today = tmpDate.get(GregorianCalendar.MINUTE);
1650 21 May 07 olle 1917     day_today = tmpDate.get(GregorianCalendar.DAY_OF_MONTH);
1650 21 May 07 olle 1918     mon_today = tmpDate.get(GregorianCalendar.MONTH);
1650 21 May 07 olle 1919     year_today = tmpDate.get(GregorianCalendar.YEAR);
1650 21 May 07 olle 1920     am_pm_today = tmpDate.get(GregorianCalendar.AM_PM);
1650 21 May 07 olle 1921     mon_today++;
1656 22 May 07 gregory 1922     if (hour_today < 12 && am_pm_today == GregorianCalendar.PM)
1656 22 May 07 gregory 1923     {
1650 21 May 07 olle 1924       hour_today = hour_today + 12;
1650 21 May 07 olle 1925     }
1650 21 May 07 olle 1926     /*
1650 21 May 07 olle 1927      * Parse comparison date
1650 21 May 07 olle 1928      */
1650 21 May 07 olle 1929     tmpDate.mySetTimeInMillis(date.getTime());
1650 21 May 07 olle 1930     hour = tmpDate.get(GregorianCalendar.HOUR);
1650 21 May 07 olle 1931     minute = tmpDate.get(GregorianCalendar.MINUTE);
1650 21 May 07 olle 1932     day = tmpDate.get(GregorianCalendar.DAY_OF_MONTH);
1650 21 May 07 olle 1933     month = tmpDate.get(GregorianCalendar.MONTH);
1650 21 May 07 olle 1934     year = tmpDate.get(GregorianCalendar.YEAR);
1650 21 May 07 olle 1935     am_pm = tmpDate.get(GregorianCalendar.AM_PM);
1650 21 May 07 olle 1936     month++;
1656 22 May 07 gregory 1937     if (hour < 12 && am_pm == GregorianCalendar.PM)
1656 22 May 07 gregory 1938     {
1650 21 May 07 olle 1939       hour = hour + 12;
1650 21 May 07 olle 1940     }
1650 21 May 07 olle 1941     /*
1650 21 May 07 olle 1942      * Check if date is a year old
1650 21 May 07 olle 1943      */
1690 29 May 07 olle 1944     //log
1690 29 May 07 olle 1945     //  .debug("MyLS::isYearOld(): Today: year = " + year_today + " mon = " + mon_today + " day = " + day_today + " hour = " + hour_today + " min = " + min_today);
1690 29 May 07 olle 1946     //log
1690 29 May 07 olle 1947     //  .debug("MyLS::isYearOld(): Input: year = " + year + " mon = " + month + " day = " + day + " hour = " + hour + " min = " + minute);
1656 22 May 07 gregory 1948     if (year_today - year == 0)
1656 22 May 07 gregory 1949     {
1650 21 May 07 olle 1950       result = false;
1656 22 May 07 gregory 1951     }
1656 22 May 07 gregory 1952     else if (year_today - year > 1)
1656 22 May 07 gregory 1953     {
1650 21 May 07 olle 1954       result = true;
1656 22 May 07 gregory 1955     }
1656 22 May 07 gregory 1956     else if (mon_today - month > 0)
1656 22 May 07 gregory 1957     {
1650 21 May 07 olle 1958       result = true;
1656 22 May 07 gregory 1959     }
1656 22 May 07 gregory 1960     else if (day_today - day > 0)
1656 22 May 07 gregory 1961     {
1650 21 May 07 olle 1962       result = true;
1656 22 May 07 gregory 1963     }
1656 22 May 07 gregory 1964     else if (hour_today - hour > 0)
1656 22 May 07 gregory 1965     {
1650 21 May 07 olle 1966       result = true;
1656 22 May 07 gregory 1967     }
1656 22 May 07 gregory 1968     else if (min_today - minute >= 0)
1656 22 May 07 gregory 1969     {
1650 21 May 07 olle 1970       result = true;
1650 21 May 07 olle 1971     }
1690 29 May 07 olle 1972     //log.debug("MyLS::isYearOld(): return " + result);
1650 21 May 07 olle 1973     return result;
1650 21 May 07 olle 1974   }
1652 22 May 07 gregory 1975
1656 22 May 07 gregory 1976
741 10 Oct 06 olle 1977   /**
931 16 Nov 06 olle 1978    * Send the directory listing to bos. However, each line starts with "213-".
931 16 Nov 06 olle 1979    * 
1656 22 May 07 gregory 1980    * @param bos DataOutputStream data output stream to write list to.
1656 22 May 07 gregory 1981    * @param includeRemoved boolean flag indicating if removed files should be
1656 22 May 07 gregory 1982    *        included.
931 16 Nov 06 olle 1983    */
1652 22 May 07 gregory 1984   public void sendListingAsResponseFormat(DataOutputStream bos,
1656 22 May 07 gregory 1985       boolean includeRemoved)
1656 22 May 07 gregory 1986       throws Exception
1656 22 May 07 gregory 1987   {
931 16 Nov 06 olle 1988     // *** Debug Info
1652 22 May 07 gregory 1989     log
1656 22 May 07 gregory 1990       .info("MyLS::sendListingAsResponseFormat(): Start - includeRemoved = " + includeRemoved);
931 16 Nov 06 olle 1991     /*
931 16 Nov 06 olle 1992      * Send response strings beginning with prefix "213-".
931 16 Nov 06 olle 1993      */
931 16 Nov 06 olle 1994     bos.writeBytes("213-STAT directory listing:\r\n");
931 16 Nov 06 olle 1995     sendListing(bos, includeRemoved, "213-");
931 16 Nov 06 olle 1996   }
931 16 Nov 06 olle 1997
1656 22 May 07 gregory 1998
931 16 Nov 06 olle 1999   /**
931 16 Nov 06 olle 2000    * Send the directory listing to bos. However, each line starts with "213-".
931 16 Nov 06 olle 2001    * 
1656 22 May 07 gregory 2002    * @param bos DataOutputStream data output stream to write list to.
931 16 Nov 06 olle 2003    */
1652 22 May 07 gregory 2004   public void sendListingAsResponseFormat(DataOutputStream bos)
1656 22 May 07 gregory 2005       throws Exception
1656 22 May 07 gregory 2006   {
931 16 Nov 06 olle 2007     // *** Debug Info
931 16 Nov 06 olle 2008     log.info("MyLS::sendListingAsResponseFormat(): Start");
1652 22 May 07 gregory 2009     // try {
1652 22 May 07 gregory 2010     String[] as_allFilesAndFolders;
741 10 Oct 06 olle 2011     int i_numberOfFiles;
1652 22 May 07 gregory 2012     as_allFilesAndFolders = f_folder.list();
1652 22 May 07 gregory 2013     i_numberOfFiles = as_allFilesAndFolders.length;
1652 22 May 07 gregory 2014     // If we had wanted to sort: Arrays.sort(allFilesAndFolders, new
1652 22 May 07 gregory 2015     // ComparatorIgnoreCase());
741 10 Oct 06 olle 2016     bos.writeBytes("213-STAT directory listing:\r\n");
741 10 Oct 06 olle 2017     File tmpFile;
1652 22 May 07 gregory 2018     MyGregorianCalendar tmpDate = new MyGregorianCalendar();
741 10 Oct 06 olle 2019     int hour, minute, sec, year, day, month, length, am_pm;
741 10 Oct 06 olle 2020     String tmpStr;
741 10 Oct 06 olle 2021     StringBuffer sb_tmpStr;
741 10 Oct 06 olle 2022     String tmpLengthAsString;
1656 22 May 07 gregory 2023     for (int i = 0; i < i_numberOfFiles; i++)
1656 22 May 07 gregory 2024     {
1652 22 May 07 gregory 2025       sb_tmpStr = new StringBuffer(70); // Example, "06-06-01 04:51AM 84
1656 22 May 07 gregory 2026       // MYFILE1.TXT" is 50 chars
1652 22 May 07 gregory 2027       tmpFile = new File(s_path + as_allFilesAndFolders[i]);
741 10 Oct 06 olle 2028       tmpDate.mySetTimeInMillis(tmpFile.lastModified());
1652 22 May 07 gregory 2029       hour = tmpDate.get(GregorianCalendar.HOUR);
1652 22 May 07 gregory 2030       minute = tmpDate.get(GregorianCalendar.MINUTE);
1652 22 May 07 gregory 2031       day = tmpDate.get(GregorianCalendar.DAY_OF_MONTH);
1652 22 May 07 gregory 2032       month = tmpDate.get(GregorianCalendar.MONTH);
1652 22 May 07 gregory 2033       year = tmpDate.get(GregorianCalendar.YEAR);
1652 22 May 07 gregory 2034       am_pm = tmpDate.get(GregorianCalendar.AM_PM);
1652 22 May 07 gregory 2035       year = year % 100;
741 10 Oct 06 olle 2036       month++;
1652 22 May 07 gregory 2037       if (month < 10)
741 10 Oct 06 olle 2038         sb_tmpStr.append(0);
1652 22 May 07 gregory 2039       sb_tmpStr.append(month + "-");
1652 22 May 07 gregory 2040       if (day < 10)
741 10 Oct 06 olle 2041         sb_tmpStr.append(0);
1652 22 May 07 gregory 2042       sb_tmpStr.append(day + "-");
1652 22 May 07 gregory 2043       if (year < 10)
741 10 Oct 06 olle 2044         sb_tmpStr.append(0);
1652 22 May 07 gregory 2045       sb_tmpStr.append(year + "  ");
1652 22 May 07 gregory 2046       if (hour < 10)
741 10 Oct 06 olle 2047         sb_tmpStr.append(0);
1652 22 May 07 gregory 2048       sb_tmpStr.append(hour + ":");
1652 22 May 07 gregory 2049       if (minute < 10)
741 10 Oct 06 olle 2050         sb_tmpStr.append(0);
741 10 Oct 06 olle 2051       sb_tmpStr.append(minute);
1652 22 May 07 gregory 2052       if (am_pm == GregorianCalendar.PM)
741 10 Oct 06 olle 2053         sb_tmpStr.append("PM       ");
741 10 Oct 06 olle 2054       else
741 10 Oct 06 olle 2055         sb_tmpStr.append("AM       ");
1656 22 May 07 gregory 2056       if (tmpFile.isDirectory())
1656 22 May 07 gregory 2057       {
741 10 Oct 06 olle 2058         sb_tmpStr.append("<DIR>          ");
1656 22 May 07 gregory 2059       }
1656 22 May 07 gregory 2060       else
1656 22 May 07 gregory 2061       {
1652 22 May 07 gregory 2062         tmpLengthAsString = "" + tmpFile.length();
1652 22 May 07 gregory 2063         int timesToLoop = 14 - tmpLengthAsString.length();
1656 22 May 07 gregory 2064         for (int j = 0; j < timesToLoop; j++)
1656 22 May 07 gregory 2065         {
741 10 Oct 06 olle 2066           sb_tmpStr.append(" ");
741 10 Oct 06 olle 2067         }
1652 22 May 07 gregory 2068         sb_tmpStr.append(tmpLengthAsString + " ");
741 10 Oct 06 olle 2069       }
741 10 Oct 06 olle 2070       sb_tmpStr.append(as_allFilesAndFolders[i]);
1652 22 May 07 gregory 2071       bos.writeBytes("213-" + sb_tmpStr.toString() + "\r\n");
1652 22 May 07 gregory 2072       // bos.writeBytes("+s1234,\t"+as_allFilesAndFolders[i]+"\r\n");
741 10 Oct 06 olle 2073     }
1652 22 May 07 gregory 2074     // } catch (Exception e) {if (b_showErrors)System.out.println("Error @
1652 22 May 07 gregory 2075     // sendListingAsResponseFormat:\n"+e);}
741 10 Oct 06 olle 2076     bos.flush();
741 10 Oct 06 olle 2077   }
741 10 Oct 06 olle 2078
1656 22 May 07 gregory 2079
741 10 Oct 06 olle 2080   /**
1652 22 May 07 gregory 2081    * Send a alias listing as if the aliases where directories.
1652 22 May 07 gregory 2082    */
1652 22 May 07 gregory 2083   static public void sendAliaslisting(DataOutputStream bos, String[] aliases)
1656 22 May 07 gregory 2084       throws Exception
1656 22 May 07 gregory 2085   {
741 10 Oct 06 olle 2086     String tmpAlias;
1656 22 May 07 gregory 2087     for (int i = 0; i < aliases.length; i++)
1656 22 May 07 gregory 2088     {
1652 22 May 07 gregory 2089       tmpAlias = aliases[i];
1656 22 May 07 gregory 2090       bos
1656 22 May 07 gregory 2091         .writeBytes("01-01-01  01:01AM       <DIR>          " + tmpAlias + "\r\n");
741 10 Oct 06 olle 2092     }
741 10 Oct 06 olle 2093     bos.flush();
741 10 Oct 06 olle 2094   }
741 10 Oct 06 olle 2095
1656 22 May 07 gregory 2096
741 10 Oct 06 olle 2097   /**
1652 22 May 07 gregory 2098    * Send a alias listing as if the aliases where directories. However, each
1652 22 May 07 gregory 2099    * line starts with "213-".
1652 22 May 07 gregory 2100    */
1652 22 May 07 gregory 2101   static public void sendAliaslistingAsResponseFormat(DataOutputStream bos,
1656 22 May 07 gregory 2102       String[] aliases)
1656 22 May 07 gregory 2103       throws Exception
1656 22 May 07 gregory 2104   {
741 10 Oct 06 olle 2105     String tmpAlias;
1656 22 May 07 gregory 2106     for (int i = 0; i < aliases.length; i++)
1656 22 May 07 gregory 2107     {
1652 22 May 07 gregory 2108       tmpAlias = aliases[i];
1656 22 May 07 gregory 2109       bos
1656 22 May 07 gregory 2110         .writeBytes("213-01-01-01  01:01AM       <DIR>          " + tmpAlias + "\r\n");
741 10 Oct 06 olle 2111     }
741 10 Oct 06 olle 2112   }
741 10 Oct 06 olle 2113
1656 22 May 07 gregory 2114
741 10 Oct 06 olle 2115   /**
1652 22 May 07 gregory 2116    * Send a HTML-page where you can choose a folder located at <CODE>argPath</CODE>.
1652 22 May 07 gregory 2117    */
1656 22 May 07 gregory 2118   static public void showChooseDirectory(DataOutputStream os, String argPath)
1656 22 May 07 gregory 2119   {
1656 22 May 07 gregory 2120     try
1656 22 May 07 gregory 2121     {
1652 22 May 07 gregory 2122       String s_path = argPath;
1652 22 May 07 gregory 2123       PathInfo PI_path = new PathInfo(s_path);
1652 22 May 07 gregory 2124       File f_currentFolder = PI_path.getCurrentFolder(); // This is null
1656 22 May 07 gregory 2125       // if "argPath"
1656 22 May 07 gregory 2126       // given to the
1656 22 May 07 gregory 2127       // constructor
1656 22 May 07 gregory 2128       // is (1) null,
1656 22 May 07 gregory 2129       // (2) "", (3)
1656 22 May 07 gregory 2130       // an invalid
1656 22 May 07 gregory 2131       // path or (4)
1656 22 May 07 gregory 2132       // an unreadable
1656 22 May 07 gregory 2133       // path, such as
1656 22 May 07 gregory 2134       // A: without a
1656 22 May 07 gregory 2135       // floppy disk.
1652 22 May 07 gregory 2136       File[] af_allFiles = PI_path.getAllFiles();
1652 22 May 07 gregory 2137       boolean directoryIsValid = PI_path.getDirectoryIsValid();
1652 22 May 07 gregory 2138       os
1656 22 May 07 gregory 2139         .writeBytes("<HTML><HEAD>" + "<TITLE>Choose directory!</TITLE>" + "<SCRIPT LANGUAGE=javascript>" + "function chooseDir(path)" + "{" + "  if (opener==null || opener==\"undefined\")" + "  {" + "    alert(\"An error has occured: Please close the \\\"Choose a directory\\\" window and re-open again before you can choose a directory.\");" + "  }" + "  else" + "  {" + "    if (path.substring(path.length-1,path.length)!=\"/\" && path.substring(path.length-1,path.length)!=\"\\\\\")" + // Path
1656 22 May 07 gregory 2140         // is a
1656 22 May 07 gregory 2141         // normal
1656 22 May 07 gregory 2142         // folder,
1656 22 May 07 gregory 2143         // not
1656 22 May 07 gregory 2144         // a
1656 22 May 07 gregory 2145         // root...
1656 22 May 07 gregory 2146         // //If
1656 22 May 07 gregory 2147         // path is a root path already has an / (or \)
1656 22 May 07 gregory 2148         // in the end, but if path is just a normal
1656 22 May 07 gregory 2149         // folder there is no / (or \) in path
1656 22 May 07 gregory 2150         "    {" + "      path+=\"\\" + File.separator + "\";" + // Will
1656 22 May 07 gregory 2151         // result
1656 22 May 07 gregory 2152         // in:
1656 22 May 07 gregory 2153         // path+="\\";
1656 22 May 07 gregory 2154         // or
1656 22 May 07 gregory 2155         // path+="\/";
1656 22 May 07 gregory 2156         "    }" + "    opener.dirChoosen(path);" + "    top.close();" + "  }" + "}" + "" + "" + "function replace(str,oldChar,newChar)" + "{" + "  for (i=0;i<str.length; i++)" + "  {" + "    if (str.substring(i,i+1)==oldChar)" + "      str=str.substring(0,i)+newChar+str.substring(i+1,str.length);" + "  }" + "" + "  return str;" + "}" + "" + "</SCRIPT>" + "</HEAD><BODY>" + "<FONT FACE=\"tahoma, arial, verdana\">" + "<H2>Choose a directory");
1652 22 May 07 gregory 2157       if (f_currentFolder != null && directoryIsValid)
1652 22 May 07 gregory 2158         os.writeBytes(" [ " + f_currentFolder.toString() + " ]");
1652 22 May 07 gregory 2159       os.writeBytes("</H2>");
1656 22 May 07 gregory 2160       if (!directoryIsValid)
1656 22 May 07 gregory 2161       {
1656 22 May 07 gregory 2162         os
1656 22 May 07 gregory 2163           .writeBytes("Xerver had problems try to find or read <B>" + s_path + "</B>." + "<BR>" + "Listing your roots instead!" + "<P>");
1652 22 May 07 gregory 2164       }
1656 22 May 07 gregory 2165       os
1656 22 May 07 gregory 2166         .writeBytes("Choose a directory by pressing the Choose-button." + "<BR>" + "Browse a directory by pressing the directory name." + "</FONT>" + "<P>" + "<PRE>");
1652 22 May 07 gregory 2167       if (f_currentFolder != null) // If [All roots are NOT being
1656 22 May 07 gregory 2168       // listed]...
1652 22 May 07 gregory 2169       {
1652 22 May 07 gregory 2170         os
1656 22 May 07 gregory 2171           .writeBytes("<B>[<A HREF=\"javascript:chooseDir(\'" + MyString
1656 22 May 07 gregory 2172             .searchAndReplace(MyString.searchAndReplace(
1656 22 May 07 gregory 2173               f_currentFolder.toString(), "\\", "\\\\"), "'",
1656 22 May 07 gregory 2174               "\\'") + "\');\" STYLE=\"text-decoration: none;\">Choose this folder</A>]&nbsp;&nbsp;&nbsp;" + f_currentFolder
1656 22 May 07 gregory 2175             .toString() + "</B>\r\n");
1652 22 May 07 gregory 2176         os.writeBytes("\r\n");
1652 22 May 07 gregory 2177         File f_oneLevelUp = f_currentFolder.getParentFile();
1652 22 May 07 gregory 2178         if (f_oneLevelUp != null) // This is NOT root level, so show a
1656 22 May 07 gregory 2179           // ".." link
1652 22 May 07 gregory 2180           os
1656 22 May 07 gregory 2181             .writeBytes("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A HREF=\"#\" onClick=\"location='/?action=chooseDirectory&currentPath='+replace(escape('" + MyString
1656 22 May 07 gregory 2182               .searchAndReplace(MyString.searchAndReplace(
1656 22 May 07 gregory 2183                 f_oneLevelUp.toString(), "\\", "\\\\"), "'",
1656 22 May 07 gregory 2184                 "\\'") + "'),'+','%2B')\" STYLE=\"text-decoration: none;\">../</A>\r\n");
1652 22 May 07 gregory 2185         else
1652 22 May 07 gregory 2186           // This is the root letter, press ".." to show all drives
1652 22 May 07 gregory 2187           os
1656 22 May 07 gregory 2188             .writeBytes("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A HREF='/?action=chooseDirectory' STYLE=\"text-decoration: none;\">../</A>\r\n");
1652 22 May 07 gregory 2189       }
1652 22 May 07 gregory 2190       Arrays.sort(af_allFiles);
1652 22 May 07 gregory 2191       boolean tmpFoldersShown = false;
1656 22 May 07 gregory 2192       for (int i = 0, allFilesLength = af_allFiles.length; i < allFilesLength; i++)
1656 22 May 07 gregory 2193       {
1652 22 May 07 gregory 2194         File tmpFile = af_allFiles[i];
1652 22 May 07 gregory 2195         if (f_currentFolder == null || tmpFile.isDirectory()) // If
1656 22 May 07 gregory 2196         // [it's
1656 22 May 07 gregory 2197         // a
1656 22 May 07 gregory 2198         // directory]
1656 22 May 07 gregory 2199         // OR
1656 22 May 07 gregory 2200         // [All
1656 22 May 07 gregory 2201         // roots
1656 22 May 07 gregory 2202         // are
1656 22 May 07 gregory 2203         // being
1656 22 May 07 gregory 2204         // listed]...
1652 22 May 07 gregory 2205         {
1652 22 May 07 gregory 2206           tmpFoldersShown = true;
1652 22 May 07 gregory 2207           os
1656 22 May 07 gregory 2208             .writeBytes("[<A HREF=\"javascript:chooseDir(\'" + MyString
1656 22 May 07 gregory 2209               .searchAndReplace(MyString.searchAndReplace(tmpFile
1656 22 May 07 gregory 2210                 .toString(), "\\", "\\\\"), "'", "\\'") + "\');\" STYLE=\"text-decoration: none;\">Choose</A>]&nbsp;&nbsp;&nbsp;<A HREF=\"#\" onClick=\"location='/?action=chooseDirectory&currentPath='+replace(escape('" + MyString
1656 22 May 07 gregory 2211               .searchAndReplace(MyString.searchAndReplace(tmpFile
1656 22 May 07 gregory 2212                 .toString(), "\\", "\\\\"), "'", "\\'") + "'),'+','%2B')\" STYLE=\"text-decoration: none;\">" + tmpFile + "</A>\r\n");
1652 22 May 07 gregory 2213         }
741 10 Oct 06 olle 2214       }
1656 22 May 07 gregory 2215       if (!tmpFoldersShown)
1656 22 May 07 gregory 2216       {
1652 22 May 07 gregory 2217         os
1656 22 May 07 gregory 2218           .writeBytes("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;No folders exists in\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<B>" + s_path + "</B>");
1652 22 May 07 gregory 2219       }
1652 22 May 07 gregory 2220       os.writeBytes("</PRE>");
1652 22 May 07 gregory 2221       os.writeBytes("</BODY>");
1652 22 May 07 gregory 2222       os.writeBytes("</HTML>");
1656 22 May 07 gregory 2223     }
1656 22 May 07 gregory 2224     catch (Exception e)
1656 22 May 07 gregory 2225     {
1652 22 May 07 gregory 2226       if (b_showErrors)
1652 22 May 07 gregory 2227         System.out
1656 22 May 07 gregory 2228           .println("An error has occured @ showChooseDirectory:\n" + e);
741 10 Oct 06 olle 2229     }
741 10 Oct 06 olle 2230   }
741 10 Oct 06 olle 2231 }