d0df704d8a
added python.path vm arg to startup script fixed infinite loop in unwrap() when displaying sequences of sequences git-svn-id: http://google-refine.googlecode.com/svn/trunk@509 7d457c2a-affb-35e4-300a-418c747d4874
102 lines
3.6 KiB
Python
102 lines
3.6 KiB
Python
###
|
|
#
|
|
# Copyright Alan Kennedy.
|
|
#
|
|
# You may contact the copyright holder at this uri:
|
|
#
|
|
# http://www.xhaus.com/contact/modjy
|
|
#
|
|
# The licence under which this code is released is the Apache License v2.0.
|
|
#
|
|
# The terms and conditions of this license are listed in a file contained
|
|
# in the distribution that also contained this file, under the name
|
|
# LICENSE.txt.
|
|
#
|
|
# You may also read a copy of the license at the following web address.
|
|
#
|
|
# http://modjy.xhaus.com/LICENSE.txt
|
|
#
|
|
###
|
|
|
|
import types
|
|
import sys
|
|
|
|
from modjy_exceptions import *
|
|
|
|
class modjy_impl:
|
|
|
|
def deal_with_app_return(self, environ, start_response_callable, app_return):
|
|
self.log.debug("Processing app return type: %s" % str(type(app_return)))
|
|
if isinstance(app_return, types.StringTypes):
|
|
raise ReturnNotIterable("Application returned object that was not an iterable: %s" % str(type(app_return)))
|
|
if type(app_return) is types.FileType:
|
|
pass # TBD: What to do here? can't call fileno()
|
|
if hasattr(app_return, '__len__') and callable(app_return.__len__):
|
|
expected_pieces = app_return.__len__()
|
|
else:
|
|
expected_pieces = -1
|
|
try:
|
|
try:
|
|
ix = 0
|
|
for next_piece in app_return:
|
|
if not isinstance(next_piece, types.StringTypes):
|
|
raise NonStringOutput("Application returned iterable containing non-strings: %s" % str(type(next_piece)))
|
|
if ix == 0:
|
|
# The application may have called start_response in the first iteration
|
|
if not start_response_callable.called:
|
|
raise StartResponseNotCalled("Start_response callable was never called.")
|
|
if not start_response_callable.content_length \
|
|
and expected_pieces == 1 \
|
|
and start_response_callable.write_callable.num_writes == 0:
|
|
# Take the length of the first piece
|
|
start_response_callable.set_content_length(len(next_piece))
|
|
start_response_callable.write_callable(next_piece)
|
|
ix += 1
|
|
if ix == expected_pieces:
|
|
break
|
|
if expected_pieces != -1 and ix != expected_pieces:
|
|
raise WrongLength("Iterator len() was wrong. Expected %d pieces: got %d" % (expected_pieces, ix) )
|
|
except AttributeError, ax:
|
|
if str(ax) == "__getitem__":
|
|
raise ReturnNotIterable("Application returned object that was not an iterable: %s" % str(type(app_return)))
|
|
else:
|
|
raise ax
|
|
except TypeError, tx:
|
|
raise ReturnNotIterable("Application returned object that was not an iterable: %s" % str(type(app_return)))
|
|
except ModjyException, mx:
|
|
raise mx
|
|
except Exception, x:
|
|
raise ApplicationException(x)
|
|
finally:
|
|
if hasattr(app_return, 'close') and callable(app_return.close):
|
|
app_return.close()
|
|
|
|
def init_impl(self):
|
|
self.do_j_env_params()
|
|
|
|
def add_packages(self, package_list):
|
|
packages = [p.strip() for p in package_list.split(';')]
|
|
for p in packages:
|
|
self.log.info("Adding java package %s to jython" % p)
|
|
sys.add_package(p)
|
|
|
|
def add_classdirs(self, classdir_list):
|
|
classdirs = [cd.strip() for cd in classdir_list.split(';')]
|
|
for cd in classdirs:
|
|
self.log.info("Adding directory %s to jython class file search path" % cd)
|
|
sys.add_classdir(cd)
|
|
|
|
def add_extdirs(self, extdir_list):
|
|
extdirs = [ed.strip() for ed in extdir_list.split(';')]
|
|
for ed in extdirs:
|
|
self.log.info("Adding directory %s for .jars and .zips search path" % ed)
|
|
sys.add_extdir(self.expand_relative_path(ed))
|
|
|
|
def do_j_env_params(self):
|
|
if self.params['packages']:
|
|
self.add_packages(self.params['packages'])
|
|
if self.params['classdirs']:
|
|
self.add_classdirs(self.params['classdirs'])
|
|
if self.params['extdirs']:
|
|
self.add_extdirs(self.params['extdirs'])
|