blob: 38a774c6391ad4b9f548ac4e3e8c0f45fcb294bc [file] [log] [blame]
/*
* 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.management.mbeans.obr.internal;
import org.apache.felix.bundlerepository.*;
import org.apache.karaf.management.mbeans.obr.ObrMBean;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.Version;
import javax.management.NotCompliantMBeanException;
import javax.management.StandardMBean;
import javax.management.openmbean.*;
import java.util.ArrayList;
import java.util.List;
/**
* Implementation of the OBR MBean.
*/
public class ObrMBeanImpl extends StandardMBean implements ObrMBean {
private static final char VERSION_DELIM = ',';
private BundleContext bundleContext;
private RepositoryAdmin repositoryAdmin;
public ObrMBeanImpl() throws NotCompliantMBeanException {
super(ObrMBean.class);
}
public List<String> listUrls() throws Exception {
Repository[] repositories = repositoryAdmin.listRepositories();
List<String> urls = new ArrayList<String>();
for (int i = 0; i < repositories.length; i++) {
urls.add(repositories[i].getURI());
}
return urls;
}
public void addUrl(String url) throws Exception {
repositoryAdmin.addRepository(url);
}
public void removeUrl(String url) throws Exception {
repositoryAdmin.removeRepository(url);
}
public void refreshUrl(String url) throws Exception {
repositoryAdmin.addRepository(url);
}
public TabularData list() throws Exception {
CompositeType bundleType = new CompositeType("OBR Resource", "Bundle available in the OBR",
new String[]{"presentationname", "symbolicname", "version"},
new String[]{"Presentation Name", "Symbolic Name", "Version"},
new OpenType[]{SimpleType.STRING, SimpleType.STRING, SimpleType.STRING});
TabularType tableType = new TabularType("OBR Resources", "Table of all resources/bundles available in the OBR",
bundleType, new String[]{"presentationname"});
TabularData table = new TabularDataSupport(tableType);
Resource[] resources = repositoryAdmin.discoverResources("(|(presentationname=*)(symbolicname=*))");
for (int i = 0; i < resources.length; i++) {
try {
CompositeData data = new CompositeDataSupport(bundleType,
new String[]{"presentationname", "symbolicname", "version"},
new Object[]{resources[i].getPresentationName(), resources[i].getSymbolicName(), resources[i].getVersion()});
table.put(data);
} catch (Exception e) {
e.printStackTrace();
}
}
return table;
}
public void deploy(String bundle) throws Exception {
deploy(bundle, false);
}
public void deploy(String bundle, boolean start) throws Exception {
Resolver resolver = repositoryAdmin.resolver();
String[] target = getTarget(bundle);
Resource resource = selectNewestVersion(searchRepository(repositoryAdmin, target[0], target[1]));
if (resource == null) {
throw new IllegalArgumentException("Unknown bundle " + target[0]);
}
resolver.add(resource);
if ((resolver.getAddedResources() != null) &&
(resolver.getAddedResources().length > 0)) {
}
if (resolver.resolve()) {
Resource[] resources = resolver.getAddedResources();
resources = resolver.getRequiredResources();
resources = resolver.getOptionalResources();
try {
resolver.deploy(start ? Resolver.START : 0);
} catch (IllegalStateException ex) {
throw new IllegalStateException("Can't deploy using OBR", ex);
}
}
}
private Resource[] searchRepository(RepositoryAdmin admin, String targetId, String targetVersion) throws InvalidSyntaxException {
// Try to see if the targetId is a bundle ID.
try {
Bundle bundle = getBundleContext().getBundle(Long.parseLong(targetId));
targetId = bundle.getSymbolicName();
} catch (NumberFormatException ex) {
// It was not a number, so ignore.
}
// The targetId may be a bundle name or a bundle symbolic name,
// so create the appropriate LDAP query.
StringBuffer sb = new StringBuffer("(|(presentationname=");
sb.append(targetId);
sb.append(")(symbolicname=");
sb.append(targetId);
sb.append("))");
if (targetVersion != null) {
sb.insert(0, "(&");
sb.append("(version=");
sb.append(targetVersion);
sb.append("))");
}
return admin.discoverResources(sb.toString());
}
private Resource selectNewestVersion(Resource[] resources) {
int idx = -1;
Version v = null;
for (int i = 0; (resources != null) && (i < resources.length); i++) {
if (i == 0) {
idx = 0;
v = resources[i].getVersion();
} else {
Version vtmp = resources[i].getVersion();
if (vtmp.compareTo(v) > 0) {
idx = i;
v = vtmp;
}
}
}
return (idx < 0) ? null : resources[idx];
}
private String[] getTarget(String bundle) {
String[] target;
int idx = bundle.indexOf(VERSION_DELIM);
if (idx > 0) {
target = new String[]{bundle.substring(0, idx), bundle.substring(idx + 1)};
} else {
target = new String[]{bundle, null};
}
return target;
}
public BundleContext getBundleContext() {
return this.bundleContext;
}
public void setBundleContext(BundleContext bundleContext) {
this.bundleContext = bundleContext;
}
public RepositoryAdmin getRepositoryAdmin() {
return this.repositoryAdmin;
}
public void setRepositoryAdmin(RepositoryAdmin repositoryAdmin) {
this.repositoryAdmin = repositoryAdmin;
}
}