Search in sources :

Example 6 with Configuration

use of org.apache.meecrowave.configuration.Configuration in project meecrowave by apache.

the class MeecrowaveRunMojo method execute.

@Override
public void execute() {
    if (skip) {
        getLog().warn("Mojo skipped");
        return;
    }
    if (watcherBouncing <= 0 && (reloadGoals == null || reloadGoals.isEmpty())) {
        try {
            reloadGoals = singletonList("process-classes");
        } catch (final RuntimeException re) {
        // mojo in read only mode
        // no-op
        }
    }
    logConfigurationErrors();
    final Map<String, String> originalSystemProps;
    if (systemProperties != null) {
        originalSystemProps = systemProperties.keySet().stream().filter(System.getProperties()::containsKey).collect(toMap(identity(), System::getProperty));
        systemProperties.forEach(System::setProperty);
    } else {
        originalSystemProps = null;
    }
    final Thread thread = Thread.currentThread();
    final ClassLoader loader = thread.getContextClassLoader();
    final Supplier<ClassLoader> appLoaderSupplier = createClassLoader(loader);
    thread.setContextClassLoader(appLoaderSupplier.get());
    try {
        final Configuration builder = getConfig();
        try (final Meecrowave meecrowave = new Meecrowave(builder) {

            @Override
            protected void beforeStart() {
                scriptCustomization(jsCustomizers, "js", singletonMap("meecrowaveBase", base.getAbsolutePath()));
            }
        }) {
            meecrowave.start();
            final String fixedContext = ofNullable(context).orElse("");
            final Meecrowave.DeploymentMeta deploymentMeta = new Meecrowave.DeploymentMeta(fixedContext, webapp != null && webapp.isDirectory() ? webapp : null, jsContextCustomizer == null ? null : ctx -> scriptCustomization(singletonList(jsContextCustomizer), "js", singletonMap("context", ctx)), context -> reload(meecrowave, fixedContext, appLoaderSupplier, loader));
            deploy(meecrowave, deploymentMeta);
            final Scanner scanner = new Scanner(System.in);
            String cmd;
            boolean quit = false;
            while (!quit && (cmd = scanner.next()) != null) {
                cmd = cmd.trim();
                switch(cmd) {
                    // normally impossible with a Scanner but we can move to another "reader"
                    case "":
                    case "q":
                    case "quit":
                    case "e":
                    case "exit":
                        quit = true;
                        break;
                    case "r":
                    case "reload":
                        reload(meecrowave, fixedContext, appLoaderSupplier, loader);
                        break;
                    default:
                        getLog().error("Unknown command: '" + cmd + "', use 'quit' or 'exit' or 'reload'");
                }
            }
        }
    } finally {
        if (forceLog4j2Shutdown) {
            LogManager.shutdown();
        }
        destroyTcclIfNeeded(thread, loader);
        thread.setContextClassLoader(loader);
        if (originalSystemProps != null) {
            systemProperties.keySet().forEach(k -> {
                final Optional<String> originalValue = ofNullable(originalSystemProps.get(k));
                if (originalValue.isPresent()) {
                    System.setProperty(k, originalValue.get());
                } else {
                    System.clearProperty(k);
                }
            });
        }
    }
}
Also used : ProvidedLoader(org.apache.meecrowave.tomcat.ProvidedLoader) URL(java.net.URL) LifecycleStarter(org.apache.maven.lifecycle.internal.LifecycleStarter) Component(org.apache.maven.plugins.annotations.Component) Scanner(java.util.Scanner) Parameter(org.apache.maven.plugins.annotations.Parameter) Supplier(java.util.function.Supplier) Collections.singletonList(java.util.Collections.singletonList) ArrayList(java.util.ArrayList) Mojo(org.apache.maven.plugins.annotations.Mojo) URLClassLoader(java.net.URLClassLoader) Collectors.toMap(java.util.stream.Collectors.toMap) MavenProject(org.apache.maven.project.MavenProject) Map(java.util.Map) Collections.singletonMap(java.util.Collections.singletonMap) Artifact(org.apache.maven.artifact.Artifact) LinkedList(java.util.LinkedList) ScriptException(javax.script.ScriptException) MavenSession(org.apache.maven.execution.MavenSession) MalformedURLException(java.net.MalformedURLException) Optional.ofNullable(java.util.Optional.ofNullable) Collection(java.util.Collection) ScriptEngineManager(javax.script.ScriptEngineManager) Configuration(org.apache.meecrowave.configuration.Configuration) IOException(java.io.IOException) Context(org.apache.catalina.Context) Field(java.lang.reflect.Field) File(java.io.File) RUNTIME_PLUS_SYSTEM(org.apache.maven.plugins.annotations.ResolutionScope.RUNTIME_PLUS_SYSTEM) SimpleBindings(javax.script.SimpleBindings) Collectors.toList(java.util.stream.Collectors.toList) List(java.util.List) StringReader(java.io.StringReader) Function.identity(java.util.function.Function.identity) ScriptEngine(javax.script.ScriptEngine) Optional(java.util.Optional) Meecrowave(org.apache.meecrowave.Meecrowave) Collections(java.util.Collections) LogManager(org.apache.logging.log4j.LogManager) AbstractMojo(org.apache.maven.plugin.AbstractMojo) Scanner(java.util.Scanner) Configuration(org.apache.meecrowave.configuration.Configuration) URLClassLoader(java.net.URLClassLoader) Meecrowave(org.apache.meecrowave.Meecrowave)

