/* * Copyright 2012 Michael Bischoff * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package de.jpaw.bonaparte.core; import java.math.BigDecimal; import de.jpaw.bonaparte.pojos.meta.AlphanumericElementaryDataItem; import de.jpaw.bonaparte.pojos.meta.FieldDefinition; import de.jpaw.bonaparte.pojos.meta.NumericElementaryDataItem; import de.jpaw.bonaparte.pojos.meta.ObjectReference; /** * Defines the methods any object which should be serialized into the bonaparte format must implement. * The class and its implementation is usually created by the bonaparte DSL. * * @author Michael Bischoff * **/ public interface BonaPortable extends BonaCustom { /** Return the metadata provider. (replacement for all class$xx methods) * * @returns */ public BonaPortableClass<? extends BonaPortable> ret$BonaPortableClass(); /** Gets some optional RTTI (runtime type information). If no rtti has been supplied, the rtti of a parent class is returned. * * @return some numeric value defined in the DSL. */ public int ret$rtti(); /** Parses data from a stream or in-memory buffer into a preallocated object. * The reference to the IO stream or memory sits in the {@link MessageParser} parameter. * Parsers for different serialization formats have been implemented, corresponding to the serializer implementations. * * @param p the implementation of the message parser. The generic type E is an exception which is thrown in case of I/O errors or parsing problems. Current implementations use either {@link java.io.IOException} as type for E, or {@link MessageParserException}. * @throws E */ public <E extends Exception> void deserialize(MessageParser<E> p) throws E; /** Will provide an explicit implementation of object validation, similar to JSR 303 Bean Validation. This is still work in progress, please use the reflection based validation for now. * * @throws ObjectValidationException */ public void validate() throws ObjectValidationException; /** Provides a shallow copy of the (super)class specified as parameter. * * @throws IllegalArgumentException if no superclass of the requested type exists */ public <T extends BonaPortable> T copyAs(Class<T> desiredSuperType); /** Can be invoked to apply a String converter to all String typed fields in the object, parent objects, and included child objects. */ public void treeWalkString(DataConverter<String, AlphanumericElementaryDataItem> _cvt, boolean descend); /** Can be invoked to apply a BigDecimal converter to all BigDecimal typed fields in the object, parent objects, and included child objects. */ public void treeWalkBigDecimal(DataConverter<BigDecimal, NumericElementaryDataItem> _cvt, boolean descend); /** Can be invoked to apply an Object converter to all fields in the object, and potentially also included child objects. */ public void treeWalkObject(DataConverter<Object, FieldDefinition> _cvt, boolean descend); /** Can be invoked to apply an Object converter to all fields in the object, and potentially also included child objects. */ public void treeWalkBonaPortable(DataConverter<BonaPortable,ObjectReference> _cvt, boolean descend); /** A BonaPortable can become immutable, by locking all setters. * This mimics some "in place" builder, allows inheritance and avoids the duplicate object definition (by the builder). * An object, once frozen, cannot be "unfrozen" (that would defeat the purpose), therefore immutability is granted. * If mutable copies are desired, either shallow or deep copies can be created, which are created in unfrozen state. * The freeze() method transitions an object into immutable state. The method is not thread-safe, i.e. the freeze should * always be performed on a private copy. Once frozen, the object may be shared with other threads. Use ret$frozenClone() to * get an immutable copy if the previous object was shared with other threads or has other references in this thread. */ void freeze(); /** Returns information, if this object is frozen. * If the object is not frozen, it could still have frozen components. * If the object is frozen, all components are guaranteed to be frozen as well. * * @return true if the object and all its components are frozen, false otherwise. * */ boolean was$Frozen(); /** Obtain a mutable clone of a frozen object. * If deepCopy is set, he object will be recursively mutable, otherwise just the initial layer. */ BonaPortable ret$MutableClone(boolean deepCopy, boolean unfreezeCollections) throws ObjectValidationException; /** Obtain an immutable clone of a (possibly) mutable object. */ BonaPortable ret$FrozenClone() throws ObjectValidationException; /** Method to set an "active" flag on a data record, if it exists. * Throws an exception if no active field has been defined in this class or a superclass. */ public void put$Active(boolean _a) throws ObjectValidationException; /** Returns the value of the "active" field, or "true" if no active field exists, i.e. all instances are regarded as active by default. */ public boolean ret$Active(); }