Package com.sun.enterprise.instance

Source Code of com.sun.enterprise.instance.InstanceEnvironment

/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License").  You
* may not use this file except in compliance with the License. You can obtain
* a copy of the License at https://glassfish.dev.java.net/public/CDDL+GPL.html
* or glassfish/bootstrap/legal/LICENSE.txt.  See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at glassfish/bootstrap/legal/LICENSE.txt.
* Sun designates this particular file as subject to the "Classpath" exception
* as provided by Sun in the GPL Version 2 section of the License file that
* accompanied this code.  If applicable, add the following below the License
* Header, with the fields enclosed by brackets [] replaced by your own
* identifying information: "Portions Copyrighted [year]
* [name of copyright owner]"
*
* Contributor(s):
*
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your decision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license."  If you don't indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above.  However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/


package com.sun.enterprise.instance;

//JDK imports
import java.io.File;
import java.io.IOException;
//iAS imports
import com.sun.enterprise.util.StringUtils;
import com.sun.enterprise.util.OS;
import com.sun.enterprise.util.io.FileUtils;
import com.sun.enterprise.util.diagnostics.*;
import com.sun.enterprise.server.Constants;
import com.sun.enterprise.deployment.backend.DeployableObjectType;
import com.sun.enterprise.config.ConfigException;
import com.sun.enterprise.config.ConfigContext;
import com.sun.enterprise.config.ConfigFactory;
import com.sun.enterprise.config.serverbeans.Server;
import com.sun.enterprise.config.serverbeans.Domain;
import com.sun.enterprise.config.serverbeans.EjbContainer;
import com.sun.enterprise.config.serverbeans.HttpService;
//import com.sun.enterprise.config.serverbeans.Mime;
//import com.sun.enterprise.config.serverbeans.VirtualServerClass;
import com.sun.enterprise.config.serverbeans.VirtualServer;

import com.sun.enterprise.admin.common.exception.AFRuntimeStoreException;

import com.sun.enterprise.admin.server.core.channel.AdminChannel;
import com.sun.enterprise.admin.server.core.channel.RMIClient;

import java.io.FileReader;
import java.io.FileWriter;
import java.util.logging.Logger;
import java.util.logging.Level;
import com.sun.logging.LogDomains;

import com.sun.enterprise.admin.server.core.ManualChangeManager;
/*installConfig is removed and we need better alternative */
//import com.iplanet.ias.installer.core.installConfig;

//ROB: config changes
import com.sun.enterprise.config.serverbeans.Config;
import com.sun.enterprise.config.serverbeans.ServerBeansFactory;
import com.sun.enterprise.config.serverbeans.PropertyResolver;

//Tomcat
import com.sun.enterprise.server.ApplicationServer;
import com.sun.enterprise.server.pluggable.PluggableFeatureFactory;
import com.sun.enterprise.server.ServerContext;

/**
  The class that stores <code> all environment </code> of a iAS SE Server Instance
  with a given name. The name of the instance is the same as given by the
  (administrative) user. The class hides all the details of mapping between
  such a name and its location on disk. Note that this class is responsible for
  environment of a single Server Instance only.
        Upgraded it to the new file layout. Please refer to
  <a href="http://iaseng.red.iplanet.com/packages/iasse7_filelayout.html">
  new file layout for the instance configuration. </a> This class should
  be in unison with this document.

  Please note that there is a dependency on installer code. If you make
  any changes to this file, make sure that you visit installer code
  at com/iplanet/ias/installer/windows/actions

  @author  Kedar
  @version 1.1
*/

public final class InstanceEnvironment {
   
        private static Object lock = new Object();
   
        /** enable/disable TimeStamp mechanism TOTALLY */
        private static final boolean TIMESTAMP_MECHANISM_ENABLED = true;
       
        /** enable/disable TimeStamp mechinism for Mime.types.
         * makes sense only if TIME_STAMP_MECHANISM_ENABLED is true;
         */
        private static final boolean MIMETYPE_TIMESTAMP_MECHANISM_ENABLED = true;

        private static final boolean VIRTUAL_SERVER_TIMESTAMP_MECHANISM_ENABLED
                = true;
       
        private static final long INVALID_TIME_STAMP = 0;
       
        private static final long UNINITIALIZED_TIME_STAMP = 0;

  private static Logger _logger = LogDomains.getLogger(LogDomains.CORE_LOGGER);

  /** folder where the configuration of this instance is stored */

  public static final String kConfigDirName    = "config";
 
  /** folder where the configuration of this instance is backed up */
 
  public static final String kBackupDirName    = ".";
 
  // bnevins, Sept. 2003 -- kBackupDirName was changed to "."
  // This String is used for creating
  // repository backup dirs as well as the now defunct config backup dir.
  // I created a new variable for repository.  I see no good reason to make
  // it public like the rest of these variables ?!?
 
  private static final String kRepositoryBackupDirName    = "backup";
 
  /** folder where all generated code like compiled jsps, stubs is stored */
 
  public static final String kGeneratedDirName    = "generated";
 
  /** default folder where deployed j2ee-apps are stored */
  public static final String kRepositoryDirName    = "applications";
   
  public static final String kApplicationDirName    = "j2ee-apps";
 
  /** folder where deployed modules are stored */
 
  public static final String kModuleDirName    = "j2ee-modules";
 
  /** folder where all the deployed life cycle modules are stored */
 
  public static final String kLifecycleModuleDirName      = "lifecycle-modules";
 
  /** folder where ejb related stuff is stored */
 
  public static final String kEJBStubDirName              = "ejb";
 
  /** name of the configuration file */
    /** New for 8.0 - domain.xml is config file name */ 

  public static final String kConfigXMLFileName    = "domain.xml";

    /** New for 8.0 - domain.xml is config file name */ 

  public static final String kServerXMLFileName    = "server.xml";
 
  /** folder where the other required classes are stored */
 
  public static final String kLibDirName                  = "lib";

    /** folder where the auto deploy monitor looks for new archives to deploy */
  public static final String kAutoDeployDirName           = "autodeploy";
 
  /** folder where the customer overridden classes are stored */
 
  public static final String kLibClassesDirName           = "classes";
 
  /** folder where the compiled JSP pages reside */
 
  public static final String kCompileJspDirName    = "jsp";

  /** folder where the modified xml files reside */
 
  public static final String kGeneratedXMLDirName    = "xml";
 
  /** folder where the session info or passivated ejbs are to be stored
            can be overridden in the server.xml */
 
  public static final String kSessionStoreDirName    = "session-store";
 
  /** folder to persist the HTTP session data */
 
  public static final String kHttpSessionDirName    = "http";
 
  /** folder for docroot */
    public static final String kDocRootDirName              = "docroot";
   
    /** object file name */
    public static final String kObjectFileName              = "obj.conf";

    /** init file name */
    public static final String kInitFileName                = "init.conf";
   
  /** name of the iWS NSS passwords file */
 
  public static final String kSecurityPasswordsFileName    = "password.conf";
 
  /** name of the realms key file */
 
  public static final String kRealmsKeyFileName    = "keyfile";

    /** name of the install dir */

  public static final String kInstallDirName          = "install";

    /** name of the templates dir */

