src.com.ibm.as400.access.AS400NoThreadServer Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jt400 Show documentation
Show all versions of jt400 Show documentation
The Open Source version of the IBM Toolbox for Java
///////////////////////////////////////////////////////////////////////////////
//
// JTOpen (IBM Toolbox for Java - OSS version)
//
// Filename: AS400NoThreadServer.java
//
// The source code contained herein is licensed under the IBM Public License
// Version 1.0, which has been approved by the Open Source Initiative.
// Copyright (C) 1997-2001 International Business Machines Corporation and
// others. All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////
package com.ibm.as400.access;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;
import java.util.Hashtable;
import java.util.Vector;
class AS400NoThreadServer extends AS400Server
{
static final String copyright = "Copyright (C) 1997-2001 International Business Machines Corporation and others.";
private AS400ImplRemote system_;
private int service_;
private String jobString_;
private SocketContainer socket_;
private InputStream inStream_;
private OutputStream outStream_;
private Hashtable replyStreams_;
private Hashtable instanceReplyStreams_ = new Hashtable();
private DataStream exchangeAttrReply_ = null;
private Vector replyList_ = new Vector(5);
private Vector discardList_ = new Vector();
private int lastCorrelationId_ = 0;
private class CorrelationIdLock extends Object {} //@C7A
private CorrelationIdLock correlationIdLock_ = new CorrelationIdLock(); //@C7C
private boolean closed_ = false;
AS400NoThreadServer(AS400ImplRemote system, int service, SocketContainer socket, String jobString) throws IOException
{
system_ = system;
service_ = service;
jobString_ = jobString;
socket_ = socket;
connectionID_ = socket_.hashCode();
inStream_ = socket.getInputStream();
outStream_ = socket.getOutputStream();
replyStreams_ = AS400Server.replyStreamsHashTables[service];
}
int getService()
{
return service_;
}
String getJobString()
{
return jobString_;
}
void setJobString(String jobString)
{
jobString_ = jobString;
}
boolean isConnected()
{
return closed_ == false;
}
public DataStream getExchangeAttrReply()
{
return exchangeAttrReply_;
}
public synchronized DataStream sendExchangeAttrRequest(DataStream req) throws IOException
{
if (exchangeAttrReply_ == null)
{
exchangeAttrReply_ = sendAndReceive(req);
}
return exchangeAttrReply_;
}
void addInstanceReplyStream(DataStream replyStream)
{
instanceReplyStreams_.put(replyStream, replyStream);
}
void clearInstanceReplyStreams()
{
instanceReplyStreams_.clear();
}
public DataStream sendAndReceive(DataStream requestStream) throws IOException
{
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "send and receive(): ..."); //@pdc
int correlationID = send(requestStream);
return receive(correlationID);
}
void sendAndDiscardReply(DataStream requestStream) throws IOException
{
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "send and discard(): ..."); //@pdc
int correlationID = send(requestStream);
discardList_.addElement(new Integer(correlationID));
}
//@M8a
final void sendAndDiscardReply(DataStream requestStream,int correlationID) throws IOException
{
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "send and discard(): ...");
send(requestStream,correlationID);
discardList_.addElement(new Integer(correlationID));
}
int send(DataStream requestStream) throws IOException
{
if (Trace.traceOn_) {
Trace.log(Trace.DIAGNOSTIC, "send(): send request..."); //@pdc
requestStream.setConnectionID(connectionID_);
}
int correlationID = newCorrelationId();
requestStream.setCorrelation(correlationID);
requestStream.write(outStream_);
return correlationID;
}
int newCorrelationId()
{
synchronized (correlationIdLock_)
{
if (++lastCorrelationId_ == 0) lastCorrelationId_ = 1; //@P0C
return lastCorrelationId_; //@P0C
}
}
void send(DataStream requestStream, int correlationId) throws IOException
{
if (Trace.traceOn_) {
Trace.log(Trace.DIAGNOSTIC, "send(): send request..."); //@pdc
requestStream.setConnectionID(connectionID_);
}
requestStream.setCorrelation(correlationId);
requestStream.write(outStream_);
}
synchronized DataStream receive(int correlationId) throws IOException
{
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "AS400Server receive"); //@pdc
DataStream reply = null;
do
{
synchronized (replyList_)
{
if (!replyList_.isEmpty())
{
for (int i = 0; i < replyList_.size(); i++)
{
DataStream nextReply = (DataStream)replyList_.elementAt(i);
if (nextReply.getCorrelation() == correlationId)
{
replyList_.removeElementAt(i);
reply = nextReply;
break;
}
}
}
}
if (reply == null)
{
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "run(): wait for reply..."); //@pdc
DataStream ds = null;
if (service_ != AS400.RECORDACCESS)
{
ds = ClientAccessDataStream.construct(inStream_, instanceReplyStreams_, replyStreams_, system_, connectionID_);
}
else
{
ds = DDMDataStream.construct(inStream_, replyStreams_, system_, connectionID_);
}
if (Trace.isTraceOn()) {
Trace.log(Trace.DIAGNOSTIC, "run(): reply received..." + ds.toString());
}
boolean keepDataStream = true;
int correlation = ds.getCorrelation();
for (int i = 0; i < discardList_.size(); i++)
{
if (((Integer)discardList_.elementAt(i)).intValue() == correlation)
{
discardList_.removeElementAt(i);
keepDataStream = false;
break;
}
}
if (keepDataStream)
{
if (Trace.isTraceOn()) Trace.log(Trace.DIAGNOSTIC, "adding reply...", correlation);
replyList_.addElement(ds); // Save off the reply.
}
}
else
{
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "received(): valid reply received...", correlationId); //@pdc
}
}
while (reply == null);
return reply;
}
void forceDisconnect()
{
closed_ = true;
if (service_ == AS400.DATABASE || service_ == AS400.COMMAND || service_ == AS400.CENTRAL)
{
AS400EndJobDS endjob = new AS400EndJobDS(AS400Server.getServerId(service_));
try
{
endjob.write(outStream_);
}
catch(IOException e)
{
Trace.log(Trace.ERROR, "Send end job data stream failed.", e);
}
}
try
{
socket_.close();
}
catch (IOException e)
{
Trace.log(Trace.ERROR, "Socket close failed.", e);
}
}
int getSoTimeout() throws SocketException {
return socket_.getSoTimeout();
}
void setSoTimeout(int timeout) throws SocketException {
socket_.setSoTimeout(timeout);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy