You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ofbiz.apache.org by Jacques Le Roux <ja...@les7arts.com> on 2012/05/01 09:22:49 UTC

Re: svn commit: r1326064 - in /ofbiz/trunk/framework: base/src/org/ofbiz/base/util/FileUtil.java catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java

From: "Scott Gray" <sc...@hotwaxmedia.com>
> That's an understatement and could actually be said of every patch in jira, shall we just go ahead and commit them all?  We can 
> improve them later right?
>
> Reading an xml file character by character to find something is like driving in a nail with the claw side of a hammer.  It sort of 
> works, but I wouldn't put the end result in my display cabinet.  Did you not review this before committing or is treating an xml 
> file like plain text an acceptable approach to you?

I thought it was enough for that case since we don't need to read any values. So I simply put a comment in ofbiz-containier. I will 
improve.

Jacques

> Thanks
> Scott
>
> On 1/05/2012, at 5:52 AM, Jacques Le Roux wrote:
>
>> You are right Scott, this can be improved...
>>
>> Jacques
>>
>> From: "Scott Gray" <sc...@hotwaxmedia.com>
>>> This is not a good implementation, simply searching the web.xml file for a string containing "<distributable/>" is not good
>>> enough.  It'll find the tag even if commented out and and won't find the tag "<distributable />" (space before closing, 
>>> perfectly
>>> valid).  I'm surprised this got past you Jacques.
>>>
>>> Regards
>>> Scott
>>>
>>> On 1/05/2012, at 1:31 AM, Jacques Le Roux wrote:
>>>
>>>> Pierre,
>>>>
>>>> I did not test, but I believe it's only used in a clustered environment and should have any impacts in other cases.
>>>> It makes only a webapp distributable. Before we added this, all were distributable by default, which could annoying in certain
>>>> circumstances.
>>>> So adding it in web.xml files should not changes from previous behaviour. Which makes me believe it's safe... (see commit for
>>>> more)
>>>>
>>>> Jacque
>>>>
>>>> From: "Pierre Smits" <pi...@gmail.com>
>>>>> Jacques,
>>>>>
>>>>> If I have this tag in the web.xml, but the change is tested in an
>>>>> unclustered environment what do you thing the result would be? Is it of no
>>>>> effect, would it fail?
>>>>>
>>>>> Regards,
>>>>>
>>>>> Pierre
>>>>>
>>>>> 2012/4/30 Jacques Le Roux <ja...@les7arts.com>
>>>>>
>>>>>> Hi Sam,
>>>>>>
>>>>>> Yes: http://tomcat.apache.org/**tomcat-6.0-doc/cluster-howto.**
>>>>>> html#Cluster_Basics<http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html#Cluster_Basics>
>>>>>> http://wiki.metawerx.net/Wiki.**jsp?page=web.xml.Distributable<http://wiki.metawerx.net/Wiki.jsp?page=web.xml.Distributable>
>>>>>>
>>>>>> Also consider
>>>>>> <property name="apps-cross-context" value="true"/>
>>>>>> <property name="apps-context-reloadable" value="true"/>
>>>>>> (false by default)
>>>>>>
>>>>>> If you use sticky sessions all above is not an issue...
>>>>>>
>>>>>> Maybe we should ask a comment in *-containers.xml BTW... Feel free to
>>>>>> provide one ;o)
>>>>>>
>>>>>> Jacques
>>>>>>
>>>>>>
>>>>>> Sam Hamilton wrote:
>>>>>>
>>>>>>> Hi Jacques,
>>>>>>>
>>>>>>> Quick question - does this setting mean that now if you uncomment
>>>>>>> framework/config/ofbiz-**containers.xml cluster settings it wont
>>>>>>> cluster and that you should also add a <distributable/> tag to all the
>>>>>>> web.xml files?
>>>>>>>
>>>>>>> Thanks
>>>>>>> Sam
>>>>>>>
>>>>>>>
>>>>>>> On 14 Apr 2012, at 15:30, jleroux@apache.org wrote:
>>>>>>>
>>>>>>> Author: jleroux
>>>>>>>> Date: Sat Apr 14 07:30:30 2012
>>>>>>>> New Revision: 1326064
>>>>>>>>
>>>>>>>> URL: http://svn.apache.org/viewvc?**rev=1326064&view=rev<http://svn.apache.org/viewvc?rev=1326064&view=rev>
>>>>>>>> Log:
>>>>>>>> Adapted by hand from Lon F. Binder "CatalinaContainer Doesn't Respect
>>>>>>>> <distributable/> Node for web.xml files."
>>>>>>>> https://issues.apache.org/**jira/browse/OFBIZ-4242<https://issues.apache.org/jira/browse/OFBIZ-4242>
>>>>>>>>
>>>>>>>> Per the servlet specification, the web.xml file should allow an optional
>>>>>>>> <distributable/> node to indicate that the application
>>>>>>>> is clusterable. Currently, OFBiz does not respect this setting and
>>>>>>>> assumes all applications should be distributed if any cluster
>>>>>>>> configuration is provided in the ofbiz-containers.xml file. As a result,
>>>>>>>> if, for example, the DeltaManager is enable, all
>>>>>>>> applications attempt to cluster and communicate via DeltaManager.
>>>>>>>>
>>>>>>>> The expected and proper functionality is to check the individual
>>>>>>>> application's web.xml file for the <distributable/> node and
>>>>>>>> only use the DeltaManager if found; otherwise the StandardManager should
>>>>>>>> be used for sessions.
>>>>>>>>
>>>>>>>> jleroux: replaced some tabs, reformatted, added a comment about
>>>>>>>> <distributable/> in the *-containers.file
>>>>>>>>
>>>>>>>> Modified:
>>>>>>>> ofbiz/trunk/framework/base/**src/org/ofbiz/base/util/**FileUtil.java
>>>>>>>> ofbiz/trunk/framework/**catalina/src/org/ofbiz/**catalina/container/**
>>>>>>>> CatalinaContainer.java
>>>>>>>>
>>>>>>>> Modified: ofbiz/trunk/framework/base/**src/org/ofbiz/base/util/**
>>>>>>>> FileUtil.java
>>>>>>>> URL:
>>>>>>>> http://svn.apache.org/viewvc/**ofbiz/trunk/framework/base/**
>>>>>>>> src/org/ofbiz/base/util/**FileUtil.java?rev=1326064&r1=**
>>>>>>>> 1326063&r2=1326064&view=diff<http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/FileUtil.java?rev=1326064&r1=1326063&r2=1326064&view=diff>
>>>>>>>> ==============================**==============================**==================
>>>>>>>> ---
>>>>>>>> ofbiz/trunk/framework/base/**src/org/ofbiz/base/util/**FileUtil.java
>>>>>>>> (original) +++
>>>>>>>> ofbiz/trunk/framework/base/**src/org/ofbiz/base/util/**FileUtil.java
>>>>>>>> Sat Apr 14 07:30:30 2012 @@ -29,6 +29,7 @@ import
>>>>>>>> java.io.FileWriter;
>>>>>>>> import java.io.FilenameFilter;
>>>>>>>> import java.io.IOException;
>>>>>>>> import java.io.OutputStream;
>>>>>>>> +import java.io.Reader;
>>>>>>>> import java.io.Writer;
>>>>>>>> import java.net.**MalformedURLException;
>>>>>>>> import java.util.List;
>>>>>>>> @@ -67,7 +68,7 @@ public class FileUtil {
>>>>>>>>
>>>>>>>>  /**
>>>>>>>>   * Converts a file path to one that is compatible with the host
>>>>>>>> operating system.
>>>>>>>> -     *
>>>>>>>> +     *
>>>>>>>>   * @param path The file path to convert.
>>>>>>>>   * @return The converted file path.
>>>>>>>>   */
>>>>>>>> @@ -341,4 +342,57 @@ public class FileUtil {
>>>>>>>>          return false;
>>>>>>>>      }
>>>>>>>>  }
>>>>>>>> +
>>>>>>>> +    /**
>>>>>>>> +    *
>>>>>>>> +    *
>>>>>>>> +    * Search for the specified <code>searchString</code> in the given
>>>>>>>> +    * {@link Reader}.
>>>>>>>> +    *
>>>>>>>> +    * @param reader A Reader in which the String will be searched.
>>>>>>>> +    * @param searchString The String to search for
>>>>>>>> +    * @return <code>TRUE</code> if the <code>searchString</code> is
>>>>>>>> found;
>>>>>>>> +    *         <code>FALSE</code> otherwise.
>>>>>>>> +    * @throws IOException
>>>>>>>> +    */
>>>>>>>> +   public static boolean containsString(Reader reader, final String
>>>>>>>> searchString) throws IOException {
>>>>>>>> +       char[] buffer = new char[1024];
>>>>>>>> +       int numCharsRead;
>>>>>>>> +       int count = 0;
>>>>>>>> +       while((numCharsRead = reader.read(buffer)) > 0) {
>>>>>>>> +           for (int c = 0; c < numCharsRead; ++c) {
>>>>>>>> +               if (buffer[c] == searchString.charAt(count)) count++;
>>>>>>>> +               else count = 0;
>>>>>>>> +               if (count == searchString.length()) return true;
>>>>>>>> +           }
>>>>>>>> +       }
>>>>>>>> +       return false;
>>>>>>>> +   }
>>>>>>>> +
>>>>>>>> +   /**
>>>>>>>> +    *
>>>>>>>> +    *
>>>>>>>> +    * Search for the specified <code>searchString</code> in the given
>>>>>>>> +    * filename. If the specified file doesn't exist, <code>FALSE</code>
>>>>>>>> +    * returns.
>>>>>>>> +    *
>>>>>>>> +    * @param fileName A full path to a file in which the String will be
>>>>>>>> searched.
>>>>>>>> +    * @param searchString The String to search for
>>>>>>>> +    * @return <code>TRUE</code> if the <code>searchString</code> is
>>>>>>>> found;
>>>>>>>> +    *         <code>FALSE</code> otherwise.
>>>>>>>> +    * @throws IOException
>>>>>>>> +    */
>>>>>>>> +   public static boolean containsString(final String fileName, final
>>>>>>>> String searchString) throws IOException {
>>>>>>>> +       File inFile = new File(fileName);
>>>>>>>> +       if (inFile.exists()) {
>>>>>>>> +           BufferedReader in = new BufferedReader(new
>>>>>>>> FileReader(inFile));
>>>>>>>> +           try {
>>>>>>>> +               return containsString(in, searchString);
>>>>>>>> +           } finally {
>>>>>>>> +               if (in != null)in.close();
>>>>>>>> +           }
>>>>>>>> +       } else {
>>>>>>>> +           return false;
>>>>>>>> +       }
>>>>>>>> +   }
>>>>>>>> }
>>>>>>>>
>>>>>>>> Modified: ofbiz/trunk/framework/**catalina/src/org/ofbiz/**
>>>>>>>> catalina/container/**CatalinaContainer.java
>>>>>>>> URL:
>>>>>>>> http://svn.apache.org/viewvc/**ofbiz/trunk/framework/**
>>>>>>>> catalina/src/org/ofbiz/**catalina/container/**
>>>>>>>> CatalinaContainer.java?rev=**1326064&r1=1326063&r2=1326064&**view=diff<http://svn.apache.org/viewvc/ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java?rev=1326064&r1=1326063&r2=1326064&view=diff>
>>>>>>>> ==============================**==============================**==================
>>>>>>>> ---
>>>>>>>> ofbiz/trunk/framework/**catalina/src/org/ofbiz/**catalina/container/**CatalinaContainer.java
>>>>>>>> (original) +++
>>>>>>>> ofbiz/trunk/framework/**catalina/src/org/ofbiz/**catalina/container/**CatalinaContainer.java
>>>>>>>> Sat Apr 14 07:30:30 2012 @@ -75,9 +75,10
>>>>>>>> @@ import org.ofbiz.base.concurrent.**Executi
>>>>>>>> import org.ofbiz.base.container.**ClassLoaderContainer;
>>>>>>>> import org.ofbiz.base.container.**Container;
>>>>>>>> import org.ofbiz.base.container.**ContainerConfig;
>>>>>>>> -import org.ofbiz.base.container.**ContainerException;
>>>>>>>> import org.ofbiz.base.container.**ContainerConfig.Container.**Property;
>>>>>>>> +import org.ofbiz.base.container.**ContainerException;
>>>>>>>> import org.ofbiz.base.util.Debug;
>>>>>>>> +import org.ofbiz.base.util.FileUtil;
>>>>>>>> import org.ofbiz.base.util.SSLUtil;
>>>>>>>> import org.ofbiz.base.util.UtilURL;
>>>>>>>> import org.ofbiz.base.util.**UtilValidate;
>>>>>>>> @@ -537,7 +538,7 @@ public class CatalinaContainer implement
>>>>>>>>          } catch (Exception e) {
>>>>>>>>              Debug.logError(e, "Couldn't create connector.", module);
>>>>>>>>          }
>>>>>>>> -
>>>>>>>> +
>>>>>>>>          try {
>>>>>>>>              for (ContainerConfig.Container.**Property prop:
>>>>>>>> connectorProp.properties.**values()) {
>>>>>>>>                  connector.setProperty(prop.**name <http://prop.name>,
>>>>>>>> prop.value);
>>>>>>>> @@ -583,7 +584,7 @@ public class CatalinaContainer implement
>>>>>>>>              engine.addChild(host);
>>>>>>>>          }
>>>>>>>>      }
>>>>>>>> -
>>>>>>>> +
>>>>>>>>      if (host instanceof StandardHost) {
>>>>>>>>          // set the catalina's work directory to the host
>>>>>>>>          StandardHost standardHost = (StandardHost) host;
>>>>>>>> @@ -618,11 +619,24 @@ public class CatalinaContainer implement
>>>>>>>>          mount = mount.substring(0, mount.length() - 2);
>>>>>>>>      }
>>>>>>>>
>>>>>>>> +
>>>>>>>> +        final String webXmlFilePath = new StringBuilder().append(**
>>>>>>>> location)
>>>>>>>> +            .append(File.separatorChar).**append("WEB-INF")
>>>>>>>> +            .append(File.separatorChar).**append("web.xml").toString();
>>>>>>>> +        boolean appIsDistributable = false;
>>>>>>>> +        try {
>>>>>>>> +            appIsDistributable = FileUtil.containsString(**webXmlFilePath,
>>>>>>>> "<distributable/>");
>>>>>>>> +        } catch (IOException e) {
>>>>>>>> +            Debug.logWarning(String.**format("Failed to read web.xml
>>>>>>>> [%s].", webXmlFilePath), module);
>>>>>>>> +            appIsDistributable = false;
>>>>>>>> +        }
>>>>>>>> +        final boolean contextIsDistributable = distribute &&
>>>>>>>> appIsDistributable;
>>>>>>>> +
>>>>>>>>      // configure persistent sessions
>>>>>>>>      Property clusterProp = clusterConfig.get(engine.**getName());
>>>>>>>>
>>>>>>>>      Manager sessionMgr = null;
>>>>>>>> -        if (clusterProp != null) {
>>>>>>>> +        if (clusterProp != null && contextIsDistributable) {
>>>>>>>>          String mgrClassName = ContainerConfig.**getPropertyValue(clusterProp,
>>>>>>>> "manager-class",
>>>>>>>>          "org.apache.catalina.ha.**session.DeltaManager"); try {
>>>>>>>>              sessionMgr = (Manager)Class.forName(**
>>>>>>>> mgrClassName).newInstance();
>>>>>>>> @@ -639,16 +653,16 @@ public class CatalinaContainer implement
>>>>>>>>      context.setDocBase(location);
>>>>>>>>      context.setPath(mount);
>>>>>>>>      context.addLifecycleListener(**new ContextConfig());
>>>>>>>> -
>>>>>>>> +
>>>>>>>>      JarScanner jarScanner = context.getJarScanner();
>>>>>>>>      if (jarScanner instanceof StandardJarScanner) {
>>>>>>>>          StandardJarScanner standardJarScanner = (StandardJarScanner)
>>>>>>>> jarScanner;
>>>>>>>>          standardJarScanner.**setScanClassPath(false);
>>>>>>>>      }
>>>>>>>> -
>>>>>>>> +
>>>>>>>>      Engine egn = (Engine) context.getParent().getParent(**);
>>>>>>>>      egn.setService(tomcat.**getService());
>>>>>>>> -
>>>>>>>> +
>>>>>>>>      Debug.logInfo("host[" + host + "].addChild(" + context + ")",
>>>>>>>> module);
>>>>>>>>      //context.setDeployOnStartup(**false);
>>>>>>>>      //context.**setBackgroundProcessorDelay(5)**;
>>>>>>>> @@ -664,7 +678,9 @@ public class CatalinaContainer implement
>>>>>>>>      context.setAllowLinking(true);
>>>>>>>>
>>>>>>>>      context.setReloadable(**contextReloadable);
>>>>>>>> -        context.setDistributable(**distribute);
>>>>>>>> +
>>>>>>>> +        context.setDistributable(**contextIsDistributable);
>>>>>>>> +
>>>>>>>>      context.setCrossContext(**crossContext);
>>>>>>>>      context.setPrivileged(appInfo.**privileged);
>>>>>>>>      context.setManager(sessionMgr)**;
>>>>>>>>
>>>>>>>
>>>
>>>
>
> 

Re: svn commit: r1326064 - in /ofbiz/trunk/framework: base/src/org/ofbiz/base/util/FileUtil.java catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java

Posted by Jacques Le Roux <ja...@les7arts.com>.
Done at r1334336, backported in R12.04

Jacques

From: "Jacques Le Roux" <ja...@les7arts.com>
> From: "Scott Gray" <sc...@hotwaxmedia.com>
>> That's an understatement and could actually be said of every patch in jira, shall we just go ahead and commit them all?  We can 
>> improve them later right?
>>
>> Reading an xml file character by character to find something is like driving in a nail with the claw side of a hammer.  It sort 
>> of works, but I wouldn't put the end result in my display cabinet.  Did you not review this before committing or is treating an 
>> xml file like plain text an acceptable approach to you?
>
> I thought it was enough for that case since we don't need to read any values. So I simply put a comment in ofbiz-containier. I 
> will improve.
>
> Jacques
>
>> Thanks
>> Scott
>>
>> On 1/05/2012, at 5:52 AM, Jacques Le Roux wrote:
>>
>>> You are right Scott, this can be improved...
>>>
>>> Jacques
>>>
>>> From: "Scott Gray" <sc...@hotwaxmedia.com>
>>>> This is not a good implementation, simply searching the web.xml file for a string containing "<distributable/>" is not good
>>>> enough.  It'll find the tag even if commented out and and won't find the tag "<distributable />" (space before closing, 
>>>> perfectly
>>>> valid).  I'm surprised this got past you Jacques.
>>>>
>>>> Regards
>>>> Scott
>>>>
>>>> On 1/05/2012, at 1:31 AM, Jacques Le Roux wrote:
>>>>
>>>>> Pierre,
>>>>>
>>>>> I did not test, but I believe it's only used in a clustered environment and should have any impacts in other cases.
>>>>> It makes only a webapp distributable. Before we added this, all were distributable by default, which could annoying in certain
>>>>> circumstances.
>>>>> So adding it in web.xml files should not changes from previous behaviour. Which makes me believe it's safe... (see commit for
>>>>> more)
>>>>>
>>>>> Jacque
>>>>>
>>>>> From: "Pierre Smits" <pi...@gmail.com>
>>>>>> Jacques,
>>>>>>
>>>>>> If I have this tag in the web.xml, but the change is tested in an
>>>>>> unclustered environment what do you thing the result would be? Is it of no
>>>>>> effect, would it fail?
>>>>>>
>>>>>> Regards,
>>>>>>
>>>>>> Pierre
>>>>>>
>>>>>> 2012/4/30 Jacques Le Roux <ja...@les7arts.com>
>>>>>>
>>>>>>> Hi Sam,
>>>>>>>
>>>>>>> Yes: http://tomcat.apache.org/**tomcat-6.0-doc/cluster-howto.**
>>>>>>> html#Cluster_Basics<http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html#Cluster_Basics>
>>>>>>> http://wiki.metawerx.net/Wiki.**jsp?page=web.xml.Distributable<http://wiki.metawerx.net/Wiki.jsp?page=web.xml.Distributable>
>>>>>>>
>>>>>>> Also consider
>>>>>>> <property name="apps-cross-context" value="true"/>
>>>>>>> <property name="apps-context-reloadable" value="true"/>
>>>>>>> (false by default)
>>>>>>>
>>>>>>> If you use sticky sessions all above is not an issue...
>>>>>>>
>>>>>>> Maybe we should ask a comment in *-containers.xml BTW... Feel free to
>>>>>>> provide one ;o)
>>>>>>>
>>>>>>> Jacques
>>>>>>>
>>>>>>>
>>>>>>> Sam Hamilton wrote:
>>>>>>>
>>>>>>>> Hi Jacques,
>>>>>>>>
>>>>>>>> Quick question - does this setting mean that now if you uncomment
>>>>>>>> framework/config/ofbiz-**containers.xml cluster settings it wont
>>>>>>>> cluster and that you should also add a <distributable/> tag to all the
>>>>>>>> web.xml files?
>>>>>>>>
>>>>>>>> Thanks
>>>>>>>> Sam
>>>>>>>>
>>>>>>>>
>>>>>>>> On 14 Apr 2012, at 15:30, jleroux@apache.org wrote:
>>>>>>>>
>>>>>>>> Author: jleroux
>>>>>>>>> Date: Sat Apr 14 07:30:30 2012
>>>>>>>>> New Revision: 1326064
>>>>>>>>>
>>>>>>>>> URL: http://svn.apache.org/viewvc?**rev=1326064&view=rev<http://svn.apache.org/viewvc?rev=1326064&view=rev>
>>>>>>>>> Log:
>>>>>>>>> Adapted by hand from Lon F. Binder "CatalinaContainer Doesn't Respect
>>>>>>>>> <distributable/> Node for web.xml files."
>>>>>>>>> https://issues.apache.org/**jira/browse/OFBIZ-4242<https://issues.apache.org/jira/browse/OFBIZ-4242>
>>>>>>>>>
>>>>>>>>> Per the servlet specification, the web.xml file should allow an optional
>>>>>>>>> <distributable/> node to indicate that the application
>>>>>>>>> is clusterable. Currently, OFBiz does not respect this setting and
>>>>>>>>> assumes all applications should be distributed if any cluster
>>>>>>>>> configuration is provided in the ofbiz-containers.xml file. As a result,
>>>>>>>>> if, for example, the DeltaManager is enable, all
>>>>>>>>> applications attempt to cluster and communicate via DeltaManager.
>>>>>>>>>
>>>>>>>>> The expected and proper functionality is to check the individual
>>>>>>>>> application's web.xml file for the <distributable/> node and
>>>>>>>>> only use the DeltaManager if found; otherwise the StandardManager should
>>>>>>>>> be used for sessions.
>>>>>>>>>
>>>>>>>>> jleroux: replaced some tabs, reformatted, added a comment about
>>>>>>>>> <distributable/> in the *-containers.file
>>>>>>>>>
>>>>>>>>> Modified:
>>>>>>>>> ofbiz/trunk/framework/base/**src/org/ofbiz/base/util/**FileUtil.java
>>>>>>>>> ofbiz/trunk/framework/**catalina/src/org/ofbiz/**catalina/container/**
>>>>>>>>> CatalinaContainer.java
>>>>>>>>>
>>>>>>>>> Modified: ofbiz/trunk/framework/base/**src/org/ofbiz/base/util/**
>>>>>>>>> FileUtil.java
>>>>>>>>> URL:
>>>>>>>>> http://svn.apache.org/viewvc/**ofbiz/trunk/framework/base/**
>>>>>>>>> src/org/ofbiz/base/util/**FileUtil.java?rev=1326064&r1=**
>>>>>>>>> 1326063&r2=1326064&view=diff<http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/FileUtil.java?rev=1326064&r1=1326063&r2=1326064&view=diff>
>>>>>>>>> ==============================**==============================**==================
>>>>>>>>> ---
>>>>>>>>> ofbiz/trunk/framework/base/**src/org/ofbiz/base/util/**FileUtil.java
>>>>>>>>> (original) +++
>>>>>>>>> ofbiz/trunk/framework/base/**src/org/ofbiz/base/util/**FileUtil.java
>>>>>>>>> Sat Apr 14 07:30:30 2012 @@ -29,6 +29,7 @@ import
>>>>>>>>> java.io.FileWriter;
>>>>>>>>> import java.io.FilenameFilter;
>>>>>>>>> import java.io.IOException;
>>>>>>>>> import java.io.OutputStream;
>>>>>>>>> +import java.io.Reader;
>>>>>>>>> import java.io.Writer;
>>>>>>>>> import java.net.**MalformedURLException;
>>>>>>>>> import java.util.List;
>>>>>>>>> @@ -67,7 +68,7 @@ public class FileUtil {
>>>>>>>>>
>>>>>>>>>  /**
>>>>>>>>>   * Converts a file path to one that is compatible with the host
>>>>>>>>> operating system.
>>>>>>>>> -     *
>>>>>>>>> +     *
>>>>>>>>>   * @param path The file path to convert.
>>>>>>>>>   * @return The converted file path.
>>>>>>>>>   */
>>>>>>>>> @@ -341,4 +342,57 @@ public class FileUtil {
>>>>>>>>>          return false;
>>>>>>>>>      }
>>>>>>>>>  }
>>>>>>>>> +
>>>>>>>>> +    /**
>>>>>>>>> +    *
>>>>>>>>> +    *
>>>>>>>>> +    * Search for the specified <code>searchString</code> in the given
>>>>>>>>> +    * {@link Reader}.
>>>>>>>>> +    *
>>>>>>>>> +    * @param reader A Reader in which the String will be searched.
>>>>>>>>> +    * @param searchString The String to search for
>>>>>>>>> +    * @return <code>TRUE</code> if the <code>searchString</code> is
>>>>>>>>> found;
>>>>>>>>> +    *         <code>FALSE</code> otherwise.
>>>>>>>>> +    * @throws IOException
>>>>>>>>> +    */
>>>>>>>>> +   public static boolean containsString(Reader reader, final String
>>>>>>>>> searchString) throws IOException {
>>>>>>>>> +       char[] buffer = new char[1024];
>>>>>>>>> +       int numCharsRead;
>>>>>>>>> +       int count = 0;
>>>>>>>>> +       while((numCharsRead = reader.read(buffer)) > 0) {
>>>>>>>>> +           for (int c = 0; c < numCharsRead; ++c) {
>>>>>>>>> +               if (buffer[c] == searchString.charAt(count)) count++;
>>>>>>>>> +               else count = 0;
>>>>>>>>> +               if (count == searchString.length()) return true;
>>>>>>>>> +           }
>>>>>>>>> +       }
>>>>>>>>> +       return false;
>>>>>>>>> +   }
>>>>>>>>> +
>>>>>>>>> +   /**
>>>>>>>>> +    *
>>>>>>>>> +    *
>>>>>>>>> +    * Search for the specified <code>searchString</code> in the given
>>>>>>>>> +    * filename. If the specified file doesn't exist, <code>FALSE</code>
>>>>>>>>> +    * returns.
>>>>>>>>> +    *
>>>>>>>>> +    * @param fileName A full path to a file in which the String will be
>>>>>>>>> searched.
>>>>>>>>> +    * @param searchString The String to search for
>>>>>>>>> +    * @return <code>TRUE</code> if the <code>searchString</code> is
>>>>>>>>> found;
>>>>>>>>> +    *         <code>FALSE</code> otherwise.
>>>>>>>>> +    * @throws IOException
>>>>>>>>> +    */
>>>>>>>>> +   public static boolean containsString(final String fileName, final
>>>>>>>>> String searchString) throws IOException {
>>>>>>>>> +       File inFile = new File(fileName);
>>>>>>>>> +       if (inFile.exists()) {
>>>>>>>>> +           BufferedReader in = new BufferedReader(new
>>>>>>>>> FileReader(inFile));
>>>>>>>>> +           try {
>>>>>>>>> +               return containsString(in, searchString);
>>>>>>>>> +           } finally {
>>>>>>>>> +               if (in != null)in.close();
>>>>>>>>> +           }
>>>>>>>>> +       } else {
>>>>>>>>> +           return false;
>>>>>>>>> +       }
>>>>>>>>> +   }
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>> Modified: ofbiz/trunk/framework/**catalina/src/org/ofbiz/**
>>>>>>>>> catalina/container/**CatalinaContainer.java
>>>>>>>>> URL:
>>>>>>>>> http://svn.apache.org/viewvc/**ofbiz/trunk/framework/**
>>>>>>>>> catalina/src/org/ofbiz/**catalina/container/**
>>>>>>>>> CatalinaContainer.java?rev=**1326064&r1=1326063&r2=1326064&**view=diff<http://svn.apache.org/viewvc/ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java?rev=1326064&r1=1326063&r2=1326064&view=diff>
>>>>>>>>> ==============================**==============================**==================
>>>>>>>>> ---
>>>>>>>>> ofbiz/trunk/framework/**catalina/src/org/ofbiz/**catalina/container/**CatalinaContainer.java
>>>>>>>>> (original) +++
>>>>>>>>> ofbiz/trunk/framework/**catalina/src/org/ofbiz/**catalina/container/**CatalinaContainer.java
>>>>>>>>> Sat Apr 14 07:30:30 2012 @@ -75,9 +75,10
>>>>>>>>> @@ import org.ofbiz.base.concurrent.**Executi
>>>>>>>>> import org.ofbiz.base.container.**ClassLoaderContainer;
>>>>>>>>> import org.ofbiz.base.container.**Container;
>>>>>>>>> import org.ofbiz.base.container.**ContainerConfig;
>>>>>>>>> -import org.ofbiz.base.container.**ContainerException;
>>>>>>>>> import org.ofbiz.base.container.**ContainerConfig.Container.**Property;
>>>>>>>>> +import org.ofbiz.base.container.**ContainerException;
>>>>>>>>> import org.ofbiz.base.util.Debug;
>>>>>>>>> +import org.ofbiz.base.util.FileUtil;
>>>>>>>>> import org.ofbiz.base.util.SSLUtil;
>>>>>>>>> import org.ofbiz.base.util.UtilURL;
>>>>>>>>> import org.ofbiz.base.util.**UtilValidate;
>>>>>>>>> @@ -537,7 +538,7 @@ public class CatalinaContainer implement
>>>>>>>>>          } catch (Exception e) {
>>>>>>>>>              Debug.logError(e, "Couldn't create connector.", module);
>>>>>>>>>          }
>>>>>>>>> -
>>>>>>>>> +
>>>>>>>>>          try {
>>>>>>>>>              for (ContainerConfig.Container.**Property prop:
>>>>>>>>> connectorProp.properties.**values()) {
>>>>>>>>>                  connector.setProperty(prop.**name <http://prop.name>,
>>>>>>>>> prop.value);
>>>>>>>>> @@ -583,7 +584,7 @@ public class CatalinaContainer implement
>>>>>>>>>              engine.addChild(host);
>>>>>>>>>          }
>>>>>>>>>      }
>>>>>>>>> -
>>>>>>>>> +
>>>>>>>>>      if (host instanceof StandardHost) {
>>>>>>>>>          // set the catalina's work directory to the host
>>>>>>>>>          StandardHost standardHost = (StandardHost) host;
>>>>>>>>> @@ -618,11 +619,24 @@ public class CatalinaContainer implement
>>>>>>>>>          mount = mount.substring(0, mount.length() - 2);
>>>>>>>>>      }
>>>>>>>>>
>>>>>>>>> +
>>>>>>>>> +        final String webXmlFilePath = new StringBuilder().append(**
>>>>>>>>> location)
>>>>>>>>> +            .append(File.separatorChar).**append("WEB-INF")
>>>>>>>>> +            .append(File.separatorChar).**append("web.xml").toString();
>>>>>>>>> +        boolean appIsDistributable = false;
>>>>>>>>> +        try {
>>>>>>>>> +            appIsDistributable = FileUtil.containsString(**webXmlFilePath,
>>>>>>>>> "<distributable/>");
>>>>>>>>> +        } catch (IOException e) {
>>>>>>>>> +            Debug.logWarning(String.**format("Failed to read web.xml
>>>>>>>>> [%s].", webXmlFilePath), module);
>>>>>>>>> +            appIsDistributable = false;
>>>>>>>>> +        }
>>>>>>>>> +        final boolean contextIsDistributable = distribute &&
>>>>>>>>> appIsDistributable;
>>>>>>>>> +
>>>>>>>>>      // configure persistent sessions
>>>>>>>>>      Property clusterProp = clusterConfig.get(engine.**getName());
>>>>>>>>>
>>>>>>>>>      Manager sessionMgr = null;
>>>>>>>>> -        if (clusterProp != null) {
>>>>>>>>> +        if (clusterProp != null && contextIsDistributable) {
>>>>>>>>>          String mgrClassName = ContainerConfig.**getPropertyValue(clusterProp,
>>>>>>>>> "manager-class",
>>>>>>>>>          "org.apache.catalina.ha.**session.DeltaManager"); try {
>>>>>>>>>              sessionMgr = (Manager)Class.forName(**
>>>>>>>>> mgrClassName).newInstance();
>>>>>>>>> @@ -639,16 +653,16 @@ public class CatalinaContainer implement
>>>>>>>>>      context.setDocBase(location);
>>>>>>>>>      context.setPath(mount);
>>>>>>>>>      context.addLifecycleListener(**new ContextConfig());
>>>>>>>>> -
>>>>>>>>> +
>>>>>>>>>      JarScanner jarScanner = context.getJarScanner();
>>>>>>>>>      if (jarScanner instanceof StandardJarScanner) {
>>>>>>>>>          StandardJarScanner standardJarScanner = (StandardJarScanner)
>>>>>>>>> jarScanner;
>>>>>>>>>          standardJarScanner.**setScanClassPath(false);
>>>>>>>>>      }
>>>>>>>>> -
>>>>>>>>> +
>>>>>>>>>      Engine egn = (Engine) context.getParent().getParent(**);
>>>>>>>>>      egn.setService(tomcat.**getService());
>>>>>>>>> -
>>>>>>>>> +
>>>>>>>>>      Debug.logInfo("host[" + host + "].addChild(" + context + ")",
>>>>>>>>> module);
>>>>>>>>>      //context.setDeployOnStartup(**false);
>>>>>>>>>      //context.**setBackgroundProcessorDelay(5)**;
>>>>>>>>> @@ -664,7 +678,9 @@ public class CatalinaContainer implement
>>>>>>>>>      context.setAllowLinking(true);
>>>>>>>>>
>>>>>>>>>      context.setReloadable(**contextReloadable);
>>>>>>>>> -        context.setDistributable(**distribute);
>>>>>>>>> +
>>>>>>>>> +        context.setDistributable(**contextIsDistributable);
>>>>>>>>> +
>>>>>>>>>      context.setCrossContext(**crossContext);
>>>>>>>>>      context.setPrivileged(appInfo.**privileged);
>>>>>>>>>      context.setManager(sessionMgr)**;
>>>>>>>>>
>>>>>>>>
>>>>
>>>>
>>
>>