- Introduce new class ProviderInfo, to encapsulate Package info (vendor/version).

- Rewritten Spi classes to use new class, to have vendor and version info injected from manifest.
This commit is contained in:
Harald Kuhr
2009-10-31 19:16:48 +01:00
parent fb2c555d21
commit f49a487c88
15 changed files with 281 additions and 54 deletions
@@ -0,0 +1,64 @@
package com.twelvemonkeys.imageio.spi;
import com.twelvemonkeys.lang.Validate;
/**
* Provides provider info, like vendor name and version,
* for {@link javax.imageio.spi.ImageReaderWriterSpi} subclasses based on information in the manifest.
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haraldk$
* @version $Id: ProviderInfo.java,v 1.0 Oct 31, 2009 3:49:39 PM haraldk Exp$
*
* @see <a href="http://java.sun.com/j2se/1.5.0/docs/guide/jar/jar.html#JAR%20Manifest">JAR Manifest</a>
*/
public class ProviderInfo {
private final String mVendorName;
private final String mVersion;
/**
* Creates a provider information instance based on the given package.
*
* @param pPackage the package to get provider information from.
* This should typically be the package containing the Spi class.
*
* @throws IllegalArgumentException if {@code pPackage == null}
*/
public ProviderInfo(final Package pPackage) {
Validate.notNull(pPackage, "package");
String vendor = pPackage.getImplementationVendor();
mVendorName = vendor != null ? vendor : fakeVendor(pPackage);
String version = pPackage.getImplementationVersion();
mVersion = version != null ? version : "DEV";
}
private static String fakeVendor(final Package pPackage) {
String name = pPackage.getName();
return name.startsWith("com.twelvemonkeys") ? "TwelveMonkeys" : name;
}
/**
* Returns the vendor name, as specified in the manifest entry
* {@code Implementation-Vendor} for the package.
* If the vendor name is unavailable, the package name or some default name
* for known packages are used.
*
* @return the vendor name.
*/
public final String getVendorName() {
return mVendorName;
}
/**
* Returns the version/build number string, as specified in the manifest entry
* {@code Implementation-Version} for the package.
* If the version is unavailable, some arbitrary (non-{@code null}) value is used.
*
* @return the vendor name.
*/
public final String getVersion() {
return mVersion;
}
}
@@ -1,6 +1,7 @@
package com.twelvemonkeys.imageio.util;
import com.twelvemonkeys.image.ImageUtil;
import com.twelvemonkeys.imageio.spi.ProviderInfo;
import javax.imageio.IIOParam;
import javax.imageio.spi.IIOServiceProvider;
@@ -61,21 +62,6 @@ public final class IIOUtil {
return new BufferedOutputStream(new IIOOutputStreamAdapter(pStream));
}
/**
* THIS METHOD WILL ME MOVED/RENAMED, DO NOT USE.
*
* @param pRegistry the registry to unregister from
* @param pProvider the provider to unregister
* @param pCategory the category to unregister from
*
* @deprecated
*/
public static <T> void deregisterProvider(final ServiceRegistry pRegistry, final IIOServiceProvider pProvider, final Class<T> pCategory) {
// http://www.ibm.com/developerworks/java/library/j-jtp04298.html
// TODO: Consider placing this method in a ImageReaderSpiBase class or similar
pRegistry.deregisterServiceProvider(pCategory.cast(pProvider), pCategory);
}
public static Image fakeSubsampling(final Image pImage, final IIOParam pParam) {
if (pImage == null) {
return null;
@@ -134,4 +120,30 @@ public final class IIOUtil {
return pImage;
}
/**
* Creates a {@link ProviderInfo} instance for the given service provider.
*
* @param pProviderClass the provider class to get info for.
* @return the newly created {@link ProviderInfo}.
*/
public static ProviderInfo getProviderInfo(final Class<? extends IIOServiceProvider> pProviderClass) {
return new ProviderInfo(pProviderClass.getPackage());
}
/**
* THIS METHOD WILL ME MOVED/RENAMED, DO NOT USE.
*
* @param pRegistry the registry to unregister from
* @param pProvider the provider to unregister
* @param pCategory the category to unregister from
*
* @deprecated
*/
public static <T> void deregisterProvider(final ServiceRegistry pRegistry, final IIOServiceProvider pProvider, final Class<T> pCategory) {
// http://www.ibm.com/developerworks/java/library/j-jtp04298.html
// TODO: Consider placing this method in a ImageReaderSpiBase class or similar
pRegistry.deregisterServiceProvider(pCategory.cast(pProvider), pCategory);
}
}
@@ -0,0 +1,75 @@
package com.twelvemonkeys.imageio.spi;
import junit.framework.TestCase;
/**
* ProviderInfoTestCase
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haraldk$
* @version $Id: ProviderInfoTestCase.java,v 1.0 Oct 31, 2009 3:51:22 PM haraldk Exp$
*/
public class ProviderInfoTestCase extends TestCase {
public void testCreateNorma() {
new ProviderInfo(Package.getPackage("java.util"));
}
public void testCreateNullPackage() {
try {
new ProviderInfo(null);
fail("IllegalArgumentException expected for null package");
}
catch (IllegalArgumentException expected) {
assertTrue(expected.getMessage().toLowerCase().contains("package"));
}
}
public void testGetVendorUnknownPackage() {
// TODO: FixMe: This test will fail if for some reason JUnit adds manifest info to their JAR..
ProviderInfo info = new ProviderInfo(Package.getPackage("junit.framework"));
String vendor = info.getVendorName();
assertNotNull(vendor);
assertEquals("junit.framework", vendor);
String version = info.getVersion();
assertNotNull(version);
assertEquals("DEV", version);
}
public void testGetVendorTMPackage() {
// TODO: FixMe: This test will fail if for some reason the tests are run from within a JAR-file,
// and depends on implementation details.
ProviderInfo info = new ProviderInfo(getClass().getPackage());
String vendor = info.getVendorName();
assertNotNull(vendor);
assertEquals("TwelveMonkeys", vendor);
String version = info.getVersion();
assertNotNull(version);
assertEquals("DEV", version);
}
public void testGetVendorKnownPackage() {
// TODO: FixMe: This test depends on implementation details, and may fail on various JRE's...
ProviderInfo info = new ProviderInfo(Package.getPackage("java.util"));
String vendor = info.getVendorName();
assertNotNull(vendor);
assertFalse("".equals(vendor));
// NOTE: Does not work: assertEquals(System.getProperty("java.vendor"), vendor);
assertFalse("TwelveMonkeys".equals(vendor));
assertFalse("java.util".equals(vendor));
String version = info.getVersion();
assertNotNull(version);
assertFalse("".equals(version));
assertFalse("DEV".equals(version));
// Is this safe to assume?
String jreVersion = System.getProperty("java.version");
assertTrue(jreVersion.equals(version) || jreVersion.startsWith(version) || version.startsWith(jreVersion));
}
}