  public static final String kTemplatesDirName        = "templates";

    /**  ACL template name */
  public static final String kAclTemplate             = "template.acl";

    /** default orb-listener port */
    public static final int kOrbListenerPort                = 3700;

    /** default jms-service (imq) port */
    public static final int kJmsProviderPort                = 7676;

    /** directory where java-web-start related files are located */
    public static final String kJavaWebStartDirName         = "java-web-start";
   
    /* installRoot is the server installation root */
  private String instanceRoot        = null;

  private String mLogicalName        = null;
  private String mConfigFilePath        = null;
  private String mBackupConfigFilePath      = null;
  /** mApplicationRootPath points to the application root of the server. If
    this is unspecified, it will default to <instance_dir>/applications.
    This is where J2EE applications, modules, life-cycle modules will be
    created.
  */
  private String mApplicationRootPath        = null;
 
  /** mApplicationRepositoryPath is where the j2ee-apps are stored. It is
    possible that the applications running/deployed to an instance
    are located at different locations. This attribute denotes the "current"
    location where the j2ee-apps are to be stored at.
    Same is true for other application/module related paths. This does
    not refer to stubs or jsp pages.
  */
  private String mApplicationRepositoryPath    = null;
  private String mApplicationBackupRepositoryPath    = null;
  private String mModuleRepositoryPath      = null;
  private String mModuleBackupRepositoryPath    = null;
 
  private String mApplicationStubRepositoryPath    = null;
  private String mModuleStubRepositoryPath    = null;
  private String mApplicationGeneratedXMLPath    = null;
  private String mModuleGeneratedXMLPath    = null;
  private String mLibPath          = null;
  private String mAutoDeployDirPath    = null;
  private String mLibClassesPath        = null;
    private String mApplicationPassivatedEjbPath            = null;
    private String mModulePassivatedEjbPath          = null;
    private String mApplicationCompiledJspPath              = null;
    private String mWebModuleCompiledJspPath                = null;
    private String mApplicationHttpSessionStorePath         = null;
    private String mModuleHttpSessionStorePath        = null;
    private String mDocRootPath                             = null;
    private String mStopCommandPath                         = null;
    private String mDefaultAccessLogPath                    = null;
    private String mObjectFilePath                          = null;
    private String mInitFilePath                            = null;
    private String mBackupObjectFilePath                    = null;
    private String mBackupInitFilePath                      = null;
    private String mSecurityPasswordsFilePath               = null;
    private String mRealmsKeyFilePath                       = null;
    private String mBackupRealmsKeyFilePath                 = null;

    // Hamid: Added the following files for Acl: Bug 4700937
    private String mAclFilePath                            = null;
    private String mBackupAclFilePath                      = null;
    private String kAclFilePrefix                          = "generated";
    private String kBackupAclFilePrefix                    = "genwork";
    private String kAclFileSuffix                          = "acl";
   
    private String mJavaWebStartDirPath                    = null;
   
    // Lazy initialization flag
    private boolean mInited                                = false;
 
  private String mInstancesRoot              = null;
 
  /**
            Creates new InstanceEnvironment for Server Instance with given name.
            Name may not be null or empty String. Name may not begin with a digit.
            <p>
            It is essential to note that an instance with this name
            is <code> created /<code>indeed before creating object of this class.
            <p>
            @param instanceName String denoting the name of Server Instance.
            @throws IllegalArgumentException if the name is null or empty
            String or does not begin with a letter (in both the variants) or
            the instance directory does not exist. Thus the examples of invalid
            values are "6ias"

            @see com.sun.enterprise.config.ServerManager#createServerInstance
  */
 
    public InstanceEnvironment(String instanceName) {
    this(System.getProperty(Constants.IAS_ROOT),
         instanceName);
    }

    public InstanceEnvironment(String instancesRoot, String instanceName) {
        if (! StringUtils.ok(instanceName)) {
      throw new IllegalArgumentException(Localizer.getValue(ExceptionType.NULL_ARG));
        }
        mLogicalName = instanceName;
    mInstancesRoot = instancesRoot;
        createConfigFilePath();
        //createBackupConfigFilePath();
    }

    private PropertyResolver mPathResolver;

    private void init() {
        if (mInited) {
            return;
        }
        createPathResolver();
    createApplicationRootPath();
        createApplicationRepositoryPath();
        createApplicationBackupRepositoryPath();
        createModuleRepositoryPath();
        createModuleBackupRepositoryPath();
        createApplicationStubPath();
        createModuleStubPath();
        createApplicationGeneratedXMLPath();
        createModuleGeneratedXMLPath();
        createLibPath();
        createLibClassesPath();
        createAutoDeployDirPath();
        createPassivatedEjbPaths();
        createApplicationCompiledJspPath();
        createWebModuleCompiledJspPath();
        createHttpSessionStorePaths();
        createDocRootPath();
        createStopCommandPath();
        createDefaultAccessLogPath();
        createObjectFilePath();
        createInitFilePath();
        createSecurityPasswordsFilePath();
        createRealmsKeyFilePath();
        createAclFilePath();
        createJavaWebStartPath();
        mInited = true;
    }
    /**
     * Apply the changes from all the files i.e. the other config files
     * to the real one. <code>This method simply copies the files over and
     * there is no transaction model built into it. </code>
     * If the method throws any exception, there is a chance that the changes
     * are not correctly applied.
     * Note that the only UI from which the object file (obj.conf) and
     * initialization file (init.conf) is changed is the admin cgis and some
     * servlets. Most of the clients change the server.xml.
     * This method will typically be called when the apply/reconfigure of
     * clients is called.
    */
    public void applyChangesFromBackup() throws ConfigException {
    }
   
    public void applyChangesFromBackup(boolean overwrite) throws ConfigException {
    }

    public boolean hasHotChanged() {
        return false;
    }

    /**
     * Has init.conf or obj.conf file changed.
     * @return true if live init.conf or obj.conf has changed manually,
     *     or backup init.conf or obj.conf file timestamp is later than live
     */
    public boolean hasInitOrObjConfFileChanged() {
      return false;
    }

    /**
     * Has Realms keyfile changed.
     * @return true if live keyfile has changed manually,
     *     or backup keyfile file timestamp is later than live
     */
    public boolean hasRealmsKeyConfFileChanged() {
      return false;
    }


    /**
     * Has configured mime file(s) changed.
     * @return true if any of the live configured mime type file has been
     *     changed manually, or if any of the backup mime file timestamp is
     *     later than the timestamp for live files.
     */
    public boolean hasMimeConfFileChanged() {
        return false;
    }

    public boolean hasVirtualServerConfFileChanged() {
      return false;
    }

    /**
     * Has any of config files managed by cgi scripts changed. The files
     * managed by cgi scripts are init.conf, obj.conf and mime types files.
     */
    public boolean hasCGIConfigFilesChanged() {
      return false;
    }

    public boolean hasHotInitChanged() {
      return false;
    }
   
    public boolean hasHotRealmsKeyChanged() {
      return false;
    }

    public boolean hasHotObjectChanged() {
      return false;
    }

    public boolean hasHotXmlChanged() {
      return false;
    }
   
