diff --git a/.gitignore b/.gitignore index c5a80c5..11ff458 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ -.* -target -rebel.xml -*~ -*.out +.* +target +rebel.xml +*~ +*.out +/bin/ diff --git a/README.md b/README.md index bb560e1..d67241f 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,6 @@ -# Aperte Reports # -## News ## - -*May 13, 2013: Version 2.4 released. * - -Check [ReleaseNotes] for changelog or proceed directly to [http://code.google.com/p/aperte-reports/downloads/list download page]. +# Aperte Reports for Liferay 6.2# +#### Aperte Reports now works with Liferay 6.2! #### @@ -13,6 +9,7 @@ Check [ReleaseNotes] for changelog or proceed directly to [http://code.google.co ### Reporting easier than ever! ### + Effective reporting is crucial in monitoring the operation of information systems and work of every company. Quick access to key information provided in a clear has significant impact on accuracy and speed of the decision-making. @@ -34,13 +31,11 @@ Application Portlet technology allows you to place graphical components on an or All GUI elements are created as a separate components using *Vaadin* framework, allowing easy and quick use of them in any applications based on this framework or even running inside of run Java servlet container. Applications written in other technologies can use a special mechanism to generate and return reports in desired format. Such mechanism can also be used to generate application-specific documents. -## How to start? ## +### Aperte Reports Wiki ### +https://github.com/bluesoft-rnd/aperte-reports/wiki - # [Installation Install] the application - # [Tutorial Learn] how to use it - -... and use it! ---- +Migration to Liferay 6.2 was supported by ITSD Consulting GmbH. -Work in this project is sponsored by !BlueSoft Sp. z o.o. - Polish software solution provider. Aperte Reports was known before as Vries Reporting Dashboard. +The Aperte Reports Project is sponsored by !BlueSoft Sp. z o.o. - Polish software solution provider. Aperte Reports was known before as Vries Reporting Dashboard. diff --git a/WebServiceDataAdapter.jar b/WebServiceDataAdapter.jar new file mode 100644 index 0000000..3835727 Binary files /dev/null and b/WebServiceDataAdapter.jar differ diff --git a/aperte-reports-ui/pom.xml b/aperte-reports-ui/pom.xml index f4cbb60..9ee2662 100644 --- a/aperte-reports-ui/pom.xml +++ b/aperte-reports-ui/pom.xml @@ -1,117 +1,175 @@ - - 4.0.0 - - apertereports - org.apertereports - 2.5-SNAPSHOT - - aperte-reports-ui - war - Portlets for uploading and generating reports - - - vaadin-addons - http://maven.vaadin.com/vaadin-addons - - - - - - org.vaadin.addons - activelink - 1.0 - - - org.vaadin.addons - toolkit-productivity-tools - 1.2.0 - - - - com.liferay.portal - portal-service - 6.0.5 - provided - - - javax.servlet - servlet-api - 2.5 - provided - - - javax.portlet - portlet-api - 2.0 - provided - - - org.apertereports - backbone - 2.5-SNAPSHOT - - - com.vaadin - vaadin - 6.7.0 - provided - - - org.springframework - spring-beans - - - commons-lang - commons-lang - - - org.jruby - jruby-complete - 1.5.3 - - - org.codehaus.groovy - groovy-all - - - com.google.gwt - gwt-user - 2.1.0 - provided - - - com.liferay.portal - portal-impl - 6.0.5 - provided - - - junit - junit - test - - - - - - src/main/resources - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.6 - 1.6 - UTF-8 - - - - - + + 4.0.0 + + apertereports + org.apertereports + 2.5-SNAPSHOT + + aperte-reports-portlet + war + Portlets for uploading and generating reports + + + + + liferay-releases + https://repository.liferay.com/nexus/content/repositories/liferay-releases-ce/ + + + vaadin-addons + http://maven.vaadin.com/vaadin-addons + + + vaadin-snapshots + http://oss.sonatype.org/content/repositories/vaadin-snapshots/ + + false + + + true + + + + + + + org.vaadin.addons + activelink + 1.0 + + + org.vaadin.addons + toolkit-productivity-tools + 1.2.0 + + + + com.liferay.portal + portal-service + provided + + + javax.servlet + servlet-api + 2.5 + provided + + + javax.portlet + portlet-api + 2.0 + provided + + + org.apertereports + backbone + 2.5-SNAPSHOT + + + stax + stax-api + + + + + com.vaadin + vaadin + 6.8.17 + + + org.springframework + spring-beans + + + commons-lang + commons-lang + + + org.jruby + jruby-complete + 1.5.3 + + + org.codehaus.groovy + groovy-all + + + com.google.gwt + gwt-user + 2.1.0 + provided + + + com.liferay.portal + portal-impl + 6.2.5 + provided + + + com.liferay.portal + util-java + provided + + + + org.primefaces + primefaces + 11.0.0 + + + javax.faces + javax.faces-api + 2.2 + provided + + + org.glassfish + javax.faces + 2.2.19 + runtime + + + com.liferay.faces + com.liferay.faces.bridge.ext + 3.0.1 + runtime + + + com.liferay.faces + com.liferay.faces.bridge.impl + 4.1.1 + runtime + + + com.liferay.faces.patches + com.liferay.faces.lsv.485.patch + 1.0.0 + + + junit + junit + test + + + + + + + + + src/main/resources + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.7 + 1.7 + UTF-8 + + + + + \ No newline at end of file diff --git a/aperte-reports-ui/src/main/java/org/apertereports/AbstractReportingApplication.java b/aperte-reports-ui/src/main/java/org/apertereports/AbstractReportingApplication.java index 754afa0..cfe6e8d 100644 --- a/aperte-reports-ui/src/main/java/org/apertereports/AbstractReportingApplication.java +++ b/aperte-reports-ui/src/main/java/org/apertereports/AbstractReportingApplication.java @@ -1,6 +1,8 @@ package org.apertereports; import com.liferay.portal.model.Role; +import com.liferay.portal.model.UserGroupRole; + import java.util.Locale; import javax.portlet.ActionRequest; @@ -15,7 +17,11 @@ import org.apertereports.common.exception.ARRuntimeException; import org.apertereports.util.NotificationUtil; +import com.liferay.portal.security.auth.AuthTokenUtil; +import com.liferay.portal.security.auth.SessionAuthToken; +import com.liferay.portal.service.UserGroupRoleLocalServiceUtil; import com.liferay.portal.util.PortalUtil; +import com.vaadin.Application; import com.vaadin.event.ListenerMethod; import com.vaadin.terminal.gwt.server.PortletApplicationContext2; import com.vaadin.ui.Panel; @@ -23,8 +29,12 @@ import eu.livotov.tpt.TPTApplication; import eu.livotov.tpt.i18n.TM; + +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Set; + import org.apertereports.common.users.User; import org.apertereports.common.users.UserRole; import org.slf4j.Logger; @@ -36,9 +46,9 @@ * * @param Type of main panel */ + public abstract class AbstractReportingApplication extends TPTApplication implements PortletApplicationContext2.PortletListener { - private static final Logger logger = LoggerFactory.getLogger(AbstractReportingApplication.class); /** * Main window object @@ -60,8 +70,10 @@ public abstract class AbstractReportingApplication extends TPTA /** * Initializes the application context. */ + @Override public void applicationInit() { + setTheme("mytheme"); if (getContext() instanceof PortletApplicationContext2) { ((PortletApplicationContext2) getContext()).removePortletListener(this, this); ((PortletApplicationContext2) getContext()).addPortletListener(this, this); @@ -70,7 +82,6 @@ public void applicationInit() { TM.getDictionary().setDefaultLanguage(getLocale().getLanguage()); reloadDictionary(); portletInit(); - setMainWindow(mainWindow); } @@ -158,9 +169,17 @@ public void handleRenderRequest(RenderRequest request, RenderResponse response, if (getContext() instanceof PortletApplicationContext2) { try { com.liferay.portal.model.User liferayUser = PortalUtil.getUser(request); - + com.liferay.portal.model.Company company = PortalUtil.getCompany(request); + com.liferay.portal.theme.ThemeDisplay dis = (com.liferay.portal.theme.ThemeDisplay) request.getAttribute(com.liferay.portal.kernel.util.WebKeys.THEME_DISPLAY); + + //liferay user can be null because he can be not logged in if (liferayUser != null && (user == null || user.getLogin().equals(liferayUser.getLogin()))) { + + long userid= liferayUser.getUserId(); + long portletGroupId= dis.getScopeGroupId(); + long companyid= company.getCompanyId(); + String webid=company.getWebId(); String login = liferayUser.getLogin(); String email = liferayUser.getEmailAddress(); Set roles = new HashSet(); @@ -172,8 +191,16 @@ public void handleRenderRequest(RenderRequest request, RenderResponse response, roles.add(ur); admin |= adminRole; } - - user = new User(login, roles, admin, email); + //Group Roles + for(UserGroupRole gr : UserGroupRoleLocalServiceUtil.getUserGroupRoles(liferayUser.getUserId())){ + UserRole ur = new UserRole(gr.getRole().getName(), gr.getRoleId(), false); + roles.add(ur); + } + + Map userContext = new HashMap(); + userContext.put("p_auth", AuthTokenUtil.getToken(PortalUtil.getHttpServletRequest(request))); + userContext.put("serverUri","http://" + dis.getServerName() + ":" + dis.getServerPort() + "/api/jsonws/"); + user = new User(login, roles, admin, email, userid, portletGroupId, companyid, webid, userContext); reinitUserData(user); } @@ -244,3 +271,4 @@ public Locale getArLocale() { return locale; } } + diff --git a/aperte-reports-ui/src/main/java/org/apertereports/DashboardPortletApplication.java b/aperte-reports-ui/src/main/java/org/apertereports/DashboardPortletApplication.java index 1b78a49..3343eb0 100644 --- a/aperte-reports-ui/src/main/java/org/apertereports/DashboardPortletApplication.java +++ b/aperte-reports-ui/src/main/java/org/apertereports/DashboardPortletApplication.java @@ -57,12 +57,14 @@ public class DashboardPortletApplication extends AbstractReportingApplication { */ @Override public void portletInit() { + mainWindow = new Window(VaadinUtil.getValue("dashboard.window.title"), viewMode); - + + setTheme("mytheme"); if (getContext() instanceof PortletApplicationContext2) { PortletApplicationContext2 ctx = (PortletApplicationContext2) getContext(); ctx.addPortletListener(this, new ContextReloadListener(new AbstractContextReloadHandler() { - + @Override public void handleHelp(PortletContextHolder holder) { if (mainWindow.getContent() != helpMode) { @@ -86,6 +88,7 @@ public void handleResource(PortletContextHolder holder) { update(mainWindow, (AbstractDashboardComponent) mainWindow.getContent(), holder, false); } } + })); editMode.setCloseListener(new CloseListener() { @@ -101,6 +104,7 @@ public void close() { } }); } + } /** @@ -129,4 +133,4 @@ private void update(Window window, AbstractDashboardComponent component, Portlet protected void reinitUserData(User user) { //nothing to do } -} +} \ No newline at end of file diff --git a/aperte-reports-ui/src/main/java/org/apertereports/InvokerApplication.java b/aperte-reports-ui/src/main/java/org/apertereports/InvokerApplication.java index 21be3c0..796c25d 100644 --- a/aperte-reports-ui/src/main/java/org/apertereports/InvokerApplication.java +++ b/aperte-reports-ui/src/main/java/org/apertereports/InvokerApplication.java @@ -1,31 +1,42 @@ -package org.apertereports; - -import org.apertereports.components.AperteInvokerComponent; -import org.apertereports.util.VaadinUtil; - -import com.vaadin.ui.Window; -import org.apertereports.common.users.User; - -/** - * This portlet displays a list of available reports. - *

