/******************************************************************************* * Copyright (c) 2015 ARM Ltd and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * ARM Ltd and ARM Germany GmbH - Initial API and implementation *******************************************************************************/ package com.arm.cmsis.pack; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.Path; import com.arm.cmsis.pack.common.CmsisConstants; import com.arm.cmsis.pack.utils.WildCards; /** * Utility class to manipulate device vendor strings * */ public class DeviceVendor { protected static Map<String, String> nameToId = null; protected static Map<String, String> idToName = null; protected static Map<String, String> idToId = null; public static final String KEIL_DD2_URL= "http://www.keil.com/dd2/"; //$NON-NLS-1$ public static final String KEIL_BOARD2_URL= "http://www.keil.com/boards2/"; //$NON-NLS-1$ /** * Returns vendor ID * * @param vendorName * @return vendor id if found, null otherwise */ public static String getVendorId(String vendorName) { if (vendorName == null || vendorName.isEmpty()) return null; // if ID is given in input string, simply return it int i = vendorName.indexOf(':'); if (i >= 0) { return vendorName.substring(i + 1); } if (nameToId == null) fillMaps(); return nameToId.get(vendorName); } public static String getVendorName(String id) { if (id == null || id.isEmpty()) return null; if (idToName == null) fillMaps(); return idToName.get(id); } /** * Returns official vendor name, for example input <code>"ST:13"</code> will * produce <code>"STMicroelectronics"</code> * * @param vendor string containing vendor name and id (optionally) * @return official vendor name */ public static String getOfficialVendorName(String vendor) { String id = getVendorId(vendor); if (id != null) { id = getOfficialVendorId(id); String name = getVendorName(id); if (name == null) { // no such vendor known int i = vendor.indexOf(':'); if (i >= 0) { return vendor.substring(0, i); // return its name } } return name; } return vendor; // simply return vendor as is (mapping does not exist) } /** * Returns vendor string in canonical format: <code>"official name:id"</code> * @param vendor name or string with id * @return vendor string in canonical format */ public static String getCanonicalVendorString(String vendor) { String canonical = getOfficialVendorName(vendor); String id = getOfficialVendorId(getVendorId(canonical)); if(id != null) { return canonical + ":" + id; //$NON-NLS-1$ } return vendor; // simply return string as is (mapping does not exist) } /** * Converts old vendor ID to new one if needed * @param id vendor ID to convert * @return the official vendor ID if mapping exists, otherwise unchanged id */ public static String getOfficialVendorId(String id) { if (idToId == null) fillMaps(); if(idToId.containsKey(id)) return idToId.get(id); return id; } /** * Returns URL for given vendor * @param vendor full vendor name * @return */ public static String getVendorUrl(String vendor) { String name = getOfficialVendorName(vendor); String url = KEIL_DD2_URL; if(name.startsWith("STMicro")) //$NON-NLS-1$ url += "st"; //$NON-NLS-1$ else url += adjutsToUrl(name); return url; } /** * Returns URL for given vendor * @param vendor full vendor name * @return */ public static String getBoardVendorUrl(String vendor) { String name = getOfficialVendorName(vendor); String url = KEIL_BOARD2_URL; if(name.startsWith("STMicro")) //$NON-NLS-1$ url += "st"; //$NON-NLS-1$ else url += adjutsToUrl(name); return url; } /** * Adjusts string to URL: removes spaces and non-alphanumeric characters * @param s string to adjust * @return adjusted string */ public static String adjutsToUrl(String s){ String url = CmsisConstants.EMPTY_STRING; if(s == null) return url; // Replace characters for (int i = 0; i < s.length(); i++) { char ch = s.charAt(i); if(Character.isSpaceChar(ch)) continue; // skip space if(Character.isDigit(ch)) url += ch; else if(Character.isLetter(ch)) url += Character.toLowerCase(ch); else url += '_'; } return url; } /** * Compares two vendor string given in format <code>name:ID</code> First * compares ID's if both present. If they do not match, the names are * compared (may contain wild cards) * * @param v0 * first vendor string to compare * @param v1 * second vendor string to compare * @return true if strings match each other */ public static boolean match(final String v0, final String v1) { if(v0 == null || v1 == null) return false; if(v0.isEmpty() || v1.isEmpty()) return true; String id0 = getOfficialVendorId(getVendorId(v0)); String id1 = getOfficialVendorId(getVendorId(v1)); if(id0 != null && id1 != null) return id0.equals(id1); String name0 = getOfficialVendorName(v0); String name1 = getOfficialVendorName(v1); return WildCards.match(name0, name1); } /** * Adds new vendor mapping or replaces existing one (if vendor name changes) * * @param id * numeric vendor ID * @param name * official vendor name */ public static void addVendor(final String id, final String name) { if (idToName == null) fillMaps(); // ensure maps are filled idToName.put(id, name); nameToId.put(name, id); } /** * Fills internal vendor maps with data provided in the following format: * id[|oldId|oldId]=name[|alias|alias];id=name[|alias|alias]... For example: 82 = ARM;13 = * STMicroelectronics|ST;7=Infineon * * @param vendors string containing vendor mappings mappings */ protected static void fillMaps(final String vendors) { clear(); if (vendors == null) return; nameToId = new HashMap<String, String>(); idToName = new HashMap<String, String>(); idToId = new HashMap<String, String>(); String[] lines = vendors.split(";"); //$NON-NLS-1$ for (String line : lines) { if (line.isEmpty()) continue; if (!Character.isDigit(line.charAt(0))) continue; String[] tokens = line.split("="); //$NON-NLS-1$ if (tokens.length != 2) continue; String[] ids = tokens[0].split("\\|"); //$NON-NLS-1$ if (ids.length < 1) continue; String id = ids[0].trim(); if(id.isEmpty()) continue; for(String oldId : ids) { oldId = oldId.trim(); if(!oldId.isEmpty() && !oldId.equals(id)) idToId.put(oldId, id); } String[] names = tokens[1].split("\\|"); //$NON-NLS-1$ if (names.length < 1) continue; String offcialName= names[0].trim(); idToName.put(id, offcialName); for (String name : names) { if(!name.isEmpty()) nameToId.put(name.trim(), id); } } } /** * Fills dictionaries with vendor mapping */ public static void fillMaps() { try { InputStream inputStream = FileLocator.openStream(CpPlugIn .getDefault().getBundle(), new Path("resources/deviceVendors.txt"), false); //$NON-NLS-1$ BufferedReader in = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder sb = new StringBuilder(); String line; while ((line = in.readLine()) != null) { sb.append(line.trim()); sb.append(";"); //$NON-NLS-1$ } in.close(); String vendors = sb.toString(); fillMaps(vendors); } catch (IOException e) { e.printStackTrace(); } } /** * Clears dictionaries */ public static void clear(){ nameToId = null; idToName = null; idToId = null; } }