summaryrefslogtreecommitdiff
path: root/java/src/IceInternal/Direct.java
blob: 5e43bf36ef374f304b1d942556d555a51128b805 (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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// **********************************************************************
//
// Copyright (c) 2003-2013 ZeroC, Inc. All rights reserved.
//
// This copy of Ice is licensed to you under the terms described in the
// ICE_LICENSE file included in this distribution.
//
// **********************************************************************

package IceInternal;

public abstract class Direct implements Ice.Request
{
    public abstract Ice.DispatchStatus run(Ice.Object target);

    public final boolean isCollocated()
    {
        return true;
    }

    public final Ice.Current getCurrent()
    {
        return _current;
    }


    public
    Direct(Ice.Current current) throws Ice.UserException
    {
        _current = current;

        Ice.ObjectAdapterI adapter = (Ice.ObjectAdapterI)_current.adapter;
        assert(adapter != null);
        
        //
        // Must call incDirectCount() first, because it checks for
        // adapter deactivation, and prevents deactivation completion
        // until decDirectCount() is called. This is important,
        // because getServantManager() may not be called afer
        // deactivation completion.
        //
        adapter.incDirectCount();

        ServantManager servantManager = adapter.getServantManager();
        assert(servantManager != null);

        _servant = servantManager.findServant(_current.id, _current.facet);
        if(_servant == null)
        {
            _locator = servantManager.findServantLocator(_current.id.category);
            if(_locator == null && _current.id.category.length() > 0)
            {
                _locator = servantManager.findServantLocator("");
            }
            if(_locator != null)
            {
                _cookie = new Ice.LocalObjectHolder(); // Lazy creation.
                try
                {
                    _servant = _locator.locate(_current, _cookie);
                }
                catch(Ice.UserException ex)
                {
                    adapter.decDirectCount();
                    throw ex;
                }
                catch(java.lang.RuntimeException ex)
                {
                    adapter.decDirectCount();
                    throw ex;
                }
            }
        }

        if(_servant == null)
        {
            adapter.decDirectCount();
            if(servantManager != null && servantManager.hasServant(_current.id))
            {
                Ice.FacetNotExistException ex = new Ice.FacetNotExistException();
                ex.id = _current.id;
                ex.facet = _current.facet;
                ex.operation = _current.operation;
                throw ex;
            }
            else
            {
                Ice.ObjectNotExistException ex = new Ice.ObjectNotExistException();
                ex.id = _current.id;
                ex.facet = _current.facet;
                ex.operation = _current.operation;
                throw ex;
            }
        }
    }

    public void
    destroy() throws Ice.UserException
    {
        Ice.ObjectAdapterI adapter = (Ice.ObjectAdapterI)_current.adapter;
        assert(adapter != null);
        
        try
        {
            if(_locator != null && _servant != null)
            {
                _locator.finished(_current, _servant, _cookie.value);
            }
        }
        finally
        {
            adapter.decDirectCount();
        }
    }

    public Ice.Object
    getServant()
    {
        return _servant;
    }

    public void
    throwUserException() throws Ice.UserException
    {
        assert _userException != null;
        throw _userException;
    }

    public void 
    setUserException(Ice.UserException ex)
    {
        _userException = ex;
    }

    private final Ice.Current _current;
    private Ice.Object _servant;
    private Ice.UserException _userException;
    private Ice.ServantLocator _locator;
    private Ice.LocalObjectHolder _cookie;
}