Author: simoneg
Date: Tue Sep 15 14:03:30 2009
New Revision: 815331
URL: http://svn.apache.org/viewvc?rev=815331&view=rev
Log:
LABS-456 : logical names interface and utility methods
Added:
labs/magma/trunk/database-jpa/src/main/java/org/apache/magma/database/openjpa/LogicalNameHandling.aj
labs/magma/trunk/foundation-database/src/main/java/org/apache/magma/database/LogicallyNamed.java
labs/magma/trunk/foundation-database/src/main/java/org/apache/magma/database/LogicallyNamedDefaultImpl.aj
Modified:
labs/magma/trunk/database-jpa/src/main/java/org/apache/magma/database/openjpa/JPADatabase.java
labs/magma/trunk/foundation-database/src/main/java/org/apache/magma/database/Database.java
Modified:
labs/magma/trunk/database-jpa/src/main/java/org/apache/magma/database/openjpa/JPADatabase.java
URL:
http://svn.apache.org/viewvc/labs/magma/trunk/database-jpa/src/main/java/org/apache/magma/database/openjpa/JPADatabase.java?rev=815331&r1=815330&r2=815331&view=diff
==============================================================================
---
labs/magma/trunk/database-jpa/src/main/java/org/apache/magma/database/openjpa/JPADatabase.java
(original)
+++
labs/magma/trunk/database-jpa/src/main/java/org/apache/magma/database/openjpa/JPADatabase.java
Tue Sep 15 14:03:30 2009
@@ -24,6 +24,7 @@
import javax.persistence.Query;
import org.apache.magma.database.Database;
+import org.apache.magma.database.LogicallyNamed;
/**
* Subclass of Database using JPA.
@@ -49,6 +50,13 @@
return manager.find(clazz, id[0]);
}
+ public <T extends LogicallyNamed> T named(Class<T> clazz, String
logicalName) {
+ List<T> list = query(clazz, "WHERE x.logicalName=?1",
logicalName);
+ if (list.size() == 0) return null;
+ return list.get(0);
+ }
+
+
@SuppressWarnings("unchecked")
public <T> List<T> query(Class<T> clazz, int start, int page, String
query, Object... params) {
if (!query.toUpperCase().startsWith("SELECT")) {
Added:
labs/magma/trunk/database-jpa/src/main/java/org/apache/magma/database/openjpa/LogicalNameHandling.aj
URL:
http://svn.apache.org/viewvc/labs/magma/trunk/database-jpa/src/main/java/org/apache/magma/database/openjpa/LogicalNameHandling.aj?rev=815331&view=auto
==============================================================================
---
labs/magma/trunk/database-jpa/src/main/java/org/apache/magma/database/openjpa/LogicalNameHandling.aj
(added)
+++
labs/magma/trunk/database-jpa/src/main/java/org/apache/magma/database/openjpa/LogicalNameHandling.aj
Tue Sep 15 14:03:30 2009
@@ -0,0 +1,38 @@
+package org.apache.magma.database.openjpa;
+
+import javax.persistence.PrePersist;
+import org.apache.magma.database.Database;
+
+import org.apache.magma.database.LogicallyNamed;
+
+public aspect LogicalNameHandling {
+
+ @PrePersist
+ public void LogicallyNamed.jpaInitializeLogicalName() {
+ if (getLogicalName() != null) return;
+ String tempname = this.computeLogicalName();
+ tempname = tempname.toLowerCase();
+ if (tempname == null) {
+ tempname = this.getClass().getName() +
System.currentTimeMillis() + System.nanoTime();
+ }
+ StringBuilder normalized = new StringBuilder();
+ for (int i = 0; i < tempname.length(); i++) {
+ char acc = tempname.charAt(i);
+ if (Character.isLetterOrDigit(acc)) {
+ normalized.append(acc);
+ } else if (acc == ' ') {
+ normalized.append('-');
+ }
+ if (normalized.length() == 30) break;
+ }
+ tempname = normalized.toString();
+ Database db = new Database();
+ if (db.count(this.getClass(), "x.logicalName=?1", tempname) >
0) {
+ int prog = 2;
+ while (db.count(this.getClass(), "x.logicalName=?1",
tempname + "-" + prog) > 0) prog++;
+ tempname += "-" + prog;
+ }
+ setLogicalName(tempname);
+ }
+
+}
Modified:
labs/magma/trunk/foundation-database/src/main/java/org/apache/magma/database/Database.java
URL:
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-database/src/main/java/org/apache/magma/database/Database.java?rev=815331&r1=815330&r2=815331&view=diff
==============================================================================
---
labs/magma/trunk/foundation-database/src/main/java/org/apache/magma/database/Database.java
(original)
+++
labs/magma/trunk/foundation-database/src/main/java/org/apache/magma/database/Database.java
Tue Sep 15 14:03:30 2009
@@ -51,6 +51,26 @@
return null;
}
+ /**
+ * Loads an entity of the given class with the given logical name.
+ * <p>
+ * As an example :
+ * <code>
+ * Database db = new Database();
+ * Section s = db.names(Section.class, "news");
+ * </code>
+ * will load the section having a logical name "news".
+ * </p>
+ *
+ * @param <T> The class of the entity, must implement {...@link
LogicallyNamed}
+ * @param clazz The class of the entity, must implement {...@link
LogicallyNamed}
+ * @param logicalName The logical name to search for.
+ * @return An instance of the entity, or null if not found.
+ */
+ public <T extends LogicallyNamed> T named(Class<T> clazz, String
logicalName) {
+ return null;
+ }
+
/**
* Executes a query returning all results. This is the same as calling
@@ -103,6 +123,24 @@
}
/**
+ * Counts how many entities with given query are present on the
database.
+ * <p>
+ * The query follows the same rules of {...@link #query(Class, String,
Object...)}.
+ * </p>
+ * @param clazz The persistent (entity) class we want to count.
+ * @param query A query, which may be null or empty, describing which
entities we are interested in counting.
+ * @param params Parameters to replace in the query, if any
+ * @return the number of entities matching the query criteria found on
the database.
+ */
+ public int count(Class<?> clazz, String query, Object... params) {
+ if (query == null || query.length() == 0) {
+ return queryNumber("SELECT count(x) FROM " +
clazz.getName() + " x").intValue();
+ } else {
+ return queryNumber("SELECT count(x) FROM " +
clazz.getName() + " x WHERE " + query, params).intValue();
+ }
+ }
+
+ /**
* Executes a query that returns a single number.
* <p>
* This method is useful when the query needs to return a simple
number, like a count or an average.
@@ -119,6 +157,7 @@
* </code>
* </p>
* @param query The query to execute
+ * @param params Parameters to replace in the query, if any
* @return The only number returned by the query.
*/
public Number queryNumber(String query, Object... params) {
Added:
labs/magma/trunk/foundation-database/src/main/java/org/apache/magma/database/LogicallyNamed.java
URL:
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-database/src/main/java/org/apache/magma/database/LogicallyNamed.java?rev=815331&view=auto
==============================================================================
---
labs/magma/trunk/foundation-database/src/main/java/org/apache/magma/database/LogicallyNamed.java
(added)
+++
labs/magma/trunk/foundation-database/src/main/java/org/apache/magma/database/LogicallyNamed.java
Tue Sep 15 14:03:30 2009
@@ -0,0 +1,16 @@
+package org.apache.magma.database;
+
+import javax.persistence.Column;
+
+import org.apache.magma.beans.MagmaBeanSupport;
+
+
+public interface LogicallyNamed extends MagmaBeanSupport {
+
+ @Column(nullable=true, unique=true, updatable=false, insertable=true)
+ public String getLogicalName();
+ public void setLogicalName(String name);
+
+ public String computeLogicalName();
+
+}
Added:
labs/magma/trunk/foundation-database/src/main/java/org/apache/magma/database/LogicallyNamedDefaultImpl.aj
URL:
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-database/src/main/java/org/apache/magma/database/LogicallyNamedDefaultImpl.aj?rev=815331&view=auto
==============================================================================
---
labs/magma/trunk/foundation-database/src/main/java/org/apache/magma/database/LogicallyNamedDefaultImpl.aj
(added)
+++
labs/magma/trunk/foundation-database/src/main/java/org/apache/magma/database/LogicallyNamedDefaultImpl.aj
Tue Sep 15 14:03:30 2009
@@ -0,0 +1,16 @@
+package org.apache.magma.database;
+
+public aspect LogicallyNamedDefaultImpl {
+
+ private String LogicallyNamed.logicalName = null;
+
+ public void LogicallyNamed.setLogicalName(String name) {
+ this.logicalName = name;
+ }
+
+ public String LogicallyNamed.getLogicalName() {
+ return this.logicalName;
+ }
+
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]