Example 7 with Configuration

use of org.apache.meecrowave.configuration.Configuration in project meecrowave by apache.

the class Meecrowave method start.

public Meecrowave start() {
    final Map<String, String> systemPropsToRestore = new HashMap<>();
    if (configuration.getMeecrowaveProperties() != null && !"meecrowave.properties".equals(configuration.getMeecrowaveProperties())) {
        configuration.loadFrom(configuration.getMeecrowaveProperties());
    }
    if (configuration.isUseLog4j2JulLogManager() && Log4j2s.IS_PRESENT) {
        // /!\ don't move this line or add anything before without checking log setup
        System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager");
    }
    if (configuration.isLoggingGlobalSetup() && Log4j2s.IS_PRESENT) {
        setSystemProperty(systemPropsToRestore, "log4j.shutdownHookEnabled", "false");
        setSystemProperty(systemPropsToRestore, "openwebbeans.logging.factory", Log4j2LoggerFactory.class.getName());
        setSystemProperty(systemPropsToRestore, "org.apache.cxf.Logger", Log4j2Logger.class.getName());
        setSystemProperty(systemPropsToRestore, "org.apache.tomcat.Logger", Log4j2Log.class.getName());
        postTask = () -> {
            if (Log4j2s.IS_PRESENT) {
                new Log4j2Shutdown().shutdown();
            }
            systemPropsToRestore.forEach((key, value) -> {
                if (value == null) {
                    System.clearProperty(key);
                } else {
                    System.setProperty(key, value);
                }
            });
        };
    }
    setupJmx(configuration.isTomcatNoJmx());
    clearCatalinaSystemProperties = System.getProperty("catalina.base") == null && System.getProperty("catalina.home") == null;
    tomcat = new InternalTomcat();
    {
        // setup
        base = new File(newBaseDir());
        // create the temp dir folder.
        File tempDir;
        if (configuration.getTempDir() == null || configuration.getTempDir().length() == 0) {
            tempDir = createDirectory(base, "temp");
        } else {
            tempDir = new File(configuration.getTempDir());
            if (!tempDir.exists()) {
                tempDir.mkdirs();
            }
        }
        try {
            workDir = createDirectory(base, "work");
        } catch (final IllegalStateException ise) {
            // in case we could not create that directory we create it in the temp dir folder
            workDir = createDirectory(tempDir, "work");
        }
        synchronize(new File(base, "conf"), configuration.getConf());
    }
    final Properties props = configuration.getProperties();
    Substitutor substitutor = null;
    for (final String s : props.stringPropertyNames()) {
        final String v = props.getProperty(s);
        if (v != null && v.contains("${")) {
            if (substitutor == null) {
                final Map<String, String> placeHolders = new HashMap<>();
                placeHolders.put("meecrowave.embedded.http", Integer.toString(configuration.getHttpPort()));
                placeHolders.put("meecrowave.embedded.https", Integer.toString(configuration.getHttpsPort()));
                placeHolders.put("meecrowave.embedded.stop", Integer.toString(configuration.getStopPort()));
                substitutor = new Substitutor(placeHolders);
            }
            props.put(s, substitutor.replace(v));
        }
    }
    final File conf = new File(base, "conf");
    tomcat.setBaseDir(base.getAbsolutePath());
    tomcat.setHostname(configuration.getHost());
    final boolean initialized;
    if (configuration.getServerXml() != null) {
        final File file = new File(conf, "server.xml");
        if (!file.equals(configuration.getServerXml())) {
            try (final InputStream is = new FileInputStream(configuration.getServerXml());
                final FileOutputStream fos = new FileOutputStream(file)) {
                IO.copy(is, fos);
            } catch (final IOException e) {
                throw new IllegalStateException(e);
            }
        }
        // respect config (host/port) of the Configuration
        final QuickServerXmlParser ports = QuickServerXmlParser.parse(file);
        if (configuration.isKeepServerXmlAsThis()) {
            configuration.setHttpPort(Integer.parseInt(ports.http()));
            configuration.setStopPort(Integer.parseInt(ports.stop()));
        } else {
            final Map<String, String> replacements = new HashMap<>();
            replacements.put(ports.http(), String.valueOf(configuration.getHttpPort()));
            replacements.put(ports.https(), String.valueOf(configuration.getHttpsPort()));
            replacements.put(ports.stop(), String.valueOf(configuration.getStopPort()));
            String serverXmlContent;
            try (final InputStream stream = new FileInputStream(file)) {
                serverXmlContent = IO.toString(stream);
                for (final Map.Entry<String, String> pair : replacements.entrySet()) {
                    serverXmlContent = serverXmlContent.replace(pair.getKey(), pair.getValue());
                }
            } catch (final IOException e) {
                throw new IllegalStateException(e);
            }
            try (final OutputStream os = new FileOutputStream(file)) {
                os.write(serverXmlContent.getBytes(StandardCharsets.UTF_8));
            } catch (final IOException e) {
                throw new IllegalStateException(e);
            }
        }
        tomcat.server(createServer(file.getAbsolutePath()));
        initialized = true;
    } else {
        tomcat.getServer().setPort(configuration.getStopPort());
        initialized = false;
    }
    ofNullable(configuration.getSharedLibraries()).map(File::new).filter(File::isDirectory).ifPresent(libRoot -> {
        final Collection<URL> libs = new ArrayList<>();
        try {
            libs.add(libRoot.toURI().toURL());
        } catch (final MalformedURLException e) {
            throw new IllegalStateException(e);
        }
        libs.addAll(ofNullable(libRoot.listFiles((dir, name) -> name.endsWith(".jar") || name.endsWith(".zip"))).map(Stream::of).map(s -> s.map(f -> {
            try {
                return f.toURI().toURL();
            } catch (final MalformedURLException e) {
                throw new IllegalStateException(e);
            }
        }).collect(toList())).orElse(emptyList()));
        tomcat.getServer().setParentClassLoader(new MeecrowaveContainerLoader(libs.toArray(new URL[libs.size()]), Thread.currentThread().getContextClassLoader()));
    });
    if (!initialized) {
        tomcat.setHostname(configuration.getHost());
        tomcat.getEngine().setDefaultHost(configuration.getHost());
        final StandardHost host = new StandardHost();
        host.setName(configuration.getHost());
        try {
            final File webapps = createDirectory(base, "webapps");
            host.setAppBase(webapps.getAbsolutePath());
        } catch (final IllegalStateException ise) {
        // never an issue since the webapps are deployed being put in webapps - so no dynamic folder
        // or through their path - so don't need webapps folder
        }
        // forced for now cause OWB doesn't support war:file:// urls
        host.setUnpackWARs(true);
        try {
            host.setWorkDir(workDir.getCanonicalPath());
        } catch (final IOException e) {
            host.setWorkDir(workDir.getAbsolutePath());
        }
        tomcat.setHost(host);
    }
    ofNullable(configuration.getTomcatAccessLogPattern()).ifPresent(pattern -> tomcat.getHost().getPipeline().addValve(new LoggingAccessLogPattern(pattern)));
    final List<Valve> valves = buildValves();
    if (!valves.isEmpty()) {
        final Pipeline pipeline = tomcat.getHost().getPipeline();
        valves.forEach(pipeline::addValve);
    }
    if (configuration.getRealm() != null) {
        tomcat.getEngine().setRealm(configuration.getRealm());
    }
    if (tomcat.getRawConnector() == null && !configuration.isSkipHttp()) {
        final Connector connector = createConnector();
        connector.setPort(configuration.getHttpPort());
        if (connector.getProperty("connectionTimeout") == null) {
            connector.setProperty("connectionTimeout", "3000");
        }
        tomcat.getService().addConnector(connector);
        tomcat.setConnector(connector);
    }
    // create https connector
    if (configuration.isSsl()) {
        final Connector httpsConnector = createConnector();
        httpsConnector.setPort(configuration.getHttpsPort());
        httpsConnector.setSecure(true);
        httpsConnector.setScheme("https");
        httpsConnector.setProperty("SSLEnabled", "true");
        if (configuration.getSslProtocol() != null) {
            configuration.getProperties().setProperty("connector.sslhostconfig.sslProtocol", configuration.getSslProtocol());
        }
        if (configuration.getProperties().getProperty("connector.sslhostconfig.hostName") != null) {
            httpsConnector.setProperty("defaultSSLHostConfigName", configuration.getProperties().getProperty("connector.sslhostconfig.hostName"));
        }
        if (configuration.getKeystoreFile() != null) {
            configuration.getProperties().setProperty("connector.sslhostconfig.certificateKeystoreFile", configuration.getKeystoreFile());
        }
        if (configuration.getKeystorePass() != null) {
            configuration.getProperties().setProperty("connector.sslhostconfig.certificateKeystorePassword", configuration.getKeystorePass());
        }
        configuration.getProperties().setProperty("connector.sslhostconfig.certificateKeystoreType", configuration.getKeystoreType());
        if (configuration.getClientAuth() != null) {
            httpsConnector.setProperty("clientAuth", configuration.getClientAuth());
        }
        if (configuration.getKeyAlias() != null) {
            configuration.getProperties().setProperty("connector.sslhostconfig.certificateKeyAlias", configuration.getKeyAlias());
        }
        if (configuration.isHttp2()) {
            httpsConnector.addUpgradeProtocol(new Http2Protocol());
        }
        final List<SSLHostConfig> buildSslHostConfig = buildSslHostConfig();
        if (!buildSslHostConfig.isEmpty()) {
            createDirectory(base, "conf");
        }
        buildSslHostConfig.forEach(sslHostConf -> {
            if (isCertificateFromClasspath(sslHostConf.getCertificateKeystoreFile())) {
                copyCertificateToConfDir(sslHostConf.getCertificateKeystoreFile());
                sslHostConf.setCertificateKeystoreFile(base.getAbsolutePath() + "/conf/" + sslHostConf.getCertificateKeystoreFile());
            }
            if (isCertificateFromClasspath(sslHostConf.getCertificateKeyFile())) {
                copyCertificateToConfDir(sslHostConf.getCertificateKeyFile());
                sslHostConf.setCertificateKeyFile(base.getAbsolutePath() + "/conf/" + sslHostConf.getCertificateKeyFile());
                copyCertificateToConfDir(sslHostConf.getCertificateFile());
                sslHostConf.setCertificateFile(base.getAbsolutePath() + "/conf/" + sslHostConf.getCertificateFile());
            }
            if (isCertificateFromClasspath(sslHostConf.getTruststoreFile())) {
                copyCertificateToConfDir(sslHostConf.getTruststoreFile());
                sslHostConf.setTruststoreFile(base.getAbsolutePath() + "/conf/" + sslHostConf.getTruststoreFile());
            }
            if (isCertificateFromClasspath(sslHostConf.getCertificateChainFile())) {
                copyCertificateToConfDir(sslHostConf.getCertificateChainFile());
                sslHostConf.setCertificateChainFile(base.getAbsolutePath() + "/conf/" + sslHostConf.getCertificateChainFile());
            }
        });
        buildSslHostConfig.forEach(httpsConnector::addSslHostConfig);
        if (configuration.getDefaultSSLHostConfigName() != null) {
            httpsConnector.setProperty("defaultSSLHostConfigName", configuration.getDefaultSSLHostConfigName());
        }
        tomcat.getService().addConnector(httpsConnector);
        if (configuration.isSkipHttp()) {
            tomcat.setConnector(httpsConnector);
        }
    }
    for (final Connector c : configuration.getConnectors()) {
        tomcat.getService().addConnector(c);
    }
    if (!configuration.isSkipHttp() && !configuration.isSsl() && !configuration.getConnectors().isEmpty()) {
        tomcat.setConnector(configuration.getConnectors().iterator().next());
    }
    if (configuration.getUsers() != null) {
        for (final Map.Entry<String, String> user : configuration.getUsers().entrySet()) {
            tomcat.addUser(user.getKey(), user.getValue());
        }
    }
    if (configuration.getRoles() != null) {
        for (final Map.Entry<String, String> user : configuration.getRoles().entrySet()) {
            for (final String role : user.getValue().split(" *, *")) {
                tomcat.addRole(user.getKey(), role);
            }
        }
    }
    StreamSupport.stream(ServiceLoader.load(Meecrowave.InstanceCustomizer.class).spliterator(), false).peek(i -> {
        if (MeecrowaveAwareInstanceCustomizer.class.isInstance(i)) {
            MeecrowaveAwareInstanceCustomizer.class.cast(i).setMeecrowave(this);
        }
    }).sorted(Priotities::sortByPriority).forEach(c -> c.accept(tomcat));
    configuration.getInstanceCustomizers().forEach(c -> c.accept(tomcat));
    StreamSupport.stream(ServiceLoader.load(Meecrowave.ContextCustomizer.class).spliterator(), false).peek(i -> {
        if (MeecrowaveAwareContextCustomizer.class.isInstance(i)) {
            MeecrowaveAwareContextCustomizer.class.cast(i).setMeecrowave(this);
        }
    }).sorted(Priotities::sortByPriority).forEach(configuration::addGlobalContextCustomizer);
    beforeStart();
    if (configuration.isInitializeClientBus() && Cxfs.IS_PRESENT && !Cxfs.hasDefaultBus()) {
        clientBus = new ConfigurableBus();
        clientBus.initProviders(configuration, ofNullable(Thread.currentThread().getContextClassLoader()).orElseGet(ClassLoader::getSystemClassLoader));
        clientBus.addClientLifecycleListener();
    }
    try {
        if (!initialized) {
            tomcat.init();
        }
        tomcat.getHost().addLifecycleListener(event -> {
            if (!Host.class.isInstance(event.getSource())) {
                return;
            }
            broadcastHostEvent(event.getType(), Host.class.cast(event.getSource()));
        });
        tomcat.start();
    } catch (final LifecycleException e) {
        throw new IllegalStateException(e);
    }
    ofNullable(configuration.getPidFile()).ifPresent(pidFile -> {
        if (pidFile.getParentFile() != null && !pidFile.getParentFile().isDirectory() && !pidFile.getParentFile().mkdirs()) {
            throw new IllegalArgumentException("Can't create " + pidFile);
        }
        final String pid = ManagementFactory.getRuntimeMXBean().getName();
        final int at = pid.indexOf('@');
        try (final Writer w = new FileWriter(pidFile)) {
            w.write(at > 0 ? pid.substring(0, at) : pid);
        } catch (final IOException e) {
            throw new IllegalStateException("Can't write the pid in " + pid, e);
        }
    });
    if (configuration.isUseShutdownHook()) {
        hook = new Thread(() -> {
            // prevent close to remove the hook which would throw an exception
            hook = null;
            close();
        }, "meecrowave-stop-hook");
        Runtime.getRuntime().addShutdownHook(hook);
    }
    return this;
}
Also used : MeecrowaveContextConfig(org.apache.meecrowave.tomcat.MeecrowaveContextConfig) ProvidedLoader(org.apache.meecrowave.tomcat.ProvidedLoader) SessionCookieConfig(javax.servlet.SessionCookieConfig) SecurityCollection(org.apache.tomcat.util.descriptor.web.SecurityCollection) SecretKeySpec(javax.crypto.spec.SecretKeySpec) ServerSocket(java.net.ServerSocket) URLClassLoader(java.net.URLClassLoader) Host(org.apache.catalina.Host) StopListening(org.apache.meecrowave.api.StopListening) Map(java.util.Map) SAXParser(javax.xml.parsers.SAXParser) Path(java.nio.file.Path) Log4j2Log(org.apache.meecrowave.logging.tomcat.Log4j2Log) LifecycleException(org.apache.catalina.LifecycleException) Set(java.util.Set) CDI(javax.enterprise.inject.spi.CDI) CDIInstanceManager(org.apache.meecrowave.tomcat.CDIInstanceManager) StandardCharsets(java.nio.charset.StandardCharsets) WebBeansContext(org.apache.webbeans.config.WebBeansContext) ResourceFinder(org.apache.xbean.finder.ResourceFinder) Stream(java.util.stream.Stream) ConfigurableBus(org.apache.meecrowave.cxf.ConfigurableBus) JarScanFilter(org.apache.tomcat.JarScanFilter) Log4j2s(org.apache.meecrowave.logging.log4j2.Log4j2s) TomcatAutoInitializer(org.apache.meecrowave.tomcat.TomcatAutoInitializer) Log4j2Logger(org.apache.meecrowave.logging.jul.Log4j2Logger) Connector(org.apache.catalina.connector.Connector) StandardHost(org.apache.catalina.core.StandardHost) AnnotatedType(javax.enterprise.inject.spi.AnnotatedType) StandardCopyOption(java.nio.file.StandardCopyOption) ArrayList(java.util.ArrayList) CreationalContext(javax.enterprise.context.spi.CreationalContext) SecurityConstraint(org.apache.tomcat.util.descriptor.web.SecurityConstraint) ThreadLocalRandom(java.util.concurrent.ThreadLocalRandom) StreamSupport(java.util.stream.StreamSupport) SSLHostConfig(org.apache.tomcat.util.net.SSLHostConfig) ManagementFactory(java.lang.management.ManagementFactory) Properties(java.util.Properties) LogFacade(org.apache.meecrowave.logging.tomcat.LogFacade) Files(java.nio.file.Files) Cxfs(org.apache.meecrowave.cxf.Cxfs) FileOutputStream(java.io.FileOutputStream) IOException(java.io.IOException) ValueTransformer(org.apache.meecrowave.service.ValueTransformer) Field(java.lang.reflect.Field) File(java.io.File) ObjectRecipe(org.apache.xbean.recipe.ObjectRecipe) DefaultHandler(org.xml.sax.helpers.DefaultHandler) StringReader(java.io.StringReader) TreeMap(java.util.TreeMap) Paths(java.nio.file.Paths) Pipeline(org.apache.catalina.Pipeline) BeanManager(javax.enterprise.inject.spi.BeanManager) URL(java.net.URL) Lifecycle(org.apache.catalina.Lifecycle) Priotities(org.apache.meecrowave.service.Priotities) Catalina(org.apache.catalina.startup.Catalina) OWBJarScanner(org.apache.meecrowave.tomcat.OWBJarScanner) Http2Protocol(org.apache.coyote.http2.Http2Protocol) IO(org.apache.meecrowave.io.IO) LifecycleState(org.apache.catalina.LifecycleState) Collectors.toSet(java.util.stream.Collectors.toSet) Server(org.apache.catalina.Server) StartListening(org.apache.meecrowave.api.StartListening) Collections.emptyList(java.util.Collections.emptyList) Collection(java.util.Collection) StandardSessionIdGenerator(org.apache.catalina.util.StandardSessionIdGenerator) ServiceLoader(java.util.ServiceLoader) Substitutor(org.apache.meecrowave.lang.Substitutor) Objects(java.util.Objects) Base64(java.util.Base64) List(java.util.List) Realm(org.apache.catalina.Realm) SAXException(org.xml.sax.SAXException) Writer(java.io.Writer) StandardContext(org.apache.catalina.core.StandardContext) OWBAutoSetup(org.apache.meecrowave.openwebbeans.OWBAutoSetup) LoginConfig(org.apache.tomcat.util.descriptor.web.LoginConfig) SAXParserFactory(javax.xml.parsers.SAXParserFactory) Valve(org.apache.catalina.Valve) HashMap(java.util.HashMap) AtomicReference(java.util.concurrent.atomic.AtomicReference) Function(java.util.function.Function) Cipher(javax.crypto.Cipher) Option(org.apache.xbean.recipe.Option) BiPredicate(java.util.function.BiPredicate) ServletContainerInitializer(javax.servlet.ServletContainerInitializer) Log4j2Shutdown(org.apache.meecrowave.logging.log4j2.Log4j2Shutdown) Attributes(org.xml.sax.Attributes) Comparator.comparing(java.util.Comparator.comparing) ROOT(java.util.Locale.ROOT) InjectionTarget(javax.enterprise.inject.spi.InjectionTarget) CxfCdiAutoSetup(org.apache.meecrowave.cxf.CxfCdiAutoSetup) OutputStream(java.io.OutputStream) Collections.emptySet(java.util.Collections.emptySet) MalformedURLException(java.net.MalformedURLException) Log4j2LoggerFactory(org.apache.meecrowave.logging.openwebbeans.Log4j2LoggerFactory) Optional.ofNullable(java.util.Optional.ofNullable) LoggingAccessLogPattern(org.apache.meecrowave.tomcat.LoggingAccessLogPattern) FileWriter(java.io.FileWriter) Globals(org.apache.catalina.Globals) Configuration(org.apache.meecrowave.configuration.Configuration) StandardManager(org.apache.catalina.session.StandardManager) FileInputStream(java.io.FileInputStream) Context(org.apache.catalina.Context) Registry(org.apache.tomcat.util.modeler.Registry) Consumer(java.util.function.Consumer) Tomcat(org.apache.catalina.startup.Tomcat) Collectors.toList(java.util.stream.Collectors.toList) InputStream(java.io.InputStream) MalformedURLException(java.net.MalformedURLException) HashMap(java.util.HashMap) Substitutor(org.apache.meecrowave.lang.Substitutor) FileOutputStream(java.io.FileOutputStream) OutputStream(java.io.OutputStream) ArrayList(java.util.ArrayList) Log4j2Shutdown(org.apache.meecrowave.logging.log4j2.Log4j2Shutdown) Valve(org.apache.catalina.Valve) Http2Protocol(org.apache.coyote.http2.Http2Protocol) FileInputStream(java.io.FileInputStream) Log4j2Log(org.apache.meecrowave.logging.tomcat.Log4j2Log) FileOutputStream(java.io.FileOutputStream) File(java.io.File) Map(java.util.Map) TreeMap(java.util.TreeMap) HashMap(java.util.HashMap) LoggingAccessLogPattern(org.apache.meecrowave.tomcat.LoggingAccessLogPattern) Connector(org.apache.catalina.connector.Connector) Log4j2Logger(org.apache.meecrowave.logging.jul.Log4j2Logger) Log4j2LoggerFactory(org.apache.meecrowave.logging.openwebbeans.Log4j2LoggerFactory) FileWriter(java.io.FileWriter) Properties(java.util.Properties) ConfigurableBus(org.apache.meecrowave.cxf.ConfigurableBus) URL(java.net.URL) LifecycleException(org.apache.catalina.LifecycleException) FileInputStream(java.io.FileInputStream) InputStream(java.io.InputStream) Host(org.apache.catalina.Host) StandardHost(org.apache.catalina.core.StandardHost) IOException(java.io.IOException) SecurityConstraint(org.apache.tomcat.util.descriptor.web.SecurityConstraint) Pipeline(org.apache.catalina.Pipeline) StandardHost(org.apache.catalina.core.StandardHost) SSLHostConfig(org.apache.tomcat.util.net.SSLHostConfig) Writer(java.io.Writer) FileWriter(java.io.FileWriter)

