/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 ro.nextreports.server.web.dashboard; import org.apache.commons.codec.binary.Base64; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.panel.FeedbackPanel; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.spring.injection.annot.SpringBean; import org.apache.wicket.validation.validator.RangeValidator; import org.jasypt.util.text.BasicTextEncryptor; import ro.nextreports.server.service.StorageService; import ro.nextreports.server.web.core.UrlUtil; /** * @author Decebal Suiu */ public class WidgetEmbedCodePanel extends Panel { private static final long serialVersionUID = 1L; private Integer width = 520; private Integer height = 320; // it's a difference between alarm (80) and chart (320) private String parameters = ""; private FeedbackPanel feedbackPanel; private ErrorLoadableDetachableModel model; @SpringBean StorageService storageService; public WidgetEmbedCodePanel(String id, final String widgetId) { super(id); // TODO add a form for frame build like this: // Scroll: xxx // Border size: xxx // Width: xxx // Height: xxx // e similar cu DataSourcePanel doar cu butoane Test si Close (eventual) // sa utilizez FormPanel Form<String> form = new Form<String>("form"); add(form); model = new ErrorLoadableDetachableModel(widgetId); final Label codeLabel = new Label("code", model); codeLabel.setEscapeModelStrings(false); codeLabel.setOutputMarkupId(true); add(codeLabel); TextField<Integer> width = new TextField<Integer>("width", new PropertyModel<Integer>(this, "width")); width.setRequired(true); width.add(RangeValidator.minimum(100)); form.add(width); TextField<Integer> height = new TextField<Integer>("height", new PropertyModel<Integer>(this, "height")); height.setRequired(true); height.add(RangeValidator.minimum(100)); form.add(height); TextField<String> parameters = new TextField<String>("parameters", new PropertyModel<String>(this, "parameters")); form.add(parameters); form.add(new AjaxSubmitLink("link") { private static final long serialVersionUID = 1L; @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { model.setError(false); target.add(codeLabel); target.add(feedbackPanel); } @Override protected void onError(AjaxRequestTarget target, Form<?> form) { model.setError(true); target.add(codeLabel); target.add(feedbackPanel); } }); feedbackPanel = new FeedbackPanel("feedback"); feedbackPanel.setOutputMarkupId(true); add(feedbackPanel); } private String getCode(String widgetId, boolean error) { if (error) { return ""; } StringBuilder sb = new StringBuilder(); sb.append("<iframe src=\""); String url = UrlUtil.getAppBaseUrl(storageService). append("widget?id=").append(widgetId). append("&width=").append(String.valueOf(width)). append("&height=").append(String.valueOf(height)). toString(); sb.append(url); if (parameters == null) { parameters = ""; } if (!"".equals(parameters.trim())) { String password = storageService.getSettings().getIframe().getEncryptionKey(); if ((password != null) && !password.trim().equals("")) { BasicTextEncryptor textEncryptor = new BasicTextEncryptor(); textEncryptor.setPassword(password); String myEncryptedText = textEncryptor.encrypt(parameters); myEncryptedText = Base64.encodeBase64URLSafeString(myEncryptedText.getBytes()); sb.append("&P=").append(myEncryptedText); } else { sb.append("&").append(parameters); } } sb.append("\" "); sb.append("frameborder=0 "); sb.append("width=").append(width).append("px "); sb.append("height=").append(height).append("px"); sb.append("></iframe>"); return sb.toString(); } private class ErrorLoadableDetachableModel extends LoadableDetachableModel<String> { private static final long serialVersionUID = 1L; private boolean error = false; private String widgetId; public ErrorLoadableDetachableModel(String widgetId) { super(); this.widgetId = widgetId; } public void setError(boolean error) { this.error = error; } @Override protected String load() { return getCode(widgetId, error); } } }