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> |