Example 8 with Configuration

use of org.apache.meecrowave.configuration.Configuration in project meecrowave by apache.

the class CxfCdiAutoSetup method onStartup.

@Override
public void onStartup(final Set<Class<?>> c, final ServletContext ctx) {
    final Configuration builder = Configuration.class.cast(ctx.getAttribute("meecrowave.configuration"));
    final MeecrowaveCXFCdiServlet delegate = new MeecrowaveCXFCdiServlet();
    final FilterRegistration.Dynamic jaxrs = ctx.addFilter(NAME, new Filter() {

        private final String servletPath = builder.getJaxrsMapping().endsWith("/*") ? builder.getJaxrsMapping().substring(0, builder.getJaxrsMapping().length() - 2) : builder.getJaxrsMapping();

        @Override
        public void init(final FilterConfig filterConfig) throws ServletException {
            delegate.init(new ServletConfig() {

                @Override
                public String getServletName() {
                    return NAME;
                }

                @Override
                public ServletContext getServletContext() {
                    return filterConfig.getServletContext();
                }

                @Override
                public String getInitParameter(final String name) {
                    return filterConfig.getInitParameter(name);
                }

                @Override
                public Enumeration<String> getInitParameterNames() {
                    return filterConfig.getInitParameterNames();
                }
            });
        }

        @Override
        public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
            if (!HttpServletRequest.class.isInstance(request)) {
                chain.doFilter(request, response);
                return;
            }
            final HttpServletRequest http = HttpServletRequest.class.cast(request);
            final String path = http.getRequestURI().substring(http.getContextPath().length());
            final Optional<String> app = Stream.of(delegate.prefixes).filter(path::startsWith).findAny();
            if (app.isPresent()) {
                delegate.service(new // fake servlet pathInfo and path
                HttpServletRequestWrapper(// fake servlet pathInfo and path
                http) {

                    @Override
                    public String getPathInfo() {
                        return path;
                    }

                    @Override
                    public String getServletPath() {
                        return servletPath;
                    }
                }, response);
            } else {
                chain.doFilter(request, response);
            }
        }

        @Override
        public void destroy() {
            delegate.destroy();
        }
    });
    jaxrs.setAsyncSupported(true);
    jaxrs.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC), true, builder.getJaxrsMapping());
    ofNullable(builder.getCxfServletParams()).ifPresent(m -> m.forEach(jaxrs::setInitParameter));
}
Also used : HttpServletRequest(javax.servlet.http.HttpServletRequest) ServletRequest(javax.servlet.ServletRequest) ServletResponse(javax.servlet.ServletResponse) Configuration(org.apache.meecrowave.configuration.Configuration) Optional(java.util.Optional) FilterChain(javax.servlet.FilterChain) ServletConfig(javax.servlet.ServletConfig) IOException(java.io.IOException) ServletException(javax.servlet.ServletException) HttpServletRequest(javax.servlet.http.HttpServletRequest) Filter(javax.servlet.Filter) HttpServletRequestWrapper(javax.servlet.http.HttpServletRequestWrapper) FilterConfig(javax.servlet.FilterConfig) FilterRegistration(javax.servlet.FilterRegistration)

