// Path: config-toolkit/src/main/java/com/dangdang/config/service/exception/InvalidPathException.java
// public class InvalidPathException extends ConfigToolkitException {
// 
// 	private static final long serialVersionUID = 1L;
// 
// 	public InvalidPathException() {
// 		super();
// 	}
// 
// 	public InvalidPathException(String message, Throwable cause) {
// 		super(message, cause);
// 	}
// 
// 	public InvalidPathException(String message) {
// 		super(message);
// 	}
// 
// 	public InvalidPathException(Throwable cause) {
// 		super(cause);
// 	}
// 
// }
// 
// Path: config-toolkit/src/main/java/com/dangdang/config/service/file/FileConfigGroup.java
// public class FileConfigGroup extends GeneralConfigGroup {
// 
// 	private static final long serialVersionUID = 1L;
// 
// 	private FileConfigProfile configProfile;
// 
// 	private FileLocation location;
// 
// 	private Protocol protocolBean;
// 
// 	private static final Logger LOGGER = LoggerFactory.getLogger(FileConfigGroup.class);
// 
// 	public FileConfigGroup(FileConfigProfile configProfile, String location, boolean enumerable) {
// 		this(configProfile, location);
// 		super.enumerable = enumerable;
// 	}
// 
// 	public FileConfigGroup(FileConfigProfile configProfile, String location) {
// 		this(null, configProfile, location);
// 	}
// 
// 	public FileConfigGroup(ConfigGroup internalConfigGroup, FileConfigProfile configProfile, String location) {
// 		super(internalConfigGroup);
// 
// 		if(location == null) {
// 			throw new IllegalArgumentException("Location cannot be null.");
// 		}
// 
// 		this.configProfile = configProfile;
// 		this.location = FileLocation.fromLocation(location);
// 		initConfigs();
// 		try {
// 			protocolBean.watch(this.location, this);
// 		} catch (InvalidPathException e) {
// 			throw new RuntimeException(e);
// 		}
// 	}
// 
// 	protected void initConfigs() {
// 		LOGGER.debug("Loading file: {}", location);
// 		try {
// 			protocolBean = Protocols.getInstance().get(location.getProtocol()).newInstance();
// 
// 			ContentType contentTypeBean = ContentTypes.getInstance().get(configProfile.getContentType()).newInstance();
// 			cleanAndPutAll(contentTypeBean.resolve(protocolBean.read(location), configProfile.getFileEncoding()));
// 		} catch (Exception e) {
// 			throw new RuntimeException(e);
// 		}
// 	}
// 
// 	@Override
// 	public void close() throws IOException {
// 		if (protocolBean != null) {
// 			protocolBean.close();
// 		}
// 	}
// 
// }
// 
// Path: config-toolkit/src/main/java/com/dangdang/config/service/file/FileLocation.java
// public class FileLocation {
// 
// 	private String file;
// 
// 	private String protocol;
// 
// 	public FileLocation(String file, String protocol) {
// 		super();
// 		this.file = file;
// 		this.protocol = protocol;
// 	}
// 
// 	private static final String COLON = ":";
// 
// 	public static FileLocation fromLocation(String location) {
// 		// default as file
// 		if (!location.contains(COLON)) {
// 			return new FileLocation(location, ProtocolNames.FILE);
// 		}
// 
// 		final int i = location.indexOf(COLON);
// 		final String protocol = location.substring(0, i);
// 		final String file = location.substring(i + 1);
// 
// 		return new FileLocation(file, protocol.toLowerCase());
// 	}
// 
// 	public String getFile() {
// 		return file;
// 	}
// 
// 	public String getProtocol() {
// 		return protocol;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return "FileLocation [file=" + file + ", protocol=" + protocol + "]";
// 	}
// 
// }


import com.dangdang.config.service.exception.InvalidPathException;
import com.dangdang.config.service.file.FileConfigGroup;
import com.dangdang.config.service.file.FileLocation;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
package com.dangdang.config.service.file.protocol;



/**
 * @author <a href="mailto:wangyuxuan@dangdang.com">Yuxuan Wang</a>
 *
 */
public class HttpProtocol implements Protocol {

	@Override
	public void close() throws IOException {

	}