    /**
     * is used to findout if we can reload transparently
     * i.e., reload configcontext
     * To do this, we need to findout if xml has changed. If it has,
     * then is backup in memory changed, i.e., has ConfigContext Changed ?
     * return true if you can reload
     * return false if hot has not changed or if you cannot reload
     */
    public boolean canReloadManualXmlChanges() {
        return false;
    }
   
    private boolean hasOnlyHotXmlChanged() {
      return false;
    }
   
    public boolean hasHotMimeChanged() {
      return false;
    }

    public boolean hasHotVirtualServerConfChanged() {
      return false;
    }

    public boolean hasBakupVirtualServerConfChanged() {
      return false;
    }

    private boolean hasVirtualServerConfChanged(ConfigContext   context,
                                                boolean         isHot)
        throws ConfigException {
        return false;
    }

    private long getConfigFileTimeStamp(String configFile) {
        //need to read xml and get the timestamp
        long ts = UNINITIALIZED_TIME_STAMP;
        try {
            File f = new File(configFile);
            ts = f.lastModified();
        } catch(Throwable t) {
            //ignore
        }
        return ts;
    }
   
    private long getLastModifiedFromTSFile(String tsFileName) {
            long ts = INVALID_TIME_STAMP; //different from getXmlFileTimeStamp for a purpose
           
            FileReader fr = null;
            try {
                File f = new File(tsFileName);
    //_logger.log(Level.INFO,"ts file: " + ((f.exists())?"exists":"does not exist"));
   
               
                fr = new FileReader(f);
               
                char[] cbuf = new char[13]; // should be sufficint
                fr.read(cbuf);
    String s = new String(cbuf);
    //_logger.log(Level.FINE,"String is:" + s +":");
                ts = (new Long(s)).longValue();
            } catch(Throwable t) {
        // _logger.log(Level.WARNING,"Exception caught in getting LastModified",t);
                //ignore ?
            } finally {
                try {
                    fr.close();
        fr = null;
                } catch(Exception ex){}
            }
            return ts;
        }
   
    private String getTimeStampFileName(String fullName) {
        return fullName + ".timestamp";
    }
   
    public void useManualConfigChanges() throws ConfigException {
    }

    public void useManualServerXmlChanges() throws ConfigException {
    }

    private void useManualInitFileChanges() throws ConfigException {
    }

    private void useManualRealmsKeyFileChanges() throws ConfigException {
    }

    private void useManualObjectFileChanges() throws ConfigException {
    }

    private void useManualAllMimeFileChanges() throws ConfigException {
    }

    private void useManualVirtualServerConfFileChanges(ConfigContext bakXmlCtx)
        throws ConfigException {
/*
    ConfigContext context = ConfigFactory.
      createConfigContext(getConfigFilePath(), true, false, false);
    if (context == null) {
      // this is serious. ConfigContext for
      // this server instance should be created by now.
     
      throw new ConfigException(Localizer.getValue(ExceptionType.NO_XML));
    }
          //ROB: config changes
    //Server     rootElement = ServerBeansFactory.getServerBean(context);
          Config rootElement = ServerBeansFactory.getConfigBean(context);

    HttpService httpService = rootElement.getHttpService();
    VirtualServerClass[] vsClasses= httpService.getVirtualServerClass();
    for(int i = 0 ; i < vsClasses.length ; i++) {
      VirtualServerClass aClass = vsClasses[i];
            VirtualServer[] virtualServers = aClass.getVirtualServer();
            for(int j = 0 ; j < virtualServers.length ; j++) {
                VirtualServer aServer = virtualServers[j];
                String file = aServer.getConfigFile();
                if ((file == null) || (file.length() == 0)) {
                    continue;
                }
                String destPath = getBackupConfigDirPath() + File.separator
                                    + file;
                String srcPath  = getConfigDirPath() + File.separator
                                    + file;
                copyFile(new File(srcPath), new File(destPath));
                //Chown file
                if (isChownNeeded(null)) {
                    chownFile(destPath);
                }
                if(VIRTUAL_SERVER_TIMESTAMP_MECHANISM_ENABLED) {
                    String tsFilePath = getTimeStampFileName(destPath);
                    saveTimeStamp(tsFilePath, srcPath);
                }
            }
    }
*/
        /* The following code deletes the config files from the backup
         * directory. These config files correspond to the virtual servers
         * that would have been deleted from the hot xml.
         */
/*
        deleteVirtualServerConfigFiles(bakXmlCtx, context, false);
*/
    }

    /**
     *  This method iterates through the virtual-server elements
     *  foreach virtual-server-class element of the 'ctx' and
     *  checks if a corresponding virtual-server element exists
     *  in 'ctx2'. If not, it assumes that the virtual-server
     *  element has been deleted from ctx2 and deletes the
     *  corresponding config file from the config directory of
     *  'ctx'.
     *  <warning>This method assumes that virtual-server ids are
     *  unique across virtual-server-class elements. </warning>
     */
    private void deleteVirtualServerConfigFiles(ConfigContext ctx,
                                                ConfigContext ctx2,
                                                boolean       isHot)
        throws ConfigException
    {
/*
          //ROB: config changes
     //Server     rootElement     = ServerBeansFactory.getServerBean(ctx);
          Config rootElement = ServerBeansFactory.getConfigBean(ctx);

    HttpService httpService     = rootElement.getHttpService();

          //ROB: config changes
          //Server      rootElement2    = ServerBeansFactory.getServerBean(ctx2);
          Config rootElement2 = ServerBeansFactory.getConfigBean(ctx2);

    HttpService httpService2    = rootElement2.getHttpService();

        VirtualServerClass[] vsClasses =
                                httpService.getVirtualServerClass();
        for(int i = 0 ; i < vsClasses.length ; i++) {
            VirtualServerClass vsClass = vsClasses[i];
            String vsClassId = vsClass.getId();
            VirtualServerClass vsClass2 =
                    httpService2.getVirtualServerClassById(vsClassId);
            boolean deleteAll = false;
            if (vsClass2 == null) {
                // This virtual-server-class was probably deleted
                 // from ctx2. So delete the config files for all the
                 // virtual servers.
               
                deleteAll = true;
            }
            VirtualServer[] virtualServers = vsClass.getVirtualServer();
            for(int j = 0 ; j < virtualServers.length ; j++) {
               VirtualServer vs = virtualServers[j];
               String vsId = vs.getId();
               if ((deleteAll) ||
                   (vsClass2.getVirtualServerById(vsId) == null)) {
                   String configFileName = vs.getConfigFile();
                   if ((configFileName == null) ||
                       (configFileName.length() == 0)) {
                       continue;
                   }
                   String parent = (isHot) ? getConfigDirPath() :
                                             getBackupConfigDirPath();
                   File confFile = new File(parent, configFileName);
                   if (confFile.exists()) {
                       confFile.delete();
                   }
                   if (!isHot) {
                       //Remove timestamp file
                       File tsFile = new File(parent,
                                              configFileName + ".timestamp");
                       if (tsFile.exists()) {
                           tsFile.delete();
                       }
                   }
               }
            }
        }
*/

    }

