Lib.modjy.modjy_impl.py Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jython Show documentation
Show all versions of jython Show documentation
Jython is an implementation of the high-level, dynamic, object-oriented
language Python written in 100% Pure Java, and seamlessly integrated with
the Java platform. It thus allows you to run Python on any Java platform.
###
#
# 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'])