org.jabylon.rest.ui.wicket.panels.PropertyEditorPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.jabylon.rest.ui.wicket.panels.PropertyEditorPanel.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.rest.ui.wicket.panels;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.inject.Inject;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.extensions.markup.html.repeater.data.table.filter.IFilterStateLocator;
import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.SubmitLink;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.eclipse.emf.common.util.EList;
import org.jabylon.common.review.ReviewParticipant;
import org.jabylon.properties.Property;
import org.jabylon.properties.PropertyFile;
import org.jabylon.properties.PropertyFileDescriptor;
import org.jabylon.properties.Review;
import org.jabylon.resources.persistence.PropertyPersistenceService;
import org.jabylon.rest.ui.model.EClassSortState;
import org.jabylon.rest.ui.model.EObjectModel;
import org.jabylon.rest.ui.model.PropertyPair;
import org.jabylon.rest.ui.util.GlobalResources;
import org.jabylon.rest.ui.util.WebContextUrlResourceReference;
import org.jabylon.rest.ui.wicket.BasicResolvablePanel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;

/**
 *
 * has been replaced with PropertyEditorSinglePanel and PropertyListPanel
 * <p>
 * Long description for PropertyEditorPanel.
 *
 * @author utzig
 */
@Deprecated
public class PropertyEditorPanel extends BasicResolvablePanel<PropertyFileDescriptor> {

    private static final long serialVersionUID = 1L;
    private static final Logger logger = LoggerFactory.getLogger(PropertyEditorPanel.class);
    IModel<Multimap<String, Review>> reviewModel;

    @Inject
    private List<ReviewParticipant> reviewParticipants;

    @Inject
    private PropertyPersistenceService propertyPersistence;

    public PropertyEditorPanel(PropertyFileDescriptor object, PageParameters parameters) {
        super("content", object, parameters);
        List<ReviewParticipant> activeReviews = PropertyListModeFactory.filterActiveReviews(
                getModel().getObject().getProjectLocale().getParent().getParent(), reviewParticipants);
        PropertyListMode mode = PropertyListModeFactory.allAsMap(activeReviews)
                .get(parameters.get("mode").toString());
        addLinkList(mode);
        reviewModel = new LoadableDetachableModel<Multimap<String, Review>>() {

            private static final long serialVersionUID = 1L;

            @Override
            protected Multimap<String, Review> load() {
                return buildReviewMap(getModelObject());
            }
        };
        PropertyPairDataProvider provider = new PropertyPairDataProvider(object, mode, reviewModel);
        List<PropertyPair> contents = provider.createContents();

        ListView<PropertyPair> properties = new ListView<PropertyPair>("repeater", contents) {

            private static final long serialVersionUID = -7087485011138279358L;

            @Override
            protected void populateItem(final ListItem<PropertyPair> item) {
                IModel<PropertyPair> model = item.getModel();
                String key = model.getObject().getKey();
                Collection<Review> reviewList = reviewModel.getObject().get(key);
                item.add(new SinglePropertyEditor("row", model, false, reviewList));
            }

        };
        properties.setOutputMarkupId(true);

        Form<List<? extends PropertyPair>> form = new Form<List<? extends PropertyPair>>("properties-form",
                Model.ofList(contents)) {

            private static final long serialVersionUID = 1L;

            @Override
            protected void onSubmit() {
                super.onSubmit();
                IModel<List<? extends PropertyPair>> model = getModel();
                List<? extends PropertyPair> list = model.getObject();

                PropertyFileDescriptor descriptor = PropertyEditorPanel.this.getModelObject();
                PropertyFile file = descriptor.loadProperties();
                Map<String, Property> map = file.asMap();

                for (PropertyPair pair : list) {
                    Property translation = pair.getTranslation();
                    if (translation == null)
                        continue;
                    if (map.containsKey(translation.getKey())) {
                        Property property = map.get(translation.getKey());
                        property.setComment(translation.getComment());
                        property.setValue(translation.getValue());
                    } else
                        file.getProperties().add(translation);
                }
                propertyPersistence.saveProperties(descriptor, file);
                getSession().info("Saved successfully");
                try {
                    //TODO: this is very unclean...
                    // give it some time to store the values
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    logger.error("Interrupted while waiting for property persistence", e);
                }
            }
        };

        add(form);
        form.add(new SubmitLink("properties-submit") {
            private static final long serialVersionUID = 1L;

            @Override
            protected String getTriggerJavaScript() {
                /* disables the default submit behaviour since we do that ourselfs in JS
                 * https://github.com/jutzig/jabylon/issues/52
                 * see propertyEditor.js
                 */
                return "";
            }
        });
        form.add(properties);

        final PropertiesEditorToolbar editorToolbar = new PropertiesEditorToolbar("properties-toolbar", getModel(),
                getPageParameters());
        editorToolbar.setOutputMarkupId(true);
        add(editorToolbar);

        //
        //        final AbstractDefaultAjaxBehavior behave = new AbstractDefaultAjaxBehavior() {
        //            protected void respond(final AjaxRequestTarget target) {
        //                editorToolbar.respond(target);
        //
        //                StringValue parameter = RequestCycle.get().getRequest().getRequestParameters().getParameterValue("key");
        //                editorToolbar.setKey(parameter.toString(""));
        //            }
        //
        //            public CharSequence getCallbackFunction(String functionName, CallbackParameter... extraParameters)
        //            {
        //                StringBuilder sb = new StringBuilder();
        //                sb.append("function ");
        //                sb.append(functionName);
        //                sb.append(" (");
        //                boolean first = true;
        //                for (CallbackParameter curExtraParameter : extraParameters)
        //                {
        //                    if (curExtraParameter.getFunctionParameterName() != null)
        //                    {
        //                        if (!first)
        //                            sb.append(',');
        //                        else
        //                            first = false;
        //                        sb.append(curExtraParameter.getFunctionParameterName());
        //                    }
        //                }
        //                sb.append(") {\n");
        //                sb.append(getCallbackFunctionBody(extraParameters));
        //                sb.append("}\n");
        //                return sb;
        //            }
        //
        //            @Override
        //            public void renderHead(Component component, IHeaderResponse response) {
        //                response.render(JavaScriptHeaderItem.forScript(getCallbackFunction("requestAid",CallbackParameter.explicit("key")), "requestAid"));
        //                super.renderHead(component, response);
        //            }
        //
        //        };
        //
        //        add(behave);

    }

    @Override
    public void renderHead(IHeaderResponse response) {
        response.render(JavaScriptHeaderItem.forReference(GlobalResources.JS_JQUERY_DATATABLES));
        response.render(JavaScriptHeaderItem.forReference(GlobalResources.JS_BOOTSTRAP_DATATABLES));
        response.render(JavaScriptHeaderItem.forReference(GlobalResources.JS_SHORTCUTS));
        response.render(
                JavaScriptHeaderItem.forReference(new WebContextUrlResourceReference("js/propertyEditor.js")));
        super.renderHead(response);
    }

    private Multimap<String, Review> buildReviewMap(PropertyFileDescriptor object) {
        EList<Review> reviews = object.getReviews();
        Multimap<String, Review> reviewMap = ArrayListMultimap.create(reviews.size(), 2);
        for (Review review : reviews) {
            reviewMap.put(review.getKey(), review);
        }
        return reviewMap;
    }

    private void addLinkList(final PropertyListMode currentMode) {
        List<ReviewParticipant> activeReviews = PropertyListModeFactory.filterActiveReviews(
                getModel().getObject().getProjectLocale().getParent().getParent(), reviewParticipants);
        List<PropertyListMode> values = PropertyListModeFactory.all(activeReviews);
        ListView<PropertyListMode> mode = new ListView<PropertyListMode>("view-mode", values) {

            private static final long serialVersionUID = 1L;

            @Override
            protected void populateItem(ListItem<PropertyListMode> item) {

                String mode = item.getModelObject().name().toLowerCase();
                BookmarkablePageLink<Object> link = new BookmarkablePageLink<Object>("link", getPage().getClass(),
                        new PageParameters(getPageParameters()).set("mode", mode));
                link.setBody(Model.of("Show " + mode));
                item.add(link);
                if (item.getModelObject() == currentMode)
                    item.add(new AttributeModifier("class", "active"));
            }
        };
        add(mode);

    }

}

class PropertyPairDataProvider extends SortableDataProvider<PropertyPair, EClassSortState>
        implements IFilterStateLocator<String> {

    private static final long serialVersionUID = 1L;
    private CompoundPropertyModel<PropertyFileDescriptor> model;
    private transient List<PropertyPair> contents;
    private String filterState;
    private PropertyListMode mode;
    private IModel<Multimap<String, Review>> reviewModel;

    public PropertyPairDataProvider(PropertyFileDescriptor descriptor, PropertyListMode mode,
            IModel<Multimap<String, Review>> reviewModel) {
        super();
        model = new CompoundPropertyModel<PropertyFileDescriptor>(
                new EObjectModel<PropertyFileDescriptor>(descriptor));
        this.mode = mode;
        this.reviewModel = reviewModel;
    }

    @Override
    public Iterator<? extends PropertyPair> iterator(long first, long count) {
        List<PropertyPair> contents = getList();
        return contents.subList((int) first, (int) first + (int) count).iterator();
    }

    private List<PropertyPair> getList() {
        if (contents == null) {
            contents = createContents();
        }
        return contents;
    }

    protected List<PropertyPair> createContents() {
        PropertyFileDescriptor descriptor = model.getObject();
        Multimap<String, Review> reviews = reviewModel.getObject();
        PropertyFileDescriptor master = descriptor.getMaster();
        Map<String, Property> translated = descriptor.loadProperties().asMap();
        PropertyFile templateFile = master.loadProperties();

        List<PropertyPair> contents = new ArrayList<PropertyPair>();
        for (Property property : templateFile.getProperties()) {
            // IModel<String> bind = model.bind(property.getKey());
            // bind.set
            PropertyPair pair = new PropertyPair(property, translated.remove(property.getKey()),
                    descriptor.getVariant(), descriptor.cdoID());
            String key = pair.getKey();
            if (mode.apply(pair, reviews.get(key)))
                contents.add(pair);
        }
        for (Property property : translated.values()) {
            PropertyPair pair = new PropertyPair(null, property, descriptor.getVariant(), descriptor.cdoID());
            if (mode.apply(pair, reviews.get(pair.getKey())))
                contents.add(pair);
        }
        return contents;
    }

    @Override
    public long size() {
        return getList().size();
    }

    @Override
    public IModel<PropertyPair> model(PropertyPair object) {
        return Model.of(object);
    }

    @Override
    public void setFilterState(String state) {
        this.filterState = state;

    }

    @Override
    public String getFilterState() {
        return filterState;
    }

}