This is an automated email from the ASF dual-hosted git repository. matthiasblaesing pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/master by this push: new 59382d6b4e [NETBEANS-4927] Maven EAR project fails to deploy on an app server (GlassFish) new c19712fd36 Merge pull request #4929 from OndroMih/ondromih-fix-ear-deployment 59382d6b4e is described below commit 59382d6b4e91c45b126006b536795bc707dcc641 Author: Ondro Mihalyi <ondrej.miha...@gmail.com> AuthorDate: Sun Nov 6 00:03:51 2022 +0100 [NETBEANS-4927] Maven EAR project fails to deploy on an app server (GlassFish) --- .../impl/InitialServerFileDistributor.java | 108 ++++++++++++++++++--- 1 file changed, 95 insertions(+), 13 deletions(-) diff --git a/enterprise/j2eeserver/src/org/netbeans/modules/j2ee/deployment/impl/InitialServerFileDistributor.java b/enterprise/j2eeserver/src/org/netbeans/modules/j2ee/deployment/impl/InitialServerFileDistributor.java index 65cc19b5a4..095f9838d5 100644 --- a/enterprise/j2eeserver/src/org/netbeans/modules/j2ee/deployment/impl/InitialServerFileDistributor.java +++ b/enterprise/j2eeserver/src/org/netbeans/modules/j2ee/deployment/impl/InitialServerFileDistributor.java @@ -16,11 +16,8 @@ * specific language governing permissions and limitations * under the License. */ - - package org.netbeans.modules.j2ee.deployment.impl; - import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -29,6 +26,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.nio.channels.FileChannel; import java.nio.charset.StandardCharsets; +import java.util.Arrays; import java.util.HashSet; import java.util.Iterator; import java.util.Locale; @@ -53,11 +51,12 @@ import org.openide.util.Utilities; /** * - * @author nn136682 + * @author nn136682 */ public class InitialServerFileDistributor extends ServerProgress { private static final Logger LOGGER = Logger.getLogger(InitialServerFileDistributor.class.getName()); + private static final String SYSTEM_PROPERTY_PREFIX = "glassfish.javaee"; private final ServerString serverString; private final DeploymentTarget dtarget; @@ -65,7 +64,6 @@ public class InitialServerFileDistributor extends ServerProgress { private final Target target; boolean inPlace = false; - public InitialServerFileDistributor(DeploymentTarget dtarget, Target target) { super(dtarget.getServer().getServerInstance()); this.serverString = dtarget.getServer(); @@ -96,22 +94,24 @@ public class InitialServerFileDistributor extends ServerProgress { } setStatusDistributeRunning(NbBundle.getMessage( - InitialServerFileDistributor.class, "MSG_RunningInitialDeploy", dtarget.getDeploymentName(), dir)); + InitialServerFileDistributor.class, "MSG_RunningInitialDeploy", dtarget.getDeploymentName(), dir)); - _distribute(source.getArchiveContents(), dir, collectChildModuleNames(source)); + final Set<String> childModuleNames = collectChildModuleNames(source); + _distribute(source.getArchiveContents(), dir, childModuleNames); if (source instanceof J2eeApplication) { J2eeModule[] childModules = ((J2eeApplication) source).getModules(); for (int i = 0; i < childModules.length; i++) { - String uri = childModules[i].getUrl(); - J2eeModule childModule = deployment.getJ2eeModule(uri); - File subdir = incDeployment.getDirectoryForNewModule(dir, uri, childModule, deployment.getModuleConfiguration()); + final String moduleUrl = childModules[i].getUrl(); + String subDirectoryForChildModule = getBestMatchingChildModuleName(moduleUrl, childModuleNames); + J2eeModule childModule = deployment.getJ2eeModule(moduleUrl); + File subdir = incDeployment.getDirectoryForNewModule(dir, subDirectoryForChildModule, childModule, deployment.getModuleConfiguration()); _distribute(childModules[i].getArchiveContents(), subdir, null); } } setStatusDistributeCompleted(NbBundle.getMessage( - InitialServerFileDistributor.class, "MSG_DoneInitialDistribute", dtarget.getDeploymentName())); + InitialServerFileDistributor.class, "MSG_DoneInitialDistribute", dtarget.getDeploymentName())); return dir; @@ -125,11 +125,90 @@ public class InitialServerFileDistributor extends ServerProgress { return null; } + private String getBestMatchingChildModuleName(String url, Set<String> childModuleNames) { + if (childModuleNames.contains(url)) { + return url; + } else { + if (!url.startsWith("/")) { + url = "/" + url; + } + // There's no module for the url, try to guess which has the closest name + for (String name : childModuleNames) { + String[] splitName = name.split("\\."); + String baseName = splitName[0]; + String extension = splitName.length > 1 ? splitName[1] : null; + + // url is in form /baseNameXXX.extension, e.g. /webapp-1.0.0.war + if (url.startsWith("/" + baseName)) { + if (extension == null || url.endsWith("." + extension)) { + return name; + } + } + } + return url; + } + } + // We are collecting module names to be able to skip .jar and .war files under // the application root with the same name as one of the deployed modules. Those // are typically jars coresponding to already existing exploded directory and we // don't want to deploy them --> see also #199096 and #222924 for more details - private Set<String> collectChildModuleNames(J2eeModule source) { + private Set<String> collectChildModuleNames(J2eeModule source) throws IOException { + String childModulesSource = System.getProperty(SYSTEM_PROPERTY_PREFIX + ".childModuleSource"); + if ("mavenProject".equals(childModulesSource)) { + return collectChildModuleNamesFromMavenProject(source); + } + if ("archive".equals(childModulesSource)) { + return collectChildModuleNamesFromArchiveContents(source); + } + + final Set<String> childModuleNamesFromMavenProject = collectChildModuleNamesFromMavenProject(source); + final Set<String> childModuleNamesFromArchive = collectChildModuleNamesFromArchiveContents(source); + /* If both lists have the same size (are likely to contain the same modules) + return the list from the archive as it definitely contains the correct module names, + while the module names derived from the Maven project may not be accurate + */ + if (childModuleNamesFromArchive.size() == childModuleNamesFromMavenProject.size()) { + return childModuleNamesFromArchive; + } else { + /* If the lists are not the same, fall back to the old behavior + and return the module names from Maven project + */ + return childModuleNamesFromMavenProject; + } + } + + private Set<String> collectChildModuleNamesFromArchiveContents(J2eeModule source) throws IOException { + final Set<String> childModuleNames = new HashSet<String>(); + if (source instanceof J2eeApplication) { + J2eeApplication j2eeApp = (J2eeApplication) source; + final Iterator<J2eeModule.RootedEntry> entries = source.getArchiveContents(); + while (entries.hasNext()) { + J2eeModule.RootedEntry entry = entries.next(); + String relativePath = entry.getRelativePath(); + FileObject sourceFO = entry.getFileObject(); + + if (isModuleFile(entry)) { + childModuleNames.add(relativePath); + } + } + + } + return childModuleNames; + } + + private boolean isModuleFile(J2eeModule.RootedEntry fileEntry) { + String relativePath = fileEntry.getRelativePath(); + FileObject file = fileEntry.getFileObject(); + final FileObject parentFile = file.getParent(); + final String pathUsingRelativePathFromParent = parentFile.getFileObject(relativePath, false).getPath(); + final boolean isInRootFolder = pathUsingRelativePathFromParent.equals(file.getPath()); + + return isInRootFolder && file.isData() + && Arrays.asList("war", "jar").contains(file.getExt().toLowerCase()); + } + + private Set<String> collectChildModuleNamesFromMavenProject(J2eeModule source) { final Set<String> childModuleNames = new HashSet<String>(); if (source instanceof J2eeApplication) { for (J2eeModule module : ((J2eeApplication) source).getModules()) { @@ -147,7 +226,7 @@ public class InitialServerFileDistributor extends ServerProgress { } private boolean cleanup(File f) { - String [] chNames = f.list(); + String[] chNames = f.list(); boolean deleted = true; if (chNames != null) { for (int i = 0; i < chNames.length; i++) { @@ -231,9 +310,11 @@ public class InitialServerFileDistributor extends ServerProgress { private void setStatusDistributeRunning(String message) { notify(createRunningProgressEvent(CommandType.DISTRIBUTE, message)); } + private void setStatusDistributeFailed(String message) { notify(createFailedProgressEvent(CommandType.DISTRIBUTE, message)); } + private void setStatusDistributeCompleted(String message) { notify(createCompletedProgressEvent(CommandType.DISTRIBUTE, message)); } @@ -326,4 +407,5 @@ public class InitialServerFileDistributor extends ServerProgress { fileToOverwrite.close(); } } + } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org For additional commands, e-mail: commits-h...@netbeans.apache.org For further information about the NetBeans mailing lists, visit: https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists