Skip to content

Commit 6cfe38b

Browse files
committed
regression to jackson in order to support extensions
1 parent e79e62f commit 6cfe38b

File tree

14 files changed

+121
-24
lines changed

14 files changed

+121
-24
lines changed

etc/openstack.admin.properties

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ auth.password=secret0
66
auth.tenant.name=admin
77

88

9-
identity.endpoint.publicURL=http://192.168.1.52:5000/v2.0
10-
identity.endpoint.internalURL=http://192.168.1.52:5000/v2.0
11-
identity.endpoint.adminURL=http://192.168.1.52:35357/v2.0
9+
identity.endpoint.publicURL=http://192.168.1.41:5000/v2.0
10+
identity.endpoint.internalURL=http://192.168.1.41:5000/v2.0
11+
identity.endpoint.adminURL=http://192.168.1.41:35357/v2.0
1212
identity.admin.token=secret0

etc/openstack.public.properties

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ auth.password=secret0
66
auth.tenant.name=demo
77

88

9-
identity.endpoint.publicURL=http://192.168.1.52:5000/v2.0
10-
identity.endpoint.internalURL=http://192.168.1.52:5000/v2.0
11-
identity.endpoint.adminURL=http://192.168.1.52:35357/v2.0
9+
identity.endpoint.publicURL=http://192.168.1.41:5000/v2.0
10+
identity.endpoint.internalURL=http://192.168.1.41:5000/v2.0
11+
identity.endpoint.adminURL=http://192.168.1.41:35357/v2.0
1212
identity.admin.token=secret0
1313

1414
test.glance=true

pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,11 @@
8787
<artifactId>gson</artifactId>
8888
<version>2.1</version>
8989
</dependency>
90+
<dependency>
91+
<groupId>org.glassfish.jersey.media</groupId>
92+
<artifactId>jersey-media-json</artifactId>
93+
<version>2.0-m02</version>
94+
</dependency>
9095
</dependencies>
9196

9297
<build>

src/main/java/org/openstack/api/common/RestClient.java

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,17 @@
55
import javax.xml.bind.JAXBContext;
66
import javax.xml.bind.JAXBException;
77

8+
import org.codehaus.jackson.map.AnnotationIntrospector;
9+
import org.codehaus.jackson.map.DeserializationConfig;
10+
import org.codehaus.jackson.map.ObjectMapper;
11+
import org.codehaus.jackson.map.SerializationConfig;
12+
import org.codehaus.jackson.map.annotate.JsonRootName;
13+
import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
14+
import org.codehaus.jackson.map.introspect.JacksonAnnotationIntrospector;
815
import org.glassfish.jersey.client.JerseyClient;
916
import org.glassfish.jersey.client.JerseyClientFactory;
10-
import org.openstack.api.identity.JaxbContextResolver;
17+
import org.glassfish.jersey.media.json.JsonFeature;
18+
import org.openstack.model.common.JsonRootElement;
1119

1220
public enum RestClient {
1321

@@ -21,11 +29,15 @@ private RestClient() {
2129

2230
client = (JerseyClient) JerseyClientFactory.newClient();
2331

32+
client.configuration().enable(new JsonFeature());
33+
34+
client.configuration().register(OpenStackObjectMapperProvider.class);
35+
2436
//client.configuration().enable(JsonFeature.getInstance());
2537

26-
client.configuration().register(GsonProvider.class);
38+
//client.configuration().register(GsonProvider.class);
2739

28-
client.configuration().register(JaxbContextResolver.class);
40+
//client.configuration().register(JaxbContextResolver.class);
2941

3042
//client.configuration().register(ObjectMapperProvider.class);
3143

@@ -67,5 +79,28 @@ public JAXBContext getContext(Class<?> type) {
6779
}
6880

6981
}
82+
83+
public static final class OpenStackObjectMapperProvider implements ContextResolver<ObjectMapper> {
84+
85+
private final ObjectMapper objectMapper;
86+
87+
public OpenStackObjectMapperProvider() {
88+
System.out.println("Configure JSON");
89+
objectMapper = new ObjectMapper();
90+
objectMapper.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, true);
91+
objectMapper.configure(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE, true);
92+
AnnotationIntrospector introspector = new JacksonAnnotationIntrospector();
93+
objectMapper.setDeserializationConfig(objectMapper.getDeserializationConfig().withAnnotationIntrospector(introspector));
94+
objectMapper.setSerializationConfig(objectMapper.getSerializationConfig().withSerializationInclusion(Inclusion.NON_NULL).withAnnotationIntrospector(introspector));
95+
}
96+
97+
@Override
98+
public ObjectMapper getContext(Class<?> type) {
99+
JsonRootName jsonRootName = type.getAnnotation(JsonRootName.class);
100+
objectMapper.configure(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE, jsonRootName != null);
101+
return objectMapper;
102+
}
103+
104+
}
70105

