Author: glandais Date: 2008-01-28 16:37:53 +0000 (Mon, 28 Jan 2008) New Revision: 553 Added: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementImport.java trunk/simexplorer-is-web/src/main/webapp/ElementImport.tml trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/pages/ElementImport.properties Removed: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ApplicationImport.java trunk/simexplorer-is-web/src/main/webapp/ApplicationImport.tml trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/pages/ApplicationImport.properties Modified: trunk/simexplorer-is-entities/src/java/fr/cemagref/simexplorer/is/contenttype/ContentType.java trunk/simexplorer-is-entities/src/java/fr/cemagref/simexplorer/is/contenttype/RawType.java trunk/simexplorer-is-entities/src/java/fr/cemagref/simexplorer/is/factories/XmlConstants.java trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/ElementGenerator.java trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/StorageServiceClient.java trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/StorageServiceCommon.java trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/StorageServiceServer.java trunk/simexplorer-is-service/src/test/fr/cemagref/simexplorer/is/service/StorageServiceMassInsert.java trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/SimExplorerWebException.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/ElementExport.java 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/ElementPageDetail.java trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ExceptionReport.java trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/tools/DownloadableFile.java trunk/simexplorer-is-web/src/main/webapp/ElementExport.tml trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/components/Layout.tml Log: Attachment handling Modified: trunk/simexplorer-is-entities/src/java/fr/cemagref/simexplorer/is/contenttype/ContentType.java =================================================================== --- trunk/simexplorer-is-entities/src/java/fr/cemagref/simexplorer/is/contenttype/ContentType.java 2008-01-28 13:00:46 UTC (rev 552) +++ trunk/simexplorer-is-entities/src/java/fr/cemagref/simexplorer/is/contenttype/ContentType.java 2008-01-28 16:37:53 UTC (rev 553) @@ -29,52 +29,23 @@ public abstract class ContentType { /** - * MIME type - */ - private String mimeType; - /** - * Text description - */ - private String description; - - /** * Index content * * @param is * Input stream * @return Indexable text - * @throws Exception + * @throws Exception */ public abstract Reader renderToText(InputStream is) throws Exception; /** * @return the mimeType */ - public String getMimeType() { - return mimeType; - } + public abstract String getMimeType(); /** - * @param mimeType - * the mimeType to set - */ - protected void setMimeType(String mimeType) { - this.mimeType = mimeType; - } - - /** * @return the description */ - public String getDescription() { - return description; - } + public abstract String getDescription(); - /** - * @param description - * the description to set - */ - protected void setDescription(String description) { - this.description = description; - } - } Modified: trunk/simexplorer-is-entities/src/java/fr/cemagref/simexplorer/is/contenttype/RawType.java =================================================================== --- trunk/simexplorer-is-entities/src/java/fr/cemagref/simexplorer/is/contenttype/RawType.java 2008-01-28 13:00:46 UTC (rev 552) +++ trunk/simexplorer-is-entities/src/java/fr/cemagref/simexplorer/is/contenttype/RawType.java 2008-01-28 16:37:53 UTC (rev 553) @@ -32,19 +32,20 @@ private static final long serialVersionUID = -8010160085848440286L; - /** - * Set inner properties - */ - public RawType() { - super(); - setDescription("rawtype"); - setMimeType("text/text"); - } - @Override public Reader renderToText(InputStream is) { // No parsing return new InputStreamReader(is); } + @Override + public String getDescription() { + return "rawtype"; + } + + @Override + public String getMimeType() { + return "text/text"; + } + } Modified: trunk/simexplorer-is-entities/src/java/fr/cemagref/simexplorer/is/factories/XmlConstants.java =================================================================== --- trunk/simexplorer-is-entities/src/java/fr/cemagref/simexplorer/is/factories/XmlConstants.java 2008-01-28 13:00:46 UTC (rev 552) +++ trunk/simexplorer-is-entities/src/java/fr/cemagref/simexplorer/is/factories/XmlConstants.java 2008-01-28 16:37:53 UTC (rev 553) @@ -63,6 +63,7 @@ public static final String KEY_METADATA_TYPE = "type"; public static final String VALUE_METADATA_TYPE_EA = "ExplorationApplication"; + public static final String VALUE_METADATA_TYPE_COMPONENT = "Component"; public static final String KEY_METADATA_DESCRIPTION = "description"; public static final String KEY_METADATA_CREATIONDATE = "creationdate"; Modified: trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/ElementGenerator.java =================================================================== --- trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/ElementGenerator.java 2008-01-28 13:00:46 UTC (rev 552) +++ trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/ElementGenerator.java 2008-01-28 16:37:53 UTC (rev 553) @@ -145,20 +145,6 @@ processComponent(object); } ea.setComponents(components); - - Map<String, ContentType> contents = new HashMap<String, ContentType>(); - for (ExplorationData object : datas) { - contents.putAll(object.getMetaData().getAttachments()); - } - for (Component object : components) { - Set<Library> libraries = object.getLibraries(); - for (Library library : libraries) { - contents.putAll(library.getMetaData().getAttachments()); - } - contents.putAll(object.getMetaData().getAttachments()); - } - ea.getMetaData().setAttachments(contents); - return ea; } @@ -186,7 +172,7 @@ } private void processLibrary(Library library) throws Exception { - library.getMetaData().getAttachments().put(shortString() + ".zip", + library.getMetaData().getAttachments().put(shortString() + ".txt", ContentTypeFactory.getContentTypeInstance("RawType")); } @@ -205,7 +191,7 @@ Result result = new Result(); explorationData.setResult(result); explorationData.getMetaData().getAttachments().put( - shortString() + ".zip", + shortString() + ".txt", ContentTypeFactory.getContentTypeInstance("RawType")); Set<ConstantValue> constantValues = generateArray(ConstantValue.class); Modified: trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/StorageServiceClient.java =================================================================== --- trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/StorageServiceClient.java 2008-01-28 13:00:46 UTC (rev 552) +++ trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/StorageServiceClient.java 2008-01-28 16:37:53 UTC (rev 553) @@ -27,9 +27,7 @@ } public String loginUser(String login, String password) throws SimExplorerServiceException { - //TODO Should use this ? - //throw new SimExplorerServiceException("can not log to local service"); - return null; + throw new SimExplorerServiceException("can not log to local service"); } } 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-01-28 13:00:46 UTC (rev 552) +++ trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/StorageServiceCommon.java 2008-01-28 16:37:53 UTC (rev 553) @@ -41,6 +41,7 @@ import com.healthmarketscience.rmiio.RemoteOutputStreamClient; import com.healthmarketscience.rmiio.SimpleRemoteInputStream; +import fr.cemagref.simexplorer.is.contenttype.ContentType; import fr.cemagref.simexplorer.is.entities.data.LoggableElement; import fr.cemagref.simexplorer.is.entities.metadata.MetaDataEntity; import fr.cemagref.simexplorer.is.entities.metadata.Version; @@ -221,7 +222,7 @@ } } - public MetaDataEntity saveElement(String token, InputStream xmlFile, + private MetaDataEntity saveElement(String token, InputStream xmlFile, Map<String, InputStream> attachments) throws Exception { // Store temporary data String idxml = storageEngine.storeTempData(xmlFile); @@ -295,43 +296,20 @@ if (metaData.getType() != null && VALUE_METADATA_TYPE_EA.equals(metaData.getType())) { - - /* - ExplorationApplication ea = (ExplorationApplication) BaseEntityFactory - .getFactory(ExplorationApplication.class).loadElement( - storageEngine.retrieveTempData(idxml)); - */ - - // If element is an EA, save inner Components and Data - List<String> components = new ArrayList<String>(); - List<String[]> explorationDatas = new ArrayList<String[]>(); - - // Retrieve elements - extractChildren(token, idxml, idsattachment, components, - explorationDatas); - - // For each exploration data - for (String[] explorationData : explorationDatas) { - // where is stored xml - String idxmlED = explorationData[0]; - - // where is stored result - Map<String, String> attachmentsED = new HashMap<String, String>(); - if (explorationData.length > 1) { - attachmentsED.put(explorationData[1], idsattachment - .get(explorationData[1])); - } - // recursive save - saveElement(token, idxmlED, attachmentsED); - - } - - // For each component - for (String idComponent : components) { - saveElement(token, idComponent, new HashMap<String, String>()); - } - + // Save components + saveSubElements(token, idxml, + KEY_EXPLORATIONAPPLICATION_COMPONENTS, + KEY_EXPLORATIONAPPLICATION_COMPONENT_NODE, idsattachment); + // Save exploration data + saveSubElements(token, idxml, KEY_EXPLORATIONAPPLICATION_DATA, + KEY_EXPLORATIONAPPLICATION_DATA_NODE, idsattachment); } + if (metaData.getType() != null + && VALUE_METADATA_TYPE_COMPONENT.equals(metaData.getType())) { + // Save libraries + saveSubElements(token, idxml, KEY_COMPONENT_LIBRARIES, + KEY_COMPONENT_LIBRARY_NODE, idsattachment); + } // Process version rules processVersionRules(token, metaData); @@ -340,19 +318,43 @@ Map<String, InputStream> attachments = new HashMap<String, InputStream>(); attachments.put(KEY_XML, storageEngine.retrieveTempData(idxml)); - if (metaData.getType() != null - && !VALUE_METADATA_TYPE_EA.equals(metaData.getType())) { - for (Map.Entry<String, String> entry : idsattachment.entrySet()) { - attachments.put(entry.getKey(), storageEngine - .retrieveTempData(entry.getValue())); - } + + Map<String, ContentType> realAttachments = metaData.getAttachments(); + for (Map.Entry<String, ContentType> entry : realAttachments.entrySet()) { + attachments.put(entry.getKey(), storageEngine + .retrieveTempData(idsattachment.get(entry.getKey()))); } + storageEngine.saveElement(token, metaData, attachments); storageEngine.commit(); return metaData; } + private void saveSubElements(String token, String idxml, + String entitiesNode, String entityNode, + Map<String, String> idsattachment) throws Exception { + + BaseEntityFactory<MetaDataEntity> elementFactory = MetaDataEntityFactory + .getFactory(MetaDataEntity.class); + + Document document = BaseEntityFactory.getXMLBuilder().parse( + storageEngine.retrieveTempData(idxml)); + + Element rootElement = (Element) document.getFirstChild(); + + // Elements + Element entitiesElement = elementFactory.getXMLElementByTagName( + rootElement, entitiesNode); + Set<Element> entityElements = elementFactory.getXMLElementsByTagName( + entitiesElement, entityNode); + for (Element element : entityElements) { + saveElement(token, storageEngine.storeTempData(BaseEntityFactory + .serializeElement(element)), idsattachment); + } + + } + private void processVersionRules(String token, MetaDataEntity metaData) throws Exception { @@ -376,58 +378,6 @@ } - private void extractChildren(String token, String idxml, - Map<String, String> idsattachment, List<String> components, - List<String[]> explorationDatas) throws Exception { - - BaseEntityFactory<MetaDataEntity> elementFactory = MetaDataEntityFactory - .getFactory(MetaDataEntity.class); - - Document document = BaseEntityFactory.getXMLBuilder().parse( - storageEngine.retrieveTempData(idxml)); - - Element rootElement = (Element) document.getFirstChild(); - - // Components - Element componentsElement = elementFactory.getXMLElementByTagName( - rootElement, KEY_EXPLORATIONAPPLICATION_COMPONENTS); - Set<Element> componentElements = elementFactory - .getXMLElementsByTagName(componentsElement, - KEY_EXPLORATIONAPPLICATION_COMPONENT_NODE); - for (Element element : componentElements) { - components.add(storageEngine.storeTempData(BaseEntityFactory - .serializeElement(element))); - } - - Element applicationDatasElement = elementFactory - .getXMLElementByTagName(rootElement, - KEY_EXPLORATIONAPPLICATION_DATA); - Set<Element> applicationDataElements = elementFactory - .getXMLElementsByTagName(applicationDatasElement, - KEY_EXPLORATIONAPPLICATION_DATA_NODE); - - for (Element elementAD : applicationDataElements) { - Element element = elementFactory.getXMLElementByTagName(elementAD, - KEY_EXPLORATIONDATA_RESULT); - String result = elementFactory.getXMLProperty(element, - KEY_RESULT_FILE); - - String[] explorationDataArray; - if (result != null) { - explorationDataArray = new String[2]; - explorationDataArray[1] = result; - } else { - explorationDataArray = new String[1]; - } - explorationDataArray[0] = storageEngine - .storeTempData(BaseEntityFactory - .serializeElement(elementAD)); - - explorationDatas.add(explorationDataArray); - } - - } - public MetaDataEntity[] getVersions(String token, String uuid) throws SimExplorerServiceException { try { Modified: trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/StorageServiceServer.java =================================================================== --- trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/StorageServiceServer.java 2008-01-28 13:00:46 UTC (rev 552) +++ trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/StorageServiceServer.java 2008-01-28 16:37:53 UTC (rev 553) @@ -42,12 +42,6 @@ public String loginUser(String login, String password) throws SimExplorerServiceException { String token = authenticationService.loginUser(login, password); - if (token != null) { - // FIXME datasource différent pour la secu et les timers = - // impossible de faire des requêtes sur les deux dans la même - // transaction - // authenticationService.closeSessionTimer(token); - } return token; } 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-01-28 13:00:46 UTC (rev 552) +++ trunk/simexplorer-is-service/src/test/fr/cemagref/simexplorer/is/service/StorageServiceMassInsert.java 2008-01-28 16:37:53 UTC (rev 553) @@ -21,20 +21,30 @@ import java.util.Date; import java.util.HashMap; import java.util.Map; +import java.util.Properties; import java.util.Random; +import java.util.Set; +import javax.naming.Context; +import javax.naming.InitialContext; + import junit.framework.TestCase; + +import com.healthmarketscience.rmiio.RemoteInputStream; +import com.healthmarketscience.rmiio.RemoteInputStreamServer; +import com.healthmarketscience.rmiio.SimpleRemoteInputStream; + import fr.cemagref.simexplorer.is.contenttype.ContentType; +import fr.cemagref.simexplorer.is.entities.data.Component; import fr.cemagref.simexplorer.is.entities.data.ExplorationApplication; +import fr.cemagref.simexplorer.is.entities.data.ExplorationData; +import fr.cemagref.simexplorer.is.entities.data.Library; import fr.cemagref.simexplorer.is.factories.BaseEntityFactory; import fr.cemagref.simexplorer.is.factories.XmlConstants; -import fr.cemagref.simexplorer.is.service.StorageServiceClient; -import fr.cemagref.simexplorer.is.service.StorageServiceCommon; -import fr.cemagref.simexplorer.is.service.ElementGenerator; public class StorageServiceMassInsert extends TestCase { - private StorageServiceCommon storageService; + private StorageService storageService; private ElementGenerator elementGenerator; private Random r = new Random(); @@ -44,14 +54,14 @@ super.setUp(); elementGenerator = new ElementGenerator(); - storageService = new StorageServiceClient(); - storageService.open(); - } + Properties properties = (Properties) System.getProperties().clone(); + properties.put("java.naming.provider.url", "jnp://localhost:1099"); + properties.put("java.naming.factory.initial", + "org.jnp.interfaces.NamingContextFactory"); + properties.put("java.naming.factory.url.pkgs", "org.jnp.interfaces"); - @Override - protected void tearDown() throws Exception { - super.tearDown(); - storageService.close(); + Context context = new InitialContext(properties); + storageService = (StorageService) context.lookup("StorageService"); } /* @@ -80,31 +90,61 @@ public void testMassInsert() throws Exception { int c = 5; + String token = storageService.loginUser("superadmin", "password"); + Date begin = new Date(); - ExplorationApplication ea = null; for (int i = 0; i < c; i++) { - ea = elementGenerator.generateRandomEA(); + ExplorationApplication parentEa = null; + parentEa = elementGenerator.generateRandomEA(); int v = 2 + r.nextInt(5); for (int j = 0; j < v; j++) { + ExplorationApplication ea = elementGenerator.generateRandomEA(); + ea.getMetaData().setUuid(parentEa.getMetaData().getUuid()); + ea.getMetaData().setVersion( + parentEa.getMetaData().getVersion().toString()); + ea.getMetaData().getVersion().incVersion(r.nextInt(3)); InputStream xmlStream = BaseEntityFactory.getFactory( ExplorationApplication.class).saveElement( XmlConstants.VALUE_METADATA_TYPE_EA, ea); - Map<String, InputStream> attachments = new HashMap<String, InputStream>(); - Map<String, ContentType> attachmentsKeys = ea.getMetaData() - .getAttachments(); + Map<String, RemoteInputStream> attachments = new HashMap<String, RemoteInputStream>(); + + Map<String, ContentType> attachmentsKeys = new HashMap<String, ContentType>(); + + attachmentsKeys.putAll(ea.getMetaData().getAttachments()); + Set<Component> components = ea.getComponents(); + for (Component component : components) { + attachmentsKeys.putAll(component.getMetaData() + .getAttachments()); + Set<Library> libraries = component.getLibraries(); + for (Library library : libraries) { + attachmentsKeys.putAll(library.getMetaData() + .getAttachments()); + } + } + Set<ExplorationData> explorations = ea.getExplorations(); + for (ExplorationData explorationData : explorations) { + attachmentsKeys.putAll(explorationData.getMetaData() + .getAttachments()); + } + for (Map.Entry<String, ContentType> kv : attachmentsKeys .entrySet()) { InputStream stream = elementGenerator.generateTextStream(); - attachments.put(kv.getKey(), stream); + RemoteInputStreamServer remoteStream = new SimpleRemoteInputStream( + stream); + attachments.put(kv.getKey(), remoteStream.export()); } - storageService.saveElement(null, xmlStream, attachments); + RemoteInputStreamServer xmlRemoteStream = new SimpleRemoteInputStream( + xmlStream); + storageService.saveElement(token, xmlRemoteStream.export(), + attachments); } if (i > 0 && i % 100 == 0) { Modified: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/SimExplorerWebException.java =================================================================== --- trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/SimExplorerWebException.java 2008-01-28 13:00:46 UTC (rev 552) +++ trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/SimExplorerWebException.java 2008-01-28 16:37:53 UTC (rev 553) @@ -37,4 +37,9 @@ super(message, cause); } + @Override + public String getMessage() { + return getMessage(); + } + } Deleted: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ApplicationImport.java =================================================================== --- trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ApplicationImport.java 2008-01-28 13:00:46 UTC (rev 552) +++ trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ApplicationImport.java 2008-01-28 16:37:53 UTC (rev 553) @@ -1,67 +0,0 @@ -/* -* ##% 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 org.apache.tapestry.upload.services.UploadedFile; - -import com.healthmarketscience.rmiio.RemoteInputStreamServer; -import com.healthmarketscience.rmiio.SimpleRemoteInputStream; - -import fr.cemagref.simexplorer.is.ui.web.SimExplorerWebException; -import fr.cemagref.simexplorer.is.ui.web.pages.security.UserPage; -import fr.cemagref.simexplorer.is.ui.web.services.RemoteStorageService; - -public class ApplicationImport extends UserPage { - - private UploadedFile fileEA; - private UploadedFile fileLib; - - public UploadedFile getFileEA() { - return fileEA; - } - - public void setFileEA(UploadedFile fileEA) { - this.fileEA = fileEA; - } - - public UploadedFile getFileLib() { - return fileLib; - } - - public void setFileLib(UploadedFile fileLib) { - this.fileLib = fileLib; - } - - public void onSuccess() { - if (fileEA != null) { - RemoteInputStreamServer zipRemoteStream = new SimpleRemoteInputStream( - fileEA.getStream()); - try { - RemoteStorageService.getStorageService().saveElement(getToken(), - zipRemoteStream.export()); - } catch (Exception e) { - throw new SimExplorerWebException(); - } - } - } - - public String getWindowTitle() { - return ""; - } - -} 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-28 13:00:46 UTC (rev 552) +++ trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementDetail.java 2008-01-28 16:37:53 UTC (rev 553) @@ -19,9 +19,11 @@ import java.io.InputStream; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.StringTokenizer; +import java.util.Map.Entry; import org.apache.tapestry.ComponentResources; import org.apache.tapestry.Link; @@ -33,6 +35,7 @@ import com.healthmarketscience.rmiio.RemoteInputStream; import com.healthmarketscience.rmiio.RemoteInputStreamClient; +import fr.cemagref.simexplorer.is.contenttype.ContentType; import fr.cemagref.simexplorer.is.entities.data.Code; import fr.cemagref.simexplorer.is.entities.data.Component; import fr.cemagref.simexplorer.is.entities.data.Constant; @@ -73,31 +76,6 @@ return nodes; } - private Object downloadElement(String uuid, String version) { - StreamResponse response; - - try { - 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"); - } catch (Exception e) { - throw new SimExplorerWebException(e); - } - - return response; - } - - public Object onDownload(String context) { - StringTokenizer st = new StringTokenizer(context, ","); - String uuid = st.nextToken(); - String version = st.nextToken(); - return downloadElement(uuid, version); - } - private TreeNode generateElement() { TreeNode node = null; if (getElement() instanceof ExplorationApplication) { @@ -128,9 +106,9 @@ node.setType(TreeNode.TYPE_FOLDER); node.setColumns(generateStringArray("Application exploration", - getMetadata().getName(), getElement() - .getMetaData().getVersion().toString(), getElement() - .getMetaData(), "export", "history", "delete")); + getMetadata().getName(), getElement().getMetaData() + .getVersion().toString(), getElement().getMetaData(), + true, "export", "history", "delete")); List<TreeNode> children = new ArrayList<TreeNode>(); TreeNode node1 = new TreeNode(); @@ -170,7 +148,7 @@ explorationDataNode.setColumns(generateStringArray("Exploration data", explorationData.getMetaData().getName(), explorationData .getMetaData().getVersion().toString(), explorationData - .getMetaData(), "history", "delete")); + .getMetaData(), true, "history", "delete")); List<TreeNode> children = new ArrayList<TreeNode>(); @@ -207,7 +185,7 @@ res.setType(TreeNode.TYPE_DOCUMENT); res.setColumns(generateStringArray("Result", "", "", explorationData - .getMetaData(), "download")); + .getMetaData(), false, "export")); return res; } @@ -233,9 +211,11 @@ TreeNode componentNode = new TreeNode(); componentNode.setType(TreeNode.TYPE_FOLDER); - componentNode.setColumns(generateStringArray("Component", component - .getMetaData().getName(), component.getMetaData().getVersion() - .toString(), component.getMetaData(), "history", "delete")); + componentNode + .setColumns(generateStringArray("Component", component + .getMetaData().getName(), component.getMetaData() + .getVersion().toString(), component.getMetaData(), + true, "history", "delete")); List<TreeNode> children = new ArrayList<TreeNode>(); @@ -263,7 +243,7 @@ node = initNode(); node.setColumns(generateStringArray("Libraries", "", "")); - node.setChildren(generateLibraries(component.getLibraries())); + node.setChildren(generateLibraries(component)); children.add(node); @@ -271,18 +251,19 @@ return componentNode; } - private List<TreeNode> generateLibraries(Set<Library> libraries) { + private List<TreeNode> generateLibraries(Component component) { + Set<Library> libraries = component.getLibraries(); + List<TreeNode> res = new ArrayList<TreeNode>(); int i = 0; for (Library library : libraries) { TreeNode node = new TreeNode(); node.setType(TreeNode.TYPE_DOCUMENT); - node - .setColumns(generateStringArray("Library", library - .getMetaData().getName(), library.getMetaData() - .getVersion().toString(), library.getMetaData(), - "download")); + node.setColumns(generateStringArray("Library", library + .getMetaData().getName(), library.getMetaData() + .getVersion().toString(), component.getMetaData(), false, + "export")); res.add(node); } Modified: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementExport.java =================================================================== --- trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementExport.java 2008-01-28 13:00:46 UTC (rev 552) +++ trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementExport.java 2008-01-28 16:37:53 UTC (rev 553) @@ -22,15 +22,25 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.StringTokenizer; +import java.util.Map.Entry; import org.apache.tapestry.StreamResponse; +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; +import fr.cemagref.simexplorer.is.contenttype.ContentType; +import fr.cemagref.simexplorer.is.entities.data.Component; +import fr.cemagref.simexplorer.is.entities.data.ExplorationApplication; +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.metadata.MetaDataEntity; import fr.cemagref.simexplorer.is.ui.web.SimExplorerWebException; import fr.cemagref.simexplorer.is.ui.web.services.RemoteStorageService; @@ -38,10 +48,8 @@ import fr.cemagref.simexplorer.is.ui.web.tools.DownloadableFile; import fr.cemagref.simexplorer.is.ui.web.tools.XMLAttachment; -public class ElementExport extends ElementPage { +public class ElementExport extends ElementPageDetail { - private DownloadableFile attachment; - public String getWindowTitle() { return ""; } @@ -70,14 +78,17 @@ return response; } - public Object onActionFromDownloadFile(String fileName) { + public Object onDownloadFile(String context) { StreamResponse response; try { - MetaDataEntity mde = getMetadata(); + StringTokenizer st = new StringTokenizer(context, ","); + String uuid = st.nextToken(); + String version = st.nextToken(); + String fileName = st.nextToken(); + RemoteInputStream ris = RemoteStorageService.getStorageService() - .retrieveData(getToken(), mde.getUuid(), - mde.getVersion().toString(), fileName); + .retrieveData(getToken(), uuid, version, fileName); InputStream stream = RemoteInputStreamClient.wrap(ris); response = new AttachmentStreamResponse(stream, fileName); @@ -88,23 +99,172 @@ return response; } - public List<DownloadableFile> getAttachments() { - Set<String> attachments = getMetadata().getAttachments().keySet(); - List<DownloadableFile> result = new ArrayList<DownloadableFile>(); - for (String attachment : attachments) { - DownloadableFile file = new DownloadableFile(); - file.setFilename(attachment); - result.add(file); - } + /** + * Headers of tree grid + * + * @return Headers + */ + public List<String> getHeaders() { + List<String> result = new ArrayList<String>(); + result.add("Type"); + result.add("Name"); + result.add("File"); + result.add(""); return result; } - public DownloadableFile getAttachment() { - return attachment; + public List<TreeNode> getNodes() { + List<TreeNode> nodes = new ArrayList<TreeNode>(); + nodes.add(generateNodes()); + return nodes; } - public void setAttachment(DownloadableFile attachment) { - this.attachment = attachment; + private TreeNode generateNodes() { + TreeNode node = null; + if (getElement() instanceof ExplorationApplication) { + node = generateExplorationApplication(); + } + if (getElement() instanceof ExplorationData) { + node = generateExplorationData((ExplorationData) getElement()); + } + if (getElement() instanceof Component) { + node = generateComponent((Component) getElement()); + } + return node; } + private TreeNode generateExplorationApplication() { + TreeNode node; + node = new TreeNode(); + + node.setType(TreeNode.TYPE_FOLDER); + + node.setColumns(generateStringArray("Application exploration", + getMetadata().getName())); + + List<TreeNode> children = new ArrayList<TreeNode>(); + TreeNode node1 = new TreeNode(); + node1.setType(TreeNode.TYPE_FOLDER); + node1.setColumns(generateStringArray("Components")); + node1 + .setChildren(generateComponents((ExplorationApplication) getElement())); + children.add(node1); + + TreeNode node2 = new TreeNode(); + node2.setType(TreeNode.TYPE_FOLDER); + node2.setColumns(generateStringArray("Explorations")); + node2 + .setChildren(generateExplorations((ExplorationApplication) getElement())); + children.add(node2); + + node.setChildren(children); + return node; + } + + private List<TreeNode> generateExplorations( + ExplorationApplication explorationApplication) { + List<TreeNode> res = new ArrayList<TreeNode>(); + int i = 0; + for (ExplorationData explorationData : explorationApplication + .getExplorations()) { + res.add(generateExplorationData(explorationData)); + i++; + } + return res; + } + + private TreeNode generateExplorationData(ExplorationData explorationData) { + TreeNode explorationDataNode = new TreeNode(); + explorationDataNode.setType(TreeNode.TYPE_FOLDER); + + explorationDataNode.setColumns(generateStringArray("Exploration data", + explorationData.getMetaData().getName())); + + List<TreeNode> children = new ArrayList<TreeNode>(); + + Map<String, ContentType> attachments = explorationData.getMetaData() + .getAttachments(); + + for (Map.Entry<String, ContentType> kv : attachments.entrySet()) { + children.add(generateDownload(explorationData, kv)); + } + explorationDataNode.setChildren(children); + + return explorationDataNode; + } + + private List<TreeNode> generateComponents( + ExplorationApplication explorationApplication) { + Set<Component> components = explorationApplication.getComponents(); + List<TreeNode> res = new ArrayList<TreeNode>(); + + for (Component component : components) { + res.add(generateComponent(component)); + } + + return res; + } + + private TreeNode generateComponent(Component component) { + TreeNode componentNode = new TreeNode(); + componentNode.setType(TreeNode.TYPE_FOLDER); + + componentNode.setColumns(generateStringArray("Component", component + .getMetaData().getName())); + + List<TreeNode> children = new ArrayList<TreeNode>(); + + TreeNode node = null; + + node = new TreeNode(); + node.setType(TreeNode.TYPE_FOLDER); + + node.setColumns(generateStringArray("Libraries")); + node.setChildren(generateLibraries(component.getLibraries())); + + children.add(node); + + componentNode.setChildren(children); + return componentNode; + } + + private List<TreeNode> generateLibraries(Set<Library> libraries) { + List<TreeNode> res = new ArrayList<TreeNode>(); + int i = 0; + for (Library library : libraries) { + TreeNode node = new TreeNode(); + node.setType(TreeNode.TYPE_FOLDER); + + Map<String, ContentType> attachments = library.getMetaData() + .getAttachments(); + List<TreeNode> children = new ArrayList<TreeNode>(); + for (Map.Entry<String, ContentType> kv : attachments.entrySet()) { + children.add(generateDownload(library, kv)); + } + node.setChildren(children); + + node.setColumns(generateStringArray("Library", library + .getMetaData().getName())); + + res.add(node); + } + return res; + } + + private TreeNode generateDownload(LoggableElement explorationData, + Entry<String, ContentType> kv) { + TreeNode node = new TreeNode(); + node.setType(TreeNode.TYPE_DOCUMENT); + + String context = explorationData.getMetaData().getUuid() + "," + + explorationData.getMetaData().getVersion() + "," + + kv.getKey(); + + node + .setColumns(generateStringArray(kv.getValue().getDescription(), + kv.getKey(), generateString(kv.getKey(), + "downloadFile", context))); + return node; + } + } Modified: 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 2008-01-28 13:00:46 UTC (rev 552) +++ trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementHistory.java 2008-01-28 16:37:53 UTC (rev 553) @@ -142,7 +142,7 @@ // FIXME date tostring node.setColumns(generateStringArray(mde.getVersion().toString(), mde .getDescription(), mde.getCreationDate().toString(), mde, - "export", "delete", "details")); + false, "export", "delete", "details")); node.setObject(mde.getVersion()); node.setType(TreeNode.TYPE_DOCUMENT); return node; Copied: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementImport.java (from rev 552, trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ApplicationImport.java) =================================================================== --- trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementImport.java (rev 0) +++ trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementImport.java 2008-01-28 16:37:53 UTC (rev 553) @@ -0,0 +1,77 @@ +/* +* ##% 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 org.apache.tapestry.upload.services.UploadedFile; + +import com.healthmarketscience.rmiio.RemoteInputStreamServer; +import com.healthmarketscience.rmiio.SimpleRemoteInputStream; + +import fr.cemagref.simexplorer.is.ui.web.SimExplorerWebException; +import fr.cemagref.simexplorer.is.ui.web.pages.security.UserPage; +import fr.cemagref.simexplorer.is.ui.web.services.RemoteStorageService; + +public class ElementImport extends UserPage { + + private UploadedFile fileEA; + private UploadedFile fileLib; + + public UploadedFile getFileEA() { + return fileEA; + } + + public void setFileEA(UploadedFile fileEA) { + this.fileEA = fileEA; + } + + public UploadedFile getFileLib() { + return fileLib; + } + + public void setFileLib(UploadedFile fileLib) { + this.fileLib = fileLib; + } + + public void onSuccess() { + if (fileEA != null) { + RemoteInputStreamServer zipRemoteStream = new SimpleRemoteInputStream( + fileEA.getStream()); + try { + RemoteStorageService.getStorageService().saveElement( + getToken(), zipRemoteStream.export()); + } catch (Exception e) { + throw new SimExplorerWebException(); + } + } + if (fileLib != null) { + RemoteInputStreamServer zipRemoteStream = new SimpleRemoteInputStream( + fileLib.getStream()); + try { + RemoteStorageService.getStorageService().saveElement( + getToken(), zipRemoteStream.export()); + } catch (Exception e) { + throw new SimExplorerWebException(); + } + } + } + + public String getWindowTitle() { + return ""; + } + +} Modified: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementPageDetail.java =================================================================== --- trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementPageDetail.java 2008-01-28 13:00:46 UTC (rev 552) +++ trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementPageDetail.java 2008-01-28 16:37:53 UTC (rev 553) @@ -89,9 +89,8 @@ return elementDetail; } - private String generateString(String actionCaption, String action, - MetaDataEntity element) { - String context = element.getUuid() + "," + element.getVersion(); + protected String generateString(String actionCaption, String action, + String context) { Link link = resources.createActionLink(action, false, context); StringBuffer sb = new StringBuffer(""); sb.append("<a href=\""); @@ -102,7 +101,14 @@ return sb.toString(); } - private String generateActions(MetaDataEntity element, String... actions) { + protected String generateString(String actionCaption, String action, + MetaDataEntity element) { + String context = element.getUuid() + "," + element.getVersion(); + return generateString(actionCaption, action, context); + } + + private String generateActions(MetaDataEntity element, boolean security, + String... actions) { StringBuilder sb = new StringBuilder(""); String res; @@ -110,23 +116,25 @@ sb.append("<br>"); sb.append(generateString(anAction, anAction, element)); } - sb.append("<br>"); - // TODO add security - sb.append(generateString("rights", "rights", element)); + if (security) { + sb.append("<br>"); + // TODO add security + sb.append(generateString("rights", "rights", element)); + } res = sb.substring(4); return res; } protected String[] generateStringArray(String s1, String s2, String s3, - MetaDataEntity element, String... actions) { + MetaDataEntity element, boolean security, String... actions) { List<String> result = new ArrayList<String>(); result.add(s1); result.add(s2); result.add(s3); String s4 = ""; if (element != null) { - s4 = generateActions(element, actions); + s4 = generateActions(element, security, actions); } result.add(s4); Modified: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ExceptionReport.java =================================================================== --- trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ExceptionReport.java 2008-01-28 13:00:46 UTC (rev 552) +++ trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ExceptionReport.java 2008-01-28 16:37:53 UTC (rev 553) @@ -47,13 +47,14 @@ public String getWindowTitle() { return "Error"; } - + public void reportException(Throwable exception) { - if (exception instanceof SimExplorerWebException) { + SimExplorerWebException simException = getException(exception); + if (simException != null) { // unknown = false; // FIXME debug mode - unknown = true; - this.exception = (SimExplorerWebException) exception; + unknown = false; + this.exception = simException; } else { unknown = true; ExceptionAnalysis analysis = analyzer.analyze(exception); @@ -61,8 +62,23 @@ } } + private SimExplorerWebException getException(Throwable exception) { + if (exception != null) { + if (exception instanceof SimExplorerWebException) { + SimExplorerWebException result = (SimExplorerWebException) exception; + return result; + } + return getException(exception.getCause()); + } + return null; + } + public String getErrorMessage() { - return "Custom message describing error."; + if (!unknown) { + return exception.getMessage(); + } else { + return ""; + } } public boolean getShowPropertyList() { @@ -71,11 +87,10 @@ .isEmpty()); } - public Object getPropertyValue() - { + public Object getPropertyValue() { return info.getProperty(propertyName); } - + public List<ExceptionInfo> getStack() { return stack; } Modified: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/tools/DownloadableFile.java =================================================================== --- trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/tools/DownloadableFile.java 2008-01-28 13:00:46 UTC (rev 552) +++ trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/tools/DownloadableFile.java 2008-01-28 16:37:53 UTC (rev 553) @@ -17,8 +17,11 @@ * ##% */ package fr.cemagref.simexplorer.is.ui.web.tools; +import fr.cemagref.simexplorer.is.entities.metadata.MetaDataEntity; + public class DownloadableFile { + private MetaDataEntity metaDataEntity; private String filename; public String getFilename() { @@ -29,4 +32,12 @@ this.filename = filename; } + public MetaDataEntity getMetaDataEntity() { + return metaDataEntity; + } + + public void setMetaDataEntity(MetaDataEntity metaDataEntity) { + this.metaDataEntity = metaDataEntity; + } + } Deleted: trunk/simexplorer-is-web/src/main/webapp/ApplicationImport.tml =================================================================== --- trunk/simexplorer-is-web/src/main/webapp/ApplicationImport.tml 2008-01-28 13:00:46 UTC (rev 552) +++ trunk/simexplorer-is-web/src/main/webapp/ApplicationImport.tml 2008-01-28 16:37:53 UTC (rev 553) @@ -1,20 +0,0 @@ -<t:layout xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd" - title="${windowtitle}"> - - <t:form> - <t:errors/> - - <h1 class="Title">${message:explorationapplication}</h1> - - <input t:type="upload" t:id="fileEA"/> - <br/> - - <h1 class="Title">${message:library}</h1> - - <input t:type="upload" t:id="fileLib"/> - <br/> - - <input type="submit" value="${message:upload}"/> - </t:form> - -</t:layout> Modified: trunk/simexplorer-is-web/src/main/webapp/ElementExport.tml =================================================================== --- trunk/simexplorer-is-web/src/main/webapp/ElementExport.tml 2008-01-28 13:00:46 UTC (rev 552) +++ trunk/simexplorer-is-web/src/main/webapp/ElementExport.tml 2008-01-28 16:37:53 UTC (rev 553) @@ -7,15 +7,8 @@ <p> <h2>${message:attachments}</h2> </p> - <p>${message:download}</p> <p> - <table t:type="Grid" source="attachments" row="attachment"> - <t:parameter name="empty"> - noAttachment ${message:noAttachment} - </t:parameter> - <t:parameter name="filenameCell"> - <t:actionlink t:id="downloadFile" context="${attachment.filename}">${attachment.filename}</t:actionlink> - </t:parameter> + <table t:type="cl/TreeGrid" source="nodes" columnHeaders="headers"> </table> </p> Copied: trunk/simexplorer-is-web/src/main/webapp/ElementImport.tml (from rev 552, trunk/simexplorer-is-web/src/main/webapp/ApplicationImport.tml) =================================================================== --- trunk/simexplorer-is-web/src/main/webapp/ElementImport.tml (rev 0) +++ trunk/simexplorer-is-web/src/main/webapp/ElementImport.tml 2008-01-28 16:37:53 UTC (rev 553) @@ -0,0 +1,20 @@ +<t:layout xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd" + title="${windowtitle}"> + + <t:form> + <t:errors/> + + <h1 class="Title">${message:explorationapplication}</h1> + + <input t:type="upload" t:id="fileEA"/> + <br/> + + <h1 class="Title">${message:library}</h1> + + <input t:type="upload" t:id="fileLib"/> + <br/> + + <input type="submit" value="${message:upload}"/> + </t:form> + +</t:layout> Modified: trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/components/Layout.tml =================================================================== --- trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/components/Layout.tml 2008-01-28 13:00:46 UTC (rev 552) +++ trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/components/Layout.tml 2008-01-28 16:37:53 UTC (rev 553) @@ -28,7 +28,7 @@ <menu class="menu"> <li><t:actionlink t:id="applicationList">${message:layout-list}</t:actionlink> </li> - <li><t:pagelink page="ApplicationImport">${message:layout-import}</t:pagelink></li> + <li><t:pagelink page="ElementImport">${message:layout-import}</t:pagelink></li> </menu> <t:if test="administrator"> Deleted: trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/pages/ApplicationImport.properties =================================================================== --- trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/pages/ApplicationImport.properties 2008-01-28 13:00:46 UTC (rev 552) +++ trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/pages/ApplicationImport.properties 2008-01-28 16:37:53 UTC (rev 553) @@ -1 +0,0 @@ -windowtitle=Import Copied: trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/pages/ElementImport.properties (from rev 552, trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/pages/ApplicationImport.properties) =================================================================== --- trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/pages/ElementImport.properties (rev 0) +++ trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/pages/ElementImport.properties 2008-01-28 16:37:53 UTC (rev 553) @@ -0,0 +1 @@ +windowtitle=Import