From 34cc7d323f4d10dbaf3cf1e92e54792b1c5c0082 Mon Sep 17 00:00:00 2001 From: Daniel Seidel Date: Mon, 16 Jun 2014 17:11:22 +0200 Subject: [PATCH 01/46] Adjusted call of CmsXmlContainerPage's getContainerPage in CmsCsvExportBean.java to the OpenCms 9.5-API, i.e., removed locale as parameter. --- .../v8/formgenerator/database/export/CmsCsvExportBean.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/database/export/CmsCsvExportBean.java b/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/database/export/CmsCsvExportBean.java index 6705ab4d..d9162700 100644 --- a/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/database/export/CmsCsvExportBean.java +++ b/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/database/export/CmsCsvExportBean.java @@ -430,9 +430,7 @@ private void reconstructPossibleExportConfigurationAndLocale() { m_cms, pageResource); if (xmlContainerPage != null) { - CmsContainerPageBean containerPage = xmlContainerPage.getContainerPage( - m_cms, - m_locale); + CmsContainerPageBean containerPage = xmlContainerPage.getContainerPage(m_cms); if (containerPage != null) { Iterator pageElements = containerPage.getElements().iterator(); while (pageElements.hasNext()) { From 5ecf5fa307dcc933efcd7ed9f62fa7c54f41435e Mon Sep 17 00:00:00 2001 From: Daniel Seidel Date: Tue, 17 Jun 2014 09:25:38 +0200 Subject: [PATCH 02/46] Added CmsStringCrypter from the none-v8 commons package to the v8 version --- .../opencms/v8/commons/CmsStringCrypter.java | 218 ++++++++++++++++++ .../alkacon/opencms/v8/commons/Messages.java | 57 +++-- .../opencms/v8/commons/messages.properties | 5 + 3 files changed, 260 insertions(+), 20 deletions(-) create mode 100644 com.alkacon.opencms.v8.commons/src/com/alkacon/opencms/v8/commons/CmsStringCrypter.java diff --git a/com.alkacon.opencms.v8.commons/src/com/alkacon/opencms/v8/commons/CmsStringCrypter.java b/com.alkacon.opencms.v8.commons/src/com/alkacon/opencms/v8/commons/CmsStringCrypter.java new file mode 100644 index 00000000..986aef5f --- /dev/null +++ b/com.alkacon.opencms.v8.commons/src/com/alkacon/opencms/v8/commons/CmsStringCrypter.java @@ -0,0 +1,218 @@ +/* + * File : $Source: /alkacon/cvs/alkacon/com.alkacon.opencms.v8.commons/src/com/alkacon/opencms/v8/commons/CmsStringCrypter.java,v $ + * Date : $Date: 2007/11/30 11:57:27 $ + * Version: $Revision: 1.3 $ + * + * This file is part of the Alkacon OpenCms Add-On Module Package + * + * Copyright (c) 2007 Alkacon Software GmbH (http://www.alkacon.com) + * + * The Alkacon OpenCms Add-On Module Package is free software: + * you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * The Alkacon OpenCms Add-On Module Package is distributed + * in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * A + * You should have received a copy of the GNU General Public License + * along with the Alkacon OpenCms Add-On Module Package. + * If not, see http://www.gnu.org/licenses/. + * + * For further information about Alkacon Software GmbH, please see the + * company website: http://www.alkacon.com. + * + * For further information about OpenCms, please see the + * project website: http://www.opencms.org. + */ + +package com.alkacon.opencms.v8.commons; + +import org.opencms.i18n.CmsEncoder; +import org.opencms.main.CmsLog; +import org.opencms.util.CmsStringUtil; + +import java.security.Key; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; + +import org.apache.commons.logging.Log; + +import sun.misc.BASE64Decoder; +import sun.misc.BASE64Encoder; + +/** + * This class is responsible for encrypting and decrypting Strings.

+ * + * The result can be be used as URL parameters.

