blob: 831af648b50ff2730e8d7a269fb65ad3d74ba26a [file] [log] [blame]
/*
* Copyright 2005 The Apache Software Foundation
*
* 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.osgi.framework;
import java.security.AccessController;
import java.util.ArrayList;
import java.util.List;
import org.osgi.framework.AdminPermission;
import org.osgi.framework.Bundle;
import org.osgi.service.startlevel.StartLevel;
/**
* @author rickhall
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
**/
public class StartLevelImpl implements StartLevel, Runnable
{
private Felix m_felix = null;
private List m_requestList = null;
// Reusable admin permission.
private static AdminPermission m_adminPerm = new AdminPermission();
public StartLevelImpl(Felix felix)
{
m_felix = felix;
m_requestList = new ArrayList();
// Start a thread to perform asynchronous package refreshes.
Thread t = new Thread(this, "FelixStartLevel");
t.setDaemon(true);
t.start();
}
/* (non-Javadoc)
* @see org.osgi.service.startlevel.StartLevel#getStartLevel()
**/
public int getStartLevel()
{
return m_felix.getStartLevel();
}
/* (non-Javadoc)
* @see org.osgi.service.startlevel.StartLevel#setStartLevel(int)
**/
public void setStartLevel(int startlevel)
{
if (System.getSecurityManager() != null)
{
AccessController.checkPermission(m_adminPerm);
}
else if (startlevel <= 0)
{
throw new IllegalArgumentException(
"Start level must be greater than zero.");
}
synchronized (m_requestList)
{
m_requestList.add(new Integer(startlevel));
m_requestList.notifyAll();
}
}
/* (non-Javadoc)
* @see org.osgi.service.startlevel.StartLevel#getBundleStartLevel(org.osgi.framework.Bundle)
**/
public int getBundleStartLevel(Bundle bundle)
{
return m_felix.getBundleStartLevel(bundle);
}
/* (non-Javadoc)
* @see org.osgi.service.startlevel.StartLevel#setBundleStartLevel(org.osgi.framework.Bundle, int)
**/
public void setBundleStartLevel(Bundle bundle, int startlevel)
{
m_felix.setBundleStartLevel(bundle, startlevel);
}
/* (non-Javadoc)
* @see org.osgi.service.startlevel.StartLevel#getInitialBundleStartLevel()
**/
public int getInitialBundleStartLevel()
{
return m_felix.getInitialBundleStartLevel();
}
/* (non-Javadoc)
* @see org.osgi.service.startlevel.StartLevel#setInitialBundleStartLevel(int)
**/
public void setInitialBundleStartLevel(int startlevel)
{
m_felix.setInitialBundleStartLevel(startlevel);
}
/* (non-Javadoc)
* @see org.osgi.service.startlevel.StartLevel#isBundlePersistentlyStarted(org.osgi.framework.Bundle)
**/
public boolean isBundlePersistentlyStarted(Bundle bundle)
{
return m_felix.isBundlePersistentlyStarted(bundle);
}
public void run()
{
int startLevel = 0;
// This thread loops forever, thus it should
// be a daemon thread.
while (true)
{
synchronized (m_requestList)
{
// Wait for a request.
while (m_requestList.size() == 0)
{
try {
m_requestList.wait();
} catch (InterruptedException ex) {
}
}
// Get the requested start level.
startLevel = ((Integer) m_requestList.remove(0)).intValue();
}
// Set the new start level.
m_felix.setFrameworkStartLevel(startLevel);
}
}
}