[Zope] Re: including arbitrary files in zope products
Josef Meile
jmeile at hotmail.com
Fri Sep 3 04:24:18 EDT 2004
Hi Raja,
some few month ago, I was trying to do the same: Store a java applet
class on the file system and load it dynamically from each instance of
my product, but I didn't succeeded. You can see my attempt on:
http://mail.zope.org/pipermail/zope/2004-May/149813.html
Anyway, I solved it storing the java applet on the Zope DB when
initializing my product. The code is attached to the message.
After adding the file to the Zope DB, then you can use its path on the
<applet> tag and it should work.
Regards,
Josef
--- In zope at yahoogroups.com, Raja Subramanian <rsubr at p...> wrote:
> Hi,
>
> I am facing a basic problem with Zope that I'm unable to solve.
>
> I want to embed a java applet (jar) in my zope product. The
> jar file lives as "<Product Basedir>/www/foo.jar" on the filesystem.
> I want to make this available as "<Product Instance Dir>/foo.jar"
> inside zope.
>
> To include ZPT files, I'm able to do -
>
> from Products.PageTemplates.PageTemplateFile import PageTemplateFile
> ...
> class Foo(Folder):
> ...
> index_html = PageTemplateFile('zpt/index_html', globals())
>
> and make zpt files available inside zope. How can I do the same for
> arbitrary files such as java archives and others?
>
> I don't know how to use the "File" object for this purpose. Can
> someone please help?
>
> Thanks in advance.
>
> - Raja
>
> _______________________________________________
> Zope maillist - Zope at z...
> http://mail.zope.org/mailman/listinfo/zope
> ** No cross posts or HTML encoding! **
> (Related lists -
> http://mail.zope.org/mailman/listinfo/zope-announce
> http://mail.zope.org/mailman/listinfo/zope-dev )
-------------- next part --------------
import Globals, os
from OFS.Image import manage_addFile
from zLOG import LOG, INFO, BLATHER, \
PROBLEM, WARNING
#Get's the physical location of your product
PRODUCT_HOME=Globals.package_home(globals())
def initialize(context):
#Do the normal initialization stuff here
#...
#...
#...
#Get's the ZMI Context
appContext=context._ProductContext__app
#On my case the java class was stored on
#PRODUCT_HOME/java, here you have to change
#it for your location
absolutePath=os.path.join(PRODUCT_HOME,'java')
"""
ColorPicker.class is the name of the class
(here you can use your jar file)
/java is the path where you want to store
it on the ZMI
"""
def _createFileInFolder(context, filePath, fileName,
zopePath, title='', binary=0):
"""Creates a the folder <zopePath> and puts the
file <filePath>/<fileName> on it
"""
pathLen=len(zopePath)
#Remove leading slash
if (zopePath[-1]=='/') and (pathLen>1):
zopePath=zopePath[0:pathLen-1]
if zopePath[0]!='/':
#The product will only work with relative paths
#if the instances can adquire them.
_log('The path "%s" is relative.' %zopePath,
severity=WARNING,
detail='For better results use absolute paths.',
product='createFileInFolder')
zopePath='/'+zopePath
pathParts=os.path.split(zopePath)
basePath=pathParts[0]
folder=pathParts[1]
#This only happens when no slash is given at
#the beginning of the path, so the root will
#be assumed
fileContainer=context.unrestrictedTraverse(basePath,None)
if fileContainer==None:
_log('The path "%s" doesn\'t exist on the Zope DB.' %basePath,
severity=PROBLEM,detail='Create it first.',
product='createFileInFolder')
return
fileFolder=fileContainer
#If the given path wasn't the zope root
if folder!='':
_tryAdd(fileContainer,folder,manage_addFolder,'Utils')
fileFolder=getattr(fileContainer,folder)
absolutePath=os.path.join(filePath,fileName)
if binary:
data=file(absolutePath,'rb')
else:
data=file(absolutePath)
_tryAdd(fileFolder,fileName,manage_addFile,
title,file=data)
def _tryAdd(container, id, addMethod, title='',
file=None):
"""If an object doesn't exist on the Zope DB,
then it will be added; otherwise, the
method will return 0
"""
try:
if file!=None:
#It is a file object
addMethod(container,id,title=title,
file=file)
else:
addMethod(container,id,title=title)
except BadRequest:
result=0
return 1
def _log(msg, severity=INFO, detail='',
error=None, product='', exit=0):
"""Logs a message to the zope log"""
if not NOISY_DEBUG and severity == BLATHER:
return
if type(msg) is UnicodeType:
msg = msg.encode(sys.getdefaultencoding(), 'replace')
if type(detail) is UnicodeType:
detail = detail.encode(sys.getdefaultencoding(), 'replace')
LOG(product, severity, msg, detail, error)
if exit:
Lifetime.shutdown(0)
More information about the Zope
mailing list