
com.proofpoint.jmx.JmxHttpModule Maven / Gradle / Ivy
/*
* Copyright 2010 Proofpoint, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.proofpoint.jmx;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.google.common.annotations.Beta;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.inject.Binder;
import com.google.inject.Inject;
import com.google.inject.Module;
import com.google.inject.Provider;
import com.proofpoint.configuration.Config;
import com.proofpoint.discovery.client.announce.ServiceAnnouncement;
import com.proofpoint.discovery.client.announce.ServiceAnnouncement.ServiceAnnouncementBuilder;
import com.proofpoint.http.server.HttpServerInfo;
import sun.management.LazyCompositeData;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeData;
import javax.management.openmbean.OpenType;
import javax.management.openmbean.TabularData;
import java.io.IOException;
import java.lang.reflect.Type;
import java.net.InetAddress;
import java.net.URI;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static com.google.inject.Scopes.SINGLETON;
import static com.proofpoint.configuration.ConfigurationModule.bindConfig;
import static com.proofpoint.discovery.client.DiscoveryBinder.discoveryBinder;
import static com.proofpoint.discovery.client.announce.ServiceAnnouncement.serviceAnnouncement;
import static com.proofpoint.jaxrs.JaxrsBinder.jaxrsBinder;
import static com.proofpoint.json.JsonBinder.jsonBinder;
@Beta
public class JmxHttpModule implements Module
{
@Override
public void configure(Binder binder)
{
binder.disableCircularProxies();
jaxrsBinder(binder).bindAdmin(MBeanResource.class);
jsonBinder(binder).addSerializerBinding(InetAddress.class).toInstance(ToStringSerializer.instance);
jsonBinder(binder).addSerializerBinding(ObjectName.class).toInstance(ToStringSerializer.instance);
jsonBinder(binder).addSerializerBinding(OpenType.class).toInstance(ToStringSerializer.instance);
jsonBinder(binder).addSerializerBinding(CompositeData.class).to(CompositeDataSerializer.class);
jsonBinder(binder).addSerializerBinding(TabularData.class).to(TabularDataSerializer.class);
jsonBinder(binder).addDeserializerBinding(ObjectName.class).to(ObjectNameDeserializer.class);
// jackson has a bug in the serializer selection code so it does not know that subclasses of LazyCompositeData are also CompositeData
jsonBinder(binder).addSerializerBinding(LazyCompositeData.class).to(CompositeDataSerializer.class);
jaxrsBinder(binder).bindAdmin(ConfigurationResource.class);
jaxrsBinder(binder).bindAdmin(StopAnnouncingResource.class);
bindConfig(binder).to(AdminServerConfig.class);
binder.bind(AdminServerCredentialVerifier.class).in(SINGLETON);
ServiceAnnouncementBuilder serviceAnnouncementBuilder = serviceAnnouncement("jmx-http");
discoveryBinder(binder).bindServiceAnnouncement(new JmxHttpAnnouncementProvider(serviceAnnouncementBuilder));
}
static class ObjectNameDeserializer
extends StdScalarDeserializer
{
ObjectNameDeserializer()
{
super(ObjectName.class);
}
@Override
public ObjectName deserialize(JsonParser jsonParser, DeserializationContext context)
throws IOException
{
JsonToken token = jsonParser.getCurrentToken();
if (token == JsonToken.VALUE_STRING) {
try {
return ObjectName.getInstance(jsonParser.getText());
}
catch (MalformedObjectNameException e) {
throw context.instantiationException(handledType(), e);
}
}
throw context.mappingException(handledType());
}
}
static class TabularDataSerializer
extends StdSerializer
{
TabularDataSerializer()
{
super(TabularData.class, true);
}
@Override
public void serialize(TabularData data, JsonGenerator jsonGenerator, SerializerProvider provider)
throws IOException
{
jsonGenerator.writeStartArray();
JsonSerializer
© 2015 - 2025 Weber Informatics LLC | Privacy Policy