OsInfo.java
- /*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.
- */
- package org.apache.commons.crypto;
- import java.io.File;
- import java.io.IOException;
- import java.util.HashMap;
- import java.util.Locale;
- /**
- * Provides OS name and architecture name. Used by the JNI make process to get
- * information from the build environment.
- */
- final class OsInfo {
- private final static HashMap<String, String> archMapping = new HashMap<>();
- /**
- * The constant string represents for X86 architecture, the value is:
- * {@value #X86}.
- */
- static final String X86 = "x86";
- /**
- * The constant string represents for X86_64 architecture, the value is:
- * {@value #X86_64}.
- */
- static final String X86_64 = "x86_64";
- /**
- * The constant string represents for IA64_32 architecture, the value is:
- * {@value #IA64_32}.
- */
- static final String IA64_32 = "ia64_32";
- /**
- * The constant string represents for IA64 architecture, the value is:
- * {@value #IA64}.
- */
- static final String IA64 = "ia64";
- /**
- * The constant string represents for PPC architecture, the value is:
- * {@value #PPC}.
- */
- static final String PPC = "ppc";
- /**
- * The constant string represents for PPC64 architecture, the value is:
- * {@value #PPC64}.
- */
- static final String PPC64 = "ppc64";
- static {
- // x86 mappings
- archMapping.put(X86, X86);
- archMapping.put("i386", X86);
- archMapping.put("i486", X86);
- archMapping.put("i586", X86);
- archMapping.put("i686", X86);
- archMapping.put("pentium", X86);
- // x86_64 mappings
- archMapping.put(X86_64, X86_64);
- archMapping.put("amd64", X86_64);
- archMapping.put("em64t", X86_64);
- archMapping.put("universal", X86_64); // Needed for openjdk7 in Mac
- // Itanium 64-bit mappings
- archMapping.put(IA64, IA64);
- archMapping.put("ia64w", IA64);
- // Itanium 32-bit mappings, usually an HP-UX construct
- archMapping.put(IA64_32, IA64_32);
- archMapping.put("ia64n", IA64_32);
- // PowerPC mappings
- archMapping.put(PPC, PPC);
- archMapping.put("power", PPC);
- archMapping.put("powerpc", PPC);
- archMapping.put("power_pc", PPC);
- archMapping.put("power_rs", PPC);
- // PowerPC 64bit mappings
- archMapping.put(PPC64, PPC64);
- archMapping.put("power64", PPC64);
- archMapping.put("powerpc64", PPC64);
- archMapping.put("power_pc64", PPC64);
- archMapping.put("power_rs64", PPC64);
- }
- /**
- * Gets the architecture name.
- *
- * @return the architecture name.
- */
- static String getArchName() {
- // if running Linux on ARM, need to determine ABI of JVM
- final String osArch = System.getProperty("os.arch");
- if (osArch.startsWith("arm") && getOsNameProperty().contains("Linux")) {
- final String javaHome = System.getProperty("java.home");
- try {
- // determine if first JVM found uses ARM hard-float ABI
- final String[] cmdarray = { "/bin/sh", "-c",
- "find '" + javaHome + "' -name 'libjvm.so' | head -1 | xargs readelf -A | grep 'Tag_ABI_VFP_args: VFP registers'" };
- final int exitCode = Runtime.getRuntime().exec(cmdarray).waitFor();
- if (exitCode == 0) {
- return "armhf";
- }
- } catch (final IOException | InterruptedException e) { // NOPMD
- // ignored: fall back to "arm" arch (soft-float ABI)
- }
- } else {
- final String string = archMapping.get(osArch.toLowerCase(Locale.US));
- if (string != null) {
- return string;
- }
- }
- return translateArchNameToFolderName(osArch);
- }
- /**
- * Gets the native lib folder.
- *
- * @return the current OS's native lib folder.
- */
- static String getNativeLibFolderPathForCurrentOS() {
- return getOSName() + File.separator + getArchName();
- }
- /**
- * Gets the OS name.
- *
- * @return the OS name.
- */
- static String getOSName() {
- return translateOSNameToFolderName(getOsNameProperty());
- }
- static String getOsNameProperty() {
- return System.getProperty("os.name");
- }
- /**
- * The main method. This is used by the JNI make processing in Makefile.common
- *
- * @param args the argv.
- */
- public static void main(final String[] args) {
- if (args.length >= 1) {
- if ("--os".equals(args[0])) {
- System.out.println(getOSName());
- return;
- }
- if ("--arch".equals(args[0])) {
- System.out.println(getArchName());
- return;
- }
- }
- System.out.println(getNativeLibFolderPathForCurrentOS());
- }
- /**
- * Translates the architecture name to folder name.
- *
- * @param archName the architecture name.
- * @return the folder name.
- */
- private static String translateArchNameToFolderName(final String archName) {
- return archName.replaceAll("\\W", "");
- }
- /**
- * Translates the OS name to folder name.
- *
- * @param osName the OS name.
- * @return the folder name.
- */
- private static String translateOSNameToFolderName(final String osName) {
- if (osName.contains("Windows")) {
- return "Windows";
- }
- if (osName.contains("Mac")) {
- return "Mac";
- }
- if (osName.contains("Linux")) {
- return "Linux";
- }
- if (osName.contains("AIX")) {
- return "AIX";
- }
- return osName.replaceAll("\\W", "");
- }
- /**
- * The private constructor of {@link OsInfo}.
- */
- private OsInfo() {
- }
- }