diff --git a/org.adempiere.pipo.handlers/plugin.xml b/org.adempiere.pipo.handlers/plugin.xml
index 9341c2796c..16d6710586 100644
--- a/org.adempiere.pipo.handlers/plugin.xml
+++ b/org.adempiere.pipo.handlers/plugin.xml
@@ -180,6 +180,14 @@
class="org.adempiere.pipo2.handler.ModelValidatorElementHandler"
id="AD_ModelValidator">
+
+
+
+
diff --git a/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/EntityTypeElementHandler.java b/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/EntityTypeElementHandler.java
new file mode 100644
index 0000000000..693d10f4e0
--- /dev/null
+++ b/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/EntityTypeElementHandler.java
@@ -0,0 +1,202 @@
+/******************************************************************************
+ * Copyright (C) 2013 Jan Thielemann - jan.thielemann@evenos-consulting.de *
+ * This program is free software; you can redistribute it and/or modify it *
+ * under the terms version 2 of the GNU General Public License as published *
+ * by the Free Software Foundation. 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 General Public License for more details. *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
+ *****************************************************************************/
+package org.adempiere.pipo2.handler;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+
+import javax.xml.transform.sax.TransformerHandler;
+
+import org.adempiere.pipo2.AbstractElementHandler;
+import org.adempiere.pipo2.Element;
+import org.adempiere.pipo2.ElementHandler;
+import org.adempiere.pipo2.PIPOContext;
+import org.adempiere.pipo2.PackOut;
+import org.adempiere.pipo2.PoExporter;
+import org.adempiere.pipo2.PoFiller;
+import org.adempiere.pipo2.exception.DatabaseAccessException;
+import org.adempiere.pipo2.exception.POSaveFailedException;
+import org.compiere.model.X_AD_EntityType;
+import org.compiere.model.X_AD_Modification;
+import org.compiere.model.X_AD_Package_Imp_Detail;
+import org.compiere.util.DB;
+import org.compiere.util.Env;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.AttributesImpl;
+
+/**
+ * @author Jan Thielemann - jan.thielemann@evenos-consulting.de
+ * @author evenos Consulting GmbH - www.evenos.org
+ */
+
+public class EntityTypeElementHandler extends AbstractElementHandler{
+
+ private ModificationElementHandler modificationHandler = new ModificationElementHandler();
+
+ private List entityTypes = new ArrayList();
+
+ @Override
+ public void startElement(PIPOContext ctx, Element element)
+ throws SAXException {
+ List excludes = defaultExcludeList(X_AD_EntityType.Table_Name);
+
+ String entitytype = getStringValue(element, "EntityType");
+ String name = getStringValue(element, "Name");
+ String action = null;
+ if (isProcessElement(ctx.ctx, entitytype)) {
+ X_AD_EntityType m_EntityType = findPO(ctx, element);
+
+ if (m_EntityType == null) {
+ int id = findIdByColumn(ctx, X_AD_EntityType.Table_Name, X_AD_EntityType.COLUMNNAME_Name, name, /*ignorecase=*/true);
+ m_EntityType = new X_AD_EntityType(ctx.ctx, id, getTrxName(ctx));
+ }
+
+ if (m_EntityType.getAD_EntityType_ID() == 0 && isOfficialId(element, "AD_EntityType_ID"))
+ m_EntityType.setAD_EntityType_ID(getIntValue(element, "AD_EntityType_ID"));
+
+ if (entityTypes.contains(m_EntityType.getAD_EntityType_ID())) {
+ element.skip = true;
+ return;
+ }
+
+ PoFiller pf = new PoFiller(ctx, m_EntityType, element, this);
+ List notfounds = pf.autoFill(excludes);
+ if (notfounds.size() > 0) {
+ element.defer = true;
+ element.unresolved = notfounds.toString();
+ return;
+ }
+
+ if (m_EntityType.is_new() || m_EntityType.is_Changed()) {
+ X_AD_Package_Imp_Detail impDetail = createImportDetail(ctx, element.qName, X_AD_EntityType.Table_Name, X_AD_EntityType.Table_ID);
+ if (!m_EntityType.is_new()) {
+ backupRecord(ctx, impDetail.getAD_Package_Imp_Detail_ID(), X_AD_EntityType.Table_Name, m_EntityType);
+ action = "Update";
+ } else {
+ action = "New";
+ }
+
+ if (m_EntityType.save(getTrxName(ctx)) == true) {
+ logImportDetail(ctx, impDetail, 1, m_EntityType.getName(),
+ m_EntityType.get_ID(), action);
+
+ element.recordId = m_EntityType.getAD_EntityType_ID();
+
+ entityTypes.add(m_EntityType.getAD_EntityType_ID());
+
+ } else {
+ logImportDetail(ctx, impDetail, 0, m_EntityType.getName(),
+ m_EntityType.get_ID(), action);
+ throw new POSaveFailedException("Failed to save Model Validator " + m_EntityType.getName());
+ }
+ }
+
+ }else {
+ element.skip = true;
+ }
+ }
+
+ @Override
+ public void endElement(PIPOContext ctx, Element element)
+ throws SAXException {
+ }
+
+ public void create(PIPOContext ctx, TransformerHandler document) throws SAXException {
+ int AD_ElementType_ID = Env.getContextAsInt(ctx.ctx, X_AD_EntityType.COLUMNNAME_AD_EntityType_ID);
+
+ if(entityTypes.contains(AD_ElementType_ID))
+ return;
+ entityTypes.add(AD_ElementType_ID);
+
+
+ PackOut packOut = ctx.packOut;
+
+ boolean createElement = true;
+ X_AD_EntityType m_EntityType = new X_AD_EntityType(ctx.ctx, AD_ElementType_ID, null);
+ if(ctx.packOut.getFromDate() != null){
+ if(m_EntityType.getUpdated().compareTo(ctx.packOut.getFromDate()) < 0){
+ createElement = false;
+ }
+ }
+
+ if(createElement){
+ AttributesImpl atts = new AttributesImpl();
+ addTypeName(atts, "table");
+ document.startElement("", "", X_AD_EntityType.Table_Name, atts);
+ createEntityTypeBinding(ctx, document, m_EntityType);
+ }
+
+ String sql = "SELECT AD_Modification_ID FROM AD_Modification WHERE entitytype = ?";
+ PreparedStatement pstmt = null;
+ ResultSet rs = null;
+ try {
+ pstmt = DB.prepareStatement(sql, getTrxName(ctx));
+ pstmt.setString(1, m_EntityType.getEntityType());
+ rs = pstmt.executeQuery();
+ while (rs.next()) {
+ ElementHandler handler = packOut.getHandler("AD_Modification");
+ handler.packOut(packOut,document,null,rs.getInt("AD_Modification_ID"));
+
+ createModificaiton(ctx, document, rs.getInt("AD_Modification_ID"));
+ }
+ } catch (Exception e) {
+ log.log(Level.SEVERE, e.getLocalizedMessage(), e);
+ if (e instanceof SAXException)
+ throw (SAXException) e;
+ else if (e instanceof SQLException)
+ throw new DatabaseAccessException("Failed to export EntityType.", e);
+ else if (e instanceof RuntimeException)
+ throw (RuntimeException) e;
+ else
+ throw new RuntimeException("Failed to export EntityType.", e);
+ } finally {
+ DB.close(rs, pstmt);
+ }
+
+
+ if (createElement) {
+ document.endElement("", "", X_AD_EntityType.Table_Name);
+ }
+ }
+
+ private void createModificaiton(PIPOContext ctx, TransformerHandler document,
+ int AD_Modification_ID) throws SAXException {
+ Env.setContext(ctx.ctx, X_AD_Modification.COLUMNNAME_AD_Modification_ID, AD_Modification_ID);
+ modificationHandler.create(ctx, document);
+ ctx.ctx.remove(X_AD_Modification.COLUMNNAME_AD_Modification_ID);
+ }
+
+ private void createEntityTypeBinding(PIPOContext ctx, TransformerHandler document,
+ X_AD_EntityType m_EntityType) {
+ PoExporter filler = new PoExporter(ctx, document, m_EntityType);
+ List excludes = defaultExcludeList(X_AD_EntityType.Table_Name);
+
+ if (m_EntityType.getAD_EntityType_ID() <= PackOut.MAX_OFFICIAL_ID)
+ filler.add(X_AD_EntityType.COLUMNNAME_AD_EntityType_ID, new AttributesImpl());
+
+ filler.export(excludes);
+ }
+
+ @Override
+ public void packOut(PackOut packout, TransformerHandler packoutHandler,
+ TransformerHandler docHandler, int recordId) throws Exception {
+ Env.setContext(packout.getCtx().ctx, X_AD_EntityType.COLUMNNAME_AD_EntityType_ID, recordId);
+ this.create(packout.getCtx(), packoutHandler);
+ packout.getCtx().ctx.remove(X_AD_EntityType.COLUMNNAME_AD_EntityType_ID);
+ }
+
+}
diff --git a/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/ModificationElementHandler.java b/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/ModificationElementHandler.java
new file mode 100644
index 0000000000..2bc120c728
--- /dev/null
+++ b/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/ModificationElementHandler.java
@@ -0,0 +1,150 @@
+/******************************************************************************
+ * Copyright (C) 2013 Jan Thielemann - jan.thielemann@evenos-consulting.de *
+ * This program is free software; you can redistribute it and/or modify it *
+ * under the terms version 2 of the GNU General Public License as published *
+ * by the Free Software Foundation. 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 General Public License for more details. *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
+ *****************************************************************************/
+package org.adempiere.pipo2.handler;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.transform.sax.TransformerHandler;
+
+import org.adempiere.pipo2.AbstractElementHandler;
+import org.adempiere.pipo2.Element;
+import org.adempiere.pipo2.PIPOContext;
+import org.adempiere.pipo2.PackOut;
+import org.adempiere.pipo2.PoExporter;
+import org.adempiere.pipo2.PoFiller;
+import org.adempiere.pipo2.exception.POSaveFailedException;
+import org.compiere.model.X_AD_Modification;
+import org.compiere.model.X_AD_Package_Imp_Detail;
+import org.compiere.util.Env;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.AttributesImpl;
+
+/**
+ * @author Jan Thielemann - jan.thielemann@evenos-consulting.de
+ * @author evenos Consulting GmbH - www.evenos.org
+ */
+
+public class ModificationElementHandler extends AbstractElementHandler{
+
+ private Listmodifications = new ArrayList();
+
+ @Override
+ public void startElement(PIPOContext ctx, Element element)
+ throws SAXException {
+
+ String action = null;
+
+ String entitytype = getStringValue(element, "EntityType");
+ String name = getStringValue(element, "Name");
+
+ if (isProcessElement(ctx.ctx, entitytype)) {
+
+ X_AD_Modification modification = findPO(ctx, element);
+ if (modification == null) {
+ int id = findIdByColumn(ctx, X_AD_Modification.Table_Name, X_AD_Modification.COLUMNNAME_Name, name, /*ignorecase=*/true);
+ modification = new X_AD_Modification(ctx.ctx, id, getTrxName(ctx));
+ }
+ List excludes = defaultExcludeList(X_AD_Modification.Table_Name);
+ if (modification.getAD_Modification_ID() == 0 && isOfficialId(element, X_AD_Modification.COLUMNNAME_AD_Modification_ID))
+ modification.setAD_Modification_ID(getIntValue(element, X_AD_Modification.COLUMNNAME_AD_Modification_ID));
+
+ if (modifications.contains(modification.getAD_Modification_ID())) {
+ element.skip = true;
+ return;
+ }
+
+ PoFiller pf = new PoFiller(ctx, modification, element, this);
+ List notfounds = pf.autoFill(excludes);
+ if (notfounds.size() > 0) {
+ element.defer = true;
+ element.unresolved = notfounds.toString();
+ return;
+ }
+
+ if (modification.is_new() || modification.is_Changed()) {
+ X_AD_Package_Imp_Detail impDetail = createImportDetail(ctx, element.qName, X_AD_Modification.Table_Name, X_AD_Modification.Table_ID);
+ if (!modification.is_new()) {
+ backupRecord(ctx, impDetail.getAD_Package_Imp_Detail_ID(), X_AD_Modification.Table_Name, modification);
+ action = "Update";
+ } else {
+ action = "New";
+ }
+
+ if (modification.save(getTrxName(ctx)) == true) {
+ logImportDetail(ctx, impDetail, 1, modification.getName(),
+ modification.get_ID(), action);
+
+ element.recordId = modification.getAD_Modification_ID();
+
+ modifications.add(modification.getAD_Modification_ID());
+
+ } else {
+ logImportDetail(ctx, impDetail, 0, modification.getName(),
+ modification.get_ID(), action);
+ throw new POSaveFailedException("Failed to save Model Validator " + modification.getName());
+ }
+ }
+ } else {
+ element.skip = true;
+ }
+ }
+
+ @Override
+ public void endElement(PIPOContext ctx, Element element)
+ throws SAXException {
+
+ }
+
+
+ public void create(PIPOContext ctx, TransformerHandler document) throws SAXException {
+ int ad_modification_id = Env.getContextAsInt(ctx.ctx, X_AD_Modification.COLUMNNAME_AD_Modification_ID);
+
+ if (modifications.contains(ad_modification_id))
+ return;
+
+ modifications.add(ad_modification_id);
+
+ X_AD_Modification modification = new X_AD_Modification(ctx.ctx, ad_modification_id, null);
+
+ if (ctx.packOut.getFromDate() != null) {
+ if (modification.getUpdated().compareTo(ctx.packOut.getFromDate()) < 0) {
+ return;
+ }
+ }
+
+ AttributesImpl atts = new AttributesImpl();
+ addTypeName(atts, "table");
+ document.startElement("", "", X_AD_Modification.Table_Name, atts);
+ createADModificationBinding(ctx, document, modification);
+
+ document.endElement("", "", X_AD_Modification.Table_Name);
+ }
+
+ private void createADModificationBinding(PIPOContext ctx, TransformerHandler document, X_AD_Modification modification) {
+ PoExporter filler = new PoExporter(ctx, document, modification);
+ if (modification.getAD_Modification_ID() <= PackOut.MAX_OFFICIAL_ID)
+ filler.add(X_AD_Modification.COLUMNNAME_AD_Modification_ID, new AttributesImpl());
+ List excludes = defaultExcludeList(X_AD_Modification.Table_Name);
+ filler.export(excludes);
+ }
+
+ @Override
+ public void packOut(PackOut packout, TransformerHandler packoutHandler,
+ TransformerHandler docHandler, int recordId) throws Exception {
+ Env.setContext(packout.getCtx().ctx, X_AD_Modification.COLUMNNAME_AD_Modification_ID, recordId);
+ this.create(packout.getCtx(), packoutHandler);
+ packout.getCtx().ctx.remove(X_AD_Modification.COLUMNNAME_AD_Modification_ID);
+ }
+
+}
diff --git a/org.adempiere.pipo/src/org/adempiere/pipo2/PackOutProcess.java b/org.adempiere.pipo/src/org/adempiere/pipo2/PackOutProcess.java
index f50b0b432d..ea4a2bfd9d 100644
--- a/org.adempiere.pipo/src/org/adempiere/pipo2/PackOutProcess.java
+++ b/org.adempiere.pipo/src/org/adempiere/pipo2/PackOutProcess.java
@@ -27,6 +27,7 @@ import java.util.Map;
import java.util.logging.Level;
import org.compiere.Adempiere;
+import org.compiere.model.I_AD_EntityType;
import org.compiere.model.I_AD_Form;
import org.compiere.model.I_AD_ImpFormat;
import org.compiere.model.I_AD_Menu;
@@ -189,6 +190,8 @@ public class PackOutProcess extends SvrProcess
return I_AD_Workflow.Table_Name;
else if (X_AD_Package_Exp_Detail.TYPE_ModelValidator.equals(type))
return I_AD_ModelValidator.Table_Name;
+ else if (X_AD_Package_Exp_Detail.TYPE_EntityType.equals(type))
+ return I_AD_EntityType.Table_Name;
return type;
}