git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@450207 13f79535-47bb-0310-9956-ffa450edef68master
@@ -1,62 +1,62 @@ | |||||
/* | |||||
* 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.spi; | |||||
import org.apache.tools.ant.ProjectComponent; | |||||
import org.apache.tools.ant.BuildException; | |||||
/** | |||||
* ANT Jar-Task SPI extension | |||||
* This class corresponds to the nested element | |||||
* <provider type="type"> in the <service type=""> | |||||
* nested element of the jar task. | |||||
* @see http://issues.apache.org/bugzilla/show_bug.cgi?id=31520 | |||||
*/ | |||||
public class Provider extends ProjectComponent { | |||||
private String type; | |||||
/** | |||||
* @return the class name for | |||||
*/ | |||||
public String getClassName(){ | |||||
return type; | |||||
} | |||||
/** | |||||
* Set the provider classname. | |||||
* @param type the value to set. | |||||
*/ | |||||
public void setClassName(String type){ | |||||
this.type = type; | |||||
} | |||||
/** | |||||
* Check if the component has been configured correctly. | |||||
*/ | |||||
public void check() { | |||||
if (type == null) { | |||||
throw new BuildException( | |||||
"classname attribute must be set for provider element", | |||||
getLocation()); | |||||
} | |||||
if (type.length() == 0) { | |||||
throw new BuildException( | |||||
"Invalid empty classname", getLocation()); | |||||
} | |||||
} | |||||
} | |||||
/* | |||||
* 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.spi; | |||||
import org.apache.tools.ant.ProjectComponent; | |||||
import org.apache.tools.ant.BuildException; | |||||
/** | |||||
* ANT Jar-Task SPI extension | |||||
* This class corresponds to the nested element | |||||
* <provider type="type"> in the <service type=""> | |||||
* nested element of the jar task. | |||||
* @see http://issues.apache.org/bugzilla/show_bug.cgi?id=31520 | |||||
*/ | |||||
public class Provider extends ProjectComponent { | |||||
private String type; | |||||
/** | |||||
* @return the class name for | |||||
*/ | |||||
public String getClassName(){ | |||||
return type; | |||||
} | |||||
/** | |||||
* Set the provider classname. | |||||
* @param type the value to set. | |||||
*/ | |||||
public void setClassName(String type){ | |||||
this.type = type; | |||||
} | |||||
/** | |||||
* Check if the component has been configured correctly. | |||||
*/ | |||||
public void check() { | |||||
if (type == null) { | |||||
throw new BuildException( | |||||
"classname attribute must be set for provider element", | |||||
getLocation()); | |||||
} | |||||
if (type.length() == 0) { | |||||
throw new BuildException( | |||||
"Invalid empty classname", getLocation()); | |||||
} | |||||
} | |||||
} |
@@ -1,122 +1,122 @@ | |||||
/* | |||||
* 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.spi; | |||||
import java.io.ByteArrayInputStream; | |||||
import java.io.ByteArrayOutputStream; | |||||
import java.io.IOException; | |||||
import java.io.InputStream; | |||||
import java.io.OutputStreamWriter; | |||||
import java.io.Writer; | |||||
import java.util.ArrayList; | |||||
import java.util.Iterator; | |||||
import java.util.List; | |||||
import org.apache.tools.ant.ProjectComponent; | |||||
import org.apache.tools.ant.BuildException; | |||||
/** | |||||
* ANT Jar-Task SPI extension | |||||
* | |||||
* @see http://issues.apache.org/bugzilla/show_bug.cgi?id=31520 | |||||
*/ | |||||
public class Service extends ProjectComponent { | |||||
private List providerList = new ArrayList(); | |||||
private String type; | |||||
/** | |||||
* Set the provider classname. | |||||
* @param className the classname of a provider of this service. | |||||
*/ | |||||
public void setProvider(String className) { | |||||
Provider provider = new Provider(); | |||||
provider.setClassName(className); | |||||
providerList.add(provider); | |||||
} | |||||
/** | |||||
* Add a nested provider element. | |||||
* @param provider a provider element. | |||||
*/ | |||||
public void addConfiguredProvider(Provider provider) { | |||||
provider.check(); | |||||
providerList.add(provider); | |||||
} | |||||
/** | |||||
* @return the service type. | |||||
*/ | |||||
public String getType(){ | |||||
return type; | |||||
} | |||||
/** | |||||
* Set the service type. | |||||
* @param type the service type, a classname of | |||||
* an interface or a class (normally | |||||
* abstract). | |||||
*/ | |||||
public void setType(String type){ | |||||
this.type = type; | |||||
} | |||||
/** | |||||
* Return the implementations of this | |||||
* services as an inputstream. | |||||
* @return an inputstream of the classname names | |||||
* encoded as UTF-8. | |||||
*/ | |||||
public InputStream getAsStream() throws IOException { | |||||
ByteArrayOutputStream arrayOut; | |||||
Writer writer; | |||||
Iterator providerIterator; | |||||
Provider provider; | |||||
arrayOut = new ByteArrayOutputStream(); | |||||
writer = new OutputStreamWriter(arrayOut, "UTF-8"); | |||||
providerIterator = providerList.iterator(); | |||||
while (providerIterator.hasNext()){ | |||||
provider = (Provider) providerIterator.next(); | |||||
writer.write(provider.getClassName()); | |||||
writer.write("\n"); | |||||
} | |||||
writer.close(); | |||||
return new ByteArrayInputStream(arrayOut.toByteArray()); | |||||
} | |||||
/** | |||||
* Check if this object is configured correctly as a nested | |||||
* element. | |||||
*/ | |||||
public void check() { | |||||
if (type == null) { | |||||
throw new BuildException( | |||||
"type attribute must be set for service element", | |||||
getLocation()); | |||||
} | |||||
if (type.length() == 0) { | |||||
throw new BuildException( | |||||
"Invalid empty type classname", getLocation()); | |||||
} | |||||
if (providerList.size() == 0) { | |||||
throw new BuildException( | |||||
"provider attribute or nested provider element must be set!", | |||||
getLocation()); | |||||
} | |||||
} | |||||
} | |||||
/* | |||||
* 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.spi; | |||||
import java.io.ByteArrayInputStream; | |||||
import java.io.ByteArrayOutputStream; | |||||
import java.io.IOException; | |||||
import java.io.InputStream; | |||||
import java.io.OutputStreamWriter; | |||||
import java.io.Writer; | |||||
import java.util.ArrayList; | |||||
import java.util.Iterator; | |||||
import java.util.List; | |||||
import org.apache.tools.ant.ProjectComponent; | |||||
import org.apache.tools.ant.BuildException; | |||||
/** | |||||
* ANT Jar-Task SPI extension | |||||
* | |||||
* @see http://issues.apache.org/bugzilla/show_bug.cgi?id=31520 | |||||
*/ | |||||
public class Service extends ProjectComponent { | |||||
private List providerList = new ArrayList(); | |||||
private String type; | |||||
/** | |||||
* Set the provider classname. | |||||
* @param className the classname of a provider of this service. | |||||
*/ | |||||
public void setProvider(String className) { | |||||
Provider provider = new Provider(); | |||||
provider.setClassName(className); | |||||
providerList.add(provider); | |||||
} | |||||
/** | |||||
* Add a nested provider element. | |||||
* @param provider a provider element. | |||||
*/ | |||||
public void addConfiguredProvider(Provider provider) { | |||||
provider.check(); | |||||
providerList.add(provider); | |||||
} | |||||
/** | |||||
* @return the service type. | |||||
*/ | |||||
public String getType(){ | |||||
return type; | |||||
} | |||||
/** | |||||
* Set the service type. | |||||
* @param type the service type, a classname of | |||||
* an interface or a class (normally | |||||
* abstract). | |||||
*/ | |||||
public void setType(String type){ | |||||
this.type = type; | |||||
} | |||||
/** | |||||
* Return the implementations of this | |||||
* services as an inputstream. | |||||
* @return an inputstream of the classname names | |||||
* encoded as UTF-8. | |||||
*/ | |||||
public InputStream getAsStream() throws IOException { | |||||
ByteArrayOutputStream arrayOut; | |||||
Writer writer; | |||||
Iterator providerIterator; | |||||
Provider provider; | |||||
arrayOut = new ByteArrayOutputStream(); | |||||
writer = new OutputStreamWriter(arrayOut, "UTF-8"); | |||||
providerIterator = providerList.iterator(); | |||||
while (providerIterator.hasNext()){ | |||||
provider = (Provider) providerIterator.next(); | |||||
writer.write(provider.getClassName()); | |||||
writer.write("\n"); | |||||
} | |||||
writer.close(); | |||||
return new ByteArrayInputStream(arrayOut.toByteArray()); | |||||
} | |||||
/** | |||||
* Check if this object is configured correctly as a nested | |||||
* element. | |||||
*/ | |||||
public void check() { | |||||
if (type == null) { | |||||
throw new BuildException( | |||||
"type attribute must be set for service element", | |||||
getLocation()); | |||||
} | |||||
if (type.length() == 0) { | |||||
throw new BuildException( | |||||
"Invalid empty type classname", getLocation()); | |||||
} | |||||
if (providerList.size() == 0) { | |||||
throw new BuildException( | |||||
"provider attribute or nested provider element must be set!", | |||||
getLocation()); | |||||
} | |||||
} | |||||
} |
@@ -1,124 +1,124 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<project xmlns:au="antlib:org.apache.ant.antunit"> | |||||
<property name="jar.dir" location="jar_spi_dir"/> | |||||
<property name="jar.src.dir" location="jar_spi_dir/src"/> | |||||
<property name="jar.src.file" location="jar_spi_dir/src/a_file"/> | |||||
<target name="init"> | |||||
<mkdir dir="${jar.src.dir}"/> | |||||
<delete quiet="yes" file="${jar.src.file}"/> | |||||
<touch file="${jar.src.file}"/> | |||||
<delete quiet="yes" file="${jar.dir}/file.jar"/> | |||||
<delete quiet="yes" dir="${jar.dir}/output"/> | |||||
</target> | |||||
<target name="test-simple" depends="init"> | |||||
<jar jarfile="${jar.dir}/file.jar"> | |||||
<fileset dir="${jar.src.dir}"/> | |||||
<service type="a.b.c" provider="a.b.c.d"/> | |||||
</jar> | |||||
<unjar src="${jar.dir}/file.jar" | |||||
dest="${jar.dir}/output"/> | |||||
<loadfile property="simple" | |||||
srcfile="${jar.dir}/output/META-INF/service/a.b.c" | |||||
encoding="UTF-8"/> | |||||
<au:assertTrue> | |||||
<matches string="${simple}" pattern="^a\.b\.c\.d\n$"/> | |||||
</au:assertTrue> | |||||
</target> | |||||
<target name="test-providers" depends="init"> | |||||
<jar jarfile="${jar.dir}/file.jar"> | |||||
<fileset dir="${jar.src.dir}"/> | |||||
<service type="a.b.c"> | |||||
<provider classname="a.X"/> | |||||
<provider classname="a.D"/> | |||||
</service> | |||||
</jar> | |||||
<unjar src="${jar.dir}/file.jar" | |||||
dest="${jar.dir}/output"/> | |||||
<loadfile property="providers" | |||||
srcfile="${jar.dir}/output/META-INF/service/a.b.c" | |||||
encoding="UTF-8"/> | |||||
<au:assertTrue> | |||||
<matches string="${providers}" pattern="^a\.X\na\.D$"/> | |||||
</au:assertTrue> | |||||
</target> | |||||
<target name="test-multi" depends="init"> | |||||
<jar jarfile="${jar.dir}/file.jar"> | |||||
<fileset dir="${jar.src.dir}"/> | |||||
<service type="a.b.c"> | |||||
<provider classname="a.X"/> | |||||
<provider classname="a.D"/> | |||||
</service> | |||||
<service type="javax.a.service"> | |||||
<provider classname="a.O.T"/> | |||||
<provider classname="a.B"/> | |||||
</service> | |||||
</jar> | |||||
<unjar src="${jar.dir}/file.jar" | |||||
dest="${jar.dir}/output"/> | |||||
<loadfile property="multi-a" | |||||
srcfile="${jar.dir}/output/META-INF/service/a.b.c" | |||||
encoding="UTF-8"/> | |||||
<au:assertTrue> | |||||
<matches string="${multi-a}" pattern="^a\.X\na\.D$"/> | |||||
</au:assertTrue> | |||||
<loadfile property="multi-b" | |||||
srcfile="${jar.dir}/output/META-INF/service/javax.a.service" | |||||
encoding="UTF-8"/> | |||||
<au:assertTrue> | |||||
<matches string="${multi-b}" pattern="^a\.O\.T\na\.B$"/> | |||||
</au:assertTrue> | |||||
</target> | |||||
<target name="test-reject-no-type" depends="init"> | |||||
<au:expectfailure> | |||||
<jar jarfile="${jar.dir}/file.jar"> | |||||
<fileset dir="${jar.src.dir}"/> | |||||
<service provider="a.X"/> | |||||
</jar> | |||||
</au:expectfailure> | |||||
</target> | |||||
<target name="test-reject-no-provider" depends="init"> | |||||
<au:expectfailure> | |||||
<jar jarfile="${jar.dir}/file.jar"> | |||||
<fileset dir="${jar.src.dir}"/> | |||||
<service type="a.X"/> | |||||
</jar> | |||||
</au:expectfailure> | |||||
</target> | |||||
<target name="test-reject-no-classname" depends="init"> | |||||
<au:expectfailure> | |||||
<jar jarfile="${jar.dir}/file.jar"> | |||||
<fileset dir="${jar.src.dir}"/> | |||||
<service type="a.X"> | |||||
<provider/> | |||||
</service> | |||||
</jar> | |||||
</au:expectfailure> | |||||
</target> | |||||
<target name="tearDown"> | |||||
<delete quiet="yes" dir="${jar.dir}"/> | |||||
</target> | |||||
</project> | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<project xmlns:au="antlib:org.apache.ant.antunit"> | |||||
<property name="jar.dir" location="jar_spi_dir"/> | |||||
<property name="jar.src.dir" location="jar_spi_dir/src"/> | |||||
<property name="jar.src.file" location="jar_spi_dir/src/a_file"/> | |||||
<target name="init"> | |||||
<mkdir dir="${jar.src.dir}"/> | |||||
<delete quiet="yes" file="${jar.src.file}"/> | |||||
<touch file="${jar.src.file}"/> | |||||
<delete quiet="yes" file="${jar.dir}/file.jar"/> | |||||
<delete quiet="yes" dir="${jar.dir}/output"/> | |||||
</target> | |||||
<target name="test-simple" depends="init"> | |||||
<jar jarfile="${jar.dir}/file.jar"> | |||||
<fileset dir="${jar.src.dir}"/> | |||||
<service type="a.b.c" provider="a.b.c.d"/> | |||||
</jar> | |||||
<unjar src="${jar.dir}/file.jar" | |||||
dest="${jar.dir}/output"/> | |||||
<loadfile property="simple" | |||||
srcfile="${jar.dir}/output/META-INF/service/a.b.c" | |||||
encoding="UTF-8"/> | |||||
<au:assertTrue> | |||||
<matches string="${simple}" pattern="^a\.b\.c\.d\n$"/> | |||||
</au:assertTrue> | |||||
</target> | |||||
<target name="test-providers" depends="init"> | |||||
<jar jarfile="${jar.dir}/file.jar"> | |||||
<fileset dir="${jar.src.dir}"/> | |||||
<service type="a.b.c"> | |||||
<provider classname="a.X"/> | |||||
<provider classname="a.D"/> | |||||
</service> | |||||
</jar> | |||||
<unjar src="${jar.dir}/file.jar" | |||||
dest="${jar.dir}/output"/> | |||||
<loadfile property="providers" | |||||
srcfile="${jar.dir}/output/META-INF/service/a.b.c" | |||||
encoding="UTF-8"/> | |||||
<au:assertTrue> | |||||
<matches string="${providers}" pattern="^a\.X\na\.D$"/> | |||||
</au:assertTrue> | |||||
</target> | |||||
<target name="test-multi" depends="init"> | |||||
<jar jarfile="${jar.dir}/file.jar"> | |||||
<fileset dir="${jar.src.dir}"/> | |||||
<service type="a.b.c"> | |||||
<provider classname="a.X"/> | |||||
<provider classname="a.D"/> | |||||
</service> | |||||
<service type="javax.a.service"> | |||||
<provider classname="a.O.T"/> | |||||
<provider classname="a.B"/> | |||||
</service> | |||||
</jar> | |||||
<unjar src="${jar.dir}/file.jar" | |||||
dest="${jar.dir}/output"/> | |||||
<loadfile property="multi-a" | |||||
srcfile="${jar.dir}/output/META-INF/service/a.b.c" | |||||
encoding="UTF-8"/> | |||||
<au:assertTrue> | |||||
<matches string="${multi-a}" pattern="^a\.X\na\.D$"/> | |||||
</au:assertTrue> | |||||
<loadfile property="multi-b" | |||||
srcfile="${jar.dir}/output/META-INF/service/javax.a.service" | |||||
encoding="UTF-8"/> | |||||
<au:assertTrue> | |||||
<matches string="${multi-b}" pattern="^a\.O\.T\na\.B$"/> | |||||
</au:assertTrue> | |||||
</target> | |||||
<target name="test-reject-no-type" depends="init"> | |||||
<au:expectfailure> | |||||
<jar jarfile="${jar.dir}/file.jar"> | |||||
<fileset dir="${jar.src.dir}"/> | |||||
<service provider="a.X"/> | |||||
</jar> | |||||
</au:expectfailure> | |||||
</target> | |||||
<target name="test-reject-no-provider" depends="init"> | |||||
<au:expectfailure> | |||||
<jar jarfile="${jar.dir}/file.jar"> | |||||
<fileset dir="${jar.src.dir}"/> | |||||
<service type="a.X"/> | |||||
</jar> | |||||
</au:expectfailure> | |||||
</target> | |||||
<target name="test-reject-no-classname" depends="init"> | |||||
<au:expectfailure> | |||||
<jar jarfile="${jar.dir}/file.jar"> | |||||
<fileset dir="${jar.src.dir}"/> | |||||
<service type="a.X"> | |||||
<provider/> | |||||
</service> | |||||
</jar> | |||||
</au:expectfailure> | |||||
</target> | |||||
<target name="tearDown"> | |||||
<delete quiet="yes" dir="${jar.dir}"/> | |||||
</target> | |||||
</project> |