Java tutorial
/* * Copyright (C) 2005 - 2014 TIBCO Software Inc. All rights reserved. * http://www.jaspersoft.com. * * Unless you have purchased a commercial license agreement from Jaspersoft, * the following license terms apply: * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.jaspersoft.jasperserver.war.action; import com.jaspersoft.jasperserver.api.JSDuplicateResourceException; import com.jaspersoft.jasperserver.api.JSException; import com.jaspersoft.jasperserver.api.JSExceptionWrapper; import com.jaspersoft.jasperserver.api.JSNotImplementedException; import com.jaspersoft.jasperserver.api.common.domain.ValidationResult; import com.jaspersoft.jasperserver.api.engine.common.service.EngineService; import com.jaspersoft.jasperserver.api.engine.common.service.SecurityContextProvider; import com.jaspersoft.jasperserver.api.engine.jasperreports.service.impl.CustomReportDataSourceServiceFactory; import com.jaspersoft.jasperserver.api.engine.jasperreports.util.CustomDataSourceDefinition; import com.jaspersoft.jasperserver.api.metadata.common.domain.*; import com.jaspersoft.jasperserver.api.metadata.common.domain.client.FileResourceImpl; import com.jaspersoft.jasperserver.api.metadata.common.domain.client.InputControlImpl; import com.jaspersoft.jasperserver.api.metadata.common.service.RepositoryService; import com.jaspersoft.jasperserver.api.metadata.common.service.impl.RepositorySecurityChecker; import com.jaspersoft.jasperserver.api.metadata.jasperreports.domain.*; import com.jaspersoft.jasperserver.api.metadata.olap.util.OlapReportCheckUtil; import com.jaspersoft.jasperserver.api.metadata.user.service.ObjectPermissionService; import com.jaspersoft.jasperserver.api.metadata.view.domain.FilterCriteria; import com.jaspersoft.jasperserver.war.common.ConfigurationBean; import com.jaspersoft.jasperserver.war.common.JasperServerConst; import com.jaspersoft.jasperserver.war.common.JasperServerConstImpl; import com.jaspersoft.jasperserver.war.common.JasperServerUtil; import com.jaspersoft.jasperserver.war.dto.*; import com.jaspersoft.jasperserver.war.model.impl.BaseTreeDataProvider; import com.jaspersoft.jasperserver.war.model.impl.TypedTreeDataProvider; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.security.AccessDeniedException; import org.springframework.validation.DataBinder; import org.springframework.validation.Errors; import org.springframework.validation.FieldError; import org.springframework.web.multipart.support.ByteArrayMultipartFileEditor; import org.springframework.webflow.action.FormAction; import org.springframework.webflow.core.collection.ParameterMap; import org.springframework.webflow.execution.Event; import org.springframework.webflow.execution.RequestContext; import org.springframework.webflow.execution.ScopeType; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Set; public class ReportUnitAction extends FormAction { private static final String ATTRIBUTE_RESOURCE_ID_NOT_SUPPORTED_SYMBOLS = "resourceIdNotSupportedSymbols"; private static final String DATA_SOURCE_PARENT_TYPE = "reportUnit"; private static final String RU_URI_PARAM = "resource"; private static final String FORM_OBJECT_KEY = "wrapper"; private static final String REPORT_UNIT_SUFFIX = "_unit"; private static final String REPORT_UNIT_KEY = "unit"; private static final String CONTROL_OBJECT_KEY = "control"; private static final String RESOURCE_OBJECT_KEY = "resource"; private static final String DATASOURCE_OBJECT_KEY = "dataResource"; private static final String PARENT_FOLDER_ATTR = "parentFolder"; private static final String PARAM_FROM_PAGE = "frompage"; private static final String PARAM_RESOURCE_NAME = "resourceName"; private static final String UNPARSABLE_JRXML_ATTR = "jrxmlUnparsable"; private static final String UNPARSABLE_JRXML_MESSAGE_KEY = "jsp.jrXmlUploadForm.jrxmlUnparsable"; private static final String LOCAL_JRXML_SUFFIX = "_"; private static final String JRXML_TREE_DATA_PROVIDER = "jrxmlTreeDataProvider"; private static final String QUERY_TREE_DATA_PROVIDER = "queryTreeDataProvider"; private static final String INPUT_CONTROL_RESOURCE_TREE_DATA_PROVIDER = "inputControlResourceTreeDataProvider"; private static final String DATA_SOURCE_TREE_DATA_PROVIDER = "dsTreeDataProvider"; public static final String JRXML_FILE_RESOURCE_ALREADY_UPLOADED = "jrxmlFileResourceAlreadyUploaded"; // Request parameters. private static final String REQUEST_PARAM_SELECTED_RESOURCE = "selectedResource"; protected final Log log = LogFactory.getLog(this.getClass()); private RepositoryService repository; protected RepositorySecurityChecker securityChecker; protected ObjectPermissionService permissionService; private EngineService engine; private ConfigurationBean configuration; private JasperServerConstImpl constants = new JasperServerConstImpl(); private String queryReferenceReqAttrName; private String queryReferenceOutpuAttrName; private String reportQueryLanguageFlowAttribute; private static final String ATTRIBUTE_ORGANIZATION_ID = "organizationId"; private static final String ATTRIBUTE_PUBLIC_FOLDER_URI = "publicFolderUri"; private SecurityContextProvider securityContextProvider; protected MessageSource messages; private BaseTreeDataProvider jrxmlTreeDataProvider; private TypedTreeDataProvider queryTreeDataProvider; private TypedTreeDataProvider inputControlResourceTreeDataProvider; private TypedTreeDataProvider dataSourceTreeDataProvider; private CustomReportDataSourceServiceFactory customDataSourceFactory; private OlapReportCheckUtil olapReportCheckUtil; @Autowired private DataSourceJsonHelper dataSourceJsonHelper; public ReportUnitAction() { setFormObjectClass(ReportUnitWrapper.class); setFormObjectName(FORM_OBJECT_KEY); setFormObjectScope(ScopeType.FLOW); } public void setCustomDataSourceFactory(CustomReportDataSourceServiceFactory customDataSourceFactory) { this.customDataSourceFactory = customDataSourceFactory; } public void setMessages(MessageSource messages) { this.messages = messages; } public void setSecurityChecker(RepositorySecurityChecker securityChecker) { this.securityChecker = securityChecker; } public void setPermissionService(ObjectPermissionService permissionService) { this.permissionService = permissionService; } public void setOlapReportCheckUtil(OlapReportCheckUtil olapReportCheckUtil) { this.olapReportCheckUtil = olapReportCheckUtil; } public Event checkPermissions(RequestContext context) throws Exception { String folderUri = getParentFolderUri(context); String resourceUri = context.getRequestParameters().get(REQUEST_PARAM_SELECTED_RESOURCE); if (folderUri != null && folderUri.length() > 0) { Folder folder = repository.getFolder(null, folderUri); Resource resource = null; if (resourceUri != null && resourceUri.length() > 0) { resource = repository.getResource(null, resourceUri); } // Case 1: folder exists, is editable and no resource selected (new report is added). if ((folder != null && resourceUri == null && securityChecker.isEditable(folder)) || // Case 2: folder exists, resource exists and is editable (existing resource is being edited). (folder != null && resource != null && securityChecker.isEditable(resource))) { return yes(); } else { return no(); } } else { throw new AccessDeniedException("Access is denied"); } } public Event initAction(RequestContext context) throws Exception { ReportUnitWrapper wrapper = getFormReportUnitWrapper(context); // Get a list of all jrxmls in repo and set in the formObject FilterCriteria criteria = FilterCriteria.createFilter(FileResource.class); criteria.addFilterElement(FilterCriteria.createPropertyEqualsFilter("fileType", FileResource.TYPE_JRXML)); ResourceLookup[] lookups = repository.findResource(JasperServerUtil.getExecutionContext(context), criteria); List allJrxmls = null; if (lookups != null && lookups.length != 0) { log("Found JRXML lookups size=" + lookups.length); allJrxmls = new ArrayList(lookups.length); for (int i = 0; i < lookups.length; i++) { Resource fileR = (Resource) lookups[i]; allJrxmls.add(fileR.getURIString()); log("added uri=" + fileR.getURIString()); } wrapper.setReusableJrxmls(allJrxmls); } else { log("No reusable Jrxmls found"); } /* In new Mode get a list of all resources already present in the chosen * folder, to validate report name's uniqueness */ if (wrapper.isNewMode()) { String folderURI = wrapper.getReportUnit().getParentFolder(); if (folderURI == null) { folderURI = "/"; } FilterCriteria resourcesInFolder = FilterCriteria.createFilter(); resourcesInFolder.addFilterElement(FilterCriteria.createParentFolderFilter(folderURI)); log("Searching for resources in the chosen folder:" + folderURI); ResourceLookup[] existingResources = repository .findResource(JasperServerUtil.getExecutionContext(context), resourcesInFolder); if (existingResources != null && existingResources.length != 0) { log("res lookup size=" + existingResources.length); List allResources = new ArrayList(); for (int i = 0; i < existingResources.length; i++) { ResourceLookup rLookup = existingResources[i]; allResources.add(rLookup.getName()); log("adding resource: " + rLookup.getName() + " to the list"); } wrapper.setExistingResources(allResources); } } else { setJRXMLQueryLanguage(context, false); } context.getFlowScope().put("constants", constants); context.getRequestScope().put(ATTRIBUTE_ORGANIZATION_ID, securityContextProvider.getContextUser().getTenantId()); context.getRequestScope().put(ATTRIBUTE_PUBLIC_FOLDER_URI, configuration.getPublicFolderUri()); context.getExternalContext().getSessionMap().put(JRXML_TREE_DATA_PROVIDER, jrxmlTreeDataProvider); context.getExternalContext().getSessionMap().put(QUERY_TREE_DATA_PROVIDER, queryTreeDataProvider); context.getExternalContext().getSessionMap().put(INPUT_CONTROL_RESOURCE_TREE_DATA_PROVIDER, inputControlResourceTreeDataProvider); context.getExternalContext().getSessionMap().put(DATA_SOURCE_TREE_DATA_PROVIDER, dataSourceTreeDataProvider); context.getFlowScope().put(ATTRIBUTE_RESOURCE_ID_NOT_SUPPORTED_SYMBOLS, configuration.getResourceIdNotSupportedSymbols()); return success(); } public void setSecurityContextProvider(SecurityContextProvider securityContextProvider) { this.securityContextProvider = securityContextProvider; } protected ReportUnitWrapper getFormReportUnitWrapper(RequestContext context) { try { return (ReportUnitWrapper) getFormObject(context); } catch (Exception e) { throw new JSExceptionWrapper(e); } } public Event uploadJRXML(RequestContext context) throws Exception { //context.getRequestParameters().get("fileName"); ReportUnitWrapper wrapper = getFormReportUnitWrapper(context); String jrxmlSource = wrapper.getSource(); // jrxmlSource should never be null with validations in place ReportUnit ru = wrapper.getReportUnit(); ResourceReference jrxmlRef = ru.getMainReport(); if (jrxmlSource != null && jrxmlSource.equals(constants.getFieldChoiceFile())) { log("JRXML source was " + constants.getFieldChoiceFile()); FileResource jrxml; String fileName = context.getRequestParameters().get("fileName"); if (!jrxmlRef.isLocal()) { // The jrxml holds object instance of type FileResourceLookup jrxml = (FileResource) repository.newResource(null, FileResource.class); log("Replaced the JRXML lookup instance with a real object"); jrxml.setData(wrapper.getJrxmlData()); jrxml.setFileType(FileResource.TYPE_JRXML); jrxml.setName(ru.getName() + LOCAL_JRXML_SUFFIX); jrxmlRef = new ResourceReference(jrxml); context.getFlowScope().put(JRXML_FILE_RESOURCE_ALREADY_UPLOADED, fileName); wrapper.setJrxmlChanged(true); } else { // jrxml hold an instance of type FileResource log("Jrxml instance was FileResource"); jrxml = (FileResource) jrxmlRef.getLocalResource(); if (wrapper.getJrxmlData() != null && wrapper.getJrxmlData().length != 0) { // User uploaded a new jrxml file, change the data log("Setting the uploaded data into the jrxml"); if (jrxml.getName() == null) { log("Jrxml Name was null, setting it now"); jrxml.setName(ru.getName() + LOCAL_JRXML_SUFFIX); } jrxml.setData(wrapper.getJrxmlData()); context.getFlowScope().put(JRXML_FILE_RESOURCE_ALREADY_UPLOADED, fileName); wrapper.setJrxmlChanged(true); } else { log("No Jrxml upload detected"); // user didnt upload a new file, JRXML is not changed } } if (jrxml.getLabel() == null) jrxml.setLabel(ru.getLabel()); // jrxml.setDescription(ru.getDescription()); ru.setMainReport(jrxml); } else { if (jrxmlRef.isLocal()) { // The jrxml object is not a FileResourceLookup object, change // the object jrxmlRef = new ResourceReference(wrapper.getJrxmlUri()); log("Replaced the JRXML instance with a lookup object"); log("Jrxml uri set to " + jrxmlRef.getReferenceURI()); context.getFlowScope().put(JRXML_FILE_RESOURCE_ALREADY_UPLOADED, ""); wrapper.setJrxmlChanged(true); } else { // jrxml is an instance of JRXML Lookup log("Setting the lookup uri onto the JRXML lookup"); if (!jrxmlRef.getReferenceURI().equals(wrapper.getJrxmlUri())) { // User changed the jrxml URI selection, JRXML is changed context.getFlowScope().put(JRXML_FILE_RESOURCE_ALREADY_UPLOADED, ""); wrapper.setJrxmlChanged(true); wrapper.setOldJrxmlUri(jrxmlRef.getReferenceURI()); jrxmlRef.setReference(wrapper.getJrxmlUri()); log("Jrxml uri set to " + jrxmlRef.getReferenceURI()); } else { log("JRXML URI was not changed"); // The selected URI is same as earlier one, JRXML is not // changed } } ru.setMainReport(jrxmlRef); } // If jrxml is changed, parse jrxml to get a list of suggested resources if (wrapper.isJrxmlChanged()) { log("jrxml was changed, parsing now"); wrapper.setHasSuggestedResources(false); List sugResources = wrapper.getSuggestedResources(); if (sugResources != null && !sugResources.isEmpty()) { // Lose previous unlocated resources (if they were suggested // sometime earlier) for (int i = sugResources.size() - 1; i > -1; i--) { FileResourceWrapper frW = (FileResourceWrapper) sugResources.get(i); if (!frW.isLocated()) { sugResources.remove(i); ru.removeResourceLocal(frW.getFileResource().getName()); } } // Clear the suggested Resources list sugResources = null; } wrapper.setHasSuggestedControls(false); List sugControls = wrapper.getSuggestedControls(); if (sugControls != null && !sugControls.isEmpty()) { // Lose previous unlocated controls (if they were suggested // sometime earlier) for (int i = sugControls.size() - 1; i > -1; i--) { InputControlWrapper icW = (InputControlWrapper) sugControls.get(i); if (!icW.isLocated()) { sugControls.remove(i); ru.removeInputControlLocal(icW.getInputControl().getName()); } } // Clear the suggested Controls list sugControls = null; } Resource[] parsedResources = null; try { parsedResources = engine.getResources(jrxmlRef); } catch (Exception ex) { //The JRXML file couldnt be parsed context.getRequestScope().put(UNPARSABLE_JRXML_ATTR, UNPARSABLE_JRXML_MESSAGE_KEY); wrapper.setJrxmlLocated(false); wrapper.setJrxmlData(null); return error(); } if (parsedResources != null || parsedResources.length != 0) { log("Parsed " + parsedResources.length + " from JRXML"); for (int i = 0; i < parsedResources.length; i++) { Resource resource = parsedResources[i]; if (FileResource.class.isAssignableFrom(resource.getClass())) { // Resource is a FileResource object wrapper.setHasSuggestedResources(true); FileResource suggestedFileResource = (FileResource) resource; FileResourceWrapper frW = new FileResourceWrapper(); frW.setFileResource(suggestedFileResource); log("Detected suggested FileResource : " + suggestedFileResource.getName() + " of type " + suggestedFileResource.getFileType()); // Check if a resource by this name is already added FileResource addedFr = ru.getResourceLocal(suggestedFileResource.getName()); if (addedFr != null) { log("Suggested FileResource is alreday added"); // mark it added, in the wrapper frW.setLocated(true); } else { // The resource is not added already, dont mark it // located log("Adding Suggested FileResource to ReportUnit now"); ru.addResource(suggestedFileResource); } // Keep a wrapped copy to track if (sugResources == null) sugResources = new ArrayList(parsedResources.length - i); sugResources.add(frW); } else { if (InputControl.class.isAssignableFrom(resource.getClass())) { // Resource object is an InputControl wrapper.setHasSuggestedControls(true); InputControl suggestedControl = (InputControl) resource; InputControlWrapper icW = new InputControlWrapper(suggestedControl); log("Detected suggested Control : " + suggestedControl.getName()); // Check if a resource by this name is already added InputControl removedIc = ru.getInputControl(suggestedControl.getName()); if (removedIc != null) { // Mark the control as added in the wrapper icW.setLocated(true); } else { // Suggested Control isnt added to the // ReportUnit already ru.addInputControl(suggestedControl); } // Keep a wrapped copy to track if (sugControls == null) sugControls = new ArrayList(parsedResources.length - i); icW.setSuggested(true); sugResources.add(icW); } } } } else { log("Found no resources on parsing jrxml"); } wrapper.setSuggestedResources(sugResources); wrapper.setSuggestedControls(sugControls); setJRXMLQueryLanguage(context, true); } return success(); } public Event setupListResources(RequestContext context) throws Exception { context.getRequestScope().put("allTypes", configuration.getAllFileResourceTypes()); return success(); } /* Events originating from list resources page */ public Event removeResource(RequestContext context) throws Exception { log("In removeResource"); ReportUnitWrapper ruWrapper = getFormReportUnitWrapper(context); String resName = context.getRequestParameters().get(PARAM_RESOURCE_NAME); log("recieved resName param=" + resName); if (resName != null && resName.trim().length() != 0) { ReportUnit ru = ruWrapper.getReportUnit(); ru.removeResourceLocal(resName); List sugRes = ruWrapper.getSuggestedResources(); List allResources = ru.getResources(); if (ru.getResources() == null || ru.getResources().isEmpty() || (sugRes != null && allResources.size() - sugRes.size() == 0)) ruWrapper.setHasNonSuggestedResources(false); // If the resource figures in the suggested resources list, remove if (sugRes != null && !sugRes.isEmpty()) { for (int i = 0; i < sugRes.size(); i++) { FileResourceWrapper fr = (FileResourceWrapper) sugRes.get(i); if (fr.getFileResource().getName().equals(resName)) fr.setLocated(false); } } } return success(); } public Event removeControl(RequestContext context) throws Exception { log("In removeControl"); ReportUnitWrapper ruWrapper = getFormReportUnitWrapper(context); String resName = context.getRequestParameters().get(PARAM_RESOURCE_NAME); log("recieved resName param=" + resName); if (resName != null && resName.trim().length() != 0) { ReportUnit ru = ruWrapper.getReportUnit(); if (ru.getInputControl(resName) != null) ru.removeInputControlLocal(resName); else ru.removeInputControlReference(resName); List sugCont = ruWrapper.getSuggestedControls(); List allControls = ru.getInputControls(); if (allControls == null || allControls.isEmpty() || (sugCont != null && allControls.size() - sugCont.size() == 0)) ruWrapper.setHasNonSuggestedControls(false); // If the name figures in suggested controls list mark the control // as Not added if (sugCont != null && !sugCont.isEmpty()) { for (int i = 0; i < sugCont.size(); i++) { InputControlWrapper icW = (InputControlWrapper) sugCont.get(i); if (icW.getInputControl().getName().equals(resName)) icW.setLocated(false); } } } return success(); } public Event addResource(RequestContext context) throws Exception { log("In addNewResource"); ReportUnitWrapper ruWrapper = getFormReportUnitWrapper(context); FileResourceWrapper frW = new FileResourceWrapper(); FileResource fileR = (FileResource) repository.newResource(null, FileResource.class); frW.setMode(BaseDTO.MODE_SUB_FLOW_NEW); frW.setFileResource(fileR); // Set current form object to validate duplicate resource names frW.setParentFlowObject(ruWrapper); // Set the FileResourceWrapper object into scope for the subflow context.getFlowScope().put(FileResourceAction.getFORM_OBJECT_KEY(), frW); return success(); } private List getControlsList(RequestContext context) { List existingPathsList = new ArrayList(); FilterCriteria criteria = FilterCriteria.createFilter(InputControl.class); ResourceLookup[] lookups = repository.findResource(JasperServerUtil.getExecutionContext(context), criteria); if (lookups != null) { for (int i = 0; i < lookups.length; i++) { existingPathsList.add(lookups[i].getURIString()); } } return existingPathsList; } public Event addControl(RequestContext context) throws Exception { log("In addNewControl"); ReportUnitWrapper ruWrapper = getFormReportUnitWrapper(context); InputControlWrapper icW = new InputControlWrapper(); InputControl ic = (InputControl) repository.newResource(null, InputControl.class); icW.setMode(BaseDTO.MODE_SUB_FLOW_NEW); icW.setInputControl(ic); // Set current form object to validate duplicate resource names icW.setParentFlowObject(ruWrapper); // Set the InputControlWrapper into scope for the subflow context.getFlowScope().put(DefineInputControlsAction.getFORM_OBJECT_KEY(), icW); ruWrapper.setInputControlList(getControlsList(context)); ruWrapper.setInputControlSource(JasperServerConstImpl.getFieldChoiceRepo()); return success(); } public Event editResource(RequestContext context) throws Exception { log("In editResource"); ReportUnitWrapper ruWrapper = getFormReportUnitWrapper(context); String resName = context.getRequestParameters().get(PARAM_RESOURCE_NAME); log("recieved resName param=" + resName); if (resName != null && resName.trim().length() != 0) { FileResource fileR = ruWrapper.getReportUnit().getResourceLocal(resName); if (fileR == null) { log("NO Local resource by that name"); } else { log("Passed resName=" + fileR.getName() + " type=" + fileR.getFileType()); } FileResourceWrapper frW = new FileResourceWrapper(); frW.setMode(BaseDTO.MODE_SUB_FLOW_EDIT); frW.setParentFlowObject(ruWrapper); if (fileR != null) { frW.setFileResource(new FileResourceImpl((FileResourceImpl) fileR)); if (fileR.isReference()) { frW.setSource(JasperServerConst.FIELD_CHOICE_CONT_REPO); frW.setNewUri(fileR.getReferenceURI()); } else { frW.setSource(JasperServerConst.FIELD_CHOICE_FILE_SYSTEM); if (!fileR.isNew()) { frW.setLocated(true); } } } // Set the FileResourceWrapper object into scope for the subflow context.getFlowScope().put(FileResourceAction.getFORM_OBJECT_KEY(), frW); } return success(); } public Event editControl(RequestContext context) throws Exception { log("In editControl"); ReportUnitWrapper ruWrapper = getFormReportUnitWrapper(context); String resName = context.getRequestParameters().get(PARAM_RESOURCE_NAME); if (resName != null && resName.trim().length() != 0) { InputControl ic = ruWrapper.getReportUnit().getInputControl(resName); InputControlWrapper icW = new InputControlWrapper(); icW.setMode(BaseDTO.MODE_SUB_FLOW_EDIT); icW.setInputControl(new InputControlImpl((InputControlImpl) ic)); // Set the FileResourceWrapper object into scope for the subflow context.getFlowScope().put(DefineInputControlsAction.getFORM_OBJECT_KEY(), icW); ruWrapper.setInputControlList(getControlsList(context)); if (ic == null) { ruWrapper.setInputControlPath(resName); ruWrapper.setInputControlSource(JasperServerConstImpl.getFieldChoiceRepo()); icW.setOldInputControlURI(resName); } else ruWrapper.setInputControlSource(JasperServerConstImpl.getFieldChoiceLocal()); } return success(); } public Event selectControlType(RequestContext context) throws Exception { ReportUnitWrapper ruWrapper = getFormReportUnitWrapper(context); InputControlWrapper icW = (InputControlWrapper) context.getFlowScope() .get(DefineInputControlsAction.getFORM_OBJECT_KEY()); String source = context.getRequestParameters().get("inputControlSource"); if (source.equals(JasperServerConstImpl.getFieldChoiceLocal())) { if (icW.getInputControl() == null) { InputControl ic = (InputControl) repository.newResource(null, InputControl.class); icW.setInputControl(ic); icW.setMode(BaseDTO.MODE_SUB_FLOW_NEW); } return yes(); } else { String path;// = ruWrapper.getInputControlPath(); FIXME path = context.getRequestParameters().get("inputControlPath"); ResourceReference inputControlURI = new ResourceReference(path); icW.setInputControlURI(inputControlURI); return no(); } } /* End events originating from List resources page */ public Event saveResource(RequestContext context) throws Exception { log("In saveResource"); ReportUnitWrapper ruWrapper = getFormReportUnitWrapper(context); FileResourceWrapper frW = (FileResourceWrapper) context.getFlowScope() .get(FileResourceAction.getFORM_OBJECT_KEY()); if (frW != null) { // FileResourceWrapper returned by a subflow, determine if its new // object or edited if (frW.isEditMode()) { ReportUnit ru = ruWrapper.getReportUnit(); // If the FileResource is a suggested one, change that reference // also List sugRes = ruWrapper.getSuggestedResources(); if (sugRes != null && !sugRes.isEmpty()) { for (int i = 0; i < sugRes.size(); i++) { FileResourceWrapper sRW = (FileResourceWrapper) sugRes.get(i); if (sRW.getFileResource().getName().equals(frW.getFileResource().getName())) { sRW.setFileResource(frW.getFileResource()); sRW.setLocated(true); break; } } } ru.removeResourceLocal(frW.getFileResource().getName()); } // In any case save the new/edited FileResource into ReportUnit ruWrapper.getReportUnit().addResource(frW.getFileResource()); } return success(); } public Event saveControl(RequestContext context) throws Exception { log("In saveControl"); ReportUnitWrapper ruWrapper = getFormReportUnitWrapper(context); InputControlWrapper icW = (InputControlWrapper) context.getFlowScope() .get(DefineInputControlsAction.getFORM_OBJECT_KEY()); if (icW != null) { // InputControlWrapper returned by a subflow if (icW.isEditMode()) { replaceInputControl(ruWrapper, icW); // If the InputControl is suggested, update it updateSuggestedInputControl(ruWrapper, icW); } else { addInputControl(ruWrapper, icW); } ruWrapper.setHasNonSuggestedControls(true); } return success(); } protected void addInputControl(ReportUnitWrapper ruWrapper, InputControlWrapper icW) { ReportUnit report = ruWrapper.getReportUnit(); String oldInputControlReference = icW.getOldInputControlURI(); if (oldInputControlReference == null) { if (icW.getInputControlURI() == null) { report.addInputControl(icW.getInputControl()); } else { report.addInputControl(icW.getInputControlURI()); } } else { if (icW.getInputControlURI() == null) { report.replaceInputControlReference(oldInputControlReference, icW.getInputControl()); } else { report.replaceInputControlReference(oldInputControlReference, icW.getInputControlURI()); } } } protected void replaceInputControl(ReportUnitWrapper ruWrapper, InputControlWrapper icW) { ReportUnit report = ruWrapper.getReportUnit(); String oldInputControlReference = icW.getOldInputControlURI(); if (oldInputControlReference == null) { String oldInputControlName = icW.getInputControl().getName(); if (icW.getInputControlURI() == null) { report.replaceInputControlLocal(oldInputControlName, icW.getInputControl()); } else { report.replaceInputControlLocal(oldInputControlName, icW.getInputControlURI()); } } else { if (icW.getInputControlURI() == null) { report.replaceInputControlReference(oldInputControlReference, icW.getInputControl()); } else { report.replaceInputControlReference(oldInputControlReference, icW.getInputControlURI()); } } } protected void updateSuggestedInputControl(ReportUnitWrapper ruWrapper, InputControlWrapper icW) { List sugControls = ruWrapper.getSuggestedControls(); if (sugControls != null && !sugControls.isEmpty()) { for (int i = 0; i < sugControls.size(); i++) { InputControlWrapper sICW = (InputControlWrapper) sugControls.get(i); if (icW.getInputControlURI() != null) { if (icW.getInputControlURI().getReferenceURI() .equals(sICW.getInputControlURI().getReferenceURI())) { sICW.setInputControlURI(icW.getInputControlURI()); sICW.setLocated(true); break; } } else { if (icW.getInputControl().getName().equals(sICW.getInputControl().getName())) { sICW.setInputControl(icW.getInputControl()); sICW.setLocated(true); break; } } } } } public Event locateDataSource(RequestContext context) throws Exception { log("In locate data source"); ReportUnitWrapper ruWrapper = getFormReportUnitWrapper(context); ResourceReference dsRef = ruWrapper.getReportUnit().getDataSource(); ReportDataSourceWrapper rdWrapper = new ReportDataSourceWrapper(); rdWrapper.setMode(BaseDTO.MODE_SUB_FLOW_NEW); rdWrapper.setParentFlowObject(ruWrapper); rdWrapper.setParentType(DATA_SOURCE_PARENT_TYPE); if (dsRef == null || (dsRef.getReferenceURI() == null && dsRef.getLocalResource() == null)) { log("Found no previous ReportDataSource, creating new"); ReportDataSource ds = (ReportDataSource) repository.newResource(null, JdbcReportDataSource.class); String parentFolder = (String) context.getFlowScope().get(PARENT_FOLDER_ATTR); if (parentFolder == null) { parentFolder = context.getRequestParameters().get("ParentFolderUri"); context.getFlowScope().put(PARENT_FOLDER_ATTR, parentFolder); } ds.setParentFolder(parentFolder); rdWrapper.setSource(constants.getFieldChoiceNone()); rdWrapper.setType(constants.getJDBCDatasourceType()); rdWrapper.setReportDataSource(ds); } else { // if the dataSource exists decide source and type and set in // wrapper if (dsRef.isLocal()) { rdWrapper.setSource(constants.getFieldChoiceLocal()); ReportDataSource ds = (ReportDataSource) dsRef.getLocalResource(); if (ds != null) { final String editedDataSourceJson = (String) context.getFlowScope() .get(ReportDataSourceWrapper.ATTRIBUTE_DATA_SOURCE_JSON); if (editedDataSourceJson != null) { rdWrapper.setDataSourceJson(editedDataSourceJson); } else { rdWrapper.setDataSourceUri(ds.getURIString()); } if (JdbcReportDataSource.class.isAssignableFrom(ds.getClass())) { rdWrapper.setType(constants.getJDBCDatasourceType()); } else if (JndiJdbcReportDataSource.class.isAssignableFrom(ds.getClass())) { rdWrapper.setType(constants.getJNDIDatasourceType()); } else if (VirtualReportDataSource.class.isAssignableFrom(ds.getClass())) { rdWrapper.setType(constants.getVirtualDatasourceType()); } else if (BeanReportDataSource.class.isAssignableFrom(ds.getClass())) { rdWrapper.setType(constants.getBeanDatasourceType()); } else if (ds instanceof CustomReportDataSource) { CustomReportDataSource cds = (CustomReportDataSource) ds; // look up definition & use it to init defaults & set prop defs CustomDataSourceDefinition customDef = customDataSourceFactory.getDefinition(cds); rdWrapper.setType(customDef.getName()); } } rdWrapper.setMode(BaseDTO.MODE_SUB_FLOW_EDIT); rdWrapper.setReportDataSource(ds); } else { // DataSource object is a lookup rdWrapper.setSelectedUri(dsRef.getReferenceURI()); log("Found ReportDataSourceLookup"); ReportDataSource ds = (ReportDataSource) repository.newResource(null, JdbcReportDataSource.class); String parentFolder = (String) context.getFlowScope().get(PARENT_FOLDER_ATTR); if (parentFolder == null) { parentFolder = (String) context.getRequestParameters().get("ParentFolderUri"); context.getFlowScope().put(PARENT_FOLDER_ATTR, parentFolder); } dsRef = new ResourceReference(ds); ds.setParentFolder(parentFolder); rdWrapper.setSource(constants.getFieldChoiceRepo()); rdWrapper.setReportDataSource(ds); } } // Set the object into scope with the name that the reportDataSourceFlow // can pickup context.getFlowScope().put(DataSourceAction.FORM_OBJECT_KEY, rdWrapper); return success(); } public Event saveDatasource(RequestContext context) throws Exception { // Save the returned datasource info ReportDataSourceWrapper resource = (ReportDataSourceWrapper) context.getFlowScope() .get(DATASOURCE_OBJECT_KEY); final ParameterMap requestParameters = context.getRequestParameters(); final String dataSourceJson = requestParameters.get("dataSourceJson"); final String dataSourceType = requestParameters.get("dataSourceType"); String source = requestParameters.get("source"); if (source == null) source = constants.getFieldChoiceNone(); if (resource == null && (dataSourceJson == null || dataSourceType == null)) log("Got null datatsource back from subflow"); else log("type was " + (resource != null ? resource.getType() : dataSourceType)); ReportUnitWrapper ruWrapper = getFormReportUnitWrapper(context); if (source.equals(constants.getFieldChoiceRepo())) { ruWrapper.getReportUnit().setDataSourceReference(resource.getSelectedUri()); } else if (source.equals(constants.getFieldChoiceLocal())) { final ReportDataSource reportDataSource; if (dataSourceJson != null && dataSourceType != null) { // save localDataSource JSON to send it back to the client if the data source page is opened again. context.getFlowScope().put(ReportDataSourceWrapper.ATTRIBUTE_DATA_SOURCE_JSON, dataSourceJson); reportDataSource = dataSourceJsonHelper.parse(dataSourceJson, dataSourceType); reportDataSource.setURIString(ruWrapper.getReportUnit().getURIString() + "_files"); } else { reportDataSource = resource.getReportDataSource(); } ruWrapper.getReportUnit().setDataSource(reportDataSource); } else if (source.equals(constants.getFieldChoiceNone())) { ruWrapper.getReportUnit().setDataSource((ResourceReference) null); } return success(); } public Event saveReport(RequestContext context) throws Exception { log("In saveReport"); ReportUnitWrapper ruWrapper = getFormReportUnitWrapper(context); try { repository.saveResource(null, ruWrapper.getReportUnit()); } catch (JSDuplicateResourceException e) { getFormErrors(context).rejectValue("reportUnit.name", "ReportDetailsValidator.error.duplicate"); return error(); } if (!ruWrapper.isEditMode()) { context.getExternalContext().getSessionMap().put("repositorySystemConfirm", messages.getMessage("resource.report.reportAdded", new String[] { ruWrapper.getReportUnit().getName(), ruWrapper.getReportUnit().getParentFolder() }, LocaleContextHolder.getLocale())); } return success(); } public Object createFormObject(RequestContext context) { ReportUnitWrapper formObject = null; String resourceUri = context.getRequestParameters().get(RU_URI_PARAM); if (resourceUri == null) { resourceUri = context.getRequestParameters().get(REQUEST_PARAM_SELECTED_RESOURCE); } if (resourceUri != null && resourceUri.trim().length() != 0) { ReportUnit ru = (ReportUnit) repository.getResource(null, resourceUri); if (ru == null) throw new JSException("jsexception.could.not.find.resource.with.uri", new Object[] { resourceUri }); if (olapReportCheckUtil.isOlapReportFrom421OrBelow(ru)) { context.getRequestScope().put("errorPopupMessage", "error.notImplemented"); throw new JSNotImplementedException(); } log("Found resource with uri=" + resourceUri); formObject = new ReportUnitWrapper(); formObject.setReportUnit(ru); ResourceReference jrxmlRef = ru.getMainReport(); String uri; if (!jrxmlRef.isLocal()) { // ReportUnit is a lookup object formObject.setSource(constants.FIELD_CHOICE_CONT_REPO); uri = jrxmlRef.getReferenceURI(); formObject.setJrxmlUri(uri); } else { formObject.setSource(constants.FIELD_CHOICE_FILE_SYSTEM); uri = jrxmlRef.getLocalResource().getURIString(); } formObject.setOldJrxmlUri(uri); formObject.setOriginalJrxmlUri(uri); formObject.setMode(BaseDTO.MODE_STAND_ALONE_EDIT); formObject.setDatasourceIdentified(true); formObject.setNamed(true); formObject.setJrxmlLocated(true); if (ru.getResources() != null && !ru.getResources().isEmpty()) formObject.setHasNonSuggestedResources(true); else formObject.setHasNonSuggestedResources(false); if (ru.getInputControls() != null && !ru.getInputControls().isEmpty()) formObject.setHasNonSuggestedControls(true); else formObject.setHasNonSuggestedControls(false); } if (formObject == null) { log("ReportUnitAction: Stand alone new mode"); formObject = new ReportUnitWrapper(); ReportUnit ru = (ReportUnit) repository.newResource(null, ReportUnit.class); FileResource jrxml = (FileResource) repository.newResource(null, FileResource.class); jrxml.setFileType(FileResource.TYPE_JRXML); ru.setMainReport(jrxml); formObject.setMode(BaseDTO.MODE_STAND_ALONE_NEW); String parentFolder = getParentFolderUri(context); ru.setParentFolder(parentFolder); formObject.setReportUnit(ru); formObject.setSource(constants.FIELD_CHOICE_FILE_SYSTEM); // TODO set default options when creating new RU formObject.setHasNonSuggestedResources(false); formObject.setHasNonSuggestedControls(false); } return formObject; } private String getParentFolderUri(RequestContext context) { String parentFolder = (String) context.getFlowScope().get(PARENT_FOLDER_ATTR); // add to allow invoking from repository explorer if (parentFolder == null) { parentFolder = (String) context.getRequestParameters().get("ParentFolderUri"); context.getFlowScope().put(PARENT_FOLDER_ATTR, parentFolder); } return parentFolder; } public Event validateReport(RequestContext context) throws Exception { Errors errors = getFormErrors(context); getValidator().validate(getFormObject(context), errors); List fieldErrors = errors.getFieldErrors(); if (fieldErrors != null && !fieldErrors.isEmpty()) { FieldError error = (FieldError) fieldErrors.get(0); String field = error.getField(); if ("reportUnit.name".equals(field) || "reportUnit.label".equals(field) || "reportUnit.description".equals(field)) { return result("displayNameLabelDescForm"); } else if ("source".equals(field) || "jrxmlData".equals(field)) { return result("displayJrxmlUploadForm"); } else if ("validationMessage".equals(field) || "reportUnit.inputControlRenderingView".equals(field)) { return result("listResources"); } } log("In Validate Report"); ReportUnitWrapper ruWrapper = (ReportUnitWrapper) getFormObject(context); ReportUnit ru = ruWrapper.getReportUnit(); ValidationResult result = engine.validate(null, ru); ruWrapper.setResult(result.getValidationState().equals(ValidationResult.STATE_VALID)); return success(); } /* * method to get the reposervice object arguments: none returns: * RepositoryService */ public RepositoryService getRepository() { return repository; } /* * method to set the reposervice object arguments: RepositoryService * returns: void */ public void setRepository(RepositoryService repository) { this.repository = repository; } public EngineService getEngine() { return engine; } public void setEngine(EngineService engine) { this.engine = engine; } public ConfigurationBean getConfiguration() { return configuration; } public void setConfiguration(ConfigurationBean configuration) { this.configuration = configuration; } /** * Registers a byte array editor to allow spring handle File uploads as byte * arrays */ protected void initBinder(RequestContext context, DataBinder binder) { binder.registerCustomEditor(byte[].class, new ByteArrayMultipartFileEditor()); } private void log(String text) { log.debug(text); } public Event prepareQuery(RequestContext context) throws Exception { ReportUnitWrapper ruWrapper = (ReportUnitWrapper) getFormObject(context); ResourceReference queryRef = ruWrapper.getReportUnit().getQuery(); ResourceReferenceDTO queryRefDTO = new ResourceReferenceDTO(queryRef); context.getRequestScope().put(getQueryReferenceReqAttrName(), queryRefDTO); context.getRequestScope().put(FORM_OBJECT_KEY, ruWrapper); return success(); } public Event setQueryReference(RequestContext context) throws Exception { ResourceReferenceDTO queryRef = (ResourceReferenceDTO) context.getFlowScope() .getRequired(getQueryReferenceOutpuAttrName(), ResourceReferenceDTO.class); ReportUnitWrapper ruWrapper = (ReportUnitWrapper) getFormObject(context); ruWrapper.getReportUnit().setQuery(queryRef.toResourceReference()); return success(); } /** * @return Returns the queryReferenceReqAttrName. */ public String getQueryReferenceReqAttrName() { return queryReferenceReqAttrName; } /** * @param queryReferenceReqAttrName The queryReferenceReqAttrName to set. */ public void setQueryReferenceReqAttrName(String queryReferenceReqAttrName) { this.queryReferenceReqAttrName = queryReferenceReqAttrName; } /** * @return Returns the queryReferenceOutpuAttrName. */ public String getQueryReferenceOutpuAttrName() { return queryReferenceOutpuAttrName; } /** * @param queryReferenceOutpuAttrName The queryReferenceOutpuAttrName to set. */ public void setQueryReferenceOutpuAttrName(String queryReferenceOutpuAttrName) { this.queryReferenceOutpuAttrName = queryReferenceOutpuAttrName; } protected void setJRXMLQueryLanguage(RequestContext context, boolean changed) { ResourceReference mainReport = getFormReportUnitWrapper(context).getReportUnit().getMainReport(); String queryLanguage = engine.getQueryLanguage(JasperServerUtil.getExecutionContext(context), mainReport); context.getFlowScope().put(getReportQueryLanguageFlowAttribute(), queryLanguage); if (changed && queryLanguage != null) { checkDataSource(context, queryLanguage); } } protected void checkDataSource(RequestContext context, String queryLanguage) { ReportUnitWrapper ruWrapper = getFormReportUnitWrapper(context); ReportUnit reportUnit = ruWrapper.getReportUnit(); ResourceReference dsRef = reportUnit.getDataSource(); if (dsRef != null) { ReportDataSource ds = null; if (dsRef.isLocal()) { ds = (ReportDataSource) dsRef.getLocalResource(); } else { String uri = dsRef.getReferenceURI(); if (uri != null) { ds = (ReportDataSource) repository.getResource(JasperServerUtil.getExecutionContext(context), uri); } } if (ds != null) { Set dataSourceTypes = engine.getDataSourceTypes(JasperServerUtil.getExecutionContext(context), queryLanguage); if (!checkDataSourceType(ds, dataSourceTypes)) { if (log.isDebugEnabled()) { log.debug("Data source of report unit " + reportUnit.getURIString() + " does not support " + queryLanguage + " queries, removing"); } //FIXME inform the user about this reportUnit.setDataSource((ResourceReference) null); ruWrapper.setDatasourceIdentified(false); } } } } protected boolean checkDataSourceType(ReportDataSource ds, Set supportedTypes) { boolean valid = false; for (Iterator it = supportedTypes.iterator(); !valid && it.hasNext();) { Class type = (Class) it.next(); if (type.isInstance(ds)) { valid = true; } } return valid; } public String getReportQueryLanguageFlowAttribute() { return reportQueryLanguageFlowAttribute; } public void setReportQueryLanguageFlowAttribute(String queryLanguageFlowAttribute) { this.reportQueryLanguageFlowAttribute = queryLanguageFlowAttribute; } public void setJrxmlTreeDataProvider(BaseTreeDataProvider typedTreeDataProvider) { this.jrxmlTreeDataProvider = typedTreeDataProvider; } public void setQueryTreeDataProvider(TypedTreeDataProvider queryTreeDataProvider) { this.queryTreeDataProvider = queryTreeDataProvider; } public void setInputControlResourceTreeDataProvider( TypedTreeDataProvider inputControlResourceTreeDataProvider) { this.inputControlResourceTreeDataProvider = inputControlResourceTreeDataProvider; } public void setDataSourceTreeDataProvider(TypedTreeDataProvider dataSourceTreeDataProvider) { this.dataSourceTreeDataProvider = dataSourceTreeDataProvider; } }