Browse Source

extract DelegatedResourceComparator from Sort collection

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@454829 13f79535-47bb-0310-9956-ffa450edef68
master
Matthew Jason Benson 18 years ago
parent
commit
4baba959d2
2 changed files with 111 additions and 33 deletions
  1. +3
    -33
      src/main/org/apache/tools/ant/types/resources/Sort.java
  2. +108
    -0
      src/main/org/apache/tools/ant/types/resources/comparators/DelegatedResourceComparator.java

+ 3
- 33
src/main/org/apache/tools/ant/types/resources/Sort.java View File

@@ -32,6 +32,7 @@ import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.types.DataType;
import org.apache.tools.ant.types.ResourceCollection;
import org.apache.tools.ant.types.resources.comparators.ResourceComparator;
import org.apache.tools.ant.types.resources.comparators.DelegatedResourceComparator;

/**
* ResourceCollection that sorts another ResourceCollection.
@@ -39,29 +40,6 @@ import org.apache.tools.ant.types.resources.comparators.ResourceComparator;
*/
public class Sort extends BaseResourceCollectionWrapper {

private static class MultiComparator implements Comparator {
private Vector v = null;
synchronized void add(ResourceComparator c) {
if (c == null) {
return;
}
v = (v == null) ? new Vector() : v;
v.add(c);
}
public synchronized int compare(Object o1, Object o2) {
int result = 0;
//if no nested, natural order:
if (v == null || v.size() == 0) {
result = ((Comparable) o1).compareTo((Comparable) o2);
} else {
for (Iterator i = v.iterator(); result == 0 && i.hasNext();) {
result = ((Comparator) i.next()).compare(o1, o2);
}
}
return result;
}
}

//sorted bag impl. borrowed from commons-collections TreeBag:
private static class SortedBag extends AbstractCollection {
private class MutableInt {
@@ -115,7 +93,7 @@ public class Sort extends BaseResourceCollectionWrapper {
}
}

private MultiComparator comp = new MultiComparator();
private DelegatedResourceComparator comp = new DelegatedResourceComparator();

/**
* Sort the contained elements.
@@ -162,15 +140,7 @@ public class Sort extends BaseResourceCollectionWrapper {
if (isReference()) {
super.dieOnCircularReference(stk, p);
} else {
if (comp.v != null && comp.v.size() > 0) {
for (Iterator i = comp.v.iterator(); i.hasNext();) {
Object o = i.next();
if (o instanceof DataType) {
stk.push(o);
invokeCircularReferenceCheck((DataType) o, stk, p);
}
}
}
DataType.invokeCircularReferenceCheck(comp, stk, p);
setChecked(true);
}
}


+ 108
- 0
src/main/org/apache/tools/ant/types/resources/comparators/DelegatedResourceComparator.java View File

@@ -0,0 +1,108 @@
/*
* 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.tools.ant.types.resources.comparators;

import java.util.Stack;
import java.util.Vector;
import java.util.Iterator;

import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.DataType;
import org.apache.tools.ant.types.Resource;
import org.apache.tools.ant.types.ResourceCollection;
import org.apache.tools.ant.types.resources.comparators.ResourceComparator;

/**
* Delegates to other ResourceComparators or, if none specified,
* uses Resources' natural ordering.
* @since Ant 1.7
*/
public class DelegatedResourceComparator extends ResourceComparator {

private Vector v = null;

/**
* Add a delegate ResourceComparator.
* @param c the next delegate ResourceComparator.
*/
public synchronized void add(ResourceComparator c) {
if (isReference()) {
throw noChildrenAllowed();
}
if (c == null) {
return;
}
v = (v == null) ? new Vector() : v;
v.add(c);
}

//inherit doc
public synchronized boolean equals(Object o) {
if (o == this) {
return true;
}
if (isReference()) {
return getCheckedRef().equals(o);
}
if (!(o instanceof DelegatedResourceComparator)) {
return false;
}
Vector ov = ((DelegatedResourceComparator) o).v;
return v == null ? ov == null : v.equals(ov);
}

//inherit doc
protected synchronized int resourceCompare(Resource foo, Resource bar) {
//if no nested, natural order:
if (v == null || v.isEmpty()) {
return foo.compareTo(bar);
}
int result = 0;
for (Iterator i = v.iterator(); result == 0 && i.hasNext();) {
result = ((ResourceComparator) i.next()).resourceCompare(foo, bar);
}
return result;
}

/**
* Overrides the version from DataType to recurse on nested ResourceSelector
s.
* @param stk the Stack of references.
* @param p the Project to resolve against.
* @throws BuildException on error.
*/
protected void dieOnCircularReference(Stack stk, Project p) {
if (isChecked()) {
return;
}
if (isReference()) {
super.dieOnCircularReference(stk, p);
} else {
if (!(v == null || v.isEmpty())) {
for (Iterator i = v.iterator(); i.hasNext();) {
Object o = i.next();
if (o instanceof DataType) {
stk.push(o);
invokeCircularReferenceCheck((DataType) o, stk, p);
}
}
}
setChecked(true);
}
}
}

Loading…
Cancel
Save