-
Notifications
You must be signed in to change notification settings - Fork 14
/
ScalatraBootstrap.scala
264 lines (242 loc) · 14 KB
/
ScalatraBootstrap.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
import fi.oph.koski.cache.CacheServlet
import fi.oph.koski.config.{Environment, KoskiApplication, RunMode}
import fi.oph.koski.documentation.{DocumentationApiServlet, DocumentationServlet, KoodistoServlet}
import fi.oph.koski.editor.{EditorKooditServlet, EditorServlet}
import fi.oph.koski.opensearch.OpenSearchServlet
import fi.oph.koski.etk.ElaketurvakeskusServlet
import fi.oph.koski.executors.GlobalExecutionContext
import fi.oph.koski.fixture.FixtureServlet
import fi.oph.koski.frontendvalvonta.{FrontendValvontaMode, FrontendValvontaRaportointiServlet}
import fi.oph.koski.hakemuspalvelu.HakemuspalveluServlet
import fi.oph.koski.healthcheck.{HealthCheckApiServlet, HealthCheckHtmlServlet}
import fi.oph.koski.henkilo.HenkilötiedotServlet
import fi.oph.koski.history.KoskiHistoryServlet
import fi.oph.koski.jsonschemaviewer.JsonSchemaViewerHtmlServlet
import fi.oph.koski.kela.KelaServlet
import fi.oph.koski.koskiuser._
import fi.oph.koski.massaluovutus.MassaluovutusServlet
import fi.oph.koski.localization.KoskiSpecificLocalizationServlet
import fi.oph.koski.log.Logging
import fi.oph.koski.luovutuspalvelu.{PalveluvaylaServlet, TilastokeskusServlet}
import fi.oph.koski.migri.MigriServlet
import fi.oph.koski.mydata.{MyDataReactServlet, MyDataServlet}
import fi.oph.koski.omadataoauth2.{OmaDataOAuth2AuthorizationServerServlet, OmaDataOAuth2CASWorkaroundServlet, OmaDataOAuth2DiscoveryServlet, OmaDataOAuth2LogoutPostResponseServlet, OmaDataOAuth2PostResponseDebugServlet, OmaDataOAuth2ResourceOwnerReactServlet, OmaDataOAuth2ResourceOwnerServlet, OmaDataOAuth2ResourceServerServlet}
import fi.oph.koski.omaopintopolkuloki.OmaOpintoPolkuLokiServlet
import fi.oph.koski.omattiedot.{OmatTiedotHtmlServlet, OmatTiedotServlet, OmatTiedotServletV2}
import fi.oph.koski.opiskeluoikeus.{OpiskeluoikeusServlet, OpiskeluoikeusValidationServlet}
import fi.oph.koski.oppija.OppijaServlet
import fi.oph.koski.oppilaitos.OppilaitosServlet
import fi.oph.koski.oppivelvollisuustieto.OppivelvollisuustietoServlet
import fi.oph.koski.organisaatio.OrganisaatioServlet
import fi.oph.koski.permission.PermissionCheckServlet
import fi.oph.koski.perustiedot.OpiskeluoikeudenPerustiedotServlet
import fi.oph.koski.preferences.PreferencesServlet
import fi.oph.koski.pulssi.{PulssiHtmlServlet, PulssiServlet}
import fi.oph.koski.raamit.RaamiProxyServlet
import fi.oph.koski.raportit.RaportitServlet
import fi.oph.koski.raportointikanta.{RaportointikantaService, RaportointikantaStatusServlet, RaportointikantaTestServlet}
import fi.oph.koski.servlet._
import fi.oph.koski.sso.{CasServlet, LocalLoginServlet, SSOConfig}
import fi.oph.koski.suoritusjako.{SuoritusjakoServlet, SuoritusjakoServletV2, SuoritusjakoServletV3}
import fi.oph.koski.suostumus.SuostumuksenPeruutusServlet
import fi.oph.koski.sure.SureServlet
import fi.oph.koski.tiedonsiirto.TiedonsiirtoServlet
import fi.oph.koski.tutkinto.TutkinnonPerusteetServlet
import fi.oph.koski.typemodel.{LocalDevOnlyTypeModelServlet, TypeModelServlet}
import fi.oph.koski.util.{Futures, Timing}
import fi.oph.koski.valpas.kela.ValpasKelaServlet
import fi.oph.koski.valpas.valpasuser.ValpasLogoutServlet
import fi.oph.koski.valpas._
import fi.oph.koski.valpas.kansalainen.ValpasKansalainenApiServlet
import fi.oph.koski.valpas.kuntailmoitus.ValpasKuntailmoitusApiServlet
import fi.oph.koski.valpas.oppija.OppivelvollisuudestaVapautusServlet
import fi.oph.koski.valpas.rouhinta.ValpasRouhintaApiServlet
import fi.oph.koski.valpas.sso.ValpasOppijaCasServlet
import fi.oph.koski.valpas.ytl.ValpasYtlServlet
import fi.oph.koski.valvira.ValviraServlet
import fi.oph.koski.vkt.VktServlet
import fi.oph.koski.ytl.YtlServlet
import fi.oph.koski.ytr.download.{YtrDownloadService, YtrStatusServlet, YtrTestServlet}
import fi.oph.koski.ytr.{YoTodistusServlet, YtrKoesuoritusApiServlet, YtrKoesuoritusServlet}
import javax.servlet.ServletContext
import org.scalatra._
import scala.concurrent.Future
class ScalatraBootstrap extends LifeCycle with Logging with Timing with GlobalExecutionContext {
override def init(context: ServletContext): Unit = try {
val application = Option(context.getAttribute("koski.application").asInstanceOf[KoskiApplication]).getOrElse(KoskiApplication.apply)
RunMode.get match {
case RunMode.NORMAL => initKoskiServices(context)(application)
case RunMode.GENERATE_RAPORTOINTIKANTA => generateRaportointikanta(application)
case RunMode.YTR_DOWNLOAD => downloadYtr(application)
}
} catch {
case e: Exception =>
logger.error(e)("Server startup failed: " + e.getMessage)
System.exit(1)
}
private def initKoskiServices(context: ServletContext)(implicit application: KoskiApplication): Unit = {
def mount(path: String, handler: Handler): Unit = context.mount(handler, path)
val initTasks = application.init() // start parallel initialization tasks
mount("/koski", new IndexServlet)
mount("/koski/omattiedot", new OmatTiedotHtmlServlet)
mount("/koski/login", new VirkailijaLoginPageServlet)
mount("/koski/login/oppija", new OppijaLoginPageServlet)
mount("/koski/pulssi", new PulssiHtmlServlet)
mount("/koski/documentation", new RedirectServlet("/koski/dokumentaatio", true))
mount("/koski/dokumentaatio", new DocumentationServlet)
mount("/koski/eisuorituksia", new EiSuorituksiaServlet)
mount("/koski/opinnot", new SuoritusjakoHtmlServlet)
mount("/koski/virhesivu", new VirhesivuServlet)
mount("/koski/api/documentation", new DocumentationApiServlet(application))
mount("/koski/api/editor", new EditorServlet)
mount("/koski/api/editor/koodit", new EditorKooditServlet)
mount("/koski/api/types", new TypeModelServlet)
mount("/koski/api/elaketurvakeskus", new ElaketurvakeskusServlet)
mount("/koski/api/healthcheck", new HealthCheckApiServlet)
mount("/koski/api/status", new StatusApiServlet)
mount("/koski/api/henkilo", new HenkilötiedotServlet)
mount("/koski/api/koodisto", new KoodistoServlet)
mount("/koski/api/omattiedot", new OmatTiedotServlet)
mount("/koski/api/omattiedotV2", new OmatTiedotServletV2)
mount("/koski/api/suoritusjako", new SuoritusjakoServlet)
mount("/koski/api/suoritusjakoV3", new SuoritusjakoServletV3)
mount("/koski/api/opinnot", new SuoritusjakoApiServlet)
mount("/koski/api/opiskeluoikeus", new OpiskeluoikeusServlet)
mount("/koski/api/opiskeluoikeus/perustiedot", new OpiskeluoikeudenPerustiedotServlet)
mount("/koski/api/opiskeluoikeus/validate", new OpiskeluoikeusValidationServlet)
mount("/koski/api/opiskeluoikeus/historia", new KoskiHistoryServlet)
mount("/koski/api/opiskeluoikeus/suostumuksenperuutus", new SuostumuksenPeruutusServlet)
mount("/koski/api/oppija", new OppijaServlet)
mount("/koski/api/oppilaitos", new OppilaitosServlet)
mount("/koski/api/oppivelvollisuustieto", new OppivelvollisuustietoServlet)
mount("/koski/api/organisaatio", new OrganisaatioServlet)
mount("/koski/api/permission", new PermissionCheckServlet)
mount("/koski/api/pulssi", new PulssiServlet)
mount("/koski/api/preferences", new PreferencesServlet)
mount("/koski/api/tiedonsiirrot", new TiedonsiirtoServlet)
mount("/koski/api/tutkinnonperusteet", new TutkinnonPerusteetServlet)
mount("/koski/api/osaamismerkkiperusteet", new OsaamismerkkiPerusteetServlet)
mount("/koski/api/localization", new KoskiSpecificLocalizationServlet)
mount("/koski/api/raportit", new RaportitServlet)
mount("/koski/api/raportointikanta", new RaportointikantaStatusServlet)
mount("/koski/api/ytr", new YtrStatusServlet)
mount("/koski/api/sure", new SureServlet)
mount("/koski/api/luovutuspalvelu/valvira", new ValviraServlet)
mount("/koski/api/luovutuspalvelu/kela", new KelaServlet)
mount("/koski/api/luovutuspalvelu/migri", new MigriServlet)
mount("/koski/api/luovutuspalvelu/ytl", new YtlServlet)
mount("/koski/api/palveluvayla", new PalveluvaylaServlet)
mount("/koski/api/luovutuspalvelu/haku", new TilastokeskusServlet)
mount("/koski/api/omadata", new MyDataServlet)
mount("/koski/api/omaopintopolkuloki", new OmaOpintoPolkuLokiServlet)
mount("/koski/api/ytrkoesuoritukset", new YtrKoesuoritusApiServlet)
mount("/koski/api/massaluovutus", new MassaluovutusServlet)
mount("/koski/api/vkt", new VktServlet)
mount("/koski/api/hakemuspalvelu", new HakemuspalveluServlet)
mount("/koski/omadata", new MyDataReactServlet)
mount("/koski/koesuoritus", new YtrKoesuoritusServlet)
mount("/koski/api/yotodistus", new YoTodistusServlet)
mount("/koski/healthcheck", new HealthCheckHtmlServlet)
mount("/koski/json-schema-viewer", new JsonSchemaViewerHtmlServlet)
mount("/koski/user", new UserServlet)
if (!SSOConfig(application.config).isCasSsoUsed) {
mount("/koski/user/login", new LocalLoginServlet)
}
mount("/koski/user/logout", new KoskiSpecificLogoutServlet)
mount("/koski/user/redirect", new LogoutRedirectServlet)
mount("/koski/cas", new CasServlet)
mount("/koski/cas/valpas", new ValpasOppijaCasServlet)
mount("/koski/cache", new CacheServlet)
mount("/valpas", new ValpasStaticServlet())
mount("/koski/valpas/localization", new ValpasBootstrapServlet)
mount("/koski/valpas/api", new ValpasRootApiServlet)
mount("/koski/valpas/api/kuntailmoitus", new ValpasKuntailmoitusApiServlet)
mount("/koski/valpas/api/luovutuspalvelu/kela", new ValpasKelaServlet)
mount("/koski/valpas/api/rouhinta", new ValpasRouhintaApiServlet)
mount("/koski/valpas/api/kansalainen", new ValpasKansalainenApiServlet)
mount("/koski/valpas/api/luovutuspalvelu/ytl", new ValpasYtlServlet)
mount("/koski/valpas/api/vapautus", new OppivelvollisuudestaVapautusServlet)
mount("/koski/valpas/logout", new ValpasLogoutServlet)
if (!SSOConfig(application.config).isCasSsoUsed) {
mount("/koski/valpas/login", new LocalLoginServlet)
}
if (Environment.isMockEnvironment(application.config)) {
mount("/koski/valpas/test", new ValpasTestApiServlet)
}
if (FrontendValvontaMode(application.config.getString("frontend-valvonta.mode")) != FrontendValvontaMode.DISABLED) {
mount("/koski/api/frontendvalvonta", new FrontendValvontaRaportointiServlet)
}
if (!Environment.isProdEnvironment(application.config)) {
mount("/koski/omadata-oauth2", new OmaDataOAuth2ResourceOwnerReactServlet)
mount("/koski/api/omadata-oauth2/resource-owner", new OmaDataOAuth2ResourceOwnerServlet)
mount("/koski/omadata-oauth2/cas-workaround", new OmaDataOAuth2CASWorkaroundServlet)
mount("/koski/omadata-oauth2/post-response", new OmaDataOAuth2LogoutPostResponseServlet)
mount("/koski/api/omadata-oauth2/authorization-server", new OmaDataOAuth2AuthorizationServerServlet)
mount("/koski/api/omadata-oauth2/resource-server", new OmaDataOAuth2ResourceServerServlet)
// TODO: TOR-2210: Speksin https://www.rfc-editor.org/rfc/rfc8414 mukaan tämä pitäisi oikeasti olla routessa
// https://opintopolku.fi/.well-known/oauth-authorization-server/koski/omadata-oauth2 , mutta se vaatisi
// OPH:n nginx:äänkin uusia routeja. Siksi toistaiseksi väärin muodostetussa polussa
// https://opintopolku.fi/koski/omadata-oauth2/.well-known/oauth-authorization-server .
mount("/koski/omadata-oauth2/.well-known/oauth-authorization-server", new OmaDataOAuth2DiscoveryServlet)
// TODO: TOR-2210: Poista debug-servlet kokonaan!
mount("/koski/omadata-oauth2/debug-post-response", new OmaDataOAuth2PostResponseDebugServlet)
}
if (Environment.isLocalDevelopmentEnvironment(application.config)) {
if (application.config.hasPath("oppijaRaamitProxy")) {
val proxyPrefix = "/oppija-raamit"
mount(proxyPrefix, new RaamiProxyServlet(application.config.getString("oppijaRaamitProxy"), "", application))
}
if (application.config.hasPath("virkailijaRaamitProxy")) {
val proxyPrefix = "/virkailija-raamit"
mount(proxyPrefix, new RaamiProxyServlet(application.config.getString("virkailijaRaamitProxy"), "", application))
}
mount("/types", new LocalDevOnlyTypeModelServlet())
}
if (
Environment.isLocalDevelopmentEnvironment(application.config) ||
Environment.isMockEnvironment(application.config)
) {
mount ("/koski/test/ytr", new YtrTestServlet())
mount("/koski/api/test/suoritusjakoV2", new SuoritusjakoServletV2)
mount("/koski/api/test/raportointikanta", new RaportointikantaTestServlet)
mount("/koski/api/test/opensearch", new OpenSearchServlet)
}
Futures.await(initTasks) // await for all initialization tasks to complete
if (application.fixtureCreator.shouldUseFixtures) {
context.mount(new FixtureServlet, "/koski/fixtures")
timed("Loading fixtures")(application.fixtureCreator.resetFixtures(reloadRaportointikanta = true, reloadYtrData = true))
}
}
private def generateRaportointikanta(application: KoskiApplication): Unit = {
val service = new RaportointikantaService(application)
val generating = Future {
service.loadRaportointikantaAndExit(
fullReload = RunMode.isFullReload,
forceReload = getForceMode,
enableYtr = application.config.getBoolean("ytr.raportointi.enabled"),
incrementalLoadMaxRows = application.config.getInt("raportointikanta.incrementalLoadMaxRows")
)
}
generating.failed.map(error => {
logger.error(error)("Raportointikannan generointi keskeytyi odottamattomasti")
service.shutdown
})
}
private def getForceMode: Boolean = sys.env.get("FORCE_RAPORTOINTIKANTA") match {
case Some("true") => true
case Some("false") => false
case Some(s) => throw new RuntimeException(s"Odottamaton arvo muuttujalla FORCE_RAPORTOINTIKANTA: ${s} (sallitut arvot: true, false)")
case None => false
}
private def downloadYtr(application: KoskiApplication): Unit = {
val service = new YtrDownloadService(application.masterDatabase.db, application)
val generating = Future {
service.downloadAndShutdown()
}
generating.failed.map(error => {
logger.error(error)("YTR-datan lataus keskeytyi odottamattomasti")
service.shutdown
})
}
override def destroy(context: ServletContext): Unit = ()
}