dmServer/src/main/java/com/intellij/dmserver/run/remote/DMServerRemoteModel.java (184 lines of code) (raw):

package com.intellij.dmserver.run.remote; import com.intellij.dmserver.run.DMServerModelBase; import com.intellij.dmserver.util.DmServerBundle; import com.intellij.execution.configurations.RuntimeConfigurationError; import com.intellij.execution.configurations.RuntimeConfigurationException; import com.intellij.javaee.appServers.run.configuration.CommonModel; import com.intellij.javaee.transport.TransportHost; import com.intellij.javaee.transport.TransportManager; import com.intellij.javaee.transport.TransportTarget; import com.intellij.openapi.options.SettingsEditor; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.WriteExternalException; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.xmlb.SkipDefaultValuesSerializationFilters; import com.intellij.util.xmlb.XmlSerializer; import com.intellij.util.xmlb.annotations.Tag; import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.net.MalformedURLException; import java.net.URL; import java.util.Collections; import java.util.List; public class DMServerRemoteModel extends DMServerModelBase { private String myJmxMappingUrl; private String myTransportHostId; private TransportTarget myTransportTargetRepository; private TransportTarget myTransportTargetJmx; private String myRepositoryName; @Override public List<Pair<String, Integer>> getAddressesToCheck() { return Collections.emptyList(); } @Override protected void read(@NotNull Element element, boolean isPersistent) throws InvalidDataException { final DMServerRemoteModelSettings settings = new DMServerRemoteModelSettings(); XmlSerializer.deserializeInto(settings, element); readFromSettingsBase(settings, isPersistent); myJmxMappingUrl = settings.getJmxMappingUrl(); myRepositoryName = settings.getRepositoryName(); myTransportHostId = settings.getTransportHostId(); myTransportTargetRepository = settings.getTransportTargetRepository(); myTransportTargetJmx = settings.getTransportTargetJmx(); } @Override protected void write(@NotNull Element element, boolean isPersistent) throws WriteExternalException { final DMServerRemoteModelSettings settings = new DMServerRemoteModelSettings(); writeToSettingsBase(settings, isPersistent); settings.setJmxMappingUrl(myJmxMappingUrl); settings.setRepositoryName(myRepositoryName); settings.setTransportHostId(myTransportHostId); settings.setTransportTargetRepository(myTransportTargetRepository); settings.setTransportTargetJmx(myTransportTargetJmx); XmlSerializer.serializeInto(settings, element, new SkipDefaultValuesSerializationFilters()); } @Override public URL computeServerAccessibleStagingURL(String deploymentSourcePath) throws MalformedURLException { if (myJmxMappingUrl == null) { throw new MalformedURLException("Wow, staging folder is not mapped, configuration should not pass validation"); } return createJmxMappingUrl(); } @Nullable private TransportHost getHost() { return TransportManager.getInstance().findHost(myTransportHostId, getProject()); } @Override public boolean addToRepository(List<VirtualFile> filesToDeploy) { TransportHost host = getHost(); return host != null && host.findOrCreateHostTarget(myTransportTargetRepository).transfer(getProject(), filesToDeploy); } @Override public boolean removeFromRepository(final List<VirtualFile> filesToUndeploy) { TransportHost host = getHost(); return host != null && host.findOrCreateHostTarget(myTransportTargetRepository).delete(getProject(), filesToUndeploy); } @Override public String getRepositoryName() { return myRepositoryName; } public void setRepositoryName(String repositoryName) { myRepositoryName = repositoryName; } @Override public boolean prepareDeploy(VirtualFile fileToDeploy) { TransportHost host = getHost(); return host != null && host.findOrCreateHostTarget(myTransportTargetJmx).transfer(getProject(), Collections.singletonList(fileToDeploy)); } @Override public void checkConfiguration() throws RuntimeConfigurationException { // TODO: may need additional checks validateMappingURL(); } @Override public SettingsEditor<CommonModel> getEditor() { return new DMRemoteRunConfigurationEditor(getProject()); } private void validateMappingURL() throws RuntimeConfigurationException { if (StringUtil.isEmptyOrSpaces(myJmxMappingUrl)) { throw new RuntimeConfigurationError(DmServerBundle.message("DMServerRemoteModel.error.mapping.url.not.configured")); } try { createJmxMappingUrl(); } catch (MalformedURLException ignored) { throw new RuntimeConfigurationError(DmServerBundle.message("DMServerRemoteModel.error.mapping.url.not.valid", myJmxMappingUrl)); } } private URL createJmxMappingUrl() throws MalformedURLException { String fixCommonProblems = myJmxMappingUrl.replaceAll(" ", "%20"); if (!fixCommonProblems.endsWith("/")) { fixCommonProblems += "/"; } return new URL(fixCommonProblems); } public String getJmxMappingUrl() { return myJmxMappingUrl; } public void setJmxMappingUrl(String jmxMappingUrl) { myJmxMappingUrl = jmxMappingUrl; } public String getTransportHostId() { return myTransportHostId; } public void setTransportHostId(String transportHostId) { myTransportHostId = transportHostId; } public TransportTarget getTransportTargetJmx() { return myTransportTargetJmx; } public void setTransportTargetJmx(TransportTarget transportTargetJmx) { myTransportTargetJmx = transportTargetJmx; } public TransportTarget getTransportTargetRepository() { return myTransportTargetRepository; } public void setTransportTargetRepository(TransportTarget transportTargetRepository) { myTransportTargetRepository = transportTargetRepository; } public static class DMServerRemoteModelSettings extends DMServerModelSettingsBase { @Tag("staging-url") private String myJmxMappingUrl; @Tag("host-id") private String myTransportHostId; @Tag("transport-target-repository") private TransportTarget myTransportTargetRepository; @Tag("transport-target-staging") private TransportTarget myTransportTargetJmx; @Tag("repository-name") private String myRepositoryName; public String getJmxMappingUrl() { return myJmxMappingUrl; } public void setJmxMappingUrl(String stagingFolderURL) { myJmxMappingUrl = stagingFolderURL; } public String getTransportHostId() { return myTransportHostId; } public void setTransportHostId(String transportHostId) { myTransportHostId = transportHostId; } public TransportTarget getTransportTargetRepository() { return myTransportTargetRepository; } public void setTransportTargetRepository(TransportTarget transportTargetRepository) { myTransportTargetRepository = transportTargetRepository; } public TransportTarget getTransportTargetJmx() { return myTransportTargetJmx; } public void setTransportTargetJmx(TransportTarget transportTargetJmx) { myTransportTargetJmx = transportTargetJmx; } public String getRepositoryName() { return myRepositoryName; } public void setRepositoryName(String repositoryName) { myRepositoryName = repositoryName; } } }