package org.picketlink.forge; import java.io.FileNotFoundException; import java.io.Serializable; import java.util.Date; import javax.inject.Inject; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToOne; import javax.persistence.Temporal; import javax.persistence.TemporalType; import org.jboss.forge.addon.facets.FacetFactory; import org.jboss.forge.addon.parser.java.JavaSourceFactory; import org.jboss.forge.addon.parser.java.facets.JavaSourceFacet; import org.jboss.forge.addon.projects.Project; import org.jboss.forge.parser.java.Field; import org.jboss.forge.parser.java.JavaClass; import org.picketlink.idm.credential.storage.EncodedPasswordStorage; import org.picketlink.idm.jpa.annotations.AttributeClass; import org.picketlink.idm.jpa.annotations.AttributeName; import org.picketlink.idm.jpa.annotations.AttributeValue; import org.picketlink.idm.jpa.annotations.CredentialClass; import org.picketlink.idm.jpa.annotations.CredentialProperty; import org.picketlink.idm.jpa.annotations.EffectiveDate; import org.picketlink.idm.jpa.annotations.ExpiryDate; import org.picketlink.idm.jpa.annotations.Identifier; import org.picketlink.idm.jpa.annotations.IdentityClass; import org.picketlink.idm.jpa.annotations.OwnerReference; import org.picketlink.idm.jpa.annotations.RelationshipClass; import org.picketlink.idm.jpa.annotations.RelationshipDescriptor; import org.picketlink.idm.jpa.annotations.RelationshipMember; import org.picketlink.idm.jpa.annotations.entity.IdentityManaged; import org.picketlink.idm.jpa.annotations.entity.ManagedCredential; import org.picketlink.idm.model.IdentityType; import org.picketlink.idm.model.Relationship; /** * Creates a JPA entity schema for an identity model * * @author Shane Bryzak */ public class SchemaOperations { @Inject FacetFactory facetFactory; @Inject JavaSourceFactory javaSourceFactory; public void createIdentitySchema(Project project, String packageName) throws FileNotFoundException { final JavaSourceFacet java = project.getFacet(JavaSourceFacet.class); java.saveJavaSource(createIdentityEntity(packageName)); java.saveJavaSource(createIdentityAttributeEntity(packageName)); java.saveJavaSource(createCredentialEntity(packageName)); java.saveJavaSource(createRelationshipEntity(packageName)); java.saveJavaSource(createRelationshipIdentityEntity(packageName)); } private JavaClass createIdentityEntity(String packageName) { String lineSeparator = System.getProperty("line.separator"); JavaClass javaClass = javaSourceFactory.create(JavaClass.class) .setName("IdentityEntity") .setPublic() .addInterface(Serializable.class); javaClass.setPackage(packageName); javaClass.addAnnotation(Entity.class); javaClass.addAnnotation(IdentityManaged.class).setClassValue(IdentityType.class); // Create the id property Field<JavaClass> f = javaClass.addField("private String id = null;"); f.addAnnotation(Id.class); f.addAnnotation(Identifier.class); javaClass.addMethod("public String getId() {" + lineSeparator + " return id;" + lineSeparator + "}"); javaClass.addMethod("public void setId(String id) {" + lineSeparator + " this.id = id;" + lineSeparator + "}"); // Create the identity class property f = javaClass.addField("private String identityClass = null;"); f.addAnnotation(IdentityClass.class); javaClass.addMethod("public String getIdentityClass() {" + lineSeparator + " return identityClass;" + lineSeparator + "}"); javaClass.addMethod("public void setIdentityClass(String identityClass) {" + lineSeparator + " this.identityClass = identityClass; " + lineSeparator + "}"); // Create the created date property f = javaClass.addField("private Date createdDate = null;"); f.addAnnotation(Temporal.class).setEnumValue(TemporalType.TIMESTAMP); f.addAnnotation(AttributeValue.class); javaClass.addMethod("public Date getCreatedDate() {" + lineSeparator + " return createdDate;" + lineSeparator + "}"); javaClass.addMethod("public void setCreatedDate(Date createdDate) {" + lineSeparator + " this.createdDate = createdDate;" + lineSeparator + "}"); // Create the expiration date property f = javaClass.addField("private Date expirationDate = null;"); f.addAnnotation(Temporal.class).setEnumValue(TemporalType.TIMESTAMP); f.addAnnotation(AttributeValue.class); javaClass.addMethod("public Date getExpirationDate() {" + lineSeparator + " return expirationDate;" + lineSeparator + "}"); javaClass.addMethod("public void setExpirationDate(Date expirationDate) {" + lineSeparator + " this.expirationDate = expirationDate;" + lineSeparator + "}"); // Add the necessary imports javaClass.addImport(Entity.class); javaClass.addImport(IdentityManaged.class); javaClass.addImport(IdentityType.class); javaClass.addImport(Serializable.class); javaClass.addImport(Id.class); javaClass.addImport(Identifier.class); javaClass.addImport(IdentityClass.class); javaClass.addImport(Date.class); javaClass.addImport(Temporal.class); javaClass.addImport(TemporalType.class); return javaClass; } private JavaClass createIdentityAttributeEntity(String packageName) { String lineSeparator = System.getProperty("line.separator"); JavaClass javaClass = javaSourceFactory.create(JavaClass.class) .setName("IdentityAttribute") .setPublic() .addInterface(Serializable.class); javaClass.setPackage(packageName); javaClass.addAnnotation(Entity.class); javaClass.addAnnotation(IdentityManaged.class).setClassValue(IdentityType.class); // Create the id property Field<JavaClass> f = javaClass.addField("private Long id = null;"); f.addAnnotation(Id.class); f.addAnnotation(GeneratedValue.class); javaClass.addMethod("public Long getId() {" + lineSeparator + " return id;" + lineSeparator + "}"); javaClass.addMethod("public void setId(Long id) {" + lineSeparator + " this.id = id;" + lineSeparator + "}"); // Create the owner property f = javaClass.addField("private IdentityEntity owner;"); f.addAnnotation(ManyToOne.class); f.addAnnotation(OwnerReference.class); javaClass.addMethod("public IdentityEntity getIdentity() {" + lineSeparator + " return identity;" + lineSeparator + "}"); javaClass.addMethod("public void setIdentity(IdentityEntity identity) {" + lineSeparator + " this.identity = identity;" + lineSeparator + "}"); // Create the attributeClass property f = javaClass.addField("private String attributeClass;"); f.addAnnotation(AttributeClass.class); javaClass.addMethod("public String getAttributeClass() {" + lineSeparator + " return attributeClass;" + lineSeparator + "}"); javaClass.addMethod("public void setAttributeClass(String attributeClass) {" + lineSeparator + " this.attributeClass = attributeClass;" + lineSeparator + "}"); // Create the name property f = javaClass.addField("private String name;"); f.addAnnotation(AttributeName.class); javaClass.addMethod("public String getName() {" + lineSeparator + " return name;" + lineSeparator + "}"); javaClass.addMethod("public void setName(String name) {" + lineSeparator + " this.name = name;" + lineSeparator + "}"); // Create the value property f = javaClass.addField("private String value;"); f.addAnnotation(AttributeValue.class); javaClass.addMethod("public String getValue() {" + lineSeparator + " return value;" + lineSeparator + "}"); javaClass.addMethod("public void setValue(String value) {" + lineSeparator + " this.value = value;" + lineSeparator + "}"); javaClass.addImport(Entity.class); javaClass.addImport(IdentityManaged.class); javaClass.addImport(ManyToOne.class); javaClass.addImport(OwnerReference.class); javaClass.addImport(AttributeClass.class); javaClass.addImport(AttributeName.class); javaClass.addImport(AttributeValue.class); javaClass.addImport(Serializable.class); return javaClass; } private JavaClass createCredentialEntity(String packageName) { String lineSeparator = System.getProperty("line.separator"); JavaClass javaClass = javaSourceFactory.create(JavaClass.class) .setName("PasswordCredential") .setPublic() .addInterface(Serializable.class); javaClass.setPackage(packageName); javaClass.addAnnotation(Entity.class); javaClass.addAnnotation(ManagedCredential.class).setClassValue(EncodedPasswordStorage.class); // Create the id property Field<JavaClass> f = javaClass.addField("private Long id = null;"); f.addAnnotation(Id.class); f.addAnnotation(GeneratedValue.class); javaClass.addMethod("public Long getId() {" + lineSeparator + " return id;" + lineSeparator + "}"); javaClass.addMethod("public void setId(Long id) {" + lineSeparator + " this.id = id;" + lineSeparator + "}"); // Create the owner property f = javaClass.addField("private IdentityEntity owner;"); f.addAnnotation(OwnerReference.class); f.addAnnotation(ManyToOne.class); javaClass.addMethod("public IdentityEntity getOwner() {" + lineSeparator + " return owner;" + lineSeparator + "}"); javaClass.addMethod("public void setOwner(IdentityEntity owner) {" + lineSeparator + " this.owner = owner;" + lineSeparator + "}"); // Create the credentialClass property f = javaClass.addField("private String credentialClass;"); f.addAnnotation(CredentialClass.class); javaClass.addMethod("public String getCredentialClass() {" + lineSeparator + " return credentialClass;" + lineSeparator + "}"); javaClass.addMethod("public void setCredentialClass(String credentialClass) {" + lineSeparator + " this.credentialClass = credentialClass;" + lineSeparator + "}"); // Create the effectiveDate property f = javaClass.addField("private Date effectiveDate = null;"); f.addAnnotation(EffectiveDate.class); f.addAnnotation(Temporal.class).setEnumValue(TemporalType.TIMESTAMP); javaClass.addMethod("public Date getEffectiveDate() {" + lineSeparator + " return effectiveDate;" + lineSeparator + "}"); javaClass.addMethod("public void setEffectiveDate(Date effectiveDate) {" + lineSeparator + " this.effectiveDate = effectiveDate;" + lineSeparator + "}"); // Create the expiryDate property f = javaClass.addField("private Date expiryDate = null;"); f.addAnnotation(ExpiryDate.class); f.addAnnotation(Temporal.class).setEnumValue(TemporalType.TIMESTAMP); javaClass.addMethod("public Date getExpiryDate() {" + lineSeparator + " return expiryDate;" + lineSeparator + "}"); javaClass.addMethod("public void setExpiryDate(Date expiryDate) {" + lineSeparator + " this.expiryDate = expiryDate;" + lineSeparator + "}"); // Create the encodedHash property f = javaClass.addField("private String encodedHash = null;"); f.addAnnotation(CredentialProperty.class).setStringValue("name", "encodedHash"); javaClass.addMethod("public String getEncodedHash() {" + lineSeparator + " return encodedHash;" + lineSeparator + "}"); javaClass.addMethod("public void setEncodedHash(String encodedHash) {" + lineSeparator + " this.encodedHash = encodedHash;" + lineSeparator + "}"); javaClass.addImport(Entity.class); javaClass.addImport(CredentialClass.class); javaClass.addImport(ManagedCredential.class); javaClass.addImport(Date.class); javaClass.addImport(EffectiveDate.class); javaClass.addImport(ExpiryDate.class); javaClass.addImport(Temporal.class); javaClass.addImport(TemporalType.class); javaClass.addImport(Serializable.class); return javaClass; } private JavaClass createRelationshipEntity(String packageName) { String lineSeparator = System.getProperty("line.separator"); JavaClass javaClass = javaSourceFactory.create(JavaClass.class) .setName("RelationshipEntity") .setPublic() .addInterface(Serializable.class); javaClass.setPackage(packageName); javaClass.addAnnotation(Entity.class); javaClass.addAnnotation(IdentityManaged.class).setClassValue(Relationship.class); // Create the id property Field<JavaClass> f = javaClass.addField("private Long id = null;"); f.addAnnotation(Id.class); f.addAnnotation(GeneratedValue.class); javaClass.addMethod("public Long getId() {" + lineSeparator + " return id;" + lineSeparator + "}"); javaClass.addMethod("public void setId(Long id) {" + lineSeparator + " this.id = id;" + lineSeparator + "}"); // Create the relationshipClass property f = javaClass.addField("private String relationshipClass = null;"); f.addAnnotation(RelationshipClass.class); javaClass.addMethod("public String getRelationshipClass() {" + lineSeparator + " return relationshipClass;" + lineSeparator + "}"); javaClass.addMethod("public void setRelationshipClass(String relationshipClass) {" + lineSeparator + " this.relationshipClass = relationshipClass;" + lineSeparator + "}"); javaClass.addImport(Entity.class); javaClass.addImport(Serializable.class); javaClass.addImport(IdentityManaged.class); javaClass.addImport(Relationship.class); javaClass.addImport(RelationshipClass.class); return javaClass; } private JavaClass createRelationshipIdentityEntity(String packageName) { String lineSeparator = System.getProperty("line.separator"); JavaClass javaClass = javaSourceFactory.create(JavaClass.class) .setName("RelationshipIdentity") .setPublic() .addInterface(Serializable.class); javaClass.setPackage(packageName); javaClass.addAnnotation(Entity.class); javaClass.addAnnotation(IdentityManaged.class).setClassValue(Relationship.class); // Create the id property Field<JavaClass> f = javaClass.addField("private Long id = null;"); f.addAnnotation(Id.class); f.addAnnotation(GeneratedValue.class); javaClass.addMethod("public Long getId() {" + lineSeparator + " return id;" + lineSeparator + "}"); javaClass.addMethod("public void setId(Long id) {" + lineSeparator + " this.id = id;" + lineSeparator + "}"); // Create the owner property f = javaClass.addField("private RelationshipEntity owner = null;"); f.addAnnotation(OwnerReference.class); f.addAnnotation(ManyToOne.class); javaClass.addMethod("public RelationshipEntity getOwner() {" + lineSeparator + " return owner;" + lineSeparator + "}"); javaClass.addMethod("public void setOwner(RelationshipEntity owner) {" + lineSeparator + " this.owner = owner;" + lineSeparator + "}"); // Create the descriptor property f = javaClass.addField("private String descriptor = null;"); f.addAnnotation(RelationshipDescriptor.class); javaClass.addMethod("public String getDescriptor() {" + lineSeparator + " return descriptor;" + lineSeparator + "}"); javaClass.addMethod("public void setDescriptor(String descriptor) {" + lineSeparator + " this.descriptor = descriptor;" + lineSeparator + "}"); // Create the identity property f = javaClass.addField("private IdentityEntity identity = null;"); f.addAnnotation(RelationshipMember.class); javaClass.addMethod("public IdentityEntity getIdentity() {" + lineSeparator + " return identity;" + lineSeparator + "}"); javaClass.addMethod("public void setIdentity(IdentityEntity identity) {" + lineSeparator + " this.identity = identity;" + lineSeparator + "}"); javaClass.addImport(Entity.class); javaClass.addImport(OwnerReference.class); javaClass.addImport(ManyToOne.class); javaClass.addImport(Serializable.class); javaClass.addImport(IdentityManaged.class); javaClass.addImport(Relationship.class); javaClass.addImport(RelationshipDescriptor.class); javaClass.addImport(RelationshipMember.class); return javaClass; } }