@Override public Object getRequest() { // If JSP AFTER_VIEW_CONTENT processing has been activated by the // JspViewDeclarationLanguage#buildView(FacesContext, UIViewRoot) method, then return a // ServletRequest that // wraps/decorates the current PortletRequest. This is necessary because the MyFaces // JspViewDeclarationLanguage#buildView(FacesContext, UIViewRoot) method has a Servlet API // dependency due to // explicit casts to HttpServletRequest. if (bridgeContext.isProcessingAfterViewContent()) { if ((bridgeAfterViewContentRequest == null) || (bridgeAfterViewContentRequest.getWrapped() != portletRequest)) { BridgeWriteBehindSupportFactory bridgeWriteBehindSupportFactory = (BridgeWriteBehindSupportFactory) BridgeFactoryFinder.getFactory(BridgeWriteBehindSupportFactory.class); bridgeAfterViewContentRequest = bridgeWriteBehindSupportFactory.getBridgeAfterViewContentRequest(portletRequest); } return bridgeAfterViewContentRequest; } else { return portletRequest; } }
@Override public Flash getFlash() { if (bridgeFlash == null) { BridgeFlashFactory bridgeFlashFactory = (BridgeFlashFactory) BridgeFactoryFinder.getFactory(BridgeFlashFactory.class); bridgeFlash = bridgeFlashFactory.getBridgeFlash(); } return bridgeFlash; }
public ApplicationScopeMap(BridgeContext bridgeContext) { BeanManagerFactory beanManagerFactory = (BeanManagerFactory) BridgeFactoryFinder.getFactory(BeanManagerFactory.class); this.portletContext = bridgeContext.getPortletContext(); String appConfigAttrName = ApplicationConfig.class.getName(); ApplicationConfig applicationConfig = (ApplicationConfig) this.portletContext.getAttribute(appConfigAttrName); this.beanManager = beanManagerFactory.getBeanManager(applicationConfig.getFacesConfig()); // Determines whether or not methods annotated with the @PreDestroy annotation are preferably // invoked // over the @BridgePreDestroy annotation. PortletConfig portletConfig = bridgeContext.getPortletConfig(); this.preferPreDestroy = PortletConfigParam.PreferPreDestroy.getBooleanValue(portletConfig); PreDestroyInvokerFactory preDestroyInvokerFactory = (PreDestroyInvokerFactory) BridgeFactoryFinder.getFactory(PreDestroyInvokerFactory.class); this.preDestroyInvoker = preDestroyInvokerFactory.getPreDestroyInvoker(this); }
public BridgeRequestScopeImpl( PortletConfig portletConfig, PortletContext portletContext, PortletRequest portletRequest, String idPrefix) { this.attributeMap = new HashMap<String, Object>(); long timeInMillis = Calendar.getInstance().getTimeInMillis(); this.idPrefix = idPrefix; this.idSuffix = Long.toString(timeInMillis); BridgeConfigFactory bridgeConfigFactory = (BridgeConfigFactory) BridgeFactoryFinder.getFactory(BridgeConfigFactory.class); BridgeConfig bridgeConfig = bridgeConfigFactory.getBridgeConfig(); this.excludedAttributeNames = new ArrayList<String>(); // Get the list of excluded BridgeRequestScope attributes from the faces-config.xml descriptors. Set<String> facesConfigExcludedAttributeNames = bridgeConfig.getExcludedRequestAttributes(); // Get the list of excluded BridgeRequestScope attributes from the WEB-INF/portlet.xml // descriptor. @SuppressWarnings("unchecked") List<String> portletContextExcludedAttributeNames = (List<String>) portletContext.getAttribute( Bridge.BRIDGE_PACKAGE_PREFIX + portletConfig.getPortletName() + BridgeConstants.CHAR_PERIOD + Bridge.EXCLUDED_REQUEST_ATTRIBUTES); // Combine the two lists into a single list of excluded BridgeRequestScope attributes. if (facesConfigExcludedAttributeNames != null) { this.excludedAttributeNames.addAll(facesConfigExcludedAttributeNames); } if (portletContextExcludedAttributeNames != null) { this.excludedAttributeNames.addAll(portletContextExcludedAttributeNames); } this.preExistingAttributeNames = getPreExistingRequestAttributeNames(portletRequest); Bridge.PortletPhase portletPhase = (Bridge.PortletPhase) portletRequest.getAttribute(Bridge.PORTLET_LIFECYCLE_PHASE); if ((portletPhase == Bridge.PortletPhase.ACTION_PHASE) || (portletPhase == Bridge.PortletPhase.EVENT_PHASE)) { beganInActionOrEventRequest = true; } }
public BridgeRequestScopeImpl( PortletConfig portletConfig, PortletContext portletContext, PortletRequest portletRequest) { this.dateCreated = Calendar.getInstance().getTimeInMillis(); portletName = portletConfig.getPortletName(); PortletSession portletSession = portletRequest.getPortletSession(); String sessionId = portletSession.getId(); this.idPrefix = portletName + ":::" + sessionId + ":::"; this.idSuffix = Long.toString(Calendar.getInstance().getTimeInMillis()); BridgeConfigFactory bridgeConfigFactory = (BridgeConfigFactory) BridgeFactoryFinder.getFactory(BridgeConfigFactory.class); BridgeConfig bridgeConfig = bridgeConfigFactory.getBridgeConfig(); this.excludedAttributeNames = new ArrayList<String>(); // Get the list of excluded BridgeRequestScope attributes from the faces-config.xml descriptors. Set<String> facesConfigExcludedAttributeNames = bridgeConfig.getExcludedRequestAttributes(); // Get the list of excluded BridgeRequestScope attributes from the WEB-INF/portlet.xml // descriptor. @SuppressWarnings("unchecked") List<String> portletContextExcludedAttributeNames = (List<String>) portletContext.getAttribute( Bridge.BRIDGE_PACKAGE_PREFIX + portletName + StringPool.PERIOD + Bridge.EXCLUDED_REQUEST_ATTRIBUTES); // Combine the two lists into a single list of excluded BridgeRequestScope attributes. if (facesConfigExcludedAttributeNames != null) { this.excludedAttributeNames.addAll(facesConfigExcludedAttributeNames); } if (portletContextExcludedAttributeNames != null) { this.excludedAttributeNames.addAll(portletContextExcludedAttributeNames); } this.portletMode = PortletMode.VIEW; this.preExistingAttributeNames = getPreExistingRequestAttributeNames(portletRequest); this.beganInPhase = (Bridge.PortletPhase) portletRequest.getAttribute(Bridge.PORTLET_LIFECYCLE_PHASE); }
@Override public Object getResponse() { // If JSP AFTER_VIEW_CONTENT processing has been activated by the // JspViewDeclarationLanguage#buildView(FacesContext, UIViewRoot) method, then return a // ServletResponse that is // able to handle the AFTER_VIEW_CONTENT feature. This is necessary because the Mojarra // JspViewHandlingStrategy#getWrapper(ExternalContext) method has a Servlet API dependency due // to explicit casts // to HttpServletResponse. Additionally, the MyFaces // JspViewDeclarationLanguage#buildView(FacesContext, // UIViewRoot) method has an explicit cast to HttpServletResponse. if (bridgeContext.isProcessingAfterViewContent()) { if (facesImplementationServletResponse == null) { if ((bridgeAfterViewContentResponse == null) || (bridgeAfterViewContentResponse.getWrapped() != portletResponse)) { BridgeWriteBehindSupportFactory bridgeWriteBehindSupportFactory = (BridgeWriteBehindSupportFactory) BridgeFactoryFinder.getFactory(BridgeWriteBehindSupportFactory.class); bridgeAfterViewContentResponse = bridgeWriteBehindSupportFactory.getBridgeAfterViewContentResponse( portletResponse, getRequestLocale()); } return bridgeAfterViewContentResponse; } else { return facesImplementationServletResponse; } } else { if (isBridgeFlashServletResponseRequired()) { return createFlashHttpServletResponse(); } else { return portletResponse; } } }
public ExternalContextCompatImpl( PortletContext portletContext, PortletRequest portletRequest, PortletResponse portletResponse) { this.portletContext = portletContext; this.portletRequest = portletRequest; this.portletResponse = portletResponse; // Get the bridge configuration. BridgeConfigFactory bridgeConfigFactory = (BridgeConfigFactory) BridgeFactoryFinder.getFactory(BridgeConfigFactory.class); this.bridgeConfig = bridgeConfigFactory.getBridgeConfig(); // Get the BridgeContext. this.bridgeContext = BridgeContext.getCurrentInstance(); this.incongruityContext = bridgeContext.getIncongruityContext(); // Determine whether or not lifecycle incongruities should be managed. this.manageIncongruities = BooleanHelper.toBoolean( bridgeContext.getInitParameter(BridgeConfigConstants.PARAM_MANAGE_INCONGRUITIES), true); }
@Override public void setResponse(Object response) { // Assume that the JSP_AFTER_VIEW_CONTENT feature is deactivated. facesImplementationServletResponse = null; // If JSP AFTER_VIEW_CONTENT processing has been activated by the bridge's // ViewDeclarationLanguageJspImpl#buildView(FacesContext, UIViewRoot) method, then wrap the // specified response // object with a ServletResponse that is able to handle the AFTER_VIEW_CONTENT feature. This is // necessary // because the Mojarra JspViewHandlingStrategy#getWrapper(ExternalContext) method has a Servlet // API dependency // due to explicit casts to HttpServletResponse. if (bridgeContext.isProcessingAfterViewContent()) { // If the specified response is of type HttpServletResponseWrapper, then it is almost certain // that Mojarra's // JspViewHandlingStrategy#executePageToBuildView(FacesContext, UIViewRoot) method is // attempting to wrap the // bridge's response object (that it originally got by calling the // ExternalContext#getResponse() method) // with it's ViewHandlerResponseWrapper, which extends HttpServletResponseWrapper. if (response instanceof HttpServletResponseWrapper) { this.facesImplementationServletResponse = (ServletResponse) response; HttpServletResponseWrapper httpServletResponseWrapper = (HttpServletResponseWrapper) response; ServletResponse wrappedServletResponse = httpServletResponseWrapper.getResponse(); if (wrappedServletResponse instanceof BridgeAfterViewContentResponse) { BridgeAfterViewContentResponse bridgeAfterViewContentPreResponse = (BridgeAfterViewContentResponse) wrappedServletResponse; PortletResponse wrappedPortletResponse = bridgeAfterViewContentPreResponse.getWrapped(); BridgeWriteBehindSupportFactory bridgeWriteBehindSupportFactory = (BridgeWriteBehindSupportFactory) BridgeFactoryFinder.getFactory(BridgeWriteBehindSupportFactory.class); BridgeWriteBehindResponse bridgeWriteBehindResponse = bridgeWriteBehindSupportFactory.getBridgeWriteBehindResponse( (MimeResponse) wrappedPortletResponse, facesImplementationServletResponse); // Note: See comments in BridgeContextImpl#dispatch(String) regarding Liferay's inability // to // accept a wrapped response. This is indeed supported in Pluto. this.portletResponse = (PortletResponse) bridgeWriteBehindResponse; } else { // Since we're unable to determine the wrapped PortletResponse, the following line will // throw an // intentional ClassCastException. Note that this case should never happen. this.portletResponse = (PortletResponse) response; } } // Otherwise, the specified response is of type BridgeAfterViewContentResponse, then Mojarra's // JspViewHandlingStrategy#executePageToBuildView(FacesContext, UIViewRoot) method is trying // to restore the // bridge's response object that it originally got from calling the // ExternalContext#getResponse() method // prior to wrapping with it's ViewHandlerResponseWrapper. else if (response instanceof BridgeAfterViewContentResponse) { BridgeAfterViewContentResponse bridgeAfterViewContentResponse = (BridgeAfterViewContentResponse) response; this.portletResponse = bridgeAfterViewContentResponse.getWrapped(); } // Otherwise, assume that the specified response is a PortletResponse. else { this.portletResponse = (PortletResponse) response; } } // Otherwise, since the JSF AFTER_VIEW_CONTENT feature is not activated, assume that the // specified response is // a PortletResponse. else { this.portletResponse = (PortletResponse) response; } try { boolean requestChanged = false; boolean responseChanged = true; preInitializeObjects(requestChanged, responseChanged); } catch (Exception e) { logger.error(e); } }
@SuppressWarnings("unchecked") public RequestParameterMapMultiPartImpl( BridgeContext bridgeContext, ClientDataRequest clientDataRequest) { try { PortletSession portletSession = clientDataRequest.getPortletSession(); PortletContext portletContext = portletSession.getPortletContext(); // Determine the uploaded files directory path according to the JSF 2.2 proposal: // https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=690 String uploadedFilesDir = portletContext.getInitParameter(CONTEXT_PARAM_UPLOADED_FILES_DIR); if (uploadedFilesDir == null) { uploadedFilesDir = System.getProperty(JAVA_IO_TMPDIR); if (logger.isDebugEnabled()) { logger.debug( "The web.xml context-param name=[{0}] not found, using default system property=[{1}] value=[{2}]", new Object[] {CONTEXT_PARAM_UPLOADED_FILES_DIR, JAVA_IO_TMPDIR, uploadedFilesDir}); } } else { if (logger.isDebugEnabled()) { logger.debug( "Using web.xml context-param name=[{0}] value=[{1}]", new Object[] {CONTEXT_PARAM_UPLOADED_FILES_DIR, uploadedFilesDir}); } } // Using the portlet sessionId, determine a unique folder path and create the path if it does // not exist. String sessionId = portletSession.getId(); File uploadedFilesPath = new File(uploadedFilesDir, sessionId); if (!uploadedFilesPath.exists()) { try { uploadedFilesPath.mkdirs(); } catch (SecurityException e) { uploadedFilesDir = System.getProperty(JAVA_IO_TMPDIR); logger.error( "Security exception message=[{0}] when trying to create unique path=[{1}] so using default system property=[{2}] value=[{3}]", new Object[] { e.getMessage(), uploadedFilesPath.toString(), JAVA_IO_TMPDIR, uploadedFilesDir }); uploadedFilesPath = new File(uploadedFilesDir, sessionId); uploadedFilesPath.mkdirs(); } } // Initialize commons-fileupload with the file upload path. DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory(); diskFileItemFactory.setRepository(uploadedFilesPath); // Initialize commons-fileupload so that uploaded temporary files are not automatically // deleted. diskFileItemFactory.setFileCleaningTracker(null); // Initialize the commons-fileupload size threshold to zero, so that all files will be dumped // to disk // instead of staying in memory. diskFileItemFactory.setSizeThreshold(0); // Determine the max file upload size threshold in bytes. String uploadedFilesMaxSize = portletContext.getInitParameter(CONTEXT_PARAM_UPLOADED_FILE_MAX_SIZE); int fileMaxSize = DEFAULT_FILE_MAX_SIZE; if (uploadedFilesMaxSize == null) { if (logger.isDebugEnabled()) { logger.debug( "The web.xml context-param name=[{0}] not found, using default=[{1}] bytes", new Object[] {CONTEXT_PARAM_UPLOADED_FILE_MAX_SIZE, DEFAULT_FILE_MAX_SIZE}); } } else { try { fileMaxSize = Integer.parseInt(uploadedFilesMaxSize); if (logger.isDebugEnabled()) { logger.debug( "Using web.xml context-param name=[{0}] value=[{1}] bytes", new Object[] {CONTEXT_PARAM_UPLOADED_FILE_MAX_SIZE, fileMaxSize}); } } catch (NumberFormatException e) { logger.error( "Invalid value=[{0}] for web.xml context-param name=[{1}] using default=[{2}] bytes.", new Object[] { uploadedFilesMaxSize, CONTEXT_PARAM_UPLOADED_FILE_MAX_SIZE, DEFAULT_FILE_MAX_SIZE }); } } // Parse the request parameters and save all uploaded files in a map. PortletFileUpload portletFileUpload = new PortletFileUpload(diskFileItemFactory); portletFileUpload.setFileSizeMax(fileMaxSize); requestParameterMap = new HashMap<String, String>(); requestParameterFileMap = new HashMap<String, List<UploadedFile>>(); // Get the namespace that might be found in request parameter names. String namespace = bridgeContext.getPortletContainer().getResponseNamespace(); // FACES-271: Include name+value pairs found in the ActionRequest. PortletContainer portletContainer = bridgeContext.getPortletContainer(); Set<Map.Entry<String, String[]>> actionRequestParameterSet = clientDataRequest.getParameterMap().entrySet(); for (Map.Entry<String, String[]> mapEntry : actionRequestParameterSet) { String parameterName = mapEntry.getKey(); int pos = parameterName.indexOf(namespace); if (pos >= 0) { parameterName = parameterName.substring(pos + namespace.length()); } String[] parameterValues = mapEntry.getValue(); if (parameterValues.length > 0) { String fixedRequestParameterValue = portletContainer.fixRequestParameterValue(parameterValues[0]); requestParameterMap.put(parameterName, fixedRequestParameterValue); logger.debug( "Found in ActionRequest: {0}=[{1}]", parameterName, fixedRequestParameterValue); } } UploadedFileFactory uploadedFileFactory = (UploadedFileFactory) BridgeFactoryFinder.getFactory(UploadedFileFactory.class); // Begin parsing the request for file parts: try { FileItemIterator fileItemIterator = null; if (clientDataRequest instanceof ResourceRequest) { ResourceRequest resourceRequest = (ResourceRequest) clientDataRequest; fileItemIterator = portletFileUpload.getItemIterator(new ActionRequestAdapter(resourceRequest)); } else { ActionRequest actionRequest = (ActionRequest) clientDataRequest; fileItemIterator = portletFileUpload.getItemIterator(actionRequest); } boolean optimizeNamespace = BooleanHelper.toBoolean( bridgeContext.getInitParameter( BridgeConfigConstants.PARAM_OPTIMIZE_PORTLET_NAMESPACE1), true); if (fileItemIterator != null) { int totalFiles = 0; // For each field found in the request: while (fileItemIterator.hasNext()) { try { totalFiles++; // Get the stream of field data from the request. FileItemStream fieldStream = (FileItemStream) fileItemIterator.next(); // Get field name from the field stream. String fieldName = fieldStream.getFieldName(); // If namespace optimization is enabled and the namespace is present in the field // name, // then remove the portlet namespace from the field name. if (optimizeNamespace) { int pos = fieldName.indexOf(namespace); if (pos >= 0) { fieldName = fieldName.substring(pos + namespace.length()); } } // Get the content-type, and file-name from the field stream. String contentType = fieldStream.getContentType(); boolean formField = fieldStream.isFormField(); String fileName = null; try { fileName = fieldStream.getName(); } catch (InvalidFileNameException e) { fileName = e.getName(); } // Copy the stream of file data to a temporary file. NOTE: This is necessary even if // the // current field is a simple form-field because the call below to // diskFileItem.getString() // will fail otherwise. DiskFileItem diskFileItem = (DiskFileItem) diskFileItemFactory.createItem(fieldName, contentType, formField, fileName); Streams.copy(fieldStream.openStream(), diskFileItem.getOutputStream(), true); // If the current field is a simple form-field, then save the form field value in the // map. if (diskFileItem.isFormField()) { String requestParameterValue = diskFileItem.getString(clientDataRequest.getCharacterEncoding()); String fixedRequestParameterValue = portletContainer.fixRequestParameterValue(requestParameterValue); requestParameterMap.put(fieldName, fixedRequestParameterValue); logger.debug("{0}=[{1}]", fieldName, fixedRequestParameterValue); } else { File tempFile = diskFileItem.getStoreLocation(); // If the copy was successful, then if (tempFile.exists()) { // Copy the commons-fileupload temporary file to a file in the same temporary // location, but with the filename provided by the user in the upload. This has // two // benefits: 1) The temporary file will have a nice meaningful name. 2) By copying // the file, the developer can have access to a semi-permanent file, because the // commmons-fileupload DiskFileItem.finalize() method automatically deletes the // temporary one. String tempFileName = tempFile.getName(); String tempFileAbsolutePath = tempFile.getAbsolutePath(); String copiedFileName = stripIllegalCharacters(fileName); String copiedFileAbsolutePath = tempFileAbsolutePath.replace(tempFileName, copiedFileName); File copiedFile = new File(copiedFileAbsolutePath); FileUtils.copyFile(tempFile, copiedFile); // If present, build up a map of headers. Map<String, List<String>> headersMap = new HashMap<String, List<String>>(); FileItemHeaders fileItemHeaders = fieldStream.getHeaders(); if (fileItemHeaders != null) { Iterator<String> headerNameItr = fileItemHeaders.getHeaderNames(); if (headerNameItr != null) { while (headerNameItr.hasNext()) { String headerName = headerNameItr.next(); Iterator<String> headerValuesItr = fileItemHeaders.getHeaders(headerName); List<String> headerValues = new ArrayList<String>(); if (headerValuesItr != null) { while (headerValuesItr.hasNext()) { String headerValue = headerValuesItr.next(); headerValues.add(headerValue); } } headersMap.put(headerName, headerValues); } } } // Put a valid UploadedFile instance into the map that contains all of the // uploaded file's attributes, along with a successful status. Map<String, Object> attributeMap = new HashMap<String, Object>(); String id = Long.toString(((long) hashCode()) + System.currentTimeMillis()); String message = null; UploadedFile uploadedFile = uploadedFileFactory.getUploadedFile( copiedFileAbsolutePath, attributeMap, diskFileItem.getCharSet(), diskFileItem.getContentType(), headersMap, id, message, fileName, diskFileItem.getSize(), UploadedFile.Status.FILE_SAVED); requestParameterMap.put(fieldName, copiedFileAbsolutePath); addUploadedFile(fieldName, uploadedFile); logger.debug( "Received uploaded file fieldName=[{0}] fileName=[{1}]", fieldName, fileName); } } } catch (Exception e) { logger.error(e); UploadedFile uploadedFile = uploadedFileFactory.getUploadedFile(e); String fieldName = Integer.toString(totalFiles); addUploadedFile(fieldName, uploadedFile); } } } } // If there was an error in parsing the request for file parts, then put a bogus UploadedFile // instance in // the map so that the developer can have some idea that something went wrong. catch (Exception e) { logger.error(e); UploadedFile uploadedFile = uploadedFileFactory.getUploadedFile(e); addUploadedFile("unknown", uploadedFile); } clientDataRequest.setAttribute(PARAM_UPLOADED_FILES, requestParameterFileMap); // If not found in the request, Section 6.9 of the Bridge spec requires that the value of the // ResponseStateManager.RENDER_KIT_ID_PARAM request parameter be set to the value of the // "javax.portlet.faces.<portletName>.defaultRenderKitId" PortletContext attribute. String renderKitIdParam = requestParameterMap.get(ResponseStateManager.RENDER_KIT_ID_PARAM); if (renderKitIdParam == null) { renderKitIdParam = bridgeContext.getDefaultRenderKitId(); if (renderKitIdParam != null) { requestParameterMap.put(ResponseStateManager.RENDER_KIT_ID_PARAM, renderKitIdParam); } } } catch (Exception e) { logger.error(e.getMessage(), e); } }