org.jabylon.scheduler.ui.JobOverviewPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.jabylon.scheduler.ui.JobOverviewPanel.java

Source

/**
 * (C) Copyright 2013 Jabylon (http://www.jabylon.org) and others.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 */
package org.jabylon.scheduler.ui;

import java.io.Serializable;
import java.util.Collections;
import java.util.List;

import org.apache.wicket.ajax.AjaxSelfUpdatingTimerBehavior;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.util.time.Duration;
import org.jabylon.properties.Resolvable;
import org.jabylon.properties.Workspace;
import org.jabylon.rest.ui.model.ComputableModel;
import org.jabylon.rest.ui.model.ProgressionModel;
import org.jabylon.rest.ui.wicket.BasicPanel;
import org.jabylon.rest.ui.wicket.components.ProgressPanel;
import org.jabylon.rest.ui.wicket.config.AbstractConfigSection;
import org.jabylon.scheduler.JobInstance;
import org.jabylon.scheduler.ScheduleServiceException;
import org.jabylon.scheduler.SchedulerService;
import org.jabylon.security.CommonPermissions;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceReference;
import org.osgi.service.prefs.Preferences;

import com.google.common.base.Function;

public class JobOverviewPanel extends BasicPanel<Workspace> {

    private static final long serialVersionUID = -3170612366896934075L;
    //   private static final Logger LOG = LoggerFactory.getLogger(JobOverviewPanel.class);

    private IModel<List<JobInstance>> jobsModel;

    public JobOverviewPanel(String id, IModel<Workspace> model) {
        super(id, model);
    }

    @Override
    protected void construct() {
        super.construct();
        jobsModel = createJobsModel();
        WebMarkupContainer container = new WebMarkupContainer("container", jobsModel);
        IModel<Integer> sizeModel = new ComputableModel<IModel<List<JobInstance>>, Integer>(new SizeFunction(),
                jobsModel);
        Label noJobs = new Label("running-jobs", nls("running.jobs.title", sizeModel));
        noJobs.setOutputMarkupId(true);
        container.add(noJobs);
        ListView<JobInstance> list = new ListView<JobInstance>("list", jobsModel) {

            private static final long serialVersionUID = 1L;

            @Override
            protected void populateItem(ListItem<JobInstance> item) {
                JobInstance instance = item.getModelObject();
                String argLab = getLabel(instance.getDomainObject());

                if (argLab == null)
                    item.add(new Label("title",
                            nls(instance.getExecutionObject().getClass(), instance.getDescription())));
                else
                    item.add(new Label("title",
                            nls(instance.getExecutionObject().getClass(), instance.getDescription(), argLab)));
                ProgressionModel model = new ProgressionModel(instance.getID());
                ProgressPanel progressPanel = new ProgressPanel("panel", model);
                item.add(progressPanel);
                item.setOutputMarkupId(true);
                progressPanel.start();
            }

            private String getLabel(Object domainObject) {
                if (domainObject instanceof Workspace) {
                    return "Workspace";

                }
                if (domainObject instanceof Resolvable) {
                    @SuppressWarnings("rawtypes")
                    Resolvable r = (Resolvable) domainObject;
                    return r.fullPath().toString();
                }
                return null;
            }
        };
        list.setOutputMarkupId(true);
        list.setReuseItems(true);
        container.add(list);
        container.add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(1)));
        add(container);
    }

    private IModel<List<JobInstance>> createJobsModel() {
        return new ComputableModel<String, List<JobInstance>>(new LookupFuncton(), "");

    }

    @Override
    protected void detachModel() {
        super.detachModel();
        jobsModel.detach();
    }

    private static class LookupFuncton implements Function<String, List<JobInstance>>, Serializable {

        private static final long serialVersionUID = 1409367843199408286L;

        @Override
        public List<JobInstance> apply(String input) {
            try {
                //XXX: this is really bad
                BundleContext context = FrameworkUtil.getBundle(JobOverviewPanel.class).getBundleContext();
                ServiceReference<SchedulerService> reference = context.getServiceReference(SchedulerService.class);
                SchedulerService schedulerService = context.getService(reference);
                List<JobInstance> runningJobs = schedulerService.getRunningJobs();
                context.ungetService(reference);
                return runningJobs;
            } catch (ScheduleServiceException e) {

                return Collections.emptyList();
            }
        }

    }

    public static class JobOverviewConfigSection extends AbstractConfigSection<Workspace> {

        private static final long serialVersionUID = 1L;

        @Override
        public WebMarkupContainer doCreateContents(String id, IModel<Workspace> input, Preferences config) {
            return new JobOverviewPanel(id, input);
        }

        @Override
        public void commit(IModel<Workspace> input, Preferences config) {
            // TODO Auto-generated method stub

        }

        @Override
        public String getRequiredPermission() {
            return CommonPermissions.WORKSPACE_CONFIG;
        }

    }

}

class SizeFunction implements Function<IModel<List<JobInstance>>, Integer>, Serializable {

    private static final long serialVersionUID = -4535953340408752693L;

    @Override
    public Integer apply(IModel<List<JobInstance>> input) {
        return input.getObject().size();
    }

}