JCLOUDS-25. Removing sandbox-*.

This commit is contained in:
Andrew Bayer 2013-05-10 17:12:25 -07:00
parent 1e4baa9618
commit 3923283fcd
378 changed files with 0 additions and 29756 deletions

View File

@ -1,92 +0,0 @@
====
Licensed to jclouds, Inc. (jclouds) under one or more
contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. jclouds 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.
====
The libvirt library is used to interface with different virtualization technologies (http://libvirt.org/)
libvirt supports:
The Xen hypervisor on Linux and Solaris hosts.
The QEMU emulator
The KVM Linux hypervisor
The LXC Linux container system
The OpenVZ Linux container system
The User Mode Linux paravirtualized kernel
The VirtualBox hypervisor
The VMware ESX and GSX hypervisors
Storage on IDE/SCSI/USB disks, FibreChannel, LVM, iSCSI, NFS and filesystems
Getting Started Guide for jclouds-libvirt
install libvirt on your os
* if os/x, see http://github.com/justinclift/libvirt
* if you are using Linux, let's suppose you want to use KVM:
- install libvirt and KVM (http://www.linux-kvm.org/page/Main_Page).
Remember to run
egrep '(vmx|svm)' /proc/cpuinfo
If nothing is printed, it means that your cpu does not support hardware virtualization.
Verify Installation
$ virsh -c qemu:///system list
Id Name State
----------------------------------
(for Ubuntu users: look also at this good turorial https://help.ubuntu.com/community/KVM)
Create your first guest
- download, for example, an ubuntu 10.04 LTS ISO
- create a libvirt domain by using:
virt-manager: a GUI tool at http://virt-manager.et.redhat.com/
virt-install, a python script developed by Red Hat (sudo apt-get install python-virtinst)
ubuntu-vm-builder, developed by Canonical. (sudo apt-get install ubuntu-vm-builder)
NB: use Javascript tool that generates the parameters for ubuntu-vm-builder: http://people.ubuntu.com/~kirkland/ubuntu-vm-builder.html
Now that you have a libvirt domain, your workstation is ready to use jclouds-libvirt.
You can now download jclouds-libvirt and give a try by running
ComputeServiceContext context = null;
try {
context = new ComputeServiceContextFactory()
.createContext(new StandaloneComputeServiceContextSpec<Domain, Domain, Image, Datacenter>("libvirt",
endpoint, apiversion, identity, credential, new LibvirtComputeServiceContextModule(), ImmutableSet
.<Module> of()));
Template defaultTemplate = context.getComputeService().templateBuilder()
.hardwareId("c7ff2039-a9f1-a659-7f91-e0f82f59d52e").imageId("1").build();
context.getComputeService().runNodesWithTag(domainName, 1, defaultTemplate);
} catch (RunNodesException e) {
e.printStackTrace();
} finally {
if (context != null)
context.close();
}
where identity=your_name, endpoint=qemu:///system
and domainName equals to the name chosen during the creation of libvirt domain
NB: apiversion, credential can be null

View File

@ -1 +0,0 @@
runNodesWithTag: when ask for more than 1 node, cloning step fails cause of concurrent access to the originale virtual disk to be cloned.

View File

@ -1,147 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to jclouds, Inc. (jclouds) under one or more
contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. jclouds 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.
-->
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.jclouds</groupId>
<artifactId>jclouds-project</artifactId>
<version>1.6.0-SNAPSHOT</version>
<relativePath>../../project/pom.xml</relativePath>
</parent>
<groupId>org.jclouds.api</groupId>
<artifactId>libvirt</artifactId>
<name>jclouds example components for a libvirt provider</name>
<packaging>bundle</packaging>
<properties>
<!-- when instances are hung, open a ticket and add here -->
<jclouds.compute.blacklist.nodes>trmkrun-ccc,test.trmk-924</jclouds.compute.blacklist.nodes>
<test.libvirt.endpoint>test:///default</test.libvirt.endpoint>
<test.libvirt.api-version>1.0</test.libvirt.api-version>
<test.libvirt.build-version></test.libvirt.build-version>
<test.libvirt.identity>FIXME</test.libvirt.identity>
<test.libvirt.credential>FIXME</test.libvirt.credential>
<test.libvirt.image-id></test.libvirt.image-id>
<jclouds.osgi.export>org.jclouds.libvirt*;version="${project.version}"</jclouds.osgi.export>
<jclouds.osgi.import>org.jclouds*;version="${project.version}",*</jclouds.osgi.import>
</properties>
<dependencies>
<dependency>
<groupId>org.libvirt</groupId>
<artifactId>libvirt</artifactId>
<version>0.4.6</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>com.sun.jna</groupId>
<artifactId>jna</artifactId>
<version>3.0.9</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.jamesmurty.utils</groupId>
<artifactId>java-xmlbuilder</artifactId>
<version>0.3</version>
</dependency>
<dependency>
<groupId>org.jclouds</groupId>
<artifactId>jclouds-core</artifactId>
<version>${project.version}</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jclouds</groupId>
<artifactId>jclouds-compute</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.jclouds</groupId>
<artifactId>jclouds-compute</artifactId>
<version>${project.version}</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jclouds.driver</groupId>
<artifactId>jclouds-log4j</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jclouds.driver</groupId>
<artifactId>jclouds-jsch</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<profiles>
<profile>
<id>live</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<executions>
<execution>
<id>integration</id>
<phase>integration-test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<systemPropertyVariables>
<test.libvirt.endpoint>${test.libvirt.endpoint}</test.libvirt.endpoint>
<test.libvirt.api-version>${test.libvirt.api-version}</test.libvirt.api-version>
<test.libvirt.build-version>${test.libvirt.build-version}</test.libvirt.build-version>
<test.libvirt.identity>${test.libvirt.identity}</test.libvirt.identity>
<test.libvirt.credential>${test.libvirt.credential}</test.libvirt.credential>
<test.libvirt.image-id>${test.libvirt.image-id}</test.libvirt.image-id>
</systemPropertyVariables>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>

View File

@ -1,55 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.libvirt;
import com.google.common.base.Objects;
/**
* This would be replaced with the real java object related to the underlying image
*
* @author Adrian Cole
*/
public class Image {
public int id;
public String name;
public Image(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public int hashCode() {
return Objects.hashCode(id, name);
}
@Override
public boolean equals(Object that) {
if (that == null)
return false;
return Objects.equal(this.toString(), that.toString());
}
@Override
public String toString() {
return Objects.toStringHelper(this).add("id", id).add("name", name).toString();
}
}

View File

@ -1,32 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.libvirt;
/**
* Configuration properties and constants used in libvirt local connections.
*
* @author Adrian Cole
*/
public interface LibvirtConstants {
public static final String PROPERTY_LIBVIRT_DOMAIN_DIR = "jclouds.libvirt.domain.dir";
}
//public static final String PROPERTY_AUTH_TAG = "jclouds.aws.auth.tag";
//public static final String PROPERTY_HEADER_TAG = "jclouds.aws.header.tag";

View File

@ -1,121 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.libvirt.compute;
import java.io.StringReader;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.jclouds.Constants;
import org.jclouds.collect.Memoized;
import org.jclouds.compute.ComputeServiceContext;
import org.jclouds.compute.ImageExtension;
import org.jclouds.compute.callables.RunScriptOnNode;
import org.jclouds.compute.domain.Hardware;
import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.domain.TemplateBuilder;
import org.jclouds.compute.internal.BaseComputeService;
import org.jclouds.compute.internal.PersistNodeCredentials;
import org.jclouds.compute.options.TemplateOptions;
import org.jclouds.compute.reference.ComputeServiceConstants.Timeouts;
import org.jclouds.compute.strategy.CreateNodesInGroupThenAddToSet;
import org.jclouds.compute.strategy.DestroyNodeStrategy;
import org.jclouds.compute.strategy.GetNodeMetadataStrategy;
import org.jclouds.compute.strategy.InitializeRunScriptOnNodeOrPlaceInBadMap;
import org.jclouds.compute.strategy.ListNodesStrategy;
import org.jclouds.compute.strategy.RebootNodeStrategy;
import org.jclouds.compute.strategy.ResumeNodeStrategy;
import org.jclouds.compute.strategy.SuspendNodeStrategy;
import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location;
import org.jclouds.scriptbuilder.functions.InitAdminAccess;
import org.libvirt.Connect;
import org.libvirt.StorageVol;
import org.xml.sax.InputSource;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.base.Supplier;
import com.google.common.base.Throwables;
import com.jamesmurty.utils.XMLBuilder;
/**
*
* @author andrea turli
*
*/
@Singleton
public class LibvirtComputeService extends BaseComputeService {
private final Connect client;
@Inject
protected LibvirtComputeService(ComputeServiceContext context, Map<String, Credentials> credentialStore,
@Memoized Supplier<Set<? extends Image>> images,
@Memoized Supplier<Set<? extends Hardware>> hardwareProfiles,
@Memoized Supplier<Set<? extends Location>> locations, ListNodesStrategy listNodesStrategy,
GetNodeMetadataStrategy getNodeMetadataStrategy,
CreateNodesInGroupThenAddToSet runNodesAndAddToSetStrategy, RebootNodeStrategy rebootNodeStrategy,
DestroyNodeStrategy destroyNodeStrategy, ResumeNodeStrategy resumeNodeStrategy,
SuspendNodeStrategy suspendNodeStrategy, Provider<TemplateBuilder> templateBuilderProvider,
Provider<TemplateOptions> templateOptionsProvider,
@Named("NODE_RUNNING") Predicate<NodeMetadata> nodeRunning,
@Named("NODE_TERMINATED") Predicate<NodeMetadata> nodeTerminated,
@Named("NODE_SUSPENDED") Predicate<NodeMetadata> nodeSuspended,
InitializeRunScriptOnNodeOrPlaceInBadMap.Factory initScriptRunnerFactory, InitAdminAccess initAdminAccess,
RunScriptOnNode.Factory runScriptOnNodeFactory, PersistNodeCredentials persistNodeCredentials,
Timeouts timeouts, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor, Connect client,
Optional<ImageExtension> imageExtension) {
super(context, credentialStore, images, hardwareProfiles, locations, listNodesStrategy, getNodeMetadataStrategy,
runNodesAndAddToSetStrategy, rebootNodeStrategy, destroyNodeStrategy, resumeNodeStrategy,
suspendNodeStrategy, templateBuilderProvider, templateOptionsProvider, nodeRunning, nodeTerminated,
nodeSuspended, initScriptRunnerFactory, initAdminAccess, runScriptOnNodeFactory, persistNodeCredentials,
timeouts, executor, imageExtension);
this.client = client;
}
@Override
protected void cleanUpIncidentalResourcesOfDeadNodes(Set<? extends NodeMetadata> deadNodes) {
// TODO Was previously commented out in overridden destroyNode; refactored to here but left commented out
// for (NodeMetadata deadNode : deadNodes) {
// eliminateDomain(deadNode.getId());
// }
}
private void eliminateDomain(String id) {
try {
XMLBuilder builder = XMLBuilder.parse(new InputSource(new StringReader(client.domainLookupByUUIDString(id)
.getXMLDesc(0))));
String diskFileName = builder.xpathFind("//devices/disk[@device='disk']/source").getElement().getAttribute(
"file");
StorageVol storageVol = client.storageVolLookupByPath(diskFileName);
storageVol.delete(0);
client.domainLookupByUUIDString(id).undefine();
} catch (Exception e) {
Throwables.propagate(e);
}
}
}

View File

@ -1,49 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.libvirt.compute;
import static org.jclouds.libvirt.LibvirtConstants.PROPERTY_LIBVIRT_DOMAIN_DIR;
import java.util.List;
import java.util.Properties;
import org.jclouds.compute.StandaloneComputeServiceContextBuilder;
import org.jclouds.libvirt.compute.domain.LibvirtComputeServiceContextModule;
import org.libvirt.Connect;
import com.google.inject.Module;
/**
*
* @author Adrian Cole
*/
public class LibvirtComputeServiceContextBuilder extends StandaloneComputeServiceContextBuilder<Connect> {
public LibvirtComputeServiceContextBuilder(Properties props) {
super(Connect.class, props);
if (!properties.containsKey(PROPERTY_LIBVIRT_DOMAIN_DIR))
properties.setProperty(PROPERTY_LIBVIRT_DOMAIN_DIR, "/etc/libvirt/qemu");
}
@Override
protected void addContextModule(List<Module> modules) {
modules.add(new LibvirtComputeServiceContextModule());
}
}

View File

@ -1,42 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.libvirt.compute;
import org.jclouds.PropertiesBuilder;
import org.jclouds.compute.ComputeService;
import org.jclouds.rest.RestContextSpec;
import com.google.common.collect.ImmutableSet;
import com.google.inject.Module;
/**
* @author Adrian Cole
*/
public class LibvirtComputeServiceContextSpec extends RestContextSpec<ComputeService, ComputeService> {
@SuppressWarnings("unchecked")
public LibvirtComputeServiceContextSpec(String endpoint, String identity, String credential, Iterable<Module> modules) {
super("libvirt", endpoint, "1", "", identity, credential, ComputeService.class, ComputeService.class,
PropertiesBuilder.class, (Class) LibvirtComputeServiceContextBuilder.class, modules);
}
public LibvirtComputeServiceContextSpec(String endpoint, String identity, String credential) {
this(endpoint, identity, credential, ImmutableSet.<Module> of());
}
}

View File

@ -1,72 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.libvirt.compute;
import static org.jclouds.Constants.PROPERTY_API_VERSION;
import static org.jclouds.Constants.PROPERTY_ENDPOINT;
import static org.jclouds.libvirt.LibvirtConstants.PROPERTY_LIBVIRT_DOMAIN_DIR;
import static org.jclouds.compute.reference.ComputeServiceConstants.PROPERTY_TIMEOUT_NODE_SUSPENDED;
import java.util.Properties;
import org.jclouds.PropertiesBuilder;
/**
* Builds properties used in Libvirt Clients
*
* @author Andrea Turli
*/
public class LibvirtPropertiesBuilder extends PropertiesBuilder {
@Override
protected Properties defaultProperties() {
Properties properties = super.defaultProperties();
properties.setProperty(PROPERTY_LIBVIRT_DOMAIN_DIR, "/etc/libvirt/qemu");
/*
properties.setProperty(PROPERTY_AUTH_TAG, "AWS");
properties.setProperty(PROPERTY_HEADER_TAG, "amz");
properties.setProperty(PROPERTY_ENDPOINT, "https://ec2.us-east-1.amazonaws.com");
properties.setProperty(PROPERTY_API_VERSION, EC2AsyncClient.VERSION);
properties.setProperty(PROPERTY_ELB_ENDPOINT, "https://elasticloadbalancing.us-east-1.amazonaws.com");
// amazon, alestic, canonical, and rightscale
properties.setProperty(PROPERTY_EC2_AMI_OWNERS, "137112412989,063491364108,099720109477,411009282317");
// amis that work with the cluster instances
properties.setProperty(PROPERTY_EC2_CC_AMIs, "us-east-1/ami-7ea24a17");
*/
// sometimes, like in ec2, stop takes a very long time, perhaps
// due to volume management. one example spent 2 minutes moving
// from stopping->stopped state on an ec2 micro
properties.setProperty(PROPERTY_TIMEOUT_NODE_SUSPENDED, 120 * 1000 + "");
// auth fail sometimes happens in EC2, as the rc.local script that injects the
// authorized key executes after ssh has started
properties.setProperty("jclouds.ssh.max_retries", "7");
properties.setProperty("jclouds.ssh.retryable_messages",
"Auth fail,invalid data,End of IO Stream Read,Connection reset,socket is not established");
return properties;
}
public LibvirtPropertiesBuilder(Properties properties) {
super(properties);
}
public LibvirtPropertiesBuilder() {
super();
}
}

View File

@ -1,180 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.libvirt.compute.domain;
import static com.google.common.base.Predicates.notNull;
import static com.google.common.collect.Iterables.filter;
import static com.google.common.collect.Iterables.transform;
import static org.jclouds.libvirt.LibvirtConstants.PROPERTY_LIBVIRT_DOMAIN_DIR;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.net.URI;
import javax.inject.Named;
import javax.inject.Singleton;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.WildcardFileFilter;
import org.jclouds.Constants;
import org.jclouds.compute.ComputeServiceAdapter;
import org.jclouds.compute.config.ComputeServiceAdapterContextModule;
import org.jclouds.compute.domain.Hardware;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.domain.TemplateBuilder;
import org.jclouds.domain.Location;
import org.jclouds.functions.IdentityFunction;
import org.jclouds.http.functions.ParseSax;
import org.jclouds.libvirt.Image;
import org.jclouds.libvirt.compute.functions.DomainToHardware;
import org.jclouds.libvirt.compute.functions.DomainToNodeMetadata;
import org.jclouds.libvirt.compute.functions.LibvirtImageToImage;
import org.jclouds.libvirt.compute.strategy.LibvirtComputeServiceAdapter;
import org.jclouds.location.Provider;
import org.jclouds.location.suppliers.OnlyLocationOrFirstZone;
import org.libvirt.Connect;
import org.libvirt.Domain;
import org.libvirt.LibvirtException;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import com.google.common.base.Function;
import com.google.common.base.Supplier;
import com.google.common.collect.Iterables;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.Provides;
import com.google.inject.TypeLiteral;
import com.google.inject.name.Names;
/**
*
* @author Adrian Cole
*/
public class LibvirtComputeServiceContextModule extends
ComputeServiceAdapterContextModule<Connect, Connect, Domain, Domain, Image, Location> {
public LibvirtComputeServiceContextModule() {
super(Connect.class, Connect.class);
}
@SuppressWarnings("unchecked")
@Override
protected void configure() {
super.configure();
bind(new TypeLiteral<ComputeServiceAdapter<Domain, Domain, Image, Location>>() {
}).to(LibvirtComputeServiceAdapter.class);
bind(new TypeLiteral<Supplier<Location>>() {
}).to(OnlyLocationOrFirstZone.class);
bind(new TypeLiteral<Function<Domain, NodeMetadata>>() {
}).to(DomainToNodeMetadata.class);
bind(new TypeLiteral<Function<Image, org.jclouds.compute.domain.Image>>() {
}).to(LibvirtImageToImage.class);
bind(new TypeLiteral<Function<Domain, Hardware>>() {
}).to(DomainToHardware.class);
bind(new TypeLiteral<Function<Location, Location>>() {
}).to((Class) IdentityFunction.class);
// bind(ComputeService.class).to(LibvirtComputeService.class);
}
@Provides
@Singleton
protected Connect createConnection(@Provider URI endpoint, @Named(Constants.PROPERTY_IDENTITY) String identity,
@Named(Constants.PROPERTY_CREDENTIAL) String credential) throws LibvirtException {
// ConnectAuth connectAuth = null;
return new Connect(endpoint.toASCIIString());
}
@Override
protected TemplateBuilder provideTemplate(Injector injector, TemplateBuilder template) {
String domainDir = injector.getInstance(Key.get(String.class, Names.named(PROPERTY_LIBVIRT_DOMAIN_DIR)));
String hardwareId = searchForHardwareIdInDomainDir(domainDir, injector.getInstance(ParseSax.Factory.class),
injector.getProvider(UUIDHandler.class));
String image = searchForImageIdInDomainDir(domainDir);
return template.hardwareId(hardwareId).imageId(image);
}
private String searchForImageIdInDomainDir(String domainDir) {
// TODO
return "1";
}
@SuppressWarnings("unchecked")
private String searchForHardwareIdInDomainDir(String domainDir, final ParseSax.Factory factory,
final javax.inject.Provider<UUIDHandler> provider) {
// TODO: remove commons-io dependency
return Iterables.<String> getLast(filter(transform(FileUtils.listFiles(new File(domainDir),
new WildcardFileFilter("*.xml"), null), new Function<File, String>() {
@Override
public String apply(File input) {
try {
return factory.create(provider.get()).parse(new FileInputStream(input));
} catch (FileNotFoundException e) {
// log error.
return null;
}
}
}), notNull()));
}
public static class UUIDHandler extends ParseSax.HandlerWithResult<String> {
private StringBuilder currentText = new StringBuilder();
private boolean inDomain;
private String uuid;
public String getResult() {
return uuid;
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException {
if (qName.equals("domain")) {
inDomain = true;
}
}
@Override
public void endElement(String uri, String localName, String qName) {
if (qName.equalsIgnoreCase("uuid") && inDomain) {
this.uuid = currentText.toString();
} else if (qName.equalsIgnoreCase("domain")) {
inDomain = false;
}
currentText = new StringBuilder();
}
public void characters(char ch[], int start, int length) {
currentText.append(ch, start, length);
}
}
/*
* Map<String, URI> regions = newLinkedHashMap(); for (String region :
* Splitter.on(',').split(regionString)) { regions.put( region,
* URI.create(injector.getInstance(Key.get(String.class, Names.named(Constants.PROPERTY_ENDPOINT
* + "." + region))))); } return regions;
*/
}

View File

@ -1,98 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.libvirt.compute.functions;
import java.io.IOException;
import java.io.StringReader;
import java.util.List;
import javax.inject.Singleton;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.jclouds.compute.domain.Hardware;
import org.jclouds.compute.domain.HardwareBuilder;
import org.jclouds.compute.domain.Processor;
import org.jclouds.compute.domain.Volume;
import org.jclouds.compute.domain.internal.VolumeImpl;
import org.libvirt.Domain;
import org.libvirt.LibvirtException;
import org.libvirt.StorageVol;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import com.google.common.base.Function;
import com.google.common.base.Throwables;
import com.google.common.collect.Lists;
import com.jamesmurty.utils.XMLBuilder;
/**
* @author Adrian Cole
*/
@Singleton
public class DomainToHardware implements Function<Domain, Hardware> {
@Override
public Hardware apply(Domain from) {
HardwareBuilder builder = new HardwareBuilder();
try {
builder.id(from.getUUIDString());
builder.providerId(from.getID() + "");
builder.name(from.getName());
List<Processor> processors = Lists.newArrayList();
for (int i = 0; i < from.getInfo().nrVirtCpu; i++) {
processors.add(new Processor(i + 1, 1));
}
builder.processors(processors);
builder.ram((int) from.getInfo().maxMem);
List<Volume> volumes = Lists.newArrayList();
XMLBuilder xmlBuilder = XMLBuilder.parse(new InputSource(new StringReader(from.getXMLDesc(0))));
Document doc = xmlBuilder.getDocument();
XPathExpression expr = XPathFactory.newInstance().newXPath().compile("//devices/disk[@device='disk']/source/@file");
NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
String diskFileName = nodes.item(0).getNodeValue();
for (int i = 0; i < nodes.getLength(); i++) {
StorageVol storageVol = from.getConnect().storageVolLookupByPath(diskFileName);
String id = storageVol.getKey();
float size = Long.valueOf(storageVol.getInfo().capacity).floatValue();
volumes.add(new VolumeImpl(id, Volume.Type.LOCAL, size, null, true, false));
}
builder.volumes((List<Volume>) volumes);
} catch (LibvirtException e) {
Throwables.propagate(e);
} catch (XPathExpressionException e) {
Throwables.propagate(e);
} catch (ParserConfigurationException e) {
Throwables.propagate(e);
} catch (SAXException e) {
Throwables.propagate(e);
} catch (IOException e) {
Throwables.propagate(e);
}
return builder.build();
}
}

View File

@ -1,138 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.libvirt.compute.functions;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName;
import java.util.Map;
import java.util.Set;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.jclouds.collect.FindResourceInSet;
import org.jclouds.collect.Memoized;
import org.jclouds.compute.domain.Hardware;
import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.domain.NodeMetadataBuilder;
import org.jclouds.compute.domain.NodeState;
import org.jclouds.compute.domain.OperatingSystemBuilder;
import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location;
import org.libvirt.Domain;
import org.libvirt.DomainInfo;
import org.libvirt.LibvirtException;
import com.google.common.base.Function;
import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableMap;
/**
* @author Adrian Cole
*/
@Singleton
public class DomainToNodeMetadata implements Function<Domain, NodeMetadata> {
public static final Map<DomainInfo.DomainState, NodeState> domainStateToNodeState = ImmutableMap
.<DomainInfo.DomainState, NodeState> builder().put(DomainInfo.DomainState.VIR_DOMAIN_RUNNING,
NodeState.RUNNING)//
.put(DomainInfo.DomainState.VIR_DOMAIN_BLOCKED, NodeState.PENDING)//
.put(DomainInfo.DomainState.VIR_DOMAIN_PAUSED, NodeState.SUSPENDED)//
.put(DomainInfo.DomainState.VIR_DOMAIN_SHUTDOWN, NodeState.SUSPENDED)//
.put(DomainInfo.DomainState.VIR_DOMAIN_SHUTOFF, NodeState.SUSPENDED)//
.put(DomainInfo.DomainState.VIR_DOMAIN_CRASHED, NodeState.ERROR)//
.put(DomainInfo.DomainState.VIR_DOMAIN_NOSTATE, NodeState.UNRECOGNIZED)//
.build();
private final Function<Domain, Hardware> findHardwareForDomain;
private final FindLocationForDomain findLocationForDomain;
private final FindImageForDomain findImageForDomain;
private final Map<String, Credentials> credentialStore;
@Inject
DomainToNodeMetadata(Map<String, Credentials> credentialStore, Function<Domain, Hardware> findHardwareForDomain,
FindLocationForDomain findLocationForDomain, FindImageForDomain findImageForDomain) {
this.credentialStore = checkNotNull(credentialStore, "credentialStore");
this.findHardwareForDomain = checkNotNull(findHardwareForDomain, "findHardwareForDomain");
this.findLocationForDomain = checkNotNull(findLocationForDomain, "findLocationForDomain");
this.findImageForDomain = checkNotNull(findImageForDomain, "findImageForDomain");
}
@Override
public NodeMetadata apply(Domain from) {
// convert the result object to a jclouds NodeMetadata
NodeMetadataBuilder builder = new NodeMetadataBuilder();
try {
builder.id(from.getUUIDString());
builder.providerId(from.getID() + "");
builder.name(from.getName());
builder.location(findLocationForDomain.apply(from));
builder.group(parseGroupFromName(from.getName()));
builder.operatingSystem(new OperatingSystemBuilder().description(from.getOSType()).build());
builder.hardware(findHardwareForDomain.apply(from));
builder.state(domainStateToNodeState.get(from.getInfo().state));
// builder.publicAddresses(ImmutableSet.<String> of(from.publicAddress));
// builder.privateAddresses(ImmutableSet.<String> of(from.privateAddress));
builder.credentials(credentialStore.get("node#" + from.getUUIDString()));
} catch (LibvirtException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return builder.build();
}
@Singleton
public static class FindImageForDomain extends FindResourceInSet<Domain, Image> {
@Inject
public FindImageForDomain(@Memoized Supplier<Set<? extends Image>> hardware) {
super(hardware);
}
@Override
public boolean matches(Domain from, Image input) {
// TODO
// return input.getProviderId().equals(from.imageId + "");
return true;
}
}
@Singleton
public static class FindLocationForDomain extends FindResourceInSet<Domain, Location> {
@Inject
public FindLocationForDomain(@Memoized Supplier<Set<? extends Location>> hardware) {
super(hardware);
}
@Override
public boolean matches(Domain from, Location input) {
// TODO
// return input.getId().equals(from.datacenter + "");
return true;
}
}
}

View File

@ -1,61 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.libvirt.compute.functions;
import javax.annotation.Resource;
import javax.inject.Named;
import javax.inject.Singleton;
import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.ImageBuilder;
import org.jclouds.compute.domain.OperatingSystemBuilder;
import org.jclouds.compute.domain.OsFamily;
import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.logging.Logger;
import com.google.common.base.Function;
/**
* @author Adrian Cole
*/
@Singleton
public class LibvirtImageToImage implements Function<org.jclouds.libvirt.Image, Image> {
@Resource
@Named(ComputeServiceConstants.COMPUTE_LOGGER)
protected Logger logger = Logger.NULL;
@Override
public Image apply(org.jclouds.libvirt.Image from) {
ImageBuilder builder = new ImageBuilder();
builder.ids(from.id + "");
builder.name(from.name);
builder.description(from.name);
OsFamily family = null;
try {
family = OsFamily.fromValue(from.name);
builder.operatingSystem(new OperatingSystemBuilder().name(from.name).family(family).description(from.name).build());
} catch (IllegalArgumentException e) {
logger.debug("<< didn't match os(%s)", from);
}
return builder.build();
}
}

View File

@ -1,282 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.libvirt.compute.strategy;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.jclouds.libvirt.LibvirtConstants.PROPERTY_LIBVIRT_DOMAIN_DIR;
import java.io.IOException;
import java.io.StringReader;
import java.security.SecureRandom;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.UUID;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.jclouds.compute.ComputeService;
import org.jclouds.compute.ComputeServiceAdapter;
import org.jclouds.compute.domain.Template;
import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location;
import org.jclouds.libvirt.Image;
import org.libvirt.Connect;
import org.libvirt.Domain;
import org.libvirt.LibvirtException;
import org.libvirt.StoragePool;
import org.libvirt.StorageVol;
import org.libvirt.jna.Libvirt;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.inject.name.Named;
import com.jamesmurty.utils.XMLBuilder;
/**
* defines the connection between the {@link Libvirt} implementation and the jclouds
* {@link ComputeService}
*
*/
@Singleton
public class LibvirtComputeServiceAdapter implements ComputeServiceAdapter<Domain, Domain, Image, Location> {
private final Connect client;
@Inject
public LibvirtComputeServiceAdapter(Connect client, @Named(PROPERTY_LIBVIRT_DOMAIN_DIR) String domainDir) {
this.client = checkNotNull(client, "client");
System.out.println(domainDir);
}
@Override
public Domain createNodeWithGroupEncodedIntoNameThenStoreCredentials(String tag, String name, Template template,
Map<String, Credentials> credentialStore) {
try {
String domainName = tag;
Domain domain = client.domainLookupByName(domainName);
XMLBuilder builder = XMLBuilder.parse(new InputSource(new StringReader(domain.getXMLDesc(0))));
Document doc = builder.getDocument();
String xpathString = "//devices/disk[@device='disk']/source/@file";
XPathExpression expr = XPathFactory.newInstance().newXPath().compile(xpathString);
NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
String diskFileName = nodes.item(0).getNodeValue();
StorageVol storageVol = client.storageVolLookupByPath(diskFileName);
// cloning volume
String poolName = storageVol.storagePoolLookupByVolume().getName();
StoragePool storagePool = client.storagePoolLookupByName(poolName);
StorageVol clonedVol = null;
boolean cloned = false;
int retry = 0;
while (!cloned && retry < 10) {
try {
clonedVol = cloneVolume(storagePool, storageVol);
cloned = true;
} catch (LibvirtException e) {
retry++;
Thread.sleep(1000);
}
}
// define Domain
String xmlFinal = generateClonedDomainXML(domain.getXMLDesc(0), clonedVol);
Domain newDomain = client.domainDefineXML(xmlFinal);
newDomain.create();
// store the credentials so that later functions can use them
credentialStore.put(domain.getUUIDString() + "", new Credentials("identity", "credential"));
return newDomain;
} catch (LibvirtException e) {
throw Throwables.propagate(e);
} catch (Exception e) {
throw Throwables.propagate(e);
}
}
@Override
public Iterable<Domain> listHardwareProfiles() {
return listNodes();
}
@Override
public Iterable<Image> listImages() {
int i = 1;
try {
String[] domains = client.listDefinedDomains();
List<Image> images = Lists.newArrayList();
for (String domainName : domains) {
images.add(new Image(i++, domainName));
}
return images;
} catch (Exception e) {
throw Throwables.propagate(e);
}
}
@Override
public Iterable<Domain> listNodes() {
try {
List<Domain> domains = Lists.newArrayList();
for (String domain : client.listDefinedDomains()) {
domains.add(client.domainLookupByName(domain));
}
return domains;
} catch (LibvirtException e) {
throw Throwables.propagate(e);
}
}
@Override
public Iterable<Location> listLocations() {
return ImmutableSet.of();
}
@Override
public Domain getNode(String id) {
Domain d = null;
try {
d = client.domainLookupByUUIDString(id);
} catch (LibvirtException e) {
if (e.getMessage().indexOf("Domain not found: no domain with matching uuid") != -1)
return null;
Throwables.propagate(e);
}
return d;
}
@Override
public void destroyNode(String id) {
try {
client.domainLookupByUUIDString(id).destroy();
XMLBuilder builder = XMLBuilder.parse(new InputSource(new StringReader(client.domainLookupByUUIDString(id)
.getXMLDesc(0))));
String diskFileName = builder.xpathFind("//devices/disk[@device='disk']/source").getElement().getAttribute(
"file");
StorageVol storageVol = client.storageVolLookupByPath(diskFileName);
storageVol.delete(0);
client.domainLookupByUUIDString(id).undefine();
} catch (LibvirtException e) {
Throwables.propagate(e);
} catch (Exception e) {
Throwables.propagate(e);
}
}
@Override
public void rebootNode(String id) {
try {
client.domainLookupByUUIDString(id).reboot(0);
} catch (LibvirtException e) {
Throwables.propagate(e);
}
}
private static StorageVol cloneVolume(StoragePool storagePool, StorageVol from) throws LibvirtException,
XPathExpressionException, ParserConfigurationException, SAXException, IOException, TransformerException {
return storagePool.storageVolCreateXMLFrom(generateClonedVolumeXML(from.getXMLDesc(0)), from, 0);
}
@Override
public void resumeNode(String id) {
try {
client.domainLookupByUUIDString(id).resume();
} catch (LibvirtException e) {
Throwables.propagate(e);
}
}
@Override
public void suspendNode(String id) {
try {
client.domainLookupByUUIDString(id).suspend();
} catch (LibvirtException e) {
Throwables.propagate(e);
}
}
private static String generateClonedVolumeXML(String fromXML) throws ParserConfigurationException, SAXException,
IOException, XPathExpressionException, TransformerException {
Properties outputProperties = generateOutputXMLProperties();
XMLBuilder builder = XMLBuilder.parse(new InputSource(new StringReader(fromXML)));
String nodeNamingConvention = "%s-%s";
String tag = "-clone";
String suffix = String.format(nodeNamingConvention, tag, Integer.toHexString(new SecureRandom().nextInt(4095)));
builder.xpathFind("//volume/name").t(suffix);
builder.xpathFind("//volume/key").t(suffix);
builder.xpathFind("//volume/target/path").t(suffix);
return builder.asString(outputProperties);
}
private static String generateClonedDomainXML(String fromXML, StorageVol clonedVol)
throws ParserConfigurationException, SAXException, IOException, XPathExpressionException,
TransformerException, LibvirtException {
Properties outputProperties = generateOutputXMLProperties();
XMLBuilder builder = XMLBuilder.parse(new InputSource(new StringReader(fromXML)));
String nodeNamingConvention = "%s-%s";
String tag = "-clone";
String suffix = String.format(nodeNamingConvention, tag, Integer.toHexString(new SecureRandom().nextInt(4095)));
builder.xpathFind("//domain/name").t(suffix);
// change uuid domain
Element oldChild = builder.xpathFind("//domain/uuid").getElement();
Node newNode = oldChild.cloneNode(true);
newNode.getFirstChild().setNodeValue(UUID.randomUUID().toString());
builder.getDocument().getDocumentElement().replaceChild(newNode, oldChild);
// String fromVolPath =
// builder.xpathFind("//domain/devices/disk/source").getElement().getAttribute("file");
builder.xpathFind("//domain/devices/disk/source").a("file", clonedVol.getPath());
// generate valid MAC address
String fromMACaddress = builder.xpathFind("//domain/devices/interface/mac").getElement().getAttribute("address");
String lastMACoctet = Integer.toHexString(new SecureRandom().nextInt(255));
builder.xpathFind("//domain/devices/interface/mac").a("address",
fromMACaddress.substring(0, fromMACaddress.lastIndexOf(":") + 1) + lastMACoctet);
return builder.asString(outputProperties);
}
private static Properties generateOutputXMLProperties() {
Properties outputProperties = new Properties();
// Explicitly identify the output as an XML document
outputProperties.put(javax.xml.transform.OutputKeys.METHOD, "xml");
// Pretty-print the XML output (doesn't work in all cases)
outputProperties.put(javax.xml.transform.OutputKeys.INDENT, "yes");
// Get 2-space indenting when using the Apache transformer
outputProperties.put("{http://xml.apache.org/xslt}indent-amount", "2");
return outputProperties;
}
}

View File

@ -1,76 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.libvirt.compute;
import static org.testng.Assert.assertEquals;
import java.util.Properties;
import org.jclouds.compute.ComputeServiceContext;
import org.jclouds.compute.ComputeServiceContextFactory;
import org.jclouds.rest.RestContext;
import org.libvirt.Connect;
import org.testng.annotations.Test;
/**
*
* @author Adrian Cole
*
*/
@Test(groups = "unit")
public class LibvirtComputeServiceContextBuilderTest {
@Test
public void testCanBuildWithComputeService() {
ComputeServiceContext context = new ComputeServiceContextFactory()
.createContext(new LibvirtComputeServiceContextSpec("test:///default", "identity", "credential"));
// System.err.println(context.getComputeService().
context.close();
}
@Test
public void testCanBuildWithRestProperties() {
Properties restProperties = new Properties();
restProperties.setProperty("libvirt.contextbuilder", LibvirtComputeServiceContextBuilder.class.getName());
restProperties.setProperty("libvirt.propertiesbuilder", LibvirtPropertiesBuilder.class.getName());
restProperties.setProperty("libvirt.endpoint", "test:///default");
ComputeServiceContext context = new ComputeServiceContextFactory(restProperties).createContext("libvirt",
"identity", "credential");
context.close();
}
@Test
public void testProviderSpecificContextIsCorrectType() {
Properties restProperties = new Properties();
restProperties.setProperty("libvirt.contextbuilder", LibvirtComputeServiceContextBuilder.class.getName());
restProperties.setProperty("libvirt.propertiesbuilder", LibvirtPropertiesBuilder.class.getName());
restProperties.setProperty("libvirt.endpoint", "test:///default");
ComputeServiceContext context = new ComputeServiceContextFactory(restProperties).createContext("libvirt",
"identity", "credential");
RestContext<Connect, Connect> providerContext = context.getProviderSpecificContext();
assertEquals(providerContext.getApi().getClass(), Connect.class);
context.close();
}
}

View File

@ -1,73 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.libvirt.compute;
import static org.jclouds.compute.util.ComputeServiceUtils.getCores;
import static org.testng.Assert.assertEquals;
import java.util.Properties;
import org.jclouds.compute.BaseComputeServiceLiveTest;
import org.jclouds.compute.ComputeServiceContextFactory;
import org.jclouds.compute.domain.OsFamily;
import org.jclouds.compute.domain.Template;
import org.jclouds.rest.RestContext;
import org.jclouds.ssh.jsch.config.JschSshClientModule;
import org.libvirt.Connect;
import org.testng.annotations.Test;
/**
* @author Adrian Cole
*/
@Test(groups = "live", enabled = true, sequential = true)
public class LibvirtComputeServiceLiveTest extends BaseComputeServiceLiveTest {
public LibvirtComputeServiceLiveTest() {
provider = "libvirt";
}
@Override
protected Properties setupRestProperties() {
Properties restProperties = new Properties();
restProperties.setProperty("libvirt.contextbuilder", LibvirtComputeServiceContextBuilder.class.getName());
restProperties.setProperty("libvirt.propertiesbuilder", LibvirtPropertiesBuilder.class.getName());
restProperties.setProperty("libvirt.endpoint", "test:///default");
return restProperties;
}
@Test
public void testTemplateBuilder() {
Template defaultTemplate = client.templateBuilder().build();
assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true);
assertEquals(defaultTemplate.getImage().getOperatingSystem().getVersion(), "5.3");
assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.CENTOS);
assertEquals(defaultTemplate.getLocation().getId(), "1");
assertEquals(getCores(defaultTemplate.getHardware()), 0.5d);
}
@Override
protected JschSshClientModule getSshModule() {
return new JschSshClientModule();
}
public void testAssignability() throws Exception {
@SuppressWarnings("unused")
RestContext<Connect, Connect> goGridContext = new ComputeServiceContextFactory().createContext(provider,
identity, credential).getProviderSpecificContext();
}
}

View File

@ -1,95 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.libvirt.compute;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Set;
import org.jclouds.compute.ComputeServiceContext;
import org.jclouds.compute.ComputeServiceContextFactory;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.domain.Template;
import org.jclouds.libvirt.compute.LibvirtComputeServiceContextSpec;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
/**
*
* @author Adrian Cole
*/
@Test(groups = "live")
public class LibvirtExperimentLiveTest {
protected String provider = "libvirt";
protected String identity;
protected String credential;
protected String endpoint;
protected String apiVersion;
@BeforeClass
protected void setupCredentials() {
identity = checkNotNull(System.getProperty("test." + provider + ".identity"), "test." + provider + ".identity");
credential = System.getProperty("test." + provider + ".credential");
endpoint = System.getProperty("test." + provider + ".endpoint");
apiVersion = System.getProperty("test." + provider + ".api-version");
}
@Test
public void testAndExperiment() {
ComputeServiceContext context = null;
try {
context = new ComputeServiceContextFactory().createContext(new LibvirtComputeServiceContextSpec(
"qemu:///system", "identity", "credential"));
/*
* /* System.out.println("images " + context.getComputeService().listImages());
* System.out.println("nodes " + context.getComputeService().listNodes());
* System.out.println("hardware profiles " +
* context.getComputeService().listHardwareProfiles());
*/
/* Template defaultTemplate = context.getComputeService().templateBuilder()
.hardwareId("d106ae67-5a1b-8f91-b311-83c93bcb0a1f").imageId("1") //.locationId("")
.build();*/
/*
* We will probably make a default template out of properties at some point You can control
* the default template via overriding a method in standalonecomputeservicexontextmodule
*/
Set<? extends NodeMetadata> nodeMetadataSet = context.getComputeService().createNodesInGroup("tty", 1);
for (NodeMetadata nodeMetadata : nodeMetadataSet) {
/*
* context.getComputeService().suspendNode(nodeMetadata.getId());
* context.getComputeService().resumeNode(nodeMetadata.getId());
*/
context.getComputeService().destroyNode(nodeMetadata.getId());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (context != null)
context.close();
}
}
}

View File

@ -1,117 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<!--
For more configuration infromation and examples see the Apache
Log4j website: http://logging.apache.org/log4j/
-->
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
debug="false">
<!-- A time/date based rolling appender -->
<appender name="WIREFILE" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="target/test-data/jclouds-wire.log" />
<param name="Append" value="true" />
<!-- Rollover at midnight each day -->
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<param name="Threshold" value="TRACE" />
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message\n -->
<param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
<!--
The full pattern: Date MS Priority [Category]
(Thread:NDC) Message\n <param name="ConversionPattern"
value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
-->
</layout>
</appender>
<!-- A time/date based rolling appender -->
<appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="target/test-data/jclouds.log" />
<param name="Append" value="true" />
<!-- Rollover at midnight each day -->
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<param name="Threshold" value="TRACE" />
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message\n -->
<param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
<!--
The full pattern: Date MS Priority [Category]
(Thread:NDC) Message\n <param name="ConversionPattern"
value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
-->
</layout>
</appender>
<!-- A time/date based rolling appender -->
<appender name="COMPUTEFILE" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="target/test-data/jclouds-compute.log" />
<param name="Append" value="true" />
<!-- Rollover at midnight each day -->
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<param name="Threshold" value="TRACE" />
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message\n -->
<param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
<!--
The full pattern: Date MS Priority [Category]
(Thread:NDC) Message\n <param name="ConversionPattern"
value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
-->
</layout>
</appender>
<appender name="ASYNCCOMPUTE" class="org.apache.log4j.AsyncAppender">
<appender-ref ref="COMPUTEFILE" />
</appender>
<appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
<appender-ref ref="FILE" />
</appender>
<appender name="ASYNCWIRE" class="org.apache.log4j.AsyncAppender">
<appender-ref ref="WIREFILE" />
</appender>
<!-- ================ -->
<!-- Limit categories -->
<!-- ================ -->
<category name="org.jclouds">
<priority value="DEBUG" />
<appender-ref ref="ASYNC" />
</category>
<category name="jclouds.headers">
<priority value="DEBUG" />
<appender-ref ref="ASYNCWIRE" />
</category>
<category name="jclouds.wire">
<priority value="DEBUG" />
<appender-ref ref="ASYNCWIRE" />
</category>
<category name="jclouds.compute">
<priority value="TRACE" />
<appender-ref ref="ASYNCCOMPUTE" />
</category>
<!-- ======================= -->
<!-- Setup the Root category -->
<!-- ======================= -->
<root>
<priority value="DEBUG" />
</root>
</log4j:configuration>

View File

@ -1,25 +0,0 @@
====
Licensed to jclouds, Inc. (jclouds) under one or more
contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. jclouds 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.
====
#
# The jclouds provider for the Nirvanix Storage Delivery Network (http://www.nirvanix.com/products-services/storage-delivery-network/index.aspx).
#
# TODO: Implementation status.
# TODO: Supported features.
# TODO: Usage example.

View File

@ -1,126 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to jclouds, Inc. (jclouds) under one or more
contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. jclouds 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.
-->
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.jclouds</groupId>
<artifactId>jclouds-project</artifactId>
<version>1.6.0-SNAPSHOT</version>
<relativePath>../../project/pom.xml</relativePath>
</parent>
<groupId>org.jclouds.provider</groupId>
<artifactId>nirvanix</artifactId>
<name>jclouds nirvanix storage delivery network core</name>
<description>jclouds Core components to access nirvanix nirvanix</description>
<packaging>bundle</packaging>
<!-- bootstrapping: need to fetch the project POM -->
<repositories>
<repository>
<id>jclouds-sona-snapshots-nexus</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<properties>
<test.nirvanix.endpoint>http://services.nirvanix.com</test.nirvanix.endpoint>
<test.nirvanix.api-version>2.5.6</test.nirvanix.api-version>
<test.nirvanix.build-version></test.nirvanix.build-version>
<test.nirvanix.identity>FIXME</test.nirvanix.identity>
<test.nirvanix.credential> FIXME </test.nirvanix.credential>
<jclouds.osgi.export>org.jclouds.nirvanix.sdn*;version="${project.version}"</jclouds.osgi.export>
<jclouds.osgi.import>org.jclouds*;version="${project.version}",*</jclouds.osgi.import>
</properties>
<dependencies>
<dependency>
<groupId>org.jclouds</groupId>
<artifactId>jclouds-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.jclouds</groupId>
<artifactId>jclouds-core</artifactId>
<version>${project.version}</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jclouds</groupId>
<artifactId>jclouds-blobstore</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.jclouds</groupId>
<artifactId>jclouds-blobstore</artifactId>
<version>${project.version}</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jclouds.driver</groupId>
<artifactId>jclouds-log4j</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<profiles>
<profile>
<id>live</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<executions>
<execution>
<id>integration</id>
<phase>integration-test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<systemPropertyVariables>
<test.nirvanix.endpoint>${test.nirvanix.endpoint}</test.nirvanix.endpoint>
<test.nirvanix.api-version>${test.nirvanix.api-version}</test.nirvanix.api-version>
<test.nirvanix.build-version>${test.nirvanix.build-version}</test.nirvanix.build-version>
<test.nirvanix.identity>${test.nirvanix.identity}</test.nirvanix.identity>
<test.nirvanix.credential>${test.nirvanix.credential}</test.nirvanix.credential>
</systemPropertyVariables>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>

View File

@ -1,112 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.nirvanix.sdn;
import java.net.URI;
import java.util.Map;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.QueryParam;
import org.jclouds.blobstore.binders.BindBlobToMultipartForm;
import org.jclouds.blobstore.domain.Blob;
import org.jclouds.nirvanix.sdn.binders.BindMetadataToQueryParams;
import org.jclouds.nirvanix.sdn.domain.UploadInfo;
import org.jclouds.nirvanix.sdn.filters.AddSessionTokenToRequest;
import org.jclouds.nirvanix.sdn.filters.InsertUserContextIntoPath;
import org.jclouds.nirvanix.sdn.functions.ParseMetadataFromJsonResponse;
import org.jclouds.nirvanix.sdn.functions.ParseUploadInfoFromJsonResponse;
import org.jclouds.nirvanix.sdn.reference.SDNQueryParams;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.EndpointParam;
import org.jclouds.rest.annotations.OverrideRequestFilters;
import org.jclouds.rest.annotations.QueryParams;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.ResponseParser;
import org.jclouds.rest.annotations.SkipEncoding;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.inject.Provides;
/**
* Provides asynchronous access to Nirvanix SDN resources via their REST API.
* <p/>
*
* @see SDNClient
* @see <a href="http://developer.nirvanix.com/sitefiles/1000/API.html" />
* @author Adrian Cole
*/
@RequestFilters(AddSessionTokenToRequest.class)
@SkipEncoding( { '/', ':' })
@QueryParams(keys = SDNQueryParams.OUTPUT, values = "json")
public interface SDNAsyncClient {
@Provides
public Blob newBlob();
/**
* @see SDNClient#getStorageNode
*/
@GET
@Path("/ws/IMFS/GetStorageNode.ashx")
@ResponseParser(ParseUploadInfoFromJsonResponse.class)
ListenableFuture<UploadInfo> getStorageNode(
@QueryParam(SDNQueryParams.DESTFOLDERPATH) String folderPath,
@QueryParam(SDNQueryParams.SIZEBYTES) long size);
/**
* @see SDNClient#upload
*/
@POST
@Path("/Upload.ashx")
ListenableFuture<Void> upload(@EndpointParam URI endpoint,
@QueryParam(SDNQueryParams.UPLOADTOKEN) String uploadToken,
@QueryParam(SDNQueryParams.DESTFOLDERPATH) String folderPath,
@BinderParam(BindBlobToMultipartForm.class) Blob blob);
/**
* @see SDNClient#setMetadata
*/
@GET
@Path("/ws/Metadata/SetMetadata.ashx")
@QueryParams(keys = SDNQueryParams.PATH, values = "{path}")
ListenableFuture<Void> setMetadata(@PathParam("path") String path,
@BinderParam(BindMetadataToQueryParams.class) Map<String, String> metadata);
/**
* @see SDNClient#getMetadata
*/
@GET
@Path("/ws/Metadata/GetMetadata.ashx")
@ResponseParser(ParseMetadataFromJsonResponse.class)
@QueryParams(keys = SDNQueryParams.PATH, values = "{path}")
ListenableFuture<Map<String, String>> getMetadata(@PathParam("path") String path);
/**
* @see SDNClient#getFile
*/
@GET
@Path("/{path}")
@OverrideRequestFilters
@RequestFilters(InsertUserContextIntoPath.class)
ListenableFuture<String> getFile(@PathParam("path") String path);
}

View File

@ -1,53 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.nirvanix.sdn;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
import org.jclouds.nirvanix.sdn.functions.ParseSessionTokenFromJsonResponse;
import org.jclouds.nirvanix.sdn.reference.SDNQueryParams;
import org.jclouds.rest.annotations.QueryParams;
import org.jclouds.rest.annotations.ResponseParser;
import com.google.common.util.concurrent.ListenableFuture;
/**
* Provides asynchronous access to Nirvanix SDN resources via their REST API.
* <p/>
*
* @see <a href="http://developer.nirvanix.com/sitefiles/1000/API.html" />
* @author Adrian Cole
*/
@QueryParams(keys = SDNQueryParams.OUTPUT, values = "json")
public interface SDNAuthAsyncClient {
public interface AuthenticationResponse {
@SessionToken
String getSessionToken();
}
@GET
@ResponseParser(ParseSessionTokenFromJsonResponse.class)
@Path("/ws/Authentication/Login.ashx")
ListenableFuture<String> authenticate(@QueryParam(SDNQueryParams.APPKEY) String appKey,
@QueryParam(SDNQueryParams.USERNAME) String user,
@QueryParam(SDNQueryParams.PASSWORD) String password);
}

View File

@ -1,67 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.nirvanix.sdn;
import java.net.URI;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.jclouds.blobstore.domain.Blob;
import org.jclouds.concurrent.Timeout;
import org.jclouds.nirvanix.sdn.domain.UploadInfo;
import com.google.inject.Provides;
/**
* Provides access to Nirvanix SDN resources via their REST API.
* <p/>
*
* @see <a href="http://developer.nirvanix.com/sitefiles/1000/API.html" />
* @see SDNAsyncClient
* @author Adrian Cole
*/
@Timeout(duration = 30, timeUnit = TimeUnit.SECONDS)
public interface SDNClient {
@Provides
public Blob newBlob();
/**
* The GetStorageNode method is used to determine which storage node a file should be uploaded
* to. It returns the host to upload to and an Upload Token that will be used to authenticate.
*/
UploadInfo getStorageNode(String folderPath, long size);
void upload(URI endpoint, String uploadToken, String folderPath, Blob blob);
/**
* The SetMetadata method is used to set specified metadata for a file or folder.
*/
void setMetadata(String path, Map<String, String> metadata);
/**
* The GetMetadata method is used to retrieve all metadata from a file or folder.
*/
Map<String, String> getMetadata(String path);
/**
* Get the contents of a file
*/
String getFile(String path);
}

View File

@ -1,46 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.nirvanix.sdn;
import java.util.List;
import java.util.Properties;
import org.jclouds.nirvanix.sdn.config.SDNAuthRestClientModule;
import org.jclouds.nirvanix.sdn.config.SDNRestClientModule;
import org.jclouds.rest.RestContextBuilder;
import com.google.inject.Module;
/**
*
* @author Adrian Cole
*/
public class SDNContextBuilder extends RestContextBuilder<SDNClient, SDNAsyncClient> {
public SDNContextBuilder(Properties props) {
super(SDNClient.class, SDNAsyncClient.class, props);
}
@Override
protected void addClientModule(List<Module> modules) {
modules.add(new SDNAuthRestClientModule());
modules.add(new SDNRestClientModule());
}
}

View File

@ -1,45 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.nirvanix.sdn;
import java.util.Properties;
import org.jclouds.Constants;
import org.jclouds.PropertiesBuilder;
/**
* Builds properties used in SDN Clients
*
* @author Adrian Cole
*/
public class SDNPropertiesBuilder extends PropertiesBuilder {
@Override
protected Properties defaultProperties() {
Properties properties = super.defaultProperties();
properties.setProperty(Constants.PROPERTY_API_VERSION, "2.5.6");
properties.setProperty(Constants.PROPERTY_ENDPOINT, "http://services.nirvanix.com");
return properties;
}
public SDNPropertiesBuilder(Properties properties) {
super(properties);
}
}

View File

@ -1,39 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.nirvanix.sdn;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
/**
* Related to a SDN resource.
*
* @author Adrian Cole
*
*/
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = { ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Qualifier
public @interface SessionToken {
}

View File

@ -1,58 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.nirvanix.sdn.binders;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import javax.ws.rs.core.UriBuilder;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.utils.ModifyRequest;
import org.jclouds.rest.Binder;
import com.google.common.collect.Lists;
@Singleton
public class BindMetadataToQueryParams implements Binder {
private final Provider<UriBuilder> builder;
@Inject
BindMetadataToQueryParams(Provider<UriBuilder> builder) {
this.builder = builder;
}
@SuppressWarnings("unchecked")
public <R extends HttpRequest> R bindToRequest(R request, Object input) {
checkArgument(checkNotNull(input, "input") instanceof Map, "this binder is only valid for Maps!");
Map<String, String> userMetadata = (Map<String, String>) input;
List<String> metadata = Lists.newArrayList();
for (Entry<String, String> entry : userMetadata.entrySet()) {
metadata.add(String.format("%s:%s", entry.getKey().toLowerCase(), entry.getValue()));
}
return ModifyRequest.addQueryParam(request, "metadata", metadata, builder.get());
}
}

View File

@ -1,97 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.nirvanix.sdn.config;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import javax.inject.Named;
import javax.inject.Singleton;
import org.jclouds.Constants;
import org.jclouds.http.RequiresHttp;
import org.jclouds.nirvanix.sdn.SDNAuthAsyncClient;
import org.jclouds.nirvanix.sdn.SessionToken;
import org.jclouds.nirvanix.sdn.reference.SDNConstants;
import org.jclouds.rest.AsyncClientFactory;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
/**
* Configures the SDN authentication service connection, including logging and http transport.
*
* @author Adrian Cole
*/
@RequiresHttp
public class SDNAuthRestClientModule extends AbstractModule {
@Override
protected void configure() {
}
@Provides
@Singleton
@Named(SDNConstants.PROPERTY_SDN_APPKEY)
public String credentials1(@Named(Constants.PROPERTY_IDENTITY) String identity) {
List<String> parts = Lists.newArrayList(Splitter.on('/').split(identity));
if (parts.size() != 3) {
throw new IllegalArgumentException("identity syntax is appkey/appname/username");
}
return parts.get(0);
}
@Provides
@Singleton
@Named(SDNConstants.PROPERTY_SDN_APPNAME)
public String credentials2(@Named(Constants.PROPERTY_IDENTITY) String identity) {
List<String> parts = Lists.newArrayList(Splitter.on('/').split(identity));
if (parts.size() != 3) {
throw new IllegalArgumentException("identity syntax is appkey/appname/username");
}
return parts.get(1);
}
@Provides
@Singleton
@Named(SDNConstants.PROPERTY_SDN_USERNAME)
public String credentials3(@Named(Constants.PROPERTY_IDENTITY) String identity) {
List<String> parts = Lists.newArrayList(Splitter.on('/').split(identity));
if (parts.size() != 3) {
throw new IllegalArgumentException("identity syntax is appkey/appname/username");
}
return parts.get(2);
}
@Provides
@SessionToken
protected String provideSessionToken(AsyncClientFactory factory,
@Named(SDNConstants.PROPERTY_SDN_APPKEY) String appKey,
@Named(SDNConstants.PROPERTY_SDN_USERNAME) String username,
@Named(Constants.PROPERTY_CREDENTIAL) String password) throws InterruptedException,
ExecutionException, TimeoutException {
return factory.create(SDNAuthAsyncClient.class).authenticate(appKey, username, password).get(
20, TimeUnit.SECONDS);
}
}

View File

@ -1,50 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.nirvanix.sdn.config;
import org.jclouds.blobstore.config.BlobStoreObjectModule;
import org.jclouds.http.RequiresHttp;
import org.jclouds.nirvanix.sdn.SDNAsyncClient;
import org.jclouds.nirvanix.sdn.SDNClient;
import org.jclouds.rest.config.RestClientModule;
/**
* Configures the SDN authentication service connection, including logging and http transport.
*
* @author Adrian Cole
*/
@RequiresHttp
public class SDNRestClientModule extends RestClientModule<SDNClient, SDNAsyncClient> {
public SDNRestClientModule() {
super(SDNClient.class, SDNAsyncClient.class);
}
@Override
protected void configure() {
install(new BlobStoreObjectModule());
super.configure();
}
@Override
protected void bindRetryHandlers() {
// TODO retry on 401 by AuthenticateRequest.update()
}
}

View File

@ -1,40 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.nirvanix.sdn.domain;
import java.net.URI;
public class UploadInfo {
private final String token;
private final URI host;
public UploadInfo(String token, URI host) {
this.token = token;
this.host = host;
}
public String getToken() {
return token;
}
public URI getHost() {
return host;
}
}

View File

@ -1,95 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.nirvanix.sdn.filters;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import javax.ws.rs.core.UriBuilder;
import com.google.commons.util.concurrent.Atomitcs;
import org.jclouds.http.HttpException;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.HttpRequestFilter;
import org.jclouds.http.utils.ModifyRequest;
import org.jclouds.nirvanix.sdn.SessionToken;
import org.jclouds.nirvanix.sdn.reference.SDNQueryParams;
/**
* Adds the Session Token to the request. This will update the Session Token before 20 minutes is
* up.
*
* @author Adrian Cole
*
*/
@Singleton
public class AddSessionTokenToRequest implements HttpRequestFilter {
private final Provider<String> authTokenProvider;
private final Provider<UriBuilder> builder;
public final long BILLION = 1000000000;
public final long MINUTES = 60 * BILLION;
private final AtomicReference<String> authToken;
private final AtomicLong trigger = new AtomicLong(0);
/**
* Start the time update service. Nirvanix clocks need to be 20 minutes of the session token.
* This is not performed per-request, as creation of the token is a slow, synchronized command.
*/
synchronized void updateIfTimeOut() {
if (trigger.get() - System.nanoTime() <= 0) {
createNewToken();
}
}
// this is a hotspot when submitted concurrently, so be lazy.
// session tokens expire in 20 minutes of no use, but let's be a little paranoid and go 19
public String createNewToken() {
authToken.set(authTokenProvider.get());
trigger.set(System.nanoTime() + System.nanoTime() + 19 * MINUTES);
return authToken.get();
}
public String getSessionToken() {
updateIfTimeOut();
return authToken.get();
}
@Inject
public AddSessionTokenToRequest(@SessionToken Provider<String> authTokenProvider, Provider<UriBuilder> builder) {
this.builder = builder;
this.authTokenProvider = authTokenProvider;
authToken = Atomics.newReference();
}
@Override
public HttpRequest filter(HttpRequest request) throws HttpException {
return ModifyRequest.addQueryParam(request, SDNQueryParams.SESSIONTOKEN, getSessionToken(), builder.get());
}
}

View File

@ -1,71 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.nirvanix.sdn.filters;
import java.net.URI;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Provider;
import javax.inject.Singleton;
import javax.ws.rs.core.UriBuilder;
import org.jclouds.http.HttpException;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.HttpRequestFilter;
import org.jclouds.nirvanix.sdn.reference.SDNConstants;
/**
* Adds the Session Token to the request. This will update the Session Token before 20 minutes is
* up.
*
* @author Adrian Cole
*
*/
@Singleton
public class InsertUserContextIntoPath implements HttpRequestFilter {
private final AddSessionTokenToRequest sessionManager;
private final String pathPrefix;
private final Provider<UriBuilder> builder;
@Inject
public InsertUserContextIntoPath(AddSessionTokenToRequest sessionManager,
@Named(SDNConstants.PROPERTY_SDN_APPNAME) String appname,
@Named(SDNConstants.PROPERTY_SDN_USERNAME) String username, Provider<UriBuilder> builder) {
this.builder = builder;
this.sessionManager = sessionManager;
this.pathPrefix = String.format("/%s/%s/", appname, username);
}
@Override
public HttpRequest filter(HttpRequest request) throws HttpException {
String sessionToken = sessionManager.getSessionToken();
int prefixIndex = request.getEndpoint().getPath().indexOf(pathPrefix);
String path;
if (prefixIndex == -1) { // addToken
path = "/" + sessionToken + pathPrefix + request.getEndpoint().getPath().substring(1);
} else { // replace token
path = "/" + sessionToken + request.getEndpoint().getPath().substring(prefixIndex);
}
URI newEndpoint = builder.get().uri(request.getEndpoint()).replacePath(path).build();
return request.toBuilder().endpoint(newEndpoint).build();
}
}

View File

@ -1,67 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.nirvanix.sdn.functions;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.jclouds.http.HttpResponse;
import org.jclouds.http.functions.ParseJson;
import com.google.common.base.Function;
import com.google.common.collect.Maps;
/**
* This parses a Map of Metadata from a Nirvanix response
*
* @author Adrian Cole
*/
@Singleton
public class ParseMetadataFromJsonResponse implements
Function<HttpResponse, Map<String, String>> {
private final ParseJson<Response> json;
@Inject
ParseMetadataFromJsonResponse(ParseJson<Response> json) {
this.json = json;
}
@Override
public Map<String, String> apply(HttpResponse arg0) {
Response response = json.apply(arg0);
if (response.ResponseCode == null || response.ResponseCode != 0)
throw new RuntimeException("bad response code: "
+ response.ResponseCode);
Map<String, String> metadata = Maps.newHashMap();
for (Map<String, String> keyValue : response.Metadata) {
metadata.put(keyValue.get("Type"), keyValue.get("Value"));
}
return metadata;
}
private static class Response {
Integer ResponseCode;
List<Map<String, String>> Metadata;
}
}

View File

@ -1,58 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.nirvanix.sdn.functions;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.jclouds.http.HttpResponse;
import org.jclouds.http.functions.ParseJson;
import com.google.common.base.Function;
/**
* This parses the Nirvanix SessionToken from a gson string.
*
* @author Adrian Cole
*/
@Singleton
public class ParseSessionTokenFromJsonResponse implements
Function<HttpResponse, String> {
private final ParseJson<Response> json;
@Inject
ParseSessionTokenFromJsonResponse(ParseJson<Response> json) {
this.json = json;
}
@Override
public String apply(HttpResponse arg0) {
Response response = json.apply(arg0);
if (response.ResponseCode == null || response.ResponseCode != 0)
throw new RuntimeException("bad response code: "
+ response.ResponseCode);
return response.SessionToken;
}
private static class Response {
Integer ResponseCode;
String SessionToken;
}
}

View File

@ -1,65 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.nirvanix.sdn.functions;
import java.net.URI;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.jclouds.http.HttpResponse;
import org.jclouds.http.functions.ParseJson;
import org.jclouds.nirvanix.sdn.domain.UploadInfo;
import com.google.common.base.Function;
/**
* This parses the Nirvanix Upload host and token from a gson string.
*
* @see UploadInfo
* @author Adrian Cole
*/
@Singleton
public class ParseUploadInfoFromJsonResponse implements
Function<HttpResponse, UploadInfo> {
private final ParseJson<Response> json;
@Inject
ParseUploadInfoFromJsonResponse(ParseJson<Response> json) {
this.json = json;
}
@Override
public UploadInfo apply(HttpResponse arg0) {
Response response = json.apply(arg0);
if (response.ResponseCode == null || response.ResponseCode != 0)
throw new RuntimeException("bad response code: "
+ response.ResponseCode);
return new UploadInfo(response.GetStorageNode.get("UploadToken"), URI
.create("https://" + response.GetStorageNode.get("UploadHost")));
}
private static class Response {
Integer ResponseCode;
Map<String, String> GetStorageNode;
}
}

View File

@ -1,30 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.nirvanix.sdn.reference;
/**
* Configuration properties and constants used in SDN connections.
*
* @author Adrian Cole
*/
public interface SDNConstants {
public static final String PROPERTY_SDN_USERNAME = "jclouds.nirvanix.sdn.username";
public static final String PROPERTY_SDN_APPKEY = "jclouds.nirvanix.sdn.appkey";
public static final String PROPERTY_SDN_APPNAME = "jclouds.nirvanix.sdn.appname";
}

View File

@ -1,38 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.nirvanix.sdn.reference;
/**
* Query parameters common to SDN apis.
*
* @see <a href="http://developer.nirvanix.com/sitefiles/1000/API.html" />
* @author Adrian Cole
*
*/
public interface SDNQueryParams {
public static final String USERNAME = "username";
public static final String PASSWORD = "password";
public static final String APPKEY = "appKey";
public static final String OUTPUT = "output";
public static final String SESSIONTOKEN = "sessionToken";
public static final String DESTFOLDERPATH = "destFolderPath";
public static final String PATH = "path";
public static final String SIZEBYTES = "sizeBytes";
public static final String UPLOADTOKEN = "uploadToken";
}

View File

@ -1,188 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.nirvanix.sdn;
import static org.testng.Assert.assertEquals;
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URI;
import java.util.Map;
import java.util.Properties;
import org.jclouds.blobstore.binders.BindBlobToMultipartFormTest;
import org.jclouds.blobstore.domain.Blob;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.RequiresHttp;
import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.http.functions.ReturnStringIf2xx;
import org.jclouds.nirvanix.sdn.config.SDNRestClientModule;
import org.jclouds.nirvanix.sdn.filters.AddSessionTokenToRequest;
import org.jclouds.nirvanix.sdn.filters.InsertUserContextIntoPath;
import org.jclouds.nirvanix.sdn.functions.ParseMetadataFromJsonResponse;
import org.jclouds.nirvanix.sdn.functions.ParseUploadInfoFromJsonResponse;
import org.jclouds.nirvanix.sdn.reference.SDNConstants;
import org.jclouds.rest.ConfiguresRestClient;
import org.jclouds.rest.RestClientTest;
import org.jclouds.rest.RestContextFactory;
import org.jclouds.rest.RestContextSpec;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
import com.google.inject.Module;
import com.google.inject.TypeLiteral;
import com.google.inject.name.Names;
/**
* Tests behavior of {@code JaxrsAnnotationProcessor}
*
* @author Adrian Cole
*/
@Test(groups = "unit", testName = "sdn.SDNClient")
public class SDNAsyncClientTest extends RestClientTest<SDNAsyncClient> {
public void testGetStorageNode() throws SecurityException, NoSuchMethodException, IOException {
Method method = SDNAsyncClient.class.getMethod("getStorageNode", String.class, long.class);
GeneratedHttpRequest request = processor.createRequest(method, "adriansmovies", 734859264);
assertRequestLineEquals(
request,
"GET http://services.nirvanix.com/ws/IMFS/GetStorageNode.ashx?output=json&destFolderPath=adriansmovies&sizeBytes=734859264 HTTP/1.1");
assertNonPayloadHeadersEqual(request, "");
assertPayloadEquals(request, null, null, false);
assertResponseParserClassEquals(method, request, ParseUploadInfoFromJsonResponse.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, null);
checkFilters(request);
}
public void testUpload() throws SecurityException, NoSuchMethodException, IOException {
Method method = SDNAsyncClient.class.getMethod("upload", URI.class, String.class, String.class, Blob.class);
Blob blob = BindBlobToMultipartFormTest.TEST_BLOB;
GeneratedHttpRequest request = processor.createRequest(method, URI.create("http://uploader"), "token", "adriansmovies",
blob);
assertRequestLineEquals(request,
"POST http://uploader/Upload.ashx?output=json&destFolderPath=adriansmovies&uploadToken=token HTTP/1.1");
assertNonPayloadHeadersEqual(request, "");
StringBuilder expects = new StringBuilder();
expects.append("----JCLOUDS--\r\n");
expects.append("Content-Disposition: form-data; name=\"hello\"\r\n");
expects.append("Content-Type: text/plain\r\n\r\n");
expects.append("hello\r\n");
expects.append("----JCLOUDS----\r\n");
assertPayloadEquals(request, expects.toString(), "multipart/form-data; boundary=--JCLOUDS--", false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, null);
checkFilters(request);
}
public void testSetMetadata() throws SecurityException, NoSuchMethodException, IOException {
Method method = SDNAsyncClient.class.getMethod("setMetadata", String.class, Map.class);
GeneratedHttpRequest request = processor.createRequest(method, "adriansmovies/sushi.avi", ImmutableMap.of("Chef",
"Kawasaki"));
assertRequestLineEquals(
request,
"GET http://services.nirvanix.com/ws/Metadata/SetMetadata.ashx?output=json&path=adriansmovies/sushi.avi&metadata=chef:Kawasaki HTTP/1.1");
assertNonPayloadHeadersEqual(request, "");
assertPayloadEquals(request, null, null, false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, null);
checkFilters(request);
}
public void testGetMetadata() throws SecurityException, NoSuchMethodException, IOException {
Method method = SDNAsyncClient.class.getMethod("getMetadata", String.class);
GeneratedHttpRequest request = processor.createRequest(method, "adriansmovies/sushi.avi");
assertRequestLineEquals(request,
"GET http://services.nirvanix.com/ws/Metadata/GetMetadata.ashx?output=json&path=adriansmovies/sushi.avi HTTP/1.1");
assertNonPayloadHeadersEqual(request, "");
assertPayloadEquals(request, null, null, false);
assertResponseParserClassEquals(method, request, ParseMetadataFromJsonResponse.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, null);
checkFilters(request);
}
public void testGetFile() throws SecurityException, NoSuchMethodException, IOException {
Method method = SDNAsyncClient.class.getMethod("getFile", String.class);
GeneratedHttpRequest request = processor.createRequest(method, "adriansmovies/sushi.avi");
assertRequestLineEquals(request, "GET http://services.nirvanix.com/adriansmovies/sushi.avi?output=json HTTP/1.1");
assertNonPayloadHeadersEqual(request, "");
assertPayloadEquals(request, null, null, false);
assertResponseParserClassEquals(method, request, ReturnStringIf2xx.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, null);
assertEquals(request.getFilters().size(), 1);
assertEquals(request.getFilters().get(0).getClass(), InsertUserContextIntoPath.class);
}
@Override
protected void checkFilters(HttpRequest request) {
assertEquals(request.getFilters().size(), 1);
assertEquals(request.getFilters().get(0).getClass(), AddSessionTokenToRequest.class);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<SDNAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<SDNAsyncClient>>() {
};
}
protected Module createModule() {
return new TestSDNRestClientModule();
}
@RequiresHttp
@ConfiguresRestClient
static class TestSDNRestClientModule extends SDNRestClientModule {
@Override
public void configure() {
bind(String.class).annotatedWith(SessionToken.class).toInstance("sessiontoken");
bind(String.class).annotatedWith(Names.named(SDNConstants.PROPERTY_SDN_APPKEY)).toInstance("appKey");
bind(String.class).annotatedWith(Names.named(SDNConstants.PROPERTY_SDN_APPNAME)).toInstance("appname");
bind(String.class).annotatedWith(Names.named(SDNConstants.PROPERTY_SDN_USERNAME)).toInstance("username");
}
}
@Override
public RestContextSpec<SDNClient, SDNAsyncClient> createContextSpec() {
return new RestContextFactory().createContextSpec("sdn", "user", "password", new Properties());
}
}

View File

@ -1,75 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.nirvanix.sdn;
import static org.jclouds.rest.RestContextFactory.contextSpec;
import java.io.IOException;
import java.lang.reflect.Method;
import org.jclouds.http.HttpRequest;
import org.jclouds.nirvanix.sdn.SDNAuthenticationLiveTest.SDNAuthClient;
import org.jclouds.nirvanix.sdn.functions.ParseSessionTokenFromJsonResponse;
import org.jclouds.rest.RestClientTest;
import org.jclouds.rest.RestContextSpec;
import org.jclouds.rest.functions.MapHttp4xxCodesToExceptions;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code JaxrsAnnotationProcessor}
*
* @author Adrian Cole
*/
@Test(groups = "unit", testName = "sdn.SDNAuthentication")
public class SDNAuthAsyncClientTest extends RestClientTest<SDNAuthAsyncClient> {
public void testAuthenticate() throws SecurityException, NoSuchMethodException, IOException {
Method method = SDNAuthAsyncClient.class.getMethod("authenticate", String.class, String.class, String.class);
GeneratedHttpRequest httpRequest = processor.createRequest(method, "apple", "foo", "bar");
assertRequestLineEquals(httpRequest,
"GET http://localhost:8080/ws/Authentication/Login.ashx?output=json&appKey=apple&password=bar&username=foo HTTP/1.1");
assertNonPayloadHeadersEqual(httpRequest, "");
assertPayloadEquals(httpRequest, null, null, false);
assertResponseParserClassEquals(method, httpRequest, ParseSessionTokenFromJsonResponse.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, MapHttp4xxCodesToExceptions.class);
}
@Override
protected void checkFilters(HttpRequest request) {
}
@Override
protected TypeLiteral<RestAnnotationProcessor<SDNAuthAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<SDNAuthAsyncClient>>() {
};
}
@Override
public RestContextSpec<SDNAuthClient, SDNAuthAsyncClient> createContextSpec() {
return contextSpec("test", "http://localhost:8080", "1", "", "identity", "credential", SDNAuthClient.class,
SDNAuthAsyncClient.class);
}
}

View File

@ -1,84 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.nirvanix.sdn;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.jclouds.rest.RestContextFactory.contextSpec;
import static org.jclouds.rest.RestContextFactory.createContextBuilder;
import static org.testng.Assert.assertNotNull;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
import org.jclouds.concurrent.MoreExecutors;
import org.jclouds.concurrent.Timeout;
import org.jclouds.concurrent.config.ExecutorServiceModule;
import org.jclouds.logging.log4j.config.Log4JLoggingModule;
import org.jclouds.rest.RestContext;
import org.jclouds.rest.RestContextSpec;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.inject.Module;
/**
* Tests behavior of {@code SDNAuthentication}
*
* @author Adrian Cole
*/
@Test(groups = "live", testName = "sdn.SDNAuthenticationLiveTest")
public class SDNAuthenticationLiveTest {
private RestContext<SDNAuthClient, SDNAuthAsyncClient> context;
@Timeout(duration = 10, timeUnit = TimeUnit.SECONDS)
public interface SDNAuthClient {
String authenticate(String appKey, String user, String password);
}
private String credential;
private String identity;
@Test
public void testAuthentication() throws Exception {
ArrayList<String> list = Lists.newArrayList(Splitter.on('/').split(credential));
String response = context.getApi().authenticate(list.get(0), list.get(1), identity);
assertNotNull(response);
}
@BeforeClass
void setupFactory() {
String endpoint = "http://services.nirvanix.com";
identity = checkNotNull(System.getProperty("jclouds.test.identity"), "jclouds.test.identity");
credential = checkNotNull(System.getProperty("jclouds.test.credential"), "jclouds.test.credential");
RestContextSpec<SDNAuthClient, SDNAuthAsyncClient> contextSpec = contextSpec("test", endpoint, "1", "", identity,
credential, SDNAuthClient.class, SDNAuthAsyncClient.class);
context = createContextBuilder(
contextSpec,
ImmutableSet.<Module> of(new Log4JLoggingModule(), new ExecutorServiceModule(MoreExecutors
.sameThreadExecutor(), MoreExecutors.sameThreadExecutor()))).buildContext();
}
}

View File

@ -1,101 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.nirvanix.sdn;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import java.io.IOException;
import java.net.URI;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;
import org.jclouds.blobstore.domain.Blob;
import org.jclouds.blobstore.integration.internal.BaseBlobStoreIntegrationTest;
import org.jclouds.encryption.internal.Base64;
import org.jclouds.io.Payloads;
import org.jclouds.logging.log4j.config.Log4JLoggingModule;
import org.jclouds.nirvanix.sdn.domain.UploadInfo;
import org.jclouds.rest.RestContext;
import org.jclouds.rest.RestContextFactory;
import org.testng.annotations.BeforeGroups;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.inject.Module;
/**
* Tests behavior of {@code SDNClient}
*
* @author Adrian Cole
*/
@Test(groups = "live", sequential = true, testName = "sdn.SDNClientLiveTest")
public class SDNClientLiveTest {
protected SDNClient connection;
private String containerPrefix = BaseBlobStoreIntegrationTest.CONTAINER_PREFIX;
URI container1;
URI container2;
private RestContext<SDNClient, SDNAsyncClient> context;
@BeforeGroups(groups = { "live" })
public void setupClient() {
String identity = checkNotNull(System.getProperty("jclouds.test.identity"), "jclouds.test.identity");
String credential = checkNotNull(System.getProperty("jclouds.test.credential"), "jclouds.test.credential");
this.context = new RestContextFactory().createContext("sdn", identity, credential, ImmutableSet
.<Module> of(new Log4JLoggingModule()));
this.connection = context.getApi();
}
public void testUploadToken() throws InterruptedException, ExecutionException, TimeoutException, IOException {
String containerName = containerPrefix + ".testObjectOperations";
long size = 1024;
UploadInfo uploadInfo = connection.getStorageNode(containerName, size);
assertNotNull(uploadInfo.getHost());
assertNotNull(uploadInfo.getToken());
Blob blob = connection.newBlob();
blob.getMetadata().setName("test.txt");
blob.setPayload("value");
Payloads.calculateMD5(blob);
byte[] md5 = blob.getMetadata().getContentMetadata().getContentMD5();
connection.upload(uploadInfo.getHost(), uploadInfo.getToken(), containerName, blob);
Map<String, String> metadata = connection.getMetadata(containerName + "/test.txt");
assertEquals(metadata.get("MD5"), Base64.encodeBytes(md5));
String content = connection.getFile(containerName + "/test.txt");
assertEquals(content, "value");
metadata = ImmutableMap.of("chef", "sushi", "foo", "bar");
connection.setMetadata(containerName + "/test.txt", metadata);
metadata = connection.getMetadata(containerName + "/test.txt");
assertEquals(metadata.get("MD5"), Base64.encodeBytes(md5));
}
}

View File

@ -1,79 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.nirvanix.sdn.binders;
import static org.easymock.classextension.EasyMock.createMock;
import static org.testng.Assert.assertEquals;
import java.io.File;
import java.net.URI;
import javax.inject.Provider;
import javax.ws.rs.HttpMethod;
import javax.ws.rs.core.UriBuilder;
import org.jclouds.http.HttpRequest;
import org.jclouds.rest.internal.GeneratedHttpRequest;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
import com.sun.jersey.api.uri.UriBuilderImpl;
/**
* Tests behavior of {@code BindMetadataToQueryParams}
*
* @author Adrian Cole
*/
@Test(groups = "unit", testName = "sdn.BindMetadataToQueryParamsTest")
public class BindMetadataToQueryParamsTest {
@Test(expectedExceptions = IllegalArgumentException.class)
public void testMustBeMap() {
BindMetadataToQueryParams binder = new BindMetadataToQueryParams(null);
HttpRequest request = new HttpRequest(HttpMethod.POST, URI.create("http://localhost"), new char[] { '/', ':' });
binder.bindToRequest(request, new File("foo"));
}
@Test
public void testCorrect() throws SecurityException, NoSuchMethodException {
HttpRequest request = new HttpRequest("GET", URI.create("http://momma/"), new char[] { '/', ':' });
BindMetadataToQueryParams binder = new BindMetadataToQueryParams(new Provider<UriBuilder>() {
@Override
public UriBuilder get() {
return new UriBuilderImpl();
}
});
request = binder.bindToRequest(request, ImmutableMap.of("imageName", "foo", "serverId", "2"));
assertEquals(request.getRequestLine(), "GET http://momma/?metadata=imagename:foo&metadata=serverid:2 HTTP/1.1");
}
@Test(expectedExceptions = { NullPointerException.class, IllegalStateException.class })
public void testNullIsBad() {
BindMetadataToQueryParams binder = new BindMetadataToQueryParams(null);
GeneratedHttpRequest<?> request = createMock(GeneratedHttpRequest.class);
binder.bindToRequest(request, null);
}
}

View File

@ -1,132 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.nirvanix.sdn.filters;
import static org.testng.Assert.assertEquals;
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URI;
import java.util.Properties;
import javax.ws.rs.POST;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.RequiresHttp;
import org.jclouds.nirvanix.sdn.SDNAsyncClient;
import org.jclouds.nirvanix.sdn.SDNClient;
import org.jclouds.nirvanix.sdn.SessionToken;
import org.jclouds.nirvanix.sdn.config.SDNRestClientModule;
import org.jclouds.nirvanix.sdn.reference.SDNConstants;
import org.jclouds.rest.ConfiguresRestClient;
import org.jclouds.rest.RestClientTest;
import org.jclouds.rest.RestContextFactory;
import org.jclouds.rest.RestContextSpec;
import org.jclouds.rest.annotations.EndpointParam;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import com.google.inject.Key;
import com.google.inject.Module;
import com.google.inject.TypeLiteral;
import com.google.inject.name.Names;
@Test(groups = "unit", testName = "AddSessionTokenToRequestTest")
public class AddSessionTokenToRequestTest extends RestClientTest<SDNAsyncClient> {
private static interface TestService {
@POST
public void foo(@EndpointParam URI endpoint);
}
@DataProvider
public Object[][] dataProvider() throws SecurityException, NoSuchMethodException {
RestAnnotationProcessor<TestService> factory = injector.getInstance(Key
.get(new TypeLiteral<RestAnnotationProcessor<TestService>>() {
}));
Method method = TestService.class.getMethod("foo", URI.class);
return new Object[][] { { factory.createRequest(method, new Object[] { URI.create("https://host:443") }) },
{ factory.createRequest(method, new Object[] { URI.create("https://host/path") }) },
{ factory.createRequest(method, new Object[] { URI.create("https://host/?query") })
} };
}
@Test(dataProvider = "dataProvider")
public void testRequests(HttpRequest request) {
String token = filter.getSessionToken();
String query = request.getEndpoint().getQuery();
request = filter.filter(request);
assertEquals(request.getEndpoint().getQuery(), query == null ? "sessionToken=" + token : query + "&sessionToken="
+ token);
}
@Test
void testUpdatesOnlyOncePerSecond() throws NoSuchMethodException, InterruptedException {
String token = filter.getSessionToken();
for (int i = 0; i < 10; i++)
filter.updateIfTimeOut();
assert token.equals(filter.getSessionToken());
}
@Override
protected void checkFilters(HttpRequest request) {
}
private AddSessionTokenToRequest filter;
@BeforeClass
@Override
protected void setupFactory() throws IOException {
super.setupFactory();
filter = injector.getInstance(AddSessionTokenToRequest.class);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<SDNAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<SDNAsyncClient>>() {
};
}
protected Module createModule() {
return new TestSDNRestClientModule();
}
@RequiresHttp
@ConfiguresRestClient
static class TestSDNRestClientModule extends SDNRestClientModule {
@Override
public void configure() {
bind(String.class).annotatedWith(SessionToken.class).toInstance("sessiontoken");
bind(String.class).annotatedWith(Names.named(SDNConstants.PROPERTY_SDN_APPKEY)).toInstance("appKey");
bind(String.class).annotatedWith(Names.named(SDNConstants.PROPERTY_SDN_APPNAME)).toInstance("appname");
bind(String.class).annotatedWith(Names.named(SDNConstants.PROPERTY_SDN_USERNAME)).toInstance("username");
}
}
@Override
public RestContextSpec<SDNClient, SDNAsyncClient> createContextSpec() {
return new RestContextFactory().createContextSpec("sdn", "user", "password", new Properties());
}
}

View File

@ -1,130 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.nirvanix.sdn.filters;
import static org.testng.Assert.assertEquals;
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URI;
import java.util.Properties;
import javax.ws.rs.POST;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.RequiresHttp;
import org.jclouds.nirvanix.sdn.SDNAsyncClient;
import org.jclouds.nirvanix.sdn.SDNClient;
import org.jclouds.nirvanix.sdn.SessionToken;
import org.jclouds.nirvanix.sdn.config.SDNRestClientModule;
import org.jclouds.nirvanix.sdn.reference.SDNConstants;
import org.jclouds.rest.ConfiguresRestClient;
import org.jclouds.rest.RestClientTest;
import org.jclouds.rest.RestContextFactory;
import org.jclouds.rest.RestContextSpec;
import org.jclouds.rest.annotations.EndpointParam;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.google.common.base.Throwables;
import com.google.inject.Module;
import com.google.inject.TypeLiteral;
import com.google.inject.name.Names;
@Test(groups = "unit", singleThreaded = true, testName = "sdn.InsertUserContextIntoPathTest")
// sequential as easymock isn't threadsafe
public class InsertUserContextIntoPathTest extends RestClientTest<TestService> {
private Method method;
public void testRequestInvalid() {
GeneratedHttpRequest request = processor.createRequest(method, URI.create("https://host/path"));
request = filter.filter(request);
request = filter.filter(request);
assertEquals(request.getEndpoint().getPath(), "/sessiontoken/appname/username/path");
assertEquals(request.getEndpoint().getHost(), "host");
}
public void testRequestNoSession() {
GeneratedHttpRequest request = processor.createRequest(method, URI.create("https://host/path"));
request = filter.filter(request);
assertEquals(request.getEndpoint().getPath(), "/sessiontoken/appname/username/path");
assertEquals(request.getEndpoint().getHost(), "host");
}
public void testRequestAlreadyHasSession() {
GeneratedHttpRequest request = processor.createRequest(method, URI.create("https://host/sessiontoken/appname/username/path"));
request = filter.filter(request);
assertEquals(request.getEndpoint().getPath(), "/sessiontoken/appname/username/path");
assertEquals(request.getEndpoint().getHost(), "host");
}
private InsertUserContextIntoPath filter;
@BeforeClass
@Override
protected void setupFactory() throws IOException {
super.setupFactory();
filter = injector.getInstance(InsertUserContextIntoPath.class);
try {
method = TestService.class.getMethod("foo", URI.class);
} catch (Exception e) {
Throwables.propagate(e);
}
}
@Override
protected TypeLiteral<RestAnnotationProcessor<TestService>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<TestService>>() {
};
}
protected Module createModule() {
return new TestSDNRestClientModule();
}
@RequiresHttp
@ConfiguresRestClient
static class TestSDNRestClientModule extends SDNRestClientModule {
@Override
public void configure() {
bind(String.class).annotatedWith(SessionToken.class).toInstance("sessiontoken");
bind(String.class).annotatedWith(Names.named(SDNConstants.PROPERTY_SDN_APPKEY)).toInstance("appKey");
bind(String.class).annotatedWith(Names.named(SDNConstants.PROPERTY_SDN_APPNAME)).toInstance("appname");
bind(String.class).annotatedWith(Names.named(SDNConstants.PROPERTY_SDN_USERNAME)).toInstance("username");
}
}
@Override
public RestContextSpec<SDNClient, SDNAsyncClient> createContextSpec() {
return new RestContextFactory().createContextSpec("sdn", "user", "password", new Properties());
}
@Override
protected void checkFilters(HttpRequest request) {
}
}
interface TestService {
@POST
public void foo(@EndpointParam URI endpoint);
}

View File

@ -1,53 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.nirvanix.sdn.functions;
import static org.testng.Assert.assertEquals;
import java.io.InputStream;
import java.net.UnknownHostException;
import java.util.Map;
import org.jclouds.http.HttpResponse;
import org.jclouds.io.Payloads;
import org.jclouds.json.config.GsonModule;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
import com.google.inject.Guice;
import com.google.inject.Injector;
/**
* Tests behavior of {@code ParseMetadataFromJsonResponse}
*
* @author Adrian Cole
*/
@Test(groups = "unit", testName = "sdn.ParseMetadataFromJsonResponseTest")
public class ParseMetadataFromJsonResponseTest {
Injector i = Guice.createInjector(new GsonModule());
public void testApplyInputStreamDetails() throws UnknownHostException {
InputStream is = getClass().getResourceAsStream("/metadata.json");
ParseMetadataFromJsonResponse parser = i.getInstance(ParseMetadataFromJsonResponse.class);
Map<String, String> response = parser.apply(new HttpResponse(200, "ok", Payloads.newInputStreamPayload(is)));
assertEquals(response, ImmutableMap.of("MD5", "IGPBYI1uC6+AJJxC4r5YBA==", "test", "1"));
}
}

View File

@ -1,52 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.nirvanix.sdn.functions;
import static org.testng.Assert.assertEquals;
import java.io.InputStream;
import java.net.UnknownHostException;
import org.jclouds.http.HttpResponse;
import org.jclouds.io.Payloads;
import org.jclouds.json.config.GsonModule;
import org.testng.annotations.Test;
import com.google.inject.Guice;
import com.google.inject.Injector;
/**
* Tests behavior of {@code ParseSessionTokenFromJsonResponse}
*
* @author Adrian Cole
*/
@Test(groups = "unit", testName = "sdn.ParseSessionTokenFromJsonResponseTest")
public class ParseSessionTokenFromJsonResponseTest {
Injector i = Guice.createInjector(new GsonModule());
public void testApplyInputStreamDetails() throws UnknownHostException {
InputStream is = getClass().getResourceAsStream("/login.json");
ParseSessionTokenFromJsonResponse parser = i.getInstance(ParseSessionTokenFromJsonResponse.class);
String response = parser.apply(new HttpResponse(200, "ok", Payloads.newInputStreamPayload(is)));
assertEquals(response, "e4b08449-4501-4b7a-af6a-d4e1e1bd7919");
}
}

View File

@ -1,55 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.nirvanix.sdn.functions;
import static org.testng.Assert.assertEquals;
import java.io.InputStream;
import java.net.URI;
import java.net.UnknownHostException;
import org.jclouds.http.HttpResponse;
import org.jclouds.io.Payloads;
import org.jclouds.json.config.GsonModule;
import org.jclouds.nirvanix.sdn.domain.UploadInfo;
import org.testng.annotations.Test;
import com.google.inject.Guice;
import com.google.inject.Injector;
/**
* Tests behavior of {@code ParseUploadInfoFromJsonResponse}
*
* @author Adrian Cole
*/
@Test(groups = "unit", testName = "sdn.ParseUploadInfoFromJsonResponse")
public class ParseUploadInfoFromJsonResponseTest {
Injector i = Guice.createInjector(new GsonModule());
public void testApplyInputStreamDetails() throws UnknownHostException {
InputStream is = getClass().getResourceAsStream("/authtoken.json");
ParseUploadInfoFromJsonResponse parser = i.getInstance(ParseUploadInfoFromJsonResponse.class);
UploadInfo response = parser.apply(new HttpResponse(200, "ok", Payloads.newInputStreamPayload(is)));
assertEquals(response.getHost(), URI.create("https://node1.nirvanix.com"));
assertEquals(response.getToken(), "siR-ALYd~BEcJ8GR2tE~oX3SEHO8~2WXKT5xjFk~YLS5OvJyHI21TN34rQ");
}
}

View File

@ -1 +0,0 @@
{"ResponseCode":0,"GetStorageNode":{"UploadHost":"node1.nirvanix.com","UploadToken":"siR-ALYd~BEcJ8GR2tE~oX3SEHO8~2WXKT5xjFk~YLS5OvJyHI21TN34rQ"}}

View File

@ -1,90 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<!--
For more configuration infromation and examples see the Apache Log4j
website: http://logging.apache.org/log4j/
-->
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
debug="false">
<!-- A time/date based rolling appender -->
<appender name="WIREFILE" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="target/test-data/jclouds-wire.log" />
<param name="Append" value="true" />
<!-- Rollover at midnight each day -->
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<param name="Threshold" value="TRACE" />
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message\n -->
<param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
<!--
The full pattern: Date MS Priority [Category] (Thread:NDC) Message\n
<param name="ConversionPattern" value="%d %-5r %-5p [%c] (%t:%x)
%m%n"/>
-->
</layout>
</appender>
<!-- A time/date based rolling appender -->
<appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="target/test-data/jclouds.log" />
<param name="Append" value="true" />
<!-- Rollover at midnight each day -->
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<param name="Threshold" value="TRACE" />
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message\n -->
<param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
<!--
The full pattern: Date MS Priority [Category] (Thread:NDC) Message\n
<param name="ConversionPattern" value="%d %-5r %-5p [%c] (%t:%x)
%m%n"/>
-->
</layout>
</appender>
<appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
<appender-ref ref="FILE" />
</appender>
<appender name="ASYNCWIRE" class="org.apache.log4j.AsyncAppender">
<appender-ref ref="WIREFILE" />
</appender>
<!-- ================ -->
<!-- Limit categories -->
<!-- ================ -->
<category name="org.jclouds">
<priority value="DEBUG" />
<appender-ref ref="ASYNC" />
</category>
<category name="jclouds.headers">
<priority value="DEBUG" />
<appender-ref ref="ASYNCWIRE" />
</category>
<category name="jclouds.wire">
<priority value="DEBUG" />
<appender-ref ref="ASYNCWIRE" />
</category>
<!-- ======================= -->
<!-- Setup the Root category -->
<!-- ======================= -->
<root>
<priority value="WARN" />
</root>
</log4j:configuration>

View File

@ -1 +0,0 @@
{"ResponseCode":0,"SessionToken":"e4b08449-4501-4b7a-af6a-d4e1e1bd7919"}

View File

@ -1 +0,0 @@
{"ResponseCode":0,"Metadata":[{"Type":"MD5","Value":"IGPBYI1uC6+AJJxC4r5YBA=="},{"Type":"test","Value":"1"}]}

View File

@ -1,25 +0,0 @@
====
Licensed to jclouds, Inc. (jclouds) under one or more
contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. jclouds 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.
====
#
# The jclouds provider for Mezeo Cloud Storage (http://www.mezeo.com/the-platform).
#
# TODO: Implementation status.
# TODO: Supported features.
# TODO: Usage example.

View File

@ -1,126 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to jclouds, Inc. (jclouds) under one or more
contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. jclouds 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.
-->
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.jclouds</groupId>
<artifactId>jclouds-project</artifactId>
<version>1.6.0-SNAPSHOT</version>
<relativePath>../../project/pom.xml</relativePath>
</parent>
<groupId>org.jclouds.api</groupId>
<artifactId>pcs</artifactId>
<name>jclouds mezeo cloud storage platform core</name>
<description>jclouds Core components to access mezeo pcs2</description>
<packaging>bundle</packaging>
<!-- bootstrapping: need to fetch the project POM -->
<repositories>
<repository>
<id>jclouds-sona-snapshots-nexus</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<properties>
<test.pcs.endpoint>FIXME</test.pcs.endpoint>
<test.pcs.api-version>2</test.pcs.api-version>
<test.pcs.build-version></test.pcs.build-version>
<test.pcs.identity>FIXME</test.pcs.identity>
<test.pcs.credential>FIXME</test.pcs.credential>
<jclouds.osgi.export>org.jclouds.mezeo.pcs*;version="${project.version}"</jclouds.osgi.export>
<jclouds.osgi.import>org.jclouds*;version="${project.version}",*</jclouds.osgi.import>
</properties>
<dependencies>
<dependency>
<groupId>org.jclouds</groupId>
<artifactId>jclouds-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.jclouds</groupId>
<artifactId>jclouds-blobstore</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.jclouds</groupId>
<artifactId>jclouds-core</artifactId>
<version>${project.version}</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jclouds</groupId>
<artifactId>jclouds-blobstore</artifactId>
<version>${project.version}</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jclouds.driver</groupId>
<artifactId>jclouds-log4j</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<profiles>
<profile>
<id>live</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<executions>
<execution>
<id>integration</id>
<phase>integration-test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<systemPropertyVariables>
<test.pcs.endpoint>${test.pcs.endpoint}</test.pcs.endpoint>
<test.pcs.api-version>${test.pcs.api-version}</test.pcs.api-version>
<test.pcs.build-version>${test.pcs.build-version}</test.pcs.build-version>
<test.pcs.identity>${test.pcs.identity}</test.pcs.identity>
<test.pcs.credential>${test.pcs.credential}</test.pcs.credential>
</systemPropertyVariables>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>

View File

@ -1,179 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs;
import java.io.InputStream;
import java.net.URI;
import java.util.Map;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import org.jclouds.blobstore.functions.ReturnNullOnKeyNotFound;
import org.jclouds.http.filters.BasicAuthentication;
import org.jclouds.mezeo.pcs.binders.BindContainerNameToXmlPayload;
import org.jclouds.mezeo.pcs.binders.BindFileInfoToXmlPayload;
import org.jclouds.mezeo.pcs.binders.BindPCSFileToMultipartForm;
import org.jclouds.mezeo.pcs.domain.ContainerList;
import org.jclouds.mezeo.pcs.domain.FileInfoWithMetadata;
import org.jclouds.mezeo.pcs.domain.PCSFile;
import org.jclouds.mezeo.pcs.endpoints.RootContainer;
import org.jclouds.mezeo.pcs.functions.AddMetadataItemIntoMap;
import org.jclouds.mezeo.pcs.options.PutBlockOptions;
import org.jclouds.mezeo.pcs.xml.ContainerHandler;
import org.jclouds.mezeo.pcs.xml.FileHandler;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.Endpoint;
import org.jclouds.rest.annotations.EndpointParam;
import org.jclouds.rest.annotations.ExceptionParser;
import org.jclouds.rest.annotations.Headers;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.ResponseParser;
import org.jclouds.rest.annotations.SkipEncoding;
import org.jclouds.rest.annotations.XMLResponseParser;
import org.jclouds.rest.binders.BindToStringPayload;
import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404;
import com.google.common.util.concurrent.ListenableFuture;
/**
* Provides asynchronous access to Mezeo PCS via their REST API.
* <p/>
*
* @see PCSClient
* @see <a href=
* "http://developer.mezeo.com/mezeo-developer-center/documentation/howto-using-curl-to-access-api"
* />
* @author Adrian Cole
*/
@SkipEncoding('/')
@RequestFilters(BasicAuthentication.class)
public interface PCSAsyncClient {
PCSFile newFile();
/**
* @see PCSAsyncClient#list()
*/
@GET
@XMLResponseParser(ContainerHandler.class)
@Headers(keys = "X-Cloud-Depth", values = "2")
@Endpoint(RootContainer.class)
ListenableFuture<? extends ContainerList> list();
/**
* @see PCSAsyncClient#list(URI)
*/
@GET
@XMLResponseParser(ContainerHandler.class)
@Headers(keys = "X-Cloud-Depth", values = "2")
ListenableFuture<? extends ContainerList> list(@EndpointParam URI container);
/**
* @see PCSAsyncClient#createContainer
*/
@POST
@Path("/contents")
@Endpoint(RootContainer.class)
@Produces("application/vnd.csp.container-info+xml")
ListenableFuture<URI> createContainer(@BinderParam(BindContainerNameToXmlPayload.class) String container);
/**
* @see PCSAsyncClient#createContainer
*/
@POST
@Path("/contents")
ListenableFuture<URI> createContainer(@EndpointParam URI parent,
@BinderParam(BindContainerNameToXmlPayload.class) String container);
/**
* @see PCSAsyncClient#deleteContainer
*/
@DELETE
@ExceptionParser(ReturnVoidOnNotFoundOr404.class)
ListenableFuture<Void> deleteContainer(@EndpointParam URI container);
/**
* @see PCSAsyncClient#uploadFile
*/
@POST
@Path("/contents")
ListenableFuture<URI> uploadFile(@EndpointParam URI container,
@BinderParam(BindPCSFileToMultipartForm.class) PCSFile object);
/**
* @see PCSAsyncClient#createFile
*/
@POST
@Path("/contents")
ListenableFuture<URI> createFile(@EndpointParam URI container,
@BinderParam(BindFileInfoToXmlPayload.class) PCSFile object);
/**
* @see PCSAsyncClient#uploadBlock
*/
@PUT
@Path("/content")
ListenableFuture<Void> uploadBlock(@EndpointParam URI file, PCSFile object, PutBlockOptions... options);
/**
* @see PCSAsyncClient#deleteFile
*/
@DELETE
@ExceptionParser(ReturnVoidOnNotFoundOr404.class)
ListenableFuture<Void> deleteFile(@EndpointParam URI file);
/**
* @see PCSAsyncClient#downloadFile
*/
@GET
@ExceptionParser(ReturnNullOnKeyNotFound.class)
@Path("/content")
ListenableFuture<InputStream> downloadFile(@EndpointParam URI file);
/**
* @see PCSAsyncClient#getFileInfo
*/
@GET
@ExceptionParser(ReturnNullOnKeyNotFound.class)
@XMLResponseParser(FileHandler.class)
@Headers(keys = "X-Cloud-Depth", values = "2")
ListenableFuture<FileInfoWithMetadata> getFileInfo(@EndpointParam URI file);
/**
* @see PCSAsyncClient#putMetadataItem
*/
@PUT
@Path("/metadata/{key}")
ListenableFuture<Void> putMetadataItem(@EndpointParam URI resource, @PathParam("key") String key,
@BinderParam(BindToStringPayload.class) String value);
/**
* @see PCSAsyncClient#addMetadataItemToMap
*/
@GET
@ResponseParser(AddMetadataItemIntoMap.class)
@Path("/metadata/{key}")
ListenableFuture<Void> addMetadataItemToMap(@EndpointParam URI resource, @PathParam("key") String key,
Map<String, String> map);
}

View File

@ -1,70 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs;
import java.io.InputStream;
import java.net.URI;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.jclouds.concurrent.Timeout;
import org.jclouds.mezeo.pcs.domain.ContainerList;
import org.jclouds.mezeo.pcs.domain.FileInfoWithMetadata;
import org.jclouds.mezeo.pcs.domain.PCSFile;
import org.jclouds.mezeo.pcs.options.PutBlockOptions;
/**
* Provides access to Mezeo PCS via their REST API.
* <p/>
*
* @see <a href=
* "http://developer.mezeo.com/mezeo-developer-center/documentation/howto-using-curl-to-access-api"
* />
* @author Adrian Cole
*/
@Timeout(duration = 30, timeUnit = TimeUnit.SECONDS)
public interface PCSClient {
PCSFile newFile();
ContainerList list();
ContainerList list(URI container);
URI createContainer(String container);
URI createContainer(URI parent, String container);
void deleteContainer(URI container);
URI uploadFile(URI container, PCSFile object);
URI createFile(URI container, PCSFile object);
void uploadBlock(URI file, PCSFile object, PutBlockOptions... options);
void deleteFile(URI file);
InputStream downloadFile(URI file);
FileInfoWithMetadata getFileInfo(URI file);
void putMetadataItem(URI resource, String key, String value);
void addMetadataItemToMap(URI resource, String key, Map<String, String> map);
}

View File

@ -1,76 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs;
import java.net.URI;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import org.jclouds.http.filters.BasicAuthentication;
import org.jclouds.mezeo.pcs.endpoints.Contacts;
import org.jclouds.mezeo.pcs.endpoints.Metacontainers;
import org.jclouds.mezeo.pcs.endpoints.Projects;
import org.jclouds.mezeo.pcs.endpoints.Recyclebin;
import org.jclouds.mezeo.pcs.endpoints.RootContainer;
import org.jclouds.mezeo.pcs.endpoints.Shares;
import org.jclouds.mezeo.pcs.endpoints.Tags;
import org.jclouds.mezeo.pcs.xml.CloudXlinkHandler;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.XMLResponseParser;
import com.google.common.util.concurrent.ListenableFuture;
/**
* Provides URIs to PCS services via their REST API.
* <p/>
*
* @author Adrian Cole
*/
@RequestFilters(BasicAuthentication.class)
public interface PCSCloudAsyncClient {
public interface Response {
@RootContainer
URI getRootContainerUrl();
@Contacts
URI getContactsUrl();
@Shares
URI getSharesUrl();
@Projects
URI getProjectsUrl();
@Metacontainers
URI getMetacontainersUrl();
@Recyclebin
URI getRecyclebinUrl();
@Tags
URI getTagsUrl();
}
@GET
@XMLResponseParser(CloudXlinkHandler.class)
@Path("/v{jclouds.api-version}")
ListenableFuture<Response> authenticate();
}

View File

@ -1,42 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs;
import java.util.List;
import java.util.Properties;
import org.jclouds.mezeo.pcs.config.PCSRestClientModule;
import org.jclouds.rest.RestContextBuilder;
import com.google.inject.Module;
/**
*
* @author Adrian Cole
*/
public class PCSContextBuilder extends RestContextBuilder<PCSClient, PCSAsyncClient> {
public PCSContextBuilder(Properties props) {
super(PCSClient.class, PCSAsyncClient.class, props);
}
protected void addClientModule(List<Module> modules) {
modules.add(new PCSRestClientModule());
}
}

View File

@ -1,44 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs;
import static org.jclouds.Constants.PROPERTY_API_VERSION;
import java.util.Properties;
import org.jclouds.PropertiesBuilder;
/**
* Builds properties used in PCS Connections
*
* @author Adrian Cole
*/
public class PCSPropertiesBuilder extends PropertiesBuilder {
@Override
protected Properties defaultProperties() {
Properties properties = super.defaultProperties();
properties.setProperty(PROPERTY_API_VERSION, "2");
return properties;
}
public PCSPropertiesBuilder(Properties properties) {
super(properties);
}
}

View File

@ -1,39 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.binders;
import javax.inject.Singleton;
import org.jclouds.http.HttpRequest;
import org.jclouds.rest.Binder;
/**
*
* @author Adrian Cole
*
*/
@Singleton
public class BindContainerNameToXmlPayload implements Binder {
@Override
public <R extends HttpRequest> R bindToRequest(R request, Object input) {
String container = String.format("<container><name>%s</name></container>", input);
request.setPayload(container);
return request;
}
}

View File

@ -1,50 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.binders;
import java.io.File;
import javax.inject.Singleton;
import javax.ws.rs.core.HttpHeaders;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.utils.ModifyRequest;
import org.jclouds.mezeo.pcs.domain.PCSFile;
import org.jclouds.rest.Binder;
import com.google.common.collect.ImmutableMultimap;
/**
*
* @author Adrian Cole
*
*/
@Singleton
public class BindFileInfoToXmlPayload implements Binder {
@Override
public <R extends HttpRequest> R bindToRequest(R request, Object input) {
PCSFile blob = (PCSFile) input;
String file = String.format("<file><name>%s</name><mime_type>%s</mime_type><public>false</public></file>",
new File(blob.getMetadata().getName()).getName(), blob.getMetadata().getMimeType());
request.setPayload(file);
return ModifyRequest.replaceHeaders(request, ImmutableMultimap.<String, String> of(HttpHeaders.CONTENT_LENGTH,
file.getBytes().length + "", HttpHeaders.CONTENT_TYPE, "application/vnd.csp.file-info+xml"));
}
}

View File

@ -1,52 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.binders;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.jclouds.blobstore.binders.BindBlobToMultipartForm;
import org.jclouds.http.HttpRequest;
import org.jclouds.mezeo.pcs.blobstore.functions.PCSFileToBlob;
import org.jclouds.mezeo.pcs.domain.PCSFile;
import org.jclouds.rest.Binder;
@Singleton
public class BindPCSFileToMultipartForm implements Binder {
private final BindBlobToMultipartForm blobBinder;
private final PCSFileToBlob file2Blob;
@Inject
public BindPCSFileToMultipartForm(PCSFileToBlob file2Blob, BindBlobToMultipartForm blobBinder) {
this.blobBinder = blobBinder;
this.file2Blob = file2Blob;
}
@Override
public <R extends HttpRequest> R bindToRequest(R request, Object input) {
PCSFile file = (PCSFile) input;
checkNotNull(file.getPayload().getContentMetadata().getContentLength(), "contentLength");
checkArgument(file.getPayload().getContentMetadata().getContentLength() <= 2l * 1024 * 1024 * 1024,
"maximum size for POST request is 2GB");
return blobBinder.bindToRequest(request, file2Blob.apply(file));
}
}

View File

@ -1,46 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.blobstore.functions;
import javax.inject.Singleton;
import org.jclouds.blobstore.domain.BlobMetadata;
import org.jclouds.mezeo.pcs.domain.MutableFileInfo;
import org.jclouds.mezeo.pcs.domain.internal.MutableFileInfoImpl;
import com.google.common.base.Function;
/**
* @author Adrian Cole
*/
@Singleton
public class BlobToFileInfo implements Function<BlobMetadata, MutableFileInfo> {
@Override
public MutableFileInfo apply(BlobMetadata base) {
MutableFileInfo to = new MutableFileInfoImpl();
to.setUrl(base.getUri());
to.setMimeType(base.getContentMetadata().getContentType());
to.setName(base.getName());
to.setModified(base.getLastModified());
if (base.getContentMetadata().getContentLength() != null)
to.setBytes(base.getContentMetadata().getContentLength());
return to;
}
}

View File

@ -1,49 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.blobstore.functions;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.jclouds.blobstore.domain.Blob;
import org.jclouds.mezeo.pcs.domain.PCSFile;
import com.google.common.base.Function;
/**
* @author Adrian Cole
*/
@Singleton
public class BlobToPCSFile implements Function<Blob, PCSFile> {
private final BlobToFileInfo blob2ObjectMd;
private final PCSFile.Factory objectProvider;
@Inject
BlobToPCSFile(BlobToFileInfo blob2ObjectMd, PCSFile.Factory objectProvider) {
this.blob2ObjectMd = blob2ObjectMd;
this.objectProvider = objectProvider;
}
public PCSFile apply(Blob from) {
PCSFile object = objectProvider.create(blob2ObjectMd.apply(from.getMetadata()));
object.setPayload(from.getPayload());
object.setAllHeaders(from.getAllHeaders());
return object;
}
}

View File

@ -1,57 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.blobstore.functions;
import java.util.regex.Pattern;
import javax.inject.Singleton;
import org.jclouds.blobstore.domain.MutableBlobMetadata;
import org.jclouds.blobstore.domain.StorageType;
import org.jclouds.blobstore.domain.internal.MutableBlobMetadataImpl;
import org.jclouds.mezeo.pcs.domain.FileInfo;
import org.jclouds.util.Strings2;
import com.google.common.base.Function;
/**
* @author Adrian Cole
*/
@Singleton
public class FileInfoToBlobMetadata implements Function<FileInfo, MutableBlobMetadata> {
public static final Pattern OBJECTS_PATTERN = Pattern.compile(".*objects/");
@Override
public MutableBlobMetadata apply(FileInfo from) {
MutableBlobMetadata to = new MutableBlobMetadataImpl();
if (from.getUrl() != null) {
to.setId(Strings2.replaceAll(from.getUrl().getPath(), OBJECTS_PATTERN, ""));
}
to.setUri(from.getUrl());
to.setName(from.getName());
if (from.getMimeType() != null)
to.getContentMetadata().setContentType(from.getMimeType());
if (from.getModified() != null)
to.setLastModified(from.getModified());
if (from.getBytes() != null)
to.getContentMetadata().setContentLength(from.getBytes());
to.setType(StorageType.BLOB);
return to;
}
}

View File

@ -1,50 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.blobstore.functions;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.jclouds.blobstore.domain.Blob;
import org.jclouds.blobstore.domain.Blob.Factory;
import org.jclouds.mezeo.pcs.domain.PCSFile;
import com.google.common.base.Function;
/**
* @author Adrian Cole
*/
@Singleton
public class PCSFileToBlob implements Function<PCSFile, Blob> {
private final Blob.Factory blobFactory;
private final FileInfoToBlobMetadata info2BlobMd;
@Inject
PCSFileToBlob(Factory blobFactory, FileInfoToBlobMetadata info2BlobMd) {
this.blobFactory = blobFactory;
this.info2BlobMd = info2BlobMd;
}
public Blob apply(PCSFile from) {
Blob blob = blobFactory.create(info2BlobMd.apply(from.getMetadata()));
blob.setPayload(from.getPayload());
blob.setAllHeaders(from.getAllHeaders());
return blob;
}
}

View File

@ -1,64 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.config;
import javax.inject.Inject;
import javax.inject.Provider;
import org.jclouds.blobstore.config.BlobStoreObjectModule;
import org.jclouds.mezeo.pcs.domain.MutableFileInfo;
import org.jclouds.mezeo.pcs.domain.PCSFile;
import org.jclouds.mezeo.pcs.domain.internal.PCSFileImpl;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
import com.google.inject.Scopes;
/**
* Configures the domain object mappings needed for all PCS implementations
*
* @author Adrian Cole
*/
public class PCSObjectModule extends AbstractModule {
/**
* explicit factories are created here as it has been shown that Assisted Inject is extremely
* inefficient. http://code.google.com/p/google-guice/issues/detail?id=435
*/
@Override
protected void configure() {
// for adapters
install(new BlobStoreObjectModule());
bind(PCSFile.Factory.class).to(PCSFileFactory.class).in(Scopes.SINGLETON);
}
private static class PCSFileFactory implements PCSFile.Factory {
@Inject
Provider<MutableFileInfo> metadataProvider;
public PCSFile create(MutableFileInfo metadata) {
return new PCSFileImpl(metadata != null ? metadata : metadataProvider.get());
}
}
@Provides
PCSFile providePCSFile(PCSFile.Factory factory) {
return factory.create(null);
}
}

View File

@ -1,139 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.config;
import java.net.URI;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import javax.inject.Named;
import javax.inject.Singleton;
import org.jclouds.Constants;
import org.jclouds.http.HttpRetryHandler;
import org.jclouds.http.RequiresHttp;
import org.jclouds.http.annotation.ClientError;
import org.jclouds.mezeo.pcs.PCSAsyncClient;
import org.jclouds.mezeo.pcs.PCSClient;
import org.jclouds.mezeo.pcs.PCSCloudAsyncClient;
import org.jclouds.mezeo.pcs.PCSCloudAsyncClient.Response;
import org.jclouds.mezeo.pcs.endpoints.Contacts;
import org.jclouds.mezeo.pcs.endpoints.Metacontainers;
import org.jclouds.mezeo.pcs.endpoints.Projects;
import org.jclouds.mezeo.pcs.endpoints.Recyclebin;
import org.jclouds.mezeo.pcs.endpoints.RootContainer;
import org.jclouds.mezeo.pcs.endpoints.Shares;
import org.jclouds.mezeo.pcs.endpoints.Tags;
import org.jclouds.mezeo.pcs.endpoints.WebDAV;
import org.jclouds.mezeo.pcs.handlers.PCSClientErrorRetryHandler;
import org.jclouds.rest.AsyncClientFactory;
import org.jclouds.rest.ConfiguresRestClient;
import org.jclouds.rest.config.RestClientModule;
import com.google.inject.Provides;
/**
* Configures the PCSCloudModule authentication service connection.
*
* @author Adrian Cole
*/
@RequiresHttp
@ConfiguresRestClient
public class PCSRestClientModule extends RestClientModule<PCSClient, PCSAsyncClient> {
@Override
protected void configure() {
install(new PCSObjectModule());
super.configure();
}
public PCSRestClientModule() {
super(PCSClient.class, PCSAsyncClient.class);
}
@Provides
@Singleton
protected Response provideCloudResponse(AsyncClientFactory factory) throws InterruptedException, ExecutionException,
TimeoutException {
return factory.create(PCSCloudAsyncClient.class).authenticate().get(10, TimeUnit.SECONDS);
}
@Provides
@Singleton
@WebDAV
protected URI provideWebDAVURI(@Named(Constants.PROPERTY_ENDPOINT) String endpoint) {
return URI.create(endpoint + "/dav");
}
@Provides
@Singleton
@Contacts
protected URI provideContactsUrl(Response response) {
return response.getContactsUrl();
}
@Provides
@Singleton
@Metacontainers
protected URI provideMetacontainersUrl(Response response) {
return response.getMetacontainersUrl();
}
@Provides
@Singleton
@Projects
protected URI provideProjectsUrl(Response response) {
return response.getProjectsUrl();
}
@Provides
@Singleton
@Recyclebin
protected URI provideRecyclebinUrl(Response response) {
return response.getRecyclebinUrl();
}
@Provides
@Singleton
@RootContainer
protected URI provideRootContainerUrl(Response response) {
return response.getRootContainerUrl();
}
@Provides
@Singleton
@Shares
protected URI provideSharesUrl(Response response) {
return response.getSharesUrl();
}
@Provides
@Singleton
@Tags
protected URI provideTagsUrl(Response response) {
return response.getTagsUrl();
}
@Override
protected void bindRetryHandlers() {
bind(HttpRetryHandler.class).annotatedWith(ClientError.class).to(PCSClientErrorRetryHandler.class);
}
}

View File

@ -1,37 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.domain;
import java.net.URI;
import org.jclouds.mezeo.pcs.domain.internal.ContainerInfoImpl;
import com.google.inject.ImplementedBy;
/**
*
* @author Adrian Cole
*
*/
@ImplementedBy(ContainerInfoImpl.class)
public interface ContainerInfo extends ResourceInfo {
URI getContents();
}

View File

@ -1,37 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.domain;
import java.net.URI;
import java.util.Map;
import java.util.SortedSet;
import org.jclouds.mezeo.pcs.domain.internal.ContainerListImpl;
import com.google.inject.ImplementedBy;
/**
*
* @author Adrian Cole
*
*/
@ImplementedBy(ContainerListImpl.class)
public interface ContainerList extends ResourceInfo, SortedSet<ResourceInfo> {
Map<String, URI> getMetadataItems();
}

View File

@ -1,44 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.domain;
import java.net.URI;
import org.jclouds.mezeo.pcs.domain.internal.FileInfoImpl;
import com.google.inject.ImplementedBy;
/**
*
* @author Adrian Cole
*
*/
@ImplementedBy(FileInfoImpl.class)
public interface FileInfo extends ResourceInfo {
Boolean isPublic();
String getMimeType();
URI getContent();
URI getPermissions();
URI getThumbnail();
}

View File

@ -1,36 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.domain;
import java.net.URI;
import java.util.Map;
import org.jclouds.mezeo.pcs.domain.internal.FileInfoWithMetadataImpl;
import com.google.inject.ImplementedBy;
/**
*
* @author Adrian Cole
*
*/
@ImplementedBy(FileInfoWithMetadataImpl.class)
public interface FileInfoWithMetadata extends FileInfo {
Map<String, URI> getMetadataItems();
}

View File

@ -1,44 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.domain;
import java.net.URI;
import org.jclouds.mezeo.pcs.domain.internal.MutableFileInfoImpl;
import com.google.inject.ImplementedBy;
/**
*
* @author Adrian Cole
*
*/
@ImplementedBy(MutableFileInfoImpl.class)
public interface MutableFileInfo extends FileInfo, MutableResourceInfo {
void setPublic(Boolean isPublic);
void setMimeType(String value);
void setContent(URI value);
void setPermissions(URI value);
void setThumbnail(URI value);
}

View File

@ -1,64 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.domain;
import java.net.URI;
import java.util.Date;
import org.jclouds.blobstore.domain.StorageType;
import org.jclouds.mezeo.pcs.domain.internal.MutableResourceInfoImpl;
import com.google.inject.ImplementedBy;
/**
*
* @author Adrian Cole
*
*/
@ImplementedBy(MutableResourceInfoImpl.class)
public interface MutableResourceInfo extends ResourceInfo {
void setType(StorageType value);
void setUrl(URI value);
void setName(String value);
void setCreated(Date value);
void setInProject(Boolean value);
void setModified(Date value);
void setOwner(String value);
void setVersion(Integer value);
void setShared(Boolean value);
void setAccessed(Date value);
void setBytes(Long value);
void setMetadata(URI value);
void setParent(URI value);
void setTags(URI value);
}

View File

@ -1,44 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.domain;
import javax.annotation.Nullable;
import org.jclouds.io.PayloadEnclosing;
import com.google.common.collect.Multimap;
/**
*
* @author Adrian Cole
*/
public interface PCSFile extends PayloadEnclosing, Comparable<PCSFile> {
public interface Factory {
PCSFile create(@Nullable MutableFileInfo metadata);
}
/**
* @return System and User metadata relevant to this object.
*/
MutableFileInfo getMetadata();
Multimap<String, String> getAllHeaders();
void setAllHeaders(Multimap<String, String> allHeaders);
}

View File

@ -1,64 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.domain;
import java.net.URI;
import java.util.Date;
import org.jclouds.blobstore.domain.StorageType;
import org.jclouds.mezeo.pcs.domain.internal.ResourceInfoImpl;
import com.google.inject.ImplementedBy;
/**
*
* @author Adrian Cole
*
*/
@ImplementedBy(ResourceInfoImpl.class)
public interface ResourceInfo extends Comparable<ResourceInfo> {
StorageType getType();
URI getUrl();
String getName();
Date getCreated();
Boolean isInProject();
Date getModified();
String getOwner();
Integer getVersion();
Boolean isShared();
Date getAccessed();
Long getBytes();
URI getMetadata();
URI getParent();
URI getTags();
}

View File

@ -1,72 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.domain.internal;
import java.net.URI;
import java.util.Date;
import org.jclouds.blobstore.domain.StorageType;
import org.jclouds.mezeo.pcs.domain.ContainerInfo;
/**
*
* @author Adrian Cole
*
*/
public class ContainerInfoImpl extends ResourceInfoImpl implements ContainerInfo {
private final URI contents;
public ContainerInfoImpl(URI url, String name, Date created, boolean inProject, Date modified,
String owner, int version, boolean shared, Date accessed, long bytes, URI contents,
URI tags, URI metadata, URI parent) {
super(StorageType.FOLDER, url, name, created, inProject, modified, owner, version, shared,
accessed, bytes, tags, metadata, parent);
this.contents = contents;
}
public URI getContents() {
return contents;
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((contents == null) ? 0 : contents.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
if (getClass() != obj.getClass())
return false;
ContainerInfoImpl other = (ContainerInfoImpl) obj;
if (contents == null) {
if (other.contents != null)
return false;
} else if (!contents.equals(other.contents))
return false;
return true;
}
}

View File

@ -1,115 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.domain.internal;
import java.net.URI;
import java.util.Date;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;
import org.jclouds.blobstore.domain.StorageType;
import org.jclouds.mezeo.pcs.domain.ContainerList;
import org.jclouds.mezeo.pcs.domain.ResourceInfo;
/**
*
* @author Adrian Cole
*
*/
public class ContainerListImpl extends TreeSet<ResourceInfo> implements ContainerList {
private final ResourceInfo info;
private final Map<String, URI> metadataItems;
public ContainerListImpl(URI url, String name, Date created, boolean inProject, Date modified,
String owner, int version, boolean shared, Date accessed, long bytes,
SortedSet<? extends ResourceInfo> contents, URI tags, URI metadata,
Map<String, URI> metadataItems, URI parent) {
this.info = new ResourceInfoImpl(StorageType.FOLDER, url, name, created, inProject,
modified, owner, version, shared, accessed, bytes, tags, metadata, parent);
addAll(contents);
this.metadataItems = metadataItems;
}
public Map<String, URI> getMetadataItems() {
return metadataItems;
}
public Date getAccessed() {
return info.getAccessed();
}
public Long getBytes() {
return info.getBytes();
}
public Date getCreated() {
return info.getCreated();
}
public URI getMetadata() {
return info.getMetadata();
}
public Date getModified() {
return info.getModified();
}
public String getName() {
return info.getName();
}
public String getOwner() {
return info.getOwner();
}
public URI getParent() {
return info.getParent();
}
public URI getTags() {
return info.getTags();
}
public StorageType getType() {
return info.getType();
}
public URI getUrl() {
return info.getUrl();
}
public Integer getVersion() {
return info.getVersion();
}
public Boolean isInProject() {
return info.isInProject();
}
public Boolean isShared() {
return info.isShared();
}
public int compareTo(ResourceInfo o) {
return info.compareTo(o);
}
}

View File

@ -1,120 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.domain.internal;
import java.net.URI;
import java.util.Date;
import org.jclouds.blobstore.domain.StorageType;
import org.jclouds.mezeo.pcs.domain.FileInfo;
/**
*
* @author Adrian Cole
*
*/
public class FileInfoImpl extends ResourceInfoImpl implements FileInfo {
private final Boolean isPublic;
private final String mimeType;
private final URI content;
private final URI permissions;
private final URI thumbnail;
public FileInfoImpl(URI url, String name, Date created, boolean inProject,
Date modified,
String owner, int version, boolean shared, Date accessed,
boolean isPublic, String mimeType, long bytes, URI content, URI parent,
URI permissions, URI tags, URI metadata, URI thumbnail) {
super(StorageType.BLOB, url, name, created, inProject, modified, owner, version, shared,
accessed, bytes, tags, metadata, parent);
this.isPublic = isPublic;
this.mimeType = mimeType;
this.content=content;
this.permissions = permissions;
this.thumbnail = thumbnail;
}
public Boolean isPublic() {
return isPublic;
}
public String getMimeType() {
return mimeType;
}
public URI getContent() {
return content;
}
public URI getPermissions() {
return permissions;
}
public URI getThumbnail() {
return thumbnail;
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((content == null) ? 0 : content.hashCode());
result = prime * result + (isPublic ? 1231 : 1237);
result = prime * result + ((mimeType == null) ? 0 : mimeType.hashCode());
result = prime * result + ((permissions == null) ? 0 : permissions.hashCode());
result = prime * result + ((thumbnail == null) ? 0 : thumbnail.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
if (getClass() != obj.getClass())
return false;
FileInfoImpl other = (FileInfoImpl) obj;
if (content == null) {
if (other.content != null)
return false;
} else if (!content.equals(other.content))
return false;
if (isPublic != other.isPublic)
return false;
if (mimeType == null) {
if (other.mimeType != null)
return false;
} else if (!mimeType.equals(other.mimeType))
return false;
if (permissions == null) {
if (other.permissions != null)
return false;
} else if (!permissions.equals(other.permissions))
return false;
if (thumbnail == null) {
if (other.thumbnail != null)
return false;
} else if (!thumbnail.equals(other.thumbnail))
return false;
return true;
}
}

View File

@ -1,72 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.domain.internal;
import java.net.URI;
import java.util.Date;
import java.util.Map;
import org.jclouds.mezeo.pcs.domain.FileInfoWithMetadata;
/**
*
* @author Adrian Cole
*
*/
public class FileInfoWithMetadataImpl extends FileInfoImpl implements FileInfoWithMetadata {
private final Map<String, URI> metadataItems;
public FileInfoWithMetadataImpl(URI url, String name, Date created, boolean inProject,
Date modified, String owner, int version, boolean shared, Date accessed,
boolean isPublic, String mimeType, long bytes, URI content, URI parent,
URI permissions, URI tags, URI metadata, Map<String, URI> metadataItems, URI thumbnail) {
super(url, name, created, inProject, modified, owner, version, shared, accessed, isPublic,
mimeType, bytes, content, parent, permissions, tags, metadata, thumbnail);
this.metadataItems = metadataItems;
}
public Map<String, URI> getMetadataItems() {
return metadataItems;
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((metadataItems == null) ? 0 : metadataItems.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
if (getClass() != obj.getClass())
return false;
FileInfoWithMetadataImpl other = (FileInfoWithMetadataImpl) obj;
if (metadataItems == null) {
if (other.metadataItems != null)
return false;
} else if (!metadataItems.equals(other.metadataItems))
return false;
return true;
}
}

View File

@ -1,135 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.domain.internal;
import java.net.URI;
import javax.ws.rs.core.MediaType;
import org.jclouds.blobstore.domain.StorageType;
import org.jclouds.mezeo.pcs.domain.MutableFileInfo;
/**
*
* @author Adrian Cole
*
*/
public class MutableFileInfoImpl extends MutableResourceInfoImpl implements
MutableFileInfo {
private Boolean isPublic;
private String mimeType;
private URI content;
private URI permissions;
private URI thumbnail;
public MutableFileInfoImpl() {
setType(StorageType.BLOB);
setMimeType(MediaType.APPLICATION_OCTET_STREAM);
}
public String getMimeType() {
return mimeType;
}
public URI getContent() {
return content;
}
public URI getPermissions() {
return permissions;
}
public URI getThumbnail() {
return thumbnail;
}
public void setPublic(Boolean isPublic) {
this.isPublic = isPublic;
}
public Boolean isPublic() {
return isPublic;
}
public void setMimeType(String mimeType) {
this.mimeType = mimeType;
}
public void setContent(URI content) {
this.content = content;
}
public void setPermissions(URI permissions) {
this.permissions = permissions;
}
public void setThumbnail(URI thumbnail) {
this.thumbnail = thumbnail;
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((content == null) ? 0 : content.hashCode());
result = prime * result + ((isPublic == null) ? 0 : isPublic.hashCode());
result = prime * result + ((mimeType == null) ? 0 : mimeType.hashCode());
result = prime * result + ((permissions == null) ? 0 : permissions.hashCode());
result = prime * result + ((thumbnail == null) ? 0 : thumbnail.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
if (getClass() != obj.getClass())
return false;
MutableFileInfoImpl other = (MutableFileInfoImpl) obj;
if (content == null) {
if (other.content != null)
return false;
} else if (!content.equals(other.content))
return false;
if (isPublic == null) {
if (other.isPublic != null)
return false;
} else if (!isPublic.equals(other.isPublic))
return false;
if (mimeType == null) {
if (other.mimeType != null)
return false;
} else if (!mimeType.equals(other.mimeType))
return false;
if (permissions == null) {
if (other.permissions != null)
return false;
} else if (!permissions.equals(other.permissions))
return false;
if (thumbnail == null) {
if (other.thumbnail != null)
return false;
} else if (!thumbnail.equals(other.thumbnail))
return false;
return true;
}
}

View File

@ -1,271 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.domain.internal;
import java.net.URI;
import java.util.Date;
import org.jclouds.blobstore.domain.StorageType;
import org.jclouds.mezeo.pcs.domain.MutableResourceInfo;
import org.jclouds.mezeo.pcs.domain.ResourceInfo;
/**
*
* @author Adrian Cole
*
*/
public class MutableResourceInfoImpl implements MutableResourceInfo {
private StorageType type;
private URI url;
private String name;
private Date created;
private Boolean inProject;
private Date modified;
private String owner;
private Integer version;
private Boolean shared;
private Date accessed;
private Long bytes;
private URI tags;
private URI metadata;
private URI parent;
public int compareTo(ResourceInfo o) {
if (getName() == null)
return -1;
return (this == o) ? 0 : getName().compareTo(o.getName());
}
public StorageType getType() {
return type;
}
public void setType(StorageType type) {
this.type = type;
}
public URI getUrl() {
return url;
}
public void setUrl(URI url) {
this.url = url;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getCreated() {
return created;
}
public void setCreated(Date created) {
this.created = created;
}
public Boolean isInProject() {
return inProject;
}
public void setInProject(Boolean inProject) {
this.inProject = inProject;
}
public Date getModified() {
return modified;
}
public void setModified(Date modified) {
this.modified = modified;
}
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
public Integer getVersion() {
return version;
}
public void setVersion(Integer version) {
this.version = version;
}
public Boolean isShared() {
return shared;
}
public void setShared(Boolean shared) {
this.shared = shared;
}
public Date getAccessed() {
return accessed;
}
public void setAccessed(Date accessed) {
this.accessed = accessed;
}
public Long getBytes() {
return bytes;
}
public void setBytes(Long bytes) {
this.bytes = bytes;
}
public URI getTags() {
return tags;
}
public void setTags(URI tags) {
this.tags = tags;
}
public URI getMetadata() {
return metadata;
}
public void setMetadata(URI metadata) {
this.metadata = metadata;
}
public URI getParent() {
return parent;
}
public void setParent(URI parent) {
this.parent = parent;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((accessed == null) ? 0 : accessed.hashCode());
result = prime * result + ((bytes == null) ? 0 : bytes.hashCode());
result = prime * result + ((created == null) ? 0 : created.hashCode());
result = prime * result + ((inProject == null) ? 0 : inProject.hashCode());
result = prime * result + ((metadata == null) ? 0 : metadata.hashCode());
result = prime * result + ((modified == null) ? 0 : modified.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((owner == null) ? 0 : owner.hashCode());
result = prime * result + ((parent == null) ? 0 : parent.hashCode());
result = prime * result + ((shared == null) ? 0 : shared.hashCode());
result = prime * result + ((tags == null) ? 0 : tags.hashCode());
result = prime * result + ((type == null) ? 0 : type.hashCode());
result = prime * result + ((url == null) ? 0 : url.hashCode());
result = prime * result + ((version == null) ? 0 : version.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
MutableResourceInfoImpl other = (MutableResourceInfoImpl) obj;
if (accessed == null) {
if (other.accessed != null)
return false;
} else if (!accessed.equals(other.accessed))
return false;
if (bytes == null) {
if (other.bytes != null)
return false;
} else if (!bytes.equals(other.bytes))
return false;
if (created == null) {
if (other.created != null)
return false;
} else if (!created.equals(other.created))
return false;
if (inProject == null) {
if (other.inProject != null)
return false;
} else if (!inProject.equals(other.inProject))
return false;
if (metadata == null) {
if (other.metadata != null)
return false;
} else if (!metadata.equals(other.metadata))
return false;
if (modified == null) {
if (other.modified != null)
return false;
} else if (!modified.equals(other.modified))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (owner == null) {
if (other.owner != null)
return false;
} else if (!owner.equals(other.owner))
return false;
if (parent == null) {
if (other.parent != null)
return false;
} else if (!parent.equals(other.parent))
return false;
if (shared == null) {
if (other.shared != null)
return false;
} else if (!shared.equals(other.shared))
return false;
if (tags == null) {
if (other.tags != null)
return false;
} else if (!tags.equals(other.tags))
return false;
if (type == null) {
if (other.type != null)
return false;
} else if (!type.equals(other.type))
return false;
if (url == null) {
if (other.url != null)
return false;
} else if (!url.equals(other.url))
return false;
if (version == null) {
if (other.version != null)
return false;
} else if (!version.equals(other.version))
return false;
return true;
}
}

View File

@ -1,78 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.domain.internal;
import static com.google.common.base.Preconditions.checkNotNull;
import javax.inject.Inject;
import org.jclouds.http.internal.PayloadEnclosingImpl;
import org.jclouds.mezeo.pcs.domain.MutableFileInfo;
import org.jclouds.mezeo.pcs.domain.PCSFile;
import com.google.common.collect.LinkedHashMultimap;
import com.google.common.collect.Multimap;
/**
* Default Implementation of {@link PCSFile}.
*
* @author Adrian Cole
*/
public class PCSFileImpl extends PayloadEnclosingImpl implements PCSFile, Comparable<PCSFile> {
private final MutableFileInfo metadata;
private Multimap<String, String> allHeaders = LinkedHashMultimap.create();
@Inject
public PCSFileImpl(MutableFileInfo metadata) {
super();// no MD5 support
this.metadata = metadata;
}
/**
* {@inheritDoc}
*/
public MutableFileInfo getMetadata() {
return metadata;
}
/**
* {@inheritDoc}
*/
public Multimap<String, String> getAllHeaders() {
return allHeaders;
}
/**
* {@inheritDoc}
*/
public void setAllHeaders(Multimap<String, String> allHeaders) {
this.allHeaders = checkNotNull(allHeaders, "allHeaders");
}
/**
* {@inheritDoc}
*/
public int compareTo(PCSFile o) {
if (getMetadata().getName() == null)
return -1;
return (this == o) ? 0 : getMetadata().getName().compareTo(o.getMetadata().getName());
}
}

View File

@ -1,224 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.domain.internal;
import java.net.URI;
import java.util.Date;
import org.jclouds.blobstore.domain.StorageType;
import org.jclouds.mezeo.pcs.domain.ResourceInfo;
/**
*
* @author Adrian Cole
*
*/
public class ResourceInfoImpl implements ResourceInfo {
private final StorageType type;
private final URI url;
private final String name;
private final Date created;
private final boolean inProject;
private final Date modified;
private final String owner;
private final int version;
private final boolean shared;
private final Date accessed;
private final long bytes;
private final URI tags;
private final URI metadata;
private final URI parent;
protected ResourceInfoImpl(StorageType type, URI url, String name, Date created,
boolean inProject, Date modified, String owner, int version, boolean shared,
Date accessed, long bytes, URI tags, URI metadata, URI parent) {
super();
this.type = type;
this.url = url;
this.name = name;
this.created = created;
this.inProject = inProject;
this.modified = modified;
this.owner = owner;
this.version = version;
this.shared = shared;
this.accessed = accessed;
this.bytes = bytes;
this.tags = tags;
this.metadata = metadata;
this.parent = parent;
}
public int compareTo(ResourceInfo o) {
if (getName() == null)
return -1;
if (o.getName() == null)
return 1;
return (this == o) ? 0 : getName().compareTo(o.getName());
}
public StorageType getType() {
return type;
}
public URI getUrl() {
return url;
}
public String getName() {
return name;
}
public Date getCreated() {
return created;
}
public Boolean isInProject() {
return inProject;
}
public Date getModified() {
return modified;
}
public String getOwner() {
return owner;
}
public Integer getVersion() {
return version;
}
public Boolean isShared() {
return shared;
}
public Date getAccessed() {
return accessed;
}
public Long getBytes() {
return bytes;
}
public URI getTags() {
return tags;
}
public URI getMetadata() {
return metadata;
}
public URI getParent() {
return parent;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((accessed == null) ? 0 : accessed.hashCode());
result = prime * result + (int) (bytes ^ (bytes >>> 32));
result = prime * result + ((created == null) ? 0 : created.hashCode());
result = prime * result + (inProject ? 1231 : 1237);
result = prime * result + ((metadata == null) ? 0 : metadata.hashCode());
result = prime * result + ((modified == null) ? 0 : modified.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((owner == null) ? 0 : owner.hashCode());
result = prime * result + ((parent == null) ? 0 : parent.hashCode());
result = prime * result + (shared ? 1231 : 1237);
result = prime * result + ((tags == null) ? 0 : tags.hashCode());
result = prime * result + ((type == null) ? 0 : type.hashCode());
result = prime * result + ((url == null) ? 0 : url.hashCode());
result = prime * result + version;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ResourceInfoImpl other = (ResourceInfoImpl) obj;
if (accessed == null) {
if (other.accessed != null)
return false;
} else if (!accessed.equals(other.accessed))
return false;
if (bytes != other.bytes)
return false;
if (created == null) {
if (other.created != null)
return false;
} else if (!created.equals(other.created))
return false;
if (inProject != other.inProject)
return false;
if (metadata == null) {
if (other.metadata != null)
return false;
} else if (!metadata.equals(other.metadata))
return false;
if (modified == null) {
if (other.modified != null)
return false;
} else if (!modified.equals(other.modified))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (owner == null) {
if (other.owner != null)
return false;
} else if (!owner.equals(other.owner))
return false;
if (parent == null) {
if (other.parent != null)
return false;
} else if (!parent.equals(other.parent))
return false;
if (shared != other.shared)
return false;
if (tags == null) {
if (other.tags != null)
return false;
} else if (!tags.equals(other.tags))
return false;
if (type == null) {
if (other.type != null)
return false;
} else if (!type.equals(other.type))
return false;
if (url == null) {
if (other.url != null)
return false;
} else if (!url.equals(other.url))
return false;
if (version != other.version)
return false;
return true;
}
}

View File

@ -1,39 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.endpoints;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
/**
* Related to a resource of type Contacts, which represents the user's contact list.
*
* @author Adrian Cole
*
*/
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = { ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Qualifier
public @interface Contacts {
}

View File

@ -1,40 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.endpoints;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
/**
* Related to a resource of type MetaContainers, which lists the metacontainers available to the
* user.
*
* @author Adrian Cole
*
*/
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = { ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Qualifier
public @interface Metacontainers {
}

View File

@ -1,39 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.endpoints;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
/**
* Related to a resource of type Projects, which lists the projects available to the user.
*
* @author Adrian Cole
*
*/
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = { ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Qualifier
public @interface Projects {
}

View File

@ -1,39 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.endpoints;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
/**
* Related to a resource of type RecycleBin, which contains the user's deleted files.
*
* @author Adrian Cole
*
*/
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = { ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Qualifier
public @interface Recyclebin {
}

View File

@ -1,39 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.endpoints;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
/**
* Related to a resource of type Container, which is the user's root Container
*
* @author Adrian Cole
*
*/
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = { ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Qualifier
public @interface RootContainer {
}

View File

@ -1,39 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.endpoints;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
/**
* Related to a resource of type Shares, which lists the items shared to and by the user.
*
* @author Adrian Cole
*
*/
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = { ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Qualifier
public @interface Shares {
}

View File

@ -1,39 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.endpoints;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
/**
* Related to a resource of type Tags, which lists all the tags applied to the user's files.
*
* @author Adrian Cole
*
*/
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = { ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Qualifier
public @interface Tags {
}

View File

@ -1,39 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.endpoints;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
/**
* Related to a resource of type WebDAV
*
* @author Adrian Cole
*
*/
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = { ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Qualifier
public @interface WebDAV {
}

View File

@ -1,74 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.functions;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkState;
import java.util.Map;
import javax.inject.Inject;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.HttpResponse;
import org.jclouds.http.functions.ReturnStringIf2xx;
import org.jclouds.rest.InvocationContext;
import org.jclouds.rest.internal.GeneratedHttpRequest;
import com.google.common.base.Function;
/**
*
* @author Adrian Cole
*/
public class AddMetadataItemIntoMap implements Function<HttpResponse, Void>, InvocationContext<AddMetadataItemIntoMap> {
ReturnStringIf2xx returnIf200;
private GeneratedHttpRequest<?> request;
@Inject
private AddMetadataItemIntoMap(ReturnStringIf2xx returnIf200) {
this.returnIf200 = returnIf200;
}
@SuppressWarnings("unchecked")
public Void apply(HttpResponse from) {
checkState(request.getArgs() != null, "args should be initialized at this point");
Map<String, String> map = null;
String key = null;
for (Object arg : request.getArgs()) {
if (arg instanceof Map)
map = (Map<String, String>) arg;
else if (arg instanceof String)
key = arg.toString();
}
checkState(map != null, "No Map found in args, improper method declarations");
checkState(key != null, "No String found in args, improper method declarations");
map.put(key, returnIf200.apply(from).trim());
return null;
}
@Override
public AddMetadataItemIntoMap setContext(HttpRequest request) {
checkArgument(request instanceof GeneratedHttpRequest<?>, "note this handler requires a GeneratedHttpRequest");
this.request = (GeneratedHttpRequest<?>) request;
return this;
}
}

View File

@ -1,43 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.functions;
import javax.inject.Singleton;
import org.jclouds.blobstore.ContainerNotFoundException;
import com.google.common.base.Function;
import com.google.common.base.Throwables;
/**
*
* @author Adrian Cole
*/
@Singleton
public class ReturnFalseIfContainerNotFound implements Function<Exception, Boolean> {
@Override
public Boolean apply(Exception from) {
if (from instanceof ContainerNotFoundException) {
return false;
}
throw Throwables.propagate(from);
}
}

View File

@ -1,45 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.functions;
import javax.inject.Singleton;
import org.jclouds.http.HttpResponseException;
import com.google.common.base.Function;
import com.google.common.base.Throwables;
/**
*
* @author Adrian Cole
*/
@Singleton
public class ReturnTrueIfContainerAlreadyExists implements Function<Exception, Boolean> {
@Override
public Boolean apply(Exception from) {
if (from instanceof HttpResponseException) {
HttpResponseException responseException = (HttpResponseException) from;
if ("The directory already exists.".equals(responseException.getContent())) {
return true;
}
}
throw Throwables.propagate(from);
}
}

View File

@ -1,54 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.handlers;
import javax.annotation.Resource;
import javax.inject.Inject;
import org.jclouds.http.HttpCommand;
import org.jclouds.http.HttpResponse;
import org.jclouds.http.HttpRetryHandler;
import org.jclouds.http.handlers.BackoffLimitedRetryHandler;
import org.jclouds.logging.Logger;
/**
* Handles Retryable responses with error codes in the 4xx range
*
* @author Adrian Cole
*/
public class PCSClientErrorRetryHandler implements HttpRetryHandler {
private final BackoffLimitedRetryHandler backoffHandler;
@Inject
public PCSClientErrorRetryHandler(BackoffLimitedRetryHandler backoffHandler) {
this.backoffHandler = backoffHandler;
}
@Resource
protected Logger logger = Logger.NULL;
public boolean shouldRetryRequest(HttpCommand command, HttpResponse response) {
if (response.getStatusCode() == 400) {
return backoffHandler.shouldRetryRequest(command, response);
}
return false;
}
}

View File

@ -1,85 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.options;
import static com.google.common.base.Preconditions.checkArgument;
import org.jclouds.http.options.BaseHttpRequestOptions;
import com.google.common.collect.Multimap;
/**
* Contains options supported in the REST API for the PUT file operation. <h2>
* Usage</h2> The recommended way to instantiate a PutFileOptions object is to statically import
* PutFileOptions.Builder.* and invoke a static creation method followed by an instance mutator (if
* needed):
* <p/>
* <code>
* import static org.jclouds.mezeo.pcs2.options.PutFileOptions.Builder.*
* import org.jclouds.mezeo.pcs2.PCSClient;
* <p/>
* PCSClient connection = // get connection
* Future<Void> added = connection.appendFile("container",range(0,3));
* <code>
*
* @author Adrian Cole
*/
public class PutBlockOptions extends BaseHttpRequestOptions {
public static final PutBlockOptions NONE = new PutBlockOptions();
private String range;
@Override
public Multimap<String, String> buildRequestHeaders() {
Multimap<String, String> headers = super.buildRequestHeaders();
String range = getRange();
if (range != null)
headers.put("Content-Range", this.getRange());
return headers;
}
/**
* For use in the header Content-Range
* <p />
*
* @see PutBlockOptions#range(long, long)
*/
public String getRange() {
return range;
}
/**
* download the specified range of the object.
*/
public PutBlockOptions range(long start, long end) {
checkArgument(start >= 0, "start must be >= 0");
checkArgument(end >= 0, "end must be >= 0");
range = String.format("bytes %d-%d/*", start, end);
return this;
}
public static class Builder {
/**
* @see PutBlockOptions#range(long, long)
*/
public static PutBlockOptions range(long start, long end) {
PutBlockOptions options = new PutBlockOptions();
return options.range(start, end);
}
}
}

View File

@ -1,120 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.xml;
import java.net.URI;
import java.util.Map;
import org.jclouds.http.functions.ParseSax;
import org.jclouds.mezeo.pcs.PCSCloudAsyncClient;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import com.google.common.collect.Maps;
/**
* Parses the discovery response from xlink refs.
*
* @author Adrian Cole
*/
public class CloudXlinkHandler extends ParseSax.HandlerWithResult<PCSCloudAsyncClient.Response> {
private Map<String, URI> map = Maps.newHashMap();
public static class PCSCloudResponseImpl implements PCSCloudAsyncClient.Response {
private final Map<String, URI> map;
public PCSCloudResponseImpl(Map<String, URI> map) {
this.map = map;
}
public URI getContactsUrl() {
return map.get("contacts");
}
public URI getMetacontainersUrl() {
return map.get("metacontainers");
}
public URI getProjectsUrl() {
return map.get("projects");
}
public URI getRecyclebinUrl() {
return map.get("recyclebin");
}
public URI getRootContainerUrl() {
return map.get("rootContainer");
}
public URI getSharesUrl() {
return map.get("shares");
}
public URI getTagsUrl() {
return map.get("tags");
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((map == null) ? 0 : map.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
PCSCloudResponseImpl other = (PCSCloudResponseImpl) obj;
if (map == null) {
if (other.map != null)
return false;
} else if (!map.equals(other.map))
return false;
return true;
}
@Override
public String toString() {
return "PCSDiscoveryResponseImpl [map=" + map + "]";
}
}
public PCSCloudAsyncClient.Response getResult() {
return new PCSCloudResponseImpl(map);
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
int index = attributes.getIndex("xlink:href");
if (index != -1) {
map.put(qName, URI.create(attributes.getValue(index)));
}
}
}

View File

@ -1,277 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.xml;
import java.net.URI;
import java.util.Date;
import java.util.Map;
import java.util.SortedSet;
import java.util.regex.Pattern;
import javax.annotation.Resource;
import javax.inject.Inject;
import org.jclouds.date.DateService;
import org.jclouds.http.functions.ParseSax;
import org.jclouds.logging.Logger;
import org.jclouds.mezeo.pcs.domain.ContainerList;
import org.jclouds.mezeo.pcs.domain.ResourceInfo;
import org.jclouds.mezeo.pcs.domain.internal.ContainerInfoImpl;
import org.jclouds.mezeo.pcs.domain.internal.ContainerListImpl;
import org.jclouds.mezeo.pcs.domain.internal.FileInfoImpl;
import org.jclouds.util.Strings2;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
/**
* @author Adrian Cole
*/
public class ContainerHandler extends ParseSax.HandlerWithResult<ContainerList> {
@Resource
protected Logger logger = Logger.NULL;
private SortedSet<ResourceInfo> containerMetadata = Sets.newTreeSet();
protected Map<String, URI> metadataItems = Maps.newHashMap();
private URI rootUrl;
private String rootName;
private Date rootCreated;
private boolean rootInproject;
private Date rootModified;
private String rootOwner;
private int rootVersion;
private boolean rootShared;
private Date rootAccessed;
private long rootBytes;
private URI rootParent;
private URI rootTags;
private URI rootMetadata;
private URI currentUrl;
private String currentName;
private Date currentCreated;
private boolean currentInproject;
private Date currentModified;
private String currentOwner;
private int currentVersion;
private boolean currentShared;
private Date currentAccessed;
private long currentBytes;
private URI currentParent;
private URI currentTags;
private URI currentMetadata;
private URI currentContents;
private boolean currentPublic;
private String currentMimeType;
private URI currentContent;
private URI currentPermissions;
private URI currentThumbnail;
private StringBuilder currentText = new StringBuilder();
private final DateService dateParser;
boolean inContainer = false;
boolean inContents = false;
private ContainerListImpl rootContainer;
@Inject
public ContainerHandler(DateService dateParser) {
this.dateParser = dateParser;
}
public ContainerList getResult() {
return rootContainer;
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
if (qName.equals("contents") && attributes.getIndex("count") != -1) {
int index = attributes.getIndex("xlink:href");
if (index != -1) {
rootUrl = URI.create(attributes.getValue(index).replace("/contents", ""));
}
inContents = true;
return;
} else if (qName.equals("container")) {
if (inContents)
inContainer = true;
int index = attributes.getIndex("xlink:href");
if (index != -1) {
currentUrl = URI.create(attributes.getValue(index));
}
} else if (qName.equals("parent")) {
int index = attributes.getIndex("xlink:href");
if (index != -1) {
currentParent = URI.create(attributes.getValue(index));
if (!inContents)
rootParent = currentParent;
}
} else if (qName.equals("file")) {
int index = attributes.getIndex("xlink:href");
if (index != -1) {
currentUrl = URI.create(attributes.getValue(index));
}
} else if (qName.equals("content")) {
int index = attributes.getIndex("xlink:href");
if (index != -1) {
currentContent = URI.create(attributes.getValue(index));
}
} else if (qName.equals("contents")) {
int index = attributes.getIndex("xlink:href");
if (index != -1) {
currentContents = URI.create(attributes.getValue(index));
}
} else if (qName.equals("permissions")) {
int index = attributes.getIndex("xlink:href");
if (index != -1) {
currentPermissions = URI.create(attributes.getValue(index));
}
} else if (qName.equals("tags")) {
int index = attributes.getIndex("xlink:href");
if (index != -1) {
currentTags = URI.create(attributes.getValue(index));
if (!inContents)
rootTags = currentTags;
}
} else if (qName.equals("thumbnail")) {
int index = attributes.getIndex("xlink:href");
if (index != -1) {
currentThumbnail = URI.create(attributes.getValue(index));
}
} else if (qName.equals("metadata")) {
int index = attributes.getIndex("xlink:href");
if (index != -1) {
currentMetadata = URI.create(attributes.getValue(index));
if (!inContents)
rootMetadata = currentMetadata;
}
} else if (qName.equals("metadata-item")) {
int index = attributes.getIndex("xlink:href");
if (index != -1) {
String key = Strings2.replaceAll(attributes.getValue(index), METADATA_PATTERN, "");
metadataItems.put(key.toLowerCase(), URI.create(attributes.getValue(index)));
}
}
}
public final Pattern METADATA_PATTERN = Pattern.compile(".*/metadata/");
@Override
public void endElement(String uri, String name, String qName) {
if (qName.equals("contents")) {
if (!inContainer)
inContents = false;
currentText = new StringBuilder();
return;
}
if (qName.equals("container") && !inContents) {
rootContainer = new ContainerListImpl(rootUrl, rootName, rootCreated, rootInproject,
rootModified, rootOwner, rootVersion, rootShared, rootAccessed, rootBytes,
containerMetadata, rootTags, rootMetadata, metadataItems, rootParent);
} else if (qName.equals("container") || qName.equals("file")) {
if (qName.equals("container")) {
inContainer = false;
containerMetadata.add(new ContainerInfoImpl(currentUrl, currentName, currentCreated,
currentInproject, currentModified, currentOwner, currentVersion,
currentShared, currentAccessed, currentBytes, currentContents, currentTags,
currentMetadata, currentParent));
} else {
containerMetadata.add(new FileInfoImpl(currentUrl, currentName, currentCreated,
currentInproject, currentModified, currentOwner, currentVersion,
currentShared, currentAccessed, currentPublic, currentMimeType, currentBytes,
currentContent, currentParent, currentPermissions, currentTags,
currentMetadata, currentThumbnail));
}
currentUrl = null;
currentName = null;
currentCreated = null;
currentInproject = false;
currentModified = null;
currentOwner = null;
currentVersion = 0;
currentShared = false;
currentAccessed = null;
currentBytes = 0;
currentPublic = false;
currentMimeType = null;
currentParent = null;
currentContents = null;
currentContent = null;
currentPermissions = null;
currentTags = null;
currentMetadata = null;
currentThumbnail = null;
} else if (qName.equals("name")) {
currentName = currentText.toString().trim();
if (!inContents)
rootName = currentName;
} else if (qName.equals("created")) {
currentCreated = dateParser.fromSeconds(Long.parseLong(currentText.toString().trim()));
if (!inContents)
rootCreated = currentCreated;
} else if (qName.equals("inproject")) {
currentInproject = Boolean.parseBoolean(currentText.toString().trim());
if (!inContents)
rootInproject = currentInproject;
} else if (qName.equals("modified")) {
currentModified = dateParser.fromSeconds(Long.parseLong(currentText.toString().trim()));
if (!inContents)
rootModified = currentModified;
} else if (qName.equals("owner")) {
currentOwner = currentText.toString().trim();
if (!inContents)
rootOwner = currentOwner;
} else if (qName.equals("version")) {
currentVersion = Integer.parseInt(currentText.toString().trim());
if (!inContents)
rootVersion = currentVersion;
} else if (qName.equals("shared")) {
currentShared = Boolean.parseBoolean(currentText.toString().trim());
if (!inContents)
rootShared = currentShared;
} else if (qName.equals("accessed")) {
currentAccessed = dateParser.fromSeconds(Long.parseLong(currentText.toString().trim()));
if (!inContents)
rootAccessed = currentAccessed;
} else if (qName.equals("bytes")) {
currentBytes = Long.parseLong(currentText.toString().trim());
if (!inContents)
rootBytes = currentBytes;
} else if (qName.equals("public")) {
currentPublic = Boolean.parseBoolean(currentText.toString().trim());
} else if (qName.equals("mime_type")) {
currentMimeType = currentText.toString().trim();
}
currentText = new StringBuilder();
}
public void characters(char ch[], int start, int length) {
currentText.append(ch, start, length);
}
}

View File

@ -1,182 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs.xml;
import java.net.URI;
import java.util.Date;
import java.util.Map;
import java.util.regex.Pattern;
import javax.inject.Inject;
import org.jclouds.date.DateService;
import org.jclouds.http.functions.ParseSax;
import org.jclouds.mezeo.pcs.domain.FileInfoWithMetadata;
import org.jclouds.mezeo.pcs.domain.internal.FileInfoWithMetadataImpl;
import org.jclouds.util.Strings2;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import com.google.common.collect.Maps;
/**
* @author Adrian Cole
*/
public class FileHandler extends ParseSax.HandlerWithResult<FileInfoWithMetadata> {
private static final Pattern CONTENT_PATTERN = Pattern.compile("/content");
private static final Pattern METADATA_PATTERN = Pattern.compile(".*/metadata/");
protected Map<String, URI> metadataItems = Maps.newHashMap();
protected URI currentUrl;
private String currentName;
private Date currentCreated;
private boolean currentInproject;
private Date currentModified;
private String currentOwner;
private int currentVersion;
private boolean currentShared;
private Date currentAccessed;
private long currentBytes;
private String currentMimeType;
private boolean currentPublic;
protected StringBuilder currentText = new StringBuilder();
private final DateService dateParser;
private FileInfoWithMetadata fileMetadataList;
private URI currentPermissions;
private URI currentTags;
private URI currentThumbnail;
private URI currentMetadata;
private URI currentContent;
private URI currentParent;
@Inject
public FileHandler(DateService dateParser) {
this.dateParser = dateParser;
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
if (qName.equals("content")) {
int index = attributes.getIndex("xlink:href");
if (index != -1) {
currentContent = URI.create(attributes.getValue(index));
currentUrl = URI.create(Strings2.replaceAll(attributes.getValue(index), CONTENT_PATTERN,
""));
}
} else if (qName.equals("permissions")) {
int index = attributes.getIndex("xlink:href");
if (index != -1) {
currentPermissions = URI.create(attributes.getValue(index));
}
} else if (qName.equals("tags")) {
int index = attributes.getIndex("xlink:href");
if (index != -1) {
currentTags = URI.create(attributes.getValue(index));
}
} else if (qName.equals("parent")) {
int index = attributes.getIndex("xlink:href");
if (index != -1) {
currentParent = URI.create(attributes.getValue(index));
}
} else if (qName.equals("thumbnail")) {
int index = attributes.getIndex("xlink:href");
if (index != -1) {
currentThumbnail = URI.create(attributes.getValue(index));
}
} else if (qName.equals("metadata")) {
int index = attributes.getIndex("xlink:href");
if (index != -1) {
currentMetadata = URI.create(attributes.getValue(index));
}
} else if (qName.equals("metadata-item")) {
int index = attributes.getIndex("xlink:href");
if (index != -1) {
String key = Strings2.replaceAll(attributes.getValue(index), METADATA_PATTERN, "");
metadataItems.put(key.toLowerCase(), URI.create(attributes.getValue(index)));
}
}
}
@Override
public void endElement(String uri, String name, String qName) {
if (qName.equals("name")) {
currentName = currentText.toString().trim();
} else if (qName.equals("created")) {
currentCreated = dateParser.fromSeconds(Long.parseLong(currentText.toString().trim()));
} else if (qName.equals("inproject")) {
currentInproject = Boolean.parseBoolean(currentText.toString().trim());
} else if (qName.equals("modified")) {
currentModified = dateParser.fromSeconds(Long.parseLong(currentText.toString().trim()));
} else if (qName.equals("owner")) {
currentOwner = currentText.toString().trim();
} else if (qName.equals("version")) {
currentVersion = Integer.parseInt(currentText.toString().trim());
} else if (qName.equals("shared")) {
currentShared = Boolean.parseBoolean(currentText.toString().trim());
} else if (qName.equals("accessed")) {
currentAccessed = dateParser.fromSeconds(Long.parseLong(currentText.toString().trim()));
} else if (qName.equals("bytes")) {
currentBytes = Long.parseLong(currentText.toString().trim());
} else if (qName.equals("mime_type")) {
currentMimeType = currentText.toString().trim();
} else if (qName.equals("public")) {
currentPublic = Boolean.parseBoolean(currentText.toString().trim());
} else if (qName.equals("file")) {
fileMetadataList = new FileInfoWithMetadataImpl(currentUrl, currentName, currentCreated,
currentInproject, currentModified, currentOwner, currentVersion, currentShared,
currentAccessed, currentPublic, currentMimeType, currentBytes, currentContent,
currentParent, currentPermissions, currentTags, currentMetadata, metadataItems,
currentThumbnail);
currentUrl = null;
currentName = null;
currentCreated = null;
currentInproject = false;
currentModified = null;
currentOwner = null;
currentVersion = 0;
currentShared = false;
currentAccessed = null;
currentBytes = 0;
currentMimeType = null;
currentPublic = false;
}
currentText = new StringBuilder();
}
public void characters(char ch[], int start, int length) {
currentText.append(ch, start, length);
}
@Override
public FileInfoWithMetadata getResult() {
return fileMetadataList;
}
}

View File

@ -1,298 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.mezeo.pcs;
import static org.testng.Assert.assertEquals;
import java.io.IOException;
import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.net.URI;
import java.util.Map;
import java.util.Properties;
import org.jclouds.blobstore.binders.BindBlobToMultipartFormTest;
import org.jclouds.blobstore.functions.ReturnNullOnKeyNotFound;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.RequiresHttp;
import org.jclouds.http.filters.BasicAuthentication;
import org.jclouds.http.functions.ParseSax;
import org.jclouds.http.functions.ParseURIFromListOrLocationHeaderIf20x;
import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.http.functions.ReturnInputStream;
import org.jclouds.mezeo.pcs.PCSAsyncClient;
import org.jclouds.mezeo.pcs.PCSClient;
import org.jclouds.mezeo.pcs.PCSCloudAsyncClient.Response;
import org.jclouds.mezeo.pcs.blobstore.functions.BlobToPCSFile;
import org.jclouds.mezeo.pcs.config.PCSRestClientModule;
import org.jclouds.mezeo.pcs.domain.PCSFile;
import org.jclouds.mezeo.pcs.functions.AddMetadataItemIntoMap;
import org.jclouds.mezeo.pcs.options.PutBlockOptions;
import org.jclouds.mezeo.pcs.xml.ContainerHandler;
import org.jclouds.mezeo.pcs.xml.FileHandler;
import org.jclouds.rest.AsyncClientFactory;
import org.jclouds.rest.ConfiguresRestClient;
import org.jclouds.rest.RestClientTest;
import org.jclouds.rest.RestContextFactory;
import org.jclouds.rest.RestContextSpec;
import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
import com.google.inject.Module;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code PCSClient}
*
* @author Adrian Cole
*/
@Test(groups = "unit", testName = "pcs2.PCSClientTest")
public class PCSAsyncClientTest extends RestClientTest<PCSAsyncClient> {
public void testList() throws SecurityException, NoSuchMethodException, IOException {
Method method = PCSAsyncClient.class.getMethod("list");
GeneratedHttpRequest request = processor.createRequest(method);
assertRequestLineEquals(request, "GET http://root HTTP/1.1");
assertNonPayloadHeadersEqual(request, "X-Cloud-Depth: 2\n");
assertPayloadEquals(request, null, null, false);
assertResponseParserClassEquals(method, request, ParseSax.class);
assertSaxResponseParserClassEquals(method, ContainerHandler.class);
assertExceptionParserClassEquals(method, null);
checkFilters(request);
}
public void testCreateContainer() throws SecurityException, NoSuchMethodException, IOException {
Method method = PCSAsyncClient.class.getMethod("createContainer", String.class);
GeneratedHttpRequest request = processor.createRequest(method, "container");
assertRequestLineEquals(request, "POST http://root/contents HTTP/1.1");
assertNonPayloadHeadersEqual(request, "");
assertPayloadEquals(request, "<container><name>container</name></container>",
"application/vnd.csp.container-info+xml", false);
assertResponseParserClassEquals(method, request, ParseURIFromListOrLocationHeaderIf20x.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, null);
checkFilters(request);
}
public void testDeleteContainer() throws SecurityException, NoSuchMethodException, IOException {
Method method = PCSAsyncClient.class.getMethod("deleteContainer", URI.class);
GeneratedHttpRequest request = processor.createRequest(method, URI.create("http://localhost/container/1234"));
assertRequestLineEquals(request, "DELETE http://localhost/container/1234 HTTP/1.1");
assertNonPayloadHeadersEqual(request, "");
assertPayloadEquals(request, null, null, false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, ReturnVoidOnNotFoundOr404.class);
checkFilters(request);
}
public void testListURI() throws SecurityException, NoSuchMethodException, IOException {
Method method = PCSAsyncClient.class.getMethod("list", URI.class);
GeneratedHttpRequest request = processor.createRequest(method, URI.create("http://localhost/mycontainer"));
assertRequestLineEquals(request, "GET http://localhost/mycontainer HTTP/1.1");
assertNonPayloadHeadersEqual(request, "X-Cloud-Depth: 2\n");
assertPayloadEquals(request, null, null, false);
assertResponseParserClassEquals(method, request, ParseSax.class);
assertSaxResponseParserClassEquals(method, ContainerHandler.class);
assertExceptionParserClassEquals(method, null);
checkFilters(request);
}
public void testGetFileInfo() throws SecurityException, NoSuchMethodException, IOException {
Method method = PCSAsyncClient.class.getMethod("getFileInfo", URI.class);
GeneratedHttpRequest request = processor.createRequest(method, URI.create("http://localhost/myfile"));
assertRequestLineEquals(request, "GET http://localhost/myfile HTTP/1.1");
assertNonPayloadHeadersEqual(request, "X-Cloud-Depth: 2\n");
assertPayloadEquals(request, null, null, false);
assertResponseParserClassEquals(method, request, ParseSax.class);
assertSaxResponseParserClassEquals(method, FileHandler.class);
assertExceptionParserClassEquals(method, ReturnNullOnKeyNotFound.class);
checkFilters(request);
}
public void testUploadFile() throws SecurityException, NoSuchMethodException, IOException {
Method method = PCSAsyncClient.class.getMethod("uploadFile", URI.class, PCSFile.class);
GeneratedHttpRequest request = processor.createRequest(method, URI.create("http://localhost/mycontainer"), blobToPCSFile
.apply(BindBlobToMultipartFormTest.TEST_BLOB));
assertRequestLineEquals(request, "POST http://localhost/mycontainer/contents HTTP/1.1");
assertNonPayloadHeadersEqual(request, "");
assertPayloadEquals(request, BindBlobToMultipartFormTest.EXPECTS, "multipart/form-data; boundary=--JCLOUDS--",
false);
assertResponseParserClassEquals(method, request, ParseURIFromListOrLocationHeaderIf20x.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, null);
checkFilters(request);
}
public void testUploadBlock() throws SecurityException, NoSuchMethodException, IOException {
Method method = PCSAsyncClient.class.getMethod("uploadBlock", URI.class, PCSFile.class, Array.newInstance(
PutBlockOptions.class, 0).getClass());
GeneratedHttpRequest request = processor.createRequest(method, URI.create("http://localhost/mycontainer"), blobToPCSFile
.apply(BindBlobToMultipartFormTest.TEST_BLOB));
assertRequestLineEquals(request, "PUT http://localhost/mycontainer/content HTTP/1.1");
assertNonPayloadHeadersEqual(request, "");
assertPayloadEquals(request, "hello", "text/plain", false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, null);
checkFilters(request);
}
public void testDownloadFile() throws SecurityException, NoSuchMethodException, IOException {
Method method = PCSAsyncClient.class.getMethod("downloadFile", URI.class);
GeneratedHttpRequest request = processor.createRequest(method, URI.create("http://localhost/container"));
assertRequestLineEquals(request, "GET http://localhost/container/content HTTP/1.1");
assertNonPayloadHeadersEqual(request, "");
assertPayloadEquals(request, null, null, false);
assertResponseParserClassEquals(method, request, ReturnInputStream.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, ReturnNullOnKeyNotFound.class);
checkFilters(request);
}
public void testDeleteFile() throws SecurityException, NoSuchMethodException, IOException {
Method method = PCSAsyncClient.class.getMethod("deleteFile", URI.class);
GeneratedHttpRequest request = processor.createRequest(method,
new Object[] { URI.create("http://localhost/contents/file") });
assertRequestLineEquals(request, "DELETE http://localhost/contents/file HTTP/1.1");
assertNonPayloadHeadersEqual(request, "");
assertPayloadEquals(request, null, null, false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, ReturnVoidOnNotFoundOr404.class);
checkFilters(request);
}
public void testPutMetadata() throws SecurityException, NoSuchMethodException, IOException {
Method method = PCSAsyncClient.class.getMethod("putMetadataItem", URI.class, String.class, String.class);
GeneratedHttpRequest request = processor.createRequest(method, URI.create("http://localhost/contents/file"), "pow", "bar");
assertRequestLineEquals(request, "PUT http://localhost/contents/file/metadata/pow HTTP/1.1");
assertNonPayloadHeadersEqual(request, "");
assertPayloadEquals(request, "bar", "application/unknown", false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, null);
checkFilters(request);
}
public void testAddEntryToMap() throws SecurityException, NoSuchMethodException, IOException {
Method method = PCSAsyncClient.class.getMethod("addMetadataItemToMap", URI.class, String.class, Map.class);
GeneratedHttpRequest request = processor.createRequest(method, URI.create("http://localhost/pow"), "newkey", ImmutableMap
.of("key", "value"));
assertRequestLineEquals(request, "GET http://localhost/pow/metadata/newkey HTTP/1.1");
assertNonPayloadHeadersEqual(request, "");
assertPayloadEquals(request, null, null, false);
assertResponseParserClassEquals(method, request, AddMetadataItemIntoMap.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, null);
checkFilters(request);
}
private BlobToPCSFile blobToPCSFile;
@Override
protected void checkFilters(HttpRequest request) {
assertEquals(request.getFilters().size(), 1);
assertEquals(request.getFilters().get(0).getClass(), BasicAuthentication.class);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<PCSAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<PCSAsyncClient>>() {
};
}
@BeforeClass
@Override
protected void setupFactory() throws IOException {
super.setupFactory();
blobToPCSFile = injector.getInstance(BlobToPCSFile.class);
}
@Override
protected Module createModule() {
return new TestPCSRestClientModule();
}
@RequiresHttp
@ConfiguresRestClient
private static final class TestPCSRestClientModule extends PCSRestClientModule {
@Override
protected void configure() {
super.configure();
}
@Override
protected Response provideCloudResponse(AsyncClientFactory factory) {
return null;
}
@Override
protected URI provideRootContainerUrl(Response response) {
return URI.create("http://root");
}
}
@Override
public RestContextSpec<PCSClient, PCSAsyncClient> createContextSpec() {
Properties properties = new Properties();
properties.setProperty("pcs.endpoint", "http://goo");
return new RestContextFactory().createContextSpec("pcs", "identity", "credential", properties);
}
}

Some files were not shown because too many files have changed in this diff Show More