Example 9 with Configuration

use of org.apache.meecrowave.configuration.Configuration in project meecrowave by apache.

the class MeecrowaveContextConfig method webConfig.

@Override
protected void webConfig() {
    if (context.getServletContext().getAttribute("meecrowave.configuration") == null) {
        // redeploy
        context.getServletContext().setAttribute("meecrowave.configuration", Meecrowave.Builder.class.isInstance(configuration) ? configuration : new Meecrowave.Builder(configuration));
        context.addServletContainerInitializer(intializer, emptySet());
    }
    if (!configuration.isTomcatScanning()) {
        super.webConfig();
        return;
    }
    // eagerly start CDI to scan only once and not twice (tomcat+CDI)
    // should already be started at that point
    final ClassLoader loader = context.getLoader().getClassLoader();
    final Thread thread = Thread.currentThread();
    final ClassLoader old = thread.getContextClassLoader();
    thread.setContextClassLoader(loader);
    try {
        final ScannerService service = WebBeansContext.getInstance().getScannerService();
        if (OWBTomcatWebScannerService.class.isInstance(service)) {
            final OWBTomcatWebScannerService scannerService = OWBTomcatWebScannerService.class.cast(service);
            scannerService.setFilter(ofNullable(context.getJarScanner()).map(JarScanner::getJarScanFilter).orElse(null), context.getServletContext());
            scannerService.setDocBase(context.getDocBase());
            scannerService.setShared(configuration.getSharedLibraries());
            if (configuration.getWatcherBouncing() > 0) {
                // note that caching should be disabled with this config in most of the times
                watcher = new ReloadOnChangeController(context, configuration.getWatcherBouncing(), redeployCallback);
                scannerService.setFileVisitor(f -> watcher.register(f));
            }
            scannerService.scan();
            finder = scannerService.getFinder();
            finder.link();
            final CdiArchive archive = CdiArchive.class.cast(finder.getArchive());
            Stream.of(WebServlet.class, WebFilter.class, WebListener.class).forEach(marker -> finder.findAnnotatedClasses(marker).stream().filter(c -> !Modifier.isAbstract(c.getModifiers()) && Modifier.isPublic(c.getModifiers())).forEach(webComponent -> webClasses.computeIfAbsent(archive.classesByUrl().entrySet().stream().filter(e -> e.getValue().getClassNames().contains(webComponent.getName())).findFirst().get().getKey(), k -> new HashSet<>()).add(webComponent)));
        }
        super.webConfig();
    } finally {
        thread.setContextClassLoader(old);
        webClasses.clear();
        finder = null;
    }
}
Also used : OWBTomcatWebScannerService(org.apache.meecrowave.openwebbeans.OWBTomcatWebScannerService) LifecycleEvent(org.apache.catalina.LifecycleEvent) ScannerService(org.apache.webbeans.spi.ScannerService) WebXml(org.apache.tomcat.util.descriptor.web.WebXml) OwbAnnotationFinder(org.apache.webbeans.corespi.scanner.xbean.OwbAnnotationFinder) URL(java.net.URL) Lifecycle(org.apache.catalina.Lifecycle) HandlesTypes(javax.servlet.annotation.HandlesTypes) WebappServiceLoader(org.apache.catalina.startup.WebappServiceLoader) HashMap(java.util.HashMap) ReloadOnChangeController(org.apache.meecrowave.watching.ReloadOnChangeController) JarScanner(org.apache.tomcat.JarScanner) ClassParser(org.apache.tomcat.util.bcel.classfile.ClassParser) HashSet(java.util.HashSet) ServletContainerInitializer(javax.servlet.ServletContainerInitializer) Collections.singleton(java.util.Collections.singleton) ByteArrayInputStream(java.io.ByteArrayInputStream) Map(java.util.Map) InputSource(org.xml.sax.InputSource) Collections.emptySet(java.util.Collections.emptySet) LogFacade(org.apache.meecrowave.logging.tomcat.LogFacade) Optional.ofNullable(java.util.Optional.ofNullable) Collection(java.util.Collection) Set(java.util.Set) Configuration(org.apache.meecrowave.configuration.Configuration) IOException(java.io.IOException) Context(org.apache.catalina.Context) StandardCharsets(java.nio.charset.StandardCharsets) WebListener(javax.servlet.annotation.WebListener) Consumer(java.util.function.Consumer) WebServlet(javax.servlet.annotation.WebServlet) WebBeansContext(org.apache.webbeans.config.WebBeansContext) Stream(java.util.stream.Stream) WebFilter(javax.servlet.annotation.WebFilter) Modifier(java.lang.reflect.Modifier) ContextConfig(org.apache.catalina.startup.ContextConfig) Annotation(java.lang.annotation.Annotation) Meecrowave(org.apache.meecrowave.Meecrowave) InputStream(java.io.InputStream) CdiArchive(org.apache.webbeans.corespi.scanner.xbean.CdiArchive) WebFilter(javax.servlet.annotation.WebFilter) CdiArchive(org.apache.webbeans.corespi.scanner.xbean.CdiArchive) JarScanner(org.apache.tomcat.JarScanner) OWBTomcatWebScannerService(org.apache.meecrowave.openwebbeans.OWBTomcatWebScannerService) ScannerService(org.apache.webbeans.spi.ScannerService) OWBTomcatWebScannerService(org.apache.meecrowave.openwebbeans.OWBTomcatWebScannerService) WebListener(javax.servlet.annotation.WebListener) WebServlet(javax.servlet.annotation.WebServlet) Meecrowave(org.apache.meecrowave.Meecrowave) ReloadOnChangeController(org.apache.meecrowave.watching.ReloadOnChangeController) HashSet(java.util.HashSet)

