File: context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="ftpDownloader" class="FtpDownloader"/>
<bean id="httpDownloader" class="HttpDownloader"/>
<bean id="sftpDownaloader" class="SftpDownloader"/>
<bean id="downloadManager" class="DownloadManager">
<property name="downloaders">
<map>
<entry key="ftp" value-ref="ftpDownloader"/>
<entry key="http" value-ref="httpDownloader"/>
<entry key="sftp" value-ref="sftpDownaloader"/>
</map>
</property>
</bean>
</beans>
File: Main.java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;
public class Main {
public static void main(String[] args) throws Exception {
XmlBeanFactory xbf = new XmlBeanFactory(new ClassPathResource("context.xml"));
DownloadManager dm = (DownloadManager)xbf.getBean("downloadManager");
String uri = "http://www.java2java.com";
dm.download(uri);
}
}
class DownloadManager {
private static final Pattern URI_PATTERN = Pattern.compile("^([^:]*):/(.*)$");
private Map<String, Downloader> downloaders;
void download(String uri) {
Matcher matcher = URI_PATTERN.matcher(uri);
if (matcher.matches()) {
String scheme = matcher.group(1);
String path = matcher.group(2);
Downloader downloader = this.downloaders.get(scheme);
if (downloader != null) {
downloader.download(path);
}
}
}
public void setDownloaders(Map<String, Downloader> downloaders) {
this.downloaders = downloaders;
}
}
@Component
class SftpDownloader implements Downloader {
public byte[] download(String uri) {
System.out.println("SFTP Downloading " + uri);
return new byte[0];
}
}
@Component
class HttpDownloader implements Downloader {
public byte[] download(String uri) {
System.out.println("HTTP Downloading " + uri);
return new byte[0];
}
}
@Component
class FtpDownloader implements Downloader {
public byte[] download(String uri) {
System.out.println("FTP Downloading " + uri);
return new byte[0];
}
}
interface Downloader {
byte[] download(final String uri);
}
|