summaryrefslogtreecommitdiff
path: root/java/src/IceInternal/IncomingBase.java
blob: d90363c92a9db648deb88f8ebed17d54d4b89626 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// **********************************************************************
//
// Copyright (c) 2003
// ZeroC, Inc.
// Billerica, MA, USA
//
// All Rights Reserved.
//
// Ice is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License version 2 as published by
// the Free Software Foundation.
//
// **********************************************************************

package IceInternal;

public class IncomingBase
{
    protected
    IncomingBase(Instance instance, Connection connection, Ice.ObjectAdapter adapter, boolean response)
    {
        _current = new Ice.Current();
        _current.id = new Ice.Identity();
        _current.adapter = adapter;
        _cookie = new Ice.LocalObjectHolder();
	_connection = connection;
	_response = response;
        _is = new BasicStream(instance);
        _os = new BasicStream(instance);
    }

    protected
    IncomingBase(IncomingBase in) // Adopts the argument. It must not be used afterwards.
    {
	_current = in._current;
	_servant = in._servant;
	_locator = in._locator;
	_cookie = in._cookie;
	_connection = in._connection;
	_response = in._response;
	_is = in._is;
	in._is = null;
	_os = in._os;
	in._os = null;
    }

    //
    // Reclaim resources.
    //
    final public void
    __destroy()
    {
	if(_is != null)
	{
	    _is.destroy();
	    _is = null;
	}
	if(_os != null)
	{
	    _os.destroy();
	    _os = null;
	}
    }

    final protected void
    __finishInvoke()
    {
	if(_locator != null && _servant != null)
	{
	    _locator.finished(_current, _servant, _cookie.value);
	}
	
	_is.endReadEncaps();
	
	//
	// Send a response if necessary. If we don't need to send a
	// response, we still need to tell the connection that we're
	// finished with dispatching.
	//
	if(_response)
	{
	    _connection.sendResponse(_os);
	}
	else
	{
	    _connection.sendNoResponse();
	}
    }

    final protected void
    __warning(Exception ex)
    {
	if(_os.instance().properties().getPropertyAsIntWithDefault("Ice.Warn.Dispatch", 1) > 0)
	{
	    java.io.StringWriter sw = new java.io.StringWriter();
	    java.io.PrintWriter pw = new java.io.PrintWriter(sw);
	    IceUtil.OutputBase out = new IceUtil.OutputBase(pw);
	    out.setUseTab(false);
	    out.print("dispatch exception:");
	    out.print("\nidentity: " + Ice.Util.identityToString(_current.id));
	    out.print("\nfacet: ");
	    IceInternal.ValueWriter.write(_current.facet, out);
	    out.print("\noperation: " + _current.operation);
	    out.print("\n");
	    ex.printStackTrace(pw);
	    pw.flush();
	    _os.instance().logger().warning(sw.toString());
	}
    }

    protected Ice.Current _current;
    protected Ice.Object _servant;
    protected Ice.ServantLocator _locator;
    protected Ice.LocalObjectHolder _cookie;

    protected Connection _connection;

    protected boolean _response;

    protected BasicStream _is;
    protected BasicStream _os;
};