/*
Copyright (C) 2009 Steffen Dienst
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package de.elatexam.editor.preview;
import java.io.StringWriter;
import java.util.concurrent.atomic.AtomicLong;
import javax.servlet.http.HttpServletRequest;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import org.apache.wicket.Session;
import org.apache.wicket.model.IModel;
import org.apache.wicket.protocol.http.RequestUtils;
import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
import org.apache.wicket.request.IRequestCycle;
import org.apache.wicket.request.handler.PageProvider;
import org.apache.wicket.request.handler.RenderPageRequestHandler;
import org.apache.wicket.request.http.handler.RedirectRequestHandler;
import com.visural.wicket.component.submitters.IndicateModalLink;
import de.elatexam.editor.util.Stuff;
import de.elatexam.model.ComplexTaskDef;
import de.thorstenberger.taskmodel.TaskModelViewDelegate;
import de.thorstenberger.taskmodel.TaskModelViewDelegateObject;
import de.thorstenberger.taskmodel.complex.ComplexTaskFactory;
import de.thorstenberger.taskmodel.complex.ComplexTaskletCorrectorImpl;
import de.thorstenberger.taskmodel.complex.complextaskdef.impl.ComplexTaskDefDAOImpl;
import de.thorstenberger.taskmodel.complex.complextaskhandling.impl.ComplexTaskHandlingDAOImpl;
import de.thorstenberger.taskmodel.complex.impl.ComplexTaskBuilderImpl;
import de.thorstenberger.taskmodel.complex.impl.ComplexTaskFactoryImpl;
import de.thorstenberger.taskmodel.impl.TaskManagerImpl;
import de.thorstenberger.taskmodel.impl.TaskModelViewDelegateObjectImpl;
import de.thorstenberger.taskmodel.impl.TaskletContainerImpl;
import de.thorstenberger.taskmodel.util.JAXBUtils;
/**
* Link that calls the locally running taskcore-view webapp to show live preview of a complextaskdef. Will return to the
* current page afterwards.
*
* @author Steffen Dienst
*
*/
public class PreviewComplexLink extends IndicateModalLink {
public PreviewComplexLink(final String id, final IModel<ComplexTaskDef> model) {
super(id);
setModel(model);
}
/**
* Find external absolute url.
*
* @return
*/
private String getContextUrl() {
final HttpServletRequest req = ((ServletWebRequest) getRequest()).getContainerRequest();
final String protocol = req.isSecure() ? "https://" : "http://";
final String hostname = req.getServerName();
final int port = req.getServerPort();
final StringBuffer url = new StringBuffer(128);
url.append(protocol);
url.append(hostname);
if ((port != 80) && (port != 443)) {
url.append(":");
url.append(port);
}
return url.toString();
}
@Override
public void onClick() {
final ComplexTaskFactory ctf = new ComplexTaskFactoryImpl(new ComplexTaskletCorrectorImpl());
final DummyTaskFactoryImpl taskfactory = new DummyTaskFactoryImpl(new ComplexTaskDefDAOImpl(ctf),
new ComplexTaskHandlingDAOImpl(ctf),new ComplexTaskBuilderImpl(ctf));
// use currently selected taskmodel (in the tree)
Marshaller marshaller = null;
JAXBContext context = Stuff.getContext();
try {
// marshal to xml
marshaller = JAXBUtils.getJAXBMarshaller(context);
final StringWriter sw = new StringWriter();
// TODO enable preview for one category, taskblock, subtaskdef
ComplexTaskDef ctd = (ComplexTaskDef) getModelObject();
Stuff.makeIDsUnique(ctd);
marshaller.marshal(ctd, sw);
// set xml to use
taskfactory.setTaskDefXml(sw.toString());
final TaskletContainerImpl taskletContainer = new TaskletContainerImpl(taskfactory);
// clear internal static caches
taskletContainer.reset();
final TaskManagerImpl tm = new TaskManagerImpl(taskfactory, taskletContainer);
final TaskModelViewDelegateObject delegateObject = new TaskModelViewDelegateObjectImpl(
0,
tm,
"sampleUser", "Max Mustermann",
getReturnLink());
TaskModelViewDelegate.storeDelegateObject(getSession().getId(), 0, delegateObject);
System.out.println(getContextUrl()+" | "+getReturnLink());
getRequestCycle().scheduleRequestHandlerAfterCurrent(
new RedirectRequestHandler(getContextUrl() + "/taskmodel-core-view/execute.do?id=0&todo=new&try=" + tryId.incrementAndGet()));
} catch (final JAXBException e) {
e.printStackTrace();
}finally{
if(marshaller!=null)
JAXBUtils.releaseJAXBMarshaller(context, marshaller);
}
}
/**
* Create return link to this very page instance. Clear TaskModelViewDelegate on return.
*
* @return
*/
private String getReturnLink() {
String rel= (String) urlFor(new RenderPageRequestHandler(new PageProvider(getPage())){
@Override
public void respond(IRequestCycle requestCycle) {
// remove preview task
TaskModelViewDelegate.removeSession(Session.get().getId());
super.respond(requestCycle);
}
});
final HttpServletRequest req = ((ServletWebRequest) getRequest()).getContainerRequest();
return RequestUtils.toAbsolutePath(req.getRequestURL().toString(), rel);
}
private static AtomicLong tryId = new AtomicLong(0);
}