From 2f5648fe0951f67461a319864b980777ddf24149 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sun, 20 Sep 2009 14:32:38 +0000 Subject: [PATCH 01/16] Fix various issues: - roles not saved - password transmitted - natures added git-svn-id: https://svn.argeo.org/commons/trunk@2990 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../src/main/java/org/argeo/security/ArgeoSecurityService.java | 2 ++ .../java/org/argeo/security/core/DefaultSecurityService.java | 2 +- .../main/java/org/argeo/security/mvc/UsersRolesController.java | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/ArgeoSecurityService.java b/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/ArgeoSecurityService.java index 77b699d01..9470e1d59 100644 --- a/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/ArgeoSecurityService.java +++ b/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/ArgeoSecurityService.java @@ -2,6 +2,8 @@ package org.argeo.security; public interface ArgeoSecurityService { public void newUser(ArgeoUser argeoUser); + + public void updateUser(ArgeoUser user); public void updateUserPassword(String username, String password); diff --git a/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/core/DefaultSecurityService.java b/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/core/DefaultSecurityService.java index 74aa57cd5..0467de8cb 100644 --- a/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/core/DefaultSecurityService.java +++ b/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/core/DefaultSecurityService.java @@ -36,7 +36,7 @@ public class DefaultSecurityService implements ArgeoSecurityService { .getPassword(); SimpleArgeoUser simpleArgeoUser = new SimpleArgeoUser(user); simpleArgeoUser.setPassword(password); - securityDao.update(user); + securityDao.update(simpleArgeoUser); } public void setArgeoSecurity(ArgeoSecurity argeoSecurity) { diff --git a/security/runtime/org.argeo.security.mvc/src/main/java/org/argeo/security/mvc/UsersRolesController.java b/security/runtime/org.argeo.security.mvc/src/main/java/org/argeo/security/mvc/UsersRolesController.java index 3413b33ed..923a1864d 100644 --- a/security/runtime/org.argeo.security.mvc/src/main/java/org/argeo/security/mvc/UsersRolesController.java +++ b/security/runtime/org.argeo.security.mvc/src/main/java/org/argeo/security/mvc/UsersRolesController.java @@ -57,7 +57,7 @@ public class UsersRolesController implements MvcConstants { @ModelAttribute(ANSWER_MODEL_KEY) public ArgeoUser updateUser(Reader reader) { ArgeoUser user = (ArgeoUser) userDeserializer.deserialize(reader); - securityService.getSecurityDao().update(user); + securityService.updateUser(user); return securityService.getSecurityDao().getUser(user.getUsername()); } /* -- 2.30.2 From e12d56e671b665431a6af07627871eee88698cc5 Mon Sep 17 00:00:00 2001 From: Charles du Jeu Date: Sun, 20 Sep 2009 14:45:09 +0000 Subject: [PATCH 02/16] Do not send empty string role git-svn-id: https://svn.argeo.org/commons/trunk@2991 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../class/org/argeo/security/ria/UserEditorApplet.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/UserEditorApplet.js b/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/UserEditorApplet.js index 38ca9c85c..e85b52410 100644 --- a/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/UserEditorApplet.js +++ b/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/UserEditorApplet.js @@ -253,7 +253,14 @@ qx.Class.define("org.argeo.security.ria.UserEditorApplet", saveUser : function(){ var user = this.getCurrentUser(); user.setName(this.usernameField.getValue()); - user.setRoles((this.rolesField.getValue()||"").split(",")); + var roles = this.rolesField.getValue(); + if(roles && roles != ""){ + user.setRoles(roles.split(",")); + }else{ + user.setRoles([]); + } + user.setPassword(this.passPane.getData()); + // GO TO AND RETURN FROM SERVER if(user.isCreate()){ var userExists = false; -- 2.30.2 From 98715b5696e21fcbc2d49f18f7bfac511569b897 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sun, 20 Sep 2009 16:15:38 +0000 Subject: [PATCH 03/16] Password sandbox git-svn-id: https://svn.argeo.org/commons/trunk@2992 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../org/argeo/security/PasswordSandbox.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 security/runtime/org.argeo.security.core/src/test/java/org/argeo/security/PasswordSandbox.java diff --git a/security/runtime/org.argeo.security.core/src/test/java/org/argeo/security/PasswordSandbox.java b/security/runtime/org.argeo.security.core/src/test/java/org/argeo/security/PasswordSandbox.java new file mode 100644 index 000000000..66336d3f6 --- /dev/null +++ b/security/runtime/org.argeo.security.core/src/test/java/org/argeo/security/PasswordSandbox.java @@ -0,0 +1,43 @@ +package org.argeo.security; + +import org.apache.commons.codec.DecoderException; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.codec.binary.Hex; +import org.springframework.security.providers.ldap.authenticator.LdapShaPasswordEncoder; + +public class PasswordSandbox { + public static void main(String[] args) { + try { + // Tested password + String pwdPlain = "demo"; + + // Check Java generated values + LdapShaPasswordEncoder lspe = new LdapShaPasswordEncoder(); + String pwdLdapShaBase64 = lspe.encodePassword(pwdPlain, null); + System.out.println("pwdLdapShaBase64:\t\t" + pwdLdapShaBase64); + + String pwdShaBase64 = pwdLdapShaBase64.substring("{SHA}".length()); + System.out.println("pwdShaBase64:\t\t\t" + pwdShaBase64); + + byte[] pwdShaArray = Base64.decodeBase64(pwdShaBase64.getBytes()); + String pwdShaHex = new String(Hex.encodeHex(pwdShaArray)); + System.out.println("pwdShaHex:\t\t\t" + pwdShaHex); + + // Check that we can use JavaScript generated values in Hex + String jsShaHex = "89e495e7941cf9e40e6980d14a16bf023ccd4c91"; + System.out.println("jsShaHex:\t\t\t" + pwdShaHex); + System.out.println("pwdShaHex==jsShaHex:\t\t" + + (pwdShaHex.equals(jsShaHex))); + + byte[] jsShaArray = Hex.decodeHex(jsShaHex.toCharArray()); + String jsShaBase64 = new String(Base64.encodeBase64(jsShaArray)); + System.out.println("jsShaBase64:\t\t\t" + jsShaBase64); + System.out.println("pwdShaBase64==jsShaBase64:\t" + + (pwdShaBase64.equals(jsShaBase64))); + } catch (DecoderException e) { + e.printStackTrace(); + } + + } + +} \ No newline at end of file -- 2.30.2 From 06f80b7b50619d1c997e2660eddb32a584cfc8a8 Mon Sep 17 00:00:00 2001 From: Charles du Jeu Date: Mon, 21 Sep 2009 09:01:38 +0000 Subject: [PATCH 04/16] Password impl, various enhancements git-svn-id: https://svn.argeo.org/commons/trunk@2994 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../org/argeo/security/ria/RolesApplet.js | 24 ++++++++ .../argeo/security/ria/UserEditorApplet.js | 56 +++++++++++++++---- .../org/argeo/security/ria/UsersApplet.js | 12 ---- .../ria/components/PasswordCredentialImpl.js | 26 +++++++-- .../org/argeo/security/ria/model/User.js | 11 +++- 5 files changed, 100 insertions(+), 29 deletions(-) diff --git a/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/RolesApplet.js b/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/RolesApplet.js index 7b124b928..429460b37 100644 --- a/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/RolesApplet.js +++ b/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/RolesApplet.js @@ -28,6 +28,18 @@ qx.Class.define("org.argeo.security.ria.RolesApplet", */ commands : { init : { + "reload" : { + label : "Reload Data", + icon : "org.argeo.security.ria/view-refresh.png", + shortcut : "Control+h", + enabled : true, + menu : "Roles", + toolbar : "roles", + callback : function(e){ + this.loadRolesList(); + }, + command : null + }, "new_role" : { label : "Create Role", icon : "org.argeo.security.ria/list-add.png", @@ -232,7 +244,13 @@ qx.Class.define("org.argeo.security.ria.RolesApplet", viewSel.removeListener("changeSelection", this.monitorChooserSelectionChanges, this); } selectionModel.addListener("changeSelection", this.selectionToFilter, this); + if(selectionModel.getSelectedCount()){ + var orig = selectionModel.getSelectedRanges()[0].minIndex; + } selectionModel.setSelectionMode(qx.ui.table.selection.Model.MULTIPLE_INTERVAL_SELECTION_TOGGLE); + if(orig){ + selectionModel.addSelectionInterval(orig, orig); + } this.selectionToFilter(); }else if(guiMode == "edit"){ if(!this.usersAppletReference) return; @@ -253,7 +271,13 @@ qx.Class.define("org.argeo.security.ria.RolesApplet", } this.table.setEnabled(true); selectionModel.removeListener("changeSelection", this.selectionToFilter, this); + if(selectionModel.getSelectedCount()){ + var orig = selectionModel.getSelectedRanges()[0].minIndex; + } selectionModel.setSelectionMode(qx.ui.table.selection.Model.SINGLE_SELECTION); + if(orig){ + selectionModel.addSelectionInterval(orig, orig); + } } }, diff --git a/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/UserEditorApplet.js b/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/UserEditorApplet.js index e85b52410..f7fad1df4 100644 --- a/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/UserEditorApplet.js +++ b/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/UserEditorApplet.js @@ -139,8 +139,14 @@ qx.Class.define("org.argeo.security.ria.UserEditorApplet", rolesList : { }, - instanceId : {init:""}, - instanceLabel : {init:"Editor"}, + instanceId : { + init:"", + event : "changeInstanceId" + }, + instanceLabel : { + init:"Editor", + event : "changeInstanceLabel" + }, loaded : { init : false }, @@ -259,10 +265,15 @@ qx.Class.define("org.argeo.security.ria.UserEditorApplet", }else{ user.setRoles([]); } - user.setPassword(this.passPane.getData()); // GO TO AND RETURN FROM SERVER if(user.isCreate()){ + if(!this.passPane.validate()){ + this.error("Warning, passwords differ!"); + return; + } + user.setPassword(this.passPane.getData()); + var create = true; var userExists = false; var req = org.argeo.security.ria.SecurityAPI.getUserExistsService(user.getName()); req.addListener("completed", function(response){ @@ -274,20 +285,45 @@ qx.Class.define("org.argeo.security.ria.UserEditorApplet", this.error("User already exists, choose another name!"); return; } + }else{ + var pass = this.passPane.getData(); + if(pass != null && !this.passPane.validate()){ + this.error("Warning, passwords differ!"); + return; + } } - var userService = user.getSaveService(); - userService.send(); - userService.addListener("completed", function(response){ - if(response.getContent().status && response.getContent().status == "ERROR"){ - return; + this.passPane.clear(); + var saveCompletedCallback = qx.lang.Function.bind(function(){ + if(create){ + this.setInstanceLabel("User " + user.getName()); + this.setInstanceId(user.getName()); } this._setGuiInCreateMode(false); - user.load(response.getContent(), "json"); this.partialRefreshUser(user, ["details","natures"]); this.setModified(false); this.getViewSelection().triggerEvent(); - this.fireDataEvent("savedUser", user); + this.fireDataEvent("savedUser", user); }, this); + var userService = user.getSaveService(); + userService.addListener("completed", function(response){ + if(response.getContent().status && response.getContent().status == "ERROR"){ + return; + } + user.load(response.getContent(), "json"); + if(pass!=null){ + var passService = org.argeo.security.ria.SecurityAPI.getUpdateUserPassService(user.getName(), pass); + passService.addListener("completed", function(response){ + if(response.getContent().status){ + this.info(response.getContent().message); + } + saveCompletedCallback(); + }, this); + passService.send(); + }else{ + saveCompletedCallback(); + } + }, this); + userService.send(); }, _addNatureTab : function(natureClass, natureData, select){ diff --git a/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/UsersApplet.js b/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/UsersApplet.js index 988e178b7..7f0c55335 100644 --- a/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/UsersApplet.js +++ b/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/UsersApplet.js @@ -28,18 +28,6 @@ qx.Class.define("org.argeo.security.ria.UsersApplet", */ commands : { init : { - "load_users" : { - label : "Reload Users", - icon : "org.argeo.security.ria/view-refresh.png", - shortcut : "Control+h", - enabled : true, - menu : "Users", - toolbar : "users", - callback : function(e){ - this.loadUsersList(); - }, - command : null - }, "new_user" : { label : "New User", icon : "org.argeo.security.ria/list-add.png", diff --git a/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/components/PasswordCredentialImpl.js b/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/components/PasswordCredentialImpl.js index 610e56d12..238cc7ef1 100644 --- a/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/components/PasswordCredentialImpl.js +++ b/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/components/PasswordCredentialImpl.js @@ -7,6 +7,13 @@ qx.Class.define("org.argeo.security.ria.components.PasswordCredentialImpl", { properties : { valid : { init : false + }, + encoderCallback : { + init : function(string){ + var encoderShort = org.argeo.ria.util.Encoder; + return "{SHA}"+encoderShort.base64Encode(encoderShort.hexDecode(encoderShort.hash(string, "sha1"))); + }, + check : "Function" } }, @@ -28,15 +35,26 @@ qx.Class.define("org.argeo.security.ria.components.PasswordCredentialImpl", { getContainer : function(){ return this; }, - getData : function(format){return true;}, + getData : function(format){ + var encoded = null; + if(this.pass1.getValue() != ""){ + var encoder = this.getEncoderCallback(); + encoded = encoder(this.pass1.getValue()); + } + return encoded; + }, + clear : function(){ + this.pass1.setValue(""); + this.pass2.setValue(""); + }, validate : function(){ - if(this.pass1.getValue() == this.pass2.getValue()){ - this.setValid(true); - }else{ + if(this.pass1.getValue() != this.pass2.getValue() || this.pass1.getValue() == ""){ // TODO WHEN TESTING 0.8.3 //this.pass1.setValid(false); //this.pass2.setValid(false); this.setValid(false); + }else{ + this.setValid(true); } return this.getValid(); }, diff --git a/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/model/User.js b/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/model/User.js index 64ba63e4c..c3f46970d 100644 --- a/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/model/User.js +++ b/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/model/User.js @@ -5,6 +5,10 @@ qx.Class.define("org.argeo.security.ria.model.User", { init : "", check : "String" }, + password : { + nullable : true, + check : "String" + }, roles : { check : "Array" }, @@ -23,7 +27,7 @@ qx.Class.define("org.argeo.security.ria.model.User", { this.base(arguments); this.setRoles([]); this.setNatures([]); - this.setRawData({"password":"{SHA}ieSV55Qc+eQOaYDRSha/AjzNTJE="}); + this.setRawData({password:null}); }, members : { load : function(data, format){ @@ -35,7 +39,7 @@ qx.Class.define("org.argeo.security.ria.model.User", { }, getSaveService : function(){ if(this.isCreate()){ - var userService = org.argeo.security.ria.SecurityAPI.getCreateUserService(this.toJSON()); + var userService = org.argeo.security.ria.SecurityAPI.getCreateUserService(this.toJSON(true)); }else{ var userService = org.argeo.security.ria.SecurityAPI.getUpdateUserService(this.toJSON()); } @@ -45,11 +49,12 @@ qx.Class.define("org.argeo.security.ria.model.User", { }, this); return userService; }, - toJSON : function(){ + toJSON : function(create){ var rawData = this.getRawData(); rawData.username = this.getName(); rawData.roles = this.getRoles(); rawData.userNatures = this.getNatures(); + if(create) rawData.password = this.getPassword(); return rawData; }, _getNatureByType : function(natureType){ -- 2.30.2 From fc99470169cc5c41c3149230760e3947f43c3581 Mon Sep 17 00:00:00 2001 From: Charles du Jeu Date: Mon, 21 Sep 2009 10:08:22 +0000 Subject: [PATCH 05/16] enable auth and getCredentialsURI git-svn-id: https://svn.argeo.org/commons/trunk@2996 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- security/runtime/org.argeo.security.ria/config.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/security/runtime/org.argeo.security.ria/config.json b/security/runtime/org.argeo.security.ria/config.json index e15898309..0ac6c6ac0 100644 --- a/security/runtime/org.argeo.security.ria/config.json +++ b/security/runtime/org.argeo.security.ria/config.json @@ -62,8 +62,8 @@ "qx.version" : "${QXVERSION}", "qx.theme" : "${QXTHEME}", "qx.application" : "${APPLICATION}.Application", - "ria.auth.enableAuth" : "false", - "ria.auth.credentialsURI" : "/org.argeo.slc.webapp/getCredentials.ria", + "ria.auth.enableAuth" : "true", + "ria.auth.credentialsURI" : "/org.argeo.security.webapp/getCredentials.security", "ria.auth.loginURI" : "/org.argeo.slc.webapp/authService.ria", "ria.auth.logoutURI" : "/org.argeo.slc.webapp/authService.ria?logout=true", "ria.StartupPerspective":"org.argeo.security.ria.Perspective" -- 2.30.2 From 655741f139257a0368a30dc6911f765383265c91 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Thu, 1 Oct 2009 10:04:57 +0000 Subject: [PATCH 06/16] Introduce JXL git-svn-id: https://svn.argeo.org/commons/trunk@2997 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- server/runtime/org.argeo.server.jxl/pom.xml | 55 +++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 server/runtime/org.argeo.server.jxl/pom.xml diff --git a/server/runtime/org.argeo.server.jxl/pom.xml b/server/runtime/org.argeo.server.jxl/pom.xml new file mode 100644 index 000000000..12fde803f --- /dev/null +++ b/server/runtime/org.argeo.server.jxl/pom.xml @@ -0,0 +1,55 @@ + + 4.0.0 + + org.argeo.commons.server + runtime + 0.1.1-SNAPSHOT + .. + + org.argeo.server.jxl + Commons Server JXL + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-source-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + org.apache.felix + maven-bundle-plugin + ${version.maven-bundle-plugin} + + + + org.argeo.* + + + + + + + + + + org.argeo.commons.server + org.argeo.server.core + 0.1.1-SNAPSHOT + + + + + net.sourceforge.jexcelapi + com.springsource.jxl + + + + -- 2.30.2 From db84ccc332884c4b89b755923538cecf2f00df68 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Thu, 1 Oct 2009 11:34:48 +0000 Subject: [PATCH 07/16] Introduce JXL DAO support git-svn-id: https://svn.argeo.org/commons/trunk@2998 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../runtime/org.argeo.server.jxl/.classpath | 9 ++ server/runtime/org.argeo.server.jxl/.project | 23 +++ .../.settings/org.eclipse.jdt.core.prefs | 5 + .../.settings/org.maven.ide.eclipse.prefs | 9 ++ server/runtime/org.argeo.server.jxl/pom.xml | 15 ++ .../org/argeo/server/jxl/dao/JxlDaoSheet.java | 5 + .../argeo/server/jxl/dao/JxlDaoSupport.java | 147 ++++++++++++++++++ .../server/jxl/dao/JxlDaoSupportTest.java | 26 ++++ .../org/argeo/server/jxl/dao/OtherObject.java | 22 +++ .../argeo/server/jxl/dao/SimpleObject.java | 31 ++++ .../src/test/resources/dao/simple.xls | Bin 0 -> 6656 bytes .../src/test/resources/log4j.properties | 13 ++ server/runtime/pom.xml | 1 + 13 files changed, 306 insertions(+) create mode 100644 server/runtime/org.argeo.server.jxl/.classpath create mode 100644 server/runtime/org.argeo.server.jxl/.project create mode 100644 server/runtime/org.argeo.server.jxl/.settings/org.eclipse.jdt.core.prefs create mode 100644 server/runtime/org.argeo.server.jxl/.settings/org.maven.ide.eclipse.prefs create mode 100644 server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSheet.java create mode 100644 server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java create mode 100644 server/runtime/org.argeo.server.jxl/src/test/java/org/argeo/server/jxl/dao/JxlDaoSupportTest.java create mode 100644 server/runtime/org.argeo.server.jxl/src/test/java/org/argeo/server/jxl/dao/OtherObject.java create mode 100644 server/runtime/org.argeo.server.jxl/src/test/java/org/argeo/server/jxl/dao/SimpleObject.java create mode 100644 server/runtime/org.argeo.server.jxl/src/test/resources/dao/simple.xls create mode 100644 server/runtime/org.argeo.server.jxl/src/test/resources/log4j.properties diff --git a/server/runtime/org.argeo.server.jxl/.classpath b/server/runtime/org.argeo.server.jxl/.classpath new file mode 100644 index 000000000..6b67f5112 --- /dev/null +++ b/server/runtime/org.argeo.server.jxl/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/server/runtime/org.argeo.server.jxl/.project b/server/runtime/org.argeo.server.jxl/.project new file mode 100644 index 000000000..77aace3d8 --- /dev/null +++ b/server/runtime/org.argeo.server.jxl/.project @@ -0,0 +1,23 @@ + + + org.argeo.server.jxl + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.maven.ide.eclipse.maven2Nature + org.eclipse.jdt.core.javanature + + diff --git a/server/runtime/org.argeo.server.jxl/.settings/org.eclipse.jdt.core.prefs b/server/runtime/org.argeo.server.jxl/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..737c94ce5 --- /dev/null +++ b/server/runtime/org.argeo.server.jxl/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,5 @@ +#Thu Oct 01 12:06:12 CEST 2009 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/server/runtime/org.argeo.server.jxl/.settings/org.maven.ide.eclipse.prefs b/server/runtime/org.argeo.server.jxl/.settings/org.maven.ide.eclipse.prefs new file mode 100644 index 000000000..ef3da6253 --- /dev/null +++ b/server/runtime/org.argeo.server.jxl/.settings/org.maven.ide.eclipse.prefs @@ -0,0 +1,9 @@ +#Thu Oct 01 12:05:59 CEST 2009 +activeProfiles= +eclipse.preferences.version=1 +fullBuildGoals=process-test-resources +includeModules=false +resolveWorkspaceProjects=true +resourceFilterGoals=process-resources resources\:testResources +skipCompilerPlugin=true +version=1 diff --git a/server/runtime/org.argeo.server.jxl/pom.xml b/server/runtime/org.argeo.server.jxl/pom.xml index 12fde803f..06213f558 100644 --- a/server/runtime/org.argeo.server.jxl/pom.xml +++ b/server/runtime/org.argeo.server.jxl/pom.xml @@ -51,5 +51,20 @@ com.springsource.jxl + + + org.junit + com.springsource.junit + test + + + org.argeo.commons.basic + org.argeo.basic.dep.log4j + 0.1.1-SNAPSHOT + pom + test + + + diff --git a/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSheet.java b/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSheet.java new file mode 100644 index 000000000..307d3b9ba --- /dev/null +++ b/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSheet.java @@ -0,0 +1,5 @@ +package org.argeo.server.jxl.dao; + +public class JxlDaoSheet { + private Class targetClass; +} diff --git a/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java b/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java new file mode 100644 index 000000000..390fae72b --- /dev/null +++ b/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java @@ -0,0 +1,147 @@ +package org.argeo.server.jxl.dao; + +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import jxl.Cell; +import jxl.FormulaCell; +import jxl.Sheet; +import jxl.Workbook; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.server.ArgeoServerException; +import org.springframework.beans.BeanWrapper; +import org.springframework.beans.BeanWrapperImpl; + +public class JxlDaoSupport { + private final static Log log = LogFactory.getLog(JxlDaoSupport.class); + + private ClassLoader classLoader = getClass().getClassLoader(); + + private Map> model = new HashMap>(); + + public void load(InputStream in) { + + try { + // used to resolve inner references + Map> tempRefs = new HashMap>(); + List links = new ArrayList(); + + Workbook workbook = Workbook.getWorkbook(in); + + for (Sheet sheet : workbook.getSheets()) { + if (log.isDebugEnabled()) + log + .debug("Instantiate objects of sheet " + + sheet.getName()); + + Cell[] firstRow = sheet.getRow(0); + + // TODO: ability to map sheet names and class names + String className = sheet.getName(); + Class clss = classLoader.loadClass(className); + model.put(clss, new HashMap()); + + tempRefs.put(sheet.getName(), new ArrayList()); + + String keyProperty = firstRow[0].getContents(); + for (int i = 1; i < sheet.getRows(); i++) { + if (log.isTraceEnabled()) + log.trace(" row " + i); + + Cell[] currentRow = sheet.getRow(i); + BeanWrapper bw = new BeanWrapperImpl(clss); + for (int j = 0; j < firstRow.length; j++) { + String pName = firstRow[j].getContents(); + + Cell cell = currentRow[j]; + if (cell instanceof FormulaCell) { + String formula = ((FormulaCell) cell).getFormula(); + int index = formula.indexOf('!'); + String targetSheet = formula.substring(0, index); + // assume no double letters + Integer targetRow = Integer.parseInt(formula + .substring(index + 2)); + links.add(new Link(bw.getWrappedInstance(), pName, + targetSheet, targetRow)); + + if (log.isTraceEnabled()) + log.debug(" formula: " + formula + + " | content: " + cell.getContents() + + " | targetSheet=" + targetSheet + + ", targetRow=" + targetRow); + } else { + bw.setPropertyValue(pName, cell.getContents()); + + if (log.isTraceEnabled()) + log.debug(" " + pName + "=" + + cell.getContents()); + } + }// properties set + + model.get(clss).put(bw.getPropertyValue(keyProperty), + bw.getWrappedInstance()); + tempRefs.get(sheet.getName()).add(bw.getWrappedInstance()); + } + + if (log.isDebugEnabled()) + log.debug(model.get(clss).size() + " objects of type " + + clss); + } + + if (log.isDebugEnabled()) + log.debug("Link " + links.size() + " references"); + for (Link link : links) { + BeanWrapper bw = new BeanWrapperImpl(link.object); + Object targetObject = tempRefs.get(link.getTargetSheet()).get( + link.targetRow - 2); + bw.setPropertyValue(link.property, targetObject); + } + + } catch (Exception e) { + throw new ArgeoServerException("Cannot load workbook", e); + } + } + + @SuppressWarnings("unchecked") + public T getByKey(Class clss, Object key) { + return (T) model.get(clss).get(key); + } + + public static class Link { + private Object object; + private String property; + private String targetSheet; + private Integer targetRow; + + public Link(Object object, String property, String targetSheet, + Integer targetRow) { + super(); + this.object = object; + this.property = property; + this.targetSheet = targetSheet; + this.targetRow = targetRow; + } + + public Object getObject() { + return object; + } + + public String getProperty() { + return property; + } + + public String getTargetSheet() { + return targetSheet; + } + + public Integer getTargetRow() { + return targetRow; + } + + } +} diff --git a/server/runtime/org.argeo.server.jxl/src/test/java/org/argeo/server/jxl/dao/JxlDaoSupportTest.java b/server/runtime/org.argeo.server.jxl/src/test/java/org/argeo/server/jxl/dao/JxlDaoSupportTest.java new file mode 100644 index 000000000..b79a8a03d --- /dev/null +++ b/server/runtime/org.argeo.server.jxl/src/test/java/org/argeo/server/jxl/dao/JxlDaoSupportTest.java @@ -0,0 +1,26 @@ +package org.argeo.server.jxl.dao; + +import java.io.InputStream; + +import junit.framework.TestCase; + +public class JxlDaoSupportTest extends TestCase { + public void testBasic() { + JxlDaoSupport jsd = new JxlDaoSupport(); + InputStream in = getClass().getResourceAsStream("/dao/simple.xls"); + jsd.load(in); + + SimpleObject soAaa = jsd.getByKey(SimpleObject.class, "aaa"); + assertNotNull(soAaa); + assertEquals("aaa", soAaa.getString()); + assertEquals(1, soAaa.getInteger().intValue()); + assertNotNull(soAaa.getOtherObject()); + assertEquals("USD", soAaa.getOtherObject().getKey()); + assertEquals("US Dollar", soAaa.getOtherObject().getValue()); + + SimpleObject soBbb = jsd.getByKey(SimpleObject.class, "bbb"); + assertNotNull(soBbb.getOtherObject()); + assertEquals("bbb", ((SimpleObject) soBbb.getOtherObject().getValue()) + .getString()); + } +} diff --git a/server/runtime/org.argeo.server.jxl/src/test/java/org/argeo/server/jxl/dao/OtherObject.java b/server/runtime/org.argeo.server.jxl/src/test/java/org/argeo/server/jxl/dao/OtherObject.java new file mode 100644 index 000000000..2d7abd6e4 --- /dev/null +++ b/server/runtime/org.argeo.server.jxl/src/test/java/org/argeo/server/jxl/dao/OtherObject.java @@ -0,0 +1,22 @@ +package org.argeo.server.jxl.dao; + +public class OtherObject { + private String key; + private Object value; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public Object getValue() { + return value; + } + + public void setValue(Object value) { + this.value = value; + } +} diff --git a/server/runtime/org.argeo.server.jxl/src/test/java/org/argeo/server/jxl/dao/SimpleObject.java b/server/runtime/org.argeo.server.jxl/src/test/java/org/argeo/server/jxl/dao/SimpleObject.java new file mode 100644 index 000000000..ae5aea50d --- /dev/null +++ b/server/runtime/org.argeo.server.jxl/src/test/java/org/argeo/server/jxl/dao/SimpleObject.java @@ -0,0 +1,31 @@ +package org.argeo.server.jxl.dao; + +public class SimpleObject { + private String string; + private Integer integer; + private OtherObject otherObject; + + public String getString() { + return string; + } + + public void setString(String sting) { + this.string = sting; + } + + public Integer getInteger() { + return integer; + } + + public void setInteger(Integer integer) { + this.integer = integer; + } + + public OtherObject getOtherObject() { + return otherObject; + } + + public void setOtherObject(OtherObject otherObject) { + this.otherObject = otherObject; + } +} diff --git a/server/runtime/org.argeo.server.jxl/src/test/resources/dao/simple.xls b/server/runtime/org.argeo.server.jxl/src/test/resources/dao/simple.xls new file mode 100644 index 0000000000000000000000000000000000000000..7cb8841c78c6ee4f55dccdfc69b2119214c9ccfd GIT binary patch literal 6656 zcmeHLU2IfE6h8NMw`@yc+wv!%c&$FdK*hI0B>ws0HQ#bAfrl zd|(0a5U>zf1S|#~1|9*H0FMF|@EA}BJPteoECuR;Wk3V499RKx%uRmE{FBJ91X_LB zYCp|eVmeof1u7y~#qzLxIqNK4zWV-4V8qGL8Rf+c)1h+DzvKuxp>8|&dY<6=wVetyM7gFP<^RmpLl z%rA6o?dV>=`J(Q)>_$!XKc>KBu<*U9StU*%y~-cXOl88YPT z-00aM<4N=KA2G2T(~@Ocoi5X~CS9&+Z91gsob(J$=cdEi9bma3 zhoo70dA);=O}axZwmak`TgDuBkK?xN+?!|_u#+u4@sZsLr?YRT)1NvdO%mlD5RSQM zgU-~j<9hWE!$~yacLLiL3PTI9SxFy5$;f_wlRh3CnU`3Q@{EPpfCe5utm)PE9u>L# zYMGhg0rM5EqY>F};6fTXZNw1AWXV+?K{%2kIGQ3jaw31?RJwsp$fJtDRdy`p#z%*+ zYvQ9RXUK7Jk|pzlhHBfk5%=}=A>QTegNgRoiE#&|-kx@->+P}HlZk}wLekOO4cm8& zyGeAIa>i2K&R`agqAK|ra%$vZ={eQve>l}D%x(a)=Tg+@Osg@U8y{Xhx23OZ-ODOZ z>y;ZFAS~q~%Qe}LFK0q4v_+%F2ej^79GMo*$_@2(+u|e6n6=e;#p+Iu*rQEblkSL} zsH<;XRlj~7PEnkxcdpiD4>?wS*Fo+6O^xd@l+_w8uUi(#Hz0qo`NDzb3z>Dx1Nmc8 zhquCjF18^Dq{(P9a_w`eA-(9kLS9otiQ!iA7J*>$M&Z%Giz6l%mU)wo42*~hWh@lR zNR*&#!hfTBeS0MXhG$!^Wa=__B}$`cFY>xssiTkT8CZ^+3eOyWgt+5U58p)~FB+Ym zVV1KQD8f$pF{&3RcEdG}>M+=iS*#m0M>m!9=suOMNEaHKnT_ZU^vH1cafIv{qs**C z7HTpLDzC_RR$_&GFr`x4u?@HTb7rl4rqB3Tz7mFo{$MtU49o*L3}l+QFvz_yms{0y zUpeNQ*t!}5%q^7B_=Peu5rol2C+qWU=33_2%mro1<1ZNGmq^>)vaD*moiw_QZS3|GO zlw*w0Q#$3AUW1$X=StciZ~_kEY`Q-)|=Y4*K$h_ZFiU*7_TXfOrteWAB6$%nELV2nV#xoYc1>3O zjxxRjx!&9d^Z|FQ9Qb&`cPEByfZh?ja62)Eoq-yqWvQR@p>Bp!S~a55CcmNqy$Nwj zX*OvcUN$_org.argeo.server.core org.argeo.server.json org.argeo.server.osgi + org.argeo.server.jxl \ No newline at end of file -- 2.30.2 From 868030e8fb739ec314c06c5651159735fa56f375 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Thu, 1 Oct 2009 13:27:35 +0000 Subject: [PATCH 08/16] Introduce JXL DAO support git-svn-id: https://svn.argeo.org/commons/trunk@2999 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../argeo/server/jxl/dao/JxlDaoSupport.java | 139 ++++++++++++++---- .../server/jxl/dao/JxlDaoSupportTest.java | 46 ++++-- .../argeo/server/jxl/dao/SimpleObject.java | 9 ++ .../src/test/resources/dao/simple.xls | Bin 6656 -> 6656 bytes 4 files changed, 146 insertions(+), 48 deletions(-) diff --git a/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java b/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java index 390fae72b..834de39f6 100644 --- a/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java +++ b/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java @@ -2,6 +2,7 @@ package org.argeo.server.jxl.dao; import java.io.InputStream; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -16,29 +17,34 @@ import org.apache.commons.logging.LogFactory; import org.argeo.server.ArgeoServerException; import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapperImpl; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.util.StringUtils; -public class JxlDaoSupport { +public class JxlDaoSupport implements ApplicationContextAware { private final static Log log = LogFactory.getLog(JxlDaoSupport.class); private ClassLoader classLoader = getClass().getClassLoader(); + private ApplicationContext applicationContext; - private Map> model = new HashMap>(); + private Map, Map> model = new HashMap, Map>(); + + private Map externalRefs = new HashMap(); public void load(InputStream in) { try { // used to resolve inner references Map> tempRefs = new HashMap>(); - List links = new ArrayList(); + List links = new ArrayList(); Workbook workbook = Workbook.getWorkbook(in); for (Sheet sheet : workbook.getSheets()) { - if (log.isDebugEnabled()) - log - .debug("Instantiate objects of sheet " - + sheet.getName()); - + if (log.isTraceEnabled()) + log.debug("Instantiate sheet " + sheet.getName()); + Cell[] firstRow = sheet.getRow(0); // TODO: ability to map sheet names and class names @@ -49,25 +55,27 @@ public class JxlDaoSupport { tempRefs.put(sheet.getName(), new ArrayList()); String keyProperty = firstRow[0].getContents(); - for (int i = 1; i < sheet.getRows(); i++) { + for (int row = 1; row < sheet.getRows(); row++) { if (log.isTraceEnabled()) - log.trace(" row " + i); + log.trace(" row " + row); - Cell[] currentRow = sheet.getRow(i); + Cell[] currentRow = sheet.getRow(row); BeanWrapper bw = new BeanWrapperImpl(clss); - for (int j = 0; j < firstRow.length; j++) { - String pName = firstRow[j].getContents(); + for (int col = 0; col < firstRow.length; col++) { + String pName = firstRow[col].getContents(); - Cell cell = currentRow[j]; + Cell cell = currentRow[col]; if (cell instanceof FormulaCell) { String formula = ((FormulaCell) cell).getFormula(); int index = formula.indexOf('!'); String targetSheet = formula.substring(0, index); - // assume no double letters - Integer targetRow = Integer.parseInt(formula - .substring(index + 2)); - links.add(new Link(bw.getWrappedInstance(), pName, - targetSheet, targetRow)); + // assume no double letters!! + String targetRowStr = formula.substring(index + 2); + if (targetRowStr.charAt(0) == '$') + targetRowStr = targetRowStr.substring(1); + Integer targetRow = Integer.parseInt(targetRowStr); + links.add(new Reference(bw.getWrappedInstance(), + pName, targetSheet, targetRow)); if (log.isTraceEnabled()) log.debug(" formula: " + formula @@ -75,11 +83,23 @@ public class JxlDaoSupport { + " | targetSheet=" + targetSheet + ", targetRow=" + targetRow); } else { - bw.setPropertyValue(pName, cell.getContents()); + String contents = cell.getContents(); + if (pName.equals(keyProperty) + && !StringUtils.hasText(contents)) { + // auto allocate key column if empty + contents = Integer.toString(row); + } + + if (pName.charAt(0) == '#') {// externalRef + links.add(new Reference( + bw.getWrappedInstance(), pName + .substring(1), contents)); + } else { + bw.setPropertyValue(pName, contents); + } if (log.isTraceEnabled()) - log.debug(" " + pName + "=" - + cell.getContents()); + log.debug(" " + pName + "=" + contents); } }// properties set @@ -90,17 +110,30 @@ public class JxlDaoSupport { if (log.isDebugEnabled()) log.debug(model.get(clss).size() + " objects of type " - + clss); + + clss + " instantiated"); } - if (log.isDebugEnabled()) - log.debug("Link " + links.size() + " references"); - for (Link link : links) { + for (Reference link : links) { BeanWrapper bw = new BeanWrapperImpl(link.object); - Object targetObject = tempRefs.get(link.getTargetSheet()).get( - link.targetRow - 2); + Object targetObject; + if (link.getExternalRef() != null) { + String ref = link.getExternalRef(); + if (externalRefs.containsKey(ref)) + targetObject = externalRefs.get(ref); + else if (applicationContext != null) + targetObject = applicationContext.getBean(ref); + else { + targetObject = null; + log.warn("Ref " + ref + " not found"); + } + } else { + targetObject = tempRefs.get(link.getTargetSheet()).get( + link.targetRow - 2); + } bw.setPropertyValue(link.property, targetObject); } + if (log.isDebugEnabled()) + log.debug(links.size() + " references linked"); } catch (Exception e) { throw new ArgeoServerException("Cannot load workbook", e); @@ -109,24 +142,62 @@ public class JxlDaoSupport { @SuppressWarnings("unchecked") public T getByKey(Class clss, Object key) { - return (T) model.get(clss).get(key); + return (T) model.get(findClass(clss)).get(key); + } + + @SuppressWarnings("unchecked") + public List list(Class clss, Object filter) { + return new ArrayList((Collection) model.get(findClass(clss)) + .values()); + } + + @SuppressWarnings("unchecked") + protected Class findClass(Class parent) { + if (model.containsKey(parent)) + return parent; + + for (Class clss : model.keySet()) { + if (parent.isAssignableFrom(clss)) + return clss;// return the first found + } + throw new ArgeoServerException("No implementing class found for " + + parent); + } + + public void setApplicationContext(ApplicationContext applicationContext) + throws BeansException { + this.applicationContext = applicationContext; + } + + public void setExternalRefs(Map externalRefs) { + this.externalRefs = externalRefs; + } + + public Map getExternalRefs() { + return externalRefs; } - public static class Link { + public static class Reference { private Object object; private String property; private String targetSheet; private Integer targetRow; + private String externalRef; - public Link(Object object, String property, String targetSheet, + public Reference(Object object, String property, String targetSheet, Integer targetRow) { - super(); this.object = object; this.property = property; this.targetSheet = targetSheet; this.targetRow = targetRow; } + public Reference(Object object, String property, String externalRef) { + this.object = object; + this.property = property; + this.externalRef = externalRef; + } + public Object getObject() { return object; } @@ -143,5 +214,9 @@ public class JxlDaoSupport { return targetRow; } + public String getExternalRef() { + return externalRef; + } + } } diff --git a/server/runtime/org.argeo.server.jxl/src/test/java/org/argeo/server/jxl/dao/JxlDaoSupportTest.java b/server/runtime/org.argeo.server.jxl/src/test/java/org/argeo/server/jxl/dao/JxlDaoSupportTest.java index b79a8a03d..5de2b5af1 100644 --- a/server/runtime/org.argeo.server.jxl/src/test/java/org/argeo/server/jxl/dao/JxlDaoSupportTest.java +++ b/server/runtime/org.argeo.server.jxl/src/test/java/org/argeo/server/jxl/dao/JxlDaoSupportTest.java @@ -1,26 +1,40 @@ package org.argeo.server.jxl.dao; import java.io.InputStream; +import java.util.List; import junit.framework.TestCase; public class JxlDaoSupportTest extends TestCase { - public void testBasic() { + public void testBasic() throws Exception { JxlDaoSupport jsd = new JxlDaoSupport(); - InputStream in = getClass().getResourceAsStream("/dao/simple.xls"); - jsd.load(in); - - SimpleObject soAaa = jsd.getByKey(SimpleObject.class, "aaa"); - assertNotNull(soAaa); - assertEquals("aaa", soAaa.getString()); - assertEquals(1, soAaa.getInteger().intValue()); - assertNotNull(soAaa.getOtherObject()); - assertEquals("USD", soAaa.getOtherObject().getKey()); - assertEquals("US Dollar", soAaa.getOtherObject().getValue()); - - SimpleObject soBbb = jsd.getByKey(SimpleObject.class, "bbb"); - assertNotNull(soBbb.getOtherObject()); - assertEquals("bbb", ((SimpleObject) soBbb.getOtherObject().getValue()) - .getString()); + jsd.getExternalRefs().put("test", new OtherObject()); + + InputStream in = null; + try { + in = getClass().getResourceAsStream("/dao/simple.xls"); + jsd.load(in); + + SimpleObject soAaa = jsd.getByKey(SimpleObject.class, "aaa"); + assertNotNull(soAaa); + assertEquals("aaa", soAaa.getString()); + assertEquals(1, soAaa.getInteger().intValue()); + assertNotNull(soAaa.getOtherObject()); + assertEquals("USD", soAaa.getOtherObject().getKey()); + assertEquals("US Dollar", soAaa.getOtherObject().getValue()); + + SimpleObject soBbb = jsd.getByKey(SimpleObject.class, "bbb"); + assertNotNull(soBbb.getOtherObject()); + assertEquals("bbb", ((SimpleObject) soBbb.getOtherObject() + .getValue()).getString()); + + List simpleObjects = jsd.list(SimpleObject.class, + null); + assertEquals(2, simpleObjects.size()); + } finally { + if (in != null) + in.close(); + } + } } diff --git a/server/runtime/org.argeo.server.jxl/src/test/java/org/argeo/server/jxl/dao/SimpleObject.java b/server/runtime/org.argeo.server.jxl/src/test/java/org/argeo/server/jxl/dao/SimpleObject.java index ae5aea50d..f04166789 100644 --- a/server/runtime/org.argeo.server.jxl/src/test/java/org/argeo/server/jxl/dao/SimpleObject.java +++ b/server/runtime/org.argeo.server.jxl/src/test/java/org/argeo/server/jxl/dao/SimpleObject.java @@ -4,6 +4,7 @@ public class SimpleObject { private String string; private Integer integer; private OtherObject otherObject; + private OtherObject anotherObject; public String getString() { return string; @@ -28,4 +29,12 @@ public class SimpleObject { public void setOtherObject(OtherObject otherObject) { this.otherObject = otherObject; } + + public OtherObject getAnotherObject() { + return anotherObject; + } + + public void setAnotherObject(OtherObject anotherObject) { + this.anotherObject = anotherObject; + } } diff --git a/server/runtime/org.argeo.server.jxl/src/test/resources/dao/simple.xls b/server/runtime/org.argeo.server.jxl/src/test/resources/dao/simple.xls index 7cb8841c78c6ee4f55dccdfc69b2119214c9ccfd..ad69850f1066fba3a7daa2626f67b68e8ec50875 100644 GIT binary patch delta 708 zcmZ8cJx|;~5S>~3d>srDC}z2^WONqc^lW``q92s9Rz^KeEud$ z@+A98J;e1epOK7vCg0<^K|CpZHQY<^AqRVa&<9YU1G|A+^wX~4HuX8*@|)oC?=D?9 z1HCRlfAh`T@O5i>c5$ioDl`C^&87(uw%&(i6(fi-3=Sk3UR)Qen zX=h;(EF_I$Z|NV76Ql~|DY;b9BmnE=Ti8I&_2h&fWMsl$9+M>mjrJINPq^`21pW;**0Wa`%U*{ zgo?P-B+i5(%Bd6`ozCA|(&VDG)n$Hzduj+#WRdhm+?7Sr7rp3Fv}4 Date: Tue, 6 Oct 2009 08:41:12 +0000 Subject: [PATCH 09/16] Make JXL DAO support more robust and extensible git-svn-id: https://svn.argeo.org/commons/trunk@3000 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../org/argeo/server/jxl/dao/JxlDaoSheet.java | 5 - .../argeo/server/jxl/dao/JxlDaoSupport.java | 246 +++++++++++------- 2 files changed, 156 insertions(+), 95 deletions(-) delete mode 100644 server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSheet.java diff --git a/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSheet.java b/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSheet.java deleted file mode 100644 index 307d3b9ba..000000000 --- a/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSheet.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.argeo.server.jxl.dao; - -public class JxlDaoSheet { - private Class targetClass; -} diff --git a/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java b/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java index 834de39f6..0960b6c42 100644 --- a/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java +++ b/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java @@ -9,6 +9,7 @@ import java.util.Map; import jxl.Cell; import jxl.FormulaCell; +import jxl.JXLException; import jxl.Sheet; import jxl.Workbook; @@ -32,114 +33,171 @@ public class JxlDaoSupport implements ApplicationContextAware { private Map externalRefs = new HashMap(); - public void load(InputStream in) { + private List scannedPackages = new ArrayList(); + public void load(InputStream in) { try { // used to resolve inner references Map> tempRefs = new HashMap>(); - List links = new ArrayList(); + + List references = new ArrayList(); Workbook workbook = Workbook.getWorkbook(in); for (Sheet sheet : workbook.getSheets()) { - if (log.isTraceEnabled()) - log.debug("Instantiate sheet " + sheet.getName()); - - Cell[] firstRow = sheet.getRow(0); - - // TODO: ability to map sheet names and class names - String className = sheet.getName(); - Class clss = classLoader.loadClass(className); - model.put(clss, new HashMap()); - - tempRefs.put(sheet.getName(), new ArrayList()); - - String keyProperty = firstRow[0].getContents(); - for (int row = 1; row < sheet.getRows(); row++) { - if (log.isTraceEnabled()) - log.trace(" row " + row); - - Cell[] currentRow = sheet.getRow(row); - BeanWrapper bw = new BeanWrapperImpl(clss); - for (int col = 0; col < firstRow.length; col++) { - String pName = firstRow[col].getContents(); - - Cell cell = currentRow[col]; - if (cell instanceof FormulaCell) { - String formula = ((FormulaCell) cell).getFormula(); - int index = formula.indexOf('!'); - String targetSheet = formula.substring(0, index); - // assume no double letters!! - String targetRowStr = formula.substring(index + 2); - if (targetRowStr.charAt(0) == '$') - targetRowStr = targetRowStr.substring(1); - Integer targetRow = Integer.parseInt(targetRowStr); - links.add(new Reference(bw.getWrappedInstance(), - pName, targetSheet, targetRow)); - - if (log.isTraceEnabled()) - log.debug(" formula: " + formula - + " | content: " + cell.getContents() - + " | targetSheet=" + targetSheet - + ", targetRow=" + targetRow); - } else { - String contents = cell.getContents(); - if (pName.equals(keyProperty) - && !StringUtils.hasText(contents)) { - // auto allocate key column if empty - contents = Integer.toString(row); - } - - if (pName.charAt(0) == '#') {// externalRef - links.add(new Reference( - bw.getWrappedInstance(), pName - .substring(1), contents)); - } else { - bw.setPropertyValue(pName, contents); - } - - if (log.isTraceEnabled()) - log.debug(" " + pName + "=" + contents); - } - }// properties set - - model.get(clss).put(bw.getPropertyValue(keyProperty), - bw.getWrappedInstance()); - tempRefs.get(sheet.getName()).add(bw.getWrappedInstance()); - } - - if (log.isDebugEnabled()) - log.debug(model.get(clss).size() + " objects of type " - + clss + " instantiated"); + loadSheet(sheet, references, tempRefs); } - for (Reference link : links) { - BeanWrapper bw = new BeanWrapperImpl(link.object); - Object targetObject; - if (link.getExternalRef() != null) { - String ref = link.getExternalRef(); - if (externalRefs.containsKey(ref)) - targetObject = externalRefs.get(ref); - else if (applicationContext != null) - targetObject = applicationContext.getBean(ref); - else { - targetObject = null; - log.warn("Ref " + ref + " not found"); - } - } else { - targetObject = tempRefs.get(link.getTargetSheet()).get( - link.targetRow - 2); - } - bw.setPropertyValue(link.property, targetObject); + for (Reference ref : references) { + injectReference(ref, tempRefs); } if (log.isDebugEnabled()) - log.debug(links.size() + " references linked"); + log.debug(references.size() + " references linked"); } catch (Exception e) { throw new ArgeoServerException("Cannot load workbook", e); } } + protected void loadSheet(Sheet sheet, List references, + Map> tempRefs) throws JXLException { + if (log.isTraceEnabled()) + log.debug("Instantiate sheet " + sheet.getName()); + + Cell[] firstRow = sheet.getRow(0); + + Class clss = findClassToInstantiate(sheet); + model.put(clss, new HashMap()); + + tempRefs.put(sheet.getName(), new ArrayList()); + + String keyProperty = firstRow[0].getContents(); + for (int row = 1; row < sheet.getRows(); row++) { + if (log.isTraceEnabled()) + log.trace(" row " + row); + + Cell[] currentRow = sheet.getRow(row); + BeanWrapper bw = new BeanWrapperImpl(clss); + cells: for (int col = 0; col < firstRow.length; col++) { + String pName = firstRow[col].getContents(); + + if (col < currentRow.length) { + Cell cell = currentRow[col]; + if (overrideCell(cell, bw, pName, keyProperty, row, + references, tempRefs)) + continue cells; + loadCell(cell, bw, pName, keyProperty, row, references); + } + }// cells + + model.get(clss).put(bw.getPropertyValue(keyProperty), + bw.getWrappedInstance()); + tempRefs.get(sheet.getName()).add(bw.getWrappedInstance()); + } + + if (log.isDebugEnabled()) + log.debug(model.get(clss).size() + " objects of type " + clss + + " instantiated"); + + } + + protected void loadCell(Cell cell, BeanWrapper bw, String propertyName, + String keyProperty, Integer row, List references) + throws JXLException { + + if (cell instanceof FormulaCell) { + String formula = ((FormulaCell) cell).getFormula(); + int index = formula.indexOf('!'); + String targetSheet = formula.substring(0, index); + // assume no double letters!! + String targetRowStr = formula.substring(index + 2); + if (targetRowStr.charAt(0) == '$') + targetRowStr = targetRowStr.substring(1); + Integer targetRow = Integer.parseInt(targetRowStr); + references.add(new Reference(bw.getWrappedInstance(), propertyName, + targetSheet, targetRow)); + + if (log.isTraceEnabled()) + log.debug(" formula: " + formula + " | content: " + + cell.getContents() + " | targetSheet=" + targetSheet + + ", targetRow=" + targetRow); + } else { + String contents = cell.getContents(); + if (propertyName.equals(keyProperty) + && !StringUtils.hasText(contents)) { + // auto allocate key column if empty + contents = Integer.toString(row); + } + + if (propertyName.charAt(0) == '#') {// externalRef + references.add(new Reference(bw.getWrappedInstance(), + propertyName.substring(1), contents)); + } else { + bw.setPropertyValue(propertyName, contents); + } + + if (log.isTraceEnabled()) + log.debug(" " + propertyName + "=" + contents); + } + + } + + /** Returns true if property was set (thus bypassing standard process). */ + protected Boolean overrideCell(Cell cell, BeanWrapper bw, + String propertyName, String keyProperty, Integer row, + List references, Map> tempRefs) { + return false; + } + + protected void injectReference(Reference reference, + Map> tempRefs) { + BeanWrapper bw = new BeanWrapperImpl(reference.object); + Object targetObject; + if (reference.getExternalRef() != null) { + String ref = reference.getExternalRef(); + if (externalRefs.containsKey(ref)) + targetObject = externalRefs.get(ref); + else if (applicationContext != null) + targetObject = applicationContext.getBean(ref); + else { + targetObject = null; + log.warn("Ref " + ref + " not found"); + } + } else { + targetObject = tempRefs.get(reference.getTargetSheet()).get( + reference.targetRow - 2); + } + bw.setPropertyValue(reference.property, targetObject); + + } + + protected Class findClassToInstantiate(Sheet sheet) { + // TODO: ability to map sheet names and class names + String className = sheet.getName(); + Class clss = null; + try { + clss = classLoader.loadClass(className); + return clss; + } catch (ClassNotFoundException e) { + // silent + } + + scannedPkgs: for (String pkg : scannedPackages) { + try { + clss = classLoader.loadClass(pkg + "." + className); + break scannedPkgs; + } catch (ClassNotFoundException e) { + // silent + } + } + + if (clss == null) + throw new ArgeoServerException("Cannot find a class for sheet " + + sheet.getName()); + + return clss; + } + @SuppressWarnings("unchecked") public T getByKey(Class clss, Object key) { return (T) model.get(findClass(clss)).get(key); @@ -177,6 +235,14 @@ public class JxlDaoSupport implements ApplicationContextAware { return externalRefs; } + public void setScannedPackages(List scannedPackages) { + this.scannedPackages = scannedPackages; + } + + public List getScannedPackages() { + return scannedPackages; + } + public static class Reference { private Object object; private String property; -- 2.30.2 From 1e15cc14a83ef43e453709d04cdb13e3b0269cc1 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Tue, 6 Oct 2009 12:26:52 +0000 Subject: [PATCH 10/16] Make JXL DAO support more robust git-svn-id: https://svn.argeo.org/commons/trunk@3001 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../argeo/server/jxl/dao/JxlDaoSupport.java | 36 +++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java b/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java index 0960b6c42..ef3dcf04b 100644 --- a/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java +++ b/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java @@ -13,17 +13,20 @@ import jxl.JXLException; import jxl.Sheet; import jxl.Workbook; +import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.argeo.server.ArgeoServerException; import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapperImpl; import org.springframework.beans.BeansException; +import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; +import org.springframework.core.io.Resource; import org.springframework.util.StringUtils; -public class JxlDaoSupport implements ApplicationContextAware { +public class JxlDaoSupport implements ApplicationContextAware, InitializingBean { private final static Log log = LogFactory.getLog(JxlDaoSupport.class); private ClassLoader classLoader = getClass().getClassLoader(); @@ -35,6 +38,21 @@ public class JxlDaoSupport implements ApplicationContextAware { private List scannedPackages = new ArrayList(); + private List workbooks = new ArrayList(); + + public void afterPropertiesSet() throws Exception { + for (Resource res : workbooks) { + InputStream in = null; + try { + in = res.getInputStream(); + load(in); + } finally { + IOUtils.closeQuietly(in); + } + } + + } + public void load(InputStream in) { try { // used to resolve inner references @@ -184,10 +202,12 @@ public class JxlDaoSupport implements ApplicationContextAware { scannedPkgs: for (String pkg : scannedPackages) { try { - clss = classLoader.loadClass(pkg + "." + className); + clss = classLoader.loadClass(pkg.trim() + "." + className); break scannedPkgs; } catch (ClassNotFoundException e) { // silent + if (log.isTraceEnabled()) + log.trace(e.getMessage()); } } @@ -243,6 +263,18 @@ public class JxlDaoSupport implements ApplicationContextAware { return scannedPackages; } + public void setWorkbooks(List workbooks) { + this.workbooks = workbooks; + } + + public List getWorkbooks() { + return workbooks; + } + + public void setClassLoader(ClassLoader classLoader) { + this.classLoader = classLoader; + } + public static class Reference { private Object object; private String property; -- 2.30.2 From 85314e7730e0e5702d8f004d73cfbb7d63eb17db Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Tue, 6 Oct 2009 12:27:07 +0000 Subject: [PATCH 11/16] Fix bundle name git-svn-id: https://svn.argeo.org/commons/trunk@3002 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../demo/org.argeo.security.demo.log4j/META-INF/MANIFEST.MF | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/security/demo/org.argeo.security.demo.log4j/META-INF/MANIFEST.MF b/security/demo/org.argeo.security.demo.log4j/META-INF/MANIFEST.MF index b96ebfe10..c770fe77a 100644 --- a/security/demo/org.argeo.security.demo.log4j/META-INF/MANIFEST.MF +++ b/security/demo/org.argeo.security.demo.log4j/META-INF/MANIFEST.MF @@ -1,3 +1,3 @@ -Bundle-SymbolicName: org.argeo.server.demo.log4j +Bundle-SymbolicName: org.argeo.security.demo.log4j Bundle-Version: 0.1.1.SNAPSHOT Fragment-Host: com.springsource.org.apache.log4j -- 2.30.2 From 0cd39bbdf4af27a8a3587dd1ef4d815d16c5c580 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Thu, 8 Oct 2009 09:42:04 +0000 Subject: [PATCH 12/16] Fix groupId git-svn-id: https://svn.argeo.org/commons/trunk@3006 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- server/modules/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/modules/pom.xml b/server/modules/pom.xml index 30179e65c..11e4d396b 100644 --- a/server/modules/pom.xml +++ b/server/modules/pom.xml @@ -6,7 +6,7 @@ server .. - org.argeo.server + org.argeo.commons.server modules bundles Commons Server Modules -- 2.30.2 From aa95083d42d85ebaba5147e93f6b2b8b757b4752 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Thu, 8 Oct 2009 13:22:33 +0000 Subject: [PATCH 13/16] Introduce light DAO support git-svn-id: https://svn.argeo.org/commons/trunk@3007 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../org/argeo/server/dao/LightDaoSupport.java | 11 +++++ .../argeo/server/jxl/dao/JxlDaoSupport.java | 41 ++++++++++++++++--- 2 files changed, 46 insertions(+), 6 deletions(-) create mode 100644 server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/dao/LightDaoSupport.java diff --git a/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/dao/LightDaoSupport.java b/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/dao/LightDaoSupport.java new file mode 100644 index 000000000..cc16d7bd3 --- /dev/null +++ b/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/dao/LightDaoSupport.java @@ -0,0 +1,11 @@ +package org.argeo.server.dao; + +import java.util.List; + +public interface LightDaoSupport { + public T getByKey(Class clss, Object key); + + public T getByField(Class clss, String field, Object value); + + public List list(Class clss, Object filter); +} diff --git a/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java b/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java index ef3dcf04b..0488d5198 100644 --- a/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java +++ b/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java @@ -6,6 +6,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.TreeMap; import jxl.Cell; import jxl.FormulaCell; @@ -17,16 +18,19 @@ import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.argeo.server.ArgeoServerException; +import org.argeo.server.dao.LightDaoSupport; import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapperImpl; import org.springframework.beans.BeansException; import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.generic.GenericBeanFactoryAccessor; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.core.io.Resource; import org.springframework.util.StringUtils; -public class JxlDaoSupport implements ApplicationContextAware, InitializingBean { +public class JxlDaoSupport implements LightDaoSupport, ApplicationContextAware, + InitializingBean { private final static Log log = LogFactory.getLog(JxlDaoSupport.class); private ClassLoader classLoader = getClass().getClassLoader(); @@ -85,7 +89,7 @@ public class JxlDaoSupport implements ApplicationContextAware, InitializingBean Cell[] firstRow = sheet.getRow(0); Class clss = findClassToInstantiate(sheet); - model.put(clss, new HashMap()); + model.put(clss, new TreeMap()); tempRefs.put(sheet.getName(), new ArrayList()); @@ -223,10 +227,36 @@ public class JxlDaoSupport implements ApplicationContextAware, InitializingBean return (T) model.get(findClass(clss)).get(key); } + /** + * Slow. + * + * @return the first found + */ + public T getByField(Class clss, String field, Object value) { + List all = list(clss, null); + T res = null; + for (T obj : all) { + if (new BeanWrapperImpl(obj).getPropertyValue(field).equals(value)) { + res = obj; + break; + } + } + return res; + } + @SuppressWarnings("unchecked") public List list(Class clss, Object filter) { - return new ArrayList((Collection) model.get(findClass(clss)) - .values()); + List res = new ArrayList(); + + Class classToUse = findClass(clss); + if (classToUse != null) + res.addAll((Collection) model.get(classToUse).values()); + + if (applicationContext != null) + res.addAll(new GenericBeanFactoryAccessor(applicationContext) + .getBeansOfType(clss).values()); + + return res; } @SuppressWarnings("unchecked") @@ -238,8 +268,7 @@ public class JxlDaoSupport implements ApplicationContextAware, InitializingBean if (parent.isAssignableFrom(clss)) return clss;// return the first found } - throw new ArgeoServerException("No implementing class found for " - + parent); + return null; } public void setApplicationContext(ApplicationContext applicationContext) -- 2.30.2 From fcba995cad31d59cbf93be689c2b55ec66ed9ce3 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Mon, 12 Oct 2009 20:17:25 +0000 Subject: [PATCH 14/16] Add hibernate dependency git-svn-id: https://svn.argeo.org/commons/trunk@3015 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- server/dep/org.argeo.server.dep.ads/pom.xml | 2 +- .../org.argeo.server.dep.hibernate/pom.xml | 39 +++++++++++++++++++ .../dep/org.argeo.server.dep.tomcat/pom.xml | 2 +- server/dep/pom.xml | 1 + 4 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 server/dep/org.argeo.server.dep.hibernate/pom.xml diff --git a/server/dep/org.argeo.server.dep.ads/pom.xml b/server/dep/org.argeo.server.dep.ads/pom.xml index 69ddfa7bf..e03652e81 100644 --- a/server/dep/org.argeo.server.dep.ads/pom.xml +++ b/server/dep/org.argeo.server.dep.ads/pom.xml @@ -9,7 +9,7 @@ org.argeo.server.dep.ads pom - Apache Directory Server + Dep Apache Directory Server diff --git a/server/dep/org.argeo.server.dep.hibernate/pom.xml b/server/dep/org.argeo.server.dep.hibernate/pom.xml new file mode 100644 index 000000000..6d10940fb --- /dev/null +++ b/server/dep/org.argeo.server.dep.hibernate/pom.xml @@ -0,0 +1,39 @@ + + 4.0.0 + + org.argeo.commons.server + 0.1.1-SNAPSHOT + dep + .. + + org.argeo.server.dep.hibernate + pom + Dep Hibernate + + + + org.argeo.commons.basic + org.argeo.basic.dep.log4j + 0.1.1-SNAPSHOT + pom + + + + + org.hibernate + com.springsource.org.hibernate + + + + + javax.transaction + com.springsource.javax.transaction + + + edu.emory.mathcs.backport + com.springsource.edu.emory.mathcs.backport + + + + \ No newline at end of file diff --git a/server/dep/org.argeo.server.dep.tomcat/pom.xml b/server/dep/org.argeo.server.dep.tomcat/pom.xml index 261d241c2..ade1fa520 100644 --- a/server/dep/org.argeo.server.dep.tomcat/pom.xml +++ b/server/dep/org.argeo.server.dep.tomcat/pom.xml @@ -9,7 +9,7 @@ org.argeo.server.dep.tomcat pom - Apache Tomcat + Dep Apache Tomcat diff --git a/server/dep/pom.xml b/server/dep/pom.xml index 31d38c9a4..a90750a4a 100644 --- a/server/dep/pom.xml +++ b/server/dep/pom.xml @@ -15,5 +15,6 @@ org.argeo.server.dep.tomcat org.argeo.server.dep.ads + org.argeo.server.dep.hibernate \ No newline at end of file -- 2.30.2 From c5bb48d71ad5d71e389137e5fb95f96d9005a942 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Tue, 13 Oct 2009 08:17:50 +0000 Subject: [PATCH 16/16] INtroduce JUNit Support git-svn-id: https://svn.argeo.org/commons/trunk@3017 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- basic/pom.xml | 1 + .../org.argeo.support.junit/.classpath | 7 ++ .../runtime/org.argeo.support.junit/.project | 23 +++++ .../.settings/org.eclipse.jdt.core.prefs | 5 + .../.settings/org.maven.ide.eclipse.prefs | 9 ++ basic/runtime/org.argeo.support.junit/pom.xml | 60 ++++++++++++ .../support/junit/AbstractSpringTestCase.java | 93 +++++++++++++++++++ basic/runtime/pom.xml | 18 ++++ .../argeo/server/jxl/dao/JxlDaoSupport.java | 39 +++++--- .../server/jxl/dao/JxlDaoSupportTest.java | 45 ++++----- 10 files changed, 259 insertions(+), 41 deletions(-) create mode 100644 basic/runtime/org.argeo.support.junit/.classpath create mode 100644 basic/runtime/org.argeo.support.junit/.project create mode 100644 basic/runtime/org.argeo.support.junit/.settings/org.eclipse.jdt.core.prefs create mode 100644 basic/runtime/org.argeo.support.junit/.settings/org.maven.ide.eclipse.prefs create mode 100644 basic/runtime/org.argeo.support.junit/pom.xml create mode 100644 basic/runtime/org.argeo.support.junit/src/main/java/org/argeo/support/junit/AbstractSpringTestCase.java create mode 100644 basic/runtime/pom.xml diff --git a/basic/pom.xml b/basic/pom.xml index 197b7f744..e9f9d00e6 100644 --- a/basic/pom.xml +++ b/basic/pom.xml @@ -13,5 +13,6 @@ pom dep + runtime \ No newline at end of file diff --git a/basic/runtime/org.argeo.support.junit/.classpath b/basic/runtime/org.argeo.support.junit/.classpath new file mode 100644 index 000000000..16f01e2ee --- /dev/null +++ b/basic/runtime/org.argeo.support.junit/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/basic/runtime/org.argeo.support.junit/.project b/basic/runtime/org.argeo.support.junit/.project new file mode 100644 index 000000000..9b9565dee --- /dev/null +++ b/basic/runtime/org.argeo.support.junit/.project @@ -0,0 +1,23 @@ + + + org.argeo.support.junit + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.maven.ide.eclipse.maven2Nature + org.eclipse.jdt.core.javanature + + diff --git a/basic/runtime/org.argeo.support.junit/.settings/org.eclipse.jdt.core.prefs b/basic/runtime/org.argeo.support.junit/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..383a4ec69 --- /dev/null +++ b/basic/runtime/org.argeo.support.junit/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,5 @@ +#Tue Oct 13 10:02:09 CEST 2009 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/basic/runtime/org.argeo.support.junit/.settings/org.maven.ide.eclipse.prefs b/basic/runtime/org.argeo.support.junit/.settings/org.maven.ide.eclipse.prefs new file mode 100644 index 000000000..721e27ec2 --- /dev/null +++ b/basic/runtime/org.argeo.support.junit/.settings/org.maven.ide.eclipse.prefs @@ -0,0 +1,9 @@ +#Tue Oct 13 10:01:59 CEST 2009 +activeProfiles= +eclipse.preferences.version=1 +fullBuildGoals=process-test-resources +includeModules=false +resolveWorkspaceProjects=true +resourceFilterGoals=process-resources resources\:testResources +skipCompilerPlugin=true +version=1 diff --git a/basic/runtime/org.argeo.support.junit/pom.xml b/basic/runtime/org.argeo.support.junit/pom.xml new file mode 100644 index 000000000..dbf12cec4 --- /dev/null +++ b/basic/runtime/org.argeo.support.junit/pom.xml @@ -0,0 +1,60 @@ + + 4.0.0 + + org.argeo.commons.basic + runtime + 0.1.1-SNAPSHOT + .. + + org.argeo.support.junit + Commons Support JUnit + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-source-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + org.apache.felix + maven-bundle-plugin + ${version.maven-bundle-plugin} + + + + org.argeo.support.junit.* + + + + + + + + + org.junit + com.springsource.junit + + + org.springframework + org.springframework.core + + + org.springframework + org.springframework.context + + + + + org.slf4j + com.springsource.slf4j.org.apache.commons.logging + + + diff --git a/basic/runtime/org.argeo.support.junit/src/main/java/org/argeo/support/junit/AbstractSpringTestCase.java b/basic/runtime/org.argeo.support.junit/src/main/java/org/argeo/support/junit/AbstractSpringTestCase.java new file mode 100644 index 000000000..7971a8d52 --- /dev/null +++ b/basic/runtime/org.argeo.support.junit/src/main/java/org/argeo/support/junit/AbstractSpringTestCase.java @@ -0,0 +1,93 @@ +package org.argeo.support.junit; + +import java.util.Map; + +import junit.framework.TestCase; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.BeanFactoryUtils; +import org.springframework.beans.factory.ListableBeanFactory; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + + +/** Helper for tests using a Spring application context. */ +public abstract class AbstractSpringTestCase extends TestCase { + protected final Log log = LogFactory.getLog(getClass()); + private ConfigurableApplicationContext context; + + /** + * Gets (and create if necessary) the application context to use. Default + * implementation uses a class path xml application context and calls + * {@link #getApplicationContextLocation()}. + */ + protected ConfigurableApplicationContext getContext() { + if (context == null) { + context = new ClassPathXmlApplicationContext( + getApplicationContextLocation()); + if (getIsStartContext()) + context.start(); + } + return context; + } + + /** Whether the context should be started after being created. */ + protected Boolean getIsStartContext() { + return false; + } + + /** Returns a bean from the underlying context */ + @SuppressWarnings(value = { "unchecked" }) + protected T getBean(String beanId) { + return (T) getContext().getBean(beanId); + } + + protected T getBean(Class clss) { + T bean = loadSingleFromContext(getContext(), clss); + if (bean == null) { + throw new RuntimeException("Cannot retrieve a unique bean of type " + + clss); + } else { + return bean; + } + } + + /** + * Th location of the application to load. The default implementation + * returns applicationContext.xml found in the same package as the + * test. + */ + protected String getApplicationContextLocation() { + return inPackage("applicationContext.xml"); + } + + /** + * Prefixes the package of the class after converting the '.' to '/' in + * order to have a resource path. + */ + protected String inPackage(String suffix) { + String prefix = getClass().getPackage().getName().replace('.', '/'); + return prefix + '/' + suffix; + } + + @SuppressWarnings(value = { "unchecked" }) + protected T loadSingleFromContext(ListableBeanFactory context, + Class clss) { + Map beans = BeanFactoryUtils.beansOfTypeIncludingAncestors( + context, clss, false, false); + if (beans.size() == 1) { + return beans.values().iterator().next(); + } else if (beans.size() > 1) { + if (log.isDebugEnabled()) { + log + .debug(("Found more that on bean for type " + clss + + ": " + beans.keySet())); + } + return null; + } else { + return null; + } + } + +} diff --git a/basic/runtime/pom.xml b/basic/runtime/pom.xml new file mode 100644 index 000000000..058e0f5a3 --- /dev/null +++ b/basic/runtime/pom.xml @@ -0,0 +1,18 @@ + + + 4.0.0 + + org.argeo.commons + 0.1.1-SNAPSHOT + basic + .. + + org.argeo.commons.basic + runtime + Commons Basic Runtime + pom + + org.argeo.support.junit + + \ No newline at end of file diff --git a/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java b/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java index 0488d5198..7b4110d8e 100644 --- a/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java +++ b/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java @@ -45,37 +45,42 @@ public class JxlDaoSupport implements LightDaoSupport, ApplicationContextAware, private List workbooks = new ArrayList(); public void afterPropertiesSet() throws Exception { + init(); + } + + public void init() { + // used to resolve inner references + Map> tempRefs = new HashMap>(); + + List references = new ArrayList(); + for (Resource res : workbooks) { InputStream in = null; try { in = res.getInputStream(); - load(in); + load(in, references, tempRefs); + } catch (Exception e) { + throw new ArgeoServerException("Cannot load stream", e); } finally { IOUtils.closeQuietly(in); } } + // Inject references + for (Reference ref : references) { + injectReference(ref, tempRefs); + } + if (log.isDebugEnabled()) + log.debug(references.size() + " references linked"); } - public void load(InputStream in) { + public void load(InputStream in, List references, + Map> tempRefs) { try { - // used to resolve inner references - Map> tempRefs = new HashMap>(); - - List references = new ArrayList(); - Workbook workbook = Workbook.getWorkbook(in); - for (Sheet sheet : workbook.getSheets()) { loadSheet(sheet, references, tempRefs); } - - for (Reference ref : references) { - injectReference(ref, tempRefs); - } - if (log.isDebugEnabled()) - log.debug(references.size() + " references linked"); - } catch (Exception e) { throw new ArgeoServerException("Cannot load workbook", e); } @@ -130,6 +135,10 @@ public class JxlDaoSupport implements LightDaoSupport, ApplicationContextAware, if (cell instanceof FormulaCell) { String formula = ((FormulaCell) cell).getFormula(); int index = formula.indexOf('!'); + if (index < 0) + throw new ArgeoServerException("Cannot interpret formula " + + formula); + ; String targetSheet = formula.substring(0, index); // assume no double letters!! String targetRowStr = formula.substring(index + 2); diff --git a/server/runtime/org.argeo.server.jxl/src/test/java/org/argeo/server/jxl/dao/JxlDaoSupportTest.java b/server/runtime/org.argeo.server.jxl/src/test/java/org/argeo/server/jxl/dao/JxlDaoSupportTest.java index 5de2b5af1..0a003b6b7 100644 --- a/server/runtime/org.argeo.server.jxl/src/test/java/org/argeo/server/jxl/dao/JxlDaoSupportTest.java +++ b/server/runtime/org.argeo.server.jxl/src/test/java/org/argeo/server/jxl/dao/JxlDaoSupportTest.java @@ -1,40 +1,33 @@ package org.argeo.server.jxl.dao; -import java.io.InputStream; import java.util.List; import junit.framework.TestCase; +import org.springframework.core.io.ClassPathResource; + public class JxlDaoSupportTest extends TestCase { public void testBasic() throws Exception { JxlDaoSupport jsd = new JxlDaoSupport(); jsd.getExternalRefs().put("test", new OtherObject()); - InputStream in = null; - try { - in = getClass().getResourceAsStream("/dao/simple.xls"); - jsd.load(in); - - SimpleObject soAaa = jsd.getByKey(SimpleObject.class, "aaa"); - assertNotNull(soAaa); - assertEquals("aaa", soAaa.getString()); - assertEquals(1, soAaa.getInteger().intValue()); - assertNotNull(soAaa.getOtherObject()); - assertEquals("USD", soAaa.getOtherObject().getKey()); - assertEquals("US Dollar", soAaa.getOtherObject().getValue()); - - SimpleObject soBbb = jsd.getByKey(SimpleObject.class, "bbb"); - assertNotNull(soBbb.getOtherObject()); - assertEquals("bbb", ((SimpleObject) soBbb.getOtherObject() - .getValue()).getString()); - - List simpleObjects = jsd.list(SimpleObject.class, - null); - assertEquals(2, simpleObjects.size()); - } finally { - if (in != null) - in.close(); - } + jsd.getWorkbooks().add(new ClassPathResource("/dao/simple.xls")); + jsd.init(); + + SimpleObject soAaa = jsd.getByKey(SimpleObject.class, "aaa"); + assertNotNull(soAaa); + assertEquals("aaa", soAaa.getString()); + assertEquals(1, soAaa.getInteger().intValue()); + assertNotNull(soAaa.getOtherObject()); + assertEquals("USD", soAaa.getOtherObject().getKey()); + assertEquals("US Dollar", soAaa.getOtherObject().getValue()); + + SimpleObject soBbb = jsd.getByKey(SimpleObject.class, "bbb"); + assertNotNull(soBbb.getOtherObject()); + assertEquals("bbb", ((SimpleObject) soBbb.getOtherObject().getValue()) + .getString()); + List simpleObjects = jsd.list(SimpleObject.class, null); + assertEquals(2, simpleObjects.size()); } } -- 2.30.2