├── .gitignore
├── CONTRIBUTING.md
├── README.md
├── license.txt
├── pom.xml
├── twitter-adapter
├── pom.xml
└── src
│ └── main
│ ├── java
│ └── com
│ │ └── esri
│ │ └── geoevent
│ │ └── adapter
│ │ └── twitter
│ │ ├── Tweet.java
│ │ ├── TweetStatusAdapter.java
│ │ └── TweetStatusAdapterService.java
│ └── resources
│ ├── OSGI-INF
│ └── blueprint
│ │ └── config.xml
│ ├── com
│ └── esri
│ │ └── geoevent
│ │ └── adapter
│ │ ├── twitter-adapter.properties
│ │ ├── twitter-adapter_ar.properties
│ │ ├── twitter-adapter_it.properties
│ │ ├── twitter-adapter_ja.properties
│ │ ├── twitter-adapter_pt_BR.properties
│ │ ├── twitter-adapter_ru.properties
│ │ ├── twitter-adapter_tr.properties
│ │ └── twitter-adapter_zh_CN.properties
│ ├── input-connector-definition.xml
│ ├── output-connector-definition.xml
│ └── tweetstatus-adapter-definition.xml
├── twitter-for-geoevent.png
└── twitter-transport
├── lib
├── http-transport-10.2.0.jar
├── http-transport-10.3.0.jar
├── http-transport-10.4.0.jar
├── http-transport-10.5.0.jar
└── http-transport-10.6.0.jar
├── pom.xml
└── src
└── main
├── java
└── com
│ └── esri
│ └── geoevent
│ └── transport
│ └── twitter
│ ├── OAuth.java
│ ├── TwitterInboundTransport.java
│ ├── TwitterInboundTransportService.java
│ ├── TwitterOutboundTransport.java
│ └── TwitterOutboundTransportService.java
└── resources
├── OSGI-INF
└── blueprint
│ └── config.xml
├── com
└── esri
│ └── geoevent
│ └── transport
│ ├── twitter-transport.properties
│ ├── twitter-transport_ar.properties
│ ├── twitter-transport_it.properties
│ ├── twitter-transport_ja.properties
│ ├── twitter-transport_pt_BR.properties
│ ├── twitter-transport_ru.properties
│ ├── twitter-transport_tr.properties
│ └── twitter-transport_zh_CN.properties
├── twitter-inboundtransport-definition.xml
└── twitter-outboundtransport-definition.xml
/.gitignore:
--------------------------------------------------------------------------------
1 | #################
2 | ## Eclipse
3 | #################
4 |
5 | *.pydevproject
6 | .project
7 | .metadata
8 | bin/
9 | tmp/
10 | *.tmp
11 | *.bak
12 | *.swp
13 | *~.nib
14 | local.properties
15 | .classpath
16 | .settings/
17 | .loadpath
18 | target
19 |
20 | # External tool builders
21 | .externalToolBuilders/
22 |
23 | # Locally stored "Eclipse launch configurations"
24 | *.launch
25 |
26 | # CDT-specific
27 | .cproject
28 |
29 | # PDT-specific
30 | .buildpath
31 |
32 |
33 | #################
34 | ## Visual Studio
35 | #################
36 |
37 | ## Ignore Visual Studio temporary files, build results, and
38 | ## files generated by popular Visual Studio add-ons.
39 |
40 | # User-specific files
41 | *.suo
42 | *.user
43 | *.sln.docstates
44 |
45 | # Build results
46 |
47 | [Dd]ebug/
48 | [Rr]elease/
49 | x64/
50 | build/
51 | [Bb]in/
52 | [Oo]bj/
53 |
54 | # MSTest test Results
55 | [Tt]est[Rr]esult*/
56 | [Bb]uild[Ll]og.*
57 |
58 | *_i.c
59 | *_p.c
60 | *.ilk
61 | *.meta
62 | *.obj
63 | *.pch
64 | *.pdb
65 | *.pgc
66 | *.pgd
67 | *.rsp
68 | *.sbr
69 | *.tlb
70 | *.tli
71 | *.tlh
72 | *.tmp
73 | *.tmp_proj
74 | *.log
75 | *.vspscc
76 | *.vssscc
77 | .builds
78 | *.pidb
79 | *.log
80 | *.scc
81 |
82 | # Visual C++ cache files
83 | ipch/
84 | *.aps
85 | *.ncb
86 | *.opensdf
87 | *.sdf
88 | *.cachefile
89 |
90 | # Visual Studio profiler
91 | *.psess
92 | *.vsp
93 | *.vspx
94 |
95 | # Guidance Automation Toolkit
96 | *.gpState
97 |
98 | # ReSharper is a .NET coding add-in
99 | _ReSharper*/
100 | *.[Rr]e[Ss]harper
101 |
102 | # TeamCity is a build add-in
103 | _TeamCity*
104 |
105 | # DotCover is a Code Coverage Tool
106 | *.dotCover
107 |
108 | # NCrunch
109 | *.ncrunch*
110 | .*crunch*.local.xml
111 |
112 | # Installshield output folder
113 | [Ee]xpress/
114 |
115 | # DocProject is a documentation generator add-in
116 | DocProject/buildhelp/
117 | DocProject/Help/*.HxT
118 | DocProject/Help/*.HxC
119 | DocProject/Help/*.hhc
120 | DocProject/Help/*.hhk
121 | DocProject/Help/*.hhp
122 | DocProject/Help/Html2
123 | DocProject/Help/html
124 |
125 | # Click-Once directory
126 | publish/
127 |
128 | # Publish Web Output
129 | *.Publish.xml
130 | *.pubxml
131 |
132 | # NuGet Packages Directory
133 | ## TODO: If you have NuGet Package Restore enabled, uncomment the next line
134 | #packages/
135 |
136 | # Windows Azure Build Output
137 | csx
138 | *.build.csdef
139 |
140 | # Windows Store app package directory
141 | AppPackages/
142 |
143 | # Others
144 | sql/
145 | *.Cache
146 | ClientBin/
147 | [Ss]tyle[Cc]op.*
148 | ~$*
149 | *~
150 | *.dbmdl
151 | *.[Pp]ublish.xml
152 | *.pfx
153 | *.publishsettings
154 |
155 | # RIA/Silverlight projects
156 | Generated_Code/
157 |
158 | # Backup & report files from converting an old project file to a newer
159 | # Visual Studio version. Backup files are not needed, because we have git ;-)
160 | _UpgradeReport_Files/
161 | Backup*/
162 | UpgradeLog*.XML
163 | UpgradeLog*.htm
164 |
165 | # SQL Server files
166 | App_Data/*.mdf
167 | App_Data/*.ldf
168 |
169 | #############
170 | ## Windows detritus
171 | #############
172 |
173 | # Windows image file caches
174 | Thumbs.db
175 | ehthumbs.db
176 |
177 | # Folder config file
178 | Desktop.ini
179 |
180 | # Recycle Bin used on file shares
181 | $RECYCLE.BIN/
182 |
183 | # Mac crap
184 | .DS_Store
185 |
186 |
187 | #############
188 | ## Python
189 | #############
190 |
191 | *.py[co]
192 |
193 | # Packages
194 | *.egg
195 | *.egg-info
196 | dist/
197 | build/
198 | eggs/
199 | parts/
200 | var/
201 | sdist/
202 | develop-eggs/
203 | .installed.cfg
204 |
205 | # Installer logs
206 | pip-log.txt
207 |
208 | # Unit test / coverage reports
209 | .coverage
210 | .tox
211 |
212 | #Translations
213 | *.mo
214 |
215 | #Mr Developer
216 | .mr.developer.cfg
217 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | Esri welcomes contributions from anyone and everyone. Please see our [guidelines for contributing](https://github.com/esri/contributing).
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # twitter-for-geoevent
2 |
3 | **The Twitter Connector for GeoEvent Server has been deprecated and will no longer be actively developed due to the release of Twitter API v2. More information on accessing the Twitter API Standard v1.1 can be found [here](https://developer.twitter.com/en/docs/twitter-api/getting-started/about-twitter-api#v2-access-level).**
4 |
5 | ArcGIS GeoEvent Server sample Twitter input and output connectors for receiving and sending tweets.
6 |
7 | 
8 |
9 | ## Features
10 | * Twitter Inbound Adapter
11 | * Twitter Inbound Transport
12 | * Twitter Outbound Transport
13 |
14 | ## Instructions
15 |
16 | Building the source code:
17 |
18 | 1. Make sure Maven and ArcGIS GeoEvent Server SDK are installed on your machine.
19 | 2. Run 'mvn install -Dcontact.address=[YourContactEmailAddress]'
20 |
21 | Installing the built jar files:
22 |
23 | 1. Copy the *.jar files under the 'target' sub-folder(s) into the [ArcGIS-GeoEvent-Server-Install-Directory]/deploy folder.
24 |
25 | ## Requirements
26 |
27 | * ArcGIS GeoEvent Server.
28 | * ArcGIS GeoEvent Server SDK.
29 | * Java JDK 1.8 or greater.
30 | * Maven.
31 |
32 | ## Resources
33 |
34 | * [Download the connector's tutorial](http://www.arcgis.com/home/item.html?id=cf5509c1f3d94364b264be0518423a5b) from the ArcGIS GeoEvent Gallery
35 | * [ArcGIS GeoEvent Server Resources](http://links.esri.com/geoevent)
36 | * [ArcGIS Blog](http://blogs.esri.com/esri/arcgis/)
37 | * [twitter@esri](http://twitter.com/esri)
38 |
39 | ## Issues
40 |
41 | Find a bug or want to request a new feature? Please let us know by submitting an issue.
42 |
43 | ## Contributing
44 |
45 | Esri welcomes contributions from anyone and everyone. Please see our [guidelines for contributing](https://github.com/esri/contributing).
46 |
47 | ## Licensing
48 | Copyright 2013 Esri
49 |
50 | Licensed under the Apache License, Version 2.0 (the "License");
51 | you may not use this file except in compliance with the License.
52 | You may obtain a copy of the License at
53 |
54 | http://www.apache.org/licenses/LICENSE-2.0
55 |
56 | Unless required by applicable law or agreed to in writing, software
57 | distributed under the License is distributed on an "AS IS" BASIS,
58 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
59 | See the License for the specific language governing permissions and
60 | limitations under the License.
61 |
62 | A copy of the license is available in the repository's [license.txt](license.txt?raw=true) file.
63 |
--------------------------------------------------------------------------------
/license.txt:
--------------------------------------------------------------------------------
1 | Apache License - 2.0
2 |
3 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
4 |
5 | 1. Definitions.
6 |
7 | "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
8 |
9 | "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
10 |
11 | "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control
12 | with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management
13 | of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial
14 | ownership of such entity.
15 |
16 | "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
17 |
18 | "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source,
19 | and configuration files.
20 |
21 | "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to
22 | compiled object code, generated documentation, and conversions to other media types.
23 |
24 | "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice
25 | that is included in or attached to the work (an example is provided in the Appendix below).
26 |
27 | "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the
28 | editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes
29 | of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of,
30 | the Work and Derivative Works thereof.
31 |
32 | "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work
33 | or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual
34 | or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of
35 | electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on
36 | electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for
37 | the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing
38 | by the copyright owner as "Not a Contribution."
39 |
40 | "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and
41 | subsequently incorporated within the Work.
42 |
43 | 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual,
44 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display,
45 | publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
46 |
47 | 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide,
48 | non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell,
49 | sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are
50 | necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was
51 | submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work
52 | or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You
53 | under this License for that Work shall terminate as of the date such litigation is filed.
54 |
55 | 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications,
56 | and in Source or Object form, provided that You meet the following conditions:
57 |
58 | 1. You must give any other recipients of the Work or Derivative Works a copy of this License; and
59 |
60 | 2. You must cause any modified files to carry prominent notices stating that You changed the files; and
61 |
62 | 3. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices
63 | from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
64 |
65 | 4. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a
66 | readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the
67 | Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the
68 | Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever
69 | such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License.
70 | You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work,
71 | provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to
72 | Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your
73 | modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with
74 | the conditions stated in this License.
75 |
76 | 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You
77 | to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above,
78 | nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
79 |
80 | 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except
81 | as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
82 |
83 | 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides
84 | its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation,
85 | any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for
86 | determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under
87 | this License.
88 |
89 | 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required
90 | by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages,
91 | including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the
92 | use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or
93 | any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
94 |
95 | 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a
96 | fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting
97 | such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree
98 | to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your
99 | accepting any such warranty or additional liability.
100 |
101 | END OF TERMS AND CONDITIONS
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | com.esri.geoevent.parent
8 | twitter
9 | 10.6.0
10 | pom
11 |
12 | Esri :: GeoEvent :: Twitter
13 | http://www.esri.com
14 |
15 |
16 | geoevent@esri.com
17 | UTF-8
18 | 2.3.6
19 | 4.13.1
20 |
21 |
22 |
23 | twitter-adapter
24 | twitter-transport
25 |
26 |
27 |
28 |
29 | com.esri.geoevent.sdk
30 | geoevent-sdk
31 | ${project.version}
32 | provided
33 |
34 |
35 | junit
36 | junit
37 | ${junit.version}
38 | test
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 | org.apache.felix
47 | maven-bundle-plugin
48 | true
49 | ${maven.bundle.plugin.version}
50 |
51 |
52 | org.apache.maven.plugins
53 | maven-compiler-plugin
54 | 2.5.1
55 |
56 | 1.8
57 | 1.8
58 |
59 |
60 |
61 |
62 |
63 |
64 |
--------------------------------------------------------------------------------
/twitter-adapter/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 4.0.0
4 |
5 | com.esri.geoevent.parent
6 | twitter
7 | 10.6.0
8 |
9 | com.esri.geoevent.adapter
10 | twitter-adapter
11 | Esri :: GeoEvent :: Adapter :: Twitter
12 | bundle
13 |
14 |
15 |
16 | org.apache.felix
17 | maven-bundle-plugin
18 | true
19 |
20 |
21 | ${project.groupId}.${project.artifactId}
22 | ${contact.address}
23 | ${project.version}
24 |
25 | com.esri.geoevent.adapter.twitter
26 |
27 |
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/twitter-adapter/src/main/java/com/esri/geoevent/adapter/twitter/Tweet.java:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 1995-2013 Esri
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 |
16 | For additional information, contact:
17 | Environmental Systems Research Institute, Inc.
18 | Attn: Contracts Dept
19 | 380 New York Street
20 | Redlands, California, USA 92373
21 |
22 | email: contracts@esri.com
23 | */
24 |
25 | package com.esri.geoevent.adapter.twitter;
26 |
27 | import java.util.ArrayList;
28 |
29 | import com.fasterxml.jackson.annotation.JsonAnySetter;
30 | import com.fasterxml.jackson.annotation.JsonSetter;
31 |
32 | public class Tweet
33 | {
34 |
35 | public static class Coordinates
36 | {
37 | private ArrayList _coordinates;
38 | private String _type;
39 |
40 | public ArrayList getCoordinates()
41 | {
42 | return _coordinates;
43 | }
44 |
45 | public String getType()
46 | {
47 | return _type;
48 | }
49 |
50 | public void setCoordinates(ArrayList d)
51 | {
52 | _coordinates = d;
53 | }
54 |
55 | public void setType(String s)
56 | {
57 | _type = s;
58 | }
59 |
60 | @JsonSetter
61 | public void handleUnknown(String key, Object value)
62 | {
63 | // System.out.println("Unknown key found in coordinates: " + key);
64 | }
65 | }
66 |
67 | public static class BoundingBox
68 | {
69 | private ArrayList>> _coordinates;
70 | private String _type;
71 |
72 | public ArrayList>> getCoordinates()
73 | {
74 | return _coordinates;
75 | }
76 |
77 | public void setCoordinates(ArrayList>> _coordinates)
78 | {
79 | this._coordinates = _coordinates;
80 | }
81 |
82 | public String getType()
83 | {
84 | return _type;
85 | }
86 |
87 | public void setType(String _type)
88 | {
89 | this._type = _type;
90 | }
91 |
92 | @JsonSetter
93 | public void handleUnknown(String key, Object value)
94 | {
95 | // System.out.println("Unknown key found in BoundingBox: " + key);
96 | }
97 |
98 | }
99 |
100 | public static class Place
101 | {
102 | private BoundingBox _bounding_box;
103 | private String _country;
104 | private String _country_code;
105 | private String _full_name;
106 | private String _id;
107 | private String _name;
108 | private String _place_type;
109 | private String _url;
110 |
111 | public BoundingBox getBounding_box()
112 | {
113 | return _bounding_box;
114 | }
115 |
116 | public String getCountry()
117 | {
118 | return _country;
119 | }
120 |
121 | public void setBounding_box(BoundingBox _bounding_box)
122 | {
123 | this._bounding_box = _bounding_box;
124 | }
125 |
126 | public void setCountry(String _country)
127 | {
128 | this._country = _country;
129 | }
130 |
131 | public String getCountry_code()
132 | {
133 | return _country_code;
134 | }
135 |
136 | public void setCountry_code(String _country_code)
137 | {
138 | this._country_code = _country_code;
139 | }
140 |
141 | public String getFull_name()
142 | {
143 | return _full_name;
144 | }
145 |
146 | public void setFull_name(String _full_name)
147 | {
148 | this._full_name = _full_name;
149 | }
150 |
151 | public String getId()
152 | {
153 | return _id;
154 | }
155 |
156 | public void setId(String _id)
157 | {
158 | this._id = _id;
159 | }
160 |
161 | public String getName()
162 | {
163 | return _name;
164 | }
165 |
166 | public void setName(String _name)
167 | {
168 | this._name = _name;
169 | }
170 |
171 | public String getPlace_type()
172 | {
173 | return _place_type;
174 | }
175 |
176 | public void setPlace_type(String _place_type)
177 | {
178 | this._place_type = _place_type;
179 | }
180 |
181 | public String getUrl()
182 | {
183 | return _url;
184 | }
185 |
186 | public void setUrl(String _url)
187 | {
188 | this._url = _url;
189 | }
190 |
191 | @JsonAnySetter
192 | public void handleUnknown(String key, Object value)
193 | {
194 | // System.out.println("Unknown key found in Place: " + key);
195 | }
196 | }
197 |
198 | public static class User
199 | {
200 | private String _id_str;
201 | private String _name;
202 | private int _followers_count;
203 | private String _location;
204 | private String _screen_name;
205 |
206 | public int getFollowers_count()
207 | {
208 | return _followers_count;
209 | }
210 |
211 | public void setFollowers_count(int _followers_count)
212 | {
213 | this._followers_count = _followers_count;
214 | }
215 |
216 | public String getLocation()
217 | {
218 | return _location;
219 | }
220 |
221 | public void setLocation(String _location)
222 | {
223 | this._location = _location;
224 | }
225 |
226 | public String getId_str()
227 | {
228 | return _id_str;
229 | }
230 |
231 | public void setId_str(String _id_str)
232 | {
233 | this._id_str = _id_str;
234 | }
235 |
236 | public String getName()
237 | {
238 | return _name;
239 | }
240 |
241 | public void setName(String _name)
242 | {
243 | this._name = _name;
244 | }
245 |
246 | public String getScreen_name()
247 | {
248 | return _screen_name;
249 | }
250 |
251 | public void setScreen_name(String _screen_name)
252 | {
253 | this._screen_name = _screen_name;
254 | }
255 |
256 | @JsonAnySetter
257 | public void handleUnknown(String key, Object value)
258 | {
259 | // System.out.println("Unknown key found in Place: " + key);
260 | }
261 | }
262 |
263 | private Boolean _possibly_sensitive_editable;
264 | private String _text;
265 | private String _created_at;
266 | private Boolean _retweeted;
267 | private Integer _retweet_count;
268 | private Place _place;
269 | private Coordinates _coordinates;
270 | private String _id_str;
271 | private String _in_reply_to_screen_name;
272 | private String _in_reply_to_status_id_str;
273 | private Boolean _favorited;
274 | private Boolean _truncated;
275 | private Boolean _possibly_sensitive;
276 | private String _in_reply_to_user_id_str;
277 | private User _user;
278 |
279 | public User getUser()
280 | {
281 | return _user;
282 | }
283 |
284 | public void setUser(User _user)
285 | {
286 | this._user = _user;
287 | }
288 |
289 | public Boolean getPossibly_sensitive_editable()
290 | {
291 | return _possibly_sensitive_editable;
292 | }
293 |
294 | public void setPossibly_sensitive_editable(Boolean _sensitiveEditable)
295 | {
296 | this._possibly_sensitive_editable = _sensitiveEditable;
297 | }
298 |
299 | public String getText()
300 | {
301 | return _text;
302 | }
303 |
304 | public void setText(String _text)
305 | {
306 | this._text = _text;
307 | }
308 |
309 | public String getCreated_at()
310 | {
311 | return _created_at;
312 | }
313 |
314 | public void setCreated_at(String _createdAt)
315 | {
316 | this._created_at = _createdAt;
317 | }
318 |
319 | public Boolean getRetweeted()
320 | {
321 | return _retweeted;
322 | }
323 |
324 | public void setRetweeted(Boolean _retweeted)
325 | {
326 | this._retweeted = _retweeted;
327 | }
328 |
329 | public Integer getRetweet_count()
330 | {
331 | return _retweet_count;
332 | }
333 |
334 | public void setRetweet_count(Integer _retweetCount)
335 | {
336 | this._retweet_count = _retweetCount;
337 | }
338 |
339 | public Place getPlace()
340 | {
341 | return _place;
342 | }
343 |
344 | public void setPlace(Place _place)
345 | {
346 | this._place = _place;
347 | }
348 |
349 | public Coordinates getCoordinates()
350 | {
351 | return _coordinates;
352 | }
353 |
354 | public void setCoordinates(Coordinates _coordinates)
355 | {
356 | this._coordinates = _coordinates;
357 | }
358 |
359 | public String getId_str()
360 | {
361 | return _id_str;
362 | }
363 |
364 | public void setId_str(String _id_str)
365 | {
366 | this._id_str = _id_str;
367 | }
368 |
369 | public String getIn_reply_to_screen_name()
370 | {
371 | return _in_reply_to_screen_name;
372 | }
373 |
374 | public void setIn_reply_to_screen_name(String _in_reply_to_screen_name)
375 | {
376 | this._in_reply_to_screen_name = _in_reply_to_screen_name;
377 | }
378 |
379 | public String getIn_reply_to_status_id_str()
380 | {
381 | return _in_reply_to_status_id_str;
382 | }
383 |
384 | public void setIn_reply_to_status_id_str(String _in_reply_to_status_id_str)
385 | {
386 | this._in_reply_to_status_id_str = _in_reply_to_status_id_str;
387 | }
388 |
389 | public Boolean getFavorited()
390 | {
391 | return _favorited;
392 | }
393 |
394 | public void setFavorited(Boolean _favorited)
395 | {
396 | this._favorited = _favorited;
397 | }
398 |
399 | public Boolean getTruncated()
400 | {
401 | return _truncated;
402 | }
403 |
404 | public void setTruncated(Boolean _truncated)
405 | {
406 | this._truncated = _truncated;
407 | }
408 |
409 | public Boolean getPossibly_sensitive()
410 | {
411 | return _possibly_sensitive;
412 | }
413 |
414 | public void setPossibly_sensitive(Boolean _possibly_sensitive)
415 | {
416 | this._possibly_sensitive = _possibly_sensitive;
417 | }
418 |
419 | public String getIn_reply_to_user_id_str()
420 | {
421 | return _in_reply_to_user_id_str;
422 | }
423 |
424 | public void setIn_reply_to_user_id_str(String _in_reply_to_user_id_str)
425 | {
426 | this._in_reply_to_user_id_str = _in_reply_to_user_id_str;
427 | }
428 |
429 | @JsonAnySetter
430 | public void handleUnknown(String key, Object value)
431 | {
432 | // System.out.println("Unknown key found in tweet: " + key);
433 | }
434 | }
435 |
--------------------------------------------------------------------------------
/twitter-adapter/src/main/java/com/esri/geoevent/adapter/twitter/TweetStatusAdapter.java:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 1995-2013 Esri
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 |
16 | For additional information, contact:
17 | Environmental Systems Research Institute, Inc.
18 | Attn: Contracts Dept
19 | 380 New York Street
20 | Redlands, California, USA 92373
21 |
22 | email: contracts@esri.com
23 | */
24 |
25 | package com.esri.geoevent.adapter.twitter;
26 |
27 | import java.nio.ByteBuffer;
28 | import java.nio.CharBuffer;
29 | import java.nio.charset.CharacterCodingException;
30 | import java.nio.charset.Charset;
31 | import java.nio.charset.CharsetDecoder;
32 | import java.text.SimpleDateFormat;
33 | import java.util.ArrayList;
34 |
35 | import com.esri.core.geometry.MapGeometry;
36 | import com.esri.core.geometry.Point;
37 | import com.esri.core.geometry.SpatialReference;
38 | import com.esri.geoevent.adapter.twitter.Tweet.BoundingBox;
39 | import com.esri.geoevent.adapter.twitter.Tweet.Coordinates;
40 | import com.esri.geoevent.adapter.twitter.Tweet.Place;
41 | import com.esri.geoevent.adapter.twitter.Tweet.User;
42 | import com.esri.ges.adapter.AdapterDefinition;
43 | import com.esri.ges.adapter.InboundAdapterBase;
44 | import com.esri.ges.core.component.ComponentException;
45 | import com.esri.ges.core.geoevent.FieldGroup;
46 | import com.esri.ges.core.geoevent.GeoEvent;
47 | import com.esri.ges.core.geoevent.GeoEventDefinition;
48 | import com.esri.ges.framework.i18n.BundleLogger;
49 | import com.esri.ges.framework.i18n.BundleLoggerFactory;
50 | import com.esri.ges.messaging.MessagingException;
51 | import com.fasterxml.jackson.databind.ObjectMapper;
52 |
53 | public class TweetStatusAdapter extends InboundAdapterBase
54 | {
55 | private static final BundleLogger LOGGER = BundleLoggerFactory.getLogger(TweetStatusAdapter.class);
56 | private ObjectMapper mapper = new ObjectMapper();
57 | private SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy");
58 | private Charset charset;
59 | private CharsetDecoder decoder;
60 |
61 | public TweetStatusAdapter(AdapterDefinition definition) throws ComponentException
62 | {
63 | super(definition);
64 | LOGGER.debug("CREATED_MSG");
65 | charset = Charset.forName("UTF-8");
66 | decoder = charset.newDecoder();
67 | }
68 |
69 | private class TweetEventBuilder implements Runnable
70 | {
71 | private StringBuilder sb;
72 |
73 | TweetEventBuilder(String text)
74 | {
75 | this.sb = new StringBuilder(text);
76 | }
77 |
78 | private GeoEvent buildGeoEvent() throws Exception
79 | {
80 | // 3 lines below are not necessary I think. These were added when I
81 | // was having problems with encoding
82 | // //byte[] strBytes = sb.toString().getBytes("UTF-8");
83 | // //String s = new String(strBytes,"UTF-8");
84 | // //Tweet jsonTweet = mapper.readValue(s, Tweet.class);
85 |
86 | // atempt to parse string to Tweet
87 | Tweet jsonTweet = mapper.readValue(sb.toString(), Tweet.class);
88 | if (jsonTweet == null)
89 | {
90 | consoleDebugPrintLn(LOGGER.translate("JSON_IS_NULL"));
91 | return null;
92 | }
93 |
94 | // Create an instance of the message using the guid that we
95 | // generated when we started up.
96 | GeoEvent msg;
97 | try
98 | {
99 | AdapterDefinition def = (AdapterDefinition) definition;
100 | GeoEventDefinition geoDef = def.getGeoEventDefinition("TweetStatus");
101 | if (geoEventCreator.getGeoEventDefinitionManager().searchGeoEventDefinition(geoDef.getName(), geoDef.getOwner()) == null)
102 | {
103 | geoEventCreator.getGeoEventDefinitionManager().addGeoEventDefinition(geoDef);
104 | }
105 | msg = geoEventCreator.create(geoDef.getName(), geoDef.getOwner());
106 | LOGGER.debug("NEW_MESSAGE_CREATED");
107 | }
108 | catch (MessagingException e)
109 | {
110 | LOGGER.error("MESSAGE_CREATTION_ERROR1", e.getMessage());
111 | return null;
112 | }
113 | catch (Exception ex)
114 | {
115 | LOGGER.error("MESSAGE_CREATTION_ERROR2", ex.getMessage());
116 | return null;
117 | }
118 |
119 | // Populate the message with all the attribute values.
120 | // first is geometry - get from tweet coordinates or place
121 | double x = Double.NaN;
122 | double y = Double.NaN;
123 | int wkid = 4326;
124 | Coordinates coords = jsonTweet.getCoordinates();
125 | Place place = jsonTweet.getPlace();
126 | User user = jsonTweet.getUser();
127 | if (coords != null)
128 | {
129 | x = coords.getCoordinates().get(0);
130 | y = coords.getCoordinates().get(1);
131 | }
132 | if (place != null)
133 | {
134 | // if still need coordinates0..
135 |
136 | // get bounding box of place and figure center
137 | if (Double.isNaN(x) && Double.isNaN(y))
138 | {
139 | BoundingBox bbox = place.getBounding_box();
140 | if (bbox != null)
141 | {
142 | ArrayList ll = bbox.getCoordinates().get(0).get(0);
143 | ArrayList ur = bbox.getCoordinates().get(0).get(2);
144 | Double xmin = ll.get(0);
145 | Double xmax = ur.get(0);
146 | Double ymin = ll.get(1);
147 | Double ymax = ur.get(1);
148 | x = xmin + ((xmax - xmin) / 2);
149 | y = ymin + ((ymax - ymin) / 2);
150 | }
151 | }
152 | // set attributes in message associated with place
153 | FieldGroup placeGrp = msg.createFieldGroup("place");
154 | placeGrp.setField(0, place.getId());
155 | placeGrp.setField(1, place.getFull_name());
156 | placeGrp.setField(2, place.getUrl());
157 | msg.setField(13, placeGrp);
158 | }
159 |
160 | // set geometry in message if an xy coordinate was found
161 | // and set geolocated attribute to true or false
162 | if (!Double.isNaN(x) && !Double.isNaN(y))
163 | {
164 | Point pt = new Point(x, y);
165 | MapGeometry geom = new MapGeometry(pt, SpatialReference.create(wkid));
166 | msg.setField(5, geom);
167 | msg.setField(15, true);
168 |
169 | LOGGER.debug("TWEET_WITH_LOC_SUCCESS");
170 | }
171 | else
172 | {
173 | msg.setField(15, false);
174 | }
175 |
176 | // set rest of attributes in message
177 | msg.setField(0, jsonTweet.getPossibly_sensitive_editable());
178 | msg.setField(1, jsonTweet.getText());
179 | String createdAt = jsonTweet.getCreated_at();
180 | try
181 | {
182 | if (createdAt != null)
183 | msg.setField(2, sdf.parse(jsonTweet.getCreated_at()));
184 | }
185 | catch (Exception e)
186 | {
187 | LOGGER.error("DATE_EXCEPTION_ERROR", jsonTweet.getCreated_at(), e.getMessage());
188 | LOGGER.info(e.getMessage(), e);
189 | }
190 | msg.setField(3, jsonTweet.getRetweeted());
191 | msg.setField(4, jsonTweet.getRetweet_count());
192 | msg.setField(6, jsonTweet.getId_str());
193 | msg.setField(7, jsonTweet.getIn_reply_to_screen_name());
194 | msg.setField(8, jsonTweet.getIn_reply_to_status_id_str());
195 | msg.setField(9, jsonTweet.getFavorited());
196 | msg.setField(10, jsonTweet.getTruncated());
197 | msg.setField(11, jsonTweet.getPossibly_sensitive());
198 | msg.setField(12, jsonTweet.getIn_reply_to_user_id_str());
199 | if (user != null)
200 | {
201 | FieldGroup userGrp = msg.createFieldGroup("user");
202 | userGrp.setField(0, user.getId_str());
203 | userGrp.setField(1, user.getName());
204 | userGrp.setField(2, user.getFollowers_count());
205 | userGrp.setField(3, user.getLocation());
206 | userGrp.setField(4, user.getScreen_name());
207 | msg.setField(14, userGrp);
208 | }
209 | return msg;
210 | }
211 |
212 | @Override
213 | public void run()
214 | {
215 | try
216 | {
217 | GeoEvent event = buildGeoEvent();
218 | if (event != null)
219 | {
220 | geoEventListener.receive(event);
221 | }
222 | }
223 | catch (Throwable t)
224 | {
225 | LOGGER.error("UNEXPECTED_ERROR", t.getMessage());
226 | LOGGER.info(t.getMessage(), t);
227 | }
228 | }
229 | }
230 |
231 | @Override
232 | public void receive(ByteBuffer buffer, String channelId)
233 | {
234 | if (!buffer.hasRemaining())
235 | return;
236 |
237 | try
238 | {
239 | CharBuffer charBuffer = decoder.decode(buffer);
240 | String text = charBuffer.toString();
241 | TweetEventBuilder builder = new TweetEventBuilder(text);
242 | Thread thread = new Thread(builder);
243 | // no need to translate thread names
244 | thread.setName("Twitter Event Builder" + System.identityHashCode(buffer));
245 | thread.start();
246 | }
247 | catch (CharacterCodingException e)
248 | {
249 | LOGGER.error("DECODE_ERROR", e.getMessage());
250 | LOGGER.info(e.getMessage(), e);
251 | buffer.clear();
252 | return;
253 | }
254 | }
255 |
256 | @Override
257 | protected GeoEvent adapt(ByteBuffer buffer, String channelId)
258 | {
259 | return null;
260 | }
261 |
262 | public static void consoleDebugPrintLn(String msg)
263 | {
264 | String consoleOut = System.getenv("GEP_CONSOLE_OUTPUT");
265 | if (consoleOut != null && "1".equals(consoleOut))
266 | {
267 | System.out.println(msg);
268 | LOGGER.debug(msg);
269 | }
270 | }
271 | }
272 |
--------------------------------------------------------------------------------
/twitter-adapter/src/main/java/com/esri/geoevent/adapter/twitter/TweetStatusAdapterService.java:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 1995-2013 Esri
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 |
16 | For additional information, contact:
17 | Environmental Systems Research Institute, Inc.
18 | Attn: Contracts Dept
19 | 380 New York Street
20 | Redlands, California, USA 92373
21 |
22 | email: contracts@esri.com
23 | */
24 |
25 | package com.esri.geoevent.adapter.twitter;
26 |
27 | import javax.xml.bind.JAXBException;
28 |
29 | import com.esri.ges.adapter.Adapter;
30 | import com.esri.ges.adapter.AdapterServiceBase;
31 | import com.esri.ges.adapter.util.XmlAdapterDefinition;
32 | import com.esri.ges.core.component.ComponentException;
33 |
34 | public class TweetStatusAdapterService extends AdapterServiceBase
35 | {
36 | public TweetStatusAdapterService()
37 | {
38 | XmlAdapterDefinition xmlAdapterDefinition = new XmlAdapterDefinition(getResourceAsStream("tweetstatus-adapter-definition.xml"));
39 | try
40 | {
41 | xmlAdapterDefinition.loadConnector(getResourceAsStream("input-connector-definition.xml"));
42 | xmlAdapterDefinition.loadConnector(getResourceAsStream("output-connector-definition.xml"));
43 | }
44 | catch (JAXBException e)
45 | {
46 | throw new RuntimeException(e);
47 | }
48 | definition = xmlAdapterDefinition;
49 | }
50 |
51 | @Override
52 | public Adapter createAdapter() throws ComponentException
53 | {
54 | return new TweetStatusAdapter(definition);
55 | }
56 |
57 | }
58 |
--------------------------------------------------------------------------------
/twitter-adapter/src/main/resources/OSGI-INF/blueprint/config.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
11 |
--------------------------------------------------------------------------------
/twitter-adapter/src/main/resources/com/esri/geoevent/adapter/twitter-adapter.properties:
--------------------------------------------------------------------------------
1 | CREATED_MSG=Tweet Status Adapter created
2 | JSON_IS_NULL=jsonTweet is null
3 | NEW_MESSAGE_CREATED=Created new TweetStatusMessage
4 | MESSAGE_CREATTION_ERROR1=Message Creation error in TweetStatusAdapter: {0}
5 | MESSAGE_CREATTION_ERROR2=Error creating initial tweet message: {0}
6 | TWEET_WITH_LOC_SUCCESS=Generated tweet with location
7 | DATE_EXCEPTION_ERROR=Parse date exception in TweetStatusAdapter ({0}): {1}
8 | UNEXPECTED_ERROR=Unexpected error
9 | EVENT_BUILDER_NAME=Twitter Event Builder {0}
10 | DECODE_ERROR=Could not decode the incoming buffer. Error: {0}.
11 |
12 | #XML PROPERTIES
13 | ADAPTER_LABEL=Twitter Inbound Adapter
14 | ADAPTER_DESC=This adapter is capable of receiving/parsing Twitter data in the JSON format.
15 |
16 | INPUT_CONNNECTOR_LABEL=Receive Tweets
17 | INPUT_CONNNECTOR_DESC=Receive tweets from twitter profiles or based on term(s) of interest using the public Twitter API.
18 | INPUT_CONNNECTOR_CONSUMER_KEY_LBL=Consumer Key
19 | INPUT_CONNNECTOR_CONSUMER_SECRET_LBL=Consumer Secret
20 | INPUT_CONNNECTOR_ACCESS_TOKEN_LBL=Access Token
21 | INPUT_CONNNECTOR_ACCESS_TOKEN_SECRET_LBL=Access Token Secret
22 | INPUT_CONNNECTOR_FOLLOW_LBL=Follow
23 | INPUT_CONNNECTOR_TRACK_LBL=Track
24 | INPUT_CONNNECTOR_LOCATIONS_LBL=Locations
25 | INPUT_CONNNECTOR_COUNT_LBL=Count
26 | INPUT_CONNNECTOR_MODE_LBL=Mode
27 | INPUT_CONNNECTOR_USE_LONG_POLLING_LBL=Use Long Polling
28 | INPUT_CONNNECTOR_HONOR_LAST_MOD_LBL=Receive New Data Only
29 | INPUT_CONNNECTOR_FREQUENCY_LBL=Frequency (in seconds)
30 | INPUT_CONNNECTOR_POST_BODY_TYPE_LBL=Post body MIME Type
31 | INPUT_CONNNECTOR_MIME_TYPE_CLIENT_LBL=Acceptable MIME Types (Client Mode)
32 | INPUT_CONNNECTOR_HTTP_METHOD_LBL=HTTP Method
33 | INPUT_CONNNECTOR_CLIENT_POST_BODY_LBL=Content Body
34 | INPUT_CONNNECTOR_CLIENT_PARAMS_LBL=Parameters
35 | INPUT_CONNNECTOR_CLIENT_PROXY_URL_LBL=URL Proxy
36 | INPUT_CONNNECTOR_USE_CLIENT_PROXY_LBL=Use URL Proxy
37 | INPUT_CONNNECTOR_MIME_TYPE_SERVER_LBL=Acceptable MIME Types (Server Mode)
38 | INPUT_CONNNECTOR_CLIENT_URL_LBL=URL
39 |
40 | OUTPUT_CONNNECTOR_LABEL=Send Tweet
41 | OUTPUT_CONNNECTOR_DESC=Send a tweet to Twitter using the public Twitter API.
42 | OUTPUT_CONNNECTOR_CONSUMER_KEY_LBL=Consumer Key
43 | OUTPUT_CONNNECTOR_CONSUMER_SECRET_LBL=Consumer Secret
44 | OUTPUT_CONNNECTOR_ACCESS_TOKEN_LBL=Access Token
45 | OUTPUT_CONNNECTOR_ACCESS_TOKEN_SECRET_LBL=Access Token Secret
46 | OUTPUT_CONNNECTOR_MESSAGE_LBL=Message
47 | OUTPUT_CONNNECTOR_CLIENT_URL_LBL=URL
48 | OUTPUT_CONNNECTOR_USE_CLIENT_PROXY_LBL=Use URL Proxy
49 | OUTPUT_CONNNECTOR_CLIENT_PROXY_URL_LBL=URL Proxy
50 | OUTPUT_CONNNECTOR_CLIENT_PARAMS_LBL=Parameters
51 | OUTPUT_CONNNECTOR_HTTP_METHOD_LBL=HTTP Method
52 | OUTPUT_CONNNECTOR_MIME_TYPE_CLIENT_LBL=Acceptable MIME Types (Client Mode)
53 | OUTPUT_CONNNECTOR_POST_BODY_TYPE_LBL=Post body MIME Type
--------------------------------------------------------------------------------
/twitter-adapter/src/main/resources/com/esri/geoevent/adapter/twitter-adapter_ar.properties:
--------------------------------------------------------------------------------
1 | CREATED_MSG = \u062A\u0648\u064A\u062A \u0645\u062D\u0648\u0644 \u0627\u0644\u062D\u0627\u0644\u0629 \u0627\u0644\u062A\u064A \u062A\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627
2 | JSON_IS_NULL = jsonTweet \u0628\u0627\u0637\u0644
3 | NEW_MESSAGE_CREATED = \u0645\u0643\u0648\u0646 TweetStatusMessage \u062C\u062F\u064A\u062F\u0629
4 | MESSAGE_CREATTION_ERROR1 = \u062E\u0637\u0623 \u0625\u0646\u0634\u0627\u0621 \u0631\u0633\u0627\u0644\u0629 \u0641\u064A TweetStatusAdapter : {0}
5 | MESSAGE_CREATTION_ERROR2 = \u062E\u0637\u0623 \u0641\u064A \u0625\u0646\u0634\u0627\u0621 \u0631\u0633\u0627\u0644\u0629 \u0633\u0642\u0633\u0642\u0629 \u0627\u0644\u0623\u0648\u0644\u064A : {0}
6 | TWEET_WITH_LOC_SUCCESS = \u0633\u0642\u0633\u0642\u0629 \u0645\u0646\u0634\u0623 \u0645\u0639 \u0645\u0648\u0642\u0639
7 | DATE_EXCEPTION_ERROR = \u062A\u062D\u0644\u064A\u0644 \u062A\u0627\u0631\u064A\u062E \u0627\u0633\u062A\u062B\u0646\u0627\u0621 \u0641\u064A TweetStatusAdapter ({0}) : {1}
8 | UNEXPECTED_ERROR = \u062E\u0637\u0623 \u063A\u064A\u0631 \u0645\u062A\u0648\u0642\u0639
9 | EVENT_BUILDER_NAME = \u062A\u0648\u064A\u062A\u0631 \u062D\u062F\u062B \u0645\u0646\u0634\u0626 {0}
10 | DECODE_ERROR = \u062A\u0639\u0630\u0631 \u0641\u0643 \u0627\u0644\u0645\u062E\u0632\u0646 \u0627\u0644\u0645\u0624\u0642\u062A \u0648\u0627\u0631\u062F\u0629 - {0}
11 |
12 | ADAPTER_LABEL = \u062A\u0648\u064A\u062A\u0631 \u0627\u0644\u0648\u0627\u0631\u062F\u0629 \u0645\u062D\u0648\u0644
13 | ADAPTER_DESC = \u0647\u0630\u0627 \u0627\u0644\u0645\u062D\u0648\u0644 \u0647\u0648 \u0642\u0627\u062F\u0631 \u0639\u0644\u0649 \u0627\u0633\u062A\u0642\u0628\u0627\u0644 / \u062A\u062D\u0644\u064A\u0644 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u062A\u0648\u064A\u062A\u0631 \u0641\u064A \u0634\u0643\u0644 \u062C\u0633\u0648\u0646 .
14 |
15 | INPUT_CONNNECTOR_LABEL = \u0627\u062D\u0635\u0644 \u0639\u0644\u0649 \u062A\u063A\u0631\u064A\u062F\u0627\u062A
16 | INPUT_CONNNECTOR_DESC = \u0627\u062D\u0635\u0644 \u0639\u0644\u0649 \u062A\u0648\u064A\u062A \u0645\u0646 \u0627\u0644\u062A\u0634\u0643\u064A\u0644\u0627\u062A \u062A\u0648\u064A\u062A\u0631 \u0623\u0648 \u0639\u0644\u0649 \u0623\u0633\u0627\u0633 \u0627\u0644\u0645\u062F\u0649 ( \u0642) \u0645\u0646 \u0627\u0644\u0641\u0627\u0626\u062F\u0629 \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 API \u062A\u0648\u064A\u062A\u0631 \u0627\u0644\u0639\u0627\u0645\u0629.
17 | INPUT_CONNNECTOR_CONSUMER_KEY_LBL = \u0645\u0641\u062A\u0627\u062D \u0627\u0644\u0645\u0633\u062A\u0647\u0644\u0643
18 | INPUT_CONNNECTOR_CONSUMER_SECRET_LBL = \u0627\u0644\u0645\u0633\u062A\u0647\u0644\u0643 \u0627\u0644\u0633\u0631\u064A\u0629
19 | INPUT_CONNNECTOR_ACCESS_TOKEN_LBL = \u0631\u0645\u0632 \u0648\u0635\u0648\u0644
20 | INPUT_CONNNECTOR_ACCESS_TOKEN_SECRET_LBL = \u0631\u0645\u0632 \u0648\u0635\u0648\u0644 \u0627\u0644\u0633\u0631\u064A\u0629
21 | INPUT_CONNNECTOR_FOLLOW_LBL = \u0645\u062A\u0627\u0628\u0639\u0629
22 | INPUT_CONNNECTOR_TRACK_LBL = \u0627\u0644\u0645\u0633\u0627\u0631
23 | INPUT_CONNNECTOR_LOCATIONS_LBL = \u0627\u0644\u0645\u0648\u0627\u0642\u0639
24 | INPUT_CONNNECTOR_COUNT_LBL = \u0639\u062F\u062F
25 | INPUT_CONNNECTOR_MODE_LBL = \u0627\u0644\u0648\u0636\u0639
26 | INPUT_CONNNECTOR_USE_LONG_POLLING_LBL = \u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0627\u0644\u0627\u0642\u062A\u0631\u0627\u0639 \u0637\u0648\u064A\u0644
27 | INPUT_CONNNECTOR_HONOR_LAST_MOD_LBL = \u062A\u0644\u0642\u064A \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u062C\u062F\u064A\u062F\u0629 \u0641\u0642\u0637
28 | INPUT_CONNNECTOR_FREQUENCY_LBL = \u0627\u0644\u062A\u0631\u062F\u062F ( \u0641\u064A \u062B\u0648\u0627\u0646\u064A )
29 | INPUT_CONNNECTOR_POST_BODY_TYPE_LBL = \u0646\u0648\u0639 \u0622\u062E\u0631 MIME \u0627\u0644\u062C\u0633\u0645
30 | INPUT_CONNNECTOR_MIME_TYPE_CLIENT_LBL = \u0623\u0646\u0648\u0627\u0639 MIME \u0645\u0642\u0628\u0648\u0644 (\u0648\u0636\u0639 \u0627\u0644\u0639\u0645\u064A\u0644 )
31 | INPUT_CONNNECTOR_HTTP_METHOD_LBL = HTTP \u0627\u0644\u0637\u0631\u064A\u0642\u0629
32 | INPUT_CONNNECTOR_CLIENT_POST_BODY_LBL = \u0627\u0644\u062C\u0633\u0645 \u0627\u0644\u0645\u062D\u062A\u0648\u0649
33 | INPUT_CONNNECTOR_CLIENT_PARAMS_LBL = \u0645\u0639\u0644\u0645\u0627\u062A
34 | INPUT_CONNNECTOR_CLIENT_PROXY_URL_LBL = URL \u0648\u0643\u064A\u0644
35 | INPUT_CONNNECTOR_USE_CLIENT_PROXY_LBL = \u0627\u0633\u062A\u062E\u062F\u0627\u0645 URL \u0648\u0643\u064A\u0644
36 | INPUT_CONNNECTOR_MIME_TYPE_SERVER_LBL = \u0623\u0646\u0648\u0627\u0639 MIME \u0645\u0642\u0628\u0648\u0644 ( \u0648\u0636\u0639 \u0645\u0644\u0642\u0645 )
37 | INPUT_CONNNECTOR_CLIENT_URL_LBL = URL
38 |
39 | OUTPUT_CONNNECTOR_LABEL = \u0625\u0631\u0633\u0627\u0644 \u062A\u0648\u064A\u062A
40 | OUTPUT_CONNNECTOR_DESC = \u0625\u0631\u0633\u0627\u0644 \u0633\u0642\u0633\u0642\u0629 \u0625\u0644\u0649 \u062A\u0648\u064A\u062A\u0631 \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 API \u062A\u0648\u064A\u062A\u0631 \u0627\u0644\u0639\u0627\u0645\u0629.
41 | OUTPUT_CONNNECTOR_CONSUMER_KEY_LBL = \u0645\u0641\u062A\u0627\u062D \u0627\u0644\u0645\u0633\u062A\u0647\u0644\u0643
42 | OUTPUT_CONNNECTOR_CONSUMER_SECRET_LBL = \u0627\u0644\u0645\u0633\u062A\u0647\u0644\u0643 \u0627\u0644\u0633\u0631\u064A\u0629
43 | OUTPUT_CONNNECTOR_ACCESS_TOKEN_LBL = \u0631\u0645\u0632 \u0648\u0635\u0648\u0644
44 | OUTPUT_CONNNECTOR_ACCESS_TOKEN_SECRET_LBL = \u0631\u0645\u0632 \u0648\u0635\u0648\u0644 \u0627\u0644\u0633\u0631\u064A\u0629
45 | OUTPUT_CONNNECTOR_MESSAGE_LBL = \u0631\u0633\u0627\u0644\u0629
46 | OUTPUT_CONNNECTOR_CLIENT_URL_LBL = URL
47 | OUTPUT_CONNNECTOR_USE_CLIENT_PROXY_LBL = \u0627\u0633\u062A\u062E\u062F\u0627\u0645 URL \u0648\u0643\u064A\u0644
48 | OUTPUT_CONNNECTOR_CLIENT_PROXY_URL_LBL = URL \u0648\u0643\u064A\u0644
49 | OUTPUT_CONNNECTOR_CLIENT_PARAMS_LBL = \u0645\u0639\u0644\u0645\u0627\u062A
50 | OUTPUT_CONNNECTOR_HTTP_METHOD_LBL = HTTP \u0627\u0644\u0637\u0631\u064A\u0642\u0629
51 | OUTPUT_CONNNECTOR_MIME_TYPE_CLIENT_LBL = \u0623\u0646\u0648\u0627\u0639 MIME \u0645\u0642\u0628\u0648\u0644 (\u0648\u0636\u0639 \u0627\u0644\u0639\u0645\u064A\u0644 )
52 | OUTPUT_CONNNECTOR_POST_BODY_TYPE_LBL = \u0646\u0648\u0639 \u0622\u062E\u0631 MIME \u0627\u0644\u062C\u0633\u0645
--------------------------------------------------------------------------------
/twitter-adapter/src/main/resources/com/esri/geoevent/adapter/twitter-adapter_it.properties:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Esri/twitter-for-geoevent/cce14886de7ab6f93b4f03eb36011fc4363baa21/twitter-adapter/src/main/resources/com/esri/geoevent/adapter/twitter-adapter_it.properties
--------------------------------------------------------------------------------
/twitter-adapter/src/main/resources/com/esri/geoevent/adapter/twitter-adapter_ja.properties:
--------------------------------------------------------------------------------
1 | CREATED_MSG =\u9E23\u53EB\u72B6\u6001\u9002\u914D\u5668
2 | JSON_IS_NULL = jsonTweet\u4E3A\u7A7A
3 | NEW_MESSAGE_CREATED =\u521B\u5EFA\u65B0TweetStatusMessage
4 | MESSAGE_CREATTION_ERROR1 =\u5728TweetStatusAdapter\u6D88\u606F\u521B\u5EFA\u9519\u8BEF\uFF1A {0}
5 | MESSAGE_CREATTION_ERROR2 =\u9519\u8BEF\u521B\u5EFA\u521D\u59CB\u7684tweet\u6D88\u606F\uFF1A {0}
6 | TWEET_WITH_LOC_SUCCESS =\u751F\u6210\u7684\u6587\u4EF6\u4E0E\u4F4D\u7F6E
7 | DATE_EXCEPTION_ERROR =\u89E3\u6790\u65E5\u671F\u4F8B\u5916TweetStatusAdapter \uFF08 {0} \uFF09 \uFF1A {1}
8 | UNEXPECTED_ERROR =\u610F\u5916\u9519\u8BEF
9 | EVENT_BUILDER_NAME = Twitter\u7684\u4E8B\u4EF6\u751F\u6210\u5668 {0}
10 | DECODE_ERROR =\u65E0\u6CD5\u89E3\u7801\u4F20\u5165\u7684\u7F13\u51B2\u533A - {0}
11 |
12 | ADAPTER_LABEL = Twitter\u7684\u5165\u7AD9\u9002\u914D\u5668
13 | ADAPTER_DESC =\u8BE5\u9002\u914D\u5668\u80FD\u591F\u63A5\u6536/\u9E3\u6790Twitter\u7684\u6570\u636E\u4EE5JSON\u683C\u5F0F\u3002
14 |
15 | INPUT_CONNNECTOR_LABEL =\u63A5\u6536\u9E23\u53EB
16 | INPUT_CONNNECTOR_DESC =\u4ECETwitter\u4E2A\u4EBA\u6863\u6848\u63A5\u6536Twitter\u6216\u4F7F\u7528\u516C\u5171Twitter\u7684API\u57FA\u4E8E\u611F\u5174\u8DA3\u5B57\u8BCD\u3002
17 | INPUT_CONNNECTOR_CONSUMER_KEY_LBL =\u6D88\u8D39\u91CD\u70B9
18 | INPUT_CONNNECTOR_CONSUMER_SECRET_LBL =\u6D88\u8D39\u8005\u63ED\u79D8
19 | INPUT_CONNNECTOR_ACCESS_TOKEN_LBL =\u8BBF\u95EE\u4EE4\u724C
20 | INPUT_CONNNECTOR_ACCESS_TOKEN_SECRET_LBL =\u8BBF\u95EE\u4EE4\u724C\u79D8\u5BC6
21 | INPUT_CONNNECTOR_FOLLOW_LBL =\u8DDF\u968F
22 | INPUT_CONNNECTOR_TRACK_LBL =\u66F2\u76EE
23 | INPUT_CONNNECTOR_LOCATIONS_LBL =\u4F4D\u7F6E
24 | INPUT_CONNNECTOR_COUNT_LBL =\u8BA1\u6570
25 | INPUT_CONNNECTOR_MODE_LBL =\u6A21\u5F0F
26 | INPUT_CONNNECTOR_USE_LONG_POLLING_LBL =\u4F7F\u7528\u957F\u8F6E\u8BE2
27 | INPUT_CONNNECTOR_HONOR_LAST_MOD_LBL =\u63A5\u6536\u65B0\u7684\u6570\u636E\u4EC5
28 | INPUT_CONNNECTOR_FREQUENCY_LBL =\u9891\u7387\uFF08\u5355\u4F4D\u4E3A\u79D2\uFF09
29 | INPUT_CONNNECTOR_POST_BODY_TYPE_LBL =\u8D34\u4F53\u7684MIME\u7C7B\u578B
30 | INPUT_CONNNECTOR_MIME_TYPE_CLIENT_LBL =\u53EF\u63A5\u53D7\u7684MIME\u7C7B\u578B\uFF08\u5BA2\u6237\u7AEF\u6A21\u5F0F\uFF09
31 | INPUT_CONNNECTOR_HTTP_METHOD_LBL = HTTP\u65B9\u6CD5
32 | INPUT_CONNNECTOR_CLIENT_POST_BODY_LBL =\u5185\u5BB9\u4F53
33 | INPUT_CONNNECTOR_CLIENT_PARAMS_LBL =\u53C2\u6570
34 | INPUT_CONNNECTOR_CLIENT_PROXY_URL_LBL =\u7F51\u5740\u4EE3\u7406
35 | INPUT_CONNNECTOR_USE_CLIENT_PROXY_LBL =\u4F7F\u7528\u4EE3\u7406\u670D\u52A1\u5668\u7684URL
36 | INPUT_CONNNECTOR_MIME_TYPE_SERVER_LBL =\u53EF\u63A5\u53D7\u7684MIME\u7C7B\u578B\uFF08\u670D\u52A1\u5668\u6A21\u5F0F\uFF09
37 | INPUT_CONNNECTOR_CLIENT_URL_LBL =\u7F51\u5740
38 |
39 | OUTPUT_CONNNECTOR_LABEL =\u53D1\u9001Tweet
40 | OUTPUT_CONNNECTOR_DESC =\u4F7F\u7528\u7684\u662F\u516C\u5171Twitter\u7684API\u53D1\u9001\u4E00\u6761\u63A8\u5230Twitter\u3002
41 | OUTPUT_CONNNECTOR_CONSUMER_KEY_LBL =\u6D88\u8D39\u91CD\u70B9
42 | OUTPUT_CONNNECTOR_CONSUMER_SECRET_LBL =\u6D88\u8D39\u8005\u63ED\u79D8
43 | OUTPUT_CONNNECTOR_ACCESS_TOKEN_LBL =\u8BBF\u95EE\u4EE4\u724C
44 | OUTPUT_CONNNECTOR_ACCESS_TOKEN_SECRET_LBL =\u8BBF\u95EE\u4EE4\u724C\u79D8\u5BC6
45 | OUTPUT_CONNNECTOR_MESSAGE_LBL =\u6D88\u606F
46 | OUTPUT_CONNNECTOR_CLIENT_URL_LBL =\u7F51\u5740
47 | OUTPUT_CONNNECTOR_USE_CLIENT_PROXY_LBL =\u4F7F\u7528\u4EE3\u7406\u670D\u52A1\u5668\u7684URL
48 | OUTPUT_CONNNECTOR_CLIENT_PROXY_URL_LBL =\u7F51\u5740\u4EE3\u7406
49 | OUTPUT_CONNNECTOR_CLIENT_PARAMS_LBL =\u53C2\u6570
50 | OUTPUT_CONNNECTOR_HTTP_METHOD_LBL = HTTP\u65B9\u6CD5
51 | OUTPUT_CONNNECTOR_MIME_TYPE_CLIENT_LBL =\u53EF\u63A5\u53D7\u7684MIME\u7C7B\u578B\uFF08\u5BA2\u6237\u7AEF\u6A21\u5F0F\uFF09
52 | OUTPUT_CONNNECTOR_POST_BODY_TYPE_LBL =\u8D34\u4F53\u7684MIME\u7C7B\u578B
--------------------------------------------------------------------------------
/twitter-adapter/src/main/resources/com/esri/geoevent/adapter/twitter-adapter_pt_BR.properties:
--------------------------------------------------------------------------------
1 | CREATED_MSG =\u9E23\u53EB\u72B6\u6001\u9002\u914D\u5668
2 | JSON_IS_NULL = jsonTweet\u4E3A\u7A7A
3 | NEW_MESSAGE_CREATED =\u521B\u5EFA\u65B0TweetStatusMessage
4 | MESSAGE_CREATTION_ERROR1 =\u5728TweetStatusAdapter\u6D88\u606F\u521B\u5EFA\u9519\u8BEF\uFF1A {0}
5 | MESSAGE_CREATTION_ERROR2 =\u9519\u8BEF\u521B\u5EFA\u521D\u59CB\u7684tweet\u6D88\u606F\uFF1A {0}
6 | TWEET_WITH_LOC_SUCCESS =\u751F\u6210\u7684\u6587\u4EF6\u4E0E\u4F4D\u7F6E
7 | DATE_EXCEPTION_ERROR =\u89E3\u6790\u65E5\u671F\u4F8B\u5916TweetStatusAdapter \uFF08 {0} \uFF09 \uFF1A {1}
8 | UNEXPECTED_ERROR =\u610F\u5916\u9519\u8BEF
9 | EVENT_BUILDER_NAME = Twitter\u7684\u4E8B\u4EF6\u751F\u6210\u5668 {0}
10 | DECODE_ERROR =\u65E0\u6CD5\u89E3\u7801\u4F20\u5165\u7684\u7F13\u51B2\u533A - {0}
11 |
12 | ADAPTER_LABEL = Twitter\u7684\u5165\u7AD9\u9002\u914D\u5668
13 | ADAPTER_DESC =\u8BE5\u9002\u914D\u5668\u80FD\u591F\u63A5\u6536/\u89E3\u6790Twitter\u7684\u6570\u636E\u4EE5JSON\u683C\u5F0F\u3002
14 |
15 | INPUT_CONNNECTOR_LABEL =\u63A5\u6536\u9E23\u53EB
16 | INPUT_CONNNECTOR_DESC =\u4ECETwitter\u4E2A\u4EBA\u6863\u6848\u63A5\u6536Twitter\u6216\u4F7F\u7528\u516C\u5171Twitter\u7684API\u57FA\u4E8E\u611F\u5174\u8DA3\u5B57\u8BCD\u3002
17 | INPUT_CONNNECTOR_CONSUMER_KEY_LBL =\u6D88\u8D39\u91CD\u70B9
18 | INPUT_CONNNECTOR_CONSUMER_SECRET_LBL =\u6D88\u8D39\u8005\u63ED\u79D8
19 | INPUT_CONNNECTOR_ACCESS_TOKEN_LBL =\u8BBF\u95EE\u4EE4\u724C
20 | INPUT_CONNNECTOR_ACCESS_TOKEN_SECRET_LBL =\u8BBF\u95EE\u4EE4\u724C\u79D8\u5BC6
21 | INPUT_CONNNECTOR_FOLLOW_LBL =\u8DDF\u968F
22 | INPUT_CONNNECTOR_TRACK_LBL =\u66F2\u76EE
23 | INPUT_CONNNECTOR_LOCATIONS_LBL =\u4F4D\u7F6E
24 | INPUT_CONNNECTOR_COUNT_LBL =\u8BA1\u6570
25 | INPUT_CONNNECTOR_MODE_LBL =\u6A21\u5F0F
26 | INPUT_CONNNECTOR_USE_LONG_POLLING_LBL =\u4F7F\u7528\u957F\u8F6E\u8BE2
27 | INPUT_CONNNECTOR_HONOR_LAST_MOD_LBL =\u63A5\u6536\u65B0\u7684\u6570\u636E\u4EC5
28 | INPUT_CONNNECTOR_FREQUENCY_LBL =\u9891\u7387\uFF08\u5355\u4F4D\u4E3A\u79D2\uFF09
29 | INPUT_CONNNECTOR_POST_BODY_TYPE_LBL =\u8D34\u4F53\u7684MIME\u7C7B\u578B
30 | INPUT_CONNNECTOR_MIME_TYPE_CLIENT_LBL =\u53EF\u63A5\u53D7\u7684MIME\u7C7B\u578B\uFF08\u5BA2\u6237\u7AEF\u6A21\u5F0F\uFF09
31 | INPUT_CONNNECTOR_HTTP_METHOD_LBL = HTTP\u65B9\u6CD5
32 | INPUT_CONNNECTOR_CLIENT_POST_BODY_LBL =\u5185\u5BB9\u4F53
33 | INPUT_CONNNECTOR_CLIENT_PARAMS_LBL =\u53C2\u6570
34 | INPUT_CONNNECTOR_CLIENT_PROXY_URL_LBL =\u7F51\u5740\u4EE3\u7406
35 | INPUT_CONNNECTOR_USE_CLIENT_PROXY_LBL =\u4F7F\u7528\u4EE3\u7406\u670D\u52A1\u5668\u7684URL
36 | INPUT_CONNNECTOR_MIME_TYPE_SERVER_LBL =\u53EF\u63A5\u53D7\u7684MIME\u7C7B\u578B\uFF08\u670D\u52A1\u5668\u6A21\u5F0F\uFF09
37 | INPUT_CONNNECTOR_CLIENT_URL_LBL =\u7F51\u5740
38 |
39 | OUTPUT_CONNNECTOR_LABEL =\u53D1\u9001Tweet
40 | OUTPUT_CONNNECTOR_DESC =\u4F7F\u7528\u7684\u662F\u516C\u5171Twitter\u7684API\u53D1\u9001\u4E00\u6761\u63A8\u5230Twitter\u3002
41 | OUTPUT_CONNNECTOR_CONSUMER_KEY_LBL =\u6D88\u8D39\u91CD\u70B9
42 | OUTPUT_CONNNECTOR_CONSUMER_SECRET_LBL =\u6D88\u8D39\u8005\u63ED\u79D8
43 | OUTPUT_CONNNECTOR_ACCESS_TOKEN_LBL =\u8BBF\u95EE\u4EE4\u724C
44 | OUTPUT_CONNNECTOR_ACCESS_TOKEN_SECRET_LBL =\u8BBF\u95EE\u4EE4\u724C\u79D8\u5BC6
45 | OUTPUT_CONNNECTOR_MESSAGE_LBL =\u6D88\u606F
46 | OUTPUT_CONNNECTOR_CLIENT_URL_LBL =\u7F51\u5740
47 | OUTPUT_CONNNECTOR_USE_CLIENT_PROXY_LBL =\u4F7F\u7528\u4EE3\u7406\u670D\u52A1\u5668\u7684URL
48 | OUTPUT_CONNNECTOR_CLIENT_PROXY_URL_LBL =\u7F51\u5740\u4EE3\u7406
49 | OUTPUT_CONNNECTOR_CLIENT_PARAMS_LBL =\u53C2\u6570
50 | OUTPUT_CONNNECTOR_HTTP_METHOD_LBL = HTTP\u65B9\u6CD5
51 | OUTPUT_CONNNECTOR_MIME_TYPE_CLIENT_LBL =\u53EF\u63A5\u53D7\u7684MIME\u7C7B\u578B\uFF08\u5BA2\u6237\u7AEF\u6A21\u5F0F\uFF09
52 | OUTPUT_CONNNECTOR_POST_BODY_TYPE_LBL =\u8D34\u4F53\u7684MIME\u7C7B\u578B
--------------------------------------------------------------------------------
/twitter-adapter/src/main/resources/com/esri/geoevent/adapter/twitter-adapter_ru.properties:
--------------------------------------------------------------------------------
1 | CREATED_MSG = Tweet \u0430\u0434\u0430\u043F\u0442\u0435\u0440 \u0421\u0442\u0430\u0442\u0443\u0441 \u0441\u043E\u0437\u0434\u0430\u043D\u0430
2 | JSON_IS_NULL = jsonTweet \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043D\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u043C
3 | NEW_MESSAGE_CREATED = \u0421\u043E\u0437\u0434\u0430\u043D \u043D\u043E\u0432\u044B\u0439 TweetStatusMessage
4 | MESSAGE_CREATTION_ERROR1 = \u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u043E\u0431 \u043E\u0448\u0438\u0431\u043A\u0435 \u0421\u043E\u0437\u0434\u0430\u043D\u0438\u0435 \u0432 TweetStatusAdapter: {0}
5 | MESSAGE_CREATTION_ERROR2 = \u041E\u0448\u0438\u0431\u043A\u0430 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u0438\u0441\u0445\u043E\u0434\u043D\u043E\u0433\u043E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0442\u0432\u0438\u0442: {0}
6 | TWEET_WITH_LOC_SUCCESS = \u0421\u043E\u0437\u0434\u0430\u043D\u043E \u0442\u0432\u0438\u0442 \u0441 \u043C\u0435\u0441\u0442\u0430 \u0414\u0430\u0442\u0430
7 | DATE_EXCEPTION_ERROR = \u0420\u0430\u0437\u0431\u043E\u0440 \u0438\u0441\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u0432 TweetStatusAdapter ({0}): {1}
8 | UNEXPECTED_ERROR = \u041D\u0435\u043F\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043D\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430
9 | EVENT_BUILDER_NAME = Twitter \u0441\u043E\u0431\u044B\u0442\u0438\u0435 Builder {0}
10 | DECODE_ERROR = \u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0434\u0435\u043A\u043E\u0434\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0432\u0445\u043E\u0434\u044F\u0449\u0438\u0439 \u0431\u0443\u0444\u0435\u0440. \u041E\u0448\u0438\u0431\u043A\u0430: {0}.
11 |
12 | ADAPTER_LABEL = Twitter \u0412\u0445\u043E\u0434\u044F\u0449\u0438\u0439 \u0430\u0434\u0430\u043F\u0442\u0435\u0440
13 | ADAPTER_DESC = \u042D\u0442\u043E\u0442 \u0430\u0434\u0430\u043F\u0442\u0435\u0440 \u043C\u043E\u0436\u0435\u0442 \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0442\u044C / \u0440\u0430\u0437\u0431\u043E\u0440\u0435 \u0434\u0430\u043D\u043D\u044B\u0445 Twitter \u0432 \u0444\u043E\u0440\u043C\u0430\u0442\u0435 JSON.
14 |
15 | INPUT_CONNNECTOR_LABEL = \u043F\u043E\u043B\u0443\u0447\u0430\u0442\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F
16 | INPUT_CONNNECTOR_DESC = \u043F\u043E\u043B\u0443\u0447\u0430\u0442\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u043E\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u043F\u0440\u043E\u0444\u0438\u043B\u0435\u0439 \u0449\u0435\u0431\u0435\u0442 \u0438\u043B\u0438 \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u0442\u0435\u0440\u043C\u0438\u043D\u0430 (\u043E\u0432), \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435 \u0438\u043D\u0442\u0435\u0440\u0435\u0441 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043E\u0442\u043A\u0440\u044B\u0442\u043E\u0433\u043E Twitter API.
17 | INPUT_CONNNECTOR_CONSUMER_KEY_LBL = \u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0445 Key
18 | INPUT_CONNNECTOR_CONSUMER_SECRET_LBL = \u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0445 Secret
19 | INPUT_CONNNECTOR_ACCESS_TOKEN_LBL = \u041C\u0430\u0440\u043A\u0435\u0440 \u0434\u043E\u0441\u0442\u0443\u043F\u0430
20 | INPUT_CONNNECTOR_ACCESS_TOKEN_SECRET_LBL = \u041C\u0430\u0440\u043A\u0435\u0440 \u0434\u043E\u0441\u0442\u0443\u043F\u0430 Secret
21 | INPUT_CONNNECTOR_FOLLOW_LBL = \u041E\u0442\u0441\u043B\u0435\u0436\u0438\u0432\u0430\u0442\u044C
22 | INPUT_CONNNECTOR_TRACK_LBL = Track
23 | INPUT_CONNNECTOR_LOCATIONS_LBL = \u0418\u0441\u0442\u043E\u0447\u043D\u0438\u043A\u0438
24 | INPUT_CONNNECTOR_COUNT_LBL = \u0413\u0440\u0430\u0444
25 | INPUT_CONNNECTOR_MODE_LBL = \u0420\u0435\u0436\u0438\u043C
26 | INPUT_CONNNECTOR_USE_LONG_POLLING_LBL = \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u041B\u043E\u043D\u0433 \u041E\u043F\u0440\u043E\u0441
27 | INPUT_CONNNECTOR_HONOR_LAST_MOD_LBL = \u041F\u043E\u043B\u0443\u0447\u0430\u0442\u044C \u043D\u043E\u0432\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435 \u0442\u043E\u043B\u044C\u043A\u043E
28 | INPUT_CONNNECTOR_FREQUENCY_LBL = \u0427\u0430\u0441\u0442\u043E\u0442\u0430 (\u0432 \u0441\u0435\u043A\u0443\u043D\u0434\u0430\u0445)
29 | INPUT_CONNNECTOR_POST_BODY_TYPE_LBL = \u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u0442\u0435\u043B\u043E MIME \u0442\u0438\u043F
30 | INPUT_CONNNECTOR_MIME_TYPE_CLIENT_LBL = \u0414\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u044B\u0435 \u0442\u0438\u043F\u044B MIME (\u0420\u0435\u0436\u0438\u043C \u043A\u043B\u0438\u0435\u043D\u0442\u0430)
31 | INPUT_CONNNECTOR_HTTP_METHOD_LBL = HTTP \u043C\u0435\u0442\u043E\u0434
32 | INPUT_CONNNECTOR_CLIENT_POST_BODY_LBL = \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u0442\u0435\u043B\u0430
33 | INPUT_CONNNECTOR_CLIENT_PARAMS_LBL = \u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B
34 | INPUT_CONNNECTOR_CLIENT_PROXY_URL_LBL = URL \u043F\u0440\u043E\u043A\u0441\u0438
35 | INPUT_CONNNECTOR_USE_CLIENT_PROXY_LBL = \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C URL \u043F\u0440\u043E\u043A\u0441\u0438
36 | INPUT_CONNNECTOR_MIME_TYPE_SERVER_LBL = \u0414\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u044B\u0435 \u0442\u0438\u043F\u044B MIME (\u0420\u0435\u0436\u0438\u043C \u0441\u0435\u0440\u0432\u0435\u0440\u0430)
37 | INPUT_CONNNECTOR_CLIENT_URL_LBL = URL
38 |
39 | OUTPUT_CONNNECTOR_LABEL = \u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C Tweet
40 | OUTPUT_CONNNECTOR_DESC = \u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C \u0442\u0432\u0438\u0442 \u043D\u0430 Twitter \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043E\u0442\u043A\u0440\u044B\u0442\u043E\u0433\u043E Twitter API.
41 | OUTPUT_CONNNECTOR_CONSUMER_KEY_LBL = \u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0445 Key
42 | OUTPUT_CONNNECTOR_CONSUMER_SECRET_LBL = \u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0445 Secret
43 | OUTPUT_CONNNECTOR_ACCESS_TOKEN_LBL = \u041C\u0430\u0440\u043A\u0435\u0440 \u0434\u043E\u0441\u0442\u0443\u043F\u0430
44 | OUTPUT_CONNNECTOR_ACCESS_TOKEN_SECRET_LBL = \u041C\u0430\u0440\u043A\u0435\u0440 \u0434\u043E\u0441\u0442\u0443\u043F\u0430 Secret
45 | OUTPUT_CONNNECTOR_MESSAGE_LBL = \u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435
46 | OUTPUT_CONNNECTOR_CLIENT_URL_LBL = URL
47 | OUTPUT_CONNNECTOR_USE_CLIENT_PROXY_LBL = \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C URL \u043F\u0440\u043E\u043A\u0441\u0438
48 | OUTPUT_CONNNECTOR_CLIENT_PROXY_URL_LBL = URL \u043F\u0440\u043E\u043A\u0441\u0438
49 | OUTPUT_CONNNECTOR_CLIENT_PARAMS_LBL = \u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B
50 | OUTPUT_CONNNECTOR_HTTP_METHOD_LBL = HTTP \u043C\u0435\u0442\u043E\u0434
51 | OUTPUT_CONNNECTOR_MIME_TYPE_CLIENT_LBL = \u0414\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u044B\u0435 \u0442\u0438\u043F\u044B MIME (\u0420\u0435\u0436\u0438\u043C \u043A\u043B\u0438\u0435\u043D\u0442\u0430)
52 | OUTPUT_CONNNECTOR_POST_BODY_TYPE_LBL = \u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u0442\u0435\u043B\u043E MIME \u0442\u0438\u043F
--------------------------------------------------------------------------------
/twitter-adapter/src/main/resources/com/esri/geoevent/adapter/twitter-adapter_tr.properties:
--------------------------------------------------------------------------------
1 | CREATED_MSG =\u9E23\u53EB\u72B6\u6001\u9002\u914D\u5668
2 | JSON_IS_NULL = jsonTweet\u4E3A\u7A7A
3 | NEW_MESSAGE_CREATED =\u521B\u5EFA\u65B0TweetStatusMessage
4 | MESSAGE_CREATTION_ERROR1 =\u5728TweetStatusAdapter\u6D88\u606F\u521B\u5EFA\u9519\u8BEF\uFF1A {0}
5 | MESSAGE_CREATTION_ERROR2 =\u9519\u8BEF\u521B\u5EFA\u521D\u59CB\u7684tweet\u6D88\u606F\uFF1A {0}
6 | TWEET_WITH_LOC_SUCCESS =\u751F\u6210\u7684\u6587\u4EF6\u4E0E\u4F4D\u7F6E
7 | DATE_EXCEPTION_ERROR =\u89E3\u6790\u65E5\u671F\u4F8B\u5916TweetStatusAdapter \uFF08 {0} \uFF09 \uFF1A {1}
8 | UNEXPECTED_ERROR =\u610F\u5916\u9519\u8BEF
9 | EVENT_BUILDER_NAME = Twitter\u7684\u4E8B\u4EF6\u751F\u6210\u5668 {0}
10 | DECODE_ERROR =\u65E0\u6CD5\u89E3\u7801\u4F20\u5165\u7684\u7F13\u51B2\u533A - {0}
11 |
12 | ADAPTER_LABEL = Twitter\u7684\u5165\u7AD9\u9002\u914D\u5668
13 | ADAPTER_DESC =\u8BE5\u9002\u914D\u5668\u80FD\u591F\u63A5\u6536/\u89E3\u6790Twitter\u7684\u6570\u636E\u4EE5JSON\u683C\u5F0F\u3002
14 |
15 | INPUT_CONNNECTOR_LABEL =\u63A5\u6536\u9E23\u53EB
16 | INPUT_CONNNECTOR_DESC =\u4ECETwitter\u4E2A\u4EBA\u6863\u6848\u63A5\u6536Twitter\u6216\u4F7F\u7528\u516C\u5171Twitter\u7684API\u57FA\u4E8E\u611F\u5174\u8DA3\u5B57\u8BCD\u3002
17 | INPUT_CONNNECTOR_CONSUMER_KEY_LBL =\u6D88\u8D39\u91CD\u70B9
18 | INPUT_CONNNECTOR_CONSUMER_SECRET_LBL =\u6D88\u8D39\u8005\u63ED\u79D8
19 | INPUT_CONNNECTOR_ACCESS_TOKEN_LBL =\u8BBF\u95EE\u4EE4\u724C
20 | INPUT_CONNNECTOR_ACCESS_TOKEN_SECRET_LBL =\u8BBF\u95EE\u4EE4\u724C\u79D8\u5BC6
21 | INPUT_CONNNECTOR_FOLLOW_LBL =\u8DDF\u968F
22 | INPUT_CONNNECTOR_TRACK_LBL =\u66F2\u76EE
23 | INPUT_CONNNECTOR_LOCATIONS_LBL =\u4F4D\u7F6E
24 | INPUT_CONNNECTOR_COUNT_LBL =\u8BA1\u6570
25 | INPUT_CONNNECTOR_MODE_LBL =\u6A21\u5F0F
26 | INPUT_CONNNECTOR_USE_LONG_POLLING_LBL =\u4F7F\u7528\u957F\u8F6E\u8BE2
27 | INPUT_CONNNECTOR_HONOR_LAST_MOD_LBL =\u63A5\u6536\u65B0\u7684\u6570\u636E\u4EC5
28 | INPUT_CONNNECTOR_FREQUENCY_LBL =\u9891\u7387\uFF08\u5355\u4F4D\u4E3A\u79D2\uFF09
29 | INPUT_CONNNECTOR_POST_BODY_TYPE_LBL =\u8D34\u4F53\u7684MIME\u7C7B\u578B
30 | INPUT_CONNNECTOR_MIME_TYPE_CLIENT_LBL =\u53EF\u63A5\u53D7\u7684MIME\u7C7B\u578B\uFF08\u5BA2\u6237\u7AEF\u6A21\u5F0F\uFF09
31 | INPUT_CONNNECTOR_HTTP_METHOD_LBL = HTTP\u65B9\u6CD5
32 | INPUT_CONNNECTOR_CLIENT_POST_BODY_LBL =\u5185\u5BB9\u4F53
33 | INPUT_CONNNECTOR_CLIENT_PARAMS_LBL =\u53C2\u6570
34 | INPUT_CONNNECTOR_CLIENT_PROXY_URL_LBL =\u7F51\u5740\u4EE3\u7406
35 | INPUT_CONNNECTOR_USE_CLIENT_PROXY_LBL =\u4F7F\u7528\u4EE3\u7406\u670D\u52A1\u5668\u7684URL
36 | INPUT_CONNNECTOR_MIME_TYPE_SERVER_LBL =\u53EF\u63A5\u53D7\u7684MIME\u7C7B\u578B\uFF08\u670D\u52A1\u5668\u6A21\u5F0F\uFF09
37 | INPUT_CONNNECTOR_CLIENT_URL_LBL =\u7F51\u5740
38 |
39 | OUTPUT_CONNNECTOR_LABEL =\u53D1\u9001Tweet
40 | OUTPUT_CONNNECTOR_DESC =\u4F7F\u7528\u7684\u662F\u516C\u5171Twitter\u7684API\u53D1\u9001\u4E00\u6761\u63A8\u5230Twitter\u3002
41 | OUTPUT_CONNNECTOR_CONSUMER_KEY_LBL =\u6D88\u8D39\u91CD\u70B9
42 | OUTPUT_CONNNECTOR_CONSUMER_SECRET_LBL =\u6D88\u8D39\u8005\u63ED\u79D8
43 | OUTPUT_CONNNECTOR_ACCESS_TOKEN_LBL =\u8BBF\u95EE\u4EE4\u724C
44 | OUTPUT_CONNNECTOR_ACCESS_TOKEN_SECRET_LBL =\u8BBF\u95EE\u4EE4\u724C\u79D8\u5BC6
45 | OUTPUT_CONNNECTOR_MESSAGE_LBL =\u6D88\u606F
46 | OUTPUT_CONNNECTOR_CLIENT_URL_LBL =\u7F51\u5740
47 | OUTPUT_CONNNECTOR_USE_CLIENT_PROXY_LBL =\u4F7F\u7528\u4EE3\u7406\u670D\u52A1\u5668\u7684URL
48 | OUTPUT_CONNNECTOR_CLIENT_PROXY_URL_LBL =\u7F51\u5740\u4EE3\u7406
49 | OUTPUT_CONNNECTOR_CLIENT_PARAMS_LBL =\u53C2\u6570
50 | OUTPUT_CONNNECTOR_HTTP_METHOD_LBL = HTTP\u65B9\u6CD5
51 | OUTPUT_CONNNECTOR_MIME_TYPE_CLIENT_LBL =\u53EF\u63A5\u53D7\u7684MIME\u7C7B\u578B\uFF08\u5BA2\u6237\u7AEF\u6A21\u5F0F\uFF09
52 | OUTPUT_CONNNECTOR_POST_BODY_TYPE_LBL =\u8D34\u4F53\u7684MIME\u7C7B\u578B
--------------------------------------------------------------------------------
/twitter-adapter/src/main/resources/com/esri/geoevent/adapter/twitter-adapter_zh_CN.properties:
--------------------------------------------------------------------------------
1 | CREATED_MSG =\u9E23\u53EB\u72B6\u6001\u9002\u914D\u5668
2 | JSON_IS_NULL = jsonTweet\u4E3A\u7A7A
3 | NEW_MESSAGE_CREATED =\u521B\u5EFA\u65B0TweetStatusMessage
4 | MESSAGE_CREATTION_ERROR1 =\u5728TweetStatusAdapter\u6D88\u606F\u521B\u5EFA\u9519\u8BEF\uFF1A {0}
5 | MESSAGE_CREATTION_ERROR2 =\u9519\u8BEF\u521B\u5EFA\u521D\u59CB\u7684tweet\u6D88\u606F\uFF1A {0}
6 | TWEET_WITH_LOC_SUCCESS =\u751F\u6210\u7684\u6587\u4EF6\u4E0E\u4F4D\u7F6E
7 | DATE_EXCEPTION_ERROR =\u89E3\u6790\u65E5\u671F\u4F8B\u5916TweetStatusAdapter \uFF08 {0} \uFF09 \uFF1A {1}
8 | UNEXPECTED_ERROR =\u610F\u5916\u9519\u8BEF
9 | EVENT_BUILDER_NAME = Twitter\u7684\u4E8B\u4EF6\u751F\u6210\u5668 {0}
10 | DECODE_ERROR =\u65E0\u6CD5\u89E3\u7801\u4F20\u5165\u7684\u7F13\u51B2\u533A - {0}
11 |
12 | ADAPTER_LABEL = Twitter\u7684\u5165\u7AD9\u9002\u914D\u5668
13 | ADAPTER_DESC =\u8BE5\u9002\u914D\u5668\u80FD\u591F\u63A5\u6536/\u89E3\u6790Twitter\u7684\u6570\u636E\u4EE5JSON\u683C\u5F0F\u3002
14 |
15 | INPUT_CONNNECTOR_LABEL =\u63A5\u6536\u9E23\u53EB
16 | INPUT_CONNNECTOR_DESC =\u4ECETwitter\u4E2A\u4EBA\u6863\u6848\u63A5\u6536Twitter\u6216\u4F7F\u7528\u516C\u5171Twitter\u7684API\u57FA\u4E8E\u611F\u5174\u8DA3\u5B57\u8BCD\u3002
17 | INPUT_CONNNECTOR_CONSUMER_KEY_LBL =\u6D88\u8D39\u91CD\u70B9
18 | INPUT_CONNNECTOR_CONSUMER_SECRET_LBL =\u6D88\u8D39\u8005\u63ED\u79D8
19 | INPUT_CONNNECTOR_ACCESS_TOKEN_LBL =\u8BBF\u95EE\u4EE4\u724C
20 | INPUT_CONNNECTOR_ACCESS_TOKEN_SECRET_LBL =\u8BBF\u95EE\u4EE4\u724C\u79D8\u5BC6
21 | INPUT_CONNNECTOR_FOLLOW_LBL =\u8DDF\u968F
22 | INPUT_CONNNECTOR_TRACK_LBL =\u66F2\u76EE
23 | INPUT_CONNNECTOR_LOCATIONS_LBL =\u4F4D\u7F6E
24 | INPUT_CONNNECTOR_COUNT_LBL =\u8BA1\u6570
25 | INPUT_CONNNECTOR_MODE_LBL =\u6A21\u5F0F
26 | INPUT_CONNNECTOR_USE_LONG_POLLING_LBL =\u4F7F\u7528\u957F\u8F6E\u8BE2
27 | INPUT_CONNNECTOR_HONOR_LAST_MOD_LBL =\u63A5\u6536\u65B0\u7684\u6570\u636E\u4EC5
28 | INPUT_CONNNECTOR_FREQUENCY_LBL =\u9891\u7387\uFF08\u5355\u4F4D\u4E3A\u79D2\uFF09
29 | INPUT_CONNNECTOR_POST_BODY_TYPE_LBL =\u8D34\u4F53\u7684MIME\u7C7B\u578B
30 | INPUT_CONNNECTOR_MIME_TYPE_CLIENT_LBL =\u53EF\u63A5\u53D7\u7684MIME\u7C7B\u578B\uFF08\u5BA2\u6237\u7AEF\u6A21\u5F0F\uFF09
31 | INPUT_CONNNECTOR_HTTP_METHOD_LBL = HTTP\u65B9\u6CD5
32 | INPUT_CONNNECTOR_CLIENT_POST_BODY_LBL =\u5185\u5BB9\u4F53
33 | INPUT_CONNNECTOR_CLIENT_PARAMS_LBL =\u53C2\u6570
34 | INPUT_CONNNECTOR_CLIENT_PROXY_URL_LBL =\u7F51\u5740\u4EE3\u7406
35 | INPUT_CONNNECTOR_USE_CLIENT_PROXY_LBL =\u4F7F\u7528\u4EE3\u7406\u670D\u52A1\u5668\u7684URL
36 | INPUT_CONNNECTOR_MIME_TYPE_SERVER_LBL =\u53EF\u63A5\u53D7\u7684MIME\u7C7B\u578B\uFF08\u670D\u52A1\u5668\u6A21\u5F0F\uFF09
37 | INPUT_CONNNECTOR_CLIENT_URL_LBL =\u7F51\u5740
38 |
39 | OUTPUT_CONNNECTOR_LABEL =\u53D1\u9001Tweet
40 | OUTPUT_CONNNECTOR_DESC =\u4F7F\u7528\u7684\u662F\u516C\u5171Twitter\u7684API\u53D1\u9001\u4E00\u6761\u63A8\u5230Twitter\u3002
41 | OUTPUT_CONNNECTOR_CONSUMER_KEY_LBL =\u6D88\u8D39\u91CD\u70B9
42 | OUTPUT_CONNNECTOR_CONSUMER_SECRET_LBL =\u6D88\u8D39\u8005\u63ED\u79D8
43 | OUTPUT_CONNNECTOR_ACCESS_TOKEN_LBL =\u8BBF\u95EE\u4EE4\u724C
44 | OUTPUT_CONNNECTOR_ACCESS_TOKEN_SECRET_LBL =\u8BBF\u95EE\u4EE4\u724C\u79D8\u5BC6
45 | OUTPUT_CONNNECTOR_MESSAGE_LBL =\u6D88\u606F
46 | OUTPUT_CONNNECTOR_CLIENT_URL_LBL =\u7F51\u5740
47 | OUTPUT_CONNNECTOR_USE_CLIENT_PROXY_LBL =\u4F7F\u7528\u4EE3\u7406\u670D\u52A1\u5668\u7684URL
48 | OUTPUT_CONNNECTOR_CLIENT_PROXY_URL_LBL =\u7F51\u5740\u4EE3\u7406
49 | OUTPUT_CONNNECTOR_CLIENT_PARAMS_LBL =\u53C2\u6570
50 | OUTPUT_CONNNECTOR_HTTP_METHOD_LBL = HTTP\u65B9\u6CD5
51 | OUTPUT_CONNNECTOR_MIME_TYPE_CLIENT_LBL =\u53EF\u63A5\u53D7\u7684MIME\u7C7B\u578B\uFF08\u5BA2\u6237\u7AEF\u6A21\u5F0F\uFF09
52 | OUTPUT_CONNNECTOR_POST_BODY_TYPE_LBL =\u8D34\u4F53\u7684MIME\u7C7B\u578B
--------------------------------------------------------------------------------
/twitter-adapter/src/main/resources/input-connector-definition.xml:
--------------------------------------------------------------------------------
1 |
2 | ${com.esri.geoevent.adapter.twitter-adapter.INPUT_CONNNECTOR_DESC}
3 | twitter-in
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/twitter-adapter/src/main/resources/output-connector-definition.xml:
--------------------------------------------------------------------------------
1 |
4 | ${com.esri.geoevent.adapter.twitter-adapter.OUTPUT_CONNNECTOR_DESC}
5 |
6 |
7 |
8 | twitter-out
9 |
10 |
11 |
14 |
17 |
20 |
23 |
26 |
27 |
28 |
33 |
34 |
35 |
38 |
41 |
44 |
47 |
50 |
53 |
54 |
55 |
--------------------------------------------------------------------------------
/twitter-adapter/src/main/resources/tweetstatus-adapter-definition.xml:
--------------------------------------------------------------------------------
1 |
4 | ${com.esri.geoevent.adapter.twitter-adapter.ADAPTER_DESC}
5 |
6 |
7 |
8 |
9 |
11 |
12 |
13 |
14 |
15 | TIME_START
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 | GEOMETRY
25 |
26 |
27 |
28 |
29 |
30 | TRACK_ID
31 |
32 |
33 |
35 |
37 |
38 |
39 |
41 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
--------------------------------------------------------------------------------
/twitter-for-geoevent.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Esri/twitter-for-geoevent/cce14886de7ab6f93b4f03eb36011fc4363baa21/twitter-for-geoevent.png
--------------------------------------------------------------------------------
/twitter-transport/lib/http-transport-10.2.0.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Esri/twitter-for-geoevent/cce14886de7ab6f93b4f03eb36011fc4363baa21/twitter-transport/lib/http-transport-10.2.0.jar
--------------------------------------------------------------------------------
/twitter-transport/lib/http-transport-10.3.0.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Esri/twitter-for-geoevent/cce14886de7ab6f93b4f03eb36011fc4363baa21/twitter-transport/lib/http-transport-10.3.0.jar
--------------------------------------------------------------------------------
/twitter-transport/lib/http-transport-10.4.0.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Esri/twitter-for-geoevent/cce14886de7ab6f93b4f03eb36011fc4363baa21/twitter-transport/lib/http-transport-10.4.0.jar
--------------------------------------------------------------------------------
/twitter-transport/lib/http-transport-10.5.0.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Esri/twitter-for-geoevent/cce14886de7ab6f93b4f03eb36011fc4363baa21/twitter-transport/lib/http-transport-10.5.0.jar
--------------------------------------------------------------------------------
/twitter-transport/lib/http-transport-10.6.0.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Esri/twitter-for-geoevent/cce14886de7ab6f93b4f03eb36011fc4363baa21/twitter-transport/lib/http-transport-10.6.0.jar
--------------------------------------------------------------------------------
/twitter-transport/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | com.esri.geoevent.parent
7 | twitter
8 | 10.6.0
9 |
10 | com.esri.geoevent.transport
11 | twitter-transport
12 | Esri :: GeoEvent :: Transport :: Twitter
13 | bundle
14 |
15 |
16 |
17 | com.esri.geoevent.transport
18 | http-transport
19 | ${project.version}
20 | system
21 | ${project.basedir}/lib/http-transport-${project.version}.jar
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | org.twitter4j
30 | twitter4j-core
31 | 4.0.3
32 |
33 |
34 | org.twitter4j
35 | twitter4j-stream
36 | 4.0.3
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 | org.apache.felix
50 | maven-bundle-plugin
51 | true
52 |
53 |
54 | ${project.groupId}.${project.artifactId}
55 | ${contact.address}
56 | ${project.version}
57 |
58 | com.esri.geoevent.transport.twitter
59 |
60 | *;scope=compile|runtime;inline=true
61 |
62 | true
63 |
64 |
65 |
66 |
67 |
68 |
69 |
--------------------------------------------------------------------------------
/twitter-transport/src/main/java/com/esri/geoevent/transport/twitter/OAuth.java:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 1995-2013 Esri
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 |
16 | For additional information, contact:
17 | Environmental Systems Research Institute, Inc.
18 | Attn: Contracts Dept
19 | 380 New York Street
20 | Redlands, California, USA 92373
21 |
22 | email: contracts@esri.com
23 | */
24 |
25 | package com.esri.geoevent.transport.twitter;
26 |
27 | import java.io.UnsupportedEncodingException;
28 | import java.net.URLDecoder;
29 | import java.net.URLEncoder;
30 | import java.security.InvalidKeyException;
31 | import java.security.NoSuchAlgorithmException;
32 | import java.util.ArrayList;
33 | import java.util.Collections;
34 | import java.util.HashMap;
35 | import java.util.List;
36 | import java.util.Map;
37 | import java.util.Random;
38 | import java.util.Set;
39 | import java.util.TreeMap;
40 |
41 | import javax.crypto.Mac;
42 | import javax.crypto.spec.SecretKeySpec;
43 |
44 | import com.esri.ges.framework.i18n.BundleLogger;
45 | import com.esri.ges.framework.i18n.BundleLoggerFactory;
46 |
47 | public class OAuth
48 | {
49 | private static final BundleLogger LOGGER = BundleLoggerFactory.getLogger(OAuth.class);
50 |
51 | public final static class BASE64Encoder
52 | {
53 | private static final char last2byte = (char) Integer.parseInt("00000011", 2);
54 | private static final char last4byte = (char) Integer.parseInt("00001111", 2);
55 | private static final char last6byte = (char) Integer.parseInt("00111111", 2);
56 | private static final char lead6byte = (char) Integer.parseInt("11111100", 2);
57 | private static final char lead4byte = (char) Integer.parseInt("11110000", 2);
58 | private static final char lead2byte = (char) Integer.parseInt("11000000", 2);
59 | private static final char[] encodeTable = new char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' };
60 |
61 | private BASE64Encoder()
62 | {
63 | }
64 |
65 | public static String encode(byte[] from)
66 | {
67 | StringBuffer to = new StringBuffer((int) (from.length * 1.34) + 3);
68 | int num = 0;
69 | char currentByte = 0;
70 | for (int i = 0; i < from.length; i++)
71 | {
72 | num = num % 8;
73 | while (num < 8)
74 | {
75 | switch (num)
76 | {
77 | case 0:
78 | currentByte = (char) (from[i] & lead6byte);
79 | currentByte = (char) (currentByte >>> 2);
80 | break;
81 | case 2:
82 | currentByte = (char) (from[i] & last6byte);
83 | break;
84 | case 4:
85 | currentByte = (char) (from[i] & last4byte);
86 | currentByte = (char) (currentByte << 2);
87 | if ((i + 1) < from.length)
88 | {
89 | currentByte |= (from[i + 1] & lead2byte) >>> 6;
90 | }
91 | break;
92 | case 6:
93 | currentByte = (char) (from[i] & last2byte);
94 | currentByte = (char) (currentByte << 4);
95 | if ((i + 1) < from.length)
96 | {
97 | currentByte |= (from[i + 1] & lead4byte) >>> 4;
98 | }
99 | break;
100 | }
101 | to.append(encodeTable[currentByte]);
102 | num += 6;
103 | }
104 | }
105 | if (to.length() % 4 != 0)
106 | {
107 | for (int i = 4 - to.length() % 4; i > 0; i--)
108 | {
109 | to.append("=");
110 | }
111 | }
112 | return to.toString();
113 | }
114 | }
115 |
116 | public static final String HMACSHAR1 = "HmacSHA1";
117 | public static final String HMAC_SHA1 = "HMAC-SHA1";
118 | public static final String OAUTH_CONSUMER_KEY = "oauth_consumer_key";
119 | public static final String OAUTH_SIGNATURE_METHOD = "oauth_signature_method";
120 | public static final String OAUTH_TIMESTAMP = "oauth_timestamp";
121 | public static final String OAUTH_NONCE = "oauth_nonce";
122 | public static final String OAUTH_VERSION = "oauth_version";
123 | public static final String OAUTH_TOKEN = "oauth_token";
124 | public static final String OAUTH_SIGNATURE = "oauth_signature";
125 | public static final String REALM = "realm";
126 | public static final String OAUTH = "OAuth ";
127 | public static final String AUTHORIZATION = "Authorization";
128 | public static final String ACCEPT = "Accept";
129 | public static final String ACCEPT_VALUES = "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2";
130 | public static final String CONTENT_TYPE = "Content-Type";
131 | public static final String CONSUMER_KEY = "consumerKey";
132 | public static final String CONSUMER_SECRET = "consumerSecret";
133 | public static final String ACCESS_TOKEN = "accessToken";
134 | public static final String ACCESS_TOKEN_SECRET = "accessTokenSecret";
135 | public static final String UTF_8 = "UTF-8";
136 | private static Random RAND = new Random();
137 |
138 | public static Long getUserIdFromAccessToken(String accessToken)
139 | {
140 | // Get userId from accessToken
141 | Long userId = (long) 0;
142 | try
143 | {
144 | String sUserId;
145 | sUserId = accessToken.substring(0, accessToken.indexOf("-"));
146 | if (sUserId != null)
147 | {
148 | userId = Long.parseLong(sUserId);
149 | }
150 | }
151 | catch (IndexOutOfBoundsException e)
152 | {
153 | throw new IllegalArgumentException(LOGGER.translate("INVALID_ACCESS_TOKEN"));
154 | }
155 | return userId;
156 | }
157 |
158 | public static String encodePostBody(String unEncodedPostBody)
159 | {
160 | if (unEncodedPostBody == null)
161 | unEncodedPostBody = "";
162 |
163 | String[] sParams = unEncodedPostBody.split("&");
164 |
165 | Map params = new HashMap();
166 | // params.put("count", "0");
167 | // params.put("track", "obama");
168 | for (String param : sParams)
169 | {
170 | String[] nameValue = param.split("=");
171 | if (nameValue.length == 2)
172 | {
173 | params.put(nameValue[0], nameValue[1]);
174 | }
175 | }
176 | return encodeParameters(params, "&", false);
177 | }
178 |
179 | public static String createOAuthAuthorizationHeader(String clientUrl, String httpMethod, String unEncodedPostBody, String accessToken, String accessTokenSecret, String consumerKey, String consumerSecret)
180 | {
181 | // String url = "https://stream.twitter.com/1/statuses/filter.json";
182 | if (unEncodedPostBody == null)
183 | unEncodedPostBody = "";
184 |
185 | String[] sParams = unEncodedPostBody.split("&");
186 |
187 | Map params = new HashMap();
188 | // params.put("count", "0");
189 | // params.put("track", "esri");
190 | for (String param : sParams)
191 | {
192 | String[] nameValue = param.split("=");
193 | if (nameValue.length == 2)
194 | {
195 | params.put(nameValue[0], nameValue[1]);
196 | }
197 | }
198 | Long ltimestamp = System.currentTimeMillis() / 1000;
199 | String timestamp = ltimestamp.toString();
200 | Long lnonce = ltimestamp + OAuth.RAND.nextInt();
201 | String nonce = lnonce.toString();
202 | String realm = null;
203 | String authorizationHeader = generateAuthorizationHeader(httpMethod, clientUrl, params, nonce, timestamp, accessToken, accessTokenSecret, consumerKey, consumerSecret, realm);
204 |
205 | LOGGER.debug(authorizationHeader);
206 | return authorizationHeader;
207 | }
208 |
209 | private static void parseGetParameters(String url, Map signatureBaseParams)
210 | {
211 | int queryStart = url.indexOf("?");
212 | if (-1 != queryStart)
213 | {
214 | String[] queryStrs = url.substring(queryStart + 1).split("&");
215 | try
216 | {
217 | for (String query : queryStrs)
218 | {
219 | String[] split = query.split("=");
220 | if (split.length == 2)
221 | {
222 | signatureBaseParams.put(URLDecoder.decode(split[0], OAuth.UTF_8), URLDecoder.decode(split[1], OAuth.UTF_8));
223 | }
224 | else
225 | {
226 | signatureBaseParams.put(URLDecoder.decode(split[0], OAuth.UTF_8), "");
227 | }
228 | }
229 | }
230 | catch (UnsupportedEncodingException ignore)
231 | {
232 | LOGGER.error(ignore.getMessage(), ignore);
233 | }
234 | }
235 | }
236 |
237 | public static String encode(String value)
238 | {
239 | String encoded = null;
240 | try
241 | {
242 | encoded = URLEncoder.encode(value, OAuth.UTF_8);
243 | }
244 | catch (UnsupportedEncodingException ignore)
245 | {
246 | }
247 | StringBuffer buf = new StringBuffer(encoded.length());
248 | char focus;
249 | for (int i = 0; i < encoded.length(); i++)
250 | {
251 | focus = encoded.charAt(i);
252 | if (focus == '*')
253 | {
254 | buf.append("%2A");
255 | }
256 | else if (focus == '+')
257 | {
258 | buf.append("%20");
259 | }
260 | else if (focus == '%' && (i + 1) < encoded.length() && encoded.charAt(i + 1) == '7' && encoded.charAt(i + 2) == 'E')
261 | {
262 | buf.append('~');
263 | i += 2;
264 | }
265 | else
266 | {
267 | buf.append(focus);
268 | }
269 | }
270 | return buf.toString();
271 | }
272 |
273 | public static String constructRequestURL(String url)
274 | {
275 | int index = url.indexOf("?");
276 | if (-1 != index)
277 | {
278 | url = url.substring(0, index);
279 | }
280 | int slashIndex = url.indexOf("/", 8);
281 | String baseURL = url.substring(0, slashIndex).toLowerCase();
282 | int colonIndex = baseURL.indexOf(":", 8);
283 | if (-1 != colonIndex)
284 | {
285 | // url contains port number
286 | if (baseURL.startsWith("http://") && baseURL.endsWith(":80"))
287 | {
288 | // http default port 80 MUST be excluded
289 | baseURL = baseURL.substring(0, colonIndex);
290 | }
291 | else if (baseURL.startsWith("https://") && baseURL.endsWith(":443"))
292 | {
293 | // http default port 443 MUST be excluded
294 | baseURL = baseURL.substring(0, colonIndex);
295 | }
296 | }
297 | url = baseURL + url.substring(slashIndex);
298 |
299 | return url;
300 | }
301 |
302 | public static String encodeParameters(Map httpParams, String splitter, boolean quot)
303 | {
304 | StringBuffer buf = new StringBuffer();
305 | Set keys = httpParams.keySet();
306 | List keyList = new ArrayList();
307 | for (Object key : keys)
308 | {
309 | keyList.add((String) key);
310 | }
311 | Collections.sort(keyList);
312 | for (String key : keyList)
313 | {
314 | // if (!param.isFile())
315 | {
316 | if (buf.length() != 0)
317 | {
318 | if (quot)
319 | {
320 | buf.append("\"");
321 | }
322 | buf.append(splitter);
323 | }
324 | buf.append(encode(key)).append("=");
325 | if (quot)
326 | {
327 | buf.append("\"");
328 | }
329 | buf.append(encode(httpParams.get(key)));
330 | }
331 | }
332 | if (buf.length() != 0)
333 | {
334 | if (quot)
335 | {
336 | buf.append("\"");
337 | }
338 | }
339 | return buf.toString();
340 | }
341 |
342 | public static String generateSignature(String oauthBaseString, String accessToken, String accessTokenSecret, String consumerSecret, SecretKeySpec secretKeySpec)
343 | {
344 | byte[] byteHMAC = null;
345 | try
346 | {
347 | Mac mac = Mac.getInstance(OAuth.HMACSHAR1);
348 | SecretKeySpec spec;
349 | if (null == accessToken)
350 | {
351 | String oauthSignature = encode(consumerSecret) + "&";
352 | spec = new SecretKeySpec(oauthSignature.getBytes(), OAuth.HMACSHAR1);
353 | }
354 | else
355 | {
356 | spec = secretKeySpec;
357 | if (null == spec)
358 | {
359 | String oauthSignature = encode(consumerSecret) + "&" + encode(accessTokenSecret);
360 | spec = new SecretKeySpec(oauthSignature.getBytes(), OAuth.HMACSHAR1);
361 |
362 | // TODO -- out param!
363 | secretKeySpec = spec;
364 | }
365 | }
366 | mac.init(spec);
367 | byteHMAC = mac.doFinal(oauthBaseString.getBytes());
368 | }
369 | catch (InvalidKeyException ike)
370 | {
371 | // logger.error("Failed initialize \"Message Authentication Code\" (MAC)",
372 | // ike);
373 | throw new AssertionError(ike);
374 | }
375 | catch (NoSuchAlgorithmException nsae)
376 | {
377 | // logger.error("Failed to get HmacSHA1 \"Message Authentication Code\" (MAC)",
378 | // nsae);
379 | throw new AssertionError(nsae);
380 | }
381 | return OAuth.BASE64Encoder.encode(byteHMAC);
382 | }
383 |
384 | public static String generateAuthorizationHeader(String method, String url, Map params, String nonce, String timestamp, String token, String tokenSecret, String consumerKey, String consumerSecret, String realm)
385 | {
386 | Map headerParams = new TreeMap();
387 | headerParams.put(OAuth.OAUTH_CONSUMER_KEY, consumerKey);
388 | headerParams.put(OAuth.OAUTH_SIGNATURE_METHOD, OAuth.HMAC_SHA1);
389 | headerParams.put(OAuth.OAUTH_TIMESTAMP, timestamp);
390 | headerParams.put(OAuth.OAUTH_NONCE, nonce);
391 | headerParams.put(OAuth.OAUTH_VERSION, "1.0");
392 | headerParams.put(OAuth.OAUTH_TOKEN, token);
393 |
394 | Map signatureParams = new HashMap();
395 | signatureParams.putAll(headerParams);
396 | // if !containsFile
397 | if (params != null)
398 | signatureParams.putAll(params);
399 |
400 | parseGetParameters(url, signatureParams);
401 |
402 | StringBuffer base = new StringBuffer(method).append("&").append(encode(constructRequestURL(url))).append("&");
403 | base.append(encode(encodeParameters(signatureParams, "&", false)));
404 | String oauthBaseString = base.toString();
405 | // logger.debug("OAuth base string: ", oauthBaseString);
406 | SecretKeySpec secretKeySpec = null;
407 | String signature = generateSignature(oauthBaseString, token, tokenSecret, consumerSecret, secretKeySpec);
408 | // logger.debug("OAuth signature: ", signature);
409 |
410 | headerParams.put(OAuth.OAUTH_SIGNATURE, signature);
411 |
412 | // http://oauth.net/core/1.0/#rfc.section.9.1.1
413 | if (realm != null)
414 | {
415 | headerParams.put(OAuth.REALM, realm);
416 | }
417 | return OAuth.OAUTH + encodeParameters(headerParams, ",", true);
418 | }
419 |
420 | }
421 |
--------------------------------------------------------------------------------
/twitter-transport/src/main/java/com/esri/geoevent/transport/twitter/TwitterInboundTransport.java:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 1995-2013 Esri
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 |
16 | For additional information, contact:
17 | Environmental Systems Research Institute, Inc.
18 | Attn: Contracts Dept
19 | 380 New York Street
20 | Redlands, California, USA 92373
21 |
22 | email: contracts@esri.com
23 | */
24 |
25 | package com.esri.geoevent.transport.twitter;
26 |
27 | import java.nio.BufferOverflowException;
28 | import java.nio.ByteBuffer;
29 |
30 | import org.apache.commons.lang3.StringUtils;
31 |
32 | import com.esri.ges.core.component.ComponentException;
33 | import com.esri.ges.core.component.RunningState;
34 | import com.esri.ges.framework.i18n.BundleLogger;
35 | import com.esri.ges.framework.i18n.BundleLoggerFactory;
36 | import com.esri.ges.transport.InboundTransportBase;
37 | import com.esri.ges.transport.TransportDefinition;
38 | import com.esri.ges.util.Validator;
39 |
40 | import twitter4j.FilterQuery;
41 | import twitter4j.RawStreamListener;
42 | import twitter4j.TwitterStream;
43 | import twitter4j.TwitterStreamFactory;
44 | import twitter4j.conf.ConfigurationBuilder;
45 |
46 | public class TwitterInboundTransport extends InboundTransportBase implements Runnable
47 | {
48 | public TwitterInboundTransport(TransportDefinition definition) throws ComponentException
49 | {
50 | super(definition);
51 | }
52 |
53 | static final private BundleLogger LOGGER = BundleLoggerFactory.getLogger(TwitterInboundTransport.class);
54 |
55 | private String consumerKey;
56 | private String consumerSecret;
57 | private String accessToken;
58 | private String accessTokenSecret;
59 |
60 | private long[] follows = null;
61 | private String[] tracks = null;
62 | private double[][] locations = null;
63 | private int count = -1;
64 |
65 | private String filterString;
66 | private TwitterStream twitterStream;
67 | private Thread thread = null;
68 |
69 | @Override
70 | public synchronized void start()
71 | {
72 | try
73 | {
74 | switch (getRunningState())
75 | {
76 | case STARTING:
77 | case STARTED:
78 | case STOPPING:
79 | return;
80 | }
81 | setRunningState(RunningState.STARTING);
82 | thread = new Thread(this);
83 | thread.start();
84 | }
85 | catch (Exception e)
86 | {
87 | LOGGER.error("UNEXPECTED_ERROR_STARTING", e);
88 | stop();
89 | }
90 | }
91 |
92 | @Override
93 | public synchronized void stop()
94 | {
95 | try
96 | {
97 | if (this.twitterStream != null)
98 | {
99 | twitterStream.cleanUp();
100 | twitterStream.shutdown();
101 | }
102 | }
103 | catch (Exception ex)
104 | {
105 | LOGGER.error("UNABLE_TO_CLOSE", ex);
106 | }
107 | setRunningState(RunningState.STOPPED);
108 | LOGGER.debug("INBOUND_STOP");
109 | }
110 |
111 | @Override
112 | public void validate()
113 | {
114 | LOGGER.debug("INBOUND_SKIP_VALIDATION");
115 | }
116 |
117 | public void applyProperties() throws Exception
118 | {
119 | if (getProperty(OAuth.CONSUMER_KEY).isValid())
120 | {
121 | String value = (String) getProperty(OAuth.CONSUMER_KEY).getValue();
122 | if (value.length() > 0)
123 | {
124 | consumerKey = cryptoService.decrypt(value);
125 | }
126 | }
127 |
128 | if (getProperty(OAuth.CONSUMER_SECRET).isValid())
129 | {
130 | String value = (String) getProperty(OAuth.CONSUMER_SECRET).getValue();
131 | if (value.length() > 0)
132 | {
133 | consumerSecret = cryptoService.decrypt(value);
134 | }
135 | }
136 |
137 | if (getProperty(OAuth.ACCESS_TOKEN).isValid())
138 | {
139 | String value = (String) getProperty(OAuth.ACCESS_TOKEN).getValue();
140 | if (value.length() > 0)
141 | {
142 | accessToken = cryptoService.decrypt(value);
143 | }
144 | }
145 |
146 | if (getProperty(OAuth.ACCESS_TOKEN_SECRET).isValid())
147 | {
148 | String value = (String) getProperty(OAuth.ACCESS_TOKEN_SECRET).getValue();
149 | if (value.length() > 0)
150 | {
151 | accessTokenSecret = cryptoService.decrypt(value);
152 | }
153 | }
154 |
155 | StringBuilder paramsStr = new StringBuilder();
156 | if (getProperty("follow").isValid())
157 | {
158 | String value = (String) getProperty("follow").getValue();
159 | if (StringUtils.isNotEmpty(value))
160 | {
161 | paramsStr.append("follow=" + value);
162 | String[] flwStrs = value.split(",");
163 | if (flwStrs.length > 0)
164 | {
165 | follows = new long[flwStrs.length];
166 | for (int i = 0; i < flwStrs.length; i++)
167 | {
168 | follows[i] = Long.parseLong(flwStrs[i].trim());
169 | }
170 | }
171 | }
172 | }
173 | if (getProperty("track").isValid())
174 | {
175 | String value = (String) getProperty("track").getValue();
176 | if (value.length() > 0)
177 | {
178 | if (paramsStr.length() > 0)
179 | {
180 | paramsStr.append("&");
181 | }
182 | paramsStr.append("track=" + value);
183 |
184 | tracks = value.split(",");
185 | for (int i = 0; i < tracks.length; i++)
186 | {
187 | tracks[i] = tracks[i].trim();
188 | }
189 | }
190 | }
191 | if (getProperty("locations").isValid())
192 | {
193 | String value = (String) getProperty("locations").getValue();
194 | if (value.length() > 0)
195 | {
196 | if (paramsStr.length() > 0)
197 | {
198 | paramsStr.append("&");
199 | }
200 | paramsStr.append("locations=" + value);
201 |
202 | String[] crdStrs = value.split(",");
203 | int length = crdStrs.length;
204 | // lengh should be multiple of 4
205 | if (length % 4 == 0)
206 | {
207 | int dimension = length / 2;
208 | locations = new double[dimension][2];
209 | for (int i = 0; i < dimension; i++)
210 | {
211 | for (int j = 0; j < 2; j++)
212 | {
213 | locations[i][j] = Double.parseDouble(crdStrs[i * 2 + j].trim());
214 | }
215 | }
216 | }
217 | }
218 | }
219 | // required elevated access to use
220 | if (getProperty("count").isValid())
221 | {
222 | Object prop = getProperty("count").getValue();
223 | count = (Integer) prop;
224 | if (count < -150000 || count > 150000)
225 | {
226 | LOGGER.error("INBOUND_COUNT_VALIDATION");
227 | }
228 | else
229 | {
230 | if (paramsStr.length() > 0)
231 | {
232 | paramsStr.append("&");
233 | }
234 | paramsStr.append("count=" + prop.toString());
235 | }
236 | }
237 | if (paramsStr.length() > 0)
238 | {
239 | filterString = paramsStr.toString();
240 | }
241 | }
242 |
243 | @Override
244 | public void run()
245 | {
246 | receiveData();
247 |
248 | }
249 |
250 | private void receiveData()
251 | {
252 | try
253 | {
254 | applyProperties();
255 | setRunningState(RunningState.STARTED);
256 |
257 | ConfigurationBuilder cb = new ConfigurationBuilder();
258 | cb.setDebugEnabled(true);
259 | cb.setOAuthConsumerKey(consumerKey);
260 | cb.setOAuthConsumerSecret(consumerSecret);
261 | cb.setOAuthAccessToken(accessToken);
262 | cb.setOAuthAccessTokenSecret(accessTokenSecret);
263 | twitterStream = new TwitterStreamFactory(cb.build()).getInstance();
264 |
265 | RawStreamListener rl = new RawStreamListener()
266 | {
267 |
268 | @Override
269 | public void onException(Exception ex)
270 | {
271 | LOGGER.error("INBOUND_TRANSPORT_RAW_STREAM_LISTERNER_EXCEPTION", ex.getMessage());
272 | }
273 |
274 | @Override
275 | public void onMessage(String rawString)
276 | {
277 | receive(rawString);
278 | }
279 | };
280 |
281 | FilterQuery fq = new FilterQuery();
282 |
283 | String keywords[] = tracks;
284 |
285 | if (follows != null && follows.length > 0)
286 | fq.follow(follows);
287 | else if (keywords != null && keywords.length > 0)
288 | fq.track(keywords);
289 | else if (locations != null)
290 | fq.locations(locations);
291 | else
292 | throw new Exception("INBOUND_TRANSPORT_NOFILTER_ERROR");
293 |
294 | fq.count(count);
295 |
296 | LOGGER.info("INBOUND_TRANSPORT_FILTER", filterString);
297 |
298 | twitterStream.addListener(rl);
299 | twitterStream.filter(fq);
300 |
301 | }
302 | catch (Throwable ex)
303 | {
304 | LOGGER.error("UNEXPECTED_ERROR", ex);
305 | setRunningState(RunningState.ERROR);
306 | }
307 | }
308 |
309 | private void receive(String tweet)
310 | {
311 | if (!Validator.isEmpty(tweet))
312 | {
313 | byte[] newBytes = tweet.getBytes();
314 |
315 | ByteBuffer bb = ByteBuffer.allocate(newBytes.length);
316 | try
317 | {
318 | bb.put(newBytes);
319 | bb.flip();
320 | byteListener.receive(bb, "");
321 | bb.clear();
322 | }
323 | catch (BufferOverflowException boe)
324 | {
325 | LOGGER.error("BUFFER_OVERFLOW_ERROR", boe);
326 | bb.clear();
327 | setRunningState(RunningState.ERROR);
328 | }
329 | catch (Exception e)
330 | {
331 | LOGGER.error("UNEXPECTED_ERROR2", e);
332 | stop();
333 | setRunningState(RunningState.ERROR);
334 | }
335 | }
336 | }
337 | }
338 |
--------------------------------------------------------------------------------
/twitter-transport/src/main/java/com/esri/geoevent/transport/twitter/TwitterInboundTransportService.java:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 1995-2013 Esri
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 |
16 | For additional information, contact:
17 | Environmental Systems Research Institute, Inc.
18 | Attn: Contracts Dept
19 | 380 New York Street
20 | Redlands, California, USA 92373
21 |
22 | email: contracts@esri.com
23 | */
24 |
25 | package com.esri.geoevent.transport.twitter;
26 |
27 | import com.esri.ges.core.component.ComponentException;
28 | import com.esri.ges.transport.Transport;
29 | import com.esri.ges.transport.TransportServiceBase;
30 | import com.esri.ges.transport.util.XmlTransportDefinition;
31 |
32 | public class TwitterInboundTransportService extends TransportServiceBase
33 | {
34 | public TwitterInboundTransportService()
35 | {
36 | super();
37 | definition = new XmlTransportDefinition(getResourceAsStream("twitter-inboundtransport-definition.xml"));
38 | }
39 |
40 | public Transport createTransport() throws ComponentException
41 | {
42 | return new TwitterInboundTransport(definition);
43 | }
44 |
45 | }
46 |
--------------------------------------------------------------------------------
/twitter-transport/src/main/java/com/esri/geoevent/transport/twitter/TwitterOutboundTransport.java:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 1995-2013 Esri
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 |
16 | For additional information, contact:
17 | Environmental Systems Research Institute, Inc.
18 | Attn: Contracts Dept
19 | 380 New York Street
20 | Redlands, California, USA 92373
21 |
22 | email: contracts@esri.com
23 | */
24 |
25 | package com.esri.geoevent.transport.twitter;
26 |
27 | import java.nio.ByteBuffer;
28 | import java.nio.charset.Charset;
29 | import java.nio.charset.CharsetDecoder;
30 | import java.nio.charset.CodingErrorAction;
31 | import java.nio.charset.StandardCharsets;
32 |
33 | import org.apache.http.HttpRequest;
34 |
35 | import com.esri.ges.core.component.ComponentException;
36 | import com.esri.ges.core.geoevent.GeoEvent;
37 | import com.esri.ges.framework.i18n.BundleLogger;
38 | import com.esri.ges.framework.i18n.BundleLoggerFactory;
39 | import com.esri.ges.transport.TransportContext;
40 | import com.esri.ges.transport.TransportDefinition;
41 | import com.esri.ges.transport.http.HttpOutboundTransport;
42 | import com.esri.ges.transport.http.HttpTransportContext;
43 |
44 | public class TwitterOutboundTransport extends HttpOutboundTransport
45 | {
46 | private static final BundleLogger LOGGER = BundleLoggerFactory.getLogger(TwitterOutboundTransport.class);
47 |
48 | private String consumerKey;
49 | private String consumerSecret;
50 | private String accessToken;
51 | private String accessTokenSecret;
52 | private String postBodyOrg;
53 | private CharsetDecoder decoder;
54 |
55 | public TwitterOutboundTransport(TransportDefinition definition) throws ComponentException
56 | {
57 | super(definition);
58 | decoder = createCharsetDecoder();
59 | }
60 |
61 | @Override
62 | public synchronized void start()
63 | {
64 | super.start();
65 | LOGGER.debug("OUTBOUND_START");
66 | }
67 |
68 | @Override
69 | public synchronized void stop()
70 | {
71 | super.stop();
72 | LOGGER.debug("OUTBOUND_STOP");
73 | }
74 |
75 | @Override
76 | public synchronized void setup()
77 | {
78 | super.setup();
79 | try
80 | {
81 | applyProperties();
82 | }
83 | catch (Exception error)
84 | {
85 | LOGGER.error("OUTBOUND_TRANSPORT_SETUP_ERROR", error.getMessage());
86 | LOGGER.info(error.getMessage(), error);
87 | }
88 | }
89 |
90 | @Override
91 | public void receive(ByteBuffer bb, String channelId, GeoEvent geoEvent)
92 | {
93 | receive(bb, channelId);
94 | }
95 |
96 | @Override
97 | public void receive(ByteBuffer bb, String channelId)
98 | {
99 | try
100 | {
101 | postBodyOrg = "status=" + decoder.decode(bb).toString();
102 | postBody = OAuth.encodePostBody(postBodyOrg);
103 | LOGGER.debug(postBody);
104 | doHttp(clientUrl);
105 | }
106 | catch (Exception e)
107 | {
108 | LOGGER.error("ERROR_SENDING_MSG", e);
109 | }
110 | }
111 |
112 | @Override
113 | public void beforeConnect(TransportContext context)
114 | {
115 | // String url = "https://api.twitter.com/1.1/statuses/update.json";
116 | HttpRequest request = ((HttpTransportContext) context).getHttpRequest();
117 |
118 | String authorizationHeader = OAuth.createOAuthAuthorizationHeader(clientUrl, httpMethod, postBodyOrg, accessToken, accessTokenSecret, consumerKey, consumerSecret);
119 |
120 | // log.debug(authorizationHeader);
121 | request.addHeader(OAuth.AUTHORIZATION, authorizationHeader);
122 | request.addHeader(OAuth.ACCEPT, OAuth.ACCEPT_VALUES);// "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
123 | request.setHeader(OAuth.CONTENT_TYPE, this.postBodyType);// "application/x-www-form-urlencoded"
124 | }
125 |
126 | @Override
127 | public void validate()
128 | {
129 | LOGGER.debug("OUTBOUND_SKIP_VALIDATION");
130 | }
131 |
132 | public void applyProperties() throws Exception
133 | {
134 | if (getProperty(OAuth.CONSUMER_KEY).isValid())
135 | {
136 | String value = (String) getProperty(OAuth.CONSUMER_KEY).getValue();
137 | if (value.length() > 0)
138 | {
139 | consumerKey = cryptoService.decrypt(value);
140 | }
141 | }
142 | if (getProperty(OAuth.CONSUMER_SECRET).isValid())
143 | {
144 | String value = (String) getProperty(OAuth.CONSUMER_SECRET).getValue();
145 | if (value.length() > 0)
146 | {
147 | consumerSecret = cryptoService.decrypt(value);
148 | }
149 | }
150 | if (getProperty(OAuth.ACCESS_TOKEN).isValid())
151 | {
152 | String value = (String) getProperty(OAuth.ACCESS_TOKEN).getValue();
153 | if (value.length() > 0)
154 | {
155 | accessToken = cryptoService.decrypt(value);
156 | }
157 | }
158 | if (getProperty(OAuth.ACCESS_TOKEN_SECRET).isValid())
159 | {
160 | String value = (String) getProperty(OAuth.ACCESS_TOKEN_SECRET).getValue();
161 | if (value.length() > 0)
162 | {
163 | accessTokenSecret = cryptoService.decrypt(value);
164 | }
165 | }
166 | }
167 |
168 | private CharsetDecoder createCharsetDecoder()
169 | {
170 | Charset charset = StandardCharsets.UTF_8;
171 | CharsetDecoder decoder = charset.newDecoder();
172 | decoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
173 | return decoder;
174 | }
175 | }
176 |
--------------------------------------------------------------------------------
/twitter-transport/src/main/java/com/esri/geoevent/transport/twitter/TwitterOutboundTransportService.java:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 1995-2013 Esri
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 |
16 | For additional information, contact:
17 | Environmental Systems Research Institute, Inc.
18 | Attn: Contracts Dept
19 | 380 New York Street
20 | Redlands, California, USA 92373
21 |
22 | email: contracts@esri.com
23 | */
24 |
25 | package com.esri.geoevent.transport.twitter;
26 |
27 | import com.esri.ges.core.component.ComponentException;
28 | import com.esri.ges.transport.Transport;
29 | import com.esri.ges.transport.http.HttpOutboundTransportService;
30 | import com.esri.ges.transport.util.XmlTransportDefinition;
31 |
32 | public class TwitterOutboundTransportService extends HttpOutboundTransportService
33 | {
34 | public TwitterOutboundTransportService()
35 | {
36 | super();
37 | definition = new XmlTransportDefinition(getResourceAsStream("twitter-outboundtransport-definition.xml"), super.definition);
38 | }
39 |
40 | @Override
41 | public Transport createTransport() throws ComponentException
42 | {
43 | return new TwitterOutboundTransport(definition);
44 | }
45 |
46 | }
47 |
--------------------------------------------------------------------------------
/twitter-transport/src/main/resources/OSGI-INF/blueprint/config.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
13 |
16 |
19 |
--------------------------------------------------------------------------------
/twitter-transport/src/main/resources/com/esri/geoevent/transport/twitter-transport.properties:
--------------------------------------------------------------------------------
1 | INVALID_ACCESS_TOKEN=Invalid access token format.
2 | INBOUND_START=Http-Oauth-Inbound started.
3 | INBOUND_STOP=Http-Oauth-Inbound stopped.
4 | INBOUND_SKIP_VALIDATION=Inbound Skip validation...
5 | INBOUND_ON_RECEIVE=onReceive
6 | INBOUND_COUNT_VALIDATION=Count value should be within -150000 to 150000
7 | OUTBOUND_START=Http-Oauth-Outbound started.
8 | OUTBOUND_STOP=Http-Oauth-Outbound stopped.
9 | OUTBOUND_SKIP_VALIDATION=Outbound Skip validation...
10 |
11 | INBOUND_TRANSPORT_DESC=Twitter Inbound HTTP Transport using Open Authentication.
12 | INBOUND_TRANSPORT_CONSUMER_KEY_LBL=Consumer Key
13 | INBOUND_TRANSPORT_CONSUMER_SECRET_LBL=Consumer Secret
14 | INBOUND_TRANSPORT_ACCESS_TOKEN_LBL=Access Token
15 | INBOUND_TRANSPORT_ACCESS_TOKEN_SECRET_LBL=Access Token Secret
16 | INBOUND_TRANSPORT_FOLLOW_LBL=Follow
17 | INBOUND_TRANSPORT_FOLLOW_DESC=A comma-separated list of user IDs.
18 | INBOUND_TRANSPORT_TRACK_LBL=Track
19 | INBOUND_TRANSPORT_TRACK_DESC=A comma-separated list of phrases.
20 | INBOUND_TRANSPORT_LOCATIONS_LBL=Locations
21 | INBOUND_TRANSPORT_LOCATIONS_DESC=A comma-separated list of (longitude,latitude) pairs indicating bounding boxes of locations (use ',' to seperate both the coordinate values and the bounding boxes.
22 | INBOUND_TRANSPORT_COUNT_LBL=Count
23 | INBOUND_TRANSPORT_COUNT_DESC=Number of backfill missed messages during disconnected. This parameter requires elevated access to use.
24 | INBOUND_TRANSPORT_SETUP_ERROR=An unexpected error has occurred while setting up the Inbound Twitter Adapter. Error: {0}.
25 | INBOUND_TRANSPORT_NOFILTER_ERROR=No Filter Defined.
26 | INBOUND_TRANSPORT_RAW_STREAM_LISTERNER_EXCEPTION=The RawStreamListener received an error. Error: {0}.
27 | INBOUND_TRANSPORT_FILTER=Filter: {0}.
28 |
29 | OUTBOUND_TRANSPORT_DESC=Twitter Outbound HTTP Transport using Open Authentication.
30 | OUTBOUND_TRANSPORT_CONSUMER_KEY_LBL=Consumer Key
31 | OUTBOUND_TRANSPORT_CONSUMER_SECRET_LBL=Consumer Secret
32 | OUTBOUND_TRANSPORT_ACCESS_TOKEN_LBL=Access Token
33 | OUTBOUND_TRANSPORT_ACCESS_TOKEN_SECRET_LBL=Access Token Secret
34 | OUTBOUND_TRANSPORT_SETUP_ERROR=An unexpected error has occurred while setting up the Outbound Twitter Adapter. Error: {0}.
35 | OUTBOUND_TRANSPORT_ERROR_SENDING_MSG=Error Sending Message.
--------------------------------------------------------------------------------
/twitter-transport/src/main/resources/com/esri/geoevent/transport/twitter-transport_ar.properties:
--------------------------------------------------------------------------------
1 | INVALID_ACCESS_TOKEN = \u0648\u0635\u0648\u0644 \u063A\u064A\u0631 \u0635\u0627\u0644\u062D \u0635\u064A\u063A\u0629 \u0631\u0645\u0632\u064A\u0629.\u0627\u0644\u062A\u064A
2 | INBOUND_START = \u0627\u0644\u0645\u062A\u0634\u0639\u0628 - \u0623\u0648\u062B - \u0627\u0644\u062F\u0627\u062E\u0644. \u062A\u0648\u0642\u0641\u062A
3 | INBOUND_STOP = \u0627\u0644\u0645\u062A\u0634\u0639\u0628 - \u0623\u0648\u062B - \u0627\u0644\u062F\u0627\u062E\u0644.
4 | INBOUND_SKIP_VALIDATION = \u0627\u0644\u0645\u0635\u0627\u062F\u0642\u0629 \u0627\u0644\u0648\u0627\u0631\u062F\u0629 \u062A\u062E\u0637\u064A ...
5 | INBOUND_ON_RECEIVE = onReceive \u0648\u064A\u0646\u0628\u063A\u064A \u0623\u0646 \u064A\u0643\u0648\u0646
6 | INBOUND_COUNT_VALIDATION = \u0642\u064A\u0645\u0629 \u0639\u062F\u062F \u062F\u0627\u062E\u0644 -150\u066C000-150000\u0627\u0644\u062A\u064A
7 | OUTBOUND_START = \u0627\u0644\u0645\u062A\u0634\u0639\u0628 - \u0623\u0648\u062B - \u0627\u0644\u0635\u0627\u062F\u0631\u0629. \u062A\u0648\u0642\u0641\u062A
8 | OUTBOUND_STOP = \u0627\u0644\u0645\u062A\u0634\u0639\u0628 - \u0623\u0648\u062B - \u0627\u0644\u0635\u0627\u062F\u0631\u0629.
9 |
10 | INBOUND_TRANSPORT_DESC = \u062A\u0648\u064A\u062A\u0631 \u0627\u0644\u0648\u0627\u0631\u062F\u0629 HTTP \u0627\u0644\u0646\u0642\u0644 \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0645\u0635\u0627\u062F\u0642\u0629 \u0641\u062A\u062D.
11 | INBOUND_TRANSPORT_CONSUMER_KEY_LBL = \u0645\u0641\u062A\u0627\u062D \u0627\u0644\u0645\u0633\u062A\u0647\u0644\u0643
12 | INBOUND_TRANSPORT_CONSUMER_SECRET_LBL = \u0627\u0644\u0645\u0633\u062A\u0647\u0644\u0643 \u0627\u0644\u0633\u0631\u064A\u0629
13 | INBOUND_TRANSPORT_ACCESS_TOKEN_LBL = \u0631\u0645\u0632 \u0648\u0635\u0648\u0644
14 | INBOUND_TRANSPORT_ACCESS_TOKEN_SECRET_LBL = \u0631\u0645\u0632 \u0648\u0635\u0648\u0644 \u0627\u0644\u0633\u0631\u064A\u0629
15 | INBOUND_TRANSPORT_FOLLOW_LBL = \u0645\u062A\u0627\u0628\u0639\u0629
16 | INBOUND_TRANSPORT_FOLLOW_DESC = \u0642\u0627\u0626\u0645\u0629 \u0645\u0641\u0635\u0648\u0644\u0629 \u0628\u0641\u0648\u0627\u0635\u0644 \u0645\u0646 \u0647\u0648\u064A\u0629 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645 .
17 | INBOUND_TRANSPORT_TRACK_LBL = \u0627\u0644\u0645\u0633\u0627\u0631
18 | INBOUND_TRANSPORT_TRACK_DESC = \u0642\u0627\u0626\u0645\u0629 \u0645\u0641\u0635\u0648\u0644\u0629 \u0628\u0641\u0648\u0627\u0635\u0644 \u0645\u0646 \u0627\u0644\u0639\u0628\u0627\u0631\u0627\u062A.
19 | INBOUND_TRANSPORT_LOCATIONS_LBL = \u0627\u0644\u0645\u0648\u0627\u0642\u0639
20 | INBOUND_TRANSPORT_LOCATIONS_DESC = \u0642\u0627\u0626\u0645\u0629 \u0645\u0641\u0635\u0648\u0644\u0629 \u0628\u0641\u0648\u0627\u0635\u0644 ( \u0627\u0644\u0637\u0648\u0644 \u0648\u0627\u0644\u0639\u0631\u0636 ) \u0623\u0632\u0648\u0627\u062C \u0645\u0634\u064A\u0631\u0627 \u0625\u0644\u0649 \u0645\u0631\u0628\u0639\u0627\u062A \u0625\u062D\u0627\u0637\u0629 \u0645\u0646 \u0627\u0644\u0645\u0648\u0627\u0642\u0639 (\u0627\u0633\u062A\u062E\u062F\u0627\u0645 '\u060C' \u0644\u0641\u0635\u0644 \u0643\u0644 \u0645\u0646 \u062A\u0646\u0633\u064A\u0642 \u0627\u0644\u0642\u064A\u0645 \u0648 \u0635\u0646\u0627\u062F\u064A\u0642 \u0627\u0644\u0645\u062D\u064A\u0637.
21 | INBOUND_TRANSPORT_COUNT_LBL = \u0639\u062F\u062F
22 | INBOUND_TRANSPORT_COUNT_DESC = \u0639\u062F\u062F \u0627\u0644\u0631\u062F\u0645 \u063A\u0627\u0628 \u0627\u0644\u0631\u0633\u0627\u0626\u0644 \u0623\u062B\u0646\u0627\u0621 \u0642\u0637\u0639 \u0627\u0644\u0627\u062A\u0635\u0627\u0644. \u0647\u0630\u0647 \u0627\u0644\u0645\u0639\u0644\u0645\u0629 \u064A\u062A\u0637\u0644\u0628 \u0627\u0644\u0648\u0635\u0648\u0644 \u0645\u0631\u062A\u0641\u0639\u0629 \u0644 \u0627\u0633\u062A\u062E\u062F\u0627\u0645 .
23 |
24 | OUTBOUND_TRANSPORT_DESC = \u062A\u0648\u064A\u062A\u0631 \u0627\u0644\u0635\u0627\u062F\u0631\u0629 HTTP \u0627\u0644\u0646\u0642\u0644 \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0645\u0635\u0627\u062F\u0642\u0629 \u0641\u062A\u062D.
25 | OUTBOUND_TRANSPORT_CONSUMER_KEY_LBL = \u0645\u0641\u062A\u0627\u062D \u0627\u0644\u0645\u0633\u062A\u0647\u0644\u0643
26 | OUTBOUND_TRANSPORT_CONSUMER_SECRET_LBL = \u0627\u0644\u0645\u0633\u062A\u0647\u0644\u0643 \u0627\u0644\u0633\u0631\u064A\u0629
27 | OUTBOUND_TRANSPORT_ACCESS_TOKEN_LBL = \u0631\u0645\u0632 \u0648\u0635\u0648\u0644
28 | OUTBOUND_TRANSPORT_ACCESS_TOKEN_SECRET_LBL = \u0631\u0645\u0632 \u0648\u0635\u0648\u0644 \u0627\u0644\u0633\u0631\u064A\u0629
--------------------------------------------------------------------------------
/twitter-transport/src/main/resources/com/esri/geoevent/transport/twitter-transport_it.properties:
--------------------------------------------------------------------------------
1 | INVALID_ACCESS_TOKEN = accesso non valido in formato token.
2 | INBOUND_START = Http - Oauth - Inbound avviato.
3 | INBOUND_STOP = Http - Oauth - Inbound fermato .
4 | INBOUND_SKIP_VALIDATION = convalida Inbound Skip ...
5 | INBOUND_ON_RECEIVE = OnReceive
6 | INBOUND_COUNT_VALIDATION = Valore di conteggio deve essere compresa tra -150.000-150,000
7 | OUTBOUND_START = Http - Oauth - uscita avviato.
8 | OUTBOUND_STOP = Http - Oauth - uscita fermato .
9 |
10 | INBOUND_TRANSPORT_DESC = Twitter trasporto in entrata HTTP con autenticazione aperta .
11 | INBOUND_TRANSPORT_CONSUMER_KEY_LBL = Chiave dei consumatori
12 | INBOUND_TRANSPORT_CONSUMER_SECRET_LBL = Segreto dei consumatori
13 | INBOUND_TRANSPORT_ACCESS_TOKEN_LBL = token di accesso
14 | INBOUND_TRANSPORT_ACCESS_TOKEN_SECRET_LBL = token di accesso segreto
15 | INBOUND_TRANSPORT_FOLLOW_LBL = Seguire
16 | INBOUND_TRANSPORT_FOLLOW_DESC = Un elenco separato da virgole di ID utente .
17 | INBOUND_TRANSPORT_TRACK_LBL = Traccia
18 | INBOUND_TRANSPORT_TRACK_DESC = Un elenco separato da virgole di frasi .
19 | INBOUND_TRANSPORT_LOCATIONS_LBL = Locations
20 | INBOUND_TRANSPORT_LOCATIONS_DESC = Un elenco separato da virgole di ( longitudine , latitudine ) coppie che indicano riquadri di delimitazione delle posizioni (uso ',' per separare sia i valori delle coordinate e le scatole di delimitazione .
21 | INBOUND_TRANSPORT_COUNT_LBL = Conte
22 | INBOUND_TRANSPORT_COUNT_DESC = Numero di recupero mancati messaggi durante disconnesso . Questo parametro richiede elevata accesso all'uso .
23 |
24 | OUTBOUND_TRANSPORT_DESC = Twitter uscita Transport HTTP mediante autenticazione aperta .
25 | OUTBOUND_TRANSPORT_CONSUMER_KEY_LBL = Chiave dei consumatori
26 | OUTBOUND_TRANSPORT_CONSUMER_SECRET_LBL = Segreto dei consumatori
27 | OUTBOUND_TRANSPORT_ACCESS_TOKEN_LBL = token di accesso
28 | OUTBOUND_TRANSPORT_ACCESS_TOKEN_SECRET_LBL = token di accesso segreto
--------------------------------------------------------------------------------
/twitter-transport/src/main/resources/com/esri/geoevent/transport/twitter-transport_ja.properties:
--------------------------------------------------------------------------------
1 | INVALID_ACCESS_TOKEN=\u306F\u7121\u52B9\u306A\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u5F62\u5F0F\u3092\u3002
2 | INBOUND_START = HTTP- OAuth\u306E\u30A4\u30F3\u30D0\u30A6\u30F3\u30C9\u304C\u958B\u59CB\u3055\u308C\u307E\u3057\u305F\u3002
3 | INBOUND_STOP = HTTP- OAuth\u306E\u30A4\u30F3\u30D0\u30A6\u30F3\u30C9\u304C\u505C\u6B62\u3057\u307E\u3057\u305F\u3002
4 | INBOUND_SKIP_VALIDATION =\u30A4\u30F3\u30D0\u30A6\u30F3\u30C9\u30B9\u30AD\u30C3\u30D7\u691C\u8A3C...
5 | INBOUND_ON_RECEIVE = onReceive
6 | INBOUND_COUNT_VALIDATION =\u30AB\u30A6\u30F3\u30C8\u5024\u304C150000\u306B-150000\u5185\u3067\u306A\u3051\u308C\u3070\u306A\u3089\u306A\u3044
7 | OUTBOUND_START = HTTP- OAuth\u3092\u3001\u767A\u4FE1\u304C\u958B\u59CB\u3055\u308C\u307E\u3057\u305F\u3002
8 | OUTBOUND_STOP = HTTP- OAuth\u3092\u3001\u767A\u4FE1\u304C\u505C\u6B62\u3057\u307E\u3057\u305F\u3002\u30AA\u30FC\u30D7\u30F3\u8A8D\u8A3C\u3092\u4F7F\u7528\u3057\u3066
9 |
10 | INBOUND_TRANSPORT_DESC = Twitter\u306E\u30A4\u30F3\u30D0\u30A6\u30F3\u30C9HTTP\u30C8\u30E9\u30F3\u30B9\u30DD\u30FC\u30C8\u3002
11 | INBOUND_TRANSPORT_CONSUMER_KEY_LBL =\u30B3\u30F3\u30B7\u30E5\u30FC\u30DE\u30AD\u30FC
12 | INBOUND_TRANSPORT_CONSUMER_SECRET_LBL =\u6D88\u8CBB\u8005\u306E\u79D8\u5BC6
13 | INBOUND_TRANSPORT_ACCESS_TOKEN_LBL =\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3
14 | INBOUND_TRANSPORT_ACCESS_TOKEN_SECRET_LBL =\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u30B7\u30FC\u30AF\u30EC\u30C3\u30C8
15 | INBOUND_TRANSPORT_FOLLOW_LBL =\u30D5\u30A9\u30ED\u30FC
16 | INBOUND_TRANSPORT_FOLLOW_DESC=\u306F\u3001\u30E6\u30FC\u30B6\u30FCID\u306E\u30AB\u30F3\u30DE\u533A\u5207\u308A\u306E\u30EA\u30B9\u30C8\u3092\u3002
17 | INBOUND_TRANSPORT_TRACK_LBL =\u30C8\u30E9\u30C3\u30AF
18 | INBOUND_TRANSPORT_TRACK_DESC=\u30D5\u30EC\u30FC\u30BA\u306E\u30AB\u30F3\u30DE\u533A\u5207\u308A\u30EA\u30B9\u30C8\u3092\u3002
19 | INBOUND_TRANSPORT_LOCATIONS_LBL=\u306F\u5834\u6240
20 | INBOUND_TRANSPORT_LOCATIONS_DESC=\u306F\u5EA7\u6A19\u5024\u3068\u30D0\u30A6\u30F3\u30C7\u30A3\u30F3\u30B0\u30DC\u30C3\u30AF\u30B9\u306E\u4E21\u65B9\u3092\u5225\u3005\u306E\u305F\u3081\u306E\u5834\u6240\u306E\u5883\u754C\u30DC\u30C3\u30AF\u30B9\uFF08\u4F7F\u7528\u3092\u793A\u3059\uFF08\u7D4C\u5EA6\u3001\u7DEF\u5EA6\uFF09\u306E\u30DA\u30A2'\u3001 '\u306E\u30AB\u30F3\u30DE\u533A\u5207\u308A\u30EA\u30B9\u30C8\u3092\u3002
21 | INBOUND_TRANSPORT_COUNT_LBL =\u30AB\u30A6\u30F3\u30C8\u57CB\u3081\u623B\u3057\u306E
22 | INBOUND_TRANSPORT_COUNT_DESC =\u6570\u306F\u3001\u5207\u65AD\u4E2D\u306B\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u9003\u3057\u305F\u3002\u3053\u306E\u30D1\u30E9\u30E1\u30FC\u30BF\u306F\u3001\u4F7F\u7528\u3059\u308B\u9AD8\u67B6\u30A2\u30AF\u30BB\u30B9\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002\u30AA\u30FC\u30D7\u30F3\u8A8D\u8A3C\u3092\u4F7F\u7528\u3057\u3066OUTBOUND_TRANSPORT_DESC = Twitter\u3067\u767A\u4FE1HTTP\u30C8\u30E9\u30F3\u30B9\u30DD\u30FC\u30C8\u3002
23 |
24 | OUTBOUND_TRANSPORT_CONSUMER_KEY_LBL =\u30B3\u30F3\u30B7\u30E5\u30FC\u30DE\u30AD\u30FC
25 | OUTBOUND_TRANSPORT_CONSUMER_SECRET_LBL =\u6D88\u8CBB\u8005\u306E\u79D8\u5BC6
26 | OUTBOUND_TRANSPORT_ACCESS_TOKEN_LBL =\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3
27 | OUTBOUND_TRANSPORT_ACCESS_TOKEN_SECRET_LBL =\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u30B7\u30FC\u30AF\u30EC\u30C3\u30C8
--------------------------------------------------------------------------------
/twitter-transport/src/main/resources/com/esri/geoevent/transport/twitter-transport_pt_BR.properties:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Esri/twitter-for-geoevent/cce14886de7ab6f93b4f03eb36011fc4363baa21/twitter-transport/src/main/resources/com/esri/geoevent/transport/twitter-transport_pt_BR.properties
--------------------------------------------------------------------------------
/twitter-transport/src/main/resources/com/esri/geoevent/transport/twitter-transport_ru.properties:
--------------------------------------------------------------------------------
1 | INVALID_ACCESS_TOKEN = \u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0434\u043E\u0441\u0442\u0443\u043F\u0430 \u0444\u043E\u0440\u043C\u0430\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 .
2 | INBOUND_START = Http - OAuth - \u0412\u0445\u043E\u0434\u044F\u0449\u0438\u0439 \u043D\u0430\u0447\u0430\u043B .
3 | INBOUND_STOP = Http - OAuth - \u0412\u0445\u043E\u0434\u044F\u0449\u0438\u0439 \u043E\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u043B\u0441\u044F .
4 | INBOUND_SKIP_VALIDATION = \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0432\u0445\u043E\u0434\u044F\u0449\u0438\u0445 \u041F\u0440\u043E\u043F\u0443\u0441\u0442\u0438\u0442\u044C ...
5 | INBOUND_ON_RECEIVE = OnReceive
6 | INBOUND_COUNT_VALIDATION = \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0413\u0440\u0430\u0444 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u0432 \u043F\u0440\u0435\u0434\u0435\u043B\u0430\u0445 -150000 \u0434\u043E 150000
7 | OUTBOUND_START = Http - OAuth - \u0438\u0441\u0445\u043E\u0434\u044F\u0449\u0438\u0445 \u043D\u0430\u0447\u0430\u043B .
8 | OUTBOUND_STOP = Http - OAuth - \u0438\u0441\u0445\u043E\u0434\u044F\u0449\u0438\u0445 \u043E\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u043B\u0441\u044F .
9 |
10 | INBOUND_TRANSPORT_DESC = Twitter \u0412\u0445\u043E\u0434\u044F\u0449\u0438\u0439 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430 HTTP , \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044F \u043E\u0442\u043A\u0440\u044B\u0442\u0443\u044E \u0430\u0443\u0442\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044E .
11 | INBOUND_TRANSPORT_CONSUMER_KEY_LBL = \u041F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0439 \u043A\u043B\u044E\u0447
12 | INBOUND_TRANSPORT_CONSUMER_SECRET_LBL = \u041F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0435 \u0421\u0435\u043A\u0440\u0435\u0442
13 | INBOUND_TRANSPORT_ACCESS_TOKEN_LBL = \u043C\u0430\u0440\u043A\u0435\u0440 \u0434\u043E\u0441\u0442\u0443\u043F\u0430
14 | INBOUND_TRANSPORT_ACCESS_TOKEN_SECRET_LBL = \u043C\u0430\u0440\u043A\u0435\u0440 \u0434\u043E\u0441\u0442\u0443\u043F\u0430 Secret
15 | INBOUND_TRANSPORT_FOLLOW_LBL = \u041E\u0442\u0441\u043B\u0435\u0436\u0438\u0432\u0430\u0442\u044C
16 | INBOUND_TRANSPORT_FOLLOW_DESC = A , \u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0445 \u0437\u0430\u043F\u044F\u0442\u044B\u043C\u0438 \u0441\u043F\u0438\u0441\u043E\u043A \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440\u043E\u0432 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439 .
17 | INBOUND_TRANSPORT_TRACK_LBL = \u0442\u0440\u0435\u043A
18 | INBOUND_TRANSPORT_TRACK_DESC = A , \u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0445 \u0437\u0430\u043F\u044F\u0442\u044B\u043C\u0438 \u0441\u043F\u0438\u0441\u043E\u043A \u0444\u0440\u0430\u0437 .
19 | INBOUND_TRANSPORT_LOCATIONS_LBL = \u041C\u0435\u0441\u0442\u0430
20 | INBOUND_TRANSPORT_LOCATIONS_DESC = A , \u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0445 \u0437\u0430\u043F\u044F\u0442\u044B\u043C\u0438 \u0441\u043F\u0438\u0441\u043E\u043A ( \u0434\u043E\u043B\u0433\u043E\u0442\u0430, \u0448\u0438\u0440\u043E\u0442\u0430 ) \u043F\u0430\u0440 \u0441 \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0435\u043C \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0438\u0432\u0430\u044E\u0449\u0438\u0435 \u0440\u0430\u043C\u043A\u0438 \u043C\u0435\u0441\u0442\u0430\u0445 (\u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 ' ,' \u043E\u0442\u0434\u0435\u043B\u0438\u0442\u044C \u043E\u0431\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F \u043A\u043E\u043E\u0440\u0434\u0438\u043D\u0430\u0442 \u0438 \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0438\u0432\u0430\u044E\u0449\u0438\u0435 \u0440\u0430\u043C\u043A\u0438 .
21 | INBOUND_TRANSPORT_COUNT_LBL = \u0413\u0440\u0430\u0444
22 | INBOUND_TRANSPORT_COUNT_DESC = \u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0437\u0430\u0441\u044B\u043F\u043A\u0438 \u043F\u0440\u043E\u043F\u0443\u0441\u0442\u0438\u043B \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D. \u042D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u043F\u043E\u0432\u044B\u0448\u0435\u043D\u043D\u044B\u0439 \u0434\u043E\u0441\u0442\u0443\u043F \u043A \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044E .
23 |
24 | OUTBOUND_TRANSPORT_DESC = Twitter \u0418\u0441\u0445\u043E\u0434\u044F\u0449\u0438\u0439 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430 HTTP , \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044F \u043E\u0442\u043A\u0440\u044B\u0442\u0443\u044E \u0430\u0443\u0442\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044E .
25 | OUTBOUND_TRANSPORT_CONSUMER_KEY_LBL = \u041F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0439 \u043A\u043B\u044E\u0447
26 | OUTBOUND_TRANSPORT_CONSUMER_SECRET_LBL = \u041F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0435 \u0421\u0435\u043A\u0440\u0435\u0442
27 | OUTBOUND_TRANSPORT_ACCESS_TOKEN_LBL = \u043C\u0430\u0440\u043A\u0435\u0440 \u0434\u043E\u0441\u0442\u0443\u043F\u0430
28 | OUTBOUND_TRANSPORT_ACCESS_TOKEN_SECRET_LBL = \u043C\u0430\u0440\u043A\u0435\u0440 \u0434\u043E\u0441\u0442\u0443\u043F\u0430 Secret
--------------------------------------------------------------------------------
/twitter-transport/src/main/resources/com/esri/geoevent/transport/twitter-transport_tr.properties:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Esri/twitter-for-geoevent/cce14886de7ab6f93b4f03eb36011fc4363baa21/twitter-transport/src/main/resources/com/esri/geoevent/transport/twitter-transport_tr.properties
--------------------------------------------------------------------------------
/twitter-transport/src/main/resources/com/esri/geoevent/transport/twitter-transport_zh_CN.properties:
--------------------------------------------------------------------------------
1 | INVALID_ACCESS_TOKEN =\u65E0\u6548\u7684\u8BBF\u95EE\u4EE4\u724C\u683C\u5F0F\u3002
2 | INBOUND_START =\u7F51\u5740 - \u652F\u6301OAuth\u7684\u5165\u7AD9\u5F00\u59CB\u3002
3 | INBOUND_STOP =\u7F51\u5740 - \u652F\u6301OAuth\u7684\u5165\u7AD9\u505C\u4E86\u4E0B\u6765\u3002
4 | INBOUND_SKIP_VALIDATION =\u5165\u7AD9\u8DF3\u8FC7\u9A8C\u8BC1...
5 | INBOUND_ON_RECEIVE =\u7684OnReceive
6 | INBOUND_COUNT_VALIDATION =\u8BA1\u6570\u503C\u5E94\u5728-150000\u5230150000
7 | OUTBOUND_START =\u7F51\u5740 - \u652F\u6301OAuth\u7684\u51FA\u7AD9\u542F\u52A8\u3002
8 | OUTBOUND_STOP =\u7F51\u5740 - \u652F\u6301OAuth\u7684\u51FA\u7AD9\u505C\u4E86\u4E0B\u6765\u3002
9 |
10 | INBOUND_TRANSPORT_DESC = Twitter\u7684\u5165\u7AD9HTTP\u4F20\u8F93\u91C7\u7528\u5F00\u653E\u5F0F\u8BA4\u8BC1\u3002
11 | INBOUND_TRANSPORT_CONSUMER_KEY_LBL =\u6D88\u8D39\u91CD\u70B9
12 | INBOUND_TRANSPORT_CONSUMER_SECRET_LBL =\u6D88\u8D39\u8005\u63ED\u79D8
13 | INBOUND_TRANSPORT_ACCESS_TOKEN_LBL =\u8BBF\u95EE\u4EE4\u724C
14 | INBOUND_TRANSPORT_ACCESS_TOKEN_SECRET_LBL =\u8BBF\u95EE\u4EE4\u724C\u79D8\u5BC6
15 | INBOUND_TRANSPORT_FOLLOW_LBL =\u8DDF\u968F
16 | INBOUND_TRANSPORT_FOLLOW_DESC =\u7528\u6237ID\u7684\u9017\u53F7\u5206\u9694\u7684\u5217\u8868\u3002
17 | INBOUND_TRANSPORT_TRACK_LBL =\u66F2\u76EE
18 | INBOUND_TRANSPORT_TRACK_DESC =\u77ED\u8BED\u7528\u9017\u53F7\u5206\u9694\u7684\u5217\u8868\u3002
19 | INBOUND_TRANSPORT_LOCATIONS_LBL =\u4F4D\u7F6E
20 | INBOUND_TRANSPORT_LOCATIONS_DESC =\u7684\uFF08\u7ECF\u5EA6\uFF0C\u7EAC\u5EA6\uFF09\u5BF9\u663E\u793A\u4F4D\u7F6E\u7684\u8FB9\u754C\u6846\uFF08\u4F7F\u7528'\uFF0C'\u8981\u5206\u5F00\u4E24\u4E2A\u5750\u6807\u503C\u548C\u8FB9\u6846\u7684\u9017\u53F7\u5206\u9694\u7684\u5217\u8868\u3002
21 | INBOUND_TRANSPORT_COUNT_LBL =\u8BA1\u6570\u56DE\u586B
22 | INBOUND_TRANSPORT_COUNT_DESC =\u6570\u5728\u65AD\u5F00\u9519\u8FC7\u7684\u6D88\u606F\u3002\u6B64\u53C2\u6570\u9700\u8981\u63D0\u5347\u7684\u8BBF\u95EE\u4F7F\u7528\u3002
23 |
24 | OUTBOUND_TRANSPORT_DESC = Twitter\u7684\u51FA\u7AD9HTTP\u4F20\u8F93\u91C7\u7528\u5F00\u653E\u5F0F\u8BA4\u8BC1\u3002
25 | OUTBOUND_TRANSPORT_CONSUMER_KEY_LBL =\u6D88\u8D39\u91CD\u70B9
26 | OUTBOUND_TRANSPORT_CONSUMER_SECRET_LBL =\u6D88\u8D39\u8005\u63ED\u79D8
27 | OUTBOUND_TRANSPORT_ACCESS_TOKEN_LBL =\u8BBF\u95EE\u4EE4\u724C
28 | OUTBOUND_TRANSPORT_ACCESS_TOKEN_SECRET_LBL =\u8BBF\u95EE\u4EE4\u724C\u79D8\u5BC6
--------------------------------------------------------------------------------
/twitter-transport/src/main/resources/twitter-inboundtransport-definition.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | ${com.esri.geoevent.transport.twitter-transport.INBOUND_TRANSPORT_DESC}
5 |
6 |
7 |
11 |
15 |
19 |
23 |
27 |
31 |
35 |
39 |
40 |
--------------------------------------------------------------------------------
/twitter-transport/src/main/resources/twitter-outboundtransport-definition.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | ${com.esri.geoevent.transport.twitter-transport.OUTBOUND_TRANSPORT_DESC}
5 |
6 |
7 |
11 |
15 |
19 |
23 |
24 |
--------------------------------------------------------------------------------