    /**
     * init to be called from constructor
     */
     public void createTimeStampFiles() {
        init();
        if(!TIMESTAMP_MECHANISM_ENABLED) return;
         synchronized(lock) {
         /* TOMCAT_BEGIN Ramakanth */
         createTSFile(getTimeStampFileName(mConfigFilePath),
             mConfigFilePath, mConfigFilePath);
         createTSFile(getTimeStampFileName(mBackupRealmsKeyFilePath),
             mRealmsKeyFilePath, mBackupRealmsKeyFilePath);
         /* TOMCAT_END Ramakanth */
         }
     }
    
     private void createTSFile(String tsFileName, String actualFile, String backupFile) {
         // if the file does not exist,
         // create ts file
         File f = new File(tsFileName);
            if(!f.exists()) {
                saveTimeStamp(tsFileName, actualFile, backupFile);
            }
     }
    
     private void createMimeTSFiles() {
     }

    private void createVirtualServersConfTSFiles() {
/*
        if(!VIRTUAL_SERVER_TIMESTAMP_MECHANISM_ENABLED) return;
        
        try {
            ConfigContext context = ConfigFactory.
                createConfigContext(mConfigFilePath, true, false, false);
            if (context == null) {
                // this is serious. ConfigContext for
                // this server instance should be created by now.
               
                return;
            }
            //ROB: config changes
            //Server     rootElement = ServerBeansFactory.getServerBean(context);
            Config rootElement = ServerBeansFactory.getConfigBean(context);

            HttpService httpService = rootElement.getHttpService();
            VirtualServerClass[] vsClasses = httpService.getVirtualServerClass();
            for(int i = 0 ; i < vsClasses.length ; i ++) {
                VirtualServerClass aClass = vsClasses[i];
                VirtualServer[] virtualServers = aClass.getVirtualServer();
                for(int j = 0 ; j < virtualServers.length ; j++) {
                    VirtualServer aServer = virtualServers[j];
                    String file = aServer.getConfigFile();
                    if ((file == null) || (file.length() == 0)) {
                        continue;
                    }
                    String backPath = getBackupConfigDirPath() + File.separator
                                        + file;
                    String hotPath = getConfigDirPath() + File.separator
                                        + file;
                    String tsFileName = getTimeStampFileName(backPath);
                    File f = new File(tsFileName);
                    if(!f.exists()) {
                        saveTimeStamp(tsFileName, hotPath, backPath);
                    }
                }
            }
        } catch(Throwable t) {
            _logger.log(Level.WARNING,"core.create_mime_ts_file_exception",t);
            //ignore. go ahead.
        }
*/
    }

  /**
  * saves timestamp and resets backup dir to the value of ts
   */        
        private void saveTimeStamp(String tsFileName, String actualFile, String backupFile) {
            if(!TIMESTAMP_MECHANISM_ENABLED) return;
      long ts = saveTimeStamp(tsFileName, actualFile);
      new File(backupFile).setLastModified(ts);
  }

        /**
         * set the value of timestamp in a new file
         * the name of timestamp file is name of this xml + .timestamp
         * always create this file even if readonly
         */
        private long saveTimeStamp(String tsFileName, String actualFile) {
            if(!TIMESTAMP_MECHANISM_ENABLED) return INVALID_TIME_STAMP;
           
            long timestamp = getConfigFileTimeStamp(actualFile);
    //_logger.log(Level.FINE,"writing TS file");
            File f = null;
            FileWriter fw = null;
            try {
                f = new File(tsFileName);
                fw = new FileWriter(f);
                fw.write("" + timestamp);
            } catch(Throwable t) {
       _logger.log(Level.WARNING,"core.file_io_exception",t);
                //ignore
            } finally {
                try {
                    fw.close();
                } catch(Throwable ex){}
            }
            return timestamp; 
        }

  /** overwrite the "live" server.xml with the contents of the
   * backup server.xml file
   */
        /*
    public void applyServerXmlChanges() throws ConfigException {
        applyServerXmlChanges(false);
    }
         */
   
    public void applyServerXmlChanges(boolean overwrite) throws ConfigException {
    }

  /** overwrite the "live" init.conf with the contents of the
   * backup init.conf file
   */
   
    public void applyInitFileChanges() throws ConfigException {
    }

  /** overwrite the "live" keyfile with the contents of the
   * backup init.conf file
   */
   
    public void applyRealmsKeyFileChanges() throws ConfigException {
    }

  /** overwrite the "live" obj.conf with the contents of the
   * backup obj.conf file
   */
   
    public void applyObjectFileChanges() throws ConfigException {
    }

  /** Overwrite all mime.types files for the instance.
    These are the files that are <code> mime </code>
    elements on the <code> http-service </code> element.
    Note, there is no transactional model.
    @throws ConfigException if copy fails.
  */
  public void applyAllMimeFileChanges() throws ConfigException {
  }

// Hamid: BugId: 4700937: Start
    /** overwrite the generated.<serverId>.acl file with the contents of the
     * genwork.<serverId>.acl file
     */

    public void applyAclFileChanges() throws ConfigException {
    }
// Hamid: BugId: 4700937: End

  public void applyVirtualServersConfFileChanges(ConfigContext hotXmlCtx)
            throws ConfigException {
/*
        init();
            synchronized(lock) {
    ConfigContext context = ConfigFactory.createConfigContext(
                                    mBackupConfigFilePath);
    if (context == null) {
      // this is serious. ConfigContext for
      //this server instance should be created by now.
     
      throw new ConfigException(
                    Localizer.getValue(ExceptionType.NO_XML_BU));
    }
          //ROB: config changes
    //Server     rootElement = ServerBeansFactory.getServerBean(context);
          Config rootElement = ServerBeansFactory.getConfigBean(context);
    HttpService httpService = rootElement.getHttpService();
    VirtualServerClass[] vsClasses = httpService.getVirtualServerClass();
    for(int i = 0 ; i < vsClasses.length ; i++) {
      VirtualServerClass vsClass = vsClasses[i];
            VirtualServer[] virtualServers = vsClass.getVirtualServer();
            for(int j = 0 ; j < virtualServers.length ; j++) {
                VirtualServer virtualServer = virtualServers[j];
                String  configFileName  = virtualServer.getConfigFile();
                File    srcFile         = null;
                if (configFileName != null) {
                    srcFile = new File(getBackupConfigDirPath(),
                                       configFileName);
                }
                if ((srcFile == null) || (!srcFile.exists())) {
                    continue;
                }
                File destFile   = new File(getConfigDirPath(), configFileName);
                copyFile(srcFile, destFile);
                //Chown file
                if (isChownNeeded(null)) {
                    chownFile(destFile.getAbsolutePath());
                }
                if(VIRTUAL_SERVER_TIMESTAMP_MECHANISM_ENABLED) {
                    String tsFilePath =
                            getTimeStampFileName(srcFile.getAbsolutePath());
                    saveTimeStamp(tsFilePath, destFile.getAbsolutePath());
                }
            }
              
            }
*/
        /* The following code deletes the config files from the config
         * directory. These config files correspond to the virtual servers
         * that would have been deleted from the backup xml.
         */
/*
            deleteVirtualServerConfigFiles(hotXmlCtx, context, true);
         }
*/
        }

