You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2022/11/22 05:48:41 UTC

[james-project] branch master updated (47ad548066 -> a109725eaf)

This is an automated email from the ASF dual-hosted git repository.

btellier pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git


    from 47ad548066 [ADR] 64. Account Delegation (#1310)
     new 4e5ef9ec36 JAMES-3859 configurable -> startable
     new 48e4ecc4f4 JAMES-3859 start sequence ordering should take provisions into account
     new 1d0c5bb196 JAMES-3859 Require JPA application to use the ElasticSearch reporter extension
     new a109725eaf JAMES-3860 Rely on Files.createTempFile

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../james/mailbox/store/StoreMessageManager.java   |   3 +-
 .../james/transport/mailets/StripAttachment.java   |   3 +-
 server/apps/jpa-app/pom.xml                        |   4 -
 .../java/org/apache/james/JPAJamesServerMain.java  |   2 -
 .../java/org/apache/james/JPAJamesServerMain.java  |   2 -
 .../java/org/apache/james/StartSequenceTest.java   | 189 +++++++++++++++++++++
 .../core/BufferedDeferredFileOutputStream.java     |  18 +-
 .../server/core/MimeMessageInputStreamSource.java  |   9 +-
 .../core/BufferedDeferredFileOutputStreamTest.java |  13 +-
 .../org/apache/james/modules/StartablesModule.java |  26 +++
 .../james/utils/InitializationOperations.java      |  25 +--
 .../java/org/apache/james/utils/Startables.java    |   1 -
 .../modules/InitializationOperationsTest.java      |  56 ++----
 .../james/utils/InitializationOperation.java       |   8 +
 .../james/utils/InitilizationOperationBuilder.java |  35 +++-
 .../sieverepository/file/SieveFileRepository.java  |   3 +-
 .../imapserver/netty/ImapRequestFrameDecoder.java  |   3 +-
 17 files changed, 302 insertions(+), 98 deletions(-)
 create mode 100644 server/apps/memory-app/src/test/java/org/apache/james/StartSequenceTest.java


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 01/04: JAMES-3859 configurable -> startable

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 4e5ef9ec36c1bc3f53d9605e2a16d71cc7717de4
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Nov 18 12:05:39 2022 +0700

    JAMES-3859 configurable -> startable
---
 .../org/apache/james/utils/InitializationOperations.java | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/server/container/guice/common/src/main/java/org/apache/james/utils/InitializationOperations.java b/server/container/guice/common/src/main/java/org/apache/james/utils/InitializationOperations.java
index fde491545f..f2388d13cd 100644
--- a/server/container/guice/common/src/main/java/org/apache/james/utils/InitializationOperations.java
+++ b/server/container/guice/common/src/main/java/org/apache/james/utils/InitializationOperations.java
@@ -31,31 +31,31 @@ import com.google.inject.Inject;
 public class InitializationOperations {
 
     private final Set<InitializationOperation> initializationOperations;
-    private final Startables configurables;
+    private final Startables startables;
 
     @Inject
-    public InitializationOperations(Set<InitializationOperation> initializationOperations, Startables configurables) {
+    public InitializationOperations(Set<InitializationOperation> initializationOperations, Startables startables) {
         this.initializationOperations = initializationOperations;
-        this.configurables = configurables;
+        this.startables = startables;
     }
 
     public void initModules() {
-        Set<InitializationOperation> processed = processConfigurables();
+        Set<InitializationOperation> processed = processStartables();
         
         processOthers(processed);
     }
 
-    private Set<InitializationOperation> processConfigurables() {
-        return configurables.get().stream()
+    private Set<InitializationOperation> processStartables() {
+        return startables.get().stream()
             .flatMap(this::configurationPerformerFor)
             .distinct()
             .peek(Throwing.consumer(InitializationOperation::initModule).sneakyThrow())
             .collect(Collectors.toSet());
     }
 
-    private Stream<InitializationOperation> configurationPerformerFor(Class<? extends Startable> configurable) {
+    private Stream<InitializationOperation> configurationPerformerFor(Class<? extends Startable> startable) {
         return initializationOperations.stream()
-                .filter(x -> x.forClass().equals(configurable));
+                .filter(x -> x.forClass().equals(startable));
     }
 
     private void processOthers(Set<InitializationOperation> processed) {


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 03/04: JAMES-3859 Require JPA application to use the ElasticSearch reporter extension

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 1d0c5bb1964acc171487853c3f91e8fec0dfd27b
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Sat Nov 19 10:49:52 2022 +0700

    JAMES-3859 Require JPA application to use the ElasticSearch reporter extension
---
 server/apps/jpa-app/pom.xml                                           | 4 ----
 .../jpa-app/src/main/java/org/apache/james/JPAJamesServerMain.java    | 1 -
 .../src/main/java/org/apache/james/JPAJamesServerMain.java            | 2 --
 3 files changed, 7 deletions(-)

diff --git a/server/apps/jpa-app/pom.xml b/server/apps/jpa-app/pom.xml
index 3d0de60627..7cc2a88848 100644
--- a/server/apps/jpa-app/pom.xml
+++ b/server/apps/jpa-app/pom.xml
@@ -96,10 +96,6 @@
             <type>test-jar</type>
             <scope>test</scope>
         </dependency>
-        <dependency>
-            <groupId>${james.groupId}</groupId>
-            <artifactId>james-server-guice-es-resporter</artifactId>
-        </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
             <artifactId>james-server-guice-imap</artifactId>
diff --git a/server/apps/jpa-app/src/main/java/org/apache/james/JPAJamesServerMain.java b/server/apps/jpa-app/src/main/java/org/apache/james/JPAJamesServerMain.java
index c1dcdf341b..063366b0ab 100644
--- a/server/apps/jpa-app/src/main/java/org/apache/james/JPAJamesServerMain.java
+++ b/server/apps/jpa-app/src/main/java/org/apache/james/JPAJamesServerMain.java
@@ -80,7 +80,6 @@ public class JPAJamesServerMain implements JamesServerMain {
     private static final Module JPA_SERVER_MODULE = Modules.combine(
         new ActiveMQQueueModule(),
         new DefaultProcessorsConfigurationProviderModule(),
-        new ElasticSearchMetricReporterModule(),
         new JPADataModule(),
         new JPAMailboxModule(),
         new MailboxModule(),
diff --git a/server/apps/jpa-smtp-app/src/main/java/org/apache/james/JPAJamesServerMain.java b/server/apps/jpa-smtp-app/src/main/java/org/apache/james/JPAJamesServerMain.java
index 41f985bbfa..be0b84bfb7 100644
--- a/server/apps/jpa-smtp-app/src/main/java/org/apache/james/JPAJamesServerMain.java
+++ b/server/apps/jpa-smtp-app/src/main/java/org/apache/james/JPAJamesServerMain.java
@@ -31,7 +31,6 @@ import org.apache.james.modules.queue.activemq.ActiveMQQueueModule;
 import org.apache.james.modules.server.DKIMMailetModule;
 import org.apache.james.modules.server.DataRoutesModules;
 import org.apache.james.modules.server.DefaultProcessorsConfigurationProviderModule;
-import org.apache.james.modules.server.ElasticSearchMetricReporterModule;
 import org.apache.james.modules.server.MailQueueRoutesModule;
 import org.apache.james.modules.server.MailRepositoriesRoutesModule;
 import org.apache.james.modules.server.NoJwtModule;
@@ -61,7 +60,6 @@ public class JPAJamesServerMain implements JamesServerMain {
         new JPADataModule(),
         new ActiveMQQueueModule(),
         new RawPostDequeueDecoratorModule(),
-        new ElasticSearchMetricReporterModule(),
         new JPAAuthorizatorModule());
 
     public static void main(String[] args) throws Exception {


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 02/04: JAMES-3859 start sequence ordering should take provisions into account

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 48e4ecc4f47c6fc89a5969b715a3eedcd1de3e88
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Nov 18 12:07:35 2022 +0700

    JAMES-3859 start sequence ordering should take provisions into account
    
    Provider listener order needs to be corrected, for this we add the notion of requirements that is
    inferred by the class constructor parameters.
---
 .../java/org/apache/james/StartSequenceTest.java   | 189 +++++++++++++++++++++
 .../org/apache/james/modules/StartablesModule.java |  26 +++
 .../james/utils/InitializationOperations.java      |  13 +-
 .../java/org/apache/james/utils/Startables.java    |   1 -
 .../modules/InitializationOperationsTest.java      |  56 ++----
 .../james/utils/InitializationOperation.java       |   8 +
 .../james/utils/InitilizationOperationBuilder.java |  35 +++-
 7 files changed, 276 insertions(+), 52 deletions(-)

diff --git a/server/apps/memory-app/src/test/java/org/apache/james/StartSequenceTest.java b/server/apps/memory-app/src/test/java/org/apache/james/StartSequenceTest.java
new file mode 100644
index 0000000000..c4d061a5b4
--- /dev/null
+++ b/server/apps/memory-app/src/test/java/org/apache/james/StartSequenceTest.java
@@ -0,0 +1,189 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james;
+
+import static org.apache.james.data.UsersRepositoryModuleChooser.Implementation.DEFAULT;
+import static org.assertj.core.api.Assertions.assertThatCode;
+
+import org.apache.james.lifecycle.api.Startable;
+import org.apache.james.modules.TestJMAPServerModule;
+import org.apache.james.utils.InitializationOperation;
+import org.apache.james.utils.InitilizationOperationBuilder;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+import org.testcontainers.shaded.com.google.common.collect.ImmutableList;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import com.google.inject.Provides;
+import com.google.inject.Scopes;
+import com.google.inject.Singleton;
+import com.google.inject.multibindings.ProvidesIntoSet;
+
+class StartSequenceTest {
+    static class A implements Startable {
+        public boolean started = false;
+
+        public void start() {
+            started = true;
+        }
+    }
+    static class D implements Startable {
+        public boolean started = false;
+
+        public void start() {
+            started = true;
+        }
+    }
+    static class F implements Startable {
+        public boolean started = false;
+
+        public void start() {
+            started = true;
+        }
+    }
+
+    static class B implements Startable {
+        private final A a;
+
+        @Inject
+        B(A a) {
+            this.a = a;
+        }
+
+        public void start() {
+            assert a.started;
+        }
+    }
+
+    static class C implements Startable {
+        private final D d;
+
+        @Inject
+        C(D d) {
+            this.d = d;
+        }
+
+        public void start() {
+            assert d.started;
+        }
+    }
+
+    static class E implements Startable {
+        private final F f;
+        private final A a;
+
+        @Inject
+        E(F f, A a) {
+            this.f = f;
+            this.a = a;
+        }
+
+        public void start() {
+            assert f.started;
+            assert a.started;
+        }
+    }
+
+    static class ConfigurableTestModule extends AbstractModule {
+
+        @Override
+        protected void configure() {
+            bind(B.class).in(Scopes.SINGLETON);
+            bind(C.class).in(Scopes.SINGLETON);
+            bind(D.class).in(Scopes.SINGLETON);
+            bind(F.class).in(Scopes.SINGLETON);
+        }
+
+        @Provides
+        @Singleton
+        E e(F f, A a) {
+            return new E(f, a);
+        }
+
+        @Provides
+        @Singleton
+        A a() {
+            return new A();
+        }
+
+        @ProvidesIntoSet
+        InitializationOperation initA(A a) {
+            return InitilizationOperationBuilder
+                .forClass(A.class)
+                .init(a::start);
+        }
+
+        @ProvidesIntoSet
+        InitializationOperation initB(B b) {
+            return InitilizationOperationBuilder
+                .forClass(B.class)
+                .init(b::start);
+        }
+
+        @ProvidesIntoSet
+        InitializationOperation initC(C c) {
+            return InitilizationOperationBuilder
+                .forClass(C.class)
+                .init(c::start);
+        }
+
+        @ProvidesIntoSet
+        InitializationOperation initD(D d) {
+            return InitilizationOperationBuilder
+                .forClass(D.class)
+                .init(d::start);
+        }
+
+        @ProvidesIntoSet
+        InitializationOperation initD(E e) {
+            return InitilizationOperationBuilder
+                .forClass(E.class)
+                .init(e::start)
+                .requires(ImmutableList.of(A.class, F.class));
+        }
+
+        @ProvidesIntoSet
+        InitializationOperation initD(F f) {
+            return InitilizationOperationBuilder
+                .forClass(F.class)
+                .init(f::start);
+        }
+    }
+
+    @RegisterExtension
+    static JamesServerExtension jamesServerExtension = new JamesServerBuilder<MemoryJamesConfiguration>(tmpDir ->
+        MemoryJamesConfiguration.builder()
+            .workingDirectory(tmpDir)
+            .configurationFromClasspath()
+            .usersRepository(DEFAULT)
+            .build())
+        .server(configuration -> MemoryJamesServerMain.createServer(configuration)
+            .overrideWith(new TestJMAPServerModule())
+            .overrideWith(new ConfigurableTestModule()))
+        .lifeCycle(JamesServerExtension.Lifecycle.PER_CLASS)
+        .disableAutoStart()
+        .build();
+
+    @Test
+    void providesShouldBeTakenIntoAccountByTheStartSequence(GuiceJamesServer server) {
+        assertThatCode(server::start).doesNotThrowAnyException();
+    }
+}
diff --git a/server/container/guice/common/src/main/java/org/apache/james/modules/StartablesModule.java b/server/container/guice/common/src/main/java/org/apache/james/modules/StartablesModule.java
index 146cac7d83..0c32b788c2 100644
--- a/server/container/guice/common/src/main/java/org/apache/james/modules/StartablesModule.java
+++ b/server/container/guice/common/src/main/java/org/apache/james/modules/StartablesModule.java
@@ -23,13 +23,17 @@ import static com.google.common.base.Preconditions.checkNotNull;
 
 import java.io.Serializable;
 
+import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.lifecycle.api.Startable;
 import org.apache.james.utils.Startables;
 
 import com.google.inject.AbstractModule;
+import com.google.inject.Binding;
 import com.google.inject.TypeLiteral;
 import com.google.inject.matcher.AbstractMatcher;
+import com.google.inject.matcher.Matcher;
 import com.google.inject.spi.InjectionListener;
+import com.google.inject.spi.ProvisionListener;
 import com.google.inject.spi.TypeEncounter;
 
 public class StartablesModule extends AbstractModule {
@@ -45,6 +49,28 @@ public class StartablesModule extends AbstractModule {
         bind(Startables.class).toInstance(startables);
 
         bindListener(new SubclassesOf(Startable.class), this::hear);
+        bindListener(new Matcher<Binding<?>>() {
+            @Override
+            public boolean matches(Binding<?> binding) {
+                return Startable.class.isAssignableFrom(binding.getKey().getTypeLiteral().getRawType());
+            }
+
+            @Override
+            public Matcher<Binding<?>> and(Matcher<? super Binding<?>> matcher) {
+                throw new NotImplementedException();
+            }
+
+            @Override
+            public Matcher<Binding<?>> or(Matcher<? super Binding<?>> matcher) {
+                throw new NotImplementedException();
+            }
+        }, new ProvisionListener() {
+            @Override
+            public <T> void onProvision(ProvisionInvocation<T> invokation) {
+                startables.add(invokation.getBinding().getKey().getTypeLiteral().getRawType().asSubclass(Startable.class));
+            }
+        });
+
     }
 
     private <I> void hear(TypeLiteral<I> type, TypeEncounter<I> encounter) {
diff --git a/server/container/guice/common/src/main/java/org/apache/james/utils/InitializationOperations.java b/server/container/guice/common/src/main/java/org/apache/james/utils/InitializationOperations.java
index f2388d13cd..61adb875d3 100644
--- a/server/container/guice/common/src/main/java/org/apache/james/utils/InitializationOperations.java
+++ b/server/container/guice/common/src/main/java/org/apache/james/utils/InitializationOperations.java
@@ -23,8 +23,6 @@ import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import org.apache.james.lifecycle.api.Startable;
-
 import com.github.fge.lambdas.Throwing;
 import com.google.inject.Inject;
 
@@ -53,9 +51,16 @@ public class InitializationOperations {
             .collect(Collectors.toSet());
     }
 
-    private Stream<InitializationOperation> configurationPerformerFor(Class<? extends Startable> startable) {
+    /**
+     * Locate configuration performer for this class.
+     *
+     * We reorder the performer so that one class requirements are always satisfied (startable order is wrong for
+     * provisioned instances...)
+     */
+    private Stream<InitializationOperation> configurationPerformerFor(Class<?> startable) {
         return initializationOperations.stream()
-                .filter(x -> x.forClass().equals(startable));
+                .filter(x -> startable.isAssignableFrom(x.forClass()))
+                .flatMap(x -> Stream.concat(x.requires().stream().flatMap(this::configurationPerformerFor), Stream.of(x)));
     }
 
     private void processOthers(Set<InitializationOperation> processed) {
diff --git a/server/container/guice/common/src/main/java/org/apache/james/utils/Startables.java b/server/container/guice/common/src/main/java/org/apache/james/utils/Startables.java
index b2a16d5892..ef8bee20c6 100644
--- a/server/container/guice/common/src/main/java/org/apache/james/utils/Startables.java
+++ b/server/container/guice/common/src/main/java/org/apache/james/utils/Startables.java
@@ -27,7 +27,6 @@ import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
 
 public class Startables {
-
     private final Set<Class<? extends Startable>> startables;
 
     public Startables() {
diff --git a/server/container/guice/common/src/test/java/org/apache/james/modules/InitializationOperationsTest.java b/server/container/guice/common/src/test/java/org/apache/james/modules/InitializationOperationsTest.java
index f5e1bee7d7..73c5a7c80d 100644
--- a/server/container/guice/common/src/test/java/org/apache/james/modules/InitializationOperationsTest.java
+++ b/server/container/guice/common/src/test/java/org/apache/james/modules/InitializationOperationsTest.java
@@ -30,12 +30,14 @@ import org.apache.james.lifecycle.api.Configurable;
 import org.apache.james.lifecycle.api.Startable;
 import org.apache.james.utils.InitializationOperation;
 import org.apache.james.utils.InitializationOperations;
+import org.apache.james.utils.InitilizationOperationBuilder;
 import org.junit.jupiter.api.Test;
 
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.google.inject.Scopes;
 import com.google.inject.multibindings.Multibinder;
+import com.google.inject.multibindings.ProvidesIntoSet;
 
 class InitializationOperationsTest {
     @Test
@@ -56,55 +58,21 @@ class InitializationOperationsTest {
             bind(B.class).in(Scopes.SINGLETON);
             bind(A.class).in(Scopes.SINGLETON);
             bind(C.class).in(Scopes.SINGLETON);
-    
-            Multibinder.newSetBinder(binder(), InitializationOperation.class).addBinding().to(BInitializationOperation.class);
-            Multibinder.newSetBinder(binder(), InitializationOperation.class).addBinding().to(AInitializationOperation.class);
         }
-    }
-
-    private static class AInitializationOperation implements InitializationOperation {
-        private final A a;
 
-        @Inject
-        private AInitializationOperation(A a) {
-            this.a = a;
+        @ProvidesIntoSet
+        InitializationOperation initA(A a) {
+            return InitilizationOperationBuilder
+                .forClass(A.class)
+                .init(() -> a.configure(null));
         }
 
-        @Override
-        public void initModule() {
-            try {
-                a.configure(null);
-            } catch (ConfigurationException e) {
-                throw new RuntimeException(e);
-            }
-        }
 
-        @Override
-        public Class<? extends Startable> forClass() {
-            return A.class;
-        }
-    }
-
-    private static class BInitializationOperation implements InitializationOperation {
-        private final B b;
-
-        @Inject
-        private BInitializationOperation(B b) {
-            this.b = b;
-        }
-
-        @Override
-        public void initModule() {
-            try {
-                b.configure(null);
-            } catch (ConfigurationException e) {
-                throw new RuntimeException(e);
-            }
-        }
-
-        @Override
-        public Class<? extends Startable> forClass() {
-            return B.class;
+        @ProvidesIntoSet
+        InitializationOperation initB(B b) {
+            return InitilizationOperationBuilder
+                .forClass(B.class)
+                .init(() -> b.configure(null));
         }
     }
 
diff --git a/server/container/guice/configuration/src/main/java/org/apache/james/utils/InitializationOperation.java b/server/container/guice/configuration/src/main/java/org/apache/james/utils/InitializationOperation.java
index d43f7f0d82..5741755590 100644
--- a/server/container/guice/configuration/src/main/java/org/apache/james/utils/InitializationOperation.java
+++ b/server/container/guice/configuration/src/main/java/org/apache/james/utils/InitializationOperation.java
@@ -19,8 +19,12 @@
 
 package org.apache.james.utils;
 
+import java.util.List;
+
 import org.apache.james.lifecycle.api.Startable;
 
+import com.google.common.collect.ImmutableList;
+
 public interface InitializationOperation {
 
     void initModule() throws Exception;
@@ -33,4 +37,8 @@ public interface InitializationOperation {
      * @return the Class that this object will initialize.
      */
     Class<? extends Startable> forClass();
+
+    default List<Class<?>> requires() {
+        return ImmutableList.of();
+    }
 }
diff --git a/server/container/guice/configuration/src/main/java/org/apache/james/utils/InitilizationOperationBuilder.java b/server/container/guice/configuration/src/main/java/org/apache/james/utils/InitilizationOperationBuilder.java
index 8bdf04cc71..a13e4fa45c 100644
--- a/server/container/guice/configuration/src/main/java/org/apache/james/utils/InitilizationOperationBuilder.java
+++ b/server/container/guice/configuration/src/main/java/org/apache/james/utils/InitilizationOperationBuilder.java
@@ -19,8 +19,15 @@
 
 package org.apache.james.utils;
 
+import java.util.Arrays;
+import java.util.List;
+
+import javax.inject.Inject;
+
 import org.apache.james.lifecycle.api.Startable;
 
+import com.google.common.collect.ImmutableList;
+
 public class InitilizationOperationBuilder {
 
     @FunctionalInterface
@@ -30,21 +37,33 @@ public class InitilizationOperationBuilder {
 
     @FunctionalInterface
     public interface RequireInit {
-        InitializationOperation init(Init init);
+        PrivateImpl init(Init init);
     }
 
     public static RequireInit forClass(Class<? extends Startable> type) {
         return init -> new PrivateImpl(init, type);
     }
 
-    private static class PrivateImpl implements InitializationOperation {
-
+    public static class PrivateImpl implements InitializationOperation {
         private final Init init;
         private final Class<? extends Startable> type;
+        private List<Class<?>> requires;
 
         private PrivateImpl(Init init, Class<? extends Startable> type) {
             this.init = init;
             this.type = type;
+            /*
+            Class requirements are by default infered from the parameters of the first @Inject annotated constructor.
+
+            If it does not exist, use the first constructor (case in a @Provides).
+             */
+            this.requires = Arrays.stream(type.getDeclaredConstructors())
+                .filter(c -> c.isAnnotationPresent(Inject.class))
+                .findFirst()
+                .or(() -> Arrays.stream(type.getDeclaredConstructors()).findFirst())
+                .stream()
+                .flatMap(c -> Arrays.stream(c.getParameterTypes()))
+                .collect(ImmutableList.toImmutableList());
         }
 
         @Override
@@ -56,5 +75,15 @@ public class InitilizationOperationBuilder {
         public Class<? extends Startable> forClass() {
             return type;
         }
+
+        public PrivateImpl requires(List<Class<?>> requires) {
+            this.requires = requires;
+            return this;
+        }
+
+        @Override
+        public List<Class<?>> requires() {
+            return requires;
+        }
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 04/04: JAMES-3860 Rely on Files.createTempFile

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit a109725eafecb05f63f8312fcd8c6ec51f15e3d9
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Nov 21 09:12:36 2022 +0700

    JAMES-3860 Rely on Files.createTempFile
---
 .../james/mailbox/store/StoreMessageManager.java       |  3 ++-
 .../james/transport/mailets/StripAttachment.java       |  3 ++-
 .../main/java/org/apache/james/JPAJamesServerMain.java |  1 -
 .../server/core/BufferedDeferredFileOutputStream.java  | 18 ++++++------------
 .../server/core/MimeMessageInputStreamSource.java      |  9 ++-------
 .../core/BufferedDeferredFileOutputStreamTest.java     | 13 ++++---------
 .../sieverepository/file/SieveFileRepository.java      |  3 ++-
 .../imapserver/netty/ImapRequestFrameDecoder.java      |  3 ++-
 8 files changed, 20 insertions(+), 33 deletions(-)

diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
index 0218ae6460..2eea248588 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
@@ -30,6 +30,7 @@ import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.file.Files;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.EnumSet;
@@ -351,7 +352,7 @@ public class StoreMessageManager implements MessageManager {
             // Create a temporary file and copy the message to it. We will work
             // with the file as
             // source for the InputStream
-            file = File.createTempFile("imap", ".msg");
+            file = Files.createTempFile("imap", ".msg").toFile();
             try (FileOutputStream out = new FileOutputStream(file);
                 BufferedOutputStream bufferedOut = new BufferedOutputStream(out);
                 BufferedInputStream tmpMsgIn = new BufferedInputStream(new TeeInputStream(msgIn, bufferedOut));
diff --git a/mailet/standard/src/main/java/org/apache/james/transport/mailets/StripAttachment.java b/mailet/standard/src/main/java/org/apache/james/transport/mailets/StripAttachment.java
index bd04f95ba2..12c8b7f289 100644
--- a/mailet/standard/src/main/java/org/apache/james/transport/mailets/StripAttachment.java
+++ b/mailet/standard/src/main/java/org/apache/james/transport/mailets/StripAttachment.java
@@ -25,6 +25,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
+import java.nio.file.Files;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
@@ -463,7 +464,7 @@ public class StripAttachment extends GenericMailet {
 
     private File createTempFile(String originalFileName) throws IOException {
         OutputFileName outputFileName = OutputFileName.from(originalFileName);
-        return File.createTempFile(outputFileName.getPrefix(), outputFileName.getSuffix(), new File(directoryName));
+        return Files.createTempFile(new File(directoryName).toPath(), outputFileName.getPrefix(), outputFileName.getSuffix()).toFile();
     }
 
     @VisibleForTesting static class OutputFileName {
diff --git a/server/apps/jpa-app/src/main/java/org/apache/james/JPAJamesServerMain.java b/server/apps/jpa-app/src/main/java/org/apache/james/JPAJamesServerMain.java
index 063366b0ab..aa62cbe259 100644
--- a/server/apps/jpa-app/src/main/java/org/apache/james/JPAJamesServerMain.java
+++ b/server/apps/jpa-app/src/main/java/org/apache/james/JPAJamesServerMain.java
@@ -38,7 +38,6 @@ import org.apache.james.modules.protocols.SMTPServerModule;
 import org.apache.james.modules.queue.activemq.ActiveMQQueueModule;
 import org.apache.james.modules.server.DataRoutesModules;
 import org.apache.james.modules.server.DefaultProcessorsConfigurationProviderModule;
-import org.apache.james.modules.server.ElasticSearchMetricReporterModule;
 import org.apache.james.modules.server.InconsistencyQuotasSolvingRoutesModule;
 import org.apache.james.modules.server.JMXServerModule;
 import org.apache.james.modules.server.MailQueueRoutesModule;
diff --git a/server/container/core/src/main/java/org/apache/james/server/core/BufferedDeferredFileOutputStream.java b/server/container/core/src/main/java/org/apache/james/server/core/BufferedDeferredFileOutputStream.java
index b5e3f1e58d..8a528dd7da 100644
--- a/server/container/core/src/main/java/org/apache/james/server/core/BufferedDeferredFileOutputStream.java
+++ b/server/container/core/src/main/java/org/apache/james/server/core/BufferedDeferredFileOutputStream.java
@@ -25,6 +25,7 @@ import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
+import java.nio.file.Files;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.io.output.ByteArrayOutputStream;
@@ -79,11 +80,6 @@ public class BufferedDeferredFileOutputStream extends ThresholdingOutputStream i
      */
     private final String suffix;
 
-    /**
-     * The directory to use for temporary files.
-     */
-    private final File directory;
-
 
     /**
      * True when close() has been called successfully.
@@ -98,7 +94,7 @@ public class BufferedDeferredFileOutputStream extends ThresholdingOutputStream i
      * @param outputFile The file to which data is saved beyond the threshold.
      */
     public BufferedDeferredFileOutputStream(final int threshold, final File outputFile) {
-        this(threshold,  outputFile, null, null, null);
+        this(threshold,  outputFile, null, null);
     }
 
 
@@ -109,10 +105,9 @@ public class BufferedDeferredFileOutputStream extends ThresholdingOutputStream i
      * @param threshold  The number of bytes at which to trigger an event.
      * @param prefix Prefix to use for the temporary file.
      * @param suffix Suffix to use for the temporary file.
-     * @param directory Temporary file directory.
      */
-    public BufferedDeferredFileOutputStream(final int threshold, final String prefix, final String suffix, final File directory) {
-        this(threshold, null, prefix, suffix, directory);
+    public BufferedDeferredFileOutputStream(final int threshold, final String prefix, final String suffix) {
+        this(threshold, null, prefix, suffix);
         if (prefix == null) {
             throw new IllegalArgumentException("Temporary file prefix is missing");
         }
@@ -129,7 +124,7 @@ public class BufferedDeferredFileOutputStream extends ThresholdingOutputStream i
      * @param directory Temporary file directory.
      */
     private BufferedDeferredFileOutputStream(final int threshold, final File outputFile, final String prefix,
-                                             final String suffix, final File directory) {
+                                             final String suffix) {
         super(threshold);
         this.outputFile = outputFile;
 
@@ -137,7 +132,6 @@ public class BufferedDeferredFileOutputStream extends ThresholdingOutputStream i
         currentOutputStream = memoryOutputStream;
         this.prefix = prefix;
         this.suffix = suffix;
-        this.directory = directory;
     }
 
     /**
@@ -164,7 +158,7 @@ public class BufferedDeferredFileOutputStream extends ThresholdingOutputStream i
     @Override
     protected void thresholdReached() throws IOException {
         if (prefix != null) {
-            outputFile = File.createTempFile(prefix, suffix, directory);
+            outputFile = Files.createTempFile(prefix, suffix).toFile();
         }
         final FileOutputStream fos = new FileOutputStream(outputFile);
         try {
diff --git a/server/container/core/src/main/java/org/apache/james/server/core/MimeMessageInputStreamSource.java b/server/container/core/src/main/java/org/apache/james/server/core/MimeMessageInputStreamSource.java
index 4a88390545..6c8614a2a3 100644
--- a/server/container/core/src/main/java/org/apache/james/server/core/MimeMessageInputStreamSource.java
+++ b/server/container/core/src/main/java/org/apache/james/server/core/MimeMessageInputStreamSource.java
@@ -64,11 +64,6 @@ public class MimeMessageInputStreamSource extends Disposable.LeakAware<MimeMessa
      */
     private final String sourceId;
 
-    /**
-     * Temporary directory to use
-     */
-    private static final File TMPDIR = new File(System.getProperty("java.io.tmpdir"));
-
     static class Resource extends LeakAware.Resource {
         private final BufferedDeferredFileOutputStream out;
         private final Set<InputStream> streams;
@@ -111,7 +106,7 @@ public class MimeMessageInputStreamSource extends Disposable.LeakAware<MimeMessa
 
     public static MimeMessageInputStreamSource create(String key, InputStream in) throws MessagingException {
         Disposable.LeakAware.track();
-        BufferedDeferredFileOutputStream out = new BufferedDeferredFileOutputStream(THRESHOLD, "mimemessage-" + key, ".m64", TMPDIR);
+        BufferedDeferredFileOutputStream out = new BufferedDeferredFileOutputStream(THRESHOLD, "mimemessage-" + key, ".m64");
         Resource resource = new Resource(out, new HashSet<>());
 
         return new MimeMessageInputStreamSource(resource, key, in);
@@ -119,7 +114,7 @@ public class MimeMessageInputStreamSource extends Disposable.LeakAware<MimeMessa
 
     public static MimeMessageInputStreamSource create(String key) {
         Disposable.LeakAware.track();
-        BufferedDeferredFileOutputStream out = new BufferedDeferredFileOutputStream(THRESHOLD, "mimemessage-" + key, ".m64", TMPDIR);
+        BufferedDeferredFileOutputStream out = new BufferedDeferredFileOutputStream(THRESHOLD, "mimemessage-" + key, ".m64");
         Resource resource = new Resource(out, new HashSet<>());
 
         return new MimeMessageInputStreamSource(resource, key);
diff --git a/server/container/core/src/test/java/org/apache/james/server/core/BufferedDeferredFileOutputStreamTest.java b/server/container/core/src/test/java/org/apache/james/server/core/BufferedDeferredFileOutputStreamTest.java
index c4c683ad0a..52920bc314 100644
--- a/server/container/core/src/test/java/org/apache/james/server/core/BufferedDeferredFileOutputStreamTest.java
+++ b/server/container/core/src/test/java/org/apache/james/server/core/BufferedDeferredFileOutputStreamTest.java
@@ -245,9 +245,8 @@ public class BufferedDeferredFileOutputStreamTest {
 
         final String prefix = "commons-io-test";
         final String suffix = ".out";
-        final File tempDir  = new File(".");
         final BufferedDeferredFileOutputStream dfos =
-            new BufferedDeferredFileOutputStream(testBytes.length + 42,  prefix, suffix, tempDir);
+            new BufferedDeferredFileOutputStream(testBytes.length + 42,  prefix, suffix);
         assertNull("Check file is null-A", dfos.getFile());
         try
         {
@@ -269,9 +268,8 @@ public class BufferedDeferredFileOutputStreamTest {
 
         final String prefix = "commons-io-test";
         final String suffix = ".out";
-        final File tempDir  = new File(".");
         final BufferedDeferredFileOutputStream dfos =
-            new BufferedDeferredFileOutputStream(testBytes.length - 5, prefix, suffix, tempDir);
+            new BufferedDeferredFileOutputStream(testBytes.length - 5, prefix, suffix);
         assertNull("Check file is null-A", dfos.getFile());
         try
         {
@@ -287,7 +285,6 @@ public class BufferedDeferredFileOutputStreamTest {
         assertTrue("Check file exists", dfos.getFile().exists());
         assertTrue("Check prefix", dfos.getFile().getName().startsWith(prefix));
         assertTrue("Check suffix", dfos.getFile().getName().endsWith(suffix));
-        assertEquals("Check dir", tempDir.getPath(), dfos.getFile().getParent());
 
         verifyResultFile(dfos.getFile());
 
@@ -303,9 +300,8 @@ public class BufferedDeferredFileOutputStreamTest {
 
         final String prefix = "commons-io-test";
         final String suffix = null;
-        final File tempDir  = null;
         final BufferedDeferredFileOutputStream dfos =
-            new BufferedDeferredFileOutputStream(testBytes.length - 5, prefix, suffix, tempDir);
+            new BufferedDeferredFileOutputStream(testBytes.length - 5, prefix, suffix);
         assertNull("Check file is null-A", dfos.getFile());
         try
         {
@@ -337,10 +333,9 @@ public class BufferedDeferredFileOutputStreamTest {
 
         final String prefix = null;
         final String suffix = ".out";
-        final File tempDir  = new File(".");
         try
         {
-            (new BufferedDeferredFileOutputStream(testBytes.length - 5, prefix, suffix, tempDir)).close();
+            (new BufferedDeferredFileOutputStream(testBytes.length - 5, prefix, suffix)).close();
             fail("Expected IllegalArgumentException ");
         }
         catch (final IllegalArgumentException e) {
diff --git a/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java b/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java
index b70496b6b3..aeac6604cb 100644
--- a/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java
+++ b/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java
@@ -29,6 +29,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStreamWriter;
 import java.io.Writer;
+import java.nio.file.Files;
 import java.time.Instant;
 import java.time.ZoneOffset;
 import java.time.ZonedDateTime;
@@ -102,7 +103,7 @@ public class SieveFileRepository implements SieveRepository {
         File tmpFile = null;
 
         try {
-            tmpFile = File.createTempFile(file.getName(), ".tmp", file.getParentFile());
+            tmpFile = Files.createTempFile(file.getParentFile().toPath(), "", ".tmp").toFile();
             try (Writer out = new OutputStreamWriter(new BufferedOutputStream(
                     new FileOutputStream(tmpFile), bufferSize), UTF_8)) {
                 out.write(content);
diff --git a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java
index 17c4d9db12..02505969a2 100644
--- a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java
+++ b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java
@@ -25,6 +25,7 @@ import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
+import java.nio.file.Files;
 import java.util.Deque;
 import java.util.HashMap;
 import java.util.List;
@@ -203,7 +204,7 @@ public class ImapRequestFrameDecoder extends ByteToMessageDecoder implements Net
         if (attachment.containsKey(STORED_DATA)) {
             sink = (Sinks.Many<byte[]>) attachment.get(SINK);
         } else {
-            f = File.createTempFile("imap-literal", ".tmp");
+            f = Files.createTempFile("imap-literal", ".tmp").toFile();
             attachment.put(STORED_DATA, f);
             final AtomicInteger written = new AtomicInteger(0);
             attachment.put(WRITTEN_DATA, written);


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org