/*==========================================================================*\ | $Id: QualifierSerialization.java,v 1.1 2010/05/11 14:51:55 aallowat Exp $ |*-------------------------------------------------------------------------*| | Copyright (C) 2006-2008 Virginia Tech | | This file is part of Web-CAT. | | Web-CAT is free software; you can redistribute it and/or modify | it under the terms of the GNU Affero General Public License as published | by the Free Software Foundation; either version 3 of the License, or | (at your option) any later version. | | Web-CAT is distributed in the hope that it will be useful, | but WITHOUT ANY WARRANTY; without even the implied warranty of | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | GNU General Public License for more details. | | You should have received a copy of the GNU Affero General Public License | along with Web-CAT; if not, see <http://www.gnu.org/licenses/>. \*==========================================================================*/ package org.webcat.core; import com.webobjects.eocontrol.EOAndQualifier; import com.webobjects.eocontrol.EOEditingContext; import com.webobjects.eocontrol.EOEnterpriseObject; import com.webobjects.eocontrol.EOGlobalID; import com.webobjects.eocontrol.EOKeyValueQualifier; import com.webobjects.eocontrol.EONotQualifier; import com.webobjects.eocontrol.EOOrQualifier; import com.webobjects.eocontrol.EOQualifier; import com.webobjects.foundation.NSMutableArray; import com.webobjects.foundation.NSMutableDictionary; import er.extensions.eof.qualifiers.ERXInQualifier; import er.extensions.qualifiers.ERXKeyValueQualifier; //------------------------------------------------------------------------- /** * Methods used to serialize and deserialize qualifiers from the database, by * replacing any EOs that they are bound to with the corresponding global IDs, * and vice-versa. * * @author Tony Allevato * @version $Id: QualifierSerialization.java,v 1.1 2010/05/11 14:51:55 aallowat Exp $ */ public class QualifierSerialization { // ---------------------------------------------------------- /** * Static class; prevent instantiation. */ private QualifierSerialization() { // Do nothing } // ---------------------------------------------------------- /** * Deeply traverses a qualifier tree and returns a new qualifier where * any EOs have been replaced by EOGlobalIDs that refer to them. This is * used before a qualifier is serialized into the database. * * @param q the qualifier to convert * @param ec the editing context to use * @return a new qualifier that has had EOs replaced by EOGlobalIDs */ public static EOQualifier convertEOsToGIDs(EOQualifier q, EOEditingContext ec) { if (q == null) { return null; } Class<?> qType = q.getClass(); IConverter converter = converters.objectForKey(qType); if (converter != null) { return converter.convertEOsToGIDs(q, ec); } else { return (EOQualifier) q.clone(); } } // ---------------------------------------------------------- /** * Deeply traverses a qualifier tree and returns a new qualifier where * any EOGlobalIDs have been replaced by the EOs that they refer to. This * is used to reconstitute a qualifier after it has been read in from the * database. * * @param q the qualifier to convert * @param ec the editing context to use * @return a new qualifier that has had EOGlobalIDs replaced by EOs */ public static EOQualifier convertGIDsToEOs(EOQualifier q, EOEditingContext ec) { if (q == null) { return null; } Class<?> qType = q.getClass(); IConverter converter = converters.objectForKey(qType); if (converter != null) { return converter.convertGIDsToEOs(q, ec); } else { return (EOQualifier) q.clone(); } } // ---------------------------------------------------------- /** * The interface that defines the methods used to serialize and * deserialize qualifiers. */ private interface IConverter { // ---------------------------------------------------------- EOQualifier convertEOsToGIDs(EOQualifier q, EOEditingContext ec); // ---------------------------------------------------------- EOQualifier convertGIDsToEOs(EOQualifier q, EOEditingContext ec); } // ---------------------------------------------------------- private static class AndQualifierConverter implements IConverter { // ---------------------------------------------------------- public EOQualifier convertEOsToGIDs(EOQualifier q, EOEditingContext ec) { EOAndQualifier aq = (EOAndQualifier) q; NSMutableArray<EOQualifier> children = new NSMutableArray<EOQualifier>(); for (EOQualifier child : aq.qualifiers()) { children.addObject(QualifierSerialization.convertEOsToGIDs( child, ec)); } return new EOAndQualifier(children); } // ---------------------------------------------------------- public EOQualifier convertGIDsToEOs(EOQualifier q, EOEditingContext ec) { EOAndQualifier aq = (EOAndQualifier) q; NSMutableArray<EOQualifier> children = new NSMutableArray<EOQualifier>(); for (EOQualifier child : aq.qualifiers()) { children.addObject(QualifierSerialization.convertGIDsToEOs(child, ec)); } return new EOAndQualifier(children); } } // ---------------------------------------------------------- private static class OrQualifierConverter implements IConverter { // ---------------------------------------------------------- public EOQualifier convertEOsToGIDs(EOQualifier q, EOEditingContext ec) { EOOrQualifier oq = (EOOrQualifier) q; NSMutableArray<EOQualifier> children = new NSMutableArray<EOQualifier>(); for (EOQualifier child : oq.qualifiers()) { children.addObject(QualifierSerialization.convertEOsToGIDs(child, ec)); } return new EOOrQualifier(children); } // ---------------------------------------------------------- public EOQualifier convertGIDsToEOs(EOQualifier q, EOEditingContext ec) { EOOrQualifier oq = (EOOrQualifier) q; NSMutableArray<EOQualifier> children = new NSMutableArray<EOQualifier>(); for (EOQualifier child : oq.qualifiers()) { children.addObject(QualifierSerialization.convertGIDsToEOs(child, ec)); } return new EOOrQualifier(children); } } // ---------------------------------------------------------- private static class NotQualifierConverter implements IConverter { // ---------------------------------------------------------- public EOQualifier convertEOsToGIDs(EOQualifier q, EOEditingContext ec) { EONotQualifier nq = (EONotQualifier) q; return new EONotQualifier(QualifierSerialization.convertEOsToGIDs(nq .qualifier(), ec)); } // ---------------------------------------------------------- public EOQualifier convertGIDsToEOs(EOQualifier q, EOEditingContext ec) { EONotQualifier nq = (EONotQualifier) q; return new EONotQualifier(QualifierSerialization.convertGIDsToEOs(nq .qualifier(), ec)); } } // ---------------------------------------------------------- private static class InQualifierConverter implements IConverter { // ---------------------------------------------------------- public EOQualifier convertEOsToGIDs(EOQualifier q, EOEditingContext ec) { ERXInQualifier iq = (ERXInQualifier) q; NSMutableArray<Object> values = new NSMutableArray<Object>(); for (Object value : iq.values()) { if (value instanceof EOEnterpriseObject) { values.addObject(ec .globalIDForObject((EOEnterpriseObject) value)); } else { values.addObject(value); } } return new ERXInQualifier(iq.key(), values); } // ---------------------------------------------------------- public EOQualifier convertGIDsToEOs(EOQualifier q, EOEditingContext ec) { ERXInQualifier iq = (ERXInQualifier) q; NSMutableArray<Object> values = new NSMutableArray<Object>(); for (Object value : iq.values()) { if (value instanceof EOGlobalID) { values.addObject(ec .faultForGlobalID((EOGlobalID) value, ec)); } else { values.addObject(value); } } return new ERXInQualifier(iq.key(), values); } } // ---------------------------------------------------------- private static class KeyValueQualifierConverter implements IConverter { // ---------------------------------------------------------- public EOQualifier convertEOsToGIDs(EOQualifier q, EOEditingContext ec) { EOKeyValueQualifier kvq = (EOKeyValueQualifier) q; Object value; if (kvq.value() instanceof EOEnterpriseObject) { value = ec.globalIDForObject((EOEnterpriseObject) kvq.value()); } else { value = kvq.value(); } return new EOKeyValueQualifier(kvq.key(), kvq.selector(), value); } // ---------------------------------------------------------- public EOQualifier convertGIDsToEOs(EOQualifier q, EOEditingContext ec) { EOKeyValueQualifier kvq = (EOKeyValueQualifier) q; Object value; if (kvq.value() instanceof EOGlobalID) { value = ec.faultForGlobalID((EOGlobalID) kvq.value(), ec); } else { value = kvq.value(); } return new EOKeyValueQualifier(kvq.key(), kvq.selector(), value); } } // ---------------------------------------------------------- private static class ERXKeyValueQualifierConverter implements IConverter { // ---------------------------------------------------------- public EOQualifier convertEOsToGIDs(EOQualifier q, EOEditingContext ec) { ERXKeyValueQualifier kvq = (ERXKeyValueQualifier) q; Object value; if (kvq.value() instanceof EOEnterpriseObject) { value = ec.globalIDForObject((EOEnterpriseObject) kvq.value()); } else { value = kvq.value(); } return new ERXKeyValueQualifier(kvq.key(), kvq.selector(), value); } // ---------------------------------------------------------- public EOQualifier convertGIDsToEOs(EOQualifier q, EOEditingContext ec) { ERXKeyValueQualifier kvq = (ERXKeyValueQualifier) q; Object value; if (kvq.value() instanceof EOGlobalID) { value = ec.faultForGlobalID((EOGlobalID) kvq.value(), ec); } else { value = kvq.value(); } return new ERXKeyValueQualifier(kvq.key(), kvq.selector(), value); } } // ---------------------------------------------------------- private static class SubqueryQualifierConverter implements IConverter { // ---------------------------------------------------------- public EOQualifier convertEOsToGIDs(EOQualifier q, EOEditingContext ec) { QualifierInSubquery qis = (QualifierInSubquery) q; EOQualifier converted = QualifierSerialization.convertEOsToGIDs( qis.qualifier(), ec); if (qis.relationshipName() != null) { return new QualifierInSubquery(converted, qis.entityName(), qis.relationshipName()); } else { return new QualifierInSubquery(converted, qis.entityName(), qis.attributeName(), qis.destinationAttributeName()); } } // ---------------------------------------------------------- public EOQualifier convertGIDsToEOs(EOQualifier q, EOEditingContext ec) { QualifierInSubquery qis = (QualifierInSubquery) q; EOQualifier converted = QualifierSerialization.convertGIDsToEOs( qis.qualifier(), ec); if (qis.relationshipName() != null) { return new QualifierInSubquery(converted, qis.entityName(), qis.relationshipName()); } else { return new QualifierInSubquery(converted, qis.entityName(), qis.attributeName(), qis.destinationAttributeName()); } } } //~ Static variables ...................................................... /** A mapping between qualifier classes and converter instances. */ private static NSMutableDictionary<Class<?>, IConverter> converters; static { converters = new NSMutableDictionary<Class<?>, IConverter>(); converters.setObjectForKey(new AndQualifierConverter(), EOAndQualifier.class); converters.setObjectForKey(new OrQualifierConverter(), EOOrQualifier.class); converters.setObjectForKey(new NotQualifierConverter(), EONotQualifier.class); converters.setObjectForKey(new InQualifierConverter(), ERXInQualifier.class); converters.setObjectForKey(new KeyValueQualifierConverter(), EOKeyValueQualifier.class); converters.setObjectForKey(new ERXKeyValueQualifierConverter(), ERXKeyValueQualifier.class); converters.setObjectForKey(new SubqueryQualifierConverter(), QualifierInSubquery.class); } }