    /**
     * Copies the <code> offline </code> file on <code> real </code> one.
     * @throws ConfigException in case copy fails for various reasons.
     * @param hot java.io.File that is real one (target).
     * @param cold java.io.File that is backup/offline (source).
    */
    private void copyFile(File fromFile, File toFile) throws ConfigException
    {
        if(!fromFile.exists())
                throw new ConfigException(Localizer.getValue(ExceptionType.FROM_NOT_EXIST, fromFile.getPath()));

        if(fromFile.isDirectory())
                throw new ConfigException(Localizer.getValue(ExceptionType.FROM_IS_DIR, fromFile.getPath()));

        /** WBN March 14, 2002
         * There is a very strange problem -- Windows will sometimes return 0 for
         * the length of a file that is NOT zero-length.  I tested and proved beyond
         * any doubt that length() is *wrong*.
         * This is probably a JVM bug.  So I've commented-out the following code.
        if(cold.length() <= 0)
        {
                throw new ConfigException(err + coldErr + "is zero length");
        }
        */

        if(toFile.isDirectory())
                throw new ConfigException(Localizer.getValue(ExceptionType.TO_IS_DIR, toFile.getPath()));

        if(toFile.exists() && !toFile.canWrite())
                throw new ConfigException(Localizer.getValue(ExceptionType.TO_READ_ONLY, toFile.getPath()));

        try
        {
                FileUtils.copy(fromFile, toFile);
        }
        catch(Exception e)
        {
      Object[] objs = new Object[] { fromFile.getPath(), toFile.getPath(), e.toString() };
            throw new ConfigException(Localizer.getValue(ExceptionType.FAILED_COPY, objs), e);
        }
    }
 
    /**
            Creates the path for server.xml pertaining to this Instance.
    */
 
    private void createConfigFilePath() {
        String[] onlyFolderNames = new String[] {mInstancesRoot,
                                         kConfigDirName,
                                         kConfigXMLFileName};
        mConfigFilePath = StringUtils.makeFilePath(onlyFolderNames, false);
    }

    /**
            Creates the path for backup server.xml pertaining to this Instance.
    */

    private void createBackupConfigFilePath() {
        String[] onlyFolderNames = new String[] {mInstancesRoot,
                                         kConfigDirName,
                                         kBackupDirName,
                                         kConfigXMLFileName};
        mBackupConfigFilePath = StringUtils.makeFilePath(onlyFolderNames, false);
    }
 
  /**
    Creates the ApplicationRootPath that is guaranteed to take into account
    the changes made to server.xml. Initializes the application root to
    a valid non-null String. Does not check whether this is a directory
    that can be written to.
  */
  private void createApplicationRootPath() {
    try {
      ConfigContext context = ConfigFactory.
        createConfigContext(mConfigFilePath);
      Domain domain = ServerBeansFactory.getDomainBean(context);
      mApplicationRootPath = domain.getApplicationRoot();
      if (mApplicationRootPath == null || mApplicationRootPath.length() <=0){
        createDefaultApplicationRootPath();
      }
            mApplicationRootPath = resolvePath(mApplicationRootPath);
    }
    catch (Exception e) {
      _logger.log(Level.WARNING, "InstanceEnv.createApplicationRootPath()", e);
    }
  }
 
  /** Initializes mApplicationRootPath = <instancedir>/applications.
  */
  private void createDefaultApplicationRootPath() {
        String[] onlyFolderNames = new String[] {
                    mInstancesRoot,
                    kRepositoryDirName};
        mApplicationRootPath = StringUtils.makeFilePath(onlyFolderNames, false);
  }
    /**
            Creates the path for repository of applications
            pertaining to this Instance.
    */

    private void createApplicationRepositoryPath() {
        String[] onlyFolderNames = new String[] {
                    mApplicationRootPath,
                    kApplicationDirName};
        mApplicationRepositoryPath = StringUtils.makeFilePath(onlyFolderNames, false);
    }

    /**
            Creates the path for repository of standalone modules
            pertaining to this Instance.
    */

    private void createModuleRepositoryPath() {
        String[] onlyFolderNames = new String[] {
                    mApplicationRootPath,
                    kModuleDirName};
        mModuleRepositoryPath = StringUtils.makeFilePath(onlyFolderNames, false);
    }

    /**
            Creates the path for backup repository of applications
            pertaining to this Instance -- directory-deployed apps
    */

    private void createApplicationBackupRepositoryPath() {
        String[] onlyFolderNames = new String[] {
                    mApplicationRootPath,
                    kRepositoryBackupDirName,
                    kApplicationDirName};
        mApplicationBackupRepositoryPath = StringUtils.makeFilePath(onlyFolderNames, false);
    }

    /**
            Creates the path for backup repository of modules
            pertaining to this Instance -- directory-deployed modules
    */

    private void createModuleBackupRepositoryPath() {
        String[] onlyFolderNames = new String[] {
                    mApplicationRootPath,
                            kRepositoryBackupDirName,
                    kModuleDirName};
        mModuleBackupRepositoryPath = StringUtils.makeFilePath(onlyFolderNames, false);
    }

    /**
     * Formulates the path to the instance auto deploy dir.
     */
    private void createAutoDeployDirPath() {
        String[] onlyFolderNames =
            new String[] {mInstancesRoot, kAutoDeployDirName};
        mAutoDeployDirPath = StringUtils.makeFilePath(onlyFolderNames, false);
    }


    /**
     * Formulates the path to the instance lib dir. Any jar files under
     * this dir will be included by the shared class loader.
     */
    private void createLibPath() {
        String[] onlyFolderNames = new String[] {mInstancesRoot, kLibDirName};
        mLibPath = StringUtils.makeFilePath(onlyFolderNames, false);

    }

    /**
     * Formulates the path to the instance lib classes directory. Any class
     * files under this dir will be be included by the shared class loader.
     */
    private void createLibClassesPath() {
        String[] onlyFolderNames = new String[] {mInstancesRoot, kLibDirName,
        kLibClassesDirName};
        mLibClassesPath = StringUtils.makeFilePath(onlyFolderNames, false);
    }
 
    /**
            Creates the path for repository of EJB stubs for all applications
            deployed to this Instance.
    */

    private void createApplicationStubPath() {
        String[] onlyFolderNames = new String[] {mInstancesRoot, kGeneratedDirName,
                kEJBStubDirName, kApplicationDirName};
        mApplicationStubRepositoryPath = StringUtils.makeFilePath(onlyFolderNames, false);
    }
 
    /**
            Creates the path for repository of EJB stubs for all standalone modules
            deployed to this Instance.
    */

    private void createModuleStubPath() {
        String[] onlyFolderNames = new String[] {mInstancesRoot, kGeneratedDirName,
                kEJBStubDirName, kModuleDirName};
        mModuleStubRepositoryPath = StringUtils.makeFilePath(onlyFolderNames, false);
    }

    /**
            Creates the path for generated xml for all applications
            deployed to this Instance.
    */

    private void createApplicationGeneratedXMLPath() {
        String[] onlyFolderNames = new String[] {mInstancesRoot, kGeneratedDirName,
                kGeneratedXMLDirName, kApplicationDirName};
        mApplicationGeneratedXMLPath = StringUtils.makeFilePath(onlyFolderNames, false);
    }

    /**
            Creates the path for generated xml for all standalone modules
            deployed to this Instance.
    */

