diff --git a/app/test/cc/arduino/packages/contributions/HostDependentDownloadableContributionTest.java b/app/test/cc/arduino/packages/contributions/HostDependentDownloadableContributionTest.java index 15ca6064c..db6f29c53 100644 --- a/app/test/cc/arduino/packages/contributions/HostDependentDownloadableContributionTest.java +++ b/app/test/cc/arduino/packages/contributions/HostDependentDownloadableContributionTest.java @@ -1,6 +1,7 @@ package cc.arduino.packages.contributions; import org.junit.Test; +import processing.app.Platform; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -15,10 +16,20 @@ public class HostDependentDownloadableContributionTest { return "x86_64-apple-darwin"; } }; - System.setProperty("os.name", "Mac OS X"); - System.setProperty("os.arch", "x86_64"); - assertTrue(contribution.isCompatible()); + Platform platform = new Platform() { + @Override + public String getOsName() { + return "Mac OS X"; + } + + @Override + public String getOsArch() { + return "x86_64"; + } + }; + + assertTrue(contribution.isCompatible(platform)); } @Test @@ -29,10 +40,20 @@ public class HostDependentDownloadableContributionTest { return "x86_64-apple-darwin"; } }; - System.setProperty("os.name", "Linux"); - System.setProperty("os.arch", "amd64"); - assertFalse(contribution.isCompatible()); + Platform platform = new Platform() { + @Override + public String getOsName() { + return "Linux"; + } + + @Override + public String getOsArch() { + return "amd64"; + } + }; + + assertFalse(contribution.isCompatible(platform)); } @Test @@ -43,10 +64,20 @@ public class HostDependentDownloadableContributionTest { return "x86_64-apple-darwin"; } }; - System.setProperty("os.name", "Mac OS X"); - System.setProperty("os.arch", "i686"); - assertFalse(contribution.isCompatible()); + Platform platform = new Platform() { + @Override + public String getOsName() { + return "Mac OS X"; + } + + @Override + public String getOsArch() { + return "i686"; + } + }; + + assertFalse(contribution.isCompatible(platform)); } } diff --git a/arduino-core/lib/commons-lang3-3.3.2.jar b/arduino-core/lib/commons-lang3-3.3.2.jar new file mode 100644 index 000000000..2ce08ae99 Binary files /dev/null and b/arduino-core/lib/commons-lang3-3.3.2.jar differ diff --git a/arduino-core/lib/commons-lang3.LICENSE.ASL-2.0.txt b/arduino-core/lib/commons-lang3.LICENSE.ASL-2.0.txt new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/arduino-core/lib/commons-lang3.LICENSE.ASL-2.0.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed 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. diff --git a/arduino-core/src/cc/arduino/contributions/packages/ContributedTool.java b/arduino-core/src/cc/arduino/contributions/packages/ContributedTool.java index 89fab663f..a8f346b79 100644 --- a/arduino-core/src/cc/arduino/contributions/packages/ContributedTool.java +++ b/arduino-core/src/cc/arduino/contributions/packages/ContributedTool.java @@ -28,6 +28,8 @@ */ package cc.arduino.contributions.packages; +import processing.app.BaseNoGui; + import java.util.List; public abstract class ContributedTool { @@ -40,7 +42,7 @@ public abstract class ContributedTool { public DownloadableContribution getDownloadableContribution() { for (HostDependentDownloadableContribution c : getSystems()) { - if (c.isCompatible()) + if (c.isCompatible(BaseNoGui.getPlatform())) return c; } return null; @@ -52,7 +54,7 @@ public abstract class ContributedTool { res = "Tool name : " + getName() + " " + getVersion() + "\n"; for (HostDependentDownloadableContribution sys : getSystems()) { res += " sys"; - res += sys.isCompatible() ? "*" : " "; + res += sys.isCompatible(BaseNoGui.getPlatform()) ? "*" : " "; res += " : " + sys + "\n"; } return res; diff --git a/arduino-core/src/cc/arduino/contributions/packages/ContributionInstaller.java b/arduino-core/src/cc/arduino/contributions/packages/ContributionInstaller.java index c32d04838..ab4b4421f 100644 --- a/arduino-core/src/cc/arduino/contributions/packages/ContributionInstaller.java +++ b/arduino-core/src/cc/arduino/contributions/packages/ContributionInstaller.java @@ -172,7 +172,7 @@ public class ContributionInstaller { if (postInstallScripts.isEmpty()) { String[] subfolders = folder.list(new OnlyDirs()); - if (subfolders.length > 1) { + if (subfolders.length != 1) { return; } diff --git a/arduino-core/src/cc/arduino/contributions/packages/HostDependentDownloadableContribution.java b/arduino-core/src/cc/arduino/contributions/packages/HostDependentDownloadableContribution.java index 0e4a41dac..b7a7927c8 100644 --- a/arduino-core/src/cc/arduino/contributions/packages/HostDependentDownloadableContribution.java +++ b/arduino-core/src/cc/arduino/contributions/packages/HostDependentDownloadableContribution.java @@ -28,7 +28,8 @@ */ package cc.arduino.contributions.packages; -import java.util.Properties; +import processing.app.BaseNoGui; +import processing.app.Platform; public abstract class HostDependentDownloadableContribution extends DownloadableContribution { @@ -39,12 +40,9 @@ public abstract class HostDependentDownloadableContribution extends Downloadable return getHost() + " " + super.toString(); } - public boolean isCompatible() { - // TODO: add missing host detections - - Properties prop = System.getProperties(); - String osName = prop.getProperty("os.name"); - String osArch = prop.getProperty("os.arch"); + public boolean isCompatible(Platform platform) { + String osName = platform.getOsName(); + String osArch = platform.getOsArch(); String host = getHost(); diff --git a/arduino-core/src/processing/app/Platform.java b/arduino-core/src/processing/app/Platform.java index 24a842c1a..9faf21b41 100644 --- a/arduino-core/src/processing/app/Platform.java +++ b/arduino-core/src/processing/app/Platform.java @@ -72,7 +72,7 @@ public class Platform { } - public void init() { + public void init() throws IOException { } @@ -236,4 +236,12 @@ public class Platform { scripts.add(new File(folder, "post_install.sh")); return scripts; } + + public String getOsName() { + return System.getProperty("os.name"); + } + + public String getOsArch() { + return System.getProperty("os.arch"); + } } diff --git a/arduino-core/src/processing/app/macosx/Platform.java b/arduino-core/src/processing/app/macosx/Platform.java index 7ec81c253..72de4a3c0 100644 --- a/arduino-core/src/processing/app/macosx/Platform.java +++ b/arduino-core/src/processing/app/macosx/Platform.java @@ -26,6 +26,7 @@ import cc.arduino.packages.BoardPort; import com.apple.eio.FileManager; import org.apache.commons.exec.CommandLine; import org.apache.commons.exec.Executor; +import org.apache.commons.lang3.StringUtils; import processing.app.debug.TargetPackage; import processing.app.legacy.PApplet; import processing.app.legacy.PConstants; @@ -45,6 +46,8 @@ import java.util.List; */ public class Platform extends processing.app.Platform { + private String osArch; + public void setLookAndFeel() throws Exception { } @@ -54,35 +57,18 @@ public class Platform extends processing.app.Platform { Toolkit.getDefaultToolkit(); } - public void init() { + public void init() throws IOException { System.setProperty("apple.laf.useScreenMenuBar", "true"); - /* - try { - String name = "processing.app.macosx.ThinkDifferent"; - Class osxAdapter = ClassLoader.getSystemClassLoader().loadClass(name); - Class[] defArgs = { Base.class }; - Method registerMethod = osxAdapter.getDeclaredMethod("register", defArgs); - if (registerMethod != null) { - Object[] args = { this }; - registerMethod.invoke(osxAdapter, args); - } - } catch (NoClassDefFoundError e) { - // This will be thrown first if the OSXAdapter is loaded on a system without the EAWT - // because OSXAdapter extends ApplicationAdapter in its def - System.err.println("This version of Mac OS X does not support the Apple EAWT." + - "Application Menu handling has been disabled (" + e + ")"); + discoverRealOsArch(); + } - } catch (ClassNotFoundException e) { - // This shouldn't be reached; if there's a problem with the OSXAdapter - // we should get the above NoClassDefFoundError first. - System.err.println("This version of Mac OS X does not support the Apple EAWT. " + - "Application Menu handling has been disabled (" + e + ")"); - } catch (Exception e) { - System.err.println("Exception while loading BaseOSX:"); - e.printStackTrace(); - } - */ + private void discoverRealOsArch() throws IOException { + CommandLine uname = CommandLine.parse("uname -m"); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + CollectStdOutExecutor executor = new CollectStdOutExecutor(baos); + executor.execute(uname); + osArch = StringUtils.trim(new String(baos.toByteArray())); } @@ -252,4 +238,9 @@ public class Platform extends processing.app.Platform { return filteredPorts; } + + @Override + public String getOsArch() { + return osArch; + } } diff --git a/arduino-core/src/processing/app/windows/Platform.java b/arduino-core/src/processing/app/windows/Platform.java index 4e93f543e..9571a1079 100644 --- a/arduino-core/src/processing/app/windows/Platform.java +++ b/arduino-core/src/processing/app/windows/Platform.java @@ -56,7 +56,7 @@ public class Platform extends processing.app.Platform { "\\arduino.exe \"%1\""; static final String DOC = "Arduino.Document"; - public void init() { + public void init() throws IOException { super.init(); checkAssociations();