/**
* Copyright 2012 Universitat Pompeu Fabra.
*
* Licensed 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.onexus.website.api.widgets.selection.custom;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.event.Broadcast;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.form.upload.FileUpload;
import org.apache.wicket.markup.html.form.upload.FileUploadField;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.util.lang.Bytes;
import org.onexus.collection.api.query.In;
import org.onexus.website.api.events.EventCloseModal;
import org.onexus.website.api.widgets.selection.FilterConfig;
import java.io.BufferedReader;
import java.io.CharArrayReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collection;
public abstract class ListCustomFilterPanel extends AbstractCustomFilterPanel {
private IModel<String> filterNameModel;
private CustomFilter customFilter;
public ListCustomFilterPanel(String id, CustomFilter customFilter) {
super(id);
this.filterNameModel = new Model<String>("");
this.customFilter = customFilter;
// Create feedback panels
final FeedbackPanel uploadFeedback = new FeedbackPanel("uploadFeedback");
// Add uploadFeedback to the page itself
add(uploadFeedback);
// Add simple upload form, which is hooked up to its feedback panel by
// virtue of that panel being nested in the form.
final FileUploadForm simpleUploadForm = new FileUploadForm("simpleUpload");
add(simpleUploadForm);
}
private void recuperateFormValues(AjaxRequestTarget target, String filterName, CustomFilter field, Collection<String> values) {
// Create the filter
FilterConfig filter = new FilterConfig(filterName);
filter.setDeletable(true);
filter.setCollection(field.getCollection());
filter.setDefine("fc='" + field.getCollection() + "'");
In where = new In("fc", field.getField());
for (Object value : values) {
where.addValue(value);
}
filter.setWhere(where.toString());
addFilter(target, filter);
send(getPage(), Broadcast.BREADTH, EventCloseModal.EVENT);
}
public void cancel(AjaxRequestTarget target) {
}
public IModel<String> getFilterNameModel() {
return filterNameModel;
}
public String getFilterName() {
return filterNameModel.getObject();
}
public void setFilterName(String filterName) {
this.filterNameModel.setObject(filterName);
}
/**
* Inner Form object
*/
private class FileUploadForm extends Form<Object> {
private FileUploadField fileUploadField;
private Model<String> textArea = new Model<String>("");
public FileUploadForm(String name) {
super(name);
setOutputMarkupId(true);
// set this form to multipart mode (allways needed for uploads!)
setMultiPart(true);
TextField<String> filterName = new TextField<String>("filterName", getFilterNameModel());
add(filterName);
add(new TextArea<String>("textarea", textArea));
// Add one file input field
fileUploadField = new FileUploadField("fileInput");
add(fileUploadField);
final FeedbackPanel pfeedback = new FeedbackPanel("p-feedback");
add(pfeedback);
pfeedback.setOutputMarkupId(true);
// Necessary to pass all information from form.
add(new AjaxButton("okButton") {
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
if (isDataFormOk()) {
try {
Collection<String> values = getValuesFromForm();
recuperateFormValues(target, getFilterName(), ListCustomFilterPanel.this.customFilter, values);
} catch (Exception e) {
error(e.getMessage());
}
}
target.add(pfeedback);
}
@Override
protected void onError(AjaxRequestTarget target, Form<?> form) {
target.add(pfeedback);
}
});
add(new AjaxButton("cancelButton") {
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
cancel(target);
}
@Override
protected void onError(AjaxRequestTarget target, Form<?> form) {
// FIXME Auto-generated method stub
}
});
// Set maximum size to 1K
setMaxSize(Bytes.kilobytes(10));
}
/**
* Validates the form data.
*
* @return
*/
public boolean isDataFormOk() {
if (getFilterName() == null || "".equals(getFilterName())) {
error("Filter name must be specified");
return false;
}
if ((fileUploadField.getFileUpload() == null && (textArea.getObject() == null || textArea.getObject().length() == 0))) {
error("You must enter some values or upload a file");
return false;
}
return true;
}
private Collection<String> getValuesFromForm() throws IOException {
BufferedReader reader = null;
InputStream input = null;
try {
final FileUpload upload = fileUploadField.getFileUpload();
if (upload != null) {
input = upload.getInputStream();
reader = new BufferedReader(new InputStreamReader(input));
} else {
reader = new BufferedReader(new CharArrayReader(textArea.getObject().toCharArray()));
}
int c;
Collection<String> values = new ArrayList<String>();
String value = "";
while ((c = reader.read()) != -1) {
if (c == ' ' || c == '\r' || c == '\t') {
continue;
}
if (c == ',' || c == '\n') {
if (!value.equals("")) {
values.add(value);
value = "";
}
} else {
value = value + ((char) c);
}
}
if (!value.equals("")) {
values.add(value);
value = "";
}
return values;
} finally {
if (reader != null) {
reader.close();
}
if (input != null) {
input.close();
}
}
}
}
}