/** * (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; } }