Issues (227)

awips/gfe/IFPClient.py (1 issue)

1
#
2
# Provides a Python-based interface for executing GFE requests.
3
#
4
#
5
#     SOFTWARE HISTORY
6
#
7
#    Date            Ticket#       Engineer       Description
8
#    ------------    ----------    -----------    --------------------------
9
#    07/26/12                      dgilling       Initial Creation.
10
#
11
#
12
13
from awips import ThriftClient
14
from dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.gfe.db.objects import DatabaseID
15
from dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.gfe.db.objects import ParmID
16
from dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.gfe.request import CommitGridsRequest
17
from dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.gfe.request import GetGridInventoryRequest
18
from dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.gfe.request import GetParmListRequest
19
from dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.gfe.request import GetSelectTimeRangeRequest
20
from dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.gfe.server.request import CommitGridRequest
21
from dynamicserialize.dstypes.com.raytheon.uf.common.message import WsId
22
from dynamicserialize.dstypes.com.raytheon.uf.common.site.requests import GetActiveSitesRequest
23
from dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.gfe.server.message import ServerResponse
24
25
26 View Code Duplication
class IFPClient(object):
0 ignored issues
show
This code seems to be duplicated in your project.
Loading history...
27
    def __init__(self, host, port, user, site=None, progName=None):
28
        self.__thrift = ThriftClient.ThriftClient(host, port)
29
        self.__wsId = WsId(userName=user, progName=progName)
30
        # retrieve default site
31
        if site is None:
32
            sr = self.getSiteID()
33
            if len(sr.getPayload()) > 0:
34
                site = sr.getPayload()[0]
35
        self.__siteId = site
36
37
    def commitGrid(self, request):
38
        if isinstance(request, CommitGridRequest):
39
            return self.__commitGrid([request])
40
        elif self.__isHomogenousIterable(request, CommitGridRequest):
41
            return self.__commitGrid([cgr for cgr in request])
42
        raise TypeError("Invalid type: " + str(type(request)) +
43
                        " for commitGrid(). Only accepts CommitGridRequest or lists of CommitGridRequest.")
44
45
    def __commitGrid(self, requests):
46
        ssr = ServerResponse()
47
        request = CommitGridsRequest()
48
        request.setCommits(requests)
49
        sr = self.__makeRequest(request)
50
        ssr.setMessages(sr.getMessages())
51
        return ssr
52
53
    def getParmList(self, pid):
54
        argType = type(pid)
55
        if argType is DatabaseID:
56
            return self.__getParmList([pid])
57
        elif self.__isHomogenousIterable(pid, DatabaseID):
58
            return self.__getParmList([dbid for dbid in pid])
59
        raise TypeError("Invalid type: " + str(argType) +
60
                        " for getParmList(). Only accepts DatabaseID or lists of DatabaseID.")
61
62
    def __getParmList(self, ids):
63
        ssr = ServerResponse()
64
        request = GetParmListRequest()
65
        request.setDbIds(ids)
66
        sr = self.__makeRequest(request)
67
        ssr.setMessages(sr.getMessages())
68
        parmlist = sr.getPayload() if sr.getPayload() is not None else []
69
        ssr.setPayload(parmlist)
70
        return ssr
71
72
    def __isHomogenousIterable(self, iterable, classType):
73
        try:
74
            iterator = iter(iterable)
75
            for item in iterator:
76
                if not isinstance(item, classType):
77
                    return False
78
        except TypeError:
79
            return False
80
        return True
81
82
    def getGridInventory(self, parmID):
83
        if isinstance(parmID, ParmID):
84
            sr = self.__getGridInventory([parmID])
85
            inventoryList = []
86
            try:
87
                inventoryList = sr.getPayload()[parmID]
88
            except KeyError:
89
                # no-op, we've already default the TimeRange list to empty
90
                pass
91
            sr.setPayload(inventoryList)
92
            return sr
93
        elif self.__isHomogenousIterable(parmID, ParmID):
94
            return self.__getGridInventory([pid for pid in parmID])
95
        raise TypeError("Invalid type: " + str(type(parmID)) +
96
                        " specified to getGridInventory(). Accepts ParmID or lists of ParmID.")
97
98
    def __getGridInventory(self, parmIDs):
99
        ssr = ServerResponse()
100
        request = GetGridInventoryRequest()
101
        request.setParmIds(parmIDs)
102
        sr = self.__makeRequest(request)
103
        ssr.setMessages(sr.getMessages())
104
        trs = sr.getPayload() if sr.getPayload() is not None else {}
105
        ssr.setPayload(trs)
106
        return ssr
107
108
    def getSelectTR(self, name):
109
        request = GetSelectTimeRangeRequest()
110
        request.setName(name)
111
        sr = self.__makeRequest(request)
112
        ssr = ServerResponse()
113
        ssr.setMessages(sr.getMessages())
114
        ssr.setPayload(sr.getPayload())
115
        return ssr
116
117
    def getSiteID(self):
118
        ssr = ServerResponse()
119
        request = GetActiveSitesRequest()
120
        sr = self.__makeRequest(request)
121
        ssr.setMessages(sr.getMessages())
122
        ids = sr.getPayload() if sr.getPayload() is not None else []
123
        sr.setPayload(ids)
124
        return sr
125
126
    def __makeRequest(self, request):
127
        try:
128
            request.setSiteID(self.__siteId)
129
        except AttributeError:
130
            pass
131
        try:
132
            request.setWorkstationID(self.__wsId)
133
        except AttributeError:
134
            pass
135
136
        sr = ServerResponse()
137
        response = None
138
        try:
139
            response = self.__thrift.sendRequest(request)
140
        except ThriftClient.ThriftRequestException as e:
141
            sr.setMessages([str(e)])
142
        try:
143
            sr.setPayload(response.getPayload())
144
        except AttributeError:
145
            sr.setPayload(response)
146
        try:
147
            sr.setMessages(response.getMessages())
148
        except AttributeError:
149
            # not a server response, nothing else to do
150
            pass
151
152
        return sr
153