/*
* 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 WARRANTIESOR 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.application.modelling.impl;
import static org.apache.aries.application.utils.AppConstants.LOG_ENTRY;
import static org.apache.aries.application.utils.AppConstants.LOG_EXIT;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.jar.Attributes;
import org.apache.aries.application.InvalidAttributeException;
import org.apache.aries.application.modelling.ImportedBundle;
import org.apache.aries.application.modelling.ModellingConstants;
import org.apache.aries.application.modelling.internal.MessageUtil;
import org.apache.aries.application.modelling.utils.impl.ModellingHelperImpl;
import org.apache.aries.util.manifest.ManifestHeaderProcessor;
import org.osgi.framework.Constants;
import org.osgi.framework.Version;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* An exported bundle: one that I have and make available.
*/
public class ExportedBundleImpl extends AbstractExportedBundle
{
private static final Logger logger = LoggerFactory.getLogger(ExportedBundleImpl.class);
private final Map<String, Object> _attributes;
private final ImportedBundle _fragHost;
/**
* Construct an ExportedBundleImpl from a processed Manifest
* @param attrs
* @throws InvalidAttributeException
*/
public ExportedBundleImpl (Attributes attrs) throws InvalidAttributeException {
logger.debug(LOG_ENTRY, "ExportedBundleImpl", attrs);
String symbolicName = attrs.getValue(Constants.BUNDLE_SYMBOLICNAME);
Map<String,Map<String, String>> map = ManifestHeaderProcessor.parseImportString(symbolicName);
//This should have one entry, which is keyed on the symbolicName
if(map.size() != 1) {
InvalidAttributeException iax = new InvalidAttributeException (MessageUtil.getMessage(
"TOO_MANY_SYM_NAMES", new Object[] {symbolicName}));
logger.debug(LOG_EXIT, "ExportedBundleImpl", iax);
throw iax;
}
Map.Entry<String, Map<String, String>> entry = map.entrySet().iterator().next();
symbolicName = entry.getKey();
Map<String, String> bundleAttrs = entry.getValue();
String displayName = attrs.getValue(Constants.BUNDLE_NAME);
String version = attrs.getValue(Constants.BUNDLE_VERSION);
if (version == null) {
version = Version.emptyVersion.toString();
}
String bmVersion = attrs.getValue(Constants.BUNDLE_MANIFESTVERSION);
if (symbolicName == null || bmVersion == null) {
InvalidAttributeException iax = new InvalidAttributeException(MessageUtil.getMessage("INCORRECT_MANDATORY_HEADERS",
new Object[] {symbolicName, bmVersion}));
logger.debug(LOG_EXIT, "ExportedBundleImpl", iax);
throw iax;
}
if(bundleAttrs != null)
_attributes = new HashMap<String, Object>(entry.getValue());
else
_attributes = new HashMap<String, Object>();
_attributes.put (Constants.BUNDLE_MANIFESTVERSION, bmVersion);
_attributes.put(ModellingConstants.OBR_SYMBOLIC_NAME, symbolicName);
_attributes.put (Constants.VERSION_ATTRIBUTE, version);
if(displayName != null)
_attributes.put(ModellingConstants.OBR_PRESENTATION_NAME, displayName);
String fragmentHost = attrs.getValue(Constants.FRAGMENT_HOST);
if (fragmentHost != null) {
_fragHost = ModellingHelperImpl.buildFragmentHost_(fragmentHost);
_attributes.put(Constants.FRAGMENT_HOST, fragmentHost);
} else {
_fragHost = null;
}
logger.debug(LOG_EXIT, "ExportedBundleImpl");
}
/**
* Construct a bundle from attributes and a fragment host
* @param attributes attributes describing the bundle
* @param fragHost may be null if this bundle is not a fragment
*/
public ExportedBundleImpl(Map<String, String> attributes, ImportedBundle fragHost) {
logger.debug(LOG_ENTRY, "ExportedBundleImpl", new Object[]{attributes, fragHost});
_attributes = new HashMap<String, Object>(attributes);
_fragHost = fragHost;
logger.debug(LOG_EXIT, "ExportedBundleImpl", new Object[]{attributes, fragHost});
}
@Override
public Map<String, Object> getAttributes() {
logger.debug(LOG_ENTRY, "getAttributes");
logger.debug(LOG_EXIT, "getAttributes", new Object[]{_attributes});
return Collections.unmodifiableMap(_attributes);
}
@Override
public String toString() {
return _attributes.toString();
}
@Override
public ImportedBundle getFragmentHost() {
logger.debug(LOG_ENTRY, "getFragmentHost");
logger.debug(LOG_EXIT, "getFragmentHost", new Object[]{_fragHost});
return _fragHost;
}
@Override
public boolean isFragment() {
logger.debug(LOG_ENTRY, "isFragment");
boolean result = _fragHost != null;
logger.debug(LOG_EXIT, "isFragment", new Object[]{result});
return result;
}
}