try {
//Building a values HashMap based on the headers/columns position
HashMap<Integer, Object> values = new HashMap<Integer, Object>();
Set<Category> categories = new HashSet<Category> ();
for (Integer column : headers.keySet()) {
Field field = headers.get(column);
if (line.length < column) {
throw new DotRuntimeException("Incomplete line found, the line #" + lineNumber +
" doesn't contain all the required columns.");
}
String value = line[column];
Object valueObj = value;
if (field.getFieldType().equals(Field.FieldType.DATE.toString())) {
if (field.getFieldContentlet().startsWith("date")) {
if(UtilMethods.isSet(value)) {
try { valueObj = parseExcelDate(value) ;} catch (ParseException e) {
throw new DotRuntimeException("Line #" + lineNumber + " contains errors, Column: " + field.getFieldName() +
", value: " + value + ", couldn't be parsed as any of the following supported formats: " +
printSupportedDateFormats());
}
} else {
valueObj = null;
}
}
} else if (field.getFieldType().equals(Field.FieldType.DATE_TIME.toString())) {
if (field.getFieldContentlet().startsWith("date")) {
if(UtilMethods.isSet(value)) {
try { valueObj = parseExcelDate(value) ;} catch (ParseException e) {
throw new DotRuntimeException("Line #" + lineNumber + " contains errors, Column: " + field.getFieldName() +
", value: " + value + ", couldn't be parsed as any of the following supported formats: " +
printSupportedDateFormats());
}
} else {
valueObj = null;
}
}
} else if (field.getFieldType().equals(Field.FieldType.TIME.toString())) {
if (field.getFieldContentlet().startsWith("date")) {
if(UtilMethods.isSet(value)) {
try { valueObj = parseExcelDate(value) ;} catch (ParseException e) {
throw new DotRuntimeException("Line #" + lineNumber + " contains errors, Column: " + field.getFieldName() +
", value: " + value + ", couldn't be parsed as any of the following supported formats: " +
printSupportedDateFormats());
}
} else {
valueObj = null;
}
}
} else if (field.getFieldType().equals(Field.FieldType.CATEGORY.toString()) || field.getFieldType().equals(Field.FieldType.CATEGORIES_TAB.toString())) {
valueObj = value;
if(UtilMethods.isSet(value)) {
String[] categoryKeys = value.split(",");
for(String catKey : categoryKeys) {
Category cat = catAPI.findByKey(catKey.trim(), user, false);
if(cat == null)
throw new DotRuntimeException("Line #" + lineNumber + " contains errors, Column: " + field.getFieldName() +
", value: " + value + ", invalid category key found, line will be ignored.");
categories.add(cat);
}
}
}
else if (field.getFieldType().equals(Field.FieldType.CHECKBOX.toString()) ||
field.getFieldType().equals(Field.FieldType.SELECT.toString()) ||
field.getFieldType().equals(Field.FieldType.MULTI_SELECT.toString()) ||
field.getFieldType().equals(Field.FieldType.RADIO.toString())
) {
valueObj = value;
if(UtilMethods.isSet(value))
{
String fieldEntriesString = field.getValues()!=null ? field.getValues():"";
String[] fieldEntries = fieldEntriesString.split("\n");
boolean found = false;
for(String fieldEntry : fieldEntries)
{
String entryValue = fieldEntry.split("\\|")[1].trim();
if(entryValue.equals(value) || value.contains(entryValue))
{
found = true;
break;
}
}
if(!found)
{
throw new DotRuntimeException("Line #" + lineNumber + " contains errors, Column: " + field.getFieldName() +
", value: " + value + ", invalid value found, line will be ignored.");
}
}
else {
valueObj = null;
}
}
else if (field.getFieldType().equals(Field.FieldType.TEXT.toString())) {
if (value.length() > 255)
value = value.substring(0, 255);
valueObj = value;
} else {
valueObj = value;
}
values.put(column, valueObj);
}
//Searching contentlets to be updated by key fields
List<Contentlet> contentlets = new ArrayList<Contentlet>();
String conditionValues = "";
StringBuffer buffy = new StringBuffer();
buffy.append("+structureInode:" + structure.getInode() + " +working:true +deleted:false");
if (keyFields.size() > 0) {
for (Integer column : keyFields.keySet()) {
Field field = keyFields.get(column);
Object value = values.get(column);
String text = null;
if (value instanceof Date || value instanceof Timestamp) {
SimpleDateFormat formatter = null;
if(field.getFieldType().equals(Field.FieldType.DATE.toString())
|| field.getFieldType().equals(Field.FieldType.DATE_TIME.toString()))
{
DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
text = df.format((Date)value);
} else if(field.getFieldType().equals(Field.FieldType.TIME.toString())) {
DateFormat df = new SimpleDateFormat("HHmmss");
text = df.format((Date)value);
} else {
formatter = new SimpleDateFormat();
text = formatter.format(value);
Logger.warn(getClass(),"importLine: field's date format is undetermined.");
}
} else {
text = value.toString();
}
if(!UtilMethods.isSet(text)){
throw new DotRuntimeException("Line #" + lineNumber + " key field "+field.getFieldName()+" is required since it was defined as a key\n");
}else{
buffy.append(" +" +field.getFieldContentlet()+ ":"+ escapeLuceneSpecialCharacter(text));
conditionValues += conditionValues + value + "-";
}
if(choosenKeyField.indexOf(field.getFieldName()) == -1){
choosenKeyField.append(", "+field.getFieldName());
}
}
contentlets = conAPI.checkoutWithQuery(buffy.toString(), user, true);
}
//Creating/updating content
boolean isNew = false;
if (contentlets.size() == 0) {
newContentCounter++;
isNew = true;
//if (!preview) {
Contentlet newCont = new Contentlet();
newCont.setStructureInode(structure.getInode());
newCont.setLanguageId(langAPI.getDefaultLanguage().getId());
contentlets.add(newCont);
//}
} else {
if (conditionValues.equals("") || !keyContentUpdated.contains(conditionValues)) {
contentToUpdateCounter += contentlets.size();
if (preview)
keyContentUpdated.add(conditionValues);
}
if (contentlets.size() > 0) {
myOutput.println("Line #" + lineNumber + ". The key fields choosen match more than one content, in this case: "
+ " matches: " + contentlets.size() + " different content(s), looks like the key fields choosen " +
"aren't a real key.");
}
}
for (Contentlet cont : contentlets)
{
//Fill the new contentlet with the data
for (Integer column : headers.keySet()) {
Field field = headers.get(column);
Object value = values.get(column);
conAPI.setContentletProperty(cont, field, value);
if (field.getFieldType().equals(Field.FieldType.TAG.toString()) &&
value instanceof String) {
String[] tags = ((String)value).split(",");
for (String tag : tags) {
TagFactory.addTagInode((String)tag.trim(), cont.getInode(), "");
}
}
}
//Check the new contentlet with the validator
try
{
conAPI.validateContentlet(cont,new ArrayList<Category>(categories));
}
catch(DotContentletValidationException ex)
{
StringBuffer sb = new StringBuffer("Line #" + lineNumber + " contains errors\n");
HashMap<String,List<Field>> errors = (HashMap<String,List<Field>>) ex.getNotValidFields();
Set<String> keys = errors.keySet();
for(String key : keys)
{
sb.append(key + ": ");
List<Field> fields = errors.get(key);
for(Field field : fields)
{
sb.append(field.getFieldName() + ",");
}
sb.append("\n");
}
throw new DotRuntimeException(sb.toString());
}