You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by sh...@apache.org on 2015/07/12 21:46:55 UTC

svn commit: r1690515 - in /ofbiz/trunk/specialpurpose/example: ./ config/ lib/ src/org/ofbiz/example/ webapp/example/WEB-INF/ widget/example/

Author: shijh
Date: Sun Jul 12 19:46:54 2015
New Revision: 1690515

URL: http://svn.apache.org/r1690515
Log:
OFBIZ-6504.

Add an example to protect a pdf generated by FOP with owner password and user password.

Added:
    ofbiz/trunk/specialpurpose/example/config/examplepdf.properties   (with props)
    ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar   (with props)
    ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java   (with props)
Modified:
    ofbiz/trunk/specialpurpose/example/build.xml
    ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml
    ofbiz/trunk/specialpurpose/example/ofbiz-component.xml
    ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml
    ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml
    ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml
    ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml

Modified: ofbiz/trunk/specialpurpose/example/build.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/build.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/example/build.xml (original)
+++ ofbiz/trunk/specialpurpose/example/build.xml Sun Jul 12 19:46:54 2015
@@ -51,5 +51,6 @@ under the License.
         <fileset dir="../../framework/webapp/lib" includes="*.jar"/>
         <fileset dir="../../framework/webapp/build/lib" includes="*.jar"/>
         <fileset dir="../../framework/common/build/lib" includes="*.jar"/>
+        <fileset dir="../../applications/content/lib" includes="*.jar"/>
     </path>
 </project>

Modified: ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml (original)
+++ ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml Sun Jul 12 19:46:54 2015
@@ -1108,4 +1108,20 @@
         <value xml:lang="zh">你修改了选择框中的值</value>
         <value xml:lang="zh-TW">你修改了選擇框中的值</value>
     </property>
+    <property key="ExamplePdfPassword">
+        <value xml:lang="en">PDF With Password</value>
+        <value xml:lang="zh">有密码的PDF</value>
+    </property>
+    <property key="PageTitleSetExamplePdfPassword">
+        <value xml:lang="en">Set PDF Protected By Password</value>
+        <value xml:lang="zh">设置有密码保护的PDF</value>
+    </property>
+    <property key="ExampleGeneratePDF">
+        <value xml:lang="en">Generate PDF</value>
+        <value xml:lang="zh">生成PDF</value>
+    </property>
+    <property key="password_did_not_match_confirm_password">
+        <value xml:lang="en">Password did not match confirm password.</value>
+        <value xml:lang="zh">密码与验证密码不一致。</value>
+    </property>
 </resource>

Added: ofbiz/trunk/specialpurpose/example/config/examplepdf.properties
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/config/examplepdf.properties?rev=1690515&view=auto
==============================================================================
--- ofbiz/trunk/specialpurpose/example/config/examplepdf.properties (added)
+++ ofbiz/trunk/specialpurpose/example/config/examplepdf.properties Sun Jul 12 19:46:54 2015
@@ -0,0 +1,24 @@
+###############################################################################
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+###############################################################################
+
+# If Y, the default.pdf.owner.password will be used as owner password, the user input password will be used as user password;
+# if N, the user input password will be used as owner password and user password.
+use.default.pdf.owner.password=N
+
+default.pdf.owner.password=ofbiz

Propchange: ofbiz/trunk/specialpurpose/example/config/examplepdf.properties
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar?rev=1690515&view=auto
==============================================================================
Binary file - no diff available.

Propchange: ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: ofbiz/trunk/specialpurpose/example/ofbiz-component.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/ofbiz-component.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/example/ofbiz-component.xml (original)
+++ ofbiz/trunk/specialpurpose/example/ofbiz-component.xml Sun Jul 12 19:46:54 2015
@@ -30,6 +30,7 @@ under the License.
 
     <!-- load single or multiple external libraries -->
     <classpath type="jar" location="build/lib/*"/>
+    <classpath type="jar" location="lib/*"/>
 
     <!-- entity resources: model(s), eca(s), group, and data definitions -->
     <entity-resource type="model" reader-name="main" loader="main" location="entitydef/entitymodel.xml"/>

Added: ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java?rev=1690515&view=auto
==============================================================================
--- ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java (added)
+++ ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java Sun Jul 12 19:46:54 2015
@@ -0,0 +1,220 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.example;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.stream.StreamSource;
+
+import org.apache.fop.apps.FOPException;
+import org.apache.fop.apps.Fop;
+import org.apache.fop.apps.MimeConstants;
+import org.apache.pdfbox.exceptions.COSVisitorException;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.encryption.AccessPermission;
+import org.apache.pdfbox.pdmodel.encryption.BadSecurityHandlerException;
+import org.apache.pdfbox.pdmodel.encryption.StandardProtectionPolicy;
+import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.GeneralException;
+import org.ofbiz.base.util.UtilCodec;
+import org.ofbiz.base.util.UtilHttp;
+import org.ofbiz.base.util.UtilProperties;
+import org.ofbiz.base.util.UtilValidate;
+import org.ofbiz.entity.Delegator;
+import org.ofbiz.entity.util.EntityUtilProperties;
+import org.ofbiz.webapp.view.ApacheFopWorker;
+import org.ofbiz.widget.renderer.FormStringRenderer;
+import org.ofbiz.widget.renderer.ScreenRenderer;
+import org.ofbiz.widget.renderer.ScreenStringRenderer;
+import org.ofbiz.widget.renderer.macro.MacroFormRenderer;
+import org.ofbiz.widget.renderer.macro.MacroScreenRenderer;
+import org.xml.sax.SAXException;
+
+import freemarker.template.TemplateException;
+
+
+public class ExampleEvents {
+
+    public static final String module = ExampleEvents.class.getName();
+    
+    public static final String examplePdfProperties = "examplepdf.properties";
+    
+    public static final boolean useExampleDefaultOwnerPassword = UtilProperties.getPropertyValue(examplePdfProperties, "use.default.pdf.owner.password", "N").equalsIgnoreCase("Y");
+
+    public static final String exampleDefaultOwnerPassword = UtilProperties.getPropertyValue(examplePdfProperties, "default.pdf.owner.password", "ofbiz");
+    
+    public static final String resourceExample = "ExampleUiLables";
+
+    /** Set password to the specified example and output the generated PDF.
+     *@param request The HTTPRequest object for the current request
+     *@param response The HTTPResponse object for the current request
+     *@return String specifying the exit status of this event
+     */
+    public static String setExamplePdfPassword(HttpServletRequest request, HttpServletResponse response) {
+        Delegator delegator = (Delegator) request.getAttribute("delegator");
+        Locale locale = UtilHttp.getLocale(request);
+        ServletContext servletContext = request.getSession().getServletContext();
+
+        Map<String, Object> requestParams = UtilHttp.getParameterMap(request);
+        String password = (String) requestParams.get("PASSWORD");
+        String confirmPassword = (String) requestParams.get("CONFIRM_PASSWORD");
+
+        if (UtilValidate.isEmpty(password) && UtilValidate.isEmpty(confirmPassword) && (UtilValidate.isEmpty(exampleDefaultOwnerPassword) || !useExampleDefaultOwnerPassword)) {
+        	return "nopassword";
+        }
+        if (UtilValidate.isNotEmpty(password) && !password.equals(confirmPassword)) {
+        	String errMsg = UtilProperties.getMessage(resourceExample, "password_not_equal_confirm_password", locale);
+            request.setAttribute("_ERROR_MESSAGE_", errMsg);
+            return "error";
+        }
+        
+        // get the original pdf
+        String screenLocation = "component://example/widget/example/ExampleScreens.xml";
+        String reportScreenName = "ExampleReport";
+
+        // render a screen to get the XML document
+        Writer reportWriter = new StringWriter();
+
+        try {
+            ScreenStringRenderer foScreenRenderer = new MacroScreenRenderer(EntityUtilProperties.getPropertyValue("widget", "screenfop.name", delegator), EntityUtilProperties.getPropertyValue("widget", "screenfop.screenrenderer", delegator));
+            FormStringRenderer formStringRenderer = new MacroFormRenderer(EntityUtilProperties.getPropertyValue("widget", "screenfop.formrenderer", delegator), request, response);
+            ScreenRenderer screens = new ScreenRenderer(reportWriter, null, foScreenRenderer);
+            screens.populateContextForRequest(request, response, servletContext);
+
+            // this is the object used to render forms from their definitions
+            screens.getContext().put("formStringRenderer", formStringRenderer);
+            screens.getContext().put("simpleEncoder", UtilCodec.getEncoder(EntityUtilProperties.getPropertyValue("widget", "screenfop.encoder", delegator)));
+
+            screens.render(screenLocation, reportScreenName);
+        } catch (GeneralException e) {
+            String errMsg = "General error rendering screen [" + screenLocation + "]: " + e.toString();
+            Debug.logError(e, errMsg, module);
+            request.setAttribute("_ERROR_MESSAGE_", errMsg);
+            return "error";
+        } catch (IOException e) {
+            String errMsg = "IO error rendering screen [" + screenLocation + "]: " + e.toString();
+            Debug.logError(e, errMsg, module);
+            request.setAttribute("_ERROR_MESSAGE_", errMsg);
+            return "error";
+        } catch (SAXException e) {
+            String errMsg = "SAX (XML parse) error rendering screen [" + screenLocation + "]: " + e.toString();
+            Debug.logError(e, errMsg, module);
+            request.setAttribute("_ERROR_MESSAGE_", errMsg);
+            return "error";
+        } catch (ParserConfigurationException e) {
+            String errMsg = "Parser configuration error rendering screen [" + screenLocation + "]: " + e.toString();
+            Debug.logError(e, errMsg, module);
+            request.setAttribute("_ERROR_MESSAGE_", errMsg);
+            return "error";
+        } catch (TemplateException e) {
+            String errMsg = "Freemarker template error rendering screen [" + screenLocation + "]: " + e.toString();
+            Debug.logError(e, errMsg, module);
+            request.setAttribute("_ERROR_MESSAGE_", errMsg);
+            return "error";
+		}
+
+        // set the input source (XSL-FO) and generate the PDF
+        StreamSource src = new StreamSource(new StringReader(reportWriter.toString()));
+
+        // create the output stream for the generation
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+
+        try {
+            Fop fop = ApacheFopWorker.createFopInstance(out, MimeConstants.MIME_PDF);
+            ApacheFopWorker.transform(src, null, fop);
+            out.flush();
+            out.close();
+        } catch (FOPException e) {
+            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
+            Debug.logError(e, module);
+            return "error";
+        } catch (IOException e) {
+            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
+            Debug.logError(e, module);
+            return "error";
+		}
+        
+        // parse the pdf with PDFBox
+        ByteArrayInputStream is = new ByteArrayInputStream(out.toByteArray());
+        PDDocument document;
+		try {
+			document = PDDocument.load(is);
+	        int keyLength = 40;
+	        AccessPermission ap = new AccessPermission();
+	        String ownerPassword = exampleDefaultOwnerPassword;
+	        if (UtilValidate.isEmpty(ownerPassword) || !useExampleDefaultOwnerPassword) {
+	        	ownerPassword = password;
+	        }
+	        StandardProtectionPolicy spp = new StandardProtectionPolicy(ownerPassword, password, ap);
+	        spp.setEncryptionKeyLength(keyLength);
+	        document.protect(spp);
+		} catch (IOException e) {
+            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
+            Debug.logError(e, module);
+            return "error";
+		} catch (BadSecurityHandlerException e) {
+            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
+            Debug.logError(e, module);
+            return "error";
+		} finally {
+            try {
+            	if (is != null) {
+    				is.close();
+            	}
+			} catch (IOException e) {
+				// ignore
+			}
+		}
+
+		out = new ByteArrayOutputStream();
+		try {
+			document.save(out);
+	        // set the content type and length
+	        response.setContentType(MimeConstants.MIME_PDF);
+	        response.setContentLength(out.size());
+			out.flush();
+			out.close();
+	        // write to the browser
+        	response.getOutputStream().write(out.toByteArray());
+            response.getOutputStream().flush();
+		} catch (COSVisitorException e) {
+            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
+            Debug.logError(e, module);
+        	return "error";
+		} catch (IOException e) {
+            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
+            Debug.logError(e, module);
+        	return "error";
+		}
+
+        return "success";
+    }
+
+}

Propchange: ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml (original)
+++ ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml Sun Jul 12 19:46:54 2015
@@ -225,6 +225,19 @@ under the License.
         <response name="success" type="view" value="ExamplePieChart"/>
     </request-map>
     
+    <!-- Pdf Report Options -->
+    <request-map uri="ExampleReportPdfOptions">
+        <security https="true" auth="true"/>
+        <response name="success" type="view" value="ExampleReportPdfOptions"/>
+    </request-map>
+    <request-map uri="setExamplePdfPassword">
+        <security https="true" auth="true"/>
+        <event type="java" path="org.ofbiz.example.ExampleEvents" invoke="setExamplePdfPassword"/>
+        <response name="success" type="none"/>
+        <response name="nopassword" type="view" value="ExampleReportPdf"/>
+        <response name="error" type="view" value="ExampleReportPdfOptions"/>
+    </request-map>
+    
     <!-- end of request mappings -->
 
     <!-- View Mappings -->
@@ -283,5 +296,6 @@ under the License.
         application/vnd.oasis.opendocument.presentation
      -->
 
+    <view-map name="ExampleReportPdfOptions" type="screen" page="component://example/widget/example/ExampleScreens.xml#ExampleReportPdfOptions"/>
     <!-- end of view mappings -->
 </site-conf>

Modified: ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml (original)
+++ ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml Sun Jul 12 19:46:54 2015
@@ -103,6 +103,10 @@ under the License.
                                                 <parameter param-name="exampleId"/>
                                                 <image url-mode="raw" src="${iconsLocation}/page_white_acrobat.png"/>
                                             </link>
+                                            <link target="ExampleReportPdfOptions" text="${uiLabelMap.ExamplePdfPassword}" style="buttontext">
+                                                <parameter param-name="exampleId"/>
+                                                <image url-mode="raw" src="${iconsLocation}/page_white_acrobat.png"/>
+                                            </link>
                                             <link target="help" text="${uiLabelMap.CommonHelp}" style="buttontext" target-window="_blank">
                                                 <parameter param-name="topic" value="ExampleEditHelp"/>
                                                 <image url-mode="raw" src="${iconsLocation}/help.png"/>

Modified: ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml (original)
+++ ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml Sun Jul 12 19:46:54 2015
@@ -311,4 +311,11 @@ under the License.
         </field>
         <field name="submitButton" title="${uiLabelMap.CommonAdd}"><submit button-type="button"/></field>
     </form>
+
+    <form name="SetExamplePdfPassword" type="single" target="setExamplePdfPassword" title="">
+        <field name="exampleId"><hidden/></field>
+        <field name="PASSWORD" title="${uiLabelMap.CommonPassword}"><password size="15" maxlength="250"/></field>
+        <field name="CONFIRM_PASSWORD" title="${uiLabelMap.CommonPassword}" tooltip="* ${uiLabelMap.CommonConfirm}"><password size="15" maxlength="250"/></field>
+        <field name="submitButton" title="${uiLabelMap.ExampleGeneratePDF}"><submit button-type="button"/></field>
+    </form>
 </forms>

Modified: ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml (original)
+++ ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml Sun Jul 12 19:46:54 2015
@@ -494,4 +494,21 @@ under the License.
             </widgets>
         </section>
     </screen>
+
+    <screen name="ExampleReportPdfOptions">
+        <section>
+            <actions>
+                <set field="titleProperty" value="PageTitleSetExamplePdfPassword"/>
+                <set field="tabButtonItem" value="EditExample"/>
+                <set field="exampleId" from-field="parameters.exampleId"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="CommonExampleDecorator" location="${parameters.mainDecoratorLocation}">
+                    <decorator-section name="body">
+                        <include-form name="SetExamplePdfPassword" location="component://example/widget/example/ExampleForms.xml"/>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
 </screens>



Re: svn commit: r1690515 - in /ofbiz/trunk/specialpurpose/example: ./ config/ lib/ src/org/ofbiz/example/ webapp/example/WEB-INF/ widget/example/

Posted by Shi Jinghai <hu...@hotmail.com>.
Yes, Scott, you're right. I should use FOP only. Let me try it again as FOP suggested:
http://xmlgraphics.apache.org/fop/trunk/pdfencryption.html

Thanks,

Shi Jinghai/Langhua


在 2015-7-13,下午4:19,Scott Gray <sc...@hotwaxsystems.com> 写道:

