001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.juneau.server.config;
018
019import org.apache.juneau.commons.inject.*;
020import org.apache.juneau.config.*;
021import org.apache.juneau.microservice.*;
022import org.apache.juneau.microservice.jetty.*;
023import org.apache.juneau.server.config.rest.*;
024
025import jakarta.servlet.*;
026
027/**
028 * Entry-point class.
029 */
030public class App {
031
032   /**
033    * Entry-point method.
034    *
035    * @param args Command-line arguments.
036    * @throws Exception Error occurred.
037    */
038   public static void main(String[] args) throws Exception {
039      checkRequiredSettings();
040      // @formatter:off
041      Microservice
042         .create()
043         .args(args)
044         .configurations(JettyConfiguration.class, AppConfig.class)
045         .build()
046         .start()
047         .startConsole()
048         .join();
049      // @formatter:on
050   }
051
052   /**
053    * Refuses to start until the settings that ship as commented-out placeholders have been provided.
054    *
055    * @throws IllegalStateException If a required setting is missing.
056    */
057   static void checkRequiredSettings() {
058      var c = Config.create().name("juneau-server-config.cfg").build();
059      try {
060         for (var key : new String[]{"GitServer/pathLocal", "GitServer/gitRemote", "Security/apiKey"})
061            if (c.get(key).orElse("").isBlank())
062               throw new IllegalStateException("Required setting '" + key + "' is not set in juneau-server-config.cfg.");
063      } finally {
064         c.close();
065      }
066   }
067
068   /**
069    * Application-specific configuration class contributing the {@link LoadConfigResource} servlet.
070    */
071   @Configuration
072   public static class AppConfig {
073
074      /**
075       * Provides the {@link LoadConfigResource} REST servlet, auto-mounted by {@link JettyServerComponent} at
076       * {@link org.apache.juneau.rest.server.Rest#path()}.
077       *
078       * @return The servlet.
079       */
080      @Bean
081      public Servlet loadConfigResource() {
082         return new LoadConfigResource();
083      }
084   }
085}