/* * 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.karaf.bundle.core.internal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.karaf.bundle.core.BundleInfo; import org.apache.karaf.bundle.core.BundleState; import org.osgi.framework.Bundle; import org.osgi.framework.Constants; import org.osgi.framework.startlevel.BundleStartLevel; import org.osgi.framework.wiring.BundleRevision; import org.osgi.framework.wiring.BundleRevisions; import org.osgi.framework.wiring.BundleWire; public class BundleInfoImpl implements BundleInfo { private int startLevel; private String name; private String symbolicName; private String updateLocation; private String version; private String revisions; private long bundleId; private BundleState state; private boolean isFragment; private List<Bundle> fragments; private List<Bundle> fragmentHosts; private static Map<Integer, BundleState> bundleStateMap; static { bundleStateMap = new HashMap<Integer, BundleState>(); bundleStateMap.put(Bundle.ACTIVE, BundleState.Active); bundleStateMap.put(Bundle.INSTALLED, BundleState.Installed); bundleStateMap.put(Bundle.RESOLVED, BundleState.Resolved); bundleStateMap.put(Bundle.STARTING, BundleState.Starting); bundleStateMap.put(Bundle.STOPPING, BundleState.Stopping); }; public BundleInfoImpl(Bundle bundle, BundleState extState) { BundleStartLevel bsl = bundle.adapt(BundleStartLevel.class); this.startLevel = bsl.getStartLevel(); this.name = (String)bundle.getHeaders().get(Constants.BUNDLE_NAME); this.symbolicName = bundle.getSymbolicName(); String locationFromHeader = (String)bundle.getHeaders().get(Constants.BUNDLE_UPDATELOCATION); this.updateLocation = locationFromHeader != null ? locationFromHeader : bundle.getLocation(); this.version = (String)bundle.getHeaders().get(Constants.BUNDLE_VERSION); this.revisions = populateRevisions(bundle); this.bundleId = bundle.getBundleId(); this.state = (extState != BundleState.Unknown) ? extState : getBundleState(bundle); populateFragementInfos(bundle); } private void populateFragementInfos(Bundle bundle) { this.isFragment = bundle.getHeaders().get(Constants.FRAGMENT_HOST) != null; this.fragments = new ArrayList<Bundle>(); this.fragmentHosts = new ArrayList<Bundle>(); BundleRevisions revisions = bundle.adapt(BundleRevisions.class); if (revisions == null) { return; } for (BundleRevision revision : revisions.getRevisions()) { if (revision.getWiring() != null) { getFragments(revision); getFragmentHosts(revision); } } } private String populateRevisions(Bundle bundle) { String ret = ""; BundleRevisions revisions = bundle.adapt(BundleRevisions.class); if (revisions == null) { return ret; } for (BundleRevision revision : revisions.getRevisions()) { ret = ret + "[" + revision + "]" + " "; } return ret; } private void getFragments(BundleRevision revision) { List<BundleWire> wires = revision.getWiring().getProvidedWires(BundleRevision.HOST_NAMESPACE); if (wires != null) { for (BundleWire w : wires) { Bundle b = w.getRequirerWiring().getBundle(); this.fragments.add(b); } } } private void getFragmentHosts(BundleRevision revision) { List<BundleWire> wires = revision.getWiring().getRequiredWires(BundleRevision.HOST_NAMESPACE); if (wires != null) { for (BundleWire w : wires) { Bundle b = w.getProviderWiring().getBundle(); if (b != null) { this.fragmentHosts.add(b); } } } } private BundleState getBundleState(Bundle bundle) { BundleState state = bundleStateMap.get(bundle.getState()); return state == null ? BundleState.Unknown : state; } @Override public long getBundleId() { return this.bundleId; } @Override public String getSymbolicName() { return this.symbolicName; } @Override public String getName() { return this.name; } @Override public String getUpdateLocation() { return this.updateLocation; } @Override public String getVersion() { return this.version; } @Override public BundleState getState() { return this.state; } @Override public int getStartLevel() { return this.startLevel; } @Override public boolean isFragment() { return this.isFragment; } @Override public List<Bundle> getFragments() { return this.fragments; } @Override public List<Bundle> getFragmentHosts() { return this.fragmentHosts; } @Override public String getRevisions() { return this.revisions; } }