    private void createModuleGeneratedXMLPath() {
        String[] onlyFolderNames = new String[] {mInstancesRoot, kGeneratedDirName,
                kGeneratedXMLDirName, kModuleDirName};
        mModuleGeneratedXMLPath = StringUtils.makeFilePath(onlyFolderNames, false);
    }

 
  /** Path upto <instance-dir>/session-store is returned */
 
  private String getDefaultSessionStorePath() {
        String[] onlyFolderNames = new String[] {
        mInstancesRoot,
        kSessionStoreDirName
    };
        return ( StringUtils.makeFilePath(onlyFolderNames, false) );
  }

  /** Creates the paths for ejbs from both application and module. The paths are
    like this:
    passivated-beans-for-modules=<session-store>/ejb/j2ee-modules
    passivated-beans-for-apps=<session-store>/ejb/j2ee-apps
  */
  private void createPassivatedEjbPaths() {
    try {
      ConfigContext context = ConfigFactory.createConfigContext(
        mConfigFilePath);
      EjbContainer ejbContainer = ServerBeansFactory.getConfigBean(context).getEjbContainer();
      String sessionStore = ejbContainer.getSessionStore();
      if (sessionStore == null || sessionStore.length() <= 0) {
        sessionStore = getDefaultSessionStorePath();
      }
            sessionStore = resolvePath(sessionStore);
      String[] onlyFolderNames = new String[] {
        sessionStore,
        kEJBStubDirName,
        kApplicationDirName
      };
      mApplicationPassivatedEjbPath = StringUtils.makeFilePath(onlyFolderNames, false);
      onlyFolderNames[2] = kModuleDirName;
      mModulePassivatedEjbPath  = StringUtils.makeFilePath(onlyFolderNames, false);
    }
    catch (Exception e) {
      _logger.log(Level.WARNING, "InstanceEnv.createApplicationRootPath()", e);
    }
  }

  /** Creates the paths for ejbs from both application and module. The paths are
    like this:
    httpsession-store-for-modules=<session-store>/http/j2ee-modules
    httpsession-store-for-apps=<session-store>/http/j2ee-apps
  */

  private void createHttpSessionStorePaths() {
    try {
      ConfigContext context = ConfigFactory.createConfigContext(
        mConfigFilePath);
      EjbContainer ejbContainer = ServerBeansFactory.getConfigBean(context).getEjbContainer();
      String sessionStore = ejbContainer.getSessionStore();
      if (sessionStore == null || sessionStore.length() <= 0) {
        sessionStore = getDefaultSessionStorePath();
      }
            sessionStore = resolvePath(sessionStore);
      String[] onlyFolderNames = new String[] {
        sessionStore,
        kHttpSessionDirName,
        kApplicationDirName
      };
      mApplicationHttpSessionStorePath = StringUtils.makeFilePath(onlyFolderNames, false);
      onlyFolderNames[2] = kModuleDirName;
      mModuleHttpSessionStorePath  = StringUtils.makeFilePath(onlyFolderNames, false);
    }
    catch (Exception e) {
      _logger.log(Level.WARNING, "InstanceEnv.createApplicationRootPath()", e);
    }
  }
 
    /** Creates the path for compiled JSP pages from a J2EE application */

    private void createApplicationCompiledJspPath() {
        String[] onlyFolderNames = new String[] {mInstancesRoot,
            kGeneratedDirName, kCompileJspDirName, kApplicationDirName};

        mApplicationCompiledJspPath = StringUtils.makeFilePath(onlyFolderNames, false);
    }

    /** Creates the path for compiled JSP Pages from a standalone web
        app module.
    */

    private void createWebModuleCompiledJspPath() {
        String[] onlyFolderNames = new String[] {mInstancesRoot,
            kGeneratedDirName, kCompileJspDirName, kModuleDirName};

        mWebModuleCompiledJspPath = StringUtils.makeFilePath(onlyFolderNames, false);
    }

    /**
        Creates the Path for the docroot of this instance. With the
        new layout, the docroot is supposed to be in the folder for
        instance configuration by default.
    */
    private void createDocRootPath() {
        String[] onlyFolderNames = new String[] {mInstancesRoot,
            kDocRootDirName};

        mDocRootPath = StringUtils.makeFilePath(onlyFolderNames, false);
    }
    /**
        Creates the stop command path for this instance.
    */
    private void createStopCommandPath() {
        String[]    onlyFolderNames    = new String[] {mInstancesRoot};
        String      execName           = null;
        if(OS.isWindows()) {
            execName = InstanceDefinition.WIN_STOP_COMMAND_NAME;
        }
        else {
            execName = InstanceDefinition.UNIX_STOP_COMMAND_NAME;
        }   
        mStopCommandPath = StringUtils.makeFilePath(onlyFolderNames, true)
                + execName;
    }
   
    /** Creates the path of default access log file */
    private void createDefaultAccessLogPath() {
        final String logDirName         = "logs";
        final String accessLogFileName  = "access";
        String[] fileNames              = new String[] {mInstancesRoot,
           logDirName, accessLogFileName};
        mDefaultAccessLogPath = StringUtils.makeFilePath(fileNames, false);
    }
   
    /** Creates the path of object file */
    private void createObjectFilePath() {
        String[] fileNames = new String[] {mInstancesRoot,
            kConfigDirName, kObjectFileName};
        mObjectFilePath = StringUtils.makeFilePath(fileNames, false);
    }

    /** Creates the path of initialization file */
    private void createInitFilePath() {
        String[] fileNames = new String[] {mInstancesRoot,
            kConfigDirName, kInitFileName};
        mInitFilePath = StringUtils.makeFilePath(fileNames, false);
    }

    /** Creates the path of iWS NSS passwords file */
    private void createSecurityPasswordsFilePath() {
        String[] fileNames = new String[] {mInstancesRoot,
            kConfigDirName, kSecurityPasswordsFileName};
        mSecurityPasswordsFilePath = StringUtils.makeFilePath(fileNames, false);
    }

    /** Creates the path of Realms key file */
    private void createRealmsKeyFilePath() {
        String[] fileNames = new String[] {mInstancesRoot,
            kConfigDirName, kRealmsKeyFileName};
        mRealmsKeyFilePath = StringUtils.makeFilePath(fileNames, false);
    }

    /** Creates the path of backup object file */
    private void createBackupObjectFilePath() {
        String[] fileNames = new String[] {mInstancesRoot,
            kConfigDirName, kBackupDirName, kObjectFileName};
        mBackupObjectFilePath = StringUtils.makeFilePath(fileNames, false);
    }

    /** Creates the path of backup initialization file */
    private void createBackupInitFilePath() {
        String[] fileNames = new String[] {mInstancesRoot,
            kConfigDirName, kBackupDirName, kInitFileName};
        mBackupInitFilePath = StringUtils.makeFilePath(fileNames, false);
    }
// Hamid: BugId: 4700937: Start
    /** Creates the path of acl file */
    private void createAclFilePath() {
        // aclFile is generated.<serverId>.acl
        String aclFileName = kAclFilePrefix + "." + getName() + "." + kAclFileSuffix;
        String[] fileNames = new String[] {mInstancesRoot,
            kConfigDirName, aclFileName};
        mAclFilePath = StringUtils.makeFilePath(fileNames, false);
    }

