You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@netbeans.apache.org by "lkishalmi (via GitHub)" <gi...@apache.org> on 2023/10/20 12:48:08 UTC

[PR] Try to close Gradle Daemons on exit. [netbeans]

lkishalmi opened a new pull request, #6598:
URL: https://github.com/apache/netbeans/pull/6598

   It seems `GradleConnector` has a `disconnect()` method since 6.5. Calling that should stop daemons started by these connectors.
   
   This one tries to fix #6303, by centralizing the previously freely created `GradleConnector`s.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@netbeans.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


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

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists


Re: [PR] Try to close Gradle Daemons on exit. [netbeans]

Posted by "mbien (via GitHub)" <gi...@apache.org>.
mbien commented on code in PR #6598:
URL: https://github.com/apache/netbeans/pull/6598#discussion_r1367029067


##########
extide/gradle/src/org/netbeans/modules/gradle/GradleConnectorManager.java:
##########
@@ -0,0 +1,75 @@
+/*
+ * 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.netbeans.modules.gradle;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
+import java.util.logging.Logger;
+import org.gradle.tooling.GradleConnector;
+import org.netbeans.api.project.Project;
+import org.openide.modules.OnStop;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public final class GradleConnectorManager {
+    
+    private final Map<Project, GradleConnector> projectConnector = new WeakHashMap<>();
+    private final List<GradleConnector> connectors = new ArrayList<>();
+
+    private static final GradleConnectorManager INSTANCE = new GradleConnectorManager();
+    private static final Logger LOG = Logger.getLogger(GradleConnectorManager.class.getName());
+    
+    public static GradleConnectorManager getDefault() {
+        return INSTANCE;
+    } 

Review Comment:
   consider to guard with private constructor:
   ```
       private GradleConnectorManager() {}
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@netbeans.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


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

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists


Re: [PR] Try to close Gradle Daemons on exit. [netbeans]

Posted by "lkishalmi (via GitHub)" <gi...@apache.org>.
lkishalmi commented on PR #6598:
URL: https://github.com/apache/netbeans/pull/6598#issuecomment-1772978524

   > looks good!
   > 
   > questions: what happens if a project changes settings, like the gradle version, would this require a fresh connector or will the old one from the map still work?
   
   Yes, theoretically even one connector would be enough.
   
   > 
   > can a project disconnect itself if it is closed? Wondering if there is an event for that.
   That's a good question. The answer is yes and no, as the actual `disconnect()` method is implemented on the `DefaultProjectConnection` (Gradle internal), however that method is not exported through the `ProjectConnection` interface, also calling the `close()` method would not call it implicitly.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@netbeans.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


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

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists


Re: [PR] Try to close Gradle Daemons on exit. [netbeans]

Posted by "neilcsmith-net (via GitHub)" <gi...@apache.org>.
neilcsmith-net merged PR #6598:
URL: https://github.com/apache/netbeans/pull/6598


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@netbeans.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


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

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists


Re: [PR] Try to close Gradle Daemons on exit. [netbeans]

Posted by "mbien (via GitHub)" <gi...@apache.org>.
mbien commented on code in PR #6598:
URL: https://github.com/apache/netbeans/pull/6598#discussion_r1367192263


##########
extide/gradle/src/org/netbeans/modules/gradle/GradleConnectorManager.java:
##########
@@ -0,0 +1,75 @@
+/*
+ * 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.netbeans.modules.gradle;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
+import java.util.logging.Logger;
+import org.gradle.tooling.GradleConnector;
+import org.netbeans.api.project.Project;
+import org.openide.modules.OnStop;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public final class GradleConnectorManager {
+    
+    private final Map<Project, GradleConnector> projectConnector = new WeakHashMap<>();
+    private final List<GradleConnector> connectors = new ArrayList<>();
+
+    private static final GradleConnectorManager INSTANCE = new GradleConnectorManager();
+    private static final Logger LOG = Logger.getLogger(GradleConnectorManager.class.getName());
+    
+    public static GradleConnectorManager getDefault() {
+        return INSTANCE;
+    } 
+    
+    public GradleConnector getConnector(Project prj) {
+        synchronized (connectors) {
+            GradleConnector ret = projectConnector.computeIfAbsent(prj, p -> {
+                GradleConnector conn = GradleConnector.newConnector();
+                connectors.add(conn);
+                return conn;
+            });
+            return ret;            
+        }
+    }
+    
+    
+    public void disconnectAll() {
+        LOG.info("Disconnecting from Gradle Daemons."); //NOI18N
+        synchronized (connectors) {
+            connectors.iterator().forEachRemaining(GradleConnector::disconnect);

Review Comment:
   no problem at all! this is a fairly exotic method tbh. I believe the reason why it is named that way is because a iterator can be at an arbitrary position, so forEach could be misleading if it is not a fresh iterator. Also get some sleep 4h is not enough :(



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@netbeans.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


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

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists


Re: [PR] Try to close Gradle Daemons on exit. [netbeans]

Posted by "mbien (via GitHub)" <gi...@apache.org>.
mbien commented on code in PR #6598:
URL: https://github.com/apache/netbeans/pull/6598#discussion_r1367071367


##########
extide/gradle/src/org/netbeans/modules/gradle/GradleConnectorManager.java:
##########
@@ -0,0 +1,75 @@
+/*
+ * 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.netbeans.modules.gradle;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
+import java.util.logging.Logger;
+import org.gradle.tooling.GradleConnector;
+import org.netbeans.api.project.Project;
+import org.openide.modules.OnStop;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public final class GradleConnectorManager {
+    
+    private final Map<Project, GradleConnector> projectConnector = new WeakHashMap<>();
+    private final List<GradleConnector> connectors = new ArrayList<>();
+
+    private static final GradleConnectorManager INSTANCE = new GradleConnectorManager();
+    private static final Logger LOG = Logger.getLogger(GradleConnectorManager.class.getName());
+    
+    public static GradleConnectorManager getDefault() {
+        return INSTANCE;
+    } 
+    
+    public GradleConnector getConnector(Project prj) {
+        synchronized (connectors) {
+            GradleConnector ret = projectConnector.computeIfAbsent(prj, p -> {
+                GradleConnector conn = GradleConnector.newConnector();
+                connectors.add(conn);
+                return conn;
+            });
+            return ret;            
+        }
+    }
+    
+    
+    public void disconnectAll() {
+        LOG.info("Disconnecting from Gradle Daemons."); //NOI18N
+        synchronized (connectors) {
+            connectors.iterator().forEachRemaining(GradleConnector::disconnect);

Review Comment:
   `connectors.forEach(GradleConnector::disconnect);` ?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@netbeans.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


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

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists


Re: [PR] Try to close Gradle Daemons on exit. [netbeans]

Posted by "mbien (via GitHub)" <gi...@apache.org>.
mbien commented on code in PR #6598:
URL: https://github.com/apache/netbeans/pull/6598#discussion_r1367171078


##########
extide/gradle/src/org/netbeans/modules/gradle/GradleConnectorManager.java:
##########
@@ -0,0 +1,75 @@
+/*
+ * 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.netbeans.modules.gradle;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
+import java.util.logging.Logger;
+import org.gradle.tooling.GradleConnector;
+import org.netbeans.api.project.Project;
+import org.openide.modules.OnStop;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public final class GradleConnectorManager {
+    
+    private final Map<Project, GradleConnector> projectConnector = new WeakHashMap<>();
+    private final List<GradleConnector> connectors = new ArrayList<>();
+
+    private static final GradleConnectorManager INSTANCE = new GradleConnectorManager();
+    private static final Logger LOG = Logger.getLogger(GradleConnectorManager.class.getName());
+    
+    public static GradleConnectorManager getDefault() {
+        return INSTANCE;
+    } 
+    
+    public GradleConnector getConnector(Project prj) {
+        synchronized (connectors) {
+            GradleConnector ret = projectConnector.computeIfAbsent(prj, p -> {
+                GradleConnector conn = GradleConnector.newConnector();
+                connectors.add(conn);
+                return conn;
+            });
+            return ret;            
+        }
+    }
+    
+    
+    public void disconnectAll() {
+        LOG.info("Disconnecting from Gradle Daemons."); //NOI18N
+        synchronized (connectors) {
+            connectors.iterator().forEachRemaining(GradleConnector::disconnect);

Review Comment:
   not sure I understand. `forEachRemaining` isn't removing anything from the iterator.
   
   You create a list iterator and iterate through it. This can be shortened into list.forEach(), both should be equivalent.
   
   You can still clear the list afterwards of course.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@netbeans.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


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

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists


Re: [PR] Try to close Gradle Daemons on exit. [netbeans]

Posted by "mbien (via GitHub)" <gi...@apache.org>.
mbien commented on code in PR #6598:
URL: https://github.com/apache/netbeans/pull/6598#discussion_r1367171078


##########
extide/gradle/src/org/netbeans/modules/gradle/GradleConnectorManager.java:
##########
@@ -0,0 +1,75 @@
+/*
+ * 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.netbeans.modules.gradle;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
+import java.util.logging.Logger;
+import org.gradle.tooling.GradleConnector;
+import org.netbeans.api.project.Project;
+import org.openide.modules.OnStop;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public final class GradleConnectorManager {
+    
+    private final Map<Project, GradleConnector> projectConnector = new WeakHashMap<>();
+    private final List<GradleConnector> connectors = new ArrayList<>();
+
+    private static final GradleConnectorManager INSTANCE = new GradleConnectorManager();
+    private static final Logger LOG = Logger.getLogger(GradleConnectorManager.class.getName());
+    
+    public static GradleConnectorManager getDefault() {
+        return INSTANCE;
+    } 
+    
+    public GradleConnector getConnector(Project prj) {
+        synchronized (connectors) {
+            GradleConnector ret = projectConnector.computeIfAbsent(prj, p -> {
+                GradleConnector conn = GradleConnector.newConnector();
+                connectors.add(conn);
+                return conn;
+            });
+            return ret;            
+        }
+    }
+    
+    
+    public void disconnectAll() {
+        LOG.info("Disconnecting from Gradle Daemons."); //NOI18N
+        synchronized (connectors) {
+            connectors.iterator().forEachRemaining(GradleConnector::disconnect);

Review Comment:
   not sure I understand. `forEachRemaining` doesn't remove anything from the iterator.
   
   You create a list iterator and iterate through it. This can be shortened into `list.forEach()`, both should be equivalent.
   
   You can still clear the list afterwards of course.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@netbeans.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


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

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists


Re: [PR] Try to close Gradle Daemons on exit. [netbeans]

Posted by "lkishalmi (via GitHub)" <gi...@apache.org>.
lkishalmi commented on code in PR #6598:
URL: https://github.com/apache/netbeans/pull/6598#discussion_r1367158090


##########
extide/gradle/src/org/netbeans/modules/gradle/GradleConnectorManager.java:
##########
@@ -0,0 +1,75 @@
+/*
+ * 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.netbeans.modules.gradle;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
+import java.util.logging.Logger;
+import org.gradle.tooling.GradleConnector;
+import org.netbeans.api.project.Project;
+import org.openide.modules.OnStop;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public final class GradleConnectorManager {
+    
+    private final Map<Project, GradleConnector> projectConnector = new WeakHashMap<>();
+    private final List<GradleConnector> connectors = new ArrayList<>();
+
+    private static final GradleConnectorManager INSTANCE = new GradleConnectorManager();
+    private static final Logger LOG = Logger.getLogger(GradleConnectorManager.class.getName());
+    
+    public static GradleConnectorManager getDefault() {
+        return INSTANCE;
+    } 
+    
+    public GradleConnector getConnector(Project prj) {
+        synchronized (connectors) {
+            GradleConnector ret = projectConnector.computeIfAbsent(prj, p -> {
+                GradleConnector conn = GradleConnector.newConnector();
+                connectors.add(conn);
+                return conn;
+            });
+            return ret;            
+        }
+    }
+    
+    
+    public void disconnectAll() {
+        LOG.info("Disconnecting from Gradle Daemons."); //NOI18N
+        synchronized (connectors) {
+            connectors.iterator().forEachRemaining(GradleConnector::disconnect);

Review Comment:
   Well, it could be `forEach()` then a `clean()`. The plan is to have this method callable when needed, so it can free up resources, for example when the GRADLE_USER_HOME is changed in the IDE or for testing purposes. Not figured out the real need of the `disconnectAll()` invocations other than the IDE shutdown.
   
   I think `GradleConnector` is a badly placed entrypoint to the Tooling API a strange mixture of a builder, some connection accounting, etc. 
   
   Theoretically one instance of GradleConnector could be enough, though it is not thread safe and it's `useXXX`, `forXXX` methods are changing the state of an internal builder. That would require some kind of locking/synchronization. I hope I'd be wiser over time to deal with this better.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@netbeans.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


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

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists


Re: [PR] Try to close Gradle Daemons on exit. [netbeans]

Posted by "lkishalmi (via GitHub)" <gi...@apache.org>.
lkishalmi commented on code in PR #6598:
URL: https://github.com/apache/netbeans/pull/6598#discussion_r1367185526


##########
extide/gradle/src/org/netbeans/modules/gradle/GradleConnectorManager.java:
##########
@@ -0,0 +1,75 @@
+/*
+ * 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.netbeans.modules.gradle;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
+import java.util.logging.Logger;
+import org.gradle.tooling.GradleConnector;
+import org.netbeans.api.project.Project;
+import org.openide.modules.OnStop;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public final class GradleConnectorManager {
+    
+    private final Map<Project, GradleConnector> projectConnector = new WeakHashMap<>();
+    private final List<GradleConnector> connectors = new ArrayList<>();
+
+    private static final GradleConnectorManager INSTANCE = new GradleConnectorManager();
+    private static final Logger LOG = Logger.getLogger(GradleConnectorManager.class.getName());
+    
+    public static GradleConnectorManager getDefault() {
+        return INSTANCE;
+    } 
+    
+    public GradleConnector getConnector(Project prj) {
+        synchronized (connectors) {
+            GradleConnector ret = projectConnector.computeIfAbsent(prj, p -> {
+                GradleConnector conn = GradleConnector.newConnector();
+                connectors.add(conn);
+                return conn;
+            });
+            return ret;            
+        }
+    }
+    
+    
+    public void disconnectAll() {
+        LOG.info("Disconnecting from Gradle Daemons."); //NOI18N
+        synchronized (connectors) {
+            connectors.iterator().forEachRemaining(GradleConnector::disconnect);

Review Comment:
   Wow! You are right! Probably I should not read JavaDoc after 4 hours sleep. I was so happy, that I found something new for draining a collection. It seems I've just mixed the `remove` and `forEachRemaining` while read that in the morning.
   
   Thanks for putting me back to the track!



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@netbeans.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


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

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists