Skip to content

Commit 9aead0b

Browse files
committed
Add auto configuration for a php server configuration with path mapping
1 parent 074b839 commit 9aead0b

File tree

6 files changed

+215
-0
lines changed

6 files changed

+215
-0
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package de.php_perfect.intellij.ddev.php.server;
2+
3+
import com.intellij.openapi.project.Project;
4+
import de.php_perfect.intellij.ddev.DescriptionChangedListener;
5+
import de.php_perfect.intellij.ddev.cmd.Description;
6+
import org.jetbrains.annotations.NotNull;
7+
import org.jetbrains.annotations.Nullable;
8+
9+
import java.net.MalformedURLException;
10+
import java.net.URL;
11+
12+
public final class ConfigureServerListener implements DescriptionChangedListener {
13+
private final @NotNull Project project;
14+
15+
public ConfigureServerListener(@NotNull Project project) {
16+
this.project = project;
17+
}
18+
19+
@Override
20+
public void onDescriptionChanged(@Nullable Description description) {
21+
String localPath = this.project.getBasePath();
22+
23+
if (description == null || localPath == null) {
24+
return;
25+
}
26+
27+
if (description.getPrimaryUrl() == null) {
28+
return;
29+
}
30+
31+
URL url;
32+
try {
33+
url = new URL(description.getPrimaryUrl());
34+
} catch (MalformedURLException ignored) {
35+
return;
36+
}
37+
38+
ServerConfig serverConfig = new ServerConfig(localPath, "/var/www/html", url);
39+
ServerConfigManager.getInstance(this.project).configure(serverConfig);
40+
}
41+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package de.php_perfect.intellij.ddev.php.server;
2+
3+
import org.jetbrains.annotations.NotNull;
4+
5+
import java.net.URL;
6+
import java.util.Objects;
7+
8+
public final class ServerConfig {
9+
private final @NotNull String localPath;
10+
11+
private final @NotNull String remotePath;
12+
13+
private final @NotNull URL url;
14+
15+
public ServerConfig(@NotNull String localPath, @NotNull String remotePathPath, @NotNull URL url) {
16+
this.localPath = localPath;
17+
this.remotePath = remotePathPath;
18+
this.url = url;
19+
}
20+
21+
public @NotNull String getLocalPath() {
22+
return localPath;
23+
}
24+
25+
public @NotNull String getRemotePath() {
26+
return remotePath;
27+
}
28+
29+
public @NotNull URL getUrl() {
30+
return url;
31+
}
32+
33+
@Override
34+
public boolean equals(Object o) {
35+
if (this == o) return true;
36+
if (o == null || getClass() != o.getClass()) return false;
37+
ServerConfig that = (ServerConfig) o;
38+
return getLocalPath().equals(that.getLocalPath()) && getRemotePath().equals(that.getRemotePath()) && getUrl().equals(that.getUrl());
39+
}
40+
41+
@Override
42+
public int hashCode() {
43+
return Objects.hash(getLocalPath(), getRemotePath(), getUrl());
44+
}
45+
46+
@Override
47+
public String toString() {
48+
return "ServerConfig{" +
49+
"localPath='" + localPath + '\'' +
50+
", remotePath='" + remotePath + '\'' +
51+
", url=" + url +
52+
'}';
53+
}
54+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package de.php_perfect.intellij.ddev.php.server;
2+
3+
import com.intellij.openapi.project.Project;
4+
import org.jetbrains.annotations.NotNull;
5+
6+
public interface ServerConfigManager {
7+
void configure(@NotNull ServerConfig serverConfig);
8+
9+
static ServerConfigManager getInstance(@NotNull Project project) {
10+
return project.getService(ServerConfigManager.class);
11+
}
12+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package de.php_perfect.intellij.ddev.php.server;
2+
3+
import com.intellij.openapi.diagnostic.Logger;
4+
import com.intellij.openapi.project.Project;
5+
import com.intellij.openapi.util.text.StringUtil;
6+
import com.intellij.util.PathMappingSettings;
7+
import com.jetbrains.php.config.servers.PhpServer;
8+
import com.jetbrains.php.config.servers.PhpServersWorkspaceStateComponent;
9+
import de.php_perfect.intellij.ddev.deployment.DeploymentConfigManagerImpl;
10+
import org.jetbrains.annotations.NotNull;
11+
12+
import java.util.List;
13+
14+
public final class ServerConfigManagerImpl implements ServerConfigManager {
15+
private static final @NotNull Logger LOG = Logger.getInstance(DeploymentConfigManagerImpl.class);
16+
17+
private final static @NotNull String SERVER_NAME = "DDEV";
18+
19+
private final @NotNull Project project;
20+
21+
public ServerConfigManagerImpl(final @NotNull Project project) {
22+
this.project = project;
23+
}
24+
25+
public void configure(final @NotNull ServerConfig serverConfig) {
26+
LOG.debug(String.format("Updating server configuration %s", SERVER_NAME));
27+
this.addOrReplaceServer(
28+
PhpServersWorkspaceStateComponent.getInstance(project).getServers(),
29+
createServerConfiguration(serverConfig)
30+
);
31+
}
32+
33+
private @NotNull PhpServer createServerConfiguration(final @NotNull ServerConfig serverConfig) {
34+
final PhpServer phpServer = new PhpServer();
35+
phpServer.setName(SERVER_NAME);
36+
phpServer.setHost(serverConfig.getUrl().getHost());
37+
phpServer.setUsePathMappings(true);
38+
phpServer.getMappings().add(new PathMappingSettings.PathMapping(serverConfig.getLocalPath(), serverConfig.getRemotePath()));
39+
40+
return phpServer;
41+
}
42+
43+
private void addOrReplaceServer(final @NotNull List<PhpServer> servers, final @NotNull PhpServer server) {
44+
servers.removeIf(phpServer -> StringUtil.equals(phpServer.getName(), server.getName()));
45+
servers.add(server);
46+
}
47+
}

src/main/resources/META-INF/DdevIntegration-withPhp.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
<depends>Docker</depends>
44

55
<extensions defaultExtensionNs="com.intellij">
6+
<projectService serviceImplementation="de.php_perfect.intellij.ddev.php.server.ServerConfigManagerImpl"
7+
serviceInterface="de.php_perfect.intellij.ddev.php.server.ServerConfigManager"/>
68
<projectService serviceImplementation="de.php_perfect.intellij.ddev.php.PhpInterpreterProviderImpl"
79
serviceInterface="de.php_perfect.intellij.ddev.php.PhpInterpreterProvider"/>
810
<projectService serviceImplementation="de.php_perfect.intellij.ddev.php.DdevComposeFileLoaderImpl"
@@ -16,6 +18,8 @@
1618
</extensions>
1719

1820
<projectListeners>
21+
<listener class="de.php_perfect.intellij.ddev.php.server.ConfigureServerListener"
22+
topic="de.php_perfect.intellij.ddev.DescriptionChangedListener"/>
1923
<listener class="de.php_perfect.intellij.ddev.php.AutoConfigurePhpInterpreterListener"
2024
topic="de.php_perfect.intellij.ddev.DescriptionChangedListener"/>
2125
</projectListeners>
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package de.php_perfect.intellij.ddev.php.server;
2+
3+
import com.intellij.testFramework.fixtures.BasePlatformTestCase;
4+
import com.jetbrains.php.config.servers.PhpServer;
5+
import com.jetbrains.php.config.servers.PhpServersWorkspaceStateComponent;
6+
import org.junit.Assert;
7+
import org.junit.jupiter.api.BeforeEach;
8+
import org.junit.jupiter.api.Test;
9+
10+
import java.net.MalformedURLException;
11+
import java.net.URL;
12+
import java.util.List;
13+
14+
final class ServerConfigManagerImplTest extends BasePlatformTestCase {
15+
16+
@Override
17+
@BeforeEach
18+
protected void setUp() throws Exception {
19+
super.setUp();
20+
}
21+
22+
@Test
23+
void configure() throws MalformedURLException {
24+
final ServerConfigManager serverConfigManager = ServerConfigManager.getInstance(this.getProject());
25+
26+
final ServerConfig serverConfig = new ServerConfig(
27+
"C:\\Users\\test\\AppData\\Local\\Temp\\my-project",
28+
"/var/www/html",
29+
new URL("https://test.ddev.site")
30+
);
31+
32+
serverConfigManager.configure(serverConfig);
33+
// Check server gets replaced
34+
serverConfigManager.configure(serverConfig);
35+
36+
assertServerConfigMatches(serverConfig);
37+
}
38+
39+
private void assertServerConfigMatches(ServerConfig serverConfig) {
40+
final List<PhpServer> servers = PhpServersWorkspaceStateComponent.getInstance(this.getProject()).getServers();
41+
42+
Assert.assertEquals(1, servers.size());
43+
44+
final PhpServer server = servers.get(0);
45+
Assert.assertEquals("DDEV", server.getName());
46+
Assert.assertEquals("test.ddev.site", server.getHost());
47+
48+
var mappings = server.getMappings();
49+
50+
Assert.assertEquals(1, mappings.size());
51+
52+
var mapping = mappings.get(0);
53+
54+
Assert.assertEquals(serverConfig.getLocalPath(), mapping.getLocalRoot());
55+
Assert.assertEquals(serverConfig.getRemotePath(), mapping.getRemoteRoot());
56+
}
57+
}

0 commit comments

Comments
 (0)