Package org.wicketstuff.mbeanview

Source Code of org.wicketstuff.mbeanview.OperationsPanel$ParameterRepeater

/*
* 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.wicketstuff.mbeanview;

import java.io.PrintWriter;
import java.io.Serializable;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.management.MBeanOperationInfo;
import javax.management.MBeanParameterInfo;
import javax.management.MBeanServer;
import javax.management.ObjectName;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.feedback.FencedFeedbackPanel;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.util.convert.IConverter;

/**
* @author Pedro Henrique Oliveira dos Santos
*
*/
public class OperationsPanel extends Panel
{

  private static final long serialVersionUID = 1L;

  private final ObjectName objectName;

  private ModalWindow modalOutput;

  public OperationsPanel(String id, final IModel<MBeanServer> server,
    final ObjectName objectName, MBeanOperationInfo[] beanOperationInfos)
  {
    super(id);

    this.objectName = objectName;

    add(modalOutput = new ModalWindow("modalOutput"));
    modalOutput.setTitle("Operation result view.");
    modalOutput.setCookieName("modalOutput");

    Form<Void> form = new Form<Void>("form");
    add(form);

    ListView<MBeanOperationInfo> operations = new ListView<MBeanOperationInfo>("operations",
      Arrays.asList(beanOperationInfos))
    {
      private static final long serialVersionUID = 1L;

      @Override
      protected void populateItem(final ListItem<MBeanOperationInfo> item)
      {
        final MBeanOperationInfo info = item.getModelObject();
        String returnLbl = info.getReturnType();
        try
        {
          Class<?> c = Class.forName(info.getReturnType());
          if (c.isArray())
          {
            returnLbl = c.getComponentType().getSimpleName() + "[]";
          }
          else
          {
            returnLbl = c.getSimpleName();
          }
        }
        catch (ClassNotFoundException e)
        {
        }
        item.add(new Label("return", returnLbl));

        IModel<Object[]> values = Model.of(new Object[info.getSignature().length]);

        ParameterRepeater parameterRepeater = new ParameterRepeater("parameters",
          info.getSignature(), values);
        item.add(parameterRepeater);

        final FencedFeedbackPanel feedback = new FencedFeedbackPanel("feedback", item);
        feedback.setOutputMarkupId(true);
        item.add(feedback);
        item.add(new OperationButton("method", server, info, values)
        {
          private static final long serialVersionUID = 1L;

          @Override
          protected void onFailure(Exception e, AjaxRequestTarget target)
          {
            List<String> returnList = new ArrayList<String>();
            returnList.add(e.getMessage());
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
            e.printStackTrace(pw);
            returnList.add(sw.toString());

            modalOutput.setTitle("Failure");
            modalOutput.setContent(new DataViewPanel(modalOutput.getContentId(),
              Model.ofList(returnList)));
            modalOutput.show(target);
          }

          @Override
          protected void onSuccess(Object returnObj, AjaxRequestTarget target)
          {
            if (returnObj == null)
            {
              item.info("Success");
              target.add(feedback);
            }
            else
            {
              modalOutput.setTitle("Success");
              modalOutput.setContent(new DataViewPanel(modalOutput.getContentId(),
                Model.of((Serializable)returnObj)));
              modalOutput.show(target);
            }
          }
        });
      }

    };
    operations.setReuseItems(true);
    form.add(operations);
  }

  @SuppressWarnings("unchecked")
  public IModel<MBeanServer> getModel()
  {
    return (IModel<MBeanServer>)getDefaultModel();
  }

  private abstract class OperationButton extends AjaxButton
  {
    private static final long serialVersionUID = 1L;

    private IModel<MBeanServer> server;

    private final MBeanOperationInfo info;

    private IModel<Object[]> values;

    public OperationButton(String id, IModel<MBeanServer> server, MBeanOperationInfo info,
      IModel<Object[]> values)
    {
      super(id);

      setModel(Model.of(info.getName()));

      this.server = server;
      this.info = info;
      this.values = values;
    }

    @Override
    public void detachModels()
    {
      super.detachModels();

      server.detach();
      values.detach();
    }

    public String[] getSignatures()
    {
      String[] params = new String[info.getSignature().length];
      for (int i = 0; i < params.length; i++)
      {
        params[i] = info.getSignature()[i].getType();
      }
      return params;
    }

    @Override
    protected void onSubmit(AjaxRequestTarget target, Form<?> form)
    {
      Object returnObj = null;
      try
      {
        returnObj = server.getObject().invoke(objectName, info.getName(),
          values.getObject(), getSignatures());
        onSuccess(returnObj, target);
      }
      catch (Exception e)
      {
        onFailure(e, target);
      }
    }

    protected abstract void onFailure(Exception e, AjaxRequestTarget target);

    protected abstract void onSuccess(Object returnObj, AjaxRequestTarget target);
  }

  private static class ParameterRepeater extends ListView<MBeanParameterInfo>
  {
    private static final long serialVersionUID = 1L;

    private final IModel<Object[]> parameterValues;

    public ParameterRepeater(String id, MBeanParameterInfo[] beanParameterInfos,
      IModel<Object[]> values)
    {
      super(id, Arrays.asList(beanParameterInfos));

      this.parameterValues = values;
    }

    @Override
    public void detachModels()
    {
      super.detachModels();

      parameterValues.detach();
    }

    @Override
    protected void populateItem(final ListItem<MBeanParameterInfo> item)
    {
      MBeanParameterInfo param = item.getModelObject();

      item.add(new Label("parameterName", param.getName()));

      item.add(new TextField<Object>("parameterValue", new IModel<Object>()
      {
        private static final long serialVersionUID = 1L;

        @Override
        public void detach()
        {
        }

        @Override
        public Object getObject()
        {
          return parameterValues.getObject()[item.getIndex()];
        }

        @Override
        public void setObject(Object object)
        {
          parameterValues.getObject()[item.getIndex()] = object;
        }
      }, Object.class)
      {
        private static final long serialVersionUID = 1L;

        @SuppressWarnings("unchecked")
        @Override
        public <C> IConverter<C> getConverter(Class<C> type)
        {
          return new ValueConverter(item.getModelObject().getType());
        }
      });
    }
  }
}
TOP

Related Classes of org.wicketstuff.mbeanview.OperationsPanel$ParameterRepeater

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.