/**
* ***************************************************************************
* Copyright (c) 2010 Qcadoo Limited
* Project: Qcadoo MES
* Version: 1.4
*
* This file is part of Qcadoo.
*
* Qcadoo is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation; either version 3 of the License,
* or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* ***************************************************************************
*/
package com.qcadoo.mes.columnExtension;
import static com.qcadoo.mes.columnExtension.constants.ColumnFields.ALIGNMENT;
import static com.qcadoo.mes.columnExtension.constants.ColumnFields.COLUMN_FILLER;
import static com.qcadoo.mes.columnExtension.constants.ColumnFields.DESCRIPTION;
import static com.qcadoo.mes.columnExtension.constants.ColumnFields.IDENTIFIER;
import static com.qcadoo.mes.columnExtension.constants.ColumnFields.NAME;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.qcadoo.model.api.DataDefinition;
import com.qcadoo.model.api.DataDefinitionService;
import com.qcadoo.model.api.Entity;
import com.qcadoo.model.api.search.SearchRestrictions;
@Service
public class ColumnExtensionServiceImpl implements ColumnExtensionService {
private static final Logger LOG = LoggerFactory.getLogger(ColumnExtensionServiceImpl.class);
@Autowired
private DataDefinitionService dataDefinitionService;
public Map<Integer, Map<String, String>> getColumnsAttributesFromXML(final String plugin, final String file) {
LOG.info("Loading data from " + file + ".xml ...");
Map<Integer, Map<String, String>> columnsAttributes = Maps.newHashMap();
try {
SAXBuilder builder = new SAXBuilder();
Document document = builder.build(getXmlFile(plugin, file));
Element rootNode = document.getRootElement();
@SuppressWarnings("unchecked")
List<Element> listOfRows = rootNode.getChildren("row");
for (int rowNum = 0; rowNum < listOfRows.size(); rowNum++) {
Element node = listOfRows.get(rowNum);
@SuppressWarnings("unchecked")
List<Attribute> listOfAtributes = node.getAttributes();
Map<String, String> columnAttribute = Maps.newHashMap();
for (int attributeNum = 0; attributeNum < listOfAtributes.size(); attributeNum++) {
columnAttribute.put(listOfAtributes.get(attributeNum).getName().toLowerCase(Locale.ENGLISH), listOfAtributes
.get(attributeNum).getValue());
}
columnsAttributes.put(rowNum, columnAttribute);
}
} catch (IOException e) {
LOG.error(e.getMessage(), e);
} catch (JDOMException e) {
LOG.error(e.getMessage(), e);
}
return columnsAttributes;
}
private InputStream getXmlFile(final String plugin, final String file) throws IOException {
return ColumnExtensionServiceImpl.class.getResourceAsStream("/" + plugin + "/model/data/" + file + ".xml");
}
public Entity addColumn(final String pluginIdentifier, final String model, final Map<String, String> columnAttributes) {
Entity column = getColumnDD(pluginIdentifier, model).create();
column.setField(IDENTIFIER, columnAttributes.get(IDENTIFIER.toLowerCase(Locale.ENGLISH)));
column.setField(NAME, columnAttributes.get(NAME.toLowerCase(Locale.ENGLISH)));
column.setField(DESCRIPTION, columnAttributes.get(DESCRIPTION.toLowerCase(Locale.ENGLISH)));
column.setField(COLUMN_FILLER, columnAttributes.get(COLUMN_FILLER.toLowerCase(Locale.ENGLISH)));
column.setField(ALIGNMENT, columnAttributes.get(ALIGNMENT.toLowerCase(Locale.ENGLISH)));
if (LOG.isDebugEnabled()) {
LOG.debug("Add column for " + model + " item {column=" + column.getStringField(NAME) + "}");
}
column = column.getDataDefinition().save(column);
if (column.isValid()) {
if (LOG.isDebugEnabled()) {
LOG.debug("Column for " + model + " saved {column=" + column.toString() + "}");
}
return column;
} else {
throw new IllegalStateException("Saved entity " + model + " has validation errors - "
+ columnAttributes.get(IDENTIFIER.toLowerCase(Locale.ENGLISH)));
}
}
public void deleteColumn(final String pluginIdentifier, final String model, final Map<String, String> columnAttributes) {
final List<Entity> columns = getColumnDD(pluginIdentifier, model).find()
.add(SearchRestrictions.eq(IDENTIFIER, columnAttributes.get(IDENTIFIER))).list().getEntities();
for (Entity column : columns) {
column.getDataDefinition().delete(column.getId());
}
}
public boolean isColumnsEmpty(final String pluginIdentifier, final String model) {
return getColumnDD(pluginIdentifier, model).find().list().getTotalNumberOfEntities() == 0;
}
private DataDefinition getColumnDD(final String pluginIdentifier, final String model) {
return dataDefinitionService.get(pluginIdentifier, model);
}
@Override
public List<Entity> filterEmptyColumns(final List<Entity> columns, final List<Entity> rows,
final Map<Entity, Map<String, String>> columnValues) {
List<Entity> filteredColumns = Lists.newArrayList();
for (Entity column : columns) {
String identifier = column.getStringField(IDENTIFIER);
boolean isEmpty = true;
for (Entity row : rows) {
String value = columnValues.get(row).get(identifier);
if (StringUtils.isNotEmpty(value)) {
isEmpty = false;
break;
}
}
if (!isEmpty) {
filteredColumns.add(column);
}
}
return filteredColumns;
}
}