package aQute.bnd.osgi;

import java.lang.annotation.*;
import java.util.*;

import aQute.bnd.annotation.metatype.*;
import aQute.bnd.osgi.Descriptors.TypeRef;

public class Annotation {
	TypeRef				name;
	Map<String,Object>	elements;
	ElementType			member;
	RetentionPolicy		policy;

	public Annotation(TypeRef name, Map<String,Object> elements, ElementType member, RetentionPolicy policy) {
		this.name = name;
		if (elements == null)
			this.elements = Collections.emptyMap();
		else
			this.elements = elements;
		this.member = member;
		this.policy = policy;
	}

	public TypeRef getName() {
		return name;
	}

	public ElementType getElementType() {
		return member;
	}

	public RetentionPolicy getRetentionPolicy() {
		return policy;
	}

	@Override
	public String toString() {
		return name + ":" + member + ":" + policy + ":" + elements;
	}

	public <T> T get(String string) {
		if (elements == null)
			return null;

		return (T) elements.get(string);
	}

	public <T> void put(String string, Object v) {
		if (elements == null)
			return;

		elements.put(string, v);
	}

	public Set<String> keySet() {
		if (elements == null)
			return Collections.emptySet();

		return elements.keySet();
	}

	public <T extends java.lang.annotation.Annotation> T getAnnotation() throws Exception {
		String cname = name.getFQN();
		try {
			Class<T> c = (Class<T>) getClass().getClassLoader().loadClass(cname);
			return getAnnotation(c);
		}
		catch (ClassNotFoundException e) {
		}
		catch (NoClassDefFoundError e) {
		}
		return null;
	}

	public <T extends java.lang.annotation.Annotation> T getAnnotation(Class<T> c) throws Exception {
		String cname = name.getFQN();
		if (!c.getName().equals(cname))
			return null;
		return Configurable.createConfigurable(c, elements);
	}
}
