001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019 package org.apache.felix.framework.util.manifestparser;
020
021 import java.util.Map;
022 import org.osgi.framework.Constants;
023
024 public class R4Library
025 {
026 private String m_libraryFile;
027 private String[] m_osnames;
028 private String[] m_processors;
029 private String[] m_osversions;
030 private String[] m_languages;
031 private String m_selectionFilter;
032
033 public R4Library(
034 String libraryFile, String[] osnames, String[] processors, String[] osversions,
035 String[] languages, String selectionFilter) throws Exception
036 {
037 m_libraryFile = libraryFile;
038 m_osnames = osnames;
039 m_processors = processors;
040 m_osversions = osversions;
041 m_languages = languages;
042 m_selectionFilter = selectionFilter;
043 }
044
045 public String getEntryName()
046 {
047 return m_libraryFile;
048 }
049
050 public String[] getOSNames()
051 {
052 return m_osnames;
053 }
054
055 public String[] getProcessors()
056 {
057 return m_processors;
058 }
059
060 public String[] getOSVersions()
061 {
062 return m_osversions;
063 }
064
065 public String[] getLanguages()
066 {
067 return m_languages;
068 }
069
070 public String getSelectionFilter()
071 {
072 return m_selectionFilter;
073 }
074
075 /**
076 * <p>
077 * Determines if the specified native library name matches this native
078 * library definition.
079 * </p>
080 * @param name the native library name to try to match.
081 * @return <tt>true</tt> if this native library name matches this native
082 * library definition; <tt>false</tt> otherwise.
083 **/
084 public boolean match(Map configMap, String name)
085 {
086 String libname = System.mapLibraryName(name);
087 String[] exts = ManifestParser.parseDelimitedString(
088 (String) configMap.get(Constants.FRAMEWORK_LIBRARY_EXTENSIONS), ",");
089 int extIdx = 0;
090
091 // First try to match the default name, then try to match any additionally
092 // specified library extensions.
093 do
094 {
095 if (m_libraryFile.equals(libname) || m_libraryFile.endsWith("/" + libname))
096 {
097 return true;
098 }
099 else if (libname.endsWith(".jnilib") && m_libraryFile.endsWith(".dylib"))
100 {
101 libname = libname.substring(0, libname.length() - 6) + "dylib";
102 if (m_libraryFile.equals(libname) || m_libraryFile.endsWith("/" + libname))
103 {
104 return true;
105 }
106 }
107 else if (m_libraryFile.equals(name) || m_libraryFile.endsWith("/" + name))
108 {
109 return true;
110 }
111
112 // If we have other native library extensions to try, then
113 // calculate the new native library name.
114 if ((exts != null) && (extIdx < exts.length))
115 {
116 int idx = libname.lastIndexOf(".");
117 libname = (idx < 0)
118 ? libname + "." + exts[extIdx++]
119 : libname.substring(0, idx) + "." + exts[extIdx++];
120 }
121 }
122 while ((exts != null) && (extIdx < exts.length));
123
124 return false;
125 }
126
127 public String toString()
128 {
129 if (m_libraryFile != null)
130 {
131 StringBuffer sb = new StringBuffer();
132 sb.append(m_libraryFile);
133 for (int i = 0; (m_osnames != null) && (i < m_osnames.length); i++)
134 {
135 sb.append(';');
136 sb.append(Constants.BUNDLE_NATIVECODE_OSNAME);
137 sb.append('=');
138 sb.append(m_osnames[i]);
139 }
140 for (int i = 0; (m_processors != null) && (i < m_processors.length); i++)
141 {
142 sb.append(';');
143 sb.append(Constants.BUNDLE_NATIVECODE_PROCESSOR);
144 sb.append('=');
145 sb.append(m_processors[i]);
146 }
147 for (int i = 0; (m_osversions != null) && (i < m_osversions.length); i++)
148 {
149 sb.append(';');
150 sb.append(Constants.BUNDLE_NATIVECODE_OSVERSION);
151 sb.append('=');
152 sb.append(m_osversions[i]);
153 }
154 for (int i = 0; (m_languages != null) && (i < m_languages.length); i++)
155 {
156 sb.append(';');
157 sb.append(Constants.BUNDLE_NATIVECODE_LANGUAGE);
158 sb.append('=');
159 sb.append(m_languages[i]);
160 }
161 if (m_selectionFilter != null)
162 {
163 sb.append(';');
164 sb.append(Constants.SELECTION_FILTER_ATTRIBUTE);
165 sb.append('=');
166 sb.append('\'');
167 sb.append(m_selectionFilter);
168 }
169
170 return sb.toString();
171 }
172 return "*";
173 }
174 }