	@Override
	public byte[] read(FileLocation location) throws InvalidPathException {
		try {
			URL url = new URL(location.getProtocol() + ":" + location.getFile());
			try (InputStream in = url.openStream()) {
				try(ByteArrayOutputStream buffer = new ByteArrayOutputStream()) {
					int nRead;
					byte[] data = new byte[1024];
					while ((nRead = in.read(data, 0, data.length)) != -1) {
						buffer.write(data, 0, nRead);
					}

					buffer.flush();
					return buffer.toByteArray();
				}
			}
// Path: config-toolkit/src/main/java/com/dangdang/config/service/exception/InvalidPathException.java
// public class InvalidPathException extends ConfigToolkitException {
// 
// 	private static final long serialVersionUID = 1L;
// 
// 	public InvalidPathException() {
// 		super();
// 	}
// 
// 	public InvalidPathException(String message, Throwable cause) {
// 		super(message, cause);
// 	}
// 
// 	public InvalidPathException(String message) {
// 		super(message);
// 	}
// 
// 	public InvalidPathException(Throwable cause) {
// 		super(cause);
// 	}
// 
// }
// 
// Path: config-toolkit/src/main/java/com/dangdang/config/service/file/FileConfigGroup.java
// public class FileConfigGroup extends GeneralConfigGroup {
// 
// 	private static final long serialVersionUID = 1L;
// 
// 	private FileConfigProfile configProfile;
// 
// 	private FileLocation location;
// 
// 	private Protocol protocolBean;
// 
// 	private static final Logger LOGGER = LoggerFactory.getLogger(FileConfigGroup.class);
// 
// 	public FileConfigGroup(FileConfigProfile configProfile, String location, boolean enumerable) {
// 		this(configProfile, location);
// 		super.enumerable = enumerable;
// 	}
// 
// 	public FileConfigGroup(FileConfigProfile configProfile, String location) {
// 		this(null, configProfile, location);
// 	}
// 
// 	public FileConfigGroup(ConfigGroup internalConfigGroup, FileConfigProfile configProfile, String location) {
// 		super(internalConfigGroup);
// 
// 		if(location == null) {
// 			throw new IllegalArgumentException("Location cannot be null.");
// 		}
// 
// 		this.configProfile = configProfile;
// 		this.location = FileLocation.fromLocation(location);
// 		initConfigs();
// 		try {
// 			protocolBean.watch(this.location, this);
// 		} catch (InvalidPathException e) {
// 			throw new RuntimeException(e);
// 		}
// 	}
// 
// 	protected void initConfigs() {
// 		LOGGER.debug("Loading file: {}", location);
// 		try {
// 			protocolBean = Protocols.getInstance().get(location.getProtocol()).newInstance();
// 
// 			ContentType contentTypeBean = ContentTypes.getInstance().get(configProfile.getContentType()).newInstance();
// 			cleanAndPutAll(contentTypeBean.resolve(protocolBean.read(location), configProfile.getFileEncoding()));
// 		} catch (Exception e) {
// 			throw new RuntimeException(e);
// 		}
// 	}
// 
// 	@Override
// 	public void close() throws IOException {
// 		if (protocolBean != null) {
// 			protocolBean.close();
// 		}
// 	}
// 
// }
// 
// Path: config-toolkit/src/main/java/com/dangdang/config/service/file/FileLocation.java
// public class FileLocation {
// 
// 	private String file;
// 
// 	private String protocol;
// 
// 	public FileLocation(String file, String protocol) {
// 		super();
// 		this.file = file;
// 		this.protocol = protocol;
// 	}
// 
// 	private static final String COLON = ":";
// 
// 	public static FileLocation fromLocation(String location) {
// 		// default as file
// 		if (!location.contains(COLON)) {
// 			return new FileLocation(location, ProtocolNames.FILE);
// 		}
// 
// 		final int i = location.indexOf(COLON);
// 		final String protocol = location.substring(0, i);
// 		final String file = location.substring(i + 1);
// 
// 		return new FileLocation(file, protocol.toLowerCase());
// 	}
// 
// 	public String getFile() {
// 		return file;
// 	}
// 
// 	public String getProtocol() {
// 		return protocol;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return "FileLocation [file=" + file + ", protocol=" + protocol + "]";
// 	}
// 
// }


// Path: config-toolkit/src/main/java/com/dangdang/config/service/file/protocol/HttpProtocol.java
import com.dangdang.config.service.exception.InvalidPathException;
import com.dangdang.config.service.file.FileConfigGroup;
import com.dangdang.config.service.file.FileLocation;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

package com.dangdang.config.service.file.protocol;



/**
 * @author <a href="mailto:wangyuxuan@dangdang.com">Yuxuan Wang</a>
 *
 */
public class HttpProtocol implements Protocol {

	@Override
	public void close() throws IOException {

	}

	@Override
	public byte[] read(FileLocation location) throws InvalidPathException {
		try {
			URL url = new URL(location.getProtocol() + ":" + location.getFile());
			try (InputStream in = url.openStream()) {
				try(ByteArrayOutputStream buffer = new ByteArrayOutputStream()) {
					int nRead;
					byte[] data = new byte[1024];
					while ((nRead = in.read(data, 0, data.length)) != -1) {
						buffer.write(data, 0, nRead);
					}

					buffer.flush();
					return buffer.toByteArray();
				}
			}
		} catch (MalformedURLException e) {