Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Ports/JavaSE/src/com/codename1/impl/javase/Executor.java
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ private static int getJavaVersion() {
int dotPos = version.indexOf('.');
int dashPos = version.indexOf('-');
return Integer.parseInt(version.substring(0,
dotPos > -1 ? dotPos : dashPos > -1 ? dashPos : 1));
dotPos > -1 ? dotPos : dashPos > -1 ? dashPos : version.length()));
}

static void setMacApplicationEventHandled(Object event, boolean handled) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2641,21 +2641,27 @@ private int getMajorVersionInt(String versionStr, int defaultVal) {
private String[] getStubCompileSourceTarget(String javacPath) {
String source = "1.6";
String target = "1.6";
int major = -1;
String version = null;
try {
String versionOutput = execString(tmpFile != null ? tmpFile : new File("."), javacPath, "-version");
if (versionOutput != null && versionOutput.trim().length() > 0) {
String[] parts = versionOutput.trim().split("\\s+");
String version = parts[parts.length - 1];
int major = getMajorVersionInt(version, -1);
if (major >= 9) {
source = "8";
target = "8";
log("JDK " + version + " does not support -source/-target 1.6. Compiling iOS stubs with -source/-target 8.");
}
version = parts[parts.length - 1];
major = getMajorVersionInt(version, -1);
}
} catch (Exception ex) {
debug("Failed to resolve javac version for iOS stub compile: " + ex.getMessage());
}
if (major < 0) {
version = System.getProperty("java.version");
major = getMajorVersionInt(version, -1);
}
if (major >= 9) {
source = "8";
target = "8";
log("JDK " + version + " does not support -source/-target 1.6. Compiling iOS stubs with -source/-target 8.");
}
return new String[]{source, target};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -190,8 +190,18 @@ private byte[] applyDataReplacements(String targetPath, byte[] sourceData) throw
if ("common/pom.xml".equals(targetPath)) {
content = applyJavaVersionToPom(content);
}
if (".idea/misc.xml".equals(targetPath)) {
content = normalizeIntellijMiscXml(content);
}
if (".idea/workspace.xml".equals(targetPath)) {
content = applySimulatorJvmExportToIdeaWorkspace(content);
}
if ("pom.xml".equals(targetPath)) {
content = replaceTagValue(content, "cn1.plugin.version", CN1_PLUGIN_VERSION);
content = replaceTagValue(content, "cn1.version", CN1_PLUGIN_VERSION);
}
if ("android/pom.xml".equals(targetPath) || "ios/pom.xml".equals(targetPath)) {
content = hardenPlatformModulePomAgainstDoubleJarAttach(content);
}
if ("javase/pom.xml".equals(targetPath)) {
content = normalizeJavasePom(content);
Expand All @@ -217,6 +227,97 @@ private String applyJavaVersionToPom(String content) {
return content;
}

private String normalizeIntellijMiscXml(String content) {
String languageLevel = options.javaVersion == ProjectOptions.JavaVersion.JAVA_17_EXPERIMENTAL ? "JDK_17" : "JDK_1_8";
content = removeXmlAttribute(content, "project-jdk-name");
content = removeXmlAttribute(content, "project-jdk-type");
content = setXmlAttribute(content, "languageLevel", languageLevel);
return content;
}

private static String removeXmlAttribute(String xml, String attributeName) {
String pattern = attributeName + "=\"";
int pos = xml.indexOf(pattern);
if (pos < 0) {
return xml;
}
int valueStart = pos + pattern.length();
int valueEnd = xml.indexOf('"', valueStart);
if (valueEnd < 0) {
return xml;
}
int removeStart = pos;
while (removeStart > 0 && xml.charAt(removeStart - 1) == ' ') {
removeStart--;
}
return xml.substring(0, removeStart) + xml.substring(valueEnd + 1);
}

private static String setXmlAttribute(String xml, String attributeName, String value) {
String pattern = attributeName + "=\"";
int pos = xml.indexOf(pattern);
if (pos < 0) {
return xml;
}
int valueStart = pos + pattern.length();
int valueEnd = xml.indexOf('"', valueStart);
if (valueEnd < 0) {
return xml;
}
return xml.substring(0, valueStart) + value + xml.substring(valueEnd);
}

private static String applySimulatorJvmExportToIdeaWorkspace(String content) {
String configHeader = "<configuration name=\"Run in Simulator\"";
int start = content.indexOf(configHeader);
if (start < 0) {
return content;
}
int end = content.indexOf("</configuration>", start);
if (end < 0) {
return content;
}
String segment = content.substring(start, end);
String exportArg = "--add-exports=java.desktop/com.apple.eawt=ALL-UNNAMED";
if (segment.indexOf(exportArg) >= 0) {
return content;
}
segment = StringUtil.replaceAll(segment, "<option name=\"vmOptions\" value=\"\" />",
"<option name=\"vmOptions\" value=\"" + exportArg + "\" />");
return content.substring(0, start) + segment + content.substring(end);
}

private static String hardenPlatformModulePomAgainstDoubleJarAttach(String pom) {
String pluginBlock =
"<plugin>\n" +
" <groupId>org.apache.maven.plugins</groupId>\n" +
" <artifactId>maven-jar-plugin</artifactId>\n" +
" <version>3.4.1</version>\n" +
" <executions>\n" +
" <execution>\n" +
" <id>default-jar</id>\n" +
" <phase>none</phase>\n" +
" </execution>\n" +
" </executions>\n" +
" </plugin>\n";
if (pom.indexOf("<artifactId>maven-jar-plugin</artifactId>") >= 0) {
if (pom.indexOf("<id>default-jar</id>") >= 0 && pom.indexOf("<phase>none</phase>") >= 0) {
return pom;
}
int pluginsTag = pom.indexOf("<plugins>\n");
if (pluginsTag >= 0) {
int firstPluginStart = pom.indexOf("<plugin>", pluginsTag);
if (firstPluginStart >= 0) {
return pom.substring(0, firstPluginStart) + pluginBlock + pom.substring(firstPluginStart);
}
}
return pom;
}
return StringUtil.replaceAll(pom,
"<plugins>\n",
"<plugins>\n" + pluginBlock);
}

private String injectLocalizationBootstrap(String targetPath, String content) {
String javaMainPath = "common/src/main/java/" + packageName.replace('.', '/') + "/" + appName + ".java";
String kotlinMainPath = "common/src/main/kotlin/" + packageName.replace('.', '/') + "/" + appName + ".kt";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public boolean runTest() throws Exception {
}
}
validateExperimentalJava17Generation();
validateExperimentalJava17RegressionFixes();
return true;
}

Expand All @@ -47,6 +48,44 @@ private void validateExperimentalJava17Generation() throws Exception {
assertLocalizationBundles(entries, Template.BAREBONES, true);
}

private void validateExperimentalJava17RegressionFixes() throws Exception {
String mainClassName = "DemoExperimentalJava17Regression";
String packageName = "com.acme.experimental.java17regression";
ProjectOptions options = new ProjectOptions(
ProjectOptions.ThemeMode.LIGHT,
ProjectOptions.Accent.DEFAULT,
true,
true,
ProjectOptions.PreviewLanguage.ENGLISH,
ProjectOptions.JavaVersion.JAVA_17_EXPERIMENTAL
);

byte[] zipData = createProjectZip(IDE.INTELLIJ, Template.BAREBONES, mainClassName, packageName, options);
Map<String, byte[]> entries = readZipEntries(zipData);

String intellijMisc = getText(entries, ".idea/misc.xml");
assertContains(intellijMisc, "languageLevel=\"JDK_17\"", "IntelliJ misc.xml should use Java 17 language level for Java 17 projects");
assertFalse(intellijMisc.indexOf("project-jdk-name=") >= 0, "IntelliJ misc.xml should not pin a specific JDK name");
assertFalse(intellijMisc.indexOf("project-jdk-type=") >= 0, "IntelliJ misc.xml should not pin a specific JDK type");

String intellijWorkspace = getText(entries, ".idea/workspace.xml");
assertContains(intellijWorkspace, "<configuration name=\"Run in Simulator\"", "IntelliJ workspace should include Run in Simulator profile");
assertContains(intellijWorkspace, "--add-exports=java.desktop/com.apple.eawt=ALL-UNNAMED",
"Run in Simulator profile should export com.apple.eawt for JDK 17+");

String androidPom = getText(entries, "android/pom.xml");
assertContains(androidPom, "<artifactId>maven-jar-plugin</artifactId>", "Android module should configure maven-jar-plugin explicitly");
assertContains(androidPom, "<version>3.4.1</version>", "Android module should pin maven-jar-plugin version");
assertContains(androidPom, "<id>default-jar</id>", "Android module should target default-jar execution");
assertContains(androidPom, "<phase>none</phase>", "Android module should disable default-jar execution to avoid duplicate attach in cn1:build");

String iosPom = getText(entries, "ios/pom.xml");
assertContains(iosPom, "<artifactId>maven-jar-plugin</artifactId>", "iOS module should configure maven-jar-plugin explicitly");
assertContains(iosPom, "<version>3.4.1</version>", "iOS module should pin maven-jar-plugin version");
assertContains(iosPom, "<id>default-jar</id>", "iOS module should target default-jar execution");
assertContains(iosPom, "<phase>none</phase>", "iOS module should disable default-jar execution to avoid duplicate attach in cn1:build");
}

private void validateCombination(Template template, IDE ide) throws Exception {
String mainClassName = "Demo" + template.ordinal() + ide.ordinal() + "App";
String packageName = "com.acme.t" + template.ordinal() + ".i" + ide.ordinal();
Expand Down Expand Up @@ -122,6 +161,7 @@ private void assertRootPom(Map<String, byte[]> entries, String packageName, Stri
assertContains(pom, packageName, "Root pom should include package as groupId");
assertContains(pom, mainClassName.toLowerCase(), "Root pom should include app artifact/name");
assertContains(pom, "<cn1.plugin.version>7.0.227</cn1.plugin.version>", "Root pom should use current CN1 plugin version");
assertContains(pom, "<cn1.version>7.0.227</cn1.version>", "Root pom should align CN1 runtime version with plugin version");
assertFalse(pom.indexOf("com.example.myapp") >= 0, "Root pom still contains placeholder package");
assertFalse(pom.indexOf("myappname") >= 0, "Root pom still contains placeholder app name");
}
Expand Down
Loading