001/* 002 * #%L 003 * Netarchivesuite - harvester 004 * %% 005 * Copyright (C) 2005 - 2014 The Royal Danish Library, the Danish State and University Library, 006 * the National Library of France and the Austrian National Library. 007 * %% 008 * This program is free software: you can redistribute it and/or modify 009 * it under the terms of the GNU Lesser General Public License as 010 * published by the Free Software Foundation, either version 2.1 of the 011 * License, or (at your option) any later version. 012 * 013 * This program is distributed in the hope that it will be useful, 014 * but WITHOUT ANY WARRANTY; without even the implied warranty of 015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 016 * GNU General Lesser Public License for more details. 017 * 018 * You should have received a copy of the GNU General Lesser Public 019 * License along with this program. If not, see 020 * <http://www.gnu.org/licenses/lgpl-2.1.html>. 021 * #L% 022 */ 023 024package dk.netarkivet.harvester.webinterface; 025 026import java.text.DecimalFormat; 027import java.text.Format; 028import java.text.ParseException; 029import java.text.SimpleDateFormat; 030 031import javax.servlet.ServletRequest; 032import javax.servlet.jsp.PageContext; 033 034import dk.netarkivet.common.exceptions.ArgumentNotValid; 035import dk.netarkivet.common.exceptions.ForwardedToErrorPage; 036import dk.netarkivet.common.utils.I18n; 037import dk.netarkivet.common.webinterface.HTMLUtils; 038import dk.netarkivet.harvester.datamodel.extendedfield.ExtendedField; 039import dk.netarkivet.harvester.datamodel.extendedfield.ExtendedFieldDAO; 040import dk.netarkivet.harvester.datamodel.extendedfield.ExtendedFieldDBDAO; 041import dk.netarkivet.harvester.datamodel.extendedfield.ExtendedFieldDataTypes; 042import dk.netarkivet.harvester.datamodel.extendedfield.ExtendedFieldDefaultValue; 043import dk.netarkivet.harvester.datamodel.extendedfield.ExtendedFieldOptions; 044 045/** 046 * Contains utility methods for creating and editing schedule definitions for harvests. 047 */ 048public final class ExtendedFieldDefinition { 049 050 /** 051 * Private constructor. No instances. 052 */ 053 private ExtendedFieldDefinition() { 054 } 055 056 /** 057 * Process an request from the jsp-pages. HarvestDefinition/Definitions-edit-extendedfield.jsp 058 * HarvestDefinition/Definitions-list-extendedfields.jsp HarvestDefinition/Definitions-edit-domain.jsp 059 * 060 * @param context the given JSP-context 061 * @param i18n the given I18n object. 062 * @return the extendedfield resulting from the processing. 063 */ 064 public static ExtendedField processRequest(PageContext context, I18n i18n) { 065 ArgumentNotValid.checkNotNull(context, "PageContext context"); 066 ArgumentNotValid.checkNotNull(i18n, "I18n i18n"); 067 068 ServletRequest request = context.getRequest(); 069 070 Long extendedFieldID = HTMLUtils.parseOptionalLong(context, ExtendedFieldConstants.EXTF_ID, null); 071 Long extendedFieldTypeID = HTMLUtils.parseOptionalLong(context, ExtendedFieldConstants.EXTF_TYPE_ID, null); 072 073 HTMLUtils.forwardOnEmptyParameter(context, ExtendedFieldConstants.EXTF_NAME); 074 String name = request.getParameter(ExtendedFieldConstants.EXTF_NAME).trim(); 075 int datatype = HTMLUtils.parseAndCheckInteger(context, ExtendedFieldConstants.EXTF_DATATYPE, 076 ExtendedFieldDataTypes.MIN_DATATYPE_VALUE, ExtendedFieldDataTypes.MAX_DATATYPE_VALUE); 077 078 boolean mandatory = false; 079 080 String[] checkboxValues = null; 081 checkboxValues = request.getParameterValues(ExtendedFieldConstants.EXTF_MANDATORY); 082 if (checkboxValues != null) { 083 mandatory = true; 084 } 085 086 int maxlen = HTMLUtils.parseAndCheckInteger(context, ExtendedFieldConstants.EXTF_MAXLEN, 087 ExtendedFieldConstants.MAXLEN_EXTF_BOOLEAN, ExtendedFieldConstants.MAXLEN_EXTF_CONTENT); 088 int sequencenr = HTMLUtils.parseAndCheckInteger(context, ExtendedFieldConstants.EXTF_SEQUENCENR, 1, 089 Integer.MAX_VALUE); 090 091 String options = ""; 092 ExtendedFieldOptions efo = null; 093 094 if (datatype == ExtendedFieldDataTypes.SELECT) { 095 options = request.getParameter(ExtendedFieldConstants.EXTF_OPTIONS); 096 if (options == null) { 097 options = ""; 098 } else { 099 efo = new ExtendedFieldOptions(options); 100 if (efo.isValid()) { 101 options = efo.getOptionsString(); 102 } else { 103 throw new ForwardedToErrorPage("errormsg;extendedfields.options.invalid"); 104 } 105 } 106 } 107 108 String defaultvalue = ""; 109 if (datatype == ExtendedFieldDataTypes.NOTE) { 110 defaultvalue = request.getParameter(ExtendedFieldConstants.EXTF_DEFAULTVALUE_TEXTAREA); 111 } else if (datatype == ExtendedFieldDataTypes.BOOLEAN) { 112 checkboxValues = request.getParameterValues(ExtendedFieldConstants.EXTF_DEFAULTVALUE_CHECKBOX); 113 if (checkboxValues != null) { 114 defaultvalue = ExtendedFieldConstants.TRUE; 115 } 116 } else { 117 defaultvalue = request.getParameter(ExtendedFieldConstants.EXTF_DEFAULTVALUE_TEXTFIELD); 118 } 119 120 if (defaultvalue == null || defaultvalue.length() == 0) { 121 defaultvalue = ""; 122 } 123 124 if (mandatory && defaultvalue.length() == 0) { 125 throw new ForwardedToErrorPage("errormsg;extendedfields.defaultvalue.empty"); 126 } 127 128 String format = ""; 129 if (datatype == ExtendedFieldDataTypes.NUMBER || datatype == ExtendedFieldDataTypes.TIMESTAMP 130 || datatype == ExtendedFieldDataTypes.JSCALENDAR) { 131 if (datatype == ExtendedFieldDataTypes.JSCALENDAR) { 132 format = request.getParameter(ExtendedFieldConstants.EXTF_FORMAT_JSCALENDAR); 133 } else { 134 format = request.getParameter(ExtendedFieldConstants.EXTF_FORMAT); 135 } 136 if (format == null || format.length() == 0) { 137 format = ""; 138 } else { 139 format = format.trim(); 140 141 Format aFormat = null; 142 try { 143 if (datatype == ExtendedFieldDataTypes.NUMBER) { 144 aFormat = new DecimalFormat(format); 145 } else { 146 aFormat = new SimpleDateFormat(format); 147 } 148 } catch (IllegalArgumentException e) { 149 throw new ForwardedToErrorPage("errormsg;extendedfields.pattern.invalid"); 150 } 151 152 if (defaultvalue != null && defaultvalue.length() > 0) { 153 try { 154 aFormat.parseObject(defaultvalue); 155 } catch (ParseException e) { 156 throw new ForwardedToErrorPage("errormsg;extendedfields.value." + "does.not.match.pattern"); 157 } 158 } 159 } 160 } 161 162 if (defaultvalue.length() > 0) { 163 ExtendedFieldDefaultValue efd = new ExtendedFieldDefaultValue(defaultvalue, format, datatype); 164 if (!efd.isValid()) { 165 throw new ForwardedToErrorPage("errormsg;extendedfields.defaultvalue.invalid"); 166 } 167 168 if (datatype == ExtendedFieldDataTypes.SELECT && efo != null && !efo.isKeyValid(defaultvalue)) { 169 throw new ForwardedToErrorPage("errormsg;extendedfields.defaultvalue.invalid"); 170 } 171 } 172 173 String maxlenStr = ""; 174 maxlenStr = request.getParameter(ExtendedFieldConstants.EXTF_MAXLEN); 175 if (maxlenStr == null || maxlenStr.length() == 0) { 176 try { 177 maxlen = Integer.valueOf(maxlenStr); 178 } catch (NumberFormatException e) { 179 throw new ForwardedToErrorPage("errormsg;extendedfields.maxlen.invalid"); 180 } 181 } 182 183 if (mandatory && defaultvalue.length() == 0) { 184 throw new ForwardedToErrorPage("errormsg;extendedfields.defaultvalue.empty"); 185 } 186 187 ExtendedField extendedField = new ExtendedField(extendedFieldID, extendedFieldTypeID, name, format, datatype, 188 mandatory, sequencenr, defaultvalue, options, maxlen); 189 updateExtendedField(extendedField); 190 191 return extendedField; 192 } 193 194 /** 195 * Create or update the extendedField in the database. 196 * 197 * @param aExtendedField The given extendedfield 198 */ 199 private static void updateExtendedField(ExtendedField aExtendedField) { 200 ExtendedFieldDAO extdao = ExtendedFieldDBDAO.getInstance(); 201 202 if (aExtendedField.getExtendedFieldID() == null) { 203 extdao.create(aExtendedField); 204 } else { 205 extdao.update(aExtendedField); 206 } 207 } 208 209 /** 210 * Read and return the Extendedfield for the given id. 211 * 212 * @param aId An Id for a specific ExtendedField 213 * @return the Extendedfield for the given id. 214 */ 215 public static ExtendedField readExtendedField(String aId) { 216 ExtendedFieldDAO extdao = ExtendedFieldDBDAO.getInstance(); 217 if (aId == null) { 218 return null; 219 } 220 return extdao.read(Long.parseLong(aId)); 221 } 222}