1
0
mirror of https://github.com/Rogiel/httpchannel synced 2025-12-06 07:32:50 +00:00

Implements wupload.com service

This commit is contained in:
2012-01-20 01:33:23 -02:00
parent 7f558b31c5
commit f190e8096d
16 changed files with 555 additions and 12 deletions

View File

@@ -33,7 +33,7 @@ public class FourSharedServiceTest {
}
@Test
public void test() throws IOException {
public void testUpload() throws IOException {
AuthenticationServices.authenticator(service,
properties.getProperty("4shared.username"),
properties.getProperty("4shared.password")).login();

View File

@@ -23,6 +23,7 @@ import java.net.URI;
import javax.xml.bind.JAXB;
import com.rogiel.httpchannel.http.HttpContext;
import com.rogiel.httpchannel.service.filesonic.xml.FSAPI;
import com.rogiel.httpchannel.service.filesonic.xml.FSGetUploadURL;
import com.rogiel.httpchannel.service.filesonic.xml.FSUpload;
@@ -33,11 +34,13 @@ import com.rogiel.httpchannel.service.filesonic.xml.FSUpload;
public class FileSonicAPI {
private static final String BASE_URI = "http://api.filesonic.com/";
private final HttpContext ctx;
private String email;
private String password;
public Object getInfo(int id) {
return id;
public FileSonicAPI(HttpContext ctx) {
this.ctx = ctx;
}
public URI getUploadURI() throws IOException {
@@ -66,6 +69,6 @@ public class FileSonicAPI {
throws IOException {
final URI uri = URI.create(BASE_URI + requestURI + "&u=" + email
+ "&p=" + password + "&format=xml");
return JAXB.unmarshal(uri.toURL().openStream(), type);
return JAXB.unmarshal(ctx.get(uri).asStream(), type);
}
}

View File

@@ -56,17 +56,17 @@ public class FileSonicService extends AbstractHttpService implements Service,
/**
* This service ID
*/
public static final ServiceID SERVICE_ID = ServiceID.create("megaupload");
public static final ServiceID SERVICE_ID = ServiceID.create("filesonic");
/**
* The download URI pattern
*/
private static final Pattern DOWNLOAD_URI_PATTERN = Pattern
.compile("http://www.filesonic.com/file/[0-9A-z]*");
.compile("http://www\\.filesonic\\.com/file/[0-9A-z]*");
/**
* The FileSonic API
*/
private final FileSonicAPI api = new FileSonicAPI();
private final FileSonicAPI api = new FileSonicAPI(http);
@Override
public ServiceID getServiceID() {
@@ -201,9 +201,7 @@ public class FileSonicService extends AbstractHttpService implements Service,
@Override
public void logout() throws IOException {
post("http://www.megaupload.com/?c=account").parameter("logout",
true).request();
// TODO check logout status
api.logout();
}
}

View File

@@ -35,7 +35,7 @@ public class FSGetUploadURL extends FSResponse {
@XmlAccessorType(XmlAccessType.NONE)
public static class FSGetUploadURLResponse {
@XmlElement(name = "uri")
@XmlElement(name = "url")
private String uploadURI;
@XmlElement(name = "max-filesize")
private long maxFilesize;

View File

@@ -0,0 +1,13 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>httpchannel-service</artifactId>
<groupId>com.rogiel.httpchannel</groupId>
<version>1.0.1-SNAPSHOT</version>
<relativePath>..</relativePath>
</parent>
<artifactId>httpchannel-service-wupload</artifactId>
<groupId>com.rogiel.httpchannel.services</groupId>
<name>HttpChannel/Service/WUpload</name>
<description>Provides download and upload access to wupload.com</description>
</project>

View File

@@ -0,0 +1,74 @@
/*
* 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 com.rogiel.httpchannel.service.wupload;
import java.io.IOException;
import java.net.URI;
import javax.xml.bind.JAXB;
import com.rogiel.httpchannel.http.HttpContext;
import com.rogiel.httpchannel.service.wupload.xml.FSAPI;
import com.rogiel.httpchannel.service.wupload.xml.FSGetUploadURL;
import com.rogiel.httpchannel.service.wupload.xml.FSUpload;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class WUploadAPI {
private static final String BASE_URI = "http://api.wupload.com/";
private final HttpContext ctx;
private String email;
private String password;
public WUploadAPI(HttpContext ctx) {
this.ctx = ctx;
}
public URI getUploadURI() throws IOException {
return URI.create((((FSGetUploadURL) execute(FSUpload.class,
"upload?method=getUploadUrl").getResponse()).getResponse()
.getUploadURI()));
}
public long getMaxFilesize() throws IOException {
return ((FSGetUploadURL) execute(FSUpload.class,
"upload?method=getUploadUrl").getResponse()).getResponse()
.getMaxFilesize();
}
public void login(String email, String password) {
this.email = email;
this.password = password;
}
public void logout() {
this.email = null;
this.password = null;
}
private <T extends FSAPI> T execute(Class<T> type, String requestURI)
throws IOException {
final URI uri = URI.create(BASE_URI + requestURI + "&u=" + email
+ "&p=" + password + "&format=xml");
return JAXB.unmarshal(ctx.get(uri).asStream(), type);
}
}

View File

@@ -0,0 +1,211 @@
/*
* 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 com.rogiel.httpchannel.service.wupload;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.regex.Pattern;
import com.rogiel.httpchannel.service.AbstractAuthenticator;
import com.rogiel.httpchannel.service.AbstractHttpService;
import com.rogiel.httpchannel.service.AbstractUploader;
import com.rogiel.httpchannel.service.AuthenticationService;
import com.rogiel.httpchannel.service.Authenticator;
import com.rogiel.httpchannel.service.AuthenticatorCapability;
import com.rogiel.httpchannel.service.CapabilityMatrix;
import com.rogiel.httpchannel.service.Credential;
import com.rogiel.httpchannel.service.Service;
import com.rogiel.httpchannel.service.ServiceID;
import com.rogiel.httpchannel.service.ServiceMode;
import com.rogiel.httpchannel.service.UploadChannel;
import com.rogiel.httpchannel.service.UploadService;
import com.rogiel.httpchannel.service.Uploader;
import com.rogiel.httpchannel.service.UploaderCapability;
import com.rogiel.httpchannel.service.channel.LinkedUploadChannel;
import com.rogiel.httpchannel.service.channel.LinkedUploadChannel.LinkedUploadChannelCloseCallback;
import com.rogiel.httpchannel.service.config.NullAuthenticatorConfiguration;
import com.rogiel.httpchannel.service.config.NullUploaderConfiguration;
import com.rogiel.httpchannel.util.PatternUtils;
/**
* This service handles login, upload and download to WUpload.com.
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
* @since 1.0
*/
public class WUploadService extends AbstractHttpService implements Service,
UploadService<NullUploaderConfiguration>,
AuthenticationService<NullAuthenticatorConfiguration> {
/**
* This service ID
*/
public static final ServiceID SERVICE_ID = ServiceID.create("wupload");
/**
* The download URI pattern
*/
private static final Pattern DOWNLOAD_URI_PATTERN = Pattern
.compile("http://www\\.wupload\\.com/file/[0-9]*(/.*)?");
/**
* The FileSonic API
*/
private final WUploadAPI api = new WUploadAPI(http);
@Override
public ServiceID getServiceID() {
return SERVICE_ID;
}
@Override
public int getMajorVersion() {
return 1;
}
@Override
public int getMinorVersion() {
return 0;
}
@Override
public CapabilityMatrix<ServiceMode> getPossibleServiceModes() {
return new CapabilityMatrix<ServiceMode>(ServiceMode.UNAUTHENTICATED,
ServiceMode.NON_PREMIUM, ServiceMode.PREMIUM);
}
@Override
public Uploader<NullUploaderConfiguration> getUploader(String filename,
long filesize, NullUploaderConfiguration configuration) {
return new UploaderImpl(filename, filesize, configuration);
}
@Override
public Uploader<NullUploaderConfiguration> getUploader(String filename,
long filesize) {
return getUploader(filename, filesize, newUploaderConfiguration());
}
@Override
public NullUploaderConfiguration newUploaderConfiguration() {
return NullUploaderConfiguration.SHARED_INSTANCE;
}
@Override
public long getMaximumFilesize() {
try {
return api.getMaxFilesize();
} catch (IOException e) {
return -1;
}
}
@Override
public String[] getSupportedExtensions() {
return null;
}
@Override
public CapabilityMatrix<UploaderCapability> getUploadCapabilities() {
return new CapabilityMatrix<UploaderCapability>(
UploaderCapability.NON_PREMIUM_ACCOUNT_UPLOAD,
UploaderCapability.PREMIUM_ACCOUNT_UPLOAD);
}
@Override
public Authenticator<NullAuthenticatorConfiguration> getAuthenticator(
Credential credential, NullAuthenticatorConfiguration configuration) {
return new AuthenticatorImpl(credential, configuration);
}
@Override
public Authenticator<NullAuthenticatorConfiguration> getAuthenticator(
Credential credential) {
return getAuthenticator(credential, newAuthenticatorConfiguration());
}
@Override
public NullAuthenticatorConfiguration newAuthenticatorConfiguration() {
return NullAuthenticatorConfiguration.SHARED_INSTANCE;
}
@Override
public CapabilityMatrix<AuthenticatorCapability> getAuthenticationCapability() {
return new CapabilityMatrix<AuthenticatorCapability>();
}
protected class UploaderImpl extends
AbstractUploader<NullUploaderConfiguration> implements
Uploader<NullUploaderConfiguration>,
LinkedUploadChannelCloseCallback {
private Future<String> uploadFuture;
public UploaderImpl(String filename, long filesize,
NullUploaderConfiguration configuration) {
super(WUploadService.this, filename, filesize, configuration);
}
@Override
public UploadChannel openChannel() throws IOException {
logger.debug("Starting upload to wupload.com");
final LinkedUploadChannel channel = createLinkedChannel(this);
uploadFuture = multipartPost(api.getUploadURI().toString())
.parameter("files[]", channel).asStringAsync();
return waitChannelLink(channel, uploadFuture);
}
@Override
public String finish() throws IOException {
try {
return PatternUtils.find(DOWNLOAD_URI_PATTERN,
uploadFuture.get());
} catch (InterruptedException e) {
return null;
} catch (ExecutionException e) {
throw (IOException) e.getCause();
}
}
}
protected class AuthenticatorImpl extends
AbstractAuthenticator<NullAuthenticatorConfiguration> implements
Authenticator<NullAuthenticatorConfiguration> {
public AuthenticatorImpl(Credential credential,
NullAuthenticatorConfiguration configuration) {
super(credential, configuration);
}
@Override
public void login() throws IOException {
logger.debug("Logging to wupload.com");
api.login(credential.getUsername(), credential.getPassword());
serviceMode = ServiceMode.NON_PREMIUM;
}
@Override
public void logout() throws IOException {
api.logout();
}
}
@Override
public String toString() {
return this.getClass().getSimpleName() + " " + getMajorVersion() + "."
+ getMinorVersion();
}
}

View File

@@ -0,0 +1,27 @@
/*
* 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 com.rogiel.httpchannel.service.wupload.xml;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*
*/
public class FSAPI {
}

View File

@@ -0,0 +1,55 @@
/*
* 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 com.rogiel.httpchannel.service.wupload.xml;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*
*/
@XmlRootElement(name = "getUploadUrl")
@XmlAccessorType(XmlAccessType.NONE)
public class FSGetUploadURL extends FSResponse {
@XmlElement(name = "response")
private FSGetUploadURLResponse response;
@XmlAccessorType(XmlAccessType.NONE)
public static class FSGetUploadURLResponse {
@XmlElement(name = "url")
private String uploadURI;
@XmlElement(name = "max-filesize")
private long maxFilesize;
public String getUploadURI() {
return uploadURI;
}
public long getMaxFilesize() {
return maxFilesize;
}
}
public FSGetUploadURLResponse getResponse() {
return response;
}
}

View File

@@ -0,0 +1,36 @@
/*
* 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 com.rogiel.httpchannel.service.wupload.xml;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
@XmlAccessorType(XmlAccessType.NONE)
public abstract class FSResponse {
@XmlElement(name = "status")
private String status;
public String getStatus() {
return status;
}
}

View File

@@ -0,0 +1,40 @@
/*
* 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 com.rogiel.httpchannel.service.wupload.xml;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElements;
import javax.xml.bind.annotation.XmlRootElement;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*
*/
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name = "FSApi_Upload")
public class FSUpload extends FSAPI {
@XmlElements(value = { @XmlElement(name = "getUploadUrl", type = FSGetUploadURL.class) })
private FSResponse response;
public FSResponse getResponse() {
return response;
}
}

View File

@@ -0,0 +1 @@
com.rogiel.httpchannel.service.wupload.WUploadService

View File

@@ -0,0 +1,48 @@
/**
*
*/
package com.rogiel.httpchannel.service.wupload;
import java.io.IOException;
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Properties;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import com.rogiel.httpchannel.service.helper.AuthenticationServices;
import com.rogiel.httpchannel.util.ChannelUtils;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*
*/
public class WUploadServiceTest {
private final WUploadService service = new WUploadService();
private final Properties properties = new Properties();
@Before
public void setUp() throws IOException {
properties.load(Files.newInputStream(Paths
.get("../src/test/resources/login.properties")));
}
@Test
public void testUpload() throws IOException {
AuthenticationServices.authenticator(service,
properties.getProperty("wupload.username"),
properties.getProperty("wupload.password")).login();
final Path path = Paths
.get("../src/test/resources/upload-test-file.txt");
final URI uri = ChannelUtils.upload(service, path);
Assert.assertNotNull(uri);
System.out.println(uri);
}
}

View File

@@ -21,6 +21,7 @@
<module>httpchannel-service-depositfiles</module>
<module>httpchannel-service-hotfile</module>
<module>httpchannel-service-filesonic</module>
<module>httpchannel-service-wupload</module>
<module>httpchannel-service-zshare</module>
<module>httpchannel-service-4shared</module>
</modules>

View File

@@ -52,6 +52,11 @@
<artifactId>htmlparser</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
<name>HttpChannel/Service/Utilities</name>
<description>Module providing several utilities to service implementations. Though this module is not required to implement services, it contains several shortcuts that can help implementing services.</description>

View File

@@ -19,16 +19,21 @@
package com.rogiel.httpchannel.http;
import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import com.rogiel.httpchannel.util.HttpClientUtils;
import com.rogiel.httpchannel.util.htmlparser.HTMLPage;
public abstract class Request {
private static final JSONParser jsonParser = new JSONParser();
protected final HttpContext ctx;
protected final String uri;
@@ -61,6 +66,19 @@ public abstract class Request {
});
}
public InputStream asStream() throws ClientProtocolException, IOException {
return request().getEntity().getContent();
}
public Future<InputStream> asStreamAsync() throws IOException {
return ctx.threadPool.submit(new Callable<InputStream>() {
@Override
public InputStream call() throws Exception {
return asStream();
}
});
}
public HTMLPage asPage() throws ClientProtocolException, IOException {
return HTMLPage.parse(asString());
}
@@ -74,6 +92,19 @@ public abstract class Request {
});
}
public Object asJson() throws ClientProtocolException, IOException, ParseException {
return jsonParser.parse(asString());
}
public Future<Object> asJsonAsync() throws IOException {
return ctx.threadPool.submit(new Callable<Object>() {
@Override
public Object call() throws Exception {
return asJson();
}
});
}
public String getURI() {
return uri;
}