/*
* #!
* Ontopoly Editor
* #-
* Copyright (C) 2001 - 2013 The Ontopia Project
* #-
* 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 ontopoly.pages;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.List;
import net.ontopia.utils.OntopiaRuntimeException;
import ontopoly.components.AjaxOntopolyTextField;
import ontopoly.components.TitleHelpPanel;
import ontopoly.model.TopicMap;
import ontopoly.models.HelpLinkResourceModel;
import ontopoly.utils.ExportUtils;
import org.apache.wicket.PageParameters;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
import org.apache.wicket.behavior.SimpleAttributeModifier;
import org.apache.wicket.markup.html.WebResource;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.markup.html.form.RadioChoice;
import org.apache.wicket.markup.html.link.ResourceLink;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.protocol.http.WebResponse;
import org.apache.wicket.util.resource.AbstractResourceStreamWriter;
import org.apache.wicket.util.resource.IResourceStream;
public class AdminPage extends OntopolyAbstractPage {
String content;
String syntax;
String action;
String filename;
public AdminPage() {
}
public AdminPage(PageParameters parameters) {
super(parameters);
// Adding part containing title and help link
createTitle();
final Form<Object> form = new Form<Object>("form");
form.setOutputMarkupId(true);
add(form);
// First column of radio buttons
final List<String> contentCategories = Arrays.asList(
new ResourceModel("AdminPage.export.entire.topic.map").getObject().toString(),
new ResourceModel("AdminPage.export.topic.map.without.schema").getObject().toString(),
new ResourceModel("AdminPage.export.only.schema").getObject().toString());
content = (String)contentCategories.get(0);
RadioChoice<String> contentRadioChoice = new RadioChoice<String>("content", new PropertyModel<String>(this, "content"), contentCategories);
contentRadioChoice.add(new AjaxFormChoiceComponentUpdatingBehavior() {
@Override
protected void onUpdate(AjaxRequestTarget target) {
// no-op
}
});
form.add(contentRadioChoice);
TopicMap topicMap = getTopicMap();
// Second column of radio buttons
List<String> syntaxCategories =
Arrays.asList("ltm", "xtm1", "xtm2", "xtm21", "rdf", "tmxml");
syntax = syntaxCategories.get(1);
filename = topicMap.getId();
final AjaxOntopolyTextField fileNameTextField = new AjaxOntopolyTextField("fileNameTextField", new PropertyModel<String>(this, "filename"));
RadioChoice<String> syntaxRadioChoice = new RadioChoice<String>("syntax", new PropertyModel<String>(this, "syntax"), syntaxCategories,
new IChoiceRenderer<String>() {
public Object getDisplayValue(String object) {
return new ResourceModel("AdminPage.export.syntax." + object).getObject(); // "export.syntax.ltm", "export.syntax.xtm1", "export.syntax.xtm2", "export.syntax.rdf" ...
}
public String getIdValue(String object, int index) {
return object;
}
});
syntaxRadioChoice.add(new AjaxFormChoiceComponentUpdatingBehavior() {
@Override
protected void onUpdate(AjaxRequestTarget target) {
if (target != null)
target.addComponent(form);
}
});
form.add(syntaxRadioChoice);
// Third column of radio buttons
List<String> actionCategories = Arrays.asList(
new ResourceModel("AdminPage.export.download").getObject().toString(),
new ResourceModel("AdminPage.export.view").getObject().toString());
action = actionCategories.get(0).toString();
RadioChoice<String> actionRadioChoice = new RadioChoice<String>("action", new PropertyModel<String>(this, "action"), actionCategories);
form.add(actionRadioChoice);
actionRadioChoice.add(new AjaxFormChoiceComponentUpdatingBehavior() {
@Override
protected void onUpdate(AjaxRequestTarget target) {
if (target != null) {
target.addComponent(form);
}
}
});
form.add(fileNameTextField);
WebResource export = new WebResource() {
@Override
public IResourceStream getResourceStream() {
AbstractResourceStreamWriter abstractResourceStreamWriter = new AbstractResourceStreamWriter() {
public void write(OutputStream output) {
ExportUtils.Content contentchoice =
ExportUtils.Content.ENTIRE_TOPIC_MAP;
if (content.equals((String) contentCategories.get(1)))
contentchoice = ExportUtils.Content.INSTANCES_ONLY;
else if (content.equals((String) contentCategories.get(2)))
contentchoice = ExportUtils.Content.SCHEMA_ONLY;
try {
ExportUtils.export(getTopicMap(), syntax, contentchoice, new OutputStreamWriter(output, "utf-8"));
} catch (UnsupportedEncodingException e) {
throw new OntopiaRuntimeException(e);
}
}
public String getContentType() {
return syntax.equalsIgnoreCase("ltm") ? "text/plain" : "text/xml";
}
};
return abstractResourceStreamWriter;
}
@Override
protected void setHeaders(WebResponse response) {
super.setHeaders(response);
if(action.equals(new ResourceModel("AdminPage.export.download").getObject().toString())) {
response.setAttachmentHeader(fileNameTextField.getModel().getObject());
}
}
};
export.setCacheable(false);
ResourceLink<Object> resourceLink = new ResourceLink<Object>("export", export);
resourceLink.add(new SimpleAttributeModifier("value", new ResourceModel("AdminPage.export.button").getObject().toString()));
form.add(resourceLink);
// initialize parent components
initParentComponents();
}
protected static class Syntax {
private final String id;
Syntax(String id) {
this.id = id;
}
public String getId() {
return id;
}
}
@Override
protected int getMainMenuIndex() {
return ADMIN_PAGE_INDEX_IN_MAINMENU;
}
private void createTitle() {
add(new TitleHelpPanel("titlePartPanel",
new ResourceModel("AdminPage.export.title"), new HelpLinkResourceModel("help.link.exportpage")));
}
}