Merge branches 'master' and 'jclouds-vbox-nat-host-only-working-cluster-and-live-test' into jclouds-vbox-nat-host-only-working-cluster-and-live-test

This commit is contained in:
David Ribeiro Alves 2012-03-12 11:00:15 +00:00
commit 52514a77a5
162 changed files with 3561 additions and 1067 deletions

View File

@ -123,7 +123,7 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
try {
return Iterables.find(hardwares.get(), new FindHardwareForServer(from));
} catch (NoSuchElementException e) {
logger.warn("could not find a matching hardware for server %s", from);
logger.debug("could not find a matching hardware for server %s", from);
}
return null;
}
@ -132,7 +132,7 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
try {
return Iterables.find(images.get(), new FindImageForServer(from)).getOperatingSystem();
} catch (NoSuchElementException e) {
logger.warn("could not find a matching image for server %s in location %s", from, location.get());
logger.debug("could not find a matching image for server %s in location %s", from, location.get());
}
return null;
}

View File

@ -98,7 +98,7 @@ public class InstanceToNodeMetadata implements Function<Instance, NodeMetadata>
try {
return Iterables.find(hardwares.get(), new FindHardwareForInstance(from));
} catch (NoSuchElementException e) {
logger.warn("could not find a matching hardware for instance %s", from);
logger.debug("could not find a matching hardware for instance %s", from);
}
return null;
}
@ -107,7 +107,7 @@ public class InstanceToNodeMetadata implements Function<Instance, NodeMetadata>
try {
return Iterables.find(images.get(), new FindImageForInstance(from)).getOperatingSystem();
} catch (NoSuchElementException e) {
logger.warn("could not find a matching image for instance %s", from);
logger.debug("could not find a matching image for instance %s", from);
}
return null;
}
@ -129,7 +129,7 @@ public class InstanceToNodeMetadata implements Function<Instance, NodeMetadata>
try {
return Iterables.find(locations.get(), new FindLocationForInstance(from));
} catch (NoSuchElementException e) {
logger.warn("could not find a matching realm for instance %s", from);
logger.debug("could not find a matching realm for instance %s", from);
}
return null;
}

View File

@ -126,7 +126,7 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
try {
return Iterables.find(hardwares.get(), new FindHardwareForServer(from));
} catch (NoSuchElementException e) {
logger.warn("could not find a matching hardware for server %s", from);
logger.debug("could not find a matching hardware for server %s", from);
}
return null;
}
@ -135,7 +135,7 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
try {
return Iterables.find(images.get(), new FindImageForServer(from));
} catch (NoSuchElementException e) {
logger.warn("could not find a matching image for server %s in location %s", from, location.get());
logger.debug("could not find a matching image for server %s in location %s", from, location.get());
}
return null;
}

View File

