1

Spring を使用しない Java プログラミングで Flyweight パターンを実装しています。これをSpringマネージドBeanにする方法を提案してください。静的メソッド呼び出しと内部クラスがあります。目的は、最初に CRM からすべての OptionSet をロードして、アプリケーションで同じ OptionSet を共有することです。これにより、CRM への高価な呼び出しが防止されます。ユーザーは新しい OptionSet を作成することが制限されているため、内部クラスです。最初に Spring Bean として実装し、それを ApplicationContextAware にして他の Bean を参照する必要があります。私は主に Bean 定義に Spring XML 構成を使用しています。

public class OptionSetFactory{
    private static Map <String, Object>optionSets = new HashMap();

    //Inner class to restrict users creating OptionSet
    private class OptionSet implements IOptionSet{
        private String entityName;
        private String attributeName;
        private Hashtable<Integer, String> options;
        private IOrganizationService service;
        private static final String GUID_EMPTY = "00000000-0000-0000-0000-000000000000";
        private ApplicationContext context;

        OptionSet(String entityName, String attributeName){
            this.entityName = entityName;
            this.attributeName = attributeName;
            //this.options = options;   

            OrganizationRequest request = new OrganizationRequest();            
            request.setRequestName("RetrieveAttribute");            
            Guid guid = new Guid();
            guid.setValue(GUID_EMPTY);                  
            ParameterCollection paramCol = new ParameterCollection();
            KeyValuePairOfstringanyType kv0 = new KeyValuePairOfstringanyType();
            kv0.setKey("MetadataId");
            kv0.setValue(guid);
            paramCol.getKeyValuePairOfstringanyTypes().add(kv0);

            KeyValuePairOfstringanyType kv1 = new KeyValuePairOfstringanyType();
            kv1.setKey("EntityLogicalName");
            kv1.setValue(entityName);
            paramCol.getKeyValuePairOfstringanyTypes().add(kv1);
            KeyValuePairOfstringanyType kv2 = new KeyValuePairOfstringanyType();
            kv2.setKey("LogicalName");
            kv2.setValue(attributeName);
            paramCol.getKeyValuePairOfstringanyTypes().add(kv2);
            KeyValuePairOfstringanyType kv3 = new KeyValuePairOfstringanyType();
            kv3.setKey("RetrieveAsIfPublished");
            kv3.setValue(true);
            paramCol.getKeyValuePairOfstringanyTypes().add(kv3);
            request.setParameters(paramCol);
            try {
                OrganizationResponse response=service.execute(request);
                PicklistAttributeMetadata pickListAttrMetadata = (PicklistAttributeMetadata)response.getResults().getKeyValuePairOfstringanyTypes().get(0).getValue();
                OptionSetMetadata optionSetMetadata = pickListAttrMetadata.getOptionSet();
                for(OptionMetadata optionMetaData : optionSetMetadata.getOptions().getOptionMetadatas()){
                    //TODO populate OptionSet from optionsetMetadata
                }
            } catch (IOrganizationServiceExecuteOrganizationServiceFaultFaultFaultMessage e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        @Override
        public String getEntityName() {
            return entityName;
        }

        @Override
        public String getAttributeName() {
            return attributeName;
        }

        @Override
        public Hashtable<Integer, String> getOptions() {
            return options;
        }
    }
    //static block to load predefined OptionSets in HashMap
    static{
        OptionSetFactory factory = new OptionSetFactory();
        optionSets.put("dsl_type", factory.new OptionSet("dsl_type", "dsl_operationalstructure"));

    }
    //Static method calls for user to fetch OptionSet based on inputs
    public static IOptionSet getOptionSet(String entityName, String attributeName){
        return (IOptionSet) optionSets.get(entityName+"."+attributeName);
    }

    public static IOptionSet getOptionSet(String attributeName){
        return (IOptionSet) optionSets.get(attributeName.toLowerCase());        
    }
}
4

0 に答える 0