Lib.modjy.modjy_input.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
#
###
#
# This code adapted from the socket._fileobject class
#
import jarray
class modjy_input_object(object):
def __init__(self, servlet_inputstream, bufsize=8192):
self.istream = servlet_inputstream
self.buffer_size = bufsize
self.buffer = ""
def istream_read(self, n):
data = jarray.zeros(n, 'b')
m = self.istream.read(data)
if m == -1: # indicates EOF has been reached, so we just return the empty string
return ""
elif m <= 0:
return ""
if m < n:
data = data[:m]
return data.tostring()
def read(self, size=-1):
data = self.buffer
if size < 0:
# Read until EOF
buffers = []
if data:
buffers.append(data)
self.buffer = ""
recv_size = self.buffer_size
while True:
data = self.istream_read(recv_size)
if not data:
break
buffers.append(data)
return "".join(buffers)
else:
# Read until size bytes or EOF seen, whichever comes first
buf_len = len(data)
if buf_len >= size:
self.buffer = data[size:]
return data[:size]
buffers = []
if data:
buffers.append(data)
self.buffer = ""
while True:
left = size - buf_len
recv_size = max(self.buffer_size, left)
data = self.istream_read(recv_size)
if not data:
break
buffers.append(data)
n = len(data)
if n >= left:
self.buffer = data[left:]
buffers[-1] = data[:left]
break
buf_len += n
return "".join(buffers)
def readline(self, size=-1):
data = self.buffer
if size < 0:
# Read until \n or EOF, whichever comes first
nl = data.find('\n')
if nl >= 0:
nl += 1
self.buffer = data[nl:]
return data[:nl]
buffers = []
if data:
buffers.append(data)
self.buffer = ""
while True:
data = self.istream_read(self.buffer_size)
if not data:
break
buffers.append(data)
nl = data.find('\n')
if nl >= 0:
nl += 1
self.buffer = data[nl:]
buffers[-1] = data[:nl]
break
return "".join(buffers)
else:
# Read until size bytes or \n or EOF seen, whichever comes first
nl = data.find('\n', 0, size)
if nl >= 0:
nl += 1
self.buffer = data[nl:]
return data[:nl]
buf_len = len(data)
if buf_len >= size:
self.buffer = data[size:]
return data[:size]
buffers = []
if data:
buffers.append(data)
self.buffer = ""
while True:
data = self.istream_read(self.buffer_size)
if not data:
break
buffers.append(data)
left = size - buf_len
nl = data.find('\n', 0, left)
if nl >= 0:
nl += 1
self.buffer = data[nl:]
buffers[-1] = data[:nl]
break
n = len(data)
if n >= left:
self.buffer = data[left:]
buffers[-1] = data[:left]
break
buf_len += n
return "".join(buffers)
def readlines(self, sizehint=0):
total = 0
list = []
while True:
line = self.readline()
if not line:
break
list.append(line)
total += len(line)
if sizehint and total >= sizehint:
break
return list
# Iterator protocols
def __iter__(self):
return self
def next(self):
line = self.readline()
if not line:
raise StopIteration
return line