#region Namespace using System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.ServiceModel; using Asm.As.Oib.SiplaceSetupCenter.Contracts.Data; using com.itac.mes.proxy.business; using com.itac.mes.tools; using Constants = com.itac.mes.tools.Constants; using OibClient = Asm.As.Oib.Client; #endregion namespace Itac.Oib { [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] public class SetupCenterExternalControlReceiver : IDisposable, IReceiver { #region Fields private readonly OibClient.OibSetupCenterExternalControlEvents _oibSetupCenterExternalControlEvents; public OIBEventHandler _eventHandler { get; set; } #endregion #region Constructor public SetupCenterExternalControlReceiver(OibClient.OibSetupCenterExternalControlEvents oibSetupCenterExternalControlEvents) { _oibSetupCenterExternalControlEvents = oibSetupCenterExternalControlEvents; oibSetupCenterExternalControlEvents.GetNewPackagingUnitData = GetNewPackagingUnitData; oibSetupCenterExternalControlEvents.GetPackagingUnitControlStatus = GetPackagingUnitControlStatus; } #endregion #region Start/Stop public void Start() { if (!_oibSetupCenterExternalControlEvents.IsStarted) { _oibSetupCenterExternalControlEvents.Start(); } } public void Stop() { _oibSetupCenterExternalControlEvents.Stop(); } #endregion #region ISiplaceSetupCenterExternalControl Members public ExternalControlResult[] GetPackagingUnitControlStatus(PackagingUnitLocation[] packagingUnitLocations) { LogHandler.log(Constants.LOGGER, TraceEventType.Information, "ExternalControl GetPackagingUnitControlStatus called"); com.itac.oib.siplacesetupcenter.contracts.data.PackagingUnitLocation[] report = com.itac.oib.siplacesetupcenter.contracts.data.PackagingUnitLocationMapper.getArray(packagingUnitLocations); Asm.As.Oib.SiplaceSetupCenter.Contracts.Data.ExternalControlResult[] oibResult = null; try { com.itac.oib.siplacesetupcenter.contracts.data.ExternalControlResult[] itacResult = _eventHandler.getPackagingUnitControlStatus(report); oibResult = com.itac.oib.siplacesetupcenter.contracts.data.ExternalControlResultMapper.get(itacResult); } catch (Exception e) { LogHandler.log(Constants.LOGGER, TraceEventType.Information, "failed to process GetPackagingUnitControlStatus", e); } asmHandler(ref packagingUnitLocations, ref oibResult); return oibResult; } public void UpdateEmptyFields(List packagingUnitLocations, List result) { if (packagingUnitLocations == null || packagingUnitLocations.Count == 0) { LogHandler.log(Constants.LOGGER, TraceEventType.Error, "SetupCenterExternalControl.updateEmptyFields: packagingUnitLocations empty or null"); return; } if (result == null || result.Count == 0) { LogHandler.log(Constants.LOGGER, TraceEventType.Error, "SetupCenterExternalControl.updateEmptyFields: result empty or null"); return; } if (packagingUnitLocations.Count != result.Count) { LogHandler.log(Constants.LOGGER, TraceEventType.Error, "SetupCenterExternalControl.updateEmptyFields: packagingUnitLocations and result different size"); return; } // über alle Items iterieren for (int i = 0; i < packagingUnitLocations.Count; i++) { UpdateEmptyFields(packagingUnitLocations[i], result[i]); } } public void UpdateEmptyFields(PackagingUnitLocation packagingUnitLocation, ExternalControlResult result) { if (packagingUnitLocation == null) { LogHandler.log(Constants.LOGGER, TraceEventType.Error, "SetupCenterExternalControl.updateEmptyFields: packagingUnitLocation is null"); return; } if (result == null) { LogHandler.log(Constants.LOGGER, TraceEventType.Error, "SetupCenterExternalControl.updateEmptyFields: result is null"); return; } // per reflection über alle Felder iterieren, dabei per Name vorgehen // deepCopy(packagingUnitLocation, result); // Console.WriteLine(""); if (packagingUnitLocation.PackagingUnit.BatchPackagingUnit != null && result.PackagingUnit.BatchPackagingUnit == null) { result.PackagingUnit.BatchPackagingUnit = packagingUnitLocation.PackagingUnit.BatchPackagingUnit; } } // muss noch weiter getestet werden... public void DeepCopy(object sourceObject, object destObject) { Type sourceType = sourceObject.GetType(); Type destType = destObject.GetType(); MemberInfo[] sourceMbrInfoArray = sourceType.GetMembers(); MemberInfo[] destMbrInfoArray = destType.GetMembers(); foreach (MemberInfo sourceMbrInfo in sourceMbrInfoArray) { if (sourceMbrInfo.MemberType == MemberTypes.Property) { LogHandler.log(Constants.LOGGER, TraceEventType.Error, "" + sourceMbrInfo + " is a " + sourceMbrInfo.MemberType); // alle einfachen TypeNameConverter direkt prüfen (int, String, bool) // komplexe Typen ??? PropertyInfo sourcePropInfo = sourceType.GetProperty(sourceMbrInfo.Name); // gibt es das Property auch im Zielobjekt foreach (MemberInfo destMbrInfo in destMbrInfoArray) { // identischer Name, identischerr Typ if (destMbrInfo.MemberType == sourceMbrInfo.MemberType && destMbrInfo.Name == sourceMbrInfo.Name) { PropertyInfo destPropInfo = destType.GetProperty(destMbrInfo.Name); object sourceValue = sourcePropInfo.GetValue(sourceObject, null); object destValue = destPropInfo.GetValue(destObject, null); if (sourcePropInfo.PropertyType == typeof(String) || sourcePropInfo.PropertyType == typeof(int) || sourcePropInfo.PropertyType == typeof(Int32) || sourcePropInfo.PropertyType == typeof(Int64) || sourcePropInfo.PropertyType == typeof(long) || sourcePropInfo.PropertyType == typeof(bool) || sourcePropInfo.PropertyType == typeof(Boolean)) { if (sourceValue != destValue) { LogHandler.log(Constants.LOGGER, TraceEventType.Verbose, "primitive type copy value"); destPropInfo.SetValue(destObject, sourceValue, null); } } else if (!sourceType.IsArray) { // komplexer Typ, kein Array LogHandler.log(Constants.LOGGER, TraceEventType.Verbose, sourceMbrInfo.Name + " is complex type "); if (sourceValue != null) { DeepCopy(sourceValue, destValue); } else { LogHandler.log(Constants.LOGGER, TraceEventType.Verbose, sourceMbrInfo.Name + " is complex type, sourceValue is null"); } } } } } } } private void asmHandler(ref Asm.As.Oib.SiplaceSetupCenter.Contracts.Data.PackagingUnitLocation[] packagingUnitLocations, ref Asm.As.Oib.SiplaceSetupCenter.Contracts.Data.ExternalControlResult[] result) { // // special ASM Handling: // simply return MSD Level and MSD Open Date as received in request foreach (Asm.As.Oib.SiplaceSetupCenter.Contracts.Data.PackagingUnitLocation item in packagingUnitLocations) { // find this container in result and copy the values foreach (Asm.As.Oib.SiplaceSetupCenter.Contracts.Data.ExternalControlResult resultItem in result) { if (item.PackagingUnit.UID.Equals(resultItem.PackagingUnit.UID)) { resultItem.PackagingUnit.MsdLevel = item.PackagingUnit.MsdLevel; resultItem.PackagingUnit.MsdOpenDate = item.PackagingUnit.MsdOpenDate; } } } } public ExternalControlResult[] GetNewPackagingUnitData(PackagingUnitLocation[] packagingUnitLocations) { LogHandler.log(Constants.LOGGER, TraceEventType.Information, "SetupCenterExternalControl.GetPackagingUnitControlStatus"); try { // List result = _eventHandler.GetPackagingUnitControlStatus(packagingUnitLocations); // hier müssen eigentliche alle Felder aus den quelldaten, die nicht in den Zieldaten enthalten sind per // Reflection übernommen werden, damit wir nie mehr irgend welche Werte verlieren // UpdateEmptyFields(packagingUnitLocations, result); // return result; } catch (Exception) { _eventHandler = null; // Fehler, keine weitere info vorhanden, da die Applikation nicht läuft } return new ExternalControlResult[0]; } #endregion #region IDisposeable public void Dispose() { if (_oibSetupCenterExternalControlEvents != null) _oibSetupCenterExternalControlEvents.Dispose(); } #endregion } }