1 /* 2 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package com.sun.tools.jdeps; 27 28 import com.sun.tools.classfile.ClassFile; 29 import com.sun.tools.classfile.ConstantPoolException; 30 31 import java.util.Map; 32 import java.util.concurrent.ConcurrentHashMap; 33 import java.util.jar.JarEntry; 34 import java.util.jar.JarFile; 35 36 public class VersionHelper { 37 private static final String META_INF_VERSIONS = "META-INF/versions/"; 38 private static final Map<String,String> nameToVersion = new ConcurrentHashMap<>(); 39 40 public static String get(String classname) { 41 if (nameToVersion.containsKey(classname)) { 42 return nameToVersion.get(classname) + "/" + classname; 43 } 44 return classname; 45 } 46 47 public static void add(JarFile jarfile, JarEntry e, ClassFile cf) 48 throws ConstantPoolException 49 { 50 String realName = e.getRealName(); 51 if (realName.startsWith(META_INF_VERSIONS)) { 52 int len = META_INF_VERSIONS.length(); 53 int n = realName.indexOf('/', len); 54 if (n > 0) { 55 String version = realName.substring(len, n); 56 assert (Integer.parseInt(version) > 8); 57 String name = cf.getName().replace('/', '.'); 58 if (nameToVersion.containsKey(name)) { 59 if (!version.equals(nameToVersion.get(name))) { 60 throw new MultiReleaseException( 61 "err.multirelease.version.associated", 62 name, nameToVersion.get(name), version 63 ); 64 } 65 } else { 66 nameToVersion.put(name, version); 67 } 68 } else { 69 throw new MultiReleaseException("err.multirelease.jar.malformed", 70 jarfile.getName(), realName); 71 } 72 } 73 } 74 }