Author: glandais Date: 2008-01-23 18:23:10 +0000 (Wed, 23 Jan 2008) New Revision: 447 Added: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementHistory.java trunk/simexplorer-is-web/src/main/webapp/ElementHistory.tml Modified: trunk/simexplorer-is-security/src/java/fr/cemagref/simexplorer/is/security/dao/DaoSecurityImpl.java trunk/simexplorer-is-security/src/java/fr/cemagref/simexplorer/is/security/service/AuthenticationServiceImpl.java trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/StorageService.java trunk/simexplorer-is-storage/src/java/fr/cemagref/simexplorer/is/storage/engine/StorageEngine.java trunk/simexplorer-is-storage/src/java/fr/cemagref/simexplorer/is/storage/engine/StorageEngineImpl.java trunk/simexplorer-is-web/pom.xml trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/components/Layout.java trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/grid/ElementDataSource.java trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementDetail.java trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementList.java trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/security/ProtectedPage.java trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/tools/AttachmentStreamResponse.java trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/tools/XMLAttachment.java trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/components/Layout.properties trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/pages/GroupEdit.properties trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/pages/UserEdit.properties Log: Detail page Modified: trunk/simexplorer-is-security/src/java/fr/cemagref/simexplorer/is/security/dao/DaoSecurityImpl.java =================================================================== --- trunk/simexplorer-is-security/src/java/fr/cemagref/simexplorer/is/security/dao/DaoSecurityImpl.java 2008-01-23 16:40:14 UTC (rev 446) +++ trunk/simexplorer-is-security/src/java/fr/cemagref/simexplorer/is/security/dao/DaoSecurityImpl.java 2008-01-23 18:23:10 UTC (rev 447) @@ -17,6 +17,7 @@ * ##% */ package fr.cemagref.simexplorer.is.security.dao; +import java.util.Date; import java.util.List; import javax.ejb.Stateless; @@ -24,7 +25,6 @@ import javax.persistence.PersistenceContext; import javax.persistence.Query; -import fr.cemagref.simexplorer.is.security.entities.Actor; import fr.cemagref.simexplorer.is.security.entities.Group; import fr.cemagref.simexplorer.is.security.entities.LoginAction; import fr.cemagref.simexplorer.is.security.entities.Permission; @@ -110,6 +110,8 @@ .setParameter("token", token)); if (loginAction != null) { loggedUser = loginAction.getLoggedUser(); + loginAction.setTime(new Date()); + em.merge(loginAction); } return loggedUser; } Modified: trunk/simexplorer-is-security/src/java/fr/cemagref/simexplorer/is/security/service/AuthenticationServiceImpl.java =================================================================== --- trunk/simexplorer-is-security/src/java/fr/cemagref/simexplorer/is/security/service/AuthenticationServiceImpl.java 2008-01-23 16:40:14 UTC (rev 446) +++ trunk/simexplorer-is-security/src/java/fr/cemagref/simexplorer/is/security/service/AuthenticationServiceImpl.java 2008-01-23 18:23:10 UTC (rev 447) @@ -239,7 +239,7 @@ public Group[] getGroups(String token) { List<Group> groups = dao.getGroups(); - Group[] result = groups.toArray(new Group[0]); + Group[] result = groups.toArray(new Group[groups.size()]); return result; } 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-01-23 16:40:14 UTC (rev 446) +++ trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/StorageService.java 2008-01-23 18:23:10 UTC (rev 447) @@ -26,6 +26,7 @@ import fr.cemagref.simexplorer.is.entities.data.LoggableElement; import fr.cemagref.simexplorer.is.entities.metadata.MetaDataEntity; +import fr.cemagref.simexplorer.is.entities.metadata.Version; /** * Service interface @@ -113,6 +114,17 @@ String uuid, String version) throws Exception; /** + * Retrieve data related to an entity + * + * @param token + * @param uuid + * @param dataKey + * @param remoteStream + */ + RemoteInputStream retrieveData(String token, String uuid, String version, + String dataKey) throws Exception; + + /** * Retrieve number of elements matching query * * @param query @@ -172,4 +184,13 @@ LoggableElement getElement(String token, String uuid, String version) throws Exception; + /** + * Get all version of an element + * + * @param token + * @param uuid + * @return + */ + MetaDataEntity[] getVersions(String token, String uuid) throws Exception; + } Modified: trunk/simexplorer-is-storage/src/java/fr/cemagref/simexplorer/is/storage/engine/StorageEngine.java =================================================================== --- trunk/simexplorer-is-storage/src/java/fr/cemagref/simexplorer/is/storage/engine/StorageEngine.java 2008-01-23 16:40:14 UTC (rev 446) +++ trunk/simexplorer-is-storage/src/java/fr/cemagref/simexplorer/is/storage/engine/StorageEngine.java 2008-01-23 18:23:10 UTC (rev 447) @@ -20,6 +20,7 @@ import java.io.InputStream; import java.util.List; import java.util.Map; +import java.util.Set; import fr.cemagref.simexplorer.is.entities.metadata.MetaDataEntity; import fr.cemagref.simexplorer.is.entities.metadata.Version; @@ -67,7 +68,8 @@ * @return The element * @throws Exception */ - public abstract MetaDataEntity getMetadata(String token, String uuid) throws Exception; + public abstract MetaDataEntity getMetadata(String token, String uuid) + throws Exception; /** * Retrieve versions of an element<br> @@ -79,9 +81,20 @@ * * @throws Exception */ - public abstract List<Version> getVersions(String token, String uuid) throws Exception; + public abstract List<Version> getVersions(String token, String uuid) + throws Exception; /** + * Retrieve all version of a metadata + * + * @param token + * @param uuid + * @return + */ + public abstract Set<MetaDataEntity> getElementVersions(String token, + String uuid) throws Exception; + + /** * Retrieve an element in a specific version * * @param uuid @@ -89,8 +102,8 @@ * @return * @throws Exception */ - public abstract MetaDataEntity getMetadata(String token, String uuid, Version version) - throws Exception; + public abstract MetaDataEntity getMetadata(String token, String uuid, + Version version) throws Exception; /** * Get data associated to an element @@ -102,8 +115,8 @@ * @return Data stream * @throws Exception */ - public abstract InputStream retrieveData(String token, MetaDataEntity entity, String field) - throws Exception; + public abstract InputStream retrieveData(String token, + MetaDataEntity entity, String field) throws Exception; /** * Get number of items corresponding to query @@ -113,8 +126,8 @@ * @return * @throws Exception */ - public abstract int findFullTextCount(String token, String query, boolean onlyLatest) - throws Exception; + public abstract int findFullTextCount(String token, String query, + boolean onlyLatest) throws Exception; /** * Retrieve list of items corresponding to query @@ -142,8 +155,8 @@ * @return * @throws Exception */ - public abstract MetaDataEntity[] findElementsByType(String token, String type, - boolean onlyLatest, int start, int count, int dateOrder) + public abstract MetaDataEntity[] findElementsByType(String token, + String type, boolean onlyLatest, int start, int count, int dateOrder) throws Exception; /** @@ -154,8 +167,8 @@ * @return * @throws Exception */ - public abstract int findElementsByTypeCount(String token, String type, boolean onlyLatest) - throws Exception; + public abstract int findElementsByTypeCount(String token, String type, + boolean onlyLatest) throws Exception; /** * Delete elements @@ -163,7 +176,8 @@ * @param uuid * @throws Exception */ - public abstract void deleteElements(String token, String uuid) throws Exception; + public abstract void deleteElements(String token, String uuid) + throws Exception; /** * Delete one element @@ -172,8 +186,8 @@ * @param version * @throws Exception */ - public abstract void deleteElement(String token, String uuid, Version version) - throws Exception; + public abstract void deleteElement(String token, String uuid, + Version version) throws Exception; /** * Store temporary data, for stream duplication Modified: trunk/simexplorer-is-storage/src/java/fr/cemagref/simexplorer/is/storage/engine/StorageEngineImpl.java =================================================================== --- trunk/simexplorer-is-storage/src/java/fr/cemagref/simexplorer/is/storage/engine/StorageEngineImpl.java 2008-01-23 16:40:14 UTC (rev 446) +++ trunk/simexplorer-is-storage/src/java/fr/cemagref/simexplorer/is/storage/engine/StorageEngineImpl.java 2008-01-23 18:23:10 UTC (rev 447) @@ -262,4 +262,8 @@ attachmentHandler.deleteData(mdTmp, id); } + public Set<MetaDataEntity> getElementVersions(String token, String uuid) throws Exception { + return database.findElementsById(uuid, false); + } + } Modified: trunk/simexplorer-is-web/pom.xml =================================================================== --- trunk/simexplorer-is-web/pom.xml 2008-01-23 16:40:14 UTC (rev 446) +++ trunk/simexplorer-is-web/pom.xml 2008-01-23 18:23:10 UTC (rev 447) @@ -64,7 +64,7 @@ <dependency> <groupId>tapestry5-treegrid</groupId> <artifactId>tapestry5-treegrid</artifactId> - <version>0.0.1-SNAPSHOT</version> + <version>0.0.1</version> </dependency> <dependency> <groupId>org.apache.tapestry</groupId> Modified: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/components/Layout.java =================================================================== --- trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/components/Layout.java 2008-01-23 16:40:14 UTC (rev 446) +++ trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/components/Layout.java 2008-01-23 18:23:10 UTC (rev 447) @@ -136,12 +136,4 @@ return elementList.isUserSuperAdmin(); } - public String getToken() { - return token; - } - - public void setToken(String token) { - this.token = token; - } - } Modified: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/grid/ElementDataSource.java =================================================================== --- trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/grid/ElementDataSource.java 2008-01-23 16:40:14 UTC (rev 446) +++ trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/grid/ElementDataSource.java 2008-01-23 18:23:10 UTC (rev 447) @@ -17,46 +17,75 @@ * ##% */ package fr.cemagref.simexplorer.is.ui.web.grid; -import javax.naming.NamingException; - import org.apache.tapestry.annotations.ApplicationState; import org.apache.tapestry.beaneditor.PropertyModel; import org.apache.tapestry.grid.GridDataSource; -import org.apache.tapestry.ioc.annotations.Inject; import fr.cemagref.simexplorer.is.entities.metadata.MetaDataEntity; import fr.cemagref.simexplorer.is.ui.web.services.RemoteStorageService; +/** + * Datasource of element list + * + * @author glandais + * + */ public class ElementDataSource implements GridDataSource { + /** + * Query being searched + */ private String query = ""; + /** + * Bookmark on first item index + */ private int indexStart = 0; + /** + * Cached entities + */ private MetaDataEntity[] entities = null; - @ApplicationState + /** + * Authentification token + */ private String token; - - public ElementDataSource(String query) { + + /** + * Build datasource with text query + * + * @param token + * @param query + */ + public ElementDataSource(String token, String query) { super(); this.query = query; + this.token = token; } - public ElementDataSource() { + /** + * Build datasource without text query + * + * @param token + */ + public ElementDataSource(String token) { super(); this.query = ""; + this.token = token; } + /* (non-Javadoc) + * @see org.apache.tapestry.grid.GridDataSource#getAvailableRows() + */ public int getAvailableRows() { int result = 0; try { if (query.equals("")) { - result = RemoteStorageService.getStorageService().findApplicationsCount(token, false); + result = RemoteStorageService.getStorageService() + .findApplicationsCount(token, false); } else { - result = RemoteStorageService.getStorageService().findFullTextCount(token, query, false); + result = RemoteStorageService.getStorageService() + .findFullTextCount(token, query, false); } - } catch (NamingException e) { - // TODO Auto-generated catch block - e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); @@ -64,14 +93,23 @@ return result; } + /* (non-Javadoc) + * @see org.apache.tapestry.grid.GridDataSource#getRowType() + */ public Class getRowType() { return MetaDataEntity.class; } + /* (non-Javadoc) + * @see org.apache.tapestry.grid.GridDataSource#getRowValue(int)token + */ public Object getRowValue(int index) { return entities[index - indexStart]; } + /* (non-Javadoc) + * @see org.apache.tapestry.grid.GridDataSource#prepare(int, int, org.apache.tapestry.beaneditor.PropertyModel, boolean) + */ public void prepare(int startIndex, int endIndex, PropertyModel sortModel, boolean ascending) { try { @@ -92,9 +130,9 @@ .findApplications(token, false, startIndex, 1 + endIndex - startIndex, dateOrder); } else { - entities = RemoteStorageService.getStorageService().findFullText(token, - query, false, startIndex, 1 + endIndex - startIndex, - dateOrder); + entities = RemoteStorageService.getStorageService() + .findFullText(token, query, false, startIndex, + 1 + endIndex - startIndex, dateOrder); } } catch (Exception e) { // TODO Auto-generated catch block @@ -104,6 +142,11 @@ } } + /** + * Current query + * + * @return Current text query + */ public String getQuery() { return query; } Modified: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementDetail.java =================================================================== --- trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementDetail.java 2008-01-23 16:40:14 UTC (rev 446) +++ trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementDetail.java 2008-01-23 18:23:10 UTC (rev 447) @@ -19,6 +19,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -31,6 +32,8 @@ import org.apache.tapestry.ioc.annotations.Inject; import org.codelutin.tapestry.beans.TreeNode; +import com.healthmarketscience.rmiio.RemoteInputStream; +import com.healthmarketscience.rmiio.RemoteInputStreamClient; import com.healthmarketscience.rmiio.RemoteOutputStreamServer; import com.healthmarketscience.rmiio.SimpleRemoteOutputStream; @@ -42,11 +45,11 @@ import fr.cemagref.simexplorer.is.entities.data.ExplorationData; import fr.cemagref.simexplorer.is.entities.data.Library; import fr.cemagref.simexplorer.is.entities.data.LoggableElement; -import fr.cemagref.simexplorer.is.entities.data.Result; import fr.cemagref.simexplorer.is.entities.data.Structure; import fr.cemagref.simexplorer.is.entities.metadata.MetaDataEntity; import fr.cemagref.simexplorer.is.ui.web.pages.security.UserPage; import fr.cemagref.simexplorer.is.ui.web.services.RemoteStorageService; +import fr.cemagref.simexplorer.is.ui.web.tools.AttachmentStreamResponse; import fr.cemagref.simexplorer.is.ui.web.tools.XMLAttachment; public class ElementDetail extends UserPage { @@ -57,17 +60,31 @@ @Persist private LoggableElement element; + /** + * Prepare page + * + * @param uuid + * Id of element to display + * @param version + * Version of element to display + * @throws Exception + */ public void setup(String uuid, String version) throws Exception { element = RemoteStorageService.getStorageService().getElement( getToken(), uuid, version); } + /** + * Headers of tree grid + * + * @return Headers + */ public List<String> getHeaders() { List<String> result = new ArrayList<String>(); - result.add(""); - result.add(""); - result.add(""); - result.add(""); + result.add("Type"); + result.add("Name"); + result.add("Version"); + result.add("Actions"); return result; } @@ -77,7 +94,7 @@ return nodes; } - public Object exportElement(String uuid, String version) throws Exception { + private Object exportElement(String uuid, String version) throws Exception { StreamResponse response; ByteArrayOutputStream bos = new ByteArrayOutputStream(); @@ -95,39 +112,47 @@ return response; } - public Object onExportElement(String context) throws Exception { + public Object onExport(String context) throws Exception { StringTokenizer st = new StringTokenizer(context, ","); String uuid = st.nextToken(); String version = st.nextToken(); return exportElement(uuid, version); } - private String[] generateStringArray(String s1, String s2, String s3) { - List<String> result = new ArrayList<String>(); - result.add(s1); - result.add(s2); - result.add(s3); - result.add(""); - return result.toArray(new String[result.size()]); + public Object onHistory(String context) throws Exception { + StringTokenizer st = new StringTokenizer(context, ","); + String uuid = st.nextToken(); + String version = st.nextToken(); + return null; } - private String[] generateStringArray(String s1, String s2, String s3, - String actionCaption, String action, Object context) { - List<String> result = new ArrayList<String>(); - result.add(s1); - result.add(s2); - result.add(s3); - Link link = resources.createActionLink(action, false, context); - StringBuffer sb = new StringBuffer(""); - sb.append("<a href=\""); - sb.append(link.toString()); - sb.append("\">"); - sb.append(actionCaption); - sb.append("</a>"); - result.add(sb.toString()); - return result.toArray(new String[result.size()]); + public Object onRights(String context) throws Exception { + StringTokenizer st = new StringTokenizer(context, ","); + String uuid = st.nextToken(); + String version = st.nextToken(); + return null; } + private Object downloadElement(String uuid, String version) + throws Exception { + StreamResponse response; + + MetaDataEntity mde = RemoteStorageService.getStorageService() + .getMetadata(getToken(), uuid, version); + RemoteInputStream ris = RemoteStorageService.getStorageService().retrieveData(getToken(), uuid, version, "_xml"); + InputStream stream = RemoteInputStreamClient.wrap(ris); + response = new AttachmentStreamResponse(stream, "_xml"); + + return response; + } + + public Object onDownload(String context) throws Exception { + StringTokenizer st = new StringTokenizer(context, ","); + String uuid = st.nextToken(); + String version = st.nextToken(); + return downloadElement(uuid, version); + } + private TreeNode generateElement() { TreeNode node = null; if (element instanceof ExplorationApplication) { @@ -143,6 +168,63 @@ return node; } + private String generateString(String actionCaption, String action, + LoggableElement element) { + String context = element.getMetaData().getUuid() + "," + + element.getMetaData().getVersion(); + Link link = resources.createActionLink(action, false, context); + StringBuffer sb = new StringBuffer(""); + sb.append("<a href=\""); + sb.append(link.toString()); + sb.append("\">"); + sb.append(actionCaption); + sb.append("</a>"); + return sb.toString(); + } + + private String generateActions(LoggableElement element, StringBuilder sb, + String... actions) { + String res; + for (String anAction : actions) { + sb.append("<br>"); + sb.append(generateString(anAction, anAction, element)); + } + sb.append("<br>"); + sb.append(generateString("rights", "rights", element)); + // TODO add security + + res = sb.substring(4); + return res; + } + + private String[] generateStringArray(String s1, String s2, String s3, + LoggableElement element, String... actions) { + List<String> result = new ArrayList<String>(); + result.add(s1); + result.add(s2); + result.add(s3); + String s4 = ""; + StringBuilder sb = new StringBuilder(""); + if (element != null) { + s4 = generateActions(element, sb, actions); + } + result.add(s4); + + return result.toArray(new String[result.size()]); + } + + private String[] generateStringArray(String s1, String s2, String s3) { + return generateStringArray(s1, s2, s3, null); + } + + private String generateHeader(String caption) { + StringBuilder sb = new StringBuilder(); + sb.append("<b>"); + sb.append(caption); + sb.append("</b>"); + return sb.toString(); + } + private TreeNode generateExplorationApplication() { TreeNode node; node = new TreeNode(); @@ -150,10 +232,8 @@ node.setType(TreeNode.TYPE_FOLDER); node.setColumns(generateStringArray("Application exploration", element - .getMetaData().getDescription(), element.getMetaData() - .getVersion().toString(), "Export", "exportElement", element - .getMetaData().getUuid() - + "," + element.getMetaData().getVersion())); + .getMetaData().getName(), element.getMetaData().getVersion() + .toString(), element, "export", "history")); TreeNode[] children = new TreeNode[2]; children[0] = new TreeNode(); @@ -188,17 +268,22 @@ private TreeNode generateExplorationData(ExplorationData explorationData) { TreeNode explorationDataNode = new TreeNode(); explorationDataNode.setType(TreeNode.TYPE_FOLDER); + explorationDataNode.setColumns(generateStringArray("Exploration data", - explorationData.getMetaData().getDescription(), explorationData - .getMetaData().getVersion().toString(), "Export", - "exportElement", explorationData.getMetaData().getUuid() + "," - + explorationData.getMetaData().getVersion())); + explorationData.getMetaData().getName(), explorationData + .getMetaData().getVersion().toString(), + explorationData, "history")); + TreeNode[] children = new TreeNode[2]; - children[0] = generateResult(explorationData.getResult()); + + children[0] = generateResult(explorationData); + children[1] = new TreeNode(); children[1].setType(TreeNode.TYPE_FOLDER); - children[1].setColumns(generateStringArray("Values", "", "")); + children[1].setColumns(generateStringArray("Values", + generateHeader("Type"), generateHeader("Value"))); children[1].setChildren(generateValues(explorationData)); + explorationDataNode.setChildren(children); return explorationDataNode; } @@ -211,18 +296,20 @@ res[i] = new TreeNode(); res[i].setType(TreeNode.TYPE_DOCUMENT); res[i].setColumns(generateStringArray( - value.getConstant().getName(), value.getValue(), value - .getConstant().getType().getSimpleName())); + value.getConstant().getName(), value.getConstant() + .getType().getSimpleName(), value.getValue())); i++; } return res; } - private TreeNode generateResult(Result result) { + private TreeNode generateResult(ExplorationData explorationData) { TreeNode res = new TreeNode(); res.setType(TreeNode.TYPE_DOCUMENT); - res.setColumns(generateStringArray("Result", "", "")); + + res.setColumns(generateStringArray("Result", "", "", explorationData, + "download")); return res; } @@ -243,24 +330,31 @@ private TreeNode generateComponent(Component component) { TreeNode componentNode = new TreeNode(); componentNode.setType(TreeNode.TYPE_FOLDER); + componentNode.setColumns(generateStringArray("Component", component - .getMetaData().getDescription(), component.getMetaData() - .getVersion().toString(), "Export", "exportElement", component - .getMetaData().getUuid() - + "," + component.getMetaData().getVersion())); + .getMetaData().getName(), component.getMetaData().getVersion() + .toString(), component, "history")); + TreeNode[] children = new TreeNode[4]; for (int j = 0; j < children.length; j++) { children[j] = new TreeNode(); children[j].setType(TreeNode.TYPE_FOLDER); } - children[0].setColumns(generateStringArray("Constants", "", "")); + + children[0].setColumns(generateStringArray("Constants", + generateHeader("Name"), generateHeader("Type"))); children[0].setChildren(generateConstants(component.getConstants())); + children[1].setColumns(generateStringArray("Structures", "", "")); children[1].setChildren(generateStructures(component.getStructures())); - children[2].setColumns(generateStringArray("Codes", "", "")); + + children[2].setColumns(generateStringArray("Codes", + generateHeader("Language"), generateHeader("Code"))); children[2].setChildren(generateCodes(component.getCodes())); + children[3].setColumns(generateStringArray("Libraries", "", "")); children[3].setChildren(generateLibraries(component.getLibraries())); + componentNode.setChildren(children); return componentNode; } @@ -271,7 +365,10 @@ for (Library library : libraries) { res[i] = new TreeNode(); res[i].setType(TreeNode.TYPE_DOCUMENT); - res[i].setColumns(generateStringArray("Library", "", "")); + + res[i].setColumns(generateStringArray("Library", library + .getMetaData().getName(), library.getMetaData() + .getVersion().toString(), library, "download")); i++; } return res; Added: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementHistory.java =================================================================== --- trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementHistory.java (rev 0) +++ trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementHistory.java 2008-01-23 18:23:10 UTC (rev 447) @@ -0,0 +1,99 @@ +/* +* ##% Copyright (C) 2008 Code Lutin, Gabriel Landais +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +* ##% */ +package fr.cemagref.simexplorer.is.ui.web.pages; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; + +import org.apache.tapestry.annotations.Persist; +import org.codelutin.tapestry.beans.TreeNode; + +import fr.cemagref.simexplorer.is.entities.data.LoggableElement; +import fr.cemagref.simexplorer.is.entities.metadata.MetaDataEntity; +import fr.cemagref.simexplorer.is.ui.web.pages.security.UserPage; +import fr.cemagref.simexplorer.is.ui.web.services.RemoteStorageService; + +public class ElementHistory extends UserPage { + + public class MetadataVersionComparator implements + Comparator<MetaDataEntity> { + + public int compare(MetaDataEntity arg0, MetaDataEntity arg1) { + return arg0.getVersion().compareTo(arg1.getVersion()); + } + + } + + @Persist + private MetaDataEntity[] versions; + + public void setup(String uuid) throws Exception { + versions = RemoteStorageService.getStorageService().getVersions( + getToken(), uuid); + } + + /** + * Headers of tree grid + * + * @return Headers + */ + public List<String> getHeaders() { + List<String> result = new ArrayList<String>(); + result.add("Version"); + result.add("Author"); + result.add("Name"); + result.add("Description"); + return result; + } + + public List<TreeNode> getVersions() { + List<TreeNode> nodes = new ArrayList<TreeNode>(); + nodes.add(generateNodes()); + return nodes; + } + + private TreeNode generateNodes() { + Arrays.sort(versions, new MetadataVersionComparator()); + int pos = 0; + int added = 0; + TreeNode rootNode = new TreeNode(); + rootNode.setType(TreeNode.TYPE_FOLDER); + rootNode.setColumns(generateStringArray("Root", "")); + rootNode.setChildren(new TreeNode[0]); + for (MetaDataEntity mde : versions) { + insertNode(mde, rootNode); + } + return null; + } + + private void insertNode(MetaDataEntity mde, TreeNode node) { + TreeNode[] nodes = node.getChildren(); + for (TreeNode treeNode : nodes) { + if (mde.getVersion().toString().startsWith(treeNode.getColumns()[2])) { + insertNode(mde, treeNode); + } + } + } + + private String[] generateStringArray(String... s) { + return s; + } + +} Modified: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementList.java =================================================================== --- trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementList.java 2008-01-23 16:40:14 UTC (rev 446) +++ trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementList.java 2008-01-23 18:23:10 UTC (rev 447) @@ -70,7 +70,7 @@ model = model.remove(property); } } - elementDataSource = new ElementDataSource(); + elementDataSource = new ElementDataSource(getToken()); } public BeanModel getModel() { @@ -79,15 +79,15 @@ public void searchQuery(String query) { if (query == null || query.equals("")) { - elementDataSource = new ElementDataSource(); + elementDataSource = new ElementDataSource(getToken()); } else { - elementDataSource = new ElementDataSource(query); + elementDataSource = new ElementDataSource(getToken(), query); } } public ElementDataSource getElements() { if (elementDataSource == null) { - elementDataSource = new ElementDataSource(); + elementDataSource = new ElementDataSource(getToken()); } return elementDataSource; } Modified: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/security/ProtectedPage.java =================================================================== --- trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/security/ProtectedPage.java 2008-01-23 16:40:14 UTC (rev 446) +++ trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/security/ProtectedPage.java 2008-01-23 18:23:10 UTC (rev 447) @@ -18,6 +18,7 @@ package fr.cemagref.simexplorer.is.ui.web.pages.security; import org.apache.tapestry.annotations.ApplicationState; +import org.apache.tapestry.annotations.Persist; import org.apache.tapestry.ioc.annotations.Inject; import fr.cemagref.simexplorer.is.security.entities.User; @@ -28,17 +29,43 @@ @ApplicationState private String token; + @Persist + private User user; + + @Persist + private boolean userLogged; + + @Persist + private boolean userAdmin; + + @Persist + private boolean userSuperAdmin; + Object onActivate() { - if (!hasAccessToPage()) + getUserRights(); + if (!userLogged) return "Login"; return null; } + private void getUserRights() { + user = computeUserLogged(); + if (user != null) { + userLogged = true; + userAdmin = user.isAdmin(); + userSuperAdmin = user.isSuperAdmin(); + } else { + userLogged = false; + userAdmin = false; + userSuperAdmin = false; + } + } + public String getToken() { return token; } - public User getUserLogged() { + private User computeUserLogged() { User loggedUser = null; if (token != null) { try { @@ -51,44 +78,22 @@ return loggedUser; } + abstract boolean hasAccessToPage(); + + public User getUserLogged() { + return user; + } + public boolean isUserLogged() { - boolean result = false; - try { - if (getUserLogged() != null) { - result = true; - } - } catch (Exception e) { - // TODO: handle exception - } - return result; + return userLogged; } public boolean isUserAdmin() { - boolean result = false; - try { - User user = getUserLogged(); - if (user != null && user.isAdmin()) { - result = true; - } - } catch (Exception e) { - // TODO: handle exception - } - return result; + return userAdmin; } public boolean isUserSuperAdmin() { - boolean result = false; - try { - User user = getUserLogged(); - if (user != null && user.isSuperAdmin()) { - result = true; - } - } catch (Exception e) { - // TODO: handle exception - } - return result; + return userSuperAdmin; } - abstract boolean hasAccessToPage(); - } \ No newline at end of file Modified: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/tools/AttachmentStreamResponse.java =================================================================== --- trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/tools/AttachmentStreamResponse.java 2008-01-23 16:40:14 UTC (rev 446) +++ trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/tools/AttachmentStreamResponse.java 2008-01-23 18:23:10 UTC (rev 447) @@ -26,23 +26,17 @@ public class AttachmentStreamResponse implements StreamResponse { private InputStream is = null; - protected String contentType = "text/plain"; + protected String contentType = "application/octet-stream"; - protected String extension = "txt"; + protected String extension = null; - protected String filename = "default"; + protected String filename = null; public AttachmentStreamResponse(InputStream is, String filenameIn) { this.is = is; - if (filenameIn != null) { - this.filename = filenameIn; - } + this.filename = filenameIn; } - public AttachmentStreamResponse(InputStream is) { - this.is = is; - } - public String getContentType() { return contentType; } Modified: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/tools/XMLAttachment.java =================================================================== --- trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/tools/XMLAttachment.java 2008-01-23 16:40:14 UTC (rev 446) +++ trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/tools/XMLAttachment.java 2008-01-23 18:23:10 UTC (rev 447) @@ -27,10 +27,4 @@ this.extension = "xml"; } - public XMLAttachment(InputStream is) { - super(is); - this.contentType = "text/xml"; - this.extension = "xml"; - } - } Added: trunk/simexplorer-is-web/src/main/webapp/ElementHistory.tml =================================================================== --- trunk/simexplorer-is-web/src/main/webapp/ElementHistory.tml (rev 0) +++ trunk/simexplorer-is-web/src/main/webapp/ElementHistory.tml 2008-01-23 18:23:10 UTC (rev 447) @@ -0,0 +1,7 @@ +<t:layout xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd" + title="message:windowtitle"> + + <table t:type="cl/TreeGrid" source="versions" columnHeaders="headers"> + </table> + +</t:layout> Modified: trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/components/Layout.properties =================================================================== --- trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/components/Layout.properties 2008-01-23 16:40:14 UTC (rev 446) +++ trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/components/Layout.properties 2008-01-23 18:23:10 UTC (rev 447) @@ -15,6 +15,6 @@ layout-logout=Logout -layout-copyright=Copyright © 2007. Code Lutin - GPL +layout-copyright=Copyright © 2008. Cemagref - GPL search=Search \ No newline at end of file Modified: trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/pages/GroupEdit.properties =================================================================== --- trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/pages/GroupEdit.properties 2008-01-23 16:40:14 UTC (rev 446) +++ trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/pages/GroupEdit.properties 2008-01-23 18:23:10 UTC (rev 447) @@ -1,3 +1,4 @@ +windowtitle=Edit group name=Name userMembers=User members groupMembers=Group members Modified: trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/pages/UserEdit.properties =================================================================== --- trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/pages/UserEdit.properties 2008-01-23 16:40:14 UTC (rev 446) +++ trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/pages/UserEdit.properties 2008-01-23 18:23:10 UTC (rev 447) @@ -1,3 +1,4 @@ +windowtitle=Edit user name=Name firstname=First name mail=Mail