71106
}

src/main/java/org/openstack/model/compute/Image.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.openstack.model.compute;
22

33
import java.util.List;
4+
import java.util.Map;
45

56
import org.openstack.model.atom.Link;
67

@@ -20,7 +21,7 @@ public interface Image {
2021

2122
int getProgress();
2223

23-
Metadata getMetadata();
24+
Map<String, String> getMetadata();
2425

2526
List<Link> getLinks();
2627

src/main/java/org/openstack/model/compute/nova/NovaFlavor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import javax.xml.bind.annotation.XmlRootElement;
1313
import javax.xml.namespace.QName;
1414

15+
import org.codehaus.jackson.map.annotate.JsonRootName;
1516
import org.openstack.model.atom.Link;
1617
import org.openstack.model.common.JsonRootElement;
1718
import org.openstack.model.compute.Flavor;
@@ -23,6 +24,7 @@
2324
@XmlRootElement(name="flavor")
2425
@XmlAccessorType(XmlAccessType.NONE)
2526
@JsonRootElement("flavor")
27+
@JsonRootName("flavor")
2628
public class NovaFlavor implements Serializable, Flavor {
2729

2830
@XmlAttribute

src/main/java/org/openstack/model/compute/nova/NovaImage.java

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,27 @@
22

33
import java.io.Serializable;
44
import java.util.List;
5+
import java.util.Map;
56

67
import javax.xml.bind.annotation.XmlAccessType;
78
import javax.xml.bind.annotation.XmlAccessorType;
89
import javax.xml.bind.annotation.XmlAttribute;
910
import javax.xml.bind.annotation.XmlElement;
1011
import javax.xml.bind.annotation.XmlRootElement;
1112

13+
import org.codehaus.jackson.annotate.JsonProperty;
14+
import org.codehaus.jackson.map.annotate.JsonRootName;
1215
import org.openstack.model.atom.Link;
1316
import org.openstack.model.common.JsonRootElement;
1417
import org.openstack.model.compute.Image;
15-
import org.openstack.model.compute.Metadata;
1618

1719
import com.google.common.base.Predicate;
1820
import com.google.common.collect.Iterables;
1921

2022
@XmlRootElement(name="image")
2123
@XmlAccessorType(XmlAccessType.NONE)
2224
@JsonRootElement("image")
25+
@JsonRootName("image")
2326
public class NovaImage implements Serializable, Image {
2427

2528
@XmlAttribute
@@ -31,7 +34,6 @@ public class NovaImage implements Serializable, Image {
3134
@XmlAttribute
3235
private String status;
3336

34-
3537
//2011-12-26T02:09:15Z
3638
@XmlAttribute
3739
private String updated;
@@ -42,11 +44,14 @@ public class NovaImage implements Serializable, Image {
4244
@XmlAttribute
4345
private int minDisk;
4446

47+
@XmlAttribute
48+
private int minRam;
49+
4550
@XmlAttribute
4651
private int progress;
4752

4853
@XmlElement
49-
private NovaMetadata metadata;
54+
private Map<String, String> metadata;
5055

5156
//RAX-DCF="http://docs.rackspacecloud.com/servers/api/ext/diskConfig/v1.0"
5257

@@ -134,6 +139,14 @@ public void setMinDisk(int minDisk) {
134139
this.minDisk = minDisk;
135140
}
136141

142+
public int getMinRam() {
143+
return minRam;
144+
}
145+
146+
public void setMinRam(int minRam) {
147+
this.minRam = minRam;
148+
}
149+
137150
/* (non-Javadoc)
138151
* @see org.openstack.model.compute.Image#getProgress()
139152
*/
@@ -146,15 +159,11 @@ public void setProgress(int progress) {
146159
this.progress = progress;
147160
}
148161

149-
/* (non-Javadoc)
150-
* @see org.openstack.model.compute.Image#getMetadata()
151-
*/
152-
@Override
153-
public Metadata getMetadata() {
162+
public Map<String, String> getMetadata() {
154163
return metadata;
155164
}
156165

157-
public void setMetadata(NovaMetadata metadata) {
166+
public void setMetadata(Map<String, String> metadata) {
158167
this.metadata = metadata;
159168
}
160169

src/main/java/org/openstack/model/compute/nova/NovaServer.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.io.Serializable;
44
import java.util.Date;
5+
import java.util.HashMap;
56
import java.util.List;
67
import java.util.Map;
78

@@ -13,6 +14,9 @@
1314
import javax.xml.bind.annotation.XmlRootElement;
1415
import javax.xml.namespace.QName;
1516

17+
import org.codehaus.jackson.annotate.JsonAnyGetter;
18+
import org.codehaus.jackson.annotate.JsonAnySetter;
19+
import org.codehaus.jackson.map.annotate.JsonDeserialize;
1620
import org.openstack.model.atom.Link;
1721
import org.openstack.model.common.JsonRootElement;
1822
import org.openstack.model.compute.Fault;
@@ -79,7 +83,8 @@ public class NovaServer implements Serializable, Server {
7983
private String keyName;
8084

8185
@XmlElement(name = "image")
82-
private NovaImage image;
86+
@JsonDeserialize(as=NovaImage.class)
87+
private Image image;
8388

8489
@XmlElement(name = "flavor")
8590
private NovaFlavor flavor;
@@ -92,6 +97,18 @@ public class NovaServer implements Serializable, Server {
9297

9398
@XmlElement(name = "addresses")
9499
private Map<String, List<Network.Ip>> addresses;
100+
101+
private Map<String, String> extensions = new HashMap<String, String>();
102+
103+
@JsonAnyGetter
104+
public Map<String, String> getExtensions() {
105+
return extensions;
106+
}
107+
108+
@JsonAnySetter
109+
public void put(String key, String value) {
110+
extensions.put(key, value);
111+
}
95112

96113
@XmlElement(name = "link", namespace = "http://www.w3.org/2005/Atom")
97114
private List<Link> links;

src/main/java/org/openstack/model/compute/nova/NovaServerList.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import javax.xml.bind.annotation.XmlElement;
1212
import javax.xml.bind.annotation.XmlRootElement;
1313

14+
import org.codehaus.jackson.annotate.JsonProperty;
15+
import org.codehaus.jackson.map.annotate.JsonRootName;
1416
import org.openstack.model.common.JsonRootElement;
1517
import org.openstack.model.compute.Server;
1618
import org.openstack.model.compute.ServerList;
@@ -24,6 +26,7 @@ public class NovaServerList implements Serializable, ServerList {
2426

2527
@XmlElement(name = "server")
2628
@SerializedName("servers")
29+
@JsonProperty("servers")
2730
private List<NovaServer> list;
2831

2932
public NovaServerList() {

src/main/java/org/openstack/model/identity/keystone/KeystoneAccess.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
import javax.xml.bind.annotation.XmlRootElement;
1313
import javax.xml.bind.annotation.XmlType;
1414

15+
import org.codehaus.jackson.annotate.JsonProperty;
16+
import org.codehaus.jackson.map.annotate.JsonDeserialize;
17+
import org.codehaus.jackson.map.annotate.JsonRootName;
1518
import org.openstack.api.Namespaces;
1619
import org.openstack.model.common.JsonRootElement;
1720
import org.openstack.model.exceptions.OpenstackException;
@@ -28,6 +31,7 @@
2831
@XmlRootElement(name = "access")
2932
@XmlAccessorType(XmlAccessType.NONE)
3033
@JsonRootElement("access")
34+
@JsonRootName("access")
3135
public class KeystoneAccess implements Serializable, Access {
3236

3337
@XmlElement(type = KeystoneToken.class)
@@ -36,6 +40,8 @@ public class KeystoneAccess implements Serializable, Access {
3640
@XmlElementWrapper(name = "serviceCatalog")
3741
@XmlElement(name = "service", type = KeystoneService.class)
3842
@SerializedName("serviceCatalog")
43+
@JsonProperty("serviceCatalog")
44+
@JsonDeserialize(as=List.class, contentAs=KeystoneServiceCatalogEntry.class)
3945
private List<KeystoneServiceCatalogEntry> services = new ArrayList<KeystoneServiceCatalogEntry>();
4046

4147
@XmlElement(type = KeystoneUser.class)
@@ -57,10 +63,11 @@ public void setToken(KeystoneToken token) {
5763
* @see org.openstack.model.identity.glance.Access#getServices()
5864
*/
5965
@Override
66+
6067
public List<ServiceCatalogEntry> getServices() {
6168
return (List<ServiceCatalogEntry>) (List<?>) services;
6269
}
63-
70+
6471
public void setServices(List<KeystoneServiceCatalogEntry> services) {
6572
this.services = services;
6673
}

0 commit comments

Comments
 (0)