001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: */
018: package org.apache.tools.ant.taskdefs.optional.extension;
019:
020: import java.util.ArrayList;
021: import java.util.Arrays;
022: import org.apache.tools.ant.BuildException;
023: import org.apache.tools.ant.Project;
024: import org.apache.tools.ant.types.DataType;
025: import org.apache.tools.ant.types.FileSet;
026: import org.apache.tools.ant.types.Reference;
027:
028: /**
029: * The Extension set lists a set of "Optional Packages" /
030: * "Extensions".
031: *
032: * @ant.datatype name="extension-set"
033: */
034: public class ExtensionSet extends DataType {
035: /**
036: * ExtensionAdapter objects representing extensions.
037: */
038: private final ArrayList extensions = new ArrayList();
039:
040: /**
041: * Filesets specifying all the extensions wanted.
042: */
043: private final ArrayList extensionsFilesets = new ArrayList();
044:
045: /**
046: * Adds an extension that this library requires.
047: *
048: * @param extensionAdapter an extension that this library requires.
049: */
050: public void addExtension(final ExtensionAdapter extensionAdapter) {
051: extensions.add(extensionAdapter);
052: }
053:
054: /**
055: * Adds a set of files about which extensions data will be extracted.
056: *
057: * @param fileSet a set of files about which extensions data will be extracted.
058: */
059: public void addLibfileset(final LibFileSet fileSet) {
060: extensionsFilesets.add(fileSet);
061: }
062:
063: /**
064: * Adds a set of files about which extensions data will be extracted.
065: *
066: * @param fileSet a set of files about which extensions data will be extracted.
067: */
068: public void addFileset(final FileSet fileSet) {
069: extensionsFilesets.add(fileSet);
070: }
071:
072: /**
073: * Extract a set of Extension objects from the ExtensionSet.
074: *
075: * @param proj the project instance.
076: * @return an array containing the Extensions from this set
077: * @throws BuildException if an error occurs
078: */
079: public Extension[] toExtensions(final Project proj)
080: throws BuildException {
081: final ArrayList extensionsList = ExtensionUtil
082: .toExtensions(extensions);
083: ExtensionUtil.extractExtensions(proj, extensionsList,
084: extensionsFilesets);
085: return (Extension[]) extensionsList
086: .toArray(new Extension[extensionsList.size()]);
087: }
088:
089: /**
090: * Makes this instance in effect a reference to another ExtensionSet
091: * instance.
092: *
093: * <p>You must not set another attribute or nest elements inside
094: * this element if you make it a reference.</p>
095: *
096: * @param reference the reference to which this instance is associated
097: * @exception BuildException if this instance already has been configured.
098: */
099: public void setRefid(final Reference reference)
100: throws BuildException {
101: if (!extensions.isEmpty() || !extensionsFilesets.isEmpty()) {
102: throw tooManyAttributes();
103: }
104: // change this to get the objects from the other reference
105: final Object object = reference
106: .getReferencedObject(getProject());
107: if (object instanceof ExtensionSet) {
108: final ExtensionSet other = (ExtensionSet) object;
109: extensions.addAll(other.extensions);
110: extensionsFilesets.addAll(other.extensionsFilesets);
111: } else {
112: final String message = reference.getRefId()
113: + " doesn\'t refer to a ExtensionSet";
114: throw new BuildException(message);
115: }
116:
117: super .setRefid(reference);
118: }
119:
120: /**
121: * @see java.lang.Object#toString()
122: * @return the extensions in a string.
123: */
124: public String toString() {
125: return "ExtensionSet"
126: + Arrays.asList(toExtensions(getProject()));
127: }
128: }
|