From 051dd36d22416b8aa49a163a5d124ad557ec99f9 Mon Sep 17 00:00:00 2001 From: Richard Morales Date: Mon, 29 Jul 2013 22:56:47 -0500 Subject: [PATCH 01/12] IDEMPIERE-1187 in make menu window, when select "Summary Level", field "Window" still display --- .../oracle/20130724102515_IDEMPIERE-1187.sql | 32 +++++++++++++++++++ .../20130724102515_IDEMPIERE-1187.sql | 32 +++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 migration/i1.0c-release/oracle/20130724102515_IDEMPIERE-1187.sql create mode 100644 migration/i1.0c-release/postgresql/20130724102515_IDEMPIERE-1187.sql diff --git a/migration/i1.0c-release/oracle/20130724102515_IDEMPIERE-1187.sql b/migration/i1.0c-release/oracle/20130724102515_IDEMPIERE-1187.sql new file mode 100644 index 0000000000..b07f6644de --- /dev/null +++ b/migration/i1.0c-release/oracle/20130724102515_IDEMPIERE-1187.sql @@ -0,0 +1,32 @@ +-- Jul 24, 2013 10:16:11 AM COT +-- IDEMPIERE-1187 in make menu window, when select "Summary Level", field "Window" still display +UPDATE AD_Field SET DisplayLogic='@Action@=W & @IsSummary@=N',Updated=TO_DATE('2013-07-24 10:16:11','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=206 +; + +-- Jul 24, 2013 10:16:35 AM COT +-- IDEMPIERE-1187 in make menu window, when select "Summary Level", field "Window" still display +UPDATE AD_Field SET DisplayLogic='@Action@=X & @IsSummary@=N',Updated=TO_DATE('2013-07-24 10:16:35','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=3612 +; + +-- Jul 24, 2013 10:16:48 AM COT +-- IDEMPIERE-1187 in make menu window, when select "Summary Level", field "Window" still display +UPDATE AD_Field SET DisplayLogic='@Action@=I & @IsSummary@=N',Updated=TO_DATE('2013-07-24 10:16:48','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=201638 +; + +-- Jul 24, 2013 10:17:27 AM COT +-- IDEMPIERE-1187 in make menu window, when select "Summary Level", field "Window" still display +UPDATE AD_Field SET DisplayLogic='@Action@=P | @Action@=R & @IsSummary@=N',Updated=TO_DATE('2013-07-24 10:17:27','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=2576 +; + +-- Jul 24, 2013 10:17:53 AM COT +-- IDEMPIERE-1187 in make menu window, when select "Summary Level", field "Window" still display +UPDATE AD_Field SET DisplayLogic='@Action@=T & @IsSummary@=N',Updated=TO_DATE('2013-07-24 10:17:53','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=208 +; + +-- Jul 24, 2013 10:18:05 AM COT +-- IDEMPIERE-1187 in make menu window, when select "Summary Level", field "Window" still display +UPDATE AD_Field SET DisplayLogic='@Action@=F & @IsSummary@=N',Updated=TO_DATE('2013-07-24 10:18:05','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=207 +; + +SELECT register_migration_script('20130724102515_IDEMPIERE-1187.sql') FROM dual +; diff --git a/migration/i1.0c-release/postgresql/20130724102515_IDEMPIERE-1187.sql b/migration/i1.0c-release/postgresql/20130724102515_IDEMPIERE-1187.sql new file mode 100644 index 0000000000..9ed5ce99fe --- /dev/null +++ b/migration/i1.0c-release/postgresql/20130724102515_IDEMPIERE-1187.sql @@ -0,0 +1,32 @@ +-- Jul 24, 2013 10:16:11 AM COT +-- IDEMPIERE-1187 in make menu window, when select "Summary Level", field "Window" still display +UPDATE AD_Field SET DisplayLogic='@Action@=W & @IsSummary@=N',Updated=TO_TIMESTAMP('2013-07-24 10:16:11','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=206 +; + +-- Jul 24, 2013 10:16:35 AM COT +-- IDEMPIERE-1187 in make menu window, when select "Summary Level", field "Window" still display +UPDATE AD_Field SET DisplayLogic='@Action@=X & @IsSummary@=N',Updated=TO_TIMESTAMP('2013-07-24 10:16:35','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=3612 +; + +-- Jul 24, 2013 10:16:48 AM COT +-- IDEMPIERE-1187 in make menu window, when select "Summary Level", field "Window" still display +UPDATE AD_Field SET DisplayLogic='@Action@=I & @IsSummary@=N',Updated=TO_TIMESTAMP('2013-07-24 10:16:48','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=201638 +; + +-- Jul 24, 2013 10:17:27 AM COT +-- IDEMPIERE-1187 in make menu window, when select "Summary Level", field "Window" still display +UPDATE AD_Field SET DisplayLogic='@Action@=P | @Action@=R & @IsSummary@=N',Updated=TO_TIMESTAMP('2013-07-24 10:17:27','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=2576 +; + +-- Jul 24, 2013 10:17:53 AM COT +-- IDEMPIERE-1187 in make menu window, when select "Summary Level", field "Window" still display +UPDATE AD_Field SET DisplayLogic='@Action@=T & @IsSummary@=N',Updated=TO_TIMESTAMP('2013-07-24 10:17:53','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=208 +; + +-- Jul 24, 2013 10:18:05 AM COT +-- IDEMPIERE-1187 in make menu window, when select "Summary Level", field "Window" still display +UPDATE AD_Field SET DisplayLogic='@Action@=F & @IsSummary@=N',Updated=TO_TIMESTAMP('2013-07-24 10:18:05','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=207 +; + +SELECT register_migration_script('20130724102515_IDEMPIERE-1187.sql') FROM dual +; \ No newline at end of file From f4556324ad0720d393ff2767326e6de0dc1abb68 Mon Sep 17 00:00:00 2001 From: Elaine Tan Date: Tue, 30 Jul 2013 12:08:56 +0800 Subject: [PATCH 02/12] IDEMPIERE-840 Improvement to Request model class - Using OSGi event instead of model validator --- .../oracle/201307301144_IDEMPIERE-840.sql | 7 + .../postgresql/201307301144_IDEMPIERE-840.sql | 7 + .../OSGI-INF/requesteventhandler.xml | 6 + org.adempiere.base/build.properties | 1 + .../adempiere/base/event/IEventTopics.java | 2 + .../base/event/RequestEventHandler.java | 407 ++++++++++++++++++ .../org/compiere/model/RequestValidator.java | 368 +--------------- 7 files changed, 431 insertions(+), 367 deletions(-) create mode 100644 migration/i1.0c-release/oracle/201307301144_IDEMPIERE-840.sql create mode 100644 migration/i1.0c-release/postgresql/201307301144_IDEMPIERE-840.sql create mode 100644 org.adempiere.base/OSGI-INF/requesteventhandler.xml create mode 100644 org.adempiere.base/src/org/adempiere/base/event/RequestEventHandler.java diff --git a/migration/i1.0c-release/oracle/201307301144_IDEMPIERE-840.sql b/migration/i1.0c-release/oracle/201307301144_IDEMPIERE-840.sql new file mode 100644 index 0000000000..2032a4f8a4 --- /dev/null +++ b/migration/i1.0c-release/oracle/201307301144_IDEMPIERE-840.sql @@ -0,0 +1,7 @@ +-- Jul 30, 2013 11:49:17 AM SGT +-- IDEMPIERE-840 Improvement to Request model class +UPDATE AD_ModelValidator SET IsActive='N',Updated=TO_DATE('2013-07-30 11:49:17','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_ModelValidator_ID=200003 +; + +SELECT register_migration_script('201307301144_IDEMPIERE-840.sql') FROM dual +; \ No newline at end of file diff --git a/migration/i1.0c-release/postgresql/201307301144_IDEMPIERE-840.sql b/migration/i1.0c-release/postgresql/201307301144_IDEMPIERE-840.sql new file mode 100644 index 0000000000..c61018980b --- /dev/null +++ b/migration/i1.0c-release/postgresql/201307301144_IDEMPIERE-840.sql @@ -0,0 +1,7 @@ +-- Jul 30, 2013 11:49:17 AM SGT +-- IDEMPIERE-840 Improvement to Request model class +UPDATE AD_ModelValidator SET IsActive='N',Updated=TO_TIMESTAMP('2013-07-30 11:49:17','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_ModelValidator_ID=200003 +; + +SELECT register_migration_script('201307301144_IDEMPIERE-840.sql') FROM dual +; \ No newline at end of file diff --git a/org.adempiere.base/OSGI-INF/requesteventhandler.xml b/org.adempiere.base/OSGI-INF/requesteventhandler.xml new file mode 100644 index 0000000000..25987bc891 --- /dev/null +++ b/org.adempiere.base/OSGI-INF/requesteventhandler.xml @@ -0,0 +1,6 @@ + + + + e.base.event.RequestSendEMailEventHandler"/> + + diff --git a/org.adempiere.base/build.properties b/org.adempiere.base/build.properties index e8a0395fc2..a8eb848631 100644 --- a/org.adempiere.base/build.properties +++ b/org.adempiere.base/build.properties @@ -28,6 +28,7 @@ bin.includes = META-INF/,\ OSGI-INF/defaultshipmentprocessorfactory.xml,\ OSGI-INF/defaultpaymentprocessorfactory.xml,\ OSGI-INF/broadcastutil.xml,\ + OSGI-INF/requesteventhandler.xml,\ schema/ output.base.jar = build/ src.includes = schema/ diff --git a/org.adempiere.base/src/org/adempiere/base/event/IEventTopics.java b/org.adempiere.base/src/org/adempiere/base/event/IEventTopics.java index cd372aaf2b..990590cead 100644 --- a/org.adempiere.base/src/org/adempiere/base/event/IEventTopics.java +++ b/org.adempiere.base/src/org/adempiere/base/event/IEventTopics.java @@ -92,5 +92,7 @@ public interface IEventTopics { public static final String PREF_AFTER_LOAD = "adempiere/pref/afterLoad"; public static final String BROADCAST_MESSAGE = "idempiere/broadcastMsg"; + + public static final String REQUEST_SEND_EMAIL = "idempiere/requestSendEMail"; } diff --git a/org.adempiere.base/src/org/adempiere/base/event/RequestEventHandler.java b/org.adempiere.base/src/org/adempiere/base/event/RequestEventHandler.java new file mode 100644 index 0000000000..bcba0ac4bf --- /dev/null +++ b/org.adempiere.base/src/org/adempiere/base/event/RequestEventHandler.java @@ -0,0 +1,407 @@ +/****************************************************************************** + * Copyright (C) 2013 Nur Yasmin * + * Copyright (C) 2013 Trek Global + * 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.base.event; + +import static org.compiere.model.SystemIDs.MESSAGE_REQUESTUPDATE; + +import java.io.File; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.logging.Level; + +import org.adempiere.exceptions.DBException; +import org.compiere.model.I_R_Request; +import org.compiere.model.MClient; +import org.compiere.model.MNote; +import org.compiere.model.MRequest; +import org.compiere.model.MRequestAction; +import org.compiere.model.MRequestUpdate; +import org.compiere.model.MUser; +import org.compiere.model.PO; +import org.compiere.model.X_AD_User; +import org.compiere.model.X_R_Request; +import org.compiere.util.CLogger; +import org.compiere.util.DB; +import org.compiere.util.Env; +import org.compiere.util.Msg; +import org.osgi.service.event.Event; + +/** + * Request event handler + * @author Nur Yasmin + * + */ +public class RequestEventHandler extends AbstractEventHandler +{ + private static CLogger s_log = CLogger.getCLogger (RequestEventHandler.class); + + @Override + protected void doHandleEvent(Event event) + { + String topic = event.getTopic(); + if (topic.equals(IEventTopics.REQUEST_SEND_EMAIL)) + { + RequestSendEMailEventData eventData = (RequestSendEMailEventData) event.getProperty(EventManager.EVENT_DATA); + if (!eventData.getClient().sendEMail(eventData.getFrom(), eventData.getTo(), eventData.getSubject(), eventData.getMessage(), eventData.getAttachment())) + { + int AD_Message_ID = MESSAGE_REQUESTUPDATE; + MNote note = new MNote(Env.getCtx(), AD_Message_ID, eventData.getTo().getAD_User_ID(), + X_R_Request.Table_ID, eventData.getRequestID(), + eventData.getSubject(), eventData.getMessage(), null); + note.save(); + } + } + else if (topic.equals(IEventTopics.PO_BEFORE_NEW) || topic.equals(IEventTopics.PO_BEFORE_CHANGE) + || topic.equals(IEventTopics.PO_AFTER_NEW) || topic.equals(IEventTopics.PO_AFTER_CHANGE)) + { + PO po = getPO(event); + if (po.get_TableName().equals(I_R_Request.Table_Name)) + { + MRequest r = (MRequest) po; + if (topic.equals(IEventTopics.PO_BEFORE_NEW) || topic.equals(IEventTopics.PO_BEFORE_CHANGE)) + beforeSaveRequest(r, topic.equals(IEventTopics.PO_BEFORE_NEW)); + else if (topic.equals(IEventTopics.PO_AFTER_NEW) || topic.equals(IEventTopics.PO_AFTER_CHANGE)) + afterSaveRequest(r, topic.equals(IEventTopics.PO_AFTER_NEW)); + } + } + } + + @Override + protected void initialize() + { + registerEvent(IEventTopics.REQUEST_SEND_EMAIL); + registerTableEvent(IEventTopics.PO_BEFORE_NEW, I_R_Request.Table_Name); + registerTableEvent(IEventTopics.PO_BEFORE_CHANGE, I_R_Request.Table_Name); + registerTableEvent(IEventTopics.PO_AFTER_NEW, I_R_Request.Table_Name); + registerTableEvent(IEventTopics.PO_AFTER_CHANGE, I_R_Request.Table_Name); + } + + public static String beforeSaveRequest(MRequest r, boolean newRecord) + { + // New + if (newRecord) + return null; + + // Change Log + r.setIsChanged(false); + ArrayList sendInfo = new ArrayList(); + MRequestAction ra = new MRequestAction(r, false); + // + if (checkChange(r, ra, "R_RequestType_ID")) + sendInfo.add("R_RequestType_ID"); + if (checkChange(r, ra, "R_Group_ID")) + sendInfo.add("R_Group_ID"); + if (checkChange(r, ra, "R_Category_ID")) + sendInfo.add("R_Category_ID"); + if (checkChange(r, ra, "R_Status_ID")) + sendInfo.add("R_Status_ID"); + if (checkChange(r, ra, "R_Resolution_ID")) + sendInfo.add("R_Resolution_ID"); + // + if (checkChange(r, ra, "SalesRep_ID")) + { + // Sender + int AD_User_ID = Env.getContextAsInt(r.getCtx(), "#AD_User_ID"); + if (AD_User_ID == 0) + AD_User_ID = r.getUpdatedBy(); + // Old + Object oo = r.get_ValueOld("SalesRep_ID"); + int oldSalesRep_ID = 0; + if (oo instanceof Integer) + oldSalesRep_ID = ((Integer)oo).intValue(); + if (oldSalesRep_ID != 0) + { + // RequestActionTransfer - Request {0} was transfered by {1} from {2} to {3} + Object[] args = new Object[] {r.getDocumentNo(), + MUser.getNameOfUser(AD_User_ID), + MUser.getNameOfUser(oldSalesRep_ID), + MUser.getNameOfUser(r.getSalesRep_ID()) + }; + String msg = Msg.getMsg(r.getCtx(), "RequestActionTransfer", args); + r.addToResult(msg); + sendInfo.add("SalesRep_ID"); + } + } + checkChange(r, ra, "AD_Role_ID"); + // + checkChange(r, ra, "Priority"); + if (checkChange(r, ra, "PriorityUser")) + sendInfo.add("PriorityUser"); + if (checkChange(r, ra, "IsEscalated")) + sendInfo.add("IsEscalated"); + // + checkChange(r, ra, "ConfidentialType"); + checkChange(r, ra, "Summary"); + checkChange(r, ra, "IsSelfService"); + checkChange(r, ra, "C_BPartner_ID"); + checkChange(r, ra, "AD_User_ID"); + checkChange(r, ra, "C_Project_ID"); + checkChange(r, ra, "A_Asset_ID"); + checkChange(r, ra, "C_Order_ID"); + checkChange(r, ra, "C_Invoice_ID"); + checkChange(r, ra, "M_Product_ID"); + checkChange(r, ra, "C_Payment_ID"); + checkChange(r, ra, "M_InOut_ID"); + checkChange(r, ra, "M_RMA_ID"); + // checkChange(ra, "C_Campaign_ID"); + // checkChange(ra, "RequestAmt"); + checkChange(r, ra, "IsInvoiced"); + checkChange(r, ra, "C_Activity_ID"); + checkChange(r, ra, "DateNextAction"); + checkChange(r, ra, "M_ProductSpent_ID"); + checkChange(r, ra, "QtySpent"); + checkChange(r, ra, "QtyInvoiced"); + checkChange(r, ra, "StartDate"); + checkChange(r, ra, "CloseDate"); + checkChange(r, ra, "TaskStatus"); + checkChange(r, ra, "DateStartPlan"); + checkChange(r, ra, "DateCompletePlan"); + // + if (r.is_Changed()) + ra.saveEx(); + + // Current Info + MRequestUpdate update = new MRequestUpdate(r); + if (update.isNewInfo()) + update.saveEx(); + else + update = null; + // + if (update != null || sendInfo.size() > 0) + { + // Note that calling the notifications from beforeSave is causing the + // new interested are not notified if the RV_RequestUpdates view changes + // this is, when changed the sales rep (solved in sendNotices) + // or when changed the request category or group or contact (unsolved - the old ones are notified) + sendNotices(r, sendInfo); + + // Update + r.setDateLastAction(r.getUpdated()); + r.setLastResult(r.getResult()); + r.setDueType(); + // Reset + r.setConfidentialTypeEntry (r.getConfidentialType()); + // r.setStartDate(null); //red1 - bug [ 1743159 ] Requests - Start Date is not retained. + r.setEndTime(null); + r.setR_StandardResponse_ID(0); + r.setR_MailText_ID(0); + r.setResult(null); + // globalqss - these fields must be cleared (waiting to open bug in sf) + // r.setM_ProductSpent_ID(0); + // r.setQtySpent(null); + // r.setQtyInvoiced(null); + } + + return null; + } + + public static String afterSaveRequest(MRequest r, boolean newRecord) + { + // Initial Mail + if (newRecord) + sendNotices(r, new ArrayList()); + + return null; + } + + /** + * Check for changes + * @param ra request action + * @param columnName column + * @return true if changes + */ + public static boolean checkChange (MRequest r, MRequestAction ra, String columnName) + { + if (r.is_ValueChanged(columnName)) + { + Object value = r.get_ValueOld(columnName); + if (value == null) + ra.addNullColumn(columnName); + else + ra.set_ValueNoCheck(columnName, value); + r.setIsChanged(true); + return true; + } + return false; + } // checkChange + + /** + * Send Update EMail/Notices + * @param list list of changes + */ + public static void sendNotices(MRequest r, ArrayList list) + { + // Subject + String subject = Msg.translate(r.getCtx(), "R_Request_ID") + + " " + Msg.getMsg(r.getCtx(), "Updated") + ": " + r.getDocumentNo(); + // Message + StringBuilder message = new StringBuilder(); + // UpdatedBy: Joe + int UpdatedBy = Env.getAD_User_ID(r.getCtx()); + MUser from = MUser.get(r.getCtx(), UpdatedBy); + if (from != null) + message.append(Msg.translate(r.getCtx(), "UpdatedBy")).append(": ") + .append(from.getName()); + // LastAction/Created: ... + if (r.getDateLastAction() != null) + message.append("\n").append(Msg.translate(r.getCtx(), "DateLastAction")) + .append(": ").append(r.getDateLastAction()); + else + message.append("\n").append(Msg.translate(r.getCtx(), "Created")) + .append(": ").append(r.getCreated()); + // Changes + for (int i = 0; i < list.size(); i++) + { + String columnName = (String)list.get(i); + message.append("\n").append(Msg.getElement(r.getCtx(), columnName)) + .append(": ").append(r.get_DisplayValue(columnName, false)) + .append(" -> ").append(r.get_DisplayValue(columnName, true)); + } + // NextAction + if (r.getDateNextAction() != null) + message.append("\n").append(Msg.translate(r.getCtx(), "DateNextAction")) + .append(": ").append(r.getDateNextAction()); + message.append(MRequest.SEPARATOR) + .append(r.getSummary()); + if (r.getResult() != null) + message.append("\n----------\n").append(r.getResult()); + message.append(getMailTrailer(r, null)); + File pdf = r.createPDF(); + if (s_log.isLoggable(Level.FINER)) s_log.finer(message.toString()); + + // Prepare sending Notice/Mail + MClient client = MClient.get(r.getCtx()); + // Reset from if external + if (from.getEMailUser() == null || from.getEMailUserPW() == null) + from = null; + // + ArrayList userList = new ArrayList(); + final String sql = "SELECT u.AD_User_ID, u.NotificationType, u.EMail, u.Name, MAX(r.AD_Role_ID) " + + "FROM RV_RequestUpdates_Only ru" + + " INNER JOIN AD_User u ON (ru.AD_User_ID=u.AD_User_ID OR u.AD_User_ID=?)" + + " LEFT OUTER JOIN AD_User_Roles r ON (u.AD_User_ID=r.AD_User_ID) " + + "WHERE ru.R_Request_ID=? " + + "GROUP BY u.AD_User_ID, u.NotificationType, u.EMail, u.Name"; + PreparedStatement pstmt = null; + ResultSet rs = null; + try + { + pstmt = DB.prepareStatement (sql, r.get_TrxName()); + pstmt.setInt (1, r.getSalesRep_ID()); + pstmt.setInt (2, r.getR_Request_ID()); + rs = pstmt.executeQuery (); + while (rs.next ()) + { + int AD_User_ID = rs.getInt(1); + String NotificationType = rs.getString(2); + if (NotificationType == null) + NotificationType = X_AD_User.NOTIFICATIONTYPE_EMail; + String email = rs.getString(3); + String Name = rs.getString(4); + // Role + int AD_Role_ID = rs.getInt(5); + if (rs.wasNull()) + AD_Role_ID = -1; + + // Don't send mail to oneself + // if (AD_User_ID == UpdatedBy) + // continue; + + // No confidential to externals + if (AD_Role_ID == -1 + && (r.getConfidentialTypeEntry().equals(MRequest.CONFIDENTIALTYPE_Internal) + || r.getConfidentialTypeEntry().equals(MRequest.CONFIDENTIALTYPE_PrivateInformation))) + continue; + + if (X_AD_User.NOTIFICATIONTYPE_None.equals(NotificationType)) + { + if (s_log.isLoggable(Level.CONFIG)) s_log.config("Opt out: " + Name); + continue; + } + if ((X_AD_User.NOTIFICATIONTYPE_EMail.equals(NotificationType) + || X_AD_User.NOTIFICATIONTYPE_EMailPlusNotice.equals(NotificationType)) + && (email == null || email.length() == 0)) + { + if (AD_Role_ID >= 0) + NotificationType = X_AD_User.NOTIFICATIONTYPE_Notice; + else + { + if (s_log.isLoggable(Level.CONFIG)) s_log.config("No EMail: " + Name); + continue; + } + } + if (X_AD_User.NOTIFICATIONTYPE_Notice.equals(NotificationType) + && AD_Role_ID >= 0) + { + if (s_log.isLoggable(Level.CONFIG)) s_log.config("No internal User: " + Name); + continue; + } + + // Check duplicate receivers + Integer ii = new Integer (AD_User_ID); + if (userList.contains(ii)) + continue; + userList.add(ii); + // + MUser to = MUser.get (r.getCtx(), AD_User_ID); + // Send Mail + if (X_AD_User.NOTIFICATIONTYPE_EMail.equals(NotificationType) + || X_AD_User.NOTIFICATIONTYPE_EMailPlusNotice.equals(NotificationType)) + { + RequestSendEMailEventData eventData = new RequestSendEMailEventData(client, from, to, subject, message.toString(), pdf, r.getR_Request_ID()); + Event event = EventManager.newEvent(IEventTopics.REQUEST_SEND_EMAIL, eventData); + EventManager.getInstance().postEvent(event); + } + // Send Note + if (X_AD_User.NOTIFICATIONTYPE_Notice.equals(NotificationType) + || X_AD_User.NOTIFICATIONTYPE_EMailPlusNotice.equals(NotificationType)) + { + int AD_Message_ID = MESSAGE_REQUESTUPDATE; + MNote note = new MNote(r.getCtx(), AD_Message_ID, AD_User_ID, + X_R_Request.Table_ID, r.getR_Request_ID(), + subject, message.toString(), r.get_TrxName()); + note.save(); + } + } + } + catch (SQLException e) + { + throw new DBException(e, sql); + } + finally + { + DB.close(rs, pstmt); + rs = null; pstmt = null; + } + } // sendNotice + + /************************************************************************** + * Get MailID + * @param serverAddress server address + * @return Mail Trailer + */ + public static String getMailTrailer(MRequest r, String serverAddress) + { + StringBuffer sb = new StringBuffer("\n").append(MRequest.SEPARATOR) + .append(Msg.translate(r.getCtx(), "R_Request_ID")) + .append(": ").append(r.getDocumentNo()) + .append(" ").append(r.getMailTag()) + .append("\nSent by AdempiereMail"); + if (serverAddress != null) + sb.append(" from ").append(serverAddress); + return sb.toString(); + } // getMailTrailer +} diff --git a/org.adempiere.base/src/org/compiere/model/RequestValidator.java b/org.adempiere.base/src/org/compiere/model/RequestValidator.java index 260283b2f4..bca5aaa40d 100644 --- a/org.adempiere.base/src/org/compiere/model/RequestValidator.java +++ b/org.adempiere.base/src/org/compiere/model/RequestValidator.java @@ -14,36 +14,14 @@ package org.compiere.model; -import static org.compiere.model.SystemIDs.MESSAGE_REQUESTUPDATE; - -import java.io.File; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.logging.Level; - -import org.adempiere.base.event.EventManager; -import org.adempiere.base.event.RequestSendEMailEventData; -import org.adempiere.exceptions.DBException; -import org.compiere.util.CLogger; -import org.compiere.util.DB; -import org.compiere.util.Env; -import org.compiere.util.Msg; -import org.osgi.service.event.Event; -import org.osgi.service.event.EventHandler; /** * * @author Elaine * */ -public class RequestValidator implements ModelValidator, EventHandler +public class RequestValidator implements ModelValidator { - public static final String ON_REQUEST_SEND_EMAIL_TOPIC = "onRequestSendEMail"; - - private static CLogger s_log = CLogger.getCLogger (RequestValidator.class); - private int m_AD_Client_ID; @Override @@ -51,10 +29,6 @@ public class RequestValidator implements ModelValidator, EventHandler { if (client != null) m_AD_Client_ID = client.getAD_Client_ID(); - engine.addModelChange(I_R_Request.Table_Name, this); - - if (EventManager.getInstance() != null) - EventManager.getInstance().register(ON_REQUEST_SEND_EMAIL_TOPIC, this); } @Override @@ -72,14 +46,6 @@ public class RequestValidator implements ModelValidator, EventHandler @Override public String modelChange(PO po, int type) throws Exception { - if (po instanceof MRequest ) - { - MRequest r = (MRequest) po; - if (type == TYPE_BEFORE_NEW || type == TYPE_BEFORE_CHANGE) - beforeSaveRequest(r, type == TYPE_BEFORE_NEW); - else if (type == TYPE_AFTER_NEW || type == TYPE_AFTER_CHANGE) - afterSaveRequest(r, type == TYPE_AFTER_NEW); - } return null; } @@ -88,336 +54,4 @@ public class RequestValidator implements ModelValidator, EventHandler { return null; } - - public static String beforeSaveRequest(MRequest r, boolean newRecord) - { - // New - if (newRecord) - return null; - - // Change Log - r.setIsChanged(false); - ArrayList sendInfo = new ArrayList(); - MRequestAction ra = new MRequestAction(r, false); - // - if (checkChange(r, ra, "R_RequestType_ID")) - sendInfo.add("R_RequestType_ID"); - if (checkChange(r, ra, "R_Group_ID")) - sendInfo.add("R_Group_ID"); - if (checkChange(r, ra, "R_Category_ID")) - sendInfo.add("R_Category_ID"); - if (checkChange(r, ra, "R_Status_ID")) - sendInfo.add("R_Status_ID"); - if (checkChange(r, ra, "R_Resolution_ID")) - sendInfo.add("R_Resolution_ID"); - // - if (checkChange(r, ra, "SalesRep_ID")) - { - // Sender - int AD_User_ID = Env.getContextAsInt(r.getCtx(), "#AD_User_ID"); - if (AD_User_ID == 0) - AD_User_ID = r.getUpdatedBy(); - // Old - Object oo = r.get_ValueOld("SalesRep_ID"); - int oldSalesRep_ID = 0; - if (oo instanceof Integer) - oldSalesRep_ID = ((Integer)oo).intValue(); - if (oldSalesRep_ID != 0) - { - // RequestActionTransfer - Request {0} was transfered by {1} from {2} to {3} - Object[] args = new Object[] {r.getDocumentNo(), - MUser.getNameOfUser(AD_User_ID), - MUser.getNameOfUser(oldSalesRep_ID), - MUser.getNameOfUser(r.getSalesRep_ID()) - }; - String msg = Msg.getMsg(r.getCtx(), "RequestActionTransfer", args); - r.addToResult(msg); - sendInfo.add("SalesRep_ID"); - } - } - checkChange(r, ra, "AD_Role_ID"); - // - checkChange(r, ra, "Priority"); - if (checkChange(r, ra, "PriorityUser")) - sendInfo.add("PriorityUser"); - if (checkChange(r, ra, "IsEscalated")) - sendInfo.add("IsEscalated"); - // - checkChange(r, ra, "ConfidentialType"); - checkChange(r, ra, "Summary"); - checkChange(r, ra, "IsSelfService"); - checkChange(r, ra, "C_BPartner_ID"); - checkChange(r, ra, "AD_User_ID"); - checkChange(r, ra, "C_Project_ID"); - checkChange(r, ra, "A_Asset_ID"); - checkChange(r, ra, "C_Order_ID"); - checkChange(r, ra, "C_Invoice_ID"); - checkChange(r, ra, "M_Product_ID"); - checkChange(r, ra, "C_Payment_ID"); - checkChange(r, ra, "M_InOut_ID"); - checkChange(r, ra, "M_RMA_ID"); - // checkChange(ra, "C_Campaign_ID"); - // checkChange(ra, "RequestAmt"); - checkChange(r, ra, "IsInvoiced"); - checkChange(r, ra, "C_Activity_ID"); - checkChange(r, ra, "DateNextAction"); - checkChange(r, ra, "M_ProductSpent_ID"); - checkChange(r, ra, "QtySpent"); - checkChange(r, ra, "QtyInvoiced"); - checkChange(r, ra, "StartDate"); - checkChange(r, ra, "CloseDate"); - checkChange(r, ra, "TaskStatus"); - checkChange(r, ra, "DateStartPlan"); - checkChange(r, ra, "DateCompletePlan"); - // - if (r.is_Changed()) - ra.saveEx(); - - // Current Info - MRequestUpdate update = new MRequestUpdate(r); - if (update.isNewInfo()) - update.saveEx(); - else - update = null; - // - if (update != null || sendInfo.size() > 0) - { - // Note that calling the notifications from beforeSave is causing the - // new interested are not notified if the RV_RequestUpdates view changes - // this is, when changed the sales rep (solved in sendNotices) - // or when changed the request category or group or contact (unsolved - the old ones are notified) - sendNotices(r, sendInfo); - - // Update - r.setDateLastAction(r.getUpdated()); - r.setLastResult(r.getResult()); - r.setDueType(); - // Reset - r.setConfidentialTypeEntry (r.getConfidentialType()); - // r.setStartDate(null); //red1 - bug [ 1743159 ] Requests - Start Date is not retained. - r.setEndTime(null); - r.setR_StandardResponse_ID(0); - r.setR_MailText_ID(0); - r.setResult(null); - // globalqss - these fields must be cleared (waiting to open bug in sf) - // r.setM_ProductSpent_ID(0); - // r.setQtySpent(null); - // r.setQtyInvoiced(null); - } - - return null; - } - - public static String afterSaveRequest(MRequest r, boolean newRecord) - { - // Initial Mail - if (newRecord) - sendNotices(r, new ArrayList()); - - return null; - } - - /** - * Check for changes - * @param ra request action - * @param columnName column - * @return true if changes - */ - public static boolean checkChange (MRequest r, MRequestAction ra, String columnName) - { - if (r.is_ValueChanged(columnName)) - { - Object value = r.get_ValueOld(columnName); - if (value == null) - ra.addNullColumn(columnName); - else - ra.set_ValueNoCheck(columnName, value); - r.setIsChanged(true); - return true; - } - return false; - } // checkChange - - /** - * Send Update EMail/Notices - * @param list list of changes - */ - public static void sendNotices(MRequest r, ArrayList list) - { - // Subject - String subject = Msg.translate(r.getCtx(), "R_Request_ID") - + " " + Msg.getMsg(r.getCtx(), "Updated") + ": " + r.getDocumentNo(); - // Message - StringBuilder message = new StringBuilder(); - // UpdatedBy: Joe - int UpdatedBy = Env.getAD_User_ID(r.getCtx()); - MUser from = MUser.get(r.getCtx(), UpdatedBy); - if (from != null) - message.append(Msg.translate(r.getCtx(), "UpdatedBy")).append(": ") - .append(from.getName()); - // LastAction/Created: ... - if (r.getDateLastAction() != null) - message.append("\n").append(Msg.translate(r.getCtx(), "DateLastAction")) - .append(": ").append(r.getDateLastAction()); - else - message.append("\n").append(Msg.translate(r.getCtx(), "Created")) - .append(": ").append(r.getCreated()); - // Changes - for (int i = 0; i < list.size(); i++) - { - String columnName = (String)list.get(i); - message.append("\n").append(Msg.getElement(r.getCtx(), columnName)) - .append(": ").append(r.get_DisplayValue(columnName, false)) - .append(" -> ").append(r.get_DisplayValue(columnName, true)); - } - // NextAction - if (r.getDateNextAction() != null) - message.append("\n").append(Msg.translate(r.getCtx(), "DateNextAction")) - .append(": ").append(r.getDateNextAction()); - message.append(MRequest.SEPARATOR) - .append(r.getSummary()); - if (r.getResult() != null) - message.append("\n----------\n").append(r.getResult()); - message.append(getMailTrailer(r, null)); - File pdf = r.createPDF(); - if (s_log.isLoggable(Level.FINER)) s_log.finer(message.toString()); - - // Prepare sending Notice/Mail - MClient client = MClient.get(r.getCtx()); - // Reset from if external - if (from.getEMailUser() == null || from.getEMailUserPW() == null) - from = null; - // - ArrayList userList = new ArrayList(); - final String sql = "SELECT u.AD_User_ID, u.NotificationType, u.EMail, u.Name, MAX(r.AD_Role_ID) " - + "FROM RV_RequestUpdates_Only ru" - + " INNER JOIN AD_User u ON (ru.AD_User_ID=u.AD_User_ID OR u.AD_User_ID=?)" - + " LEFT OUTER JOIN AD_User_Roles r ON (u.AD_User_ID=r.AD_User_ID) " - + "WHERE ru.R_Request_ID=? " - + "GROUP BY u.AD_User_ID, u.NotificationType, u.EMail, u.Name"; - PreparedStatement pstmt = null; - ResultSet rs = null; - try - { - pstmt = DB.prepareStatement (sql, r.get_TrxName()); - pstmt.setInt (1, r.getSalesRep_ID()); - pstmt.setInt (2, r.getR_Request_ID()); - rs = pstmt.executeQuery (); - while (rs.next ()) - { - int AD_User_ID = rs.getInt(1); - String NotificationType = rs.getString(2); - if (NotificationType == null) - NotificationType = X_AD_User.NOTIFICATIONTYPE_EMail; - String email = rs.getString(3); - String Name = rs.getString(4); - // Role - int AD_Role_ID = rs.getInt(5); - if (rs.wasNull()) - AD_Role_ID = -1; - - // Don't send mail to oneself - // if (AD_User_ID == UpdatedBy) - // continue; - - // No confidential to externals - if (AD_Role_ID == -1 - && (r.getConfidentialTypeEntry().equals(MRequest.CONFIDENTIALTYPE_Internal) - || r.getConfidentialTypeEntry().equals(MRequest.CONFIDENTIALTYPE_PrivateInformation))) - continue; - - if (X_AD_User.NOTIFICATIONTYPE_None.equals(NotificationType)) - { - if (s_log.isLoggable(Level.CONFIG)) s_log.config("Opt out: " + Name); - continue; - } - if ((X_AD_User.NOTIFICATIONTYPE_EMail.equals(NotificationType) - || X_AD_User.NOTIFICATIONTYPE_EMailPlusNotice.equals(NotificationType)) - && (email == null || email.length() == 0)) - { - if (AD_Role_ID >= 0) - NotificationType = X_AD_User.NOTIFICATIONTYPE_Notice; - else - { - if (s_log.isLoggable(Level.CONFIG)) s_log.config("No EMail: " + Name); - continue; - } - } - if (X_AD_User.NOTIFICATIONTYPE_Notice.equals(NotificationType) - && AD_Role_ID >= 0) - { - if (s_log.isLoggable(Level.CONFIG)) s_log.config("No internal User: " + Name); - continue; - } - - // Check duplicate receivers - Integer ii = new Integer (AD_User_ID); - if (userList.contains(ii)) - continue; - userList.add(ii); - // - MUser to = MUser.get (r.getCtx(), AD_User_ID); - // Send Mail - if (X_AD_User.NOTIFICATIONTYPE_EMail.equals(NotificationType) - || X_AD_User.NOTIFICATIONTYPE_EMailPlusNotice.equals(NotificationType)) - { - RequestSendEMailEventData eventData = new RequestSendEMailEventData(client, from, to, subject, message.toString(), pdf, r.getR_Request_ID()); - Event event = EventManager.newEvent(ON_REQUEST_SEND_EMAIL_TOPIC, eventData); - EventManager.getInstance().postEvent(event); - } - // Send Note - if (X_AD_User.NOTIFICATIONTYPE_Notice.equals(NotificationType) - || X_AD_User.NOTIFICATIONTYPE_EMailPlusNotice.equals(NotificationType)) - { - int AD_Message_ID = MESSAGE_REQUESTUPDATE; - MNote note = new MNote(r.getCtx(), AD_Message_ID, AD_User_ID, - X_R_Request.Table_ID, r.getR_Request_ID(), - subject, message.toString(), r.get_TrxName()); - note.save(); - } - } - } - catch (SQLException e) - { - throw new DBException(e, sql); - } - finally - { - DB.close(rs, pstmt); - rs = null; pstmt = null; - } - } // sendNotice - - /************************************************************************** - * Get MailID - * @param serverAddress server address - * @return Mail Trailer - */ - public static String getMailTrailer(MRequest r, String serverAddress) - { - StringBuffer sb = new StringBuffer("\n").append(MRequest.SEPARATOR) - .append(Msg.translate(r.getCtx(), "R_Request_ID")) - .append(": ").append(r.getDocumentNo()) - .append(" ").append(r.getMailTag()) - .append("\nSent by AdempiereMail"); - if (serverAddress != null) - sb.append(" from ").append(serverAddress); - return sb.toString(); - } // getMailTrailer - - @Override - public void handleEvent(Event event) { - if (event.getTopic() == ON_REQUEST_SEND_EMAIL_TOPIC) - { - RequestSendEMailEventData eventData = (RequestSendEMailEventData) event.getProperty(EventManager.EVENT_DATA); - if (!eventData.getClient().sendEMail(eventData.getFrom(), eventData.getTo(), eventData.getSubject(), eventData.getMessage(), eventData.getAttachment())) - { - int AD_Message_ID = MESSAGE_REQUESTUPDATE; - MNote note = new MNote(Env.getCtx(), AD_Message_ID, eventData.getTo().getAD_User_ID(), - X_R_Request.Table_ID, eventData.getRequestID(), - eventData.getSubject(), eventData.getMessage(), null); - note.save(); - } - } - } } From 1e27469b0f56feac1c23dc16bac685d18fdbbe66 Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Tue, 30 Jul 2013 13:19:20 +0800 Subject: [PATCH 03/12] IDEMPIERE-1218 Improve discovery of hazelcast configuration file. --- .../hazelcast/service/Activator.java | 48 ++++++++++++++----- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/org.idempiere.hazelcast.service/src/org/idempiere/hazelcast/service/Activator.java b/org.idempiere.hazelcast.service/src/org/idempiere/hazelcast/service/Activator.java index ad748f021e..d3e0f222e3 100644 --- a/org.idempiere.hazelcast.service/src/org/idempiere/hazelcast/service/Activator.java +++ b/org.idempiere.hazelcast.service/src/org/idempiere/hazelcast/service/Activator.java @@ -15,7 +15,6 @@ package org.idempiere.hazelcast.service; import java.io.File; import java.io.FileNotFoundException; -import java.net.MalformedURLException; import java.net.URL; import java.text.DateFormat; import java.util.Date; @@ -75,20 +74,45 @@ public class Activator implements BundleActivator { future = executor.submit(new Runnable() { @Override public void run() { - String dataArea = System.getProperty("osgi.install.area"); + File file = null; + //try idempiere home + String dataArea = System.getProperty("IDEMPIERE_HOME"); if (dataArea != null && dataArea.trim().length() > 0) { try { - URL url = new URL(dataArea); - File file = new File(url.getPath(), "hazelcast.xml"); - if (file.exists()) { - try { - Config config = new FileSystemXmlConfig(file); - hazelcastInstance = Hazelcast.newHazelcastInstance(config); - return; - } catch (FileNotFoundException e) {} - } - } catch (MalformedURLException e1) { + file = new File(dataArea, "hazelcast.xml"); + if (!file.exists()) + file = null; + } catch (Exception e) {} + } + //try working directory + if (file == null) { + dataArea = System.getProperty("user.dir"); + if (dataArea != null && dataArea.trim().length() > 0) { + try { + file = new File(dataArea, "hazelcast.xml"); + if (!file.exists()) + file = null; + } catch (Exception e) {} } + } + //try osgi install area + if (file == null) { + dataArea = System.getProperty("osgi.install.area"); + if (dataArea != null && dataArea.trim().length() > 0) { + try { + URL url = new URL(dataArea); + file = new File(url.getPath(), "hazelcast.xml"); + if (!file.exists()) + file = null; + } catch (Exception e) {} + } + } + if (file != null && file.exists()) { + try { + Config config = new FileSystemXmlConfig(file); + hazelcastInstance = Hazelcast.newHazelcastInstance(config); + return; + } catch (FileNotFoundException e) {} } hazelcastInstance = Hazelcast.newHazelcastInstance(null); } From b63c3777e13335f22825034b055cf65976549693 Mon Sep 17 00:00:00 2001 From: Elaine Tan Date: Tue, 30 Jul 2013 22:36:05 +0800 Subject: [PATCH 04/12] IDEMPIERE-840 Improvement to Request model class - Using OSGi event instead of model validator --- org.adempiere.base/META-INF/MANIFEST.MF | 1 + .../OSGI-INF/metatype/metatype.xml | 12 +++ .../OSGI-INF/requestpropertyservice.xml | 5 + .../OSGI-INF/requestservice.xml | 10 ++ org.adempiere.base/build.properties | 2 + .../base/event/RequestEventHandler.java | 41 ++++++-- .../base/event/RequestPropertyService.java | 96 +++++++++++++++++++ 7 files changed, 161 insertions(+), 6 deletions(-) create mode 100644 org.adempiere.base/OSGI-INF/metatype/metatype.xml create mode 100644 org.adempiere.base/OSGI-INF/requestpropertyservice.xml create mode 100644 org.adempiere.base/OSGI-INF/requestservice.xml create mode 100644 org.adempiere.base/src/org/adempiere/base/event/RequestPropertyService.java diff --git a/org.adempiere.base/META-INF/MANIFEST.MF b/org.adempiere.base/META-INF/MANIFEST.MF index 7da5699e0e..0bf65e808d 100644 --- a/org.adempiere.base/META-INF/MANIFEST.MF +++ b/org.adempiere.base/META-INF/MANIFEST.MF @@ -282,6 +282,7 @@ Import-Package: com.sun.mail.auth;version="1.4.5", org.eclipse.osgi.framework.console;version="1.1.0", org.eclipse.osgi.service.datalocation, org.osgi.framework, + org.osgi.service.cm;version="1.3.0", org.osgi.service.component;version="1.1.0", org.osgi.service.event;version="1.2.0", org.osgi.util.tracker;version="1.5.0", diff --git a/org.adempiere.base/OSGI-INF/metatype/metatype.xml b/org.adempiere.base/OSGI-INF/metatype/metatype.xml new file mode 100644 index 0000000000..e8c7360b9f --- /dev/null +++ b/org.adempiere.base/OSGI-INF/metatype/metatype.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/org.adempiere.base/OSGI-INF/requestpropertyservice.xml b/org.adempiere.base/OSGI-INF/requestpropertyservice.xml new file mode 100644 index 0000000000..88a264db5d --- /dev/null +++ b/org.adempiere.base/OSGI-INF/requestpropertyservice.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/org.adempiere.base/OSGI-INF/requestservice.xml b/org.adempiere.base/OSGI-INF/requestservice.xml new file mode 100644 index 0000000000..f471c6518d --- /dev/null +++ b/org.adempiere.base/OSGI-INF/requestservice.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/org.adempiere.base/build.properties b/org.adempiere.base/build.properties index a8eb848631..965833233d 100644 --- a/org.adempiere.base/build.properties +++ b/org.adempiere.base/build.properties @@ -29,6 +29,8 @@ bin.includes = META-INF/,\ OSGI-INF/defaultpaymentprocessorfactory.xml,\ OSGI-INF/broadcastutil.xml,\ OSGI-INF/requesteventhandler.xml,\ + OSGI-INF/requestservice.xml,\ + OSGI-INF/requestpropertyservice.xml,\ schema/ output.base.jar = build/ src.includes = schema/ diff --git a/org.adempiere.base/src/org/adempiere/base/event/RequestEventHandler.java b/org.adempiere.base/src/org/adempiere/base/event/RequestEventHandler.java index bcba0ac4bf..fa5faa40af 100644 --- a/org.adempiere.base/src/org/adempiere/base/event/RequestEventHandler.java +++ b/org.adempiere.base/src/org/adempiere/base/event/RequestEventHandler.java @@ -20,6 +20,8 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Dictionary; +import java.util.StringTokenizer; import java.util.logging.Level; import org.adempiere.exceptions.DBException; @@ -28,6 +30,7 @@ import org.compiere.model.MClient; import org.compiere.model.MNote; import org.compiere.model.MRequest; import org.compiere.model.MRequestAction; +import org.compiere.model.MRequestType; import org.compiere.model.MRequestUpdate; import org.compiere.model.MUser; import org.compiere.model.PO; @@ -37,6 +40,9 @@ import org.compiere.util.CLogger; import org.compiere.util.DB; import org.compiere.util.Env; import org.compiere.util.Msg; +import org.compiere.util.Util; +import org.osgi.service.cm.ConfigurationException; +import org.osgi.service.cm.ManagedService; import org.osgi.service.event.Event; /** @@ -44,7 +50,7 @@ import org.osgi.service.event.Event; * @author Nur Yasmin * */ -public class RequestEventHandler extends AbstractEventHandler +public class RequestEventHandler extends AbstractEventHandler implements ManagedService { private static CLogger s_log = CLogger.getCLogger (RequestEventHandler.class); @@ -71,6 +77,11 @@ public class RequestEventHandler extends AbstractEventHandler if (po.get_TableName().equals(I_R_Request.Table_Name)) { MRequest r = (MRequest) po; + + MRequestType rt = r.getRequestType(); + if (ignoreRequestTypes.contains(rt.getName())) + return; + if (topic.equals(IEventTopics.PO_BEFORE_NEW) || topic.equals(IEventTopics.PO_BEFORE_CHANGE)) beforeSaveRequest(r, topic.equals(IEventTopics.PO_BEFORE_NEW)); else if (topic.equals(IEventTopics.PO_AFTER_NEW) || topic.equals(IEventTopics.PO_AFTER_CHANGE)) @@ -89,7 +100,7 @@ public class RequestEventHandler extends AbstractEventHandler registerTableEvent(IEventTopics.PO_AFTER_CHANGE, I_R_Request.Table_Name); } - public static String beforeSaveRequest(MRequest r, boolean newRecord) + private String beforeSaveRequest(MRequest r, boolean newRecord) { // New if (newRecord) @@ -208,7 +219,7 @@ public class RequestEventHandler extends AbstractEventHandler return null; } - public static String afterSaveRequest(MRequest r, boolean newRecord) + private String afterSaveRequest(MRequest r, boolean newRecord) { // Initial Mail if (newRecord) @@ -223,7 +234,7 @@ public class RequestEventHandler extends AbstractEventHandler * @param columnName column * @return true if changes */ - public static boolean checkChange (MRequest r, MRequestAction ra, String columnName) + public boolean checkChange (MRequest r, MRequestAction ra, String columnName) { if (r.is_ValueChanged(columnName)) { @@ -242,7 +253,7 @@ public class RequestEventHandler extends AbstractEventHandler * Send Update EMail/Notices * @param list list of changes */ - public static void sendNotices(MRequest r, ArrayList list) + private void sendNotices(MRequest r, ArrayList list) { // Subject String subject = Msg.translate(r.getCtx(), "R_Request_ID") @@ -393,7 +404,7 @@ public class RequestEventHandler extends AbstractEventHandler * @param serverAddress server address * @return Mail Trailer */ - public static String getMailTrailer(MRequest r, String serverAddress) + private String getMailTrailer(MRequest r, String serverAddress) { StringBuffer sb = new StringBuffer("\n").append(MRequest.SEPARATOR) .append(Msg.translate(r.getCtx(), "R_Request_ID")) @@ -404,4 +415,22 @@ public class RequestEventHandler extends AbstractEventHandler sb.append(" from ").append(serverAddress); return sb.toString(); } // getMailTrailer + + public static final String IGNORE_REQUEST_TYPES = "ignoreRequestTypes"; + private static ArrayList ignoreRequestTypes = new ArrayList(); + + @SuppressWarnings("rawtypes") + @Override + public void updated(Dictionary properties) throws ConfigurationException { + if (properties != null) { + String p = (String) properties.get(IGNORE_REQUEST_TYPES); + if (!Util.isEmpty(p)) { + ignoreRequestTypes.clear(); + + StringTokenizer st = new StringTokenizer(p, ";"); + while (st.hasMoreTokens()) + ignoreRequestTypes.add(st.nextToken().trim()); + } + } + } } diff --git a/org.adempiere.base/src/org/adempiere/base/event/RequestPropertyService.java b/org.adempiere.base/src/org/adempiere/base/event/RequestPropertyService.java new file mode 100644 index 0000000000..1a5bcd5666 --- /dev/null +++ b/org.adempiere.base/src/org/adempiere/base/event/RequestPropertyService.java @@ -0,0 +1,96 @@ +/****************************************************************************** + * Copyright (C) 2013 Elaine * + * Copyright (C) 2013 Trek Global + * 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.base.event; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Dictionary; +import java.util.Hashtable; +import java.util.Properties; +import java.util.logging.Level; + +import org.adempiere.base.event.RequestEventHandler; +import org.compiere.util.CLogger; +import org.compiere.util.Ini; +import org.compiere.util.Util; +import org.osgi.framework.Bundle; +import org.osgi.framework.FrameworkUtil; +import org.osgi.service.cm.Configuration; +import org.osgi.service.cm.ConfigurationAdmin; + +/** + * Request property service + * @author Elaine + * + */ +public class RequestPropertyService { + + private static final String REQUESTEVENTHANDLER_PROPERTIES = "requesteventhandler.properties"; + + private static final CLogger logger = CLogger.getCLogger(RequestPropertyService.class); + + public RequestPropertyService() { + } + + public void bindConfigurationAdmin(ConfigurationAdmin configurationAdmin) { + readProperties(configurationAdmin); + } + + public void unbindConfigurationAdmin(ConfigurationAdmin configurationAdmin) { + + } + + private void readProperties(ConfigurationAdmin service) { + File file = new File(Ini.getAdempiereHome(), REQUESTEVENTHANDLER_PROPERTIES); + if (file.exists()) { + Properties p = new Properties(); + FileInputStream is = null; + try { + is = new FileInputStream(file); + p.load(is); + String ignoreRequesTypes = p.getProperty(RequestEventHandler.IGNORE_REQUEST_TYPES); + + if (!Util.isEmpty(ignoreRequesTypes)) { + Configuration configuration = service.getConfiguration("org.adempiere.base.event.request.service"); + if (configuration.getProperties() == null) { + Dictionary map = new Hashtable(); + map.put(RequestEventHandler.IGNORE_REQUEST_TYPES, ignoreRequesTypes); + configuration.update(map); + } else { + Bundle bundle = FrameworkUtil.getBundle(RequestEventHandler.class); + String bundleLocation = bundle.getLocation(); + String configLocation = configuration.getBundleLocation(); + if (!bundleLocation.equals(configLocation)) { + configuration.setBundleLocation(bundleLocation); + configuration.update(); + } + } + } + } catch (FileNotFoundException e) { + logger.log(Level.WARNING, REQUESTEVENTHANDLER_PROPERTIES + " not found.", e); + } catch (IOException e) { + logger.log(Level.SEVERE, "Error reading " + REQUESTEVENTHANDLER_PROPERTIES, e); + } finally { + if (is != null) { + try { + is.close(); + } catch (Exception ex) {} + } + } + } + } +} From cba6d77de7138d77c3b9cf0a3d12412e7f7e3a29 Mon Sep 17 00:00:00 2001 From: Elaine Tan Date: Tue, 30 Jul 2013 23:41:05 +0800 Subject: [PATCH 05/12] IDEMPIERE-840 Improvement to Request model class - Drop request validator --- .../oracle/201307302339_IDEMPIERE-840.sql | 7 +++ .../postgresql/201307302339_IDEMPIERE-840.sql | 7 +++ .../org/compiere/model/RequestValidator.java | 57 ------------------- 3 files changed, 14 insertions(+), 57 deletions(-) create mode 100644 migration/i1.0c-release/oracle/201307302339_IDEMPIERE-840.sql create mode 100644 migration/i1.0c-release/postgresql/201307302339_IDEMPIERE-840.sql delete mode 100644 org.adempiere.base/src/org/compiere/model/RequestValidator.java diff --git a/migration/i1.0c-release/oracle/201307302339_IDEMPIERE-840.sql b/migration/i1.0c-release/oracle/201307302339_IDEMPIERE-840.sql new file mode 100644 index 0000000000..a5424fd7a7 --- /dev/null +++ b/migration/i1.0c-release/oracle/201307302339_IDEMPIERE-840.sql @@ -0,0 +1,7 @@ +-- Jul 30, 2013 11:33:11 PM SGT +-- IDEMPIERE-840 Improvement to Request model class +DELETE FROM AD_ModelValidator WHERE AD_ModelValidator_ID=200003 +; + +SELECT register_migration_script('201307302339_IDEMPIERE-840.sql') FROM dual +; \ No newline at end of file diff --git a/migration/i1.0c-release/postgresql/201307302339_IDEMPIERE-840.sql b/migration/i1.0c-release/postgresql/201307302339_IDEMPIERE-840.sql new file mode 100644 index 0000000000..a5424fd7a7 --- /dev/null +++ b/migration/i1.0c-release/postgresql/201307302339_IDEMPIERE-840.sql @@ -0,0 +1,7 @@ +-- Jul 30, 2013 11:33:11 PM SGT +-- IDEMPIERE-840 Improvement to Request model class +DELETE FROM AD_ModelValidator WHERE AD_ModelValidator_ID=200003 +; + +SELECT register_migration_script('201307302339_IDEMPIERE-840.sql') FROM dual +; \ No newline at end of file diff --git a/org.adempiere.base/src/org/compiere/model/RequestValidator.java b/org.adempiere.base/src/org/compiere/model/RequestValidator.java deleted file mode 100644 index bca5aaa40d..0000000000 --- a/org.adempiere.base/src/org/compiere/model/RequestValidator.java +++ /dev/null @@ -1,57 +0,0 @@ -/****************************************************************************** - * Copyright (C) 2013 Elaine Tan * - * Copyright (C) 2013 Trek Global - * 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.compiere.model; - - -/** - * - * @author Elaine - * - */ -public class RequestValidator implements ModelValidator -{ - private int m_AD_Client_ID; - - @Override - public void initialize(ModelValidationEngine engine, MClient client) - { - if (client != null) - m_AD_Client_ID = client.getAD_Client_ID(); - } - - @Override - public int getAD_Client_ID() - { - return m_AD_Client_ID; - } - - @Override - public String login(int AD_Org_ID, int AD_Role_ID, int AD_User_ID) - { - return null; - } - - @Override - public String modelChange(PO po, int type) throws Exception - { - return null; - } - - @Override - public String docValidate(PO po, int timing) - { - return null; - } -} From bbfe58d4f0f67643715451d54cb4c0fbfeaeb7fd Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Tue, 30 Jul 2013 15:04:59 -0500 Subject: [PATCH 06/12] IDEMPIERE-1162 --- .../oracle/201307301502_IDEMPIERE-1162.sql | 25 +++++++++++++++++++ .../201307301502_IDEMPIERE-1162.sql | 25 +++++++++++++++++++ .../webui/panel/ResetPasswordPanel.java | 2 ++ 3 files changed, 52 insertions(+) create mode 100644 migration/i1.0c-release/oracle/201307301502_IDEMPIERE-1162.sql create mode 100644 migration/i1.0c-release/postgresql/201307301502_IDEMPIERE-1162.sql diff --git a/migration/i1.0c-release/oracle/201307301502_IDEMPIERE-1162.sql b/migration/i1.0c-release/oracle/201307301502_IDEMPIERE-1162.sql new file mode 100644 index 0000000000..dbf3ad9488 --- /dev/null +++ b/migration/i1.0c-release/oracle/201307301502_IDEMPIERE-1162.sql @@ -0,0 +1,25 @@ +-- Jul 30, 2013 3:02:24 PM COT +-- IDEMPIERE-1162 +UPDATE R_MailText SET MailText='Dear @Name@, + +You are receiving this email because you (or somebody pretending to be you) said you have lost your iDempiere password. + +To access your iDempiere, use the temporary password from @AD_Client_ID@ below: +@#NewPassword@ + +Once you login, you will be directed to change password screen. Please change your password to something you can remember. + +Sincerely, +The iDempiere Accounts Team + +Note: This email address cannot accept replies.',Updated=TO_DATE('2013-07-30 15:02:24','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=0 WHERE R_MailText_ID=200000 +; + +-- Jul 30, 2013 3:02:24 PM COT +-- IDEMPIERE-1162 +UPDATE R_MailText_Trl SET IsTranslated='N' WHERE R_MailText_ID=200000 +; + +SELECT register_migration_script('201307301502_IDEMPIERE-1162.sql') FROM dual +; + diff --git a/migration/i1.0c-release/postgresql/201307301502_IDEMPIERE-1162.sql b/migration/i1.0c-release/postgresql/201307301502_IDEMPIERE-1162.sql new file mode 100644 index 0000000000..82d04e05cc --- /dev/null +++ b/migration/i1.0c-release/postgresql/201307301502_IDEMPIERE-1162.sql @@ -0,0 +1,25 @@ +-- Jul 30, 2013 3:02:24 PM COT +-- IDEMPIERE-1162 +UPDATE R_MailText SET MailText='Dear @Name@, + +You are receiving this email because you (or somebody pretending to be you) said you have lost your iDempiere password. + +To access your iDempiere, use the temporary password from @AD_Client_ID@ below: +@#NewPassword@ + +Once you login, you will be directed to change password screen. Please change your password to something you can remember. + +Sincerely, +The iDempiere Accounts Team + +Note: This email address cannot accept replies.',Updated=TO_TIMESTAMP('2013-07-30 15:02:24','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=0 WHERE R_MailText_ID=200000 +; + +-- Jul 30, 2013 3:02:24 PM COT +-- IDEMPIERE-1162 +UPDATE R_MailText_Trl SET IsTranslated='N' WHERE R_MailText_ID=200000 +; + +SELECT register_migration_script('201307301502_IDEMPIERE-1162.sql') FROM dual +; + diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/ResetPasswordPanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/ResetPasswordPanel.java index 2e505968de..af42ab737f 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/ResetPasswordPanel.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/ResetPasswordPanel.java @@ -509,7 +509,9 @@ public class ResetPasswordPanel extends Window implements EventListener to.set_ValueOfColumn("Password", newPassword); // will be hashed and validate on saveEx mailText.setUser(to); String message = mailText.getMailText(true); + Env.setContext(m_ctx, "#NewPassword", newPassword); message = Env.parseVariable(message, to, to.get_TrxName(), true); + Env.setContext(m_ctx, "#NewPassword", ""); EMail email = client.createEMail(to.getEMail(), mailText.getMailHeader(), message, mailText.isHtml()); if (mailText.isHtml()) email.setMessageHTML(mailText.getMailHeader(), message); From 063b859619f80c397ba35569f75ab674c46e2e86 Mon Sep 17 00:00:00 2001 From: Elaine Tan Date: Wed, 31 Jul 2013 12:51:56 +0800 Subject: [PATCH 07/12] IDEMPIERE-1222 Folder should be removed as menu lookup option --- .../WEB-INF/src/org/adempiere/webui/panel/TreeSearchPanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/TreeSearchPanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/TreeSearchPanel.java index d2e6574e34..2f8728b8dc 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/TreeSearchPanel.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/TreeSearchPanel.java @@ -276,7 +276,7 @@ public class TreeSearchPanel extends Panel implements EventListener, Tree protected boolean isFolder(Treeitem treeItem) { List list = treeItem.getChildren(); for (Component c : list) { - if (c instanceof Treechildren && ((Treechildren)c).getChildren().size() > 1) { + if (c instanceof Treechildren && ((Treechildren)c).getChildren().size() > 0) { return true; } } From f5fb6f7d3705c0f48006b428f3cd11e1701058d9 Mon Sep 17 00:00:00 2001 From: Elaine Tan Date: Wed, 31 Jul 2013 14:29:52 +0800 Subject: [PATCH 08/12] IDEMPIERE-840 Improvement to Request model class - fix requesteventhandler.xml --- org.adempiere.base/OSGI-INF/requesteventhandler.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.adempiere.base/OSGI-INF/requesteventhandler.xml b/org.adempiere.base/OSGI-INF/requesteventhandler.xml index 25987bc891..c30b1cc2fd 100644 --- a/org.adempiere.base/OSGI-INF/requesteventhandler.xml +++ b/org.adempiere.base/OSGI-INF/requesteventhandler.xml @@ -1,6 +1,6 @@ - e.base.event.RequestSendEMailEventHandler"/> + From 92532db6de9e536926387d327b45c65f8cb168a2 Mon Sep 17 00:00:00 2001 From: Elaine Tan Date: Wed, 31 Jul 2013 15:31:58 +0800 Subject: [PATCH 09/12] IDEMPIERE-840 Improvement to Request model class - combine the requestservice.xml and requesteventhandler.xml into one. Use class name as the pid. --- org.adempiere.base/OSGI-INF/metatype/metatype.xml | 6 +++--- org.adempiere.base/OSGI-INF/requesteventhandler.xml | 10 +++++++--- org.adempiere.base/OSGI-INF/requestservice.xml | 10 ---------- org.adempiere.base/build.properties | 1 - .../adempiere/base/event/RequestPropertyService.java | 3 +-- 5 files changed, 11 insertions(+), 19 deletions(-) delete mode 100644 org.adempiere.base/OSGI-INF/requestservice.xml diff --git a/org.adempiere.base/OSGI-INF/metatype/metatype.xml b/org.adempiere.base/OSGI-INF/metatype/metatype.xml index e8c7360b9f..3fa5b331c1 100644 --- a/org.adempiere.base/OSGI-INF/metatype/metatype.xml +++ b/org.adempiere.base/OSGI-INF/metatype/metatype.xml @@ -1,12 +1,12 @@ - + - - + + \ No newline at end of file diff --git a/org.adempiere.base/OSGI-INF/requesteventhandler.xml b/org.adempiere.base/OSGI-INF/requesteventhandler.xml index c30b1cc2fd..f3d44317f0 100644 --- a/org.adempiere.base/OSGI-INF/requesteventhandler.xml +++ b/org.adempiere.base/OSGI-INF/requesteventhandler.xml @@ -1,6 +1,10 @@ - + - - + + + + + + \ No newline at end of file diff --git a/org.adempiere.base/OSGI-INF/requestservice.xml b/org.adempiere.base/OSGI-INF/requestservice.xml deleted file mode 100644 index f471c6518d..0000000000 --- a/org.adempiere.base/OSGI-INF/requestservice.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/org.adempiere.base/build.properties b/org.adempiere.base/build.properties index 965833233d..ba576364dc 100644 --- a/org.adempiere.base/build.properties +++ b/org.adempiere.base/build.properties @@ -29,7 +29,6 @@ bin.includes = META-INF/,\ OSGI-INF/defaultpaymentprocessorfactory.xml,\ OSGI-INF/broadcastutil.xml,\ OSGI-INF/requesteventhandler.xml,\ - OSGI-INF/requestservice.xml,\ OSGI-INF/requestpropertyservice.xml,\ schema/ output.base.jar = build/ diff --git a/org.adempiere.base/src/org/adempiere/base/event/RequestPropertyService.java b/org.adempiere.base/src/org/adempiere/base/event/RequestPropertyService.java index 1a5bcd5666..77a83920d0 100644 --- a/org.adempiere.base/src/org/adempiere/base/event/RequestPropertyService.java +++ b/org.adempiere.base/src/org/adempiere/base/event/RequestPropertyService.java @@ -23,7 +23,6 @@ import java.util.Hashtable; import java.util.Properties; import java.util.logging.Level; -import org.adempiere.base.event.RequestEventHandler; import org.compiere.util.CLogger; import org.compiere.util.Ini; import org.compiere.util.Util; @@ -65,7 +64,7 @@ public class RequestPropertyService { String ignoreRequesTypes = p.getProperty(RequestEventHandler.IGNORE_REQUEST_TYPES); if (!Util.isEmpty(ignoreRequesTypes)) { - Configuration configuration = service.getConfiguration("org.adempiere.base.event.request.service"); + Configuration configuration = service.getConfiguration(RequestEventHandler.class.getName()); if (configuration.getProperties() == null) { Dictionary map = new Hashtable(); map.put(RequestEventHandler.IGNORE_REQUEST_TYPES, ignoreRequesTypes); From 8d9a2ba66f41652a16920e53a56611d21b2ce94c Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Wed, 31 Jul 2013 16:30:15 +0800 Subject: [PATCH 10/12] IDEMPIERE-1223 Use ClassName as Name of OSGi component. --- org.adempiere.base/OSGI-INF/archivedb.xml | 2 +- org.adempiere.base/OSGI-INF/archivefile.xml | 2 +- org.adempiere.base/OSGI-INF/attachmentdb.xml | 2 +- org.adempiere.base/OSGI-INF/attachmentfile.xml | 2 +- org.adempiere.base/OSGI-INF/broadcastutil.xml | 2 +- org.adempiere.base/OSGI-INF/defaultcolumncalloutfactory.xml | 2 +- org.adempiere.base/OSGI-INF/defaultdocfactory.xml | 2 +- org.adempiere.base/OSGI-INF/defaultlookupfactory.xml | 2 +- org.adempiere.base/OSGI-INF/defaultmodelfactory.xml | 2 +- org.adempiere.base/OSGI-INF/defaultmodelvalidatorfactory.xml | 2 +- org.adempiere.base/OSGI-INF/defaultpaymentprocessorfactory.xml | 2 +- org.adempiere.base/OSGI-INF/defaultprocessfactory.xml | 2 +- org.adempiere.base/OSGI-INF/defaultshipmentprocessorfactory.xml | 2 +- org.adempiere.base/OSGI-INF/dslocator.xml | 2 +- org.adempiere.base/OSGI-INF/eventmanager.xml | 2 +- org.adempiere.base/OSGI-INF/keystore.xml | 2 +- org.adempiere.base/OSGI-INF/serverbean.xml | 2 +- org.adempiere.base/OSGI-INF/statusbean.xml | 2 +- org.adempiere.pipo/OSGI-INF/dictionaryservice.xml | 2 +- org.adempiere.replication.server/OSGI-INF/serverfactory.xml | 2 +- org.adempiere.report.jasper.swing/OSGI-INF/jrviewerprovider.xml | 2 +- org.adempiere.server/OSGI-INF/acctprocessorfactory.xml | 2 +- org.adempiere.server/OSGI-INF/alertprocessorfactory.xml | 2 +- org.adempiere.server/OSGI-INF/ldapprocessorfactory.xml | 2 +- org.adempiere.server/OSGI-INF/requestprocessorfactory.xml | 2 +- org.adempiere.server/OSGI-INF/schedulerfactory.xml | 2 +- org.adempiere.server/OSGI-INF/workflowprocessorfactory.xml | 2 +- org.adempiere.ui.swing/OSGI-INF/defaultcreatefromfactory.xml | 2 +- org.adempiere.ui.swing/OSGI-INF/defaulteditorfactory.xml | 2 +- org.adempiere.ui.swing/OSGI-INF/defaultformfactory.xml | 2 +- org.adempiere.ui.swing/OSGI-INF/defaultinfofactory.xml | 2 +- org.adempiere.ui.swing/OSGI-INF/defaultpaymentformfactory.xml | 2 +- org.adempiere.ui.swing/OSGI-INF/defaultprintshippinglabel.xml | 2 +- org.adempiere.ui.swing/OSGI-INF/reportviewerprovider.xml | 2 +- org.adempiere.ui.swing/OSGI-INF/resourcefinder.xml | 2 +- org.adempiere.ui.swing/OSGI-INF/serverinterface.xml | 2 +- org.adempiere.ui.swing/OSGI-INF/statusinterface.xml | 2 +- org.adempiere.ui.zk/OSGI-INF/defaultcreatefromfactory.xml | 2 +- org.adempiere.ui.zk/OSGI-INF/defaulteditorfactory.xml | 2 +- org.adempiere.ui.zk/OSGI-INF/defaultformfactory.xml | 2 +- org.adempiere.ui.zk/OSGI-INF/defaultinfofactory.xml | 2 +- org.adempiere.ui.zk/OSGI-INF/defaultpaymentformfactory.xml | 2 +- org.adempiere.ui.zk/OSGI-INF/defaultprintshippinglabel.xml | 2 +- org.adempiere.ui.zk/OSGI-INF/feedbackservice.xml | 2 +- org.adempiere.ui.zk/OSGI-INF/jrviewerprovider.xml | 2 +- org.adempiere.ui.zk/OSGI-INF/processfactory.xml | 2 +- org.adempiere.ui.zk/OSGI-INF/reportviewerprovider.xml | 2 +- org.adempiere.ui.zk/OSGI-INF/resourcefinder.xml | 2 +- org.compiere.db.oracle.provider/OSGI-INF/oracleprovider.xml | 2 +- org.compiere.db.postgresql.provider/OSGI-INF/pgprovider.xml | 2 +- org.idempiere.fitnesse.fixture/OSGI-INF/fitfixturefactory.xml | 2 +- org.idempiere.fitnesse.fixture/OSGI-INF/slimfixturefactory.xml | 2 +- org.idempiere.hazelcast.service/OSGI-INF/cacheservice.xml | 2 +- org.idempiere.hazelcast.service/OSGI-INF/clusterservice.xml | 2 +- org.idempiere.hazelcast.service/OSGI-INF/messageservice.xml | 2 +- org.idempiere.ui.zk.selenium/OSGI-INF/fitfixturefactory.xml | 2 +- 56 files changed, 56 insertions(+), 56 deletions(-) diff --git a/org.adempiere.base/OSGI-INF/archivedb.xml b/org.adempiere.base/OSGI-INF/archivedb.xml index 6f526e94a3..589bbcd8e1 100644 --- a/org.adempiere.base/OSGI-INF/archivedb.xml +++ b/org.adempiere.base/OSGI-INF/archivedb.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.base/OSGI-INF/archivefile.xml b/org.adempiere.base/OSGI-INF/archivefile.xml index 8db2274033..de71448ee3 100644 --- a/org.adempiere.base/OSGI-INF/archivefile.xml +++ b/org.adempiere.base/OSGI-INF/archivefile.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.base/OSGI-INF/attachmentdb.xml b/org.adempiere.base/OSGI-INF/attachmentdb.xml index 9a8be1e7b0..8675d48cf3 100644 --- a/org.adempiere.base/OSGI-INF/attachmentdb.xml +++ b/org.adempiere.base/OSGI-INF/attachmentdb.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.base/OSGI-INF/attachmentfile.xml b/org.adempiere.base/OSGI-INF/attachmentfile.xml index f04bf80d2f..3e4ec76687 100644 --- a/org.adempiere.base/OSGI-INF/attachmentfile.xml +++ b/org.adempiere.base/OSGI-INF/attachmentfile.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.base/OSGI-INF/broadcastutil.xml b/org.adempiere.base/OSGI-INF/broadcastutil.xml index e45b0789e2..1aaa64030e 100644 --- a/org.adempiere.base/OSGI-INF/broadcastutil.xml +++ b/org.adempiere.base/OSGI-INF/broadcastutil.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.base/OSGI-INF/defaultcolumncalloutfactory.xml b/org.adempiere.base/OSGI-INF/defaultcolumncalloutfactory.xml index 3ed6c19f65..1be3c871b8 100644 --- a/org.adempiere.base/OSGI-INF/defaultcolumncalloutfactory.xml +++ b/org.adempiere.base/OSGI-INF/defaultcolumncalloutfactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.base/OSGI-INF/defaultdocfactory.xml b/org.adempiere.base/OSGI-INF/defaultdocfactory.xml index 806804c562..097416eec9 100644 --- a/org.adempiere.base/OSGI-INF/defaultdocfactory.xml +++ b/org.adempiere.base/OSGI-INF/defaultdocfactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.base/OSGI-INF/defaultlookupfactory.xml b/org.adempiere.base/OSGI-INF/defaultlookupfactory.xml index 08c074aa56..c179b0e4fd 100644 --- a/org.adempiere.base/OSGI-INF/defaultlookupfactory.xml +++ b/org.adempiere.base/OSGI-INF/defaultlookupfactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.base/OSGI-INF/defaultmodelfactory.xml b/org.adempiere.base/OSGI-INF/defaultmodelfactory.xml index b9c2d6c074..a30e945dbc 100644 --- a/org.adempiere.base/OSGI-INF/defaultmodelfactory.xml +++ b/org.adempiere.base/OSGI-INF/defaultmodelfactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.base/OSGI-INF/defaultmodelvalidatorfactory.xml b/org.adempiere.base/OSGI-INF/defaultmodelvalidatorfactory.xml index f41c401212..0eb49cb1fc 100644 --- a/org.adempiere.base/OSGI-INF/defaultmodelvalidatorfactory.xml +++ b/org.adempiere.base/OSGI-INF/defaultmodelvalidatorfactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.base/OSGI-INF/defaultpaymentprocessorfactory.xml b/org.adempiere.base/OSGI-INF/defaultpaymentprocessorfactory.xml index a45ade46f8..7cfe6ce078 100644 --- a/org.adempiere.base/OSGI-INF/defaultpaymentprocessorfactory.xml +++ b/org.adempiere.base/OSGI-INF/defaultpaymentprocessorfactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.base/OSGI-INF/defaultprocessfactory.xml b/org.adempiere.base/OSGI-INF/defaultprocessfactory.xml index 9d9028fd00..cb9a088553 100644 --- a/org.adempiere.base/OSGI-INF/defaultprocessfactory.xml +++ b/org.adempiere.base/OSGI-INF/defaultprocessfactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.base/OSGI-INF/defaultshipmentprocessorfactory.xml b/org.adempiere.base/OSGI-INF/defaultshipmentprocessorfactory.xml index 6605feb4a3..e9cf0e5299 100644 --- a/org.adempiere.base/OSGI-INF/defaultshipmentprocessorfactory.xml +++ b/org.adempiere.base/OSGI-INF/defaultshipmentprocessorfactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.base/OSGI-INF/dslocator.xml b/org.adempiere.base/OSGI-INF/dslocator.xml index c318b703fb..b51caf07cf 100644 --- a/org.adempiere.base/OSGI-INF/dslocator.xml +++ b/org.adempiere.base/OSGI-INF/dslocator.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.base/OSGI-INF/eventmanager.xml b/org.adempiere.base/OSGI-INF/eventmanager.xml index a36b0ccff3..4c5ab7a980 100644 --- a/org.adempiere.base/OSGI-INF/eventmanager.xml +++ b/org.adempiere.base/OSGI-INF/eventmanager.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.base/OSGI-INF/keystore.xml b/org.adempiere.base/OSGI-INF/keystore.xml index eb288e633e..98bab605b6 100644 --- a/org.adempiere.base/OSGI-INF/keystore.xml +++ b/org.adempiere.base/OSGI-INF/keystore.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.base/OSGI-INF/serverbean.xml b/org.adempiere.base/OSGI-INF/serverbean.xml index 201af98d9b..75ba3fcc4e 100644 --- a/org.adempiere.base/OSGI-INF/serverbean.xml +++ b/org.adempiere.base/OSGI-INF/serverbean.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.base/OSGI-INF/statusbean.xml b/org.adempiere.base/OSGI-INF/statusbean.xml index 5528079e58..1e63f707f1 100644 --- a/org.adempiere.base/OSGI-INF/statusbean.xml +++ b/org.adempiere.base/OSGI-INF/statusbean.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.pipo/OSGI-INF/dictionaryservice.xml b/org.adempiere.pipo/OSGI-INF/dictionaryservice.xml index 5ae14e2897..c6d3f25d68 100644 --- a/org.adempiere.pipo/OSGI-INF/dictionaryservice.xml +++ b/org.adempiere.pipo/OSGI-INF/dictionaryservice.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.replication.server/OSGI-INF/serverfactory.xml b/org.adempiere.replication.server/OSGI-INF/serverfactory.xml index 51272f5252..5a87004a14 100644 --- a/org.adempiere.replication.server/OSGI-INF/serverfactory.xml +++ b/org.adempiere.replication.server/OSGI-INF/serverfactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.report.jasper.swing/OSGI-INF/jrviewerprovider.xml b/org.adempiere.report.jasper.swing/OSGI-INF/jrviewerprovider.xml index 413fa59b41..d15ca6e471 100644 --- a/org.adempiere.report.jasper.swing/OSGI-INF/jrviewerprovider.xml +++ b/org.adempiere.report.jasper.swing/OSGI-INF/jrviewerprovider.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.server/OSGI-INF/acctprocessorfactory.xml b/org.adempiere.server/OSGI-INF/acctprocessorfactory.xml index ab965f7a41..13bb8bd797 100644 --- a/org.adempiere.server/OSGI-INF/acctprocessorfactory.xml +++ b/org.adempiere.server/OSGI-INF/acctprocessorfactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.server/OSGI-INF/alertprocessorfactory.xml b/org.adempiere.server/OSGI-INF/alertprocessorfactory.xml index ef40ea2b28..8f59273fd2 100644 --- a/org.adempiere.server/OSGI-INF/alertprocessorfactory.xml +++ b/org.adempiere.server/OSGI-INF/alertprocessorfactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.server/OSGI-INF/ldapprocessorfactory.xml b/org.adempiere.server/OSGI-INF/ldapprocessorfactory.xml index 7373533582..f53e45eccd 100644 --- a/org.adempiere.server/OSGI-INF/ldapprocessorfactory.xml +++ b/org.adempiere.server/OSGI-INF/ldapprocessorfactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.server/OSGI-INF/requestprocessorfactory.xml b/org.adempiere.server/OSGI-INF/requestprocessorfactory.xml index edd62584bb..b629fcf88d 100644 --- a/org.adempiere.server/OSGI-INF/requestprocessorfactory.xml +++ b/org.adempiere.server/OSGI-INF/requestprocessorfactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.server/OSGI-INF/schedulerfactory.xml b/org.adempiere.server/OSGI-INF/schedulerfactory.xml index 4947ceef93..369c1bd34f 100644 --- a/org.adempiere.server/OSGI-INF/schedulerfactory.xml +++ b/org.adempiere.server/OSGI-INF/schedulerfactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.server/OSGI-INF/workflowprocessorfactory.xml b/org.adempiere.server/OSGI-INF/workflowprocessorfactory.xml index e1c53aa8f1..1cac2215eb 100644 --- a/org.adempiere.server/OSGI-INF/workflowprocessorfactory.xml +++ b/org.adempiere.server/OSGI-INF/workflowprocessorfactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.ui.swing/OSGI-INF/defaultcreatefromfactory.xml b/org.adempiere.ui.swing/OSGI-INF/defaultcreatefromfactory.xml index d8241452e3..a8e8a3eab7 100644 --- a/org.adempiere.ui.swing/OSGI-INF/defaultcreatefromfactory.xml +++ b/org.adempiere.ui.swing/OSGI-INF/defaultcreatefromfactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.ui.swing/OSGI-INF/defaulteditorfactory.xml b/org.adempiere.ui.swing/OSGI-INF/defaulteditorfactory.xml index 056127c492..b5b667baba 100644 --- a/org.adempiere.ui.swing/OSGI-INF/defaulteditorfactory.xml +++ b/org.adempiere.ui.swing/OSGI-INF/defaulteditorfactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.ui.swing/OSGI-INF/defaultformfactory.xml b/org.adempiere.ui.swing/OSGI-INF/defaultformfactory.xml index fda641665f..ecfac158fa 100644 --- a/org.adempiere.ui.swing/OSGI-INF/defaultformfactory.xml +++ b/org.adempiere.ui.swing/OSGI-INF/defaultformfactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.ui.swing/OSGI-INF/defaultinfofactory.xml b/org.adempiere.ui.swing/OSGI-INF/defaultinfofactory.xml index 996086f617..4b7475506b 100644 --- a/org.adempiere.ui.swing/OSGI-INF/defaultinfofactory.xml +++ b/org.adempiere.ui.swing/OSGI-INF/defaultinfofactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.ui.swing/OSGI-INF/defaultpaymentformfactory.xml b/org.adempiere.ui.swing/OSGI-INF/defaultpaymentformfactory.xml index 6d0322ebdc..e987a82e55 100644 --- a/org.adempiere.ui.swing/OSGI-INF/defaultpaymentformfactory.xml +++ b/org.adempiere.ui.swing/OSGI-INF/defaultpaymentformfactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.ui.swing/OSGI-INF/defaultprintshippinglabel.xml b/org.adempiere.ui.swing/OSGI-INF/defaultprintshippinglabel.xml index ca778e4fd2..2b14a97e99 100644 --- a/org.adempiere.ui.swing/OSGI-INF/defaultprintshippinglabel.xml +++ b/org.adempiere.ui.swing/OSGI-INF/defaultprintshippinglabel.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.ui.swing/OSGI-INF/reportviewerprovider.xml b/org.adempiere.ui.swing/OSGI-INF/reportviewerprovider.xml index 2ccca5a51e..ff537236c1 100644 --- a/org.adempiere.ui.swing/OSGI-INF/reportviewerprovider.xml +++ b/org.adempiere.ui.swing/OSGI-INF/reportviewerprovider.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.ui.swing/OSGI-INF/resourcefinder.xml b/org.adempiere.ui.swing/OSGI-INF/resourcefinder.xml index 1c6d4d1522..52e76f4703 100644 --- a/org.adempiere.ui.swing/OSGI-INF/resourcefinder.xml +++ b/org.adempiere.ui.swing/OSGI-INF/resourcefinder.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.ui.swing/OSGI-INF/serverinterface.xml b/org.adempiere.ui.swing/OSGI-INF/serverinterface.xml index 7fdd25a815..6b37644416 100644 --- a/org.adempiere.ui.swing/OSGI-INF/serverinterface.xml +++ b/org.adempiere.ui.swing/OSGI-INF/serverinterface.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.ui.swing/OSGI-INF/statusinterface.xml b/org.adempiere.ui.swing/OSGI-INF/statusinterface.xml index 59ac0ed555..e69803a13c 100644 --- a/org.adempiere.ui.swing/OSGI-INF/statusinterface.xml +++ b/org.adempiere.ui.swing/OSGI-INF/statusinterface.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.ui.zk/OSGI-INF/defaultcreatefromfactory.xml b/org.adempiere.ui.zk/OSGI-INF/defaultcreatefromfactory.xml index 11e052760b..61d94a4f84 100644 --- a/org.adempiere.ui.zk/OSGI-INF/defaultcreatefromfactory.xml +++ b/org.adempiere.ui.zk/OSGI-INF/defaultcreatefromfactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.ui.zk/OSGI-INF/defaulteditorfactory.xml b/org.adempiere.ui.zk/OSGI-INF/defaulteditorfactory.xml index d786feeb2c..1b6c3ec9e8 100644 --- a/org.adempiere.ui.zk/OSGI-INF/defaulteditorfactory.xml +++ b/org.adempiere.ui.zk/OSGI-INF/defaulteditorfactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.ui.zk/OSGI-INF/defaultformfactory.xml b/org.adempiere.ui.zk/OSGI-INF/defaultformfactory.xml index 1ce0229c2e..e281eef03d 100644 --- a/org.adempiere.ui.zk/OSGI-INF/defaultformfactory.xml +++ b/org.adempiere.ui.zk/OSGI-INF/defaultformfactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.ui.zk/OSGI-INF/defaultinfofactory.xml b/org.adempiere.ui.zk/OSGI-INF/defaultinfofactory.xml index bfcf4aa335..a5ed5f8f73 100644 --- a/org.adempiere.ui.zk/OSGI-INF/defaultinfofactory.xml +++ b/org.adempiere.ui.zk/OSGI-INF/defaultinfofactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.ui.zk/OSGI-INF/defaultpaymentformfactory.xml b/org.adempiere.ui.zk/OSGI-INF/defaultpaymentformfactory.xml index 46febc59c2..91d13e16ac 100644 --- a/org.adempiere.ui.zk/OSGI-INF/defaultpaymentformfactory.xml +++ b/org.adempiere.ui.zk/OSGI-INF/defaultpaymentformfactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.ui.zk/OSGI-INF/defaultprintshippinglabel.xml b/org.adempiere.ui.zk/OSGI-INF/defaultprintshippinglabel.xml index 2f14bad4d9..7907584285 100644 --- a/org.adempiere.ui.zk/OSGI-INF/defaultprintshippinglabel.xml +++ b/org.adempiere.ui.zk/OSGI-INF/defaultprintshippinglabel.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.ui.zk/OSGI-INF/feedbackservice.xml b/org.adempiere.ui.zk/OSGI-INF/feedbackservice.xml index 64c69dd91f..6fcf476799 100644 --- a/org.adempiere.ui.zk/OSGI-INF/feedbackservice.xml +++ b/org.adempiere.ui.zk/OSGI-INF/feedbackservice.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.ui.zk/OSGI-INF/jrviewerprovider.xml b/org.adempiere.ui.zk/OSGI-INF/jrviewerprovider.xml index ed544e330f..33b21de28e 100644 --- a/org.adempiere.ui.zk/OSGI-INF/jrviewerprovider.xml +++ b/org.adempiere.ui.zk/OSGI-INF/jrviewerprovider.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.ui.zk/OSGI-INF/processfactory.xml b/org.adempiere.ui.zk/OSGI-INF/processfactory.xml index 04cbf3c7da..6d9924ebe1 100644 --- a/org.adempiere.ui.zk/OSGI-INF/processfactory.xml +++ b/org.adempiere.ui.zk/OSGI-INF/processfactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.ui.zk/OSGI-INF/reportviewerprovider.xml b/org.adempiere.ui.zk/OSGI-INF/reportviewerprovider.xml index ccfc5b04bf..0a7f0eeff1 100644 --- a/org.adempiere.ui.zk/OSGI-INF/reportviewerprovider.xml +++ b/org.adempiere.ui.zk/OSGI-INF/reportviewerprovider.xml @@ -1,5 +1,5 @@ - + diff --git a/org.adempiere.ui.zk/OSGI-INF/resourcefinder.xml b/org.adempiere.ui.zk/OSGI-INF/resourcefinder.xml index 788cb7d615..bccaa1a058 100644 --- a/org.adempiere.ui.zk/OSGI-INF/resourcefinder.xml +++ b/org.adempiere.ui.zk/OSGI-INF/resourcefinder.xml @@ -1,5 +1,5 @@ - + diff --git a/org.compiere.db.oracle.provider/OSGI-INF/oracleprovider.xml b/org.compiere.db.oracle.provider/OSGI-INF/oracleprovider.xml index a0cf86b2c3..68ea4d6a50 100644 --- a/org.compiere.db.oracle.provider/OSGI-INF/oracleprovider.xml +++ b/org.compiere.db.oracle.provider/OSGI-INF/oracleprovider.xml @@ -1,5 +1,5 @@ - + diff --git a/org.compiere.db.postgresql.provider/OSGI-INF/pgprovider.xml b/org.compiere.db.postgresql.provider/OSGI-INF/pgprovider.xml index 43984b4889..5783951866 100644 --- a/org.compiere.db.postgresql.provider/OSGI-INF/pgprovider.xml +++ b/org.compiere.db.postgresql.provider/OSGI-INF/pgprovider.xml @@ -1,5 +1,5 @@ - + diff --git a/org.idempiere.fitnesse.fixture/OSGI-INF/fitfixturefactory.xml b/org.idempiere.fitnesse.fixture/OSGI-INF/fitfixturefactory.xml index fdfb4037fd..4a8acc2856 100644 --- a/org.idempiere.fitnesse.fixture/OSGI-INF/fitfixturefactory.xml +++ b/org.idempiere.fitnesse.fixture/OSGI-INF/fitfixturefactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.idempiere.fitnesse.fixture/OSGI-INF/slimfixturefactory.xml b/org.idempiere.fitnesse.fixture/OSGI-INF/slimfixturefactory.xml index 58b38ae24b..eea582a877 100644 --- a/org.idempiere.fitnesse.fixture/OSGI-INF/slimfixturefactory.xml +++ b/org.idempiere.fitnesse.fixture/OSGI-INF/slimfixturefactory.xml @@ -1,5 +1,5 @@ - + diff --git a/org.idempiere.hazelcast.service/OSGI-INF/cacheservice.xml b/org.idempiere.hazelcast.service/OSGI-INF/cacheservice.xml index 5b1e36ec51..6d5ab88e98 100644 --- a/org.idempiere.hazelcast.service/OSGI-INF/cacheservice.xml +++ b/org.idempiere.hazelcast.service/OSGI-INF/cacheservice.xml @@ -1,5 +1,5 @@ - + diff --git a/org.idempiere.hazelcast.service/OSGI-INF/clusterservice.xml b/org.idempiere.hazelcast.service/OSGI-INF/clusterservice.xml index 80236ee452..1ab0378e81 100644 --- a/org.idempiere.hazelcast.service/OSGI-INF/clusterservice.xml +++ b/org.idempiere.hazelcast.service/OSGI-INF/clusterservice.xml @@ -1,5 +1,5 @@ - + diff --git a/org.idempiere.hazelcast.service/OSGI-INF/messageservice.xml b/org.idempiere.hazelcast.service/OSGI-INF/messageservice.xml index 47af916129..a2a68454c3 100644 --- a/org.idempiere.hazelcast.service/OSGI-INF/messageservice.xml +++ b/org.idempiere.hazelcast.service/OSGI-INF/messageservice.xml @@ -1,5 +1,5 @@ - + diff --git a/org.idempiere.ui.zk.selenium/OSGI-INF/fitfixturefactory.xml b/org.idempiere.ui.zk.selenium/OSGI-INF/fitfixturefactory.xml index 1a3d2201c8..a916384ef3 100644 --- a/org.idempiere.ui.zk.selenium/OSGI-INF/fitfixturefactory.xml +++ b/org.idempiere.ui.zk.selenium/OSGI-INF/fitfixturefactory.xml @@ -1,5 +1,5 @@ - + From 714ce292787735fde3c02e974db14085ab20d2a7 Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Wed, 31 Jul 2013 16:41:37 +0800 Subject: [PATCH 11/12] IDEMPIERE-1224 Need a way to prevent auto start of OSGi service component from Core. --- org.adempiere.base/META-INF/MANIFEST.MF | 1 + .../src/org/adempiere/base/BaseActivator.java | 7 + .../base/ComponentBlackListService.java | 129 ++++++++++++++++++ 3 files changed, 137 insertions(+) create mode 100644 org.adempiere.base/src/org/adempiere/base/ComponentBlackListService.java diff --git a/org.adempiere.base/META-INF/MANIFEST.MF b/org.adempiere.base/META-INF/MANIFEST.MF index 0bf65e808d..2b0853b931 100644 --- a/org.adempiere.base/META-INF/MANIFEST.MF +++ b/org.adempiere.base/META-INF/MANIFEST.MF @@ -274,6 +274,7 @@ Import-Package: com.sun.mail.auth;version="1.4.5", org.apache.commons.net.ftp, org.apache.ecs, org.apache.ecs.xhtml, + org.apache.felix.scr;version="1.6.0", org.apache.poi.hssf.usermodel, org.apache.poi.ss.usermodel, org.apache.tools.ant, diff --git a/org.adempiere.base/src/org/adempiere/base/BaseActivator.java b/org.adempiere.base/src/org/adempiere/base/BaseActivator.java index 0096e386f9..0b721650fc 100644 --- a/org.adempiere.base/src/org/adempiere/base/BaseActivator.java +++ b/org.adempiere.base/src/org/adempiere/base/BaseActivator.java @@ -42,6 +42,7 @@ import org.osgi.util.tracker.ServiceTracker; public class BaseActivator implements BundleActivator { private static BundleContext bundleContext = null; + private ComponentBlackListService blacklistService; /** * default constructor @@ -58,6 +59,8 @@ public class BaseActivator implements BundleActivator { loadInitProperties(Adempiere.getAdempiereHome()); bundleContext = context; context.registerService(CommandProvider.class.getName(), new StackTraceCommand(), null); + + blacklistService = new ComponentBlackListService(context); } /* @@ -114,6 +117,10 @@ public class BaseActivator implements BundleActivator { } } trackerCache.clear(); + if (blacklistService != null) { + blacklistService.stop(context); + blacklistService = null; + } Adempiere.stop(); } diff --git a/org.adempiere.base/src/org/adempiere/base/ComponentBlackListService.java b/org.adempiere.base/src/org/adempiere/base/ComponentBlackListService.java new file mode 100644 index 0000000000..ddefa16f38 --- /dev/null +++ b/org.adempiere.base/src/org/adempiere/base/ComponentBlackListService.java @@ -0,0 +1,129 @@ +/****************************************************************************** + * Copyright (C) 2012 Heng Sin Low * + * Copyright (C) 2012 Trek Global * + * 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.base; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.felix.scr.Component; +import org.apache.felix.scr.ScrService; +import org.compiere.util.Ini; +import org.compiere.util.Util; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceEvent; +import org.osgi.framework.ServiceListener; +import org.osgi.framework.ServiceReference; +import org.osgi.service.component.ComponentConstants; + +/** + * @author hengsin + * + */ +public class ComponentBlackListService implements ServiceListener { + + private ScrService scrService = null; + private List blackListComponentNames = null; + + protected ComponentBlackListService(BundleContext context) { + ServiceReference ref = context.getServiceReference(ScrService.class); + scrService = context.getService(ref); + blackListComponentNames = new ArrayList(); + retrieveBlacklistCandidates(); + if (!blackListComponentNames.isEmpty()) { + disableComponents(); + } + context.addServiceListener(this); + } + + public void stop(BundleContext context) { + scrService = null; + blackListComponentNames = null; + context.removeServiceListener(this); + } + + private void retrieveBlacklistCandidates() { + String path = Ini.getAdempiereHome(); + File file = new File(path, "components.blacklist"); + if (file.exists()) { + BufferedReader br = null; + try { + FileReader reader = new FileReader(file); + br = new BufferedReader(reader); + String s = null; + do { + s = br.readLine(); + if (!Util.isEmpty(s)) { + blackListComponentNames.add(s.trim()); + } + } while (s != null); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException e) {} + } + } + } + + } + + private void disableComponents() + { + Component[] comps = scrService.getComponents(); + for (Component comp : comps) { + if (blackListComponentNames.contains(comp.getName())) { + comp.disable(); + } + } + } + + private void disableComponent(String componentName) + { + Component[] comps = scrService.getComponents(); + for (Component comp : comps) { + if (comp.getName().equals(componentName)) { + comp.disable(); + break; + } + } + } + + /* (non-Javadoc) + * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent) + */ + @Override + public void serviceChanged(ServiceEvent event) { + if (event.getType() == ServiceEvent.REGISTERED) { + if (scrService != null && !blackListComponentNames.isEmpty()) { + ServiceReference ref = event.getServiceReference(); + String name = (String) ref.getProperty(ComponentConstants.COMPONENT_NAME); + if (!Util.isEmpty(name)) { + if (blackListComponentNames.contains(name)) { + disableComponent(name); + } + } + } + } + } + +} From 9b13c2dec46cc58a857b639b4140bd57e430b72d Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Wed, 31 Jul 2013 09:06:41 -0500 Subject: [PATCH 12/12] IDEMPIERE-840 Improvement to Request model class --- .../oracle/201307310904_IDEMPIERE-840.sql | 13 +++++++++++++ .../postgresql/201307310904_IDEMPIERE-840.sql | 13 +++++++++++++ org.adempiere.base/OSGI-INF/requesteventhandler.xml | 4 ++-- .../adempiere/base/event/RequestEventHandler.java | 3 ++- 4 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 migration/i1.0c-release/oracle/201307310904_IDEMPIERE-840.sql create mode 100644 migration/i1.0c-release/postgresql/201307310904_IDEMPIERE-840.sql diff --git a/migration/i1.0c-release/oracle/201307310904_IDEMPIERE-840.sql b/migration/i1.0c-release/oracle/201307310904_IDEMPIERE-840.sql new file mode 100644 index 0000000000..fc67f94a15 --- /dev/null +++ b/migration/i1.0c-release/oracle/201307310904_IDEMPIERE-840.sql @@ -0,0 +1,13 @@ +-- Jul 31, 2013 9:00:38 AM COT +-- IDEMPIERE-840 Improvement to Request model class +INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Org_ID,Created,AD_Client_ID) VALUES ('I','Sent by iDempiereMail',200218,'D','e1049e33-cbdc-4fc4-94fa-9e99f6bb07cc','RequestSentBy','Y',TO_DATE('2013-07-31 09:00:30','YYYY-MM-DD HH24:MI:SS'),100,100,0,TO_DATE('2013-07-31 09:00:30','YYYY-MM-DD HH24:MI:SS'),0) +; + +-- Jul 31, 2013 9:00:38 AM COT +-- IDEMPIERE-840 Improvement to Request model class +INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200218 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID) +; + +SELECT register_migration_script('201307310904_IDEMPIERE-840.sql') FROM dual +; + diff --git a/migration/i1.0c-release/postgresql/201307310904_IDEMPIERE-840.sql b/migration/i1.0c-release/postgresql/201307310904_IDEMPIERE-840.sql new file mode 100644 index 0000000000..4e383774bb --- /dev/null +++ b/migration/i1.0c-release/postgresql/201307310904_IDEMPIERE-840.sql @@ -0,0 +1,13 @@ +-- Jul 31, 2013 9:00:38 AM COT +-- IDEMPIERE-840 Improvement to Request model class +INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Org_ID,Created,AD_Client_ID) VALUES ('I','Sent by iDempiereMail',200218,'D','e1049e33-cbdc-4fc4-94fa-9e99f6bb07cc','RequestSentBy','Y',TO_TIMESTAMP('2013-07-31 09:00:30','YYYY-MM-DD HH24:MI:SS'),100,100,0,TO_TIMESTAMP('2013-07-31 09:00:30','YYYY-MM-DD HH24:MI:SS'),0) +; + +-- Jul 31, 2013 9:00:38 AM COT +-- IDEMPIERE-840 Improvement to Request model class +INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200218 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID) +; + +SELECT register_migration_script('201307310904_IDEMPIERE-840.sql') FROM dual +; + diff --git a/org.adempiere.base/OSGI-INF/requesteventhandler.xml b/org.adempiere.base/OSGI-INF/requesteventhandler.xml index f3d44317f0..db7e6d403f 100644 --- a/org.adempiere.base/OSGI-INF/requesteventhandler.xml +++ b/org.adempiere.base/OSGI-INF/requesteventhandler.xml @@ -1,5 +1,5 @@ - + @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/org.adempiere.base/src/org/adempiere/base/event/RequestEventHandler.java b/org.adempiere.base/src/org/adempiere/base/event/RequestEventHandler.java index fa5faa40af..4348922954 100644 --- a/org.adempiere.base/src/org/adempiere/base/event/RequestEventHandler.java +++ b/org.adempiere.base/src/org/adempiere/base/event/RequestEventHandler.java @@ -410,7 +410,8 @@ public class RequestEventHandler extends AbstractEventHandler implements Managed .append(Msg.translate(r.getCtx(), "R_Request_ID")) .append(": ").append(r.getDocumentNo()) .append(" ").append(r.getMailTag()) - .append("\nSent by AdempiereMail"); + .append("\n") + .append(Msg.getMsg(r.getCtx(), "RequestSentBy")); if (serverAddress != null) sb.append(" from ").append(serverAddress); return sb.toString();