cxf-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Sergey Beryozkin <sberyoz...@gmail.com>
Subject Re: git commit: [CXF-5661]add more JMX operations for ManagedEndpoint mbean
Date Wed, 02 Apr 2014 08:50:06 GMT
Hi Freeman

IMHO the right thing to do right now is to revert the commit because 
Jackson dependencies in the core is only part of the problem, with other 
side-effects introduced into the ws and rs runtimes.

And then discuss how this can be done correctly on the dev list:
- consider moving ManagedEndpoint to rt/management...
- or how to decorate it and other pieces of the code non-intrusively, etc

Cheers, Sergey


On 02/04/14 07:38, Freeman Fang wrote:
> Hi Dan,
>
> Thanks for the feedback.
> My comment inline
> -------------
> Freeman(Yue) Fang
>
> Red Hat, Inc.
> FuseSource is now part of Red Hat
>
>
>
> On 2014-4-1, at 下午7:47, Daniel Kulp wrote:
>
>>
>> I’m -1 to this commit.   It needs to be reverted.
>>
>> Reasons:
>> 1) osgi should definitely not be compile scope.   It needs to stay provided.
> Sure, I will fix it
>>
>> 2) All of the jackson stuff should NOT be a dependency for core.   NOTHING in core should need it.
>>
>> 3) The new “JMX” operations only work for the JAXB data binding, which is ALSO not in core.
> For JAXWS endpoint,  it's true
> But for JAXRS endpoint, getJSONSchemaForClass method not only work for JAXB data binding, it just get json schema for a given resource class.
>
> As Sergey suggested, how about move ManagedEndpoint into rt/management module? Or keep ManagedEndpoint  as is, just add a new ManagedComponent in rt/management module and put the new "JMX" operations in so that we introduce the jackson dependency for rt/management but not for core?
>
> Thanks
>>
>>
>> Use the utilities we already have for grabbing the Schema from the service model and operate directly on the schema.   You should NOT be doing anything with the individual part classes and such.  That will not work for the other data bindings, provider based services, etc….
>>
>>
>> Dan
>>
>>
>>
>> On Apr 1, 2014, at 4:29 AM, ffang@apache.org wrote:
>>
>>> Repository: cxf
>>> Updated Branches:
>>> refs/heads/2.7.x-fixes 8811c9977 -> 87b4f1a50
>>>
>>>
>>> [CXF-5661]add more JMX operations for ManagedEndpoint mbean
>>>
>>>
>>> Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
>>> Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/87b4f1a5
>>> Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/87b4f1a5
>>> Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/87b4f1a5
>>>
>>> Branch: refs/heads/2.7.x-fixes
>>> Commit: 87b4f1a50da2197ecf7065b1a09a78a2d48d92cc
>>> Parents: 8811c99
>>> Author: Freeman Fang <freeman.fang@gmail.com>
>>> Authored: Tue Apr 1 16:28:24 2014 +0800
>>> Committer: Freeman Fang <freeman.fang@gmail.com>
>>> Committed: Tue Apr 1 16:28:24 2014 +0800
>>>
>>> ----------------------------------------------------------------------
>>> api/pom.xml                                     |  35 ++
>>> .../BeanValidationAnnotationIntrospector.java   | 110 ++++
>>> .../BeanValidationAnnotationModule.java         |  40 ++
>>> .../cxf/endpoint/FourSpacePrettyPrinter.java    |  78 +++
>>> ...IgnorePropertiesBackedByTransientFields.java | 241 +++++++++
>>> .../apache/cxf/endpoint/JsonSchemaLookup.java   |  99 ++++
>>> .../apache/cxf/endpoint/ManagedEndpoint.java    | 524 +++++++++++++++++++
>>> parent/pom.xml                                  |  30 +-
>>> .../cxf/jaxrs/AbstractJAXRSFactoryBean.java     |   5 +
>>> .../cxf/jaxrs/swagger/SwaggerFeature.java       |  17 +
>>> systests/jaxrs/pom.xml                          |  21 +
>>> .../systest/jaxrs/RestJsonSchemaJMXTest.java    | 162 ++++++
>>> .../org/apache/cxf/systest/jaxrs/jmx-enable.xml |  16 +
>>> systests/jaxws/pom.xml                          |  21 +-
>>> .../cxf/systest/jaxws/JsonSchemaJMXTest.java    | 146 ++++++
>>> .../org/apache/cxf/systest/jaxws/jmx-enable.xml |  28 +
>>> 16 files changed, 1570 insertions(+), 3 deletions(-)
>>> ----------------------------------------------------------------------
>>>
>>>
>>> http://git-wip-us.apache.org/repos/asf/cxf/blob/87b4f1a5/api/pom.xml
>>> ----------------------------------------------------------------------
>>> diff --git a/api/pom.xml b/api/pom.xml
>>> index 41eb88f..e29f070 100644
>>> --- a/api/pom.xml
>>> +++ b/api/pom.xml
>>> @@ -163,6 +163,41 @@
>>>             <groupId>org.osgi</groupId>
>>>             <artifactId>org.osgi.core</artifactId>
>>>         </dependency>
>>> +        <dependency>
>>> +            <groupId>org.osgi</groupId>
>>> +            <artifactId>org.osgi.compendium</artifactId>
>>> +            <scope>compile</scope>
>>> +        </dependency>
>>> +
>>> +        <dependency>
>>> +            <groupId>com.fasterxml.jackson.module</groupId>
>>> +            <artifactId>jackson-module-jaxb-annotations</artifactId>
>>> +            <optional>true</optional>
>>> +        </dependency>
>>> +
>>> +        <dependency>
>>> +            <groupId>com.fasterxml.jackson.core</groupId>
>>> +            <artifactId>jackson-databind</artifactId>
>>> +            <optional>true</optional>
>>> +        </dependency>
>>> +
>>> +        <dependency>
>>> +            <groupId>com.fasterxml.jackson.core</groupId>
>>> +            <artifactId>jackson-annotations</artifactId>
>>> +            <optional>true</optional>
>>> +        </dependency>
>>> +
>>> +        <dependency>
>>> +            <groupId>com.fasterxml.jackson.core</groupId>
>>> +            <artifactId>jackson-core</artifactId>
>>> +            <optional>true</optional>
>>> +        </dependency>
>>> +
>>> +        <dependency>
>>> +            <groupId>javax.validation</groupId>
>>> +            <artifactId>validation-api</artifactId>
>>> +            <optional>true</optional>
>>> +        </dependency>
>>>     </dependencies>
>>>
>>>     <build>
>>>
>>> http://git-wip-us.apache.org/repos/asf/cxf/blob/87b4f1a5/api/src/main/java/org/apache/cxf/endpoint/BeanValidationAnnotationIntrospector.java
>>> ----------------------------------------------------------------------
>>> diff --git a/api/src/main/java/org/apache/cxf/endpoint/BeanValidationAnnotationIntrospector.java b/api/src/main/java/org/apache/cxf/endpoint/BeanValidationAnnotationIntrospector.java
>>> new file mode 100644
>>> index 0000000..936c039
>>> --- /dev/null
>>> +++ b/api/src/main/java/org/apache/cxf/endpoint/BeanValidationAnnotationIntrospector.java
>>> @@ -0,0 +1,110 @@
>>> +/**
>>> + * Licensed to the Apache Software Foundation (ASF) under one
>>> + * or more contributor license agreements. See the NOTICE file
>>> + * distributed with this work for additional information
>>> + * regarding copyright ownership. The ASF 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.apache.cxf.endpoint;
>>> +
>>> +
>>> +import java.beans.Introspector;
>>> +import java.lang.reflect.Field;
>>> +import java.lang.reflect.Member;
>>> +import java.lang.reflect.Modifier;
>>> +import java.util.logging.Level;
>>> +import java.util.logging.Logger;
>>> +
>>> +import javax.validation.constraints.NotNull;
>>> +
>>> +import com.fasterxml.jackson.core.Version;
>>> +import com.fasterxml.jackson.databind.AnnotationIntrospector;
>>> +import com.fasterxml.jackson.databind.introspect.AnnotatedMember;
>>> +import com.fasterxml.jackson.databind.introspect.AnnotatedMethod;
>>> +import com.fasterxml.jackson.databind.type.TypeFactory;
>>> +
>>> +import org.apache.cxf.common.logging.LogUtils;
>>> +
>>> +
>>> +public class BeanValidationAnnotationIntrospector extends AnnotationIntrospector {
>>> +    private static final transient Logger LOG = LogUtils.getL7dLogger(BeanValidationAnnotationIntrospector.class);
>>> +
>>> +    protected final TypeFactory typeFactory;
>>> +
>>> +    public BeanValidationAnnotationIntrospector(TypeFactory typeFactory) {
>>> +        this.typeFactory = (typeFactory == null) ? TypeFactory.defaultInstance() : typeFactory;
>>> +    }
>>> +
>>> +
>>> +    @Override
>>> +    public Version version() {
>>> +        return new Version(1, 1, 0, "", "cxf", "json-schema-mbean");
>>> +    }
>>> +
>>> +
>>> +    @Override
>>> +    public boolean hasIgnoreMarker(AnnotatedMember m) {
>>> +        Member member = m.getMember();
>>> +        int modifiers = member.getModifiers();
>>> +        if (Modifier.isTransient(modifiers)) {
>>> +            if (LOG.isLoggable(Level.FINE)) {
>>> +                LOG.fine("Ignoring transient member " + m);
>>> +            }
>>> +            return true;
>>> +        } else if (m instanceof AnnotatedMethod) {
>>> +            AnnotatedMethod method = (AnnotatedMethod) m;
>>> +            String methodName = method.getName();
>>> +            // lets see if there is a transient field of the same name as the getter
>>> +            if (methodName.startsWith("get") && method.getParameterCount() == 0) {
>>> +                String fieldName = Introspector.decapitalize(methodName.substring(3));
>>> +                Class<?> declaringClass = method.getDeclaringClass();
>>> +                Field field = findField(fieldName, declaringClass);
>>> +                if (field != null) {
>>> +                    int fieldModifiers = field.getModifiers();
>>> +                    if (Modifier.isTransient(fieldModifiers)) {
>>> +                        LOG.fine("Ignoring member " + m + " due to transient field called " + fieldName);
>>> +                        return true;
>>> +                    }
>>> +                }
>>> +            }
>>> +        }
>>> +        return super.hasIgnoreMarker(m);
>>> +
>>> +    }
>>> +
>>> +    protected static Field findField(String fieldName, Class<?> declaringClass) {
>>> +        try {
>>> +            return declaringClass.getDeclaredField(fieldName);
>>> +        } catch (NoSuchFieldException e) {
>>> +            Class<?> superclass = declaringClass.getSuperclass();
>>> +            if (superclass != null && superclass != declaringClass) {
>>> +                return findField(fieldName, superclass);
>>> +            } else {
>>> +                return null;
>>> +            }
>>> +        }
>>> +    }
>>> +
>>> +    @Override
>>> +    public Boolean hasRequiredMarker(AnnotatedMember m) {
>>> +        NotNull annotation = m.getAnnotation(NotNull.class);
>>> +        if (annotation == null) {
>>> +            return null;
>>> +        }
>>> +        return Boolean.TRUE;
>>> +    }
>>> +
>>> +
>>> +}
>>> +
>>>
>>> http://git-wip-us.apache.org/repos/asf/cxf/blob/87b4f1a5/api/src/main/java/org/apache/cxf/endpoint/BeanValidationAnnotationModule.java
>>> ----------------------------------------------------------------------
>>> diff --git a/api/src/main/java/org/apache/cxf/endpoint/BeanValidationAnnotationModule.java b/api/src/main/java/org/apache/cxf/endpoint/BeanValidationAnnotationModule.java
>>> new file mode 100644
>>> index 0000000..f737178
>>> --- /dev/null
>>> +++ b/api/src/main/java/org/apache/cxf/endpoint/BeanValidationAnnotationModule.java
>>> @@ -0,0 +1,40 @@
>>> +/**
>>> + * Licensed to the Apache Software Foundation (ASF) under one
>>> + * or more contributor license agreements. See the NOTICE file
>>> + * distributed with this work for additional information
>>> + * regarding copyright ownership. The ASF 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.apache.cxf.endpoint;
>>> +
>>> +
>>> +
>>> +import com.fasterxml.jackson.databind.module.SimpleModule;
>>> +
>>> +
>>> +public class BeanValidationAnnotationModule extends SimpleModule {
>>> +
>>> +    public BeanValidationAnnotationModule() {
>>> +        super("bean-validation-annotations");
>>> +    }
>>> +
>>> +    @Override
>>> +    public void setupModule(SetupContext context) {
>>> +        BeanValidationAnnotationIntrospector introspector =
>>> +            new BeanValidationAnnotationIntrospector(context.getTypeFactory());
>>> +
>>> +        context.insertAnnotationIntrospector(introspector);
>>> +    }
>>> +
>>> +}
>>>
>>> http://git-wip-us.apache.org/repos/asf/cxf/blob/87b4f1a5/api/src/main/java/org/apache/cxf/endpoint/FourSpacePrettyPrinter.java
>>> ----------------------------------------------------------------------
>>> diff --git a/api/src/main/java/org/apache/cxf/endpoint/FourSpacePrettyPrinter.java b/api/src/main/java/org/apache/cxf/endpoint/FourSpacePrettyPrinter.java
>>> new file mode 100644
>>> index 0000000..e8dc6d8
>>> --- /dev/null
>>> +++ b/api/src/main/java/org/apache/cxf/endpoint/FourSpacePrettyPrinter.java
>>> @@ -0,0 +1,78 @@
>>> +/**
>>> + * Licensed to the Apache Software Foundation (ASF) under one
>>> + * or more contributor license agreements. See the NOTICE file
>>> + * distributed with this work for additional information
>>> + * regarding copyright ownership. The ASF 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.apache.cxf.endpoint;
>>> +
>>> +import java.io.IOException;
>>> +import java.util.Arrays;
>>> +
>>> +import com.fasterxml.jackson.core.JsonGenerationException;
>>> +import com.fasterxml.jackson.core.JsonGenerator;
>>> +import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;
>>> +
>>> +public class FourSpacePrettyPrinter extends DefaultPrettyPrinter {
>>> +
>>> +    public FourSpacePrettyPrinter() {
>>> +        _objectIndenter = Lf4SpacesIndenter.INSTANCE;
>>> +    }
>>> +
>>> +    public static class Lf4SpacesIndenter extends NopIndenter {
>>> +        public static final Lf4SpacesIndenter INSTANCE = new Lf4SpacesIndenter();
>>> +
>>> +        private static final String SYS_LF;
>>> +
>>> +        private static int spacecount = 64;
>>> +        private static char[] spaces = new char[spacecount];
>>> +
>>> +        static {
>>> +            String lf = null;
>>> +            try {
>>> +                lf = System.getProperty("line.separator");
>>> +            } catch (Throwable t) {
>>> +                //
>>> +            }
>>> +            SYS_LF = (lf == null) ? "\n" : lf;
>>> +        }
>>> +
>>> +
>>> +        static {
>>> +            Arrays.fill(spaces, ' ');
>>> +        }
>>> +
>>> +
>>> +
>>> +        @Override
>>> +        public boolean isInline() {
>>> +            return false;
>>> +        }
>>> +
>>> +        @Override
>>> +        public void writeIndentation(JsonGenerator jg, int level) throws IOException, JsonGenerationException {
>>> +            jg.writeRaw(SYS_LF);
>>> +            if (level > 0) { // should we err on negative values (as there's some flaw?)
>>> +                level = level * 4; // 4 spaces per level
>>> +                while (level > spacecount) { // should never happen but...
>>> +                    jg.writeRaw(spaces, 0, spacecount);
>>> +                    level -= spaces.length;
>>> +                }
>>> +                jg.writeRaw(spaces, 0, level);
>>> +            }
>>> +        }
>>> +    }
>>> +
>>> +}
>>>
>>> http://git-wip-us.apache.org/repos/asf/cxf/blob/87b4f1a5/api/src/main/java/org/apache/cxf/endpoint/IgnorePropertiesBackedByTransientFields.java
>>> ----------------------------------------------------------------------
>>> diff --git a/api/src/main/java/org/apache/cxf/endpoint/IgnorePropertiesBackedByTransientFields.java b/api/src/main/java/org/apache/cxf/endpoint/IgnorePropertiesBackedByTransientFields.java
>>> new file mode 100644
>>> index 0000000..278cc37
>>> --- /dev/null
>>> +++ b/api/src/main/java/org/apache/cxf/endpoint/IgnorePropertiesBackedByTransientFields.java
>>> @@ -0,0 +1,241 @@
>>> +/**
>>> + * Licensed to the Apache Software Foundation (ASF) under one
>>> + * or more contributor license agreements. See the NOTICE file
>>> + * distributed with this work for additional information
>>> + * regarding copyright ownership. The ASF 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.apache.cxf.endpoint;
>>> +
>>> +
>>> +
>>> +import java.beans.Introspector;
>>> +import java.lang.reflect.Field;
>>> +import java.lang.reflect.Member;
>>> +import java.lang.reflect.Method;
>>> +import java.lang.reflect.Modifier;
>>> +import java.util.logging.Level;
>>> +import java.util.logging.Logger;
>>> +
>>> +import com.fasterxml.jackson.annotation.JsonAutoDetect;
>>> +import com.fasterxml.jackson.annotation.PropertyAccessor;
>>> +import com.fasterxml.jackson.databind.introspect.AnnotatedField;
>>> +import com.fasterxml.jackson.databind.introspect.AnnotatedMember;
>>> +import com.fasterxml.jackson.databind.introspect.AnnotatedMethod;
>>> +import com.fasterxml.jackson.databind.introspect.VisibilityChecker;
>>> +
>>> +import org.apache.cxf.common.logging.LogUtils;
>>> +
>>> +public class IgnorePropertiesBackedByTransientFields implements
>>> +    VisibilityChecker<IgnorePropertiesBackedByTransientFields> {
>>> +
>>> +    private static final transient Logger LOG = LogUtils.getL7dLogger(IgnorePropertiesBackedByTransientFields.class);
>>> +    private final VisibilityChecker<?> defaultChecker;
>>> +
>>> +    public IgnorePropertiesBackedByTransientFields(VisibilityChecker<?> defaultChecker) {
>>> +        this.defaultChecker = defaultChecker;
>>> +    }
>>> +
>>> +    @Override
>>> +    public boolean isGetterVisible(AnnotatedMethod method) {
>>> +        boolean answer = defaultChecker.isGetterVisible(method);
>>> +        if (answer) {
>>> +            answer = isGetterMethodWithFieldVisible(method, getGetterFieldName(
>>> +                     method.getName()), method.getDeclaringClass())
>>> +                     && isGetterMethodRetItselfVisible(method.getMember(), method.getDeclaringClass());
>>> +        }
>>> +        return answer;
>>> +    }
>>> +
>>> +    @Override
>>> +    public boolean isGetterVisible(Method method) {
>>> +        boolean answer = defaultChecker.isGetterVisible(method);
>>> +        if (answer) {
>>> +            answer = isGetterMethodWithFieldVisible(method, getGetterFieldName(
>>> +                     method.getName()), method.getDeclaringClass())
>>> +                     && isGetterMethodRetItselfVisible(method, method.getDeclaringClass());
>>> +        }
>>> +        return answer;
>>> +    }
>>> +
>>> +    @Override
>>> +    public boolean isIsGetterVisible(AnnotatedMethod method) {
>>> +        boolean answer = defaultChecker.isIsGetterVisible(method);
>>> +        if (answer) {
>>> +            answer = isGetterMethodWithFieldVisible(method, getIsGetterFieldName(
>>> +                     method.getName()), method.getDeclaringClass())
>>> +                     && isGetterMethodRetItselfVisible(method.getMember(), method.getDeclaringClass());
>>> +        }
>>> +        return answer;
>>> +    }
>>> +
>>> +    @Override
>>> +    public boolean isIsGetterVisible(Method method) {
>>> +        boolean answer = defaultChecker.isIsGetterVisible(method);
>>> +        if (answer) {
>>> +            answer = isGetterMethodWithFieldVisible(method, getIsGetterFieldName(
>>> +                     method.getName()), method.getDeclaringClass())
>>> +                     && isGetterMethodRetItselfVisible(method, method.getDeclaringClass());
>>> +        }
>>> +        return answer;
>>> +    }
>>> +
>>> +    protected String getIsGetterFieldName(String methodName) {
>>> +        return Introspector.decapitalize(methodName.substring(2));
>>> +    }
>>> +    protected String getGetterFieldName(String methodName) {
>>> +        return Introspector.decapitalize(methodName.substring(3));
>>> +    }
>>> +
>>> +    /**
>>> +     * Returns false if the getter method has a field of the same name which is transient
>>> +     * @return
>>> +     */
>>> +    protected boolean isGetterMethodWithFieldVisible(Object method,
>>> +                                                     String fieldName,
>>> +                                                     Class<?> declaringClass) {
>>> +        Field field = findField(fieldName, declaringClass);
>>> +        if (field != null) {
>>> +            int fieldModifiers = field.getModifiers();
>>> +            if (Modifier.isTransient(fieldModifiers)) {
>>> +                if (LOG.isLoggable(Level.FINE)) {
>>> +                    LOG.fine("Ignoring getter " + method + " due to transient field called "
>>> +                        + fieldName);
>>> +                }
>>> +                return false;
>>> +            }
>>> +        }
>>> +        return true;
>>> +    }
>>> +
>>> +
>>> +    /**
>>> +     * Returns false if the getter method just return the declaringClass itself to avoid the
>>> +     * recusive dead loop
>>> +     * @return
>>> +     */
>>> +    protected boolean isGetterMethodRetItselfVisible(Method method,
>>> +                                                     Class<?> declaringClass) {
>>> +        if (method != null && method.getReturnType().getName().equals(declaringClass.getName())) {
>>> +            if (LOG.isLoggable(Level.FINE)) {
>>> +                LOG.fine("Ignoring getter " + method + " due to return same type as declaringClass itself");
>>> +            }
>>> +            return false;
>>> +        }
>>> +        return true;
>>> +    }
>>> +
>>> +
>>> +    // Delegated methods
>>> +    //-------------------------------------------------------------------------
>>> +
>>> +    @Override
>>> +    public boolean isCreatorVisible(AnnotatedMember m) {
>>> +        return defaultChecker.isCreatorVisible(m);
>>> +    }
>>> +
>>> +    @Override
>>> +    public boolean isCreatorVisible(Member m) {
>>> +        return defaultChecker.isCreatorVisible(m);
>>> +    }
>>> +
>>> +    @Override
>>> +    public boolean isFieldVisible(AnnotatedField f) {
>>> +        return defaultChecker.isFieldVisible(f);
>>> +    }
>>> +
>>> +    @Override
>>> +    public boolean isFieldVisible(Field f) {
>>> +        return defaultChecker.isFieldVisible(f);
>>> +    }
>>> +    @Override
>>> +    public boolean isSetterVisible(AnnotatedMethod m) {
>>> +        return defaultChecker.isSetterVisible(m);
>>> +    }
>>> +
>>> +    @Override
>>> +    public boolean isSetterVisible(Method m) {
>>> +        return defaultChecker.isSetterVisible(m);
>>> +    }
>>> +
>>> +    @Override
>>> +    public IgnorePropertiesBackedByTransientFields with(JsonAutoDetect ann) {
>>> +        return castToPropertiesBackedByTransientFields(defaultChecker.with(ann));
>>> +    }
>>> +
>>> +    @Override
>>> +    public IgnorePropertiesBackedByTransientFields with(JsonAutoDetect.Visibility v) {
>>> +        return castToPropertiesBackedByTransientFields(defaultChecker.with(v));
>>> +    }
>>> +
>>> +    @Override
>>> +    public IgnorePropertiesBackedByTransientFields withCreatorVisibility(JsonAutoDetect.Visibility v) {
>>> +        return castToPropertiesBackedByTransientFields(defaultChecker.withCreatorVisibility(v));
>>> +    }
>>> +
>>> +    @Override
>>> +    public IgnorePropertiesBackedByTransientFields withFieldVisibility(JsonAutoDetect.Visibility v) {
>>> +        return castToPropertiesBackedByTransientFields(defaultChecker.withFieldVisibility(v));
>>> +    }
>>> +
>>> +    @Override
>>> +    public IgnorePropertiesBackedByTransientFields withGetterVisibility(JsonAutoDetect.Visibility v) {
>>> +        return castToPropertiesBackedByTransientFields(defaultChecker.withGetterVisibility(v));
>>> +    }
>>> +
>>> +    @Override
>>> +    public IgnorePropertiesBackedByTransientFields withIsGetterVisibility(JsonAutoDetect.Visibility v) {
>>> +        return castToPropertiesBackedByTransientFields(defaultChecker.withIsGetterVisibility(v));
>>> +    }
>>> +
>>> +    @Override
>>> +    public IgnorePropertiesBackedByTransientFields withSetterVisibility(JsonAutoDetect.Visibility v) {
>>> +        return castToPropertiesBackedByTransientFields(defaultChecker.withSetterVisibility(v));
>>> +    }
>>> +
>>> +    @Override
>>> +    public IgnorePropertiesBackedByTransientFields withVisibility(PropertyAccessor method,
>>> +                                                                  JsonAutoDetect.Visibility v) {
>>> +        return castToPropertiesBackedByTransientFields(defaultChecker.withVisibility(method, v));
>>> +    }
>>> +
>>> +
>>> +    protected IgnorePropertiesBackedByTransientFields castToPropertiesBackedByTransientFields(Object value) {
>>> +        if (value instanceof IgnorePropertiesBackedByTransientFields) {
>>> +            return (IgnorePropertiesBackedByTransientFields) value;
>>> +        } else {
>>> +            if (value != null) {
>>> +                if (value instanceof VisibilityChecker<?>) {
>>> +                    return new IgnorePropertiesBackedByTransientFields((VisibilityChecker<?>) value);
>>> +                }
>>> +                LOG.warning("Could not convert value to "
>>> +                            + "IgnorePropertiesBackedByTransientFields as was "
>>> +                            + value.getClass().getName() + " " + value);
>>> +            }
>>> +            return null;
>>> +        }
>>> +    }
>>> +    protected static Field findField(String fieldName, Class<?> declaringClass) {
>>> +        try {
>>> +            return declaringClass.getDeclaredField(fieldName);
>>> +        } catch (NoSuchFieldException e) {
>>> +            Class<?> superclass = declaringClass.getSuperclass();
>>> +            if (superclass != null && superclass != declaringClass) {
>>> +                return findField(fieldName, superclass);
>>> +            } else {
>>> +                return null;
>>> +            }
>>> +        }
>>> +    }
>>> +}
>>>
>>> http://git-wip-us.apache.org/repos/asf/cxf/blob/87b4f1a5/api/src/main/java/org/apache/cxf/endpoint/JsonSchemaLookup.java
>>> ----------------------------------------------------------------------
>>> diff --git a/api/src/main/java/org/apache/cxf/endpoint/JsonSchemaLookup.java b/api/src/main/java/org/apache/cxf/endpoint/JsonSchemaLookup.java
>>> new file mode 100644
>>> index 0000000..8316b24
>>> --- /dev/null
>>> +++ b/api/src/main/java/org/apache/cxf/endpoint/JsonSchemaLookup.java
>>> @@ -0,0 +1,99 @@
>>> +/**
>>> + * Licensed to the Apache Software Foundation (ASF) under one
>>> + * or more contributor license agreements. See the NOTICE file
>>> + * distributed with this work for additional information
>>> + * regarding copyright ownership. The ASF 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.apache.cxf.endpoint;
>>> +
>>> +
>>> +import java.util.logging.Level;
>>> +import java.util.logging.Logger;
>>> +
>>> +import com.fasterxml.jackson.databind.ObjectMapper;
>>> +import com.fasterxml.jackson.databind.ObjectWriter;
>>> +import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;
>>> +
>>> +import org.apache.cxf.common.logging.LogUtils;
>>> +
>>> +
>>> +
>>> +public class JsonSchemaLookup {
>>> +
>>> +    private static final Logger LOG = LogUtils.getL7dLogger(JsonSchemaLookup.class);
>>> +
>>> +    private static JsonSchemaLookup singleton;
>>> +
>>> +    private ObjectMapper mapper;
>>> +
>>> +    public JsonSchemaLookup() {
>>> +    }
>>> +
>>> +    public static JsonSchemaLookup getSingleton() {
>>> +        if (singleton == null) {
>>> +            // lazy create one
>>> +            new JsonSchemaLookup().init();
>>> +        }
>>> +        return singleton;
>>> +    }
>>> +
>>> +    public void init() {
>>> +        LOG.log(Level.INFO, "Creating JsonSchemaLookup instance");
>>> +        try {
>>> +            if (mapper == null) {
>>> +                mapper = new ObjectMapper();
>>> +
>>> +                mapper.setVisibilityChecker(new IgnorePropertiesBackedByTransientFields(mapper.getVisibilityChecker()));
>>> +
>>> +                JaxbAnnotationModule module1 = new JaxbAnnotationModule();
>>> +                mapper.registerModule(module1);
>>> +
>>> +                BeanValidationAnnotationModule module2 = new BeanValidationAnnotationModule();
>>> +                mapper.registerModule(module2);
>>> +
>>> +            }
>>> +            // now lets expose the mbean...
>>> +            singleton = this;
>>> +        } catch (Exception e) {
>>> +            LOG.log(Level.WARNING, "Exception during initialization: ", e);
>>> +            throw new RuntimeException(e);
>>> +        }
>>> +    }
>>> +
>>> +
>>> +
>>> +
>>> +
>>> +
>>> +    public String getSchemaForClass(Class<?> clazz) {
>>> +        LOG.info("Looking up schema for " + clazz.getCanonicalName());
>>> +        String name = clazz.getName();
>>> +        try {
>>> +            ObjectWriter writer = mapper.writer().with(new FourSpacePrettyPrinter());
>>> +            return writer.writeValueAsString(mapper.generateJsonSchema(clazz));
>>> +        } catch (Exception e) {
>>> +            LOG.log(Level.FINEST, "Failed to generate JSON schema for class " + name, e);
>>> +            return "";
>>> +        }
>>> +    }
>>> +
>>> +    public ObjectMapper getMapper() {
>>> +        return mapper;
>>> +    }
>>> +
>>> +    public void setMapper(ObjectMapper mapper) {
>>> +        this.mapper = mapper;
>>> +    }
>>> +}
>>>
>>> http://git-wip-us.apache.org/repos/asf/cxf/blob/87b4f1a5/api/src/main/java/org/apache/cxf/endpoint/ManagedEndpoint.java
>>> ----------------------------------------------------------------------
>>> diff --git a/api/src/main/java/org/apache/cxf/endpoint/ManagedEndpoint.java b/api/src/main/java/org/apache/cxf/endpoint/ManagedEndpoint.java
>>> index de53e8b..e034c2b 100644
>>> --- a/api/src/main/java/org/apache/cxf/endpoint/ManagedEndpoint.java
>>> +++ b/api/src/main/java/org/apache/cxf/endpoint/ManagedEndpoint.java
>>> @@ -19,16 +19,43 @@
>>>
>>> package org.apache.cxf.endpoint;
>>>
>>> +import java.io.BufferedReader;
>>> +import java.io.IOException;
>>> +import java.io.StringReader;
>>> +import java.io.StringWriter;
>>> +import java.util.Dictionary;
>>> +import java.util.HashSet;
>>> +import java.util.List;
>>> +import java.util.Set;
>>> +import java.util.logging.Level;
>>> +import java.util.logging.Logger;
>>> +
>>> import javax.management.JMException;
>>> import javax.management.ObjectName;
>>> +import javax.xml.bind.JAXBContext;
>>> +import javax.xml.bind.Marshaller;
>>> +
>>> +import com.fasterxml.jackson.databind.ObjectMapper;
>>>
>>> import org.apache.cxf.Bus;
>>> +import org.apache.cxf.common.logging.LogUtils;
>>> +import org.apache.cxf.common.util.PackageUtils;
>>> import org.apache.cxf.common.util.StringUtils;
>>> +import org.apache.cxf.feature.Feature;
>>> import org.apache.cxf.management.ManagedComponent;
>>> import org.apache.cxf.management.ManagementConstants;
>>> import org.apache.cxf.management.annotation.ManagedAttribute;
>>> import org.apache.cxf.management.annotation.ManagedOperation;
>>> import org.apache.cxf.management.annotation.ManagedResource;
>>> +import org.apache.cxf.service.model.BindingInfo;
>>> +import org.apache.cxf.service.model.BindingOperationInfo;
>>> +import org.apache.cxf.service.model.MessagePartInfo;
>>> +import org.apache.cxf.service.model.ServiceInfo;
>>> +import org.osgi.framework.BundleContext;
>>> +import org.osgi.framework.FrameworkUtil;
>>> +import org.osgi.framework.ServiceReference;
>>> +import org.osgi.service.cm.Configuration;
>>> +import org.osgi.service.cm.ConfigurationAdmin;
>>>
>>> @ManagedResource(componentName = "Endpoint",
>>>                  description = "Responsible for managing server instances.")
>>> @@ -36,6 +63,10 @@ import org.apache.cxf.management.annotation.ManagedResource;
>>> public class ManagedEndpoint implements ManagedComponent, ServerLifeCycleListener {
>>>     public static final String ENDPOINT_NAME = "managed.endpoint.name";
>>>     public static final String SERVICE_NAME = "managed.service.name";
>>> +    public static final String INDENTION = "    ";
>>> +    private static final Logger LOG = LogUtils.getL7dLogger(ManagedEndpoint.class);
>>> +
>>> +    private final String eol = System.getProperty("line.separator");
>>>
>>>     private Bus bus;
>>>     private Endpoint endpoint;
>>> @@ -43,6 +74,8 @@ public class ManagedEndpoint implements ManagedComponent, ServerLifeCycleListene
>>>     private enum State { CREATED, STARTED, STOPPED };
>>>     private State state = State.CREATED;
>>>
>>> +    private ConfigurationAdmin configurationAdmin;
>>> +
>>>     public ManagedEndpoint(Bus b, Endpoint ep, Server s) {
>>>         bus = b;
>>>         endpoint = ep;
>>> @@ -85,6 +118,497 @@ public class ManagedEndpoint implements ManagedComponent, ServerLifeCycleListene
>>>     public String getState() {
>>>         return state.toString();
>>>     }
>>> +
>>> +    @ManagedAttribute(description = "The cxf servlet context", currencyTimeLimit = 60)
>>> +    public String getServletContext() {
>>> +        if (!isInOSGi()) {
>>> +            LOG.log(Level.FINE, "Not In OSGi.");
>>> +            return null; //not in OSGi container
>>> +        }
>>> +        String ret = "/cxf"; //if can't get it from configAdmin use the default value
>>> +        if (getConfigurationAdmin() != null) {
>>> +            try {
>>> +                Configuration configuration = getConfigurationAdmin().getConfiguration("org.apache.cxf.osgi");
>>> +                if (configuration != null) {
>>> +                    Dictionary properties = configuration.getProperties();
>>> +                    if (properties != null) {
>>> +                        String servletContext = (String)configuration.getProperties().
>>> +                            get("org.apache.cxf.servlet.context");
>>> +                        if (servletContext != null) {
>>> +                            ret = servletContext;
>>> +                        }
>>> +                    }
>>> +                }
>>> +            } catch (IOException e) {
>>> +                LOG.log(Level.WARNING, "getServletContext failed.", e);
>>> +            }
>>> +        }
>>> +        return ret;
>>> +    }
>>> +
>>> +    @ManagedAttribute(description = "if the endpoint has swagger doc or not", currencyTimeLimit = 60)
>>> +    public boolean isSwagger() {
>>> +        if (!isWADL()) {
>>> +            return false;
>>> +        }
>>> +        List<Feature> features = server.getEndpoint().getActiveFeatures();
>>> +        if (features != null) {
>>> +            for (Feature feature : features) {
>>> +                if (feature.getClass().getName().endsWith("SwaggerFeature")) {
>>> +                    return true;
>>> +                }
>>> +            }
>>> +        }
>>> +        return false;
>>> +    }
>>> +
>>> +    @ManagedAttribute(description = "if the endpoint has wsdl doc or not", currencyTimeLimit = 60)
>>> +    public boolean isWSDL() {
>>> +        return !isWADL();
>>> +    }
>>> +
>>> +    @ManagedAttribute(description = "if the endpoint has WADL doc or not", currencyTimeLimit = 60)
>>> +    public boolean isWADL() {
>>> +        if (endpoint.getEndpointInfo().getBinding().
>>> +            getBindingId().equals("http://apache.org/cxf/binding/jaxrs")) {
>>> +            return true;
>>> +        }
>>> +        return false;
>>> +    }
>>> +
>>> +    @ManagedOperation(description = "get the JSON schema from a given endpoint", currencyTimeLimit = 60)
>>> +    public String getJSONSchema() {
>>> +        String ret = "";
>>> +        if (!isWSDL()) {
>>> +            Set<Class<?>> resourceTypes = (Set<Class<?>>)endpoint.get("jaxrs.resource.types");
>>> +            if (resourceTypes != null) {
>>> +                try {
>>> +                    ret = ret + getBeginIndentionWithReturn(1) + "\""
>>> +                        + "definitions" + "\" " + " : {"
>>> +                        + getEol();
>>> +                    for (Class<?> cls : resourceTypes) {
>>> +                        if (JsonSchemaLookup.getSingleton()
>>> +                            .getSchemaForClass(cls).length() > 0) {
>>> +                            ret = ret + getIndention(2) + "\"" + cls.getName() + "\" : "
>>> +                                + getEol();
>>> +
>>> +                            ret = ret
>>> +                                + rollbackEol(reformatIndent(JsonSchemaLookup.getSingleton()
>>> +                                                 .getSchemaForClass(cls), 3)) + "," + getEol();
>>> +                        }
>>> +
>>> +                    }
>>> +                    ret = rollbackColon(rollbackEol(ret)) + getEndIndentionWithReturn(1);
>>> +                    ret = ret + getEndIndentionWithReturn(0);
>>> +                } catch (Throwable e) {
>>> +                    LOG.log(Level.WARNING, "getJSONSchema failed.", e);
>>> +                }
>>> +            }
>>> +        } else {
>>> +            try {
>>> +                for (ServiceInfo serviceInfo : endpoint.getService().getServiceInfos()) {
>>> +                    for (BindingInfo bindingInfo : serviceInfo.getBindings()) {
>>> +                        ret = ret + getBeginIndentionWithReturn(1) + "\"operations\" : "
>>> +                            + getBeginIndentionWithReturn(0);
>>> +                        for (BindingOperationInfo boi : bindingInfo.getOperations()) {
>>> +                            ret = ret  + getIndention(2) + "\""
>>> +                                  + boi.getOperationInfo().getName().getLocalPart() + "\" " + " : "
>>> +                                  + getBeginIndentionWithReturn(3);
>>> +                            if (boi.getInput() != null && boi.getInput().getMessageParts() != null) {
>>> +                                ret = ret + "\"input\" : " + getBeginIndentionWithReturn(4) + "\"type\" : \""
>>> +                                      + boi.getOperationInfo().getInput().getName().getLocalPart() + "\""
>>> +                                      + getEndIndentionWithReturn(3) + "," + getEol();
>>> +
>>> +                            }
>>> +                            if (boi.getOutput() != null && boi.getOutput().getMessageParts() != null) {
>>> +                                ret = ret + getIndention(3) + "\"output\" : "
>>> +                                      + getBeginIndentionWithReturn(4) + "\"type\" : \""
>>> +                                      + boi.getOperationInfo().getOutput().getName().getLocalPart() + "\""
>>> +                                      + getEndIndentionWithReturn(3);
>>> +                            }
>>> +                            ret = rollbackColon(rollbackEol(ret)) + getEndIndentionWithReturn(2) + "," + getEol();
>>> +                        }
>>> +                        if (ret.length() > 0) {
>>> +                            ret = rollbackColon(rollbackEol(ret)) + getEndIndentionWithReturn(1) + ",";
>>> +                        }
>>> +                        Set<String> addedType = new HashSet<String>();
>>> +
>>> +                        ret = ret + getEol() + getIndention(1) + "\"definitions\" : "
>>> +                            + getBeginIndentionWithReturn(0);
>>> +                        for (BindingOperationInfo boi : bindingInfo.getOperations()) {
>>> +
>>> +                            if (boi.getInput() != null && boi.getInput().getMessageParts() != null
>>> +                                && !addedType.contains(boi.getOperationInfo().getInput().getName().getLocalPart())) {
>>> +
>>> +                                ret = ret + getIndention(2) + "\""
>>> +                                      + boi.getOperationInfo().getInput().getName().getLocalPart() + "\" : "
>>> +                                      + getBeginIndentionWithReturnForList(0);
>>> +                                for (MessagePartInfo mpi : boi.getInput().getMessageParts()) {
>>> +                                    Class<?> partClass = mpi.getTypeClass();
>>> +                                    if (partClass != null) {
>>> +                                        ret = ret
>>> +                                              + rollbackEol(reformatIndent(JsonSchemaLookup.getSingleton()
>>> +                                                  .getSchemaForClass(partClass), 3)) + "," + getEol();
>>> +                                    }
>>> +                                }
>>> +                                ret = rollbackColon(rollbackEol(ret)) + getEndIndentionWithReturnForList(2)
>>> +                                      + "," + getEol();
>>> +                                addedType.add(boi.getOperationInfo().getInput().getName().getLocalPart());
>>> +
>>> +                            }
>>> +                            if (boi.getOutput() != null && boi.getOutput().getMessageParts() != null
>>> +                                && !addedType.contains(boi.getOperationInfo().getOutput().getName().getLocalPart())) {
>>> +
>>> +                                ret = ret + getIndention(2) + "\""
>>> +                                      + boi.getOperationInfo().getOutput().getName().getLocalPart()
>>> +                                      + "\" : " + getBeginIndentionWithReturnForList(0);
>>> +
>>> +                                for (MessagePartInfo mpi : boi.getOutput().getMessageParts()) {
>>> +                                    Class<?> partClass = mpi.getTypeClass();
>>> +                                    if (partClass != null) {
>>> +                                        ret = ret
>>> +                                              + rollbackEol(reformatIndent(JsonSchemaLookup.getSingleton()
>>> +                                                  .getSchemaForClass(partClass), 3)) + "," + getEol();
>>> +                                    }
>>> +                                }
>>> +                                ret = rollbackColon(rollbackEol(ret)) + getEndIndentionWithReturnForList(2)
>>> +                                      + "," + getEol();
>>> +                                addedType.add(boi.getOperationInfo().getOutput().getName().getLocalPart());
>>> +
>>> +                            }
>>> +                        }
>>> +                        if (ret.length() > 0) {
>>> +                            ret = rollbackColon(rollbackEol(ret)) + getEndIndentionWithReturn(1);
>>> +                        }
>>> +
>>> +                        if (ret.length() > 0) {
>>> +                            ret = rollbackColon(ret) + getEndIndentionWithReturn(0);
>>> +                        }
>>> +                    }
>>> +                }
>>> +
>>> +            } catch (Throwable e) {
>>> +                LOG.log(Level.WARNING, "getJSONSchema failed.", e);
>>> +            }
>>> +        }
>>> +        return ret;
>>> +    }
>>> +
>>> +    @ManagedOperation(description = "get the JSON schema from a given class", currencyTimeLimit = 60)
>>> +    public String getJSONSchemaForClass(String clsName) {
>>> +        String ret = "";
>>> +        if (!isWSDL()) {
>>> +            Set<Class<?>> resourceTypes = (Set<Class<?>>)endpoint.get("jaxrs.resource.types");
>>> +            if (resourceTypes != null) {
>>> +                try {
>>> +                    ret = ret + getBeginIndentionWithReturn(1) + "\""
>>> +                        + "definitions" + "\" " + " : {"
>>> +                        + getEol();
>>> +                    for (Class<?> cls : resourceTypes) {
>>> +                        if (cls.getName().endsWith(clsName)
>>> +                            && JsonSchemaLookup.getSingleton().getSchemaForClass(cls).length() > 0) {
>>> +                            ret = ret + getIndention(2) + "\"" + cls.getName() + "\" : "
>>> +                                  + getEol();
>>> +
>>> +                            ret = ret
>>> +                                  + reformatIndent(JsonSchemaLookup.getSingleton().getSchemaForClass(cls), 3);
>>> +                            ret = ret + getEol();
>>> +                        }
>>> +                    }
>>> +                    ret = ret + getEndIndentionWithReturn(1);
>>> +                    ret = ret + getEndIndentionWithReturn(0);
>>> +                } catch (Throwable e) {
>>> +                    LOG.log(Level.WARNING, "getJSONSchemaForClass failed.", e);
>>> +                }
>>> +            }
>>> +        } else {
>>> +
>>> +            for (ServiceInfo serviceInfo : endpoint.getService().getServiceInfos()) {
>>> +                for (BindingInfo bindingInfo : serviceInfo.getBindings()) {
>>> +                    ret = ret + getBeginIndentionWithReturn(1) + "\""
>>> +                        + "definitions" + "\" " + " : {"
>>> +                        + getEol();
>>> +                    for (BindingOperationInfo boi : bindingInfo.getOperations()) {
>>> +
>>> +                        if (boi.getInput() != null && boi.getInput().getMessageParts() != null) {
>>> +                            for (MessagePartInfo mpi : boi.getInput().getMessageParts()) {
>>> +                                Class<?> partClass = mpi.getTypeClass();
>>> +                                if (partClass != null && partClass.getName().endsWith(clsName)) {
>>> +                                    ret = ret + getIndention(2) + "\"" + partClass.getName() + "\" : "
>>> +                                        + getEol();
>>> +
>>> +                                    ret = ret
>>> +                                        + reformatIndent(JsonSchemaLookup.getSingleton()
>>> +                                                             .getSchemaForClass(partClass), 3);
>>> +                                }
>>> +                            }
>>> +
>>> +                        }
>>> +                        if (boi.getOutput() != null && boi.getOutput().getMessageParts() != null) {
>>> +                            for (MessagePartInfo mpi : boi.getOutput().getMessageParts()) {
>>> +                                Class<?> partClass = mpi.getTypeClass();
>>> +                                if (partClass != null && partClass.getName().endsWith(clsName)) {
>>> +                                    ret = ret + getIndention(2) + "\"" + partClass.getName() + "\" : "
>>> +                                        + getEol();
>>> +
>>> +                                    ret = ret
>>> +                                        + reformatIndent(JsonSchemaLookup.getSingleton()
>>> +                                                             .getSchemaForClass(partClass), 3);
>>> +                                }
>>> +                            }
>>> +                        }
>>> +                    }
>>> +                    ret = ret + getEndIndentionWithReturn(1);
>>> +                    ret = ret + getEndIndentionWithReturn(0);
>>> +                }
>>> +            }
>>> +
>>> +        }
>>> +        return ret;
>>> +    }
>>> +
>>> +    @ManagedOperation(description = "get the JSON schema from a given soap endpoint for a given operation",
>>> +                        currencyTimeLimit = 60)
>>> +    public String getJSONSchemaForOperation(String operationName) {
>>> +        if (!isWSDL()) {
>>> +            return null;
>>> +        }
>>> +        String ret = "";
>>> +
>>> +        for (ServiceInfo serviceInfo : endpoint.getService().getServiceInfos()) {
>>> +            for (BindingInfo bindingInfo : serviceInfo.getBindings()) {
>>> +                for (BindingOperationInfo boi : bindingInfo.getOperations()) {
>>> +                    if (operationName.equals(boi.getOperationInfo().getName().getLocalPart())) {
>>> +                        ret = ret + getBeginIndentionWithReturn(1) + "\""
>>> +                              + boi.getOperationInfo().getName().getLocalPart() + "\" " + " : "
>>> +                              + getBeginIndentionWithReturn(2);
>>> +                        if (boi.getInput() != null && boi.getInput().getMessageParts() != null) {
>>> +                            ret = ret + "\"input\" : " + getBeginIndentionWithReturn(4) + "\"type\" : \""
>>> +                                  + boi.getOperationInfo().getInput().getName().getLocalPart() + "\""
>>> +                                  + getEndIndentionWithReturn(2) + "," + getEol();
>>> +
>>> +                        }
>>> +                        if (boi.getOutput() != null && boi.getOutput().getMessageParts() != null) {
>>> +                            ret = ret + getIndention(2) + "\"output\" : " + getBeginIndentionWithReturn(4)
>>> +                                  + "\"type\" : \"" + boi.getOperationInfo().getOutput().getName().getLocalPart() + "\""
>>> +                                  + getEndIndentionWithReturn(2);
>>> +                        }
>>> +                        ret = rollbackColon(ret) + getEndIndentionWithReturn(1) + ",";
>>> +
>>> +                        ret = ret + getEol() + getIndention(1) + "\"definitions\" : "
>>> +                              + getBeginIndentionWithReturn(2);
>>> +                        if (boi.getInput() != null && boi.getInput().getMessageParts() != null) {
>>> +                            ret = ret + "\"" + boi.getOperationInfo().getInput().getName().getLocalPart() + "\" : "
>>> +                                  + getBeginIndentionWithReturnForList(0);
>>> +                            for (MessagePartInfo mpi : boi.getInput().getMessageParts()) {
>>> +                                Class<?> partClass = mpi.getTypeClass();
>>> +                                if (partClass != null) {
>>> +                                    ret = ret
>>> +                                          + rollbackEol(reformatIndent(JsonSchemaLookup.getSingleton()
>>> +                                                               .getSchemaForClass(partClass), 3)) + "," + getEol();
>>> +                                }
>>> +                            }
>>> +                            ret = rollbackColon(rollbackEol(ret)) + getEndIndentionWithReturnForList(2)
>>> +                                      + "," + getEol();
>>> +                        }
>>> +                        if (boi.getOutput() != null && boi.getOutput().getMessageParts() != null) {
>>> +                            ret = ret + getIndention(2) + "\""
>>> +                                  + boi.getOperationInfo().getOutput().getName().getLocalPart()
>>> +                                  + "\" : " + getBeginIndentionWithReturnForList(0);
>>> +
>>> +                            for (MessagePartInfo mpi : boi.getOutput().getMessageParts()) {
>>> +                                Class<?> partClass = mpi.getTypeClass();
>>> +                                if (partClass != null) {
>>> +                                    ret = ret
>>> +                                          + rollbackEol(reformatIndent(JsonSchemaLookup.getSingleton()
>>> +                                                               .getSchemaForClass(partClass), 3)) + "," + getEol();
>>> +                                }
>>> +                            }
>>> +                            ret = rollbackColon(rollbackEol(ret)) + getEndIndentionWithReturnForList(2) + ",";
>>> +                        }
>>> +
>>> +                    }
>>> +
>>> +                }
>>> +                if (ret.length() > 0) {
>>> +                    ret = rollbackColon(ret) + getEndIndentionWithReturn(1);
>>> +                }
>>> +
>>> +                if (ret.length() > 0) {
>>> +                    ret = rollbackColon(ret) + getEndIndentionWithReturn(0);
>>> +                }
>>> +            }
>>> +        }
>>> +        return ret;
>>> +    }
>>> +
>>> +    @ManagedOperation(description = "get the package name for a given namespace URI", currencyTimeLimit = 60)
>>> +    public String getPackageNameByNameSpaceURI(String nameSpaceURI) {
>>> +        return PackageUtils.getPackageNameByNameSpaceURI(nameSpaceURI);
>>> +    }
>>> +
>>> +    @ManagedOperation(description = "get xml payload from json payload", currencyTimeLimit = 60)
>>> +    public String jsonToXml(String jsonText, String pojoType) {
>>> +        ObjectMapper objectMapper = new ObjectMapper();
>>> +        StringWriter sw = new StringWriter();
>>> +        try {
>>> +            Object pojo = objectMapper.readValue(jsonText, findClass(pojoType));
>>> +            JAXBContext jc = JAXBContext.newInstance(findClass(pojoType));
>>> +            Marshaller marshaller = jc.createMarshaller();
>>> +            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
>>> +            marshaller.marshal(pojo, sw);
>>> +        } catch (Exception e) {
>>> +            LOG.log(Level.WARNING, "jsonToXml failed.", e);
>>> +        }
>>> +
>>> +        return sw.toString();
>>> +    }
>>> +
>>> +    private Class<?> findClass(String clsName) {
>>> +        if (!isWSDL()) {
>>> +            Set<Class<?>> resourceTypes = (Set<Class<?>>)endpoint.get("jaxrs.resource.types");
>>> +            if (resourceTypes != null) {
>>> +                try {
>>> +
>>> +                    for (Class<?> cls : resourceTypes) {
>>> +                        if (cls.getName().endsWith(clsName)) {
>>> +                            return cls;
>>> +                        }
>>> +                    }
>>> +
>>> +                } catch (Throwable e) {
>>> +                    LOG.log(Level.WARNING, "findClass failed.", e);
>>> +                }
>>> +            }
>>> +        } else {
>>> +
>>> +            for (ServiceInfo serviceInfo : endpoint.getService().getServiceInfos()) {
>>> +                for (BindingInfo bindingInfo : serviceInfo.getBindings()) {
>>> +                    for (BindingOperationInfo boi : bindingInfo.getOperations()) {
>>> +
>>> +                        if (boi.getInput() != null && boi.getInput().getMessageParts() != null) {
>>> +                            for (MessagePartInfo mpi : boi.getInput().getMessageParts()) {
>>> +                                Class<?> partClass = mpi.getTypeClass();
>>> +                                if (partClass != null && partClass.getName().endsWith(clsName)) {
>>> +                                    return partClass;
>>> +                                }
>>> +                            }
>>> +
>>> +                        }
>>> +                        if (boi.getOutput() != null && boi.getOutput().getMessageParts() != null) {
>>> +                            for (MessagePartInfo mpi : boi.getOutput().getMessageParts()) {
>>> +                                Class<?> partClass = mpi.getTypeClass();
>>> +                                if (partClass != null && partClass.getName().endsWith(clsName)) {
>>> +                                    return partClass;
>>> +                                }
>>> +                            }
>>> +                        }
>>> +                    }
>>> +                }
>>> +            }
>>> +
>>> +        }
>>> +        return null;
>>> +    }
>>> +
>>> +    private String reformatIndent(String input, int startIndent) {
>>> +        String ret = "";
>>> +        BufferedReader reader = new BufferedReader(new StringReader(input));
>>> +        try {
>>> +            String oneLine;
>>> +            while ((oneLine = reader.readLine()) != null) {
>>> +                ret = ret + getIndention(startIndent) + oneLine + getEol();
>>> +            }
>>> +        } catch (IOException e) {
>>> +            LOG.log(Level.WARNING, "reformatIndent failed.", e);
>>> +        }
>>> +        return ret;
>>> +    }
>>> +
>>> +    private String rollbackEol(String input) {
>>> +        String ret = input;
>>> +        if (ret.endsWith(getEol())) {
>>> +            ret = ret.substring(0, ret.length() - getEol().length());
>>> +        }
>>> +        return ret;
>>> +    }
>>> +
>>> +    private String rollbackColon(String input) {
>>> +        String ret = input;
>>> +        if (ret.endsWith(",")) {
>>> +            ret = ret.substring(0, ret.length() - 1);
>>> +        }
>>> +        return ret;
>>> +    }
>>> +
>>> +    private boolean isInOSGi() {
>>> +        if (FrameworkUtil.getBundle(ManagedEndpoint.class) != null) {
>>> +            return true;
>>> +        }
>>> +        return false;
>>> +
>>> +    }
>>> +
>>> +
>>> +    private String getBeginIndentionWithReturn(int n) {
>>> +        return "{" + getEol() + getIndention(n);
>>> +    }
>>> +
>>> +    private String getEndIndentionWithReturn(int n) {
>>> +        return getEol() + getIndention(n) + "}";
>>> +    }
>>> +
>>> +    private String getBeginIndentionWithReturnForList(int n) {
>>> +        return "[" + getEol() + getIndention(n);
>>> +    }
>>> +
>>> +    private String getEndIndentionWithReturnForList(int n) {
>>> +        return getEol() + getIndention(n) + "]";
>>> +    }
>>> +
>>> +    /*private String getEndIndentionWithoutReturnForList(int n) {
>>> +        return getIndention(n) + "]";
>>> +    }
>>> +
>>> +    private String getEndIndentionWithoutReturn(int n) {
>>> +        return getIndention(n) + "}";
>>> +    }*/
>>> +
>>> +    private String getIndention(int n) {
>>> +        String ret = "";
>>> +        for (int i = 0; i < n; i++) {
>>> +            ret = ret + INDENTION;
>>> +        }
>>> +        return ret;
>>> +    }
>>> +
>>> +    private String getEol() {
>>> +        if (eol == null) {
>>> +            return "\n";
>>> +        } else {
>>> +            return this.eol;
>>> +        }
>>> +    }
>>> +
>>> +    private ConfigurationAdmin getConfigurationAdmin() {
>>> +        try {
>>> +            if (isInOSGi() && (configurationAdmin == null)) {
>>> +                BundleContext bundleContext = FrameworkUtil.getBundle(ManagedEndpoint.class)
>>> +                    .getBundleContext();
>>> +                if (bundleContext != null) {
>>> +                    ServiceReference serviceReference = bundleContext
>>> +                        .getServiceReference(ConfigurationAdmin.class.getName());
>>> +                    if (serviceReference != null) {
>>> +                        configurationAdmin = (ConfigurationAdmin)bundleContext.getService(serviceReference);
>>> +                    }
>>> +                }
>>> +
>>> +            }
>>> +        } catch (Exception e) {
>>> +            LOG.log(Level.WARNING, "getConfigurationAdmin failed.", e);
>>> +        }
>>> +        return configurationAdmin;
>>> +    }
>>>
>>>     public ObjectName getObjectName() throws JMException {
>>>         String busId = bus.getId();
>>>
>>> http://git-wip-us.apache.org/repos/asf/cxf/blob/87b4f1a5/parent/pom.xml
>>> ----------------------------------------------------------------------
>>> diff --git a/parent/pom.xml b/parent/pom.xml
>>> index e8901af..9fda29b 100644
>>> --- a/parent/pom.xml
>>> +++ b/parent/pom.xml
>>> @@ -185,8 +185,8 @@
>>>         <cxf.oro.bundle.version>2.0.8_6</cxf.oro.bundle.version>
>>>         <cxf.dom4j.bundle.version>1.6.1_5</cxf.dom4j.bundle.version>
>>>         <cxf.jdom.bundle.version>1.1_4</cxf.jdom.bundle.version>
>>> -
>>> -
>>> +        <cxf.jackson.version>2.3.0-rc1</cxf.jackson.version>
>>> +        <cxf.validation.version>1.1.0.Final</cxf.validation.version>
>>>         <cxf.checkstyle.extension />
>>>         <cxf.jaxb.context.class />
>>>
>>> @@ -1569,6 +1569,32 @@
>>>                 <artifactId>swagger-jaxrs_2.10</artifactId>
>>>                 <version>${cxf.swagger.version}</version>
>>>             </dependency>
>>> +            <dependency>
>>> +                <groupId>com.fasterxml.jackson.module</groupId>
>>> +                <artifactId>jackson-module-jaxb-annotations</artifactId>
>>> +                <version>${cxf.jackson.version}</version>
>>> +            </dependency>
>>> +            <dependency>
>>> +                <groupId>com.fasterxml.jackson.core</groupId>
>>> +                <artifactId>jackson-databind</artifactId>
>>> +                <version>${cxf.jackson.version}</version>
>>> +            </dependency>
>>> +            <dependency>
>>> +                <groupId>com.fasterxml.jackson.core</groupId>
>>> +                <artifactId>jackson-annotations</artifactId>
>>> +                <version>${cxf.jackson.version}</version>
>>> +            </dependency>
>>> +            <dependency>
>>> +                <groupId>com.fasterxml.jackson.core</groupId>
>>> +                <artifactId>jackson-core</artifactId>
>>> +                <version>${cxf.jackson.version}</version>
>>> +            </dependency>
>>> +            <dependency>
>>> +                <groupId>javax.validation</groupId>
>>> +                <artifactId>validation-api</artifactId>
>>> +                <version>${cxf.validation.version}</version>
>>> +            </dependency>
>>> +
>>>
>>>         </dependencies>
>>>     </dependencyManagement>
>>>
>>> http://git-wip-us.apache.org/repos/asf/cxf/blob/87b4f1a5/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java
>>> ----------------------------------------------------------------------
>>> diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java
>>> index 2c54ef7..e2bb52d 100644
>>> --- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java
>>> +++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java
>>> @@ -69,6 +69,7 @@ public class AbstractJAXRSFactoryBean extends AbstractEndpointFactory {
>>>
>>>     private static final Logger LOG = LogUtils.getL7dLogger(AbstractJAXRSFactoryBean.class);
>>>     private static final ResourceBundle BUNDLE = BundleUtils.getBundle(AbstractJAXRSFactoryBean.class);
>>> +    private static final String RESOURCE_TYPES = "jaxrs.resource.types";
>>>
>>>     protected List<String> schemaLocations;
>>>     protected JAXRSServiceFactoryBean serviceFactory;
>>> @@ -244,6 +245,10 @@ public class AbstractJAXRSFactoryBean extends AbstractEndpointFactory {
>>>                                      cri.getServiceClass(), null);
>>>         }
>>>         ep.put(JAXRSServiceFactoryBean.class.getName(), serviceFactory);
>>> +
>>> +        Map<Class<?>, Type> allClasses =
>>> +            ResourceUtils.getAllRequestResponseTypes(list, false).getAllTypes();
>>> +        ep.put(RESOURCE_TYPES, allClasses.keySet());
>>>         return ep;
>>>     }
>>>
>>>
>>> http://git-wip-us.apache.org/repos/asf/cxf/blob/87b4f1a5/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/swagger/SwaggerFeature.java
>>> ----------------------------------------------------------------------
>>> diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/swagger/SwaggerFeature.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/swagger/SwaggerFeature.java
>>> index 85e3dd3..9dfba41 100644
>>> --- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/swagger/SwaggerFeature.java
>>> +++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/swagger/SwaggerFeature.java
>>> @@ -22,8 +22,11 @@ import java.util.ArrayList;
>>> import java.util.List;
>>>
>>> import org.apache.cxf.Bus;
>>> +import org.apache.cxf.endpoint.EndpointImpl;
>>> import org.apache.cxf.endpoint.Server;
>>> import org.apache.cxf.feature.AbstractFeature;
>>> +import org.apache.cxf.feature.Feature;
>>> +import org.apache.cxf.interceptor.InterceptorProvider;
>>> import org.apache.cxf.jaxrs.JAXRSServiceFactoryBean;
>>> import org.apache.cxf.jaxrs.model.AbstractResourceInfo;
>>> import org.apache.cxf.jaxrs.provider.ProviderFactory;
>>> @@ -80,6 +83,20 @@ public class SwaggerFeature extends AbstractFeature {
>>>             setBasePath(address + "/api-docs");
>>>         }
>>>     }
>>> +
>>> +    @Override
>>> +    protected void initializeProvider(InterceptorProvider provider, Bus bus) {
>>> +        EndpointImpl endpointImpl = (EndpointImpl)provider;
>>> +        List<Feature> features = endpointImpl.getActiveFeatures();
>>> +        if (features == null) {
>>> +            features = new ArrayList<Feature>();
>>> +            features.add(this);
>>> +            endpointImpl.initializeActiveFeatures(features);
>>> +        } else {
>>> +            features.add(this);
>>> +        }
>>> +    }
>>> +
>>>     public String getResourcePackage() {
>>>         return resourcePackage;
>>>     }
>>>
>>> http://git-wip-us.apache.org/repos/asf/cxf/blob/87b4f1a5/systests/jaxrs/pom.xml
>>> ----------------------------------------------------------------------
>>> diff --git a/systests/jaxrs/pom.xml b/systests/jaxrs/pom.xml
>>> index 33aea6b..37e8c8c 100644
>>> --- a/systests/jaxrs/pom.xml
>>> +++ b/systests/jaxrs/pom.xml
>>> @@ -351,6 +351,27 @@
>>>          <artifactId>httpclient</artifactId>
>>>          <scope>test</scope>
>>>         </dependency>
>>> +        <dependency>
>>> +            <groupId>com.fasterxml.jackson.core</groupId>
>>> +            <artifactId>jackson-core</artifactId>
>>> +            <scope>test</scope>
>>> +        </dependency>
>>> +        <dependency>
>>> +            <groupId>com.fasterxml.jackson.core</groupId>
>>> +            <artifactId>jackson-databind</artifactId>
>>> +            <scope>test</scope>
>>> +        </dependency>
>>> +        <dependency>
>>> +            <groupId>com.fasterxml.jackson.module</groupId>
>>> +            <artifactId>jackson-module-jaxb-annotations</artifactId>
>>> +            <scope>test</scope>
>>> +        </dependency>
>>> +        <dependency>
>>> +            <groupId>javax.validation</groupId>
>>> +            <artifactId>validation-api</artifactId>
>>> +            <scope>test</scope>
>>> +        </dependency>
>>> +
>>>     </dependencies>
>>>
>>>     <build>
>>>
>>> http://git-wip-us.apache.org/repos/asf/cxf/blob/87b4f1a5/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/RestJsonSchemaJMXTest.java
>>> ----------------------------------------------------------------------
>>> diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/RestJsonSchemaJMXTest.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/RestJsonSchemaJMXTest.java
>>> new file mode 100644
>>> index 0000000..04926c7
>>> --- /dev/null
>>> +++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/RestJsonSchemaJMXTest.java
>>> @@ -0,0 +1,162 @@
>>> +/**
>>> + * Licensed to the Apache Software Foundation (ASF) under one
>>> + * or more contributor license agreements. See the NOTICE file
>>> + * distributed with this work for additional information
>>> + * regarding copyright ownership. The ASF 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.apache.cxf.systest.jaxrs;
>>> +
>>> +
>>> +import java.io.IOException;
>>> +import java.util.Iterator;
>>> +import java.util.Set;
>>> +import java.util.logging.Logger;
>>> +
>>> +import javax.management.MBeanServerConnection;
>>> +import javax.management.MalformedObjectNameException;
>>> +import javax.management.ObjectName;
>>> +import javax.management.remote.JMXConnector;
>>> +import javax.management.remote.JMXConnectorFactory;
>>> +import javax.management.remote.JMXServiceURL;
>>> +
>>> +import com.fasterxml.jackson.core.JsonFactory;
>>> +import com.fasterxml.jackson.core.JsonParser;
>>> +
>>> +import org.apache.cxf.Bus;
>>> +import org.apache.cxf.BusFactory;
>>> +import org.apache.cxf.bus.spring.SpringBusFactory;
>>> +import org.apache.cxf.common.logging.LogUtils;
>>> +import org.apache.cxf.endpoint.Server;
>>> +import org.apache.cxf.helpers.CastUtils;
>>> +import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
>>> +import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
>>> +import org.apache.cxf.management.ManagementConstants;
>>> +import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
>>> +import org.apache.cxf.transport.local.LocalTransportFactory;
>>> +
>>> +import org.junit.After;
>>> +import org.junit.Before;
>>> +import org.junit.Test;
>>> +
>>> +public class RestJsonSchemaJMXTest extends AbstractBusClientServerTestBase {
>>> +
>>> +    private static MBeanServerConnection mbsc;
>>> +    private static final String DEFAULT_JMXSERVICE_URL =
>>> +        "service:jmx:rmi:///jndi/rmi://localhost:9914/jmxrmi";
>>> +    private static final Logger LOG = LogUtils.getL7dLogger(RestJsonSchemaJMXTest.class);
>>> +
>>> +
>>> +    private String jmxServerURL;
>>> +
>>> +    private Server localServer;
>>> +
>>> +    @Before
>>> +    public void setUp() {
>>> +        SpringBusFactory bf = new SpringBusFactory();
>>> +        Bus bus = bf
>>> +                .createBus("/org/apache/cxf/systest/jaxrs/jmx-enable.xml");
>>> +        BusFactory.setDefaultBus(bus);
>>> +        JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
>>> +        sf.setResourceClasses(BookStore.class, BookStoreSpring.class);
>>> +        sf.setResourceProvider(BookStore.class,
>>> +                               new SingletonResourceProvider(new BookStore(), true));
>>> +        sf.setResourceProvider(BookStoreSpring.class,
>>> +                               new SingletonResourceProvider(new BookStoreSpring(), true));
>>> +        sf.setTransportId(LocalTransportFactory.TRANSPORT_ID);
>>> +        sf.setAddress("local://books");
>>> +        localServer = sf.create();
>>> +    }
>>> +
>>> +    @After
>>> +    public void tearDown() {
>>> +        if (localServer != null) {
>>> +            localServer.stop();
>>> +        }
>>> +    }
>>> +
>>> +    @Test
>>> +    public void testJsonSchema() throws Exception {
>>> +        String json = "";
>>> +        try {
>>> +            connectToMBserver();
>>> +            //test getJSONSchema
>>> +            json = invokeEndpoint("getJSONSchema", null);
>>> +            parseJson(json);
>>> +
>>> +            //test getJSONSchemaForClass
>>> +            json = invokeEndpoint("getJSONSchemaForClass", "org.apache.cxf.systest.jaxrs.Book");
>>> +            parseJson(json);
>>> +        } catch (Throwable e) {
>>> +            e.printStackTrace();
>>> +            fail("invalid json for " + json);
>>> +        }
>>> +    }
>>> +
>>> +    private void connectToMBserver() throws IOException {
>>> +        jmxServerURL = jmxServerURL == null ? DEFAULT_JMXSERVICE_URL : jmxServerURL;
>>> +        JMXServiceURL url = new JMXServiceURL(jmxServerURL);
>>> +        JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
>>> +        mbsc = jmxc.getMBeanServerConnection();
>>> +    }
>>> +
>>> +    private ObjectName getEndpointObjectName()
>>> +        throws MalformedObjectNameException, NullPointerException {
>>> +        StringBuilder buffer = new StringBuilder();
>>> +        String serviceName = "{http://jaxrs.systest.cxf.apache.org/}BookStore";
>>> +        String portName = "BookStore";
>>> +        buffer.append(ManagementConstants.DEFAULT_DOMAIN_NAME + ":type=Bus.Service.Endpoint,");
>>> +        buffer.append(ManagementConstants.SERVICE_NAME_PROP + "=\"" + serviceName + "\",");
>>> +        buffer.append(ManagementConstants.PORT_NAME_PROP + "=\"" + portName + "\",*");
>>> +        return new ObjectName(buffer.toString());
>>> +    }
>>> +
>>> +    private String invokeEndpoint(String operation, String operationPara)
>>> +        throws Exception {
>>> +        ObjectName endpointName = null;
>>> +        ObjectName queryEndpointName;
>>> +        String ret = "";
>>> +        Object[] jmxPara = null;
>>> +        String[] jmxSig = null;
>>> +        if (operationPara != null) {
>>> +            jmxPara = new Object[]{operationPara};
>>> +            jmxSig = new String[] {String.class.getName()};
>>> +        } else {
>>> +            jmxPara = new Object[0];
>>> +            jmxSig = new String[0];
>>> +        }
>>> +        queryEndpointName = getEndpointObjectName();
>>> +        Set<ObjectName> endpointNames = CastUtils.cast(mbsc.queryNames(queryEndpointName, null));
>>> +        // now get the ObjectName with the busId
>>> +        Iterator<ObjectName> it = endpointNames.iterator();
>>> +
>>> +        if (it.hasNext()) {
>>> +            // only deal with the first endpoint object which retrun from the list.
>>> +            endpointName = it.next();
>>> +            ret = (String)mbsc.invoke(endpointName, operation, jmxPara, jmxSig);
>>> +            LOG.info("invoke endpoint " + endpointName
>>> +                               + " operation " + operation + " succeed!");
>>> +        }
>>> +        return ret;
>>> +    }
>>> +
>>> +    private void parseJson(String json) throws Exception {
>>> +        JsonParser parser = new JsonFactory().createParser(json);
>>> +        while (parser.nextToken() != null) {
>>> +            //if it's an invalidate json will throw exception
>>> +            //which could be caught by the test
>>> +        }
>>> +    }
>>> +}
>>>
>>> http://git-wip-us.apache.org/repos/asf/cxf/blob/87b4f1a5/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/jmx-enable.xml
>>> ----------------------------------------------------------------------
>>> diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/jmx-enable.xml b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/jmx-enable.xml
>>> new file mode 100644
>>> index 0000000..da799fd
>>> --- /dev/null
>>> +++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/jmx-enable.xml
>>> @@ -0,0 +1,16 @@
>>> +<beans xmlns="http://www.springframework.org/schema/beans"
>>> +  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>>> +  xmlns:cxf="http://cxf.apache.org/core"
>>> +  xsi:schemaLocation="
>>> +           http://www.springframework.org/schema/beans
>>> +              http://www.springframework.org/schema/beans/spring-beans.xsd
>>> +           http://cxf.apache.org/core
>>> +              http://cxf.apache.org/schemas/core.xsd">
>>> +
>>> +    <cxf:bus bus="cxf">
>>> +      <cxf:properties>
>>> +          <entry key="bus.jmx.enabled" value="true"/>
>>> +          <entry key="bus.jmx.JMXServiceURL" value="service:jmx:rmi:///jndi/rmi://localhost:9914/jmxrmi" />
>>> +      </cxf:properties>
>>> +    </cxf:bus>
>>> +</beans>
>>>
>>> http://git-wip-us.apache.org/repos/asf/cxf/blob/87b4f1a5/systests/jaxws/pom.xml
>>> ----------------------------------------------------------------------
>>> diff --git a/systests/jaxws/pom.xml b/systests/jaxws/pom.xml
>>> index 67cef64..15c9c0b 100644
>>> --- a/systests/jaxws/pom.xml
>>> +++ b/systests/jaxws/pom.xml
>>> @@ -233,7 +233,26 @@
>>>             </exclusions>
>>>             <scope>test</scope>
>>>         </dependency>
>>> -
>>> +        <dependency>
>>> +            <groupId>com.fasterxml.jackson.core</groupId>
>>> +            <artifactId>jackson-core</artifactId>
>>> +            <scope>test</scope>
>>> +        </dependency>
>>> +        <dependency>
>>> +            <groupId>com.fasterxml.jackson.core</groupId>
>>> +            <artifactId>jackson-databind</artifactId>
>>> +            <scope>test</scope>
>>> +        </dependency>
>>> +        <dependency>
>>> +            <groupId>com.fasterxml.jackson.module</groupId>
>>> +            <artifactId>jackson-module-jaxb-annotations</artifactId>
>>> +            <scope>test</scope>
>>> +        </dependency>
>>> +        <dependency>
>>> +            <groupId>javax.validation</groupId>
>>> +            <artifactId>validation-api</artifactId>
>>> +            <scope>test</scope>
>>> +        </dependency>
>>>     </dependencies>
>>>
>>>
>>>
>>> http://git-wip-us.apache.org/repos/asf/cxf/blob/87b4f1a5/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/JsonSchemaJMXTest.java
>>> ----------------------------------------------------------------------
>>> diff --git a/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/JsonSchemaJMXTest.java b/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/JsonSchemaJMXTest.java
>>> new file mode 100644
>>> index 0000000..ec5b2c0
>>> --- /dev/null
>>> +++ b/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/JsonSchemaJMXTest.java
>>> @@ -0,0 +1,146 @@
>>> +/**
>>> + * Licensed to the Apache Software Foundation (ASF) under one
>>> + * or more contributor license agreements. See the NOTICE file
>>> + * distributed with this work for additional information
>>> + * regarding copyright ownership. The ASF 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.apache.cxf.systest.jaxws;
>>> +
>>> +import java.io.IOException;
>>> +import java.util.Iterator;
>>> +import java.util.Set;
>>> +import java.util.logging.Logger;
>>> +
>>> +import javax.management.MBeanServerConnection;
>>> +import javax.management.MalformedObjectNameException;
>>> +import javax.management.ObjectName;
>>> +import javax.management.remote.JMXConnector;
>>> +import javax.management.remote.JMXConnectorFactory;
>>> +import javax.management.remote.JMXServiceURL;
>>> +import javax.xml.ws.Endpoint;
>>> +
>>> +import com.fasterxml.jackson.core.JsonFactory;
>>> +import com.fasterxml.jackson.core.JsonParser;
>>> +
>>> +import org.apache.cxf.Bus;
>>> +import org.apache.cxf.BusFactory;
>>> +import org.apache.cxf.bus.spring.SpringBusFactory;
>>> +import org.apache.cxf.common.logging.LogUtils;
>>> +import org.apache.cxf.helpers.CastUtils;
>>> +import org.apache.cxf.management.ManagementConstants;
>>> +import org.apache.cxf.testutil.common.TestUtil;
>>> +
>>> +import org.apache.hello_world.GreeterImpl;
>>> +
>>> +
>>> +import org.junit.Assert;
>>> +import org.junit.Test;
>>> +
>>> +public class JsonSchemaJMXTest extends Assert {
>>> +
>>> +    static final String PORT = TestUtil.getPortNumber(JsonSchemaJMXTest.class);
>>> +    private static MBeanServerConnection mbsc;
>>> +    private static final String DEFAULT_JMXSERVICE_URL =
>>> +        "service:jmx:rmi:///jndi/rmi://localhost:9914/jmxrmi";
>>> +    private static final Logger LOG = LogUtils.getL7dLogger(JsonSchemaJMXTest.class);
>>> +
>>> +
>>> +    private String jmxServerURL;
>>> +
>>> +    @Test
>>> +    public void testJMXGetJsonSchema() throws Exception {
>>> +        SpringBusFactory bf = new SpringBusFactory();
>>> +        Bus bus = bf
>>> +                .createBus("/org/apache/cxf/systest/jaxws/jmx-enable.xml");
>>> +        BusFactory.setDefaultBus(bus);
>>> +        Endpoint ep = Endpoint.publish("http://localhost:" + PORT + "/SoapContext/SoapPort",
>>> +                                       new GreeterImpl());
>>> +        String json = "";
>>> +        try {
>>> +            connectToMBserver();
>>> +            //test getJSONSchema
>>> +            json = invokeEndpoint("getJSONSchema", null);
>>> +            parseJson(json);
>>> +            //test getJSONSchemaForClass
>>> +            json = invokeEndpoint("getJSONSchemaForClass", "SayHi");
>>> +            parseJson(json);
>>> +            //test getJSONSchemaForOperation
>>> +            json = invokeEndpoint("getJSONSchemaForOperation", "greetMe");
>>> +            parseJson(json);
>>> +        } catch (Throwable e) {
>>> +            e.printStackTrace();
>>> +            fail("invalid json for " + json);
>>> +        } finally {
>>> +            ep.stop();
>>> +        }
>>> +    }
>>> +
>>> +    private void connectToMBserver() throws IOException {
>>> +        jmxServerURL = jmxServerURL == null ? DEFAULT_JMXSERVICE_URL : jmxServerURL;
>>> +        JMXServiceURL url = new JMXServiceURL(jmxServerURL);
>>> +        JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
>>> +        mbsc = jmxc.getMBeanServerConnection();
>>> +    }
>>> +
>>> +    private ObjectName getEndpointObjectName()
>>> +        throws MalformedObjectNameException, NullPointerException {
>>> +        StringBuilder buffer = new StringBuilder();
>>> +        String serviceName = "{http://apache.org/hello_world/services}SOAPService";
>>> +        String portName = "SoapPort";
>>> +        buffer.append(ManagementConstants.DEFAULT_DOMAIN_NAME + ":type=Bus.Service.Endpoint,");
>>> +        buffer.append(ManagementConstants.SERVICE_NAME_PROP + "=\"" + serviceName + "\",");
>>> +        buffer.append(ManagementConstants.PORT_NAME_PROP + "=\"" + portName + "\",*");
>>> +        return new ObjectName(buffer.toString());
>>> +    }
>>> +
>>> +    private String invokeEndpoint(String operation, String operationPara)
>>> +        throws Exception {
>>> +        ObjectName endpointName = null;
>>> +        ObjectName queryEndpointName;
>>> +        String ret = "";
>>> +        Object[] jmxPara = null;
>>> +        String[] jmxSig = null;
>>> +        if (operationPara != null) {
>>> +            jmxPara = new Object[]{operationPara};
>>> +            jmxSig = new String[] {String.class.getName()};
>>> +        } else {
>>> +            jmxPara = new Object[0];
>>> +            jmxSig = new String[0];
>>> +        }
>>> +        queryEndpointName = getEndpointObjectName();
>>> +        Set<ObjectName> endpointNames = CastUtils.cast(mbsc.queryNames(queryEndpointName, null));
>>> +        // now get the ObjectName with the busId
>>> +        Iterator<ObjectName> it = endpointNames.iterator();
>>> +
>>> +        if (it.hasNext()) {
>>> +            // only deal with the first endpoint object which retrun from the list.
>>> +            endpointName = it.next();
>>> +            ret = (String)mbsc.invoke(endpointName, operation, jmxPara, jmxSig);
>>> +            LOG.info("invoke endpoint " + endpointName
>>> +                               + " operation " + operation + " succeed!");
>>> +        }
>>> +        return ret;
>>> +    }
>>> +
>>> +    private void parseJson(String json) throws Exception {
>>> +        JsonParser parser = new JsonFactory().createParser(json);
>>> +        while (parser.nextToken() != null) {
>>> +            //if it's an invalidate json will throw exception
>>> +            //which could be caught by the test
>>> +        }
>>> +    }
>>> +
>>> +}
>>>
>>> http://git-wip-us.apache.org/repos/asf/cxf/blob/87b4f1a5/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/jmx-enable.xml
>>> ----------------------------------------------------------------------
>>> diff --git a/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/jmx-enable.xml b/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/jmx-enable.xml
>>> new file mode 100644
>>> index 0000000..fad676d
>>> --- /dev/null
>>> +++ b/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/jmx-enable.xml
>>> @@ -0,0 +1,28 @@
>>> +<beans xmlns="http://www.springframework.org/schema/beans"
>>> +  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>>> +  xmlns:sec="http://cxf.apache.org/configuration/security"
>>> +  xmlns:http="http://cxf.apache.org/transports/http/configuration"
>>> +  xmlns:httpj="http://cxf.apache.org/transports/http-jetty/configuration"
>>> +  xmlns:jaxws="http://cxf.apache.org/jaxws"
>>> +  xmlns:cxf="http://cxf.apache.org/core"
>>> +  xsi:schemaLocation="
>>> +                   http://cxf.apache.org/configuration/security
>>> +                      http://cxf.apache.org/schemas/configuration/security.xsd
>>> +           http://cxf.apache.org/transports/http/configuration
>>> +              http://cxf.apache.org/schemas/configuration/http-conf.xsd
>>> +           http://cxf.apache.org/transports/http-jetty/configuration
>>> +              http://cxf.apache.org/schemas/configuration/http-jetty.xsd
>>> +           http://cxf.apache.org/jaxws
>>> +              http://cxf.apache.org/schemas/jaxws.xsd
>>> +           http://www.springframework.org/schema/beans
>>> +              http://www.springframework.org/schema/beans/spring-beans.xsd
>>> +           http://cxf.apache.org/core
>>> +              http://cxf.apache.org/schemas/core.xsd">
>>> +
>>> +    <cxf:bus bus="cxf">
>>> +      <cxf:properties>
>>> +          <entry key="bus.jmx.enabled" value="true"/>
>>> +          <entry key="bus.jmx.JMXServiceURL" value="service:jmx:rmi:///jndi/rmi://localhost:9914/jmxrmi" />
>>> +      </cxf:properties>
>>> +    </cxf:bus>
>>> +</beans>
>>>
>>
>> --
>> Daniel Kulp
>> dkulp@apache.org - http://dankulp.com/blog
>> Talend Community Coder - http://coders.talend.com
>>
>
>


-- 
Sergey Beryozkin

Talend Community Coders
http://coders.talend.com/

Blog: http://sberyozkin.blogspot.com

Mime
View raw message