Example 10 with Configuration

use of org.apache.meecrowave.configuration.Configuration in project meecrowave by apache.

the class OWBAutoSetup method onStartup.

@Override
public void onStartup(final Set<Class<?>> c, final ServletContext ctx) {
    final Configuration builder = Configuration.class.cast(ctx.getAttribute("meecrowave.configuration"));
    final Meecrowave instance = Meecrowave.class.cast(ctx.getAttribute("meecrowave.instance"));
    if (builder.isCdiConversation()) {
        try {
            final Class<? extends Filter> clazz = (Class<? extends Filter>) OWBAutoSetup.class.getClassLoader().loadClass("org.apache.webbeans.web.context.WebConversationFilter");
            final FilterRegistration.Dynamic filter = ctx.addFilter("owb-conversation", clazz);
            filter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false, "/*");
        } catch (final Exception e) {
        // no-op
        }
    }
    // eager boot to let injections work in listeners
    final EagerBootListener bootListener = new EagerBootListener(instance);
    bootListener.doContextInitialized(new ServletContextEvent(ctx));
    ctx.addListener(bootListener);
}
Also used : Configuration(org.apache.meecrowave.configuration.Configuration) Filter(javax.servlet.Filter) DispatcherType(javax.servlet.DispatcherType) Meecrowave(org.apache.meecrowave.Meecrowave) ServletContextEvent(javax.servlet.ServletContextEvent) FilterRegistration(javax.servlet.FilterRegistration)

Aggregations

Configuration (org.apache.meecrowave.configuration.Configuration)12 IOException (java.io.IOException)8 Field (java.lang.reflect.Field)5 Collection (java.util.Collection)5 Map (java.util.Map)5 Optional.ofNullable (java.util.Optional.ofNullable)5 Collectors.toList (java.util.stream.Collectors.toList)5 Stream (java.util.stream.Stream)5 File (java.io.File)4 InputStream (java.io.InputStream)4 MalformedURLException (java.net.MalformedURLException)4 URL (java.net.URL)4 StandardCharsets (java.nio.charset.StandardCharsets)4 HashMap (java.util.HashMap)4 List (java.util.List)4 OutputStream (java.io.OutputStream)3 StringReader (java.io.StringReader)3 Writer (java.io.Writer)3 URLClassLoader (java.net.URLClassLoader)3 ArrayList (java.util.ArrayList)3