+ * + * @author Peter Bonrad + * @author Andreas Zahner + */ +public final class CmsStringCrypter { + + /** The encryption to be used. */ + private static final String ENCRYPTION = "DES"; + + /** The format of the key and the values to be crypted. */ + private static final String FORMAT = "UTF8"; + + /** The log object for this class. */ + private static final Log LOG = CmsLog.getLog(CmsStringCrypter.class); + + /** The default password to be used. */ + private static final String PASSWORD_DEFAULT = "fuZe-6jK"; + + /** + * Hides the public constructor for this utility class.

+ */ + private CmsStringCrypter() { + + // hide constructor + } + + /** + * Decrypts the given value which was encrypted with the encrypt method with a default password.

+ * + * @param value the value to be decrypted + * @return the decrypted string of the value or null if something went wrong + */ + public static String decrypt(String value) { + + return decrypt(value, PASSWORD_DEFAULT); + } + + /** + * Decrypts the given value which was encrypted with the encrypt method.

+ * + * @param value the value to be decrypted + * @param password the passsword used for decryption, has to be the same as used for encryption + * @return the decrypted string of the value or null if something went wrong + */ + public static String decrypt(String value, String password) { + + // check if given value is valid + if (CmsStringUtil.isEmptyOrWhitespaceOnly(value)) { + if (LOG.isWarnEnabled()) { + LOG.warn(Messages.get().getBundle().key(Messages.LOG_WARN_INVALID_DECRYPT_STRING_1, value)); + } + return null; + } + + try { + + // create key + Key key = new SecretKeySpec(getKey(password), ENCRYPTION); + Cipher cipher = Cipher.getInstance(ENCRYPTION); + cipher.init(Cipher.DECRYPT_MODE, key); + + // decode from base64 + BASE64Decoder base64decoder = new BASE64Decoder(); + + value = CmsStringUtil.substitute(value, "-", "+"); + value = CmsStringUtil.substitute(value, "_", "/"); + + byte[] cleartext = base64decoder.decodeBuffer(value); + + // decrypt text + byte[] ciphertext = cipher.doFinal(cleartext); + return CmsEncoder.decode(new String(ciphertext)); + } catch (Exception ex) { + if (LOG.isErrorEnabled()) { + LOG.error(Messages.get().getBundle().key(Messages.LOG_ERROR_DECRPYT_0), ex); + } + } + + return null; + } + + /** + * Encrypts the given value with a default password.

+ * + * @param value the string which should be encrypted + * @return the encrypted string of the value or null if something went wrong + */ + public static String encrypt(String value) { + + return encrypt(value, PASSWORD_DEFAULT); + } + + /** + * Encrypts the given value.

+ * + * @param value the string which should be encrypted + * @param password the passsword used for encryption, use the same password for decryption + * @return the encrypted string of the value or null if something went wrong + */ + public static String encrypt(String value, String password) { + + // check if given value is valid + if (CmsStringUtil.isEmptyOrWhitespaceOnly(value)) { + if (LOG.isWarnEnabled()) { + LOG.warn(Messages.get().getBundle().key(Messages.LOG_WARN_INVALID_ENCRYPT_STRING_1, value)); + } + return null; + } + + try { + + // create key + byte[] k = getKey(password); + Key key = new SecretKeySpec(k, ENCRYPTION); + Cipher cipher = Cipher.getInstance(ENCRYPTION); + cipher.init(Cipher.ENCRYPT_MODE, key); + + // encrypt text + byte[] cleartext = value.getBytes(FORMAT); + byte[] ciphertext = cipher.doFinal(cleartext); + + // encode with base64 to be used as a url parameter + BASE64Encoder base64encoder = new BASE64Encoder(); + String base64encoded = base64encoder.encode(ciphertext); + base64encoded = CmsStringUtil.substitute(base64encoded, "+", "-"); + base64encoded = CmsStringUtil.substitute(base64encoded, "/", "_"); + + return base64encoded; + } catch (Exception ex) { + if (LOG.isErrorEnabled()) { + LOG.error(Messages.get().getBundle().key(Messages.LOG_ERROR_ENCRYPT_0), ex); + } + } + + return null; + } + + /** + * Converts the given password to machine readable form.

+ * + * @param password the password to convert to a machine readable key + * @return the password in machine readable form + */ + private static byte[] getKey(String password) { + + try { + MessageDigest md5 = MessageDigest.getInstance("MD5"); + md5.update(password.toString().getBytes()); + byte[] key = md5.digest(); + // now get the first 8 bytes + byte[] finalKey = new byte[8]; + for (int i = 0; i <= 7; i++) { + finalKey[i] = key[i]; + } + return finalKey; + } catch (NoSuchAlgorithmException ex) { + if (LOG.isErrorEnabled()) { + LOG.error(Messages.get().getBundle().key(Messages.LOG_ERROR_CREATE_KEY_0), ex); + } + } + return null; + } + +} diff --git a/com.alkacon.opencms.v8.commons/src/com/alkacon/opencms/v8/commons/Messages.java b/com.alkacon.opencms.v8.commons/src/com/alkacon/opencms/v8/commons/Messages.java index 8431dd71..ad239e46 100644 --- a/com.alkacon.opencms.v8.commons/src/com/alkacon/opencms/v8/commons/Messages.java +++ b/com.alkacon.opencms.v8.commons/src/com/alkacon/opencms/v8/commons/Messages.java @@ -1,32 +1,33 @@ /* - * File : $Source: /home/cvs/EbkModules/src-modules/org/opencms/frontend/templateone/modules/Messages.java,v $ - * Date : $Date: 2006-12-01 08:33:07 $ - * Version: $Revision: 1.1 $ + * File : $Source: /alkacon/cvs/alkacon/com.alkacon.opencms.v8.commons/src/com/alkacon/opencms/v8/commons/Messages.java,v $ + * Date : $Date: 2007/11/30 11:57:27 $ + * Version: $Revision: 1.4 $ * - * This library is part of OpenCms - - * the Open Source Content Mananagement System + * This file is part of the Alkacon OpenCms Add-On Module Package * - * Copyright (c) 2005 Alkacon Software GmbH (http://www.alkacon.com) + * Copyright (c) 2007 Alkacon Software GmbH (http://www.alkacon.com) * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. + * The Alkacon OpenCms Add-On Module Package is free software: + * you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This library is distributed in the hope that it will be useful, + * The Alkacon OpenCms Add-On Module Package is distributed + * in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Alkacon OpenCms Add-On Module Package. + * If not, see http://www.gnu.org/licenses/. * * For further information about Alkacon Software GmbH, please see the - * company website: http://www.alkacon.com + * company website: http://www.alkacon.com. * * For further information about OpenCms, please see the - * project website: http://www.opencms.org - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * project website: http://www.opencms.org. */ package com.alkacon.opencms.v8.commons; @@ -38,13 +39,29 @@ * Convenience class to access the localized messages of this OpenCms package.

* * @author Achim Westermann + * @author Michael Moossen * - * @version $Revision: 1.1 $ + * @version $Revision: 1.4 $ * * @since 6.0.0 */ public final class Messages extends A_CmsMessageBundle { + /** Message constant for key in the resource bundle. */ + public static final String LOG_ERROR_DECRPYT_0 = "LOG_ERROR_DECRPYT_0"; + + /** Message constant for key in the resource bundle. */ + public static final String LOG_ERROR_ENCRYPT_0 = "LOG_ERROR_ENCRYPT_0"; + + /** Message constant for key in the resource bundle. */ + public static final String LOG_ERROR_CREATE_KEY_0 = "LOG_ERROR_CREATE_KEY_0"; + + /** Message constant for key in the resource bundle. */ + public static final String LOG_WARN_INVALID_DECRYPT_STRING_1 = "LOG_WARN_INVALID_DECRYPT_STRING_1"; + + /** Message constant for key in the resource bundle. */ + public static final String LOG_WARN_INVALID_ENCRYPT_STRING_1 = "LOG_WARN_INVALID_ENCRYPT_STRING_1"; + /** Message constant for key in the resource bundle. */ public static final String LOG_DEBUG_BUILD_HTML_NAVLIST_2 = "LOG_DEBUG_BUILD_HTML_NAVLIST_2"; diff --git a/com.alkacon.opencms.v8.commons/src/com/alkacon/opencms/v8/commons/messages.properties b/com.alkacon.opencms.v8.commons/src/com/alkacon/opencms/v8/commons/messages.properties index f2d8f2c0..05c9bc4c 100644 --- a/com.alkacon.opencms.v8.commons/src/com/alkacon/opencms/v8/commons/messages.properties +++ b/com.alkacon.opencms.v8.commons/src/com/alkacon/opencms/v8/commons/messages.properties @@ -1,2 +1,7 @@ +LOG_WARN_INVALID_DECRYPT_STRING_1 =The string to decrypt is invalid: {0}. +LOG_ERROR_DECRPYT_0 =Error while decrypting string. +LOG_WARN_INVALID_ENCRYPT_STRING_1 =The string to encrypt is invalid: {0}. +LOG_ERROR_ENCRYPT_0 =Error while encrypting string. +LOG_ERROR_CREATE_KEY_0 =Error creating key from password. LOG_DEBUG_BUILD_HTML_NAVLIST_2 =Category start folder is: {0}, FAQ resource type is: {1} LOG_ERR_MISSING_PROP_2 =Resource "{0}" has no property "{1}" set. \ No newline at end of file From ae353dae2e65eac22cee625f885872698263a65e Mon Sep 17 00:00:00 2001 From: Daniel Seidel Date: Tue, 17 Jun 2014 09:40:15 +0200 Subject: [PATCH 03/46] Added searchsetting containerPageOnly="true" to report.xsd and form.xsd - as it was in the none-v8 version of the Erzbistum Koeln. --- .../com.alkacon.opencms.v8.formgenerator/schemas/form.xsd | 1 + .../com.alkacon.opencms.v8.formgenerator/schemas/report.xsd | 1 + 2 files changed, 2 insertions(+) diff --git a/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/form.xsd b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/form.xsd index cd1278f6..9f9ca869 100644 --- a/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/form.xsd +++ b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/form.xsd @@ -90,6 +90,7 @@ + diff --git a/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/report.xsd b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/report.xsd index a31e419c..a977564e 100644 --- a/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/report.xsd +++ b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/report.xsd @@ -64,6 +64,7 @@ + From 66e6576fae6cec918d033e18fa6950fb01c34a67 Mon Sep 17 00:00:00 2001 From: Andreas Zahner Date: Tue, 17 Jun 2014 09:54:09 +0200 Subject: [PATCH 04/46] Took over changes for mail receiver by dynamic field, as used in the none-v8 Erzbistum Koeln version. --- .../opencms/v8/formgenerator/CmsFormHandler.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/CmsFormHandler.java b/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/CmsFormHandler.java index ae0b0260..f3149b5d 100644 --- a/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/CmsFormHandler.java +++ b/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/CmsFormHandler.java @@ -32,6 +32,7 @@ package com.alkacon.opencms.v8.formgenerator; +import com.alkacon.opencms.v8.commons.CmsStringCrypter; import com.alkacon.opencms.v8.formgenerator.database.CmsFormDataAccess; import com.alkacon.opencms.v8.formgenerator.database.CmsFormDatabaseFilter; @@ -159,6 +160,9 @@ public class CmsFormHandler extends CmsJspActionElement { /** Request parameter uri for the page parameter. */ public static final String PARAM_URI = "uri"; + /** Prefix for encrypted String values. */ + public static final String PREFIX_ENCRYPTED = "encrypted:"; + /** The log object for this class. */ private static final Log LOG = CmsLog.getLog(CmsFormHandler.class); @@ -1196,6 +1200,12 @@ public boolean sendData() { && !((field instanceof CmsDisplayField) || (field instanceof CmsHiddenDisplayField))) { fValue = data.getFieldStringValueByName(field.getName()); } + if (field instanceof CmsDynamicField) { + if (fValue.startsWith(PREFIX_ENCRYPTED)) { + fValue = fValue.substring(PREFIX_ENCRYPTED.length()); + fValue = CmsStringCrypter.decrypt(fValue); + } + } if (field instanceof CmsFileUploadField) { if (CmsStringUtil.isEmptyOrWhitespaceOnly(fValue)) { // try to read upload item from session attribute @@ -1865,6 +1875,7 @@ protected void configureForm(HttpServletRequest req, String formConfigUri) throw * * @throws Exception if creating the form configuration objects fails */ + @SuppressWarnings("unchecked") protected void configureForm(HttpServletRequest req, String formConfigUri, Map dynamicConfig) throws Exception { @@ -2059,7 +2070,7 @@ protected boolean sendMail() { theMail.setFrom(m_macroResolver.resolveMacros(getFormConfiguration().getMailFrom())); } } - theMail.setTo(createInternetAddresses(getFormConfiguration().getMailTo())); + theMail.setTo(createInternetAddresses(m_macroResolver.resolveMacros(getFormConfiguration().getMailTo()))); List ccRec = createInternetAddresses(m_macroResolver.resolveMacros(getFormConfiguration().getMailCC())); if (ccRec.size() > 0) { theMail.setCc(ccRec); @@ -2106,7 +2117,7 @@ protected boolean sendMail() { theMail.setFrom(m_macroResolver.resolveMacros(getFormConfiguration().getMailFrom())); } } - theMail.setTo(createInternetAddresses(getFormConfiguration().getMailTo())); + theMail.setTo(createInternetAddresses(m_macroResolver.resolveMacros(getFormConfiguration().getMailTo()))); List ccRec = createInternetAddresses(m_macroResolver.resolveMacros(getFormConfiguration().getMailCC())); if (ccRec.size() > 0) { theMail.setCc(ccRec); From 580bb5d6ecef2dac38aea73cd2ce27c894cd5c09 Mon Sep 17 00:00:00 2001 From: Andreas Zahner Date: Tue, 17 Jun 2014 10:30:16 +0200 Subject: [PATCH 05/46] Taken over alteration of Erzbistum Koeln commit of none-v8 version: Database forms can be viewed by users with write access to the container page woth the form. Additionally more precise typing. --- .../dialog/CmsFormListDialog.java | 58 ++++++++++++++----- 1 file changed, 42 insertions(+), 16 deletions(-) diff --git a/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/dialog/CmsFormListDialog.java b/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/dialog/CmsFormListDialog.java index 7cf90549..4302c896 100644 --- a/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/dialog/CmsFormListDialog.java +++ b/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/dialog/CmsFormListDialog.java @@ -34,10 +34,17 @@ import com.alkacon.opencms.v8.formgenerator.database.CmsFormDataAccess; import com.alkacon.opencms.v8.formgenerator.database.CmsFormDataBean; +import com.alkacon.opencms.v8.formgenerator.database.CmsFormDatabaseFilter; +import org.opencms.file.CmsResource; +import org.opencms.file.CmsResourceFilter; import org.opencms.jsp.CmsJspActionElement; +import org.opencms.main.CmsException; import org.opencms.main.CmsLog; import org.opencms.main.CmsRuntimeException; +import org.opencms.main.OpenCms; +import org.opencms.security.CmsPermissionSet; +import org.opencms.security.CmsRole; import org.opencms.workplace.CmsDialog; import org.opencms.workplace.list.A_CmsListDialog; import org.opencms.workplace.list.CmsListColumnAlignEnum; @@ -143,13 +150,17 @@ public void executeListMultiActions() throws CmsRuntimeException { * * @see org.opencms.workplace.list.A_CmsListDialog#executeListSingleActions() */ + @Override public void executeListSingleActions() throws CmsRuntimeException { if (LIST_ACTION_DELETE.equals(getParamListAction())) { try { - List entries = CmsFormDataAccess.getInstance().readForms(getSelectedItem().getId(), 0, Long.MAX_VALUE); - for (Iterator i = entries.iterator(); i.hasNext();) { - CmsFormDataBean entry = (CmsFormDataBean)i.next(); + List entries = CmsFormDataAccess.getInstance().readForms( + getSelectedItem().getId(), + 0, + Long.MAX_VALUE); + for (Iterator i = entries.iterator(); i.hasNext();) { + CmsFormDataBean entry = i.next(); CmsFormDataAccess.getInstance().deleteForm(entry.getEntryId()); } } catch (Exception e) { @@ -160,12 +171,12 @@ public void executeListSingleActions() throws CmsRuntimeException { } else if (LIST_ACTION_SHOW.equals(getParamListAction()) || LIST_ACTION_NAME.equals(getParamListAction())) { // add is clicked try { - Map params = new HashMap(); + Map params = new HashMap(); // set style to display report in correct layout - params.put(PARAM_STYLE, CmsToolDialog.STYLE_NEW); - params.put(PARAM_FORM_ID, getSelectedItem().getId()); - params.put(CmsDialog.PARAM_ACTION, CmsDialog.DIALOG_INITIAL); + params.put(PARAM_STYLE, new String[] {CmsToolDialog.STYLE_NEW}); + params.put(PARAM_FORM_ID, new String[] {getSelectedItem().getId()}); + params.put(CmsDialog.PARAM_ACTION, new String[] {CmsDialog.DIALOG_INITIAL}); // redirect to the report output JSP getToolManager().jspForwardTool(this, getCurrentToolPath() + WORKPLACE_PATH_FORM, params); @@ -195,20 +206,35 @@ protected void fillDetails(String detailId) { * @see org.opencms.workplace.list.A_CmsListDialog#getListItems() */ @Override - protected List getListItems() { + protected List getListItems() { List result = new ArrayList(); try { // read all form names CmsListMetadata meta = getList().getMetadata(); - Iterator it = CmsFormDataAccess.getInstance().countForms().entrySet().iterator(); - while (it.hasNext()) { - Map.Entry entry = (Map.Entry)it.next(); - String name = (String)entry.getKey(); - CmsListItem item = new CmsListItem(meta, name); - item.set(LIST_COLUMN_FORM_NAME, name); - item.set(LIST_COLUMN_FORM_COUNT, entry.getValue()); - result.add(item); + for (Map.Entry entry : CmsFormDataAccess.getInstance().countForms().entrySet()) { + String name = entry.getKey(); + List forms = CmsFormDataAccess.getInstance().readForms( + CmsFormDatabaseFilter.HEADERS.filterFormId(name)); + if (!forms.isEmpty()) { + try { + CmsResource formRes = getCms().readResource(forms.get(0).getResourceId(), CmsResourceFilter.ALL); + boolean editable = OpenCms.getRoleManager().hasRole(getCms(), CmsRole.DATABASE_MANAGER) + || getCms().hasPermissions( + formRes, + CmsPermissionSet.ACCESS_WRITE, + false, + CmsResourceFilter.ALL); + if (editable) { + CmsListItem item = new CmsListItem(meta, name); + item.set(LIST_COLUMN_FORM_NAME, name); + item.set(LIST_COLUMN_FORM_COUNT, entry.getValue()); + result.add(item); + } + } catch (CmsException e) { + LOG.error(e); + } + } } } catch (Throwable e) { if (LOG.isErrorEnabled()) { From 5f4fe735f83de568d6de444711fb3e7c1c5bfa76 Mon Sep 17 00:00:00 2001 From: Andreas Zahner Date: Tue, 17 Jun 2014 10:53:37 +0200 Subject: [PATCH 06/46] Added dependency from v8-commons module --- com.alkacon.opencms.v8.formgenerator/resources/manifest.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/com.alkacon.opencms.v8.formgenerator/resources/manifest.xml b/com.alkacon.opencms.v8.formgenerator/resources/manifest.xml index ab2569fd..f6291c9c 100644 --- a/com.alkacon.opencms.v8.formgenerator/resources/manifest.xml +++ b/com.alkacon.opencms.v8.formgenerator/resources/manifest.xml @@ -22,7 +22,9 @@ Mon, 27 Jun 2005 08:00:00 GMT - + + + From 9182f7687230bf92d5828af6aac97f739e459673 Mon Sep 17 00:00:00 2001 From: Daniel Seidel Date: Tue, 17 Jun 2014 12:39:25 +0200 Subject: [PATCH 07/46] Bugfix: optionalrelease.xsd typename suffix 's' was missing for the sequence type. --- .../schemas/optionalrelease.xsd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/optionalrelease.xsd b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/optionalrelease.xsd index f230c130..c4ba20ff 100644 --- a/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/optionalrelease.xsd +++ b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/optionalrelease.xsd @@ -2,9 +2,9 @@ - + - + From 3e66379c1fe90b3c47db919e6bba88652c85097f Mon Sep 17 00:00:00 2001 From: Daniel Seidel Date: Tue, 17 Jun 2014 15:46:31 +0200 Subject: [PATCH 08/46] added legacy versions of form.xsd and report.xsd to allow for compatibility with none-v8 contents. --- .../resources/manifest.xml | 40 +++++++ .../schemas/form_legacy.xsd | 100 ++++++++++++++++++ .../schemas/report_legacy.xsd | 71 +++++++++++++ 3 files changed, 211 insertions(+) create mode 100644 com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/form_legacy.xsd create mode 100644 com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/report_legacy.xsd diff --git a/com.alkacon.opencms.v8.formgenerator/resources/manifest.xml b/com.alkacon.opencms.v8.formgenerator/resources/manifest.xml index f6291c9c..dd8d211f 100644 --- a/com.alkacon.opencms.v8.formgenerator/resources/manifest.xml +++ b/com.alkacon.opencms.v8.formgenerator/resources/manifest.xml @@ -4129,6 +4129,26 @@ + + system/modules/com.alkacon.opencms.v8.formgenerator/schemas/form_legacy.xsd + system/modules/com.alkacon.opencms.v8.formgenerator/schemas/form_legacy.xsd + plain + f0b9dbdb-f622-11e3-b795-c9a60a7588dd + f0b9dbdc-f622-11e3-b795-c9a60a7588dd + Tue, 17 Jun 2014 13:26:44 GMT + Admin + Tue, 17 Jun 2014 13:26:07 GMT + Admin + 0 + + + Title + + + + + + system/modules/com.alkacon.opencms.v8.formgenerator/schemas/formdatatarget.xsd system/modules/com.alkacon.opencms.v8.formgenerator/schemas/formdatatarget.xsd @@ -4369,6 +4389,26 @@ + + system/modules/com.alkacon.opencms.v8.formgenerator/schemas/report_legacy.xsd + system/modules/com.alkacon.opencms.v8.formgenerator/schemas/report_legacy.xsd + plain + 1488ba9e-f623-11e3-b795-c9a60a7588dd + 1488ba9f-f623-11e3-b795-c9a60a7588dd + Tue, 17 Jun 2014 13:27:13 GMT + Admin + Tue, 17 Jun 2014 13:27:08 GMT + Admin + 0 + + + Title + + + + + + system/workplace folder diff --git a/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/form_legacy.xsd b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/form_legacy.xsd new file mode 100644 index 00000000..f12f2bfc --- /dev/null +++ b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/form_legacy.xsd @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/report_legacy.xsd b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/report_legacy.xsd new file mode 100644 index 00000000..08bf89cd --- /dev/null +++ b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/report_legacy.xsd @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 3a48ca9fe88ae06d7af98cc6b1bacb5af40bf62e Mon Sep 17 00:00:00 2001 From: Daniel Seidel Date: Wed, 18 Jun 2014 10:47:54 +0200 Subject: [PATCH 09/46] Added English and German localization for the Csv-Export settings XSD-Node --- .../com/alkacon/opencms/v8/formgenerator/workplace.properties | 4 ++++ .../alkacon/opencms/v8/formgenerator/workplace_de.properties | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/classes/com/alkacon/opencms/v8/formgenerator/workplace.properties b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/classes/com/alkacon/opencms/v8/formgenerator/workplace.properties index b313c252..5d1aaf69 100644 --- a/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/classes/com/alkacon/opencms/v8/formgenerator/workplace.properties +++ b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/classes/com/alkacon/opencms/v8/formgenerator/workplace.properties @@ -98,6 +98,10 @@ label.OptionalAlkaconV8WebFormConfiguration.ActionClass.help = The action class label.OptionalAlkaconV8WebFormConfiguration.KeepSession = Refresh session label.OptionalAlkaconV8WebFormConfiguration.KeepSession.help = If active, the time (in seconds) can be specified to refresh the session while the web form is displayed. +# Optional CSV export configuration +label.AlkaconV8WebForm.OptionalCsvExportConfiguration = Csv export configuration +label.AlkaconV8WebForm.OptionalCsvExportConfiguration.help = Provide a pipe ("|") separated list of the webform fields that should be exported. Use "_creationdate_" to export the creation date, "_resourcepath_" to export the path to the page where the form data was entered and "_resourceuuid_" to export the UUID of this page. If no configuration is given, all fields will be exported. To export fields of your form, enter their label (or database label). + # Optional confirmation mail nodes label.AlkaconV8WebForm.OptionalConfirmationMail = Confirmation Email label.OptionalAlkaconV8WebFormConfirmationMail.ConfirmationMailEnabled = Enable confirmation mail diff --git a/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/classes/com/alkacon/opencms/v8/formgenerator/workplace_de.properties b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/classes/com/alkacon/opencms/v8/formgenerator/workplace_de.properties index 75431da3..090ae430 100644 --- a/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/classes/com/alkacon/opencms/v8/formgenerator/workplace_de.properties +++ b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/classes/com/alkacon/opencms/v8/formgenerator/workplace_de.properties @@ -99,6 +99,10 @@ label.OptionalAlkaconV8WebFormConfiguration.ActionClass.help = Die Action Klasse label.OptionalAlkaconV8WebFormConfiguration.KeepSession = Erhalte Session label.OptionalAlkaconV8WebFormConfiguration.KeepSession.help = Wenn aktiviert, kann die Zeit (in Sekunden) angegeben werden, nach der die Session aktualisiert werden soll, während das Formular angezeigt wird. +# Optional CSV export configuration +label.AlkaconV8WebForm.OptionalCsvExportConfiguration = Konfiguration des Csv-Exports +label.AlkaconV8WebForm.OptionalCsvExportConfiguration.help = Geben Sie eine pipe-separierte ("|") Liste der zu exportierenden Webform-Felder an. Nutzen Sie die Platzhalter "_creationdate_" um das Erstellungsdatum zu exportieren, "_resourcepath_" um die URI der Seite, auf der das Formular ausgefüllt wurde auszugeben und "_resourceuuid_" um deren UUID zu exportieren. Ist keine Konfiguration gegeben werden alle Felder exportiert. Um form-spezifische Felder zu exportieren, geben Sie deren Beschreibungstext (oder, falls verwendet, das DB-Label) an. + # Optional confirmation mail nodes label.AlkaconV8WebForm.OptionalConfirmationMail= Bestätigungsmail label.OptionalAlkaconV8WebFormConfirmationMail.ConfirmationMailEnabled = Aktiviere Bestätigungsmail From 673196a91e3188bdce9c748712d146aac037c4b3 Mon Sep 17 00:00:00 2001 From: Daniel Seidel Date: Wed, 18 Jun 2014 12:31:33 +0200 Subject: [PATCH 10/46] Bugfix: Sometimes column separators in CSV-export were wrong. --- .../database/export/CmsCsvExportBean.java | 75 ++++++++++--------- 1 file changed, 40 insertions(+), 35 deletions(-) diff --git a/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/database/export/CmsCsvExportBean.java b/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/database/export/CmsCsvExportBean.java index d9162700..1a5fa945 100644 --- a/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/database/export/CmsCsvExportBean.java +++ b/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/database/export/CmsCsvExportBean.java @@ -227,15 +227,18 @@ private StringBuffer addColumnHeaders(final StringBuffer csv) throws SQLExceptio String csvDelimiter = getCsvDelimiter(); List columnNames = getColumnNames(); Iterator itColumns = columnNames.iterator(); + boolean hasPrevious = false; while (itColumns.hasNext()) { + if (hasPrevious) { + csv.append(csvDelimiter); + } else { + hasPrevious = true; + } String columnName = itColumns.next(); // skip empty columns (previous versions saved CmsEmptyField with empty values which will not be deleted): if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(columnName)) { columnName = escapeExcelCsv(columnName); csv.append(columnName); - if (itColumns.hasNext()) { - csv.append(csvDelimiter); - } } } csv.append("\r\n"); @@ -267,41 +270,43 @@ private StringBuffer addDataEntries(final StringBuffer csv) throws SQLException // c) developer errors, hw /sw problems... uuid = row.getResourceId(); Iterator itColumns = getColumnNames().iterator(); + boolean hasPrevious = false; // useful to handle possible empty colum as last column. while (itColumns.hasNext()) { String columnName = itColumns.next(); - // handle default columns - if (columnName == DEFAULT_COLUMN_NAME_CREATION_DATE) { - Date creationDate = new Date(row.getDateCreated()); - DateFormat dateTimeFormat = getDateTimeFormat(); - if (dateTimeFormat == null) { - csv.append(creationDate); - } else { - csv.append(dateTimeFormat.format(creationDate)); - } - //DateFormat.getDateTimeInstance(); - csv.append(getCsvDelimiter()); - } else if (columnName == DEFAULT_COLUMN_NAME_RESOURCE_PATH) { - try { - path = m_cms.readResource(uuid).getRootPath(); - } catch (Exception e) { - path = uuid.toString(); - } - csv.append(path); - csv.append(getCsvDelimiter()); - } else if (columnName == DEFAULT_COLUMN_NAME_RESOURCE_UUID) { - csv.append(String.valueOf(uuid)); - csv.append(getCsvDelimiter()); - //next: handle custom columns - } else if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(columnName)) { - // skip empty columns (previous versions saved CmsEmptyField with empty values which will not be deleted): - String value = row.getFieldValue(columnName); - if (value != null) { - value = transformLineSeparators(value); - value = escapeExcelCsv(value); - csv.append(value); - } - if (itColumns.hasNext()) { + // skip empty columns (previous versions saved CmsEmptyField with empty values which will not be deleted): + if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(columnName)) { + // add column separator if previous column is present + if (hasPrevious) { csv.append(getCsvDelimiter()); + } else { // tell that this column will be the previous of the next column + hasPrevious = true; + } + // handle default columns + if (columnName.equals(DEFAULT_COLUMN_NAME_CREATION_DATE)) { + Date creationDate = new Date(row.getDateCreated()); + DateFormat dateTimeFormat = getDateTimeFormat(); + if (dateTimeFormat == null) { + csv.append(creationDate); + } else { + csv.append(dateTimeFormat.format(creationDate)); + } + } else if (columnName.equals(DEFAULT_COLUMN_NAME_RESOURCE_PATH)) { + try { + path = m_cms.readResource(uuid).getRootPath(); + } catch (Exception e) { + path = uuid.toString(); + } + csv.append(path); + } else if (columnName.equals(DEFAULT_COLUMN_NAME_RESOURCE_UUID)) { + csv.append(String.valueOf(uuid)); + //next: handle custom columns + } else { + String value = row.getFieldValue(columnName); + if (value != null) { + value = transformLineSeparators(value); + value = escapeExcelCsv(value); + csv.append(value); + } } } } From 0b73dd302b9ba9ccbcf76f7b7b3b0668d12d895b Mon Sep 17 00:00:00 2001 From: Andreas Zahner Date: Wed, 18 Jun 2014 16:20:12 +0200 Subject: [PATCH 11/46] Revert "UNCHECKED CHANGES: Added facility to configure the CSV-Export the same way adding it at the v8 version of the module. Only difference: reconstruction of the configuration file (in CmsCsvExportBean.java) is adjusted. Details: - Added CSV-Export configuration facility - Renamed CmsCvsExportBean to CmsCsvExportBean and adjusted calls - Refactored CmsCsvExportBean" This reverts commit 9a18a24e466cfaaa63d7b7217dd3d44c067d09fb. --- .../resources/manifest.xml | 2 +- .../elements/datadownload.jsp | 60 +- .../elements/formexport.jsp | 29 +- .../schemas/form.xsd | 3 +- .../opencms/formgenerator/CmsForm.java | 33 +- .../database/export/CmsCsvExportBean.java | 661 ------------------ .../database/export/CmsCvsExportBean.java | 406 +++++++++++ .../database/export/Messages.java | 6 - .../database/export/messages.properties | 3 +- 9 files changed, 457 insertions(+), 746 deletions(-) delete mode 100644 com.alkacon.opencms.formgenerator/src/com/alkacon/opencms/formgenerator/database/export/CmsCsvExportBean.java create mode 100644 com.alkacon.opencms.formgenerator/src/com/alkacon/opencms/formgenerator/database/export/CmsCvsExportBean.java diff --git a/com.alkacon.opencms.formgenerator/resources/manifest.xml b/com.alkacon.opencms.formgenerator/resources/manifest.xml index 9f506d5e..298553ac 100644 --- a/com.alkacon.opencms.formgenerator/resources/manifest.xml +++ b/com.alkacon.opencms.formgenerator/resources/manifest.xml @@ -16,7 +16,7 @@ This module contains online form functionality for OpenCms.

This module can easily be used to create online input forms.

(c) 2011 by Alkacon Software GmbH (http://www.alkacon.com).

]]> - 2.1.0 + 2.0.1 Mon, 27 Jun 2005 08:00:00 GMT diff --git a/com.alkacon.opencms.formgenerator/resources/system/modules/com.alkacon.opencms.formgenerator/elements/datadownload.jsp b/com.alkacon.opencms.formgenerator/resources/system/modules/com.alkacon.opencms.formgenerator/elements/datadownload.jsp index dcc246d1..41ce5925 100644 --- a/com.alkacon.opencms.formgenerator/resources/system/modules/com.alkacon.opencms.formgenerator/elements/datadownload.jsp +++ b/com.alkacon.opencms.formgenerator/resources/system/modules/com.alkacon.opencms.formgenerator/elements/datadownload.jsp @@ -2,7 +2,9 @@ WARNING: Do not auto - reformat! In case of data download a linebreak will cause: "java.lang.IllegalStateException: getOutputStream() has already been called for this response". --%><%@page buffer="none" session="false" import="org.apache.commons.logging.*,java.io.OutputStreamWriter,org.opencms.module.CmsModule,org.opencms.i18n.*,com.alkacon.opencms.formgenerator.database.export.*,org.opencms.flex.CmsFlexController,com.alkacon.opencms.formgenerator.*,java.util.*,org.opencms.file.*,org.opencms.util.*,org.opencms.widgets.*,org.opencms.main.*,org.antlr.stringtemplate.*"%><%-- ---%><%@ taglib prefix="cms" uri="http://www.opencms.org/taglib/cms"%><%!private static final Log LOG = CmsLog.getLog(CmsCsvExportBean.class);%> +--%><%@ taglib prefix="cms" uri="http://www.opencms.org/taglib/cms"%><%! +private static final Log LOG = CmsLog.getLog(CmsCvsExportBean.class); +%> <% String formUri = null; %> @@ -20,10 +22,10 @@ WARNING: Do not auto - reformat! In case of data download a linebreak will cause if(paramMap.containsKey(cms.PARAM_URI)) { String[] paramValue = (String[])paramMap.get(cms.PARAM_URI); if ((paramValue != null) && (paramValue.length > 0)) { - formUri = paramValue[0]; + formUri = paramValue[0]; } else{ - formUri = cms.getRequestContext().getUri(); + formUri = cms.getRequestContext().getUri(); } cms.init(pageContext, request, response, formUri); } @@ -44,22 +46,22 @@ WARNING: Do not auto - reformat! In case of data download a linebreak will cause // get the configured form elements CmsForm form = cms.getFormConfiguration(); if (cms.downloadData()) { - CmsCsvExportBean exportBean = new CmsCsvExportBean(cms); + CmsCvsExportBean exportBean = new CmsCvsExportBean(cms); // Preparing the date values for the export bean: Date startDate; Date endDate; - String startDateStr = request.getParameter(CmsCsvExportBean.PARAM_EXPORT_DATA_TIME_START); - String endDateStr = request.getParameter(CmsCsvExportBean.PARAM_EXPORT_DATA_TIME_END); + String startDateStr = request.getParameter(CmsCvsExportBean.PARAM_EXPORT_DATA_TIME_START); + String endDateStr = request.getParameter(CmsCvsExportBean.PARAM_EXPORT_DATA_TIME_END); if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(startDateStr)) { - long startDateLong = CmsCalendarWidget.getCalendarDate(calendarMessages, startDateStr, true); - startDate = new Date(startDateLong); - exportBean.setStartTime(startDate); + long startDateLong = CmsCalendarWidget.getCalendarDate(calendarMessages, startDateStr, true); + startDate = new Date(startDateLong); + exportBean.setStartTime(startDate); } if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(endDateStr)) { - long endDateLong = CmsCalendarWidget.getCalendarDate(calendarMessages, endDateStr, true); - endDate = new Date(endDateLong); - exportBean.setEndTime(endDate); + long endDateLong = CmsCalendarWidget.getCalendarDate(calendarMessages, endDateStr, true); + endDate = new Date(endDateLong); + exportBean.setEndTime(endDate); } CmsFlexController controller = CmsFlexController.getController(request); @@ -71,21 +73,21 @@ WARNING: Do not auto - reformat! In case of data download a linebreak will cause ServletOutputStream output = null; OutputStreamWriter writer = null; try { - output = res.getOutputStream(); - CmsModule webformModule = OpenCms.getModuleManager().getModule(CmsForm.MODULE_NAME); - String encoding = webformModule.getParameter(CmsForm.MODULE_PARAM_EXPORTENCODING); - if(CmsStringUtil.isEmptyOrWhitespaceOnly(encoding)) { - encoding = OpenCms.getSystemInfo().getDefaultEncoding(); - } - writer = new OutputStreamWriter(output, encoding); - writer.write(exportBean.exportData()); + output = res.getOutputStream(); + CmsModule webformModule = OpenCms.getModuleManager().getModule(CmsForm.MODULE_NAME); + String encoding = webformModule.getParameter(CmsForm.MODULE_PARAM_EXPORTENCODING); + if(CmsStringUtil.isEmptyOrWhitespaceOnly(encoding)) { + encoding = OpenCms.getSystemInfo().getDefaultEncoding(); + } + writer = new OutputStreamWriter(output, encoding); + writer.write(exportBean.exportData()); } catch(RuntimeException f) { LOG.error("Error serving data.", f); throw f; } finally { if (writer!= null) { - writer.flush(); - writer.close(); + writer.flush(); + writer.close(); } } } @@ -104,14 +106,14 @@ WARNING: Do not auto - reformat! In case of data download a linebreak will cause sTemplate.setAttribute("calendaralttext", messages.key("form.html.calendar.alttext")); sTemplate.setAttribute("submitbutton", messages.key("form.button.submit")); sTemplate.setAttribute("resetbutton", messages.key("form.button.reset")); -%><%=org.opencms.widgets.CmsCalendarWidget.calendarIncludes(locale)%><%=sTemplate.toString()%> + %><%=org.opencms.widgets.CmsCalendarWidget.calendarIncludes(locale)%><%= sTemplate.toString() %> @@ -550,7 +550,7 @@ $endif$
- + $hiddenfields$
    
From ea493c02ce4899ec094f91e4f5c16b733d915721 Mon Sep 17 00:00:00 2001 From: Andreas Zahner Date: Fri, 19 Sep 2014 09:24:30 +0200 Subject: [PATCH 19/46] Fixed display issue with title in comments module. --- .../com.alkacon.opencms.comments/elements/comment_header.jsp | 3 ++- .../com.alkacon.opencms.comments/elements/comment_list.jsp | 2 +- .../formatters/comment-formatter.jsp | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/com.alkacon.opencms.comments/resources/system/modules/com.alkacon.opencms.comments/elements/comment_header.jsp b/com.alkacon.opencms.comments/resources/system/modules/com.alkacon.opencms.comments/elements/comment_header.jsp index 00a81cb9..6b92d63d 100644 --- a/com.alkacon.opencms.comments/resources/system/modules/com.alkacon.opencms.comments/elements/comment_header.jsp +++ b/com.alkacon.opencms.comments/resources/system/modules/com.alkacon.opencms.comments/elements/comment_header.jsp @@ -68,7 +68,8 @@ $.post( "%(link.weak:/system/modules/com.alkacon.opencms.comments/elements/comment_list.jsp:f11cf62d-ec2e-11dc-990f-dfec94299cf1)", { - cmturi: '${param.cmturi}', + title: '${param.title}', + cmturi: '${param.cmturi}', configUri: '${param.configUri}', cmtminimized:"${param.cmtminimized}", cmtlist:"${param.cmtlist}", diff --git a/com.alkacon.opencms.comments/resources/system/modules/com.alkacon.opencms.comments/elements/comment_list.jsp b/com.alkacon.opencms.comments/resources/system/modules/com.alkacon.opencms.comments/elements/comment_list.jsp index f2667be2..8cc19e03 100644 --- a/com.alkacon.opencms.comments/resources/system/modules/com.alkacon.opencms.comments/elements/comment_list.jsp +++ b/com.alkacon.opencms.comments/resources/system/modules/com.alkacon.opencms.comments/elements/comment_list.jsp @@ -16,7 +16,7 @@
- ${param.title} + ${cms:unescape(param.title, cms:vfs(pageContext).requestContext.encoding)} diff --git a/com.alkacon.opencms.comments/resources/system/modules/com.alkacon.opencms.comments/formatters/comment-formatter.jsp b/com.alkacon.opencms.comments/resources/system/modules/com.alkacon.opencms.comments/formatters/comment-formatter.jsp index 07b745a8..8bb6799d 100644 --- a/com.alkacon.opencms.comments/resources/system/modules/com.alkacon.opencms.comments/formatters/comment-formatter.jsp +++ b/com.alkacon.opencms.comments/resources/system/modules/com.alkacon.opencms.comments/formatters/comment-formatter.jsp @@ -90,7 +90,7 @@ data: { cmturi:"${alkaconCmt.uri}", configUri: "${configUri}", - title:"${content.hasValue.Headline ? content.value.Headline.stringValue : ''}", + title:"${content.hasValue.Headline ? cms:escape(content.value.Headline.stringValue, cms.requestContext.encoding) : ''}", cmtminimized:"${minimized}", cmtlist:"${list}", cmtsecurity:"${security}", From 8e587523ae6c2132a5331ceedf7adc1686bca6a3 Mon Sep 17 00:00:00 2001 From: Andreas Zahner Date: Fri, 19 Sep 2014 11:54:09 +0200 Subject: [PATCH 20/46] Fixed issue with selectable confirmation email in v8 form generator. --- .../src/com/alkacon/opencms/v8/formgenerator/CmsForm.java | 2 +- .../com/alkacon/opencms/v8/formgenerator/CmsFormHandler.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/CmsForm.java b/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/CmsForm.java index d7120684..0a48384f 100644 --- a/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/CmsForm.java +++ b/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/CmsForm.java @@ -1655,7 +1655,7 @@ protected I_CmsField createConfirmationMailCheckbox(CmsMessages messages, boolea field.setLabel(messages.key("form.confirmation.label")); // check the field status boolean isChecked = false; - if (!initial && Boolean.valueOf(getParameter(PARAM_SENDCONFIRMATION)).booleanValue()) { + if (!initial && Boolean.valueOf(getParameter(PARAM_SENDCONFIRMATION + getConfigId())).booleanValue()) { // checkbox is checked by user isChecked = true; } diff --git a/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/CmsFormHandler.java b/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/CmsFormHandler.java index f3149b5d..2a8e9cf8 100644 --- a/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/CmsFormHandler.java +++ b/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/CmsFormHandler.java @@ -1984,7 +1984,7 @@ protected List createInternetAddresses(String mailAddresses) th */ protected String getParameter(String parameter) { - if (PARAM_FORMACTION.equals(parameter)) { + if (PARAM_FORMACTION.equals(parameter) || CmsForm.PARAM_SENDCONFIRMATION.equals(parameter)) { parameter += getFormConfiguration().getConfigId(); } try { From 3f00e28e999dfe8940a360f0e53728a329d03d21 Mon Sep 17 00:00:00 2001 From: Andreas Zahner Date: Wed, 5 Nov 2014 14:56:07 +0100 Subject: [PATCH 21/46] Fixed german typo in form generator. --- .gitignore | 3 ++- .../alkacon/opencms/v8/formgenerator/workplace_de.properties | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index bbcf7729..b828f447 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ /.project /.checkstyle /.settings -/bin \ No newline at end of file +/bin +/.gradle diff --git a/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/classes/com/alkacon/opencms/v8/formgenerator/workplace_de.properties b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/classes/com/alkacon/opencms/v8/formgenerator/workplace_de.properties index 090ae430..18088e38 100644 --- a/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/classes/com/alkacon/opencms/v8/formgenerator/workplace_de.properties +++ b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/classes/com/alkacon/opencms/v8/formgenerator/workplace_de.properties @@ -189,7 +189,7 @@ form.field.type.privacy = Bestätigungslink form.field.type.radio = Radiobuttons form.field.type.select = Selectbox form.field.type.hidden = Verstecktes Feld -form.field.type.email = Emailfeld +form.field.type.email = E-Mail Feld form.field.type.fileupload = Datei Upload form.field.type.empty = Leeres Feld form.field.type.dynamic = Dynamisches Feld From 9c72c3304b16f64509a6a9e37b56ec37eb5b9867 Mon Sep 17 00:00:00 2001 From: Andreas Zahner Date: Wed, 5 Nov 2014 14:56:07 +0100 Subject: [PATCH 22/46] Fixed german typo in form generator. --- .../com/alkacon/opencms/formgenerator/workplace_de.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.alkacon.opencms.formgenerator/resources/system/modules/com.alkacon.opencms.formgenerator/classes/com/alkacon/opencms/formgenerator/workplace_de.properties b/com.alkacon.opencms.formgenerator/resources/system/modules/com.alkacon.opencms.formgenerator/classes/com/alkacon/opencms/formgenerator/workplace_de.properties index 36d60677..91606a86 100644 --- a/com.alkacon.opencms.formgenerator/resources/system/modules/com.alkacon.opencms.formgenerator/classes/com/alkacon/opencms/formgenerator/workplace_de.properties +++ b/com.alkacon.opencms.formgenerator/resources/system/modules/com.alkacon.opencms.formgenerator/classes/com/alkacon/opencms/formgenerator/workplace_de.properties @@ -183,7 +183,7 @@ form.field.type.privacy = Best form.field.type.radio = Radiobuttons form.field.type.select = Selectbox form.field.type.hidden = Verstecktes Feld -form.field.type.email = Emailfeld +form.field.type.email = E-Mail Feld form.field.type.fileupload = Datei Upload form.field.type.empty = Leeres Feld form.field.type.dynamic = Dynamisches Feld From 905570fcad4f5fb39f4879624c496778033e9edd Mon Sep 17 00:00:00 2001 From: Andreas Zahner Date: Wed, 5 Nov 2014 15:51:17 +0100 Subject: [PATCH 23/46] Fixed serial date widget, Friday was missing in the weekday list. --- .../opencms/commons/CmsConfigurableCollector.java | 14 ++++++++++++-- .../input/serialdate/CmsPatternPanelWeekly.java | 1 + 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/com.alkacon.opencms.commons/src/com/alkacon/opencms/commons/CmsConfigurableCollector.java b/com.alkacon.opencms.commons/src/com/alkacon/opencms/commons/CmsConfigurableCollector.java index 883a724a..bfeb52ac 100644 --- a/com.alkacon.opencms.commons/src/com/alkacon/opencms/commons/CmsConfigurableCollector.java +++ b/com.alkacon.opencms.commons/src/com/alkacon/opencms/commons/CmsConfigurableCollector.java @@ -166,6 +166,15 @@ public String getCreateParam(CmsObject cms, String collectorName, String param) * @see org.opencms.file.collectors.I_CmsResourceCollector#getResults(org.opencms.file.CmsObject, java.lang.String, java.lang.String) */ public List getResults(CmsObject cms, String collectorName, String param) + throws CmsDataAccessException, CmsException { + + return getResults(cms, collectorName, param, -1); + } + + /** + * @see org.opencms.file.collectors.I_CmsResourceCollector#getResults(org.opencms.file.CmsObject, java.lang.String, java.lang.String, int) + */ + public List getResults(CmsObject cms, String collectorName, String param, int numResults) throws CmsDataAccessException, CmsException { // if action is not set use default @@ -173,7 +182,7 @@ public List getResults(CmsObject cms, String collectorName, String collectorName = COLLECTOR_NAME; } - return getAllInFolder(cms, param); + return getAllInFolder(cms, param, numResults); } /** @@ -192,6 +201,7 @@ public void setCollectorConfigurations(List collector * * @param cms the current OpenCms user context * @param param the folder name to use + * @param numResults the number of results that should be returned (currently unused) * * @return all resources in the folder matching the given criteria * @@ -199,7 +209,7 @@ public void setCollectorConfigurations(List collector * @throws CmsIllegalArgumentException if the given param argument is not a link to a single file * */ - protected List getAllInFolder(CmsObject cms, String param) + protected List getAllInFolder(CmsObject cms, String param, int numResults) throws CmsException, CmsIllegalArgumentException { List collectorConfigurations = getCollectorConfigurations(); diff --git a/com.alkacon.opencms.v8.calendar/src/com/alkacon/opencms/v8/calendar/client/input/serialdate/CmsPatternPanelWeekly.java b/com.alkacon.opencms.v8.calendar/src/com/alkacon/opencms/v8/calendar/client/input/serialdate/CmsPatternPanelWeekly.java index b31238b4..32b39bf6 100644 --- a/com.alkacon.opencms.v8.calendar/src/com/alkacon/opencms/v8/calendar/client/input/serialdate/CmsPatternPanelWeekly.java +++ b/com.alkacon.opencms.v8.calendar/src/com/alkacon/opencms/v8/calendar/client/input/serialdate/CmsPatternPanelWeekly.java @@ -228,6 +228,7 @@ private void createDayPanel() { box = new CmsCheckBox(m_labels.get("GUI_SERIALDATE_DAY_FRIDAY_0").isString().stringValue()); box.setInternalValue("6"); m_checkboxes.add(box); + m_dayPanel.add(box); box = new CmsCheckBox(m_labels.get("GUI_SERIALDATE_DAY_SATURDAY_0").isString().stringValue()); box.setInternalValue("7"); m_checkboxes.add(box); From 9488d1353b04485eb65af7e7ff52a7eb2c89a01a Mon Sep 17 00:00:00 2001 From: Andreas Zahner Date: Thu, 6 Nov 2014 08:53:53 +0100 Subject: [PATCH 24/46] Changed v8 photoalbum thumbnail size selection to combo widget for more flexibility. --- .../com.alkacon.opencms.v8.photoalbum/schemas/overview.xsd | 2 +- .../com.alkacon.opencms.v8.photoalbum/schemas/photoalbum.xsd | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/schemas/overview.xsd b/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/schemas/overview.xsd index 43ab20aa..e8eb2d1f 100644 --- a/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/schemas/overview.xsd +++ b/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/schemas/overview.xsd @@ -30,7 +30,7 @@ - + diff --git a/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/schemas/photoalbum.xsd b/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/schemas/photoalbum.xsd index d475f875..014984f6 100644 --- a/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/schemas/photoalbum.xsd +++ b/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/schemas/photoalbum.xsd @@ -38,6 +38,7 @@ + From 886329c46d1e1e90cebda2aad2617ee61e3cdde0 Mon Sep 17 00:00:00 2001 From: Daniel Seidel Date: Thu, 20 Nov 2014 09:25:00 +0100 Subject: [PATCH 25/46] Added option 'noVersion' - if set the module-zips will not carry the version information in their names. --- build.gradle | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ad11b381..bbc58876 100644 --- a/build.gradle +++ b/build.gradle @@ -95,7 +95,11 @@ modules_oamp_all.split(',').each{ moduleName -> ext.dependencies = moduleDependencies ext.gwtSourceSetName = gwtSourceSetName ext.gwtRenameTo = gwtRename - version moduleVersion + if (project.hasProperty('noVersion')) { + version + } else { + version moduleVersion + } destinationDir modulesDistsDir // include the jar file from( "${project.buildDir}/libs") { From e4c4a6289ac4e5044893d446cfa4bc94d9a2ca11 Mon Sep 17 00:00:00 2001 From: Andreas Zahner Date: Mon, 24 Nov 2014 10:56:00 +0100 Subject: [PATCH 26/46] Update jCapatcha lib to work with OpenJDK (removed sun dependencies). --- .../lib/jcaptcha-1.0-all.jar | Bin 349572 -> 348827 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/lib/jcaptcha-1.0-all.jar b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/lib/jcaptcha-1.0-all.jar index 05462ff54362dc3eb41df41a6fe559b3bed31ebf..0bac069e82e822dc670c5ada5dabef16f59c3c75 100644 GIT binary patch delta 94763 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 Date: Wed, 17 Dec 2014 11:03:43 +0100 Subject: [PATCH 27/46] Added VFS folder validation to V8 photoalbum for better robustness. --- .../com/alkacon/opencms/v8/photoalbum/workplace.properties | 4 +++- .../com/alkacon/opencms/v8/photoalbum/workplace_de.properties | 4 +++- .../com.alkacon.opencms.v8.photoalbum/schemas/photoalbum.xsd | 3 +++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/classes/com/alkacon/opencms/v8/photoalbum/workplace.properties b/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/classes/com/alkacon/opencms/v8/photoalbum/workplace.properties index e78891ee..c3106cdb 100644 --- a/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/classes/com/alkacon/opencms/v8/photoalbum/workplace.properties +++ b/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/classes/com/alkacon/opencms/v8/photoalbum/workplace.properties @@ -54,4 +54,6 @@ photoalbum.text.align.right = Right photoalbum.navpos.top.above = Above the top text photoalbum.navpos.top.below = Below the top text photoalbum.navpos.bottom.above = Above the bottom text -photoalbum.navpos.bottom.below = Below the bottom text \ No newline at end of file +photoalbum.navpos.bottom.below = Below the bottom text + +alkacon-v8-photoalbum.error.vfsfolder.empty = Please select a folder with images. \ No newline at end of file diff --git a/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/classes/com/alkacon/opencms/v8/photoalbum/workplace_de.properties b/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/classes/com/alkacon/opencms/v8/photoalbum/workplace_de.properties index 7f41d2b6..132a5a79 100644 --- a/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/classes/com/alkacon/opencms/v8/photoalbum/workplace_de.properties +++ b/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/classes/com/alkacon/opencms/v8/photoalbum/workplace_de.properties @@ -55,4 +55,6 @@ photoalbum.navpos.top.above = photoalbum.navpos.top.below = Unterhalb des oberen Texts photoalbum.navpos.bottom.above = Über dem unteren Text photoalbum.navpos.bottom.below = Unterhalb des unteren Texts -photoalbum.navpos.combi.top.bottom.1 = Über oberem Text und unterhalb unterem Text \ No newline at end of file +photoalbum.navpos.combi.top.bottom.1 = Über oberem Text und unterhalb unterem Text + +alkacon-v8-photoalbum.error.vfsfolder.empty = Bitte geben Sie einen Ordner mit Bildern an. \ No newline at end of file diff --git a/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/schemas/photoalbum.xsd b/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/schemas/photoalbum.xsd index 014984f6..0ac2c078 100644 --- a/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/schemas/photoalbum.xsd +++ b/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/schemas/photoalbum.xsd @@ -55,6 +55,9 @@ + + + From d6c88ab2d3bfeeb80556a6db8fb53268680e250a Mon Sep 17 00:00:00 2001 From: Andreas Zahner Date: Fri, 19 Dec 2014 11:09:38 +0100 Subject: [PATCH 28/46] Removed v9.5 core incompatibilities from newsletter modules. --- .../CmsNewsletterResourceCollector.java | 20 ++++++++++++++++--- .../admin/CmsEditMailinglistDialog.java | 2 -- .../CmsNewsletterResourceCollector.java | 20 ++++++++++++++++--- .../admin/CmsEditMailinglistDialog.java | 2 -- 4 files changed, 34 insertions(+), 10 deletions(-) diff --git a/com.alkacon.opencms.newsletter/src/com/alkacon/opencms/newsletter/CmsNewsletterResourceCollector.java b/com.alkacon.opencms.newsletter/src/com/alkacon/opencms/newsletter/CmsNewsletterResourceCollector.java index 2d51570c..12d01eea 100644 --- a/com.alkacon.opencms.newsletter/src/com/alkacon/opencms/newsletter/CmsNewsletterResourceCollector.java +++ b/com.alkacon.opencms.newsletter/src/com/alkacon/opencms/newsletter/CmsNewsletterResourceCollector.java @@ -121,6 +121,15 @@ public String getCreateParam(CmsObject cms, String collectorName, String param) * @see org.opencms.file.collectors.I_CmsResourceCollector#getResults(org.opencms.file.CmsObject, java.lang.String, java.lang.String) */ public List getResults(CmsObject cms, String collectorName, String param) + throws CmsDataAccessException, CmsException { + + return getResults(cms, collectorName, param, -1); + } + + /** + * @see org.opencms.file.collectors.I_CmsResourceCollector#getResults(org.opencms.file.CmsObject, java.lang.String, java.lang.String, int) + */ + public List getResults(CmsObject cms, String collectorName, String param, int numResults) throws CmsDataAccessException, CmsException { // if action is not set use default @@ -131,10 +140,10 @@ public List getResults(CmsObject cms, String collectorName, String switch (COLLECTORS_LIST.indexOf(collectorName)) { case 0: // "allNewslettersInFolder" - return allNewslettersInFolder(cms, param, false); + return allNewslettersInFolder(cms, param, false, numResults); case 1: // "allNewslettersInSubTree" - return allNewslettersInFolder(cms, param, true); + return allNewslettersInFolder(cms, param, true, numResults); default: throw new CmsDataAccessException(Messages.get().container( Messages.ERR_COLLECTOR_NAME_INVALID_1, @@ -149,12 +158,14 @@ public List getResults(CmsObject cms, String collectorName, String * @param cms the current CmsObject * @param param must contain an extended collector parameter set as described by {@link CmsExtendedCollectorData} * @param tree if true, look in folder and all child folders, if false, look only in given folder + * @param numResults the number of results that should be returned * * @return a list of all newsletter resources in the folder pointed to by the parameter sorted by the send dates * * @throws CmsException if something goes wrong */ - protected List allNewslettersInFolder(CmsObject cms, String param, boolean tree) throws CmsException { + protected List allNewslettersInFolder(CmsObject cms, String param, boolean tree, int numResults) + throws CmsException { CmsExtendedCollectorData data = new CmsExtendedCollectorData(param); String foldername = CmsResource.getFolderPath(data.getFileName()); @@ -193,6 +204,9 @@ protected List allNewslettersInFolder(CmsObject cms, String param, CmsNewsletterDateResourceComparator comparator = new CmsNewsletterDateResourceComparator(cms, asc); Collections.sort(result, comparator); + if (numResults > data.getCount()) { + return shrinkToFit(result, numResults); + } return shrinkToFit(result, data.getCount()); } } \ No newline at end of file diff --git a/com.alkacon.opencms.newsletter/src/com/alkacon/opencms/newsletter/admin/CmsEditMailinglistDialog.java b/com.alkacon.opencms.newsletter/src/com/alkacon/opencms/newsletter/admin/CmsEditMailinglistDialog.java index 42e5ed12..392a1c82 100644 --- a/com.alkacon.opencms.newsletter/src/com/alkacon/opencms/newsletter/admin/CmsEditMailinglistDialog.java +++ b/com.alkacon.opencms.newsletter/src/com/alkacon/opencms/newsletter/admin/CmsEditMailinglistDialog.java @@ -87,8 +87,6 @@ public CmsEditMailinglistDialog(PageContext context, HttpServletRequest req, Htt */ public void actionCommit() { - m_group.setProjectCoWorker(false); - m_group.setProjectManager(false); m_group.setEnabled(true); setParentGroup(""); super.actionCommit(); diff --git a/com.alkacon.opencms.v8.newsletter/src/com/alkacon/opencms/v8/newsletter/CmsNewsletterResourceCollector.java b/com.alkacon.opencms.v8.newsletter/src/com/alkacon/opencms/v8/newsletter/CmsNewsletterResourceCollector.java index 8ecc4af2..3b2dc286 100644 --- a/com.alkacon.opencms.v8.newsletter/src/com/alkacon/opencms/v8/newsletter/CmsNewsletterResourceCollector.java +++ b/com.alkacon.opencms.v8.newsletter/src/com/alkacon/opencms/v8/newsletter/CmsNewsletterResourceCollector.java @@ -121,6 +121,15 @@ public String getCreateParam(CmsObject cms, String collectorName, String param) * @see org.opencms.file.collectors.I_CmsResourceCollector#getResults(org.opencms.file.CmsObject, java.lang.String, java.lang.String) */ public List getResults(CmsObject cms, String collectorName, String param) + throws CmsDataAccessException, CmsException { + + return getResults(cms, collectorName, param, -1); + } + + /** + * @see org.opencms.file.collectors.I_CmsResourceCollector#getResults(org.opencms.file.CmsObject, java.lang.String, java.lang.String, int) + */ + public List getResults(CmsObject cms, String collectorName, String param, int numResults) throws CmsDataAccessException, CmsException { // if action is not set use default @@ -131,10 +140,10 @@ public List getResults(CmsObject cms, String collectorName, String switch (COLLECTORS_LIST.indexOf(collectorName)) { case 0: // "allNewslettersInFolder" - return allNewslettersInFolder(cms, param, false); + return allNewslettersInFolder(cms, param, false, numResults); case 1: // "allNewslettersInSubTree" - return allNewslettersInFolder(cms, param, true); + return allNewslettersInFolder(cms, param, true, numResults); default: throw new CmsDataAccessException(Messages.get().container( Messages.ERR_COLLECTOR_NAME_INVALID_1, @@ -149,12 +158,14 @@ public List getResults(CmsObject cms, String collectorName, String * @param cms the current CmsObject * @param param must contain an extended collector parameter set as described by {@link CmsExtendedCollectorData} * @param tree if true, look in folder and all child folders, if false, look only in given folder + * @param numResults the number of results that should be returned * * @return a list of all newsletter resources in the folder pointed to by the parameter sorted by the send dates * * @throws CmsException if something goes wrong */ - protected List allNewslettersInFolder(CmsObject cms, String param, boolean tree) throws CmsException { + protected List allNewslettersInFolder(CmsObject cms, String param, boolean tree, int numResults) + throws CmsException { CmsExtendedCollectorData data = new CmsExtendedCollectorData(param); String foldername = CmsResource.getFolderPath(data.getFileName()); @@ -193,6 +204,9 @@ protected List allNewslettersInFolder(CmsObject cms, String param, CmsNewsletterDateResourceComparator comparator = new CmsNewsletterDateResourceComparator(cms, asc); Collections.sort(result, comparator); + if (numResults > data.getCount()) { + return shrinkToFit(result, numResults); + } return shrinkToFit(result, data.getCount()); } } \ No newline at end of file diff --git a/com.alkacon.opencms.v8.newsletter/src/com/alkacon/opencms/v8/newsletter/admin/CmsEditMailinglistDialog.java b/com.alkacon.opencms.v8.newsletter/src/com/alkacon/opencms/v8/newsletter/admin/CmsEditMailinglistDialog.java index f376bb8c..36fd958f 100644 --- a/com.alkacon.opencms.v8.newsletter/src/com/alkacon/opencms/v8/newsletter/admin/CmsEditMailinglistDialog.java +++ b/com.alkacon.opencms.v8.newsletter/src/com/alkacon/opencms/v8/newsletter/admin/CmsEditMailinglistDialog.java @@ -87,8 +87,6 @@ public CmsEditMailinglistDialog(PageContext context, HttpServletRequest req, Htt */ public void actionCommit() { - m_group.setProjectCoWorker(false); - m_group.setProjectManager(false); m_group.setEnabled(true); setParentGroup(""); super.actionCommit(); From 1b1a0be74c5159fe6654022d21ae288eb0055be7 Mon Sep 17 00:00:00 2001 From: Andreas Zahner Date: Fri, 19 Dec 2014 11:42:10 +0100 Subject: [PATCH 29/46] Added german holidays for 2015 and 2016 to calendar modules. --- .../opencms/calendar/holidays_de.properties | 139 ++++++++--------- .../v8/calendar/holidays_de.properties | 141 +++++++++--------- 2 files changed, 140 insertions(+), 140 deletions(-) diff --git a/com.alkacon.opencms.calendar/resources/system/modules/com.alkacon.opencms.calendar/classes/com/alkacon/opencms/calendar/holidays_de.properties b/com.alkacon.opencms.calendar/resources/system/modules/com.alkacon.opencms.calendar/classes/com/alkacon/opencms/calendar/holidays_de.properties index 71d85860..76eb0eb3 100644 --- a/com.alkacon.opencms.calendar/resources/system/modules/com.alkacon.opencms.calendar/classes/com/alkacon/opencms/calendar/holidays_de.properties +++ b/com.alkacon.opencms.calendar/resources/system/modules/com.alkacon.opencms.calendar/classes/com/alkacon/opencms/calendar/holidays_de.properties @@ -1,73 +1,5 @@ calendar.holidays.datepattern=dd.MM.yyyy -01.01.2012=Neujahr;2 -06.01.2012=Heilige Drei K\u00f6nige;1 -14.02.2012=Valentinstag;1 -20.02.2012=Rosenmontag;1 -21.02.2012=Fastnacht;1 -22.02.2012=Aschermittwoch;1 -06.04.2012=Karfreitag;2 -08.04.2012=Ostern;2 -09.04.2012=Ostermontag;2 -01.05.2012=Maifeiertag;2 -13.05.2012=Muttertag;1 -17.05.2012=Christi Himmelfahrt;2 -27.05.2012=Pfingstsonntag;2 -28.05.2012=Pfingstmontag;2 -07.06.2012=Fronleichnam;2 -08.08.2012=Friedensfest;1 -15.08.2012=Mari\u00e4 Himmelfahrt;1 -03.10.2012=Tag der Deutschen Einheit;2 -07.10.2012=Erntedankfest;1 -31.10.2012=Reformationstag;1 -01.11.2012=Allerheiligen;2 -18.11.2012=Volkstrauertag;1 -21.11.2012=Bu\u00df- und Bettag;1 -25.11.2012=Christk\u00f6nigsfest;1 -02.12.2012=1. Advent;1 -06.12.2012=Nikolaus;1 -09.12.2012=2. Advent;1 -16.12.2012=3. Advent;1 -23.12.2012=4. Advent;1 -24.12.2012=Heiligabend;1 -25.12.2012=1. Weihnachtstag;2 -26.12.2012=2. Weihnachtstag;2 -31.12.2012=Silvester;1 - -01.01.2013=Neujahr;2 -06.01.2013=Heilige Drei K\u00f6nige;1 -11.02.2013=Rosenmontag;1 -12.02.2013=Fastnacht;1 -13.02.2013=Aschermittwoch;1 -14.02.2013=Valentinstag;1 -29.03.2013=Karfreitag;2 -31.03.2013=Ostern;2 -01.04.2013=Ostermontag;2 -01.05.2013=Maifeiertag;2 -09.05.2013=Christi Himmelfahrt;2 -12.05.2013=Muttertag;1 -19.05.2013=Pfingstsonntag;2 -20.05.2013=Pfingstmontag;2 -30.05.2013=Fronleichnam;2 -08.08.2013=Friedensfest;1 -15.08.2013=Mari\u00e4 Himmelfahrt;1 -03.10.2013=Tag der Deutschen Einheit;2 -03.10.2013=Erntedankfest;1 -31.10.2013=Reformationstag;1 -01.11.2013=Allerheiligen;2 -17.11.2013=Volkstrauertag;1 -20.11.2013=Bu\u00df- und Bettag;1 -24.11.2013=Christk\u00f6nigsfest;1 -01.12.2013=1. Advent;1 -06.12.2013=Nikolaus;1 -08.12.2013=2. Advent;1 -15.12.2013=3. Advent;1 -22.12.2013=4. Advent;1 -24.12.2013=Heiligabend;1 -25.12.2013=1. Weihnachtstag;2 -26.12.2013=2. Weihnachtstag;2 -31.12.2013=Silvester;1 - 01.01.2014=Neujahr;2 06.01.2014=Heilige Drei K\u00f6nige;1 14.02.2014=Valentinstag;1 @@ -100,4 +32,73 @@ calendar.holidays.datepattern=dd.MM.yyyy 24.12.2014=Heiligabend;1 25.12.2014=1. Weihnachtstag;2 26.12.2014=2. Weihnachtstag;2 -31.12.2014=Silvester;1 \ No newline at end of file +31.12.2014=Silvester;1 + +# Holidays for 2015 +01.01.2015=Neujahr;2 +06.01.2015=Heilige Drei K\u00f6nige;1 +14.02.2015=Valentinstag;1 +16.02.2015=Rosenmontag;1 +17.02.2015=Fastnacht;1 +18.02.2015=Aschermittwoch;1 +03.04.2015=Karfreitag;2 +05.04.2015=Ostern;2 +06.04.2015=Ostermontag;2 +01.05.2015=Maifeiertag;2 +10.05.2015=Muttertag;1 +14.05.2015=Christi Himmelfahrt;2 +24.05.2015=Pfingstsonntag;2 +25.05.2015=Pfingstmontag;2 +04.06.2015=Fronleichnam;2 +08.08.2015=Friedensfest;1 +15.08.2015=Mari\u00e4 Himmelfahrt;1 +03.10.2015=Tag der Deutschen Einheit;2 +04.10.2015=Erntedankfest;1 +31.10.2015=Reformationstag;1 +01.11.2015=Allerheiligen;2 +15.11.2015=Volkstrauertag;1 +18.11.2015=Bu\u00df- und Bettag;1 +22.11.2015=Christk\u00f6nigsfest;1 +29.11.2015=1. Advent;1 +06.12.2015=2. Advent, Nikolaus;1 +13.12.2015=3. Advent;1 +20.12.2015=4. Advent;1 +24.12.2015=Heiligabend;1 +25.12.2015=1. Weihnachtstag;2 +26.12.2015=2. Weihnachtstag;2 +31.12.2015=Silvester;1 + +# Holidays for 2016 +01.01.2016=Neujahr;2 +06.01.2016=Heilige Drei K\u00f6nige;1 +14.02.2016=Valentinstag;1 +08.02.2016=Rosenmontag;1 +09.02.2016=Fastnacht;1 +10.02.2016=Aschermittwoch;1 +25.03.2016=Karfreitag;2 +27.03.2016=Ostern;2 +28.03.2016=Ostermontag;2 +01.05.2016=Maifeiertag;2 +08.05.2016=Muttertag;1 +05.05.2016=Christi Himmelfahrt;2 +15.05.2016=Pfingstsonntag;2 +16.05.2016=Pfingstmontag;2 +26.05.2016=Fronleichnam;2 +08.08.2016=Friedensfest;1 +15.08.2016=Mari\u00e4 Himmelfahrt;1 +03.10.2016=Tag der Deutschen Einheit;2 +02.10.2016=Erntedankfest;1 +31.10.2016=Reformationstag;1 +01.11.2016=Allerheiligen;2 +13.11.2016=Volkstrauertag;1 +16.11.2016=Bu\u00df- und Bettag;1 +20.11.2016=Christk\u00f6nigsfest;1 +27.11.2016=1. Advent;1 +06.12.2016=Nikolaus;1 +04.12.2016=2. Advent;1 +11.12.2016=3. Advent;1 +18.12.2016=4. Advent;1 +24.12.2016=Heiligabend;1 +25.12.2016=1. Weihnachtstag;2 +26.12.2016=2. Weihnachtstag;2 +31.12.2016=Silvester;1 \ No newline at end of file diff --git a/com.alkacon.opencms.v8.calendar/resources/system/modules/com.alkacon.opencms.v8.calendar/classes/com/alkacon/opencms/v8/calendar/holidays_de.properties b/com.alkacon.opencms.v8.calendar/resources/system/modules/com.alkacon.opencms.v8.calendar/classes/com/alkacon/opencms/v8/calendar/holidays_de.properties index 5ef05538..c74e1e1c 100644 --- a/com.alkacon.opencms.v8.calendar/resources/system/modules/com.alkacon.opencms.v8.calendar/classes/com/alkacon/opencms/v8/calendar/holidays_de.properties +++ b/com.alkacon.opencms.v8.calendar/resources/system/modules/com.alkacon.opencms.v8.calendar/classes/com/alkacon/opencms/v8/calendar/holidays_de.properties @@ -5,76 +5,6 @@ calendar.holidays.datepattern=dd.MM.yyyy # {DATE} = {NAME OF HOLIDAY};{TYPE} # where type can be 1: maybe a holiday, 2: holiday -# Holidays for 2012 -01.01.2012=Neujahr;2 -06.01.2012=Heilige Drei K\u00f6nige;1 -14.02.2012=Valentinstag;1 -20.02.2012=Rosenmontag;1 -21.02.2012=Fastnacht;1 -22.02.2012=Aschermittwoch;1 -06.04.2012=Karfreitag;2 -08.04.2012=Ostern;2 -09.04.2012=Ostermontag;2 -01.05.2012=Maifeiertag;2 -13.05.2012=Muttertag;1 -17.05.2012=Christi Himmelfahrt;2 -27.05.2012=Pfingstsonntag;2 -28.05.2012=Pfingstmontag;2 -07.06.2012=Fronleichnam;2 -08.08.2012=Friedensfest;1 -15.08.2012=Mari\u00e4 Himmelfahrt;1 -03.10.2012=Tag der Deutschen Einheit;2 -07.10.2012=Erntedankfest;1 -31.10.2012=Reformationstag;1 -01.11.2012=Allerheiligen;2 -18.11.2012=Volkstrauertag;1 -21.11.2012=Bu\u00df- und Bettag;1 -25.11.2012=Christk\u00f6nigsfest;1 -02.12.2012=1. Advent;1 -06.12.2012=Nikolaus;1 -09.12.2012=2. Advent;1 -16.12.2012=3. Advent;1 -23.12.2012=4. Advent;1 -24.12.2012=Heiligabend;1 -25.12.2012=1. Weihnachtstag;2 -26.12.2012=2. Weihnachtstag;2 -31.12.2012=Silvester;1 - -# Holidays for 2013 -01.01.2013=Neujahr;2 -06.01.2013=Heilige Drei K\u00f6nige;1 -11.02.2013=Rosenmontag;1 -12.02.2013=Fastnacht;1 -13.02.2013=Aschermittwoch;1 -14.02.2013=Valentinstag;1 -29.03.2013=Karfreitag;2 -31.03.2013=Ostern;2 -01.04.2013=Ostermontag;2 -01.05.2013=Maifeiertag;2 -09.05.2013=Christi Himmelfahrt;2 -12.05.2013=Muttertag;1 -19.05.2013=Pfingstsonntag;2 -20.05.2013=Pfingstmontag;2 -30.05.2013=Fronleichnam;2 -08.08.2013=Friedensfest;1 -15.08.2013=Mari\u00e4 Himmelfahrt;1 -03.10.2013=Tag der Deutschen Einheit;2 -03.10.2013=Erntedankfest;1 -31.10.2013=Reformationstag;1 -01.11.2013=Allerheiligen;2 -17.11.2013=Volkstrauertag;1 -20.11.2013=Bu\u00df- und Bettag;1 -24.11.2013=Christk\u00f6nigsfest;1 -01.12.2013=1. Advent;1 -06.12.2013=Nikolaus;1 -08.12.2013=2. Advent;1 -15.12.2013=3. Advent;1 -22.12.2013=4. Advent;1 -24.12.2013=Heiligabend;1 -25.12.2013=1. Weihnachtstag;2 -26.12.2013=2. Weihnachtstag;2 -31.12.2013=Silvester;1 - # Holidays for 2014 01.01.2014=Neujahr;2 06.01.2014=Heilige Drei K\u00f6nige;1 @@ -108,4 +38,73 @@ calendar.holidays.datepattern=dd.MM.yyyy 24.12.2014=Heiligabend;1 25.12.2014=1. Weihnachtstag;2 26.12.2014=2. Weihnachtstag;2 -31.12.2014=Silvester;1 \ No newline at end of file +31.12.2014=Silvester;1 + +# Holidays for 2015 +01.01.2015=Neujahr;2 +06.01.2015=Heilige Drei K\u00f6nige;1 +14.02.2015=Valentinstag;1 +16.02.2015=Rosenmontag;1 +17.02.2015=Fastnacht;1 +18.02.2015=Aschermittwoch;1 +03.04.2015=Karfreitag;2 +05.04.2015=Ostern;2 +06.04.2015=Ostermontag;2 +01.05.2015=Maifeiertag;2 +10.05.2015=Muttertag;1 +14.05.2015=Christi Himmelfahrt;2 +24.05.2015=Pfingstsonntag;2 +25.05.2015=Pfingstmontag;2 +04.06.2015=Fronleichnam;2 +08.08.2015=Friedensfest;1 +15.08.2015=Mari\u00e4 Himmelfahrt;1 +03.10.2015=Tag der Deutschen Einheit;2 +04.10.2015=Erntedankfest;1 +31.10.2015=Reformationstag;1 +01.11.2015=Allerheiligen;2 +15.11.2015=Volkstrauertag;1 +18.11.2015=Bu\u00df- und Bettag;1 +22.11.2015=Christk\u00f6nigsfest;1 +29.11.2015=1. Advent;1 +06.12.2015=2. Advent, Nikolaus;1 +13.12.2015=3. Advent;1 +20.12.2015=4. Advent;1 +24.12.2015=Heiligabend;1 +25.12.2015=1. Weihnachtstag;2 +26.12.2015=2. Weihnachtstag;2 +31.12.2015=Silvester;1 + +# Holidays for 2016 +01.01.2016=Neujahr;2 +06.01.2016=Heilige Drei K\u00f6nige;1 +14.02.2016=Valentinstag;1 +08.02.2016=Rosenmontag;1 +09.02.2016=Fastnacht;1 +10.02.2016=Aschermittwoch;1 +25.03.2016=Karfreitag;2 +27.03.2016=Ostern;2 +28.03.2016=Ostermontag;2 +01.05.2016=Maifeiertag;2 +08.05.2016=Muttertag;1 +05.05.2016=Christi Himmelfahrt;2 +15.05.2016=Pfingstsonntag;2 +16.05.2016=Pfingstmontag;2 +26.05.2016=Fronleichnam;2 +08.08.2016=Friedensfest;1 +15.08.2016=Mari\u00e4 Himmelfahrt;1 +03.10.2016=Tag der Deutschen Einheit;2 +02.10.2016=Erntedankfest;1 +31.10.2016=Reformationstag;1 +01.11.2016=Allerheiligen;2 +13.11.2016=Volkstrauertag;1 +16.11.2016=Bu\u00df- und Bettag;1 +20.11.2016=Christk\u00f6nigsfest;1 +27.11.2016=1. Advent;1 +06.12.2016=Nikolaus;1 +04.12.2016=2. Advent;1 +11.12.2016=3. Advent;1 +18.12.2016=4. Advent;1 +24.12.2016=Heiligabend;1 +25.12.2016=1. Weihnachtstag;2 +26.12.2016=2. Weihnachtstag;2 +31.12.2016=Silvester;1 \ No newline at end of file From 6600975c7e524c8ca6365832d985373fdb08f138 Mon Sep 17 00:00:00 2001 From: Andreas Zahner Date: Thu, 8 Jan 2015 09:52:06 +0100 Subject: [PATCH 30/46] Added optional form layout configuration for setting the width ratio of the input fields and labels. --- .../v8/formgenerator/workplace.properties | 2 ++ .../v8/formgenerator/workplace_de.properties | 2 ++ .../schemas/optionalconfig.xsd | 2 ++ .../opencms/v8/formgenerator/CmsForm.java | 36 +++++++++++++++++++ .../v8/formgenerator/CmsFormHandler.java | 11 +++++- 5 files changed, 52 insertions(+), 1 deletion(-) diff --git a/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/classes/com/alkacon/opencms/v8/formgenerator/workplace.properties b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/classes/com/alkacon/opencms/v8/formgenerator/workplace.properties index 5d1aaf69..6b7f7f5f 100644 --- a/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/classes/com/alkacon/opencms/v8/formgenerator/workplace.properties +++ b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/classes/com/alkacon/opencms/v8/formgenerator/workplace.properties @@ -85,6 +85,8 @@ label.OptionalAlkaconV8WebFormConfiguration.FormAttributes = Form attributes label.OptionalAlkaconV8WebFormConfiguration.FormAttributes.help = Optional node attributes around the form, e.g. to define a CSS class name with class="myformclass". label.OptionalAlkaconV8WebFormConfiguration.FormFieldAttributes = Field attributes label.OptionalAlkaconV8WebFormConfiguration.FormFieldAttributes.help = Optional node attributes for each input field, e.g. to define a CSS class attribute with class="myinputclass". +label.OptionalAlkaconV8WebFormConfiguration.FormFieldWidthRatio = Input field width ratio +label.OptionalAlkaconV8WebFormConfiguration.FormFieldWidthRatio.help = Optional field width ratio that sets the width ratio of the labels and the input fields. label.OptionalAlkaconV8WebFormConfiguration.DynamicFieldClass = Dynamic fields class label.OptionalAlkaconV8WebFormConfiguration.DynamicFieldClass.help = The class name for the dynamic fields value resolver label.OptionalAlkaconV8WebFormConfiguration.CSS = CSS file diff --git a/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/classes/com/alkacon/opencms/v8/formgenerator/workplace_de.properties b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/classes/com/alkacon/opencms/v8/formgenerator/workplace_de.properties index 18088e38..cb09d217 100644 --- a/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/classes/com/alkacon/opencms/v8/formgenerator/workplace_de.properties +++ b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/classes/com/alkacon/opencms/v8/formgenerator/workplace_de.properties @@ -86,6 +86,8 @@ label.OptionalAlkaconV8WebFormConfiguration.FormAttributes = Form Attribute label.OptionalAlkaconV8WebFormConfiguration.FormAttributes.help = Optionale HTML Attribute um das Eingabeformular, z.B. kann ein CSS Klassenname wie class="meineformularklasse" angegeben werden. label.OptionalAlkaconV8WebFormConfiguration.FormFieldAttributes = Eingabefeld Attribute label.OptionalAlkaconV8WebFormConfiguration.FormFieldAttributes.help = Optionale HTML Attribute für jedes Eingabefeld, z.B. kann ein CSS Klassenname wie class="meinefeldklasse" angegeben werden. +label.OptionalAlkaconV8WebFormConfiguration.FormFieldWidthRatio = Eingabefeld Breitenverhältnis +label.OptionalAlkaconV8WebFormConfiguration.FormFieldWidthRatio.help = Optionale Angabe des Breitenverhältnisses von Eingabefeld Text und Eingabefeld. label.OptionalAlkaconV8WebFormConfiguration.DynamicFieldClass = Klasse für dynamische Felder label.OptionalAlkaconV8WebFormConfiguration.DynamicFieldClass.help = Der name der Klasse, die verwendet werden soll, um die Werte der dynamischen Felder zu berechnen label.OptionalAlkaconV8WebFormConfiguration.CSS = CSS Datei diff --git a/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/optionalconfig.xsd b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/optionalconfig.xsd index 5823126a..66bfec58 100644 --- a/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/optionalconfig.xsd +++ b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/optionalconfig.xsd @@ -23,6 +23,7 @@ + @@ -40,6 +41,7 @@ + diff --git a/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/CmsForm.java b/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/CmsForm.java index 0a48384f..180dc736 100644 --- a/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/CmsForm.java +++ b/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/CmsForm.java @@ -260,6 +260,9 @@ public class CmsForm { /** Configuration node name for the form field attributes node. */ public static final String NODE_FORMFIELDATTRIBUTES = "FormFieldAttributes"; + /** Configuration node name for the form field width ratio node. */ + public static final String NODE_FORMFIELDWIDTHRATIO = "FormFieldWidthRatio"; + /** Configuration node name for the form footer text node. */ public static final String NODE_FORMFOOTERTEXT = "FormFooterText"; @@ -474,6 +477,9 @@ public class CmsForm { /** configuration value. */ protected String m_formFieldAttributes; + /** configuration value. */ + protected int m_formFieldWidthRatio; + /** configuration value. */ protected String m_formFooterText; @@ -1060,6 +1066,16 @@ public String getFormFieldAttributes() { return m_formFieldAttributes; } + /** + * Returns the optional form field width ratio.

+ * + * @return the optional form field width ratio + */ + public int getFormFieldWidthRatio() { + + return m_formFieldWidthRatio; + } + /** * Returns the form footer text.

* @@ -1998,6 +2014,16 @@ protected void initFormGlobalConfiguration( setFormFieldAttributes(" " + defaultAttributes); } } + // get the field width ratio if set + stringValue = getContentStringValue(content, cms, pathPrefix + NODE_FORMFIELDWIDTHRATIO, locale); + if (CmsStringUtil.isNotEmpty(stringValue)) { + try { + setFormFieldWidthRatio(Integer.parseInt(stringValue)); + } catch (NumberFormatException nfe) { + // invalid value, ignore setting + } + } + // get the refresh session interval stringValue = getContentStringValue(content, cms, pathPrefix + NODE_KEEPSESSION, locale); if (CmsStringUtil.isNotEmpty(stringValue)) { @@ -2660,6 +2686,16 @@ protected void setFormFieldAttributes(String formFieldAttributes) { m_formFieldAttributes = formFieldAttributes; } + /** + * Sets the optional form field width ratio.

+ * + * @param formFieldWidthRatio the optional form field width ratio + */ + protected void setFormFieldWidthRatio(int formFieldWidthRatio) { + + m_formFieldWidthRatio = formFieldWidthRatio; + } + /** * Sets the form footer text.

* diff --git a/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/CmsFormHandler.java b/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/CmsFormHandler.java index 2a8e9cf8..6e24f219 100644 --- a/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/CmsFormHandler.java +++ b/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/CmsFormHandler.java @@ -960,6 +960,16 @@ public String getStyleSheet() { } result.append(""); + if ((getFormConfiguration() != null) && (getFormConfiguration().getFormFieldWidthRatio() > 0)) { + result.append("\n"); + } return result.toString(); } @@ -1875,7 +1885,6 @@ protected void configureForm(HttpServletRequest req, String formConfigUri) throw * * @throws Exception if creating the form configuration objects fails */ - @SuppressWarnings("unchecked") protected void configureForm(HttpServletRequest req, String formConfigUri, Map dynamicConfig) throws Exception { From c824709b9f210b49912429e528ad57c87f28b3d9 Mon Sep 17 00:00:00 2001 From: Andreas Zahner Date: Tue, 20 Jan 2015 14:54:56 +0100 Subject: [PATCH 31/46] Improved error handling for photo album if no vfs folder is specified. --- .../formatters/photoalbum.jsp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/formatters/photoalbum.jsp b/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/formatters/photoalbum.jsp index 0a0dfd2c..09fa4a13 100644 --- a/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/formatters/photoalbum.jsp +++ b/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/formatters/photoalbum.jsp @@ -14,6 +14,11 @@

+ +

+ +

+
From e58211c14672bcb03cc9db274e08dcb6b7b5148c Mon Sep 17 00:00:00 2001 From: Andreas Zahner Date: Fri, 30 Jan 2015 10:49:50 +0100 Subject: [PATCH 32/46] Improved image gallery selection for V8 photo album. --- .../com.alkacon.opencms.v8.photoalbum/schemas/photoalbum.xsd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/schemas/photoalbum.xsd b/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/schemas/photoalbum.xsd index 0ac2c078..ccc4161a 100644 --- a/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/schemas/photoalbum.xsd +++ b/com.alkacon.opencms.v8.photoalbum/resources/system/modules/com.alkacon.opencms.v8.photoalbum/schemas/photoalbum.xsd @@ -30,7 +30,7 @@ - + From 62fe21ca69a7b4e4c0d66bfcef6c6565bd89424a Mon Sep 17 00:00:00 2001 From: Andreas Zahner Date: Fri, 30 Jan 2015 15:41:08 +0100 Subject: [PATCH 33/46] Added new widgets to v8 form generator --- .../schemas/optionalconfirmation.xsd | 2 +- .../schemas/optionalsubfield.xsd | 2 +- .../src/com/alkacon/opencms/v8/formgenerator/CmsForm.java | 6 ++++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/optionalconfirmation.xsd b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/optionalconfirmation.xsd index 53290203..93b9fc9d 100644 --- a/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/optionalconfirmation.xsd +++ b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/optionalconfirmation.xsd @@ -28,7 +28,7 @@ - + diff --git a/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/optionalsubfield.xsd b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/optionalsubfield.xsd index e522e1a7..6b472f63 100644 --- a/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/optionalsubfield.xsd +++ b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/schemas/optionalsubfield.xsd @@ -24,7 +24,7 @@ - + diff --git a/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/CmsForm.java b/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/CmsForm.java index 180dc736..6a92272e 100644 --- a/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/CmsForm.java +++ b/com.alkacon.opencms.v8.formgenerator/src/com/alkacon/opencms/v8/formgenerator/CmsForm.java @@ -2201,6 +2201,9 @@ protected void initFormGlobalConfiguration( fieldIndex = Integer.parseInt(stringValue) - 1; } catch (Exception e) { // no field number given, store DB label + if (stringValue.contains("|")) { + stringValue = stringValue.substring(stringValue.indexOf("|") + 1); + } setConfirmationMailFieldDbLabel(stringValue); } setConfirmationMailField(fieldIndex); @@ -2374,6 +2377,9 @@ protected void initInputFields( jsp.getCmsObject(), subField.getPath() + "/" + NODE_PARENTFIELD, locale); + if (fieldLabel.contains("|")) { + fieldLabel = fieldLabel.substring(fieldLabel.indexOf("|") + 1); + } List storedPaths = subFieldPaths.get(fieldLabel); if (storedPaths == null) { storedPaths = new ArrayList(); From 1e93be0350ca5a9ff2f4ae7a02d0b5320a1efdab Mon Sep 17 00:00:00 2001 From: Andreas Zahner Date: Tue, 21 Apr 2015 17:08:54 +0200 Subject: [PATCH 34/46] Added form template for usage with sky forms. --- .../resources/manifest.xml | 46 +- .../formtemplates/sky-forms-based.st | 660 ++++++++++++++++++ 2 files changed, 693 insertions(+), 13 deletions(-) create mode 100644 com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/resources/formtemplates/sky-forms-based.st diff --git a/com.alkacon.opencms.v8.formgenerator/resources/manifest.xml b/com.alkacon.opencms.v8.formgenerator/resources/manifest.xml index dd8d211f..a86cbea0 100644 --- a/com.alkacon.opencms.v8.formgenerator/resources/manifest.xml +++ b/com.alkacon.opencms.v8.formgenerator/resources/manifest.xml @@ -3,8 +3,8 @@ Admin - 8.0.3 - Mon, 02 Jan 2012 10:17:23 GMT + 9.7.x + Tue, 21 Apr 2015 14:59:08 GMT Offline 7 @@ -93,10 +93,10 @@ system folder - f1138ef7-20ac-11e1-a228-27f2fbbdf126 - Wed, 07 Dec 2011 08:24:54 GMT + 8c0da842-cd8f-11e4-a67d-ebe27368f1ae + Wed, 18 Mar 2015 16:55:14 GMT Admin - Wed, 07 Dec 2011 08:24:54 GMT + Wed, 18 Mar 2015 16:55:14 GMT Admin 0 @@ -115,10 +115,10 @@ system/modules folder - f20df4c3-20ac-11e1-a228-27f2fbbdf126 - Wed, 07 Dec 2011 08:24:56 GMT + 8f97b99e-cd8f-11e4-a67d-ebe27368f1ae + Wed, 18 Mar 2015 16:55:20 GMT Admin - Wed, 07 Dec 2011 08:24:56 GMT + Wed, 18 Mar 2015 16:55:20 GMT Admin 0 @@ -1340,6 +1340,26 @@ + + system/modules/com.alkacon.opencms.v8.formgenerator/resources/formtemplates/sky-forms-based.st + system/modules/com.alkacon.opencms.v8.formgenerator/resources/formtemplates/sky-forms-based.st + plain + d108c354-e75b-11e4-8996-ebe27368f1ae + d108c355-e75b-11e4-8996-ebe27368f1ae + Tue, 21 Apr 2015 14:48:43 GMT + Admin + Mon, 20 Apr 2015 12:50:26 GMT + Admin + 0 + + + Title + + + + + + system/modules/com.alkacon.opencms.v8.formgenerator/resources/formtemplates/table-based.st system/modules/com.alkacon.opencms.v8.formgenerator/resources/formtemplates/table-based.st @@ -4148,7 +4168,7 @@ - + system/modules/com.alkacon.opencms.v8.formgenerator/schemas/formdatatarget.xsd system/modules/com.alkacon.opencms.v8.formgenerator/schemas/formdatatarget.xsd @@ -4408,11 +4428,11 @@ - + system/workplace folder - 6dbd9558-8db6-11e0-972f-8f51174189b7 + 825afce2-11b7-11db-91cd-fdbae480bac9 Mon, 27 Mar 2006 12:00:00 GMT Admin Mon, 27 Jun 2005 08:00:00 GMT @@ -4844,7 +4864,7 @@ system/workplace/resources folder - 6dbfdf50-8db6-11e0-972f-8f51174189b7 + 82c16052-11b7-11db-91cd-fdbae480bac9 Mon, 27 Mar 2006 12:00:00 GMT Admin Mon, 27 Jun 2005 08:00:00 GMT @@ -4857,7 +4877,7 @@ system/workplace/resources/filetypes folder - 6dc24f52-8db6-11e0-972f-8f51174189b7 + 83ca1dcc-11b7-11db-91cd-fdbae480bac9 Mon, 27 Jun 2005 08:00:00 GMT Admin Mon, 27 Jun 2005 08:00:00 GMT diff --git a/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/resources/formtemplates/sky-forms-based.st b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/resources/formtemplates/sky-forms-based.st new file mode 100644 index 00000000..5e3e90e4 --- /dev/null +++ b/com.alkacon.opencms.v8.formgenerator/resources/system/modules/com.alkacon.opencms.v8.formgenerator/resources/formtemplates/sky-forms-based.st @@ -0,0 +1,660 @@ +group webform; + +form_twocolumns() ::= "false" + + +form(formuri,enctype,errormessage,mandatorymessage,formconfig,fields,downloadbutton,submitbutton,resetbutton,hiddenfields,prevbutton,subfieldjs) ::= << +$! ###### Main input form ###### !$ +$formconfig.formText$ + + + +$! --- show validation errors -- !$ +$if(errormessage)$ +
+ $errormessage$ +
+$endif$ + +
+
+ $fields$ +
+ +$! --- show form middle text --- !$ +

+ $formconfig.formMiddleText$ +
+ +
+$! --- show mandatory note --- !$ +$if(mandatorymessage)$ +
$mandatorymessage$
+$endif$ + +$! --- show submit, reset and previous button --- !$ +$if(submitbutton)$ + + $hiddenfields$ + $if(prevbutton)$ + + $endif$ + + $if(resetbutton)$ +   + $endif$ + +$endif$ + +$! --- show download button -- !$ +$if(downloadbutton)$ + +$endif$ +
+ + +$! --- JavaScript for sub fields --- !$ +$if(subfieldjs)$ + +$endif$ + +$! --- show form footer text --- !$ +$formconfig.formFooterText$ +>> + + +form_js(formconfig,sessionjs,sessionuri,subfieldjs) ::= << +$! ###### JAVASCRIPT for Main input form ###### !$ +$if(sessionjs)$ + + +$endif$ + +>> + + +field_captcha(field,formconfig,attributes,errormessage,mandatory,captcha) ::= << +$! ###### CAPTCHA field ###### !$ +$row_start(field=field)$ +$label(field=field,formconfig=formconfig,errormessage=errormessage,mandatory=mandatory)$ + +$if(errormessage)$ +
$errormessage$
+$endif$ +$row_end(field=field,formconfig=formconfig)$ +>> + + +field_checkbox(field,formconfig,attributes,errormessage,mandatory) ::= << +$! ###### Checkbox field ###### !$ +$row_start(field=field)$ +$label(field=field,formconfig=formconfig,errormessage=errormessage,mandatory=mandatory)$ +$if(field.parameters)$$if(field.parameters.toggle)$$else$
$endif$$else$
$endif$ + $field.items:{ + + }$ +$if(field.parameters)$$if(field.parameters.toggle)$$else$
$endif$$else$
$endif$ +$if(errormessage)$ +
$errormessage$
+$endif$ +$row_end(field=field,formconfig=formconfig)$ +>> + + +field_display(field,formconfig,attributes,errormessage,mandatory) ::= << +$! ###### DISPLAY field ###### !$ +$row_start(field=field)$ +$label(field=field,formconfig=formconfig,errormessage=errormessage,mandatory=mandatory)$ + +$if(errormessage)$ +
$errormessage$
+$endif$ +$row_end(field=field,formconfig=formconfig)$ +>> + + +field_email(field,formconfig,errormessage,mandatory) ::= << +$! ###### EMAIL field ###### !$ +$field_text(field=field,formconfig=formconfig,errormessage=errormessage,mandatory=mandatory)$ +>> + + +field_empty(field,formconfig,attributes,errormessage,mandatory) ::= << +$! ###### EMPTY field ###### !$ +$row_start(field=field)$ + + +$if(errormessage)$ +
$errormessage$
+$endif$ +$row_end(field=field,formconfig=formconfig)$ +>> + + +field_file(field,formconfig,attributes,errormessage,mandatory,infomessage) ::= << +$! ###### FILE UPLOAD field ###### !$ +$row_start(field=field)$ +$label(field=field,formconfig=formconfig,errormessage=errormessage,mandatory=mandatory)$ + +$if(errormessage)$ +
$errormessage$
+$endif$ +$if(infomessage)$ +
$infomessage$
+$endif$ +$row_end(field=field,formconfig=formconfig)$ +>> + + +field_hidden(field,formconfig,attributes,errormessage,mandatory) ::= << +$! ###### HIDDEN field ###### !$ +
+$subtext(field=field,formconfig=formconfig)$ +>> + + +field_hiddendisplay(field,formconfig,attributes,errormessage,mandatory) ::= << +$! ###### HIDDEN DISPLAY field ###### !$ +$row_start(field=field)$ + +$if(errormessage)$ +
$errormessage$
+$endif$ +$row_end(field=field,formconfig=formconfig)$ +>> + + +field_paging(field,formconfig,attributes,errormessage,mandatory,hiddenfields,prevbutton,nextbutton,page) ::= << +$! ###### PAGING field ###### !$ +$row_start(field=field)$ +
 
+
+ $hiddenfields$ + $if(prevbutton)$ +   + $endif$ + + +
+$row_end(field=field,formconfig=formconfig)$ +>> + + +field_password(field,formconfig,attributes,errormessage,mandatory) ::= << +$! ###### PASSWORD field ###### !$ +$row_start(field=field)$ +$label(field=field,formconfig=formconfig,errormessage=errormessage,mandatory=mandatory)$ + +$if(errormessage)$ +
$errormessage$
+$endif$ +$row_end(field=field,formconfig=formconfig)$ +>> + + +field_privacy(field,formconfig,attributes,errormessage,mandatory,label,link,linktext) ::= << +$! ###### PRIVACY field ###### !$ +$row_start(field=field)$ +$label(field=field,formconfig=formconfig,errormessage=errormessage,mandatory=mandatory)$ +
+$if(errormessage)$ +
$errormessage$
+$endif$ +$row_end(field=field,formconfig=formconfig)$ +>> + + +field_radio(field,formconfig,attributes,errormessage,mandatory) ::= << +$! ###### RADIO BUTTONS field ###### !$ +$row_start(field=field)$ +$label(field=field,formconfig=formconfig,errormessage=errormessage,mandatory=mandatory)$ +$field.items:{ + +}$ +$if(errormessage)$ +
$errormessage$
+$endif$ +$row_end(field=field,formconfig=formconfig)$ +>> + + +field_select(field,formconfig,attributes,errormessage,mandatory) ::= << +$! ###### SELECT field ###### !$ +$row_start(field=field)$ +$label(field=field,formconfig=formconfig,errormessage=errormessage,mandatory=mandatory)$ + +$if(errormessage)$ +
$errormessage$
+$endif$ +$row_end(field=field,formconfig=formconfig)$ +>> + + +field_table(field,formconfig,attributes,errormessage,mandatory,cols,rows,rowswithitems,editable) ::= << +$! ###### TABLE field ###### !$ +$if(!field.showRowStart)$ +
+$endif$ +
+
+ $field_table_labels(field=field,formconfig=formconfig,errormessage=errormessage,mandatory=mandatory,rows=rows)$ +
+
+ $field_table_fields(formconfig=formconfig,cols=cols,rowswithitems=rowswithitems,editable=editable)$ + $if(errormessage)$ +
$errormessage$ + $endif$ +
+
+$subtext(field=field,formconfig=formconfig)$ +>> + + +field_table_labels(field,formconfig,errormessage,mandatory,rows) ::= << +$! ###### Labels for the TABLE field, separate sub template because also used for email generation ###### !$ + + + + + $! --- iterate the row names --- !$ + $rows:{ + + + + }$ +
+ $if(errormessage)$ + + $field.label$$mandatory$ + + $else$ + $field.label$$mandatory$ + $endif$ +
$it$
+>> + + +field_table_fields(formconfig,cols,rowswithitems,editable) ::= << +$! ###### Rows for the TABLE field, separate sub template because also used for email generation ###### !$ + + + $! --- iterate the column names --- !$ + $cols:{ + + }$ + + + + $! --- iterate the rows --- !$ + $rowswithitems:{ + + $! --- iterate the items of the row --- !$ + $it:{ + + }$ + + }$ +
$it$
+ $if(editable)$ + + $else$ + $it.valueEscaped$ + $endif$ +
+>> + + +field_text(field,formconfig,attributes,errormessage,mandatory) ::= << +$! ###### TEXT field ###### !$ +$row_start(field=field)$ +$label(field=field,formconfig=formconfig,errormessage=errormessage,mandatory=mandatory)$ + +$if(errormessage)$ +
$errormessage$
+$endif$ +$row_end(field=field,formconfig=formconfig)$ +>> + + +field_textarea(field,formconfig,attributes,errormessage,mandatory) ::= << +$! ###### TEXTAREA field ###### !$ +$row_start(field=field)$ + + +$if(errormessage)$ +
$errormessage$
+$endif$ +$row_end(field=field,formconfig=formconfig)$ +>> + + +label(field,formconfig,errormessage,mandatory) ::= << +$! ###### Standard LABEL for a field ###### !$ + +>> + + +row_start(field) ::= << +$! ###### Standard start row for a field ###### !$ +$if(field.showRowStart)$ +
+$endif$ +>> + + +row_end(field,formconfig) ::= << +$! ###### Standard end row for a field ###### !$ +$if(field.showRowEnd)$ +
+$endif$ +$subtext(field=field,formconfig=formconfig)$ +>> + + +subfieldwrapper(subfields,style,id) ::= << +$! ###### Sub field wrapper ###### !$ +
+$subfields$ +
+>> + + +subtext(field,formconfig) ::= << +$! ###### Intermediate texts for the fields ###### !$ +$if(field.hasText)$ + $if(field.showRowStart)$ +
+ $endif$ + $if(field.text.columnLeft)$ +
+ $field.text.text$ +
+
+ $elseif(field.text.columnRight)$ +
+
+ $field.text.text$ +
+ $else$ +
+ $field.text.text$ +
+ $endif$ + $if(field.showRowEnd)$ +
+ $endif$ +$endif$ +>> + + +checkpage(formuri,formconfig,checktext,captchafield,captchaerror,captchaimagelink,checkfields,hiddenfields,checkbutton,correctbutton) ::= << +$! ###### CHECK page of the form ###### !$ +$checktext$ +$if(captchafield)$ + +
+$endif$ +
+$checkfields:{ +
+
$it.label$
+
$it.value$
+
+}$ + +$if(captchafield)$ +
+
+ $if(captchaerror)$ + + $captchafield.label$ + + $else$ + $captchafield.label$ + $endif$ +
+
+
+ + $if(captchaerror)$ +
+ $captchaerror$ + + $endif$ +
+
+$endif$ +
+$if(captchafield)$ +
+$endif$ + +
+
+
+
+ + + $hiddenfields$ +
+     
+
+
+
+ + $hiddenfields$ +
+
+
+
+
+>> + + +confirmationpage(formconfig,confirmtext,confirmfields) ::= << +$! ###### CONFIRMATION page of the form ###### !$ +$confirmtext$ +
+$confirmfields:{ +
+
$it.label$
+
$it.value$
+
+}$ +
+>> + + +datadownloadpage(formuri,formconfig,locale,skinuri,labelfrom,datefrom,labelto,dateto,calendaralttext,submitbutton,resetbutton) ::= << +$! ###### DATA DOWNLOAD page of the form ###### !$ + +
+
+
+ + + $calendaralttext$ +
+
+ + + $calendaralttext$ +
+
+    + +
+ + +
+
+>> + + +htmlemail(mailcss,mailtext,errorheadline,errors) ::= << +$! ###### HTML email for the form ###### !$ + + + +$mailtext$ +$if(errorheadline)$ +

$errorheadline$

+

+ $errors:{ + $it$
+ }$ +

+$endif$ + +>> + + +htmlemailfields(mailcss,fields) ::= << +$! ###### FIELDS for the HTML email ###### !$ + +$first(fields):{ + + + + +}$ +$rest(fields):{ + + + + +}$ +
$it.label$$it.value$
$it.label$$it.value$
+>> + + +emailerror(headline,text,error) ::= << +$! ###### EMAIL error message ###### !$ +

$headline$

+

$text$

+ +>> + + +initerror(headline,text) ::= << +$! ###### Initialization error message ###### !$ +

$headline$

+

$text$

+>> \ No newline at end of file From d11bbd64347e257f32b1eef70fafd29399b5497c Mon Sep 17 00:00:00 2001 From: tHerrmann Date: Tue, 14 Apr 2015 11:44:28 +0200 Subject: [PATCH 35/46] Using combined form id for comment replies. --- .../elements/comment_form.jsp | 5 +- .../elements/comment_replies.jsp | 1 + .../formatters/comment-formatter.jsp | 1 + .../formatters/last-comments-formatter.jsp | 169 ++++++++++++----- .../v8/comments/CmsCommentsAccess.java | 177 ++++++++++-------- .../v8/comments/CmsRepliesAccessBean.java | 86 ++++++--- 6 files changed, 283 insertions(+), 156 deletions(-) diff --git a/com.alkacon.opencms.v8.comments/resources/system/modules/com.alkacon.opencms.v8.comments/elements/comment_form.jsp b/com.alkacon.opencms.v8.comments/resources/system/modules/com.alkacon.opencms.v8.comments/elements/comment_form.jsp index abead3ce..b7bf3a3b 100644 --- a/com.alkacon.opencms.v8.comments/resources/system/modules/com.alkacon.opencms.v8.comments/elements/comment_form.jsp +++ b/com.alkacon.opencms.v8.comments/resources/system/modules/com.alkacon.opencms.v8.comments/elements/comment_form.jsp @@ -5,8 +5,9 @@ String sParentId = request.getParameter("cmtparentid"); int parentId; Map dynamicConfig; try { - parentId = Integer.valueOf(sParentId); - dynamicConfig = CmsCommentsAccess.generateDynamicConfig(CmsCommentsAccess.REPLIES_FORMID); + parentId = Integer.valueOf(sParentId).intValue(); + // use a combined form id, to be able to identify replies to a specific form id + dynamicConfig = CmsCommentsAccess.generateDynamicConfig(CmsCommentsAccess.getReplyFromId(request.getParameter("cmtformid"))); } catch (NumberFormatException e) { parentId = -1; dynamicConfig = CmsCommentsAccess.generateDynamicConfig(request.getParameter("cmtformid")); diff --git a/com.alkacon.opencms.v8.comments/resources/system/modules/com.alkacon.opencms.v8.comments/elements/comment_replies.jsp b/com.alkacon.opencms.v8.comments/resources/system/modules/com.alkacon.opencms.v8.comments/elements/comment_replies.jsp index e7bbbea0..2d197d04 100644 --- a/com.alkacon.opencms.v8.comments/resources/system/modules/com.alkacon.opencms.v8.comments/elements/comment_replies.jsp +++ b/com.alkacon.opencms.v8.comments/resources/system/modules/com.alkacon.opencms.v8.comments/elements/comment_replies.jsp @@ -9,6 +9,7 @@ + diff --git a/com.alkacon.opencms.v8.comments/resources/system/modules/com.alkacon.opencms.v8.comments/formatters/comment-formatter.jsp b/com.alkacon.opencms.v8.comments/resources/system/modules/com.alkacon.opencms.v8.comments/formatters/comment-formatter.jsp index 3753f668..96534d70 100644 --- a/com.alkacon.opencms.v8.comments/resources/system/modules/com.alkacon.opencms.v8.comments/formatters/comment-formatter.jsp +++ b/com.alkacon.opencms.v8.comments/resources/system/modules/com.alkacon.opencms.v8.comments/formatters/comment-formatter.jsp @@ -92,6 +92,7 @@ { "cmturi" :"${alkaconCmt.uri}", "configUri" : "${configUri}", + "currenturi" : "${cms.requestContext.currentUri}", "cmtminimized" : "${minimized}", "cmtlist" :"${list}", "cmtsecurity" :"${security}", diff --git a/com.alkacon.opencms.v8.comments/resources/system/modules/com.alkacon.opencms.v8.comments/formatters/last-comments-formatter.jsp b/com.alkacon.opencms.v8.comments/resources/system/modules/com.alkacon.opencms.v8.comments/formatters/last-comments-formatter.jsp index 3cfd4a2d..b805550e 100644 --- a/com.alkacon.opencms.v8.comments/resources/system/modules/com.alkacon.opencms.v8.comments/formatters/last-comments-formatter.jsp +++ b/com.alkacon.opencms.v8.comments/resources/system/modules/com.alkacon.opencms.v8.comments/formatters/last-comments-formatter.jsp @@ -1,18 +1,13 @@ <%@page buffer="none" session="false" trimDirectiveWhitespaces="true"%> -<%@page import="java.util.List, java.util.Arrays, com.alkacon.opencms.v8.comments.CmsLastCommentStringTemplateHandler" %> -<%@page taglibs="c,cms,fmt,fn" %> - +<%@page import="java.util.List, java.util.Arrays" %> +<%@ taglib prefix="cms" uri="http://www.opencms.org/taglib/cms"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> -<%-- get the stringtemplate Handler --%> -<% CmsLastCommentStringTemplateHandler templateHandler = new CmsLastCommentStringTemplateHandler(); - templateHandler.init(pageContext,request,response); - String entries = ""; - String bundle = templateHandler.getResourceBundle(); - pageContext.setAttribute("bundle", bundle); -%> - + -
+
@@ -25,42 +20,130 @@ <% commentCollector.init(pageContext, request, response); %> - + + + - - ${content.value.Title} - - <%-- Real formatting code --%> - <%-- build the HTML for the entries --%> - - - - <% entries = templateHandler.buildLastCommentsNoEntryHtml(); %> - - - +
+
+

${content.value.Title}

+
+ + + +
+ +
+
+ - - <% Object fieldsAttribute = pageContext.getAttribute("fields"); - List fields = null; - if (fieldsAttribute != null) { - fields = Arrays.asList((String[])fieldsAttribute); - } - %> - - <% entries += templateHandler.buildLastCommentsEntryHtml( - (com.alkacon.opencms.v8.formgenerator.collector.CmsFormBean) pageContext.getAttribute("comment") - , fields - , (String) pageContext.getAttribute("boxColor")); %> - - -
- <%-- build the HTML for the whole list, injecting the entries HTML --%> - <%= templateHandler.buildLastCommentsListHtml(entries,(String) pageContext.getAttribute("title")) %> + <% List fields = Arrays.asList((String[])pageContext.getAttribute("fields")); %> + + + + +
+
+

+ + + +

+

+ + + + + + + ${comment.fields["name"]} + + + ${fn:escapeXml(comment.fields["name"])} + + + ${fn:escapeXml(comment.fields['username'])} + /shared/.content/wmgprofile/${fn:replace(username1,'@', '_at_')}.prf + + + + + + ${prf.property['wmgcontact.firstname']} ${prf.property['wmgcontact.lastname']} + + + + + ${username1} + + + + + ${fn:escapeXml(comment.fields['username'])} + /shared/.content/wmgprofile/${fn:replace(username1,'@', '_at_')}.prf + ${comment.fields["name"]} + + + + + (${comment.fields["username"]}) + + + + + ${comment.fields["username"]} + + + ${comment.fields["username"]} + + + + + ${comment.fields["email"]} + + + + + + +

+
+

+ ${comment.title} +

+ +
+ + : ${comment.fields["subject"]}
+
+ + : ${comment.fields["comment"]} + +
+
+ +
+   + +    + + +  ${comment.fields["locale"]}  + + +  ${comment.fields["ipaddress"]} + +
+
+
+
+ + +
-
+
\ No newline at end of file diff --git a/com.alkacon.opencms.v8.comments/src/com/alkacon/opencms/v8/comments/CmsCommentsAccess.java b/com.alkacon.opencms.v8.comments/src/com/alkacon/opencms/v8/comments/CmsCommentsAccess.java index d96342cb..ba281ceb 100644 --- a/com.alkacon.opencms.v8.comments/src/com/alkacon/opencms/v8/comments/CmsCommentsAccess.java +++ b/com.alkacon.opencms.v8.comments/src/com/alkacon/opencms/v8/comments/CmsCommentsAccess.java @@ -88,8 +88,9 @@ */ public class CmsCommentsAccess extends CmsJspLoginBean { - /** form-id for replies */ + /** Form id for replies. */ public static final String REPLIES_FORMID = "__oamp-comment-reply__"; + /** Action name constant. */ public static final String ACTION_APPROVE = "approve"; @@ -204,46 +205,6 @@ public class CmsCommentsAccess extends CmsJspLoginBean { /** Cached value, if the current user is valid. */ private Boolean m_userValid; - /** - * Constructor, with parameters. - * - * @param context the JSP page context object - * @param req the JSP request - * @param res the JSP response - * @param configUri the URI of the comments configuration - */ - public CmsCommentsAccess(PageContext context, HttpServletRequest req, HttpServletResponse res, String configUri) { - - this(context, req, res, configUri, null); - } - - /** - * Constructor, with parameters. - * - * @param context the JSP page context object - * @param req the JSP request - * @param res the JSP response - * @param configUri the URI of the comments configuration - * @param dynamicConfig map of configurations that can overwrite the configuration from the configuration file - * - */ - public CmsCommentsAccess( - PageContext context, - HttpServletRequest req, - HttpServletResponse res, - String configUri, - Map dynamicConfig) { - - super(context, req, res); - m_configUri = configUri; - - initConfig(context, req, res); - String dynamicFormId = getFormIdFromDynamicConfig(dynamicConfig); - if (dynamicFormId != null) { - m_config.setFormId(dynamicFormId); - } - } - static { OpenCms.addCmsEventListener(new I_CmsEventListener() { @@ -294,17 +255,43 @@ public void cmsEvent(CmsEvent event) { } /** - * Returns the cache key for the given data.

+ * Constructor, with parameters. * - * @param rootPath the resource root path - * @param isOnline true to cache for the online project - * @param locale the requested locale + * @param context the JSP page context object + * @param req the JSP request + * @param res the JSP response + * @param configUri the URI of the comments configuration + */ + public CmsCommentsAccess(PageContext context, HttpServletRequest req, HttpServletResponse res, String configUri) { + + this(context, req, res, configUri, null); + } + + /** + * Constructor, with parameters. + * + * @param context the JSP page context object + * @param req the JSP request + * @param res the JSP response + * @param configUri the URI of the comments configuration + * @param dynamicConfig map of configurations that can overwrite the configuration from the configuration file * - * @return the cache key */ - protected static String generateCacheKey(String rootPath, boolean isOnline, Locale locale) { + public CmsCommentsAccess( + PageContext context, + HttpServletRequest req, + HttpServletResponse res, + String configUri, + Map dynamicConfig) { - return rootPath + (isOnline ? "+" : "-") + "[" + locale + "]"; + super(context, req, res); + m_configUri = configUri; + + initConfig(context, req, res); + String dynamicFormId = getFormIdFromDynamicConfig(dynamicConfig); + if (dynamicFormId != null) { + m_config.setFormId(dynamicFormId); + } } /** @@ -338,6 +325,32 @@ public static final String getFormIdFromDynamicConfig(Map dynami return null; } + /** + * Appends the replies form id suffix to the given id.

+ * + * @param formId the form id + * + * @return the reply form id + */ + public static String getReplyFromId(String formId) { + + return (formId != null ? formId : "") + REPLIES_FORMID; + } + + /** + * Returns the cache key for the given data.

+ * + * @param rootPath the resource root path + * @param isOnline true to cache for the online project + * @param locale the requested locale + * + * @return the cache key + */ + protected static String generateCacheKey(String rootPath, boolean isOnline, Locale locale) { + + return rootPath + (isOnline ? "+" : "-") + "[" + locale + "]"; + } + /** * Approves the given comment entry.

* @@ -694,6 +707,32 @@ public CmsException getLoginException() { return m_exc; } + /** + * @param key the message's key + * @return the message for this key (from the configured resourcebundle) + */ + public String getMessage(final String key) { + + return getMessage(key, null); + } + + /** + * @param key the message's key + * @param vals the arguments given to the message + * @return the message for this key with the arguments filled in (from the configured resourcebundle) + */ + public String getMessage(final String key, final String[] vals) { + + String message = getMessages(getResourceBundle(), getRequestContext().getLocale()).key(key); + if ((vals != null) && (vals.length > 0)) { + MessageFormat messageform = new MessageFormat(message); + return messageform.format(vals); + } else { + return message; + } + + } + /** * Returns the page.

* @@ -1007,6 +1046,14 @@ private CmsFormDatabaseFilter getCommentFilter(boolean count, boolean restrictSt return filter; } + /** + * @return the URI of the configuration + */ + private String getConfigUri() { + + return m_configUri; + } + /** * Initializes the comment configuration.

* @param context the page context @@ -1104,38 +1151,4 @@ private void initConfig(PageContext context, HttpServletRequest req, HttpServlet LOG.debug(Messages.get().getBundle().key(Messages.LOG_INIT_PAGE_1, "" + m_page)); } } - - /** - * @return the URI of the configuration - */ - private String getConfigUri() { - - return m_configUri; - } - - /** - * @param key the message's key - * @return the message for this key (from the configured resourcebundle) - */ - public String getMessage(final String key) { - - return getMessage(key, null); - } - - /** - * @param key the message's key - * @param vals the arguments given to the message - * @return the message for this key with the arguments filled in (from the configured resourcebundle) - */ - public String getMessage(final String key, final String[] vals) { - - String message = getMessages(getResourceBundle(), getRequestContext().getLocale()).key(key); - if ((vals != null) && (vals.length > 0)) { - MessageFormat messageform = new MessageFormat(message); - return messageform.format(vals); - } else { - return message; - } - - } } diff --git a/com.alkacon.opencms.v8.comments/src/com/alkacon/opencms/v8/comments/CmsRepliesAccessBean.java b/com.alkacon.opencms.v8.comments/src/com/alkacon/opencms/v8/comments/CmsRepliesAccessBean.java index 3618f7a3..82c51511 100644 --- a/com.alkacon.opencms.v8.comments/src/com/alkacon/opencms/v8/comments/CmsRepliesAccessBean.java +++ b/com.alkacon.opencms.v8.comments/src/com/alkacon/opencms/v8/comments/CmsRepliesAccessBean.java @@ -45,21 +45,20 @@ /** * Access to comment replies, optimized for JSPs. */ - public class CmsRepliesAccessBean { /** The log object for this class. */ protected static final Log LOG = CmsLog.getLog(CmsCommentsAccess.class); - /** Form id for replies to comments. */ - private static final String COMMENT_REPLY_FORMID = "__oamp-comment-reply__"; - /** Lazily initialized map of the number of replies for comments with the id given as key. */ private Map m_countReplies; /** Lazily initialized map of the number of replies for comments with the id given as key. */ private Map> m_replies; + /** The form id. */ + private String m_formId; + /** * Returns a lazily initialized map that provides the number of replies, if a comment id is provided as key. * @@ -85,6 +84,40 @@ public Object transform(Object sEntryId) { return m_countReplies; } + /** + * Returns the number of replies for a comment specified by its entry id. + * + * @param entryId the entry id of the comment, where replies should be counted for + * + * @return number of replies for the given comment + */ + public int getCountRepliesForComment(int entryId) { + + int countReplies = 0; + CmsFormDatabaseFilter filter = CmsFormDatabaseFilter.HEADERS; + filter = filter.filterFormId(getReplyFormIdFilter()); + filter = filter.filterField(CmsCommentFormHandler.FIELD_REPLYTO, Integer.toString(entryId)); + try { + countReplies = CmsFormDataAccess.getInstance().countForms(filter); + } catch (SQLException e) { + if (LOG.isErrorEnabled()) { + LOG.error(e.getLocalizedMessage(), e); + } + // nothing to do, go on as if zero replies are given + } + return countReplies; + } + + /** + * Returns the form id.

+ * + * @return the form id + */ + public String getFromId() { + + return m_formId; + } + /** * Returns a lazily initialized map that provides the list of replies, if a comment id is provided as key. * @@ -110,30 +143,6 @@ public Object transform(Object sEntryId) { return m_replies; } - /** - * Returns the number of replies for a comment specified by its entry id. - * - * @param entryId the entry id of the comment, where replies should be counted for - * - * @return number of replies for the given comment - */ - public int getCountRepliesForComment(int entryId) { - - int countReplies = 0; - CmsFormDatabaseFilter filter = CmsFormDatabaseFilter.HEADERS; - filter = filter.filterFormId(COMMENT_REPLY_FORMID); - filter = filter.filterField(CmsCommentFormHandler.FIELD_REPLYTO, Integer.toString(entryId)); - try { - countReplies = CmsFormDataAccess.getInstance().countForms(filter); - } catch (SQLException e) { - if (LOG.isErrorEnabled()) { - LOG.error(e.getLocalizedMessage(), e); - } - // nothing to do, go on as if zero replies are given - } - return countReplies; - } - /** * Returns the replies for a comment specified by its entry id. * @@ -145,7 +154,7 @@ public List getRepliesForComment(int entryId) { List replies; CmsFormDatabaseFilter filter = CmsFormDatabaseFilter.DEFAULT; - filter = filter.filterFormId(COMMENT_REPLY_FORMID); + filter = filter.filterFormId(getReplyFormIdFilter()); filter = filter.filterField(CmsCommentFormHandler.FIELD_REPLYTO, Integer.toString(entryId)); filter = filter.filterOrderAsc(); try { @@ -160,4 +169,23 @@ public List getRepliesForComment(int entryId) { return replies; } + /** + * Sets the form id.

+ * + * @param formId the form id + */ + public void setFormId(String formId) { + + m_formId = formId; + } + + /** + * Returns the comment access filter form id.

+ * + * @return the comment access filter form id + */ + private String getReplyFormIdFilter() { + + return CmsCommentsAccess.getReplyFromId(m_formId) + "," + CmsCommentsAccess.REPLIES_FORMID; + } } From 628d8b4ba81ef5eb50ee08b8f73254f5d9142cc1 Mon Sep 17 00:00:00 2001 From: tHerrmann Date: Tue, 21 Apr 2015 21:35:56 +0200 Subject: [PATCH 36/46] Added project settings to ensure proper source formatting. --- .project | 18 + ...eclipse.members.sort.order.preferences.epf | 7 + .settings/org.eclipse.jdt.core.prefs | 403 ++++++++++++++++++ .settings/org.eclipse.jdt.ui.prefs | 119 ++++++ 4 files changed, 547 insertions(+) create mode 100644 .project create mode 100644 .settings/eclipse.members.sort.order.preferences.epf create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 .settings/org.eclipse.jdt.ui.prefs diff --git a/.project b/.project new file mode 100644 index 00000000..eabc2b82 --- /dev/null +++ b/.project @@ -0,0 +1,18 @@ + + + alkacon-oamp + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.springsource.ide.eclipse.gradle.core.nature + org.eclipse.jdt.core.javanature + + diff --git a/.settings/eclipse.members.sort.order.preferences.epf b/.settings/eclipse.members.sort.order.preferences.epf new file mode 100644 index 00000000..f0f5e02e --- /dev/null +++ b/.settings/eclipse.members.sort.order.preferences.epf @@ -0,0 +1,7 @@ +#Mon Mar 31 17:39:12 CEST 2014 +file_export_version=3.0 +/instance/org.eclipse.jdt.ui/outlinesortoption=T,SF,F,C,SI,I,SM,M, +/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.enable.visibility.order=true +@org.eclipse.jdt.ui=3.9.2.v20131106-1600 +\!/= +/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.visibility.order=B,R,D,V, diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..5925e9e0 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,403 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.codeComplete.argumentPrefixes= +org.eclipse.jdt.core.codeComplete.argumentSuffixes= +org.eclipse.jdt.core.codeComplete.fieldPrefixes=m_ +org.eclipse.jdt.core.codeComplete.fieldSuffixes= +org.eclipse.jdt.core.codeComplete.localPrefixes= +org.eclipse.jdt.core.codeComplete.localSuffixes= +org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=m_ +org.eclipse.jdt.core.codeComplete.staticFieldSuffixes= +org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes= +org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes= +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.doc.comment.support=enabled +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=warning +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=warning +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private +org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning +org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=enabled +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=private +org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags +org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=private +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=disabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning +org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=disabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=52 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=52 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=52 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=52 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_binary_expression=52 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=48 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=52 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=52 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=52 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=4 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=32 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=32 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=33 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=32 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=1 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=1 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.format_block_comments=false +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=false +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false +org.eclipse.jdt.core.formatter.comment.format_line_comments=false +org.eclipse.jdt.core.formatter.comment.format_source_code=false +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true +org.eclipse.jdt.core.formatter.comment.indent_root_tags=false +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=do not insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert +org.eclipse.jdt.core.formatter.comment.line_length=100 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=0 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=true +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.lineSplit=120 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=1 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=false +org.eclipse.jdt.core.formatter.tabulation.char=space +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=false +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 00000000..e1c1a81f --- /dev/null +++ b/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,119 @@ +cleanup.add_default_serial_version_id=true +cleanup.add_generated_serial_version_id=false +cleanup.add_missing_annotations=true +cleanup.add_missing_deprecated_annotations=true +cleanup.add_missing_methods=false +cleanup.add_missing_nls_tags=false +cleanup.add_missing_override_annotations=true +cleanup.add_missing_override_annotations_interface_methods=false +cleanup.add_serial_version_id=false +cleanup.always_use_blocks=true +cleanup.always_use_parentheses_in_expressions=true +cleanup.always_use_this_for_non_static_field_access=false +cleanup.always_use_this_for_non_static_method_access=false +cleanup.convert_to_enhanced_for_loop=false +cleanup.correct_indentation=true +cleanup.format_source_code=true +cleanup.format_source_code_changes_only=false +cleanup.make_local_variable_final=true +cleanup.make_parameters_final=false +cleanup.make_private_fields_final=true +cleanup.make_type_abstract_if_missing_method=false +cleanup.make_variable_declarations_final=false +cleanup.never_use_blocks=false +cleanup.never_use_parentheses_in_expressions=false +cleanup.organize_imports=true +cleanup.qualify_static_field_accesses_with_declaring_class=false +cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +cleanup.qualify_static_member_accesses_with_declaring_class=true +cleanup.qualify_static_method_accesses_with_declaring_class=false +cleanup.remove_private_constructors=true +cleanup.remove_trailing_whitespaces=true +cleanup.remove_trailing_whitespaces_all=true +cleanup.remove_trailing_whitespaces_ignore_empty=false +cleanup.remove_unnecessary_casts=true +cleanup.remove_unnecessary_nls_tags=true +cleanup.remove_unused_imports=true +cleanup.remove_unused_local_variables=false +cleanup.remove_unused_private_fields=true +cleanup.remove_unused_private_members=false +cleanup.remove_unused_private_methods=true +cleanup.remove_unused_private_types=true +cleanup.sort_members=false +cleanup.sort_members_all=false +cleanup.use_blocks=true +cleanup.use_blocks_only_for_return_and_throw=false +cleanup.use_parentheses_in_expressions=true +cleanup.use_this_for_non_static_field_access=true +cleanup.use_this_for_non_static_field_access_only_if_necessary=true +cleanup.use_this_for_non_static_method_access=true +cleanup.use_this_for_non_static_method_access_only_if_necessary=true +cleanup_profile=_OpenCms Coding Rules +cleanup_settings_version=2 +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_OpenCms Coding Rules +formatter_settings_version=12 +org.eclipse.jdt.ui.exception.name=e +org.eclipse.jdt.ui.gettersetter.use.is=true +org.eclipse.jdt.ui.ignorelowercasenames=true +org.eclipse.jdt.ui.importorder=com.alkacon;de.alkacon;org.opencms;com.opencms;java;javax;org.apache;org;com; +org.eclipse.jdt.ui.javadoc=false +org.eclipse.jdt.ui.keywordthis=false +org.eclipse.jdt.ui.ondemandthreshold=99 +org.eclipse.jdt.ui.overrideannotation=true +org.eclipse.jdt.ui.staticondemandthreshold=99 +org.eclipse.jdt.ui.text.custom_code_templates=