    /** Creates the path of backup of acl file */
    private void createBackupAclFilePath() {
        // backupAclFile is genwork.<serverId>.acl
        String backupAclFileName = kBackupAclFilePrefix + "." + getName() + "." + kAclFileSuffix;
        String[] fileNames = new String[] {mInstancesRoot,
            kConfigDirName, backupAclFileName};
        mBackupAclFilePath = StringUtils.makeFilePath(fileNames, false);
    }
// Hamid: BugId: 4700937: End

    /** Creates the path of backup Realms key file */
    private void createBackupRealmsKeyFilePath() {
        String[] fileNames = new String[] {mInstancesRoot,
            kConfigDirName, kBackupDirName, kRealmsKeyFileName};
        mBackupRealmsKeyFilePath = StringUtils.makeFilePath(fileNames, false);
    }

    /** Creates the path to the java-web-start directory */
    private void createJavaWebStartPath() {
        String[] fileNames = new String[] {mInstancesRoot,
            kJavaWebStartDirName};
        mJavaWebStartDirPath = StringUtils.makeFilePath(fileNames, false);
    }
    /**
            A method that returns the logical name of this Server Instance.
    */
    public String getName() {
            return ( mLogicalName );
    }
 
    /**
            Returns the path where entire data/config etc. of this instance
            is stored on the disk.

            @return absolute path of the instance's home.
    */

    public String getInstancesRoot() {
        return (mInstancesRoot);
    }
   
    public String getConfigDirPath() {
        String[] folderNames = new String[] {mInstancesRoot,
            kConfigDirName};
        String configDirPath =
                StringUtils.makeFilePath(folderNames, false);
        return ( configDirPath );
    }

    public String getBackupConfigDirPath() {
  /*
        String[] folderNames = new String[] {mInstancesRoot,
            kConfigDirName, kBackupDirName};
        String backupConfigDirPath =
                StringUtils.makeFilePath(folderNames, false);
        return ( backupConfigDirPath );
  */
  return getConfigDirPath();
    }

    /**
            Returns the absolute path for the config file pertaining
            to this Server Instance.
    */

    public String getConfigFilePath() {
            return ( mConfigFilePath );
    }

    /**
            Returns the absolute path for the backup config file pertaining
            to this Server Instance.
    */

    public String getBackupConfigFilePath() {
            return ( mConfigFilePath );
    }

    /**
       Returns the absolute path for the application root
       of this Server Instance.
    */