- * A user can then invoke the generation of the report manually with temporal - * parameters. It is also possible to generate the report in the background and - * send the result by email to the currently logged Liferay user. - */ -public class InvokerApplication extends AbstractReportingApplication { - - /** - * Initializes the portlet GUI. - */ - @Override - public void portletInit() { - mainPanel = new AperteInvokerComponent(); - mainWindow = new Window(VaadinUtil.getValue("invoker.window.title"), mainPanel); - } - - @Override - protected void reinitUserData(User user) { - mainPanel.initData(user); - } -} +package org.apertereports; + +import javax.portlet.PortletRequest; +import javax.portlet.PortletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apertereports.components.AperteInvokerComponent; +import org.apertereports.util.VaadinUtil; + +import com.vaadin.terminal.gwt.server.HttpServletRequestListener; +import com.vaadin.terminal.gwt.server.PortletRequestListener; +import com.vaadin.ui.Window; + +import org.apertereports.common.users.User; + +/** + * This portlet displays a list of available reports. + *

+ * A user can then invoke the generation of the report manually with temporal + * parameters. It is also possible to generate the report in the background and + * send the result by email to the currently logged Liferay user. + */ +public class InvokerApplication extends AbstractReportingApplication { + + /** + * Initializes the portlet GUI. + */ + @Override + public void portletInit() { + setTheme("mytheme"); + mainPanel = new AperteInvokerComponent(); + mainWindow = new Window(VaadinUtil.getValue("invoker.window.title"), mainPanel); + } + + @Override + protected void reinitUserData(User user) { + mainPanel.initData(user); + } + + +} diff --git a/aperte-reports-ui/src/main/java/org/apertereports/bean/ReportInvokerBean.java b/aperte-reports-ui/src/main/java/org/apertereports/bean/ReportInvokerBean.java new file mode 100644 index 0000000..02cb20c --- /dev/null +++ b/aperte-reports-ui/src/main/java/org/apertereports/bean/ReportInvokerBean.java @@ -0,0 +1,500 @@ +package org.apertereports.bean; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import javax.faces.application.FacesMessage; +import javax.faces.bean.ManagedBean; +import javax.faces.bean.SessionScoped; +import javax.faces.context.ExternalContext; +import javax.faces.context.FacesContext; +import javax.faces.model.SelectItem; +import javax.portlet.PortletRequest; +import javax.portlet.PortletResponse; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang.StringUtils; +import org.apertereports.backbone.util.ReportTemplateProvider; +import org.apertereports.common.ARConstants; +import org.apertereports.common.exception.ARException; +import org.apertereports.common.users.User; +import org.apertereports.common.users.UserRole; +import org.apertereports.common.wrappers.DictionaryItem; +import org.apertereports.dao.DictionaryDAO; +import org.apertereports.dao.ReportTemplateDAO; +import org.apertereports.dao.utils.ConfigurationCache; +import org.apertereports.engine.ReportMaster; +import org.apertereports.engine.ReportParameter; +import org.apertereports.engine.ReportProperty; +import org.apertereports.model.ReportTemplate; + +import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.portal.kernel.exception.SystemException; +import com.liferay.portal.model.Group; +import com.liferay.portal.model.Organization; +import com.liferay.portal.model.Role; +import com.liferay.portal.model.UserGroup; +import com.liferay.portal.model.UserGroupGroupRole; +import com.liferay.portal.model.UserGroupRole; +import com.liferay.portal.security.auth.AuthTokenUtil; +import com.liferay.portal.service.GroupLocalServiceUtil; +import com.liferay.portal.service.RoleLocalServiceUtil; +import com.liferay.portal.service.UserGroupGroupRoleLocalServiceUtil; +import com.liferay.portal.service.UserGroupRoleLocalServiceUtil; +import com.liferay.portal.util.PortalUtil; + +@ManagedBean(name = "reportInvokerBean") +@SessionScoped +public class ReportInvokerBean { + + private static final String REPORT_TYPE_KEY = "report_type"; + private static final String TYP_PDF = "PDF"; + private static final String TYP_XLS = "XLS"; + + private List reportTemplates = new ArrayList(); + private Map reportMasters = new HashMap(); + private Map> reportParameters = new HashMap>(); + private User user; + + public ReportInvokerBean() { + PortletRequest request = (PortletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); + + initAperteUser(request); + + reportTemplates.addAll(ReportTemplateDAO.fetchActive(user)); + } + + /* + * Initialisiert den User und setzt seine Rollen und andere benötigte Parameter + */ + private void initAperteUser(PortletRequest request) { + try { + com.liferay.portal.model.User liferayUser = PortalUtil.getUser(request); + com.liferay.portal.model.Company company = PortalUtil.getCompany(request); + com.liferay.portal.theme.ThemeDisplay dis = (com.liferay.portal.theme.ThemeDisplay) request + .getAttribute(com.liferay.portal.kernel.util.WebKeys.THEME_DISPLAY); + // liferay user can be null because he can be not logged in + if (liferayUser != null) { + + long userid = liferayUser.getUserId(); + long portletGroupId = dis.getScopeGroupId(); + long companyid = company.getCompanyId(); + String webid = company.getWebId(); + String login = liferayUser.getLogin(); + String email = liferayUser.getEmailAddress(); + Set roles = new HashSet(); + boolean admin = false; + + for (Role r : liferayUser.getRoles()) { + boolean adminRole = "administrator".equalsIgnoreCase(r.getName()); + UserRole ur = new UserRole(r.getName(), r.getRoleId(), adminRole); + roles.add(ur); + admin |= adminRole; + } + // Group Roles + for (UserGroupRole gr : UserGroupRoleLocalServiceUtil.getUserGroupRoles(liferayUser.getUserId())) { + UserRole ur = new UserRole(gr.getRole().getName(), gr.getRoleId(), false); + roles.add(ur); + } + + for(Role role : this.getInheritedRoles(liferayUser)) { + UserRole ur = new UserRole(role.getName(), role.getRoleId(), false); + roles.add(ur); + } + + + Map userContext = new HashMap(); + userContext.put("p_auth", AuthTokenUtil.getToken(PortalUtil.getHttpServletRequest(request))); + userContext.put("serverUri", + "http://" + dis.getServerName() + ":" + dis.getServerPort() + "/api/jsonws/"); + user = new User(login, roles, admin, email, userid, portletGroupId, companyid, webid, userContext); + } + } catch (Exception e) { + FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, + "Fehler beim Initialiseren des Users", "Fehler beim Initialiseren des Users")); + } + } + + /** + * Liefert alle vererbten Rollen des übergebenen Users zurück + * + * @param user + * @return Roles + * @throws SystemException + * @throws PortalException + */ + private Set getInheritedRoles(com.liferay.portal.model.User user ) throws SystemException, PortalException { + + + Set roles = new HashSet<>(); + + List allGroups = new ArrayList<>(); + + List userGroups = user.getUserGroups(); + + allGroups.addAll(GroupLocalServiceUtil.getUserGroupsGroups(userGroups)); + allGroups.addAll(GroupLocalServiceUtil. getUserGroupsRelatedGroups(userGroups)); + + List groups = user.getGroups(); + allGroups.addAll(groups); + + List organizations = user.getOrganizations(); + allGroups.addAll(GroupLocalServiceUtil.getOrganizationsGroups(organizations)); + allGroups.addAll(GroupLocalServiceUtil.getOrganizationsRelatedGroups(organizations)); + + for(Group group : allGroups){ + for(Role role : RoleLocalServiceUtil.getGroupRoles(group.getGroupId())) { + roles.add(role); + } + } + + // 2. SITE-ROLLEN ÜBER BENUTZERGRUPPEN FINDEN + for (UserGroup ug : user.getUserGroups()) { + // Wir holen alle Sites, in denen diese Benutzergruppe Mitglied ist + List groupsOfUserGroup = GroupLocalServiceUtil.getUserGroupGroups(ug.getUserGroupId()); + + for (Group site : groupsOfUserGroup) { + // Jetzt fragen wir nach den Rollen, die die BENUTZERGRUPPE in dieser SITE hat + List uggrs = UserGroupGroupRoleLocalServiceUtil.getUserGroupGroupRoles(ug.getUserGroupId(), site.getGroupId()); + + for (UserGroupGroupRole uggr : uggrs) { + Role r = uggr.getRole(); + roles.add(r); + } + } + } + + + return roles; + + } + /* + * Liefert die im Report (.jrxml) definierten Parameter zurück + */ + public List getAperteReportParameters(ReportTemplate template) { + return getReportMaster(template).getParameters(); + } + + /* + * Liefert den im Report (.jrxml) definierten Parameter mit dem übergebenen Key + * zurück + */ + private ReportParameter getAperteReportParameter(ReportTemplate template, String key) { + for (ReportParameter param : getAperteReportParameters(template)) { + if (param.getName().equals(key)) { + return param; + } + } + + return null; + } + + /* + * Initialisiert den ReportMaster und speichert ihn zwischen, wenn das Toggle + * geöffnet wird. Anschließend werden die Parameter für den Report + * initialisiert. + */ + public void initReportMaster(ReportTemplate template) { + try { + ReportMaster rm = new ReportMaster(template.getContent(), template.getId().toString(), + new ReportTemplateProvider(), user); + reportMasters.put(template.getId(), rm); + + Map params = new LinkedHashMap(); + for (ReportParameter parameter : getAperteReportParameters(template)) { + params.put(parameter.getName(), parameter.getValue()); + } + + params.put(REPORT_TYPE_KEY, TYP_PDF); + + reportParameters.put(template.getId(), params); + } catch (ARException e) { + FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, + "Fehler beim Initialisieren der Parameter", "Fehler beim Initialisieren der Parameter")); + } + } + + /* + * Schmeißt den zwischengespeicherten ReportMaster und die Parameter wieder weg, + * wenn das Toggle geschlossen wird + */ + public void destroyReportMaster(ReportTemplate template) { + reportMasters.remove(template.getId()); + reportParameters.remove(template.getId()); + } + + /* + * Setzt den SQL für MultiSelect-Parameter ab und gibt das Dictionary als Liste + * zurück + */ + public List getDictionaryItems(ReportTemplate template, String key) { + ReportParameter parameter = getAperteReportParameter(template, key); + + if (parameter == null) { + return new ArrayList(); + } + + String dictQuery = parameter.getProperties().get(ARConstants.Keys.DICT_QUERY).getValue(); + if (StringUtils.isNotEmpty(dictQuery)) { + String login = user.getLogin(); + dictQuery = dictQuery.replaceAll("\\$LOGIN", login); + dictQuery = dictQuery.replaceAll(":webid", user.getWebid()); + + return DictionaryDAO.fetchDictionary(dictQuery); + } + + return new ArrayList(); + } + + /* + * Liefert eine Liste aus SelectItems, die aus dem Dictionary erstellt wird + */ + public List getDictionarySelectItems(ReportTemplate template, String key) { + List dictItems = getDictionaryItems(template, key); + List selectItems = new ArrayList(); + for (DictionaryItem item : dictItems) { + if (!StringUtils.isEmpty(item.getDescription())) { + selectItems.add(new SelectItem(item.getCode(), item.getDescription())); + } + } + + return selectItems; + } + + /* + * Generiert den Report und bietet ihn direkt zum Download an (XLS) bzw. öffnet + * ihn in einem neuen Tab (PDF) + */ + public void generateReport(ReportTemplate template) { + byte[] reportBytes; + String selectedType = getReportParameters(template).get(REPORT_TYPE_KEY).toString(); + + try { + Map params = collectParamsForExport(template); + if(params == null) { + return; + } + + reportBytes = reportMasters.get(template.getId()).generateAndExportReport(selectedType, params, + ConfigurationCache.getConfiguration()); + } catch (Exception e) { + FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, + "Fehler beim Erstellen des Reports", "Fehler beim Erstellen des Reports")); + return; + } + + FacesContext facesContext = FacesContext.getCurrentInstance(); + ExternalContext externalContext = facesContext.getExternalContext(); + PortletResponse portletResponse = (PortletResponse) externalContext.getResponse(); + HttpServletResponse response = PortalUtil.getHttpServletResponse(portletResponse); + ServletOutputStream output = null; + + try { + response.reset(); + response.flushBuffer(); + portletResponse.setProperty("Content-Type", getContentType(template)); + portletResponse.setProperty("Content-Disposition", + "attachment; filename=" + template.getReportname() + "." + selectedType.toLowerCase()); + + output = response.getOutputStream(); + output.write(reportBytes); + + // Finalize task. + output.flush(); + output.close(); + facesContext.responseComplete(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /* + * Sammelt die Parameter für den Export des Reports, reformatiert sie teilweise + * (multiselect) und reichert sie an + */ + private Map collectParamsForExport(ReportTemplate template) { + Map params = new LinkedHashMap(); + params.putAll(getReportParameters(template)); + + if (!checkRequiredParameters(template, params)) { + FacesContext.getCurrentInstance().addMessage(null, + new FacesMessage(FacesMessage.SEVERITY_ERROR, + "Bitte geben Sie alle mit * gekennzeichneten Pflichtfelder ein", + "Bitte geben Sie alle mit * gekennzeichneten Pflichtfelder ein")); + + return null; + } + + reformatMultiSelectParameters(template, params); + reformatSingleSelectParameters(template, params); + reformatDateParameters(template, params); + + params.put("login", user.getLogin()); + params.put("webid", user.getWebid()); + + return params; + } + + private void reformatDateParameters(ReportTemplate template, Map params) { + for (Entry entry : params.entrySet()) { + if (isDateInput(template, entry.getKey())) { + try { + Date date = new SimpleDateFormat("yyyy-MM-dd").parse(entry.getValue().toString()); + params.put(entry.getKey(), new SimpleDateFormat("dd-MM-yyyy HH:mm").format(date)); + } catch (ParseException e) { + e.printStackTrace(); + } + } + } + } + + /* + * Reformatiert die MultiSelect Parameter. Die SelectManyList speichert die + * selektierten Elemente als String-Array Aperte braucht die Parameter + * allerdings als Komma-separierte Strings Wenn an der Oberfläche kein Element + * ausgewählt ist, wird ein Leerstring Übergeben + */ + private void reformatMultiSelectParameters(ReportTemplate template, Map params) { + for (Entry entry : params.entrySet()) { + if (isMultiSelectInput(template, entry.getKey())) { + Object value = params.get(entry.getKey()); + if (value instanceof String[]) { + String[] array = (String[]) value; + + if (array.length == 0) { + params.put(entry.getKey(), ""); + } else { + String newValue = ""; + for (String each : array) { + newValue += "'" + each + "',"; + } + + params.put(entry.getKey(), newValue.substring(0, newValue.lastIndexOf(","))); + } + } + } + } + } + + private void reformatSingleSelectParameters(ReportTemplate template, Map params) { + Map paramsCopy = new HashMap(); + paramsCopy.putAll(params); + for (Entry entry : params.entrySet()) { + if (isSingleSelectInput(template, entry.getKey()) && entry.getValue() == null) { + paramsCopy.remove(entry.getKey()); + } + } + + params.clear(); + params.putAll(paramsCopy); + } + + /* + * Prüft, ob alle Pflichtfelder gefüllt sind + */ + private boolean checkRequiredParameters(ReportTemplate template, Map params) { + for (Entry entry : params.entrySet()) { + if (isParameterRequired(template, entry.getKey()) + && (entry.getValue() == null || StringUtils.isEmpty(entry.getValue().toString()))) { + return false; + } + } + + return true; + } + + public boolean isParameterRequired(ReportTemplate template, String key) { + ReportParameter parameter = getAperteReportParameter(template, key); + if (parameter == null) { + return false; + } + ReportProperty requiredProperty = parameter.getProperties().get(ARConstants.Keys.REQUIRED); + return requiredProperty != null && "true".equals(requiredProperty.getValue()); + } + + public boolean isTextInput(ReportTemplate template, String key) { + ReportParameter parameter = getAperteReportParameter(template, key); + return parameter != null && parameter.getProperties().get(ARConstants.Keys.INPUT_TYPE).getValue() + .equalsIgnoreCase(ARConstants.InputTypes.TEXT.toString()); + } + + public boolean isDateInput(ReportTemplate template, String key) { + ReportParameter parameter = getAperteReportParameter(template, key); + return parameter != null && parameter.getProperties().get(ARConstants.Keys.INPUT_TYPE).getValue() + .equalsIgnoreCase(ARConstants.InputTypes.DATE.toString()); + } + + public boolean isMultiSelectInput(ReportTemplate template, String key) { + ReportParameter parameter = getAperteReportParameter(template, key); + if (parameter == null) { + return false; + } + String inputType = parameter.getProperties().get(ARConstants.Keys.INPUT_TYPE).getValue(); + return inputType.equalsIgnoreCase(ARConstants.InputTypes.MULTISELECT.toString()); + } + + public boolean isSingleSelectInput(ReportTemplate template, String key) { + ReportParameter parameter = getAperteReportParameter(template, key); + if (parameter == null) { + return false; + } + String inputType = parameter.getProperties().get(ARConstants.Keys.INPUT_TYPE).getValue(); + return inputType.equalsIgnoreCase(ARConstants.InputTypes.SELECT.toString()); + } + + public ReportMaster getReportMaster(ReportTemplate template) { + return reportMasters.get(template.getId()); + } + + public String getParameterLabel(ReportTemplate template, String key) { + ReportParameter parameter = getAperteReportParameter(template, key); + if (parameter == null) { + return ""; + } + String label = parameter.getProperties().get(ARConstants.Keys.LABEL).getValue(); + if(this.isParameterRequired(template, key)) + label = label + "*"; + return label; + } + + public List getReportTemplates() { + return reportTemplates; + } + + public void setReportTemplates(List reportTemplates) { + this.reportTemplates = reportTemplates; + } + + public Map getReportParameters(ReportTemplate template) { + return reportParameters.get(template.getId()); + } + + public List getReportTypeSelectItems() { + List typItems = new ArrayList(); + typItems.add(new SelectItem(TYP_PDF, TYP_PDF)); + typItems.add(new SelectItem(TYP_XLS, TYP_XLS)); + + return typItems; + } + + private String getContentType(ReportTemplate template) { + String selectedType = getReportParameters(template).get(REPORT_TYPE_KEY).toString(); + if (TYP_PDF.equals(selectedType)) { + return "application/pdf"; + } else { + return "application/vnd.ms-excel"; + } + } + +} diff --git a/aperte-reports-ui/src/main/java/org/apertereports/components/AperteInvokerComponent.java b/aperte-reports-ui/src/main/java/org/apertereports/components/AperteInvokerComponent.java index 70af98f..f4d6cc3 100644 --- a/aperte-reports-ui/src/main/java/org/apertereports/components/AperteInvokerComponent.java +++ b/aperte-reports-ui/src/main/java/org/apertereports/components/AperteInvokerComponent.java @@ -17,6 +17,8 @@ import org.apertereports.util.FileStreamer; import org.apertereports.util.VaadinUtil; +import com.google.gwt.dom.client.Element; +import com.google.gwt.user.client.DOM; import com.vaadin.event.FieldEvents.TextChangeEvent; import com.vaadin.event.FieldEvents.TextChangeListener; import com.vaadin.ui.*; @@ -37,10 +39,11 @@ public class AperteInvokerComponent extends Panel { private static final int PAGE_SIZE = 10; private static final String COMPONENT_STYLE_NAME = "borderless light"; - private PaginatedPanelList reportList; + private CssPaginatedPanelList reportList; private User user; public AperteInvokerComponent() { + super(new CssLayout()); init(); } @@ -63,16 +66,19 @@ private class ReportPanel extends Panel { private ReportParamPanel paramsPanel = null; private Button toggleParams; private ReportTemplate reportTemplate; + + private LiferayAccordion accordion; public ReportPanel(final ReportTemplate report) { + super(new CssLayout()); this.reportTemplate = report; - setStyleName(PANEL_STYLE_NAME); - ((AbstractLayout) getContent()).setMargin(false, false, false, false); - UiFactory.createSpacer(this, null, "6px"); - HorizontalLayout row = UiFactory.createHLayout(this, FAction.SET_FULL_WIDTH, FAction.SET_SPACING); - UiFactory.createLabel(report.getReportname(), row, REPORT_NAME_STYLE, FAction.ALIGN_LEFT); - UiFactory.createSpacer(row, FAction.SET_EXPAND_RATIO_1_0); - toggleParams = UiFactory.createButton(UiIds.LABEL_PARAMETERS, row, BaseTheme.BUTTON_LINK, new ClickListener() { + addStyleName(PANEL_STYLE_NAME); + addStyleName("invoker"); + //((AbstractLayout) getContent()).setMargin(false, false, false, false); + //UiFactory.createSpacer(this, null, "6px"); + CssLayout header = new CssLayout(); + UiFactory.createLabel(report.getReportname(), header); + toggleParams = UiFactory.createButton(UiIds.LABEL_PARAMETERS, header, BaseTheme.BUTTON_LINK, new ClickListener() { @Override public void buttonClick(ClickEvent event) { @@ -80,18 +86,17 @@ public void buttonClick(ClickEvent event) { } }); - UiFactory.createLabel(report.getDescription(), this, REPORT_DESCR_STYLE, FAction.SET_FULL_WIDTH); - - setWidth("100%"); + accordion = UiFactory.createAccordion(this, header); + this.setSizeUndefined(); } private void toggleParams() { if (paramsPanel == null) { paramsPanel = createParamsPanel(); - addComponent(paramsPanel); + accordion.addContent(paramsPanel); toggleParams.setCaption(VaadinUtil.getValue(UiIds.AR_MSG_HIDE_PARAMETERS)); } else { - removeComponent(paramsPanel); + accordion.removeContent(); paramsPanel = null; toggleParams.setCaption(VaadinUtil.getValue(UiIds.LABEL_PARAMETERS)); } @@ -99,10 +104,12 @@ private void toggleParams() { // xxx: could be better private ReportParamPanel createParamsPanel() { - final ReportParamPanel panel = new ReportParamPanel(reportTemplate, true); + final ReportParamPanel panel = new ReportParamPanel(reportTemplate, true); panel.setStyleName("borderless"); - HorizontalLayout hl = UiFactory.createHLayout(panel, FAction.SET_SPACING, FAction.SET_FULL_WIDTH); - UiFactory.createButton(UiIds.LABEL_GENERATE, hl, BaseTheme.BUTTON_LINK, new ClickListener() { + //HorizontalLayout hl = UiFactory.createHLayout(panel, FAction.SET_SPACING); + CssLayout hl = new CssLayout(); + panel.addComponent(hl); + Button reportParamBtn = UiFactory.createButton(UiIds.LABEL_GENERATE, hl, BaseTheme.BUTTON_LINK, new ClickListener() { @Override public void buttonClick(ClickEvent event) { @@ -110,7 +117,9 @@ public void buttonClick(ClickEvent event) { if (!panel.validateForm()) { return; } - ReportMaster rm = new ReportMaster(reportTemplate.getContent(), reportTemplate.getId().toString(), new ReportTemplateProvider()); + + ReportMaster rm = new ReportMaster(reportTemplate.getContent(), reportTemplate.getId().toString(), new ReportTemplateProvider(), user); + byte[] reportData = rm.generateAndExportReport(panel.getOuptutFormat(), new HashMap(panel.collectParametersValues()), ConfigurationCache.getConfiguration()); @@ -123,9 +132,10 @@ public void buttonClick(ClickEvent event) { } }); - + reportParamBtn.addStyleName("btn"); Button backgroundGenerate = UiFactory.createButton(UiIds.AR_MSG_GENERATE_IN_BACKGROUND, hl, BaseTheme.BUTTON_LINK); + backgroundGenerate.addStyleName("btn"); final CheckBox sendEmailCheckbox = UiFactory.createCheckBox(UiIds.AR_MSG_SEND_EMAIL, hl); backgroundGenerate.addListener(new ClickListener() { @@ -153,15 +163,16 @@ public void buttonClick(ClickEvent event) { sendEmailCheckbox.setEnabled(false); } - UiFactory.createSpacer(hl, FAction.SET_EXPAND_RATIO_1_0); - UiFactory.createButton(UiIds.LABEL_CLOSE, hl, new ClickListener() { + //UiFactory.createSpacer(hl, FAction.SET_EXPAND_RATIO_1_0); + /*Button reportParamBtn2 =UiFactory.createButton(UiIds.LABEL_CLOSE, hl, new ClickListener() { @Override public void buttonClick(ClickEvent event) { toggleParams(); } }, FAction.ALIGN_RIGTH); - + reportParamBtn2.addStyleName("btn"); + */ return panel; } @@ -177,8 +188,8 @@ private boolean backgorundGenerationAvail() { */ private void init() { setScrollable(true); - setStyleName(COMPONENT_STYLE_NAME); - + addStyleName(COMPONENT_STYLE_NAME); + addStyleName("accordion"); TextField filterField = UiFactory.createSearchBox(UiIds.LABEL_FILTER, this, new TextChangeListener() { @Override @@ -189,7 +200,7 @@ public void textChange(TextChangeEvent event) { }); filterField.setWidth("150px"); - reportList = new PaginatedPanelList(PAGE_SIZE) { + reportList = new CssPaginatedPanelList(PAGE_SIZE) { @Override protected ReportPanel transform(ReportTemplate object) { diff --git a/aperte-reports-ui/src/main/java/org/apertereports/components/CssPaginatedPanelList.java b/aperte-reports-ui/src/main/java/org/apertereports/components/CssPaginatedPanelList.java new file mode 100644 index 0000000..53d028e --- /dev/null +++ b/aperte-reports-ui/src/main/java/org/apertereports/components/CssPaginatedPanelList.java @@ -0,0 +1,174 @@ +package org.apertereports.components; + +import java.util.Collection; + +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.CssLayout; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Panel; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.themes.BaseTheme; +import org.apertereports.ui.UiFactory; +import org.apertereports.ui.UiFactory.FAction; +import org.apertereports.ui.UiIds; + +/** + * + * @author Zbigniew Malinowski + * + * Component paginating GUI lists. + * + * @param datamodel backing class + * @param class used to display properties of backing class objects in GUI + */ +@SuppressWarnings("serial") +public abstract class CssPaginatedPanelList extends CssLayout { + + private String filter; + private int pageSize; + private int listSize; + private int pageNumber; + + public CssPaginatedPanelList(int pageSize) { + this.pageSize = pageSize; + } + + /** + * Fetches filtered list's fragment. + * + * @return + */ + protected abstract Collection fetch(String filter, int firstResult, int maxResults); + + /** + * Creates GUI component displaying backing object's properties. + * + * @param object backing object + * @return GUI component + */ + protected abstract W transform(O object); + + /** + * Counts filtered list's size. + * + * @return + */ + protected abstract int getListSize(String filter); + + public void filter(String filter) { + this.filter = filter; + pageNumber = 0; + refresh(true); + } + + public void refresh() { + refresh(true); + } + + private void refresh(boolean getListSize) { + if (getListSize) { + listSize = getListSize(filter); + } + Collection list = fetch(filter, calculateFirstResult(), pageSize); + removeAllComponents(); + for (O o : list) { + addComponent(transform(o)); + } + if (listSize > pageSize) { + addFooter(); + } + } + + private int calculateFirstResult() { + return pageNumber * pageSize; + } + + private void addFooter() { + HorizontalLayout hl = UiFactory.createHLayout(this, FAction.SET_SPACING); + hl.setMargin(true, false, false, false); + if (hasPrevious()) { + Button tmpButton = UiFactory.createButton(UiIds.LABEL_PREVIOUS, hl, BaseTheme.BUTTON_LINK, new ClickListener() { + + @Override + public void buttonClick(ClickEvent event) { + previousPage(); + } + }); + tmpButton.addStyleName("btn"); + } else { + UiFactory.createLabel(UiIds.LABEL_PREVIOUS, hl); + } + for (int i = 0; i < countPages(); i++) { + final int pageIndex = i; + String caption = "" + (pageIndex + 1); + if (pageIndex == pageNumber) { + UiFactory.createLabel(caption, hl); + } else { + Button tmpButton2 = UiFactory.createButton(caption, hl, BaseTheme.BUTTON_LINK, new ClickListener() { + + @Override + public void buttonClick(ClickEvent event) { + showPage(pageIndex); + } + }); + tmpButton2.addStyleName("btn"); + } + } + if (hasNext()) { + Button tmpButton3 = UiFactory.createButton(UiIds.LABEL_NEXT, hl, BaseTheme.BUTTON_LINK, new ClickListener() { + + @Override + public void buttonClick(ClickEvent event) { + nextPage(); + } + }); + tmpButton3.addStyleName("btn"); + } else { + UiFactory.createLabel(UiIds.LABEL_NEXT, hl); + } + } + + private void showPage(int pageNumber) { + if (hasPage(pageNumber)) { + this.pageNumber = pageNumber; + refresh(false); + } + } + + private void nextPage() { + if (hasNext()) { + pageNumber++; + } + refresh(false); + } + + private void previousPage() { + if (hasPrevious()) { + pageNumber--; + } + refresh(false); + } + + private int countPages() { + + int count = listSize / pageSize + 1; + if (listSize % pageSize == 0) { + count--; + } + return count; + } + + private boolean hasPage(int pageNumber) { + return pageNumber >= 0 && pageNumber < countPages(); + } + + private boolean hasPrevious() { + return pageNumber > 0; + } + + private boolean hasNext() { + return pageNumber < countPages() - 1; + } +} diff --git a/aperte-reports-ui/src/main/java/org/apertereports/components/CyclicReportsComponent.java b/aperte-reports-ui/src/main/java/org/apertereports/components/CyclicReportsComponent.java index c533227..4c92581 100644 --- a/aperte-reports-ui/src/main/java/org/apertereports/components/CyclicReportsComponent.java +++ b/aperte-reports-ui/src/main/java/org/apertereports/components/CyclicReportsComponent.java @@ -102,7 +102,7 @@ public void buttonClick(ClickEvent event) { addNew(); } }, FAction.SET_INVISIBLE); - + addButton.addStyleName("btn"); list = new PaginatedPanelList(PAGE_SIZE) { @Override @@ -193,6 +193,7 @@ private void toggleEnable() { scheduleOrUnschedule(CyclicReportPanel.this.config); } }, FAction.ALIGN_RIGTH); + enabledButton.addStyleName("btn"); HorizontalLayout hl = UiFactory.createHLayout(row2); VerticalLayout vl = UiFactory.createVLayout(hl); UiFactory.createLabel(item, ORDER_RECIPIENT_EMAIL, vl); @@ -207,21 +208,23 @@ public void buttonClick(ClickEvent event) { toggleParamsPanel(); } }); - UiFactory.createButton(UiIds.LABEL_EDIT, row3, BaseTheme.BUTTON_LINK, new ClickListener() { + toggleParamsButton.addStyleName("btn"); + Button tmpButton = UiFactory.createButton(UiIds.LABEL_EDIT, row3, BaseTheme.BUTTON_LINK, new ClickListener() { @Override public void buttonClick(ClickEvent event) { edit(); } }); - UiFactory.createButton(UiIds.LABEL_DELETE, row3, BaseTheme.BUTTON_LINK, new ClickListener() { + tmpButton.addStyleName("btn"); + Button tmpButton2 = UiFactory.createButton(UiIds.LABEL_DELETE, row3, BaseTheme.BUTTON_LINK, new ClickListener() { @Override public void buttonClick(ClickEvent event) { remove(); } }); - + tmpButton2.addStyleName("btn"); } private String getStateLabelCaption() { @@ -264,9 +267,11 @@ private ReportParamPanel createParamsPanel() { final ReportParamPanel panel = new ReportParamPanel(config.getReport(), false, params); panel.setStyleName("borderless"); - HorizontalLayout hl = UiFactory.createHLayout(panel, FAction.SET_SPACING, FAction.SET_FULL_WIDTH); - - UiFactory.createButton(UiIds.LABEL_GENERATE, hl, BaseTheme.BUTTON_LINK, new ClickListener() { + CssLayout hl = new CssLayout() ; + panel.addComponent(hl); + //HorizontalLayout hl = UiFactory.createHLayout(panel, FAction.SET_SPACING, FAction.SET_FULL_WIDTH); + + Button tmpButton3 = UiFactory.createButton(UiIds.LABEL_GENERATE, hl, BaseTheme.BUTTON_LINK, new ClickListener() { @Override public void buttonClick(ClickEvent event) { @@ -275,7 +280,7 @@ public void buttonClick(ClickEvent event) { return; } ReportMaster rm = new ReportMaster(config.getReport().getContent(), config.getReport().getId().toString(), - new ReportTemplateProvider()); + new ReportTemplateProvider(),user); byte[] reportData = rm.generateAndExportReport(config.getOutputFormat(), new HashMap(panel.collectParametersValues()), ConfigurationCache.getConfiguration()); @@ -286,9 +291,9 @@ public void buttonClick(ClickEvent event) { } } }); - + tmpButton3.addStyleName("btn"); UiFactory.createSpacer(hl, FAction.SET_EXPAND_RATIO_1_0); - UiFactory.createButton(UiIds.LABEL_SAVE, hl, new ClickListener() { + Button tmpButton4 = UiFactory.createButton(UiIds.LABEL_SAVE, hl, new ClickListener() { @Override public void buttonClick(ClickEvent event) { @@ -301,15 +306,15 @@ public void buttonClick(ClickEvent event) { toggleParamsPanel(); } }, FAction.ALIGN_RIGTH); - - UiFactory.createButton(UiIds.LABEL_CANCEL, hl, new ClickListener() { + tmpButton4.addStyleName("btn"); + Button tmpButton5 = UiFactory.createButton(UiIds.LABEL_CANCEL, hl, new ClickListener() { @Override public void buttonClick(ClickEvent event) { toggleParamsPanel(); } }, FAction.ALIGN_RIGTH); - + tmpButton5.addStyleName("tmp"); return panel; } } @@ -333,30 +338,32 @@ private class EditCyclicReportPanel extends Panel { private boolean newItem; public EditCyclicReportPanel(CyclicReportConfig config, boolean newItem) { + super(new CssLayout()); this.newItem = newItem; this.config = config; - - setCaption(VaadinUtil.getValue(newItem ? UiIds.LABEL_ADDING : UiIds.LABEL_EDITION)); - + CssLayout layout = new CssLayout(); + UiFactory.createAccordion(this, VaadinUtil.getValue(newItem ? UiIds.LABEL_ADDING : UiIds.LABEL_EDITION),layout); setWidth("100%"); form = new EditCyclicReportForm(config); - addComponent(form); + layout.addComponent(form); UiFactory.createSpacer(this, null, "5px"); - HorizontalLayout buttons = UiFactory.createHLayout(this, FAction.SET_SPACING, FAction.SET_FULL_WIDTH); + HorizontalLayout buttons = UiFactory.createHLayout(layout, FAction.SET_SPACING, FAction.SET_FULL_WIDTH); UiFactory.createSpacer(buttons, FAction.SET_EXPAND_RATIO_1_0); - UiFactory.createButton(UiIds.LABEL_SAVE, buttons, new ClickListener() { + Button tmpButton5 = UiFactory.createButton(UiIds.LABEL_SAVE, buttons, new ClickListener() { @Override public void buttonClick(ClickEvent event) { save(); } }, FAction.ALIGN_RIGTH); - UiFactory.createButton(UiIds.LABEL_CANCEL, buttons, new ClickListener() { + tmpButton5.addStyleName("btn"); + Button tmpButton6 = UiFactory.createButton(UiIds.LABEL_CANCEL, buttons, new ClickListener() { @Override public void buttonClick(ClickEvent event) { cancel(); } }, FAction.ALIGN_RIGTH); + tmpButton6.addStyleName("btn"); } protected void cancel() { @@ -390,12 +397,14 @@ private void finish() { private class EditCyclicReportForm extends Form { - private GridLayout layout; + private FormLayout layout; public EditCyclicReportForm(CyclicReportConfig config) { - layout = new GridLayout(1, 5); - layout.setWidth("100%"); - layout.setSpacing(true); + // layout = new GridLayout(1, 5); + //layout.setWidth("100%"); + //layout.setSpacing(true); + + layout = new FormLayout(); setLayout(layout); setFormFieldFactory(new EditCyclicFormFactory()); setItemDataSource(new BeanItem(config)); @@ -408,19 +417,19 @@ public EditCyclicReportForm(CyclicReportConfig config) { @Override protected void attachField(Object propertyId, Field field) { if (propertyId.equals(ORDER_REPORT)) { - layout.addComponent(field, 0, 0); + layout.addComponent(field); layout.setComponentAlignment(field, Alignment.MIDDLE_LEFT); } else if (propertyId.equals(ORDER_OUTPUT_FORMAT)) { - layout.addComponent(field, 0, 1); + layout.addComponent(field); layout.setComponentAlignment(field, Alignment.MIDDLE_LEFT); } else if (propertyId.equals(ORDER_RECIPIENT_EMAIL)) { - layout.addComponent(field, 0, 2); + layout.addComponent(field); layout.setComponentAlignment(field, Alignment.MIDDLE_LEFT); } else if (propertyId.equals(ORDER_CRON_SPEC)) { - layout.addComponent(field, 0, 3); + layout.addComponent(field); layout.setComponentAlignment(field, Alignment.MIDDLE_LEFT); } else if (propertyId.equals(ORDER_DESCRIPTION)) { - layout.addComponent(field, 0, 4); + layout.addComponent(field); } } } diff --git a/aperte-reports-ui/src/main/java/org/apertereports/components/HelpButton.java b/aperte-reports-ui/src/main/java/org/apertereports/components/HelpButton.java index e88ae13..286ad5f 100644 --- a/aperte-reports-ui/src/main/java/org/apertereports/components/HelpButton.java +++ b/aperte-reports-ui/src/main/java/org/apertereports/components/HelpButton.java @@ -20,8 +20,8 @@ public HelpButton(final Module module, final Tab tab) { setDescription(VaadinUtil.getValue(UiIds.LABEL_HELP)); addStyleName(BaseTheme.BUTTON_LINK); setWidth(DEFAULT_WIDTH_IN_UNITS, UNITS_PIXELS); + addStyleName("btn"); addListener(new Button.ClickListener() { - @Override public void buttonClick(Button.ClickEvent event) { HelpWindow subwindow = new HelpWindow(module, tab); diff --git a/aperte-reports-ui/src/main/java/org/apertereports/components/LiferayAccordion.java b/aperte-reports-ui/src/main/java/org/apertereports/components/LiferayAccordion.java new file mode 100644 index 0000000..b0082ea --- /dev/null +++ b/aperte-reports-ui/src/main/java/org/apertereports/components/LiferayAccordion.java @@ -0,0 +1,49 @@ +package org.apertereports.components; + +import com.vaadin.ui.Component; +import com.vaadin.ui.ComponentContainer; +import com.vaadin.ui.CssLayout; + +public class LiferayAccordion extends CssLayout { + + CssLayout contentWrapper; + + public LiferayAccordion(CssLayout header, Component content) { + super(); + CssLayout topRow = new CssLayout(); + this.addComponent(topRow); + this.addStyleName("accordion-group lfr-panel lfr-panel-extended"); + topRow.addStyleName("accordion-heading toggler-header toggler-header-expanded"); + CssLayout row = new CssLayout(); + topRow.addComponent(row); + row.addStyleName("accordion-toggle"); + row.addStyleName("clear"); + row.addComponent(header); + + addContent(content); + } + + public void addContent(Component content) { + if (content != null) { + contentWrapper = new CssLayout(); + contentWrapper.addStyleName("toggler-content-wrapper"); + + CssLayout contentWrapperB = new CssLayout(); + contentWrapperB.addStyleName("toggler-content toggler-content-expanded"); + contentWrapper.addComponent(contentWrapperB); + + content.addStyleName("accordion-inner"); + contentWrapperB.addComponent(content); + + this.addComponent(contentWrapper); + content.setSizeUndefined(); + } + } + + public void removeContent() { + if (contentWrapper != null) { + this.removeComponent(contentWrapper); + } + } + +} diff --git a/aperte-reports-ui/src/main/java/org/apertereports/components/PaginatedPanelList.java b/aperte-reports-ui/src/main/java/org/apertereports/components/PaginatedPanelList.java index 7349864..753d25c 100644 --- a/aperte-reports-ui/src/main/java/org/apertereports/components/PaginatedPanelList.java +++ b/aperte-reports-ui/src/main/java/org/apertereports/components/PaginatedPanelList.java @@ -2,7 +2,7 @@ import java.util.Collection; - +import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.HorizontalLayout; @@ -88,13 +88,14 @@ private void addFooter() { HorizontalLayout hl = UiFactory.createHLayout(this, FAction.SET_SPACING); hl.setMargin(true, false, false, false); if (hasPrevious()) { - UiFactory.createButton(UiIds.LABEL_PREVIOUS, hl, BaseTheme.BUTTON_LINK, new ClickListener() { + Button tmpButton = UiFactory.createButton(UiIds.LABEL_PREVIOUS, hl, BaseTheme.BUTTON_LINK, new ClickListener() { @Override public void buttonClick(ClickEvent event) { previousPage(); } }); + tmpButton.addStyleName("btn"); } else { UiFactory.createLabel(UiIds.LABEL_PREVIOUS, hl); } @@ -104,23 +105,25 @@ public void buttonClick(ClickEvent event) { if (pageIndex == pageNumber) { UiFactory.createLabel(caption, hl); } else { - UiFactory.createButton(caption, hl, BaseTheme.BUTTON_LINK, new ClickListener() { + Button tmpButton2 = UiFactory.createButton(caption, hl, BaseTheme.BUTTON_LINK, new ClickListener() { @Override public void buttonClick(ClickEvent event) { showPage(pageIndex); } }); + tmpButton2.addStyleName("btn"); } } if (hasNext()) { - UiFactory.createButton(UiIds.LABEL_NEXT, hl, BaseTheme.BUTTON_LINK, new ClickListener() { + Button tmpButton3 = UiFactory.createButton(UiIds.LABEL_NEXT, hl, BaseTheme.BUTTON_LINK, new ClickListener() { @Override public void buttonClick(ClickEvent event) { nextPage(); } }); + tmpButton3.addStyleName("btn"); } else { UiFactory.createLabel(UiIds.LABEL_NEXT, hl); } diff --git a/aperte-reports-ui/src/main/java/org/apertereports/components/Popup.java b/aperte-reports-ui/src/main/java/org/apertereports/components/Popup.java index 85168df..631f9f9 100644 --- a/aperte-reports-ui/src/main/java/org/apertereports/components/Popup.java +++ b/aperte-reports-ui/src/main/java/org/apertereports/components/Popup.java @@ -3,6 +3,7 @@ import com.vaadin.data.Validator.InvalidValueException; import com.vaadin.event.ShortcutAction.KeyCode; import com.vaadin.ui.Button; +import com.vaadin.ui.CssLayout; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Form; import com.vaadin.ui.HorizontalLayout; @@ -30,16 +31,18 @@ public void init() { setWidth("300px"); // The cancel / apply buttons - HorizontalLayout buttons = UiFactory.createHLayout(this, FAction.SET_SPACING); - UiFactory.createButton(POPUP_DISCARD, buttons, null, new Button.ClickListener() { + //HorizontalLayout buttons = UiFactory.createHLayout(this, FAction.SET_SPACING); + CssLayout buttons = new CssLayout() ; + this.addComponent(buttons); + Button tmpButton1 = UiFactory.createButton(POPUP_DISCARD, buttons, null, new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { close(); } }, FAction.ALIGN_LEFT); - - UiFactory.createButton(POPUP_APPLY, buttons, new Button.ClickListener() { + tmpButton1.addStyleName("btn"); + Button tmpButton2 = UiFactory.createButton(POPUP_APPLY, buttons, new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { @@ -55,5 +58,6 @@ public void buttonClick(ClickEvent event) { } } }); + tmpButton2.addStyleName("btn"); } } diff --git a/aperte-reports-ui/src/main/java/org/apertereports/components/RefreshButton.java b/aperte-reports-ui/src/main/java/org/apertereports/components/RefreshButton.java index b22402b..57f45c5 100644 --- a/aperte-reports-ui/src/main/java/org/apertereports/components/RefreshButton.java +++ b/aperte-reports-ui/src/main/java/org/apertereports/components/RefreshButton.java @@ -14,6 +14,7 @@ public class RefreshButton extends Button { public RefreshButton(String caption, Button.ClickListener listener) { setDescription(caption); addStyleName(BaseTheme.BUTTON_LINK); + addStyleName("btn"); setWidth(DEFAULT_WIDTH_IN_UNITS, UNITS_PIXELS); addListener(listener); } diff --git a/aperte-reports-ui/src/main/java/org/apertereports/components/ReportManagerComponent.java b/aperte-reports-ui/src/main/java/org/apertereports/components/ReportManagerComponent.java index 0771c27..6720627 100644 --- a/aperte-reports-ui/src/main/java/org/apertereports/components/ReportManagerComponent.java +++ b/aperte-reports-ui/src/main/java/org/apertereports/components/ReportManagerComponent.java @@ -14,6 +14,12 @@ import java.io.ByteArrayOutputStream; import java.io.OutputStream; import java.util.*; + +import javax.naming.NamingException; + +import com.liferay.portal.security.auth.PrincipalThreadLocal; +import com.liferay.portal.service.UserLocalServiceUtil; + import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang.StringUtils; import org.apertereports.backbone.jms.ARJmsFacade; @@ -69,17 +75,20 @@ public class ReportManagerComponent extends Panel { private static final String MSG_REMOVING_REPORT = "report.manager.removing.report"; private static final String MSG_REPORT_IS_USED = "report.manager.report.is.used"; private static final String MSG_DO_YOU_WANT_TO_CONTINUE = "q.do.you.want.to.continue"; - private PaginatedPanelList list; + private CssPaginatedPanelList list; private ReportReceiver newReportReceiver; private transient User user; + public ReportManagerComponent() { - + super(new CssLayout()); init(); } private void init() { - VerticalLayout mainLayout = UiFactory.createVLayout(this); + CssLayout mainLayout = new CssLayout(); + mainLayout.addStyleName("a-config"); + this.addComponent(mainLayout); newReportReceiver = new ReportReceiver(new ReportTemplate()); newReportReceiver.addListener(new ReportReceivedListener() { @@ -89,12 +98,14 @@ public void reportReceived(ReportTemplate reportTemplate) { } }); Upload newReportUpload = new Upload(null, newReportReceiver); + newReportUpload.addStyleName("btn"); newReportUpload.addListener((SucceededListener) newReportReceiver); newReportUpload.addListener((FailedListener) newReportReceiver); newReportUpload.setButtonCaption(VaadinUtil.getValue(UiIds.LABEL_ADD)); newReportUpload.setImmediate(true); + HorizontalLayout hl = UiFactory.createHLayout(mainLayout, FAction.SET_FULL_WIDTH); - list = new PaginatedPanelList(PAGE_SIZE) { + list = new CssPaginatedPanelList(PAGE_SIZE) { @Override protected ReportItemPanel transform(ReportTemplate object) { @@ -124,7 +135,7 @@ public void textChange(TextChangeEvent event) { hl.addComponent(newReportUpload); hl.setComponentAlignment(newReportUpload, Alignment.MIDDLE_RIGHT); mainLayout.addComponent(list); - setWidth("100%"); + setWidth("95%"); setStyleName(PANEL_STYLE); } @@ -156,16 +167,26 @@ private class AddOrEditReportItemPanel extends Panel { private final boolean adding; public AddOrEditReportItemPanel(ReportItemPanel itemPanel, boolean adding) { + super(new CssLayout()); this.itemPanel = itemPanel; this.adding = adding; - setStyleName(EDIT_PANEL_STYLE); - setCaption(VaadinUtil.getValue(adding ? UiIds.LABEL_ADDING : UiIds.LABEL_EDITION) + " - " + itemPanel.reportTemplate.getReportname()); + addStyleName(EDIT_PANEL_STYLE); + + CssLayout header = new CssLayout(); + UiFactory.createLabel(VaadinUtil.getValue(adding ? UiIds.LABEL_ADDING : UiIds.LABEL_EDITION) + " - " + itemPanel.reportTemplate.getReportname(), header); + //setCaption(VaadinUtil.getValue(adding ? UiIds.LABEL_ADDING : UiIds.LABEL_EDITION) + " - " + itemPanel.reportTemplate.getReportname()); tmpReportTemplate = new ReportTemplate(); deepCopy(itemPanel.reportTemplate, tmpReportTemplate); beanItem = new BeanItem(tmpReportTemplate); - - HorizontalLayout headerRow = UiFactory.createHLayout(this, FAction.SET_FULL_WIDTH); - + + + + CssLayout subSubContent = new CssLayout(); + + UiFactory.createAccordion(this, header, subSubContent); + + HorizontalLayout headerRow = UiFactory.createHLayout(subSubContent,FAction.SET_FULL_WIDTH); + nameField = UiFactory.createTextField(beanItem, REPORTNAME_PROPERTY, headerRow, REPORT_MANAGER_ITEM_EDIT_NAME_PROMPT, FAction.ALIGN_LEFT); @@ -185,6 +206,7 @@ public void reportReceived(ReportTemplate reportTemplate) { }); Upload changeReportupload = new Upload(null, uploadReceiver); + changeReportupload.addStyleName("btn"); changeReportupload.setWidth(null); changeReportupload.addListener((Upload.SucceededListener) uploadReceiver); changeReportupload.addListener((Upload.FailedListener) uploadReceiver); @@ -192,38 +214,47 @@ public void reportReceived(ReportTemplate reportTemplate) { changeReportupload.setButtonCaption(VaadinUtil.getValue(REPORT_MANAGER_ITEM_UPLOAD_CHANGE)); uploadCell.addComponent(changeReportupload); - UiFactory.createTextField(beanItem, DESCRIPTION_PROPERTY, this, UiIds.AR_MANAGER_REPORT_DESCRIPTION, FAction.SET_FULL_WIDTH); + UiFactory.createTextField(beanItem, DESCRIPTION_PROPERTY, subSubContent, UiIds.AR_MANAGER_REPORT_DESCRIPTION, FAction.SET_FULL_WIDTH); - UiFactory.createSpacer(this, null, "5px"); - Label errorLabel = UiFactory.createLabel("", this); - UiFactory.createSpacer(this, null, "5px"); + //UiFactory.createSpacer(this, null, "5px"); + Label errorLabel = UiFactory.createLabel("", subSubContent); + //UiFactory.createSpacer(this, null, "5px"); errorHandler = new ErrorLabelHandler(errorLabel); - HorizontalLayout footerRow = UiFactory.createHLayout(this, FAction.SET_FULL_WIDTH); - - HorizontalLayout checkboxCell = UiFactory.createHLayout(footerRow, FAction.SET_SPACING); + //HorizontalLayout footerRow = UiFactory.createHLayout(this, FAction.SET_FULL_WIDTH); + CssLayout footerRow = new CssLayout() ; + subSubContent.addComponent(footerRow); + + //HorizontalLayout checkboxCell = UiFactory.createHLayout(footerRow, FAction.SET_SPACING); + CssLayout checkboxCell = new CssLayout() ; + footerRow.addComponent(checkboxCell); UiFactory.createCheckBox(UiIds.LABEL_ACTIVE, beanItem, ACTIVE_PROPERTY, checkboxCell); UiFactory.createCheckBox(REPORT_MANAGER_ITEM_EDIT_ONLINE, beanItem, ALLOW_ONLINE_DISPLAY_PROPERTY, checkboxCell); UiFactory.createCheckBox(REPORT_MANAGER_ITEM_EDIT_BACKGROUND, beanItem, ALLOW_BACKGROUND_PROCESSING_PROPERTY, checkboxCell); - HorizontalLayout buttonsCell = UiFactory.createHLayout(footerRow, FAction.SET_SPACING, FAction.ALIGN_RIGTH); - UiFactory.createButton(UiIds.LABEL_OK, buttonsCell, new ClickListener() { + //HorizontalLayout buttonsCell = UiFactory.createHLayout(footerRow, FAction.SET_SPACING, FAction.ALIGN_RIGTH); + CssLayout buttonsCell = new CssLayout() ; + footerRow.addComponent(buttonsCell); + Button tmpButton1 = UiFactory.createButton(UiIds.LABEL_OK, buttonsCell, new ClickListener() { @Override public void buttonClick(ClickEvent event) { saveChanges(); } }); - UiFactory.createButton(UiIds.LABEL_CANCEL, buttonsCell, new ClickListener() { + tmpButton1.addStyleName("btn"); + Button tmpButton2 = UiFactory.createButton(UiIds.LABEL_CANCEL, buttonsCell, new ClickListener() { @Override public void buttonClick(ClickEvent event) { discardChanges(); } }); + tmpButton2.addStyleName("btn"); + this.setSizeUndefined(); } protected void discardChanges() { @@ -240,6 +271,16 @@ protected void saveChanges() { } itemPanel.requestRepaintAll(); deepCopy(tmpReportTemplate, itemPanel.reportTemplate); + + try { + //set mandant id + com.liferay.portal.model.User liferayUser = UserLocalServiceUtil.getUser(PrincipalThreadLocal.getUserId()); + long companyid = liferayUser.getCompanyId(); + itemPanel.reportTemplate.setCompanyId(String.valueOf(companyid)); + } catch (Exception e) { + logger.error("Liferay User could not be found -> companyId could not be set", e); + } + ReportTemplateDAO.saveOrUpdate(itemPanel.reportTemplate); list.replaceComponent(this, this.itemPanel); } @@ -276,28 +317,38 @@ private class ReportItemPanel extends Panel { private ReportTemplate reportTemplate; private BeanItem beanItem; - private ReportParamPanel paramsPanel = null; + private Panel paramsPanel = null; private RolePermissionsPanel permsPanel = null; private Button toggleParamsButton; private Button togglePermsButton; + private CssLayout content; public ReportItemPanel(ReportTemplate reportTemplate) { + super(new CssLayout()); this.reportTemplate = reportTemplate; beanItem = new BeanItem(this.reportTemplate); - setStyleName(PANEL_STYLE); - HorizontalLayout headerRow = UiFactory.createHLayout(this, FAction.SET_FULL_WIDTH); - - UiFactory.createLabel(beanItem, REPORTNAME_PROPERTY, headerRow, - REPORT_NAME_STYLE, FAction.ALIGN_LEFT); - - UiFactory.createSpacer(headerRow); - - UiFactoryExt.createDateLabel(beanItem, CREATED_PROPERTY, CHANGED_DATE_STYLE, - headerRow, FAction.ALIGN_RIGTH); - - UiFactory.createLabel(beanItem, DESCRIPTION_PROPERTY, this, DESC_STYLE, FAction.SET_FULL_WIDTH); - - HorizontalLayout footerRow = UiFactory.createHLayout(this, FAction.SET_SPACING); + addStyleName(PANEL_STYLE); + + CssLayout header = new CssLayout(); + + //HorizontalLayout headerRow = UiFactory.createHLayout(this, FAction.SET_FULL_WIDTH); + + UiFactory.createLabel(beanItem, REPORTNAME_PROPERTY, header); + UiFactoryExt.createDateLabel(beanItem, CREATED_PROPERTY, "float-right", + header); + //UiFactory.createSpacer(headerRow); + + content = new CssLayout(); + + UiFactory.createAccordion(this, header, content); + + UiFactory.createLabel(beanItem, DESCRIPTION_PROPERTY, content, DESC_STYLE, FAction.SET_FULL_WIDTH); + + CssLayout footerRow = new CssLayout() ; + footerRow.addStyleName("button-row"); + content.addComponent(footerRow); + + //HorizontalLayout footerRow = UiFactory.createHLayout(this, FAction.SET_SPACING); toggleParamsButton = UiFactory.createButton(UiIds.LABEL_PARAMETERS, footerRow, BaseTheme.BUTTON_LINK, new ClickListener() { @Override @@ -305,6 +356,7 @@ public void buttonClick(ClickEvent event) { toggleParamsPanel(); } }); + toggleParamsButton.addStyleName("btn"); togglePermsButton = UiFactory.createButton(UiIds.LABEL_PERMISSIONS, footerRow, BaseTheme.BUTTON_LINK, new ClickListener() { @Override @@ -312,29 +364,32 @@ public void buttonClick(ClickEvent event) { togglePermsPanel(); } }); - UiFactory.createButton(UiIds.LABEL_EDIT, footerRow, BaseTheme.BUTTON_LINK, new ClickListener() { + togglePermsButton.addStyleName("btn"); + Button tmpButton1 = UiFactory.createButton(UiIds.LABEL_EDIT, footerRow, BaseTheme.BUTTON_LINK, new ClickListener() { @Override public void buttonClick(ClickEvent event) { addOrEditReport(ReportItemPanel.this, false); } }); - - UiFactory.createButton(UiIds.LABEL_DOWNLOAD, footerRow, BaseTheme.BUTTON_LINK, new ClickListener() { + tmpButton1.addStyleName("btn"); + Button tmpButton2 = UiFactory.createButton(UiIds.LABEL_DOWNLOAD, footerRow, BaseTheme.BUTTON_LINK, new ClickListener() { @Override public void buttonClick(ClickEvent event) { download(); } }); - - UiFactory.createButton(UiIds.LABEL_REMOVE, footerRow, BaseTheme.BUTTON_LINK, new ClickListener() { + tmpButton2.addStyleName("btn"); + Button tmpButton3 =UiFactory.createButton(UiIds.LABEL_REMOVE, footerRow, BaseTheme.BUTTON_LINK, new ClickListener() { @Override public void buttonClick(ClickEvent event) { removeMe(); } }); + tmpButton3.addStyleName("btn"); + this.setSizeUndefined(); } protected void removeMe() { @@ -344,10 +399,10 @@ protected void removeMe() { private void toggleParamsPanel() { if (paramsPanel == null) { paramsPanel = createParamsPanel(); - addComponent(paramsPanel); + content.addComponent(paramsPanel); toggleParamsButton.setCaption(VaadinUtil.getValue(UiIds.AR_MSG_HIDE_PARAMETERS)); } else { - removeComponent(paramsPanel); + content.removeComponent(paramsPanel); paramsPanel = null; toggleParamsButton.setCaption(VaadinUtil.getValue(UiIds.LABEL_PARAMETERS)); } @@ -356,7 +411,7 @@ private void toggleParamsPanel() { private void togglePermsPanel() { if (permsPanel == null) { permsPanel = new RolePermissionsPanel(reportTemplate); - addComponent(permsPanel); + content.addComponent(permsPanel); togglePermsButton.setCaption(VaadinUtil.getValue(UiIds.AR_MSG_HIDE_PERMISSIONS)); permsPanel.setCloseListener(new CloseListener() { @@ -367,18 +422,25 @@ public void close() { } }); } else { - removeComponent(permsPanel); + content.removeComponent(permsPanel); permsPanel = null; togglePermsButton.setCaption(VaadinUtil.getValue(UiIds.LABEL_PERMISSIONS)); } } // xxx: could be better - private ReportParamPanel createParamsPanel() { + private Panel createParamsPanel() { + CssLayout mainLayout = new CssLayout(); + CssLayout paramContent = new CssLayout(); + UiFactory.createAccordion(mainLayout, VaadinUtil.getValue(UiIds.LABEL_PARAMETERS), paramContent); + + final ReportParamPanel panel = new ReportParamPanel(reportTemplate, true); - panel.setCaption(VaadinUtil.getValue(UiIds.LABEL_PARAMETERS)); - HorizontalLayout hl = UiFactory.createHLayout(panel, FAction.SET_SPACING, FAction.SET_FULL_WIDTH); - UiFactory.createButton(UiIds.LABEL_GENERATE, hl, BaseTheme.BUTTON_LINK, new ClickListener() { + //panel.setCaption(VaadinUtil.getValue(UiIds.LABEL_PARAMETERS)); + CssLayout hl = new CssLayout(); + panel.addComponent(hl); + //HorizontalLayout hl = UiFactory.createHLayout(panel, FAction.SET_SPACING, FAction.SET_FULL_WIDTH); + Button tmpButton =UiFactory.createButton(UiIds.LABEL_GENERATE, hl, BaseTheme.BUTTON_LINK, new ClickListener() { @Override public void buttonClick(ClickEvent event) { @@ -386,7 +448,7 @@ public void buttonClick(ClickEvent event) { return; } try { - ReportMaster rm = new ReportMaster(reportTemplate.getContent(), reportTemplate.getId().toString(), new ReportTemplateProvider()); + ReportMaster rm = new ReportMaster(reportTemplate.getContent(), reportTemplate.getId().toString(), new ReportTemplateProvider(),user); byte[] reportData = rm.generateAndExportReport(panel.getOuptutFormat(), new HashMap(panel.collectParametersValues()), ConfigurationCache.getConfiguration()); @@ -398,8 +460,9 @@ public void buttonClick(ClickEvent event) { } }); - + tmpButton.addStyleName("tmp"); Button backgroundGenerate = UiFactory.createButton(UiIds.AR_MSG_GENERATE_IN_BACKGROUND, hl, BaseTheme.BUTTON_LINK); + backgroundGenerate.addStyleName("btn"); final CheckBox sendEmailCheckbox = UiFactory.createCheckBox(UiIds.AR_MSG_SEND_EMAIL, hl); backgroundGenerate.addListener(new ClickListener() { @@ -424,21 +487,24 @@ public void buttonClick(ClickEvent event) { backgroundGenerate.setEnabled(false); sendEmailCheckbox.setEnabled(false); } - UiFactory.createSpacer(hl, FAction.SET_EXPAND_RATIO_1_0); - UiFactory.createButton(UiIds.LABEL_CLOSE, hl, new ClickListener() { + //UiFactory.createSpacer(hl, FAction.SET_EXPAND_RATIO_1_0); + /*Button tmpButton2 = UiFactory.createButton(UiIds.LABEL_CLOSE, hl, new ClickListener() { @Override public void buttonClick(ClickEvent event) { toggleParamsPanel(); } }, FAction.ALIGN_RIGTH); - - return panel; + tmpButton2.addStyleName("btn");*/ + paramContent.addComponent(panel); + Panel p = new Panel(); + p.setContent(mainLayout); + return p; } private boolean backgorundGenerationAvail() { - return ARJmsFacade.isJmsAvailable() && Boolean.TRUE.equals(reportTemplate.getAllowBackgroundOrder()) - && reportTemplate.getActive(); + return ARJmsFacade.isJmsAvailable() && Boolean.TRUE.equals(reportTemplate.getAllowBackgroundOrder()) + && reportTemplate.getActive(); } private void download() { @@ -564,4 +630,4 @@ private static void deepCopy(ReportTemplate source, ReportTemplate target) { target.setReportname(source.getReportname()); target.setRolesWithAccess(new HashSet(source.getRolesWithAccess())); } -} +} \ No newline at end of file diff --git a/aperte-reports-ui/src/main/java/org/apertereports/components/ReportOrderBrowserComponent.java b/aperte-reports-ui/src/main/java/org/apertereports/components/ReportOrderBrowserComponent.java index 472d7e5..332a844 100644 --- a/aperte-reports-ui/src/main/java/org/apertereports/components/ReportOrderBrowserComponent.java +++ b/aperte-reports-ui/src/main/java/org/apertereports/components/ReportOrderBrowserComponent.java @@ -73,14 +73,14 @@ public void textChange(TextChangeEvent event) { UiFactory.createSpacer(header, "10px", null); UiFactory.createSpacer(header, FAction.SET_FULL_WIDTH, FAction.SET_EXPAND_RATIO_1_0); - UiFactory.createButton(UiIds.LABEL_REFRESH, header, new ClickListener() { + Button tmpButton1 = UiFactory.createButton(UiIds.LABEL_REFRESH, header, new ClickListener() { @Override public void buttonClick(ClickEvent event) { list.refresh(); } }); - + tmpButton1.addStyleName("btn"); list = new PaginatedPanelList(PAGE_SIZE) { @Override @@ -142,6 +142,7 @@ public void buttonClick(ClickEvent event) { showReport(); } }); + previewButton.addStyleName("btn"); Button parametersButton = UiFactory.createButton(UiIds.LABEL_PARAMETERS, grid, BaseTheme.BUTTON_LINK, new ClickListener() { @Override @@ -149,7 +150,7 @@ public void buttonClick(ClickEvent event) { toggleParams(); } }); - + parametersButton.addStyleName("btn"); if (order.getReportStatus() != Status.SUCCEEDED) { previewButton.setEnabled(false); } diff --git a/aperte-reports-ui/src/main/java/org/apertereports/components/ReportParamPanel.java b/aperte-reports-ui/src/main/java/org/apertereports/components/ReportParamPanel.java index 71e3d54..f75ca1d 100644 --- a/aperte-reports-ui/src/main/java/org/apertereports/components/ReportParamPanel.java +++ b/aperte-reports-ui/src/main/java/org/apertereports/components/ReportParamPanel.java @@ -2,6 +2,7 @@ import com.vaadin.ui.*; import com.vaadin.ui.Window.Notification; + import java.util.Map; import org.apertereports.backbone.util.ReportTemplateProvider; @@ -11,6 +12,8 @@ import org.apertereports.model.ReportTemplate; import java.util.List; + +import org.apertereports.common.users.User; import org.apertereports.common.xml.config.ReportConfigParameter; import org.apertereports.ui.UiFactory; import org.apertereports.util.VaadinUtil; @@ -20,17 +23,20 @@ public class ReportParamPanel extends Panel { private ReportParametersComponent reportParametersComponent; private HorizontalLayout buttons; - + public ReportParamPanel(ReportTemplate reportTemplate, boolean showFormat) { this(reportTemplate, showFormat, null); } public ReportParamPanel(ReportTemplate reportTemplate, boolean showFormat, List params) { - try { - ReportMaster rm = new ReportMaster(reportTemplate.getContent(), reportTemplate.getId().toString(), - new ReportTemplateProvider()); - this.reportParametersComponent = new ReportParametersComponent(rm, showFormat, params); - VerticalLayout vl = UiFactory.createVLayout(this); + super(new CssLayout()); + try { + ReportMaster rm = new ReportMaster(reportTemplate.getContent(), reportTemplate.getId().toString(), new ReportTemplateProvider()); + + this.reportParametersComponent = new ReportParametersComponent(rm, showFormat, params); + //VerticalLayout vl = UiFactory.createVLayout(this); + CssLayout vl = new CssLayout(); + this.addComponent(vl); vl.addComponent(reportParametersComponent); buttons = UiFactory.createHLayout(vl); } catch (ARException e) { @@ -56,7 +62,8 @@ public void addButtons(HorizontalLayout buttons) { public Map collectParametersValues() { return reportParametersComponent.collectParametersValues(); } - + + public String getOuptutFormat() { return reportParametersComponent.getSelectedFormat(); } diff --git a/aperte-reports-ui/src/main/java/org/apertereports/components/ReportParametersComponent.java b/aperte-reports-ui/src/main/java/org/apertereports/components/ReportParametersComponent.java index e36e1ca..0cbe229 100644 --- a/aperte-reports-ui/src/main/java/org/apertereports/components/ReportParametersComponent.java +++ b/aperte-reports-ui/src/main/java/org/apertereports/components/ReportParametersComponent.java @@ -14,6 +14,7 @@ import java.util.HashMap; import java.util.LinkedList; import java.util.List; +import java.util.Locale; import java.util.Map; import javax.script.Invocable; @@ -30,13 +31,16 @@ import org.apertereports.common.ARConstants; import org.apertereports.common.ARConstants.ReportType; import org.apertereports.common.exception.ARException; +import org.apertereports.common.users.User; +import org.apertereports.common.utils.LocaleUtils; import org.apertereports.common.utils.TextUtils; -import org.apertereports.common.utils.TimeUtils; import org.apertereports.common.wrappers.DictionaryItem; import org.apertereports.common.xml.config.ReportConfigParameter; import org.apertereports.engine.ReportMaster; import org.apertereports.engine.ReportParameter; import org.apertereports.engine.ReportProperty; +import org.apertereports.ui.UiFactoryExt; +import org.apertereports.ui.UiIds; import org.apertereports.util.ComponentFactory; import org.apertereports.util.NotificationUtil; import org.apertereports.util.VaadinUtil; @@ -44,6 +48,8 @@ import org.apertereports.util.wrappers.FieldContainer; import org.apertereports.util.wrappers.FieldProperties; import org.apertereports.util.wrappers.FilterContainer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.vaadin.data.Buffered; import com.vaadin.data.Validator; @@ -60,13 +66,6 @@ import com.vaadin.ui.Select; import com.vaadin.ui.TextArea; import com.vaadin.ui.TextField; -import java.util.Locale; -import org.apertereports.common.users.User; -import org.apertereports.common.utils.LocaleUtils; -import org.apertereports.ui.UiFactoryExt; -import org.apertereports.ui.UiIds; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Displays report parameters taken from JRXML parameters section as Vaadin @@ -74,733 +73,782 @@ */ public class ReportParametersComponent extends AbstractLazyLoaderComponent { - private Form form = new Form(); - private Map filters; - private List fields = new LinkedList(); - private ComboBox format; - private ComboBox localeComboBox; - private ReportMaster reportMaster; - private String reportSource; - private Integer cacheId; - private boolean includeReportFormat = true; - private boolean readonly = false; - private boolean includeLocale = true; - private boolean viewInitialized = false; - private final List params; - private static Logger logger = LoggerFactory.getLogger(ReportParametersComponent.class); - - public ReportParametersComponent(ReportMaster rm, boolean showFormat, List params) throws ARException { - this.reportMaster = rm; - this.includeReportFormat = showFormat; - if (params == null) { - params = new LinkedList(); - } - this.params = params; - - init(); - } - -// public ReportParametersComponent(String reportSource, Integer cacheId, boolean lazyLoad) throws AperteReportsException { -// this.reportSource = reportSource; -// this.cacheId = cacheId; -// if (!lazyLoad) { -// reportMaster = new ReportMaster(reportSource, cacheId.toString(), new ReportTemplateProvider()); -// init(); -// } -// } -// -// public ReportParametersComponent(String reportSource, Integer cacheId, ReportConfig reportConfig, -// boolean includeReportFormat, boolean lazyLoad) throws AperteReportsException { -// this.reportSource = reportSource; -// this.cacheId = cacheId; -// this.reportParameters = reportConfig != null ? reportConfig.getParameters() : null; -// this.includeReportFormat = includeReportFormat; -// if (!lazyLoad) { -// reportMaster = new ReportMaster(reportSource, cacheId.toString(), new ReportTemplateProvider()); -// init(); -// } -// } -// -// public ReportParametersComponent(String reportSource, Integer cacheId, List reportParameters, -// boolean includeReportFormat, boolean lazyLoad, boolean readonly) throws AperteReportsException { -// this.reportSource = reportSource; -// this.cacheId = cacheId; -// this.reportParameters = reportParameters; -// this.includeReportFormat = includeReportFormat; -// this.readonly = readonly; -// if (!lazyLoad) { -// reportMaster = new ReportMaster(reportSource, cacheId.toString(), new ReportTemplateProvider()); -// init(); -// } -// } -// -// public ReportParametersComponent(String reportSource, Integer cacheId, ReportConfig reportConfig, -// boolean includeReportFormat, boolean lazyLoad, boolean readonly) throws AperteReportsException { -// this.reportSource = reportSource; -// this.cacheId = cacheId; -// this.reportParameters = reportConfig != null ? reportConfig.getParameters() : null; -// this.includeReportFormat = includeReportFormat; -// this.readonly = readonly; -// if (!lazyLoad) { -// reportMaster = new ReportMaster(reportSource, cacheId.toString(), new ReportTemplateProvider()); -// init(); -// } -// } - /** - * Returns a map of report parameters collected from the generated form - * fields. - * - * @return A map of report parameters - */ - public Map collectParametersValues() { - Map parameters = new HashMap(fields.size()); - for (FieldContainer field : fields) { - if (field.getComponentType().equals(FILTER)) { - continue; - } - Object rawValue = field.getValue(); - if (rawValue == null) { - continue; - } - String value = TextUtils.encodeObjectToSQL(rawValue); - parameters.put(field.getName(), value); - } - - //xxxs move id to id, move management of user properties to base class (?) - parameters.put("login", getLogin()); -// xxx: use property set underneath the form - parameters.put(JRParameter.REPORT_LOCALE, localeComboBox.getValue() == null ? null : localeComboBox.getValue().toString()); - return parameters; - - } - - /** - * Returns Liferay login of the currently logged user. - * - * @return A user login - */ - //xxx user - private String getLogin() { - String login = ""; - try { - User user = ((AbstractReportingApplication) getApplication()).getArUser(); - if (user == null) { - return login; - } - login = user.getLogin(); - } catch (Exception e) { - logger.warn(VaadinUtil.getValue("liferay.get.login.exception"), e); - throw new RuntimeException(e); - } - if (login.contains("@")) { - login = login.split("@", 2)[0]; - } - return login; - } - - /** - * Returns selected report format. - * - * @return Format string - */ - public String getSelectedFormat() { - return format != null ? format.getValue().toString() : null; - } - - /** - * Lazily loads the data. - * - * @throws Exception on Jasper error - */ - @Override - public void lazyLoad() throws Exception { - reportMaster = new ReportMaster(reportSource, cacheId.toString(), new ReportTemplateProvider()); - init(); - } - - /** - * Validates all the fields in the form before commit. - * - * @return - * TRUE if the form is valid - */ - public boolean validateForm() { - boolean result = true; - for (FieldContainer field : fields) { - field.validate(); - } - try { - form.commit(); - } catch (Validator.InvalidValueException e) { - result = false; - } catch (Buffered.SourceException e) { - logger.error(e.getMessage(), e); - result = false; - } - return result; - } - - /** - * Builds a new field container carrying the generated Vaadin field with all - * its properties. Returns - * null on {@link BuildingFailedException} which may occur on - * special script invocation. - * - * @param param Report parameter - * @param fieldProperties Field properties - * @return A new field container - */ - private FieldContainer buildField(ReportParameter param, FieldProperties fieldProperties) { - try { - FieldContainer container = new FieldContainer(); - List items = null; - - // DICT_QUERY - if (StringUtils.isNotEmpty(fieldProperties.getDictQuery())) { - String login = getLogin(); - String dictQuery = fieldProperties.getDictQuery().replaceAll("\\$LOGIN", login); - items = org.apertereports.dao.DictionaryDAO.fetchDictionary(dictQuery); - } - - // DICT_ITEM_LIST - if (StringUtils.isNotEmpty(fieldProperties.getDictItemList())) { - items = org.apertereports.dao.DictionaryDAO.readDictionaryFromString(fieldProperties.getDictItemList()); - } - - // SPECIAL_DATA_QUERY_CODE - items = executeSpecialDataQueryCode(fieldProperties, items); - - // INPUT_TYPE - Field field = buildFieldBaseForInputType(fieldProperties, items, container); - - if (field != null) { - applyAttributes(fieldProperties, container, field); - } - - // obsluga kontrolek multi-level select: filter i filtered_select - if (fieldProperties.getInputType() == ARConstants.InputTypes.FILTERED_SELECT - || fieldProperties.getInputType() == ARConstants.InputTypes.FILTER) { - FilterContainer filterContainer = getFilterContainer(fieldProperties.getFilterGroup()); - filterContainer.addFilter((Select) field, fieldProperties.getLevel(), items); - container.setFieldComponent(filterContainer); - } - - // SPECIAL_VALIDATION_CODE - attachSpecialValidators(fieldProperties, container); - container.setComponentType(fieldProperties.getInputType()); - container.setOrder(fieldProperties.getOrder()); - container.setName(param.getName()); - return container; - } catch (BuildingFailedException e) { - throw new RuntimeException(e); - } - } - - /** - * Applies view options for the generated field. - * - * @param fieldProperties Field properties - * @param container Field container - * @param field Field the attributes are applied to - */ - protected void applyAttributes(FieldProperties fieldProperties, FieldContainer container, Field field) { - container.setFieldComponent(field); - - // WIDTH - if (StringUtils.isNotEmpty(fieldProperties.getWidth())) { - field.setWidth(StringUtils.lowerCase(fieldProperties.getWidth())); - } - - // SELECT_ALL - container.setSelectAll(fieldProperties.getSelectAll()); - - // - // VALIDATORS - // - - // REQUIRED - if (fieldProperties.isRequired()) { - field.setRequired(fieldProperties.isRequired()); - field.setRequiredError(VaadinUtil.getValue(fieldProperties.getRequiredError(), fieldProperties.getCaption())); - } - - // REGEXP - if (StringUtils.isNotEmpty(fieldProperties.getRegexp())) { - field.addValidator(new RegexpValidator(fieldProperties.getRegexp(), VaadinUtil.getValue( - fieldProperties.getRegexpError(), fieldProperties.getCaption(), fieldProperties.getRegexp()))); - } - - // MAXCHARS - if (StringUtils.isNotEmpty(fieldProperties.getMaxchars()) && field instanceof TextField) { - try { - ((TextField) field).setMaxLength(Integer.valueOf(fieldProperties.getMaxchars())); - } catch (NumberFormatException e) { - logger.error(e.getMessage(), e); - } - } - } - - /** - * Adds special validators using the invokable field property. - * - * @param fieldProperties Field properties - * @param container Field container - * @throws BuildingFailedException on script invocation error - */ - protected void attachSpecialValidators(FieldProperties fieldProperties, FieldContainer container) throws BuildingFailedException { - if (fieldProperties.getSei() != null && StringUtils.isNotEmpty(fieldProperties.getSpecialValidationCode())) { - try { - fieldProperties.getSe().eval(fieldProperties.getSpecialValidationCode()); - Validator validator = (Validator) fieldProperties.getSei().invokeFunction("specialValidator", - container, fieldProperties.getSpecialValidationError()); - container.addValidator(validator); - } catch (ScriptException e) { - NotificationUtil.showExceptionNotification(getWindow(), - "invoker.form.special_validation_code.script_exception", e); - logger.error(e.getMessage(), e); - throw new BuildingFailedException(e); - } catch (NoSuchMethodException e) { - NotificationUtil.showExceptionNotification(getWindow(), - "invoker.form.special_validation_code.no_such_method_exception", e); - logger.error(e.getMessage(), e); - throw new BuildingFailedException(e); - } - } - } - - /** - * Build a base Vaadin component for input field properties. - * - * @param fieldProperties Field properties - * @param items Dictionary items - * @param container Field container - * @return A newly created Vaadin field - * @throws BuildingFailedException on special control building error - */ - protected Field buildFieldBaseForInputType(FieldProperties fieldProperties, List items, - FieldContainer container) throws BuildingFailedException { - Field field = null; - switch (fieldProperties.getInputType()) { - case CHECKBOX: - field = new CheckBox(fieldProperties.getCaption()); - break; - case DATE: - DateField dateField = new DateField(fieldProperties.getCaption()) { - - @Override - protected Date handleUnparsableDateString(String dateString) throws ConversionException { - try { - return super.handleUnparsableDateString(dateString); - } catch (ConversionException e) { - throw new ConversionException(VaadinUtil.getValue("form.errors.unparsable_date", getCaption(), dateString), e); - } - } - }; - dateField.setDateFormat(TimeUtils.getDefaultDateFormat()); - dateField.setResolution(DateField.RESOLUTION_MIN); - field = dateField; - break; - case TEXTAREA: - TextArea text = new TextArea(fieldProperties.getCaption()); - text.setRows(3); - field = text; - break; - case MULTISELECT: - case SELECT: - Select select = new Select(fieldProperties.getCaption()); - select.setImmediate(true); - try { - for (DictionaryItem item : items) { - select.addItem(item.getCode()); - select.setItemCaption(item.getCode(), item.getDescription()); - } - } catch (NullPointerException e) { - NotificationUtil.showErrorNotification(getWindow(), - VaadinUtil.getValue("invoker.form.no_items_for_exception") + " " + fieldProperties.getCaption()); - throw new BuildingFailedException(e); - } - - select.setMultiSelect(fieldProperties.getInputType() == ARConstants.InputTypes.MULTISELECT); - select.setFilteringMode(AbstractSelect.Filtering.FILTERINGMODE_CONTAINS); - field = select; - break; - - case CHECKBOXES: - case RADIOBUTTONS: - OptionGroup optionGroup = new OptionGroup(fieldProperties.getCaption()); - try { - for (DictionaryItem item : items) { - optionGroup.addItem(item.getCode()); - optionGroup.setItemCaption(item.getCode(), item.getDescription()); - } - } catch (NullPointerException e) { - NotificationUtil.showErrorNotification(getWindow(), - VaadinUtil.getValue("invoker.form.no_items_for_exception") + " " + fieldProperties.getCaption()); - throw new BuildingFailedException(e); - } - optionGroup.setMultiSelect(fieldProperties.getInputType() == CHECKBOXES); - field = optionGroup; - break; - case FILTER: - case FILTERED_SELECT: - Select filterSelect = new Select(fieldProperties.getCaption()); - filterSelect.setImmediate(true); - filterSelect.setMultiSelect(fieldProperties.isMultipleChoice()); - field = filterSelect; - break; - case SPECIAL_CONTROL: - // SPECIAL_CONTROL_CODE - if (fieldProperties.getSei() != null && StringUtils.isNotEmpty(fieldProperties.getSpecialControlCode())) { - try { - fieldProperties.getSe().eval(fieldProperties.getSpecialControlCode()); - fieldProperties.getSei().invokeFunction("specialControl", container, items, - fieldProperties.getWidth(), fieldProperties.getMaxchars(), fieldProperties.isRequired(), - fieldProperties.getRequiredError(), fieldProperties.getRegexp(), - fieldProperties.getRegexpError(), fieldProperties.getCaption()); - } catch (ScriptException e) { - NotificationUtil.showExceptionNotification(getWindow(), - "invoker.form.special_control_code.script_exception", e); - logger.error(e.getMessage(), e); - throw new BuildingFailedException(e); - } catch (NoSuchMethodException e) { - NotificationUtil.showExceptionNotification(getWindow(), - "invoker.form.special_control_code.no_such_method_exception", e); - logger.error(e.getMessage(), e); - throw new BuildingFailedException(e); - } - } - Component component = container.getFieldComponent(); - if (component instanceof Field) { - field = (Field) component; - } - break; - - case TEXT: - default: - field = new TextField(fieldProperties.getCaption()); - break; - } - return field; - } - - /** - * Invokes a special script query using the invokable field property. If the - * invokable property is not present a default list is returned. - * - * @param fieldProperties Field properties - * @param items A default list of items - * @return Updated list of items - * @throws BuildingFailedException on script invocation error - */ - public List executeSpecialDataQueryCode(FieldProperties fieldProperties, - List items) throws BuildingFailedException { - if (fieldProperties.getSei() != null && StringUtils.isNotEmpty(fieldProperties.getSpecialDataQueryCode())) { - try { - DictionaryItemsWrapper itemsWrapper = new DictionaryItemsWrapper(); - fieldProperties.getSe().eval(fieldProperties.getSpecialDataQueryCode()); - fieldProperties.getSei().invokeFunction("specialQuery", itemsWrapper, fieldProperties.getDictQuery()); - items = itemsWrapper.getItems(); - } catch (ScriptException e) { - logger.error(e.getMessage(), e); - NotificationUtil.showExceptionNotification(getWindow(), - "invoker.form.special_data_query_code.script_exception", e); - throw new BuildingFailedException(e); - } catch (NoSuchMethodException e) { - logger.error(e.getMessage(), e); - NotificationUtil.showExceptionNotification(getWindow(), - "invoker.form.special_data_query_code.no_such_method_exception", e); - throw new BuildingFailedException(e); - } - } - return items; - } - - /** - * Creates a new filter container for specified filter identifier. - * - * @param filterId Input id - * @return A filter container - */ - private FilterContainer getFilterContainer(String filterId) { - if (filters == null) { - filters = new HashMap(); - } - if (!filters.containsKey(filterId)) { - filters.put(filterId, new FilterContainer()); - } - return filters.get(filterId); - } - - /** - * Retrieves the value from a report parameter properties. If the input type - * cannot be determined a default value is returned. - * - * @param props Input parameter properties - * @param key Search key type - * @param inputTypes Possible input types - * @param defaultValue Default value - * @return Parameter value - */ - private String getValueFromMap(Map props, ARConstants.Keys key, Enum[] inputTypes, - String defaultValue) { - if (props.containsKey(key)) { - String value = props.get(key).getValue(); - if (inputTypes == null) { - return value; - } - value = StringUtils.upperCase(value); - for (Enum enum1 : inputTypes) { - if (enum1.name().equals(value)) { - return value; - } - } - } - return defaultValue; - } - - /** - * Sets the build form as the composition root. - */ - private void init() { - setCompositionRoot(form); - form.setReadOnly(readonly); - } - - /** - * Loads data to generated Vaadin fields from the XML stored elsewhere. - */ - private void initFieldsFromConfig() { - - for (ReportConfigParameter param : params) { - - //xxx maybe it could be easier to have linked map as parameters instead of list - if (param.getName().equals(JRParameter.REPORT_LOCALE)) { - if (localeComboBox != null) { - Locale locale = LocaleUtils.createLocale(param.getValue()); - localeComboBox.setValue(locale); - } - continue; - } - - for (FieldContainer field : fields) { - if (param.getName().equals(field.getName())) { - try { - Field fieldComponent = field.getFieldComponent() instanceof Field ? (Field) field.getFieldComponent() : null; - Class fieldType = fieldComponent == null ? null - : fieldComponent.getPropertyDataSource() == null ? null - : fieldComponent.getPropertyDataSource().getType(); - if (DATE.equals(field.getComponentType())) { - fieldType = Date.class; - } else if (MULTISELECT.equals(field.getComponentType()) - || CHECKBOXES.equals(field.getComponentType()) - || FILTERED_SELECT.equals(field.getComponentType())) { - fieldType = Collection.class; - } - Object v = TextUtils.encodeSQLToObject(fieldType, param.getValue()); - field.setValue(v); - } catch (ParseException e) { - logger.error(e.getMessage(), e); - NotificationUtil.showExceptionNotification(getWindow(), VaadinUtil.getValue("exception.gui.error"), e); - throw new RuntimeException(e); - } - break; - } - } - } - } - - /** - * Creates a form with generated Vaadin fields. - */ - private void initView() { - //at the moment there is a chance that this method will be invoked twice per instance - //we want only on initialization process of the view - if (viewInitialized) { - return; - } - viewInitialized = true; - - List parameters = reportMaster.getParameters(); - for (ReportParameter param : parameters) { - Map props = param.getProperties(); - if (props == null || props.isEmpty()) { - continue; - } - FieldProperties fieldProperties = parseFieldProperties(param, props); - FieldContainer container = buildField(param, fieldProperties); - fields.add(container); - } - - // ORDER FIELDS - Collections.sort(fields, new Comparator() { - - @Override - public int compare(FieldContainer o1, FieldContainer o2) { - return o1.getOrder().compareTo(o2.getOrder()); - } - }); - - // ADD ALL FIELDS TO FORM - FormLayout layout = new FormLayout(); - form.setLayout(layout); - for (FieldContainer field : fields) { - if (field != null) { - field.placeYourselfInForm(form, layout); - } - } - - // ADD FORMAT SELECTION - if (includeReportFormat) { - format = ComponentFactory.createFormatCombo(ReportType.PDF, UiIds.LABEL_FORMAT); - format.setSizeUndefined(); - form.addField("format", format); - } - - if (includeLocale) { - localeComboBox = UiFactoryExt.createLocaleCombo(UiIds.LABEL_LOCALE, getLocale()); - form.addField(JRParameter.REPORT_LOCALE, localeComboBox); - } else { - form.setDescription(readonly ? VaadinUtil.getValue("invoker.form.header.readonly") : VaadinUtil.getValue("invoker.form.header")); - } - form.setImmediate(true); - form.setValidationVisible(true); - form.setValidationVisibleOnCommit(true); - form.setInvalidCommitted(false); - form.setWriteThrough(false); - } - - /** - * Populates Vaadin field properties based on report parameters taken from - * JRXML. - * - * @param param Report parameter - * @param props Parameter properties - * @return Filled field properties - */ - private FieldProperties parseFieldProperties(ReportParameter param, Map props) { - FieldProperties fieldProperties = new FieldProperties(); - - // INPUT_TYPE - String inputTypeString = getValueFromMap(props, ARConstants.Keys.INPUT_TYPE, ARConstants.InputTypes.values(), - ARConstants.InputTypes.CHECKBOX.name()); - fieldProperties.setInputType(ARConstants.InputTypes.valueOf(StringUtils.upperCase(inputTypeString))); - // WIDTH - fieldProperties.setWidth(getValueFromMap(props, ARConstants.Keys.WIDTH, null, "")); - - // CAPTION - String caption = getValueFromMap(props, ARConstants.Keys.LABEL, null, param.getName()); - fieldProperties.setCaption(StringUtils.capitaliseAllWords(StringUtils.lowerCase(caption))); - - // ORDER - String orderString = getValueFromMap(props, ARConstants.Keys.ORDER, null, "1000"); - try { - fieldProperties.setOrder(Integer.valueOf(orderString)); - } catch (NumberFormatException e) { - fieldProperties.setOrder(1000); - } - // REQUIRED - String requiredString = getValueFromMap(props, ARConstants.Keys.REQUIRED, ARConstants.BooleanValues.values(), - "false"); - fieldProperties.setRequired(Boolean.valueOf(requiredString)); - fieldProperties.setRequiredError(getValueFromMap(props, ARConstants.Keys.REQUIRED_ERROR, null, - "form.errors.required")); - - // REGEXP - fieldProperties.setRegexp(getValueFromMap(props, ARConstants.Keys.REGEXP, null, "")); - fieldProperties.setRegexpError(getValueFromMap(props, ARConstants.Keys.REGEXP_ERROR, null, "form.errors.regexp")); - - // MAXCHARS - fieldProperties.setMaxchars(getValueFromMap(props, ARConstants.Keys.MAXCHARS, null, "")); - - // LEVEL - String levelString = getValueFromMap(props, ARConstants.Keys.LEVEL, null, "1"); - try { - fieldProperties.setLevel(Integer.valueOf(levelString)); - } catch (NumberFormatException e) { - fieldProperties.setOrder(1); - } - - // FILTER_GROUP - fieldProperties.setFilterGroup(getValueFromMap(props, ARConstants.Keys.FILTER_GROUP, null, "")); - - // SELECT_ALL - String selectAllString = getValueFromMap(props, ARConstants.Keys.SELECT_ALL, ARConstants.BooleanValues.values(), - "false"); - fieldProperties.setSelectAll(Boolean.valueOf(selectAllString)); - - // MULTIPLE_CHOICE - String multipleChoiceString = getValueFromMap(props, ARConstants.Keys.MULTIPLE_CHOICE, - ARConstants.BooleanValues.values(), "false"); - fieldProperties.setMultipleChoice(Boolean.valueOf(multipleChoiceString)); - - // - // DATA FETCH - // - - // DICT_QUERY - fieldProperties.setDictQuery(getValueFromMap(props, ARConstants.Keys.DICT_QUERY, null, "")); - - fieldProperties.setDictItemList(getValueFromMap(props, ARConstants.Keys.DICT_ITEM_LIST, null, "")); - - // - // SCRIPTS - // - - // SCRIPT_LANGUAGE - String scriptLang = getValueFromMap(props, ARConstants.Keys.SCRIPT_LANGUAGE, null, ""); - if (StringUtils.isNotEmpty(scriptLang)) { - ScriptEngine se; - ScriptEngineManager sem = new ScriptEngineManager(); - try { - se = sem.getEngineByName(scriptLang); - } catch (NoSuchMethodError e) { - try { - se = sem.getEngineByName(scriptLang); - } catch (NoSuchMethodError e1) { - try { - se = sem.getEngineByName(scriptLang); - } catch (NoSuchMethodError e2) { - se = sem.getEngineByName(scriptLang); - } - } - } - Invocable sei = (Invocable) se; - fieldProperties.setSei(sei); - fieldProperties.setSe(se); - } - - // SPECIAL_CONTROL_CODE - fieldProperties.setSpecialControlCode(getValueFromMap(props, ARConstants.Keys.SPECIAL_CONTROL_CODE, null, "")); - - // SPECIAL_VALIDATION_CODE - fieldProperties.setSpecialValidationCode(getValueFromMap(props, ARConstants.Keys.SPECIAL_VALIDATION_CODE, null, - "")); - - // SPECIAL_VALIDATION_ERROR - fieldProperties.setSpecialValidationError(getValueFromMap(props, ARConstants.Keys.SPECIAL_VALIDATION_ERROR, null, - "")); - - // SPECIAL_DATA_QUERY_CODE - fieldProperties.setSpecialDataQueryCode(getValueFromMap(props, ARConstants.Keys.SPECIAL_DATA_QUERY_CODE, null, "")); - return fieldProperties; - } - - private class BuildingFailedException extends Exception { - - public BuildingFailedException(Throwable cause) { - super(cause); - } - } - - /** - * Attaches the component in the application. The reason the initialization - * of the view is here is that we need to access user's login which may be - * unavailable at th = nulle time of creation of the component. - */ - @Override - public void attach() { - super.attach(); - initView(); - initFieldsFromConfig(); - } + private Form form = new Form(); + private Map filters; + private List fields = new LinkedList(); + private ComboBox format; + private ComboBox localeComboBox; + private ReportMaster reportMaster; + private String reportSource; + private Integer cacheId; + private boolean includeReportFormat = true; + private boolean readonly = false; + private boolean includeLocale = true; + private boolean viewInitialized = false; + private final List params; + private static Logger logger = LoggerFactory.getLogger(ReportParametersComponent.class); + + public ReportParametersComponent(ReportMaster rm, boolean showFormat, List params) throws ARException { + this.reportMaster = rm; + this.includeReportFormat = showFormat; + if (params == null) { + params = new LinkedList(); + } + this.params = params; + init(); + } + + // public ReportParametersComponent(String reportSource, Integer cacheId, + // boolean lazyLoad) throws AperteReportsException { + // this.reportSource = reportSource; + // this.cacheId = cacheId; + // if (!lazyLoad) { + // reportMaster = new ReportMaster(reportSource, cacheId.toString(), new + // ReportTemplateProvider()); + // init(); + // } + // } + // + // public ReportParametersComponent(String reportSource, Integer cacheId, + // ReportConfig reportConfig, + // boolean includeReportFormat, boolean lazyLoad) throws + // AperteReportsException { + // this.reportSource = reportSource; + // this.cacheId = cacheId; + // this.reportParameters = reportConfig != null ? + // reportConfig.getParameters() : null; + // this.includeReportFormat = includeReportFormat; + // if (!lazyLoad) { + // reportMaster = new ReportMaster(reportSource, cacheId.toString(), new + // ReportTemplateProvider()); + // init(); + // } + // } + // + // public ReportParametersComponent(String reportSource, Integer cacheId, + // List reportParameters, + // boolean includeReportFormat, boolean lazyLoad, boolean readonly) throws + // AperteReportsException { + // this.reportSource = reportSource; + // this.cacheId = cacheId; + // this.reportParameters = reportParameters; + // this.includeReportFormat = includeReportFormat; + // this.readonly = readonly; + // if (!lazyLoad) { + // reportMaster = new ReportMaster(reportSource, cacheId.toString(), new + // ReportTemplateProvider()); + // init(); + // } + // } + // + // public ReportParametersComponent(String reportSource, Integer cacheId, + // ReportConfig reportConfig, + // boolean includeReportFormat, boolean lazyLoad, boolean readonly) throws + // AperteReportsException { + // this.reportSource = reportSource; + // this.cacheId = cacheId; + // this.reportParameters = reportConfig != null ? + // reportConfig.getParameters() : null; + // this.includeReportFormat = includeReportFormat; + // this.readonly = readonly; + // if (!lazyLoad) { + // reportMaster = new ReportMaster(reportSource, cacheId.toString(), new + // ReportTemplateProvider()); + // init(); + // } + // } + /** + * Returns a map of report parameters collected from the generated form + * fields. + * + * @return A map of report parameters + */ + public Map collectParametersValues() { + Map parameters = new HashMap(fields.size()); + for (FieldContainer field : fields) { + if (field.getComponentType().equals(FILTER)) { + continue; + } + + Object rawValue = field.getValue(); + if (rawValue == null) { + continue; + } + String value = TextUtils.encodeObjectToSQL(rawValue); + parameters.put(field.getName(), value); + + } + + // xxxs move id to id, move management of user properties to base class + // (?) + parameters.put("login", getLogin()); + User user = ((AbstractReportingApplication) getApplication()).getArUser(); + parameters.put("webid", user.getWebid()); + // xxx: use property set underneath the form + parameters.put(JRParameter.REPORT_LOCALE, localeComboBox.getValue() == null ? null : localeComboBox.getValue().toString()); + return parameters; + + } + + /** + * Returns Liferay login of the currently logged user. + * + * @return A user login + */ + // xxx user + private String getLogin() { + String login = ""; + try { + User user = ((AbstractReportingApplication) getApplication()).getArUser(); + if (user == null) { + return login; + } + login = user.getLogin(); + } catch (Exception e) { + logger.warn(VaadinUtil.getValue("liferay.get.login.exception"), e); + throw new RuntimeException(e); + } + if (login.contains("@")) { + login = login.split("@", 2)[0]; + } + return login; + } + + /** + * Returns selected report format. + * + * @return Format string + */ + public String getSelectedFormat() { + return format != null ? format.getValue().toString() : null; + } + + /** + * Lazily loads the data. + * + * @throws Exception + * on Jasper error + */ + @Override + public void lazyLoad() throws Exception { + reportMaster = new ReportMaster(reportSource, cacheId.toString(), new ReportTemplateProvider()); + init(); + } + + /** + * Validates all the fields in the form before commit. + * + * @return TRUE if the form is valid + */ + public boolean validateForm() { + boolean result = true; + for (FieldContainer field : fields) { + field.validate(); + } + try { + form.commit(); + } catch (Validator.InvalidValueException e) { + result = false; + } catch (Buffered.SourceException e) { + logger.error(e.getMessage(), e); + result = false; + } + return result; + } + + /** + * Builds a new field container carrying the generated Vaadin field with all + * its properties. Returns null on + * {@link BuildingFailedException} which may occur on special script + * invocation. + * + * @param param + * Report parameter + * @param fieldProperties + * Field properties + * @return A new field container + */ + private FieldContainer buildField(ReportParameter param, FieldProperties fieldProperties) { + try { + FieldContainer container = new FieldContainer(); + List items = null; + User user = ((AbstractReportingApplication) getApplication()).getArUser(); + // DICT_QUERY + if (StringUtils.isNotEmpty(fieldProperties.getDictQuery())) { + String login = getLogin(); + String dictQuery = fieldProperties.getDictQuery().replaceAll("\\$LOGIN", login); + dictQuery = dictQuery.replaceAll(":webid", user.getWebid()); + items = org.apertereports.dao.DictionaryDAO.fetchDictionary(dictQuery); + } + + // DICT_ITEM_LIST + if (StringUtils.isNotEmpty(fieldProperties.getDictItemList())) { + items = org.apertereports.dao.DictionaryDAO.readDictionaryFromString(fieldProperties.getDictItemList()); + } + + // SPECIAL_DATA_QUERY_CODE + items = executeSpecialDataQueryCode(fieldProperties, items); + + // INPUT_TYPE + Field field = buildFieldBaseForInputType(fieldProperties, items, container); + + if (field != null) { + applyAttributes(fieldProperties, container, field); + } + + // obsluga kontrolek multi-level select: filter i filtered_select + if (fieldProperties.getInputType() == ARConstants.InputTypes.FILTERED_SELECT || fieldProperties.getInputType() == ARConstants.InputTypes.FILTER) { + FilterContainer filterContainer = getFilterContainer(fieldProperties.getFilterGroup()); + filterContainer.addFilter((Select) field, fieldProperties.getLevel(), items); + container.setFieldComponent(filterContainer); + } + + // SPECIAL_VALIDATION_CODE + attachSpecialValidators(fieldProperties, container); + container.setComponentType(fieldProperties.getInputType()); + container.setOrder(fieldProperties.getOrder()); + container.setName(param.getName()); + return container; + } catch (BuildingFailedException e) { + throw new RuntimeException(e); + } + } + + /** + * Applies view options for the generated field. + * + * @param fieldProperties + * Field properties + * @param container + * Field container + * @param field + * Field the attributes are applied to + */ + protected void applyAttributes(FieldProperties fieldProperties, FieldContainer container, Field field) { + container.setFieldComponent(field); + + // WIDTH + if (StringUtils.isNotEmpty(fieldProperties.getWidth())) { + field.setWidth(StringUtils.lowerCase(fieldProperties.getWidth())); + } + + // SELECT_ALL + container.setSelectAll(fieldProperties.getSelectAll()); + + // + // VALIDATORS + // + + // REQUIRED + if (fieldProperties.isRequired()) { + field.setRequired(fieldProperties.isRequired()); + field.setRequiredError(VaadinUtil.getValue(fieldProperties.getRequiredError(), fieldProperties.getCaption())); + } + + // REGEXP + if (StringUtils.isNotEmpty(fieldProperties.getRegexp())) { + field.addValidator(new RegexpValidator(fieldProperties.getRegexp(), VaadinUtil.getValue(fieldProperties.getRegexpError(), + fieldProperties.getCaption(), fieldProperties.getRegexp()))); + } + + // MAXCHARS + if (StringUtils.isNotEmpty(fieldProperties.getMaxchars()) && field instanceof TextField) { + try { + ((TextField) field).setMaxLength(Integer.valueOf(fieldProperties.getMaxchars())); + } catch (NumberFormatException e) { + logger.error(e.getMessage(), e); + } + } + } + + /** + * Adds special validators using the invokable field property. + * + * @param fieldProperties + * Field properties + * @param container + * Field container + * @throws BuildingFailedException + * on script invocation error + */ + protected void attachSpecialValidators(FieldProperties fieldProperties, FieldContainer container) throws BuildingFailedException { + if (fieldProperties.getSei() != null && StringUtils.isNotEmpty(fieldProperties.getSpecialValidationCode())) { + try { + fieldProperties.getSe().eval(fieldProperties.getSpecialValidationCode()); + Validator validator = (Validator) fieldProperties.getSei().invokeFunction("specialValidator", container, + fieldProperties.getSpecialValidationError()); + container.addValidator(validator); + } catch (ScriptException e) { + NotificationUtil.showExceptionNotification(getWindow(), "invoker.form.special_validation_code.script_exception", e); + logger.error(e.getMessage(), e); + throw new BuildingFailedException(e); + } catch (NoSuchMethodException e) { + NotificationUtil.showExceptionNotification(getWindow(), "invoker.form.special_validation_code.no_such_method_exception", e); + logger.error(e.getMessage(), e); + throw new BuildingFailedException(e); + } + } + } + + /** + * Build a base Vaadin component for input field properties. + * + * @param fieldProperties + * Field properties + * @param items + * Dictionary items + * @param container + * Field container + * @return A newly created Vaadin field + * @throws BuildingFailedException + * on special control building error + */ + protected Field buildFieldBaseForInputType(FieldProperties fieldProperties, List items, FieldContainer container) + throws BuildingFailedException { + Field field = null; + switch (fieldProperties.getInputType()) { + case CHECKBOX: + field = new CheckBox(fieldProperties.getCaption()); + break; + case DATE: + DateField dateField = new DateField(fieldProperties.getCaption()) { + + @Override + protected Date handleUnparsableDateString(String dateString) throws ConversionException { + try { + return super.handleUnparsableDateString(dateString); + } catch (ConversionException e) { + throw new ConversionException(VaadinUtil.getValue("form.errors.unparsable_date", getCaption(), dateString), e); + } + } + }; + dateField.setDateFormat(VaadinUtil.getValue(UiIds.COMMON_TIMEDATE_FORMAT)); + dateField.setResolution(DateField.RESOLUTION_DAY); + field = dateField; + break; + case TEXTAREA: + TextArea text = new TextArea(fieldProperties.getCaption()); + text.setRows(3); + field = text; + break; + case MULTISELECT: + case SELECT: + Select select = new Select(fieldProperties.getCaption()); + select.setImmediate(true); + try { + for (DictionaryItem item : items) { + select.addItem(item.getCode()); + select.setItemCaption(item.getCode(), item.getDescription()); + } + } catch (NullPointerException e) { + NotificationUtil.showErrorNotification(getWindow(), + VaadinUtil.getValue("invoker.form.no_items_for_exception") + " " + fieldProperties.getCaption()); + throw new BuildingFailedException(e); + } + + select.setMultiSelect(fieldProperties.getInputType() == ARConstants.InputTypes.MULTISELECT); + select.setFilteringMode(AbstractSelect.Filtering.FILTERINGMODE_CONTAINS); + field = select; + break; + + case CHECKBOXES: + case RADIOBUTTONS: + OptionGroup optionGroup = new OptionGroup(fieldProperties.getCaption()); + try { + for (DictionaryItem item : items) { + optionGroup.addItem(item.getCode()); + optionGroup.setItemCaption(item.getCode(), item.getDescription()); + } + } catch (NullPointerException e) { + NotificationUtil.showErrorNotification(getWindow(), + VaadinUtil.getValue("invoker.form.no_items_for_exception") + " " + fieldProperties.getCaption()); + throw new BuildingFailedException(e); + } + optionGroup.setMultiSelect(fieldProperties.getInputType() == CHECKBOXES); + field = optionGroup; + break; + case FILTER: + case FILTERED_SELECT: + Select filterSelect = new Select(fieldProperties.getCaption()); + filterSelect.setImmediate(true); + filterSelect.setMultiSelect(fieldProperties.isMultipleChoice()); + field = filterSelect; + break; + case SPECIAL_CONTROL: + // SPECIAL_CONTROL_CODE + if (fieldProperties.getSei() != null && StringUtils.isNotEmpty(fieldProperties.getSpecialControlCode())) { + try { + fieldProperties.getSe().eval(fieldProperties.getSpecialControlCode()); + fieldProperties.getSei().invokeFunction("specialControl", container, items, fieldProperties.getWidth(), fieldProperties.getMaxchars(), + fieldProperties.isRequired(), fieldProperties.getRequiredError(), fieldProperties.getRegexp(), fieldProperties.getRegexpError(), + fieldProperties.getCaption()); + } catch (ScriptException e) { + NotificationUtil.showExceptionNotification(getWindow(), "invoker.form.special_control_code.script_exception", e); + logger.error(e.getMessage(), e); + throw new BuildingFailedException(e); + } catch (NoSuchMethodException e) { + NotificationUtil.showExceptionNotification(getWindow(), "invoker.form.special_control_code.no_such_method_exception", e); + logger.error(e.getMessage(), e); + throw new BuildingFailedException(e); + } + } + Component component = container.getFieldComponent(); + if (component instanceof Field) { + field = (Field) component; + } + break; + + case TEXT: + default: + field = new TextField(fieldProperties.getCaption()); + break; + } + return field; + } + + /** + * Invokes a special script query using the invokable field property. If the + * invokable property is not present a default list is returned. + * + * @param fieldProperties + * Field properties + * @param items + * A default list of items + * @return Updated list of items + * @throws BuildingFailedException + * on script invocation error + */ + public List executeSpecialDataQueryCode(FieldProperties fieldProperties, List items) throws BuildingFailedException { + if (fieldProperties.getSei() != null && StringUtils.isNotEmpty(fieldProperties.getSpecialDataQueryCode())) { + try { + DictionaryItemsWrapper itemsWrapper = new DictionaryItemsWrapper(); + fieldProperties.getSe().eval(fieldProperties.getSpecialDataQueryCode()); + fieldProperties.getSei().invokeFunction("specialQuery", itemsWrapper, fieldProperties.getDictQuery()); + items = itemsWrapper.getItems(); + } catch (ScriptException e) { + logger.error(e.getMessage(), e); + NotificationUtil.showExceptionNotification(getWindow(), "invoker.form.special_data_query_code.script_exception", e); + throw new BuildingFailedException(e); + } catch (NoSuchMethodException e) { + logger.error(e.getMessage(), e); + NotificationUtil.showExceptionNotification(getWindow(), "invoker.form.special_data_query_code.no_such_method_exception", e); + throw new BuildingFailedException(e); + } + } + return items; + } + + /** + * Creates a new filter container for specified filter identifier. + * + * @param filterId + * Input id + * @return A filter container + */ + private FilterContainer getFilterContainer(String filterId) { + if (filters == null) { + filters = new HashMap(); + } + if (!filters.containsKey(filterId)) { + filters.put(filterId, new FilterContainer()); + } + return filters.get(filterId); + } + + /** + * Retrieves the value from a report parameter properties. If the input type + * cannot be determined a default value is returned. + * + * @param props + * Input parameter properties + * @param key + * Search key type + * @param inputTypes + * Possible input types + * @param defaultValue + * Default value + * @return Parameter value + */ + private String getValueFromMap(Map props, ARConstants.Keys key, Enum[] inputTypes, String defaultValue) { + if (props.containsKey(key)) { + String value = props.get(key).getValue(); + if (inputTypes == null) { + return value; + } + value = StringUtils.upperCase(value); + for (Enum enum1 : inputTypes) { + if (enum1.name().equals(value)) { + return value; + } + } + } + return defaultValue; + } + + /** + * Retrieves the datepatternVlaue from a report parameter property. If no + * value is set, default will be returned. + * + * @param props + * Input parameter properties + * @param key + * Search key type + * @param defaultValue + * Default value + * @return {@link String} + * @history MW-ITSD;15.12.2016 + */ + private String getValueFromMap(Map props, ARConstants.Keys key, String defaultValue) { + if (props.containsKey(key)) { + String value = props.get(key).getValue(); + if (value == null || value.trim().isEmpty()) { + return defaultValue; + } else { + return value; + } + } + return defaultValue; + } + + /** + * Sets the build form as the composition root. + */ + private void init() { + setCompositionRoot(form); + form.setReadOnly(readonly); + } + + /** + * Loads data to generated Vaadin fields from the XML stored elsewhere. + */ + private void initFieldsFromConfig() { + + for (ReportConfigParameter param : params) { + + // xxx maybe it could be easier to have linked map as parameters + // instead of list + if (param.getName().equals(JRParameter.REPORT_LOCALE)) { + if (localeComboBox != null) { + Locale locale = LocaleUtils.createLocale(param.getValue()); + localeComboBox.setValue(locale); + } + continue; + } + + for (FieldContainer field : fields) { + if (param.getName().equals(field.getName())) { + try { + Field fieldComponent = field.getFieldComponent() instanceof Field ? (Field) field.getFieldComponent() : null; + Class fieldType = fieldComponent == null ? null : fieldComponent.getPropertyDataSource() == null ? null : fieldComponent + .getPropertyDataSource().getType(); + if (DATE.equals(field.getComponentType())) { + fieldType = Date.class; + } else if (MULTISELECT.equals(field.getComponentType()) || CHECKBOXES.equals(field.getComponentType()) + || FILTERED_SELECT.equals(field.getComponentType())) { + fieldType = Collection.class; + } + Object v = TextUtils.encodeSQLToObject(fieldType, param.getValue()); + field.setValue(v); + } catch (ParseException e) { + logger.error(e.getMessage(), e); + NotificationUtil.showExceptionNotification(getWindow(), VaadinUtil.getValue("exception.gui.error"), e); + throw new RuntimeException(e); + } + break; + } + } + } + } + + /** + * Creates a form with generated Vaadin fields. + */ + private void initView() { + // at the moment there is a chance that this method will be invoked + // twice per instance + // we want only on initialization process of the view + if (viewInitialized) { + return; + } + viewInitialized = true; + + List parameters = reportMaster.getParameters(); + + for (ReportParameter param : parameters) { + Map props = param.getProperties(); + if (props == null || props.isEmpty()) { + continue; + } + FieldProperties fieldProperties = parseFieldProperties(param, props); + FieldContainer container = buildField(param, fieldProperties); + fields.add(container); + } + + // ORDER FIELDS + Collections.sort(fields, new Comparator() { + + @Override + public int compare(FieldContainer o1, FieldContainer o2) { + return o1.getOrder().compareTo(o2.getOrder()); + } + }); + + // ADD ALL FIELDS TO FORM + FormLayout layout = new FormLayout(); + form.setLayout(layout); + for (FieldContainer field : fields) { + if (field != null) { + field.placeYourselfInForm(form, layout); + } + } + + // ADD FORMAT SELECTION + if (includeReportFormat) { + format = ComponentFactory.createFormatCombo(ReportType.PDF, UiIds.LABEL_FORMAT); + format.setSizeUndefined(); + form.addField("format", format); + } + + if (includeLocale) { + localeComboBox = UiFactoryExt.createLocaleCombo(UiIds.LABEL_LOCALE, getLocale()); + form.addField(JRParameter.REPORT_LOCALE, localeComboBox); + } else { + form.setDescription(readonly ? VaadinUtil.getValue("invoker.form.header.readonly") : VaadinUtil.getValue("invoker.form.header")); + } + form.setImmediate(true); + form.setValidationVisible(true); + form.setValidationVisibleOnCommit(true); + form.setInvalidCommitted(false); + form.setWriteThrough(false); + } + + /** + * Populates Vaadin field properties based on report parameters taken from + * JRXML. + * + * @param param + * Report parameter + * @param props + * Parameter properties + * @return Filled field properties + */ + private FieldProperties parseFieldProperties(ReportParameter param, Map props) { + FieldProperties fieldProperties = new FieldProperties(); + + // INPUT_TYPE + String inputTypeString = getValueFromMap(props, ARConstants.Keys.INPUT_TYPE, ARConstants.InputTypes.values(), ARConstants.InputTypes.CHECKBOX.name()); + fieldProperties.setInputType(ARConstants.InputTypes.valueOf(StringUtils.upperCase(inputTypeString))); + // WIDTH + fieldProperties.setWidth(getValueFromMap(props, ARConstants.Keys.WIDTH, null, "")); + + // CAPTION + String caption = getValueFromMap(props, ARConstants.Keys.LABEL, null, param.getName()); + fieldProperties.setCaption(StringUtils.capitaliseAllWords(StringUtils.lowerCase(caption))); + + // ORDER + String orderString = getValueFromMap(props, ARConstants.Keys.ORDER, null, "1000"); + try { + fieldProperties.setOrder(Integer.valueOf(orderString)); + } catch (NumberFormatException e) { + fieldProperties.setOrder(1000); + } + // REQUIRED + String requiredString = getValueFromMap(props, ARConstants.Keys.REQUIRED, ARConstants.BooleanValues.values(), "false"); + fieldProperties.setRequired(Boolean.valueOf(requiredString)); + fieldProperties.setRequiredError(getValueFromMap(props, ARConstants.Keys.REQUIRED_ERROR, null, "form.errors.required")); + + // REGEXP + fieldProperties.setRegexp(getValueFromMap(props, ARConstants.Keys.REGEXP, null, "")); + fieldProperties.setRegexpError(getValueFromMap(props, ARConstants.Keys.REGEXP_ERROR, null, "form.errors.regexp")); + + // MAXCHARS + fieldProperties.setMaxchars(getValueFromMap(props, ARConstants.Keys.MAXCHARS, null, "")); + + // LEVEL + String levelString = getValueFromMap(props, ARConstants.Keys.LEVEL, null, "1"); + try { + fieldProperties.setLevel(Integer.valueOf(levelString)); + } catch (NumberFormatException e) { + fieldProperties.setOrder(1); + } + + // FILTER_GROUP + fieldProperties.setFilterGroup(getValueFromMap(props, ARConstants.Keys.FILTER_GROUP, null, "")); + + // SELECT_ALL + String selectAllString = getValueFromMap(props, ARConstants.Keys.SELECT_ALL, ARConstants.BooleanValues.values(), "false"); + fieldProperties.setSelectAll(Boolean.valueOf(selectAllString)); + + // MULTIPLE_CHOICE + String multipleChoiceString = getValueFromMap(props, ARConstants.Keys.MULTIPLE_CHOICE, ARConstants.BooleanValues.values(), "false"); + fieldProperties.setMultipleChoice(Boolean.valueOf(multipleChoiceString)); + + // + // DATA FETCH + // + + // DICT_QUERY + fieldProperties.setDictQuery(getValueFromMap(props, ARConstants.Keys.DICT_QUERY, null, "")); + + fieldProperties.setDictItemList(getValueFromMap(props, ARConstants.Keys.DICT_ITEM_LIST, null, "")); + + // + // SCRIPTS + // + + // SCRIPT_LANGUAGE + String scriptLang = getValueFromMap(props, ARConstants.Keys.SCRIPT_LANGUAGE, null, ""); + if (StringUtils.isNotEmpty(scriptLang)) { + ScriptEngine se; + ScriptEngineManager sem = new ScriptEngineManager(); + try { + se = sem.getEngineByName(scriptLang); + } catch (NoSuchMethodError e) { + try { + se = sem.getEngineByName(scriptLang); + } catch (NoSuchMethodError e1) { + try { + se = sem.getEngineByName(scriptLang); + } catch (NoSuchMethodError e2) { + se = sem.getEngineByName(scriptLang); + } + } + } + Invocable sei = (Invocable) se; + fieldProperties.setSei(sei); + fieldProperties.setSe(se); + } + + // SPECIAL_CONTROL_CODE + fieldProperties.setSpecialControlCode(getValueFromMap(props, ARConstants.Keys.SPECIAL_CONTROL_CODE, null, "")); + + // SPECIAL_VALIDATION_CODE + fieldProperties.setSpecialValidationCode(getValueFromMap(props, ARConstants.Keys.SPECIAL_VALIDATION_CODE, null, "")); + + // SPECIAL_VALIDATION_ERROR + fieldProperties.setSpecialValidationError(getValueFromMap(props, ARConstants.Keys.SPECIAL_VALIDATION_ERROR, null, "")); + + // SPECIAL_DATA_QUERY_CODE + fieldProperties.setSpecialDataQueryCode(getValueFromMap(props, ARConstants.Keys.SPECIAL_DATA_QUERY_CODE, null, "")); + return fieldProperties; + } + + private class BuildingFailedException extends Exception { + + public BuildingFailedException(Throwable cause) { + super(cause); + } + } + + /** + * Attaches the component in the application. The reason the initialization + * of the view is here is that we need to access user's login which may be + * unavailable at th = nulle time of creation of the component. + */ + @Override + public void attach() { + super.attach(); + initView(); + initFieldsFromConfig(); + } } diff --git a/aperte-reports-ui/src/main/java/org/apertereports/components/RolePermissionsPanel.java b/aperte-reports-ui/src/main/java/org/apertereports/components/RolePermissionsPanel.java index b534333..91ce690 100644 --- a/aperte-reports-ui/src/main/java/org/apertereports/components/RolePermissionsPanel.java +++ b/aperte-reports-ui/src/main/java/org/apertereports/components/RolePermissionsPanel.java @@ -28,12 +28,15 @@ public class RolePermissionsPanel extends Panel { private CloseListener closeListener = null; public RolePermissionsPanel(final ReportTemplate rt) { - + rt.isAccessibleForAllRoles(); - - setCaption(VaadinUtil.getValue(UiIds.LABEL_PERMISSIONS)); - VerticalLayout mainLayout = UiFactory.createVLayout(null); - ((AbstractLayout) mainLayout).setMargin(true, true, true, true); + //setCaption(VaadinUtil.getValue(UiIds.LABEL_PERMISSIONS)); + CssLayout mainLayout = new CssLayout(); + CssLayout content = new CssLayout(); + + UiFactory.createAccordion(mainLayout, VaadinUtil.getValue(UiIds.LABEL_PERMISSIONS), content); + + //((AbstractLayout) mainLayout).setMargin(true, true, true, true); setContent(mainLayout); boolean all = rt.isAccessibleForAllRoles(); @@ -58,33 +61,38 @@ public RolePermissionsPanel(final ReportTemplate rt) { } //initializing roles panel (layout) - final VerticalLayout rolesLayout = UiFactory.createVLayout(mainLayout, FAction.SET_SPACING); - + //final VerticalLayout rolesLayout = UiFactory.createVLayout(mainLayout, FAction.SET_SPACING); + final CssLayout rolesLayout = new CssLayout(); + rolesLayout.addStyleName("roles"); + content.addComponent(rolesLayout); HorizontalLayout allNoneButtons = UiFactory.createHLayout(rolesLayout, FAction.SET_SPACING); - UiFactory.createButton(UiIds.LABEL_ALL, allNoneButtons, BaseTheme.BUTTON_LINK, new ClickListener() { + Button tmpButton1 = UiFactory.createButton(UiIds.LABEL_ALL, allNoneButtons, BaseTheme.BUTTON_LINK, new ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { setWrappersSelected(true); } }); - UiFactory.createButton(UiIds.LABEL_NONE, allNoneButtons, BaseTheme.BUTTON_LINK, new ClickListener() { + tmpButton1.addStyleName("btn"); + Button tmpButton2 = UiFactory.createButton(UiIds.LABEL_NONE, allNoneButtons, BaseTheme.BUTTON_LINK, new ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { setWrappersSelected(false); } }); - + tmpButton2.addStyleName("btn"); for (UserRoleWrapper w : wrappers) { rolesLayout.addComponent(w.checkBox); } - UiFactory.createSpacer(mainLayout, null, "5px"); + //UiFactory.createSpacer(mainLayout, null, "5px"); - HorizontalLayout buttonsLayout = UiFactory.createHLayout(mainLayout, FAction.SET_SPACING, FAction.SET_FULL_WIDTH); - UiFactory.createSpacer(buttonsLayout, FAction.SET_EXPAND_RATIO_1_0); - UiFactory.createButton(UiIds.LABEL_OK, buttonsLayout, new Button.ClickListener() { + //HorizontalLayout buttonsLayout = UiFactory.createHLayout(mainLayout, FAction.SET_SPACING, FAction.SET_FULL_WIDTH); + CssLayout buttonsLayout = new CssLayout() ; + content.addComponent(buttonsLayout); + //UiFactory.createSpacer(buttonsLayout, FAction.SET_EXPAND_RATIO_1_0); + Button tmpButton3 = UiFactory.createButton(UiIds.LABEL_OK, buttonsLayout, new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { @@ -106,13 +114,15 @@ public void buttonClick(Button.ClickEvent event) { fireCloseListener(); } }, FAction.ALIGN_RIGTH); - UiFactory.createButton(UiIds.LABEL_CANCEL, buttonsLayout, new Button.ClickListener() { + tmpButton3.addStyleName("btn"); + Button tmpButton4 = UiFactory.createButton(UiIds.LABEL_CANCEL, buttonsLayout, new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { fireCloseListener(); } }, FAction.ALIGN_RIGTH); + tmpButton4.addStyleName("btn"); } /** diff --git a/aperte-reports-ui/src/main/java/org/apertereports/dashboard/AbstractDashboardComponent.java b/aperte-reports-ui/src/main/java/org/apertereports/dashboard/AbstractDashboardComponent.java index 7ab914b..7ee9279 100644 --- a/aperte-reports-ui/src/main/java/org/apertereports/dashboard/AbstractDashboardComponent.java +++ b/aperte-reports-ui/src/main/java/org/apertereports/dashboard/AbstractDashboardComponent.java @@ -1,15 +1,17 @@ package org.apertereports.dashboard; + import com.vaadin.ui.CustomComponent; + import org.apache.commons.codec.binary.Base64; import org.apertereports.util.cache.MapCache; - import org.apertereports.common.exception.ARRuntimeException; import org.apertereports.common.xml.config.ReportConfig; import org.apertereports.common.xml.config.XmlReportConfigLoader; import javax.portlet.PortletPreferences; import javax.portlet.PortletSession; + import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -25,11 +27,16 @@ * or show an edit form. */ public abstract class AbstractDashboardComponent extends CustomComponent { - protected List reportConfigs; + + + + protected List reportConfigs; protected String template; protected PortletPreferences preferences; protected PortletSession session; protected String portletId; + + /** * An instance of a {@link MapCache} for general caching purposes. @@ -98,6 +105,8 @@ protected void saveData() { * Loads preferences and initializes the view. */ public void initData() { + + prepareData(); initComponentData(); } diff --git a/aperte-reports-ui/src/main/java/org/apertereports/dashboard/EditDashboardComponentNew.java b/aperte-reports-ui/src/main/java/org/apertereports/dashboard/EditDashboardComponentNew.java index 1cd5983..583cec3 100644 --- a/aperte-reports-ui/src/main/java/org/apertereports/dashboard/EditDashboardComponentNew.java +++ b/aperte-reports-ui/src/main/java/org/apertereports/dashboard/EditDashboardComponentNew.java @@ -1,6 +1,10 @@ package org.apertereports.dashboard; +import java.util.HashMap; import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; import org.apertereports.common.xml.config.ReportConfig; import org.apertereports.common.xml.config.XmlReportConfigLoader; @@ -40,7 +44,7 @@ public class EditDashboardComponentNew extends AbstractDashboardComponent { private static final String DASHBOARD_EDIT_INPUT_PROMPT_REPORT_ID = "dashboard.edit.input-prompt.reportId"; private static final String DASHBOARD_EDIT_REQUIRED_ERROR_REPORT_ID = "dashboard.edit.required-error.reportId"; private static final String DASHBOARD_EDIT_CAPTION_REPORT_ID = "dashboard.edit.caption.reportId"; - private VerticalLayout paramsParentComponent; + private CssLayout paramsParentComponent; private ReportParamPanel paramsPanel = new ReportParamPanel(); private Form form; private Item datasource; @@ -50,22 +54,33 @@ public class EditDashboardComponentNew extends AbstractDashboardComponent { @Override protected void initComponentData() { - Panel mainPanel = UiFactory.createPanel(UiIds.LABEL_CONFIGURATION); - setCompositionRoot(mainPanel); + Panel superPanel = new Panel(new CssLayout()); + + setCompositionRoot(superPanel); + + CssLayout mainPanel = new CssLayout(); + UiFactory.createAccordion(superPanel, VaadinUtil.getValue(UiIds.LABEL_CONFIGURATION), mainPanel); app = (AbstractReportingApplication) getApplication(); - paramsParentComponent = UiFactory.createVLayout(mainPanel, FAction.SET_SPACING, FAction.SET_FULL_WIDTH); + //paramsParentComponent = UiFactory.createVLayout(mainPanel, FAction.SET_SPACING, FAction.SET_FULL_WIDTH); + paramsParentComponent = new CssLayout(); + mainPanel.addComponent(paramsParentComponent); HorizontalLayout reportRow = UiFactory.createHLayout(paramsParentComponent, FAction.SET_FULL_WIDTH); form = new EditDashboardForm(); reportRow.addComponent(form); - paramsParentComponent.addComponent(paramsPanel); - paramsPanel.setCaption(VaadinUtil.getValue(UiIds.LABEL_PARAMETERS)); + + CssLayout contentB = new CssLayout(); + contentB.addComponent(paramsPanel); + UiFactory.createAccordion(paramsParentComponent, VaadinUtil.getValue(UiIds.LABEL_PARAMETERS), contentB); + - HorizontalLayout hl = UiFactory.createHLayout(paramsParentComponent, FAction.SET_SPACING); - UiFactory.createButton(UiIds.LABEL_OK, hl, new ClickListener() { + //HorizontalLayout hl = UiFactory.createHLayout(paramsParentComponent, FAction.SET_SPACING); + CssLayout hl = new CssLayout() ; + paramsParentComponent.addComponent(hl); + Button tmpButton1 =UiFactory.createButton(UiIds.LABEL_OK, hl, new ClickListener() { @Override public void buttonClick(ClickEvent event) { @@ -79,7 +94,8 @@ public void buttonClick(ClickEvent event) { } } }); - UiFactory.createButton(UiIds.LABEL_CANCEL, hl, new ClickListener() { + tmpButton1.addStyleName("btn"); + Button tmpButton2 =UiFactory.createButton(UiIds.LABEL_CANCEL, hl, new ClickListener() { @Override public void buttonClick(ClickEvent event) { @@ -88,6 +104,7 @@ public void buttonClick(ClickEvent event) { } } }); + tmpButton2.addStyleName("btn"); } /** @@ -101,10 +118,10 @@ public void setCloseListener(CloseListener closeListener) { private class EditDashboardForm extends Form { - private GridLayout layout; + private CssLayout layout; + private Map subLayouts; public EditDashboardForm() { - reportConfig = getCurrentConfig(); ReportTemplate selectedReport = null; @@ -117,11 +134,13 @@ public EditDashboardForm() { } reloadParams(selectedReport); - layout = new GridLayout(3, 3); - layout.setSpacing(true); - layout.setWidth("100%"); + layout = new CssLayout(); + //layout.setSpacing(true); + //layout.setWidth("100%"); setLayout(layout); - + + subLayouts = new HashMap(); + setFormFieldFactory(new EditDashboardFieldFactory()); datasource = new PropertysetItem(); @@ -134,16 +153,24 @@ public EditDashboardForm() { @Override protected void attachField(Object propertyId, Field field) { - + CssLayout tmpLayout; + if(!subLayouts.containsKey(propertyId)){ + tmpLayout = new CssLayout(); + tmpLayout.addStyleName("conf-row"); + layout.addComponent(tmpLayout); + subLayouts.put(propertyId, tmpLayout); + }else{ + tmpLayout = subLayouts.get(propertyId); + } + if (propertyId.equals(REPORT)) { - layout.addComponent(field, 0, 0, 1, 0); + tmpLayout.addComponent(field); } else if (propertyId.equals(CACHE_TIMEOUT)) { - layout.addComponent(field, 2, 0); - layout.setComponentAlignment(field, Alignment.MIDDLE_RIGHT); + tmpLayout.addComponent(field); } else if (propertyId.equals(EXPORT_BUTTONS)) { - layout.addComponent(field, 0, 1, 2, 1); + tmpLayout.addComponent(field); } else if (propertyId.equals(REFRESH_BUTTON)) { - layout.addComponent(field, 0, 2, 2, 2); + tmpLayout.addComponent(field); } } @@ -200,7 +227,7 @@ private void reloadParams(ReportTemplate template) { newParamsPanel = new ReportParamPanel(template, false, reportConfig.getParameters()); } - newParamsPanel.setCaption(VaadinUtil.getValue(UiIds.LABEL_PARAMETERS)); + //newParamsPanel.setCaption(VaadinUtil.getValue(UiIds.LABEL_PARAMETERS)); paramsParentComponent.replaceComponent(paramsPanel, newParamsPanel); paramsPanel = newParamsPanel; } @@ -248,4 +275,4 @@ private ReportConfig getCurrentConfig() { } return reportConfigs.get(0); } -} +} \ No newline at end of file diff --git a/aperte-reports-ui/src/main/java/org/apertereports/dashboard/ReportViewComponent.java b/aperte-reports-ui/src/main/java/org/apertereports/dashboard/ReportViewComponent.java index f8f6ca2..7e2d01c 100644 --- a/aperte-reports-ui/src/main/java/org/apertereports/dashboard/ReportViewComponent.java +++ b/aperte-reports-ui/src/main/java/org/apertereports/dashboard/ReportViewComponent.java @@ -1,6 +1,7 @@ package org.apertereports.dashboard; import com.vaadin.ui.Panel; + import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -13,9 +14,11 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; + import net.sf.jasperreports.engine.JRExporterParameter; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.export.JRHtmlExporterParameter; + import org.apertereports.AbstractLazyLoaderComponent; import org.apertereports.AbstractReportingApplication; import org.apertereports.backbone.util.ReportTemplateProvider; @@ -24,6 +27,7 @@ import org.apertereports.common.ARConstants.ReportType; import org.apertereports.common.exception.ARException; import org.apertereports.common.exception.ARRuntimeException; +import org.apertereports.common.users.User; import org.apertereports.common.utils.TextUtils; import org.apertereports.common.utils.TimeUtils; import org.apertereports.common.wrappers.Pair; @@ -86,6 +90,7 @@ public ReportViewComponent(AbstractReportingApplication application, MapCache ca initInternalData(configs); reportPanel.setSizeFull(); + // reportPanel.setScrollable(false); reportPanel.getContent().setSizeUndefined(); reportPanel.getContent().setStyleName(AR_DASHBOARD_REPORT_PANEL_STYLE_ID); @@ -110,7 +115,9 @@ public ReportViewComponent(AbstractReportingApplication application, MapCache ca */ private void init() { if (template != null && !template.isEmpty()) { + final HtmlReportBuilder builder = new HtmlReportBuilder(application, this); + final int[] index = {0}; DashboardUtil.executeTemplateMatcherWithList(template, DashboardUtil.REPORT_TAG_PATTERN, new DashboardUtil.MatchHandlerWithList() { diff --git a/aperte-reports-ui/src/main/java/org/apertereports/dashboard/ViewDashboardComponent.java b/aperte-reports-ui/src/main/java/org/apertereports/dashboard/ViewDashboardComponent.java index cf01ac5..9cd672d 100644 --- a/aperte-reports-ui/src/main/java/org/apertereports/dashboard/ViewDashboardComponent.java +++ b/aperte-reports-ui/src/main/java/org/apertereports/dashboard/ViewDashboardComponent.java @@ -1,8 +1,11 @@ package org.apertereports.dashboard; + import com.vaadin.ui.Panel; import com.vaadin.ui.VerticalLayout; + import eu.livotov.tpt.gui.widgets.TPTLazyLoadingLayout; + import org.apertereports.AbstractReportingApplication; import org.apertereports.ui.UiFactory; @@ -12,17 +15,21 @@ */ public class ViewDashboardComponent extends AbstractDashboardComponent { - private VerticalLayout mainPanel = UiFactory.createVLayout(null); + private VerticalLayout mainPanel =UiFactory.createVLayout(null); + private Panel contentPanel = new Panel(); - public ViewDashboardComponent() { - contentPanel.setScrollable(true); - contentPanel.setStyleName("borderless light"); - contentPanel.setSizeFull(); - mainPanel.addComponent(contentPanel); - initData(); - setCompositionRoot(mainPanel); - } + public ViewDashboardComponent() { + + + contentPanel.setSizeFull(); + contentPanel.setStyleName("borderless light"); + contentPanel.setScrollable(true); + + mainPanel.addComponent(contentPanel); + initData(); + setCompositionRoot(contentPanel); + } /** * Initiates a lazy loading component on top of a {@link ReportViewComponent} @@ -32,5 +39,6 @@ public ViewDashboardComponent() { protected void initComponentData() { contentPanel.removeAllComponents(); contentPanel.addComponent(new TPTLazyLoadingLayout(new ReportViewComponent((AbstractReportingApplication) getApplication(), cache, template, reportConfigs, true), true)); + } -} +} \ No newline at end of file diff --git a/aperte-reports-ui/src/main/java/org/apertereports/dashboard/html/HtmlReportBuilder.java b/aperte-reports-ui/src/main/java/org/apertereports/dashboard/html/HtmlReportBuilder.java index 40080dd..c18374f 100644 --- a/aperte-reports-ui/src/main/java/org/apertereports/dashboard/html/HtmlReportBuilder.java +++ b/aperte-reports-ui/src/main/java/org/apertereports/dashboard/html/HtmlReportBuilder.java @@ -11,6 +11,9 @@ import net.sf.jasperreports.engine.export.JRHtmlExporter; import net.sf.jasperreports.engine.type.ModeEnum; import net.sf.jasperreports.engine.util.JRTypeSniffer; +import net.sf.jasperreports.renderers.DataRenderable; +import net.sf.jasperreports.engine.type.ImageTypeEnum; + import org.apertereports.util.DashboardUtil; import org.apertereports.util.FileStreamer; @@ -77,7 +80,7 @@ public class HtmlReportBuilder { */ private CustomLayout layout; private Application application; - + public HtmlReportBuilder(Application application, ReportDataProvider provider) { this.application = application; this.provider = provider; @@ -104,6 +107,7 @@ public CustomLayout createLayout() throws IOException { } } } + return layout; } @@ -158,17 +162,18 @@ private HorizontalLayout createReportButtons(final ReportConfig config, final Re buttons.setSpacing(true); if (parentConfig != null && componentId != null) { - UiFactory.createButton("dashboard.view.drill.up", buttons, new Button.ClickListener() { + Button tmpButton = UiFactory.createButton("dashboard.view.drill.up", buttons, new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { returnFromDrill(config, parentConfig, componentId); } }); + tmpButton.addStyleName("btn"); } List allowedFormats = config.getAllowedFormatsAsList(); for (final String format : allowedFormats) { - UiFactory.createButton(format, buttons, new Button.ClickListener() { + Button tmpButton = UiFactory.createButton(format, buttons, new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { @@ -179,15 +184,17 @@ public void buttonClick(Button.ClickEvent event) { } } }); + tmpButton.addStyleName("btn"); } if (Boolean.TRUE.equals(config.getAllowRefresh())) { - UiFactory.createButton(UiIds.LABEL_REFRESH, buttons, new Button.ClickListener() { + Button tmpButton = UiFactory.createButton(UiIds.LABEL_REFRESH, buttons, new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { refreshReport(config); } }); + tmpButton.addStyleName("btn"); } boolean first = true; @@ -319,6 +326,7 @@ private CustomLayout createReportComponent(ReportConfig config, boolean cached) reportLayout = new CustomLayout(new ByteArrayInputStream(reportHtml.getBytes())); reportLayout.setSizeUndefined(); reportLayout.setWidth(100, UNITS_PERCENTAGE); + } catch (IOException e) { logger.error(e.getMessage(), e); throw new RuntimeException(e); @@ -525,13 +533,14 @@ private StreamResource getJasperImageStreamResource(String imageId, JasperPrint jasperPrintList.add(jasperPrint); JRPrintImage image = JRHtmlExporter.getImage(jasperPrintList, imageId); - JRRenderable renderer = image.getRenderer(); - if (renderer.getType() == JRRenderable.TYPE_SVG) { - renderer = new JRWrappingSvgRenderer(renderer, new Dimension(image.getWidth(), image.getHeight()), - ModeEnum.OPAQUE == image.getModeValue() ? image.getBackcolor() : null); - } - String imageMimeType = JRTypeSniffer.getImageMimeType(renderer.getImageType()); - final ByteArrayInputStream inputStream = new ByteArrayInputStream(renderer.getImageData()); + DataRenderable renderer = (DataRenderable)image.getRenderer(); +// if (renderer.getType() == JRRenderable.TYPE_SVG) { +// renderer = new WrappingRenderToImageDataRenderer(renderer, new Dimension(image.getWidth(), image.getHeight()), +// ModeEnum.OPAQUE == image.getModeValue() ? image.getBackcolor() : null); +// } + byte[] data = renderer.getData(new SimpleJasperReportsContext()); + ImageTypeEnum imageMimeType = JRTypeSniffer.getImageTypeValue(data); + final ByteArrayInputStream inputStream = new ByteArrayInputStream(data); StreamResource streamResource = new StreamResource(new StreamResource.StreamSource() { @@ -541,7 +550,7 @@ public InputStream getStream() { } }, imageId, application); - streamResource.setMIMEType(imageMimeType); + streamResource.setMIMEType(imageMimeType.getMimeType()); return streamResource; } @@ -559,4 +568,4 @@ private String createDivAnchor(String componentId) { sb.append("

"); return sb.toString(); } -} +} \ No newline at end of file diff --git a/aperte-reports-ui/src/main/java/org/apertereports/ui/UiFactory.java b/aperte-reports-ui/src/main/java/org/apertereports/ui/UiFactory.java index bf5e2bf..6612696 100644 --- a/aperte-reports-ui/src/main/java/org/apertereports/ui/UiFactory.java +++ b/aperte-reports-ui/src/main/java/org/apertereports/ui/UiFactory.java @@ -4,6 +4,8 @@ import com.vaadin.event.FieldEvents.TextChangeListener; import com.vaadin.ui.*; import com.vaadin.ui.Button.ClickListener; + +import org.apertereports.components.LiferayAccordion; import org.apertereports.util.VaadinUtil; /** @@ -156,7 +158,7 @@ public static Label createLabel(String captionId, ComponentContainer parent) { * @return Label */ public static Label createLabel(String captionId, ComponentContainer parent, String style) { - return createLabel(captionId, parent, null, EMPTY_ACTION_TABLE); + return createLabel(captionId, parent, style, EMPTY_ACTION_TABLE); } /** @@ -273,6 +275,7 @@ public static Button createButton(String captionId, ComponentContainer parent, S if (listener != null) { button.addListener(listener); } + button.addStyleName("btn"); return button; } @@ -540,4 +543,27 @@ static void performActions(Component c, FAction[] actions) { } } } + + public static LiferayAccordion createAccordion(ComponentContainer parent, CssLayout header){ + return createAccordion(parent, header, null); + } + + public static LiferayAccordion createAccordion(ComponentContainer parent, String caption){ + CssLayout header = new CssLayout(); + UiFactory.createLabel(caption, header); + return createAccordion(parent, header); + } + + public static LiferayAccordion createAccordion(ComponentContainer parent, String caption, Component content){ + CssLayout header = new CssLayout(); + UiFactory.createLabel(caption, header); + return createAccordion(parent, header, content); + } + + public static LiferayAccordion createAccordion(ComponentContainer parent, CssLayout header, Component content){ + + LiferayAccordion acc = new LiferayAccordion(header, content); + parent.addComponent(acc); + return acc; + } } diff --git a/aperte-reports-ui/src/main/java/org/apertereports/ui/UiIds.java b/aperte-reports-ui/src/main/java/org/apertereports/ui/UiIds.java index 6ac06f3..b3d7e41 100644 --- a/aperte-reports-ui/src/main/java/org/apertereports/ui/UiIds.java +++ b/aperte-reports-ui/src/main/java/org/apertereports/ui/UiIds.java @@ -7,70 +7,75 @@ */ public final class UiIds { - /** - * Labels - */ - public static final String LABEL_ACTIVE = "label.active"; - public static final String LABEL_ADD = "label.add"; - public static final String LABEL_ADDING = "label.adding"; - public static final String LABEL_ADD_3DOTS = "label.add.3dots"; - public static final String LABEL_ALL = "label.all"; - public static final String LABEL_CANCEL = "label.cancel"; - public static final String LABEL_CLOSE = "label.close"; - public static final String LABEL_CONFIGURATION = "label.configuration"; - public static final String LABEL_DELETE = "label.delete"; - public static final String LABEL_DESCRIPTION = "label.description"; - public static final String LABEL_DETAILS = "label.details"; - public static final String LABEL_DISABLE = "label.disable"; - public static final String LABEL_DOWNLOAD = "label.download"; - public static final String LABEL_EDIT = "label.edit"; - public static final String LABEL_EDITION = "label.edition"; - public static final String LABEL_EMAIL = "label.email"; - public static final String LABEL_ENABLE = "label.enable"; - public static final String LABEL_ENABLED = "label.enabled"; - public static final String LABEL_FILTER = "label.filter"; - public static final String LABEL_FORMAT = "label.format"; - public static final String LABEL_GENERATE = "label.generate"; - public static final String LABEL_HELP = "label.help"; - public static final String LABEL_INDEX = "label.index"; - public static final String LABEL_LOCALE = "label.locale"; - public static final String LABEL_NEW = "label.new"; - public static final String LABEL_NEXT = "label.next"; - public static final String LABEL_NO = "label.no"; - public static final String LABEL_NONE = "label.none"; - public static final String LABEL_OK = "label.ok"; - public static final String LABEL_PARAMETERS = "label.parameters"; - public static final String LABEL_PERMISSIONS = "label.permissions"; - public static final String LABEL_PREVIEW = "label.preview"; - public static final String LABEL_PREVIOUS = "label.previous"; - public static final String LABEL_REFRESH = "label.refresh"; - public static final String LABEL_REMOVE = "label.remove"; - public static final String LABEL_RUN = "label.run"; - public static final String LABEL_SAVE = "label.save"; - public static final String LABEL_TYPE = "label.type"; - public static final String LABEL_UPDATE = "label.update"; - public static final String LABEL_UPLOAD = "label.upload"; - public static final String LABEL_YES = "label.yes"; - /** - * General messages - */ - public static final String AR_MSG_GENERATE_IN_BACKGROUND = "ar.msg.generate.in.background"; - public static final String AR_MSG_HIDE_PARAMETERS = "ar.msg.hide.parameters"; - public static final String AR_MSG_HIDE_PERMISSIONS = "ar.msg.hide.permissions"; - public static final String AR_MSG_SELECT_ALL = "ar.msg.select.all"; - public static final String AR_MSG_SEND_EMAIL = "ar.msg.send.email"; - /** - * Dashboard messages - */ - public static final String AR_DASHBOARD_SHOW_EXPORT_BUTTONS = "ar.dashboard.show.export.buttons"; - public static final String AR_DASHBOARD_SHOW_REFRESH_BUTTON = "ar.dashboard.show.refresh.button"; - /** - * Manager messages - */ - public static final String AR_MANAGER_ERR_ENTER_REPORT_NAME = "ar.manager.err.enter.report.name"; - public static final String AR_MANAGER_ERR_NAME_ALREDY_EXISTS = "ar.manager.err.name.alredy.exists"; - public static final String AR_MANAGER_REPORT_DESCRIPTION = "ar.manager.report.description"; + /** + * Labels + */ + public static final String LABEL_ACTIVE = "label.active"; + public static final String LABEL_ADD = "label.add"; + public static final String LABEL_ADDING = "label.adding"; + public static final String LABEL_ADD_3DOTS = "label.add.3dots"; + public static final String LABEL_ALL = "label.all"; + public static final String LABEL_CANCEL = "label.cancel"; + public static final String LABEL_CLOSE = "label.close"; + public static final String LABEL_CONFIGURATION = "label.configuration"; + public static final String LABEL_DELETE = "label.delete"; + public static final String LABEL_DESCRIPTION = "label.description"; + public static final String LABEL_DETAILS = "label.details"; + public static final String LABEL_DISABLE = "label.disable"; + public static final String LABEL_DOWNLOAD = "label.download"; + public static final String LABEL_EDIT = "label.edit"; + public static final String LABEL_EDITION = "label.edition"; + public static final String LABEL_EMAIL = "label.email"; + public static final String LABEL_ENABLE = "label.enable"; + public static final String LABEL_ENABLED = "label.enabled"; + public static final String LABEL_FILTER = "label.filter"; + public static final String LABEL_FORMAT = "label.format"; + public static final String LABEL_GENERATE = "label.generate"; + public static final String LABEL_HELP = "label.help"; + public static final String LABEL_INDEX = "label.index"; + public static final String LABEL_LOCALE = "label.locale"; + public static final String LABEL_NEW = "label.new"; + public static final String LABEL_NEXT = "label.next"; + public static final String LABEL_NO = "label.no"; + public static final String LABEL_NONE = "label.none"; + public static final String LABEL_OK = "label.ok"; + public static final String LABEL_PARAMETERS = "label.parameters"; + public static final String LABEL_PERMISSIONS = "label.permissions"; + public static final String LABEL_PREVIEW = "label.preview"; + public static final String LABEL_PREVIOUS = "label.previous"; + public static final String LABEL_REFRESH = "label.refresh"; + public static final String LABEL_REMOVE = "label.remove"; + public static final String LABEL_RUN = "label.run"; + public static final String LABEL_SAVE = "label.save"; + public static final String LABEL_TYPE = "label.type"; + public static final String LABEL_UPDATE = "label.update"; + public static final String LABEL_UPLOAD = "label.upload"; + public static final String LABEL_YES = "label.yes"; + /** + * General messages + */ + public static final String AR_MSG_GENERATE_IN_BACKGROUND = "ar.msg.generate.in.background"; + public static final String AR_MSG_HIDE_PARAMETERS = "ar.msg.hide.parameters"; + public static final String AR_MSG_HIDE_PERMISSIONS = "ar.msg.hide.permissions"; + public static final String AR_MSG_SELECT_ALL = "ar.msg.select.all"; + public static final String AR_MSG_SEND_EMAIL = "ar.msg.send.email"; + /** + * Dashboard messages + */ + public static final String AR_DASHBOARD_SHOW_EXPORT_BUTTONS = "ar.dashboard.show.export.buttons"; + public static final String AR_DASHBOARD_SHOW_REFRESH_BUTTON = "ar.dashboard.show.refresh.button"; + /** + * Manager messages + */ + public static final String AR_MANAGER_ERR_ENTER_REPORT_NAME = "ar.manager.err.enter.report.name"; + public static final String AR_MANAGER_ERR_NAME_ALREDY_EXISTS = "ar.manager.err.name.alredy.exists"; + public static final String AR_MANAGER_REPORT_DESCRIPTION = "ar.manager.report.description"; - private UiIds() { - } + /** + * Default timedate format + */ + public static final String COMMON_TIMEDATE_FORMAT = "common.timedate.format"; + + private UiIds() { + } } diff --git a/aperte-reports-ui/src/main/java/org/apertereports/util/AperteReportsDataHandler.java b/aperte-reports-ui/src/main/java/org/apertereports/util/AperteReportsDataHandler.java new file mode 100644 index 0000000..e95d0f1 --- /dev/null +++ b/aperte-reports-ui/src/main/java/org/apertereports/util/AperteReportsDataHandler.java @@ -0,0 +1,149 @@ +package org.apertereports.util; + +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import javax.portlet.PortletPreferences; + +import org.apertereports.common.users.User; +import org.apertereports.common.users.UserRole; +import org.apertereports.dao.ReportTemplateDAO; +import org.apertereports.model.ReportTemplate; + +import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.portal.kernel.exception.SystemException; +import com.liferay.portal.kernel.lar.BasePortletDataHandler; +import com.liferay.portal.kernel.lar.PortletDataContext; +import com.liferay.portal.kernel.lar.PortletDataHandlerBoolean; +import com.liferay.portal.kernel.lar.PortletDataHandlerControl; +import com.liferay.portal.kernel.lar.StagedModelDataHandlerUtil; +import com.liferay.portal.kernel.xml.Element; +import com.liferay.portal.model.Role; +import com.liferay.portal.security.auth.PrincipalThreadLocal; +import com.liferay.portal.service.CompanyLocalServiceUtil; +import com.liferay.portal.service.UserLocalServiceUtil; + +public class AperteReportsDataHandler extends BasePortletDataHandler { + + protected static final String NAMESPACE_REPORTS = "reports"; + + @Override + public PortletDataHandlerControl[] getExportControls() { + PortletDataHandlerBoolean reportsData = new PortletDataHandlerBoolean(NAMESPACE_REPORTS, "Reports", true, false); + return new PortletDataHandlerControl[] {reportsData}; + } + + @Override + public PortletDataHandlerControl[] getImportControls() { + return getExportControls(); + } + + @Override + protected String doExportData(PortletDataContext portletDataContext, String portletId, + PortletPreferences portletPreferences) throws Exception { + Element rootElement = addExportDataRootElement(portletDataContext); + + if (portletDataContext.getBooleanParameter(NAMESPACE_REPORTS, "Reports")) { + this.exportReports(portletDataContext); + } + + return getExportDataRootElementString(rootElement); + } + + @Override + protected PortletPreferences doImportData(PortletDataContext portletDataContext, String portletId, + PortletPreferences portletPreferences, String data) throws Exception { + + //Mit dem neuen Aperte JSF Portlet wird nur noch das "Invokerportlet_WAR_apertereportsportlet" exportiert. + //Darum muss ab sofort auf contains "Invokerportlet_WAR_apertereportsportlet" geprüft werden. + //Früher wurde auf contains "INSTANCE" geprüft. Die INSTANCE wird aber seit dem neuen Portlet nicht mehr exportiert + //Alte LARs funktionieren weiterhin, da deren portletId mit "Invokerportlet_WAR_apertereportsportlet_INSTANCE" beginnt + if (!portletId.contains("Invokerportlet_WAR_apertereportsportlet")) + return portletPreferences; + + Element productsElement = portletDataContext.getImportDataRootElement(); + + if (portletDataContext.getBooleanParameter(NAMESPACE_REPORTS, "Reports") + && productsElement.element("ReportTemplate") != null) { + + List eTables = (List) productsElement.element("ReportTemplate").elements(); + + for (Element eField : eTables) { + StagedModelDataHandlerUtil.importStagedModel(portletDataContext, eField); + } + } + + return portletPreferences; + } + + protected PortletPreferences doDeleteData(PortletDataContext portletDataContext, String portletId, + PortletPreferences portletPreferences) throws Exception { + + if (portletDataContext.addPrimaryKey( + AperteReportsDataHandler.class, "deleteData")) { + return portletPreferences; + } + this.deleteAllReports(); + + return portletPreferences; + } + + protected void exportReports(PortletDataContext portletDataContext) + throws Exception { + + Collection reportTemplates = ReportTemplateDAO.fetch(AperteReportsDataHandler.getAperteUser(), null, 0, 1000); + + for (ReportTemplate reportTemplate : reportTemplates) { + StagedReportTemplate stagedReport = new StagedReportTemplateImpl(reportTemplate); + StagedModelDataHandlerUtil.exportStagedModel(portletDataContext, stagedReport); + } + } + + + /* + * Get all reports and delete all reports + */ + protected void deleteAllReports() throws PortalException, SystemException{ + + //check if user PK is present + if(PrincipalThreadLocal.getUserId() == 0) + return; + + Collection reportTemplates = ReportTemplateDAO.fetch(AperteReportsDataHandler.getAperteUser(), null, 0, 1000); + + for (ReportTemplate reportTemplate : reportTemplates) { + ReportTemplateDAO.remove(reportTemplate); + } + + } + + /* + * In Anlehung an AbstractReportingApplication handleRenderRequest(...) + */ + public static User getAperteUser() throws PortalException, SystemException{ + + com.liferay.portal.model.User liferayUser = UserLocalServiceUtil.getUser(PrincipalThreadLocal.getUserId()); + com.liferay.portal.model.Company company = CompanyLocalServiceUtil.getCompany(liferayUser.getCompanyId()); + long userid= liferayUser.getUserId(); + long portletGroupId= liferayUser.getGroupId(); + long companyid = liferayUser.getCompanyId(); + String webid = company.getWebId(); + String login = liferayUser.getLogin(); + String email = liferayUser.getEmailAddress(); + Set roles = new HashSet(); + boolean admin = false; + + for (Role r : liferayUser.getRoles()) { + boolean adminRole = "administrator".equalsIgnoreCase(r.getName()); + UserRole ur = new UserRole(r.getName(), r.getRoleId(), adminRole); + roles.add(ur); + admin |= adminRole; + } + User user = new User(login, roles, admin, email, userid, portletGroupId, companyid, webid); + return user; + } + + +} diff --git a/aperte-reports-ui/src/main/java/org/apertereports/util/DashboardUtil.java b/aperte-reports-ui/src/main/java/org/apertereports/util/DashboardUtil.java index a4369e8..4b0d8c7 100644 --- a/aperte-reports-ui/src/main/java/org/apertereports/util/DashboardUtil.java +++ b/aperte-reports-ui/src/main/java/org/apertereports/util/DashboardUtil.java @@ -32,11 +32,13 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; + /** * Utility class with methods for report tags retrieval, regexp matching etc. */ -public final class DashboardUtil { +public final class DashboardUtil { private DashboardUtil() { + } /** @@ -258,4 +260,7 @@ public abstract static class MatchHandler { public abstract static class MatchHandlerWithList { public abstract void handleMatch(int start, int end, List match); } + + } + diff --git a/aperte-reports-ui/src/main/java/org/apertereports/util/NotificationUtil.java b/aperte-reports-ui/src/main/java/org/apertereports/util/NotificationUtil.java index a0fb3ee..5366bbd 100644 --- a/aperte-reports-ui/src/main/java/org/apertereports/util/NotificationUtil.java +++ b/aperte-reports-ui/src/main/java/org/apertereports/util/NotificationUtil.java @@ -24,33 +24,46 @@ private NotificationUtil() { } public static void notImplementedYet(Window window) { - window.showNotification(VaadinUtil.getValue("exception.not.implemented.title"), + Notification n = new Notification( + VaadinUtil.getValue("exception.not.implemented.title"), VaadinUtil.getValue("exception.not.implemented.description"), TYPE_WARNING_MESSAGE); + n.setStyleName("alert alert-warning"); + window.showNotification(n); } public static void showValidationErrors(Window window, String message) { - window.showNotification(VaadinUtil.getValue("notification.validation.errors.title"), "
" + message, + Notification n = new Notification(VaadinUtil.getValue("notification.validation.errors.title"), "
" + message, TYPE_ERROR_MESSAGE); + n.setStyleName("alert alert-danger"); + window.showNotification(n); } public static void showExceptionNotification(Window window, String prefix) { - window.showNotification(VaadinUtil.getValue(prefix + ".title"), + Notification n = new Notification(VaadinUtil.getValue(prefix + ".title"), "
" + VaadinUtil.getValue(prefix + ".description"), TYPE_ERROR_MESSAGE); + n.setStyleName("alert alert-danger"); + window.showNotification(n); } public static void showExceptionNotification(Window window, String prefix, Exception e) { - window.showNotification(VaadinUtil.getValue(prefix + ".title"), + Notification n = new Notification(VaadinUtil.getValue(prefix + ".title"), "
" + VaadinUtil.getValue(prefix + ".description") + ": " + e.getLocalizedMessage(), TYPE_ERROR_MESSAGE); + n.setStyleName("alert alert-danger"); + window.showNotification(n); } public static void showExceptionNotification(Window window, String prefix, Object... details) { - window.showNotification(VaadinUtil.getValue(prefix + ".title"), + Notification n = new Notification(VaadinUtil.getValue(prefix + ".title"), "
" + VaadinUtil.getValue(prefix + ".description", details), TYPE_ERROR_MESSAGE); + n.setStyleName("alert alert-danger"); + window.showNotification(n); } public static void showExceptionNotification(Window window, String title, String message) { - window.showNotification(title, "
" + message, TYPE_ERROR_MESSAGE); + Notification n = new Notification(title, "
" + message, TYPE_ERROR_MESSAGE); + n.setStyleName("alert alert-danger"); + window.showNotification(n); } public static void showExceptionNotification(Window window, ARRuntimeException exception) { @@ -61,21 +74,29 @@ public static void showExceptionNotification(Window window, ARRuntimeException e if (exception.getCause() != null && exception.getCause().getLocalizedMessage() != null) { description += "
" + exception.getCause().getLocalizedMessage(); } - window.showNotification(title, description, TYPE_ERROR_MESSAGE); + Notification n = new Notification(title, description, TYPE_ERROR_MESSAGE); + n.setStyleName("alert alert-danger"); + window.showNotification(n); } public static void showErrorNotification(Window window, String messageId) { - window.showNotification(VaadinUtil.getValue(messageId), TYPE_ERROR_MESSAGE); + Notification n = new Notification(VaadinUtil.getValue(messageId), TYPE_ERROR_MESSAGE); + n.setStyleName("alert alert-danger"); + window.showNotification(n); } public static void validationErrors(Window window) { - window.showNotification(VaadinUtil.getValue("exception.validation.errors.title"), + Notification n = new Notification(VaadinUtil.getValue("exception.validation.errors.title"), "
" + VaadinUtil.getValue("exception.validation.errors.description"), TYPE_WARNING_MESSAGE); + n.setStyleName("alert alert-warning"); + window.showNotification(n); } public static void validationErrors(Window window, String message) { - window.showNotification(VaadinUtil.getValue("exception.validation.errors.title"), + Notification n = new Notification(VaadinUtil.getValue("exception.validation.errors.title"), "
" + message + "", TYPE_ERROR_MESSAGE); + n.setStyleName("alert alert-danger"); + window.showNotification(n); } public static void showSavedNotification(Window window) { @@ -91,6 +112,7 @@ public static void showConfirmNotification(Window window, String prefix) { + VaadinUtil.getValue(prefix + ".desc") + "", TYPE_HUMANIZED_MESSAGE); notification.setPosition(POSITION_CENTERED); notification.setDelayMsec(2000); + notification.setStyleName("alert alert-danger"); window.showNotification(notification); } @@ -115,7 +137,7 @@ public void buttonClick(ClickEvent event) { } }); confirmButton.setImmediate(true); - + confirmButton.addStyleName("btn"); Button cancelButton = UiFactory.createButton(UiIds.LABEL_NO, null, new ClickListener() { @Override @@ -125,7 +147,7 @@ public void buttonClick(ClickEvent event) { } }); cancelButton.setImmediate(true); - + cancelButton.addStyleName("btn"); VerticalLayout mainLayout = UiFactory.createVLayout(null, FAction.SET_SPACING); mainLayout.addComponent(new Label(message, Label.CONTENT_XHTML)); mainLayout.addComponent(new SimpleHorizontalLayout(confirmButton, cancelButton)); diff --git a/aperte-reports-ui/src/main/java/org/apertereports/util/ReportTemplateStagedModelDataHandler.java b/aperte-reports-ui/src/main/java/org/apertereports/util/ReportTemplateStagedModelDataHandler.java new file mode 100644 index 0000000..b8a6044 --- /dev/null +++ b/aperte-reports-ui/src/main/java/org/apertereports/util/ReportTemplateStagedModelDataHandler.java @@ -0,0 +1,63 @@ +package org.apertereports.util; + +import java.util.Collection; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apertereports.common.users.User; +import org.apertereports.dao.ReportTemplateDAO; +import org.apertereports.model.ReportTemplate; + +import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.portal.kernel.exception.SystemException; +import com.liferay.portal.kernel.lar.BaseStagedModelDataHandler; +import com.liferay.portal.kernel.lar.ExportImportPathUtil; +import com.liferay.portal.kernel.lar.PortletDataContext; +import com.liferay.portal.kernel.lar.StagedModelDataHandlerUtil; +import com.liferay.portal.kernel.xml.Element; +import com.liferay.portal.model.Company; +import com.liferay.portal.service.CompanyLocalServiceUtil; + + +public class ReportTemplateStagedModelDataHandler extends BaseStagedModelDataHandler { + + protected final Log logger = LogFactory.getLog(this.getClass()); + + public static final String[] CLASS_NAMES = {ReportTemplate.class.getName()}; + @Override + public void deleteStagedModel(String uuid, long groupId, String className, String extraData) + throws PortalException, SystemException { + // TODO Auto-generated method stub + + } + + @Override + public String[] getClassNames() { + return CLASS_NAMES; + } + + @Override + protected void doExportStagedModel(PortletDataContext portletDataContext, StagedReportTemplateImpl stagedModel) + throws Exception { + Element productElement = portletDataContext.getExportDataElement(stagedModel); + portletDataContext.addClassedModel(productElement, ExportImportPathUtil.getModelPath(stagedModel), stagedModel); + } + + @Override + protected void doImportStagedModel(PortletDataContext portletDataContext, StagedReportTemplateImpl stagedModel) + throws Exception { + logger.info("import Model: " + stagedModel.getModelClassName()); + + ReportTemplate reportTemplate = stagedModel.getAperteReport(String.valueOf(portletDataContext.getCompanyId())); + + //check if report with same name exists + Collection reportTemplatesWithSameName = ReportTemplateDAO.fetchByName(AperteReportsDataHandler.getAperteUser(), reportTemplate.getReportname()); + for (ReportTemplate rt : reportTemplatesWithSameName) { + logger.info("Report with same name found. Deleting report with id " + rt.getId()); + ReportTemplateDAO.remove(rt); + } + + ReportTemplateDAO.saveOrUpdate(reportTemplate); + } + +} diff --git a/aperte-reports-ui/src/main/java/org/apertereports/util/StagedReportTemplate.java b/aperte-reports-ui/src/main/java/org/apertereports/util/StagedReportTemplate.java new file mode 100644 index 0000000..c5586c2 --- /dev/null +++ b/aperte-reports-ui/src/main/java/org/apertereports/util/StagedReportTemplate.java @@ -0,0 +1,10 @@ +package org.apertereports.util; + +import org.apertereports.model.ReportTemplate; +import com.liferay.portal.model.StagedModel; + + +public interface StagedReportTemplate extends StagedModel{ + + public ReportTemplate getAperteReport(String companyId) throws Exception; +} diff --git a/aperte-reports-ui/src/main/java/org/apertereports/util/StagedReportTemplateImpl.java b/aperte-reports-ui/src/main/java/org/apertereports/util/StagedReportTemplateImpl.java new file mode 100644 index 0000000..44237af --- /dev/null +++ b/aperte-reports-ui/src/main/java/org/apertereports/util/StagedReportTemplateImpl.java @@ -0,0 +1,264 @@ +package org.apertereports.util; + +import java.io.Serializable; +import java.util.Date; +import java.util.HashSet; +import java.util.Set; + +import org.apertereports.model.ReportTemplate; + +import com.liferay.portal.model.Role; +import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.portal.kernel.lar.StagedModelType; +import com.liferay.portal.service.RoleLocalServiceUtil; +import com.liferay.portlet.expando.model.ExpandoBridge; +import com.liferay.portlet.expando.util.ExpandoBridgeFactoryUtil; + + +public class StagedReportTemplateImpl implements StagedReportTemplate { + + public StagedReportTemplateImpl(ReportTemplate pReportTemplate) throws Exception { + super(); + + this.reportTemplate = pReportTemplate; + + Set rolesWithAccess = new HashSet(); + try{ + for(long roleId : pReportTemplate.getRolesWithAccess()){ + Role role = RoleLocalServiceUtil.getRole(roleId); + String rolename = role.getName(); + rolesWithAccess.add(rolename); + } + }catch(PortalException pe){ + throw new PortalException("Could not convert RoleID to RoleName.", pe); + } + + this.rolesWithAccess = rolesWithAccess; + this.active = pReportTemplate.getActive(); + this.content = pReportTemplate.getContent(); + Date createdDate = new Date(); + createdDate.setTime(pReportTemplate.getCreated().getTime()); + this.created = createdDate; + this.description = pReportTemplate.getDescription(); + this.filename = pReportTemplate.getFilename(); + this.allowOnlineDisplay = pReportTemplate.getAllowOnlineDisplay(); + this.allowBackgroundOrder = pReportTemplate.getAllowBackgroundOrder(); + this.id = pReportTemplate.getId(); + this.reportname = pReportTemplate.getReportname(); + if(pReportTemplate.getCompanyId() != null && !pReportTemplate.getCompanyId().isEmpty()) + this.setCompanyId(Long.valueOf(pReportTemplate.getCompanyId())); + } + + //reportTemplate Object + private transient ReportTemplate reportTemplate = null; + + protected Set rolesWithAccess = new HashSet(); + protected Boolean active; + protected String content; + protected Date created; + protected String description; + protected String filename; + protected Boolean allowOnlineDisplay; + protected Boolean allowBackgroundOrder; + protected Integer id; + protected String reportname; + private long companyId; + + public Object clone() { + return this; + } + + public ReportTemplate getReportTemplate() { + return reportTemplate; + } + + public void setReportTemplate(ReportTemplate reportTemplate) { + this.reportTemplate = reportTemplate; + } + + public Set getRolesWithAccess() { + return rolesWithAccess; + } + + public void setRolesWithAccess(Set rolesWithAccess) { + this.rolesWithAccess = rolesWithAccess; + } + + public Boolean getActive() { + return active; + } + + public void setActive(Boolean active) { + this.active = active; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Date getCreated() { + return created; + } + + public void setCreated(Date created) { + this.created = created; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getFilename() { + return filename; + } + + public void setFilename(String filename) { + this.filename = filename; + } + + public Boolean getAllowOnlineDisplay() { + return allowOnlineDisplay; + } + + public void setAllowOnlineDisplay(Boolean allowOnlineDisplay) { + this.allowOnlineDisplay = allowOnlineDisplay; + } + + public Boolean getAllowBackgroundOrder() { + return allowBackgroundOrder; + } + + public void setAllowBackgroundOrder(Boolean allowBackgroundOrder) { + this.allowBackgroundOrder = allowBackgroundOrder; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getReportname() { + return reportname; + } + + public void setReportname(String reportname) { + this.reportname = reportname; + } + + @Override + public Date getCreateDate() { + // TODO Auto-generated method stub + return this.created; + } + + @Override + public Date getModifiedDate() { + // TODO Auto-generated method stub + return this.getCreateDate(); + } + + @Override + public StagedModelType getStagedModelType() { + return new StagedModelType(this.getModelClass()); + } + + @Override + public String getUuid() { + // TODO Auto-generated method stub + return this.id.toString(); + } + + @Override + public void setCreateDate(Date date) { + this.created = date; + } + + @Override + public void setModifiedDate(Date date) { + this.setCreateDate(date); + } + + @Override + public void setUuid(String uuid) { + this.id = new Integer(uuid); + } + + @Override + public ExpandoBridge getExpandoBridge() { + return ExpandoBridgeFactoryUtil.getExpandoBridge(this.getCompanyId(),this.getModelClassName()); + } + + @Override + public Class getModelClass() { + + return ReportTemplate.class; + } + + @Override + public String getModelClassName() { + + return this.getModelClass().getName(); + } + + @Override + public Serializable getPrimaryKeyObj() { + return new Long(this.id); + } + + @Override + public void setPrimaryKeyObj(Serializable primaryKeyObj) { + this.id = new Integer(primaryKeyObj.toString()); + } + + public void setCompanyId(long companyId) { + this.companyId = companyId; + } + + @Override + public long getCompanyId() { + return this.companyId; + } + + public ReportTemplate getAperteReport(String companyId) throws Exception { + + reportTemplate = new ReportTemplate(); + reportTemplate.setCompanyId(companyId); + + Set rolesWithAccess = new HashSet(); + try{ + for(Object roleName : this.rolesWithAccess){ + if(roleName instanceof String){ + String name = (String) roleName; + Role role = RoleLocalServiceUtil.getRole(Long.parseLong(companyId), name); + Long roleId = role.getRoleId(); + rolesWithAccess.add(roleId); + } + } + }catch(PortalException pe){ + throw new PortalException("Could not convert RoleName to RoleID.", pe); + } + + reportTemplate.setRolesWithAccess(rolesWithAccess); + reportTemplate.setActive(this.active); + reportTemplate.setContent(this.content); + reportTemplate.setCreated(this.created); + reportTemplate.setDescription(this.description); + reportTemplate.setFilename(this.filename); + reportTemplate.setAllowOnlineDisplay(this.allowOnlineDisplay); + reportTemplate.setAllowBackgroundOrder(this.allowBackgroundOrder); + reportTemplate.setReportname(this.reportname); + + return reportTemplate; + } +} \ No newline at end of file diff --git a/aperte-reports-ui/src/main/java/org/apertereports/util/wrappers/FieldProperties.java b/aperte-reports-ui/src/main/java/org/apertereports/util/wrappers/FieldProperties.java index 2bfa140..9245252 100644 --- a/aperte-reports-ui/src/main/java/org/apertereports/util/wrappers/FieldProperties.java +++ b/aperte-reports-ui/src/main/java/org/apertereports/util/wrappers/FieldProperties.java @@ -1,302 +1,308 @@ -package org.apertereports.util.wrappers; - -import org.apertereports.common.ARConstants.InputTypes; - -import javax.script.Invocable; -import javax.script.ScriptEngine; - -/** - * A bean class that represents a single report parameter defined in Jasper's JRXML. - */ -public class FieldProperties { - /** - * An input type of the parameter. - */ - private InputTypes inputType; - /** - * A level for multilevel selects. - */ - private Integer level; - /** - * Filtering group. - */ - private String filterGroup; - /** - * Is multiple choice? - */ - private Boolean multipleChoice; - /** - * Show "select all" box? - */ - private Boolean selectAll; - /** - * A certain width of the Vaadin component. - */ - private String width; - /** - * The caption of the field shown in the form. - */ - private String caption; - /** - * Is field required to fill by the user? - */ - private Boolean required; - /** - * The error message shown on the validation error. - */ - private String requiredError; - /** - * The regexp the value of the field should match. - */ - private String regexp; - /** - * The error message shown on regexp validation failure. - */ - private String regexpError; - /** - * Maximum characters filled. - */ - private String maxchars; - /** - * A dictionary query. This is basically a string which looks like this: - *

- *

-     *     java:comp/env/jdbc/unirep;SELECT DISTINCT reportname, reportname FROM unirep_configuration
-     * 
- * The string is split by a semicolon. The first part should be a JNDI name of the datasource, while - * the second - the SQL query to use. - */ - private String dictQuery; - /** - * A static dictionary list items. For example this parameter could look like this: - *

- *

-     *     chart:Display chart;table:Display table;projects:Display list of projects
-     * 
- */ - private String dictItemList; - /** - * Defines the order of the field in the form. - */ - private Integer order; - /** - * Script engine to use in a custom language parameters. - */ - private ScriptEngine se; - /** - * The invocable instance to use by the script engine. - */ - private Invocable sei; - /** - * Special control code. Used along with the {@link ScriptEngine}. - */ - private String specialControlCode; - /** - * Special validation code. Used along with the {@link ScriptEngine}. - */ - private String specialValidationCode; - /** - * Error shown on validation error of a special control code. Used along with the {@link ScriptEngine}. - */ - private String specialValidationError; - /** - * Special code data query. - */ - private String specialDataQueryCode; - - public FieldProperties() { - } - - public FieldProperties(InputTypes inputType, Integer level, String filterGroup, Boolean multipleChoice, - String width, String caption, Boolean required, String requiredError, String regexp, - String regexpError, String maxchars, String dictQuery, ScriptEngine se, Invocable sei, - String specialControlCode, String specialValidationCode, String specialValidationError, - String specialDataQueryCode) { - this.inputType = inputType; - this.level = level; - this.filterGroup = filterGroup; - this.multipleChoice = multipleChoice; - this.width = width; - this.caption = caption; - this.required = required; - this.requiredError = requiredError; - this.regexp = regexp; - this.regexpError = regexpError; - this.maxchars = maxchars; - this.dictQuery = dictQuery; - this.se = se; - this.sei = sei; - this.specialControlCode = specialControlCode; - this.specialValidationCode = specialValidationCode; - this.specialValidationError = specialValidationError; - this.specialDataQueryCode = specialDataQueryCode; - } - - public String getCaption() { - return caption; - } - - public String getDictItemList() { - return dictItemList; - } - - public String getDictQuery() { - return dictQuery; - } - - public String getFilterGroup() { - return filterGroup; - } - - public InputTypes getInputType() { - return inputType; - } - - public Integer getLevel() { - return level; - } - - public String getMaxchars() { - return maxchars; - } - - public Integer getOrder() { - return order; - } - - public String getRegexp() { - return regexp; - } - - public String getRegexpError() { - return regexpError; - } - - public String getRequiredError() { - return requiredError; - } - - public ScriptEngine getSe() { - return se; - } - - public Invocable getSei() { - return sei; - } - - public Boolean getSelectAll() { - return selectAll; - } - - public String getSpecialControlCode() { - return specialControlCode; - } - - public String getSpecialDataQueryCode() { - return specialDataQueryCode; - } - - public String getSpecialValidationCode() { - return specialValidationCode; - } - - public String getSpecialValidationError() { - return specialValidationError; - } - - public String getWidth() { - return width; - } - - public Boolean isMultipleChoice() { - return multipleChoice; - } - - public Boolean isRequired() { - return required; - } - - public void setCaption(String caption) { - this.caption = caption; - } - - public void setDictItemList(String dictItemList) { - this.dictItemList = dictItemList; - } - - public void setDictQuery(String dictQuery) { - this.dictQuery = dictQuery; - } - - public void setFilterGroup(String filterGroup) { - this.filterGroup = filterGroup; - } - - public void setInputType(InputTypes inputType) { - this.inputType = inputType; - } - - public void setLevel(Integer level) { - this.level = level; - } - - public void setMaxchars(String maxchars) { - this.maxchars = maxchars; - } - - public void setMultipleChoice(Boolean multipleChoice) { - this.multipleChoice = multipleChoice; - } - - public void setOrder(Integer order) { - this.order = order; - } - - public void setRegexp(String regexp) { - this.regexp = regexp; - } - - public void setRegexpError(String regexpError) { - this.regexpError = regexpError; - } - - public void setRequired(Boolean required) { - this.required = required; - } - - public void setRequiredError(String requiredError) { - this.requiredError = requiredError; - } - - public void setSe(ScriptEngine se) { - this.se = se; - } - - public void setSei(Invocable sei) { - this.sei = sei; - } - - public void setSelectAll(Boolean selectAll) { - this.selectAll = selectAll; - } - - public void setSpecialControlCode(String specialControlCode) { - this.specialControlCode = specialControlCode; - } - - public void setSpecialDataQueryCode(String specialDataQueryCode) { - this.specialDataQueryCode = specialDataQueryCode; - } - - public void setSpecialValidationCode(String specialValidationCode) { - this.specialValidationCode = specialValidationCode; - } - - public void setSpecialValidationError(String specialValidationError) { - this.specialValidationError = specialValidationError; - } - - public void setWidth(String width) { - this.width = width; - } -} +package org.apertereports.util.wrappers; + +import javax.script.Invocable; +import javax.script.ScriptEngine; + +import org.apertereports.common.ARConstants.InputTypes; + +/** + * A bean class that represents a single report parameter defined in Jasper's + * JRXML. + */ +public class FieldProperties { + /** + * An input type of the parameter. + */ + private InputTypes inputType; + /** + * A level for multilevel selects. + */ + private Integer level; + /** + * Filtering group. + */ + private String filterGroup; + /** + * Is multiple choice? + */ + private Boolean multipleChoice; + /** + * Show "select all" box? + */ + private Boolean selectAll; + /** + * A certain width of the Vaadin component. + */ + private String width; + /** + * The caption of the field shown in the form. + */ + private String caption; + /** + * Is field required to fill by the user? + */ + private Boolean required; + /** + * The error message shown on the validation error. + */ + private String requiredError; + /** + * The regexp the value of the field should match. + */ + private String regexp; + /** + * The error message shown on regexp validation failure. + */ + private String regexpError; + /** + * Maximum characters filled. + */ + private String maxchars; + /** + * A dictionary query. This is basically a string which looks like this: + *

+ * + *

+	 *     java:comp/env/jdbc/unirep;SELECT DISTINCT reportname, reportname FROM unirep_configuration
+	 * 
+ * + * The string is split by a semicolon. The first part should be a JNDI name + * of the datasource, while the second - the SQL query to use. + */ + private String dictQuery; + /** + * A static dictionary list items. For example this parameter could look + * like this: + *

+ * + *

+	 *     chart:Display chart;table:Display table;projects:Display list of projects
+	 * 
+ */ + private String dictItemList; + /** + * Defines the order of the field in the form. + */ + private Integer order; + /** + * Script engine to use in a custom language parameters. + */ + private ScriptEngine se; + /** + * The invocable instance to use by the script engine. + */ + private Invocable sei; + /** + * Special control code. Used along with the {@link ScriptEngine}. + */ + private String specialControlCode; + /** + * Special validation code. Used along with the {@link ScriptEngine}. + */ + private String specialValidationCode; + /** + * Error shown on validation error of a special control code. Used along + * with the {@link ScriptEngine}. + */ + private String specialValidationError; + /** + * Special code data query. + */ + private String specialDataQueryCode; + + public FieldProperties() { + } + + public FieldProperties(InputTypes inputType, Integer level, String filterGroup, Boolean multipleChoice, + String width, String caption, Boolean required, String requiredError, String regexp, + String regexpError, String maxchars, String dictQuery, ScriptEngine se, Invocable sei, + String specialControlCode, String specialValidationCode, String specialValidationError, + String specialDataQueryCode) { + this.inputType = inputType; + this.level = level; + this.filterGroup = filterGroup; + this.multipleChoice = multipleChoice; + this.width = width; + this.caption = caption; + this.required = required; + this.requiredError = requiredError; + this.regexp = regexp; + this.regexpError = regexpError; + this.maxchars = maxchars; + this.dictQuery = dictQuery; + this.se = se; + this.sei = sei; + this.specialControlCode = specialControlCode; + this.specialValidationCode = specialValidationCode; + this.specialValidationError = specialValidationError; + this.specialDataQueryCode = specialDataQueryCode; + } + + public String getCaption() { + return caption; + } + + public String getDictItemList() { + return dictItemList; + } + + public String getDictQuery() { + return dictQuery; + } + + public String getFilterGroup() { + return filterGroup; + } + + public InputTypes getInputType() { + return inputType; + } + + public Integer getLevel() { + return level; + } + + public String getMaxchars() { + return maxchars; + } + + public Integer getOrder() { + return order; + } + + public String getRegexp() { + return regexp; + } + + public String getRegexpError() { + return regexpError; + } + + public String getRequiredError() { + return requiredError; + } + + public ScriptEngine getSe() { + return se; + } + + public Invocable getSei() { + return sei; + } + + public Boolean getSelectAll() { + return selectAll; + } + + public String getSpecialControlCode() { + return specialControlCode; + } + + public String getSpecialDataQueryCode() { + return specialDataQueryCode; + } + + public String getSpecialValidationCode() { + return specialValidationCode; + } + + public String getSpecialValidationError() { + return specialValidationError; + } + + public String getWidth() { + return width; + } + + public Boolean isMultipleChoice() { + return multipleChoice; + } + + public Boolean isRequired() { + return required; + } + + public void setCaption(String caption) { + this.caption = caption; + } + + public void setDictItemList(String dictItemList) { + this.dictItemList = dictItemList; + } + + public void setDictQuery(String dictQuery) { + this.dictQuery = dictQuery; + } + + public void setFilterGroup(String filterGroup) { + this.filterGroup = filterGroup; + } + + public void setInputType(InputTypes inputType) { + this.inputType = inputType; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public void setMaxchars(String maxchars) { + this.maxchars = maxchars; + } + + public void setMultipleChoice(Boolean multipleChoice) { + this.multipleChoice = multipleChoice; + } + + public void setOrder(Integer order) { + this.order = order; + } + + public void setRegexp(String regexp) { + this.regexp = regexp; + } + + public void setRegexpError(String regexpError) { + this.regexpError = regexpError; + } + + public void setRequired(Boolean required) { + this.required = required; + } + + public void setRequiredError(String requiredError) { + this.requiredError = requiredError; + } + + public void setSe(ScriptEngine se) { + this.se = se; + } + + public void setSei(Invocable sei) { + this.sei = sei; + } + + public void setSelectAll(Boolean selectAll) { + this.selectAll = selectAll; + } + + public void setSpecialControlCode(String specialControlCode) { + this.specialControlCode = specialControlCode; + } + + public void setSpecialDataQueryCode(String specialDataQueryCode) { + this.specialDataQueryCode = specialDataQueryCode; + } + + public void setSpecialValidationCode(String specialValidationCode) { + this.specialValidationCode = specialValidationCode; + } + + public void setSpecialValidationError(String specialValidationError) { + this.specialValidationError = specialValidationError; + } + + public void setWidth(String width) { + this.width = width; + } +} diff --git a/aperte-reports-ui/src/main/java/org/apertereports/widgetset/VriesWidgetSet.gwt.xml b/aperte-reports-ui/src/main/java/org/apertereports/widgetset/VriesWidgetSet.gwt.xml index e5b5482..b62d7e6 100644 --- a/aperte-reports-ui/src/main/java/org/apertereports/widgetset/VriesWidgetSet.gwt.xml +++ b/aperte-reports-ui/src/main/java/org/apertereports/widgetset/VriesWidgetSet.gwt.xml @@ -3,12 +3,14 @@ "-//Google Inc.//DTD Google Web Toolkit 1.7.0//EN" "http://google-web-toolkit.googlecode.com/svn/tags/1.7.0/distro-source/core/src/gwt-module.dtd"> - + - + - + - + diff --git a/aperte-reports-ui/src/main/resources/hibernate.cfg.xml b/aperte-reports-ui/src/main/resources/hibernate.cfg.xml index 8174423..7293ae0 100644 --- a/aperte-reports-ui/src/main/resources/hibernate.cfg.xml +++ b/aperte-reports-ui/src/main/resources/hibernate.cfg.xml @@ -3,29 +3,29 @@ "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> - + - java:comp/env/jdbc/aperte-reports + java:comp/env/jdbc/aperte-reports - org.hibernate.transaction.JDBCTransactionFactory - thread - false - org.hibernate.cache.HashtableCacheProvider - true - true - - false - update - update - 50 - true - true - - - - - - - - + org.hibernate.transaction.JDBCTransactionFactory + thread + false + org.hibernate.cache.HashtableCacheProvider + true + true + + false + update + update + 50 + true + true + + + + + + + + diff --git a/aperte-reports-ui/src/main/resources/ui-messages_de.properties b/aperte-reports-ui/src/main/resources/ui-messages_de.properties new file mode 100644 index 0000000..fec1093 --- /dev/null +++ b/aperte-reports-ui/src/main/resources/ui-messages_de.properties @@ -0,0 +1,381 @@ + +label.active=Aktiv +label.add=Hinzufügen +label.adding=Hinzufügen +label.add.3dots=Hinzufügen... +label.all=Alle +label.cancel=Abbrechen +label.close=Schließen +label.configuration=Konfiguration +label.delete=Löschen +label.description=Beschreibung +label.details=Details +label.disable=Deaktivieren +label.download=Herunterladen +label.edit=Bearbeiten +label.edition=Bearbeiten +label.email=E-Mail +label.enable=Aktivieren +label.enabled=Aktiviert +label.filter=Filter +label.format=Format +label.generate=Generieren +label.help=Hilfe +label.locale=Sprache +label.index=Index +label.new=Neu +label.next=Weiter +label.no=Nein +label.none=kein +label.ok=OK +label.parameters=Report verwenden +label.permissions=Berechtigungen +label.preview=Vorschau +label.previous=Zurück +label.refresh=Aktualisieren +label.remove=Entfernen +label.run=Starte +label.save=Speichern +label.type=Typ +label.update=Aktualisieren +label.upload=Upload +label.yes=Ja + +ar.msg.generate.in.background=Im Hintergrund generieren +ar.msg.hide.parameters=Parameter ausblenden +ar.msg.hide.permissions=Berechtigungen ausblenden +ar.msg.select.all=Alle auswählen +ar.msg.send.email=E-Mail senden + +ar.browser. + +ar.cyclic. + +ar.dashboard.show.export.buttons=Exportieren Buttons anzeigen +ar.dashboard.show.refresh.button=Aktualisieren Button anzeigen + +ar.invoker. + +ar.manager.err.enter.report.name=Bitte geben Sie den Namen des Report ein +ar.manager.err.name.alredy.exists=Ein Report mit diesem Namen existiert bereits +ar.manager.report.description=Beschreibung des Reports + +liferay.get.login.exception=User Login nicht gefunden + +notification.validation.errors.title=Validierungsfehler +notification.validation.duplicate.report.name=Attribut 'name' in der jrxml-Datei sollte eindeutig sein +notification.validation.no.report.name=Attribut 'name' wurde in der jrxml-Datei nicht gefunden + +common.timedate.format=dd.MM.yyyy + +manager.table.column.active=Aktiv +manager.table.column.reportname=Report Name +manager.table.column.description=Beschreibung +manager.table.column.allow_online_display=Online Anzeigen erlauben +manager.table.column.allow_background_order=Generieren im Hintergrund erlauben + +error.not_logged_in=Sie müssen sich einloggen, um diese Aktion auszuführen + +manager.form.title=Report Attribute +manager.form.upload.prompt=Report-Datei hochladen + +manager.form.filename.label=Dateiname +manager.form.reportname.label=Report Name + +manager.form.allowOnlineDisplay.label=Online Anzeigen erlauben +manager.form.allowBackgroundOrder.label=Generieren im Hintergrund erlauben + +manager.filter.reportname=Filter Name +manager.filter.description=Filter Beschreibung + +invoker.window.title=Report Attribute +invoker.form.header=Keine Daten vorhanden +invoker.form.header.readonly=Die Report Eigenschaften in dieser Ansicht können nur gelesen werden +invoker.form.header.nofields=Der Report enthält keine Parameter zum Konfigurieren +invoker.form.generate_stream=Gerneriere Daten +invoker.form.generate_in_background=Generiere in Hintergrund +invoker.form.send_email=E-Mail senden +invoker.form.send_email.with_email=E-Mail zu %s senden +invoker.form.send_email.with_error.no_context=Sende eine E-Mail (portlet context benötigt) +invoker.form.send_email.with_error.no_email=Sende eine E-Mail (E-Mail-Adresse für den Benutzer nicht gefunden) +invoker.form.send_email.with_error.no_user=Sende eine E-Mail (Benutzer nicht gefunden) + +invoker.form.no_items_for_exception=Keine Daten für +invoker.form.special_validation_code.script_exception +invoker.form.special_validation_code.no_such_method_exception +invoker.form.special_control_code.script_exception +invoker.form.special_control_code.no_such_method_exception +invoker.form.special_data_query_code.script_exception +invoker.form.special_data_query_code.no_such_method_exception + +#generic_errors +#form.errors.required, caption +form.errors.required=Das Feld '%s' ist erforderlich +#form.errors.regexp, caption, regexp +form.errors.regexp=Das Feld '%s' muss dem Ausdruck '%s' entsprechen +#form.errors.unparsable_date, caption, value +form.errors.unparsable_date=Das Feld '%s' darf nicht den Wert '%s' haben + +#custom_errors +form.errors.must_be_upper_case=Das Feld '%s' muss mit einem Großbuchstaben beginnen +form.errors.must_be_number=Das Feld '%s' muss eine Zahl enthalten + +exception.report.build.title=Fehler beim Erzeugen des Reports +exception.report.build.description=Es ist ein Fehler beim Erzeugen des Reports aufgetreten.
Details:
%s + +exception.conversion.title=Fehler beim Konvertieren des Reports +exception.conversion.description=Es ist ein Fehler beim Konvertieren des Reports aufgetreten. + +exception.compilation_failed.title=Fehler beim Kompilieren +exception.compilation_failed.description=Der hochgeladene Report konnte nicht kompiliert werden. + +exception.subreport_not_found.title=Keine Unterreports gefunden +exception.subreport_not_found.description=Aperte Reports konnte keine Reports mit diesen Namen finden: + +exception.upload_failed.title=Fehler beim Hochladen +exception.upload_failed.description=Fehler beim Hochladen der jrxml-Datei + +exception.unsupported.operation.title=Nicht unterstützte Operation +exception.unsupported.operation.description=Diese Operation wird nicht unterstützt. Bitte kontaktieren Sie Ihren Administrator. + +exception.not.implemented.title=Nicht implementiert +exception.not.implemented.description=Diese Funktion ist noch nicht vorhanden. + +exception.validation.errors.title=Validierungsfehler +exception.validation.errors.description=Es ist ein Fehler beim Validieren aufgetreten. + +exception.validation.errors.report.template=Es sind Fehler in der Report Vorlage aufgetreten. + +exception.report.not.found.title=Report nicht gefunden +exception.report.not.found.description=Die Report ID %s wurde nicht in der Datenbank gefunden. +exception.drilldown.not.found.title=Drilldown Konfigurationsfehler +exception.drilldown.not.found.description=Der Report Name wurde nicht im Drilldown Link gefunden. +exception.drilldown.report.not.found.title=Drilldown Konfigurationsfehler +exception.drilldown.report.not.found.description=Der Drilldown Report wurde nicht in der Datenbank gefunden. + +loading.data=Lädt... bitte warten. + +notification.data.saved.title=Gespeichert +notification.data.saved.desc=Die Report Vorlage wurde erfolgreich gespeichert. +notification.data.cancelled.title=Abgebrochen +notification.data.cancelled.desc=Die Änderungen wurden nicht gespeichert. + +cyclic.report.table.idx=Index +cyclic.report.table.report=Report +cyclic.report.table.when=Wann +cyclic.report.table.status=Status +cyclic.report.table.desc=Beschreibung +cyclic.report.table.formats=Formate +cyclic.report.table.delete=Entfernen +cyclic.report.table.delete.areyousure=Sind Sie sicher, dass Sie einen periodischen Report entfernen wollen? +cyclic.report.table.delete.confirm=Bestätigen +cyclic.report.table.delete.notconfirm=Löschen +cyclic.report.add=Periodischen Report hinzufügen +cyclic.report.email.format=Formatiere die E-Mail +cyclic.report.name=Periodische Reports +cyclic.report.when.validationError=Der Wert ist nicht mit dem Modell 'Crontab' konsistent. + +cyclic.report.cron.validation.error=Es wurden Fehler im Wert des Cron Reports gefunden: + + +report.table.deleteReport.title=Report entfernen +report.table.deleteReport.content=Sind Sie sicher, dass Sie den Report '%s' entfernen wollen? +report.table.delete=Report entfernen +report.table.add=Report hinzufügen + +report.table.valuesChanged.title=Werte geändert +report.table.valuesChanged.content=Die Änderungen wurden nicht gespeichert. Änderungen verwerfen? + +dashboard.window.title=Tabellen +dashboard.help.content=Hilfe + +dashboard.view.drill.up=Zurück + +dashboard.edit.cyclicReports=Periodische Reports +dashboard.edit.source=Quelle bearbeiten +dashboard.edit.source.disable=Quelle ausblenden +dashboard.edit.add.report=Report hinzufügen +dashboard.edit.table.idx=Index +dashboard.edit.table.report=Report auswählen +dashboard.edit.table.details=Details +dashboard.edit.table.type=Typ +dashboard.edit.table.delete=Entfernen +dashboard.edit.table.type.cyclic=Periodisch +dashboard.edit.table.type.online=Online +dashboard.edit.report.details=Dashboard Report Details +dashboard.edit.report.parameters=Parameter des Reports +dashboard.edit.report.formats=Verfügbare Formate +dashboard.edit.report.cacheTimeout=Ablaufdauer des Zwischenspeichers +dashboard.edit.report.cacheTimeout.instructions=0 heißt keine Zwischenspeicherung, -1 Zwischenspeicherung, die nie abläuft +dashboard.edit.report.cacheTimeout.error=Bitt geben Sie eine Zahl ein +dashboard.edit.report.allowRefresh=Erlaube manuelles Aktualiseren +dashboard.report.creation.error=Es ist ein Fehler beim Erzeugen des Reports aufgetreten. + +exception.gui.error.title=Fehler im User Interface +exception.gui.error.description=Es ist ein Fehler im User Interface aufgetreten. Bitte wenden Sie sich an Ihren Administrator. + +exception.store.preferences.title=Fehler beim Speichern der Einstellungen +exception.store.preferences.description=Es ist ein Fehler beim Speichern der Einstellungen aufgetreten + +report_order.window.title=Benutzer Reports + +report_order.filter.report=Report Name +report_order.filter.created_after=Erstellt vor +report_order.filter.created_before=Erstellt nach + +report_order.table.refresh=Aktualisieren +report_order.table.parameters=Parameter +report_order.table.rerun=Erneut starten? +report_order.table.status.new=Neu +report_order.table.status.processing=Verarbeite +report_order.table.status.failed=Gescheitert +report_order.table.status.succeeded=Erfolgreich + +report_order.table.parameters.popup.title=Report Parameter +report_order.table.rerun.popup.title=Erneut starten? +report_order.table.rerun.popup.question=Sind Sie sicher, dass Sie eine Report Generation Order mit den selben Paramatern einfügen wollen? +report_order.table.status.failed.popup.title=Fehler beim Generieren + +report_order.table.column.report_name=Report Name +report_order.table.column.create_date=Erstelldatum +report_order.table.column.result=Status +report_order.table.column.details=Details +report_order.table.column.action=Aktionen + +global.clearfilters.button=Leere Filter +global.help.title=Hier klicken um Hilfe zu erhalten + +report.manager.item.created=Erstelt: %s +report.manager.item.upload.change=Ändern... +report.manager.date.format=dd.MM.yyyy HH:mm +report.manager.item.edit.name.prompt=Report Name +report.manager.item.edit.background=Generieren im Hintergrund erlauben +report.manager.item.edit.online=Online Anzeigen erlauben +report.manager.removing.report=Entferne Report '%s' +report.manager.report.is.used=Der Report wird in periodischen Reports verwendet. + +validation.email=Unzulässige E-Mail +validation.cronExpression=Unzulässiger Cron Ausdruck + +cycylic.edit.required-error.recipientEmail=Die E-Mail-Adresse ist erforderlich +cycylic.edit.required-error.cronSpec=Der Wann Ausdruck ist erforderlich +cyclic.edit.input-prompt.recipientEmail=E-Mail eingeben +cyclic.edit.input-prompt.cronSpec=Wann Ausdruck (Cron) +cyclic.edit.input-prompt.reportname=Report auswählen... +cycylic.edit.required-error.reportname=Der Report ist erforderlich +cyclic.edit.input-prompt.format=Report Format ist erforderlich... +cycylic.edit.required-error.format=Das Format ist erforderlich +cyclic.edit.caption.report=Report +cyclic.edit.caption.recipientEmail=E-Mail des Empfängers +cyclic.edit.caption.cronSpec=Wann + +dashboard.edit.caption.cacheTimeout=Ablaufdauer des Zwischenspeichers +dashboard.edit.required-error.cacheTimeout=Die Ablaufdauer des Zwischenspeichers ist erforderlich +dashboard.edit.input-prompt.reportId=Report ausählen... +dashboard.edit.required-error.reportId=Der Report ist erforderlich +dashboard.edit.caption.reportId=Report + +notification.fill.in.the.form.correctly=Füllen Sie das Formular richtig aus + +q.do.you.want.to.continue=Möchten Sie fortfahren? + + +exception.invalid_report_type.title=Nicht gültiger Report-Typ +exception.jasper_reports_exception.title=Jasper Fehler +exception.invalid_exporter_parameter.title=Nicht gültiger Export Parameter +exception.report_source_exception.title=Nicht gültige Report Vorlage +exception.serialization_exception.title=Fehler: Serialization Exception +exception.unknown.title=unbekannter Fehler +exception.invalid_datasource_type.title=Falscher Typ der Datenquelle +exception.unknown_property_name.title=Unbekannte Eigenschaft +exception.unsupported_encoding.title=Nicht unterstütze Zeichencodierung +exception.subreport_not_found.title=Unterreport nicht gefunden +exception.empty_report_source.title=Report Vorlage ist leer +exception.email_session_not_found.title=E-Mail Sitzung nicht gefunden +exception.drilldown_not_found.title=Drilldown nicht gefunden +exception.drilldown_report_not_found.title=Drilldown Report nicht gefunden +exception.jms_unavailable.title=Generieren von Reports im Hintergrund wird nicht unterstützt +exception.font_not_found.title=Die Schriftart, die im Report verwendet wird, wurde nicht gefunden. +exception.report_template_not_found.title=Report Vorlage nicht gefunden +exception.report_access_denied.title=Zugriff verweigert + +exception.invalid_report_type.desc=Bitte kontaktieren Sie Ihren Administrator. +exception.jasper_reports_exception.desc=Bitte prüfen Sie die Syntax des Reports. +exception.invalid_exporter_parameter.desc=Bitte kontaktieren Sie Ihren Administrator. +exception.report_source_exception.desc=Bitte prüfen Sie die Syntax des Reports. +exception.serialization_exception.desc=Bitte kontaktieren Sie Ihren Administrator. +exception.unknown.desc=Bitte kontaktieren Sie Ihren Administrator. +exception.invalid_datasource_type.desc=Bitte prüfen Sie die Syntax des Reports. +exception.unknown_property_name.desc=Bitte kontaktieren Sie Ihren Administrator. +exception.unsupported_encoding.desc=Bitte prüfen Sie die Syntax des Reports. +exception.subreport_not_found.desc=Bitte prüfen Sie die Syntax des Reports. +exception.empty_report_source.desc=Bitte prüfen Sie die Syntax des Reports. +exception.email_session_not_found.desc=Bitte prüfen Sie die JNDI-Konfiguration +exception.drilldown_not_found.desc=Bitte prüfen Sie die Syntax des Reports. +exception.drilldown_report_not_found.desc=Bitte prüfen Sie die Syntax des Reports. +exception.jms_unavailable.desc=Die aktuelle Umgebung unterstützt JMS nicht +exception.font_not_found.desc=Bitte kontaktieren Sie Ihren Administrator. +exception.report_template_not_found.desc= +exception.report_access_denied.desc= + + + + +help_window.tabs.report_details.title=Report details +help_window.tabs.report_details.intro=In this window you can select a report, which can be used to anchor tag report. +help_window.tabs.report_details.content=Each report can include configurable parameters. These parameters will be visible if they exist in a smaller window below the list of reports.
In the next part can be configuredcache expiration in seconds. Generated reports are stored in portal memory. If cache expires, another page refresh will re-generate the report.
Additional options include a possible report format selection and manual refresh configuration. Each option selected in the box brings up a button on the generated report (eg Refresh or PDF). +help_window.tabs.edit_report.title=Edit report +help_window.tabs.edit_report.intro=In this panel can be configured to display reports in the portlet. +help_window.tabs.edit_report.content=To do so, add a report to the table below using the button "Add report". Each report has its own identifier in the portlet context. Identifier is visible in the first column of table. Then use the reports IDs in HTML editor panel. To put report in HTML code displayed in the portlet you need to add report tag and index attribute whose value is the identifier of report from in the table. Tag can be added anywhere in your HTML code. A HTML editor is available next to the "View source", so you can view the contents of the HTML editor. +help_window.tabs.cyclic_reports.title=Cyclic reports +help_window.tabs.cyclic_reports.intro=In the reports editing panel you can add periodic reports regularly performed. +help_window.tabs.cyclic_reports.content=List of periodic reports is shown in the table below. Selecting from a table report updates the detailed view on the right. To update revised report after editing, press the "Update" button in the sidebar. Only then changes will be affixed to the table.
To add a new report press "Add cyclic report." The sidebar will appear blank controls, which should be filled and press the "Update" button. To save all changes made to the database, press the "Save" button. This operation initiate cyclic reports engine, so it is required for proper operation of functionality. + +manager.form.upload.help.title=Instructions to configure reports +manager.form.upload.help.content=

Parameters description

\\n
input_type
Parameter type. Allowed\\: \\n
  • text - text field
  • textarea - text field type textarea
  • date - field to choose the date and time
  • select - choosing box from the list
  • multiselect - multiple options from the list
  • checkbox - list of checkbox type fields
  • checkbox - list of checkbox type fields (multiple choice)
  • radiobuttons - list of checkbox type fields (single choice)
  • stepselect - selection list of one or multiple with filters or one from those filters
  • special_control - field generated in the scripting language (script is forwarded in the "special_control_code" property)
+help_window.dashboard.title=Help for portlets viewing reports +help_window.manager.title=Report Manager Help +help_window.tabs.params.title=Report parameters +help_window.tabs.template_options.title=Report template configuration +help_window.tabs.params.intro=To set up a form with data entered by the user to the report, you need to properly configure the the jrxml file parameters. \\n
Example of configuration mandatory parameter with a date\\:
 <parameter name\\="s_created_after" class\\="java.lang.String"> \\n \\t<property name\\="input_type" value\\="date"/>\\n \\t<property name\\="label" value\\="Created after"/>\\n \\t<property name\\="required" value\\="true"/>\\n \\t<property name\\="required_error" value\\="You must provide dat\u0119"/>\\n \\t<defaultValueExpression>\\n\\t\\t<\\![CDATA["2010-01-01"]]>\\n\\t</defaultValueExpression>\\n </parameter>\\n 

Described below are the possible ways to configure the parameters by properties\\: +help_window.tabs.params.param_name=Attribute key:%s +help_window.tabs.params.input_type.title=Type of control +help_window.tabs.params.input_type.content=Possible values\\n\\t
  • text - text field
  • textarea- text field type textarea
  • date - field to choose the date and time
  • select - choosing box from the list
  • multiselect - multiple options from the list
  • checkbox - list of checkbox type fields
  • checkbox - list of checkbox type fields (multiple choice)
  • radiobuttons - list of checkbox type fields (single choice)
  • stepselect - selection list of one or multiple with filters or one from those filters
  • special_control - field generated in the scripting language (script is forwarded in the "special_control_code" property)

Default\\: when the value is empty, the entire parameter is ignored by applications. +help_window.tabs.params.dict_query.title=Dictionary to the selection lists - SQL +help_window.tabs.params.dict_query.content=Content of the SQL query that fills the list box. It is assumed that the request meets the following conditions\\:\\n
  • Query returns two columns - the first is used as a value passed as a parameter to the report, second - as the description presented to user to user.
  • For stepselect type fields (to filtering by stages, eg country-> city-> street) with descriptions of the columns are returned in order from most specific to most general, such VALUE_TO_REPORT | STREET | CITY | COUNTRY

Format\\: {datasource};{SQL}
Example\\:
java\\:comp/env/jdbc/unirep;SELECT DISTINCT reportname, reportname FROM unirep_configuration
java\\:comp/env/jdbc/unirep;SELECT id, description, filename, reportname FROM unirep_configuration
+help_window.tabs.params.dict_item_list.title=Dictionary for selectionlists - directly +help_window.tabs.params.dict_item_list.content=Returned format should be analogous to dict_query, but in this case you don't need to enter SQL, but only values to be displayed

Format\\: {value passed to the report}\\:{content displayed in the form};{value2}\\:{displayed content2};{warto\u015b\u01073}\\:{displayed content3};...
Example\\: 1\\:reports summary;2\\:reports list +help_window.tabs.params.width.title=Field width +help_window.tabs.params.width.content=Field width including CSS

Example\\: 100px +help_window.tabs.params.maxchars.title=Character limit +help_window.tabs.params.maxchars.content=Maximum number of characters that can be typed into the field. +help_window.tabs.params.required.title=Field required +help_window.tabs.params.required.content=Field marked as required, will be marked with an asterisk and will not send the form. user receives a message defined in the properties required_error

Format\\: true|false
Default\\: false +help_window.tabs.params.required_error.title=Error message for required field +help_window.tabs.params.required_error.content=Error message shown in the case of blank field. It may contain %s, which will be substituted for the field name (taken from the label attribute).
\\
Format: {Message Key in .properties file}|{Default}\\
Example:
This is a required field
Field %s is required.\\
Default: defined in the message.properties with the key form.errors.required +help_window.tabs.params.regexp.title=Regular expression validation +help_window.tabs.params.regexp.content=The regular expression that will be compared with the value of the field (if it is not empty). +help_window.tabs.params.regexp_error.title=Error in regular expression validation +help_window.tabs.params.regexp_error.content=Error message shown in the case of a field value from a regular expression. It can include & \\ # 37; s The first of these will be swapped on a field name (taken from the attribute label ), and the other on the content of the regular expression (regexp Field ).
Format \\: {key in .properties file} | {error} directly
Example \\: Field & \\ # 37; s must match the pattern & \\ # 37 ; s
Default \\: message defined in .properties form.errors.regexp key help_window.tabs.params.order.title=Position in the form help_window.tabs.params.order.content=Property can affect the display order of fields on the form. Lower value causes that the field appears earlier.\\n In case of equal values, order is determined by the order of occurrence in the template report.
Default\\: 1000 +help_window.tabs.params.order.title=Position in form +help_window.tabs.params.order.content=Property allows to change the order of fields in the form. The higher value the sooner it is visible.\nIf there are two equal values, the order is defined by the position in the report's template.
Default\: 1000 +help_window.tabs.params.label.title=Label +help_window.tabs.params.label.content=Label displayed in the form +help_window.tabs.params.script_language.title=Script language +help_window.tabs.params.script_language.content +help_window.tabs.params.special_control_code.title=Script control +help_window.tabs.params.special_control_code.content +help_window.tabs.params.special_validation_code.title=Script validation +help_window.tabs.params.special_validation_code.content +help_window.tabs.params.special_validation_error.title=Script validation - error message +help_window.tabs.params.special_validation_error.content +help_window.tabs.params.special_data_query_code.title=Scripting dictionary for selection lists +help_window.tabs.params.special_data_query_code.content +help_window.tabs.params.level.title=Level (to stepselect fields) +help_window.tabs.params.level.content +help_window.tabs.params.filter_group.title=Group (to stepselect fields) +help_window.tabs.params.filter_group.content +help_window.tabs.params.multiple_choice.title=Multiple choice +help_window.tabs.params.multiple_choice.content +help_window.tabs.params.select_all.title=Select all +help_window.tabs.params.select_all.content diff --git a/aperte-reports-ui/src/main/webapp/WEB-INF/faces-config.xml b/aperte-reports-ui/src/main/webapp/WEB-INF/faces-config.xml new file mode 100644 index 0000000..8bf3b79 --- /dev/null +++ b/aperte-reports-ui/src/main/webapp/WEB-INF/faces-config.xml @@ -0,0 +1,13 @@ + + + + + com.liferay.faces.util.lifecycle.DebugPhaseListener + + + \ No newline at end of file diff --git a/aperte-reports-ui/src/main/webapp/WEB-INF/jboss-web.xml b/aperte-reports-ui/src/main/webapp/WEB-INF/jboss-web.xml index 18f1274..2ff67ae 100644 --- a/aperte-reports-ui/src/main/webapp/WEB-INF/jboss-web.xml +++ b/aperte-reports-ui/src/main/webapp/WEB-INF/jboss-web.xml @@ -2,28 +2,28 @@ - - - jdbc/aperte-reports - javax.sql.DataSource - java:/jdbc/aperte-reports - + + + jdbc/aperte-reports + javax.sql.DataSource + java:/jdbc/aperte-reports + - - jms/ConnectionFactory - javax.jms.ConnectionFactory - java:/jms/ConnectionFactory - + + jms/ConnectionFactory + javax.jms.ConnectionFactory + java:/jms/ConnectionFactory + - - jms/ProcessReportQueue - javax.jms.Queue - java:/jms/ProcessReportQueue - + + jms/ProcessReportQueue + javax.jms.Queue + java:/jms/ProcessReportQueue + - - jms/GenerateReportQueue - javax.jms.Queue - java:/jms/GenerateReportQueue - + + jms/GenerateReportQueue + javax.jms.Queue + java:/jms/GenerateReportQueue + \ No newline at end of file diff --git a/aperte-reports-ui/src/main/webapp/WEB-INF/liferay-display.xml b/aperte-reports-ui/src/main/webapp/WEB-INF/liferay-display.xml index 3447ca8..e7d6baa 100644 --- a/aperte-reports-ui/src/main/webapp/WEB-INF/liferay-display.xml +++ b/aperte-reports-ui/src/main/webapp/WEB-INF/liferay-display.xml @@ -1,12 +1,13 @@ - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/aperte-reports-ui/src/main/webapp/WEB-INF/liferay-hook.xml b/aperte-reports-ui/src/main/webapp/WEB-INF/liferay-hook.xml new file mode 100644 index 0000000..b83e312 --- /dev/null +++ b/aperte-reports-ui/src/main/webapp/WEB-INF/liferay-hook.xml @@ -0,0 +1,6 @@ + + + + + /custom_jsps + \ No newline at end of file diff --git a/aperte-reports-ui/src/main/webapp/WEB-INF/liferay-plugin-package.properties b/aperte-reports-ui/src/main/webapp/WEB-INF/liferay-plugin-package.properties index 8e443e2..54f8850 100644 --- a/aperte-reports-ui/src/main/webapp/WEB-INF/liferay-plugin-package.properties +++ b/aperte-reports-ui/src/main/webapp/WEB-INF/liferay-plugin-package.properties @@ -8,5 +8,5 @@ tags=portlet vaadin jasperreport chart dashboard author=BlueSoft license=LGPL speed-filters-enabled=false -portal-dependency-jars=\ - vaadin.jar + +liferay-versions=6.2.0+,6.2.10+ \ No newline at end of file diff --git a/aperte-reports-ui/src/main/webapp/WEB-INF/liferay-portlet.xml b/aperte-reports-ui/src/main/webapp/WEB-INF/liferay-portlet.xml index 7de8e05..a3f9a68 100644 --- a/aperte-reports-ui/src/main/webapp/WEB-INF/liferay-portlet.xml +++ b/aperte-reports-ui/src/main/webapp/WEB-INF/liferay-portlet.xml @@ -1,30 +1,67 @@ - - Invoker portlet - true - false - - - Dashboard portlet - true - false - - - Report Manager portlet - false - false - portal - 1 - - - Report Order Browser portlet - true - false - - - Cyclic Reports portlet - false - false - - + + Dashboard portlet + false + false + /css/main.css + Dashboard-portlet + + + Invoker portlet + false + true + false + /css/main.css + org.apertereports.util.AperteReportsDataHandler + org.apertereports.util.ReportTemplateStagedModelDataHandler + + + Report Manager portlet + true + false + false + false + portal + 1 + /css/main.css + + + Report Order Browser portlet + false + true + false + /css/main.css + + + Cyclic Reports portlet + false + false + false + /css/main.css + + + Aperte Reports Invoker JSF + false + false + false + /css/main.css + + + + administrator + Administrator + + + guest + Guest + + + power-user + Power User + + + user + User + + \ No newline at end of file diff --git a/aperte-reports-ui/src/main/webapp/WEB-INF/portlet.xml b/aperte-reports-ui/src/main/webapp/WEB-INF/portlet.xml index 5fe0a07..4c3a2c3 100644 --- a/aperte-reports-ui/src/main/webapp/WEB-INF/portlet.xml +++ b/aperte-reports-ui/src/main/webapp/WEB-INF/portlet.xml @@ -1,147 +1,183 @@ - - - - - Invoker portlet - Aperte Reports Invoker - - com.vaadin.terminal.gwt.server.ApplicationPortlet2 - - application - org.apertereports.InvokerApplication - - - - - text/html - view - - - - - Aperte Reports Invoker - Invoker - invoker,report - - - - Report Manager portlet - Aperte Report Manager - - com.vaadin.terminal.gwt.server.ApplicationPortlet2 - - application - org.apertereports.ManagerApplication - - - - - text/html - view - - - - - Aperte Reports Manager - Manager - invoker,report - - - - Report Order Browser portlet - Report Order Browser - - com.vaadin.terminal.gwt.server.ApplicationPortlet2 - - application - org.apertereports.ReportOrderApplication - - - - - text/html - view - - - - - Aperte Reports Order Browser - Report Order Browser - invoker,report - - - - - Dashboard portlet - Aperte Reports Dashboard - - com.vaadin.terminal.gwt.server.ApplicationPortlet2 - - application - org.apertereports.DashboardPortletApplication - - - - text/html - view - edit - - - - Aperte Reports Dashboard - Dashboard - dashboard,chart - - - - - Cyclic Reports portlet - Cyclic Reports - - com.vaadin.terminal.gwt.server.ApplicationPortlet2 - - application - org.apertereports.CyclicReportsApplication - - - - text/html - view - - - - Aperte Cyclic Reports - Cyclic Reports - report,cyclic - - - - - I18nFilter - org.apertereports.util.I18nHelperFilter - RENDER_PHASE - ACTION_PHASE - RESOURCE_PHASE - EVENT_PHASE - - - - - I18nFilter - Cyclic Reports portlet - - - I18nFilter - Dashboard portlet - - - I18nFilter - Report Order Browser portlet - - - I18nFilter - Invoker portlet - - + + + + + Invoker portlet + Aperte Reports Invoker + + com.vaadin.terminal.gwt.server.ApplicationPortlet2 + + application + org.apertereports.InvokerApplication + + + + + text/html + view + + + + + Aperte Reports Invoker + Invoker + invoker,report + + + + Report Manager portlet + Aperte Report Manager + + com.vaadin.terminal.gwt.server.ApplicationPortlet2 + + application + org.apertereports.ManagerApplication + + + + widgetset + com.vaadin.portal.gwt.PortalDefaultWidgetSet + + + + + text/html + view + + + + + Aperte Reports Manager + Manager + invoker,report + + + + Report Order Browser portlet + Report Order Browser + + com.vaadin.terminal.gwt.server.ApplicationPortlet2 + + application + org.apertereports.ReportOrderApplication + + + + + text/html + view + + + + + Aperte Reports Order Browser + Report Order Browser + invoker,report + + + + + Dashboard portlet + Aperte Reports Dashboard + + com.vaadin.terminal.gwt.server.ApplicationPortlet2 + + application + org.apertereports.DashboardPortletApplication + + + + text/html + view + edit + + + + Aperte Reports Dashboard + Dashboard + dashboard,chart + + + + + Cyclic Reports portlet + Cyclic Reports + + com.vaadin.terminal.gwt.server.ApplicationPortlet2 + + application + org.apertereports.CyclicReportsApplication + + + + text/html + view + + + + Aperte Cyclic Reports + Cyclic Reports + report,cyclic + + + + + Aperte Reports Invoker JSF + Aperte Reports Invoker JSF + javax.portlet.faces.GenericFacesPortlet + + javax.portlet.faces.defaultViewId.view + /faces/view.xhtml + + 0 + + text/html + + + Aperte Reports Invoker JSF + Aperte Reports Invoker JSF + Aperte Reports Invoker JSF + + + administrator + + + guest + + + power-user + + + user + + + + + I18nFilter + org.apertereports.util.I18nHelperFilter + RENDER_PHASE + ACTION_PHASE + RESOURCE_PHASE + EVENT_PHASE + + + + + I18nFilter + Cyclic Reports portlet + + + I18nFilter + Dashboard portlet + + + I18nFilter + Report Order Browser portlet + + + I18nFilter + Invoker portlet + + diff --git a/aperte-reports-ui/src/main/webapp/WEB-INF/web.xml b/aperte-reports-ui/src/main/webapp/WEB-INF/web.xml index 38c67a7..1ed789e 100644 --- a/aperte-reports-ui/src/main/webapp/WEB-INF/web.xml +++ b/aperte-reports-ui/src/main/webapp/WEB-INF/web.xml @@ -1,57 +1,72 @@ - - Aperte Reports - - + + Aperte Reports + + Vaadin production mode - productionMode - false - + productionMode + false + - - jdbc/aperte-reports - javax.sql.DataSource - Container - - - - jms/ConnectionFactory - javax.jms.ConnectionFactory - Container - + + jdbc/aperte-reports + javax.sql.DataSource + Container + + + + aperterest + com.jaspersoft.jrs.data.webservice.WebServiceDataSourceDefinition + Container + - - jms/ProcessReportQueue - javax.jms.Queue - Container - + + jms/ConnectionFactory + javax.jms.ConnectionFactory + Container + - - jms/GenerateReportQueue - javax.jms.Queue - Container - + + jms/ProcessReportQueue + javax.jms.Queue + Container + - - clearCacheServlet - org.apertereports.util.servlet.ClearCacheServlet - 1 - - - clearCacheServlet - /*/cacheManager - + + jms/GenerateReportQueue + javax.jms.Queue + Container + + + VaadinServlet + com.vaadin.terminal.gwt.server.ApplicationServlet + + + VaadinServlet + /VAADIN/* + + + clearCacheServlet + org.apertereports.util.servlet.ClearCacheServlet + 1 + + + clearCacheServlet + /*/cacheManager + - - index.html - index.htm - index.jsp - default.html - default.htm - default.jsp - - + + + + index.html + index.htm + index.jsp + default.html + default.htm + default.jsp + + \ No newline at end of file diff --git a/aperte-reports-ui/src/main/webapp/css/main.css b/aperte-reports-ui/src/main/webapp/css/main.css new file mode 100644 index 0000000..d5afd42 --- /dev/null +++ b/aperte-reports-ui/src/main/webapp/css/main.css @@ -0,0 +1,418 @@ +.gwt-FileUpload { + display: none; +} + +.v-csslayout-container .v-button { + margin-right: 5px; +} + +.aui .v-checkbox>*, .aui .v-checkbox input { + /*float:left;*/ + margin-right: 5px; + display: inline-block; +} + +.aui .v-checkbox { + margin-left: 5px; +} + +.accordion-toggle .v-label, .accordion-toggle .v-button { + display: inline-block; +} + +.aui .v-app .accordion-group .accordion-heading.toggler-header-expanded .accordion-toggle::before, + .aui .v-app .lfr-add-panel .lfr-page-template .lfr-page-template-title.toggler-header-expanded::before + { + content: ""; +} + +.aui .v-app .accordion-toggle { + cursor: default; +} + +.accordion-toggle .v-button, .accordion-toggle .v-label.float-right { + float: right; +} + +.invoker .accordion-toggle .v-label { + float: left; + margin-top: 7px; +} + +.accordion-toggle .v-label { + float: none; + margin-top: 0; +} + +.aui .accordion-inner fieldset { + border: none; +} + +.aui .v-app legend { + border: none; + margin: 0; +} + +.conf-row .v-caption, .conf-row .v-filterselect { + display: inline-block; +} + +.v-captiontext, .v-required-field-indicator { + display: inline; +} + +.aui .v-filterselect .v-filterselect-input { + margin-bottom: 0; +} + +.v-filterselect-button { + background: none !important; +} + +.v-filterselect-button::before { + content: "\f0dd"; + padding: 10px 0 0 15px; + display: inline-block; +} + +.v-filterselect-suggestmenu span { + height: 24px !important; + padding-left: 5px !important; + cursor: pointer !important; +} + +.v-filterselect-suggestmenu .gwt-MenuItem-selected span { + background: #eee !important; + border-color: #eee !important; +} + +.v-filterselect-suggestmenu .gwt-MenuItem-selected { + background: none !important; +} + +.v-caption { + width: 150px; +} + +.aui .v-filterselect, .aui .v-caption { + margin-bottom: 5px; +} + +.v-tooltip { + display: none; +} + +/* roles */ +.roles .v-checkbox { + display: table-row; +} + +.roles .v-csslayout-margin { + display: table; +} + +.aui .roles .v-checkbox input, .aui .roles .v-checkbox label { + display: table-cell; +} + +.aui .v-checkbox input, .aui .accordion-inner .btn { + margin-bottom: 7px; +} + +.button-row { + margin-bottom: 10px; +} + +/* Select */ +.v-app select, .v-window select { + padding: 1px; +} + +select { + background-color: #fff; +} + +.v-ie6 select { + font-size: 1em; +} + +.v-filterselect-button { + width: 24px; + height: 24px; + background: transparent url(../common/buttons_sprites.png) no-repeat 0 0; +} + +.v-filterselect-button:hover { + background-position: 0px -24px; +} + +.v-filterselect-suggestpopup { + border: 1px solid #98C0F4; + background-color: #fff; +} + +.v-filterselect-suggestmenu { + min-height: 2px; +} + +.v-filterselect-prevpage, .v-filterselect-prevpage-off, + .v-filterselect-nextpage, .v-filterselect-nextpage-off { + background-color: #fff; +} + +.v-filterselect-prevpage span, .v-filterselect-prevpage-off span, + .v-filterselect-nextpage span, .v-filterselect-nextpage-off span { + display: block; + height: 8px; + width: 16px; + margin-left: auto; + margin-right: auto; + text-indent: -99999px; +} + +.v-filterselect-prevpage span, .v-filterselect-nextpage span { + background: transparent no-repeat 0 -4px; + background-image: url(/html/themes/classic/images/aui/icon_sprite.png); +} + +.v-filterselect-nextpage span { + background-position: -65px -4px; +} + +.v-filterselect-suggestmenu .gwt-MenuItem span { + display: block; + width: 100%; + height: 18px; + border: 1px solid #fff; + border-style: solid none; +} + +.v-filterselect-suggestmenu .gwt-MenuItem-selected span { + color: #000; + background: #dfe8f6; + border-color: #a3bae9; +} + +.v-filterselect-suggestmenu .gwt-MenuItem .v-icon { + float: left; +} + +.v-select-twincol-buttons .v-button-wrap { + padding-left: 11px; + padding-right: 11px; +} + +.v-button-wrap { + color: inherit !important; +} + +.v-button-caption { + text-decoration: inherit !important; +} + +.v-panel, .v-panel-caption, .v-panel-nocaption { + background: none !important; + border: none !important; +} + +.v-panel-content { + border: none !important; +} + +.v-button, .v-datefield-button { + border: 0 !important; + text-shadow: none !important; + border-radius: 8px !important; + padding: 4px 12px !important; +} + +.v-datefield-button, .v-datefield-button:hover { + background: inherit !important; + box-shadow: none !important; + outline: 0 !important; + margin: 0 !important; + font-size: 16px !important; + background-color: transparent !important; +} + +.v-datefield-time { + text-align: center; +} + +.v-datefield-calendarpanel .v-select { + max-width: 96px; +} + +.v-button-prevyear, .v-button-prevmonth, .v-button-nextmonth, + .v-button-nextyear { + text-shadow: none !important; + border-radius: 8px !important; + padding: 4px 12px !important; + width: 30px !important; + box-shadow: none !important; + font-size: 14px !important; +} + +.v-button-prevyear:before, .v-button-prevmonth:before, + .v-button-nextmonth:before, .v-button-nextyear:before, + .v-datefield-button:before, .v-filterselect-button { + display: block; + font-family: FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + min-width: 10px; + text-align: center; + line-height: 0px; +} + +.v-button-prevyear:before { + content: ""; +} + +.v-button-prevmonth:before { + content: ""; +} + +.v-button-nextmonth:before { + content: ""; +} + +.v-button-nextyear:before { + content: ""; +} + +.v-datefield-button:before { + content: "\f073"; + color: #626262 !important; +} + +.v-datefield-calendarpanel-prevmonth, .v-datefield-calendarpanel-month, + .v-datefield-calendarpanel-nextmonth { + background: none !important; +} + +.v-datefield-calendarpanel-day { + background: none !important; + border-radius: 2px !important; + border-color: #d9d8d8 !important; +} + +.v-textfield.v-textfield-prompt { + margin-bottom: 15px !important; +} + +/* Notification */ +.v-Notification, .v-form-errormessage { + background-color: #fee5e2; + border: 1px solid #fcaca5; + color: #b50303; + border-radius: 2px; + margin-bottom: 10px; + margin-top: 10px; + padding: 8px 35px 8px 14px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} + +/* Aperte disable Bereiche ausblenden */ +.v-disabled { + display: none !important; +} + +/* JSF Portlet Styles */ +.report-container { + border: 1px solid #e5e5e5; +} + +.report-template { + padding: 5px; + margin: 2px; + height: 45px; +} + +.report-parameters { + padding: 0px 10px; +} + +.report-name { + float: left; + margin-top: 7px; +} + +.report-param-btn { + float: right; +} + +body.bem-scheme .ui-datepicker-trigger.ui-button.ui-widget.ui-state-default.ui-corner-all.ui-button-icon-only:hover +{ + background: #1c663f; +} + +body.bwb-scheme .ui-datepicker-trigger.ui-button.ui-widget.ui-state-default.ui-corner-all.ui-button-icon-only:hover +{ + background: #0072B8; +} + +.ui-selectlistbox-item.ui-corner-all { + padding: 2px 5px !important; +} + +.param-label-column { + width: 10%; +} + +.parameters-table { + margin-top: 10px; +} + +.parameters-table thead { + display: none; +} + +.type-selection { + width: 100%; +} + +.type-selection td { + border: none !important; +} + +.type-selection-label { + width: 10%; +} + +.type-selection-value select { + width: 206px !important; +} + +.dict-selection { + width: 206px !important; +} + +.generate-btn { + margin-top: 10px !important; + margin-bottom: 15px !important; +} + +.message-bar { + position: fixed !important; + bottom: 50px; + width: 98%; +} + +.ui-widget-content.ui-selectmanymenu.dict-selection { + border: 1px solid #e5e5e5; +} + +.ui-state-default.ui-state-highlight { + opacity: 0.6; +} + +.ui-state-default.ui-state-active.ui-state-highlight { + opacity: 1; +} + +.ui-panelgrid .ui-panelgrid-cell { + padding: 1rem !important; +} \ No newline at end of file diff --git a/aperte-reports-ui/src/main/webapp/custom_jsps/html/VAADIN/themes/mytheme/styles.css b/aperte-reports-ui/src/main/webapp/custom_jsps/html/VAADIN/themes/mytheme/styles.css new file mode 100644 index 0000000..e69de29 diff --git a/aperte-reports-ui/src/main/webapp/faces/view.xhtml b/aperte-reports-ui/src/main/webapp/faces/view.xhtml new file mode 100644 index 0000000..4595bec --- /dev/null +++ b/aperte-reports-ui/src/main/webapp/faces/view.xhtml @@ -0,0 +1,128 @@ + + + + + + + + + + +
+
+ + + + + + +
+
+ + + + + Parameter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ + diff --git a/aperte-reports-ui/src/test/java/CacheTest.java b/aperte-reports-ui/src/test/java/CacheTest.java index a801494..1a79bec 100644 --- a/aperte-reports-ui/src/test/java/CacheTest.java +++ b/aperte-reports-ui/src/test/java/CacheTest.java @@ -40,19 +40,19 @@ public void testNeverCache() { assertNull(obj); } - @Test - public void testCacheExpire() throws InterruptedException { - MapCache cache = new MapCache(); - - cache.cacheData(key, twoSeconds, data); - - Thread.sleep(1000); - Object obj = cache.provideData(key); - assertNotNull(obj); - assertEquals(data, obj); - - Thread.sleep(2000); - obj = cache.provideData(key); - assertNull(obj); - } +// @Test +// public void testCacheExpire() throws InterruptedException { +// MapCache cache = new MapCache(); +// +// cache.cacheData(key, twoSeconds, data); +// +// Thread.sleep(1000); +// Object obj = cache.provideData(key); +// assertNotNull(obj); +// assertEquals(data, obj); +// +// Thread.sleep(2000); +// obj = cache.provideData(key); +// assertNull(obj); +// } } diff --git a/aperte-reports-ws/ws-client/src/main/resources/pl/net/bluesoft/rnd/apertereports/ws/client/aperte-reports-ws-client.xml b/aperte-reports-ws/ws-client/src/main/resources/pl/net/bluesoft/rnd/apertereports/ws/client/aperte-reports-ws-client.xml index a718cc0..a4942aa 100644 --- a/aperte-reports-ws/ws-client/src/main/resources/pl/net/bluesoft/rnd/apertereports/ws/client/aperte-reports-ws-client.xml +++ b/aperte-reports-ws/ws-client/src/main/resources/pl/net/bluesoft/rnd/apertereports/ws/client/aperte-reports-ws-client.xml @@ -1,19 +1,22 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> - - - - - - + + + + + + - + - - - - + + + + diff --git a/aperte-reports-ws/ws-endpoint/src/main/webapp/WEB-INF/endpoint-servlet.xml b/aperte-reports-ws/ws-endpoint/src/main/webapp/WEB-INF/endpoint-servlet.xml index 73afc88..b597324 100644 --- a/aperte-reports-ws/ws-endpoint/src/main/webapp/WEB-INF/endpoint-servlet.xml +++ b/aperte-reports-ws/ws-endpoint/src/main/webapp/WEB-INF/endpoint-servlet.xml @@ -1,61 +1,67 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/aperte-reports-ws/ws-endpoint/src/main/webapp/WEB-INF/web.xml b/aperte-reports-ws/ws-endpoint/src/main/webapp/WEB-INF/web.xml index 67a3004..832687b 100644 --- a/aperte-reports-ws/ws-endpoint/src/main/webapp/WEB-INF/web.xml +++ b/aperte-reports-ws/ws-endpoint/src/main/webapp/WEB-INF/web.xml @@ -1,21 +1,21 @@ + xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" + version="2.4"> - Aperte Reports WebService Endpoint + Aperte Reports WebService Endpoint - - endpoint - org.springframework.ws.transport.http.MessageDispatcherServlet - - transformWsdlLocations - true - - + + endpoint + org.springframework.ws.transport.http.MessageDispatcherServlet + + transformWsdlLocations + true + + - - endpoint - /* - + + endpoint + /* + diff --git a/aperte-reports-ws/ws-endpoint/src/test/resources/apertereports.xsd b/aperte-reports-ws/ws-endpoint/src/test/resources/apertereports.xsd index 80092cc..39713d4 100644 --- a/aperte-reports-ws/ws-endpoint/src/test/resources/apertereports.xsd +++ b/aperte-reports-ws/ws-endpoint/src/test/resources/apertereports.xsd @@ -1,53 +1,63 @@ + elementFormDefault="qualified" targetNamespace="http://bluesoft.net.pl/rnd/apertereports/schemas" + xmlns:xmime="http://www.w3.org/2005/05/xmlmime" xmlns:rg="http://bluesoft.net.pl/rnd/apertereports/schemas"> - - - - - - - + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - + + + + + + - - - - - - - + + + + + + + - - - - - - - - - + + + + + + + + + diff --git a/aperte-reports-ws/ws-endpoint/src/test/resources/test-context.xml b/aperte-reports-ws/ws-endpoint/src/test/resources/test-context.xml index 995766a..3bbd8ee 100644 --- a/aperte-reports-ws/ws-endpoint/src/test/resources/test-context.xml +++ b/aperte-reports-ws/ws-endpoint/src/test/resources/test-context.xml @@ -1,63 +1,70 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/aperte-reports-ws/ws-endpoint/src/test/resources/test.xml b/aperte-reports-ws/ws-endpoint/src/test/resources/test.xml index 1729974..c065365 100644 --- a/aperte-reports-ws/ws-endpoint/src/test/resources/test.xml +++ b/aperte-reports-ws/ws-endpoint/src/test/resources/test.xml @@ -4,12 +4,12 @@ "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"> - - - - - - - - + + + + + + + + diff --git a/backbone/pom.xml b/backbone/pom.xml index f88773c..5c51c90 100644 --- a/backbone/pom.xml +++ b/backbone/pom.xml @@ -127,8 +127,8 @@ org.apache.maven.plugins maven-compiler-plugin - 1.6 - 1.6 + 1.7 + 1.7 UTF-8 diff --git a/backbone/src/test/resources/hibernate.cfg.xml b/backbone/src/test/resources/hibernate.cfg.xml index 26c4a17..17ac616 100644 --- a/backbone/src/test/resources/hibernate.cfg.xml +++ b/backbone/src/test/resources/hibernate.cfg.xml @@ -3,22 +3,22 @@ "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> - - java:comp/env/jndids - - + + java:comp/env/jndids + + - org.postgresql.Driver - org.hibernate.dialect.PostgreSQLDialect - org.hibernate.transaction.JDBCTransactionFactory - thread - - false - - org.hibernate.cache.HashtableCacheProvider - - true - true + org.postgresql.Driver + org.hibernate.dialect.PostgreSQLDialect + org.hibernate.transaction.JDBCTransactionFactory + thread + + false + + org.hibernate.cache.HashtableCacheProvider + + true + true - + diff --git a/backbone/src/test/resources/stackedchart.jrxml b/backbone/src/test/resources/stackedchart.jrxml index 81a855e..a1e3992 100644 --- a/backbone/src/test/resources/stackedchart.jrxml +++ b/backbone/src/test/resources/stackedchart.jrxml @@ -1,393 +1,376 @@ - -