@ -39,7 +39,7 @@ public interface SshClient {
*/
@Deprecated
SshClient create(IPSocket socket, Credentials credentials);
SshClient create(IPSocket socket, LoginCredentials credentials);
}
@ -51,19 +51,23 @@ public interface SshClient {
void put(String path, Payload contents);
Payload get(String path);
/**
* Execute a process and block until it is complete
*
* @param command command line to invoke
* @param command
* command line to invoke
* @return output of the command
*/
ExecResponse exec(String command);
/**
* Execute a process and allow the user to interact with it
* Execute a process and allow the user to interact with it. Note that this will allow the
* session to exist indefinitely, and its connection is not closed when {@link #disconnect()} is
* called.
*
* @param command command line to invoke
* @param command
* command line to invoke
* @return reference to the running process
* @since 1.5.0
*/

View File

@ -34,7 +34,6 @@ import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.net.ConnectException;
import java.util.Arrays;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
@ -44,6 +43,7 @@ import org.apache.commons.io.input.ProxyInputStream;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.jclouds.compute.domain.ExecChannel;
import org.jclouds.compute.domain.ExecResponse;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.http.handlers.BackoffLimitedRetryHandler;
import org.jclouds.io.Payload;
import org.jclouds.io.Payloads;
@ -52,7 +52,6 @@ import org.jclouds.net.IPSocket;
import org.jclouds.rest.AuthorizationException;
import org.jclouds.ssh.SshClient;
import org.jclouds.ssh.SshException;
import org.jclouds.util.CredentialUtils;
import org.jclouds.util.Strings2;
import com.google.common.annotations.VisibleForTesting;
@ -61,10 +60,10 @@ import com.google.common.base.Predicates;
import com.google.common.base.Splitter;
import com.google.common.base.Supplier;
import com.google.common.io.Closeables;
import com.google.common.net.HostAndPort;
import com.google.inject.Inject;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
@ -91,11 +90,7 @@ public class JschSshClient implements SshClient {
sftp.disconnect();
}
}
private final String host;
private final int port;
private final String username;
private final String password;
private final String toString;
@Inject(optional = true)
@ -121,31 +116,31 @@ public class JschSshClient implements SshClient {
@Named("jclouds.ssh")
protected Logger logger = Logger.NULL;
private Session session;
private final byte[] privateKey;
final byte[] emptyPassPhrase = new byte[0];
private final int timeout;
private final BackoffLimitedRetryHandler backoffLimitedRetryHandler;
public JschSshClient(BackoffLimitedRetryHandler backoffLimitedRetryHandler, IPSocket socket, int timeout,
String username, String password, byte[] privateKey) {
final SessionConnection sessionConnection;
final String user;
final String host;
public JschSshClient(BackoffLimitedRetryHandler backoffLimitedRetryHandler, IPSocket socket,
LoginCredentials loginCredentials, int timeout) {
this.user = checkNotNull(loginCredentials, "loginCredentials").getUser();
this.host = checkNotNull(socket, "socket").getAddress();
checkArgument(socket.getPort() > 0, "ssh port must be greater then zero" + socket.getPort());
checkArgument(password != null || privateKey != null, "you must specify a password or a key");
this.port = socket.getPort();
this.username = checkNotNull(username, "username");
checkArgument(loginCredentials.getPassword() != null || loginCredentials.getPrivateKey() != null,
"you must specify a password or a key");
this.backoffLimitedRetryHandler = checkNotNull(backoffLimitedRetryHandler, "backoffLimitedRetryHandler");
this.timeout = timeout;
this.password = password;
this.privateKey = privateKey;
if (privateKey == null) {
this.toString = String.format("%s:pw[%s]@%s:%d", username, hex(md5(password.getBytes())), host, port);
if (loginCredentials.getPrivateKey() == null) {
this.toString = String.format("%s:pw[%s]@%s:%d", loginCredentials.getUser(), hex(md5(loginCredentials
.getPassword().getBytes())), host, socket.getPort());
} else {
String fingerPrint = fingerprintPrivateKey(new String(privateKey));
String sha1 = sha1PrivateKey(new String(privateKey));
this.toString = String.format("%s:rsa[fingerprint(%s),sha1(%s)]@%s:%d", username, fingerPrint, sha1, host,
port);
String fingerPrint = fingerprintPrivateKey(loginCredentials.getPrivateKey());
String sha1 = sha1PrivateKey(loginCredentials.getPrivateKey());
this.toString = String.format("%s:rsa[fingerprint(%s),sha1(%s)]@%s:%d", loginCredentials.getUser(),
fingerPrint, sha1, host, socket.getPort());
}
sessionConnection = SessionConnection.builder().hostAndPort(HostAndPort.fromParts(host, socket.getPort())).loginCredentials(
loginCredentials).connectTimeout(timeout).sessionTimeout(timeout).build();
}
@Override
@ -154,7 +149,8 @@ public class JschSshClient implements SshClient {
}
private void checkConnected() {
checkState(session != null && session.isConnected(), String.format("(%s) Session not connected!", toString()));
checkState(sessionConnection.getSession() != null && sessionConnection.getSession().isConnected(), String.format(
"(%s) Session not connected!", toString()));
}
public static interface Connection<T> {
@ -163,45 +159,6 @@ public class JschSshClient implements SshClient {
T create() throws Exception;
}
Connection<Session> sessionConnection = new Connection<Session>() {
@Override
public void clear() {
if (session != null && session.isConnected()) {
session.disconnect();
session = null;
}
}
@Override
public Session create() throws Exception {
JSch jsch = new JSch();
session = jsch.getSession(username, host, port);
if (timeout != 0)
session.setTimeout(timeout);
if (password != null) {
session.setPassword(password);
} else {
// jsch wipes out your private key
if (CredentialUtils.isPrivateKeyEncrypted(privateKey)) {
throw new IllegalArgumentException(
"JschSshClientModule does not support private keys that require a passphrase");
}
jsch.addIdentity(username, Arrays.copyOf(privateKey, privateKey.length), null, emptyPassPhrase);
}
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect(timeout);
return session;
}
@Override
public String toString() {
return String.format("Session(timeout=%d)", timeout);
}
};
protected <T, C extends Connection<T>> T acquire(C connection) {
connection.clear();
String errorMessage = String.format("(%s) error acquiring %s", toString(), connection);
@ -245,7 +202,7 @@ public class JschSshClient implements SshClient {
public ChannelSftp create() throws JSchException {
checkConnected();
String channel = "sftp";
sftp = (ChannelSftp) session.openChannel(channel);
sftp = (ChannelSftp) sessionConnection.getSession().openChannel(channel);
sftp.connect();
return sftp;
}
@ -394,7 +351,7 @@ public class JschSshClient implements SshClient {
public ChannelExec create() throws Exception {
checkConnected();
String channel = "exec";
executor = (ChannelExec) session.openChannel(channel);
executor = (ChannelExec) sessionConnection.getSession().openChannel(channel);
executor.setPty(true);
executor.setCommand(command);
ByteArrayOutputStream error = new ByteArrayOutputStream();
@ -468,13 +425,13 @@ public class JschSshClient implements SshClient {
@Override
public String getUsername() {
return this.username;
return this.user;
}
class ExecChannelConnection implements Connection<ExecChannel> {
private final String command;
private ChannelExec executor = null;
private Session sessionConnection;
ExecChannelConnection(String command) {
this.command = checkNotNull(command, "command");
@ -484,14 +441,16 @@ public class JschSshClient implements SshClient {
public void clear() {
if (executor != null)
executor.disconnect();
if (sessionConnection != null)
sessionConnection.disconnect();
}
@Override
public ExecChannel create() throws Exception {
checkConnected();
this.sessionConnection = acquire(SessionConnection.builder().fromSessionConnection(
JschSshClient.this.sessionConnection).sessionTimeout(0).build());
String channel = "exec";
executor = (ChannelExec) session.openChannel(channel);
executor.setPty(true);
executor = (ChannelExec) sessionConnection.openChannel(channel);
executor.setCommand(command);
ByteArrayOutputStream error = new ByteArrayOutputStream();
executor.setErrStream(error);
@ -521,7 +480,6 @@ public class JschSshClient implements SshClient {
}
};
@Override
public ExecChannel execChannel(String command) {
return acquire(new ExecChannelConnection(command));

View File

@ -0,0 +1,201 @@
/**
* 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.ssh.jsch;
import static com.google.common.base.Objects.equal;
import java.util.Arrays;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.ssh.jsch.JschSshClient.Connection;
import org.jclouds.util.CredentialUtils;
import com.google.common.base.Objects;
import com.google.common.net.HostAndPort;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
public class SessionConnection implements Connection<Session> {
public static Builder builder() {
return new Builder();
}
public static class Builder {
protected HostAndPort hostAndPort;
protected LoginCredentials loginCredentials;
protected int connectTimeout;
protected int sessionTimeout;
/**
* @see SessionConnection#getHostAndPort()
*/
public Builder hostAndPort(HostAndPort hostAndPort) {
this.hostAndPort = hostAndPort;
return this;
}
/**
* @see SessionConnection#getLoginCredentials()
*/
public Builder loginCredentials(LoginCredentials loginCredentials) {
this.loginCredentials = loginCredentials;
return this;
}
/**
* @see SessionConnection#getConnectTimeout()
*/
public Builder connectTimeout(int connectTimeout) {
this.connectTimeout = connectTimeout;
return this;
}
/**
* @see SessionConnection#getConnectTimeout()
*/
public Builder sessionTimeout(int sessionTimeout) {
this.sessionTimeout = sessionTimeout;
return this;
}
public SessionConnection build() {
return new SessionConnection(hostAndPort, loginCredentials, connectTimeout, sessionTimeout);
}
protected Builder fromSessionConnection(SessionConnection in) {
return hostAndPort(in.getHostAndPort()).connectTimeout(in.getConnectTimeout()).loginCredentials(
in.getLoginCredentials());
}
}
private SessionConnection(HostAndPort hostAndPort, LoginCredentials loginCredentials, int connectTimeout,
int sessionTimeout) {
this.hostAndPort = hostAndPort;
this.loginCredentials = loginCredentials;
this.connectTimeout = connectTimeout;
this.sessionTimeout = sessionTimeout;
}
private static final byte[] emptyPassPhrase = new byte[0];
private final HostAndPort hostAndPort;
private final LoginCredentials loginCredentials;
private final int connectTimeout;
private final int sessionTimeout;
private transient Session session;
@Override
public void clear() {
if (session != null && session.isConnected()) {
session.disconnect();
session = null;
}
}
@Override
public Session create() throws Exception {
JSch jsch = new JSch();
session = jsch
.getSession(loginCredentials.getUser(), hostAndPort.getHostText(), hostAndPort.getPortOrDefault(22));
if (sessionTimeout != 0)
session.setTimeout(sessionTimeout);
if (loginCredentials.getPrivateKey() == null) {
session.setPassword(loginCredentials.getPassword());
} else {
byte[] privateKey = loginCredentials.getPrivateKey().getBytes();
if (CredentialUtils.isPrivateKeyEncrypted(privateKey)) {
throw new IllegalArgumentException(
"JschSshClientModule does not support private keys that require a passphrase");
}
jsch.addIdentity(loginCredentials.getUser(), Arrays.copyOf(privateKey, privateKey.length), null,
emptyPassPhrase);
}
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect(connectTimeout);
return session;
}
/**
* @return host and port, where port if not present defaults to {@code 22}
*/
public HostAndPort getHostAndPort() {
return hostAndPort;
}
/**
*
* @return login used in this session
*/
public LoginCredentials getLoginCredentials() {
return loginCredentials;
}
/**
*
* @return how long to wait for the initial connection to be made
*/
public int getConnectTimeout() {
return connectTimeout;
}
/**
*
* @return how long to keep the session open, or {@code 0} for indefinitely
*/
public int getSessionTimeout() {
return sessionTimeout;
}
/**
*
* @return the current session or {@code null} if not connected
*/
public Session getSession() {
return session;
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
SessionConnection that = SessionConnection.class.cast(o);
return equal(this.hostAndPort, that.hostAndPort) && equal(this.loginCredentials, that.loginCredentials)
&& equal(this.session, that.session);
}
@Override
public int hashCode() {
return Objects.hashCode(hostAndPort, loginCredentials, session);
}
@Override
public String toString() {
return Objects.toStringHelper("").add("hostAndPort", hostAndPort).add("loginUser", loginCredentials.getUser())
.add("session", session != null ? session.hashCode() : null).add("connectTimeout", connectTimeout).add(
"sessionTimeout", sessionTimeout).toString();
}
}

View File

@ -65,9 +65,7 @@ public class JschSshClientModule extends AbstractModule {
@Override
public SshClient create(IPSocket socket, LoginCredentials credentials) {
SshClient client = new JschSshClient(backoffLimitedRetryHandler, socket, timeout, credentials.getUser(),
(credentials.getPrivateKey() == null) ? credentials.getPassword() : null,
credentials.getPrivateKey() != null ? credentials.getPrivateKey().getBytes() : null);
SshClient client = new JschSshClient(backoffLimitedRetryHandler, socket, credentials, timeout);
injector.injectMembers(client);// add logger
return client;
}

View File

@ -170,8 +170,10 @@ public class JschSshClientLiveTest {
: sshHost);
}
public void testExecChannelTakesStdinAndEchosBack() throws IOException {
ExecChannel response = setupClient().execChannel("cat <<EOF");
public void testExecChannelTakesStdinAndNoEchoOfCharsInOuputAndOutlivesClient() throws IOException {
SshClient client = setupClient();
ExecChannel response = client.execChannel("cat <<EOF");
client.disconnect();
assertEquals(response.getExitStatus().get(), null);
try {
PrintStream printStream = new PrintStream(response.getInput());
@ -179,12 +181,10 @@ public class JschSshClientLiveTest {
printStream.append("EOF\n");
printStream.close();
assertEquals(Strings2.toStringAndClose(response.getError()), "");
// local echo
assertEquals(Strings2.toStringAndClose(response.getOutput()), "foo\r\nEOF\r\n");
assertEquals(Strings2.toStringAndClose(response.getOutput()), "");
} finally {
Closeables.closeQuietly(response);
}
assertEquals(response.getExitStatus().get(), new Integer(0));
}
}

View File

@ -0,0 +1,209 @@
/**
* 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.sshj;
import static com.google.common.base.Objects.equal;
import java.io.IOException;
import javax.annotation.Resource;
import javax.inject.Named;
import net.schmizz.sshj.SSHClient;
import net.schmizz.sshj.transport.verification.PromiscuousVerifier;
import net.schmizz.sshj.userauth.keyprovider.OpenSSHKeyFile;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.logging.Logger;
import org.jclouds.sshj.SshjSshClient.Connection;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Objects;
import com.google.common.net.HostAndPort;
public class SSHClientConnection implements Connection<SSHClient> {
public static Builder builder() {
return new Builder();
}
public static class Builder {
protected HostAndPort hostAndPort;
protected LoginCredentials loginCredentials;
protected int connectTimeout;
protected int sessionTimeout;
/**
* @see SSHClientConnection#getHostAndPort()
*/
public Builder hostAndPort(HostAndPort hostAndPort) {
this.hostAndPort = hostAndPort;
return this;
}
/**
* @see SSHClientConnection#getLoginCredentials()
*/
public Builder loginCredentials(LoginCredentials loginCredentials) {
this.loginCredentials = loginCredentials;
return this;
}
/**
* @see SSHClientConnection#getConnectTimeout()
*/
public Builder connectTimeout(int connectTimeout) {
this.connectTimeout = connectTimeout;
return this;
}
/**
* @see SSHClientConnection#getConnectTimeout()
*/
public Builder sessionTimeout(int sessionTimeout) {
this.sessionTimeout = sessionTimeout;
return this;
}
public SSHClientConnection build() {
return new SSHClientConnection(hostAndPort, loginCredentials, connectTimeout, sessionTimeout);
}
protected Builder fromSSHClientConnection(SSHClientConnection in) {
return hostAndPort(in.getHostAndPort()).connectTimeout(in.getConnectTimeout()).loginCredentials(
in.getLoginCredentials());
}
}
private SSHClientConnection(HostAndPort hostAndPort, LoginCredentials loginCredentials, int connectTimeout,
int sessionTimeout) {
this.hostAndPort = hostAndPort;
this.loginCredentials = loginCredentials;
this.connectTimeout = connectTimeout;
this.sessionTimeout = sessionTimeout;
}
@Resource
@Named("jclouds.ssh")
protected Logger logger = Logger.NULL;
private final HostAndPort hostAndPort;
private final LoginCredentials loginCredentials;
private final int connectTimeout;
private final int sessionTimeout;
@VisibleForTesting
transient SSHClient ssh;
@Override
public void clear() {
if (ssh != null && ssh.isConnected()) {
try {
ssh.disconnect();
} catch (IOException e) {
logger.debug("<< exception disconnecting from %s: %s", e, e.getMessage());
}
ssh = null;
}
}
@Override
public SSHClient create() throws Exception {
ssh = new net.schmizz.sshj.SSHClient();
ssh.addHostKeyVerifier(new PromiscuousVerifier());
if (connectTimeout != 0) {
ssh.setConnectTimeout(connectTimeout);
}
if (sessionTimeout != 0) {
ssh.setTimeout(sessionTimeout);
}
ssh.connect(hostAndPort.getHostText(), hostAndPort.getPortOrDefault(22));
if (loginCredentials.getPassword() != null) {
ssh.authPassword(loginCredentials.getUser(), loginCredentials.getPassword());
} else {
OpenSSHKeyFile key = new OpenSSHKeyFile();
key.init(loginCredentials.getPrivateKey(), null);
ssh.authPublickey(loginCredentials.getUser(), key);
}
return ssh;
}
/**
* @return host and port, where port if not present defaults to {@code 22}
*/
public HostAndPort getHostAndPort() {
return hostAndPort;
}
/**
*
* @return login used in this ssh
*/
public LoginCredentials getLoginCredentials() {
return loginCredentials;
}
/**
*
* @return how long to wait for the initial connection to be made
*/
public int getConnectTimeout() {
return connectTimeout;
}
/**
*
* @return how long to keep the ssh open, or {@code 0} for indefinitely
*/
public int getSessionTimeout() {
return sessionTimeout;
}
/**
*
* @return the current ssh or {@code null} if not connected
*/
public SSHClient getSSHClient() {
return ssh;
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
SSHClientConnection that = SSHClientConnection.class.cast(o);
return equal(this.hostAndPort, that.hostAndPort) && equal(this.loginCredentials, that.loginCredentials)
&& equal(this.ssh, that.ssh);
}
@Override
public int hashCode() {
return Objects.hashCode(hostAndPort, loginCredentials, ssh);
}
@Override
public String toString() {
return Objects.toStringHelper("").add("hostAndPort", hostAndPort).add("loginUser", loginCredentials.getUser())
.add("ssh", ssh != null ? ssh.hashCode() : null).add("connectTimeout", connectTimeout).add(
"sessionTimeout", sessionTimeout).toString();
}
}

View File

@ -52,14 +52,13 @@ import net.schmizz.sshj.connection.channel.direct.Session.Command;
import net.schmizz.sshj.sftp.SFTPClient;
import net.schmizz.sshj.sftp.SFTPException;
import net.schmizz.sshj.transport.TransportException;
import net.schmizz.sshj.transport.verification.PromiscuousVerifier;
import net.schmizz.sshj.userauth.UserAuthException;
import net.schmizz.sshj.userauth.keyprovider.OpenSSHKeyFile;
import net.schmizz.sshj.xfer.InMemorySourceFile;
import org.apache.commons.io.input.ProxyInputStream;
import org.jclouds.compute.domain.ExecChannel;
import org.jclouds.compute.domain.ExecResponse;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.http.handlers.BackoffLimitedRetryHandler;
import org.jclouds.io.Payload;
import org.jclouds.io.Payloads;
@ -77,6 +76,7 @@ import com.google.common.base.Splitter;
import com.google.common.base.Supplier;
import com.google.common.base.Throwables;
import com.google.common.io.Closeables;
import com.google.common.net.HostAndPort;
import com.google.inject.Inject;
/**
@ -104,10 +104,6 @@ public class SshjSshClient implements SshClient {
}
}
private final String host;
private final int port;
private final String username;
private final String password;
private final String toString;
@Inject(optional = true)
@ -129,41 +125,42 @@ public class SshjSshClient implements SshClient {
@Named("jclouds.ssh.retry-predicate")
// NOTE cannot retry io exceptions, as SSHException is a part of the chain
private Predicate<Throwable> retryPredicate = or(instanceOf(ConnectionException.class),
instanceOf(ConnectException.class), instanceOf(SocketTimeoutException.class),
instanceOf(TransportException.class),
// safe to retry sftp exceptions as they are idempotent
instanceOf(SFTPException.class));
instanceOf(ConnectException.class), instanceOf(SocketTimeoutException.class),
instanceOf(TransportException.class),
// safe to retry sftp exceptions as they are idempotent
instanceOf(SFTPException.class));
@Resource
@Named("jclouds.ssh")
protected Logger logger = Logger.NULL;
@VisibleForTesting
SSHClient ssh;
private final byte[] privateKey;
final byte[] emptyPassPhrase = new byte[0];
private final int timeoutMillis;
SSHClientConnection sshClientConnection;
final String user;
final String host;
private final BackoffLimitedRetryHandler backoffLimitedRetryHandler;
public SshjSshClient(BackoffLimitedRetryHandler backoffLimitedRetryHandler, IPSocket socket, int timeout,
String username, String password, byte[] privateKey) {
public SshjSshClient(BackoffLimitedRetryHandler backoffLimitedRetryHandler, IPSocket socket,
LoginCredentials loginCredentials, int timeout) {
this.user = checkNotNull(loginCredentials, "loginCredentials").getUser();
this.host = checkNotNull(socket, "socket").getAddress();
checkArgument(socket.getPort() > 0, "ssh port must be greater then zero" + socket.getPort());
checkArgument(password != null || privateKey != null, "you must specify a password or a key");
this.port = socket.getPort();
this.username = checkNotNull(username, "username");
checkArgument(loginCredentials.getPassword() != null || loginCredentials.getPrivateKey() != null,
"you must specify a password or a key");
this.backoffLimitedRetryHandler = checkNotNull(backoffLimitedRetryHandler, "backoffLimitedRetryHandler");
this.timeoutMillis = timeout;
this.password = password;
this.privateKey = privateKey;
if (privateKey == null) {
this.toString = String.format("%s:pw[%s]@%s:%d", username, hex(md5(password.getBytes())), host, port);
if (loginCredentials.getPrivateKey() == null) {
this.toString = String.format("%s:pw[%s]@%s:%d", loginCredentials.getUser(), hex(md5(loginCredentials
.getPassword().getBytes())), host, socket.getPort());
} else {
String fingerPrint = fingerprintPrivateKey(new String(privateKey));
String sha1 = sha1PrivateKey(new String(privateKey));
this.toString = String.format("%s:rsa[fingerprint(%s),sha1(%s)]@%s:%d", username, fingerPrint, sha1, host,
port);
String fingerPrint = fingerprintPrivateKey(loginCredentials.getPrivateKey());
String sha1 = sha1PrivateKey(loginCredentials.getPrivateKey());
this.toString = String.format("%s:rsa[fingerprint(%s),sha1(%s)]@%s:%d", loginCredentials.getUser(),
fingerPrint, sha1, host, socket.getPort());
}
sshClientConnection = SSHClientConnection.builder().hostAndPort(HostAndPort.fromParts(host, socket.getPort()))
.loginCredentials(loginCredentials).connectTimeout(timeout).sessionTimeout(timeout).build();
}
@Override
@ -172,7 +169,8 @@ public class SshjSshClient implements SshClient {
}
private void checkConnected() {
checkState(ssh != null && ssh.isConnected(), String.format("(%s) ssh not connected!", toString()));
checkState(sshClientConnection.ssh != null && sshClientConnection.ssh.isConnected(), String
.format("(%s) ssh not connected!", toString()));
}
public static interface Connection<T> {
@ -181,45 +179,6 @@ public class SshjSshClient implements SshClient {
T create() throws Exception;
}
Connection<net.schmizz.sshj.SSHClient> sshConnection = new Connection<net.schmizz.sshj.SSHClient>() {
@Override
public void clear() {
if (ssh != null && ssh.isConnected()) {
try {
ssh.disconnect();
} catch (IOException e) {
logger.warn(e, "<< exception disconnecting from %s: %s", e, e.getMessage());
}
ssh = null;
}
}
@Override
public net.schmizz.sshj.SSHClient create() throws Exception {
net.schmizz.sshj.SSHClient ssh = new net.schmizz.sshj.SSHClient();
ssh.addHostKeyVerifier(new PromiscuousVerifier());
if (timeoutMillis != 0) {
ssh.setTimeout(timeoutMillis);
ssh.setConnectTimeout(timeoutMillis);
}
ssh.connect(host, port);
if (password != null) {
ssh.authPassword(username, password);
} else {
OpenSSHKeyFile key = new OpenSSHKeyFile();
key.init(new String(privateKey), null);
ssh.authPublickey(username, key);
}
return ssh;
}
@Override
public String toString() {
return String.format("SSHClient(timeout=%d)", timeoutMillis);
}
};
private void backoffForAttempt(int retryAttempt, String message) {
backoffLimitedRetryHandler.imposeBackoffExponentialDelay(200L, 2, retryAttempt, sshRetries, message);
}
@ -240,16 +199,17 @@ public class SshjSshClient implements SshClient {
logger.warn(from, "<< (%s) error closing connection", toString());
}
if (i + 1 == sshRetries) {
throw propagate(from, errorMessage+" (out of retries - max "+sshRetries+")");
} else if (shouldRetry(from) ||
(Throwables2.getFirstThrowableOfType(from, IllegalStateException.class) != null)) {
logger.info("<< " + errorMessage + " (attempt " + (i + 1) + " of " + sshRetries + "): " + from.getMessage());
throw propagate(from, errorMessage + " (out of retries - max " + sshRetries + ")");
} else if (shouldRetry(from)
|| (Throwables2.getFirstThrowableOfType(from, IllegalStateException.class) != null)) {
logger.info("<< " + errorMessage + " (attempt " + (i + 1) + " of " + sshRetries + "): "
+ from.getMessage());
backoffForAttempt(i + 1, errorMessage + ": " + from.getMessage());
if (connection != sshConnection)
if (connection != sshClientConnection)
connect();
continue;
} else {
throw propagate(from, errorMessage+" (not retryable)");
throw propagate(from, errorMessage + " (not retryable)");
}
}
}
@ -259,7 +219,7 @@ public class SshjSshClient implements SshClient {
public void connect() {
try {
ssh = acquire(sshConnection);
acquire(sshClientConnection);
} catch (Exception e) {
Throwables.propagate(e);
}
@ -282,7 +242,7 @@ public class SshjSshClient implements SshClient {
@Override
public SFTPClient create() throws IOException {
checkConnected();
sftp = ssh.newSFTPClient();
sftp = sshClientConnection.ssh.newSFTPClient();
return sftp;
}
@ -310,7 +270,7 @@ public class SshjSshClient implements SshClient {
public Payload create() throws Exception {
sftp = acquire(sftpConnection);
return Payloads.newInputStreamPayload(new CloseFtpChannelOnCloseInputStream(sftp.getSFTPEngine().open(path)
.getInputStream(), sftp));
.getInputStream(), sftp));
}
@Override
@ -385,7 +345,7 @@ public class SshjSshClient implements SshClient {
@VisibleForTesting
boolean shouldRetry(Exception from) {
Predicate<Throwable> predicate = retryAuth ? Predicates.<Throwable> or(retryPredicate,
instanceOf(AuthorizationException.class), instanceOf(UserAuthException.class)) : retryPredicate;
instanceOf(AuthorizationException.class), instanceOf(UserAuthException.class)) : retryPredicate;
if (any(getCausalChain(from), predicate))
return true;
if (!retryableMessages.equals(""))
@ -404,7 +364,7 @@ public class SshjSshClient implements SshClient {
@Override
public boolean apply(Throwable arg0) {
return (arg0.toString().indexOf(input) != -1)
|| (arg0.getMessage() != null && arg0.getMessage().indexOf(input) != -1);
|| (arg0.getMessage() != null && arg0.getMessage().indexOf(input) != -1);
}
});
@ -420,7 +380,7 @@ public class SshjSshClient implements SshClient {
if (e instanceof UserAuthException)
throw new AuthorizationException("(" + toString() + ") " + message, e);
throw e instanceof SshException ? SshException.class.cast(e) : new SshException(
"(" + toString() + ") " + message, e);
"(" + toString() + ") " + message, e);
}
@Override
@ -431,7 +391,7 @@ public class SshjSshClient implements SshClient {
@PreDestroy
public void disconnect() {
try {
sshConnection.clear();
sshClientConnection.clear();
} catch (Exception e) {
Throwables.propagate(e);
}
@ -452,8 +412,8 @@ public class SshjSshClient implements SshClient {
@Override
public Session create() throws Exception {
checkConnected();
session = ssh.startSession();
session.allocatePTY("vt100", 80, 24, 0, 0, Collections.<PTYMode, Integer>emptyMap());
session = sshClientConnection.ssh.startSession();
session.allocatePTY("vt100", 80, 24, 0, 0, Collections.<PTYMode, Integer> emptyMap());
return session;
}
@ -485,7 +445,7 @@ public class SshjSshClient implements SshClient {
session = acquire(execConnection());
Command output = session.exec(checkNotNull(command, "command"));
String outputString = IOUtils.readFully(output.getInputStream()).toString();
output.join(timeoutMillis, TimeUnit.SECONDS);
output.join(sshClientConnection.getSessionTimeout(), TimeUnit.MILLISECONDS);
int errorStatus = output.getExitStatus();
String errorString = IOUtils.readFully(output.getErrorStream()).toString();
return new ExecResponse(outputString, errorString, errorStatus);
@ -504,6 +464,37 @@ public class SshjSshClient implements SshClient {
return acquire(new ExecConnection(command));
}
protected Connection<Session> noPTYConnection() {
return new Connection<Session>() {
private Session session = null;
private SSHClient sshClientConnection;
@Override
public void clear() throws TransportException, ConnectionException {
if (session != null)
session.close();
if (sshClientConnection != null)
Closeables.closeQuietly(sshClientConnection);
}
@Override
public Session create() throws Exception {
this.sshClientConnection = acquire(SSHClientConnection.builder().fromSSHClientConnection(
SshjSshClient.this.sshClientConnection).sessionTimeout(0).build());
session = sshClientConnection.startSession();
return session;
}
@Override
public String toString() {
return "Session()";
}
};
}
class ExecChannelConnection implements Connection<ExecChannel> {
private final String command;
private SessionChannel session;
@ -521,7 +512,7 @@ public class SshjSshClient implements SshClient {
@Override
public ExecChannel create() throws Exception {
session = SessionChannel.class.cast(acquire(execConnection()));
session = SessionChannel.class.cast(acquire(noPTYConnection()));
output = session.exec(command);
return new ExecChannel(output.getOutputStream(), output.getInputStream(), output.getErrorStream(),
new Supplier<Integer>() {
@ -552,7 +543,7 @@ public class SshjSshClient implements SshClient {
public ExecChannel execChannel(String command) {
return acquire(new ExecChannelConnection(command));
}
@Override
public String getHostAddress() {
return this.host;
@ -560,7 +551,7 @@ public class SshjSshClient implements SshClient {
@Override
public String getUsername() {
return this.username;
return this.user;
}
}

View File

@ -65,9 +65,7 @@ public class SshjSshClientModule extends AbstractModule {
@Override
public SshClient create(IPSocket socket, LoginCredentials credentials) {
SshClient client = new SshjSshClient(backoffLimitedRetryHandler, socket, timeout, credentials.getUser(),
(credentials.getPrivateKey() == null) ? credentials.getPassword() : null,
credentials.getPrivateKey() != null ? credentials.getPrivateKey().getBytes() : null);
SshClient client = new SshjSshClient(backoffLimitedRetryHandler, socket, credentials, timeout);
injector.injectMembers(client);// add logger
return client;
}

View File

@ -169,9 +169,11 @@ public class SshjSshClientLiveTest {
assertEquals(response.getOutput().trim(), "localhost".equals(sshHost) ? InetAddress.getLocalHost().getHostName()
: sshHost);
}
public void testExecChannelTakesStdinAndEchosBack() throws IOException {
ExecChannel response = setupClient().execChannel("cat <<EOF");
public void testExecChannelTakesStdinAndNoEchoOfCharsInOuputAndOutlivesClient() throws IOException {
SshClient client = setupClient();
ExecChannel response = client.execChannel("cat <<EOF");
client.disconnect();
assertEquals(response.getExitStatus().get(), null);
try {
PrintStream printStream = new PrintStream(response.getInput());
@ -179,8 +181,7 @@ public class SshjSshClientLiveTest {
printStream.append("EOF\n");
printStream.close();
assertEquals(Strings2.toStringAndClose(response.getError()), "");
// local echo
assertEquals(Strings2.toStringAndClose(response.getOutput()), "foo\r\nEOF\r\n");
assertEquals(Strings2.toStringAndClose(response.getOutput()), "");
} finally {
Closeables.closeQuietly(response);
}

View File

@ -172,8 +172,8 @@ public class SshjSshClientTest {
ssh.disconnect();
expectLastCall().andThrow(new ConnectionException("disconnected"));
replay(ssh);
ssh1.ssh = ssh;
ssh1.sshConnection.clear();
ssh1.sshClientConnection.ssh = ssh;
ssh1.sshClientConnection.clear();
verify(ssh);
}
@ -186,10 +186,9 @@ public class SshjSshClientTest {
}
public void testRetriesLoggedAtInfoWithCount() throws Exception {
@SuppressWarnings("unchecked")
SshjSshClient.Connection<net.schmizz.sshj.SSHClient> mockConnection = createMock(SshjSshClient.Connection.class);
SSHClientConnection mockConnection = createMock(SSHClientConnection.class);
net.schmizz.sshj.SSHClient mockClient = createMock(net.schmizz.sshj.SSHClient.class);
mockConnection.clear(); expectLastCall();
mockConnection.create(); expectLastCall().andThrow(new ConnectionException("test1"));
mockConnection.clear(); expectLastCall();
@ -199,14 +198,14 @@ public class SshjSshClientTest {
replay(mockConnection);
replay(mockClient);
ssh.sshConnection = mockConnection;
ssh.sshClientConnection = mockConnection;
BufferLogger logcheck = new BufferLogger(ssh.getClass().getCanonicalName());
ssh.logger = logcheck;
logcheck.setLevel(Level.INFO);
ssh.connect();
Assert.assertEquals(ssh.ssh, mockClient);
Assert.assertEquals(ssh.sshClientConnection, mockConnection);
verify(mockConnection);
verify(mockClient);
Record r = logcheck.assertLogContains("attempt 1 of 5");

View File

@ -127,7 +127,7 @@ public class ServerDetailsToNodeMetadata implements Function<ServerDetails, Node
try {
return Iterables.find(images.get(), new FindImageForServer(from)).getOperatingSystem();
} catch (NoSuchElementException e) {
logger.warn("could not find a matching image for server %s", from);
logger.debug("could not find a matching image for server %s", from);
}
return null;
}

View File

@ -19,6 +19,7 @@
package org.jclouds.vcloud.director.v1_5;
import org.jclouds.rest.annotations.Delegate;
import org.jclouds.vcloud.director.v1_5.domain.AdminOrg;
import org.jclouds.vcloud.director.v1_5.domain.Catalog;
import org.jclouds.vcloud.director.v1_5.domain.Group;
import org.jclouds.vcloud.director.v1_5.domain.Media;

View File

@ -22,6 +22,7 @@ import java.util.concurrent.TimeUnit;
import org.jclouds.concurrent.Timeout;
import org.jclouds.rest.annotations.Delegate;
import org.jclouds.vcloud.director.v1_5.domain.AdminOrg;
import org.jclouds.vcloud.director.v1_5.domain.Catalog;
import org.jclouds.vcloud.director.v1_5.domain.Group;
import org.jclouds.vcloud.director.v1_5.domain.Media;

View File

@ -129,14 +129,31 @@ public class VCloudDirectorMediaType {
public static final String ADMIN_CATALOG = "application/vnd.vmware.admin.catalog+xml";
public static final String ADMIN_ORGANIZATION = "application/vnd.vmware.admin.organization+xml";
public static final String ADMIN_ORG = "application/vnd.vmware.admin.organization+xml";
public static final String PUBLISH_CATALOG_PARAMS = "application/vnd.vmware.admin.publishCatalogParams+xml";
public static final String GROUP = "application/vnd.vmware.admin.group+xml";
public static final String ORG_VAPP_TEMPLATE_LEASE_SETTINGS = "application/vnd.vmware.admin.vAppTemplateLeaseSettings+xml";
public static final String ORG_LEASE_SETTINGS = "application/vnd.vmware.admin.vAppLeaseSettings+xml";
public static final String ORG_PASSWORD_POLICY_SETTINGS = "application/vnd.vmware.admin.organizationPasswordPolicySettings+xml";
public static final String ORG_LDAP_SETTINGS = "application/vnd.vmware.admin.organizationLdapSettings+xml";
public static final String ORG_GENERAL_SETTINGS = "application/vnd.vmware.admin.organizationGeneralSettings+xml";
public static final String ORG_EMAIL_SETTINGS = "application/vnd.vmware.admin.organizationEmailSettings+xml";
public static final String ORG_SETTINGS = "application/vnd.vmware.admin.orgSettings+xml";
public static final String ADMIN_NETWORK = "application/vnd.vmware.admin.network+xml";
public static final String ADMIN_ORG_NETWORK = "application/vnd.vmware.admin.orgNetwork+xml";
/**
*
* All acceptable media types.
*
* This list must be updated whenever a new media type constant is added.
@ -148,11 +165,14 @@ public class VCloudDirectorMediaType {
MEDIA, OWNER, VDC, ADMIN_USER, V_APP, V_APP_TEMPLATE,
CAPTURE_VAPP_PARAMS, CLONE_V_APP_PARAMS, CLONE_V_APP_TEMPLATE_PARAMS,
COMPOSE_VAPP_PARAMS, INSTANTIATE_VAPP_TEMPLATE_PARAMS,
UPLOAD_VAPP_TEMPLATE_PARAMS, ADMIN_CATALOG, ADMIN_ORGANIZATION,
UPLOAD_VAPP_TEMPLATE_PARAMS, ADMIN_CATALOG, ADMIN_ORG,
QUERY_RESULT_RECORDS, QUERY_RESULT_REFERENCES, QUERY_RESULT_ID_RECORDS,
CONTROL_ACCESS, VAPP_TEMPLATE, CUSTOMIZATION_SECTION, GUEST_CUSTOMIZATION_SECTION,
NETWORK_SECTION, NETWORK_CONFIG_SECTION, NETWORK_CONNECTION_SECTION,
CLONE_MEDIA_PARAMS, LEASE_SETTINGS_SECTION, RELOCATE_TEMPLATE, ENVELOPE,
PUBLISH_CATALOG_PARAMS, GROUP
PUBLISH_CATALOG_PARAMS, GROUP, ORG_VAPP_TEMPLATE_LEASE_SETTINGS,
ORG_LEASE_SETTINGS, ORG_PASSWORD_POLICY_SETTINGS, ORG_LDAP_SETTINGS,
ORG_GENERAL_SETTINGS, ORG_EMAIL_SETTINGS, ORG_SETTINGS, ADMIN_NETWORK,
ADMIN_ORG_NETWORK
);
}

View File

@ -42,11 +42,32 @@ import org.jclouds.vcloud.director.v1_5.VCloudDirectorClient;
import org.jclouds.vcloud.director.v1_5.annotations.Login;
import org.jclouds.vcloud.director.v1_5.domain.Session;
import org.jclouds.vcloud.director.v1_5.domain.SessionWithToken;
import org.jclouds.vcloud.director.v1_5.features.*;
import org.jclouds.vcloud.director.v1_5.features.AdminCatalogAsyncClient;
import org.jclouds.vcloud.director.v1_5.features.AdminCatalogClient;
import org.jclouds.vcloud.director.v1_5.features.AdminOrgAsyncClient;
import org.jclouds.vcloud.director.v1_5.features.AdminOrgClient;
import org.jclouds.vcloud.director.v1_5.features.CatalogAsyncClient;
import org.jclouds.vcloud.director.v1_5.features.CatalogClient;
import org.jclouds.vcloud.director.v1_5.features.GroupAsyncClient;
import org.jclouds.vcloud.director.v1_5.features.GroupClient;
import org.jclouds.vcloud.director.v1_5.features.MediaAsyncClient;
import org.jclouds.vcloud.director.v1_5.features.MediaClient;
import org.jclouds.vcloud.director.v1_5.features.MetadataAsyncClient;
import org.jclouds.vcloud.director.v1_5.features.MetadataClient;
import org.jclouds.vcloud.director.v1_5.features.NetworkAsyncClient;
import org.jclouds.vcloud.director.v1_5.features.NetworkClient;
import org.jclouds.vcloud.director.v1_5.features.OrgAsyncClient;
import org.jclouds.vcloud.director.v1_5.features.OrgClient;
import org.jclouds.vcloud.director.v1_5.features.QueryAsyncClient;
import org.jclouds.vcloud.director.v1_5.features.QueryClient;
import org.jclouds.vcloud.director.v1_5.features.TaskAsyncClient;
import org.jclouds.vcloud.director.v1_5.features.TaskClient;
import org.jclouds.vcloud.director.v1_5.features.UploadAsyncClient;
import org.jclouds.vcloud.director.v1_5.features.UploadClient;
import org.jclouds.vcloud.director.v1_5.features.VAppTemplateAsyncClient;
import org.jclouds.vcloud.director.v1_5.features.VAppTemplateClient;
import org.jclouds.vcloud.director.v1_5.features.VdcAsyncClient;
import org.jclouds.vcloud.director.v1_5.features.VdcClient;
import org.jclouds.vcloud.director.v1_5.functions.LoginUserInOrgWithPassword;
import org.jclouds.vcloud.director.v1_5.handlers.InvalidateSessionAndRetryOn401AndLogoutOnClose;
import org.jclouds.vcloud.director.v1_5.handlers.VCloudDirectorErrorHandler;
@ -86,6 +107,7 @@ public class VCloudDirectorRestClientModule extends RestClientModule<VCloudDirec
.put(MetadataClient.Readable.class, MetadataAsyncClient.Readable.class)
.put(MetadataClient.Writeable.class, MetadataAsyncClient.Writable.class)
.put(AdminCatalogClient.class, AdminCatalogAsyncClient.class)
.put(AdminOrgClient.class, AdminOrgAsyncClient.class)
.put(GroupClient.class, GroupAsyncClient.class)
.build();

View File

@ -19,8 +19,6 @@
package org.jclouds.vcloud.director.v1_5.domain;
import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Set;
@ -28,8 +26,6 @@ import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import com.google.common.collect.Sets;
/**
*
@ -69,7 +65,7 @@ public class AdminCatalog extends CatalogType<AdminCatalog> {
public static class Builder extends CatalogType.Builder<AdminCatalog> {
public AdminCatalog build() {
return new AdminCatalog(href, type, links, description, tasksInProgress, id, name, owner, catalogItems, isPublished);
return new AdminCatalog(href, type, links, description, tasks, id, name, owner, catalogItems, isPublished);
}
/**
@ -132,14 +128,14 @@ public class AdminCatalog extends CatalogType<AdminCatalog> {
}
/**
* @see EntityType#getTasksInProgress()
* @see EntityType#getTasks()
*/
@Override
public Builder tasksInProgress(TasksInProgress tasksInProgress) {
this.tasksInProgress = tasksInProgress;
public Builder tasks(Set<Task> tasks) {
super.tasks(tasks);
return this;
}
/**
* @see ReferenceType#getHref()
*/
@ -157,25 +153,24 @@ public class AdminCatalog extends CatalogType<AdminCatalog> {
this.type = type;
return this;
}
/**
* @see EntityType#getLinks()
* @see ResourceType#getLinks()
*/
@Override
public Builder links(Set<Link> links) {
this.links = Sets.newLinkedHashSet(checkNotNull(links, "links"));
return this;
return Builder.class.cast(super.links(links));
}
/**
* @see EntityType#getLinks()
* @see ResourceType#getLinks()
*/
@Override
public Builder link(Link link) {
this.links.add(checkNotNull(link, "link"));
return this;
return Builder.class.cast(super.link(link));
}
@Override
public Builder fromCatalogType(CatalogType<AdminCatalog> in) {
return Builder.class.cast(super.fromCatalogType(in));
@ -190,8 +185,8 @@ public class AdminCatalog extends CatalogType<AdminCatalog> {
// For JAXB
}
public AdminCatalog(URI href, String type, Set<Link> links, String description, TasksInProgress tasksInProgress, String id,
public AdminCatalog(URI href, String type, Set<Link> links, String description, Set<Task> tasks, String id,
String name, Owner owner, CatalogItems catalogItems, Boolean published) {
super(href, type, links, description, tasksInProgress, id, name, owner, catalogItems, published);
super(href, type, links, description, tasks, id, name, owner, catalogItems, published);
}
}

View File

@ -21,6 +21,9 @@ package org.jclouds.vcloud.director.v1_5.domain;
import static com.google.common.base.Objects.equal;
import java.net.URI;
import java.util.Set;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
@ -145,7 +148,8 @@ public class AdminOrg extends Org {
}
public AdminOrg build() {
return new AdminOrg(settings, users, groups, catalogs, vdcs, networks);
return new AdminOrg(href, type, links, description, tasks, id,
name, fullName, isEnabled, settings, users, groups, catalogs, vdcs, networks);
}
public T fromAdminOrg(AdminOrg in) {
@ -175,8 +179,11 @@ public class AdminOrg extends Org {
// For JAXB
}
protected AdminOrg(OrgSettings settings, UsersList users, GroupsList groups,
protected AdminOrg(URI href, String type, Set<Link> links, String description,
Set<Task> tasks, String id, String name, String fullName,
Boolean enabled, OrgSettings settings, UsersList users, GroupsList groups,
CatalogsList catalogs, Vdcs vdcs, Networks networks) {
super(href, type, links, description, tasks, id, name, fullName, enabled);
this.settings = settings;
this.users = users;
this.groups = groups;

View File

@ -25,6 +25,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Collection;
import java.util.Collections;
import java.util.Set;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

View File

@ -57,7 +57,7 @@ public class Catalog extends CatalogType<Catalog> {
@Override
public Catalog build() {
return new Catalog(href, type, links, description, tasksInProgress, id, name, owner, catalogItems, isPublished);
return new Catalog(href, type, links, description, tasks, id, name, owner, catalogItems, isPublished);
}
/**
@ -120,11 +120,11 @@ public class Catalog extends CatalogType<Catalog> {
}
/**
* @see EntityType#getTasksInProgress()
* @see EntityType#getTasks()
*/
@Override
public Builder tasksInProgress(TasksInProgress tasksInProgress) {
this.tasksInProgress = tasksInProgress;
public Builder tasks(Set<Task> tasks) {
super.tasks(tasks);
return this;
}
@ -174,9 +174,9 @@ public class Catalog extends CatalogType<Catalog> {
}
}
public Catalog(URI href, String type, Set<Link> links, String description, TasksInProgress tasksInProgress, String id,
public Catalog(URI href, String type, Set<Link> links, String description, Set<Task> tasks, String id,
String name, Owner owner, CatalogItems catalogItems, Boolean published) {
super(href, type, links, description, tasksInProgress, id, name, owner, catalogItems, published);
super(href, type, links, description, tasks, id, name, owner, catalogItems, published);
}
@SuppressWarnings("unused")

View File

@ -23,6 +23,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Collections;
import java.util.Set;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@ -45,7 +46,6 @@ public class CatalogItem extends EntityType<CatalogItem> {
public static final String MEDIA_TYPE = VCloudDirectorMediaType.CATALOG_ITEM;
@SuppressWarnings("unchecked")
public static Builder builder() {
return new Builder();
}
@ -86,7 +86,7 @@ public class CatalogItem extends EntityType<CatalogItem> {
@Override
public CatalogItem build() {
return new CatalogItem(href, type, links, description, tasksInProgress, id, name, entity, properties);
return new CatalogItem(href, type, links, description, tasks, id, name, entity, properties);
}
/**
@ -115,13 +115,13 @@ public class CatalogItem extends EntityType<CatalogItem> {
this.id = id;
return this;
}
/**
* @see EntityType#getTasksInProgress()
* @see EntityType#getTasks()
*/
@Override
public Builder tasksInProgress(TasksInProgress tasksInProgress) {
this.tasksInProgress = tasksInProgress;
public Builder tasks(Set<Task> tasks) {
super.tasks(tasks);
return this;
}
@ -144,21 +144,19 @@ public class CatalogItem extends EntityType<CatalogItem> {
}
/**
* @see EntityType#getLinks()
* @see ResourceType#getLinks()
*/
@Override
public Builder links(Set<Link> links) {
this.links = Sets.newLinkedHashSet(checkNotNull(links, "links"));
return this;
return Builder.class.cast(super.links(links));
}
/**
* @see EntityType#getLinks()
* @see ResourceType#getLinks()
*/
@Override
public Builder link(Link link) {
this.links.add(checkNotNull(link, "link"));
return this;
return Builder.class.cast(super.link(link));
}
@Override
@ -171,8 +169,8 @@ public class CatalogItem extends EntityType<CatalogItem> {
}
}
private CatalogItem(URI href, String type, Set<Link> links, String description, TasksInProgress tasksInProgress, String id, String name, Reference entity, Set<Property> properties) {
super(href, type, links, description, tasksInProgress, id, name);
private CatalogItem(URI href, String type, Set<Link> links, String description, Set<Task> tasks, String id, String name, Reference entity, Set<Property> properties) {
super(href, type, links, description, tasks, id, name);
this.entity = entity;
this.properties = ImmutableSet.copyOf(properties);
}

View File

@ -1,6 +1,7 @@
package org.jclouds.vcloud.director.v1_5.domain;
import java.net.URI;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "CatalogReference")

View File

@ -90,7 +90,7 @@ public class CatalogType<T extends CatalogType<T>> extends EntityType<T> {
@Override
public CatalogType<T> build() {
return new CatalogType<T>(href, type, links, description, tasksInProgress, id, name, owner, catalogItems, isPublished);
return new CatalogType<T>(href, type, links, description, tasks, id, name, owner, catalogItems, isPublished);
}
/**
@ -121,11 +121,11 @@ public class CatalogType<T extends CatalogType<T>> extends EntityType<T> {
}
/**
* @see EntityType#getTasksInProgress()
* @see EntityType#getTasks()
*/
@Override
public Builder<T> tasksInProgress(TasksInProgress tasksInProgress) {
super.tasksInProgress(tasksInProgress);
public Builder<T> tasks(Set<Task> tasks) {
super.tasks(tasks);
return this;
}
@ -176,9 +176,9 @@ public class CatalogType<T extends CatalogType<T>> extends EntityType<T> {
}
}
public CatalogType(URI href, String type, Set<Link> links, String description, TasksInProgress tasksInProgress, String id,
public CatalogType(URI href, String type, Set<Link> links, String description, Set<Task> tasks, String id,
String name, Owner owner, CatalogItems catalogItems, Boolean published) {
super(href, type, links, description, tasksInProgress, id, name);
super(href, type, links, description, tasks, id, name);
this.owner = owner;
this.catalogItems = catalogItems;
this.isPublished = published;

View File

@ -21,9 +21,9 @@ package org.jclouds.vcloud.director.v1_5.domain;
import static com.google.common.base.Objects.equal;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Collection;
import java.util.Collections;
import java.util.Set;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@ -67,6 +67,14 @@ public class CatalogsList {
this.catalogReferences = checkNotNull(catalogReferences, "catalogReferences");
return this;
}
/**
* @see CatalogsList#getCatalogItems()
*/
public Builder catalog(Reference catalog) {
this.catalogReferences.add(checkNotNull(catalog, "catalog"));
return this;
}
public CatalogsList build() {
return new CatalogsList(catalogReferences);
@ -81,7 +89,7 @@ public class CatalogsList {
// for JAXB
}
private CatalogsList(Set<Reference> tasks) {
private CatalogsList(Set<Reference> catalogReferences) {
this.catalogReferences = ImmutableSet.copyOf(checkNotNull(catalogReferences, "catalogReferences"));
}

View File

@ -21,8 +21,6 @@ package org.jclouds.vcloud.director.v1_5.domain;
import javax.xml.bind.annotation.XmlType;
import com.google.common.base.Objects;
/**
* Represents parameters for copying a vApp and optionally deleting the source.

View File

@ -24,6 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Collections;
import java.util.Set;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlSeeAlso;

View File

@ -21,6 +21,9 @@ package org.jclouds.vcloud.director.v1_5.domain;
import static com.google.common.base.Objects.equal;
import java.util.Arrays;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
@ -86,6 +89,36 @@ import com.google.common.base.Objects.ToStringHelper;
"groupAttributes"
})
public class CustomOrgLdapSettings {
public static final class AuthenticationMechanism {
public static final String SIMPLE = "simple";
public static final String KERBEROS = "kerberos";
public static final String MD5DIGEST = "md5digest";
public static final String NTLM = "ntlm";
/**
* All acceptable {@link CustomOrgLdapSettings#getAuthenticationMechanism()} values.
* <p/>
* This list must be updated whenever a new authentication mechanism is added.
*/
public static final List<String> ALL = Arrays.asList(
SIMPLE, KERBEROS, MD5DIGEST, NTLM
);
}
public static final class ConnectorType {
public static final String ACTIVE_DIRECTORY = "ACTIVE_DIRECTORY";
public static final String OPEN_LDAP = "OPEN_LDAP";
/**
* All acceptable {@link OrgLdapSettings#getLdapMode()} values.
* <p/>
* This list must be updated whenever a new mode is added.
*/
public static final List<String> ALL = Arrays.asList(
ACTIVE_DIRECTORY, OPEN_LDAP
);
}
public static Builder<?> builder() {
return new ConcreteBuilder();
}

View File

@ -25,6 +25,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Collections;
import java.util.Set;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

View File

@ -46,7 +46,7 @@ public class Entity extends EntityType<Entity> {
@Override
public Entity build() {
return new Entity(href, type, links, description, tasksInProgress, id, name);
return new Entity(href, type, links, description, tasks, id, name);
}
/**
@ -77,11 +77,11 @@ public class Entity extends EntityType<Entity> {
}
/**
* @see EntityType#getTasksInProgress()
* @see EntityType#getTasks()
*/
@Override
public Builder tasksInProgress(TasksInProgress tasksInProgress) {
this.tasksInProgress = tasksInProgress;
public Builder tasks(Set<Task> tasks) {
super.tasks(tasks);
return this;
}
@ -131,8 +131,8 @@ public class Entity extends EntityType<Entity> {
}
}
private Entity(URI href, String type, Set<Link> links, String description, TasksInProgress tasksInProgress, String id, String name) {
super(href, type, links, description, tasksInProgress, id, name);
private Entity(URI href, String type, Set<Link> links, String description, Set<Task> tasks, String id, String name) {
super(href, type, links, description, tasks, id, name);
}
private Entity() {

View File

@ -22,13 +22,18 @@ import static com.google.common.base.Objects.equal;
import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Collections;
import java.util.Set;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import org.jclouds.javax.annotation.Nullable;
import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
/**
@ -48,7 +53,7 @@ public abstract class EntityType<T extends EntityType<T>> extends ResourceType<T
public static abstract class NewBuilder<T extends NewBuilder<T>> extends ResourceType.NewBuilder<T> {
protected String description;
protected TasksInProgress tasksInProgress;
protected Set<Task> tasks;
protected String name;
protected String id;
@ -77,16 +82,16 @@ public abstract class EntityType<T extends EntityType<T>> extends ResourceType<T
}
/**
* @see EntityType#getTasksInProgress()
* @see EntityType#getTasks()
*/
public T tasksInProgress(TasksInProgress tasksInProgress) {
this.tasksInProgress = tasksInProgress;
public T tasks(Set<Task> tasks) {
this.tasks = tasks;
return self();
}
public T fromEntityType(EntityType<?> in) {
return fromResourceType(in)
.description(in.getDescription()).tasksInProgress(in.getTasksInProgress())
.description(in.getDescription()).tasks(in.getTasks())
.id(in.getId()).name(in.getName());
}
}
@ -94,7 +99,7 @@ public abstract class EntityType<T extends EntityType<T>> extends ResourceType<T
public static abstract class Builder<T extends EntityType<T>> extends ResourceType.Builder<T> {
protected String description;
protected TasksInProgress tasksInProgress;
protected Set<Task> tasks;
protected String name;
protected String id;
@ -121,12 +126,23 @@ public abstract class EntityType<T extends EntityType<T>> extends ResourceType<T
this.id = id;
return this;
}
/**
* @see EntityType#getTasks()
*/
public Builder<T> tasks(Set<Task> tasks) {
if (checkNotNull(tasks, "tasks").size() > 0)
this.tasks = Sets.newLinkedHashSet(tasks);
return this;
}
/**
* @see EntityType#getTasksInProgress()
* @see EntityType#getTasks()
*/
public Builder<T> tasksInProgress(TasksInProgress tasksInProgress) {
this.tasksInProgress = tasksInProgress;
public Builder<T> task(Task task) {
if (tasks == null)
tasks = Sets.newLinkedHashSet();
this.tasks.add(checkNotNull(task, "task"));
return this;
}
@ -151,19 +167,19 @@ public abstract class EntityType<T extends EntityType<T>> extends ResourceType<T
/**
* @see ResourceType#getLinks()
*/
@SuppressWarnings("unchecked")
@Override
public Builder<T> links(Set<Link> links) {
this.links = Sets.newLinkedHashSet(checkNotNull(links, "links"));
return this;
return Builder.class.cast(super.links(links));
}
/**
* @see ResourceType#getLinks()
*/
@SuppressWarnings("unchecked")
@Override
public Builder<T> link(Link link) {
this.links.add(checkNotNull(link, "link"));
return this;
return Builder.class.cast(super.link(link));
}
/**
@ -177,24 +193,26 @@ public abstract class EntityType<T extends EntityType<T>> extends ResourceType<T
public Builder<T> fromEntityType(EntityType<T> in) {
return fromResourceType(in)
.description(in.getDescription()).tasksInProgress(in.getTasksInProgress())
.description(in.getDescription()).tasks(in.getTasks())
.id(in.getId()).name(in.getName());
}
}
@XmlElement(name = "Description")
private String description;
@XmlElement(name = "Tasks")
private TasksInProgress tasksInProgress;
@XmlElementWrapper(name = "Tasks")
@XmlElement(name = "Task")
private Set<Task> tasks;
@XmlAttribute
private String id;
@XmlAttribute(required = true)
private String name;
public EntityType(URI href, String type, Set<Link> links, String description, TasksInProgress tasksInProgress, String id, String name) {
public EntityType(URI href, String type, @Nullable Set<Link> links, String description, @Nullable Set<Task> tasks, String id, String name) {
super(href, type, links);
this.description = description;
this.tasksInProgress = tasksInProgress;
// nullable so that jaxb wont persist empty collections
this.tasks = tasks != null && tasks.size() == 0 ? null : tasks;
this.id = id;
this.name = name;
}
@ -213,8 +231,8 @@ public abstract class EntityType<T extends EntityType<T>> extends ResourceType<T
/**
* A list of queued, running, or recently completed tasks associated with this entity.
*/
public TasksInProgress getTasksInProgress() {
return tasksInProgress;
public Set<Task> getTasks() {
return tasks == null ? ImmutableSet.<Task>of() : Collections.unmodifiableSet(tasks);
}
/**
@ -243,7 +261,7 @@ public abstract class EntityType<T extends EntityType<T>> extends ResourceType<T
EntityType<?> that = EntityType.class.cast(o);
return super.equals(that) &&
equal(this.id, that.id) && equal(this.description, that.description) &&
equal(this.tasksInProgress, that.tasksInProgress) && equal(this.name, that.name);
equal(this.tasks, that.tasks) && equal(this.name, that.name);
}
@Override
@ -258,11 +276,11 @@ public abstract class EntityType<T extends EntityType<T>> extends ResourceType<T
@Override
public int hashCode() {
return super.hashCode() + Objects.hashCode(description, tasksInProgress, id, name);
return super.hashCode() + Objects.hashCode(description, tasks, id, name);
}
@Override
public ToStringHelper string() {
return super.string().add("description", description).add("tasksInProgress", tasksInProgress).add("id", id).add("name", name);
return super.string().add("description", description).add("tasks", tasks).add("id", id).add("name", name);
}
}

View File

@ -20,10 +20,10 @@
package org.jclouds.vcloud.director.v1_5.domain;
import static com.google.common.base.Objects.equal;
import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Set;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;
@ -32,7 +32,6 @@ import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper;
import com.google.common.collect.Sets;
/**
@ -98,7 +97,7 @@ public class File extends EntityType<File> {
}
public File build() {
return new File(href, type, links, description, tasksInProgress, id, name, size, bytesTransferred, checksum);
return new File(href, type, links, description, tasks, id, name, size, bytesTransferred, checksum);
}
@ -127,11 +126,11 @@ public class File extends EntityType<File> {
}
/**
* @see EntityType#getTasksInProgress()
* @see EntityType#getTasks()
*/
@Override
public Builder tasksInProgress(TasksInProgress tasksInProgress) {
super.tasksInProgress (tasksInProgress);
public Builder tasks(Set<Task> tasks) {
super.tasks (tasks);
return this;
}
@ -158,7 +157,7 @@ public class File extends EntityType<File> {
*/
@Override
public Builder links(Set<Link> links) {
this.links = Sets.newLinkedHashSet(checkNotNull(links, "links"));
super.links(links);
return this;
}
@ -167,7 +166,7 @@ public class File extends EntityType<File> {
*/
@Override
public Builder link(Link link) {
this.links.add(checkNotNull(link, "link"));
super.link(link);
return this;
}
@ -185,9 +184,9 @@ public class File extends EntityType<File> {
}
}
public File(URI href, String type, Set<Link> links, String description, TasksInProgress tasksInProgress, String id,
public File(URI href, String type, Set<Link> links, String description, Set<Task> tasks, String id,
String name, Long size, Long bytesTransferred, String checksum) {
super(href, type, links, description, tasksInProgress, id, name);
super(href, type, links, description, tasks, id, name);
this.size = size;
this.bytesTransferred = bytesTransferred;
this.checksum = checksum;

View File

@ -21,8 +21,6 @@ package org.jclouds.vcloud.director.v1_5.domain;
import static com.google.common.base.Objects.equal;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

View File

@ -22,7 +22,6 @@ package org.jclouds.vcloud.director.v1_5.domain;
import static com.google.common.base.Objects.equal;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.bind.annotation.XmlType;
import com.google.common.base.Objects;

View File

@ -106,7 +106,7 @@ public class Group extends EntityType<Group> {
}
public Group build() {
return new Group(href, type, links, description, tasksInProgress, id, name,
return new Group(href, type, links, description, tasks, id, name,
nameInSource, usersList, role);
}
@ -138,11 +138,11 @@ public class Group extends EntityType<Group> {
}
/**
* @see EntityType#getTasksInProgress()
* @see EntityType#getTasks()
*/
@Override
public Builder tasksInProgress(TasksInProgress tasksInProgress) {
super.tasksInProgress(tasksInProgress);
public Builder tasks(Set<Task> tasks) {
super.tasks(tasks);
return this;
}
@ -200,9 +200,9 @@ public class Group extends EntityType<Group> {
}
public Group(URI href, String type, Set<Link> links, String description,
TasksInProgress tasksInProgress, String id, String name, String nameInSource,
Set<Task> tasks, String id, String name, String nameInSource,
UsersList usersList, Reference role) {
super(href, type, links, description, tasksInProgress, id, name);
super(href, type, links, description, tasks, id, name);
this.nameInSource = nameInSource;
this.usersList = usersList;
this.role = role;

View File

@ -62,7 +62,7 @@ import com.google.common.collect.ImmutableList;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "GroupsList")
@XmlType(propOrder = {
"groupReference"
"groups"
})
public class GroupsList {
public static Builder builder() {

View File

@ -25,6 +25,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Collections;
import java.util.Set;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

View File

@ -23,6 +23,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Collections;
import java.util.Set;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

View File

@ -20,7 +20,6 @@
package org.jclouds.vcloud.director.v1_5.domain;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
/**

View File

@ -25,6 +25,7 @@ import java.net.URI;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;

View File

@ -24,6 +24,7 @@ import java.net.URI;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@ -89,7 +90,7 @@ public class Media extends ResourceEntityType<Media> {
@Override
public Media build() {
return new Media(href, type, links, description, tasksInProgress, id, name, files, status, owner, imageType, size);
return new Media(href, type, links, description, tasks, id, name, files, status, owner, imageType, size);
}
/**
@ -138,11 +139,11 @@ public class Media extends ResourceEntityType<Media> {
}
/**
* @see EntityType#getTasksInProgress()
* @see EntityType#getTasks()
*/
@Override
public Builder tasksInProgress(TasksInProgress tasksInProgress) {
super.tasksInProgress(tasksInProgress);
public Builder tasks(Set<Task> tasks) {
super.tasks(tasks);
return this;
}
@ -193,9 +194,9 @@ public class Media extends ResourceEntityType<Media> {
}
public Media(URI href, String type, Set<Link> links, String description, TasksInProgress tasksInProgress, String id,
public Media(URI href, String type, Set<Link> links, String description, Set<Task> tasks, String id,
String name, FilesList files, Integer status, Owner owner, String imageType, long size) {
super(href, type, links, description, tasksInProgress, id, name, files, status);
super(href, type, links, description, tasks, id, name, files, status);
this.owner = owner;
this.imageType = imageType;
this.size = size;

View File

@ -24,6 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Collections;
import java.util.Set;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

View File

@ -23,6 +23,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Set;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

View File

@ -23,6 +23,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Set;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

View File

@ -22,9 +22,7 @@ package org.jclouds.vcloud.director.v1_5.domain;
import static com.google.common.base.Objects.equal;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import javax.xml.bind.annotation.XmlElement;

View File

@ -25,6 +25,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Collections;
import java.util.Set;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

View File

@ -25,6 +25,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Collections;
import java.util.Set;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

View File

@ -19,16 +19,15 @@
package org.jclouds.vcloud.director.v1_5.domain;
import static com.google.common.base.Objects.equal;
import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Set;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper;
import com.google.common.collect.Sets;
@XmlRootElement(name = "NetworkType")
public class NetworkType<T extends NetworkType<T>> extends EntityType<T> {
@ -56,7 +55,7 @@ public class NetworkType<T extends NetworkType<T>> extends EntityType<T> {
@Override
public NetworkType<T> build() {
return new NetworkType<T>(href, type, links, description, tasksInProgress, id, name, networkConfiguration);
return new NetworkType<T>(href, type, links, description, tasks, id, name, networkConfiguration);
}
/**
@ -85,13 +84,13 @@ public class NetworkType<T extends NetworkType<T>> extends EntityType<T> {
this.id = id;
return this;
}
/**
* @see EntityType#getTasksInProgress()
* @see EntityType#getTasks()
*/
@Override
public Builder<T> tasksInProgress(TasksInProgress tasksInProgress) {
this.tasksInProgress = tasksInProgress;
public Builder<T> tasks(Set<Task> tasks) {
super.tasks(tasks);
return this;
}
@ -118,7 +117,7 @@ public class NetworkType<T extends NetworkType<T>> extends EntityType<T> {
*/
@Override
public Builder<T> links(Set<Link> links) {
this.links = Sets.newLinkedHashSet(checkNotNull(links, "links"));
super.links(links);
return this;
}
@ -127,7 +126,7 @@ public class NetworkType<T extends NetworkType<T>> extends EntityType<T> {
*/
@Override
public Builder<T> link(Link link) {
this.links.add(checkNotNull(link, "link"));
super.link(link);
return this;
}
@ -145,9 +144,9 @@ public class NetworkType<T extends NetworkType<T>> extends EntityType<T> {
}
}
public NetworkType(URI href, String type, Set<Link> links, String description, TasksInProgress tasksInProgress,
public NetworkType(URI href, String type, Set<Link> links, String description, Set<Task> tasks,
String id, String name, NetworkConfiguration networkConfiguration) {
super(href, type, links, description, tasksInProgress, id, name);
super(href, type, links, description, tasks, id, name);
this.networkConfiguration = networkConfiguration;
}

View File

@ -33,6 +33,7 @@ import javax.xml.bind.annotation.XmlType;
import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
/**
@ -62,7 +63,7 @@ import com.google.common.collect.ImmutableList;
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Networks", propOrder = {
"network"
"networks"
})
public class Networks {
public static Builder builder() {
@ -75,7 +76,7 @@ public class Networks {
public static class Builder {
private List<Reference> networks;
private List<Reference> networks = Lists.newArrayList();
/**
* @see Networks#getNetwork()

View File

@ -59,8 +59,8 @@ public class Org extends EntityType<Org> {
public static abstract class NewBuilder<T extends NewBuilder<T>> extends EntityType.NewBuilder<T> {
private String fullName;
private Boolean isEnabled;
protected String fullName;
protected Boolean isEnabled;
/**
* @see Org#getFullName()
@ -80,7 +80,7 @@ public class Org extends EntityType<Org> {
@Override
public Org build() {
return new Org(href, type, links, description, tasksInProgress, id, name, fullName, isEnabled);
return new Org(href, type, links, description, tasks, id, name, fullName, isEnabled);
}
public T fromOrg(Org in) {
@ -143,7 +143,7 @@ public class Org extends EntityType<Org> {
@Override
public Org build() {
return new Org(href, type, links, description, tasksInProgress, id, name, fullName, isEnabled);
return new Org(href, type, links, description, tasks, id, name, fullName, isEnabled);
}
/**
@ -174,11 +174,11 @@ public class Org extends EntityType<Org> {
}
/**
* @see EntityType#getTasksInProgress()
* @see EntityType#getTasks()
*/
@Override
public Builder tasksInProgress(TasksInProgress tasksInProgress) {
this.tasksInProgress = tasksInProgress;
public Builder tasks(Set<Task> tasks) {
super.tasks(tasks);
return this;
}
@ -232,7 +232,9 @@ public class Org extends EntityType<Org> {
// for JAXB
}
public Org(URI href, String type, Set<Link> links, String description, TasksInProgress tasksInProgress, String id, String name, String fullName, Boolean enabled) {
public Org(URI href, String type, Set<Link> links, String description,
Set<Task> tasksInProgress, String id, String name,
String fullName, Boolean enabled) {
super(href, type, links, description, tasksInProgress, id, name);
this.fullName = fullName;
isEnabled = enabled;

View File

@ -76,7 +76,7 @@ import com.google.common.collect.ImmutableList;
"fromEmailAddress",
"defaultSubjectPrefix",
"isAlertEmailToAllAdmins",
"alertEmailTo",
"alertEmailsTo",
"smtpServerSettings"
})
public class OrgEmailSettings extends ResourceType<OrgEmailSettings> {
@ -142,7 +142,7 @@ public class OrgEmailSettings extends ResourceType<OrgEmailSettings> {
* @see OrgEmailSettings#getAlertEmailTo()
*/
public Builder alertEmailsTo(List<String> alertEmailsTo) {
this.alertEmailTo = ImmutableList.copyOf(alertEmailsTo);
this.alertEmailTo = alertEmailsTo == null ? null : ImmutableList.copyOf(alertEmailsTo);
return this;
}
@ -163,7 +163,8 @@ public class OrgEmailSettings extends ResourceType<OrgEmailSettings> {
}
public OrgEmailSettings build() {
return new OrgEmailSettings(isDefaultSmtpServer, isDefaultOrgEmail, fromEmailAddress, defaultSubjectPrefix,
return new OrgEmailSettings(href, type, links, isDefaultSmtpServer,
isDefaultOrgEmail, fromEmailAddress, defaultSubjectPrefix,
isAlertEmailToAllAdmins, alertEmailTo, smtpServerSettings);
}
@ -225,9 +226,11 @@ public class OrgEmailSettings extends ResourceType<OrgEmailSettings> {
// For JAXB
}
private OrgEmailSettings(boolean isDefaultSmtpServer, boolean isDefaultOrgEmail,
private OrgEmailSettings(URI href, String type, Set<Link> links,
boolean isDefaultSmtpServer, boolean isDefaultOrgEmail,
String fromEmailAddress, String defaultSubjectPrefix, boolean isAlertEmailToAllAdmins,
List<String> alertEmailTo, SmtpServerSettings smtpServerSettings) {
super(href, type, links);
this.isDefaultSmtpServer = isDefaultSmtpServer;
this.isDefaultOrgEmail = isDefaultOrgEmail;
this.fromEmailAddress = fromEmailAddress;
@ -323,9 +326,6 @@ public class OrgEmailSettings extends ResourceType<OrgEmailSettings> {
*
*/
public List<String> getAlertEmailsTo() {
if (alertEmailsTo == null) {
alertEmailsTo = new ArrayList<String>();
}
return this.alertEmailsTo;
}

View File

@ -63,7 +63,7 @@ import com.google.common.base.Objects.ToStringHelper;
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "OrgGeneralSettings")
@XmlRootElement(name = "GeneralOrgSettings")
@XmlType(propOrder = {
"canPublishCatalogs",
"deployedVMQuota",

View File

@ -22,11 +22,14 @@ package org.jclouds.vcloud.director.v1_5.domain;
import static com.google.common.base.Objects.equal;
import java.net.URI;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import com.google.common.base.Objects;
@ -60,12 +63,28 @@ import com.google.common.base.Objects.ToStringHelper;
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "OrgLdapSettings", propOrder = {
"orgLdapMode",
@XmlRootElement(name = "OrgLdapSettings")
@XmlType(propOrder = {
"ldapMode",
"customUsersOu",
"customOrgLdapSettings"
})
public class OrgLdapSettings extends ResourceType<OrgLdapSettings> {
public static final class LdapMode {
public static final String NONE = "NONE";
public static final String SYSTEM = "SYSTEM";
public static final String CUSTOM = "CUSTOM";
/**
* All acceptable {@link OrgLdapSettings#getLdapMode()} values.
* <p/>
* This list must be updated whenever a new mode is added.
*/
public static final List<String> ALL = Arrays.asList(
NONE, SYSTEM, CUSTOM
);
}
public static Builder builder() {
return new Builder();
}
@ -76,15 +95,15 @@ public class OrgLdapSettings extends ResourceType<OrgLdapSettings> {
public static class Builder extends ResourceType.Builder<OrgLdapSettings> {
private String orgLdapMode;
private String ldapMode;
private String customUsersOu;
private CustomOrgLdapSettings customOrgLdapSettings;
/**
* @see OrgLdapSettings#getOrgLdapMode()
* @see OrgLdapSettings#getLdapMode()
*/
public Builder orgLdapMode(String orgLdapMode) {
this.orgLdapMode = orgLdapMode;
public Builder ldapMode(String ldapMode) {
this.ldapMode = ldapMode;
return this;
}
@ -106,7 +125,7 @@ public class OrgLdapSettings extends ResourceType<OrgLdapSettings> {
public OrgLdapSettings build() {
OrgLdapSettings orgLdapSettings = new OrgLdapSettings(href, type, links,
orgLdapMode, customUsersOu, customOrgLdapSettings);
ldapMode, customUsersOu, customOrgLdapSettings);
return orgLdapSettings;
}
@ -154,7 +173,7 @@ public class OrgLdapSettings extends ResourceType<OrgLdapSettings> {
}
public Builder fromOrgLdapSettings(OrgLdapSettings in) {
return fromResourceType(in)
.orgLdapMode(in.getOrgLdapMode())
.ldapMode(in.getLdapMode())
.customUsersOu(in.getCustomUsersOu())
.customOrgLdapSettings(in.getCustomOrgLdapSettings());
}
@ -166,9 +185,9 @@ public class OrgLdapSettings extends ResourceType<OrgLdapSettings> {
}
public OrgLdapSettings(URI href, String type, Set<Link> links,
String orgLdapMode, String customUsersOu, CustomOrgLdapSettings customOrgLdapSettings) {
String ldapMode, String customUsersOu, CustomOrgLdapSettings customOrgLdapSettings) {
super(href, type, links);
this.orgLdapMode = orgLdapMode;
this.ldapMode = ldapMode;
this.customUsersOu = customUsersOu;
this.customOrgLdapSettings = customOrgLdapSettings;
}
@ -176,7 +195,7 @@ public class OrgLdapSettings extends ResourceType<OrgLdapSettings> {
@XmlElement(name = "OrgLdapMode")
protected String orgLdapMode;
protected String ldapMode;
@XmlElement(name = "CustomUsersOu")
protected String customUsersOu;
@XmlElement(name = "CustomOrgLdapSettings")
@ -190,8 +209,8 @@ public class OrgLdapSettings extends ResourceType<OrgLdapSettings> {
* {@link String }
*
*/
public String getOrgLdapMode() {
return orgLdapMode;
public String getLdapMode() {
return ldapMode;
}
/**
@ -226,7 +245,7 @@ public class OrgLdapSettings extends ResourceType<OrgLdapSettings> {
return false;
OrgLdapSettings that = OrgLdapSettings.class.cast(o);
return super.equals(that) &&
equal(orgLdapMode, that.orgLdapMode) &&
equal(ldapMode, that.ldapMode) &&
equal(customUsersOu, that.customUsersOu) &&
equal(customOrgLdapSettings, that.customOrgLdapSettings);
}
@ -234,7 +253,7 @@ public class OrgLdapSettings extends ResourceType<OrgLdapSettings> {
@Override
public int hashCode() {
return Objects.hashCode(super.hashCode(),
orgLdapMode,
ldapMode,
customUsersOu,
customOrgLdapSettings);
}
@ -242,7 +261,7 @@ public class OrgLdapSettings extends ResourceType<OrgLdapSettings> {
@Override
public ToStringHelper string() {
return super.string()
.add("orgLdapMode", orgLdapMode)
.add("orgLdapMode", ldapMode)
.add("customUsersOu", customUsersOu)
.add("customOrgLdapSettings", customOrgLdapSettings);
}

View File

@ -27,6 +27,7 @@ import java.util.Set;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import com.google.common.base.Objects;
@ -60,7 +61,8 @@ import com.google.common.base.Objects.ToStringHelper;
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "OrgLeaseSettings", propOrder = {
@XmlRootElement(name = "VAppLeaseSettings")
@XmlType(propOrder = {
"deleteOnStorageLeaseExpiration",
"deploymentLeaseSeconds",
"storageLeaseSeconds"

View File

@ -23,6 +23,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Collections;
import java.util.Set;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

View File

@ -19,16 +19,15 @@
package org.jclouds.vcloud.director.v1_5.domain;
import static com.google.common.base.Objects.equal;
import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Set;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper;
import com.google.common.collect.Sets;
@XmlRootElement(name = "OrgNetwork")
public class OrgNetwork extends NetworkType<OrgNetwork> {
@ -66,7 +65,7 @@ public class OrgNetwork extends NetworkType<OrgNetwork> {
@Override
public OrgNetwork build() {
return new OrgNetwork(href, type, links, description, tasksInProgress, id, name, networkConfiguration,
return new OrgNetwork(href, type, links, description, tasks, id, name, networkConfiguration,
networkPool, allowedExternalIpAddresses);
}
@ -104,13 +103,13 @@ public class OrgNetwork extends NetworkType<OrgNetwork> {
this.id = id;
return this;
}
/**
* @see EntityType#getTasksInProgress()
* @see EntityType#getTasks()
*/
@Override
public Builder tasksInProgress(TasksInProgress tasksInProgress) {
this.tasksInProgress = tasksInProgress;
public Builder tasks(Set<Task> tasks) {
super.tasks(tasks);
return this;
}
@ -137,7 +136,7 @@ public class OrgNetwork extends NetworkType<OrgNetwork> {
*/
@Override
public Builder links(Set<Link> links) {
this.links = Sets.newLinkedHashSet(checkNotNull(links, "links"));
super.links(links);
return this;
}
@ -146,7 +145,7 @@ public class OrgNetwork extends NetworkType<OrgNetwork> {
*/
@Override
public Builder link(Link link) {
this.links.add(checkNotNull(link, "link"));
super.link(link);
return this;
}
@ -166,9 +165,9 @@ public class OrgNetwork extends NetworkType<OrgNetwork> {
// For JAXB
}
private OrgNetwork(URI href, String type, Set<Link> links, String description, TasksInProgress tasksInProgress,
private OrgNetwork(URI href, String type, Set<Link> links, String description, Set<Task> tasks,
String id, String name, NetworkConfiguration networkConfiguration, ReferenceType<?> networkPool, IpAddresses allowedExternalIpAddresses) {
super(href, type, links, description, tasksInProgress, id, name, networkConfiguration);
super(href, type, links, description, tasks, id, name, networkConfiguration);
this.networkPool = networkPool;
this.allowedExternalIpAddresses = allowedExternalIpAddresses;
}

View File

@ -193,7 +193,7 @@ public class OrgPasswordPolicySettings extends ResourceType<OrgPasswordPolicySet
* Gets the value of the invalidLoginsBeforeLockout property.
*
*/
public int getInvalidLoginsBeforeLockout() {
public Integer getInvalidLoginsBeforeLockout() {
return invalidLoginsBeforeLockout;
}
@ -201,7 +201,7 @@ public class OrgPasswordPolicySettings extends ResourceType<OrgPasswordPolicySet
* Gets the value of the accountLockoutIntervalMinutes property.
*
*/
public int getAccountLockoutIntervalMinutes() {
public Integer getAccountLockoutIntervalMinutes() {
return accountLockoutIntervalMinutes;
}

View File

@ -69,12 +69,12 @@ import com.google.common.base.Objects.ToStringHelper;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "OrgSettings")
@XmlType(propOrder = {
"orgGeneralSettings",
"generalSettings",
"vAppLeaseSettings",
"vAppTemplateLeaseSettings",
"orgLdapSettings",
"orgEmailSettings",
"orgPasswordPolicySettings"
"ldapSettings",
"emailSettings",
"passwordPolicy"
})
public class OrgSettings extends ResourceType<OrgSettings> {
public static Builder builder() {
@ -87,18 +87,18 @@ public class OrgSettings extends ResourceType<OrgSettings> {
public static class Builder extends ResourceType.Builder<OrgSettings> {
private OrgGeneralSettings orgGeneralSettings;
private OrgGeneralSettings generalSettings;
private OrgLeaseSettings vAppLeaseSettings;
private OrgVAppTemplateLeaseSettings vAppTemplateLeaseSettings;
private OrgLdapSettings orgLdapSettings;
private OrgEmailSettings orgEmailSettings;
private OrgPasswordPolicySettings orgPasswordPolicySettings;
private OrgLdapSettings ldapSettings;
private OrgEmailSettings emailSettings;
private OrgPasswordPolicySettings passwordPolicy;
/**
* @see OrgSettings#getOrgGeneralSettings()
* @see OrgSettings#getGeneralSettings()
*/
public Builder orgGeneralSettings(OrgGeneralSettings orgGeneralSettings) {
this.orgGeneralSettings = orgGeneralSettings;
public Builder generalSettings(OrgGeneralSettings generalSettings) {
this.generalSettings = generalSettings;
return this;
}
@ -119,32 +119,32 @@ public class OrgSettings extends ResourceType<OrgSettings> {
}
/**
* @see OrgSettings#getOrgLdapSettings()
* @see OrgSettings#getLdapSettings()
*/
public Builder orgLdapSettings(OrgLdapSettings orgLdapSettings) {
this.orgLdapSettings = orgLdapSettings;
public Builder ldapSettings(OrgLdapSettings ldapSettings) {
this.ldapSettings = ldapSettings;
return this;
}
/**
* @see OrgSettings#getOrgEmailSettings()
* @see OrgSettings#getEmailSettings()
*/
public Builder orgEmailSettings(OrgEmailSettings orgEmailSettings) {
this.orgEmailSettings = orgEmailSettings;
public Builder emailSettings(OrgEmailSettings emailSettings) {
this.emailSettings = emailSettings;
return this;
}
/**
* @see OrgSettings#getOrgPasswordPolicySettings()
* @see OrgSettings#getPasswordPolicy()
*/
public Builder orgPasswordPolicySettings(OrgPasswordPolicySettings orgPasswordPolicySettings) {
this.orgPasswordPolicySettings = orgPasswordPolicySettings;
public Builder passwordPolicy(OrgPasswordPolicySettings passwordPolicy) {
this.passwordPolicy = passwordPolicy;
return this;
}
public OrgSettings build() {
return new OrgSettings(href, type, links, orgGeneralSettings, vAppLeaseSettings,
vAppTemplateLeaseSettings, orgLdapSettings, orgEmailSettings, orgPasswordPolicySettings);
return new OrgSettings(href, type, links, generalSettings, vAppLeaseSettings,
vAppTemplateLeaseSettings, ldapSettings, emailSettings, passwordPolicy);
}
@ -191,12 +191,12 @@ public class OrgSettings extends ResourceType<OrgSettings> {
}
public Builder fromOrgSettings(OrgSettings in) {
return fromResourceType(in)
.orgGeneralSettings(in.getOrgGeneralSettings())
.generalSettings(in.getGeneralSettings())
.vAppLeaseSettings(in.getVAppLeaseSettings())
.vAppTemplateLeaseSettings(in.getVAppTemplateLeaseSettings())
.orgLdapSettings(in.getOrgLdapSettings())
.orgEmailSettings(in.getOrgEmailSettings())
.orgPasswordPolicySettings(in.getOrgPasswordPolicySettings());
.ldapSettings(in.getLdapSettings())
.emailSettings(in.getEmailSettings())
.passwordPolicy(in.getPasswordPolicy());
}
}
@ -205,32 +205,33 @@ public class OrgSettings extends ResourceType<OrgSettings> {
// For JAXB
}
public OrgSettings(URI href, String type, Set<Link> links,
OrgGeneralSettings orgGeneralSettings,
public OrgSettings(URI href, String type, Set<Link> links,
OrgGeneralSettings generalSettings,
OrgLeaseSettings vAppLeaseSettings,
OrgVAppTemplateLeaseSettings vAppTemplateLeaseSettings,
OrgLdapSettings orgLdapSettings, OrgEmailSettings orgEmailSettings,
OrgPasswordPolicySettings orgPasswordPolicySettings) {
OrgLdapSettings ldapSettings, OrgEmailSettings emailSettings,
OrgPasswordPolicySettings passwordPolicy) {
super(href, type, links);
this.orgGeneralSettings = orgGeneralSettings;
this.generalSettings = generalSettings;
this.vAppLeaseSettings = vAppLeaseSettings;
this.vAppTemplateLeaseSettings = vAppTemplateLeaseSettings;
this.orgLdapSettings = orgLdapSettings;
this.orgPasswordPolicySettings = orgPasswordPolicySettings;
this.ldapSettings = ldapSettings;
this.emailSettings = emailSettings;
this.passwordPolicy = passwordPolicy;
}
@XmlElement(name = "OrgGeneralSettings")
protected OrgGeneralSettings orgGeneralSettings;
protected OrgGeneralSettings generalSettings;
@XmlElement(name = "VAppLeaseSettings")
protected OrgLeaseSettings vAppLeaseSettings;
@XmlElement(name = "VAppTemplateLeaseSettings")
protected OrgVAppTemplateLeaseSettings vAppTemplateLeaseSettings;
@XmlElement(name = "OrgLdapSettings")
protected OrgLdapSettings orgLdapSettings;
protected OrgLdapSettings ldapSettings;
@XmlElement(name = "OrgEmailSettings")
protected OrgEmailSettings orgEmailSettings;
protected OrgEmailSettings emailSettings;
@XmlElement(name = "OrgPasswordPolicySettings")
protected OrgPasswordPolicySettings orgPasswordPolicySettings;
protected OrgPasswordPolicySettings passwordPolicy;
/**
* Gets the value of the orgGeneralSettings property.
@ -240,8 +241,8 @@ public class OrgSettings extends ResourceType<OrgSettings> {
* {@link OrgGeneralSettings }
*
*/
public OrgGeneralSettings getOrgGeneralSettings() {
return orgGeneralSettings;
public OrgGeneralSettings getGeneralSettings() {
return generalSettings;
}
/**
@ -276,8 +277,8 @@ public class OrgSettings extends ResourceType<OrgSettings> {
* {@link OrgLdapSettings }
*
*/
public OrgLdapSettings getOrgLdapSettings() {
return orgLdapSettings;
public OrgLdapSettings getLdapSettings() {
return ldapSettings;
}
/**
@ -288,8 +289,8 @@ public class OrgSettings extends ResourceType<OrgSettings> {
* {@link OrgEmailSettings }
*
*/
public OrgEmailSettings getOrgEmailSettings() {
return orgEmailSettings;
public OrgEmailSettings getEmailSettings() {
return emailSettings;
}
/**
@ -300,8 +301,8 @@ public class OrgSettings extends ResourceType<OrgSettings> {
* {@link OrgPasswordPolicySettings }
*
*/
public OrgPasswordPolicySettings getOrgPasswordPolicySettings() {
return orgPasswordPolicySettings;
public OrgPasswordPolicySettings getPasswordPolicy() {
return passwordPolicy;
}
@Override
@ -312,34 +313,34 @@ public class OrgSettings extends ResourceType<OrgSettings> {
return false;
OrgSettings that = OrgSettings.class.cast(o);
return super.equals(that) &&
equal(orgGeneralSettings, that.orgGeneralSettings) &&
equal(generalSettings, that.generalSettings) &&
equal(vAppLeaseSettings, that.vAppLeaseSettings) &&
equal(vAppTemplateLeaseSettings, that.vAppTemplateLeaseSettings) &&
equal(orgLdapSettings, that.orgLdapSettings) &&
equal(orgEmailSettings, that.orgEmailSettings) &&
equal(orgPasswordPolicySettings, that.orgPasswordPolicySettings);
equal(ldapSettings, that.ldapSettings) &&
equal(emailSettings, that.emailSettings) &&
equal(passwordPolicy, that.passwordPolicy);
}
@Override
public int hashCode() {
return Objects.hashCode(super.hashCode(),
orgGeneralSettings,
generalSettings,
vAppLeaseSettings,
vAppTemplateLeaseSettings,
orgLdapSettings,
orgEmailSettings,
orgPasswordPolicySettings);
ldapSettings,
emailSettings,
passwordPolicy);
}
@Override
public ToStringHelper string() {
return super.string()
.add("orgGeneralSettings", orgGeneralSettings)
.add("generalSettings", generalSettings)
.add("vAppLeaseSettings", vAppLeaseSettings)
.add("vAppTemplateLeaseSettings", vAppTemplateLeaseSettings)
.add("orgLdapSettings", orgLdapSettings)
.add("orgEmailSettings", orgEmailSettings)
.add("orgPasswordPolicySettings", orgPasswordPolicySettings);
.add("ldapSettings", ldapSettings)
.add("emailSettings", emailSettings)
.add("passwordPolicy", passwordPolicy);
}
}

View File

@ -19,17 +19,18 @@
package org.jclouds.vcloud.director.v1_5.domain;
import com.google.common.base.Objects;
import com.google.common.collect.Sets;
import static com.google.common.base.Objects.equal;
import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Set;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import java.net.URI;
import java.util.Set;
import static com.google.common.base.Objects.equal;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.base.Objects;
import com.google.common.collect.Sets;
/**

View File

@ -25,6 +25,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Collections;
import java.util.Set;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

View File

@ -111,4 +111,11 @@ public class Reference extends ReferenceType<Reference> {
Reference that = Reference.class.cast(o);
return super.equals(that);
}
}
public ReferenceType<?> toAdminReference(String endpoint) {
return toBuilder()
.type(null)
.href(URI.create(getHref().toASCIIString().replace(endpoint, endpoint+"/admin")))
.build();
}
}

View File

@ -22,6 +22,7 @@ import static com.google.common.base.Objects.equal;
import java.net.URI;
import java.util.Map;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlSeeAlso;
@ -43,7 +44,7 @@ import com.google.common.base.Objects.ToStringHelper;
CatalogReference.class,
Reference.class
})
public class ReferenceType<T extends ReferenceType<T>> implements URISupplier {
public class ReferenceType<T extends ReferenceType<T>> {
public static <T extends ReferenceType<T>> Builder<T> builder() {
return new Builder<T>();
@ -176,14 +177,6 @@ public class ReferenceType<T extends ReferenceType<T>> implements URISupplier {
return type;
}
/**
* @see URISupplier#getURI()
*/
@Override
public URI getURI() {
return getHref();
}
@Override
public boolean equals(Object o) {
if (this == o)

View File

@ -24,6 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Collections;
import java.util.Set;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

View File

@ -20,16 +20,15 @@
package org.jclouds.vcloud.director.v1_5.domain;
import static com.google.common.base.Objects.equal;
import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Set;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper;
import com.google.common.collect.Sets;
/**
* Base type that represents a resource entity such as a vApp template or virtual media.
@ -71,13 +70,13 @@ public abstract class ResourceEntityType<T extends ResourceEntityType<T>> extend
this.id = id;
return this;
}
/**
* @see EntityType#getTasksInProgress()
* @see EntityType#getTasks()
*/
@Override
public Builder<T> tasksInProgress(TasksInProgress tasksInProgress) {
this.tasksInProgress = tasksInProgress;
public Builder<T> tasks(Set<Task> tasks) {
super.tasks(tasks);
return this;
}
@ -100,20 +99,18 @@ public abstract class ResourceEntityType<T extends ResourceEntityType<T>> extend
}
/**
* @see EntityType#getLinks()
* @see ResourceEntityType#getLinks()
*/
@Override
public Builder<T> links(Set<Link> links) {
this.links = Sets.newLinkedHashSet(checkNotNull(links, "links"));
super.links(links);
return this;
}
/**
* @see EntityType#getLinks()
* @see ResourceEntityType#getLinks()
*/
@Override
public Builder<T> link(Link link) {
this.links.add(checkNotNull(link, "link"));
super.link(link);
return this;
}
@ -133,8 +130,8 @@ public abstract class ResourceEntityType<T extends ResourceEntityType<T>> extend
@XmlAttribute
protected Integer status;
public ResourceEntityType(URI href, String type, Set<Link> links, String description, TasksInProgress tasksInProgress, String id, String name, FilesList files, Integer status) {
super(href, type, links, description, tasksInProgress, id, name);
public ResourceEntityType(URI href, String type, Set<Link> links, String description, Set<Task> tasks, String id, String name, FilesList files, Integer status) {
super(href, type, links, description, tasks, id, name);
this.files = files;
this.status = status;
}

View File

@ -28,7 +28,7 @@ import java.util.Set;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import org.jclouds.vcloud.director.v1_5.domain.EntityType.NewBuilder;
import org.jclouds.javax.annotation.Nullable;
import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper;
@ -46,7 +46,7 @@ import com.google.common.collect.Sets;
*
* @author Adrian Cole
*/
public abstract class ResourceType<T extends ResourceType<T>> implements URISupplier {
public abstract class ResourceType<T extends ResourceType<T>> {
public NewBuilder<?> toNewBuilder() {
throw new UnsupportedOperationException("New builder not yet implemented for this class");
@ -57,7 +57,7 @@ public abstract class ResourceType<T extends ResourceType<T>> implements URISupp
protected URI href;
protected String type;
protected Set<Link> links = Sets.newLinkedHashSet();
protected Set<Link> links;
/**
* @see ResourceType#getHref()
@ -87,6 +87,8 @@ public abstract class ResourceType<T extends ResourceType<T>> implements URISupp
* @see ResourceType#getLinks()
*/
public T link(Link link) {
if (links == null)
links = Sets.newLinkedHashSet();
this.links.add(checkNotNull(link, "link"));
return self();
}
@ -104,7 +106,7 @@ public abstract class ResourceType<T extends ResourceType<T>> implements URISupp
protected URI href;
protected String type;
protected Set<Link> links = Sets.newLinkedHashSet();
protected Set<Link> links;
/**
* @see ResourceType#getHref()
@ -134,6 +136,8 @@ public abstract class ResourceType<T extends ResourceType<T>> implements URISupp
* @see ResourceType#getLinks()
*/
public Builder<T> link(Link link) {
if (links == null)
links = Sets.newLinkedHashSet();
this.links.add(checkNotNull(link, "link"));
return this;
}
@ -150,12 +154,13 @@ public abstract class ResourceType<T extends ResourceType<T>> implements URISupp
@XmlAttribute
private String type;
@XmlElement(name = "Link")
private Set<Link> links = Sets.newLinkedHashSet();
private Set<Link> links;
protected ResourceType(URI href, String type, Set<Link> links) {
protected ResourceType(URI href, String type, @Nullable Set<Link> links) {
this.href = href;
this.type = type;
this.links = ImmutableSet.copyOf(links);
// nullable so that jaxb wont persist empty collections
this.links = links != null && links.size() == 0 ? null : links;
}
protected ResourceType() {
@ -179,14 +184,6 @@ public abstract class ResourceType<T extends ResourceType<T>> implements URISupp
return href;
}
/**
* @see URISupplier#getURI()
*/
@Override
public URI getURI() {
return getHref();
}
/**
* Contains the type of the the entity.
* <p/>
@ -203,7 +200,7 @@ public abstract class ResourceType<T extends ResourceType<T>> implements URISupp
* Set of optional links to an entity or operation associated with this object.
*/
public Set<Link> getLinks() {
return Collections.unmodifiableSet(links);
return links == null ? ImmutableSet.<Link>of() : Collections.unmodifiableSet(links);
}
@Override

View File

@ -24,6 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Collections;
import java.util.Set;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

View File

@ -61,7 +61,7 @@ import com.google.common.base.Objects.ToStringHelper;
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "SmtpServerSettings", propOrder = {
"isUseAuthentication",
"useAuthentication",
"host",
"username",
"password"
@ -200,8 +200,7 @@ public class SmtpServerSettings {
if (o == null || getClass() != o.getClass())
return false;
SmtpServerSettings that = SmtpServerSettings.class.cast(o);
return super.equals(that) &&
equal(useAuthentication, that.useAuthentication) &&
return equal(useAuthentication, that.useAuthentication) &&
equal(host, that.host) &&
equal(username, that.username) &&
equal(password, that.password);
@ -209,8 +208,7 @@ public class SmtpServerSettings {
@Override
public int hashCode() {
return Objects.hashCode(super.hashCode(),
useAuthentication,
return Objects.hashCode(useAuthentication,
host,
username,
password);

View File

@ -24,6 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Collections;
import java.util.Set;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

View File

@ -24,6 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Collections;
import java.util.Set;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

View File

@ -19,13 +19,13 @@
package org.jclouds.vcloud.director.v1_5.domain;
import static com.google.common.base.Objects.equal;
import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Set;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@ -34,7 +34,6 @@ import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper;
import com.google.common.collect.Sets;
/**
* Represents an asynchronous or long-running task in the vCloud environment.
@ -43,6 +42,8 @@ import com.google.common.collect.Sets;
* &lt;xs:complexType name="TaskType"&gt;
* </pre>
*
* TODO: this object and the hierarchy is wrong. it is literally a Task with a Task container. please review class diagram
*
* @author grkvlt@apache.org
*/
@XmlRootElement(name = "Task")
@ -187,7 +188,7 @@ public class Task extends EntityType<Task> {
@Override
public Task build() {
return new Task(href, type, links, description, tasksInProgress, id, name,
return new Task(href, type, links, description, tasks, id, name,
error, org, progress, owner, user, params, status, operation, operationName, startTime, endTime, expiryTime);
}
@ -217,13 +218,13 @@ public class Task extends EntityType<Task> {
this.id = id;
return this;
}
/**
* @see EntityType#getTasksInProgress()
* @see EntityType#getTasks()
*/
@Override
public Builder tasksInProgress(TasksInProgress tasksInProgress) {
this.tasksInProgress = tasksInProgress;
public Builder tasks(Set<Task> tasks) {
super.tasks(tasks);
return this;
}
@ -246,23 +247,22 @@ public class Task extends EntityType<Task> {
}
/**
* @see EntityType#getLinks()
* @see ResourceType#getLinks()
*/
@Override
public Builder links(Set<Link> links) {
this.links = Sets.newLinkedHashSet(checkNotNull(links, "links"));
return this;
return Builder.class.cast(super.links(links));
}
/**
* @see EntityType#getLinks()
* @see ResourceType#getLinks()
*/
@Override
public Builder link(Link link) {
this.links.add(checkNotNull(link, "link"));
return this;
return Builder.class.cast(super.link(link));
}
@Override
public Builder fromEntityType(EntityType<Task> in) {
return Builder.class.cast(super.fromEntityType(in));
@ -275,11 +275,11 @@ public class Task extends EntityType<Task> {
}
}
public Task(URI href, String type, Set<Link> links, String description, TasksInProgress tasksInProgress,
public Task(URI href, String type, Set<Link> links, String description, Set<Task> tasks,
String id, String name, Error error, Reference org, Integer progress, Reference owner,
Reference user, Object params, String status, String operation, String operationName,
Date startTime, Date endTime, Date expiryTime) {
super(href, type, links, description, tasksInProgress, id, name);
super(href, type, links, description, tasks, id, name);
this.error = error;
this.org = org;
this.progress = progress;
@ -383,6 +383,7 @@ public class Task extends EntityType<Task> {
* <li>aborted - The task was aborted by an administrative action.
* </ul>
*/
// TODO: enum!!!
public String getStatus() {
return status;
}

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 CONDITIOXMLNS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.jclouds.vcloud.director.v1_5.domain;
import static com.google.common.base.Objects.equal;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Collection;
import java.util.Collections;
import java.util.Set;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import com.google.common.base.Objects;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
/**
* @author grkvlt@apache.org
*/
@XmlRootElement(name = "TasksInProgress")
public class TasksInProgress {
public static Builder builder() {
return new Builder();
}
public Builder toBuilder() {
return new Builder();
}
public static class Builder {
protected Set<Task> tasks = Sets.newLinkedHashSet();
/**
* @see TasksInProgress#getTasks()
*/
public Builder tasks(Set<Task> tasks) {
this.tasks = ImmutableSet.copyOf(checkNotNull(tasks, "tasks"));
return this;
}
/**
* @see TasksInProgress#getTasks()
*/
public Builder task(Task task) {
this.tasks.add(checkNotNull(task, "task"));
return this;
}
public TasksInProgress build() {
return new TasksInProgress(tasks);
}
public Builder fromTasksInProgress(TasksInProgress in) {
return tasks(in.getTasks());
}
}
private TasksInProgress() {
// for JAXB
}
private TasksInProgress(Collection<Task> tasks) {
this.tasks = ImmutableSet.copyOf(tasks);
}
@XmlElement(name = "Task")
private Set<Task> tasks = Sets.newLinkedHashSet();
public Set<Task> getTasks() {
return Collections.unmodifiableSet(tasks);
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
TasksInProgress that = TasksInProgress.class.cast(o);
return equal(this.tasks, that.tasks);
}
@Override
public int hashCode() {
return Objects.hashCode(tasks);
}
@Override
public String toString() {
return Objects.toStringHelper("").add("tasks", tasks).toString();
}
}

View File

@ -22,12 +22,16 @@ import static com.google.common.base.Objects.equal;
import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.Set;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
import org.jclouds.javax.annotation.Nullable;
import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper;
@ -35,33 +39,36 @@ import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
/**
* A list of tasks.
*
* Task List
*
*
* @author Adrian Cole
*/
@XmlRootElement(name = "TasksList")
public class TasksList extends EntityType<TasksList> {
public static final String MEDIA_TYPE = VCloudDirectorMediaType.TASKS_LIST;
public class TasksList extends ResourceType<TasksList> implements Set<Task> {
public static Builder builder() {
return new Builder();
}
@Override
public Builder toBuilder() {
return new Builder();
}
public static class Builder extends ResourceType.Builder<TasksList> {
protected String name;
public static class Builder extends EntityType.Builder<TasksList> {
private Set<Task> tasks;
protected Set<Task> tasks = Sets.newLinkedHashSet();
/**
* @see TasksList#getName()
*/
public Builder name(String name) {
this.name = name;
return this;
}
/**
* @see TasksList#getTasks()
*/
public Builder tasks(Set<Task> tasks) {
this.tasks = Sets.newLinkedHashSet(checkNotNull(tasks, "tasks"));
if (checkNotNull(tasks, "tasks").size() > 0)
this.tasks = Sets.newLinkedHashSet(tasks);
return this;
}
@ -69,111 +76,86 @@ public class TasksList extends EntityType<TasksList> {
* @see TasksList#getTasks()
*/
public Builder task(Task task) {
if (tasks == null)
tasks = Sets.newLinkedHashSet();
this.tasks.add(checkNotNull(task, "task"));
return this;
}
@Override
public TasksList build() {
return new TasksList(href, type, links, description, tasksInProgress, id, name, tasks);
return new TasksList(href, type, links, name, tasks);
}
/**
* @see EntityType#getName()
*/
@Override
public Builder name(String name) {
this.name = name;
return this;
}
/**
* @see EntityType#getDescription()
*/
@Override
public Builder description(String description) {
this.description = description;
return this;
}
/**
* @see EntityType#getId()
*/
@Override
public Builder id(String id) {
this.id = id;
return this;
}
/**
* @see EntityType#getTasksInProgress()
*/
@Override
public Builder tasksInProgress(TasksInProgress tasksInProgress) {
this.tasksInProgress = tasksInProgress;
return this;
}
/**
* @see ReferenceType#getHref()
* @see ResourceType#getHref()
*/
@Override
public Builder href(URI href) {
this.href = href;
super.href(href);
return this;
}
/**
* @see ReferenceType#getType()
* @see ResourceType#getType()
*/
@Override
public Builder type(String type) {
this.type = type;
super.type(type);
return this;
}
/**
* @see EntityType#getLinks()
* @see ResourceType#getLinks()
*/
@Override
public Builder links(Set<Link> links) {
this.links = Sets.newLinkedHashSet(checkNotNull(links, "links"));
return this;
return Builder.class.cast(super.links(links));
}
/**
* @see EntityType#getLinks()
* @see ResourceType#getLinks()
*/
@Override
public Builder link(Link link) {
this.links.add(checkNotNull(link, "link"));
super.link(link);
return this;
}
@Override
public Builder fromEntityType(EntityType<TasksList> in) {
return Builder.class.cast(super.fromEntityType(in));
public Builder fromTasksList(TasksList in) {
return fromResourceType(in).tasks(in);
}
public Builder fromTasksList(TasksList in) {
return fromEntityType(in).tasks(in.getTasks());
/**
* {@inheritDoc}
*/
@Override
public Builder fromResourceType(ResourceType<TasksList> in) {
return Builder.class.cast(super.fromResourceType(in));
}
}
@XmlAttribute(required = true)
private String name;
@XmlElement(name = "Task")
private Set<Task> tasks;
public TasksList(URI href, String type, @Nullable Set<Link> links, String name, @Nullable Set<Task> tasks) {
super(href, type, links);
this.tasks = tasks;
this.name = name;
}
protected TasksList() {
// for JAXB
// For JAXB
}
public TasksList(URI href, String type, Set<Link> links, String description, TasksInProgress tasksInProgress, String id, String name, Set<Task> tasks) {
super(href, type, links, description, tasksInProgress, id, name);
this.tasks = ImmutableSet.copyOf(tasks);
}
@XmlElement(name = "Task")
private Set<Task> tasks = Sets.newLinkedHashSet();
public Set<Task> getTasks() {
return Collections.unmodifiableSet(tasks);
/**
* Contains the name of the the entity.
*/
public String getName() {
return name;
}
@Override
@ -183,16 +165,91 @@ public class TasksList extends EntityType<TasksList> {
if (o == null || getClass() != o.getClass())
return false;
TasksList that = TasksList.class.cast(o);
return super.equals(that) && equal(this.tasks, that.tasks);
return super.equals(that) && equal(this.delegate(), that.delegate()) && equal(this.name, that.name);
}
@Override
public int hashCode() {
return super.hashCode() + Objects.hashCode(tasks);
return super.hashCode() + Objects.hashCode(delegate(), name);
}
private Set<Task> delegate() {
return tasks == null ? ImmutableSet.<Task>of() : Collections.unmodifiableSet(tasks);
}
@Override
public ToStringHelper string() {
return super.string().add("tasks", tasks);
return super.string().add("name", name).add("tasks", delegate());
}
}
@Override
public Builder toBuilder() {
return new Builder().fromTasksList(this);
}
@Override
public Iterator<Task> iterator() {
return delegate().iterator();
}
@Override
public int size() {
return delegate().size();
}
@Override
public boolean removeAll(Collection<?> collection) {
return delegate().removeAll(collection);
}
@Override
public boolean isEmpty() {
return delegate().isEmpty();
}
@Override
public boolean contains(Object object) {
return delegate().contains(object);
}
@Override
public boolean add(Task element) {
return delegate().add(element);
}
@Override
public boolean remove(Object object) {
return delegate().remove(object);
}
@Override
public boolean containsAll(Collection<?> collection) {
return delegate().containsAll(collection);
}
@Override
public boolean addAll(Collection<? extends Task> collection) {
return delegate().addAll(collection);
}
@Override
public boolean retainAll(Collection<?> collection) {
return delegate().retainAll(collection);
}
@Override
public void clear() {
delegate().clear();
}
@Override
public Object[] toArray() {
return delegate().toArray();
}
@Override
public <T> T[] toArray(T[] array) {
return delegate().toArray(array);
}
}

View File

@ -1,47 +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.vcloud.director.v1_5.domain;
import java.net.URI;
/**
* @author grkvlt@apache.org
*/
public interface URISupplier {
/**
* This returns the {@link URI} for a particular {@link ReferenceType} or {@link ResourceType} object.
*
* @see ResourceType#getHref()
* @see ReferenceType#getHref()
*/
public URI getURI();
public static class SingleURI {
public static URISupplier fromURI(final URI uri) {
return new URISupplier(){
@Override
public URI getURI() {
return uri;
}
};
}
}
}

View File

@ -23,6 +23,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Set;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@ -269,7 +270,7 @@ public class User
public User build() {
return new User(href, type, links, description, tasksInProgress, id,
return new User(href, type, links, description, tasks, id,
name, fullName, emailAddress, telephone, isEnabled, isLocked,
im, nameInSource, isAlertEnabled, alertEmailPrefix, alertEmail,
isExternal, isDefaultCached, isGroupRole, storedVmQuota, deployedVmQuota,
@ -285,13 +286,13 @@ public class User
this.id = id;
return this;
}
/**
* @see EntityType#getTasksInProgress()
* @see EntityType#getTasks()
*/
@Override
public Builder tasksInProgress(TasksInProgress tasksInProgress) {
this.tasksInProgress = tasksInProgress;
public Builder tasks(Set<Task> tasks) {
super.tasks(tasks);
return this;
}
@ -397,12 +398,12 @@ public class User
@XmlElement(name = "GroupReferences")
protected Object /* GroupsList */ groupReferences;
public User(URI href, String type, Set<Link> links, String description, TasksInProgress tasksInProgress, String id,
public User(URI href, String type, Set<Link> links, String description, Set<Task> tasks, String id,
String name, String fullName, String emailAddress, String telephone, Boolean enabled, Boolean locked,
String im, String nameInSource, Boolean alertEnabled, String alertEmailPrefix, String alertEmail,
Boolean external, Boolean defaultCached, Boolean groupRole, Integer storedVmQuota, Integer deployedVmQuota,
Reference role, String password, Object groupReferences) {
super(href, type, links, description, tasksInProgress, id, name);
super(href, type, links, description, tasks, id, name);
this.fullName = fullName;
this.emailAddress = emailAddress;
this.telephone = telephone;

View File

@ -33,6 +33,7 @@ import javax.xml.bind.annotation.XmlType;
import com.google.common.base.Objects;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
/**
@ -62,7 +63,7 @@ import com.google.common.collect.ImmutableList;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "UsersList")
@XmlType(propOrder = {
"userReference"
"users"
})
public class UsersList {
public static Builder builder() {
@ -74,7 +75,7 @@ public class UsersList {
}
public static class Builder {
private List<Reference> users;
private List<Reference> users = Lists.newArrayList();
/**
* @see UsersList#getUsers()

View File

@ -24,6 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Set;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

View File

@ -25,6 +25,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Collections;
import java.util.Set;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementRef;
@ -144,7 +145,7 @@ public class VAppTemplate extends ResourceEntityType<VAppTemplate> {
@Override
public VAppTemplate build() {
return new VAppTemplate(href, type, links, description, tasksInProgress, id, name, files, status, owner, children, sections, vAppScopedLocalId, ovfDescriptorUploaded, goldMaster);
return new VAppTemplate(href, type, links, description, tasks, id, name, files, status, owner, children, sections, vAppScopedLocalId, ovfDescriptorUploaded, goldMaster);
}
@Override
@ -209,11 +210,11 @@ public class VAppTemplate extends ResourceEntityType<VAppTemplate> {
}
/**
* @see EntityType#getTasksInProgress()
* @see EntityType#getTasks()
*/
@Override
public Builder tasksInProgress(TasksInProgress tasksInProgress) {
super.tasksInProgress(tasksInProgress);
public Builder tasks(Set<Task> tasks) {
super.tasks(tasks);
return this;
}
@ -267,10 +268,10 @@ public class VAppTemplate extends ResourceEntityType<VAppTemplate> {
@XmlAttribute
protected Boolean goldMaster;
private VAppTemplate(URI href, String type, Set<Link> links, String description, TasksInProgress tasksInProgress,
private VAppTemplate(URI href, String type, Set<Link> links, String description, Set<Task> tasks,
String id, String name, FilesList files, Integer status, Owner owner, Set<VAppTemplate> children,
Set<? extends SectionType<?>> sections, String vAppScopedLocalId, Boolean ovfDescriptorUploaded, Boolean goldMaster) {
super(href, type, links, description, tasksInProgress, id, name, files, status);
super(href, type, links, description, tasks, id, name, files, status);
this.owner = owner;
this.children = VAppTemplateChildren.builder().vms(children).build();
this.sections = ImmutableSet.copyOf(sections);

View File

@ -24,6 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Collections;
import java.util.Set;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

View File

@ -20,10 +20,10 @@
package org.jclouds.vcloud.director.v1_5.domain;
import static com.google.common.base.Objects.equal;
import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Set;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@ -31,7 +31,6 @@ import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.bind.annotation.XmlType;
import com.google.common.base.Objects;
import com.google.common.collect.Sets;
/**
@ -198,7 +197,7 @@ public class Vdc
public Vdc build() {
return new Vdc(
href, type, links, description, tasksInProgress, id, name, allocationModel, storageCapacity,
href, type, links, description, tasks, id, name, allocationModel, storageCapacity,
computeCapacity, resourceEntities, availableNetworks, capabilities, nicQuota, networkQuota,
vmQuota, isEnabled, status);
}
@ -227,13 +226,13 @@ public class Vdc
this.id = id;
return this;
}
/**
* @see EntityType#getTasksInProgress()
* @see EntityType#getTasks()
*/
@Override
public Builder tasksInProgress(TasksInProgress tasksInProgress) {
this.tasksInProgress = tasksInProgress;
public Builder tasks(Set<Task> tasks) {
super.tasks(tasks);
return this;
}
@ -254,13 +253,13 @@ public class Vdc
this.type = type;
return this;
}
/**
* @see EntityType#getLinks()
*/
@Override
public Builder links(Set<Link> links) {
this.links = Sets.newLinkedHashSet(checkNotNull(links, "links"));
super.links(links);
return this;
}
@ -269,11 +268,10 @@ public class Vdc
*/
@Override
public Builder link(Link link) {
this.links.add(checkNotNull(link, "link"));
super.link(link);
return this;
}
@Override
public Builder fromEntityType(EntityType<Vdc> in) {
return Builder.class.cast(super.fromEntityType(in));
@ -295,8 +293,8 @@ public class Vdc
}
}
public Vdc(URI href, String type, Set<Link> links, String description, TasksInProgress tasksInProgress, String id, String name, String allocationModel, CapacityWithUsage storageCapacity, ComputeCapacity computeCapacity, ResourceEntities resourceEntities, AvailableNetworks availableNetworks, Capabilities capabilities, int nicQuota, int networkQuota, Integer vmQuota, Boolean enabled, Integer status) {
super(href, type, links, description, tasksInProgress, id, name);
public Vdc(URI href, String type, Set<Link> links, String description, Set<Task> tasks, String id, String name, String allocationModel, CapacityWithUsage storageCapacity, ComputeCapacity computeCapacity, ResourceEntities resourceEntities, AvailableNetworks availableNetworks, Capabilities capabilities, int nicQuota, int networkQuota, Integer vmQuota, Boolean enabled, Integer status) {
super(href, type, links, description, tasks, id, name);
this.allocationModel = allocationModel;
this.storageCapacity = storageCapacity;
this.computeCapacity = computeCapacity;

View File

@ -24,6 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
@ -33,6 +34,7 @@ import javax.xml.bind.annotation.XmlType;
import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
/**
@ -75,7 +77,7 @@ public class Vdcs {
public static class Builder {
private List<Reference> vdcs;
private List<Reference> vdcs = Lists.newArrayList();
/**
* @see Vdcs#getVdc()

View File

@ -25,7 +25,10 @@ import java.util.List;
import java.util.Map;
import com.google.common.base.Function;
import com.google.common.collect.*;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
/**
*

View File

@ -22,4 +22,5 @@ package org.jclouds.vcloud.director.v1_5.domain.cim;
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorConstants.VCLOUD_CIM_NS;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
import javax.xml.bind.annotation.XmlSchema;

View File

@ -22,6 +22,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Collections;
import java.util.Set;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

View File

@ -19,8 +19,8 @@
package org.jclouds.vcloud.director.v1_5.domain.ovf;
import java.net.URI;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
/**
* @author Adrian Cole

View File

@ -21,6 +21,7 @@ package org.jclouds.vcloud.director.v1_5.domain.ovf;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Set;
import javax.xml.bind.annotation.XmlRootElement;
import org.jclouds.javax.annotation.Nullable;

View File

@ -22,6 +22,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorConstants.VCLOUD_OVF_NS;
import java.util.Set;
import javax.xml.bind.annotation.XmlRootElement;
import org.jclouds.javax.annotation.Nullable;

View File

@ -22,6 +22,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorConstants.VCLOUD_OVF_NS;
import java.util.Set;
import javax.xml.bind.annotation.XmlRootElement;
import org.jclouds.javax.annotation.Nullable;

View File

@ -29,4 +29,5 @@ import static org.jclouds.vcloud.director.v1_5.VCloudDirectorConstants.VCLOUD_OV
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
import javax.xml.bind.annotation.XmlSchema;

View File

@ -29,4 +29,5 @@ import static org.jclouds.vcloud.director.v1_5.VCloudDirectorConstants.VCLOUD_OV
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
import javax.xml.bind.annotation.XmlSchema;

View File

@ -23,6 +23,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Set;
import javax.xml.bind.annotation.XmlRootElement;
import org.jclouds.vcloud.director.v1_5.domain.CatalogReference;

View File

@ -24,6 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Set;
import javax.xml.bind.annotation.XmlAttribute;
import org.jclouds.vcloud.director.v1_5.domain.Link;

View File

@ -25,6 +25,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Date;
import java.util.Set;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSchemaType;

View File

@ -24,6 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Set;
import javax.xml.bind.annotation.XmlAttribute;
import org.jclouds.vcloud.director.v1_5.domain.Link;

View File

@ -23,6 +23,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Set;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlSchemaType;

View File

@ -24,6 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Set;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlRootElement;

View File

@ -24,11 +24,10 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Set;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlElementRefs;
import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
import org.jclouds.vcloud.director.v1_5.domain.CatalogReference;
import org.jclouds.vcloud.director.v1_5.domain.Link;
import org.jclouds.vcloud.director.v1_5.domain.ReferenceType;

View File

@ -25,8 +25,8 @@ package org.jclouds.vcloud.director.v1_5.domain.query;
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorConstants.VCLOUD_1_5_NS;
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorConstants.VCLOUD_CIM_NS;
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorConstants.VCLOUD_OVF_NS;
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
import javax.xml.bind.annotation.XmlSchema;

View File

@ -30,4 +30,5 @@ import static org.jclouds.vcloud.director.v1_5.VCloudDirectorConstants.VCLOUD_OV
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
import javax.xml.bind.annotation.XmlSchema;

View File

@ -49,6 +49,18 @@ import com.google.common.util.concurrent.ListenableFuture;
*/
@RequestFilters(AddVCloudAuthorizationToRequest.class)
public interface AdminCatalogAsyncClient extends CatalogAsyncClient {
/**
* @see AdminClient#createCatalog(URI, AdminCatalog)
*/
@POST
@Path("/catalogs")
@Consumes(VCloudDirectorMediaType.ADMIN_CATALOG)
@Produces(VCloudDirectorMediaType.ADMIN_CATALOG)
@JAXBResponseParser
@ExceptionParser(ThrowVCloudErrorOn4xx.class)
ListenableFuture<AdminCatalog> createCatalog(@EndpointParam URI orgRef,
@BinderParam(BindToXMLPayload.class) AdminCatalog catalog);
/**
* @see AdminClient#getCatalog(URI)

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