Ah, Velocity is trying to log to the file system which isn't allowed in GAE. 
You can off course read
files. So perhaps instead of Velocity.resourceExists, use the servletContext 
Servlet API:

public static boolean resourceExists(String resourceName) {
    ServletContext sc = Context.getThreadLocalContext();
    URL resource = servletContext.getResource(resourceName);
    return resource != null;
}

Kind regards

Bob

On 27/12/2010 12:40, Tim Christensen wrote:
> Bob,
> 
> Thank you for taking the time to help out - unfortunately the security 
> restriction kicks in:
> 
> java.security.AccessControlException: access denied (java.io.FilePermission 
> velocity.log write)
>       at 
> java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
>       at 
> java.security.AccessController.checkPermission(AccessController.java:546)
>       at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
>       at 
> com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:166)
>       at java.lang.SecurityManager.checkWrite(SecurityManager.java:962)
>       at java.io.FileOutputStream.<init>(FileOutputStream.java:169)
>       at java.io.FileOutputStream.<init>(FileOutputStream.java:102)
>       at org.apache.log4j.FileAppender.setFile(FileAppender.java:290)
>       at 
> org.apache.log4j.RollingFileAppender.setFile(RollingFileAppender.java:194)
>       at org.apache.log4j.FileAppender.<init>(FileAppender.java:109)
>       at 
> org.apache.log4j.RollingFileAppender.<init>(RollingFileAppender.java:72)
>       at 
> org.apache.velocity.runtime.log.Log4JLogChute.initAppender(Log4JLogChute.java:118)
>       at 
> org.apache.velocity.runtime.log.Log4JLogChute.init(Log4JLogChute.java:85)
>       at 
> org.apache.velocity.runtime.log.LogManager.createLogChute(LogManager.java:157)
>       at 
> org.apache.velocity.runtime.log.LogManager.updateLog(LogManager.java:255)
>       at 
> org.apache.velocity.runtime.RuntimeInstance.initializeLog(RuntimeInstance.java:795)
>       at 
> org.apache.velocity.runtime.RuntimeInstance.init(RuntimeInstance.java:250)
>       at 
> org.apache.velocity.runtime.RuntimeInstance.requireInitialization(RuntimeInstance.java:290)
>       at 
> org.apache.velocity.runtime.RuntimeInstance.getLoaderNameForResource(RuntimeInstance.java:1462)
>       at 
> org.apache.velocity.runtime.RuntimeSingleton.getLoaderNameForResource(RuntimeSingleton.java:380)
>       at org.apache.velocity.app.Velocity.resourceExists(Velocity.java:423)
> 
> 
> 
> On Dec 26, 2010, at 5:39 PM, Bob Schellink wrote:
> 
>> Hi Tim,
>>
>> Velocity has a way to check if a template/resource exists through this 
>> static method[1]:
>>
>>  Velocity.resourceExists(name);
>>
>> I'm not sure how efficient this check is though as it might touch the file 
>> system. You could ask on
>> the Velocity mailing list just to make sure. If it does touch the file 
>> system it should be easy to
>> cache it in your app through some utility class:
>>
>> VelocityUtils {
>>  private static Map<String, Integer> CACHE = new ConcurrentHashMap();
>>
>>  public boolean resourceExists(String name) {
>>    int val = CACHE.get(name);
>>    if (val == 1) {
>>      return true;
>>    } else if (val == 0) {
>>      return false;
>>  } else {
>>    if(Velocity.resourceExists(name)) {
>>      CACHE.put(name, 1);
>>    } else {
>>            CACHE.put(name, 0);
>>    }
>>  }
>> }
>>
>> or something along those lines.
>>
>> Id you are using GAE you should probably use 2.3.0-M1 which provides a 
>> workaround[2] for a GAE bug
>> which breaks Page automapping.
>>
>> Hope this helps
>>
>> Kind regards
>>
>> Bob
>>
>> [1]:
>> http://velocity.apache.org/engine/releases/velocity-1.7/apidocs/org/apache/velocity/app/Velocity.html#resourceExists(java.lang.String)
>> [2]:
>> http://click.apache.org/docs/extras-api/org/apache/click/extras/gae/GoogleAppEngineListener.html
>> (See the Limitations section in the Javadoc)
>>
>>
>> On 27/12/2010 10:34, Tim Christensen wrote:
>>> I am building a web application using Click on the Google App Engine. One 
>>> of the 'features' I would
>>> like to have is the ability to try setting a template -- if it is 
>>> available. Like the Click example
>>> we have a BasePage > BorderPage (with a template of border.htm) and our 
>>> Page classes extend
>>> BorderPage.
>>>
>>> One of those Page classes is BrandPage -- for some consumer brands. The 
>>> BrandPage will have some
>>> common methods - search for products matching this brand for example - 
>>> think ecommerce.
>>> Additionally, there is a brand.htm file for the BrandPage.
>>>
>>> However, I would like some brands, not all, to have a template available to 
>>> parse - we would like to
>>> build out some custom .htm pages to parse in the brand.htm. For example we 
>>> may have three brands ,
>>> A, B, C and A.htm, C.htm but not a B.htm in a directory say ... /brand/A.htm
>>>
>>> Normally in the BrandPage I would put something like this:
>>>
>>> public String getTemplate()
>>> {
>>> return A.htm (or C.htm, or even B.htm)
>>> }
>>>
>>> From the example above, while A.htm or C.htm exist, B.htm does not.
>>>
>>> How this would have happened is that when the BrandPage was requested, with 
>>> a brand id for example,
>>> the database search would return the brand (and product etc...). I would 
>>> then 'dynamically' set the
>>> getTemplate() return to [Normalized Brand Name].htm
>>>
>>> My question is this -- how can I test to see if B.htm exists before I even 
>>> set the getTemplate
>>> return value? My focus has been using something utility-wise in Click - am 
>>> I missing a simple way to
>>> do this? Wrap a try catch somewhere? As you would expect, I currently get 
>>> the
>>> org.apache.velocity.exception.ResourceNotFoundException -- but I cannot 
>>> catch it in the Page in
>>> order to do something else.
>>>
>>> I also want it to be a quick process. I have pondered using File to look in 
>>> a specific directory
>>> ("/brand/file.htm"). My biggest concerns are: 1. Speed for this 'function', 
>>> 2. Google App Engine
>>> restrictions - would looking at a file in the /war cause an issue, and 
>>> finally if Click has
>>> something I missed as a convenience for this idea. Solving this gives us 
>>> tremendous flexibility on
>>> the presentation and is a critical feature to our application. I am also 
>>> concerned that the way I am
>>> thinking about this is flawed so any alternative design pattern suggestions 
>>> are welcome.
>>>
>>> Thank you for a great framework - I have tried nearly all of them and Click 
>>> nailed it.
>>>
>>
> 
> 
> -------------------------------------------------
> Tim Christensen
> Director Media & Technology
> Vann's Inc.
> 406-203-4656
> 
> http://www.vanns.com
> 
> Follow me on Twitter: http://twitter.com/tim_christensen
> [email protected]
> 
> Follow Vann's on Twitter: http://twitter.com/vanns
> 
> This e-mail and any files transmitted with it are confidential and are 
> intended solely for the use
> of the individual or entity to whom they are addressed. This communication 
> may contain material
> protected by the attorney-client privilege. If you are not the intended 
> recipient or the person
> responsible for delivering the e-mail to the intended recipient, be advised 
> that you have received
> this e-mail in error and that any use, dissemination, forwarding, printing, 
> or copying of this
> e-mail is strictly prohibited. If you have received this e-mail in error, 
> please immediately notify
> Tim Christensen by telephone at 406-203-4656. You will be reimbursed for 
> reasonable costs incurred
> in notifying us.
> 
> 
> 
> 
> 
> 

Reply via email to