/*
 * 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.
 */

#include "ActiveMQConnectionMetaData.h"

using namespace std;
using namespace activemq;
using namespace activemq::core;

////////////////////////////////////////////////////////////////////////////////
ActiveMQConnectionMetaData::ActiveMQConnectionMetaData() {
}

////////////////////////////////////////////////////////////////////////////////
ActiveMQConnectionMetaData::~ActiveMQConnectionMetaData() {
}

////////////////////////////////////////////////////////////////////////////////
std::string ActiveMQConnectionMetaData::getCMSVersion() const throw( cms::CMSException ) {
    return "@CMSAPI_VERSION@";
}

////////////////////////////////////////////////////////////////////////////////
int ActiveMQConnectionMetaData::getCMSMajorVersion() const throw( cms::CMSException ) {
    return @CMSAPI_MAJOR_VERSION@;
}

////////////////////////////////////////////////////////////////////////////////
int ActiveMQConnectionMetaData::getCMSMinorVersion() const throw( cms::CMSException ) {
    return @CMSAPI_MINOR_VERSION@;
}

////////////////////////////////////////////////////////////////////////////////
std::string ActiveMQConnectionMetaData::getCMSProviderName() const throw( cms::CMSException ) {
    return "@ACTIVEMQ_LIBRARY_NAME@";
}

////////////////////////////////////////////////////////////////////////////////
std::string ActiveMQConnectionMetaData::getProviderVersion() const throw( cms::CMSException ) {
    return "@ACTIVEMQ_VERSION@";
}

////////////////////////////////////////////////////////////////////////////////
int ActiveMQConnectionMetaData::getProviderMajorVersion() const throw( cms::CMSException ) {
    return @ACTIVEMQ_MAJOR_VERSION@;
}

////////////////////////////////////////////////////////////////////////////////
int ActiveMQConnectionMetaData::getProviderMinorVersion() const throw( cms::CMSException ) {
    return @ACTIVEMQ_MINOR_VERSION@;
}

////////////////////////////////////////////////////////////////////////////////
std::vector<std::string> ActiveMQConnectionMetaData::getCMSXPropertyNames() const
    throw( cms::CMSException ) {

    std::vector<std::string> jmxProperties;

    jmxProperties.push_back( "JMSXGroupID" );
    jmxProperties.push_back( "JMSXGroupSeq" );
    jmxProperties.push_back( "JMSXDeliveryCount" );
    jmxProperties.push_back( "JMSXProducerTXID" );

    return jmxProperties;
}
