/* * 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.felix.framework.util.manifestparser; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.osgi.framework.Constants; public class NativeLibrary { private String m_libraryFile; private String[] m_osnames; private String[] m_processors; private String[] m_osversions; private String[] m_languages; private String m_selectionFilter; public NativeLibrary( String libraryFile, String[] osnames, String[] processors, String[] osversions, String[] languages, String selectionFilter) throws Exception { m_libraryFile = libraryFile; m_osnames = osnames; m_processors = processors; m_osversions = osversions; m_languages = languages; m_selectionFilter = selectionFilter; } public String getEntryName() { return m_libraryFile; } public String[] getOSNames() { return m_osnames; } public String[] getProcessors() { return m_processors; } public String[] getOSVersions() { return m_osversions; } public String[] getLanguages() { return m_languages; } public String getSelectionFilter() { return m_selectionFilter; } /** * <p> * Determines if the specified native library name matches this native * library definition. * </p> * @param name the native library name to try to match. * @return <tt>true</tt> if this native library name matches this native * library definition; <tt>false</tt> otherwise. **/ public boolean match(Map configMap, String name) { // First, check for an exact match. boolean matched = false; if (m_libraryFile.equals(name) || m_libraryFile.endsWith("/" + name)) { matched = true; } // Then check the mapped name. String libname = System.mapLibraryName(name); // As well as any additional library file extensions. List<String> exts = ManifestParser.parseDelimitedString( (String) configMap.get(Constants.FRAMEWORK_LIBRARY_EXTENSIONS), ","); if (exts == null) { exts = new ArrayList<String>(); } // For Mac OSX, try dylib too. if (libname.endsWith(".jnilib") && m_libraryFile.endsWith(".dylib")) { exts.add("dylib"); } if (libname.endsWith(".dylib") && m_libraryFile.endsWith(".jnilib")) { exts.add("jnilib"); } // Loop until we find a match or not. int extIdx = -1; while (!matched && (extIdx < exts.size())) { // Check if the current name matches. if (m_libraryFile.equals(libname) || m_libraryFile.endsWith("/" + libname)) { matched = true; } // Increment extension index. extIdx++; // If we have other native library extensions to try, then // calculate the new native library name. if (!matched && (extIdx < exts.size())) { int idx = libname.lastIndexOf("."); libname = (idx < 0) ? libname + "." + exts.get(extIdx) : libname.substring(0, idx + 1) + exts.get(extIdx); } } return matched; } public String toString() { if (m_libraryFile != null) { StringBuffer sb = new StringBuffer(); sb.append(m_libraryFile); for (int i = 0; (m_osnames != null) && (i < m_osnames.length); i++) { sb.append(';'); sb.append(Constants.BUNDLE_NATIVECODE_OSNAME); sb.append('='); sb.append(m_osnames[i]); } for (int i = 0; (m_processors != null) && (i < m_processors.length); i++) { sb.append(';'); sb.append(Constants.BUNDLE_NATIVECODE_PROCESSOR); sb.append('='); sb.append(m_processors[i]); } for (int i = 0; (m_osversions != null) && (i < m_osversions.length); i++) { sb.append(';'); sb.append(Constants.BUNDLE_NATIVECODE_OSVERSION); sb.append('='); sb.append(m_osversions[i]); } for (int i = 0; (m_languages != null) && (i < m_languages.length); i++) { sb.append(';'); sb.append(Constants.BUNDLE_NATIVECODE_LANGUAGE); sb.append('='); sb.append(m_languages[i]); } if (m_selectionFilter != null) { sb.append(';'); sb.append(Constants.SELECTION_FILTER_ATTRIBUTE); sb.append('='); sb.append('\''); sb.append(m_selectionFilter); } return sb.toString(); } return "*"; } }