| /* |
| * Licensed 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.aries.subsystem.core.internal; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.net.MalformedURLException; |
| import java.net.URI; |
| import java.net.URL; |
| import java.net.URLClassLoader; |
| import java.security.PrivilegedAction; |
| import java.util.HashMap; |
| import java.util.Locale; |
| import java.util.Map; |
| import java.util.Map.Entry; |
| import java.util.ResourceBundle; |
| |
| import org.apache.aries.subsystem.core.archive.Header; |
| |
| public class GetSubsystemHeadersAction implements PrivilegedAction<Map<String, String>> { |
| private final Locale locale; |
| private final BasicSubsystem subsystem; |
| |
| public GetSubsystemHeadersAction(BasicSubsystem subsystem, Locale locale) { |
| this.subsystem = subsystem; |
| this.locale = locale; |
| } |
| |
| @Override |
| public Map<String, String> run() { |
| Map<String, Header<?>> headers = subsystem.getSubsystemManifest().getHeaders(); |
| Map<String, String> result = new HashMap<String, String>(headers.size()); |
| for (Entry<String, Header<?>> entry: headers.entrySet()) { |
| Header<?> value = entry.getValue(); |
| result.put(entry.getKey(), translate(value.getValue())); |
| } |
| return result; |
| } |
| |
| private String translate(String value) { |
| if (locale == null || value == null || !value.startsWith("%")) |
| return value; |
| String localizationStr = subsystem.getSubsystemManifest().getSubsystemLocalizationHeader().getValue(); |
| File rootDir; |
| File localizationFile; |
| try { |
| rootDir = subsystem.getDirectory().getCanonicalFile(); |
| localizationFile = new File(rootDir, localizationStr).getCanonicalFile(); |
| } |
| catch (IOException e) { |
| // TODO Log this. Particularly a problem if rootDir throws an |
| // exception as corruption has occurred. May want to let that |
| // propagate as a runtime exception. |
| return value; |
| } |
| URI rootUri = rootDir.toURI(); |
| // The last segment of the Subsystem-Localization header value is the |
| // base file name. The directory is its parent. |
| URI localizationUri = localizationFile.getParentFile().toURI(); |
| if (rootUri.relativize(localizationUri).equals(localizationUri)) |
| // TODO Log this. The value of the Subsystem-Localization header |
| // is not relative to the subsystem root directory. |
| return value; |
| URL localizationUrl; |
| try { |
| localizationUrl = localizationUri.toURL(); |
| } |
| catch (MalformedURLException e) { |
| // TODO Should never happen but log it anyway. |
| return value; |
| } |
| URLClassLoader classLoader = new URLClassLoader(new URL[]{localizationUrl}); |
| try { |
| ResourceBundle rb = ResourceBundle.getBundle(localizationFile.getName(), locale, classLoader); |
| return rb.getString(value.substring(1)); |
| } |
| catch (Exception e) { |
| return value; |
| } |
| } |
| } |