Issue 830: Updates and improvements for domain objects

This commit is contained in:
Andrew Donald Kennedy 2012-03-31 13:18:42 +01:00
parent 6f6b958aad
commit c4cc8821d6
16 changed files with 452 additions and 302 deletions

View File

@ -32,12 +32,13 @@ import javax.xml.bind.annotation.XmlType;
*/ */
@XmlType(name = "CloneVAppParams") @XmlType(name = "CloneVAppParams")
@XmlRootElement(name = "CloneVAppParams") @XmlRootElement(name = "CloneVAppParams")
public class CloneVAppParams extends InstantiateVAppParamsType { public class CloneVAppParams extends InstantiateVAppParams {
public static Builder<?> builder() { public static Builder<?> builder() {
return new ConcreteBuilder(); return new ConcreteBuilder();
} }
@Override
public Builder<?> toBuilder() { public Builder<?> toBuilder() {
return builder().fromCloneVAppParams(this); return builder().fromCloneVAppParams(this);
} }
@ -45,7 +46,13 @@ public class CloneVAppParams extends InstantiateVAppParamsType {
private static class ConcreteBuilder extends Builder<ConcreteBuilder> { private static class ConcreteBuilder extends Builder<ConcreteBuilder> {
} }
public static abstract class Builder<B extends Builder<B>> extends InstantiateVAppParamsType.Builder<B> { public static abstract class Builder<B extends Builder<B>> extends InstantiateVAppParams.Builder<B> {
@SuppressWarnings("unchecked")
@Override
protected B self() {
return (B) this;
}
@Override @Override
public CloneVAppParams build() { public CloneVAppParams build() {

View File

@ -28,17 +28,13 @@ import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType; import javax.xml.bind.annotation.XmlType;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper;
/** /**
* Represents parameters for copying a vApp template and optionally * Represents parameters for copying a vApp template and optionally
* deleting the source. * deleting the source.
* <p/> *
* <p/>
* <p>Java class for CloneVAppTemplateParams complex type.
* <p/>
* <p>The following schema fragment specifies the expected content contained within this class.
* <p/>
* <pre> * <pre>
* &lt;complexType name="CloneVAppTemplateParams"> * &lt;complexType name="CloneVAppTemplateParams">
* &lt;complexContent> * &lt;complexContent>
@ -63,6 +59,7 @@ public class CloneVAppTemplateParams extends ParamsType {
return new ConcreteBuilder(); return new ConcreteBuilder();
} }
@Override
public Builder<?> toBuilder() { public Builder<?> toBuilder() {
return builder().fromCloneVAppTemplateParams(this); return builder().fromCloneVAppTemplateParams(this);
} }
@ -75,6 +72,12 @@ public class CloneVAppTemplateParams extends ParamsType {
private Reference source; private Reference source;
private Boolean isSourceDelete; private Boolean isSourceDelete;
@SuppressWarnings("unchecked")
@Override
protected B self() {
return (B) this;
}
/** /**
* @see CloneVAppTemplateParams#getSource() * @see CloneVAppTemplateParams#getSource()
*/ */
@ -101,6 +104,7 @@ public class CloneVAppTemplateParams extends ParamsType {
return self(); return self();
} }
@Override
public CloneVAppTemplateParams build() { public CloneVAppTemplateParams build() {
return new CloneVAppTemplateParams(this); return new CloneVAppTemplateParams(this);
} }
@ -130,9 +134,6 @@ public class CloneVAppTemplateParams extends ParamsType {
/** /**
* Gets the value of the source property. * Gets the value of the source property.
*
* @return possible object is
* {@link Reference }
*/ */
public Reference getSource() { public Reference getSource() {
return source; return source;
@ -140,9 +141,6 @@ public class CloneVAppTemplateParams extends ParamsType {
/** /**
* Gets the value of the isSourceDelete property. * Gets the value of the isSourceDelete property.
*
* @return possible object is
* {@link Boolean }
*/ */
public Boolean isSourceDelete() { public Boolean isSourceDelete() {
return isSourceDelete; return isSourceDelete;
@ -155,21 +153,21 @@ public class CloneVAppTemplateParams extends ParamsType {
if (o == null || getClass() != o.getClass()) if (o == null || getClass() != o.getClass())
return false; return false;
CloneVAppTemplateParams that = CloneVAppTemplateParams.class.cast(o); CloneVAppTemplateParams that = CloneVAppTemplateParams.class.cast(o);
return equal(source, that.source) && return super.equals(that) &&
equal(isSourceDelete, that.isSourceDelete); equal(this.source, that.source) &&
equal(this.isSourceDelete, that.isSourceDelete);
} }
@Override @Override
public int hashCode() { public int hashCode() {
return Objects.hashCode(source, return Objects.hashCode(super.hashCode(), source, isSourceDelete);
isSourceDelete);
} }
@Override @Override
public String toString() { public ToStringHelper string() {
return Objects.toStringHelper("") return super.string()
.add("source", source) .add("source", source)
.add("isSourceDelete", isSourceDelete).toString(); .add("isSourceDelete", isSourceDelete);
} }
} }

View File

@ -1,4 +1,4 @@
/** /*
* Licensed to jclouds, Inc. (jclouds) under one or more * Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file * contributor license agreements. See the NOTICE file
* distributed with this work for additional information * distributed with this work for additional information
@ -16,48 +16,176 @@
* specific language governing permissions and limitations * specific language governing permissions and limitations
* under the License. * under the License.
*/ */
package org.jclouds.vcloud.director.v1_5.domain; package org.jclouds.vcloud.director.v1_5.domain;
import static com.google.common.base.Objects.equal;
import java.net.URI;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper;
/** /**
* Parameters for Instantiating a vApp * Represents vApp instantiation parameters.
* *
* @author danikov * @author grkvlt@apache.org
* @see <a href="http://www.vmware.com/support/vcd/doc/rest-api-doc-1.5-html/types/InstantiateVAppParamsType.html">
* vCloud REST API - InstantiateVAppParamsType</a>
* @since 0.9
*/ */
public class InstantiateVAppParams extends InstantiateVAppParamsType { @XmlRootElement(name = "InstantiateVAppParams")
@XmlType(name = "InstantiateVAppParamsType")
public class InstantiateVAppParams extends VAppCreationParamsType {
public static final String MEDIA_TYPe = VCloudDirectorMediaType.INSTANTIATE_VAPP_TEMPLATE_PARAMS;
public static Builder<?> builder() { public static Builder<?> builder() {
return new ConcreteBuilder(); return new ConcreteBuilder();
} }
@Override
public Builder<?> toBuilder() { public Builder<?> toBuilder() {
return builder().fromInstantiateVAppParams(this); return builder().fromInstantiateVAppParamsType(this);
} }
private static class ConcreteBuilder extends Builder<ConcreteBuilder> { private static class ConcreteBuilder extends Builder<ConcreteBuilder> {
} }
public static abstract class Builder<B extends Builder<B>> extends InstantiateVAppParamsType.Builder<B> { public static abstract class Builder<B extends Builder<B>> extends VAppCreationParamsType.Builder<B> {
private Reference source;
private Boolean sourceDelete;
private Boolean linkedClone;
@SuppressWarnings("unchecked")
@Override
protected B self() {
return (B) this;
}
/**
* @see InstantiateVAppParamsType#getSource()
*/
public B source(Reference source) {
this.source = source;
return self();
}
/**
* Sets source to a new Reference that uses this URI as the href.
*
* @see InstantiateVAppParamsType#getSource()
*/
public B source(URI source) {
this.source = Reference.builder().href(source).build();
return self();
}
/**
* @see InstantiateVAppParamsType#isSourceDelete()
*/
public B isSourceDelete(Boolean sourceDelete) {
this.sourceDelete = sourceDelete;
return self();
}
/**
* @see InstantiateVAppParamsType#isSourceDelete()
*/
public B sourceDelete() {
this.sourceDelete = Boolean.TRUE;
return self();
}
/**
* @see InstantiateVAppParamsType#isSourceDelete()
*/
public B notSourceDelete() {
this.sourceDelete = Boolean.FALSE;
return self();
}
/**
* @see InstantiateVAppParamsType#isLinkedClone()
*/
public B isLinkedClone(Boolean linkedClone) {
this.linkedClone = linkedClone;
return self();
}
/**
* @see InstantiateVAppParamsType#isLinkedClone()
*/
public B linkedClone() {
this.linkedClone = Boolean.TRUE;
return self();
}
/**
* @see InstantiateVAppParamsType#isLinkedClone()
*/
public B notLinkedClone() {
this.linkedClone = Boolean.FALSE;
return self();
}
@Override @Override
public InstantiateVAppParams build() { public InstantiateVAppParams build() {
return new InstantiateVAppParams(this); return new InstantiateVAppParams(this);
} }
public B fromInstantiateVAppParams(InstantiateVAppParams in) { public B fromInstantiateVAppParamsType(InstantiateVAppParams in) {
return fromInstantiateVAppParamsType(in); return fromVAppCreationParamsType(in)
.source(in.getSource())
.isSourceDelete(in.isSourceDelete())
.isLinkedClone(in.isLinkedClone());
} }
} }
protected InstantiateVAppParams() {
// For JAXB and builder use
}
public InstantiateVAppParams(Builder<?> builder) { public InstantiateVAppParams(Builder<?> builder) {
super(builder); super(builder);
this.source = builder.source;
this.sourceDelete = builder.sourceDelete;
this.linkedClone = builder.linkedClone;
} }
protected InstantiateVAppParams() { @XmlElement(name = "Source", required = true)
// for JAXB private Reference source;
@XmlElement(name = "IsSourceDelete")
private Boolean sourceDelete;
@XmlAttribute
private Boolean linkedClone;
/**
* Gets the value of the source property.
*/
public Reference getSource() {
return source;
}
/**
* Gets the value of the isSourceDelete property.
*/
public Boolean isSourceDelete() {
return sourceDelete;
}
/**
* Gets the value of the linkedClone property.
*/
public Boolean isLinkedClone() {
return linkedClone;
} }
@Override @Override
@ -67,6 +195,22 @@ public class InstantiateVAppParams extends InstantiateVAppParamsType {
if (o == null || getClass() != o.getClass()) if (o == null || getClass() != o.getClass())
return false; return false;
InstantiateVAppParams that = InstantiateVAppParams.class.cast(o); InstantiateVAppParams that = InstantiateVAppParams.class.cast(o);
return super.equals(that); return super.equals(that) &&
equal(this.source, that.source) &&
equal(this.sourceDelete, that.sourceDelete) &&
equal(this.linkedClone, that.linkedClone);
}
@Override
public int hashCode() {
return Objects.hashCode(super.hashCode(), source, sourceDelete, linkedClone);
}
@Override
public ToStringHelper string() {
return super.string()
.add("source", source)
.add("isSourceDelete", sourceDelete)
.add("linkedClone", linkedClone);
} }
} }

View File

@ -1,204 +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 static com.google.common.base.Objects.equal;
import java.net.URI;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper;
/**
* Represents vApp instantiation parameters.
*
* <pre>
* &lt;complexType name="InstantiateVAppParams" /&gt;
* </pre>
*
* @author grkvlt@apache.org
*/
@XmlType(name = "InstantiateVAppParams")
public class InstantiateVAppParamsType extends VAppCreationParamsType {
public static Builder<?> builder() {
return new ConcreteBuilder();
}
public Builder<?> toBuilder() {
return builder().fromInstantiateVAppParamsType(this);
}
private static class ConcreteBuilder extends Builder<ConcreteBuilder> {
}
public static abstract class Builder<B extends Builder<B>> extends VAppCreationParamsType.Builder<B> {
private Reference source;
private Boolean sourceDelete;
private Boolean linkedClone;
/**
* @see InstantiateVAppParamsType#getSource()
*/
public B source(Reference source) {
this.source = source;
return self();
}
/**
* Sets source to a new Reference that uses this URI as the href.
*
* @see InstantiateVAppParamsType#getSource()
*/
public B source(URI source) {
this.source = Reference.builder().href(source).build();
return self();
}
/**
* @see InstantiateVAppParamsType#isSourceDelete()
*/
public B isSourceDelete(Boolean sourceDelete) {
this.sourceDelete = sourceDelete;
return self();
}
/**
* @see InstantiateVAppParamsType#isSourceDelete()
*/
public B sourceDelete() {
this.sourceDelete = Boolean.TRUE;
return self();
}
/**
* @see InstantiateVAppParamsType#isSourceDelete()
*/
public B notSourceDelete() {
this.sourceDelete = Boolean.FALSE;
return self();
}
/**
* @see InstantiateVAppParamsType#isLinkedClone()
*/
public B isLinkedClone(Boolean linkedClone) {
this.linkedClone = linkedClone;
return self();
}
/**
* @see InstantiateVAppParamsType#isLinkedClone()
*/
public B linkedClone() {
this.linkedClone = Boolean.TRUE;
return self();
}
/**
* @see InstantiateVAppParamsType#isLinkedClone()
*/
public B notLinkedClone() {
this.linkedClone = Boolean.FALSE;
return self();
}
@Override
public InstantiateVAppParamsType build() {
return new InstantiateVAppParamsType(this);
}
public B fromInstantiateVAppParamsType(InstantiateVAppParamsType in) {
return fromVAppCreationParamsType(in)
.source(in.getSource())
.isSourceDelete(in.isSourceDelete())
.isLinkedClone(in.isLinkedClone());
}
}
protected InstantiateVAppParamsType() {
// For JAXB and builder use
}
public InstantiateVAppParamsType(Builder<?> builder) {
super(builder);
this.source = builder.source;
this.sourceDelete = builder.sourceDelete;
this.linkedClone = builder.linkedClone;
}
@XmlElement(name = "Source", required = true)
private Reference source;
@XmlElement(name = "IsSourceDelete")
private Boolean sourceDelete;
@XmlAttribute
private Boolean linkedClone;
/**
* Gets the value of the source property.
*/
public Reference getSource() {
return source;
}
/**
* Gets the value of the isSourceDelete property.
*/
public Boolean isSourceDelete() {
return sourceDelete;
}
/**
* Gets the value of the linkedClone property.
*/
public Boolean isLinkedClone() {
return linkedClone;
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
InstantiateVAppParamsType that = InstantiateVAppParamsType.class.cast(o);
return super.equals(that) &&
equal(this.source, that.source) &&
equal(this.sourceDelete, that.sourceDelete) &&
equal(this.linkedClone, that.linkedClone);
}
@Override
public int hashCode() {
return Objects.hashCode(super.hashCode(), source, sourceDelete, linkedClone);
}
@Override
public ToStringHelper string() {
return super.string()
.add("source", source)
.add("isSourceDelete", sourceDelete)
.add("linkedClone", linkedClone);
}
}

View File

@ -34,7 +34,7 @@ import com.google.common.base.Objects.ToStringHelper;
* </pre> * </pre>
*/ */
@XmlRootElement(name = "InstantiateVAppTemplateParams") @XmlRootElement(name = "InstantiateVAppTemplateParams")
public class InstantiateVAppTemplateParams extends InstantiateVAppParamsType { public class InstantiateVAppTemplateParams extends InstantiateVAppParams {
public static Builder<?> builder() { public static Builder<?> builder() {
return new ConcreteBuilder(); return new ConcreteBuilder();
@ -47,7 +47,7 @@ public class InstantiateVAppTemplateParams extends InstantiateVAppParamsType {
private static class ConcreteBuilder extends Builder<ConcreteBuilder> { private static class ConcreteBuilder extends Builder<ConcreteBuilder> {
} }
public static abstract class Builder<B extends Builder<B>> extends InstantiateVAppParamsType.Builder<B> { public static abstract class Builder<B extends Builder<B>> extends InstantiateVAppParams.Builder<B> {
private Boolean allEULAsAccepted; private Boolean allEULAsAccepted;

View File

@ -21,7 +21,6 @@ package org.jclouds.vcloud.director.v1_5.domain;
import static com.google.common.base.Objects.equal; import static com.google.common.base.Objects.equal;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Collections;
import java.util.Set; import java.util.Set;
import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlElementRef;
@ -29,19 +28,18 @@ import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType; import javax.xml.bind.annotation.XmlType;
import org.jclouds.vcloud.director.v1_5.domain.ovf.SectionType; import org.jclouds.vcloud.director.v1_5.domain.ovf.SectionType;
import org.jclouds.vcloud.director.v1_5.domain.ovf.StartupSection;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
/** /**
* Represents a list of ovf:Section to configure for instantiating a VApp. * Represents a list of ovf:Section to configure for instantiating a VApp.
* *
* <pre>
* &lt;complexType name="InstantiationParams" /&gt;
* </pre>
*
* @author grkvlt@apache.org * @author grkvlt@apache.org
* @see <a href="http://www.vmware.com/support/vcd/doc/rest-api-doc-1.5-html/types/InstantiationParamsType.html">
* vCloud REST API - InstantiationParamsType</a>
* @since 0.9
*/ */
@XmlRootElement(name = "InstantiationParams") @XmlRootElement(name = "InstantiationParams")
@XmlType(name = "InstantiationParamsType") @XmlType(name = "InstantiationParamsType")
@ -56,13 +54,21 @@ public class InstantiationParams {
} }
public static class Builder { public static class Builder {
private Set<? extends SectionType> sections = Sets.newLinkedHashSet(); private Set<SectionType> sections = Sets.newLinkedHashSet();
/** /**
* @see InstantiationParams#getSections() * @see InstantiationParams#getSections()
*/ */
public Builder sections(Set<? extends SectionType> sections) { public Builder sections(Iterable<? extends SectionType> sections) {
this.sections = checkNotNull(sections, "sections"); this.sections = Sets.newLinkedHashSet(checkNotNull(sections, "sections"));
return this;
}
/**
* @see InstantiationParams#getSections()
*/
public Builder section(SectionType section) {
this.sections.add(checkNotNull(section, "section"));
return this; return this;
} }
@ -81,7 +87,7 @@ public class InstantiationParams {
} }
private InstantiationParams(Set<? extends SectionType> sections) { private InstantiationParams(Set<? extends SectionType> sections) {
this.sections = sections; this.sections = ImmutableSet.copyOf(sections);
} }
@XmlElementRef @XmlElementRef
@ -113,7 +119,7 @@ public class InstantiationParams {
* </ul> * </ul>
*/ */
public Set<? extends SectionType> getSections() { public Set<? extends SectionType> getSections() {
return Collections.unmodifiableSet(this.sections); return sections;
} }
@Override @Override
@ -123,7 +129,7 @@ public class InstantiationParams {
if (o == null || getClass() != o.getClass()) if (o == null || getClass() != o.getClass())
return false; return false;
InstantiationParams that = InstantiationParams.class.cast(o); InstantiationParams that = InstantiationParams.class.cast(o);
return equal(sections, that.sections); return equal(this.sections, that.sections);
} }
@Override @Override

View File

@ -30,11 +30,11 @@ import com.google.common.base.Objects.ToStringHelper;
/** /**
* A basic type used to specify parameters for operations. * A basic type used to specify parameters for operations.
* *
* <pre> * @see <a href="http://www.vmware.com/support/vcd/doc/rest-api-doc-1.5-html/types/ParamsType.html">
* &lt;complexType name="Params" /&gt; * vCloud REST API - ParamsType</a>
* </pre> * @since 0.9
*/ */
@XmlType(name = "Params") @XmlType(name = "ParamsType")
public class ParamsType { public class ParamsType {
public static Builder<?> builder() { public static Builder<?> builder() {
@ -100,14 +100,14 @@ public class ParamsType {
protected String name; protected String name;
/** /**
* Gets the value of the description property. * Optional description.
*/ */
public String getDescription() { public String getDescription() {
return description; return description;
} }
/** /**
* Gets the value of the name property. * A name as parameter.
*/ */
public String getName() { public String getName() {
return name; return name;

View File

@ -127,6 +127,7 @@ public abstract class ResourceEntityType extends EntityType {
return new ConcreteBuilder(); return new ConcreteBuilder();
} }
@Override
public Builder<?> toBuilder() { public Builder<?> toBuilder() {
return builder().fromResourceEntityType(this); return builder().fromResourceEntityType(this);
} }

View File

@ -20,26 +20,44 @@ package org.jclouds.vcloud.director.v1_5.domain;
import static com.google.common.base.Objects.equal; import static com.google.common.base.Objects.equal;
import java.util.Arrays;
import java.util.List;
import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType; import javax.xml.bind.annotation.XmlType;
import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
import com.google.common.base.Objects; import com.google.common.base.Objects;
/** /**
* Represents vApp/VM undeployment parameters. * Represents vApp/VM undeployment parameters.
* *
* <pre>
* &lt;complexType name="UndeployVAppParamsType" /&gt;
* </pre>
*
* @author grkvlt@apache.org * @author grkvlt@apache.org
* @see <a href="http://www.vmware.com/support/vcd/doc/rest-api-doc-1.5-html/types/UndeployVAppParamsType.html">
* vCloud REST API - UndeployVAppParamsType</a>
* @since 0.9 * @since 0.9
*/ */
@XmlRootElement(name = "UndeployVAppParams") @XmlRootElement(name = "UndeployVAppParams")
@XmlType(name = "UndeployVAppParamsType") @XmlType(name = "UndeployVAppParamsType")
public class UndeployVAppParams { public class UndeployVAppParams {
public static final String MEDIA_TYPe = VCloudDirectorMediaType.UNDEPLOY_VAPP_PARAMS;
public static class PowerAction {
/** Power off the VMs. This is the default action if this attribute is missing or empty) */
public static final String POWER_OFF = "powerOff";
/** Suspend the VMs. */
public static final String SUSPEND = "suspend";
/** Shut down the VMs. */
public static final String SHUTDOWN = "shutdown";
/** Attempt to power off the VMs. */
public static final String FORCE = "force";
public static final List<String> ALL = Arrays.asList(POWER_OFF, SUSPEND, SHUTDOWN, FORCE);
}
public static Builder builder() { public static Builder builder() {
return new Builder(); return new Builder();
} }
@ -83,16 +101,14 @@ public class UndeployVAppParams {
* *
* All values other than {@code default} ignore actions, order, and delay specified in the StartupSection. One of: * All values other than {@code default} ignore actions, order, and delay specified in the StartupSection. One of:
* <ul> * <ul>
* <li>{@code powerOff} (Power off the VMs. This is the default action if this attribute is missing or empty) * <li>{@link PowerAction#POWER_OFF powerOff}
* <li>{@code suspend} (Suspend the VMs) * <li>{@link PowerAction#SUSPEND suspend}
* <li>{@code shutdown} (Shut down the VMs) * <li>{@link PowerAction#SHUTDOWN shutdown}
* <li>{@code force} (Attempt to power off the VMs. * <li>{@link PowerAction#FORCE force}
* </ul> * </ul>
* Failures in undeploying the VM or associated networks are ignored. All references to the vApp and its VMs are * Failures in undeploying the VM or associated networks are ignored. All references to the vApp and its VMs are
* removed from the database), default (Use the actions, order, and delay specified in the StartupSection). * removed from the database), default (Use the actions, order, and delay specified in the StartupSection).
* *
* TODO add an enumeration for these values
*
* @since 1.5 * @since 1.5
*/ */
public String getUndeployPowerAction() { public String getUndeployPowerAction() {

View File

@ -30,11 +30,10 @@ import com.google.common.base.Objects.ToStringHelper;
/** /**
* Represents vApp creation parameters. * Represents vApp creation parameters.
* *
* <pre>
* &lt;complexType name="VAppCreationParams" /&gt;
* </pre>
*
* @author grkvlt@apache.org * @author grkvlt@apache.org
* @see <a href="http://www.vmware.com/support/vcd/doc/rest-api-doc-1.5-html/types/VAppCreationParamsType.html">
* vCloud REST API - VAppCreationParamsType</a>
* @since 0.9
*/ */
@XmlType(name = "VAppCreationParamsType") @XmlType(name = "VAppCreationParamsType")
public class VAppCreationParamsType extends ParamsType { public class VAppCreationParamsType extends ParamsType {
@ -43,6 +42,7 @@ public class VAppCreationParamsType extends ParamsType {
return new ConcreteBuilder(); return new ConcreteBuilder();
} }
@Override
public Builder<?> toBuilder() { public Builder<?> toBuilder() {
return builder().fromVAppCreationParamsType(this); return builder().fromVAppCreationParamsType(this);
} }
@ -148,28 +148,30 @@ public class VAppCreationParamsType extends ParamsType {
protected Boolean powerOn; protected Boolean powerOn;
/** /**
* Gets the value of the vAppParent property. * Reserved.
*
* Unimplemented.
*/ */
public Reference getVAppParent() { public Reference getVAppParent() {
return vAppParent; return vAppParent;
} }
/** /**
* Gets the value of the instantiationParams property. * Instantiation parameters of a VApp.
*/ */
public InstantiationParams getInstantiationParams() { public InstantiationParams getInstantiationParams() {
return instantiationParams; return instantiationParams;
} }
/** /**
* Gets the value of the deploy property. * Flag to deploy the VApp after successful creation.
*/ */
public Boolean isDeploy() { public Boolean isDeploy() {
return deploy; return deploy;
} }
/** /**
* Gets the value of the powerOn property. * Flag to deploy and power on the VApp after successful creation.
*/ */
public Boolean isPowerOn() { public Boolean isPowerOn() {
return powerOn; return powerOn;

View File

@ -575,7 +575,7 @@ public interface VAppAsyncClient {
@Consumes @Consumes
@JAXBResponseParser @JAXBResponseParser
@ExceptionParser(ReturnNullOnNotFoundOr404.class) @ExceptionParser(ReturnNullOnNotFoundOr404.class)
ListenableFuture<ResourceAllocationSettingData> getVirtualHardwareSectionCpu(@EndpointParam URI vAppURI); ListenableFuture<ResourceAllocationSettingData> getVirtualHardwareSectionCpu(@EndpointParam URI vmURI);
/** /**
* @see VAppClient#modifyVirtualHardwareSectionCpu(URI, ResourceAllocationSettingData) * @see VAppClient#modifyVirtualHardwareSectionCpu(URI, ResourceAllocationSettingData)
@ -585,7 +585,7 @@ public interface VAppAsyncClient {
@Produces(OVF_RASD_ITEM) @Produces(OVF_RASD_ITEM)
@Consumes(TASK) @Consumes(TASK)
@JAXBResponseParser @JAXBResponseParser
ListenableFuture<Task> modifyVirtualHardwareSectionCpu(@EndpointParam URI vAppURI, ListenableFuture<Task> modifyVirtualHardwareSectionCpu(@EndpointParam URI vmURI,
@BinderParam(BindToXMLPayload.class) ResourceAllocationSettingData rasd); @BinderParam(BindToXMLPayload.class) ResourceAllocationSettingData rasd);
/** /**
@ -596,7 +596,7 @@ public interface VAppAsyncClient {
@Consumes @Consumes
@JAXBResponseParser @JAXBResponseParser
@ExceptionParser(ReturnNullOnNotFoundOr404.class) @ExceptionParser(ReturnNullOnNotFoundOr404.class)
ListenableFuture<RasdItemsList> getVirtualHardwareSectionDisks(@EndpointParam URI vAppURI); ListenableFuture<RasdItemsList> getVirtualHardwareSectionDisks(@EndpointParam URI vmURI);
/** /**
* @see VAppClient#modifyVirtualHardwareSectionDisks(URI, RasdItemsList) * @see VAppClient#modifyVirtualHardwareSectionDisks(URI, RasdItemsList)
@ -606,7 +606,7 @@ public interface VAppAsyncClient {
@Produces(OVF_RASD_ITEMS_LIST) @Produces(OVF_RASD_ITEMS_LIST)
@Consumes(TASK) @Consumes(TASK)
@JAXBResponseParser @JAXBResponseParser
ListenableFuture<Task> modifyVirtualHardwareSectionDisks(@EndpointParam URI vAppURI, ListenableFuture<Task> modifyVirtualHardwareSectionDisks(@EndpointParam URI vmURI,
@BinderParam(BindToXMLPayload.class) RasdItemsList rasdItemsList); @BinderParam(BindToXMLPayload.class) RasdItemsList rasdItemsList);
/** /**
@ -617,7 +617,7 @@ public interface VAppAsyncClient {
@Consumes @Consumes
@JAXBResponseParser @JAXBResponseParser
@ExceptionParser(ReturnNullOnNotFoundOr404.class) @ExceptionParser(ReturnNullOnNotFoundOr404.class)
ListenableFuture<RasdItemsList> getVirtualHardwareSectionMedia(@EndpointParam URI vAppURI); ListenableFuture<RasdItemsList> getVirtualHardwareSectionMedia(@EndpointParam URI vmURI);
/** /**
* @see VAppClient#getVirtualHardwareSectionMemory(URI) * @see VAppClient#getVirtualHardwareSectionMemory(URI)
@ -627,7 +627,7 @@ public interface VAppAsyncClient {
@Consumes @Consumes
@JAXBResponseParser @JAXBResponseParser
@ExceptionParser(ReturnNullOnNotFoundOr404.class) @ExceptionParser(ReturnNullOnNotFoundOr404.class)
ListenableFuture<ResourceAllocationSettingData> getVirtualHardwareSectionMemory(@EndpointParam URI vAppURI); ListenableFuture<ResourceAllocationSettingData> getVirtualHardwareSectionMemory(@EndpointParam URI vmURI);
/** /**
* @see VAppClient#modifyVirtualHardwareSectionMemory(URI, ResourceAllocationSettingData) * @see VAppClient#modifyVirtualHardwareSectionMemory(URI, ResourceAllocationSettingData)
@ -637,7 +637,7 @@ public interface VAppAsyncClient {
@Produces(OVF_RASD_ITEM) @Produces(OVF_RASD_ITEM)
@Consumes(TASK) @Consumes(TASK)
@JAXBResponseParser @JAXBResponseParser
ListenableFuture<Task> modifyVirtualHardwareSectionMemory(@EndpointParam URI vAppURI, ListenableFuture<Task> modifyVirtualHardwareSectionMemory(@EndpointParam URI vmURI,
@BinderParam(BindToXMLPayload.class) ResourceAllocationSettingData rasd); @BinderParam(BindToXMLPayload.class) ResourceAllocationSettingData rasd);
/** /**
@ -648,7 +648,7 @@ public interface VAppAsyncClient {
@Consumes @Consumes
@JAXBResponseParser @JAXBResponseParser
@ExceptionParser(ReturnNullOnNotFoundOr404.class) @ExceptionParser(ReturnNullOnNotFoundOr404.class)
ListenableFuture<RasdItemsList> getVirtualHardwareSectionNetworkCards(@EndpointParam URI vAppURI); ListenableFuture<RasdItemsList> getVirtualHardwareSectionNetworkCards(@EndpointParam URI vmURI);
/** /**
* @see VAppClient#modifyVirtualHardwareSectionNetworkCards(URI, RasdItemsList) * @see VAppClient#modifyVirtualHardwareSectionNetworkCards(URI, RasdItemsList)
@ -658,7 +658,7 @@ public interface VAppAsyncClient {
@Produces(OVF_RASD_ITEMS_LIST) @Produces(OVF_RASD_ITEMS_LIST)
@Consumes(TASK) @Consumes(TASK)
@JAXBResponseParser @JAXBResponseParser
ListenableFuture<Task> modifyVirtualHardwareSectionNetworkCards(@EndpointParam URI vAppURI, ListenableFuture<Task> modifyVirtualHardwareSectionNetworkCards(@EndpointParam URI vmURI,
@BinderParam(BindToXMLPayload.class) RasdItemsList rasdItemsList); @BinderParam(BindToXMLPayload.class) RasdItemsList rasdItemsList);
/** /**
@ -669,7 +669,7 @@ public interface VAppAsyncClient {
@Consumes @Consumes
@JAXBResponseParser @JAXBResponseParser
@ExceptionParser(ReturnNullOnNotFoundOr404.class) @ExceptionParser(ReturnNullOnNotFoundOr404.class)
ListenableFuture<RasdItemsList> getVirtualHardwareSectionSerialPorts(@EndpointParam URI vAppURI); ListenableFuture<RasdItemsList> getVirtualHardwareSectionSerialPorts(@EndpointParam URI vmURI);
/** /**
* @see VAppClient#modifyVirtualHardwareSectionSerialPorts(URI, RasdItemsList) * @see VAppClient#modifyVirtualHardwareSectionSerialPorts(URI, RasdItemsList)
@ -679,7 +679,7 @@ public interface VAppAsyncClient {
@Produces(OVF_RASD_ITEMS_LIST) @Produces(OVF_RASD_ITEMS_LIST)
@Consumes(TASK) @Consumes(TASK)
@JAXBResponseParser @JAXBResponseParser
ListenableFuture<Task> modifyVirtualHardwareSectionSerialPorts(@EndpointParam URI vAppURI, ListenableFuture<Task> modifyVirtualHardwareSectionSerialPorts(@EndpointParam URI vmURI,
@BinderParam(BindToXMLPayload.class) RasdItemsList rasdItemsList); @BinderParam(BindToXMLPayload.class) RasdItemsList rasdItemsList);
/** /**

View File

@ -674,7 +674,7 @@ public interface VAppClient {
* *
* @since 0.9 * @since 0.9
*/ */
ResourceAllocationSettingData getVirtualHardwareSectionCpu(URI vAppURI); ResourceAllocationSettingData getVirtualHardwareSectionCpu(URI vmURI);
/** /**
* Modifies the CPU properties in virtual hardware section of a VM. * Modifies the CPU properties in virtual hardware section of a VM.
@ -685,7 +685,7 @@ public interface VAppClient {
* *
* @since 0.9 * @since 0.9
*/ */
Task modifyVirtualHardwareSectionCpu(URI vAppURI, ResourceAllocationSettingData rasd); Task modifyVirtualHardwareSectionCpu(URI vmURI, ResourceAllocationSettingData rasd);
/** /**
* Retrieves a list of ResourceAllocationSettingData items for disks from virtual hardware section of a VM. * Retrieves a list of ResourceAllocationSettingData items for disks from virtual hardware section of a VM.
@ -696,7 +696,7 @@ public interface VAppClient {
* *
* @since 0.9 * @since 0.9
*/ */
RasdItemsList getVirtualHardwareSectionDisks(URI vAppURI); RasdItemsList getVirtualHardwareSectionDisks(URI vmURI);
/** /**
* Modifies the disks list in virtual hardware section of a VM. * Modifies the disks list in virtual hardware section of a VM.
@ -707,7 +707,7 @@ public interface VAppClient {
* *
* @since 0.9 * @since 0.9
*/ */
Task modifyVirtualHardwareSectionDisks(URI vAppURI, RasdItemsList rasdItemsList); Task modifyVirtualHardwareSectionDisks(URI vmURI, RasdItemsList rasdItemsList);
/** /**
* Retrieves the list of ResourceAllocationSettingData items that represents the floppies and CD/DVD drives in a VM. * Retrieves the list of ResourceAllocationSettingData items that represents the floppies and CD/DVD drives in a VM.
@ -718,7 +718,7 @@ public interface VAppClient {
* *
* @since 0.9 * @since 0.9
*/ */
RasdItemsList getVirtualHardwareSectionMedia(URI vAppURI); RasdItemsList getVirtualHardwareSectionMedia(URI vmURI);
/** /**
* Retrieves the ResourceAllocationSettingData item that contains memory information from virtual hardware section of a VM. * Retrieves the ResourceAllocationSettingData item that contains memory information from virtual hardware section of a VM.
@ -729,7 +729,7 @@ public interface VAppClient {
* *
* @since 0.9 * @since 0.9
*/ */
ResourceAllocationSettingData getVirtualHardwareSectionMemory(URI vAppURI); ResourceAllocationSettingData getVirtualHardwareSectionMemory(URI vmURI);
/** /**
* Modifies the memory properties in virtual hardware section of a VM. * Modifies the memory properties in virtual hardware section of a VM.
@ -740,7 +740,7 @@ public interface VAppClient {
* *
* @since 0.9 * @since 0.9
*/ */
Task modifyVirtualHardwareSectionMemory(URI vAppURI, ResourceAllocationSettingData rasd); Task modifyVirtualHardwareSectionMemory(URI vmURI, ResourceAllocationSettingData rasd);
/** /**
* Retrieves a list of ResourceAllocationSettingData items for network cards from virtual hardware section of a VM. * Retrieves a list of ResourceAllocationSettingData items for network cards from virtual hardware section of a VM.
@ -751,7 +751,7 @@ public interface VAppClient {
* *
* @since 0.9 * @since 0.9
*/ */
RasdItemsList getVirtualHardwareSectionNetworkCards(URI vAppURI); RasdItemsList getVirtualHardwareSectionNetworkCards(URI vmURI);
/** /**
* Modifies the network cards list in virtual hardware section of a VM. * Modifies the network cards list in virtual hardware section of a VM.
@ -762,7 +762,7 @@ public interface VAppClient {
* *
* @since 0.9 * @since 0.9
*/ */
Task modifyVirtualHardwareSectionNetworkCards(URI vAppURI, RasdItemsList rasdItemsList); Task modifyVirtualHardwareSectionNetworkCards(URI vmURI, RasdItemsList rasdItemsList);
/** /**
* Retrieves a list of ResourceAllocationSettingData items for serial ports from virtual hardware section of a VM. * Retrieves a list of ResourceAllocationSettingData items for serial ports from virtual hardware section of a VM.
@ -773,7 +773,7 @@ public interface VAppClient {
* *
* @since 1.5 * @since 1.5
*/ */
RasdItemsList getVirtualHardwareSectionSerialPorts(URI vAppURI); RasdItemsList getVirtualHardwareSectionSerialPorts(URI vmURI);
/** /**
* Modifies the serial ports list in virtual hardware section of a VM. * Modifies the serial ports list in virtual hardware section of a VM.
@ -784,7 +784,7 @@ public interface VAppClient {
* *
* @since 1.5 * @since 1.5
*/ */
Task modifyVirtualHardwareSectionSerialPorts(URI vAppURI, RasdItemsList rasdItemsList); Task modifyVirtualHardwareSectionSerialPorts(URI vmURI, RasdItemsList rasdItemsList);
/** /**
* @return synchronous access to {@link Metadata} features * @return synchronous access to {@link Metadata} features

View File

@ -40,7 +40,7 @@ import org.jclouds.vcloud.director.v1_5.domain.CloneMediaParams;
import org.jclouds.vcloud.director.v1_5.domain.CloneVAppParams; import org.jclouds.vcloud.director.v1_5.domain.CloneVAppParams;
import org.jclouds.vcloud.director.v1_5.domain.CloneVAppTemplateParams; import org.jclouds.vcloud.director.v1_5.domain.CloneVAppTemplateParams;
import org.jclouds.vcloud.director.v1_5.domain.ComposeVAppParams; import org.jclouds.vcloud.director.v1_5.domain.ComposeVAppParams;
import org.jclouds.vcloud.director.v1_5.domain.InstantiateVAppParamsType; import org.jclouds.vcloud.director.v1_5.domain.InstantiateVAppParams;
import org.jclouds.vcloud.director.v1_5.domain.Media; import org.jclouds.vcloud.director.v1_5.domain.Media;
import org.jclouds.vcloud.director.v1_5.domain.UploadVAppTemplateParams; import org.jclouds.vcloud.director.v1_5.domain.UploadVAppTemplateParams;
import org.jclouds.vcloud.director.v1_5.domain.VApp; import org.jclouds.vcloud.director.v1_5.domain.VApp;
@ -130,7 +130,7 @@ public interface VdcAsyncClient {
@Produces(VCloudDirectorMediaType.INSTANTIATE_VAPP_TEMPLATE_PARAMS) @Produces(VCloudDirectorMediaType.INSTANTIATE_VAPP_TEMPLATE_PARAMS)
@JAXBResponseParser @JAXBResponseParser
ListenableFuture<VApp> instantiateVApp(@EndpointParam URI vdcURI, ListenableFuture<VApp> instantiateVApp(@EndpointParam URI vdcURI,
@BinderParam(BindToXMLPayload.class) InstantiateVAppParamsType params); @BinderParam(BindToXMLPayload.class) InstantiateVAppParams params);
/** /**
* @see VdcClient#uploadVAppTemplate(URI, UploadVAppTemplateParams) * @see VdcClient#uploadVAppTemplate(URI, UploadVAppTemplateParams)

View File

@ -28,7 +28,7 @@ import org.jclouds.vcloud.director.v1_5.domain.CloneMediaParams;
import org.jclouds.vcloud.director.v1_5.domain.CloneVAppParams; import org.jclouds.vcloud.director.v1_5.domain.CloneVAppParams;
import org.jclouds.vcloud.director.v1_5.domain.CloneVAppTemplateParams; import org.jclouds.vcloud.director.v1_5.domain.CloneVAppTemplateParams;
import org.jclouds.vcloud.director.v1_5.domain.ComposeVAppParams; import org.jclouds.vcloud.director.v1_5.domain.ComposeVAppParams;
import org.jclouds.vcloud.director.v1_5.domain.InstantiateVAppParamsType; import org.jclouds.vcloud.director.v1_5.domain.InstantiateVAppParams;
import org.jclouds.vcloud.director.v1_5.domain.Media; import org.jclouds.vcloud.director.v1_5.domain.Media;
import org.jclouds.vcloud.director.v1_5.domain.UploadVAppTemplateParams; import org.jclouds.vcloud.director.v1_5.domain.UploadVAppTemplateParams;
import org.jclouds.vcloud.director.v1_5.domain.VApp; import org.jclouds.vcloud.director.v1_5.domain.VApp;
@ -144,7 +144,7 @@ public interface VdcClient {
* @return a VApp resource which will contain a task. The user should should wait for this task to finish to be able * @return a VApp resource which will contain a task. The user should should wait for this task to finish to be able
* to use the vApp. * to use the vApp.
*/ */
VApp instantiateVApp(URI vdcUri, InstantiateVAppParamsType params); VApp instantiateVApp(URI vdcUri, InstantiateVAppParams params);
/** /**
* Uploading vApp template to a vDC. * Uploading vApp template to a vDC.

View File

@ -0,0 +1,155 @@
/*
* 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.predicates;
import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import org.jclouds.vcloud.director.v1_5.domain.EntityType;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
/**
* Predicates for working with {@link EntityType} collections.
*
* @author grkvlt@apache.org
*/
public class EntityPredicates {
/**
* Matches {@link EntityType entities} with the given name.
*
* @param T type of the entity, for example {@link Vm}
* @param name value of the name attribute of the entity
* @return predicate that will match entities of the given name
*/
public static <T extends EntityType> Predicate<T> nameEquals(final String name) {
checkNotNull(name, "name must be defined");
return new Predicate<T>() {
@Override
public boolean apply(T entity) {
return name.equals(entity.getName());
}
@Override
public String toString() {
return "nameEquals(" + name + ")";
}
};
}
/**
* Matches {@link EntityType entities} with names starting with the given prefix.
*
* @param T type of the entity, for example {@link Vm}
* @param name prefix of the name attribute of the entity
* @return predicate that will match entities with names starting with the given prefix
*/
public static <T extends EntityType> Predicate<T> nameStartsWith(final String prefix) {
checkNotNull(prefix, "prefix must be defined");
return new Predicate<T>() {
@Override
public boolean apply(T entity) {
String name = entity.getName();
return name != null && name.startsWith(prefix);
}
@Override
public String toString() {
return "nameStartsWith(" + prefix + ")";
}
};
}
/**
* Matches {@link EntityType entities} with names in the given collection.
*
* @param T type of the entity, for example {@link Vm}
* @param names collection of values for the name attribute of the entity
* @return predicate that will match entities with names starting with the given prefix
*/
public static <T extends EntityType> Predicate<T> nameIn(final Iterable<String> names) {
checkNotNull(names, "names must be defined");
return new Predicate<T>() {
@Override
public boolean apply(T entity) {
String name = entity.getName();
return Iterables.contains(names, name);
}
@Override
public String toString() {
return "nameIn(" + Iterables.toString(names) + ")";
}
};
}
/**
* Matches {@link EntityType entities} of the given type.
*
* @param T type of the entity, for example {@link Vm}
* @param type the media type string of the entity, for example {@link VCloudDirectorMediaType#CATALOG}
* @return predicate that will match entities of the given type
* @see VCloudDirectorMediaType
*/
public static <T extends EntityType> Predicate<T> typeEquals(final String type) {
checkNotNull(type, "type must be defined");
return new Predicate<T>() {
@Override
public boolean apply(T entity) {
return type.equals(entity.getType());
}
@Override
public String toString() {
return "typeEquals(" + type + ")";
}
};
}
/**
* Matches {@link EntityType entities} with the given {@link URI}.
*
* @param T type of the entity, for example {@link Vm}
* @param href the URI of the entity
* @return predicate that will match entities with the given URI
* @see VCloudDirectorMediaType
*/
public static <T extends EntityType> Predicate<T> hrefEquals(final URI href) {
checkNotNull(href, "href must be defined");
return new Predicate<T>() {
@Override
public boolean apply(T entity) {
return href.equals(entity.getHref());
}
@Override
public String toString() {
return "hrefEquals(" + href.toASCIIString() + ")";
}
};
}
}

View File

@ -20,7 +20,8 @@ package org.jclouds.vcloud.director.v1_5.predicates;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; import java.net.URI;
import org.jclouds.vcloud.director.v1_5.domain.Reference; import org.jclouds.vcloud.director.v1_5.domain.Reference;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
@ -127,4 +128,28 @@ public class ReferencePredicates {
} }
}; };
} }
/**
* Matches {@link Reference}s with the given {@link URI}.
*
* @param T type of the reference, for example {@link Link}
* @param href the URI of the reference
* @return predicate that will match references with the given URI
* @see VCloudDirectorMediaType
*/
public static <T extends Reference> Predicate<T> hrefEquals(final URI href) {
checkNotNull(href, "href must be defined");
return new Predicate<T>() {
@Override
public boolean apply(T reference) {
return href.equals(reference.getHref());
}
@Override
public String toString() {
return "hrefEquals(" + href.toASCIIString() + ")";
}
};
}
} }