/*
 * $Id: RequirementImpl.java 44 2007-07-13 20:49:41Z hargrave@us.ibm.com $
 * 
 * Copyright (c) OSGi Alliance (2002, 2006, 2007). All Rights Reserved.
 * 
 * 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.osgi.impl.bundle.obr.resource;

import org.osgi.service.obr.*;
import org.xmlpull.v1.XmlPullParser;

import aQute.bnd.annotation.ProviderType;



/**
 * Implements the Requirement interface.
 * 
 * 
 * @version $Revision: 44 $
 */
@ProviderType
public class RequirementImpl implements Requirement {
	int		id;
	String	name;
	String	filter="()";
	FilterImpl	_filter;
	String	comment;
	boolean optional;
	boolean multiple;
	boolean extend;
	
	/**
	 * Create a requirement with the given name.
	 * 
	 * @param name
	 */
	public RequirementImpl(String name) {
		this.name = name;
	}


	/**
	 * Parse the requirement from the pull parser.
	 * 
	 * @param parser
	 * @throws Exception
	 */
	public RequirementImpl(XmlPullParser parser) throws Exception {
		parser.require(XmlPullParser.START_TAG, null, null );
		name = parser.getAttributeValue(null, "name");
		filter = parser.getAttributeValue(null, "filter");
		
		String opt = parser.getAttributeValue(null,"optional");
		String mul = parser.getAttributeValue(null,"multiple");
		String ext = parser.getAttributeValue(null,"extend");
		optional = "true".equalsIgnoreCase(opt);
		multiple = "true".equalsIgnoreCase(mul);
		extend = "true".equalsIgnoreCase(ext);
		
		
		StringBuffer sb = new StringBuffer();
		while ( parser.next() == XmlPullParser.TEXT ) {
			sb.append( parser.getText() );
		}
		if ( sb.length() > 0 )
			setComment(sb.toString().trim());
			
		parser.require(XmlPullParser.END_TAG, null, null );
	}

	public void setFilter(String filter) {
		this.filter = filter;
		_filter= null;
	}

	public String getFilter() {
		return filter;
	}

	public Tag toXML(String name) {
		Tag tag = toXML(this);
		tag.rename(name);
		return tag;
	}


	public String getName() {
		return name;
	}

	public boolean isSatisfied(Capability capability) {
		if (_filter == null)
			_filter = new FilterImpl(filter);

		boolean result = _filter.match(capability.getProperties());
		return result;
	}

	@Override
    public String toString() {
		return name + " " + filter;
	}


	public String getComment() {
		return comment;
	}


	public void setComment(String comment) {
		this.comment=comment;
	}


	public static Tag toXML(Requirement requirement) {
		Tag req = new Tag("require");
		req.addAttribute("name", requirement.getName());
		req.addAttribute("filter", requirement.getFilter());
		
		req.addAttribute("optional", requirement.isOptional()+"");
		req.addAttribute("multiple", requirement.isMultiple()+"");
		req.addAttribute("extend", requirement.isExtend()+"");
		
		if ( requirement.getComment() != null )
			req.addContent(requirement.getComment());
		
		return req;
	}


	public boolean isMultiple() {
		return multiple;
	}


	public boolean isOptional() {
		return optional;
	}


	public void setOptional(boolean b) {
		optional = b;
	}

	public void setMultiple(boolean b) {
		multiple = b;
	}


	@Override
    public boolean equals(Object o) {
		if ( ! (o instanceof Requirement) )
			return false;
		
		Requirement r2 = (Requirement)o;
		return filter.equals(r2.getFilter()) && name.equals(r2.getName()); 
	}
	
	@Override
    public int hashCode() {
		return filter.hashCode() ^ name.hashCode();
	}
	
	public boolean isExtend() {
		return extend;
	}
	
	public void setExtend(boolean extend) {
		this.extend = extend;
	}
}
