001// --------------------------------------------------------------------------------
002// Copyright 2002-2024 Echo Three, LLC
003//
004// Licensed under the Apache License, Version 2.0 (the "License");
005// you may not use this file except in compliance with the License.
006// You may obtain a copy of the License at
007//
008//     http://www.apache.org/licenses/LICENSE-2.0
009//
010// Unless required by applicable law or agreed to in writing, software
011// distributed under the License is distributed on an "AS IS" BASIS,
012// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013// See the License for the specific language governing permissions and
014// limitations under the License.
015// --------------------------------------------------------------------------------
016
017package com.echothree.util.server.persistence.translator;
018
019import com.echothree.model.control.core.server.control.CoreControl;
020import com.echothree.model.control.order.common.OrderTypes;
021import com.echothree.model.control.order.server.control.OrderControl;
022import com.echothree.model.control.order.server.logic.OrderLogic;
023import com.echothree.model.control.sequence.common.SequenceTypes;
024import com.echothree.model.data.core.server.entity.EntityInstance;
025import com.echothree.model.data.order.common.pk.OrderPK;
026import com.echothree.model.data.order.server.entity.OrderDetail;
027import com.echothree.model.data.order.server.factory.OrderFactory;
028import com.echothree.util.common.persistence.EntityNames;
029import com.echothree.util.common.persistence.Names;
030import com.echothree.util.common.persistence.Targets;
031import com.echothree.util.common.transfer.MapWrapper;
032import com.echothree.util.server.persistence.EntityPermission;
033import com.echothree.util.server.persistence.Session;
034import java.util.Collections;
035import java.util.HashMap;
036import java.util.Map;
037
038public class OrderNameTranslator
039        implements EntityInstanceTranslator, SequenceTypeTranslator {
040
041    private final static Map<String, String> orderTypesToTargets;
042    private final static Map<String, String> sequenceTypesToOrderTypes;
043    private final static Map<String, String> sequenceTypesToTargets;
044
045    static {
046        var orderTypesToTargetsMap = new HashMap<String, String>();
047
048        orderTypesToTargetsMap.put(OrderTypes.PURCHASE_ORDER.name(), Targets.PurchaseOrder.name());
049        orderTypesToTargetsMap.put(OrderTypes.SALES_ORDER.name(), Targets.SalesOrder.name());
050        orderTypesToTargetsMap.put(OrderTypes.WISHLIST.name(), Targets.Wishlist.name());
051
052        orderTypesToTargets = Collections.unmodifiableMap(orderTypesToTargetsMap);
053
054        var sequenceTypesToOrderTypesMap = new HashMap<String, String>();
055
056        sequenceTypesToOrderTypesMap.put(SequenceTypes.PURCHASE_ORDER.name(), OrderTypes.PURCHASE_ORDER.name());
057        sequenceTypesToOrderTypesMap.put(SequenceTypes.SALES_ORDER.name(), OrderTypes.SALES_ORDER.name());
058        sequenceTypesToOrderTypesMap.put(SequenceTypes.WISHLIST.name(), OrderTypes.WISHLIST.name());
059        
060        sequenceTypesToOrderTypes = Collections.unmodifiableMap(sequenceTypesToOrderTypesMap);
061
062        var sequenceTypesToTargetsMap = new HashMap<String, String>();
063
064        sequenceTypesToTargetsMap.put(SequenceTypes.PURCHASE_ORDER.name(), Targets.PurchaseOrder.name());
065        sequenceTypesToTargetsMap.put(SequenceTypes.SALES_ORDER.name(), Targets.SalesOrder.name());
066        sequenceTypesToTargetsMap.put(SequenceTypes.WISHLIST.name(), Targets.Wishlist.name());
067        
068        sequenceTypesToTargets = Collections.unmodifiableMap(sequenceTypesToTargetsMap);
069    }
070    
071    private EntityNames getNames(final Map<String, String> targetMap, final String key, final OrderDetail orderDetail) {
072        String target = targetMap.get(key);
073        EntityNames result = null;
074
075        if(target != null) {
076            MapWrapper<String> names = new MapWrapper<>(1);
077
078            names.put(Names.OrderName.name(), orderDetail.getOrderName());
079
080            result = new EntityNames(target, names);
081        }
082
083        return result;
084    }
085
086    @Override
087    public EntityNames getNames(final EntityInstance entityInstance) {
088        var orderDetail = OrderFactory.getInstance().getEntityFromPK(EntityPermission.READ_ONLY,
089                new OrderPK(entityInstance.getEntityUniqueId())).getLastDetail();
090        var orderTypeName = orderDetail.getOrderType().getLastDetail().getOrderTypeName();
091        
092        return getNames(orderTypesToTargets, orderTypeName, orderDetail);
093    }
094
095    @Override
096    public EntityInstanceAndNames getNames(final String sequenceTypeName, final String orderName,
097            final boolean includeEntityInstance) {
098        EntityInstanceAndNames result = null;
099        var orderControl = Session.getModelController(OrderControl.class);
100        var orderTypeName = sequenceTypesToOrderTypes.get(sequenceTypeName);
101
102        if(orderTypeName != null) {
103            var orderType = OrderLogic.getInstance().getOrderTypeByName(null, orderTypeName);
104            var order = orderControl.getOrderByName(orderType, orderName);
105
106            if(order != null) {
107                var coreControl = Session.getModelController(CoreControl.class);
108                EntityNames entityNames = getNames(sequenceTypesToTargets, sequenceTypeName, order.getLastDetail());
109            
110                result = entityNames == null ? null : new EntityInstanceAndNames(includeEntityInstance ? coreControl.getEntityInstanceByBasePK(order.getPrimaryKey()) : null, entityNames);
111            }
112        }
113        
114        return result;
115    }
116    
117}