package com.bc.ceres.core.runtime.internal; import java.util.HashSet; /** * Helper class used to install platform dependent module entries. * * @author Norman Fomferra * @since Ceres 0.12 */ public class Platform { public enum ID { aix("aix"), hpux("hp ux"), linux("linux"), macosx("mac os x"), solaris("solaris"), win("win"); private final String osNamePattern; ID(String osNamePattern) { this.osNamePattern = osNamePattern; } } private static final String LIB_DIR = "lib"; // System properties that indicate architecure of the current Java VM executable // (note that we don't want the actual underlying OS architecture) private static final String[] VM_PLATFORM_ARCH_KEYS = { "sun.arch.data.model", "com.ibm.vm.bitmode", "os.arch", }; private static final HashSet<String> PLATFORM_DIRS = new HashSet<String>(); static { for (ID platformId : ID.values()) { PLATFORM_DIRS.add(getSourcePathPrefix(platformId, 32)); PLATFORM_DIRS.add(getSourcePathPrefix(platformId, 64)); } } private final ID id; private final int bitCount; private final String sourcePathPrefix; public Platform(ID id, int bitCount) { this.id = id; this.bitCount = bitCount; this.sourcePathPrefix = getSourcePathPrefix(id, bitCount); } public ID getId() { return id; } public int getBitCount() { return bitCount; } public boolean isPlatformDir(String entryName) { return entryName.startsWith(sourcePathPrefix); } public String truncatePlatformDir(String entryName) { if (isPlatformDir(entryName)) { return LIB_DIR + "/" + entryName.substring(sourcePathPrefix.length()); } else { return entryName; } } public static boolean isAnyPlatformDir(String entryName) { for (String platformDir : PLATFORM_DIRS) { if (entryName.startsWith(platformDir)) { return true; } } return false; } public static Platform getCurrentPlatform() { ID platformId = getCurrentPlatformId(); if (platformId != null) { return new Platform(platformId, getCurrentPlatformBitCount()); } return null; } static ID getCurrentPlatformId() { String osName = System.getProperty("os.name"); if (osName != null) { return getPlatformId(osName); } else { return null; } } static int getCurrentPlatformBitCount() { for (String key : VM_PLATFORM_ARCH_KEYS) { String property = System.getProperty(key); if (property != null && property.indexOf("64") > 0) { return 64; } } return 32; } static ID getPlatformId(String osName) { String osNameLC = osName.toLowerCase(); for (ID platformId : ID.values()) { // todo - better use regex pattern matching here (nf, 02.05.2011) if (osNameLC.startsWith(platformId.osNamePattern)) { return platformId; } } return null; } static String getSourcePathPrefix(ID id, int numBits) { return String.format("%s/%s%d/", LIB_DIR, id, numBits); } }