Skip to content

Method: static {...}

1: /*
2: * JOPA
3: * Copyright (C) 2024 Czech Technical University in Prague
4: *
5: * This library is free software; you can redistribute it and/or
6: * modify it under the terms of the GNU Lesser General Public
7: * License as published by the Free Software Foundation; either
8: * version 3.0 of the License, or (at your option) any later version.
9: *
10: * This library is distributed in the hope that it will be useful,
11: * but WITHOUT ANY WARRANTY; without even the implied warranty of
12: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13: * Lesser General Public License for more details.
14: *
15: * You should have received a copy of the GNU Lesser General Public
16: * License along with this library.
17: */
18: package cz.cvut.kbss.jopa.sessions;
19:
20: import cz.cvut.kbss.jopa.model.metamodel.EntityType;
21: import cz.cvut.kbss.jopa.model.metamodel.IdentifiableEntityType;
22: import cz.cvut.kbss.jopa.sessions.util.CloneConfiguration;
23: import cz.cvut.kbss.jopa.utils.ReflectionUtils;
24:
25: import java.lang.reflect.Field;
26:
27: /**
28: * Builds instances of entity types.
29: * <p>
30: * This builder expects the original's class has a public no-arg constructor. Furthermore, if the configuration
31: * specifies that the result will be registered in a persistence context, the instance built is not the base Java type
32: * of the original, but rather the {@link IdentifiableEntityType#getInstantiableJavaType()} result, which is a generated
33: * subclass whose instances can be attached to the persistence context.
34: */
35: public class ManagedInstanceBuilder extends DefaultInstanceBuilder {
36:
37: ManagedInstanceBuilder(CloneBuilder builder, UnitOfWork uow) {
38: super(builder, uow);
39: }
40:
41: @Override
42: Object buildClone(Object cloneOwner, Field field, Object original, CloneConfiguration config) {
43: assert uow.isEntityType(original.getClass());
44: final EntityType<?> et = uow.getMetamodel().entity(original.getClass());
45: assert et != null;
46: final Class<?> cls = config.isForPersistenceContext() ? ((IdentifiableEntityType<?>) et).getInstantiableJavaType() : et.getJavaType();
47: return ReflectionUtils.instantiateUsingDefaultConstructor(cls);
48: }
49: }