/*
* 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.stanbol.rules.base.api.util;
import java.util.Collection;
import java.util.Iterator;
import org.apache.stanbol.rules.base.api.Rule;
public class RuleList implements Collection<Rule> {
private Rule[] rules;
public RuleList() {
}
public boolean add(Rule semionRule) {
if (rules == null) {
rules = new Rule[1];
rules[0] = semionRule;
} else {
Rule[] semionRulesCopy = new Rule[rules.length + 1];
System.arraycopy(rules, 0, semionRulesCopy, 0, rules.length);
semionRulesCopy[semionRulesCopy.length - 1] = semionRule;
rules = semionRulesCopy;
}
return true;
}
public boolean addToHead(Rule semionRule) {
if (rules == null) {
rules = new Rule[1];
rules[0] = semionRule;
} else {
Rule[] semionRulesCopy = new Rule[rules.length + 1];
System.arraycopy(rules, 0, semionRulesCopy, 1, rules.length);
semionRulesCopy[0] = semionRule;
rules = semionRulesCopy;
}
return true;
}
public boolean addAll(Collection<? extends Rule> c) {
Rule[] collectionOfSemionRules = new Rule[c.size()];
collectionOfSemionRules = c.toArray(collectionOfSemionRules);
if (rules == null) {
rules = collectionOfSemionRules;
} else {
Rule[] semionRulesCopy = new Rule[rules.length + collectionOfSemionRules.length];
System.arraycopy(rules, 0, semionRulesCopy, 0, rules.length);
System.arraycopy(collectionOfSemionRules, 0, semionRulesCopy, rules.length,
collectionOfSemionRules.length);
rules = semionRulesCopy;
}
return true;
}
/**
* To clear the collection
*/
public void clear() {
this.rules = null;
}
public boolean contains(Object o) {
for (Rule semionRule : rules) {
if (semionRule.equals(o)) {
return true;
}
}
return false;
}
public boolean containsAll(Collection<?> c) {
for (Object o : c) {
for (Rule semionRule : rules) {
if (!semionRule.equals(o)) {
return false;
} else {
break;
}
}
}
return true;
}
public boolean isEmpty() {
if (rules == null || (rules.length == 1 && rules[0] == null)) {
return true;
} else {
return false;
}
}
public Iterator<Rule> iterator() {
return new RuleIterator(this);
}
public boolean remove(Object o) {
boolean removed = false;
for (int i = 0; i < rules.length && !removed; i++) {
Rule semionRule = rules[i];
if (semionRule.equals(o)) {
Rule[] semionRulesCopy = new Rule[rules.length - 1];
System.arraycopy(rules, 0, semionRulesCopy, 0, i);
System.arraycopy(rules, i + 1, semionRulesCopy, 0, semionRulesCopy.length - i);
rules = semionRulesCopy;
removed = true;
}
}
return removed;
}
public boolean removeAll(Collection<?> c) {
if (contains(c)) {
for (Object o : c) {
boolean removed = false;
for (int i = 0; i < rules.length && !removed; i++) {
Rule semionRule = rules[i];
if (semionRule.equals(o)) {
Rule[] semionRulesCopy = new Rule[rules.length - 1];
System.arraycopy(rules, 0, semionRulesCopy, 0, i);
System.arraycopy(rules, i + 1, semionRulesCopy, 0, semionRulesCopy.length - i);
rules = semionRulesCopy;
removed = true;
}
}
}
return true;
} else {
return false;
}
}
public boolean retainAll(Collection<?> c) {
Rule[] semionRulesCopy = null;
Rule[] semionRulesTMP = null;
for (Object o : c) {
if (o instanceof Rule) {
if (contains(o)) {
if (semionRulesCopy == null) {
semionRulesCopy = new Rule[1];
semionRulesCopy[0] = (Rule) o;
} else {
semionRulesTMP = new Rule[semionRulesCopy.length + 1];
System.arraycopy(semionRulesCopy, 0, semionRulesTMP, 0, semionRulesCopy.length);
semionRulesTMP[semionRulesTMP.length - 1] = (Rule) o;
semionRulesCopy = semionRulesTMP;
}
}
}
}
rules = semionRulesCopy;
return true;
}
public int size() {
if (rules == null) {
return 0;
} else {
return rules.length;
}
}
public Object[] toArray() {
return rules;
}
@SuppressWarnings("unchecked")
public <T> T[] toArray(T[] a) {
return (T[]) rules;
}
}