Author: glandais Date: 2008-02-06 17:11:21 +0000 (Wed, 06 Feb 2008) New Revision: 694 Modified: trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/AuthenticationService.java trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/AuthenticationServiceImpl.java trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/StorageService.java trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/StorageServiceCommon.java trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/storage/engine/StorageEngineSecuImpl.java trunk/simexplorer-is-service/src/test/fr/cemagref/simexplorer/is/service/StorageServiceMassInsert.java trunk/simexplorer-is-service/src/test/fr/cemagref/simexplorer/is/service/StorageServiceTest.java Log: Attachment handling & User security Modified: trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/AuthenticationService.java =================================================================== --- trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/AuthenticationService.java 2008-02-06 17:10:11 UTC (rev 693) +++ trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/AuthenticationService.java 2008-02-06 17:11:21 UTC (rev 694) @@ -102,8 +102,8 @@ * @throws SimExplorerServiceException * the sim explorer service exception */ - public void changePassword(String token, String password) - throws SimExplorerServiceException; +// public void changePassword(String token, String password) +// throws SimExplorerServiceException; /** * Gets the user. Modified: trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/AuthenticationServiceImpl.java =================================================================== --- trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/AuthenticationServiceImpl.java 2008-02-06 17:10:11 UTC (rev 693) +++ trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/AuthenticationServiceImpl.java 2008-02-06 17:11:21 UTC (rev 694) @@ -39,6 +39,8 @@ import javax.naming.InitialContext; import javax.naming.NamingException; +import org.apache.commons.lang.RandomStringUtils; +import org.codelutin.i18n.I18n; import org.jboss.annotation.ejb.RemoteBinding; import fr.cemagref.simexplorer.is.security.dao.DaoSecurity; @@ -85,6 +87,27 @@ } /** + * Gets the mail content request account. + * + * @param login + * the login + * @param mail + * the mail + * + * @return the mail content request accont + */ + private String getMailContentRequestAccount(String login, String mail) { + StringBuffer sb = new StringBuffer(""); + sb.append(_("simexplorer.service.mail.requestheader")).append("\n"); + sb.append(_("simexplorer.service.mail.login")).append(" : ").append( + login).append("\n"); + sb.append(_("simexplorer.service.mail.mail")).append(" : ") + .append(mail).append("\n"); + sb.append(_("simexplorer.service.mail.requestfooter")).append("\n"); + return sb.toString(); + } + + /** * Send mail. * * @param mail @@ -149,8 +172,7 @@ * @return the string */ private String generatePassword() { - // FIXME - return "password"; + return RandomStringUtils.randomAlphanumeric(10); } /** @@ -256,49 +278,127 @@ } } + /** + * Can delete group. + * + * @param token + * the token + * @param id + * the id + * + * @return true, if successful + * @throws SimExplorerServiceException + */ + private boolean canDeleteGroup(String token, Integer id) + throws SimExplorerServiceException { + return canAdminGroup(token, id); + } + + /** + * Delete group impl. + * + * @param token + * the token + * @param id + * the id + */ + private void deleteGroupImpl(String token, Integer id) { + dao.deleteGroup(id); + } + /* (non-Javadoc) * @see fr.cemagref.simexplorer.is.service.AuthenticationService#deleteGroup(java.lang.String, java.lang.Integer) */ public void deleteGroup(String token, Integer id) throws SimExplorerServiceException { - if (canAdminGroup(token, id)) { - dao.deleteGroup(id); + if (canDeleteGroup(token, id)) { + deleteGroupImpl(token, id); + } else { + throw new SimExplorerServiceException( + _("simexplorer.service.security.norights")); } - throw new SimExplorerServiceException( - _("simexplorer.service.security.norights")); } + /** + * Can delete user. + * + * @param token + * the token + * @param id + * the id + * + * @return true, if successful + * + * @throws SimExplorerServiceException + * the sim explorer service exception + */ + private boolean canDeleteUser(String token, Integer id) + throws SimExplorerServiceException { + return canAdminUser(token, id); + } + + /** + * Delete user impl. + * + * @param token + * the token + * @param id + * the id + */ + private void deleteUserImpl(String token, Integer id) { + dao.deleteUser(id); + } + /* (non-Javadoc) * @see fr.cemagref.simexplorer.is.service.AuthenticationService#deleteUser(java.lang.String, java.lang.Integer) */ public void deleteUser(String token, Integer id) throws SimExplorerServiceException { - if (canAdminUser(token, id)) { - dao.deleteUser(id); + if (canDeleteUser(token, id)) { + deleteUserImpl(token, id); + } else { + throw new SimExplorerServiceException( + _("simexplorer.service.security.norights")); } - throw new SimExplorerServiceException( - _("simexplorer.service.security.norights")); } + /** + * Can view elements. + * + * @param token + * the token + * + * @return true, if successful + * @throws SimExplorerServiceException + */ + private boolean canViewElements(String token) + throws SimExplorerServiceException { + User loggedUser = getLoggedUser(token); + // boolean canView = loggedUser.isAdmin() || loggedUser.isSuperAdmin(); + // return canView; + return (loggedUser != null); + } + /* (non-Javadoc) * @see fr.cemagref.simexplorer.is.service.AuthenticationService#getGroup(java.lang.String, java.lang.Integer) */ public Group getGroup(String token, Integer id) throws SimExplorerServiceException { - if (canAdminGroup(token, id)) { - return dao.getGroup(id); + if (canViewElements(token)) { + Group group = dao.getGroup(id); + return group; } throw new SimExplorerServiceException( _("simexplorer.service.security.norights")); } /* (non-Javadoc) - * @see fr.cemagref.simexplorer.is.service.AuthenticationService#getGroup(java.lang.String, java.lang.String) - */ + * @see fr.cemagref.simexplorer.is.service.AuthenticationService#getGroup(java.lang.String, java.lang.String) + */ public Group getGroup(String token, String name) throws SimExplorerServiceException { - Group group = dao.getGroup(name); - if (canAdminGroup(token, group.getId())) { + if (canViewElements(token)) { + Group group = dao.getGroup(name); return group; } throw new SimExplorerServiceException( @@ -310,8 +410,9 @@ */ public User getUser(String token, Integer id) throws SimExplorerServiceException { - if (canAdminUser(token, id)) { - return dao.getUser(id); + if (canViewElements(token)) { + User user = dao.getUser(id); + return user; } throw new SimExplorerServiceException( _("simexplorer.service.security.norights")); @@ -322,24 +423,47 @@ */ public User getUser(String token, String login) throws SimExplorerServiceException { - User user = dao.getUser(login); - if (canAdminUser(token, user.getId())) { + if (canViewElements(token)) { + User user = dao.getUser(login); return user; } throw new SimExplorerServiceException( _("simexplorer.service.security.norights")); } + /** + * Can save element. + * + * @param token + * the token + * + * @return true, if successful + * + * @throws SimExplorerServiceException + * the sim explorer service exception + */ + private boolean canSaveElement(String token) + throws SimExplorerServiceException { + User loggedUser = getLoggedUser(token); + boolean canView = loggedUser.isAdmin() || loggedUser.isSuperAdmin(); + return canView; + } + /* (non-Javadoc) * @see fr.cemagref.simexplorer.is.service.AuthenticationService#saveGroup(java.lang.String, java.lang.String) */ public Group saveGroup(String token, String name) throws SimExplorerServiceException { - User loggedUser = getLoggedUser(token); - if (loggedUser.isAdmin() || loggedUser.isSuperAdmin()) { + if (canSaveElement(token)) { + Group oldGroup = dao.getGroup(name); + if (oldGroup != null) { + throw new SimExplorerServiceException( + _("simexplorer.service.business.groupexist")); + } + Group group = new Group(); group.setName(name); - group.setOwner(loggedUser); + group.setOwner(getLoggedUser(token)); dao.saveGroup(group); group = getGroup(token, group.getId()); return group; @@ -353,8 +477,13 @@ */ public User saveUser(String token, String login, String mail) throws SimExplorerServiceException { - User loggedUser = getLoggedUser(token); - if (loggedUser.isAdmin() || loggedUser.isSuperAdmin()) { + if (canSaveElement(token)) { + User oldUser = dao.getUser(login); + if (oldUser != null) { + throw new SimExplorerServiceException( + _("simexplorer.service.business.userexist")); + } + User user = new User(); user.setLogin(login); user.setMail(mail); @@ -373,24 +502,70 @@ _("simexplorer.service.security.norights")); } + /** + * Can update group. + * + * @param token + * the token + * @param id + * the id + * + * @return true, if successful + * + * @throws SimExplorerServiceException + * the sim explorer service exception + */ + private boolean canUpdateGroup(String token, Integer id) + throws SimExplorerServiceException { + return canAdminGroup(token, id); + } + /* (non-Javadoc) * @see fr.cemagref.simexplorer.is.service.AuthenticationService#updateGroup(java.lang.String, fr.cemagref.simexplorer.is.security.entities.Group) */ public Group updateGroup(String token, Group group) throws SimExplorerServiceException { - if (canAdminGroup(token, group.getId())) { + if (canUpdateGroup(token, group.getId())) { return dao.updateGroup(group); } throw new SimExplorerServiceException( _("simexplorer.service.security.norights")); } + /** + * Can update user. + * + * @param token + * the token + * @param user + * the user + * + * @return true, if successful + * + * @throws SimExplorerServiceException + * the sim explorer service exception + */ + private boolean canUpdateUser(String token, User user) + throws SimExplorerServiceException { + if (canAdminUser(token, user.getId())) { + if (getLoggedUser(token).isSuperAdmin()) { + return true; + } + User oldUser = dao.getUser(user.getId()); + if (oldUser.isAdmin() == user.isAdmin() + && oldUser.isSuperAdmin() == user.isSuperAdmin()) { + return true; + } + } + return false; + } + /* (non-Javadoc) * @see fr.cemagref.simexplorer.is.service.AuthenticationService#updateUser(java.lang.String, fr.cemagref.simexplorer.is.security.entities.User) */ public User updateUser(String token, User user) throws SimExplorerServiceException { - if (canAdminUser(token, user.getId())) { + if (canUpdateUser(token, user)) { return dao.updateUser(user); } throw new SimExplorerServiceException( @@ -439,12 +614,14 @@ public String loginUser(String login, String password) throws SimExplorerServiceException { if (!superAdminCheck) { + I18n.initISO88591("fr", "FR"); checkSuperAdmin(); superAdminCheck = true; } String token = null; User loggedUser = dao.loginUser(login, computeHash(password)); if (loggedUser != null) { + // FIXME delete previous tokens // dao.deleteTokens(login, 10 * 60 * 1000); LoginAction loginAction = new LoginAction(); @@ -462,31 +639,21 @@ */ public void requestAccount(String login, String mail) throws SimExplorerServiceException { - // FIXME send mail to superadmin - /* - User user = new User(); - user.setLogin(login); - user.setMail(mail); - String password = generatePassword(); - sendMail(login, mail, password); - String passwordHash = computeHash(password); - user.setPasswordHash(passwordHash); - dao.saveUser(user); - return user; - */ + User superadmin = dao.getUser("superadmin"); + sendMail(superadmin.getMail(), _("simexplorer.service.mail.subject"), + getMailContentRequestAccount(login, mail)); } /* (non-Javadoc) * @see fr.cemagref.simexplorer.is.service.AuthenticationService#changePassword(java.lang.String, java.lang.String) */ - public void changePassword(String token, String password) - throws SimExplorerServiceException { - User user = getLoggedUser(token); - String passwordHash = computeHash(password); - user.setPasswordHash(passwordHash); - dao.updateUser(user); - } - + // public void changePassword(String token, String password) + // throws SimExplorerServiceException { + // User user = getLoggedUser(token); + // String passwordHash = computeHash(password); + // user.setPasswordHash(passwordHash); + // dao.updateUser(user); + // } /* (non-Javadoc) * @see fr.cemagref.simexplorer.is.service.AuthenticationService#resetPassword(java.lang.String, java.lang.String) */ @@ -495,7 +662,8 @@ User user = getUser(token, login); if (canAdminUser(token, user.getId())) { String password = generatePassword(); - sendMail(login, user.getMail(), password); + sendMail(user.getMail(), _("simexplorer.service.mail.subject"), + getMailContentWithPassword(login, password)); String passwordHash = computeHash(password); user.setPasswordHash(passwordHash); dao.updateUser(user); @@ -508,125 +676,172 @@ /* (non-Javadoc) * @see fr.cemagref.simexplorer.is.service.AuthenticationService#getGroups(java.lang.String) */ - public Group[] getGroups(String token) { - List<Group> groups = dao.getGroups(); - Group[] result; - result = groups.toArray(new Group[groups.size()]); - return result; + public Group[] getGroups(String token) throws SimExplorerServiceException { + if (canViewElements(token)) { + List<Group> groups = dao.getGroups(); + Group[] result = groups.toArray(new Group[groups.size()]); + return result; + } + throw new SimExplorerServiceException( + _("simexplorer.service.security.norights")); } /* (non-Javadoc) * @see fr.cemagref.simexplorer.is.service.AuthenticationService#getGroupsOwnedBy(java.lang.String, fr.cemagref.simexplorer.is.security.entities.User) */ - public Group[] getGroupsOwnedBy(String token, User user) { - List<Group> list = dao.getGroupsOwnedBy(user); - return list.toArray(new Group[list.size()]); + public Group[] getGroupsOwnedBy(String token, User user) + throws SimExplorerServiceException { + if (canViewElements(token)) { + List<Group> list = dao.getGroupsOwnedBy(user); + Group[] groups = list.toArray(new Group[list.size()]); + return groups; + } + throw new SimExplorerServiceException( + _("simexplorer.service.security.norights")); } /* (non-Javadoc) * @see fr.cemagref.simexplorer.is.service.AuthenticationService#getUsers(java.lang.String) */ - public User[] getUsers(String token) { - List<User> users = dao.getUsers(); - return users.toArray(new User[users.size()]); + public User[] getUsers(String token) throws SimExplorerServiceException { + if (canViewElements(token)) { + List<User> users = dao.getUsers(); + User[] arrayUsers = users.toArray(new User[users.size()]); + return arrayUsers; + } + throw new SimExplorerServiceException( + _("simexplorer.service.security.norights")); } /* (non-Javadoc) * @see fr.cemagref.simexplorer.is.service.AuthenticationService#getUsersOfGroup(java.lang.String, fr.cemagref.simexplorer.is.security.entities.Group) */ - public User[] getUsersOfGroup(String token, Group group) { - List<User> usersOfGroup = dao.getUsersOfGroup(group); - return usersOfGroup.toArray(new User[usersOfGroup.size()]); + public User[] getUsersOfGroup(String token, Group group) + throws SimExplorerServiceException { + if (canViewElements(token)) { + List<User> usersOfGroup = dao.getUsersOfGroup(group); + User[] array = usersOfGroup.toArray(new User[usersOfGroup.size()]); + return array; + } + throw new SimExplorerServiceException( + _("simexplorer.service.security.norights")); } /* (non-Javadoc) * @see fr.cemagref.simexplorer.is.service.AuthenticationService#setUsersOfGroup(java.lang.String, fr.cemagref.simexplorer.is.security.entities.Group, java.lang.Integer[]) */ public void setUsersOfGroup(String token, Group group, - Integer[] usersInGroup) { - List<Integer> newUsers = new ArrayList<Integer>(); - newUsers.addAll(Arrays.asList(usersInGroup)); + Integer[] usersInGroup) throws SimExplorerServiceException { + if (canUpdateGroup(token, group.getId())) { + List<Integer> newUsers = new ArrayList<Integer>(); + newUsers.addAll(Arrays.asList(usersInGroup)); - List<Integer> usersToAdd = new ArrayList<Integer>(); - List<Integer> usersToRemove = new ArrayList<Integer>(); + List<Integer> usersToAdd = new ArrayList<Integer>(); + List<Integer> usersToRemove = new ArrayList<Integer>(); - List<User> users = dao.getUsersOfGroup(group); + List<User> users = dao.getUsersOfGroup(group); - List<Integer> currentUsers = new ArrayList<Integer>(); - for (User user : users) { - currentUsers.add(user.getId()); - } + List<Integer> currentUsers = new ArrayList<Integer>(); + for (User user : users) { + currentUsers.add(user.getId()); + } - for (Integer user : currentUsers) { - if (!newUsers.contains(user)) { - usersToRemove.add(user); + for (Integer user : currentUsers) { + if (!newUsers.contains(user)) { + usersToRemove.add(user); + } } - } - for (Integer user : newUsers) { - if (!currentUsers.contains(user)) { - usersToAdd.add(user); + for (Integer user : newUsers) { + if (!currentUsers.contains(user)) { + usersToAdd.add(user); + } } - } - for (Integer idUser : usersToAdd) { - User user = dao.getUser(idUser); - user.getGroups().add(group); - dao.updateUser(user); + for (Integer idUser : usersToAdd) { + User user = dao.getUser(idUser); + user.getGroups().add(group); + dao.updateUser(user); + } + for (Integer idUser : usersToRemove) { + User user = dao.getUser(idUser); + removeUserFromGroup(user, group); + dao.updateUser(user); + } + } else { + throw new SimExplorerServiceException( + _("simexplorer.service.security.norights")); } - for (Integer idUser : usersToRemove) { - User user = dao.getUser(idUser); - removeUserFromGroup(user, group); - dao.updateUser(user); - } } /* (non-Javadoc) * @see fr.cemagref.simexplorer.is.service.AuthenticationService#setGroupsOfUser(java.lang.String, fr.cemagref.simexplorer.is.security.entities.User, java.lang.Integer[]) */ - public void setGroupsOfUser(String token, User user, Integer[] groupsIds) { - User realUser = dao.getUser(user.getId()); - realUser.getGroups().clear(); - for (Integer groupsId : groupsIds) { - Group group = dao.getGroup(groupsId); - realUser.getGroups().add(group); + public void setGroupsOfUser(String token, User user, Integer[] groupsIds) + throws SimExplorerServiceException { + if (canUpdateUser(token, user)) { + User realUser = dao.getUser(user.getId()); + realUser.getGroups().clear(); + for (Integer groupsId : groupsIds) { + Group group = dao.getGroup(groupsId); + realUser.getGroups().add(group); + } + dao.updateUser(realUser); + } else { + throw new SimExplorerServiceException( + _("simexplorer.service.security.norights")); } - dao.updateUser(realUser); - } /* (non-Javadoc) * @see fr.cemagref.simexplorer.is.service.AuthenticationService#getGroupsOfUser(java.lang.String, fr.cemagref.simexplorer.is.security.entities.User) */ - public Group[] getGroupsOfUser(String token, User user) { - List<Group> list = dao.getGroupsOfUser(user); - return list.toArray(new Group[list.size()]); + public Group[] getGroupsOfUser(String token, User user) + throws SimExplorerServiceException { + if (canViewElements(token)) { + List<Group> list = dao.getGroupsOfUser(user); + return list.toArray(new Group[list.size()]); + } + throw new SimExplorerServiceException( + _("simexplorer.service.security.norights")); } /* (non-Javadoc) * @see fr.cemagref.simexplorer.is.service.AuthenticationService#getGroupsOfGroup(java.lang.String, fr.cemagref.simexplorer.is.security.entities.Group) */ - public Group[] getGroupsOfGroup(String token, Group group) { - List<Group> groupsOfGroup = dao.getGroupsOfGroup(group); - return groupsOfGroup.toArray(new Group[groupsOfGroup.size()]); + public Group[] getGroupsOfGroup(String token, Group group) + throws SimExplorerServiceException { + if (canViewElements(token)) { + List<Group> groupsOfGroup = dao.getGroupsOfGroup(group); + return groupsOfGroup.toArray(new Group[groupsOfGroup.size()]); + } + throw new SimExplorerServiceException( + _("simexplorer.service.security.norights")); } /* (non-Javadoc) * @see fr.cemagref.simexplorer.is.service.AuthenticationService#setGroupsOfGroup(java.lang.String, fr.cemagref.simexplorer.is.security.entities.Group, java.lang.Integer[]) */ - public void setGroupsOfGroup(String token, Group group, Integer[] groupsIds) { - Group realGroup = dao.getGroup(group.getId()); - realGroup.getGroups().clear(); - for (Integer groupsId : groupsIds) { - Group groupOwned = dao.getGroup(groupsId); - realGroup.getGroups().add(groupOwned); + public void setGroupsOfGroup(String token, Group group, Integer[] groupsIds) + throws SimExplorerServiceException { + if (canUpdateGroup(token, group.getId())) { + Group realGroup = dao.getGroup(group.getId()); + realGroup.getGroups().clear(); + for (Integer groupsId : groupsIds) { + Group groupOwned = dao.getGroup(groupsId); + realGroup.getGroups().add(groupOwned); + } + dao.updateGroup(realGroup); + } else { + throw new SimExplorerServiceException( + _("simexplorer.service.security.norights")); } - dao.updateGroup(realGroup); } /* (non-Javadoc) * @see fr.cemagref.simexplorer.is.service.AuthenticationService#getPermissions(java.lang.String) */ public Permission[] getPermissions(String uuid) { + // FIXME List<Permission> permissions = dao.getPermissions(uuid); return permissions.toArray(new Permission[permissions.size()]); } @@ -635,6 +850,7 @@ * @see fr.cemagref.simexplorer.is.service.AuthenticationService#setPermissions(java.lang.String, fr.cemagref.simexplorer.is.security.entities.Permission[]) */ public void setPermissions(String uuid, Permission[] permissions) { + // FIXME dao.setPermissions(uuid, permissions); } Modified: trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/StorageService.java =================================================================== --- trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/StorageService.java 2008-02-06 17:10:11 UTC (rev 693) +++ trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/StorageService.java 2008-02-06 17:11:21 UTC (rev 694) @@ -23,6 +23,7 @@ import com.healthmarketscience.rmiio.RemoteInputStream; +import fr.cemagref.simexplorer.is.attachment.Attachment; import fr.cemagref.simexplorer.is.entities.data.LoggableElement; import fr.cemagref.simexplorer.is.entities.metadata.MetaData; @@ -91,7 +92,7 @@ * the sim explorer service exception */ MetaData saveElement(String token, RemoteInputStream xmlRemoteStream, - Map<String, RemoteInputStream> attachmentsRemoteStream) + Map<Attachment, RemoteInputStream> attachmentsRemoteStream) throws SimExplorerServiceException; /** @@ -182,7 +183,7 @@ * the sim explorer service exception */ RemoteInputStream retrieveData(String token, String uuid, String version, - String dataKey) throws SimExplorerServiceException; + Attachment attachment) throws SimExplorerServiceException; /** * Retrieve number of elements matching query. Modified: trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/StorageServiceCommon.java =================================================================== --- trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/StorageServiceCommon.java 2008-02-06 17:10:11 UTC (rev 693) +++ trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/StorageServiceCommon.java 2008-02-06 17:11:21 UTC (rev 694) @@ -41,6 +41,7 @@ import com.healthmarketscience.rmiio.SimpleRemoteInputStream; import fr.cemagref.simexplorer.is.attachment.Attachment; +import fr.cemagref.simexplorer.is.entities.data.DataEntity; import fr.cemagref.simexplorer.is.entities.data.LoggableElement; import fr.cemagref.simexplorer.is.entities.metadata.MetaData; import fr.cemagref.simexplorer.is.entities.metadata.Version; @@ -56,6 +57,8 @@ public abstract class StorageServiceCommon implements StorageService, XmlConstants { + private Attachment xmlAttachment = null; + /** * Gets the storage engine. * @@ -77,6 +80,15 @@ getStorageEngine().close(); } + private Attachment getXMLAttachment() { + if (xmlAttachment == null) { + xmlAttachment = new Attachment(); + xmlAttachment.setDataHash(""); + xmlAttachment.setFileName("entity.xml"); + } + return xmlAttachment; + } + /* (non-Javadoc) * @see fr.cemagref.simexplorer.is.service.StorageService#commit() */ @@ -107,13 +119,13 @@ */ public MetaData saveElement(String token, RemoteInputStream xmlRemoteStream, - Map<String, RemoteInputStream> attachmentsRemoteStream) + Map<Attachment, RemoteInputStream> attachmentsRemoteStream) throws SimExplorerServiceException { try { InputStream xmlStream = RemoteInputStreamClient .wrap(xmlRemoteStream); - Map<String, InputStream> attachmentStreams = new HashMap<String, InputStream>(); - for (Map.Entry<String, RemoteInputStream> entry : attachmentsRemoteStream + Map<Attachment, InputStream> attachmentStreams = new HashMap<Attachment, InputStream>(); + for (Map.Entry<Attachment, RemoteInputStream> entry : attachmentsRemoteStream .entrySet()) { InputStream stream = RemoteInputStreamClient.wrap(entry .getValue()); @@ -214,10 +226,11 @@ try { LoggableElement le; - le = (LoggableElement) BaseEntityFactory.getFactory( - LoggableElement.class.getPackage().getName() + DOT - + mde.getType()).loadElement( - getStorageEngine().retrieveData(token, mde, KEY_XML)); + BaseEntityFactory<? extends DataEntity> factory = BaseEntityFactory + .getFactory(LoggableElement.class.getPackage().getName() + + DOT + mde.getType()); + le = (LoggableElement) factory.loadElement(getStorageEngine() + .retrieveData(token, mde, getXMLAttachment())); return le; } catch (Exception e) { @@ -263,7 +276,23 @@ } } } - MetaData elementSaved = saveElement(token, xmlFile, attachments); + + Map<Attachment, String> realAttachments = new HashMap<Attachment, String>(); + + // Load metadata xml + MetaDataFactory<MetaData> mdeFactory = MetaDataFactory + .getFactory(MetaData.class); + MetaData metaData = mdeFactory + .loadElementFromParentXML(getStorageEngine() + .retrieveTempData(xmlFile)); + + List<Attachment> mdeAttachments = metaData.getAttachments(); + for (Attachment attachment : mdeAttachments) { + realAttachments.put(attachment, attachments.get(attachment + .getUniqueId())); + } + + MetaData elementSaved = saveElement(token, xmlFile, realAttachments); getStorageEngine().deleteTempData(xmlFile); for (Map.Entry<String, String> tmpId : attachments.entrySet()) { getStorageEngine().deleteTempData(tmpId.getValue()); @@ -290,18 +319,18 @@ * the exception */ private MetaData saveElement(String token, InputStream xmlFile, - Map<String, InputStream> attachments) throws Exception { + Map<Attachment, InputStream> attachments) throws Exception { // Store temporary data String idxml = getStorageEngine().storeTempData(xmlFile); - Map<String, String> idsattachment = new HashMap<String, String>(); - for (Map.Entry<String, InputStream> entry : attachments.entrySet()) { + Map<Attachment, String> idsattachment = new HashMap<Attachment, String>(); + for (Map.Entry<Attachment, InputStream> entry : attachments.entrySet()) { String idattachment = getStorageEngine().storeTempData( entry.getValue()); idsattachment.put(entry.getKey(), idattachment); } MetaData elementSaved = saveElement(token, idxml, idsattachment); getStorageEngine().deleteTempData(idxml); - for (Map.Entry<String, String> tmpId : idsattachment.entrySet()) { + for (Map.Entry<Attachment, String> tmpId : idsattachment.entrySet()) { getStorageEngine().deleteTempData(tmpId.getValue()); } return elementSaved; @@ -311,11 +340,12 @@ * @see fr.cemagref.simexplorer.is.service.StorageService#retrieveData(java.lang.String, java.lang.String, java.lang.String, java.lang.String) */ public RemoteInputStream retrieveData(String token, String uuid, - String version, String dataKey) throws SimExplorerServiceException { + String version, Attachment attachment) + throws SimExplorerServiceException { try { MetaData mde = getMetadata(token, uuid, version); InputStream stream = getStorageEngine().retrieveData(token, mde, - dataKey); + attachment); RemoteInputStreamServer remoteStream = new SimpleRemoteInputStream( stream); return remoteStream.export(); @@ -334,7 +364,7 @@ MetaData mde = getMetadata(token, uuid, version); try { InputStream xmlStream = getStorageEngine().retrieveData(token, mde, - KEY_XML); + getXMLAttachment()); RemoteInputStreamServer remoteStream = new SimpleRemoteInputStream( xmlStream); return remoteStream.export(); @@ -358,7 +388,7 @@ Map<String, InputStream> files = new HashMap<String, InputStream>(); files.put(FILE_XML, getStorageEngine().retrieveData(token, mde, - KEY_XML)); + getXMLAttachment())); List<LoggableElement> children = element.getChildren(); for (LoggableElement loggableElement : children) { MetaData thisMde = loggableElement.getMetaData(); @@ -367,8 +397,7 @@ for (Attachment attachment : attachments) { files.put(FILE_DATA_PREFIX + FOLDER_SEPARATOR + attachment.getUniqueId(), getStorageEngine() - .retrieveData(token, thisMde, - attachment.getFileName())); + .retrieveData(token, thisMde, attachment)); } } @@ -404,7 +433,7 @@ * the exception */ private MetaData saveElement(String token, String idxml, - Map<String, String> idsattachment) throws Exception { + Map<Attachment, String> idsattachment) throws Exception { // Load metadata xml MetaDataFactory<MetaData> mdeFactory = MetaDataFactory .getFactory(MetaData.class); @@ -433,13 +462,14 @@ processVersionRules(token, metaData); // Prepare saving - Map<String, InputStream> attachments = new HashMap<String, InputStream>(); + Map<Attachment, InputStream> attachments = new HashMap<Attachment, InputStream>(); - attachments.put(KEY_XML, getStorageEngine().retrieveTempData(idxml)); + attachments.put(getXMLAttachment(), getStorageEngine() + .retrieveTempData(idxml)); List<Attachment> realAttachments = metaData.getAttachments(); for (Attachment attachment : realAttachments) { - String idAttachment = idsattachment.get(attachment.getUniqueId()); + String idAttachment = idsattachment.get(attachment); // Check hash of attachments String md5 = getStorageEngine().retrieveMD5TempData(idAttachment); @@ -448,8 +478,8 @@ _("simexplorer.service.invalidhash")); } - attachments.put(attachment.getFileName(), getStorageEngine() - .retrieveTempData(idAttachment)); + attachments.put(attachment, getStorageEngine().retrieveTempData( + idAttachment)); } getStorageEngine().saveElement(token, metaData, attachments); @@ -477,7 +507,7 @@ */ private void saveSubElements(String token, String idxml, String entitiesNode, String entityNode, - Map<String, String> idsattachment) throws Exception { + Map<Attachment, String> idsattachment) throws Exception { BaseEntityFactory<MetaData> elementFactory = MetaDataFactory .getFactory(MetaData.class); Modified: trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/storage/engine/StorageEngineSecuImpl.java =================================================================== --- trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/storage/engine/StorageEngineSecuImpl.java 2008-02-06 17:10:11 UTC (rev 693) +++ trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/storage/engine/StorageEngineSecuImpl.java 2008-02-06 17:11:21 UTC (rev 694) @@ -27,6 +27,7 @@ import javax.ejb.Local; import javax.ejb.Stateless; +import fr.cemagref.simexplorer.is.attachment.Attachment; import fr.cemagref.simexplorer.is.entities.metadata.MetaData; import fr.cemagref.simexplorer.is.entities.metadata.Version; import fr.cemagref.simexplorer.is.security.credentials.CredentialManager; @@ -177,13 +178,13 @@ * @see fr.cemagref.simexplorer.is.storage.engine.StorageEngineImpl#retrieveData(java.lang.String, fr.cemagref.simexplorer.is.entities.metadata.MetaData, java.lang.String) */ @Override - public InputStream retrieveData(String token, MetaData entity, String field) + public InputStream retrieveData(String token, MetaData entity, Attachment attachment) throws SimExplorerStorageException { InputStream stream; Permission permission = credentialManager.getPermission(token, entity .getUuid()); if (permission != null && permission.isCanRead()) { - stream = super.retrieveData(token, entity, field); + stream = super.retrieveData(token, entity, attachment); } else { throw new SimExplorerStorageException( _("simexplorer.service.security.norights")); @@ -196,7 +197,7 @@ */ @Override public void saveElement(String token, MetaData element, - Map<String, InputStream> attachments) + Map<Attachment, InputStream> attachments) throws SimExplorerStorageException { Permission permission = credentialManager.getPermission(token, element .getUuid()); Modified: trunk/simexplorer-is-service/src/test/fr/cemagref/simexplorer/is/service/StorageServiceMassInsert.java =================================================================== --- trunk/simexplorer-is-service/src/test/fr/cemagref/simexplorer/is/service/StorageServiceMassInsert.java 2008-02-06 17:10:11 UTC (rev 693) +++ trunk/simexplorer-is-service/src/test/fr/cemagref/simexplorer/is/service/StorageServiceMassInsert.java 2008-02-06 17:11:21 UTC (rev 694) @@ -125,9 +125,11 @@ ea.getMetaData().setVersion( parentEa.getMetaData().getVersion().toString()); - ea.getMetaData().getVersion().incVersion(r.nextInt(3)); + ea.getMetaData().setVersion( + ea.getMetaData().getVersion().incVersion(r.nextInt(3)) + .toString()); - Map<String, RemoteInputStream> attachments = new HashMap<String, RemoteInputStream>(); + Map<Attachment, RemoteInputStream> attachments = new HashMap<Attachment, RemoteInputStream>(); List<Attachment> attachmentsKeys = new ArrayList<Attachment>(); @@ -154,8 +156,7 @@ attachment.setDataHash(randomStream.getMd5()); RemoteInputStreamServer remoteStream = new SimpleRemoteInputStream( randomStream.getStream()); - attachments.put(attachment.getUniqueId(), remoteStream - .export()); + attachments.put(attachment, remoteStream.export()); } InputStream xmlStream = BaseEntityFactory.getFactory( Modified: trunk/simexplorer-is-service/src/test/fr/cemagref/simexplorer/is/service/StorageServiceTest.java =================================================================== --- trunk/simexplorer-is-service/src/test/fr/cemagref/simexplorer/is/service/StorageServiceTest.java 2008-02-06 17:10:11 UTC (rev 693) +++ trunk/simexplorer-is-service/src/test/fr/cemagref/simexplorer/is/service/StorageServiceTest.java 2008-02-06 17:11:21 UTC (rev 694) @@ -31,8 +31,7 @@ import com.healthmarketscience.rmiio.RemoteInputStreamServer; import com.healthmarketscience.rmiio.SimpleRemoteInputStream; -import fr.cemagref.simexplorer.is.service.StorageService; -import fr.cemagref.simexplorer.is.service.StorageServiceClient; +import fr.cemagref.simexplorer.is.attachment.Attachment; /** * The Class StorageServiceTest. @@ -79,91 +78,4 @@ assertNotNull(storageService.getMetadata(null, "abcd")); } - /** - * Test insert element streams. - * - * @throws Exception - * the exception - */ - public void testInsertElementStreams() throws Exception { - String id = UUID.randomUUID().toString(); - String[] randomcontent = new String[2]; - for (int i = 0; i < randomcontent.length; i++) { - randomcontent[i] = Long.toHexString(r.nextLong()); - } - - StringBuffer xmlString = new StringBuffer( - "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>"); - xmlString.append("<data>"); - xmlString.append("<metadata>"); - xmlString.append("<uuid>" + id + "</uuid>"); - xmlString.append("<version>1.0</version>"); - xmlString.append("<name>Test element</name>"); - xmlString.append("<type>TEST</type>"); - xmlString.append("<description>Element test</description>"); - xmlString.append("<creationdate>0</creationdate>"); - xmlString.append("<hash>AAAAA</hash>"); - /* - * xmlString.append("<parentdatauuid></parentdatauuid>"); - * xmlString.append("<parentdataversion></parentdataversion>"); - * xmlString.append("<parentversionuuid></parentversionuuid>"); - * xmlString.append("<parentversionversion></parentversionversion>"); - */ - xmlString.append("<descriptors>"); - xmlString - .append("<descriptor><name>a</name><value>1</value></descriptor>"); - xmlString - .append("<descriptor><name>b</name><value>2</value></descriptor>"); - xmlString - .append("<descriptor><name>c</name><value>3</value></descriptor>"); - xmlString.append("</descriptors>"); - xmlString.append("<attachments>"); - for (int i = 0; i < randomcontent.length; i++) { - xmlString.append("<attachment>"); - xmlString.append("<name>content" + i - + "</name><type>RawType</type>"); - xmlString.append("</attachment>"); - } - xmlString.append("</attachments>"); - xmlString.append("</metadata>"); - xmlString.append("</data>"); - - InputStream xmlStream = new ByteArrayInputStream(xmlString.toString() - .getBytes()); - RemoteInputStreamServer xmlRemoteStream = new SimpleRemoteInputStream( - xmlStream); - - Map<String, RemoteInputStream> attachmentsRemoteStream = new HashMap<String, RemoteInputStream>(); - - for (int j = 0; j < randomcontent.length; j++) { - - StringBuffer contentString = new StringBuffer(""); - for (int i = 0; i < 50; i++) { - contentString.append(Long.toHexString(r.nextLong())) - .append(" "); - } - contentString.append(randomcontent[j]).append(" "); - for (int i = 0; i < 100; i++) { - contentString.append(Long.toHexString(r.nextLong())) - .append(" "); - } - - InputStream contentStream = new ByteArrayInputStream(contentString - .toString().getBytes()); - RemoteInputStreamServer contentRemoteStream = new SimpleRemoteInputStream( - contentStream); - attachmentsRemoteStream.put("content" + j, contentRemoteStream); - - } - - storageService.saveElement(null, xmlRemoteStream, - attachmentsRemoteStream); - storageService.commit(); - assertNotNull(storageService.getMetadata(null, id)); - for (int i = 0; i < randomcontent.length; i++) { - assertTrue(storageService.findFullTextCount(null, randomcontent[i], - false) > 0); - } - } - }