/******************************************************************************* * 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.descriptor; import java.util.List; import org.eclipse.persistence.tools.workbench.mappingsmodel.MWModel; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.relational.MWRelationalTransactionalPolicy; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.xml.MWEisTransactionalPolicy; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.xml.MWOXTransactionalPolicy; import org.eclipse.persistence.tools.workbench.mappingsmodel.meta.MWClass; import org.eclipse.persistence.tools.workbench.mappingsmodel.query.MWQueryManager; import org.eclipse.persistence.tools.workbench.mappingsmodel.query.MWQueryManager; import org.eclipse.persistence.tools.workbench.utility.node.Node; import org.eclipse.persistence.descriptors.ClassDescriptor; import org.eclipse.persistence.descriptors.InheritancePolicy; import org.eclipse.persistence.oxm.XMLDescriptor; import org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping; import org.eclipse.persistence.oxm.mappings.XMLDirectMapping; public abstract class MWAbstractTransactionalPolicy extends MWModel implements MWTransactionalPolicy { private MWRefreshCachePolicy refreshCachePolicy; private MWQueryManager queryManager; private MWCachingPolicy cachingPolicy; private volatile MWLockingPolicy lockingPolicy; /** defaults to false **/ private volatile boolean readOnly; private volatile boolean conformResultsInUnitOfWork; private volatile String descriptorAlias; // ********** static methods ********** public static XMLDescriptor buildDescriptor() { XMLDescriptor descriptor = new XMLDescriptor(); descriptor.setJavaClass(MWAbstractTransactionalPolicy.class); InheritancePolicy ip = (InheritancePolicy)descriptor.getInheritancePolicy(); ip.setClassIndicatorFieldName("@type"); ip.addClassIndicator(MWRelationalTransactionalPolicy.class, "relational"); ip.addClassIndicator(MWEisTransactionalPolicy.class, "eis"); ip.addClassIndicator(MWOXTransactionalPolicy.class, "ox"); ((XMLDirectMapping) descriptor.addDirectMapping("descriptorAlias", "descriptor-alias/text()")).setNullValue(""); XMLDirectMapping readOnlyMapping = (XMLDirectMapping) descriptor.addDirectMapping("readOnly", "read-only/text()"); readOnlyMapping.setNullValue(Boolean.FALSE); XMLCompositeObjectMapping refreshCachePolicyMapping = new XMLCompositeObjectMapping(); refreshCachePolicyMapping.setAttributeName("refreshCachePolicy"); refreshCachePolicyMapping.setReferenceClass(MWRefreshCachePolicy.class); refreshCachePolicyMapping.setXPath("refresh-cache-policy"); descriptor.addMapping(refreshCachePolicyMapping); XMLCompositeObjectMapping cachingPolicyMapping = new XMLCompositeObjectMapping(); cachingPolicyMapping.setAttributeName("cachingPolicy"); cachingPolicyMapping.setReferenceClass(MWDescriptorCachingPolicy.class); cachingPolicyMapping.setXPath("caching-policy"); descriptor.addMapping(cachingPolicyMapping); XMLCompositeObjectMapping queryManagerMapping = new XMLCompositeObjectMapping(); queryManagerMapping.setAttributeName("queryManager"); queryManagerMapping.setReferenceClass(MWQueryManager.class); queryManagerMapping.setXPath("query-manager"); descriptor.addMapping(queryManagerMapping); XMLCompositeObjectMapping lockingPolicyMapping = new XMLCompositeObjectMapping(); lockingPolicyMapping.setAttributeName("lockingPolicy"); lockingPolicyMapping.setReferenceClass(MWDescriptorLockingPolicy.class); lockingPolicyMapping.setXPath("locking-policy"); descriptor.addMapping(lockingPolicyMapping); XMLDirectMapping criuowMapping = (XMLDirectMapping) descriptor.addDirectMapping("conformResultsInUnitOfWork", "conform-results-in-unit-of-work/text()"); criuowMapping.setNullValue(Boolean.FALSE); return descriptor; } // ********** Constructors ********** /** * Default constructor - for TopLink use only. */ protected MWAbstractTransactionalPolicy() { super(); } protected MWAbstractTransactionalPolicy(MWTransactionalDescriptor parent) { super(parent); } // ********** Initialization ********** /** * initialize persistent state */ protected void initialize(Node parent) { super.initialize(parent); this.queryManager = buildQueryManager(); this.refreshCachePolicy = new MWRefreshCachePolicy(this); this.cachingPolicy = new MWDescriptorCachingPolicy(this); this.lockingPolicy = buildLockingPolicy(); this.descriptorAlias = getDescriptor().shortName(); } protected void addChildrenTo(List children) { super.addChildrenTo(children); children.add(this.refreshCachePolicy); children.add(this.queryManager); children.add(this.cachingPolicy); children.add(this.lockingPolicy); } protected abstract MWQueryManager buildQueryManager(); protected abstract MWLockingPolicy buildLockingPolicy(); private MWTransactionalDescriptor getDescriptor() { return (MWTransactionalDescriptor) getParent(); } // **************** accessors ***************** public MWRefreshCachePolicy getRefreshCachePolicy() { return this.refreshCachePolicy; } public boolean isConformResultsInUnitOfWork() { // this method name not good, but it's convention to have it... for boolean attributes return this.conformResultsInUnitOfWork; } public void setConformResultsInUnitOfWork(boolean newValue) { boolean oldValue = this.conformResultsInUnitOfWork; this.conformResultsInUnitOfWork = newValue; this.firePropertyChanged(CONFORM_RESULTS_IN_UNIT_OF_WORK_PROPERTY, oldValue, newValue); } public boolean isReadOnly() { return this.readOnly; } public void setReadOnly(boolean newValue) { boolean oldValue = this.readOnly; this.readOnly = newValue; this.firePropertyChanged(READ_ONLY_PROPERTY, oldValue, newValue); } public MWCachingPolicy getCachingPolicy() { return this.cachingPolicy; } public MWLockingPolicy getLockingPolicy() { return this.lockingPolicy; } public MWQueryManager getQueryManager() { return this.queryManager; } // ************* Descriptor Alias ************** public String getDescriptorAlias() { return this.descriptorAlias; } public void setDescriptorAlias(String descriptorAlias) { String oldDescriptorAlias = getDescriptorAlias(); this.descriptorAlias = descriptorAlias; firePropertyChanged(DESCRIPTOR_ALIAS_PROPERTY, oldDescriptorAlias, descriptorAlias); } /** Used to keep up to date with inheritance changes * @see MWTransactionalPolicy.descriptorInheritanceChanged() */ public void descriptorInheritanceChanged() { this.cachingPolicy.descriptorInheritanceChanged(); } //*************** runtime conversion ************* public void adjustRuntimeDescriptor(ClassDescriptor runtimeDescriptor) { this.refreshCachePolicy.adjustRuntimeDescriptor(runtimeDescriptor); runtimeDescriptor.setShouldAlwaysConformResultsInUnitOfWork(isConformResultsInUnitOfWork()); runtimeDescriptor.setShouldBeReadOnly(isReadOnly()); runtimeDescriptor.setAlias(getDescriptorAlias()); this.queryManager.adjustRuntimeDescriptor(runtimeDescriptor); this.cachingPolicy.adjustRuntimeDescriptor(runtimeDescriptor); this.lockingPolicy.adjustRuntimeDescriptor(runtimeDescriptor); } // ************ TopLink Methods *********** public MWAbstractTransactionalPolicy getValueForTopLink() { return this; } }