[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