> Is it our plan to fill the example component with things like this?  It
> seems like such an obscure requirement.
> 
> Once upon a time the example application was intended to provide examples
> of core framework usage.  I don't think we're demonstrating the power of
> the framework here when the example requires quite a large amount of code
> to add a password.
> 
> Also, it looks like you're creating the PDF with FOP (via screens) then
> deconstructing it with PDFBox and regenerating it with a password? Also,
> what is ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar?  I
> think we have some admin stuff to do when adding new libs.
> 
> Lastly, if we were to be "selling" this as a framework feature, I would
> expect the renderer to simply take some special input parameters in the
> context that indicate the need for password protection and the passwords to
> use and then have the renderer do it itself.
> 
> 
> Regards
> Scott
> 
> On 13 July 2015 at 07:46, <sh...@apache.org> wrote:
> 
>> Author: shijh
>> Date: Sun Jul 12 19:46:54 2015
>> New Revision: 1690515
>> 
>> URL: http://svn.apache.org/r1690515
>> Log:
>> OFBIZ-6504.
>> 
>> Add an example to protect a pdf generated by FOP with owner password and
>> user password.
>> 
>> Added:
>>    ofbiz/trunk/specialpurpose/example/config/examplepdf.properties
>> (with props)
>>    ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar   (with
>> props)
>> 
>> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java
>> (with props)
>> Modified:
>>    ofbiz/trunk/specialpurpose/example/build.xml
>>    ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml
>>    ofbiz/trunk/specialpurpose/example/ofbiz-component.xml
>> 
>> ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml
>>    ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml
>>    ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml
>>    ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml
>> 
>> Modified: ofbiz/trunk/specialpurpose/example/build.xml
>> URL:
>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/build.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>> 
>> ==============================================================================
>> --- ofbiz/trunk/specialpurpose/example/build.xml (original)
>> +++ ofbiz/trunk/specialpurpose/example/build.xml Sun Jul 12 19:46:54 2015
>> @@ -51,5 +51,6 @@ under the License.
>>         <fileset dir="../../framework/webapp/lib" includes="*.jar"/>
>>         <fileset dir="../../framework/webapp/build/lib" includes="*.jar"/>
>>         <fileset dir="../../framework/common/build/lib" includes="*.jar"/>
>> +        <fileset dir="../../applications/content/lib" includes="*.jar"/>
>>     </path>
>> </project>
>> 
>> Modified: ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml
>> URL:
>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>> 
>> ==============================================================================
>> --- ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml
>> (original)
>> +++ ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml Sun Jul
>> 12 19:46:54 2015
>> @@ -1108,4 +1108,20 @@
>>         <value xml:lang="zh">ä½ ä¿®æ”¹äº†é€‰æ‹©æ¡†ä¸­çš„å€¼</value>
>>         <value xml:lang="zh-TW">ä½ ä¿®æ”¹äº†é ¸æ“‡æ¡†ä¸­çš„å€¼</value>
>>     </property>
>> +    <property key="ExamplePdfPassword">
>> +        <value xml:lang="en">PDF With Password</value>
>> +        <value xml:lang="zh">æœ‰å¯†ç  çš„PDF</value>
>> +    </property>
>> +    <property key="PageTitleSetExamplePdfPassword">
>> +        <value xml:lang="en">Set PDF Protected By Password</value>
>> +        <value xml:lang="zh">è®¾ç½®æœ‰å¯†ç  ä¿ æŠ¤çš„PDF</value>
>> +    </property>
>> +    <property key="ExampleGeneratePDF">
>> +        <value xml:lang="en">Generate PDF</value>
>> +        <value xml:lang="zh">ç”Ÿæˆ PDF</value>
>> +    </property>
>> +    <property key="password_did_not_match_confirm_password">
>> +        <value xml:lang="en">Password did not match confirm
>> password.</value>
>> +        <value xml:lang="zh">å¯†ç  ä¸ŽéªŒè¯ å¯†ç  ä¸ ä¸€è‡´ã€‚</value>
>> +    </property>
>> </resource>
>> 
>> Added: ofbiz/trunk/specialpurpose/example/config/examplepdf.properties
>> URL:
>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/config/examplepdf.properties?rev=1690515&view=auto
>> 
>> ==============================================================================
>> --- ofbiz/trunk/specialpurpose/example/config/examplepdf.properties (added)
>> +++ ofbiz/trunk/specialpurpose/example/config/examplepdf.properties Sun
>> Jul 12 19:46:54 2015
>> @@ -0,0 +1,24 @@
>> 
>> +###############################################################################
>> +# Licensed to the Apache Software Foundation (ASF) under one
>> +# or more contributor license agreements.  See the NOTICE file
>> +# distributed with this work for additional information
>> +# regarding copyright ownership.  The ASF licenses this file
>> +# to you under the Apache License, Version 2.0 (the
>> +# "License"); you may not use this file except in compliance
>> +# with the License.  You may obtain a copy of the License at
>> +#
>> +# http://www.apache.org/licenses/LICENSE-2.0
>> +#
>> +# Unless required by applicable law or agreed to in writing,
>> +# software distributed under the License is distributed on an
>> +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> +# KIND, either express or implied.  See the License for the
>> +# specific language governing permissions and limitations
>> +# under the License.
>> 
>> +###############################################################################
>> +
>> +# If Y, the default.pdf.owner.password will be used as owner password,
>> the user input password will be used as user password;
>> +# if N, the user input password will be used as owner password and user
>> password.
>> +use.default.pdf.owner.password=N
>> +
>> +default.pdf.owner.password=ofbiz
>> 
>> Propchange: ofbiz/trunk/specialpurpose/example/config/examplepdf.properties
>> 
>> ------------------------------------------------------------------------------
>>    svn:mime-type = text/plain
>> 
>> Added: ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar
>> URL:
>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar?rev=1690515&view=auto
>> 
>> ==============================================================================
>> Binary file - no diff available.
>> 
>> Propchange: ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar
>> 
>> ------------------------------------------------------------------------------
>>    svn:mime-type = application/octet-stream
>> 
>> Modified: ofbiz/trunk/specialpurpose/example/ofbiz-component.xml
>> URL:
>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/ofbiz-component.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>> 
>> ==============================================================================
>> --- ofbiz/trunk/specialpurpose/example/ofbiz-component.xml (original)
>> +++ ofbiz/trunk/specialpurpose/example/ofbiz-component.xml Sun Jul 12
>> 19:46:54 2015
>> @@ -30,6 +30,7 @@ under the License.
>> 
>>     <!-- load single or multiple external libraries -->
>>     <classpath type="jar" location="build/lib/*"/>
>> +    <classpath type="jar" location="lib/*"/>
>> 
>>     <!-- entity resources: model(s), eca(s), group, and data definitions
>> -->
>>     <entity-resource type="model" reader-name="main" loader="main"
>> location="entitydef/entitymodel.xml"/>
>> 
>> Added:
>> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java
>> URL:
>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java?rev=1690515&view=auto
>> 
>> ==============================================================================
>> ---
>> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java
>> (added)
>> +++
>> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java
>> Sun Jul 12 19:46:54 2015
>> @@ -0,0 +1,220 @@
>> 
>> +/*******************************************************************************
>> + * Licensed to the Apache Software Foundation (ASF) under one
>> + * or more contributor license agreements.  See the NOTICE file
>> + * distributed with this work for additional information
>> + * regarding copyright ownership.  The ASF licenses this file
>> + * to you under the Apache License, Version 2.0 (the
>> + * "License"); you may not use this file except in compliance
>> + * with the License.  You may obtain a copy of the License at
>> + *
>> + * http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing,
>> + * software distributed under the License is distributed on an
>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> + * KIND, either express or implied.  See the License for the
>> + * specific language governing permissions and limitations
>> + * under the License.
>> +
>> *******************************************************************************/
>> +package org.ofbiz.example;
>> +
>> +import java.io.ByteArrayInputStream;
>> +import java.io.ByteArrayOutputStream;
>> +import java.io.IOException;
>> +import java.io.StringReader;
>> +import java.io.StringWriter;
>> +import java.io.Writer;
>> +import java.util.Locale;
>> +import java.util.Map;
>> +
>> +import javax.servlet.ServletContext;
>> +import javax.servlet.http.HttpServletRequest;
>> +import javax.servlet.http.HttpServletResponse;
>> +import javax.xml.parsers.ParserConfigurationException;
>> +import javax.xml.transform.stream.StreamSource;
>> +
>> +import org.apache.fop.apps.FOPException;
>> +import org.apache.fop.apps.Fop;
>> +import org.apache.fop.apps.MimeConstants;
>> +import org.apache.pdfbox.exceptions.COSVisitorException;
>> +import org.apache.pdfbox.pdmodel.PDDocument;
>> +import org.apache.pdfbox.pdmodel.encryption.AccessPermission;
>> +import org.apache.pdfbox.pdmodel.encryption.BadSecurityHandlerException;
>> +import org.apache.pdfbox.pdmodel.encryption.StandardProtectionPolicy;
>> +import org.ofbiz.base.util.Debug;
>> +import org.ofbiz.base.util.GeneralException;
>> +import org.ofbiz.base.util.UtilCodec;
>> +import org.ofbiz.base.util.UtilHttp;
>> +import org.ofbiz.base.util.UtilProperties;
>> +import org.ofbiz.base.util.UtilValidate;
>> +import org.ofbiz.entity.Delegator;
>> +import org.ofbiz.entity.util.EntityUtilProperties;
>> +import org.ofbiz.webapp.view.ApacheFopWorker;
>> +import org.ofbiz.widget.renderer.FormStringRenderer;
>> +import org.ofbiz.widget.renderer.ScreenRenderer;
>> +import org.ofbiz.widget.renderer.ScreenStringRenderer;
>> +import org.ofbiz.widget.renderer.macro.MacroFormRenderer;
>> +import org.ofbiz.widget.renderer.macro.MacroScreenRenderer;
>> +import org.xml.sax.SAXException;
>> +
>> +import freemarker.template.TemplateException;
>> +
>> +
>> +public class ExampleEvents {
>> +
>> +    public static final String module = ExampleEvents.class.getName();
>> +
>> +    public static final String examplePdfProperties =
>> "examplepdf.properties";
>> +
>> +    public static final boolean useExampleDefaultOwnerPassword =
>> UtilProperties.getPropertyValue(examplePdfProperties,
>> "use.default.pdf.owner.password", "N").equalsIgnoreCase("Y");
>> +
>> +    public static final String exampleDefaultOwnerPassword =
>> UtilProperties.getPropertyValue(examplePdfProperties,
>> "default.pdf.owner.password", "ofbiz");
>> +
>> +    public static final String resourceExample = "ExampleUiLables";
>> +
>> +    /** Set password to the specified example and output the generated
>> PDF.
>> +     *@param request The HTTPRequest object for the current request
>> +     *@param response The HTTPResponse object for the current request
>> +     *@return String specifying the exit status of this event
>> +     */
>> +    public static String setExamplePdfPassword(HttpServletRequest
>> request, HttpServletResponse response) {
>> +        Delegator delegator = (Delegator)
>> request.getAttribute("delegator");
>> +        Locale locale = UtilHttp.getLocale(request);
>> +        ServletContext servletContext =
>> request.getSession().getServletContext();
>> +
>> +        Map<String, Object> requestParams =
>> UtilHttp.getParameterMap(request);
>> +        String password = (String) requestParams.get("PASSWORD");
>> +        String confirmPassword = (String)
>> requestParams.get("CONFIRM_PASSWORD");
>> +
>> +        if (UtilValidate.isEmpty(password) &&
>> UtilValidate.isEmpty(confirmPassword) &&
>> (UtilValidate.isEmpty(exampleDefaultOwnerPassword) ||
>> !useExampleDefaultOwnerPassword)) {
>> +               return "nopassword";
>> +        }
>> +        if (UtilValidate.isNotEmpty(password) &&
>> !password.equals(confirmPassword)) {
>> +               String errMsg = UtilProperties.getMessage(resourceExample,
>> "password_not_equal_confirm_password", locale);
>> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
>> +            return "error";
>> +        }
>> +
>> +        // get the original pdf
>> +        String screenLocation =
>> "component://example/widget/example/ExampleScreens.xml";
>> +        String reportScreenName = "ExampleReport";
>> +
>> +        // render a screen to get the XML document
>> +        Writer reportWriter = new StringWriter();
>> +
>> +        try {
>> +            ScreenStringRenderer foScreenRenderer = new
>> MacroScreenRenderer(EntityUtilProperties.getPropertyValue("widget", "
>> screenfop.name", delegator),
>> EntityUtilProperties.getPropertyValue("widget", "screenfop.screenrenderer",
>> delegator));
>> +            FormStringRenderer formStringRenderer = new
>> MacroFormRenderer(EntityUtilProperties.getPropertyValue("widget",
>> "screenfop.formrenderer", delegator), request, response);
>> +            ScreenRenderer screens = new ScreenRenderer(reportWriter,
>> null, foScreenRenderer);
>> +            screens.populateContextForRequest(request, response,
>> servletContext);
>> +
>> +            // this is the object used to render forms from their
>> definitions
>> +            screens.getContext().put("formStringRenderer",
>> formStringRenderer);
>> +            screens.getContext().put("simpleEncoder",
>> UtilCodec.getEncoder(EntityUtilProperties.getPropertyValue("widget",
>> "screenfop.encoder", delegator)));
>> +
>> +            screens.render(screenLocation, reportScreenName);
>> +        } catch (GeneralException e) {
>> +            String errMsg = "General error rendering screen [" +
>> screenLocation + "]: " + e.toString();
>> +            Debug.logError(e, errMsg, module);
>> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
>> +            return "error";
>> +        } catch (IOException e) {
>> +            String errMsg = "IO error rendering screen [" +
>> screenLocation + "]: " + e.toString();
>> +            Debug.logError(e, errMsg, module);
>> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
>> +            return "error";
>> +        } catch (SAXException e) {
>> +            String errMsg = "SAX (XML parse) error rendering screen [" +
>> screenLocation + "]: " + e.toString();
>> +            Debug.logError(e, errMsg, module);
>> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
>> +            return "error";
>> +        } catch (ParserConfigurationException e) {
>> +            String errMsg = "Parser configuration error rendering screen
>> [" + screenLocation + "]: " + e.toString();
>> +            Debug.logError(e, errMsg, module);
>> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
>> +            return "error";
>> +        } catch (TemplateException e) {
>> +            String errMsg = "Freemarker template error rendering screen
>> [" + screenLocation + "]: " + e.toString();
>> +            Debug.logError(e, errMsg, module);
>> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
>> +            return "error";
>> +               }
>> +
>> +        // set the input source (XSL-FO) and generate the PDF
>> +        StreamSource src = new StreamSource(new
>> StringReader(reportWriter.toString()));
>> +
>> +        // create the output stream for the generation
>> +        ByteArrayOutputStream out = new ByteArrayOutputStream();
>> +
>> +        try {
>> +            Fop fop = ApacheFopWorker.createFopInstance(out,
>> MimeConstants.MIME_PDF);
>> +            ApacheFopWorker.transform(src, null, fop);
>> +            out.flush();
>> +            out.close();
>> +        } catch (FOPException e) {
>> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
>> +            Debug.logError(e, module);
>> +            return "error";
>> +        } catch (IOException e) {
>> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
>> +            Debug.logError(e, module);
>> +            return "error";
>> +               }
>> +
>> +        // parse the pdf with PDFBox
>> +        ByteArrayInputStream is = new
>> ByteArrayInputStream(out.toByteArray());
>> +        PDDocument document;
>> +               try {
>> +                       document = PDDocument.load(is);
>> +               int keyLength = 40;
>> +               AccessPermission ap = new AccessPermission();
>> +               String ownerPassword = exampleDefaultOwnerPassword;
>> +               if (UtilValidate.isEmpty(ownerPassword) ||
>> !useExampleDefaultOwnerPassword) {
>> +                       ownerPassword = password;
>> +               }
>> +               StandardProtectionPolicy spp = new
>> StandardProtectionPolicy(ownerPassword, password, ap);
>> +               spp.setEncryptionKeyLength(keyLength);
>> +               document.protect(spp);
>> +               } catch (IOException e) {
>> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
>> +            Debug.logError(e, module);
>> +            return "error";
>> +               } catch (BadSecurityHandlerException e) {
>> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
>> +            Debug.logError(e, module);
>> +            return "error";
>> +               } finally {
>> +            try {
>> +               if (is != null) {
>> +                               is.close();
>> +               }
>> +                       } catch (IOException e) {
>> +                               // ignore
>> +                       }
>> +               }
>> +
>> +               out = new ByteArrayOutputStream();
>> +               try {
>> +                       document.save(out);
>> +               // set the content type and length
>> +               response.setContentType(MimeConstants.MIME_PDF);
>> +               response.setContentLength(out.size());
>> +                       out.flush();
>> +                       out.close();
>> +               // write to the browser
>> +               response.getOutputStream().write(out.toByteArray());
>> +            response.getOutputStream().flush();
>> +               } catch (COSVisitorException e) {
>> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
>> +            Debug.logError(e, module);
>> +               return "error";
>> +               } catch (IOException e) {
>> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
>> +            Debug.logError(e, module);
>> +               return "error";
>> +               }
>> +
>> +        return "success";
>> +    }
>> +
>> +}
>> 
>> Propchange:
>> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java
>> 
>> ------------------------------------------------------------------------------
>>    svn:mime-type = text/plain
>> 
>> Modified:
>> ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml
>> URL:
>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>> 
>> ==============================================================================
>> ---
>> ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml
>> (original)
>> +++
>> ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml
>> Sun Jul 12 19:46:54 2015
>> @@ -225,6 +225,19 @@ under the License.
>>         <response name="success" type="view" value="ExamplePieChart"/>
>>     </request-map>
>> 
>> +    <!-- Pdf Report Options -->
>> +    <request-map uri="ExampleReportPdfOptions">
>> +        <security https="true" auth="true"/>
>> +        <response name="success" type="view"
>> value="ExampleReportPdfOptions"/>
>> +    </request-map>
>> +    <request-map uri="setExamplePdfPassword">
>> +        <security https="true" auth="true"/>
>> +        <event type="java" path="org.ofbiz.example.ExampleEvents"
>> invoke="setExamplePdfPassword"/>
>> +        <response name="success" type="none"/>
>> +        <response name="nopassword" type="view" value="ExampleReportPdf"/>
>> +        <response name="error" type="view"
>> value="ExampleReportPdfOptions"/>
>> +    </request-map>
>> +
>>     <!-- end of request mappings -->
>> 
>>     <!-- View Mappings -->
>> @@ -283,5 +296,6 @@ under the License.
>>         application/vnd.oasis.opendocument.presentation
>>      -->
>> 
>> +    <view-map name="ExampleReportPdfOptions" type="screen"
>> page="component://example/widget/example/ExampleScreens.xml#ExampleReportPdfOptions"/>
>>     <!-- end of view mappings -->
>> </site-conf>
>> 
>> Modified:
>> ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml
>> URL:
>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>> 
>> ==============================================================================
>> --- ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml
>> (original)
>> +++ ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml
>> Sun Jul 12 19:46:54 2015
>> @@ -103,6 +103,10 @@ under the License.
>>                                                 <parameter
>> param-name="exampleId"/>
>>                                                 <image url-mode="raw"
>> src="${iconsLocation}/page_white_acrobat.png"/>
>>                                             </link>
>> +                                            <link
>> target="ExampleReportPdfOptions" text="${uiLabelMap.ExamplePdfPassword}"
>> style="buttontext">
>> +                                                <parameter
>> param-name="exampleId"/>
>> +                                                <image url-mode="raw"
>> src="${iconsLocation}/page_white_acrobat.png"/>
>> +                                            </link>
>>                                             <link target="help"
>> text="${uiLabelMap.CommonHelp}" style="buttontext" target-window="_blank">
>>                                                 <parameter
>> param-name="topic" value="ExampleEditHelp"/>
>>                                                 <image url-mode="raw"
>> src="${iconsLocation}/help.png"/>
>> 
>> Modified:
>> ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml
>> URL:
>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>> 
>> ==============================================================================
>> --- ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml
>> (original)
>> +++ ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml Sun
>> Jul 12 19:46:54 2015
>> @@ -311,4 +311,11 @@ under the License.
>>         </field>
>>         <field name="submitButton"
>> title="${uiLabelMap.CommonAdd}"><submit button-type="button"/></field>
>>     </form>
>> +
>> +    <form name="SetExamplePdfPassword" type="single"
>> target="setExamplePdfPassword" title="">
>> +        <field name="exampleId"><hidden/></field>
>> +        <field name="PASSWORD"
>> title="${uiLabelMap.CommonPassword}"><password size="15"
>> maxlength="250"/></field>
>> +        <field name="CONFIRM_PASSWORD"
>> title="${uiLabelMap.CommonPassword}" tooltip="*
>> ${uiLabelMap.CommonConfirm}"><password size="15" maxlength="250"/></field>
>> +        <field name="submitButton"
>> title="${uiLabelMap.ExampleGeneratePDF}"><submit
>> button-type="button"/></field>
>> +    </form>
>> </forms>
>> 
>> Modified:
>> ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml
>> URL:
>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>> 
>> ==============================================================================
>> --- ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml
>> (original)
>> +++ ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml
>> Sun Jul 12 19:46:54 2015
>> @@ -494,4 +494,21 @@ under the License.
>>             </widgets>
>>         </section>
>>     </screen>
>> +
>> +    <screen name="ExampleReportPdfOptions">
>> +        <section>
>> +            <actions>
>> +                <set field="titleProperty"
>> value="PageTitleSetExamplePdfPassword"/>
>> +                <set field="tabButtonItem" value="EditExample"/>
>> +                <set field="exampleId" from-field="parameters.exampleId"/>
>> +            </actions>
>> +            <widgets>
>> +                <decorator-screen name="CommonExampleDecorator"
>> location="${parameters.mainDecoratorLocation}">
>> +                    <decorator-section name="body">
>> +                        <include-form name="SetExamplePdfPassword"
>> location="component://example/widget/example/ExampleForms.xml"/>
>> +                    </decorator-section>
>> +                </decorator-screen>
>> +            </widgets>
>> +        </section>
>> +    </screen>
>> </screens>
>> 
>> 
>> 


Re: I need some advices/guides on whether to upgrade to FOP 2.0 in OFBiz trunk.

Posted by Shi Jinghai <hu...@hotmail.com>.
Jacopo,

Thank you. I'll test the barcode.


在 2015-7-15,下午10:18,Jacopo Cappellato <ja...@hotwaxsystems.com> 写道:

> +1 to migrate to FOP 2.0
> But if you do, please test that barcodes are properly rendered. Barcodes are generated using
> framework/base/lib/barcode4j-2.1-barcode4j-fop-ext-complete.jar
> and we have to make sure this version works with the new FOP 2.0.
> 
> Regards,
> 
> Jacopo
> 
> 
> On Jul 15, 2015, at 7:20 AM, Shi Jinghai <hu...@hotmail.com> wrote:
> 
>> Hi,
>> 
>> I'm working on OFBIZ-6504. As Scott pointed out, my current implement is not good enough, so I tried the FOP 1.1 native encryption without lucky, FOP 2.0 encryption works well in my environment.
>> 
>> Could I upgrade FOP to 2.0 in OFBiz trunk? If yes, what test cases should I be more careful?
>> 
>> The source file affected:
>> framework/webapp/src/org/ofbiz/webapp/view/ApacheFopWorker.java
>> 
>> The following jars will be changed:
>> in application/content/lib:
>> fontbox: from 1.7.1 to 1.8.5
>> 
>> in framework/base/lib:
>> batik-all: from 1.7 to 1.8
>> fop: from 1.1 to 2.0
>> xmlgraphics-commons: from 1.5 to 2.0.1
>> 
>> New jar:
>> avalon-ffamcework: 4.2.0
>> 
>> The pdfbox and jempbox in application/content/lib will be upgrade to 1.8.5 with the font box.
>> 
>> The native encryption:
>> FOP 1.1: http://xmlgraphics.apache.org/fop/1.1/pdfencryption.html
>> FOP 2.0: http://xmlgraphics.apache.org/fop/2.0/pdfencryption.html
>> 
>> Kind Regards,
>> 
>> Shi Jinghai/Langhua
>> 
>> 
>> 在 2015-7-13,下午4:19,Scott Gray <sc...@hotwaxsystems.com> 写道:
>> 
>>> Is it our plan to fill the example component with things like this?  It
>>> seems like such an obscure requirement.
>>> 
>>> Once upon a time the example application was intended to provide examples
>>> of core framework usage.  I don't think we're demonstrating the power of
>>> the framework here when the example requires quite a large amount of code
>>> to add a password.
>>> 
>>> Also, it looks like you're creating the PDF with FOP (via screens) then
>>> deconstructing it with PDFBox and regenerating it with a password? Also,
>>> what is ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar?  I
>>> think we have some admin stuff to do when adding new libs.
>>> 
>>> Lastly, if we were to be "selling" this as a framework feature, I would
>>> expect the renderer to simply take some special input parameters in the
>>> context that indicate the need for password protection and the passwords to
>>> use and then have the renderer do it itself.
>>> 
>>> 
>>> Regards
>>> Scott
>>> 
>>> On 13 July 2015 at 07:46, <sh...@apache.org> wrote:
>>> 
>>>> Author: shijh
>>>> Date: Sun Jul 12 19:46:54 2015
>>>> New Revision: 1690515
>>>> 
>>>> URL: http://svn.apache.org/r1690515
>>>> Log:
>>>> OFBIZ-6504.
>>>> 
>>>> Add an example to protect a pdf generated by FOP with owner password and
>>>> user password.
>>>> 
>>>> Added:
>>>>  ofbiz/trunk/specialpurpose/example/config/examplepdf.properties
>>>> (with props)
>>>>  ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar   (with
>>>> props)
>>>> 
>>>> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java
>>>> (with props)
>>>> Modified:
>>>>  ofbiz/trunk/specialpurpose/example/build.xml
>>>>  ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml
>>>>  ofbiz/trunk/specialpurpose/example/ofbiz-component.xml
>>>> 
>>>> ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml
>>>>  ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml
>>>>  ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml
>>>>  ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml
>>>> 
>>>> Modified: ofbiz/trunk/specialpurpose/example/build.xml
>>>> URL:
>>>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/build.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>>>> 
>>>> ==============================================================================
>>>> --- ofbiz/trunk/specialpurpose/example/build.xml (original)
>>>> +++ ofbiz/trunk/specialpurpose/example/build.xml Sun Jul 12 19:46:54 2015
>>>> @@ -51,5 +51,6 @@ under the License.
>>>>       <fileset dir="../../framework/webapp/lib" includes="*.jar"/>
>>>>       <fileset dir="../../framework/webapp/build/lib" includes="*.jar"/>
>>>>       <fileset dir="../../framework/common/build/lib" includes="*.jar"/>
>>>> +        <fileset dir="../../applications/content/lib" includes="*.jar"/>
>>>>   </path>
>>>> </project>
>>>> 
>>>> Modified: ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml
>>>> URL:
>>>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>>>> 
>>>> ==============================================================================
>>>> --- ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml
>>>> (original)
>>>> +++ ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml Sun Jul
>>>> 12 19:46:54 2015
>>>> @@ -1108,4 +1108,20 @@
>>>>       <value xml:lang="zh">ä½ ä¿®æ”¹äº†é€‰æ‹©æ¡†ä¸­çš„å€¼</value>
>>>>       <value xml:lang="zh-TW">ä½ ä¿®æ”¹äº†é ¸æ“‡æ¡†ä¸­çš„å€¼</value>
>>>>   </property>
>>>> +    <property key="ExamplePdfPassword">
>>>> +        <value xml:lang="en">PDF With Password</value>
>>>> +        <value xml:lang="zh">æœ‰å¯†ç  çš„PDF</value>
>>>> +    </property>
>>>> +    <property key="PageTitleSetExamplePdfPassword">
>>>> +        <value xml:lang="en">Set PDF Protected By Password</value>
>>>> +        <value xml:lang="zh">è®¾ç½®æœ‰å¯†ç  ä¿ æŠ¤çš„PDF</value>
>>>> +    </property>
>>>> +    <property key="ExampleGeneratePDF">
>>>> +        <value xml:lang="en">Generate PDF</value>
>>>> +        <value xml:lang="zh">ç”Ÿæˆ PDF</value>
>>>> +    </property>
>>>> +    <property key="password_did_not_match_confirm_password">
>>>> +        <value xml:lang="en">Password did not match confirm
>>>> password.</value>
>>>> +        <value xml:lang="zh">å¯†ç  ä¸ŽéªŒè¯ å¯†ç  ä¸ ä¸€è‡´ã€‚</value>
>>>> +    </property>
>>>> </resource>
>>>> 
>>>> Added: ofbiz/trunk/specialpurpose/example/config/examplepdf.properties
>>>> URL:
>>>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/config/examplepdf.properties?rev=1690515&view=auto
>>>> 
>>>> ==============================================================================
>>>> --- ofbiz/trunk/specialpurpose/example/config/examplepdf.properties (added)
>>>> +++ ofbiz/trunk/specialpurpose/example/config/examplepdf.properties Sun
>>>> Jul 12 19:46:54 2015
>>>> @@ -0,0 +1,24 @@
>>>> 
>>>> +###############################################################################
>>>> +# Licensed to the Apache Software Foundation (ASF) under one
>>>> +# or more contributor license agreements.  See the NOTICE file
>>>> +# distributed with this work for additional information
>>>> +# regarding copyright ownership.  The ASF licenses this file
>>>> +# to you under the Apache License, Version 2.0 (the
>>>> +# "License"); you may not use this file except in compliance
>>>> +# with the License.  You may obtain a copy of the License at
>>>> +#
>>>> +# http://www.apache.org/licenses/LICENSE-2.0
>>>> +#
>>>> +# Unless required by applicable law or agreed to in writing,
>>>> +# software distributed under the License is distributed on an
>>>> +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>>> +# KIND, either express or implied.  See the License for the
>>>> +# specific language governing permissions and limitations
>>>> +# under the License.
>>>> 
>>>> +###############################################################################
>>>> +
>>>> +# If Y, the default.pdf.owner.password will be used as owner password,
>>>> the user input password will be used as user password;
>>>> +# if N, the user input password will be used as owner password and user
>>>> password.
>>>> +use.default.pdf.owner.password=N
>>>> +
>>>> +default.pdf.owner.password=ofbiz
>>>> 
>>>> Propchange: ofbiz/trunk/specialpurpose/example/config/examplepdf.properties
>>>> 
>>>> ------------------------------------------------------------------------------
>>>>  svn:mime-type = text/plain
>>>> 
>>>> Added: ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar
>>>> URL:
>>>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar?rev=1690515&view=auto
>>>> 
>>>> ==============================================================================
>>>> Binary file - no diff available.
>>>> 
>>>> Propchange: ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar
>>>> 
>>>> ------------------------------------------------------------------------------
>>>>  svn:mime-type = application/octet-stream
>>>> 
>>>> Modified: ofbiz/trunk/specialpurpose/example/ofbiz-component.xml
>>>> URL:
>>>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/ofbiz-component.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>>>> 
>>>> ==============================================================================
>>>> --- ofbiz/trunk/specialpurpose/example/ofbiz-component.xml (original)
>>>> +++ ofbiz/trunk/specialpurpose/example/ofbiz-component.xml Sun Jul 12
>>>> 19:46:54 2015
>>>> @@ -30,6 +30,7 @@ under the License.
>>>> 
>>>>   <!-- load single or multiple external libraries -->
>>>>   <classpath type="jar" location="build/lib/*"/>
>>>> +    <classpath type="jar" location="lib/*"/>
>>>> 
>>>>   <!-- entity resources: model(s), eca(s), group, and data definitions
>>>> -->
>>>>   <entity-resource type="model" reader-name="main" loader="main"
>>>> location="entitydef/entitymodel.xml"/>
>>>> 
>>>> Added:
>>>> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java
>>>> URL:
>>>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java?rev=1690515&view=auto
>>>> 
>>>> ==============================================================================
>>>> ---
>>>> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java
>>>> (added)
>>>> +++
>>>> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java
>>>> Sun Jul 12 19:46:54 2015
>>>> @@ -0,0 +1,220 @@
>>>> 
>>>> +/*******************************************************************************
>>>> + * Licensed to the Apache Software Foundation (ASF) under one
>>>> + * or more contributor license agreements.  See the NOTICE file
>>>> + * distributed with this work for additional information
>>>> + * regarding copyright ownership.  The ASF licenses this file
>>>> + * to you under the Apache License, Version 2.0 (the
>>>> + * "License"); you may not use this file except in compliance
>>>> + * with the License.  You may obtain a copy of the License at
>>>> + *
>>>> + * http://www.apache.org/licenses/LICENSE-2.0
>>>> + *
>>>> + * Unless required by applicable law or agreed to in writing,
>>>> + * software distributed under the License is distributed on an
>>>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>>> + * KIND, either express or implied.  See the License for the
>>>> + * specific language governing permissions and limitations
>>>> + * under the License.
>>>> +
>>>> *******************************************************************************/
>>>> +package org.ofbiz.example;
>>>> +
>>>> +import java.io.ByteArrayInputStream;
>>>> +import java.io.ByteArrayOutputStream;
>>>> +import java.io.IOException;
>>>> +import java.io.StringReader;
>>>> +import java.io.StringWriter;
>>>> +import java.io.Writer;
>>>> +import java.util.Locale;
>>>> +import java.util.Map;
>>>> +
>>>> +import javax.servlet.ServletContext;
>>>> +import javax.servlet.http.HttpServletRequest;
>>>> +import javax.servlet.http.HttpServletResponse;
>>>> +import javax.xml.parsers.ParserConfigurationException;
>>>> +import javax.xml.transform.stream.StreamSource;
>>>> +
>>>> +import org.apache.fop.apps.FOPException;
>>>> +import org.apache.fop.apps.Fop;
>>>> +import org.apache.fop.apps.MimeConstants;
>>>> +import org.apache.pdfbox.exceptions.COSVisitorException;
>>>> +import org.apache.pdfbox.pdmodel.PDDocument;
>>>> +import org.apache.pdfbox.pdmodel.encryption.AccessPermission;
>>>> +import org.apache.pdfbox.pdmodel.encryption.BadSecurityHandlerException;
>>>> +import org.apache.pdfbox.pdmodel.encryption.StandardProtectionPolicy;
>>>> +import org.ofbiz.base.util.Debug;
>>>> +import org.ofbiz.base.util.GeneralException;
>>>> +import org.ofbiz.base.util.UtilCodec;
>>>> +import org.ofbiz.base.util.UtilHttp;
>>>> +import org.ofbiz.base.util.UtilProperties;
>>>> +import org.ofbiz.base.util.UtilValidate;
>>>> +import org.ofbiz.entity.Delegator;
>>>> +import org.ofbiz.entity.util.EntityUtilProperties;
>>>> +import org.ofbiz.webapp.view.ApacheFopWorker;
>>>> +import org.ofbiz.widget.renderer.FormStringRenderer;
>>>> +import org.ofbiz.widget.renderer.ScreenRenderer;
>>>> +import org.ofbiz.widget.renderer.ScreenStringRenderer;
>>>> +import org.ofbiz.widget.renderer.macro.MacroFormRenderer;
>>>> +import org.ofbiz.widget.renderer.macro.MacroScreenRenderer;
>>>> +import org.xml.sax.SAXException;
>>>> +
>>>> +import freemarker.template.TemplateException;
>>>> +
>>>> +
>>>> +public class ExampleEvents {
>>>> +
>>>> +    public static final String module = ExampleEvents.class.getName();
>>>> +
>>>> +    public static final String examplePdfProperties =
>>>> "examplepdf.properties";
>>>> +
>>>> +    public static final boolean useExampleDefaultOwnerPassword =
>>>> UtilProperties.getPropertyValue(examplePdfProperties,
>>>> "use.default.pdf.owner.password", "N").equalsIgnoreCase("Y");
>>>> +
>>>> +    public static final String exampleDefaultOwnerPassword =
>>>> UtilProperties.getPropertyValue(examplePdfProperties,
>>>> "default.pdf.owner.password", "ofbiz");
>>>> +
>>>> +    public static final String resourceExample = "ExampleUiLables";
>>>> +
>>>> +    /** Set password to the specified example and output the generated
>>>> PDF.
>>>> +     *@param request The HTTPRequest object for the current request
>>>> +     *@param response The HTTPResponse object for the current request
>>>> +     *@return String specifying the exit status of this event
>>>> +     */
>>>> +    public static String setExamplePdfPassword(HttpServletRequest
>>>> request, HttpServletResponse response) {
>>>> +        Delegator delegator = (Delegator)
>>>> request.getAttribute("delegator");
>>>> +        Locale locale = UtilHttp.getLocale(request);
>>>> +        ServletContext servletContext =
>>>> request.getSession().getServletContext();
>>>> +
>>>> +        Map<String, Object> requestParams =
>>>> UtilHttp.getParameterMap(request);
>>>> +        String password = (String) requestParams.get("PASSWORD");
>>>> +        String confirmPassword = (String)
>>>> requestParams.get("CONFIRM_PASSWORD");
>>>> +
>>>> +        if (UtilValidate.isEmpty(password) &&
>>>> UtilValidate.isEmpty(confirmPassword) &&
>>>> (UtilValidate.isEmpty(exampleDefaultOwnerPassword) ||
>>>> !useExampleDefaultOwnerPassword)) {
>>>> +               return "nopassword";
>>>> +        }
>>>> +        if (UtilValidate.isNotEmpty(password) &&
>>>> !password.equals(confirmPassword)) {
>>>> +               String errMsg = UtilProperties.getMessage(resourceExample,
>>>> "password_not_equal_confirm_password", locale);
>>>> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
>>>> +            return "error";
>>>> +        }
>>>> +
>>>> +        // get the original pdf
>>>> +        String screenLocation =
>>>> "component://example/widget/example/ExampleScreens.xml";
>>>> +        String reportScreenName = "ExampleReport";
>>>> +
>>>> +        // render a screen to get the XML document
>>>> +        Writer reportWriter = new StringWriter();
>>>> +
>>>> +        try {
>>>> +            ScreenStringRenderer foScreenRenderer = new
>>>> MacroScreenRenderer(EntityUtilProperties.getPropertyValue("widget", "
>>>> screenfop.name", delegator),
>>>> EntityUtilProperties.getPropertyValue("widget", "screenfop.screenrenderer",
>>>> delegator));
>>>> +            FormStringRenderer formStringRenderer = new
>>>> MacroFormRenderer(EntityUtilProperties.getPropertyValue("widget",
>>>> "screenfop.formrenderer", delegator), request, response);
>>>> +            ScreenRenderer screens = new ScreenRenderer(reportWriter,
>>>> null, foScreenRenderer);
>>>> +            screens.populateContextForRequest(request, response,
>>>> servletContext);
>>>> +
>>>> +            // this is the object used to render forms from their
>>>> definitions
>>>> +            screens.getContext().put("formStringRenderer",
>>>> formStringRenderer);
>>>> +            screens.getContext().put("simpleEncoder",
>>>> UtilCodec.getEncoder(EntityUtilProperties.getPropertyValue("widget",
>>>> "screenfop.encoder", delegator)));
>>>> +
>>>> +            screens.render(screenLocation, reportScreenName);
>>>> +        } catch (GeneralException e) {
>>>> +            String errMsg = "General error rendering screen [" +
>>>> screenLocation + "]: " + e.toString();
>>>> +            Debug.logError(e, errMsg, module);
>>>> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
>>>> +            return "error";
>>>> +        } catch (IOException e) {
>>>> +            String errMsg = "IO error rendering screen [" +
>>>> screenLocation + "]: " + e.toString();
>>>> +            Debug.logError(e, errMsg, module);
>>>> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
>>>> +            return "error";
>>>> +        } catch (SAXException e) {
>>>> +            String errMsg = "SAX (XML parse) error rendering screen [" +
>>>> screenLocation + "]: " + e.toString();
>>>> +            Debug.logError(e, errMsg, module);
>>>> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
>>>> +            return "error";
>>>> +        } catch (ParserConfigurationException e) {
>>>> +            String errMsg = "Parser configuration error rendering screen
>>>> [" + screenLocation + "]: " + e.toString();
>>>> +            Debug.logError(e, errMsg, module);
>>>> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
>>>> +            return "error";
>>>> +        } catch (TemplateException e) {
>>>> +            String errMsg = "Freemarker template error rendering screen
>>>> [" + screenLocation + "]: " + e.toString();
>>>> +            Debug.logError(e, errMsg, module);
>>>> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
>>>> +            return "error";
>>>> +               }
>>>> +
>>>> +        // set the input source (XSL-FO) and generate the PDF
>>>> +        StreamSource src = new StreamSource(new
>>>> StringReader(reportWriter.toString()));
>>>> +
>>>> +        // create the output stream for the generation
>>>> +        ByteArrayOutputStream out = new ByteArrayOutputStream();
>>>> +
>>>> +        try {
>>>> +            Fop fop = ApacheFopWorker.createFopInstance(out,
>>>> MimeConstants.MIME_PDF);
>>>> +            ApacheFopWorker.transform(src, null, fop);
>>>> +            out.flush();
>>>> +            out.close();
>>>> +        } catch (FOPException e) {
>>>> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
>>>> +            Debug.logError(e, module);
>>>> +            return "error";
>>>> +        } catch (IOException e) {
>>>> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
>>>> +            Debug.logError(e, module);
>>>> +            return "error";
>>>> +               }
>>>> +
>>>> +        // parse the pdf with PDFBox
>>>> +        ByteArrayInputStream is = new
>>>> ByteArrayInputStream(out.toByteArray());
>>>> +        PDDocument document;
>>>> +               try {
>>>> +                       document = PDDocument.load(is);
>>>> +               int keyLength = 40;
>>>> +               AccessPermission ap = new AccessPermission();
>>>> +               String ownerPassword = exampleDefaultOwnerPassword;
>>>> +               if (UtilValidate.isEmpty(ownerPassword) ||
>>>> !useExampleDefaultOwnerPassword) {
>>>> +                       ownerPassword = password;
>>>> +               }
>>>> +               StandardProtectionPolicy spp = new
>>>> StandardProtectionPolicy(ownerPassword, password, ap);
>>>> +               spp.setEncryptionKeyLength(keyLength);
>>>> +               document.protect(spp);
>>>> +               } catch (IOException e) {
>>>> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
>>>> +            Debug.logError(e, module);
>>>> +            return "error";
>>>> +               } catch (BadSecurityHandlerException e) {
>>>> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
>>>> +            Debug.logError(e, module);
>>>> +            return "error";
>>>> +               } finally {
>>>> +            try {
>>>> +               if (is != null) {
>>>> +                               is.close();
>>>> +               }
>>>> +                       } catch (IOException e) {
>>>> +                               // ignore
>>>> +                       }
>>>> +               }
>>>> +
>>>> +               out = new ByteArrayOutputStream();
>>>> +               try {
>>>> +                       document.save(out);
>>>> +               // set the content type and length
>>>> +               response.setContentType(MimeConstants.MIME_PDF);
>>>> +               response.setContentLength(out.size());
>>>> +                       out.flush();
>>>> +                       out.close();
>>>> +               // write to the browser
>>>> +               response.getOutputStream().write(out.toByteArray());
>>>> +            response.getOutputStream().flush();
>>>> +               } catch (COSVisitorException e) {
>>>> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
>>>> +            Debug.logError(e, module);
>>>> +               return "error";
>>>> +               } catch (IOException e) {
>>>> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
>>>> +            Debug.logError(e, module);
>>>> +               return "error";
>>>> +               }
>>>> +
>>>> +        return "success";
>>>> +    }
>>>> +
>>>> +}
>>>> 
>>>> Propchange:
>>>> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java
>>>> 
>>>> ------------------------------------------------------------------------------
>>>>  svn:mime-type = text/plain
>>>> 
>>>> Modified:
>>>> ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml
>>>> URL:
>>>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>>>> 
>>>> ==============================================================================
>>>> ---
>>>> ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml
>>>> (original)
>>>> +++
>>>> ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml
>>>> Sun Jul 12 19:46:54 2015
>>>> @@ -225,6 +225,19 @@ under the License.
>>>>       <response name="success" type="view" value="ExamplePieChart"/>
>>>>   </request-map>
>>>> 
>>>> +    <!-- Pdf Report Options -->
>>>> +    <request-map uri="ExampleReportPdfOptions">
>>>> +        <security https="true" auth="true"/>
>>>> +        <response name="success" type="view"
>>>> value="ExampleReportPdfOptions"/>
>>>> +    </request-map>
>>>> +    <request-map uri="setExamplePdfPassword">
>>>> +        <security https="true" auth="true"/>
>>>> +        <event type="java" path="org.ofbiz.example.ExampleEvents"
>>>> invoke="setExamplePdfPassword"/>
>>>> +        <response name="success" type="none"/>
>>>> +        <response name="nopassword" type="view" value="ExampleReportPdf"/>
>>>> +        <response name="error" type="view"
>>>> value="ExampleReportPdfOptions"/>
>>>> +    </request-map>
>>>> +
>>>>   <!-- end of request mappings -->
>>>> 
>>>>   <!-- View Mappings -->
>>>> @@ -283,5 +296,6 @@ under the License.
>>>>       application/vnd.oasis.opendocument.presentation
>>>>    -->
>>>> 
>>>> +    <view-map name="ExampleReportPdfOptions" type="screen"
>>>> page="component://example/widget/example/ExampleScreens.xml#ExampleReportPdfOptions"/>
>>>>   <!-- end of view mappings -->
>>>> </site-conf>
>>>> 
>>>> Modified:
>>>> ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml
>>>> URL:
>>>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>>>> 
>>>> ==============================================================================
>>>> --- ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml
>>>> (original)
>>>> +++ ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml
>>>> Sun Jul 12 19:46:54 2015
>>>> @@ -103,6 +103,10 @@ under the License.
>>>>                                               <parameter
>>>> param-name="exampleId"/>
>>>>                                               <image url-mode="raw"
>>>> src="${iconsLocation}/page_white_acrobat.png"/>
>>>>                                           </link>
>>>> +                                            <link
>>>> target="ExampleReportPdfOptions" text="${uiLabelMap.ExamplePdfPassword}"
>>>> style="buttontext">
>>>> +                                                <parameter
>>>> param-name="exampleId"/>
>>>> +                                                <image url-mode="raw"
>>>> src="${iconsLocation}/page_white_acrobat.png"/>
>>>> +                                            </link>
>>>>                                           <link target="help"
>>>> text="${uiLabelMap.CommonHelp}" style="buttontext" target-window="_blank">
>>>>                                               <parameter
>>>> param-name="topic" value="ExampleEditHelp"/>
>>>>                                               <image url-mode="raw"
>>>> src="${iconsLocation}/help.png"/>
>>>> 
>>>> Modified:
>>>> ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml
>>>> URL:
>>>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>>>> 
>>>> ==============================================================================
>>>> --- ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml
>>>> (original)
>>>> +++ ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml Sun
>>>> Jul 12 19:46:54 2015
>>>> @@ -311,4 +311,11 @@ under the License.
>>>>       </field>
>>>>       <field name="submitButton"
>>>> title="${uiLabelMap.CommonAdd}"><submit button-type="button"/></field>
>>>>   </form>
>>>> +
>>>> +    <form name="SetExamplePdfPassword" type="single"
>>>> target="setExamplePdfPassword" title="">
>>>> +        <field name="exampleId"><hidden/></field>
>>>> +        <field name="PASSWORD"
>>>> title="${uiLabelMap.CommonPassword}"><password size="15"
>>>> maxlength="250"/></field>
>>>> +        <field name="CONFIRM_PASSWORD"
>>>> title="${uiLabelMap.CommonPassword}" tooltip="*
>>>> ${uiLabelMap.CommonConfirm}"><password size="15" maxlength="250"/></field>
>>>> +        <field name="submitButton"
>>>> title="${uiLabelMap.ExampleGeneratePDF}"><submit
>>>> button-type="button"/></field>
>>>> +    </form>
>>>> </forms>
>>>> 
>>>> Modified:
>>>> ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml
>>>> URL:
>>>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>>>> 
>>>> ==============================================================================
>>>> --- ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml
>>>> (original)
>>>> +++ ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml
>>>> Sun Jul 12 19:46:54 2015
>>>> @@ -494,4 +494,21 @@ under the License.
>>>>           </widgets>
>>>>       </section>
>>>>   </screen>
>>>> +
>>>> +    <screen name="ExampleReportPdfOptions">
>>>> +        <section>
>>>> +            <actions>
>>>> +                <set field="titleProperty"
>>>> value="PageTitleSetExamplePdfPassword"/>
>>>> +                <set field="tabButtonItem" value="EditExample"/>
>>>> +                <set field="exampleId" from-field="parameters.exampleId"/>
>>>> +            </actions>
>>>> +            <widgets>
>>>> +                <decorator-screen name="CommonExampleDecorator"
>>>> location="${parameters.mainDecoratorLocation}">
>>>> +                    <decorator-section name="body">
>>>> +                        <include-form name="SetExamplePdfPassword"
>>>> location="component://example/widget/example/ExampleForms.xml"/>
>>>> +                    </decorator-section>
>>>> +                </decorator-screen>
>>>> +            </widgets>
>>>> +        </section>
>>>> +    </screen>
>>>> </screens>
>>>> 
>>>> 
>>>> 
>> 
> 


Re: I need some advices/guides on whether to upgrade to FOP 2.0 in OFBiz trunk.

Posted by Jacopo Cappellato <ja...@hotwaxsystems.com>.
+1 to migrate to FOP 2.0
But if you do, please test that barcodes are properly rendered. Barcodes are generated using
framework/base/lib/barcode4j-2.1-barcode4j-fop-ext-complete.jar
and we have to make sure this version works with the new FOP 2.0.

Regards,

Jacopo


On Jul 15, 2015, at 7:20 AM, Shi Jinghai <hu...@hotmail.com> wrote:

> Hi,
> 
> I'm working on OFBIZ-6504. As Scott pointed out, my current implement is not good enough, so I tried the FOP 1.1 native encryption without lucky, FOP 2.0 encryption works well in my environment.
> 
> Could I upgrade FOP to 2.0 in OFBiz trunk? If yes, what test cases should I be more careful?
> 
> The source file affected:
> framework/webapp/src/org/ofbiz/webapp/view/ApacheFopWorker.java
> 
> The following jars will be changed:
> in application/content/lib:
> fontbox: from 1.7.1 to 1.8.5
> 
> in framework/base/lib:
> batik-all: from 1.7 to 1.8
> fop: from 1.1 to 2.0
> xmlgraphics-commons: from 1.5 to 2.0.1
> 
> New jar:
> avalon-ffamcework: 4.2.0
> 
> The pdfbox and jempbox in application/content/lib will be upgrade to 1.8.5 with the font box.
> 
> The native encryption:
> FOP 1.1: http://xmlgraphics.apache.org/fop/1.1/pdfencryption.html
> FOP 2.0: http://xmlgraphics.apache.org/fop/2.0/pdfencryption.html
> 
> Kind Regards,
> 
> Shi Jinghai/Langhua
> 
> 
> 在 2015-7-13,下午4:19,Scott Gray <sc...@hotwaxsystems.com> 写道:
> 
>> Is it our plan to fill the example component with things like this?  It
>> seems like such an obscure requirement.
>> 
>> Once upon a time the example application was intended to provide examples
>> of core framework usage.  I don't think we're demonstrating the power of
>> the framework here when the example requires quite a large amount of code
>> to add a password.
>> 
>> Also, it looks like you're creating the PDF with FOP (via screens) then
>> deconstructing it with PDFBox and regenerating it with a password? Also,
>> what is ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar?  I
>> think we have some admin stuff to do when adding new libs.
>> 
>> Lastly, if we were to be "selling" this as a framework feature, I would
>> expect the renderer to simply take some special input parameters in the
>> context that indicate the need for password protection and the passwords to
>> use and then have the renderer do it itself.
>> 
>> 
>> Regards
>> Scott
>> 
>> On 13 July 2015 at 07:46, <sh...@apache.org> wrote:
>> 
>>> Author: shijh
>>> Date: Sun Jul 12 19:46:54 2015
>>> New Revision: 1690515
>>> 
>>> URL: http://svn.apache.org/r1690515
>>> Log:
>>> OFBIZ-6504.
>>> 
>>> Add an example to protect a pdf generated by FOP with owner password and
>>> user password.
>>> 
>>> Added:
>>>   ofbiz/trunk/specialpurpose/example/config/examplepdf.properties
>>> (with props)
>>>   ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar   (with
>>> props)
>>> 
>>> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java
>>> (with props)
>>> Modified:
>>>   ofbiz/trunk/specialpurpose/example/build.xml
>>>   ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml
>>>   ofbiz/trunk/specialpurpose/example/ofbiz-component.xml
>>> 
>>> ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml
>>>   ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml
>>>   ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml
>>>   ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml
>>> 
>>> Modified: ofbiz/trunk/specialpurpose/example/build.xml
>>> URL:
>>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/build.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>>> 
>>> ==============================================================================
>>> --- ofbiz/trunk/specialpurpose/example/build.xml (original)
>>> +++ ofbiz/trunk/specialpurpose/example/build.xml Sun Jul 12 19:46:54 2015
>>> @@ -51,5 +51,6 @@ under the License.
>>>        <fileset dir="../../framework/webapp/lib" includes="*.jar"/>
>>>        <fileset dir="../../framework/webapp/build/lib" includes="*.jar"/>
>>>        <fileset dir="../../framework/common/build/lib" includes="*.jar"/>
>>> +        <fileset dir="../../applications/content/lib" includes="*.jar"/>
>>>    </path>
>>> </project>
>>> 
>>> Modified: ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml
>>> URL:
>>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>>> 
>>> ==============================================================================
>>> --- ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml
>>> (original)
>>> +++ ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml Sun Jul
>>> 12 19:46:54 2015
>>> @@ -1108,4 +1108,20 @@
>>>        <value xml:lang="zh">ä½ ä¿®æ”¹äº†é€‰æ‹©æ¡†ä¸­çš„å€¼</value>
>>>        <value xml:lang="zh-TW">ä½ ä¿®æ”¹äº†é ¸æ“‡æ¡†ä¸­çš„å€¼</value>
>>>    </property>
>>> +    <property key="ExamplePdfPassword">
>>> +        <value xml:lang="en">PDF With Password</value>
>>> +        <value xml:lang="zh">æœ‰å¯†ç  çš„PDF</value>
>>> +    </property>
>>> +    <property key="PageTitleSetExamplePdfPassword">
>>> +        <value xml:lang="en">Set PDF Protected By Password</value>
>>> +        <value xml:lang="zh">è®¾ç½®æœ‰å¯†ç  ä¿ æŠ¤çš„PDF</value>
>>> +    </property>
>>> +    <property key="ExampleGeneratePDF">
>>> +        <value xml:lang="en">Generate PDF</value>
>>> +        <value xml:lang="zh">ç”Ÿæˆ PDF</value>
>>> +    </property>
>>> +    <property key="password_did_not_match_confirm_password">
>>> +        <value xml:lang="en">Password did not match confirm
>>> password.</value>
>>> +        <value xml:lang="zh">å¯†ç  ä¸ŽéªŒè¯ å¯†ç  ä¸ ä¸€è‡´ã€‚</value>
>>> +    </property>
>>> </resource>
>>> 
>>> Added: ofbiz/trunk/specialpurpose/example/config/examplepdf.properties
>>> URL:
>>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/config/examplepdf.properties?rev=1690515&view=auto
>>> 
>>> ==============================================================================
>>> --- ofbiz/trunk/specialpurpose/example/config/examplepdf.properties (added)
>>> +++ ofbiz/trunk/specialpurpose/example/config/examplepdf.properties Sun
>>> Jul 12 19:46:54 2015
>>> @@ -0,0 +1,24 @@
>>> 
>>> +###############################################################################
>>> +# Licensed to the Apache Software Foundation (ASF) under one
>>> +# or more contributor license agreements.  See the NOTICE file
>>> +# distributed with this work for additional information
>>> +# regarding copyright ownership.  The ASF licenses this file
>>> +# to you under the Apache License, Version 2.0 (the
>>> +# "License"); you may not use this file except in compliance
>>> +# with the License.  You may obtain a copy of the License at
>>> +#
>>> +# http://www.apache.org/licenses/LICENSE-2.0
>>> +#
>>> +# Unless required by applicable law or agreed to in writing,
>>> +# software distributed under the License is distributed on an
>>> +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>> +# KIND, either express or implied.  See the License for the
>>> +# specific language governing permissions and limitations
>>> +# under the License.
>>> 
>>> +###############################################################################
>>> +
>>> +# If Y, the default.pdf.owner.password will be used as owner password,
>>> the user input password will be used as user password;
>>> +# if N, the user input password will be used as owner password and user
>>> password.
>>> +use.default.pdf.owner.password=N
>>> +
>>> +default.pdf.owner.password=ofbiz
>>> 
>>> Propchange: ofbiz/trunk/specialpurpose/example/config/examplepdf.properties
>>> 
>>> ------------------------------------------------------------------------------
>>>   svn:mime-type = text/plain
>>> 
>>> Added: ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar
>>> URL:
>>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar?rev=1690515&view=auto
>>> 
>>> ==============================================================================
>>> Binary file - no diff available.
>>> 
>>> Propchange: ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar
>>> 
>>> ------------------------------------------------------------------------------
>>>   svn:mime-type = application/octet-stream
>>> 
>>> Modified: ofbiz/trunk/specialpurpose/example/ofbiz-component.xml
>>> URL:
>>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/ofbiz-component.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>>> 
>>> ==============================================================================
>>> --- ofbiz/trunk/specialpurpose/example/ofbiz-component.xml (original)
>>> +++ ofbiz/trunk/specialpurpose/example/ofbiz-component.xml Sun Jul 12
>>> 19:46:54 2015
>>> @@ -30,6 +30,7 @@ under the License.
>>> 
>>>    <!-- load single or multiple external libraries -->
>>>    <classpath type="jar" location="build/lib/*"/>
>>> +    <classpath type="jar" location="lib/*"/>
>>> 
>>>    <!-- entity resources: model(s), eca(s), group, and data definitions
>>> -->
>>>    <entity-resource type="model" reader-name="main" loader="main"
>>> location="entitydef/entitymodel.xml"/>
>>> 
>>> Added:
>>> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java
>>> URL:
>>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java?rev=1690515&view=auto
>>> 
>>> ==============================================================================
>>> ---
>>> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java
>>> (added)
>>> +++
>>> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java
>>> Sun Jul 12 19:46:54 2015
>>> @@ -0,0 +1,220 @@
>>> 
>>> +/*******************************************************************************
>>> + * Licensed to the Apache Software Foundation (ASF) under one
>>> + * or more contributor license agreements.  See the NOTICE file
>>> + * distributed with this work for additional information
>>> + * regarding copyright ownership.  The ASF licenses this file
>>> + * to you under the Apache License, Version 2.0 (the
>>> + * "License"); you may not use this file except in compliance
>>> + * with the License.  You may obtain a copy of the License at
>>> + *
>>> + * http://www.apache.org/licenses/LICENSE-2.0
>>> + *
>>> + * Unless required by applicable law or agreed to in writing,
>>> + * software distributed under the License is distributed on an
>>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>> + * KIND, either express or implied.  See the License for the
>>> + * specific language governing permissions and limitations
>>> + * under the License.
>>> +
>>> *******************************************************************************/
>>> +package org.ofbiz.example;
>>> +
>>> +import java.io.ByteArrayInputStream;
>>> +import java.io.ByteArrayOutputStream;
>>> +import java.io.IOException;
>>> +import java.io.StringReader;
>>> +import java.io.StringWriter;
>>> +import java.io.Writer;
>>> +import java.util.Locale;
>>> +import java.util.Map;
>>> +
>>> +import javax.servlet.ServletContext;
>>> +import javax.servlet.http.HttpServletRequest;
>>> +import javax.servlet.http.HttpServletResponse;
>>> +import javax.xml.parsers.ParserConfigurationException;
>>> +import javax.xml.transform.stream.StreamSource;
>>> +
>>> +import org.apache.fop.apps.FOPException;
>>> +import org.apache.fop.apps.Fop;
>>> +import org.apache.fop.apps.MimeConstants;
>>> +import org.apache.pdfbox.exceptions.COSVisitorException;
>>> +import org.apache.pdfbox.pdmodel.PDDocument;
>>> +import org.apache.pdfbox.pdmodel.encryption.AccessPermission;
>>> +import org.apache.pdfbox.pdmodel.encryption.BadSecurityHandlerException;
>>> +import org.apache.pdfbox.pdmodel.encryption.StandardProtectionPolicy;
>>> +import org.ofbiz.base.util.Debug;
>>> +import org.ofbiz.base.util.GeneralException;
>>> +import org.ofbiz.base.util.UtilCodec;
>>> +import org.ofbiz.base.util.UtilHttp;
>>> +import org.ofbiz.base.util.UtilProperties;
>>> +import org.ofbiz.base.util.UtilValidate;
>>> +import org.ofbiz.entity.Delegator;
>>> +import org.ofbiz.entity.util.EntityUtilProperties;
>>> +import org.ofbiz.webapp.view.ApacheFopWorker;
>>> +import org.ofbiz.widget.renderer.FormStringRenderer;
>>> +import org.ofbiz.widget.renderer.ScreenRenderer;
>>> +import org.ofbiz.widget.renderer.ScreenStringRenderer;
>>> +import org.ofbiz.widget.renderer.macro.MacroFormRenderer;
>>> +import org.ofbiz.widget.renderer.macro.MacroScreenRenderer;
>>> +import org.xml.sax.SAXException;
>>> +
>>> +import freemarker.template.TemplateException;
>>> +
>>> +
>>> +public class ExampleEvents {
>>> +
>>> +    public static final String module = ExampleEvents.class.getName();
>>> +
>>> +    public static final String examplePdfProperties =
>>> "examplepdf.properties";
>>> +
>>> +    public static final boolean useExampleDefaultOwnerPassword =
>>> UtilProperties.getPropertyValue(examplePdfProperties,
>>> "use.default.pdf.owner.password", "N").equalsIgnoreCase("Y");
>>> +
>>> +    public static final String exampleDefaultOwnerPassword =
>>> UtilProperties.getPropertyValue(examplePdfProperties,
>>> "default.pdf.owner.password", "ofbiz");
>>> +
>>> +    public static final String resourceExample = "ExampleUiLables";
>>> +
>>> +    /** Set password to the specified example and output the generated
>>> PDF.
>>> +     *@param request The HTTPRequest object for the current request
>>> +     *@param response The HTTPResponse object for the current request
>>> +     *@return String specifying the exit status of this event
>>> +     */
>>> +    public static String setExamplePdfPassword(HttpServletRequest
>>> request, HttpServletResponse response) {
>>> +        Delegator delegator = (Delegator)
>>> request.getAttribute("delegator");
>>> +        Locale locale = UtilHttp.getLocale(request);
>>> +        ServletContext servletContext =
>>> request.getSession().getServletContext();
>>> +
>>> +        Map<String, Object> requestParams =
>>> UtilHttp.getParameterMap(request);
>>> +        String password = (String) requestParams.get("PASSWORD");
>>> +        String confirmPassword = (String)
>>> requestParams.get("CONFIRM_PASSWORD");
>>> +
>>> +        if (UtilValidate.isEmpty(password) &&
>>> UtilValidate.isEmpty(confirmPassword) &&
>>> (UtilValidate.isEmpty(exampleDefaultOwnerPassword) ||
>>> !useExampleDefaultOwnerPassword)) {
>>> +               return "nopassword";
>>> +        }
>>> +        if (UtilValidate.isNotEmpty(password) &&
>>> !password.equals(confirmPassword)) {
>>> +               String errMsg = UtilProperties.getMessage(resourceExample,
>>> "password_not_equal_confirm_password", locale);
>>> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
>>> +            return "error";
>>> +        }
>>> +
>>> +        // get the original pdf
>>> +        String screenLocation =
>>> "component://example/widget/example/ExampleScreens.xml";
>>> +        String reportScreenName = "ExampleReport";
>>> +
>>> +        // render a screen to get the XML document
>>> +        Writer reportWriter = new StringWriter();
>>> +
>>> +        try {
>>> +            ScreenStringRenderer foScreenRenderer = new
>>> MacroScreenRenderer(EntityUtilProperties.getPropertyValue("widget", "
>>> screenfop.name", delegator),
>>> EntityUtilProperties.getPropertyValue("widget", "screenfop.screenrenderer",
>>> delegator));
>>> +            FormStringRenderer formStringRenderer = new
>>> MacroFormRenderer(EntityUtilProperties.getPropertyValue("widget",
>>> "screenfop.formrenderer", delegator), request, response);
>>> +            ScreenRenderer screens = new ScreenRenderer(reportWriter,
>>> null, foScreenRenderer);
>>> +            screens.populateContextForRequest(request, response,
>>> servletContext);
>>> +
>>> +            // this is the object used to render forms from their
>>> definitions
>>> +            screens.getContext().put("formStringRenderer",
>>> formStringRenderer);
>>> +            screens.getContext().put("simpleEncoder",
>>> UtilCodec.getEncoder(EntityUtilProperties.getPropertyValue("widget",
>>> "screenfop.encoder", delegator)));
>>> +
>>> +            screens.render(screenLocation, reportScreenName);
>>> +        } catch (GeneralException e) {
>>> +            String errMsg = "General error rendering screen [" +
>>> screenLocation + "]: " + e.toString();
>>> +            Debug.logError(e, errMsg, module);
>>> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
>>> +            return "error";
>>> +        } catch (IOException e) {
>>> +            String errMsg = "IO error rendering screen [" +
>>> screenLocation + "]: " + e.toString();
>>> +            Debug.logError(e, errMsg, module);
>>> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
>>> +            return "error";
>>> +        } catch (SAXException e) {
>>> +            String errMsg = "SAX (XML parse) error rendering screen [" +
>>> screenLocation + "]: " + e.toString();
>>> +            Debug.logError(e, errMsg, module);
>>> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
>>> +            return "error";
>>> +        } catch (ParserConfigurationException e) {
>>> +            String errMsg = "Parser configuration error rendering screen
>>> [" + screenLocation + "]: " + e.toString();
>>> +            Debug.logError(e, errMsg, module);
>>> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
>>> +            return "error";
>>> +        } catch (TemplateException e) {
>>> +            String errMsg = "Freemarker template error rendering screen
>>> [" + screenLocation + "]: " + e.toString();
>>> +            Debug.logError(e, errMsg, module);
>>> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
>>> +            return "error";
>>> +               }
>>> +
>>> +        // set the input source (XSL-FO) and generate the PDF
>>> +        StreamSource src = new StreamSource(new
>>> StringReader(reportWriter.toString()));
>>> +
>>> +        // create the output stream for the generation
>>> +        ByteArrayOutputStream out = new ByteArrayOutputStream();
>>> +
>>> +        try {
>>> +            Fop fop = ApacheFopWorker.createFopInstance(out,
>>> MimeConstants.MIME_PDF);
>>> +            ApacheFopWorker.transform(src, null, fop);
>>> +            out.flush();
>>> +            out.close();
>>> +        } catch (FOPException e) {
>>> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
>>> +            Debug.logError(e, module);
>>> +            return "error";
>>> +        } catch (IOException e) {
>>> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
>>> +            Debug.logError(e, module);
>>> +            return "error";
>>> +               }
>>> +
>>> +        // parse the pdf with PDFBox
>>> +        ByteArrayInputStream is = new
>>> ByteArrayInputStream(out.toByteArray());
>>> +        PDDocument document;
>>> +               try {
>>> +                       document = PDDocument.load(is);
>>> +               int keyLength = 40;
>>> +               AccessPermission ap = new AccessPermission();
>>> +               String ownerPassword = exampleDefaultOwnerPassword;
>>> +               if (UtilValidate.isEmpty(ownerPassword) ||
>>> !useExampleDefaultOwnerPassword) {
>>> +                       ownerPassword = password;
>>> +               }
>>> +               StandardProtectionPolicy spp = new
>>> StandardProtectionPolicy(ownerPassword, password, ap);
>>> +               spp.setEncryptionKeyLength(keyLength);
>>> +               document.protect(spp);
>>> +               } catch (IOException e) {
>>> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
>>> +            Debug.logError(e, module);
>>> +            return "error";
>>> +               } catch (BadSecurityHandlerException e) {
>>> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
>>> +            Debug.logError(e, module);
>>> +            return "error";
>>> +               } finally {
>>> +            try {
>>> +               if (is != null) {
>>> +                               is.close();
>>> +               }
>>> +                       } catch (IOException e) {
>>> +                               // ignore
>>> +                       }
>>> +               }
>>> +
>>> +               out = new ByteArrayOutputStream();
>>> +               try {
>>> +                       document.save(out);
>>> +               // set the content type and length
>>> +               response.setContentType(MimeConstants.MIME_PDF);
>>> +               response.setContentLength(out.size());
>>> +                       out.flush();
>>> +                       out.close();
>>> +               // write to the browser
>>> +               response.getOutputStream().write(out.toByteArray());
>>> +            response.getOutputStream().flush();
>>> +               } catch (COSVisitorException e) {
>>> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
>>> +            Debug.logError(e, module);
>>> +               return "error";
>>> +               } catch (IOException e) {
>>> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
>>> +            Debug.logError(e, module);
>>> +               return "error";
>>> +               }
>>> +
>>> +        return "success";
>>> +    }
>>> +
>>> +}
>>> 
>>> Propchange:
>>> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java
>>> 
>>> ------------------------------------------------------------------------------
>>>   svn:mime-type = text/plain
>>> 
>>> Modified:
>>> ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml
>>> URL:
>>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>>> 
>>> ==============================================================================
>>> ---
>>> ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml
>>> (original)
>>> +++
>>> ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml
>>> Sun Jul 12 19:46:54 2015
>>> @@ -225,6 +225,19 @@ under the License.
>>>        <response name="success" type="view" value="ExamplePieChart"/>
>>>    </request-map>
>>> 
>>> +    <!-- Pdf Report Options -->
>>> +    <request-map uri="ExampleReportPdfOptions">
>>> +        <security https="true" auth="true"/>
>>> +        <response name="success" type="view"
>>> value="ExampleReportPdfOptions"/>
>>> +    </request-map>
>>> +    <request-map uri="setExamplePdfPassword">
>>> +        <security https="true" auth="true"/>
>>> +        <event type="java" path="org.ofbiz.example.ExampleEvents"
>>> invoke="setExamplePdfPassword"/>
>>> +        <response name="success" type="none"/>
>>> +        <response name="nopassword" type="view" value="ExampleReportPdf"/>
>>> +        <response name="error" type="view"
>>> value="ExampleReportPdfOptions"/>
>>> +    </request-map>
>>> +
>>>    <!-- end of request mappings -->
>>> 
>>>    <!-- View Mappings -->
>>> @@ -283,5 +296,6 @@ under the License.
>>>        application/vnd.oasis.opendocument.presentation
>>>     -->
>>> 
>>> +    <view-map name="ExampleReportPdfOptions" type="screen"
>>> page="component://example/widget/example/ExampleScreens.xml#ExampleReportPdfOptions"/>
>>>    <!-- end of view mappings -->
>>> </site-conf>
>>> 
>>> Modified:
>>> ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml
>>> URL:
>>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>>> 
>>> ==============================================================================
>>> --- ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml
>>> (original)
>>> +++ ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml
>>> Sun Jul 12 19:46:54 2015
>>> @@ -103,6 +103,10 @@ under the License.
>>>                                                <parameter
>>> param-name="exampleId"/>
>>>                                                <image url-mode="raw"
>>> src="${iconsLocation}/page_white_acrobat.png"/>
>>>                                            </link>
>>> +                                            <link
>>> target="ExampleReportPdfOptions" text="${uiLabelMap.ExamplePdfPassword}"
>>> style="buttontext">
>>> +                                                <parameter
>>> param-name="exampleId"/>
>>> +                                                <image url-mode="raw"
>>> src="${iconsLocation}/page_white_acrobat.png"/>
>>> +                                            </link>
>>>                                            <link target="help"
>>> text="${uiLabelMap.CommonHelp}" style="buttontext" target-window="_blank">
>>>                                                <parameter
>>> param-name="topic" value="ExampleEditHelp"/>
>>>                                                <image url-mode="raw"
>>> src="${iconsLocation}/help.png"/>
>>> 
>>> Modified:
>>> ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml
>>> URL:
>>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>>> 
>>> ==============================================================================
>>> --- ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml
>>> (original)
>>> +++ ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml Sun
>>> Jul 12 19:46:54 2015
>>> @@ -311,4 +311,11 @@ under the License.
>>>        </field>
>>>        <field name="submitButton"
>>> title="${uiLabelMap.CommonAdd}"><submit button-type="button"/></field>
>>>    </form>
>>> +
>>> +    <form name="SetExamplePdfPassword" type="single"
>>> target="setExamplePdfPassword" title="">
>>> +        <field name="exampleId"><hidden/></field>
>>> +        <field name="PASSWORD"
>>> title="${uiLabelMap.CommonPassword}"><password size="15"
>>> maxlength="250"/></field>
>>> +        <field name="CONFIRM_PASSWORD"
>>> title="${uiLabelMap.CommonPassword}" tooltip="*
>>> ${uiLabelMap.CommonConfirm}"><password size="15" maxlength="250"/></field>
>>> +        <field name="submitButton"
>>> title="${uiLabelMap.ExampleGeneratePDF}"><submit
>>> button-type="button"/></field>
>>> +    </form>
>>> </forms>
>>> 
>>> Modified:
>>> ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml
>>> URL:
>>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>>> 
>>> ==============================================================================
>>> --- ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml
>>> (original)
>>> +++ ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml
>>> Sun Jul 12 19:46:54 2015
>>> @@ -494,4 +494,21 @@ under the License.
>>>            </widgets>
>>>        </section>
>>>    </screen>
>>> +
>>> +    <screen name="ExampleReportPdfOptions">
>>> +        <section>
>>> +            <actions>
>>> +                <set field="titleProperty"
>>> value="PageTitleSetExamplePdfPassword"/>
>>> +                <set field="tabButtonItem" value="EditExample"/>
>>> +                <set field="exampleId" from-field="parameters.exampleId"/>
>>> +            </actions>
>>> +            <widgets>
>>> +                <decorator-screen name="CommonExampleDecorator"
>>> location="${parameters.mainDecoratorLocation}">
>>> +                    <decorator-section name="body">
>>> +                        <include-form name="SetExamplePdfPassword"
>>> location="component://example/widget/example/ExampleForms.xml"/>
>>> +                    </decorator-section>
>>> +                </decorator-screen>
>>> +            </widgets>
>>> +        </section>
>>> +    </screen>
>>> </screens>
>>> 
>>> 
>>> 
> 


I need some advices/guides on whether to upgrade to FOP 2.0 in OFBiz trunk.

Posted by Shi Jinghai <hu...@hotmail.com>.
Hi,

I'm working on OFBIZ-6504. As Scott pointed out, my current implement is not good enough, so I tried the FOP 1.1 native encryption without lucky, FOP 2.0 encryption works well in my environment.

Could I upgrade FOP to 2.0 in OFBiz trunk? If yes, what test cases should I be more careful?

The source file affected:
framework/webapp/src/org/ofbiz/webapp/view/ApacheFopWorker.java

The following jars will be changed:
in application/content/lib:
fontbox: from 1.7.1 to 1.8.5

in framework/base/lib:
batik-all: from 1.7 to 1.8
fop: from 1.1 to 2.0
xmlgraphics-commons: from 1.5 to 2.0.1

New jar:
avalon-ffamcework: 4.2.0

The pdfbox and jempbox in application/content/lib will be upgrade to 1.8.5 with the font box.

The native encryption:
FOP 1.1: http://xmlgraphics.apache.org/fop/1.1/pdfencryption.html
FOP 2.0: http://xmlgraphics.apache.org/fop/2.0/pdfencryption.html

Kind Regards,

Shi Jinghai/Langhua


在 2015-7-13,下午4:19,Scott Gray <sc...@hotwaxsystems.com> 写道:

> Is it our plan to fill the example component with things like this?  It
> seems like such an obscure requirement.
> 
> Once upon a time the example application was intended to provide examples
> of core framework usage.  I don't think we're demonstrating the power of
> the framework here when the example requires quite a large amount of code
> to add a password.
> 
> Also, it looks like you're creating the PDF with FOP (via screens) then
> deconstructing it with PDFBox and regenerating it with a password? Also,
> what is ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar?  I
> think we have some admin stuff to do when adding new libs.
> 
> Lastly, if we were to be "selling" this as a framework feature, I would
> expect the renderer to simply take some special input parameters in the
> context that indicate the need for password protection and the passwords to
> use and then have the renderer do it itself.
> 
> 
> Regards
> Scott
> 
> On 13 July 2015 at 07:46, <sh...@apache.org> wrote:
> 
>> Author: shijh
>> Date: Sun Jul 12 19:46:54 2015
>> New Revision: 1690515
>> 
>> URL: http://svn.apache.org/r1690515
>> Log:
>> OFBIZ-6504.
>> 
>> Add an example to protect a pdf generated by FOP with owner password and
>> user password.
>> 
>> Added:
>>    ofbiz/trunk/specialpurpose/example/config/examplepdf.properties
>> (with props)
>>    ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar   (with
>> props)
>> 
>> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java
>> (with props)
>> Modified:
>>    ofbiz/trunk/specialpurpose/example/build.xml
>>    ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml
>>    ofbiz/trunk/specialpurpose/example/ofbiz-component.xml
>> 
>> ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml
>>    ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml
>>    ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml
>>    ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml
>> 
>> Modified: ofbiz/trunk/specialpurpose/example/build.xml
>> URL:
>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/build.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>> 
>> ==============================================================================
>> --- ofbiz/trunk/specialpurpose/example/build.xml (original)
>> +++ ofbiz/trunk/specialpurpose/example/build.xml Sun Jul 12 19:46:54 2015
>> @@ -51,5 +51,6 @@ under the License.
>>         <fileset dir="../../framework/webapp/lib" includes="*.jar"/>
>>         <fileset dir="../../framework/webapp/build/lib" includes="*.jar"/>
>>         <fileset dir="../../framework/common/build/lib" includes="*.jar"/>
>> +        <fileset dir="../../applications/content/lib" includes="*.jar"/>
>>     </path>
>> </project>
>> 
>> Modified: ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml
>> URL:
>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>> 
>> ==============================================================================
>> --- ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml
>> (original)
>> +++ ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml Sun Jul
>> 12 19:46:54 2015
>> @@ -1108,4 +1108,20 @@
>>         <value xml:lang="zh">ä½ ä¿®æ”¹äº†é€‰æ‹©æ¡†ä¸­çš„å€¼</value>
>>         <value xml:lang="zh-TW">ä½ ä¿®æ”¹äº†é ¸æ“‡æ¡†ä¸­çš„å€¼</value>
>>     </property>
>> +    <property key="ExamplePdfPassword">
>> +        <value xml:lang="en">PDF With Password</value>
>> +        <value xml:lang="zh">æœ‰å¯†ç  çš„PDF</value>
>> +    </property>
>> +    <property key="PageTitleSetExamplePdfPassword">
>> +        <value xml:lang="en">Set PDF Protected By Password</value>
>> +        <value xml:lang="zh">è®¾ç½®æœ‰å¯†ç  ä¿ æŠ¤çš„PDF</value>
>> +    </property>
>> +    <property key="ExampleGeneratePDF">
>> +        <value xml:lang="en">Generate PDF</value>
>> +        <value xml:lang="zh">ç”Ÿæˆ PDF</value>
>> +    </property>
>> +    <property key="password_did_not_match_confirm_password">
>> +        <value xml:lang="en">Password did not match confirm
>> password.</value>
>> +        <value xml:lang="zh">å¯†ç  ä¸ŽéªŒè¯ å¯†ç  ä¸ ä¸€è‡´ã€‚</value>
>> +    </property>
>> </resource>
>> 
>> Added: ofbiz/trunk/specialpurpose/example/config/examplepdf.properties
>> URL:
>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/config/examplepdf.properties?rev=1690515&view=auto
>> 
>> ==============================================================================
>> --- ofbiz/trunk/specialpurpose/example/config/examplepdf.properties (added)
>> +++ ofbiz/trunk/specialpurpose/example/config/examplepdf.properties Sun
>> Jul 12 19:46:54 2015
>> @@ -0,0 +1,24 @@
>> 
>> +###############################################################################
>> +# Licensed to the Apache Software Foundation (ASF) under one
>> +# or more contributor license agreements.  See the NOTICE file
>> +# distributed with this work for additional information
>> +# regarding copyright ownership.  The ASF licenses this file
>> +# to you under the Apache License, Version 2.0 (the
>> +# "License"); you may not use this file except in compliance
>> +# with the License.  You may obtain a copy of the License at
>> +#
>> +# http://www.apache.org/licenses/LICENSE-2.0
>> +#
>> +# Unless required by applicable law or agreed to in writing,
>> +# software distributed under the License is distributed on an
>> +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> +# KIND, either express or implied.  See the License for the
>> +# specific language governing permissions and limitations
>> +# under the License.
>> 
>> +###############################################################################
>> +
>> +# If Y, the default.pdf.owner.password will be used as owner password,
>> the user input password will be used as user password;
>> +# if N, the user input password will be used as owner password and user
>> password.
>> +use.default.pdf.owner.password=N
>> +
>> +default.pdf.owner.password=ofbiz
>> 
>> Propchange: ofbiz/trunk/specialpurpose/example/config/examplepdf.properties
>> 
>> ------------------------------------------------------------------------------
>>    svn:mime-type = text/plain
>> 
>> Added: ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar
>> URL:
>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar?rev=1690515&view=auto
>> 
>> ==============================================================================
>> Binary file - no diff available.
>> 
>> Propchange: ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar
>> 
>> ------------------------------------------------------------------------------
>>    svn:mime-type = application/octet-stream
>> 
>> Modified: ofbiz/trunk/specialpurpose/example/ofbiz-component.xml
>> URL:
>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/ofbiz-component.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>> 
>> ==============================================================================
>> --- ofbiz/trunk/specialpurpose/example/ofbiz-component.xml (original)
>> +++ ofbiz/trunk/specialpurpose/example/ofbiz-component.xml Sun Jul 12
>> 19:46:54 2015
>> @@ -30,6 +30,7 @@ under the License.
>> 
>>     <!-- load single or multiple external libraries -->
>>     <classpath type="jar" location="build/lib/*"/>
>> +    <classpath type="jar" location="lib/*"/>
>> 
>>     <!-- entity resources: model(s), eca(s), group, and data definitions
>> -->
>>     <entity-resource type="model" reader-name="main" loader="main"
>> location="entitydef/entitymodel.xml"/>
>> 
>> Added:
>> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java
>> URL:
>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java?rev=1690515&view=auto
>> 
>> ==============================================================================
>> ---
>> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java
>> (added)
>> +++
>> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java
>> Sun Jul 12 19:46:54 2015
>> @@ -0,0 +1,220 @@
>> 
>> +/*******************************************************************************
>> + * Licensed to the Apache Software Foundation (ASF) under one
>> + * or more contributor license agreements.  See the NOTICE file
>> + * distributed with this work for additional information
>> + * regarding copyright ownership.  The ASF licenses this file
>> + * to you under the Apache License, Version 2.0 (the
>> + * "License"); you may not use this file except in compliance
>> + * with the License.  You may obtain a copy of the License at
>> + *
>> + * http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing,
>> + * software distributed under the License is distributed on an
>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> + * KIND, either express or implied.  See the License for the
>> + * specific language governing permissions and limitations
>> + * under the License.
>> +
>> *******************************************************************************/
>> +package org.ofbiz.example;
>> +
>> +import java.io.ByteArrayInputStream;
>> +import java.io.ByteArrayOutputStream;
>> +import java.io.IOException;
>> +import java.io.StringReader;
>> +import java.io.StringWriter;
>> +import java.io.Writer;
>> +import java.util.Locale;
>> +import java.util.Map;
>> +
>> +import javax.servlet.ServletContext;
>> +import javax.servlet.http.HttpServletRequest;
>> +import javax.servlet.http.HttpServletResponse;
>> +import javax.xml.parsers.ParserConfigurationException;
>> +import javax.xml.transform.stream.StreamSource;
>> +
>> +import org.apache.fop.apps.FOPException;
>> +import org.apache.fop.apps.Fop;
>> +import org.apache.fop.apps.MimeConstants;
>> +import org.apache.pdfbox.exceptions.COSVisitorException;
>> +import org.apache.pdfbox.pdmodel.PDDocument;
>> +import org.apache.pdfbox.pdmodel.encryption.AccessPermission;
>> +import org.apache.pdfbox.pdmodel.encryption.BadSecurityHandlerException;
>> +import org.apache.pdfbox.pdmodel.encryption.StandardProtectionPolicy;
>> +import org.ofbiz.base.util.Debug;
>> +import org.ofbiz.base.util.GeneralException;
>> +import org.ofbiz.base.util.UtilCodec;
>> +import org.ofbiz.base.util.UtilHttp;
>> +import org.ofbiz.base.util.UtilProperties;
>> +import org.ofbiz.base.util.UtilValidate;
>> +import org.ofbiz.entity.Delegator;
>> +import org.ofbiz.entity.util.EntityUtilProperties;
>> +import org.ofbiz.webapp.view.ApacheFopWorker;
>> +import org.ofbiz.widget.renderer.FormStringRenderer;
>> +import org.ofbiz.widget.renderer.ScreenRenderer;
>> +import org.ofbiz.widget.renderer.ScreenStringRenderer;
>> +import org.ofbiz.widget.renderer.macro.MacroFormRenderer;
>> +import org.ofbiz.widget.renderer.macro.MacroScreenRenderer;
>> +import org.xml.sax.SAXException;
>> +
>> +import freemarker.template.TemplateException;
>> +
>> +
>> +public class ExampleEvents {
>> +
>> +    public static final String module = ExampleEvents.class.getName();
>> +
>> +    public static final String examplePdfProperties =
>> "examplepdf.properties";
>> +
>> +    public static final boolean useExampleDefaultOwnerPassword =
>> UtilProperties.getPropertyValue(examplePdfProperties,
>> "use.default.pdf.owner.password", "N").equalsIgnoreCase("Y");
>> +
>> +    public static final String exampleDefaultOwnerPassword =
>> UtilProperties.getPropertyValue(examplePdfProperties,
>> "default.pdf.owner.password", "ofbiz");
>> +
>> +    public static final String resourceExample = "ExampleUiLables";
>> +
>> +    /** Set password to the specified example and output the generated
>> PDF.
>> +     *@param request The HTTPRequest object for the current request
>> +     *@param response The HTTPResponse object for the current request
>> +     *@return String specifying the exit status of this event
>> +     */
>> +    public static String setExamplePdfPassword(HttpServletRequest
>> request, HttpServletResponse response) {
>> +        Delegator delegator = (Delegator)
>> request.getAttribute("delegator");
>> +        Locale locale = UtilHttp.getLocale(request);
>> +        ServletContext servletContext =
>> request.getSession().getServletContext();
>> +
>> +        Map<String, Object> requestParams =
>> UtilHttp.getParameterMap(request);
>> +        String password = (String) requestParams.get("PASSWORD");
>> +        String confirmPassword = (String)
>> requestParams.get("CONFIRM_PASSWORD");
>> +
>> +        if (UtilValidate.isEmpty(password) &&
>> UtilValidate.isEmpty(confirmPassword) &&
>> (UtilValidate.isEmpty(exampleDefaultOwnerPassword) ||
>> !useExampleDefaultOwnerPassword)) {
>> +               return "nopassword";
>> +        }
>> +        if (UtilValidate.isNotEmpty(password) &&
>> !password.equals(confirmPassword)) {
>> +               String errMsg = UtilProperties.getMessage(resourceExample,
>> "password_not_equal_confirm_password", locale);
>> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
>> +            return "error";
>> +        }
>> +
>> +        // get the original pdf
>> +        String screenLocation =
>> "component://example/widget/example/ExampleScreens.xml";
>> +        String reportScreenName = "ExampleReport";
>> +
>> +        // render a screen to get the XML document
>> +        Writer reportWriter = new StringWriter();
>> +
>> +        try {
>> +            ScreenStringRenderer foScreenRenderer = new
>> MacroScreenRenderer(EntityUtilProperties.getPropertyValue("widget", "
>> screenfop.name", delegator),
>> EntityUtilProperties.getPropertyValue("widget", "screenfop.screenrenderer",
>> delegator));
>> +            FormStringRenderer formStringRenderer = new
>> MacroFormRenderer(EntityUtilProperties.getPropertyValue("widget",
>> "screenfop.formrenderer", delegator), request, response);
>> +            ScreenRenderer screens = new ScreenRenderer(reportWriter,
>> null, foScreenRenderer);
>> +            screens.populateContextForRequest(request, response,
>> servletContext);
>> +
>> +            // this is the object used to render forms from their
>> definitions
>> +            screens.getContext().put("formStringRenderer",
>> formStringRenderer);
>> +            screens.getContext().put("simpleEncoder",
>> UtilCodec.getEncoder(EntityUtilProperties.getPropertyValue("widget",
>> "screenfop.encoder", delegator)));
>> +
>> +            screens.render(screenLocation, reportScreenName);
>> +        } catch (GeneralException e) {
>> +            String errMsg = "General error rendering screen [" +
>> screenLocation + "]: " + e.toString();
>> +            Debug.logError(e, errMsg, module);
>> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
>> +            return "error";
>> +        } catch (IOException e) {
>> +            String errMsg = "IO error rendering screen [" +
>> screenLocation + "]: " + e.toString();
>> +            Debug.logError(e, errMsg, module);
>> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
>> +            return "error";
>> +        } catch (SAXException e) {
>> +            String errMsg = "SAX (XML parse) error rendering screen [" +
>> screenLocation + "]: " + e.toString();
>> +            Debug.logError(e, errMsg, module);
>> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
>> +            return "error";
>> +        } catch (ParserConfigurationException e) {
>> +            String errMsg = "Parser configuration error rendering screen
>> [" + screenLocation + "]: " + e.toString();
>> +            Debug.logError(e, errMsg, module);
>> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
>> +            return "error";
>> +        } catch (TemplateException e) {
>> +            String errMsg = "Freemarker template error rendering screen
>> [" + screenLocation + "]: " + e.toString();
>> +            Debug.logError(e, errMsg, module);
>> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
>> +            return "error";
>> +               }
>> +
>> +        // set the input source (XSL-FO) and generate the PDF
>> +        StreamSource src = new StreamSource(new
>> StringReader(reportWriter.toString()));
>> +
>> +        // create the output stream for the generation
>> +        ByteArrayOutputStream out = new ByteArrayOutputStream();
>> +
>> +        try {
>> +            Fop fop = ApacheFopWorker.createFopInstance(out,
>> MimeConstants.MIME_PDF);
>> +            ApacheFopWorker.transform(src, null, fop);
>> +            out.flush();
>> +            out.close();
>> +        } catch (FOPException e) {
>> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
>> +            Debug.logError(e, module);
>> +            return "error";
>> +        } catch (IOException e) {
>> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
>> +            Debug.logError(e, module);
>> +            return "error";
>> +               }
>> +
>> +        // parse the pdf with PDFBox
>> +        ByteArrayInputStream is = new
>> ByteArrayInputStream(out.toByteArray());
>> +        PDDocument document;
>> +               try {
>> +                       document = PDDocument.load(is);
>> +               int keyLength = 40;
>> +               AccessPermission ap = new AccessPermission();
>> +               String ownerPassword = exampleDefaultOwnerPassword;
>> +               if (UtilValidate.isEmpty(ownerPassword) ||
>> !useExampleDefaultOwnerPassword) {
>> +                       ownerPassword = password;
>> +               }
>> +               StandardProtectionPolicy spp = new
>> StandardProtectionPolicy(ownerPassword, password, ap);
>> +               spp.setEncryptionKeyLength(keyLength);
>> +               document.protect(spp);
>> +               } catch (IOException e) {
>> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
>> +            Debug.logError(e, module);
>> +            return "error";
>> +               } catch (BadSecurityHandlerException e) {
>> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
>> +            Debug.logError(e, module);
>> +            return "error";
>> +               } finally {
>> +            try {
>> +               if (is != null) {
>> +                               is.close();
>> +               }
>> +                       } catch (IOException e) {
>> +                               // ignore
>> +                       }
>> +               }
>> +
>> +               out = new ByteArrayOutputStream();
>> +               try {
>> +                       document.save(out);
>> +               // set the content type and length
>> +               response.setContentType(MimeConstants.MIME_PDF);
>> +               response.setContentLength(out.size());
>> +                       out.flush();
>> +                       out.close();
>> +               // write to the browser
>> +               response.getOutputStream().write(out.toByteArray());
>> +            response.getOutputStream().flush();
>> +               } catch (COSVisitorException e) {
>> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
>> +            Debug.logError(e, module);
>> +               return "error";
>> +               } catch (IOException e) {
>> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
>> +            Debug.logError(e, module);
>> +               return "error";
>> +               }
>> +
>> +        return "success";
>> +    }
>> +
>> +}
>> 
>> Propchange:
>> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java
>> 
>> ------------------------------------------------------------------------------
>>    svn:mime-type = text/plain
>> 
>> Modified:
>> ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml
>> URL:
>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>> 
>> ==============================================================================
>> ---
>> ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml
>> (original)
>> +++
>> ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml
>> Sun Jul 12 19:46:54 2015
>> @@ -225,6 +225,19 @@ under the License.
>>         <response name="success" type="view" value="ExamplePieChart"/>
>>     </request-map>
>> 
>> +    <!-- Pdf Report Options -->
>> +    <request-map uri="ExampleReportPdfOptions">
>> +        <security https="true" auth="true"/>
>> +        <response name="success" type="view"
>> value="ExampleReportPdfOptions"/>
>> +    </request-map>
>> +    <request-map uri="setExamplePdfPassword">
>> +        <security https="true" auth="true"/>
>> +        <event type="java" path="org.ofbiz.example.ExampleEvents"
>> invoke="setExamplePdfPassword"/>
>> +        <response name="success" type="none"/>
>> +        <response name="nopassword" type="view" value="ExampleReportPdf"/>
>> +        <response name="error" type="view"
>> value="ExampleReportPdfOptions"/>
>> +    </request-map>
>> +
>>     <!-- end of request mappings -->
>> 
>>     <!-- View Mappings -->
>> @@ -283,5 +296,6 @@ under the License.
>>         application/vnd.oasis.opendocument.presentation
>>      -->
>> 
>> +    <view-map name="ExampleReportPdfOptions" type="screen"
>> page="component://example/widget/example/ExampleScreens.xml#ExampleReportPdfOptions"/>
>>     <!-- end of view mappings -->
>> </site-conf>
>> 
>> Modified:
>> ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml
>> URL:
>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>> 
>> ==============================================================================
>> --- ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml
>> (original)
>> +++ ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml
>> Sun Jul 12 19:46:54 2015
>> @@ -103,6 +103,10 @@ under the License.
>>                                                 <parameter
>> param-name="exampleId"/>
>>                                                 <image url-mode="raw"
>> src="${iconsLocation}/page_white_acrobat.png"/>
>>                                             </link>
>> +                                            <link
>> target="ExampleReportPdfOptions" text="${uiLabelMap.ExamplePdfPassword}"
>> style="buttontext">
>> +                                                <parameter
>> param-name="exampleId"/>
>> +                                                <image url-mode="raw"
>> src="${iconsLocation}/page_white_acrobat.png"/>
>> +                                            </link>
>>                                             <link target="help"
>> text="${uiLabelMap.CommonHelp}" style="buttontext" target-window="_blank">
>>                                                 <parameter
>> param-name="topic" value="ExampleEditHelp"/>
>>                                                 <image url-mode="raw"
>> src="${iconsLocation}/help.png"/>
>> 
>> Modified:
>> ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml
>> URL:
>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>> 
>> ==============================================================================
>> --- ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml
>> (original)
>> +++ ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml Sun
>> Jul 12 19:46:54 2015
>> @@ -311,4 +311,11 @@ under the License.
>>         </field>
>>         <field name="submitButton"
>> title="${uiLabelMap.CommonAdd}"><submit button-type="button"/></field>
>>     </form>
>> +
>> +    <form name="SetExamplePdfPassword" type="single"
>> target="setExamplePdfPassword" title="">
>> +        <field name="exampleId"><hidden/></field>
>> +        <field name="PASSWORD"
>> title="${uiLabelMap.CommonPassword}"><password size="15"
>> maxlength="250"/></field>
>> +        <field name="CONFIRM_PASSWORD"
>> title="${uiLabelMap.CommonPassword}" tooltip="*
>> ${uiLabelMap.CommonConfirm}"><password size="15" maxlength="250"/></field>
>> +        <field name="submitButton"
>> title="${uiLabelMap.ExampleGeneratePDF}"><submit
>> button-type="button"/></field>
>> +    </form>
>> </forms>
>> 
>> Modified:
>> ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml
>> URL:
>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>> 
>> ==============================================================================
>> --- ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml
>> (original)
>> +++ ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml
>> Sun Jul 12 19:46:54 2015
>> @@ -494,4 +494,21 @@ under the License.
>>             </widgets>
>>         </section>
>>     </screen>
>> +
>> +    <screen name="ExampleReportPdfOptions">
>> +        <section>
>> +            <actions>
>> +                <set field="titleProperty"
>> value="PageTitleSetExamplePdfPassword"/>
>> +                <set field="tabButtonItem" value="EditExample"/>
>> +                <set field="exampleId" from-field="parameters.exampleId"/>
>> +            </actions>
>> +            <widgets>
>> +                <decorator-screen name="CommonExampleDecorator"
>> location="${parameters.mainDecoratorLocation}">
>> +                    <decorator-section name="body">
>> +                        <include-form name="SetExamplePdfPassword"
>> location="component://example/widget/example/ExampleForms.xml"/>
>> +                    </decorator-section>
>> +                </decorator-screen>
>> +            </widgets>
>> +        </section>
>> +    </screen>
>> </screens>
>> 
>> 
>> 


Re: svn commit: r1690515 - in /ofbiz/trunk/specialpurpose/example: ./ config/ lib/ src/org/ofbiz/example/ webapp/example/WEB-INF/ widget/example/

Posted by Scott Gray <sc...@hotwaxsystems.com>.
Is it our plan to fill the example component with things like this?  It
seems like such an obscure requirement.

Once upon a time the example application was intended to provide examples
of core framework usage.  I don't think we're demonstrating the power of
the framework here when the example requires quite a large amount of code
to add a password.

Also, it looks like you're creating the PDF with FOP (via screens) then
deconstructing it with PDFBox and regenerating it with a password? Also,
what is ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar?  I
think we have some admin stuff to do when adding new libs.

Lastly, if we were to be "selling" this as a framework feature, I would
expect the renderer to simply take some special input parameters in the
context that indicate the need for password protection and the passwords to
use and then have the renderer do it itself.


Regards
Scott

On 13 July 2015 at 07:46, <sh...@apache.org> wrote:

> Author: shijh
> Date: Sun Jul 12 19:46:54 2015
> New Revision: 1690515
>
> URL: http://svn.apache.org/r1690515
> Log:
> OFBIZ-6504.
>
> Add an example to protect a pdf generated by FOP with owner password and
> user password.
>
> Added:
>     ofbiz/trunk/specialpurpose/example/config/examplepdf.properties
>  (with props)
>     ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar   (with
> props)
>
> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java
>  (with props)
> Modified:
>     ofbiz/trunk/specialpurpose/example/build.xml
>     ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml
>     ofbiz/trunk/specialpurpose/example/ofbiz-component.xml
>
> ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml
>     ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml
>     ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml
>     ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml
>
> Modified: ofbiz/trunk/specialpurpose/example/build.xml
> URL:
> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/build.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>
> ==============================================================================
> --- ofbiz/trunk/specialpurpose/example/build.xml (original)
> +++ ofbiz/trunk/specialpurpose/example/build.xml Sun Jul 12 19:46:54 2015
> @@ -51,5 +51,6 @@ under the License.
>          <fileset dir="../../framework/webapp/lib" includes="*.jar"/>
>          <fileset dir="../../framework/webapp/build/lib" includes="*.jar"/>
>          <fileset dir="../../framework/common/build/lib" includes="*.jar"/>
> +        <fileset dir="../../applications/content/lib" includes="*.jar"/>
>      </path>
>  </project>
>
> Modified: ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml
> URL:
> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>
> ==============================================================================
> --- ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml
> (original)
> +++ ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml Sun Jul
> 12 19:46:54 2015
> @@ -1108,4 +1108,20 @@
>          <value xml:lang="zh">ä½ ä¿®æ”¹äº†é€‰æ‹©æ¡†ä¸­çš„å€¼</value>
>          <value xml:lang="zh-TW">ä½ ä¿®æ”¹äº†é ¸æ“‡æ¡†ä¸­çš„å€¼</value>
>      </property>
> +    <property key="ExamplePdfPassword">
> +        <value xml:lang="en">PDF With Password</value>
> +        <value xml:lang="zh">æœ‰å¯†ç  çš„PDF</value>
> +    </property>
> +    <property key="PageTitleSetExamplePdfPassword">
> +        <value xml:lang="en">Set PDF Protected By Password</value>
> +        <value xml:lang="zh">è®¾ç½®æœ‰å¯†ç  ä¿ æŠ¤çš„PDF</value>
> +    </property>
> +    <property key="ExampleGeneratePDF">
> +        <value xml:lang="en">Generate PDF</value>
> +        <value xml:lang="zh">ç”Ÿæˆ PDF</value>
> +    </property>
> +    <property key="password_did_not_match_confirm_password">
> +        <value xml:lang="en">Password did not match confirm
> password.</value>
> +        <value xml:lang="zh">å¯†ç  ä¸ŽéªŒè¯ å¯†ç  ä¸ ä¸€è‡´ã€‚</value>
> +    </property>
>  </resource>
>
> Added: ofbiz/trunk/specialpurpose/example/config/examplepdf.properties
> URL:
> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/config/examplepdf.properties?rev=1690515&view=auto
>
> ==============================================================================
> --- ofbiz/trunk/specialpurpose/example/config/examplepdf.properties (added)
> +++ ofbiz/trunk/specialpurpose/example/config/examplepdf.properties Sun
> Jul 12 19:46:54 2015
> @@ -0,0 +1,24 @@
>
> +###############################################################################
> +# Licensed to the Apache Software Foundation (ASF) under one
> +# or more contributor license agreements.  See the NOTICE file
> +# distributed with this work for additional information
> +# regarding copyright ownership.  The ASF licenses this file
> +# to you under the Apache License, Version 2.0 (the
> +# "License"); you may not use this file except in compliance
> +# with the License.  You may obtain a copy of the License at
> +#
> +# http://www.apache.org/licenses/LICENSE-2.0
> +#
> +# Unless required by applicable law or agreed to in writing,
> +# software distributed under the License is distributed on an
> +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> +# KIND, either express or implied.  See the License for the
> +# specific language governing permissions and limitations
> +# under the License.
>
> +###############################################################################
> +
> +# If Y, the default.pdf.owner.password will be used as owner password,
> the user input password will be used as user password;
> +# if N, the user input password will be used as owner password and user
> password.
> +use.default.pdf.owner.password=N
> +
> +default.pdf.owner.password=ofbiz
>
> Propchange: ofbiz/trunk/specialpurpose/example/config/examplepdf.properties
>
> ------------------------------------------------------------------------------
>     svn:mime-type = text/plain
>
> Added: ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar
> URL:
> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar?rev=1690515&view=auto
>
> ==============================================================================
> Binary file - no diff available.
>
> Propchange: ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar
>
> ------------------------------------------------------------------------------
>     svn:mime-type = application/octet-stream
>
> Modified: ofbiz/trunk/specialpurpose/example/ofbiz-component.xml
> URL:
> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/ofbiz-component.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>
> ==============================================================================
> --- ofbiz/trunk/specialpurpose/example/ofbiz-component.xml (original)
> +++ ofbiz/trunk/specialpurpose/example/ofbiz-component.xml Sun Jul 12
> 19:46:54 2015
> @@ -30,6 +30,7 @@ under the License.
>
>      <!-- load single or multiple external libraries -->
>      <classpath type="jar" location="build/lib/*"/>
> +    <classpath type="jar" location="lib/*"/>
>
>      <!-- entity resources: model(s), eca(s), group, and data definitions
> -->
>      <entity-resource type="model" reader-name="main" loader="main"
> location="entitydef/entitymodel.xml"/>
>
> Added:
> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java
> URL:
> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java?rev=1690515&view=auto
>
> ==============================================================================
> ---
> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java
> (added)
> +++
> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java
> Sun Jul 12 19:46:54 2015
> @@ -0,0 +1,220 @@
>
> +/*******************************************************************************
> + * Licensed to the Apache Software Foundation (ASF) under one
> + * or more contributor license agreements.  See the NOTICE file
> + * distributed with this work for additional information
> + * regarding copyright ownership.  The ASF licenses this file
> + * to you under the Apache License, Version 2.0 (the
> + * "License"); you may not use this file except in compliance
> + * with the License.  You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing,
> + * software distributed under the License is distributed on an
> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> + * KIND, either express or implied.  See the License for the
> + * specific language governing permissions and limitations
> + * under the License.
> +
> *******************************************************************************/
> +package org.ofbiz.example;
> +
> +import java.io.ByteArrayInputStream;
> +import java.io.ByteArrayOutputStream;
> +import java.io.IOException;
> +import java.io.StringReader;
> +import java.io.StringWriter;
> +import java.io.Writer;
> +import java.util.Locale;
> +import java.util.Map;
> +
> +import javax.servlet.ServletContext;
> +import javax.servlet.http.HttpServletRequest;
> +import javax.servlet.http.HttpServletResponse;
> +import javax.xml.parsers.ParserConfigurationException;
> +import javax.xml.transform.stream.StreamSource;
> +
> +import org.apache.fop.apps.FOPException;
> +import org.apache.fop.apps.Fop;
> +import org.apache.fop.apps.MimeConstants;
> +import org.apache.pdfbox.exceptions.COSVisitorException;
> +import org.apache.pdfbox.pdmodel.PDDocument;
> +import org.apache.pdfbox.pdmodel.encryption.AccessPermission;
> +import org.apache.pdfbox.pdmodel.encryption.BadSecurityHandlerException;
> +import org.apache.pdfbox.pdmodel.encryption.StandardProtectionPolicy;
> +import org.ofbiz.base.util.Debug;
> +import org.ofbiz.base.util.GeneralException;
> +import org.ofbiz.base.util.UtilCodec;
> +import org.ofbiz.base.util.UtilHttp;
> +import org.ofbiz.base.util.UtilProperties;
> +import org.ofbiz.base.util.UtilValidate;
> +import org.ofbiz.entity.Delegator;
> +import org.ofbiz.entity.util.EntityUtilProperties;
> +import org.ofbiz.webapp.view.ApacheFopWorker;
> +import org.ofbiz.widget.renderer.FormStringRenderer;
> +import org.ofbiz.widget.renderer.ScreenRenderer;
> +import org.ofbiz.widget.renderer.ScreenStringRenderer;
> +import org.ofbiz.widget.renderer.macro.MacroFormRenderer;
> +import org.ofbiz.widget.renderer.macro.MacroScreenRenderer;
> +import org.xml.sax.SAXException;
> +
> +import freemarker.template.TemplateException;
> +
> +
> +public class ExampleEvents {
> +
> +    public static final String module = ExampleEvents.class.getName();
> +
> +    public static final String examplePdfProperties =
> "examplepdf.properties";
> +
> +    public static final boolean useExampleDefaultOwnerPassword =
> UtilProperties.getPropertyValue(examplePdfProperties,
> "use.default.pdf.owner.password", "N").equalsIgnoreCase("Y");
> +
> +    public static final String exampleDefaultOwnerPassword =
> UtilProperties.getPropertyValue(examplePdfProperties,
> "default.pdf.owner.password", "ofbiz");
> +
> +    public static final String resourceExample = "ExampleUiLables";
> +
> +    /** Set password to the specified example and output the generated
> PDF.
> +     *@param request The HTTPRequest object for the current request
> +     *@param response The HTTPResponse object for the current request
> +     *@return String specifying the exit status of this event
> +     */
> +    public static String setExamplePdfPassword(HttpServletRequest
> request, HttpServletResponse response) {
> +        Delegator delegator = (Delegator)
> request.getAttribute("delegator");
> +        Locale locale = UtilHttp.getLocale(request);
> +        ServletContext servletContext =
> request.getSession().getServletContext();
> +
> +        Map<String, Object> requestParams =
> UtilHttp.getParameterMap(request);
> +        String password = (String) requestParams.get("PASSWORD");
> +        String confirmPassword = (String)
> requestParams.get("CONFIRM_PASSWORD");
> +
> +        if (UtilValidate.isEmpty(password) &&
> UtilValidate.isEmpty(confirmPassword) &&
> (UtilValidate.isEmpty(exampleDefaultOwnerPassword) ||
> !useExampleDefaultOwnerPassword)) {
> +               return "nopassword";
> +        }
> +        if (UtilValidate.isNotEmpty(password) &&
> !password.equals(confirmPassword)) {
> +               String errMsg = UtilProperties.getMessage(resourceExample,
> "password_not_equal_confirm_password", locale);
> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
> +            return "error";
> +        }
> +
> +        // get the original pdf
> +        String screenLocation =
> "component://example/widget/example/ExampleScreens.xml";
> +        String reportScreenName = "ExampleReport";
> +
> +        // render a screen to get the XML document
> +        Writer reportWriter = new StringWriter();
> +
> +        try {
> +            ScreenStringRenderer foScreenRenderer = new
> MacroScreenRenderer(EntityUtilProperties.getPropertyValue("widget", "
> screenfop.name", delegator),
> EntityUtilProperties.getPropertyValue("widget", "screenfop.screenrenderer",
> delegator));
> +            FormStringRenderer formStringRenderer = new
> MacroFormRenderer(EntityUtilProperties.getPropertyValue("widget",
> "screenfop.formrenderer", delegator), request, response);
> +            ScreenRenderer screens = new ScreenRenderer(reportWriter,
> null, foScreenRenderer);
> +            screens.populateContextForRequest(request, response,
> servletContext);
> +
> +            // this is the object used to render forms from their
> definitions
> +            screens.getContext().put("formStringRenderer",
> formStringRenderer);
> +            screens.getContext().put("simpleEncoder",
> UtilCodec.getEncoder(EntityUtilProperties.getPropertyValue("widget",
> "screenfop.encoder", delegator)));
> +
> +            screens.render(screenLocation, reportScreenName);
> +        } catch (GeneralException e) {
> +            String errMsg = "General error rendering screen [" +
> screenLocation + "]: " + e.toString();
> +            Debug.logError(e, errMsg, module);
> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
> +            return "error";
> +        } catch (IOException e) {
> +            String errMsg = "IO error rendering screen [" +
> screenLocation + "]: " + e.toString();
> +            Debug.logError(e, errMsg, module);
> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
> +            return "error";
> +        } catch (SAXException e) {
> +            String errMsg = "SAX (XML parse) error rendering screen [" +
> screenLocation + "]: " + e.toString();
> +            Debug.logError(e, errMsg, module);
> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
> +            return "error";
> +        } catch (ParserConfigurationException e) {
> +            String errMsg = "Parser configuration error rendering screen
> [" + screenLocation + "]: " + e.toString();
> +            Debug.logError(e, errMsg, module);
> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
> +            return "error";
> +        } catch (TemplateException e) {
> +            String errMsg = "Freemarker template error rendering screen
> [" + screenLocation + "]: " + e.toString();
> +            Debug.logError(e, errMsg, module);
> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
> +            return "error";
> +               }
> +
> +        // set the input source (XSL-FO) and generate the PDF
> +        StreamSource src = new StreamSource(new
> StringReader(reportWriter.toString()));
> +
> +        // create the output stream for the generation
> +        ByteArrayOutputStream out = new ByteArrayOutputStream();
> +
> +        try {
> +            Fop fop = ApacheFopWorker.createFopInstance(out,
> MimeConstants.MIME_PDF);
> +            ApacheFopWorker.transform(src, null, fop);
> +            out.flush();
> +            out.close();
> +        } catch (FOPException e) {
> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
> +            Debug.logError(e, module);
> +            return "error";
> +        } catch (IOException e) {
> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
> +            Debug.logError(e, module);
> +            return "error";
> +               }
> +
> +        // parse the pdf with PDFBox
> +        ByteArrayInputStream is = new
> ByteArrayInputStream(out.toByteArray());
> +        PDDocument document;
> +               try {
> +                       document = PDDocument.load(is);
> +               int keyLength = 40;
> +               AccessPermission ap = new AccessPermission();
> +               String ownerPassword = exampleDefaultOwnerPassword;
> +               if (UtilValidate.isEmpty(ownerPassword) ||
> !useExampleDefaultOwnerPassword) {
> +                       ownerPassword = password;
> +               }
> +               StandardProtectionPolicy spp = new
> StandardProtectionPolicy(ownerPassword, password, ap);
> +               spp.setEncryptionKeyLength(keyLength);
> +               document.protect(spp);
> +               } catch (IOException e) {
> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
> +            Debug.logError(e, module);
> +            return "error";
> +               } catch (BadSecurityHandlerException e) {
> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
> +            Debug.logError(e, module);
> +            return "error";
> +               } finally {
> +            try {
> +               if (is != null) {
> +                               is.close();
> +               }
> +                       } catch (IOException e) {
> +                               // ignore
> +                       }
> +               }
> +
> +               out = new ByteArrayOutputStream();
> +               try {
> +                       document.save(out);
> +               // set the content type and length
> +               response.setContentType(MimeConstants.MIME_PDF);
> +               response.setContentLength(out.size());
> +                       out.flush();
> +                       out.close();
> +               // write to the browser
> +               response.getOutputStream().write(out.toByteArray());
> +            response.getOutputStream().flush();
> +               } catch (COSVisitorException e) {
> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
> +            Debug.logError(e, module);
> +               return "error";
> +               } catch (IOException e) {
> +            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
> +            Debug.logError(e, module);
> +               return "error";
> +               }
> +
> +        return "success";
> +    }
> +
> +}
>
> Propchange:
> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java
>
> ------------------------------------------------------------------------------
>     svn:mime-type = text/plain
>
> Modified:
> ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml
> URL:
> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>
> ==============================================================================
> ---
> ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml
> (original)
> +++
> ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml
> Sun Jul 12 19:46:54 2015
> @@ -225,6 +225,19 @@ under the License.
>          <response name="success" type="view" value="ExamplePieChart"/>
>      </request-map>
>
> +    <!-- Pdf Report Options -->
> +    <request-map uri="ExampleReportPdfOptions">
> +        <security https="true" auth="true"/>
> +        <response name="success" type="view"
> value="ExampleReportPdfOptions"/>
> +    </request-map>
> +    <request-map uri="setExamplePdfPassword">
> +        <security https="true" auth="true"/>
> +        <event type="java" path="org.ofbiz.example.ExampleEvents"
> invoke="setExamplePdfPassword"/>
> +        <response name="success" type="none"/>
> +        <response name="nopassword" type="view" value="ExampleReportPdf"/>
> +        <response name="error" type="view"
> value="ExampleReportPdfOptions"/>
> +    </request-map>
> +
>      <!-- end of request mappings -->
>
>      <!-- View Mappings -->
> @@ -283,5 +296,6 @@ under the License.
>          application/vnd.oasis.opendocument.presentation
>       -->
>
> +    <view-map name="ExampleReportPdfOptions" type="screen"
> page="component://example/widget/example/ExampleScreens.xml#ExampleReportPdfOptions"/>
>      <!-- end of view mappings -->
>  </site-conf>
>
> Modified:
> ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml
> URL:
> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>
> ==============================================================================
> --- ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml
> (original)
> +++ ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml
> Sun Jul 12 19:46:54 2015
> @@ -103,6 +103,10 @@ under the License.
>                                                  <parameter
> param-name="exampleId"/>
>                                                  <image url-mode="raw"
> src="${iconsLocation}/page_white_acrobat.png"/>
>                                              </link>
> +                                            <link
> target="ExampleReportPdfOptions" text="${uiLabelMap.ExamplePdfPassword}"
> style="buttontext">
> +                                                <parameter
> param-name="exampleId"/>
> +                                                <image url-mode="raw"
> src="${iconsLocation}/page_white_acrobat.png"/>
> +                                            </link>
>                                              <link target="help"
> text="${uiLabelMap.CommonHelp}" style="buttontext" target-window="_blank">
>                                                  <parameter
> param-name="topic" value="ExampleEditHelp"/>
>                                                  <image url-mode="raw"
> src="${iconsLocation}/help.png"/>
>
> Modified:
> ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml
> URL:
> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>
> ==============================================================================
> --- ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml
> (original)
> +++ ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml Sun
> Jul 12 19:46:54 2015
> @@ -311,4 +311,11 @@ under the License.
>          </field>
>          <field name="submitButton"
> title="${uiLabelMap.CommonAdd}"><submit button-type="button"/></field>
>      </form>
> +
> +    <form name="SetExamplePdfPassword" type="single"
> target="setExamplePdfPassword" title="">
> +        <field name="exampleId"><hidden/></field>
> +        <field name="PASSWORD"
> title="${uiLabelMap.CommonPassword}"><password size="15"
> maxlength="250"/></field>
> +        <field name="CONFIRM_PASSWORD"
> title="${uiLabelMap.CommonPassword}" tooltip="*
> ${uiLabelMap.CommonConfirm}"><password size="15" maxlength="250"/></field>
> +        <field name="submitButton"
> title="${uiLabelMap.ExampleGeneratePDF}"><submit
> button-type="button"/></field>
> +    </form>
>  </forms>
>
> Modified:
> ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml
> URL:
> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml?rev=1690515&r1=1690514&r2=1690515&view=diff
>
> ==============================================================================
> --- ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml
> (original)
> +++ ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml
> Sun Jul 12 19:46:54 2015
> @@ -494,4 +494,21 @@ under the License.
>              </widgets>
>          </section>
>      </screen>
> +
> +    <screen name="ExampleReportPdfOptions">
> +        <section>
> +            <actions>
> +                <set field="titleProperty"
> value="PageTitleSetExamplePdfPassword"/>
> +                <set field="tabButtonItem" value="EditExample"/>
> +                <set field="exampleId" from-field="parameters.exampleId"/>
> +            </actions>
> +            <widgets>
> +                <decorator-screen name="CommonExampleDecorator"
> location="${parameters.mainDecoratorLocation}">
> +                    <decorator-section name="body">
> +                        <include-form name="SetExamplePdfPassword"
> location="component://example/widget/example/ExampleForms.xml"/>
> +                    </decorator-section>
> +                </decorator-screen>
> +            </widgets>
> +        </section>
> +    </screen>
>  </screens>
>
>
>