PageRenderTime 49ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 1ms

/addon-jpa/addon/src/main/java/org/springframework/roo/addon/jpa/addon/entity/JpaFieldCreatorProvider.java

http://github.com/SpringSource/spring-roo
Java | 2376 lines | 1650 code | 362 blank | 364 comment | 430 complexity | 5ee7772f7ae4137df42e694359e103ef MD5 | raw file

Large files files are truncated, but you can click here to view the full file

  1. package org.springframework.roo.addon.jpa.addon.entity;
  2. import static org.springframework.roo.model.JdkJavaType.LIST;
  3. import static org.springframework.roo.model.JdkJavaType.SET;
  4. import static org.springframework.roo.model.JpaJavaType.ENTITY;
  5. import static org.springframework.roo.model.SpringJavaType.PERSISTENT;
  6. import static org.springframework.roo.shell.OptionContexts.PROJECT;
  7. import org.apache.commons.lang3.StringEscapeUtils;
  8. import org.apache.commons.lang3.StringUtils;
  9. import org.apache.commons.lang3.Validate;
  10. import org.apache.felix.scr.annotations.Component;
  11. import org.apache.felix.scr.annotations.Reference;
  12. import org.apache.felix.scr.annotations.Service;
  13. import org.osgi.framework.BundleContext;
  14. import org.osgi.framework.InvalidSyntaxException;
  15. import org.osgi.framework.ServiceReference;
  16. import org.osgi.service.component.ComponentContext;
  17. import org.springframework.roo.addon.field.addon.FieldCommands;
  18. import org.springframework.roo.addon.field.addon.FieldCreatorProvider;
  19. import org.springframework.roo.addon.jpa.addon.entity.factories.JpaEntityFactoryLocator;
  20. import org.springframework.roo.addon.plural.addon.PluralService;
  21. import org.springframework.roo.addon.test.providers.DataOnDemandCreatorProvider;
  22. import org.springframework.roo.classpath.PhysicalTypeCategory;
  23. import org.springframework.roo.classpath.PhysicalTypeDetails;
  24. import org.springframework.roo.classpath.PhysicalTypeMetadata;
  25. import org.springframework.roo.classpath.TypeLocationService;
  26. import org.springframework.roo.classpath.TypeManagementService;
  27. import org.springframework.roo.classpath.details.ClassOrInterfaceTypeDetails;
  28. import org.springframework.roo.classpath.details.FieldDetails;
  29. import org.springframework.roo.classpath.details.FieldMetadata;
  30. import org.springframework.roo.classpath.details.FieldMetadataBuilder;
  31. import org.springframework.roo.classpath.details.MemberHoldingTypeDetails;
  32. import org.springframework.roo.classpath.details.annotations.AnnotationAttributeValue;
  33. import org.springframework.roo.classpath.details.annotations.AnnotationMetadata;
  34. import org.springframework.roo.classpath.details.annotations.AnnotationMetadataBuilder;
  35. import org.springframework.roo.classpath.details.comments.CommentFormatter;
  36. import org.springframework.roo.classpath.operations.Cardinality;
  37. import org.springframework.roo.classpath.operations.Cascade;
  38. import org.springframework.roo.classpath.operations.DateTime;
  39. import org.springframework.roo.classpath.operations.EnumType;
  40. import org.springframework.roo.classpath.operations.Fetch;
  41. import org.springframework.roo.classpath.operations.jsr303.BooleanField;
  42. import org.springframework.roo.classpath.operations.jsr303.CollectionField;
  43. import org.springframework.roo.classpath.operations.jsr303.DateField;
  44. import org.springframework.roo.classpath.operations.jsr303.DateFieldPersistenceType;
  45. import org.springframework.roo.classpath.operations.jsr303.EmbeddedField;
  46. import org.springframework.roo.classpath.operations.jsr303.EnumField;
  47. import org.springframework.roo.classpath.operations.jsr303.ListField;
  48. import org.springframework.roo.classpath.operations.jsr303.NumericField;
  49. import org.springframework.roo.classpath.operations.jsr303.ReferenceField;
  50. import org.springframework.roo.classpath.operations.jsr303.SetField;
  51. import org.springframework.roo.classpath.operations.jsr303.StringField;
  52. import org.springframework.roo.classpath.operations.jsr303.UploadedFileContentType;
  53. import org.springframework.roo.classpath.operations.jsr303.UploadedFileField;
  54. import org.springframework.roo.classpath.scanner.MemberDetails;
  55. import org.springframework.roo.classpath.scanner.MemberDetailsScanner;
  56. import org.springframework.roo.metadata.MetadataService;
  57. import org.springframework.roo.model.DataType;
  58. import org.springframework.roo.model.EnumDetails;
  59. import org.springframework.roo.model.JavaSymbolName;
  60. import org.springframework.roo.model.JavaType;
  61. import org.springframework.roo.model.JdkJavaType;
  62. import org.springframework.roo.model.JpaJavaType;
  63. import org.springframework.roo.model.ReservedWords;
  64. import org.springframework.roo.model.RooEnumDetails;
  65. import org.springframework.roo.model.RooJavaType;
  66. import org.springframework.roo.model.SpringletsJavaType;
  67. import org.springframework.roo.project.LogicalPath;
  68. import org.springframework.roo.project.ProjectOperations;
  69. import org.springframework.roo.settings.project.ProjectSettingsService;
  70. import org.springframework.roo.shell.Converter;
  71. import org.springframework.roo.shell.ShellContext;
  72. import org.springframework.roo.support.logging.HandlerUtils;
  73. import java.lang.reflect.Modifier;
  74. import java.util.ArrayList;
  75. import java.util.Arrays;
  76. import java.util.List;
  77. import java.util.Set;
  78. import java.util.logging.Logger;
  79. /**
  80. * Provides field creation operations support for JPA entities by implementing
  81. * FieldCreatorProvider.
  82. *
  83. * @author Sergio Clares
  84. * @author Jose Manuel Vivó
  85. * @author Juan Carlos García
  86. * @author Fran Cardoso
  87. * @since 2.0
  88. */
  89. @Component
  90. @Service
  91. public class JpaFieldCreatorProvider implements FieldCreatorProvider {
  92. protected final static Logger LOGGER = HandlerUtils.getLogger(FieldCommands.class);
  93. //------------ OSGi component attributes ----------------//
  94. private BundleContext context;
  95. @Reference
  96. private TypeLocationService typeLocationService;
  97. @Reference
  98. private ProjectOperations projectOperations;
  99. @Reference
  100. private ProjectSettingsService projectSettings;
  101. @Reference
  102. private MetadataService metadataService;
  103. @Reference
  104. private TypeManagementService typeManagementService;
  105. @Reference
  106. private MemberDetailsScanner memberDetailsScanner;
  107. @Reference
  108. private PluralService pluralService;
  109. @Reference
  110. private DataOnDemandCreatorProvider dataOnDemandCreatorProvider;
  111. @Reference
  112. private JpaEntityFactoryLocator jpaEntityFactoryLocator;
  113. private Converter<JavaType> javaTypeConverter;
  114. private static final String SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME =
  115. "spring.roo.jpa.require.schema-object-name";
  116. private static final String CARDINALITY = "cardinality";
  117. private static final String JOIN_TABLE = "joinTable";
  118. private static final String JOIN_COLUMN_NAME = "joinColumnName";
  119. private static final String ONE_TO_MANY = "ONE_TO_MANY";
  120. private static final String MANY_TO_MANY = "MANY_TO_MANY";
  121. private static final String TRUE = "true";
  122. protected void activate(final ComponentContext context) {
  123. this.context = context.getBundleContext();
  124. }
  125. protected void deactivate(final ComponentContext context) {
  126. this.context = null;
  127. }
  128. @Override
  129. public boolean isValid(JavaType javaType) {
  130. ClassOrInterfaceTypeDetails cid = typeLocationService.getTypeDetails(javaType);
  131. if (cid.getAnnotation(RooJavaType.ROO_JPA_ENTITY) != null
  132. || cid.getAnnotation(JpaJavaType.ENTITY) != null) {
  133. return true;
  134. }
  135. return false;
  136. }
  137. @Override
  138. public boolean isFieldManagementAvailable() {
  139. Set<ClassOrInterfaceTypeDetails> entities =
  140. typeLocationService.findClassesOrInterfaceDetailsWithAnnotation(JpaJavaType.ENTITY,
  141. RooJavaType.ROO_JPA_ENTITY);
  142. if (!entities.isEmpty()) {
  143. return true;
  144. }
  145. return false;
  146. }
  147. @Override
  148. public boolean isFieldEmbeddedAvailable() {
  149. return true;
  150. }
  151. @Override
  152. public boolean isFieldReferenceAvailable() {
  153. return true;
  154. }
  155. @Override
  156. public boolean isFieldCollectionAvailable() {
  157. return true;
  158. }
  159. /**
  160. * ROO-3710: Indicator that checks if exists some project setting that makes
  161. * table column parameter mandatory.
  162. *
  163. * @param shellContext
  164. * @return true if exists property
  165. * {@link #SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME} on project
  166. * settings and its value is "true". If not, return false.
  167. */
  168. @Override
  169. public boolean isColumnMandatoryForFieldBoolean(ShellContext shellContext) {
  170. // Check if property 'spring.roo.jpa.require.schema-object-name' is defined
  171. // on
  172. // project settings
  173. String requiredSchemaObjectName =
  174. projectSettings.getProperty(SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME);
  175. if (requiredSchemaObjectName != null && requiredSchemaObjectName.equals(TRUE)) {
  176. return true;
  177. }
  178. return false;
  179. }
  180. @Override
  181. public boolean isColumnVisibleForFieldBoolean(ShellContext shellContext) {
  182. return true;
  183. }
  184. @Override
  185. public boolean isTransientVisibleForFieldBoolean(ShellContext shellContext) {
  186. return true;
  187. }
  188. @Override
  189. public boolean isAssertFalseVisibleForFieldBoolean(ShellContext shellContext) {
  190. String param = shellContext.getParameters().get("assertTrue");
  191. if (param != null) {
  192. return false;
  193. }
  194. return true;
  195. }
  196. @Override
  197. public boolean isAssertTrueVisibleForFieldBoolean(ShellContext shellContext) {
  198. String param = shellContext.getParameters().get("assertFalse");
  199. if (param != null) {
  200. return false;
  201. }
  202. return true;
  203. }
  204. /**
  205. * ROO-3710: Indicator that checks if exists some project setting that makes
  206. * table column parameter mandatory.
  207. *
  208. * @param shellContext
  209. * @return true if exists property
  210. * {@link #SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME} on project
  211. * settings and its value is "true". If not, return false.
  212. */
  213. @Override
  214. public boolean isColumnMandatoryForFieldDate(ShellContext shellContext) {
  215. // Check if property 'spring.roo.jpa.require.schema-object-name' is defined
  216. // on
  217. // project settings
  218. String requiredSchemaObjectName =
  219. projectSettings.getProperty(SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME);
  220. if (requiredSchemaObjectName != null && requiredSchemaObjectName.equals(TRUE)) {
  221. return true;
  222. }
  223. return false;
  224. }
  225. @Override
  226. public boolean isColumnVisibleForFieldDate(ShellContext shellContext) {
  227. return true;
  228. }
  229. @Override
  230. public boolean isPersistenceTypeVisibleForFieldDate(ShellContext shellContext) {
  231. return true;
  232. }
  233. @Override
  234. public boolean isTransientVisibleForFieldDate(ShellContext shellContext) {
  235. return true;
  236. }
  237. @Override
  238. public boolean isFutureVisibleForFieldDate(ShellContext shellContext) {
  239. String past = shellContext.getParameters().get("past");
  240. if (past != null) {
  241. return false;
  242. }
  243. return true;
  244. }
  245. @Override
  246. public boolean isPastVisibleForFieldDate(ShellContext shellContext) {
  247. String past = shellContext.getParameters().get("future");
  248. if (past != null) {
  249. return false;
  250. }
  251. return true;
  252. }
  253. @Override
  254. public boolean areDateAndTimeFormatVisibleForFieldDate(ShellContext shellContext) {
  255. String dateTimeFormatPattern = shellContext.getParameters().get("dateTimeFormatPattern");
  256. if (dateTimeFormatPattern != null) {
  257. return false;
  258. }
  259. return true;
  260. }
  261. @Override
  262. public boolean isDateTimeFormatPatternVisibleForFieldDate(ShellContext shellContext) {
  263. String dateFormat = shellContext.getParameters().get("dateFormat");
  264. String timeFormat = shellContext.getParameters().get("timeFormat");
  265. if (dateFormat == null && timeFormat == null) {
  266. return true;
  267. }
  268. return false;
  269. }
  270. @Override
  271. public boolean isNotNullVisibleForFieldDate(ShellContext shellContext) {
  272. String antagonistParam = shellContext.getParameters().get("nullRequired");
  273. if (antagonistParam != null) {
  274. return false;
  275. }
  276. return true;
  277. }
  278. @Override
  279. public boolean isNullRequiredVisibleForFieldDate(ShellContext shellContext) {
  280. String antagonistParam = shellContext.getParameters().get("notNull");
  281. if (antagonistParam != null) {
  282. return false;
  283. }
  284. return true;
  285. }
  286. /**
  287. * ROO-3710: Indicator that checks if exists some project setting that makes
  288. * table column parameter mandatory.
  289. *
  290. * @param shellContext
  291. * @return true if exists property
  292. * {@link #SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME} on project
  293. * settings and its value is "true". If not, return false.
  294. */
  295. @Override
  296. public boolean isColumnMandatoryForFieldEnum(ShellContext shellContext) {
  297. // Check if property 'spring.roo.jpa.require.schema-object-name' is defined
  298. // on
  299. // project settings
  300. String requiredSchemaObjectName =
  301. projectSettings.getProperty(SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME);
  302. if (requiredSchemaObjectName != null && requiredSchemaObjectName.equals(TRUE)) {
  303. return true;
  304. }
  305. return false;
  306. }
  307. @Override
  308. public boolean isColumnVisibleForFieldEnum(ShellContext shellContext) {
  309. return true;
  310. }
  311. @Override
  312. public boolean isEnumTypeVisibleForFieldEnum(ShellContext shellContext) {
  313. return true;
  314. }
  315. @Override
  316. public boolean isTransientVisibleForFieldEnum(ShellContext shellContext) {
  317. return true;
  318. }
  319. @Override
  320. public boolean isNotNullVisibleForFieldEnum(ShellContext shellContext) {
  321. String antagonistParam = shellContext.getParameters().get("nullRequired");
  322. if (antagonistParam != null) {
  323. return false;
  324. }
  325. return true;
  326. }
  327. @Override
  328. public boolean isNullRequiredVisibleForFieldEnum(ShellContext shellContext) {
  329. String antagonistParam = shellContext.getParameters().get("notNull");
  330. if (antagonistParam != null) {
  331. return false;
  332. }
  333. return true;
  334. }
  335. /**
  336. * ROO-3710: Indicator that checks if exists some project setting that makes
  337. * table column parameter mandatory.
  338. *
  339. * @param shellContext
  340. * @return true if exists property
  341. * {@link #SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME} on project
  342. * settings and its value is "true". If not, return false.
  343. */
  344. @Override
  345. public boolean isColumnMandatoryForFieldNumber(ShellContext shellContext) {
  346. // Check if property 'spring.roo.jpa.require.schema-object-name' is defined
  347. // on
  348. // project settings
  349. String requiredSchemaObjectName =
  350. projectSettings.getProperty(SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME);
  351. if (requiredSchemaObjectName != null && requiredSchemaObjectName.equals(TRUE)) {
  352. return true;
  353. }
  354. return false;
  355. }
  356. @Override
  357. public boolean isColumnVisibleForFieldNumber(ShellContext shellContext) {
  358. return true;
  359. }
  360. @Override
  361. public boolean isUniqueVisibleForFieldNumber(ShellContext shellContext) {
  362. return true;
  363. }
  364. @Override
  365. public boolean isTransientVisibleForFieldNumber(ShellContext shellContext) {
  366. return true;
  367. }
  368. @Override
  369. public boolean isNullRequiredVisibleForFieldNumber(ShellContext shellContext) {
  370. // Check if `notNull`is specified
  371. String notNullParam = shellContext.getParameters().get("notNull");
  372. if (notNullParam != null) {
  373. return false;
  374. }
  375. // Check if type is primitive
  376. String typeValue = shellContext.getParameters().get("type");
  377. if (StringUtils.isNotBlank(typeValue)) {
  378. JavaType numberType =
  379. getJavaTypeConverter().convertFromText(typeValue, JavaType.class, "java-number");
  380. if (numberType.isPrimitive()) {
  381. return false;
  382. }
  383. }
  384. return true;
  385. }
  386. @Override
  387. public boolean isNotNullVisibleForFieldNumber(ShellContext shellContext) {
  388. String antagonistParam = shellContext.getParameters().get("nullRequired");
  389. if (antagonistParam != null) {
  390. return false;
  391. }
  392. return true;
  393. }
  394. /**
  395. * ROO-3710: Indicator that checks if exists some project setting that makes
  396. * table column parameter mandatory.
  397. *
  398. * @param shellContext
  399. * @return true if exists property
  400. * {@link #SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME} on project
  401. * settings and its value is "true". If not, return false.
  402. */
  403. @Override
  404. public boolean isColumnMandatoryForFieldReference(ShellContext shellContext) {
  405. // Check if property 'spring.roo.jpa.require.schema-object-name' is defined
  406. // on
  407. // project settings
  408. String requiredSchemaObjectName =
  409. projectSettings.getProperty(SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME);
  410. if (requiredSchemaObjectName != null && requiredSchemaObjectName.equals(TRUE)) {
  411. return true;
  412. }
  413. return false;
  414. }
  415. @Override
  416. public boolean isJoinColumnNameVisibleForFieldReference(ShellContext shellContext) {
  417. return true;
  418. }
  419. @Override
  420. public boolean isReferencedColumnNameVisibleForFieldReference(ShellContext shellContext) {
  421. return true;
  422. }
  423. @Override
  424. public boolean isFetchVisibleForFieldReference(ShellContext shellContext) {
  425. return true;
  426. }
  427. @Override
  428. public boolean isCascadeTypeVisibleForFieldReference(ShellContext shellContext) {
  429. return true;
  430. }
  431. @Override
  432. public boolean isNotNullVisibleForFieldReference(ShellContext shellContext) {
  433. String antagonistParam = shellContext.getParameters().get("nullRequired");
  434. if (antagonistParam != null) {
  435. return false;
  436. }
  437. return true;
  438. }
  439. @Override
  440. public boolean isNullRequiredVisibleForFieldReference(ShellContext shellContext) {
  441. String antagonistParam = shellContext.getParameters().get("notNull");
  442. if (antagonistParam != null) {
  443. return false;
  444. }
  445. return true;
  446. }
  447. @Override
  448. public boolean areOptionalParametersVisibleForFieldSet(ShellContext shellContext) {
  449. String cardinality = shellContext.getParameters().get(CARDINALITY);
  450. String joinColumnNameParam = shellContext.getParameters().get(JOIN_COLUMN_NAME);
  451. String joinTableParam = shellContext.getParameters().get(JOIN_TABLE);
  452. // Check if property 'spring.roo.jpa.require.schema-object-name' is defined
  453. // on project settings
  454. boolean requiredSchemaObjectName =
  455. TRUE.equals(projectSettings.getProperty(SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME));
  456. if (!requiredSchemaObjectName) {
  457. return true;
  458. }
  459. if (MANY_TO_MANY.equals(cardinality)) {
  460. return true;
  461. }
  462. if (joinColumnNameParam == null && joinTableParam == null) {
  463. return false;
  464. }
  465. return true;
  466. }
  467. @Override
  468. public boolean isJoinColumnNameMandatoryForFieldSet(ShellContext shellContext) {
  469. String cardinality = shellContext.getParameters().get(CARDINALITY);
  470. if (MANY_TO_MANY.equals(cardinality)) {
  471. // Never available for MANY-TO-MANY relationships
  472. return false;
  473. }
  474. // Check if param 'joinTable' is already defined
  475. String joinColumnNameParam = shellContext.getParameters().get(JOIN_COLUMN_NAME);
  476. // Check if property 'spring.roo.jpa.require.schema-object-name' is defined
  477. // on project settings
  478. boolean requiredSchemaObjectName =
  479. (TRUE).equals(projectSettings.getProperty(SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME));
  480. if (requiredSchemaObjectName && joinColumnNameParam != null) {
  481. return true;
  482. }
  483. return false;
  484. }
  485. /**
  486. * ROO-3710: Indicator that checks if exists some project setting that makes
  487. * table column parameter mandatory.
  488. *
  489. * @param shellContext
  490. * @return true if exists property
  491. * {@link #SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME} on project
  492. * settings and its value is "true". If not, return false.
  493. */
  494. @Override
  495. public boolean areJoinTableParamsMandatoryForFieldSet(ShellContext shellContext) {
  496. // Check if property 'spring.roo.jpa.require.schema-object-name' is defined
  497. // on project settings
  498. String requiredSchemaObjectName =
  499. projectSettings.getProperty(SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME);
  500. // See if joinTable param has been specified
  501. String joinTableParam = shellContext.getParameters().get(JOIN_TABLE);
  502. if (joinTableParam != null && requiredSchemaObjectName != null
  503. && requiredSchemaObjectName.equals(TRUE)) {
  504. return true;
  505. }
  506. return false;
  507. }
  508. /**
  509. * ROO-3710: Indicator that checks if exists some project setting that makes
  510. * table column parameter mandatory.
  511. *
  512. * @param shellContext
  513. * @return true if exists property
  514. * {@link #SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME} on project
  515. * settings and its value is "true". If not, return false.
  516. */
  517. @Override
  518. public boolean isJoinTableMandatoryForFieldSet(ShellContext shellContext) {
  519. String cardinality = shellContext.getParameters().get(CARDINALITY);
  520. String joinTableParam = shellContext.getParameters().get(JOIN_TABLE);
  521. // Check if property 'spring.roo.jpa.require.schema-object-name' is defined
  522. // on project settings
  523. String requiredSchemaObjectName =
  524. projectSettings.getProperty(SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME);
  525. if (requiredSchemaObjectName != null && requiredSchemaObjectName.equals(TRUE)) {
  526. // property 'spring.roo.jpa.require.schema-object-name' is defined 'true'
  527. if (cardinality != null && cardinality.equals(MANY_TO_MANY)) {
  528. // mandatory if cardinality is MANY_TO_MANY
  529. return true;
  530. } else if ((cardinality == null || cardinality.equals(ONE_TO_MANY)) && joinTableParam != null) {
  531. // mandatory if cardinality is ONE_TO_MANY and '--joinTable' is already specified
  532. return true;
  533. }
  534. }
  535. return false;
  536. }
  537. @Override
  538. public boolean areJoinTableParamsVisibleForFieldSet(ShellContext shellContext) {
  539. String joinTableParam = shellContext.getParameters().get(JOIN_TABLE);
  540. if (joinTableParam != null) {
  541. return true;
  542. }
  543. return false;
  544. }
  545. @Override
  546. public boolean isMappedByVisibleForFieldSet(ShellContext shellContext) {
  547. return true;
  548. }
  549. @Override
  550. public boolean isCardinalityVisibleForFieldSet(ShellContext shellContext) {
  551. if (!areOptionalParametersVisibleForFieldList(shellContext)) {
  552. return false;
  553. }
  554. // Only can be ONE-TO-MANY if '--joinColumnName' has been specified
  555. return !StringUtils.isNotBlank(shellContext.getParameters().get(JOIN_COLUMN_NAME));
  556. }
  557. @Override
  558. public boolean isFetchVisibleForFieldSet(ShellContext shellContext) {
  559. return true;
  560. }
  561. @Override
  562. public boolean isJoinTableVisibleForFieldSet(ShellContext shellContext) {
  563. String joinColumnNameParam = shellContext.getParameters().get(JOIN_COLUMN_NAME);
  564. if (joinColumnNameParam == null) {
  565. // Visible if '--joinColumnName' is not specified
  566. return true;
  567. }
  568. return false;
  569. }
  570. @Override
  571. public boolean isJoinColumnNameVisibleForFieldSet(ShellContext shellContext) {
  572. String joinTableParam = shellContext.getParameters().get(JOIN_TABLE);
  573. String cardinality = shellContext.getParameters().get(CARDINALITY);
  574. if (MANY_TO_MANY.equals(cardinality)) {
  575. // Never available for MANY-TO-MANY relationships
  576. return false;
  577. }
  578. if (joinTableParam == null) {
  579. // Visible if '--joinTable' is not specified
  580. return true;
  581. }
  582. return false;
  583. }
  584. @Override
  585. public boolean isReferencedColumnNameVisibleForFieldSet(ShellContext shellContext) {
  586. String joinColumnNameParam = shellContext.getParameters().get(JOIN_COLUMN_NAME);
  587. if (joinColumnNameParam == null) {
  588. return false;
  589. }
  590. return true;
  591. }
  592. @Override
  593. public boolean isNotNullVisibleForFieldSet(ShellContext shellContext) {
  594. String antagonistParam = shellContext.getParameters().get("nullRequired");
  595. if (antagonistParam != null) {
  596. return false;
  597. }
  598. return true;
  599. }
  600. @Override
  601. public boolean isNullRequiredVisibleForFieldSet(ShellContext shellContext) {
  602. String antagonistParam = shellContext.getParameters().get("notNull");
  603. if (antagonistParam != null) {
  604. return false;
  605. }
  606. return true;
  607. }
  608. @Override
  609. public boolean areOptionalParametersVisibleForFieldList(ShellContext shellContext) {
  610. String cardinality = shellContext.getParameters().get(CARDINALITY);
  611. String joinColumnNameParam = shellContext.getParameters().get(JOIN_COLUMN_NAME);
  612. String joinTableParam = shellContext.getParameters().get(JOIN_TABLE);
  613. // Check if property 'spring.roo.jpa.require.schema-object-name' is defined
  614. // on project settings
  615. boolean requiredSchemaObjectName =
  616. TRUE.equals(projectSettings.getProperty(SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME));
  617. if (!requiredSchemaObjectName) {
  618. return true;
  619. }
  620. if (MANY_TO_MANY.equals(cardinality)) {
  621. return true;
  622. }
  623. if (joinColumnNameParam == null && joinTableParam == null) {
  624. return false;
  625. }
  626. return true;
  627. }
  628. @Override
  629. public boolean areJoinTableParamsVisibleForFieldList(ShellContext shellContext) {
  630. String joinTableParam = shellContext.getParameters().get(JOIN_TABLE);
  631. if (joinTableParam != null) {
  632. return true;
  633. }
  634. return false;
  635. }
  636. @Override
  637. public boolean isJoinTableMandatoryForFieldList(ShellContext shellContext) {
  638. String cardinality = shellContext.getParameters().get(CARDINALITY);
  639. String joinTableParam = shellContext.getParameters().get(JOIN_TABLE);
  640. // Check if property 'spring.roo.jpa.require.schema-object-name' is defined
  641. // on project settings
  642. String requiredSchemaObjectName =
  643. projectSettings.getProperty(SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME);
  644. if (requiredSchemaObjectName != null && requiredSchemaObjectName.equals(TRUE)) {
  645. // property 'spring.roo.jpa.require.schema-object-name' is defined 'true'
  646. if (cardinality != null && cardinality.equals(MANY_TO_MANY)) {
  647. // mandatory if cardinality is MANY_TO_MANY
  648. return true;
  649. } else if ((cardinality == null || cardinality.equals(ONE_TO_MANY)) && joinTableParam != null) {
  650. // mandatory if cardinality is ONE_TO_MANY and '--joinTable' is already specified
  651. return true;
  652. }
  653. }
  654. return false;
  655. }
  656. @Override
  657. public boolean isJoinTableVisibleForFieldList(ShellContext shellContext) {
  658. String joinColumnNameParam = shellContext.getParameters().get(JOIN_COLUMN_NAME);
  659. if (joinColumnNameParam == null) {
  660. // Visible if '--joinColumnName' is not specified
  661. return true;
  662. }
  663. return false;
  664. }
  665. @Override
  666. public boolean isJoinColumnNameVisibleForFieldList(ShellContext shellContext) {
  667. String joinTableParam = shellContext.getParameters().get(JOIN_TABLE);
  668. String cardinality = shellContext.getParameters().get(CARDINALITY);
  669. if ("MANY_TO_MANY".equals(cardinality)) {
  670. // Never available for MANY-TO-MANY relationships
  671. return false;
  672. }
  673. if (joinTableParam == null) {
  674. // Visible if '--joinTable' is not specified
  675. return true;
  676. }
  677. return false;
  678. }
  679. @Override
  680. public boolean isReferencedColumnNameVisibleForFieldList(ShellContext shellContext) {
  681. String joinColumnNameParam = shellContext.getParameters().get(JOIN_COLUMN_NAME);
  682. if (joinColumnNameParam == null) {
  683. return false;
  684. }
  685. return true;
  686. }
  687. /**
  688. * ROO-3710: Indicator that checks if exists some project setting that makes
  689. * table column parameter mandatory.
  690. *
  691. * @param shellContext
  692. * @return true if exists property
  693. * {@link #SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME} on project
  694. * settings and its value is "true". If not, return false.
  695. */
  696. @Override
  697. public boolean areJoinTableParamsMandatoryForFieldList(ShellContext shellContext) {
  698. // Check if property 'spring.roo.jpa.require.schema-object-name' is defined
  699. // on project settings
  700. String requiredSchemaObjectName =
  701. projectSettings.getProperty(SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME);
  702. // See if joinTable param has been specified
  703. String joinTableParam = shellContext.getParameters().get(JOIN_TABLE);
  704. if (joinTableParam != null && requiredSchemaObjectName != null
  705. && requiredSchemaObjectName.equals(TRUE)) {
  706. return true;
  707. }
  708. return false;
  709. }
  710. @Override
  711. public boolean isMappedByVisibleForFieldList(ShellContext shellContext) {
  712. return true;
  713. }
  714. @Override
  715. public boolean isCardinalityVisibleForFieldList(ShellContext shellContext) {
  716. if (!areOptionalParametersVisibleForFieldList(shellContext)) {
  717. return false;
  718. }
  719. // Only can be ONE-TO-MANY if '--joinColumnName' has been specified
  720. return !StringUtils.isNotBlank(shellContext.getParameters().get(JOIN_COLUMN_NAME));
  721. }
  722. @Override
  723. public boolean isFetchVisibleForFieldList(ShellContext shellContext) {
  724. return true;
  725. }
  726. @Override
  727. public boolean isJoinColumnNameMandatoryForFieldList(ShellContext shellContext) {
  728. String cardinality = shellContext.getParameters().get(CARDINALITY);
  729. if (MANY_TO_MANY.equals(cardinality)) {
  730. // Never available for MANY-TO-MANY relationships
  731. return false;
  732. }
  733. // Check if param 'joinTable' is already defined
  734. String joinColumnNameParam = shellContext.getParameters().get(JOIN_COLUMN_NAME);
  735. // Check if property 'spring.roo.jpa.require.schema-object-name' is defined
  736. // on project settings
  737. boolean requiredSchemaObjectName =
  738. (TRUE).equals(projectSettings.getProperty(SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME));
  739. if (requiredSchemaObjectName && joinColumnNameParam != null) {
  740. return true;
  741. }
  742. return false;
  743. }
  744. @Override
  745. public boolean isNotNullVisibleForFieldList(ShellContext shellContext) {
  746. String antagonistParam = shellContext.getParameters().get("nullRequired");
  747. if (antagonistParam != null) {
  748. return false;
  749. }
  750. return true;
  751. }
  752. @Override
  753. public boolean isNullRequiredVisibleForFieldList(ShellContext shellContext) {
  754. String antagonistParam = shellContext.getParameters().get("notNull");
  755. if (antagonistParam != null) {
  756. return false;
  757. }
  758. return true;
  759. }
  760. /**
  761. * ROO-3710: Indicator that checks if exists some project setting that makes
  762. * table column parameter mandatory.
  763. *
  764. * @param shellContext
  765. * @return true if exists property
  766. * {@link #SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME} on project
  767. * settings and its value is "true". If not, return false.
  768. */
  769. @Override
  770. public boolean isColumnMandatoryForFieldString(ShellContext shellContext) {
  771. // Check if property 'spring.roo.jpa.require.schema-object-name' is defined
  772. // on
  773. // project settings
  774. String requiredSchemaObjectName =
  775. projectSettings.getProperty(SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME);
  776. if (requiredSchemaObjectName != null && requiredSchemaObjectName.equals(TRUE)) {
  777. return true;
  778. }
  779. return false;
  780. }
  781. @Override
  782. public boolean isColumnVisibleForFieldString(ShellContext shellContext) {
  783. return true;
  784. }
  785. @Override
  786. public boolean isUniqueVisibleForFieldString(ShellContext shellContext) {
  787. return true;
  788. }
  789. @Override
  790. public boolean isTransientVisibleForFieldString(ShellContext shellContext) {
  791. return true;
  792. }
  793. @Override
  794. public boolean isLobVisibleForFieldString(ShellContext shellContext) {
  795. return true;
  796. }
  797. @Override
  798. public boolean isNotNullVisibleForFieldString(ShellContext shellContext) {
  799. String antagonistParam = shellContext.getParameters().get("nullRequired");
  800. if (antagonistParam != null) {
  801. return false;
  802. }
  803. return true;
  804. }
  805. @Override
  806. public boolean isNullRequiredVisibleForFieldString(ShellContext shellContext) {
  807. String antagonistParam = shellContext.getParameters().get("notNull");
  808. if (antagonistParam != null) {
  809. return false;
  810. }
  811. return true;
  812. }
  813. /**
  814. * ROO-3710: Indicator that checks if exists some project setting that makes
  815. * table column parameter mandatory.
  816. *
  817. * @param shellContext
  818. * @return true if exists property
  819. * {@link #SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME} on project
  820. * settings and its value is "true". If not, return false.
  821. */
  822. @Override
  823. public boolean isColumnMandatoryForFieldFile(ShellContext shellContext) {
  824. // Check if property 'spring.roo.jpa.require.schema-object-name' is defined
  825. // on
  826. // project settings
  827. String requiredSchemaObjectName =
  828. projectSettings.getProperty(SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME);
  829. if (requiredSchemaObjectName != null && requiredSchemaObjectName.equals(TRUE)) {
  830. return true;
  831. }
  832. return false;
  833. }
  834. @Override
  835. public boolean isColumnVisibleForFieldFile(ShellContext shellContext) {
  836. return true;
  837. }
  838. /**
  839. * ROO-3710: Indicator that checks if exists some project setting that makes
  840. * table column parameter mandatory.
  841. *
  842. * @param shellContext
  843. * @return true if exists property
  844. * {@link #SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME} on project
  845. * settings and its value is "true". If not, return false.
  846. */
  847. public boolean isColumnMandatoryForFieldOther(ShellContext shellContext) {
  848. // Check if property 'spring.roo.jpa.require.schema-object-name' is defined
  849. // on
  850. // project settings
  851. String requiredSchemaObjectName =
  852. projectSettings.getProperty(SPRING_ROO_JPA_REQUIRE_SCHEMA_OBJECT_NAME);
  853. if (requiredSchemaObjectName != null && requiredSchemaObjectName.equals(TRUE)) {
  854. return true;
  855. }
  856. return false;
  857. }
  858. public boolean isColumnVisibleForFieldOther(ShellContext shellContext) {
  859. return true;
  860. }
  861. public boolean isTransientVisibleForFieldOther(ShellContext shellContext) {
  862. return true;
  863. }
  864. @Override
  865. public boolean isNotNullVisibleForFieldOther(ShellContext shellContext) {
  866. String antagonistParam = shellContext.getParameters().get("nullRequired");
  867. if (antagonistParam != null) {
  868. return false;
  869. }
  870. return true;
  871. }
  872. @Override
  873. public boolean isNullRequiredVisibleForFieldOther(ShellContext shellContext) {
  874. String antagonistParam = shellContext.getParameters().get("notNull");
  875. if (antagonistParam != null) {
  876. return false;
  877. }
  878. return true;
  879. }
  880. @Override
  881. public void createBooleanField(ClassOrInterfaceTypeDetails javaTypeDetails, boolean primitive,
  882. JavaSymbolName fieldName, boolean notNull, boolean assertFalse, boolean assertTrue,
  883. String column, String comment, String value, boolean permitReservedWords,
  884. boolean transientModifier) {
  885. createBooleanField(javaTypeDetails, primitive, fieldName, notNull, assertFalse, assertTrue,
  886. column, comment, value, permitReservedWords, transientModifier, null);
  887. }
  888. @Override
  889. public void createBooleanField(ClassOrInterfaceTypeDetails javaTypeDetails, boolean primitive,
  890. JavaSymbolName fieldName, boolean notNull, boolean assertFalse, boolean assertTrue,
  891. String column, String comment, String value, boolean permitReservedWords,
  892. boolean transientModifier, List<AnnotationMetadataBuilder> extraAnnotations) {
  893. final String physicalTypeIdentifier = javaTypeDetails.getDeclaredByMetadataId();
  894. final BooleanField fieldDetails =
  895. new BooleanField(physicalTypeIdentifier, primitive ? JavaType.BOOLEAN_PRIMITIVE
  896. : JavaType.BOOLEAN_OBJECT, fieldName);
  897. fieldDetails.setNotNull(notNull);
  898. fieldDetails.setAssertFalse(assertFalse);
  899. fieldDetails.setAssertTrue(assertTrue);
  900. if (column != null) {
  901. fieldDetails.setColumn(column);
  902. }
  903. if (comment != null) {
  904. fieldDetails.setComment(comment);
  905. }
  906. if (value != null) {
  907. fieldDetails.setValue(value);
  908. }
  909. if (extraAnnotations != null && !extraAnnotations.isEmpty()) {
  910. fieldDetails.addAnnotations(extraAnnotations);
  911. }
  912. insertField(fieldDetails, permitReservedWords, transientModifier);
  913. }
  914. @Override
  915. public void createDateField(ClassOrInterfaceTypeDetails javaTypeDetails, JavaType fieldType,
  916. JavaSymbolName fieldName, boolean notNull, boolean nullRequired, boolean future,
  917. boolean past, DateFieldPersistenceType persistenceType, String column, String comment,
  918. DateTime dateFormat, DateTime timeFormat, String pattern, String value,
  919. boolean permitReservedWords, boolean transientModifier) {
  920. createDateField(javaTypeDetails, fieldType, fieldName, notNull, nullRequired, future, past,
  921. persistenceType, column, comment, dateFormat, timeFormat, pattern, value,
  922. permitReservedWords, transientModifier, null);
  923. }
  924. @Override
  925. public void createDateField(ClassOrInterfaceTypeDetails javaTypeDetails, JavaType fieldType,
  926. JavaSymbolName fieldName, boolean notNull, boolean nullRequired, boolean future,
  927. boolean past, DateFieldPersistenceType persistenceType, String column, String comment,
  928. DateTime dateFormat, DateTime timeFormat, String pattern, String value,
  929. boolean permitReservedWords, boolean transientModifier,
  930. List<AnnotationMetadataBuilder> extraAnnotations) {
  931. final String physicalTypeIdentifier = javaTypeDetails.getDeclaredByMetadataId();
  932. final DateField fieldDetails = new DateField(physicalTypeIdentifier, fieldType, fieldName);
  933. fieldDetails.setNotNull(notNull);
  934. fieldDetails.setNullRequired(nullRequired);
  935. fieldDetails.setFuture(future);
  936. fieldDetails.setPast(past);
  937. if (JdkJavaType.isDateField(fieldType)) {
  938. fieldDetails.setPersistenceType(persistenceType != null ? persistenceType
  939. : DateFieldPersistenceType.JPA_TIMESTAMP);
  940. }
  941. if (column != null) {
  942. fieldDetails.setColumn(column);
  943. }
  944. if (comment != null) {
  945. fieldDetails.setComment(comment);
  946. }
  947. if (dateFormat != null) {
  948. fieldDetails.setDateFormat(dateFormat);
  949. }
  950. if (timeFormat != null) {
  951. fieldDetails.setTimeFormat(timeFormat);
  952. }
  953. if (pattern != null) {
  954. fieldDetails.setPattern(pattern);
  955. }
  956. if (value != null) {
  957. fieldDetails.setValue(value);
  958. }
  959. if (extraAnnotations != null && !extraAnnotations.isEmpty()) {
  960. fieldDetails.addAnnotations(extraAnnotations);
  961. }
  962. insertField(fieldDetails, permitReservedWords, transientModifier);
  963. }
  964. @Override
  965. public void createEnumField(ClassOrInterfaceTypeDetails cid, JavaType fieldType,
  966. JavaSymbolName fieldName, String column, boolean notNull, boolean nullRequired,
  967. EnumType enumType, String comment, boolean permitReservedWords, boolean transientModifier) {
  968. createEnumField(cid, fieldType, fieldName, column, notNull, nullRequired, enumType, comment,
  969. permitReservedWords, transientModifier, null);
  970. }
  971. @Override
  972. public void createEnumField(ClassOrInterfaceTypeDetails cid, JavaType fieldType,
  973. JavaSymbolName fieldName, String column, boolean notNull, boolean nullRequired,
  974. EnumType enumType, String comment, boolean permitReservedWords, boolean transientModifier,
  975. List<AnnotationMetadataBuilder> extraAnnotations) {
  976. ClassOrInterfaceTypeDetails typeDetails = typeLocationService.getTypeDetails(fieldType);
  977. Validate.isTrue(typeDetails.getPhysicalTypeCategory() == PhysicalTypeCategory.ENUMERATION,
  978. "The field type is not an enum class.");
  979. final String physicalTypeIdentifier = cid.getDeclaredByMetadataId();
  980. final EnumField fieldDetails = new EnumField(physicalTypeIdentifier, fieldType, fieldName);
  981. if (column != null) {
  982. fieldDetails.setColumn(column);
  983. }
  984. fieldDetails.setNotNull(notNull);
  985. fieldDetails.setNullRequired(nullRequired);
  986. if (enumType != null) {
  987. fieldDetails.setEnumType(enumType);
  988. }
  989. if (comment != null) {
  990. fieldDetails.setComment(comment);
  991. }
  992. if (extraAnnotations != null && !extraAnnotations.isEmpty()) {
  993. fieldDetails.addAnnotations(extraAnnotations);
  994. }
  995. insertField(fieldDetails, permitReservedWords, transientModifier);
  996. }
  997. @Override
  998. public void createEmbeddedField(JavaType typeName, JavaType fieldType, JavaSymbolName fieldName,
  999. boolean permitReservedWords) {
  1000. createEmbeddedField(typeName, fieldType, fieldName, permitReservedWords, null);
  1001. }
  1002. @Override
  1003. public void createEmbeddedField(JavaType typeName, JavaType fieldType, JavaSymbolName fieldName,
  1004. boolean permitReservedWords, List<AnnotationMetadataBuilder> extraAnnotations) {
  1005. // Check if the requested entity is a JPA @Entity
  1006. final ClassOrInterfaceTypeDetails javaTypeDetails =
  1007. typeLocationService.getTypeDetails(typeName);
  1008. Validate.notNull(javaTypeDetails, "The type specified, '%s', doesn't exist", typeName);
  1009. final String physicalTypeIdentifier = javaTypeDetails.getDeclaredByMetadataId();
  1010. final PhysicalTypeMetadata targetTypeMetadata =
  1011. (PhysicalTypeMetadata) metadataService.get(physicalTypeIdentifier);
  1012. Validate
  1013. .notNull(targetTypeMetadata,
  1014. "The specified target '--class' does not exist or can not be found. Please create this type first.");
  1015. final PhysicalTypeDetails targetPtd = targetTypeMetadata.getMemberHoldingTypeDetails();
  1016. Validate.isInstanceOf(MemberHoldingTypeDetails.class, targetPtd);
  1017. final ClassOrInterfaceTypeDetails targetTypeCid = (ClassOrInterfaceTypeDetails) targetPtd;
  1018. final MemberDetails memberDetails =
  1019. memberDetailsScanner.getMemberDetails(this.getClass().getName(), targetTypeCid);
  1020. Validate
  1021. .isTrue(
  1022. memberDetails.getAnnotation(ENTITY) != null
  1023. || memberDetails.getAnnotation(PERSISTENT) != null,
  1024. "The field embedded command is only applicable to JPA @Entity or Spring Data @Persistent target types.");
  1025. final EmbeddedField fieldDetails =
  1026. new EmbeddedField(physicalTypeIdentifier, fieldType, fieldName);
  1027. if (extraAnnotations != null && !extraAnnotations.isEmpty()) {
  1028. fieldDetails.addAnnotations(extraAnnotations);
  1029. }
  1030. insertField(fieldDetails, permitReservedWords, false);
  1031. }
  1032. @Override
  1033. public void createNumericField(ClassOrInterfaceTypeDetails javaTypeDetails, JavaType fieldType,
  1034. boolean primitive, Set<String> legalNumericPrimitives, JavaSymbolName fieldName,
  1035. boolean notNull, boolean nullRequired, String decimalMin, String decimalMax,
  1036. Integer digitsInteger, Integer digitsFraction, Long min, Long max, String column,
  1037. String comment, boolean unique, String value, boolean permitReservedWords,
  1038. boolean transientModifier) {
  1039. createNumericField(javaTypeDetails, fieldType, primitive, legalNumericPrimitives, fieldName,
  1040. notNull, nullRequired, decimalMin, decimalMax, digitsInteger, digitsFraction, min, max,
  1041. column, comment, unique, value, permitReservedWords, transientModifier, null);
  1042. }
  1043. @Override
  1044. public void createNumericField(ClassOrInterfaceTypeDetails javaTypeDetails, JavaType fieldType,
  1045. boolean primitive, Set<String> legalNumericPrimitives, JavaSymbolName fieldName,
  1046. boolean notNull, boolean nullRequired, String decimalMin, String decimalMax,
  1047. Integer digitsInteger, Integer digitsFraction, Long min, Long max, String column,
  1048. String comment, boolean unique, String value, boolean permitReservedWords,
  1049. boolean transientModifier, List<AnnotationMetadataBuilder> extraAnnotations) {
  1050. final String physicalTypeIdentifier = javaTypeDetails.getDeclaredByMetadataId();
  1051. if (primitive && legalNumericPrimitives.contains(fieldType.getFullyQualifiedTypeName())) {
  1052. fieldType =
  1053. new JavaType(fieldType.getFullyQualifiedTypeName(), 0, DataType.PRIMITIVE, null, null);
  1054. }
  1055. final NumericField fieldDetails =
  1056. new NumericField(physicalTypeIdentifier, fieldType, fieldName);
  1057. fieldDetails.setNotNull(notNull);
  1058. fieldDetails.setNullRequired(nullRequired);
  1059. if (decimalMin != null) {
  1060. fieldDetails.setDecimalMin(decimalMin);
  1061. }
  1062. if (decimalMax != null) {
  1063. fieldDetails.setDecimalMax(decimalMax);
  1064. }
  1065. if (digitsInteger != null) {
  1066. fieldDetails.setDigitsInteger(digitsInteger);
  1067. }
  1068. if (digitsFraction != null) {
  1069. fieldDetails.setDigitsFraction(digitsFraction);
  1070. }
  1071. if (min != null) {
  1072. fieldDetails.setMin(min);
  1073. }
  1074. if (max != null) {
  1075. fieldDetails.setMax(max);
  1076. }
  1077. if (column != null) {
  1078. fieldDetails.setColumn(column);
  1079. }
  1080. if (comment != null) {
  1081. fieldDetails.setComment(comment);
  1082. }
  1083. if (unique) {
  1084. fieldDetails.setUnique(true);
  1085. }
  1086. if (value != null) {
  1087. fieldDetails.setValue(value);
  1088. }
  1089. if (extraAnnotations != null && !extraAnnotations.isEmpty()) {
  1090. fieldDetails.addAnnotations(extraAnnotations);
  1091. }
  1092. Validate.isTrue(fieldDetails.isDigitsSetCorrectly(),
  1093. "Must specify both --digitsInteger and --digitsFraction for @Digits to be added");
  1094. insertField(fieldDetails, permitReservedWords, transientModifier);
  1095. }
  1096. @Override
  1097. public void createReferenceField(JavaType typeName, JavaType fieldType, JavaSymbolName fieldName,
  1098. boolean aggregation, JavaSymbolName mappedBy, Cascade[] cascadeType, boolean notNull,
  1099. String joinColumnName, String referencedColumnName, Fetch fetch, String comment,
  1100. boolean permitReservedWords, Boolean orphanRemoval, boolean isForce, String formatExpression,
  1101. String formatMessage) {
  1102. final ClassOrInterfaceTypeDetails childCid = typeLocationService.getTypeDetails(fieldType);
  1103. final ClassOrInterfaceTypeDetails parentCid = typeLocationService.getTypeDetails(typeName);
  1104. Validate.notNull(parentCid, "The type specified, '%s', doesn't exist", typeName);
  1105. Validate
  1106. .notNull(
  1107. childCid,
  1108. "The specified target '--type' does not exist or can not be found. Please create this type first.",
  1109. fieldType);
  1110. // Check if parent field exist
  1111. checkFieldExists(fieldName, isForce, parentCid, "fieldName");
  1112. if (mappedBy == null) {
  1113. // generate mappedBy name from uncapitalized parentClass name
  1114. mappedBy = new JavaSymbolName(StringUtils.uncapitalize(typeName.getSimpleTypeName()));
  1115. }
  1116. // Check that child 'mappedBy' field isn't equal to child type name uncapitalized
  1117. Validate.isTrue(
  1118. !StringUtils.uncapitalize(fieldType.getSimpleTypeName()).equals(mappedBy.getSymbolName()),
  1119. "Child entity field can not have the same name as the referenced entity ('%s') name in "
  1120. + "lower camel case ('%s'). Please assign it other value using '--mappedBy' option.",
  1121. fieldType.getSimpleTypeName(), mappedBy.getSymbolName());
  1122. // Check if child field exist
  1123. checkFieldExists(mappedBy, false, childCid, "mappedBy");
  1124. // Check if the requested entity is a JPA @Entity
  1125. final MemberDetails childMemberDetails =
  1126. memberDetailsScanner.getMemberDetails(this.getClass().getName(), childCid);
  1127. final AnnotationMetadata entityAnnotation = childMemberDetails.getAnnotation(ENTITY);
  1128. final AnnotationMetadata persistentAnnotation = childMemberDetails.getAnnotation(PERSISTENT);
  1129. Validate
  1130. .isTrue(
  1131. entityAnnotation != null || persistentAnnotation != null,
  1132. "The field reference command is only applicable to JPA @Entity or Spring Data @Persistent target types.");
  1133. // Prepare parent field
  1134. if (cascadeType == null) {
  1135. // prepare cascadType
  1136. if (aggregation) {
  1137. cascadeType = Cascade.MERGE_PERSIST;
  1138. } else {
  1139. // Compsition
  1140. cascadeType = Cascade.ALL_ARRAY;
  1141. }
  1142. }
  1143. if (fetch == null) {
  1144. fetch = Fetch.LAZY;
  1145. }
  1146. final ReferenceField parentFieldDetails =
  1147. new ReferenceField(parentCid.getDeclaredByMetadataId(), fieldType, fieldName,
  1148. Cardinality.ONE_TO_ONE, cascadeType);
  1149. parentFieldDetails.setFetch(fetch);
  1150. AnnotationMetadataBuilder rooJpaRelationAnnotation =
  1151. new AnnotationMetadataBuilder(RooJavaType.ROO_JPA_RELATION);
  1152. if (aggregation) {
  1153. rooJpaRelationAnnotation.addEnumAttribute("type", RooEnumDetails.RELATION_TYPE_AGGREGATION);
  1154. } else {
  1155. rooJpaRelationAnnotation.addEnumAttribute("type", RooEnumDetails.RELATION_TYPE_COMPOSITION);
  1156. }
  1157. parentFieldDetails.addAdditionaAnnotation(rooJpaRelationAnnotation);
  1158. if (comment != null) {
  1159. parentFieldDetails.setComment(comment);
  1160. }
  1161. if (orphanRemoval == null && !aggregation) {
  1162. // composition
  1163. orphanRemoval = true;
  1164. }
  1165. parentFieldDetails.setOrphanRemoval(orphanRemoval);
  1166. parentFieldDetails.setMappedBy(mappedBy);
  1167. // ROO-3868: New entity visualization support using a new format annotation
  1168. parentFieldDetails.addAdditionaAnnotation(buildEntityFormatAnnotation(formatExpression,
  1169. formatMessage, fieldName.getSymbolName()));
  1170. // Prepare child files
  1171. final ReferenceField childFieldDetails =
  1172. new ReferenceField(childCid.getDeclaredByMetadataId(), typeName, mappedBy,
  1173. Cardinality.ONE_TO_ONE, null);
  1174. childFieldDetails.setFetch(fetch);
  1175. if (joinColumnName != null) {
  1176. if (referencedColumnName != null) {
  1177. Validate.notNull(joinColumnName,
  1178. "@JoinColumn name is required if specifying a referencedColumnName");
  1179. childFieldDetails.setJoinColumn(joinColumnName, referencedColumnName);
  1180. } else {
  1181. childFieldDetails.setJoinColumn(joinColumnName);
  1182. }
  1183. }
  1184. childFieldDetails.setNotNull(notNull);
  1185. // ROO-3868: New entity visualization support using a new format annotation
  1186. childFieldDetails.addAdditionaAnnotation(buildEntityFormatAnnotation(formatExpression,
  1187. formatMessage, fieldName.getSymbolName()));
  1188. // insert child field
  1189. insertField(childFieldDetails, permitReservedWords, false, true);
  1190. // insert parent field
  1191. insertField(parentFieldDetails, permitReservedWords, false, true);
  1192. }
  1193. @Override
  1194. public void createSetField(JavaType typeName, JavaType fieldType, JavaSymbolName fieldName,
  1195. Cardinality cardinality, Cascade[] cascadeType, boolean notNull, Integer sizeMin,
  1196. Integer sizeMax, JavaSymbolName mappedBy, Fetch fetch, String comment, String joinColumnName,
  1197. String referencedColumnName, String joinTable, String joinColumns, String referencedColumns,
  1198. String inverseJoinColumns, String inverseReferencedColumns, boolean permitReservedWords,
  1199. Boolean aggregation, Boolean orphanRemoval, boolean isForce, String formatExpression,
  1200. String formatMessage) {
  1201. createCollectionField(typeName, fieldType, fieldName, cardinality, cascadeType, notNull,
  1202. sizeMin, sizeMax, mappedBy, fetch, comment, joinColumnName, referencedColumnName,
  1203. joinTable, joinColumns, referencedColumns, inverseJoinColumns, inverseReferencedColumns,
  1204. permitReservedWords, aggregation, orphanRemoval, isForce, false, formatExpression,

Large files files are truncated, but you can click here to view the full file