package org.foo.condition.ask;
import java.util.*;
import java.security.*;
import org.osgi.framework.*;
import org.osgi.service.condpermadmin.*;
public class AskUserCondition implements Condition {
private final Bundle m_bundle;
private final String m_question;
private final boolean m_not;
private boolean m_result = false;
private boolean m_alreadyAsked = false;
public AskUserCondition(Bundle bundle, ConditionInfo info) {
m_bundle = bundle;
m_question = info.getArgs()[0].replace(
"$symbolic-name", bundle.getSymbolicName());
m_not = (info.getArgs().length == 2 && "!".equals(info.getArgs()[1]));
}
public static Condition getCondition(Bundle bundle, ConditionInfo info) {
return new AskUserCondition(bundle, info);
}
public boolean isMutable() {
return false;
}
public boolean isPostponed() {
return true;
}
public boolean isSatisfied() {
return false;
}
public synchronized boolean isSatisfied(Condition[] conditions, Dictionary context) {
if (m_alreadyAsked) {
return m_result;
}
Boolean result = ((Boolean) AccessController.doPrivileged(
new PrivilegedAction() {
public Object run() {
AskTheUser question = new AskTheUser(m_question);
try {
return question.ask() ? Boolean.TRUE : Boolean.FALSE;
} catch (Exception e) {
return Boolean.FALSE;
}
}
}));
m_alreadyAsked = true;
if (m_not) {
return (m_result = !result.booleanValue());
}
else {
return (m_result = result.booleanValue());
}
}
}