/******************************************************************************* * Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Oracle - initial API and implementation from Oracle TopLink ******************************************************************************/ package org.eclipse.persistence.tools.workbench.mappingsmodel.project; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Vector; import org.eclipse.persistence.tools.workbench.mappingsmodel.MWModel; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.MWCachingPolicy; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.MWMappingDescriptor; import org.eclipse.persistence.tools.workbench.mappingsmodel.project.relational.MWRelationalProjectDefaultsPolicy; import org.eclipse.persistence.tools.workbench.mappingsmodel.project.xml.MWEisProjectDefaultsPolicy; import org.eclipse.persistence.tools.workbench.mappingsmodel.project.xml.MWOXProjectDefaultsPolicy; import org.eclipse.persistence.tools.workbench.utility.node.Node; import org.eclipse.persistence.descriptors.InheritancePolicy; import org.eclipse.persistence.mappings.converters.ObjectTypeConverter; import org.eclipse.persistence.oxm.XMLDescriptor; import org.eclipse.persistence.oxm.mappings.XMLCompositeDirectCollectionMapping; import org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping; import org.eclipse.persistence.sessions.Project; /** * This class describes the default settings for a <code>MWProject</code>. These settings include default caching * policy, use of method accessing, and the Advanced descriptor properties that should be added to a newly created * descriptor. * * @version 10.1.3 */ public abstract class MWProjectDefaultsPolicy extends MWModel { public static final String COPY_POLICY = "Copy Policy"; public static final String AFTER_LOAD_POLICY = "After Load"; public static final String INSTANTIATION_POLICY = "Instantiation"; public static final String INHERITANCE_POLICY = "Inheritance"; private Collection defaultPolicies; public static final String DEFAULT_POLICY_COLLECTION = "defaultPolicyCollection"; private Map policyBuilderMap; private MWCachingPolicy cachingPolicy; private volatile boolean methodAccessing; public final static String METHOD_ACCESSING_PROPERTY = "methodAccessing"; public static XMLDescriptor buildDescriptor() { XMLDescriptor descriptor = new XMLDescriptor(); descriptor.setJavaClass(MWProjectDefaultsPolicy.class); InheritancePolicy ip = (InheritancePolicy)descriptor.getInheritancePolicy(); ip.setClassIndicatorFieldName("@type"); ip.addClassIndicator(MWRelationalProjectDefaultsPolicy.class, "relational"); ip.addClassIndicator(MWEisProjectDefaultsPolicy.class, "eis"); ip.addClassIndicator(MWOXProjectDefaultsPolicy.class, "o-x"); descriptor.addDirectMapping("methodAccessing", "use-method-accessing/text()"); XMLCompositeDirectCollectionMapping defaultPoliciesMapping = new XMLCompositeDirectCollectionMapping(); defaultPoliciesMapping.setAttributeName("defaultPolicies"); defaultPoliciesMapping.setXPath("default-descriptor-policies/policy-type/text()"); ObjectTypeConverter converter = new ObjectTypeConverter(); converter.addConversionValue(COPY_POLICY, COPY_POLICY); converter.addConversionValue(AFTER_LOAD_POLICY, AFTER_LOAD_POLICY); converter.addConversionValue(INSTANTIATION_POLICY, INSTANTIATION_POLICY); converter.addConversionValue(INHERITANCE_POLICY, INHERITANCE_POLICY); converter.addConversionValue(MWTransactionalProjectDefaultsPolicy.EVENTS_POLICY, MWTransactionalProjectDefaultsPolicy.EVENTS_POLICY); converter.addConversionValue(MWTransactionalProjectDefaultsPolicy.RETURNING_POLICY, MWTransactionalProjectDefaultsPolicy.RETURNING_POLICY); converter.addConversionValue(MWRelationalProjectDefaultsPolicy.INTERFACE_ALIAS_POLICY, MWRelationalProjectDefaultsPolicy.INTERFACE_ALIAS_POLICY); converter.addConversionValue(MWRelationalProjectDefaultsPolicy.MULTI_TABLE_INFO_POLICY, MWRelationalProjectDefaultsPolicy.MULTI_TABLE_INFO_POLICY); defaultPoliciesMapping.setValueConverter(converter); descriptor.addMapping(defaultPoliciesMapping); XMLCompositeObjectMapping projectCachingPolicyMapping = new XMLCompositeObjectMapping(); projectCachingPolicyMapping.setAttributeName("cachingPolicy"); projectCachingPolicyMapping.setSetMethodName("setProjectCachingPolicyForTopLink"); projectCachingPolicyMapping.setGetMethodName("getProjectCachingPolicyForTopLink"); projectCachingPolicyMapping.setReferenceClass(MWTransactionalProjectCachingPolicy.class); projectCachingPolicyMapping.setXPath("caching-policy"); descriptor.addMapping(projectCachingPolicyMapping); return descriptor; } protected MWProjectDefaultsPolicy() { super(); } /** * @param parent */ public MWProjectDefaultsPolicy(MWModel parent) { super(parent); } protected void initialize() { super.initialize(); this.policyBuilderMap = new HashMap(); initializePolicyDescriptors(); } protected void initialize(Node parent) { super.initialize(parent); this.defaultPolicies = new Vector(); this.cachingPolicy = buildCachingPolicy(); } protected void addChildrenTo(List children) { super.addChildrenTo(children); children.add(this.cachingPolicy); } protected MWCachingPolicy buildCachingPolicy() { return new MWNullCachingPolicy(this); } protected void initializePolicyDescriptors() { addPolicyDescriptor(COPY_POLICY, new CopyPolicyDescriptor()); addPolicyDescriptor(AFTER_LOAD_POLICY, new AfterLoadPolicyDescriptor()); addPolicyDescriptor(INHERITANCE_POLICY, new InheritancePolicyDescriptor()); addPolicyDescriptor(INSTANTIATION_POLICY, new InstantiationPolicyDescriptor()); } public Iterator defaultPolicies() { return this.defaultPolicies.iterator(); } protected void addPolicyDescriptor(String policyKey, PolicyDescriptor descriptor) { this.policyBuilderMap.put(policyKey, descriptor); } protected PolicyDescriptor getPolicyDescriptor(String policyKey) { return (PolicyDescriptor) this.policyBuilderMap.get(policyKey); } public void applyAdvancedPolicyDefaults(MWMappingDescriptor descriptor) { for (Iterator defaults = this.defaultPolicies.iterator(); defaults.hasNext();) { getPolicyDescriptor((String)defaults.next()).applyPolicyToDescriptor(descriptor); } } public boolean containsAdvancePolicyDefault(String policyName) { return this.defaultPolicies.contains(policyName); } public void addAdvancedPolicyDefault(String policyName) { this.defaultPolicies.add(policyName); fireItemAdded(DEFAULT_POLICY_COLLECTION, policyName); } public void removeAdvancedPolicyDefault(String policyName) { this.defaultPolicies.remove(policyName); fireItemRemoved(DEFAULT_POLICY_COLLECTION, policyName); } // TODO convert all the implementations of this interface to singletons protected interface PolicyDescriptor { void applyPolicyToDescriptor(MWMappingDescriptor descriptor); } private class AfterLoadPolicyDescriptor implements PolicyDescriptor { public void applyPolicyToDescriptor(MWMappingDescriptor descriptor) { if (!descriptor.getAfterLoadingPolicy().isActive()) { descriptor.addAfterLoadingPolicy(); } } } private class CopyPolicyDescriptor implements PolicyDescriptor { public void applyPolicyToDescriptor(MWMappingDescriptor descriptor) { if (!descriptor.getCopyPolicy().isActive()) { descriptor.addCopyPolicy(); } } } private class InstantiationPolicyDescriptor implements PolicyDescriptor { public void applyPolicyToDescriptor(MWMappingDescriptor descriptor) { if (!descriptor.getInstantiationPolicy().isActive()) { descriptor.addInstantiationPolicy(); } } } private class InheritancePolicyDescriptor implements PolicyDescriptor { public void applyPolicyToDescriptor(MWMappingDescriptor descriptor) { if (!descriptor.getInheritancePolicy().isActive()) { descriptor.addInheritancePolicy(); } } } public MWCachingPolicy getCachingPolicy() { return this.cachingPolicy; } public boolean isMethodAccessing() { return this.methodAccessing; } public void setMethodAccessing(boolean newMethodAccessing) { boolean old = this.methodAccessing; this.methodAccessing = newMethodAccessing; firePropertyChanged(METHOD_ACCESSING_PROPERTY, old, this.methodAccessing); } // *************** TopLink only methods *************** private MWTransactionalProjectCachingPolicy getProjectCachingPolicyForTopLink() { return (MWTransactionalProjectCachingPolicy) this.cachingPolicy.getPersistedPolicy(); } private void setProjectCachingPolicyForTopLink(MWTransactionalProjectCachingPolicy cachingPolicy) { if (cachingPolicy == null) { this.cachingPolicy = buildCachingPolicy(); } else { this.cachingPolicy = cachingPolicy; } } protected void adjustRuntimeProject(Project project) { } }