content: /**
   * 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.activemq.broker.jmx;
  
  import javax.management.openmbean.CompositeData;
  import javax.management.openmbean.OpenDataException;
  import javax.management.openmbean.TabularData;
  
  import org.apache.activemq.broker.BrokerService;
  import org.apache.activemq.broker.ConnectionContext;
  import org.apache.activemq.broker.region.DurableTopicSubscription;
  import org.apache.activemq.broker.region.Subscription;
  import org.apache.activemq.command.RemoveSubscriptionInfo;
  
  /**
   *
   */
  public class DurableSubscriptionView extends SubscriptionView implements DurableSubscriptionViewMBean {
  
      protected ManagedRegionBroker broker;
      protected BrokerService brokerService;
      protected String subscriptionName;
      protected DurableTopicSubscription durableSub;
  
      /**
       * Constructor
       *
       * @param clientId
       * @param sub
       */
      public DurableSubscriptionView(ManagedRegionBroker broker, BrokerService brokerService, String clientId, String userName, Subscription sub) {
          super(clientId, userName, sub);
          this.broker = broker;
          this.brokerService = brokerService;
          this.durableSub=(DurableTopicSubscription) sub;
          if (sub != null) {
              this.subscriptionName = sub.getConsumerInfo().getSubscriptionName();
          }
      }
  
      /**
       * @return name of the durable consumer
       */
      public String getSubscriptionName() {
          return subscriptionName;
      }
  
      /**
       * Browse messages for this durable subscriber
       *
       * @return messages
       * @throws OpenDataException
       */
      public CompositeData[] browse() throws OpenDataException {
          return broker.browse(this);
      }
  
      /**
       * Browse messages for this durable subscriber
       *
       * @return messages
       * @throws OpenDataException
       */
      public TabularData browseAsTable() throws OpenDataException {
          return broker.browseAsTable(this);
      }
  
      /**
       * Destroys the durable subscription so that messages will no longer be
       * stored for this subscription
       */
      public void destroy() throws Exception {
          RemoveSubscriptionInfo info = new RemoveSubscriptionInfo();
          info.setClientId(clientId);
          info.setSubscriptionName(subscriptionName);
          ConnectionContext context = new ConnectionContext();
          context.setBroker(broker);
          context.setClientId(clientId);
          brokerService.getBroker().removeSubscription(context, info);
      }
  
      public String toString() {
          return "ActiveDurableSubscriptionView: " + getClientId() + ":" + getSubscriptionName();
      }
  
  
      public int cursorSize() {
          if (durableSub != null && durableSub.getPending() != null) {
              return durableSub.getPending().size();
          }
          return 0;
      }
  
      @Override
      public void removeMessage(@MBeanInfo("messageId") String messageId) throws Exception {
          throw new IllegalStateException("Subscription must be inactive");
      }
  
      public boolean doesCursorHaveMessagesBuffered() {
          if (durableSub != null && durableSub.getPending() != null) {
              return durableSub.getPending().hasMessagesBufferedToDeliver();
          }
          return false;
      }
  
  
      public boolean doesCursorHaveSpace() {
          if (durableSub != null && durableSub.getPending() != null) {
              return durableSub.getPending().hasSpace();
          }
          return false;
      }
  
      /* (non-Javadoc)
       * @see org.apache.activemq.broker.jmx.DurableSubscriptionViewMBean#getCursorMemoryUsage()
       */
      public long getCursorMemoryUsage() {
          if (durableSub != null && durableSub.getPending() != null && durableSub.getPending().getSystemUsage()!=null) {
              return durableSub.getPending().getSystemUsage().getMemoryUsage().getUsage();
          }
          return 0;
      }
  
  
      public int getCursorPercentUsage() {
          if (durableSub != null && durableSub.getPending() != null && durableSub.getPending().getSystemUsage()!=null) {
              return durableSub.getPending().getSystemUsage().getMemoryUsage().getPercentUsage();
          }
          return 0;
      }
  
      public boolean isCursorFull() {
          if (durableSub != null && durableSub.getPending() != null) {
              return durableSub.getPending().isFull();
          }
          return false;
      }
  
      @Override
      public boolean isActive() {
          return durableSub.isActive();
      }
  
  
  }
  