    public String getApplicationRootPath() {
        init();
        return mApplicationRootPath );
    }

    /**
       Returns the absolute path for the generated root
       of this Server Instance.
    */
                                                                               
    public String getGeneratedRootPath() {
        init();
        String[] onlyFolderNames = new String[] {mInstancesRoot,
            kGeneratedDirName};
        return StringUtils.makeFilePath(onlyFolderNames, false);
    }


    /**
            Returns the absolute path for location where all the deployed
            applications are stored for this Server Instance.
    */

    public String getApplicationRepositoryPath() {
        init();
            return ( mApplicationRepositoryPath );
    }

    /**
            Returns the absolute path for location where all the backups of
            directory-deployed applications are stored for this Server Instance.
    */

    public String getApplicationBackupRepositoryPath() {
        init();
            return ( mApplicationBackupRepositoryPath );
    }

    /**
            Returns the absolute path for location where all the deployed
            standalone modules are stored for this Server Instance.
    */

    public String getModuleRepositoryPath() {
        init();
            return ( mModuleRepositoryPath );

    }
    /**
            Returns the absolute path for location where all the deployed
            standalone module backups are stored for this Server Instance.
    */

    public String getModuleBackupRepositoryPath() {
        init();
            return ( mModuleBackupRepositoryPath );

    }

    /**
            Returns the absolute path for location where all ejb stubs for
            all applications are stored for this Server Instance.
    */

    public String getApplicationStubPath() {
        init();
            return ( mApplicationStubRepositoryPath );
    }

    /**
            Returns the absolute path for location where all ejb stubs for
            all modules are stored for this Server Instance.
    */

    public String getModuleStubPath() {
        init();
            return ( mModuleStubRepositoryPath );
    }

    /**
            Returns the absolute path for location where all generated xml for
            all applications are stored for this Server Instance.
    */

    public String getApplicationGeneratedXMLPath() {
        init();
            return ( mApplicationGeneratedXMLPath );
    }

    /**
            Returns the absolute path for location where all generated xml for
            all modules are stored for this Server Instance.
    */

    public String getModuleGeneratedXMLPath() {
        init();
            return ( mModuleGeneratedXMLPath );
    }



    /**
    * Returns the path to the instance lib directory.
    * @return    the path to the instance lib directory
    */
    public String getLibPath() {
        init();
        return ( mLibPath );
    }

    /**
     * Returns the path to the templates directory.
     */
    public static String getTemplatesDirPath() {
        final String installRoot = System.getProperty(Constants.INSTALL_ROOT);
        String[] dirs = new String[] {installRoot, kLibDirName,
                                      kInstallDirName, kTemplatesDirName};
        return StringUtils.makeFilePath(dirs, false);
    }

   /**
    * Returns the path to the instance's auto deploy directory.
    *
    * @return    the path to the instance's auto deploy directory
    */
    public String getAutoDeployDirPath() {
        init();
        return ( mAutoDeployDirPath );
    }
   
    /**
     * Returns the path to the instance lib/classes directory.
    * @return    the path to the instance lib/classes directory
    */
    public String getLibClassesPath() {
        init();
        return ( mLibClassesPath );
    }

    /**
        Returns the path for compiled JSP Pages from an J2EE application
        that is deployed on this instance. By default all such compiled JSPs
        should lie in the same folder.
    */
    public String getApplicationCompileJspPath() {
        init();
        return ( mApplicationCompiledJspPath );
    }

    /**
        Returns the path for compiled JSP Pages from an Web application
        that is deployed standalone on this instance. By default all such compiled JSPs
        should lie in the same folder.
    */
    public String getWebModuleCompileJspPath() {
        init();
        return ( mWebModuleCompiledJspPath );
    }

    /**
        Returns the path for the Session Store of where HTTP
        session data of the instance can be stored.
    */
    public String getApplicationPassivatedEjbPath() {
        init();
        return ( mApplicationPassivatedEjbPath );
    }
    public String getModulePassivatedEjbPath() {
        init();
        return ( mModulePassivatedEjbPath );
    }
    public String getApplicationHttpSessionStorePath() {
        init();
        return ( mApplicationHttpSessionStorePath );
    }
    public String getModuleHttpSessionStorePath() {
        init();
        return ( mModuleHttpSessionStorePath );
    }
 
    /**
        Returns the docroot path for this instance.
    */
    public String getDocRootPath() {
        init();
        return ( mDocRootPath );
    }
   
    public String getStopCommandPath() {
        init();
        return ( mStopCommandPath );
    }
   
    /**
     * Returns the default value of accesslog for the instance.
     * Returns null in case of error.
     * Note that this is only the default value which may be
     * different than the actual value of any virtual server in this instance.
     *
     * @return String representing default log file path for any virtual server
     * in this instance.
    */
    public String getDefaultAccessLogPath() {
        init();
        return ( mDefaultAccessLogPath );
    }
   
    /* Gets the complete path of the initialization file
     * for this instance */
    public String getInitFilePath() {
        init();
        return ( mInitFilePath );
    }
    /* Gets the complete path of the backup of initialization file
     * for this instance */
    public String getBackupInitFilePath() {
        init();
        return ( mBackupInitFilePath );
    }

    /* Gets the complete path of the Security passwords file
     * for this instance */
    public String getSecurityPasswordsFilePath() {
        init();
        return ( mSecurityPasswordsFilePath );
    }
    /* Gets the complete path of the Realms key file
     * for this instance */
    public String getRealmsKeyFilePath() {
        init();
        return ( mRealmsKeyFilePath );
    }

    /* Gets the complete path of the backup of the Realms key file
     * for this instance */
    public String getBackupRealmsKeyFilePath() {
        init();
        return ( mRealmsKeyFilePath );
    }

    /* Gets the complete path of the object file
     * for this instance */
    public String getObjectFilePath() {
        init();
        return ( mObjectFilePath );
    }
    /* Gets the complete path of the backup of object file
     * for this instance */
    public String getBackupObjectFilePath() {
        init();
        return ( mBackupObjectFilePath );
    }

    public ApplicationEnvironment getApplicationEnvironment(String appName) {

        init();
        if (appName == null) {
            throw new IllegalArgumentException();
        }
        return ( new ApplicationEnvironment(this, appName) );
    }

    public ModuleEnvironment getModuleEnvironment(String moduleName, DeployableObjectType type) {
        init();
        if (moduleName == null) {
                throw new IllegalArgumentException();
        }

        return ( new ModuleEnvironment(this, moduleName, type) );
    }

    public String getJavaWebStartPath() {
        init();
        return mJavaWebStartDirPath;
    }
   
    public String verify()
    {
            // return a String with the error, in English, if the required
            // directories aren't there or have a problem.
            // return null if all is OK
            return null;
    }

    public String toString()
    {
        init();
            return ObjectAnalyzer.toString(this);
    }


    /** return true if the given file is located somewhere in the instance's file tree
     **/

    public final boolean isIASOwned(String filename)
    {
            return isIASOwned(new File(filename));
    }

    /** return true if the given file is located somewhere in the instance's file tree
     **/

    public final boolean isIASOwned(File file)
    {
        init();
        try
        {
            // get the names and standardize them for comparison
            String iasPath      = getInstancesRoot();
            assert StringUtils.ok(iasPath);

            iasPath      = FileUtils.safeGetCanonicalPath(new File(iasPath));
            String filename  = FileUtils.safeGetCanonicalPath(file);

            if(!StringUtils.ok(iasPath))
                    return false;

            if(!StringUtils.ok(filename))
                    return false;

            if(filename.startsWith(iasPath))
                    return true;

            return false;
        }
        catch(Exception e)
        {
                return false;
        }
    }

    public boolean restartRequired() {
        init();
        //is instance stopped, return false;
        //is instance restarted after changes, return false;
        // return true;
        synchronized(lock) {
        try {
            RMIClient rc = AdminChannel.getRMIClient(this.mLogicalName);
            if(!rc.isAlive()) return false;
            if(rc.hasRestartedSince(getManualChangeTime())) return false;
           
            return true;
        } catch (Exception e) {
            //ignore
        }
        }
        return false;
    }
  

    private long getManualChangeTime() {
        long ts = UNINITIALIZED_TIME_STAMP;
        long tsTmp = UNINITIALIZED_TIME_STAMP;
       
        try {
            ts = getConfigFileTimeStamp(mInitFilePath);
            tsTmp =  getConfigFileTimeStamp(mObjectFilePath);
           
            if(ts < tsTmp) ts = tsTmp;
           
            tsTmp = getConfigFileTimeStamp(mConfigFilePath);
           
            if(ts < tsTmp) ts = tsTmp;
           
/*
            ConfigContext context = ConfigFactory.
            createConfigContext(mConfigFilePath, true, false, false);
            if (context == null) {
                        // this is serious. ConfigContext for
                        //this server instance should be created by now.
                throw new ConfigException(Localizer.getValue(ExceptionType.NO_XML));
            }
            //ROB: config changes
            //Server     rootElement = ServerBeansFactory.getServerBean(context);
            Config rootElement = ServerBeansFactory.getConfigBean(context);

            HttpService httpService = rootElement.getHttpService();
            Mime[]     mimes    = httpService.getMime();
            for(int i = 0 ; i < mimes.length ; i ++) {
                Mime aMime = mimes[i];
                String file = aMime.getFile();
                String hotPath = getConfigDirPath() + File.separator
                + file;
               
               
                tsTmp = getConfigFileTimeStamp(hotPath);
                if(ts < tsTmp) ts = tsTmp;
               
            }
*/          
        } catch (Throwable t) {
            //ignore return ture;
        }
        return ts;   
    }
  
    private boolean hasBakMimeChanged() {
  return false;
    }

    /*
    public static void main(String[] args)
    {
          //Logger logger = LogDomains.getLogger(LogDomains.CORE_LOGGER);
      System.out.println("Use the appserv-ext.jar, appserv-rt.jar from lib area for other classes");
            System.setProperty("com.sun.aas.instanceRoot", "E:\\ias-build\\s1\\appserv\\domains\\domain1");
            InstanceEnvironment env = new InstanceEnvironment("server1");
      //logger.log(Level.INFO, env.toString());
      System.out.println(env.toString());
    }
    */

    public String getInstanceUser() throws IOException {
        init();
        return ServerManager.instance().getInstanceUser(this);
    }

    /**Ignoring the file parameter for now.
     */
    public boolean isChownNeeded(File f) {
        init();
/**
        if (OS.isUnix() || OS.isLinux()) {
            try {
                final String installUser =
                    ServerManager.instance().getInstanceUser(
                            new InstanceEnvironment("admin-server"));
                final String instanceUser =
                    ServerManager.instance().getInstanceUser(this);
                if (installUser.equals("root") &&
                    !instanceUser.equals(installUser)) {
                    return true;
                }
            } catch (IOException ioe) {
                _logger.warning(ioe.getMessage());
            }
        }
*/
        return false;
    }

    private void chownFile(String filePath) throws ConfigException {
        /*installConfig is removed and we need better alternative */
        /*
        try {
            String error = new installConfig().chownFile(
                filePath, getInstanceUser());
            if (error != null) {
                throw new ConfigException(error);
            }
        } catch (IOException ioe) {
            throw new ConfigException(ioe.getMessage());
        }
        */
    }

    private void createPathResolver() {
        try {
            mPathResolver = new PropertyResolver(
                ConfigFactory.createConfigContext(mConfigFilePath),
                mLogicalName);
        } catch (Exception e) {
            //log it.
        }
    }

    private String resolvePath(String unresolved) {
        if (mPathResolver != null) {
            return mPathResolver.resolve(unresolved);
        }
        return unresolved;
    }
}
TOP

Related Classes of com.sun.enterprise.instance.InstanceEnvironment

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