diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..0b14b16 --- /dev/null +++ b/.classpath @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..53cd0a3 --- /dev/null +++ b/.project @@ -0,0 +1,59 @@ + + + speciesdiscovery + speciesdiscovery project + + + + + org.eclipse.wst.jsdt.core.javascriptValidator + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + com.google.gdt.eclipse.core.webAppProjectValidator + + + + + com.google.gwt.eclipse.core.gwtProjectValidator + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.maven.ide.eclipse.maven2Nature + org.eclipse.jdt.core.javanature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.wst.jsdt.core.jsNature + com.google.gwt.eclipse.core.gwtNature + + diff --git a/.settings/.jsdtscope b/.settings/.jsdtscope new file mode 100644 index 0000000..ba3c245 --- /dev/null +++ b/.settings/.jsdtscope @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/.settings/com.google.appengine.eclipse.core.prefs b/.settings/com.google.appengine.eclipse.core.prefs new file mode 100644 index 0000000..a60576c --- /dev/null +++ b/.settings/com.google.appengine.eclipse.core.prefs @@ -0,0 +1,3 @@ +#Thu Jun 16 10:18:26 CEST 2011 +eclipse.preferences.version=1 +filesCopiedToWebInfLib= diff --git a/.settings/com.google.gdt.eclipse.core.prefs b/.settings/com.google.gdt.eclipse.core.prefs new file mode 100644 index 0000000..9f2b8a3 --- /dev/null +++ b/.settings/com.google.gdt.eclipse.core.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +jarsExcludedFromWebInfLib= +lastWarOutDir=/home/backup-old-home/francesco-mangiacrapa/workspace/speciesdiscovery/target/species-discovery-3.0.0-SNAPSHOT +warSrcDir=src/main/webapp +warSrcDirIsOutput=false diff --git a/.settings/com.google.gwt.eclipse.core.prefs b/.settings/com.google.gwt.eclipse.core.prefs new file mode 100644 index 0000000..c803c44 --- /dev/null +++ b/.settings/com.google.gwt.eclipse.core.prefs @@ -0,0 +1,5 @@ +#Thu Jun 16 11:14:17 CEST 2011 +eclipse.preferences.version=1 +entryPointModules= +filesCopiedToWebInfLib=gwt-servlet.jar +gwtCompileSettings=PGd3dC1jb21waWxlLXNldHRpbmdzPjxsb2ctbGV2ZWw+SU5GTzwvbG9nLWxldmVsPjxvdXRwdXQtc3R5bGU+T0JGVVNDQVRFRDwvb3V0cHV0LXN0eWxlPjxleHRyYS1hcmdzPjwhW0NEQVRBWy13YXIgc3JjL21haW4vd2ViYXBwXV0+PC9leHRyYS1hcmdzPjx2bS1hcmdzPjwhW0NEQVRBWy1YbXg1MTJtXV0+PC92bS1hcmdzPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLmNvbXBhbnkuU29tZU1vZHVsZTwvZW50cnktcG9pbnQtbW9kdWxlPjwvZ3d0LWNvbXBpbGUtc2V0dGluZ3M+ diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..29abf99 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,6 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 +encoding//src/test/java=UTF-8 +encoding//src/test/resources=UTF-8 +encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..69c31cd --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component new file mode 100644 index 0000000..ab964ba --- /dev/null +++ b/.settings/org.eclipse.wst.common.component @@ -0,0 +1,15 @@ + + + + + + + uses + + + uses + + + + + diff --git a/.settings/org.eclipse.wst.common.project.facet.core.xml b/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000..fefc63a --- /dev/null +++ b/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/.settings/org.eclipse.wst.jsdt.ui.superType.container b/.settings/org.eclipse.wst.jsdt.ui.superType.container new file mode 100644 index 0000000..3bd5d0a --- /dev/null +++ b/.settings/org.eclipse.wst.jsdt.ui.superType.container @@ -0,0 +1 @@ +org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/.settings/org.maven.ide.eclipse.prefs b/.settings/org.maven.ide.eclipse.prefs new file mode 100644 index 0000000..c74c58e --- /dev/null +++ b/.settings/org.maven.ide.eclipse.prefs @@ -0,0 +1,9 @@ +#Thu Sep 02 10:42:12 CEST 2010 +activeProfiles= +eclipse.preferences.version=1 +fullBuildGoals=process-test-resources +includeModules=false +resolveWorkspaceProjects=true +resourceFilterGoals=process-resources resources\:testResources +skipCompilerPlugin=true +version=1 diff --git a/SpeciesDiscoveryTest-dev.launch b/SpeciesDiscoveryTest-dev.launch new file mode 100644 index 0000000..546b1d2 --- /dev/null +++ b/SpeciesDiscoveryTest-dev.launch @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/SpeciesDiscoveryTest-prod.launch b/SpeciesDiscoveryTest-prod.launch new file mode 100644 index 0000000..f4cb15a --- /dev/null +++ b/SpeciesDiscoveryTest-prod.launch @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/distro/INSTALL b/distro/INSTALL new file mode 100644 index 0000000..fb73de1 --- /dev/null +++ b/distro/INSTALL @@ -0,0 +1,2 @@ +Use the respective war file of this component + \ No newline at end of file diff --git a/distro/LICENSE b/distro/LICENSE new file mode 100644 index 0000000..cdb5851 --- /dev/null +++ b/distro/LICENSE @@ -0,0 +1,7 @@ +gCube System - License +------------------------------------------------------------ + +The gCube/gCore software is licensed as Free Open Source software conveying to the EUPL (http://ec.europa.eu/idabc/eupl). +The software and documentation is provided by its authors/distributors "as is" and no expressed or +implied warranty is given for its use, quality or fitness for a particular case. + diff --git a/distro/MAINTAINERS b/distro/MAINTAINERS new file mode 100644 index 0000000..e01a9f2 --- /dev/null +++ b/distro/MAINTAINERS @@ -0,0 +1,5 @@ +Mantainers +------- + +* Federico De Faveri (federico.defaveri@isti.cnr.it), CNR Pisa, Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo" +* Francesco Mangiacrapa (francesco.mangiacrapa@isti.cnr.it), CNR Pisa, Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo" diff --git a/distro/README b/distro/README new file mode 100644 index 0000000..76f6d3a --- /dev/null +++ b/distro/README @@ -0,0 +1,51 @@ +The gCube System - Species Discovery +------------------------------------------------------------ + +This work is partially funded by the European Commission in the +context of the D4Science project (www.d4science.eu), under the 1st call of FP7 IST priority. + + +Authors +------- + +* Federico De Faveri (federico.defaveri@isti.cnr.it), CNR Pisa, + Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo". + + * Francesco Mangiacrapa (francesco.mangiacrapa@isti.cnr.it), CNR Pisa, + Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo". + + +Version and Release Date +------------------------ +v. 3.0.0 + +Description +----------- + +The Species Discovery lets the users discovery species information from the Species Service. + + +Download information +-------------------- + +Source code is available from SVN: +https://svn.d4science-ii.research-infrastructures.eu/gcube/trunk/portlets/user/SpeciesDiscovery + +Binaries can be downloaded from: +n/a + + +Documentation +------------- +Documentation is available on-line from the Projects Documentation Wiki: + +https://gcube.wiki.gcube-system.org/gcube/index.php + +Licensing +--------- + +This software is licensed under the terms you may find in the file named "LICENSE" in this directory. + + + + diff --git a/distro/changelog.xml b/distro/changelog.xml new file mode 100644 index 0000000..541a0c4 --- /dev/null +++ b/distro/changelog.xml @@ -0,0 +1,20 @@ + + + Ticket #986: Species Occurrence jobs / Re-submit job and "info" + Ticket #1002: SPD portlet persistence refactoring + + + Ticket #508: Implementation of requirements resulting from ticket #508 + + + Ticket #81: Implementation of requirements resulting from user feedback + Dynamic clustering of result set items + Revised the occurrence points visualization strategy through the GIS Viewer + + + Fixed 447: Map generation fails in Species Discovery Portlet + + + First release + + \ No newline at end of file diff --git a/distro/descriptor.xml b/distro/descriptor.xml new file mode 100644 index 0000000..4efc827 --- /dev/null +++ b/distro/descriptor.xml @@ -0,0 +1,48 @@ + + servicearchive + + tar.gz + + / + + + ${distroDirectory} + / + true + + README + LICENSE + INSTALL + MAINTAINERS + changelog.xml + + 755 + true + + + target/apidocs + /${artifactId}/doc/api + true + 755 + + + + + ${distroDirectory}/profile.xml + ./ + true + + + target/${build.finalName}.war + /${artifactId} + + + ${distroDirectory}/svnpath.txt + /${artifactId} + true + + + \ No newline at end of file diff --git a/distro/profile.xml b/distro/profile.xml new file mode 100644 index 0000000..51c3b6b --- /dev/null +++ b/distro/profile.xml @@ -0,0 +1,25 @@ + + + + Service + + ${description} + PortletUser + ${artifactId} + ${version} + + + ${artifactId} + ${version} + + ${groupId} + ${artifactId} + ${version} + + + target/${build.finalName}.war + + + + + diff --git a/distro/svnpath.txt b/distro/svnpath.txt new file mode 100644 index 0000000..edacb04 --- /dev/null +++ b/distro/svnpath.txt @@ -0,0 +1 @@ +${scm.url} \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..0e5aebe --- /dev/null +++ b/pom.xml @@ -0,0 +1,381 @@ + + 4.0.0 + + maven-parent + org.gcube.tools + 1.0.0 + + + + + + + eclipselink + http://maven.research-infrastructures.eu:8081/nexus/content/repositories/eclipselink/ + + + + org.gcube.portlets.user + species-discovery + war + 3.0.0-SNAPSHOT + gCube Species Discovery + + gCube Species Discovery Portlet lets the users discovery species information from the Species Service. + + + scm:svn:http://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/${project.artifactId} + scm:https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/${project.artifactId} + http://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/${project.artifactId} + + + + 2.4.0 + distro + + 1.6 + 1.6 + ${project.build.directory}/${project.build.finalName} + + UTF-8 + UTF-8 + + + + + + + org.gcube.data.spd + spd-client-library + [2.0.0-SNAPSHOT, 3.0.0-SNAPSHOT) + + + + org.gcube.data.spd + spql-parser + [1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT) + + + + org.gcube.common + csv4j + [1.1.0-SNAPSHOT, 2.0.0-SNAPSHOT) + provided + + + + org.gcube.data.spd + spd-model + [1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT) + provided + + + + org.gcube.resources.discovery + discovery-client + [1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT) + provided + + + + + org.eclipse.persistence + eclipselink + 2.4.0 + + + + + org.gcube.contentmanagement + storage-manager-wrapper + [1.0.1-SNAPSHOT, 2.0.0-SNAPSHOT) + provided + + + + org.gcube.contentmanagement + storage-manager-core + [1.0.1-SNAPSHOT, 2.0.0-SNAPSHOT) + provided + + + + + + org.gcube.portlets.user + workspace-light-tree + [2.9.0-SNAPSHOT, 3.0.0-SNAPSHOT) + provided + + + + + org.gcube.portlets.user + gis-viewer + [3.0.0-SNAPSHOT, 4.0.0-SNAPSHOT) + + + + org.gcube.portlets.user + gcube-gis-viewer + [2.0.0-SNAPSHOT, 3.0.0-SNAPSHOT) + + + + org.gwtopenmaps.openlayers + gwt-openlayers-client + 0.6 + provided + + + + + com.allen-sauer.gwt.log + gwt-log + 3.1.7 + + + + + com.h2database + h2 + 1.3.166 + provided + + + + + xerces + xercesImpl + 2.9.1 + provided + + + + com.google.gwt + gwt-user + ${gwtVersion} + provided + + + com.google.gwt + gwt-servlet + ${gwtVersion} + provided + + + com.sencha.gxt + gxt + 2.2.5 + provided + + + org.gcube.core + gcf + [1.4.0-SNAPSHOT, 2.0.0-SNAPSHOT) + provided + + + org.gcube.portlets.user + gcube-widgets + [1.4.0-SNAPSHOT, 2.0.0-SNAPSHOT) + provided + + + org.gcube.portal + custom-portal-handler + [1.2.0-SNAPSHOT, 2.0.0-SNAPSHOT) + provided + + + + org.gcube.applicationsupportlayer + aslcore + [3.2.0-SNAPSHOT, 4.0.0-SNAPSHOT) + provided + + + org.gcube.portal + social-networking-library + [1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT) + provided + + + org.gcube.portlets.user + workspace-tree-widget + [6.0.0-SNAPSHOT, 7.0.0-SNAPSHOT) + provided + + + org.gcube.contentmanagement + storage-resource-link-plugin + 1.0.0-SNAPSHOT + provided + + + org.gcube.portlets.user + home-library + [4.3.0-SNAPSHOT, 5.0.0-SNAPSHOT) + provided + + + org.gcube.portlets.user + home-library-jcr + [1.3.0-SNAPSHOT, 2.0.0-SNAPSHOT) + provided + + + org.gcube.dvos + usermanagement-core + [1.3.0-SNAPSHOT, 2.0.0-SNAPSHOT) + + + com.liferay.portal + portal-service + 6.0.6 + provided + + + javax.portlet + portlet-api + 2.0 + provided + + + org.slf4j + slf4j-log4j12 + 1.6.4 + runtime + + + org.slf4j + slf4j-api + 1.6.4 + runtime + + + junit + junit + 4.7 + test + + + javax.validation + validation-api + 1.0.0.GA + test + + + javax.validation + validation-api + 1.0.0.GA + sources + test + + + + + + ${webappDirectory}/WEB-INF/classes + + + + + + org.codehaus.mojo + gwt-maven-plugin + 2.4.0 + + + + compile + + + + + + + WorkspacePortlet.html + ${webappDirectory} + + + + + + org.apache.maven.plugins + maven-war-plugin + 2.1.1 + + + compile + + exploded + + + + + ${webappDirectory} + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + + + + + org.apache.maven.plugins + maven-assembly-plugin + 2.2 + + + ${distroDirectory}/descriptor.xml + + + + + servicearchive + install + + single + + + + + + org.apache.maven.plugins + maven-resources-plugin + 2.5 + + + copy-profile + install + + copy-resources + + + target + + + ${distroDirectory} + true + + profile.xml + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/META-INF/persistence.xml b/src/main/java/META-INF/persistence.xml new file mode 100644 index 0000000..76b661b --- /dev/null +++ b/src/main/java/META-INF/persistence.xml @@ -0,0 +1,21 @@ + + + + org.gcube.portlets.user.speciesdiscovery.shared.CommonName + org.gcube.portlets.user.speciesdiscovery.shared.Taxon + org.gcube.portlets.user.speciesdiscovery.shared.ResultRow + org.gcube.portlets.user.speciesdiscovery.shared.ItemParameter + org.gcube.portlets.user.speciesdiscovery.shared.Occurrence + org.gcube.portlets.user.speciesdiscovery.shared.TaxonomyRow + org.gcube.portlets.user.speciesdiscovery.shared.OccurrencesJob + org.gcube.portlets.user.speciesdiscovery.shared.TaxonomyJob + + + + + + + diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/ConstantsSpeciesDiscovery.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/ConstantsSpeciesDiscovery.java new file mode 100644 index 0000000..3d02183 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/ConstantsSpeciesDiscovery.java @@ -0,0 +1,115 @@ +package org.gcube.portlets.user.speciesdiscovery.client; + +public final class ConstantsSpeciesDiscovery { + + //USED IN MODEL CLASS + public static final String ID = "id"; + public static final String NAME = "name"; + public static final String ISLEAF = "isLeaf"; + public static final String BASETAXONID = "BaseTaxonID"; + public static final String BASETAXONNAME= "BaseTaxon"; + public static final String COUNTOF = "CountOf"; + public static final String RANK = "Rank"; +// public static final String GROUPEDIDLIST = "GroupedIDList"; + + //USED IN CLASSIFICATION FILTER + public static final String BIOTACLASSID = "BiotaID"; + public static final String BIOTACLASS = "Biota"; + public static final String ANIMALIACLASSID = "AnimaliaID"; + public static final String ANIMALIACLASS = "Animalia"; + public static final String PLANTEACLASSID = "PlanteaID"; + public static final String PLANTEACLASS = "Plantea"; + public static final String UNKNOWN = "Unknown"; + public static final String UNKNOWNID = "UnknownID"; + + //USED IN GRID + public static final String NORESULTS = "No results"; + public static final String NONE = "None"; + public static final String FILTER = "Filter: "; + public static final String REMOVEFILTERTOOLTIP = "Remove current filter"; + public static final String VIEWDETAILS = "View Details (Only selected)"; + public static final String SELECTALL = "Check All Rows"; + public static final String DESELECTALL = "Uncheck All Rows"; + + //USED IN CLASSIFICATION FILTER +// public static final String[] MAIN_TAXONOMIC_RANK = new String[]{"kingdom", "phylum", "class", "order", "family", "genus", "species"}; + public static final String GROUPBYRANK = "Group results by"; + + + public static final String LOADINGSTYLE = "x-mask-loading"; + public static final String SORTMESSAGE = "Sort filter in alphabetical order (from A to Z)"; + public static final String REQUEST_DATA = "request data..."; + + //USED IN SEARCH BORDER LAYPUT PANEL + public final static int JOBPOLLINGMILLISECONDS = 20000; + + //USED IN SEARCH FORM PANEL + protected static final String OCCURENCES = "Occurences"; + protected static final String CLASSIFICATION = "Classification"; + protected static final String COMMON_NAME = "Common name"; + protected static final String SCIENTIFIC_NAME = "Scientific name"; + + //USED IN ADAVANCED FILTERT + public static final String AVAILABLEFILTERBOUND = "Bounds filters (lower-upper) are available with following plug-in"; + public static final String AVAILABLEFILTERDATE = "Date filter (from-to) is available with following plug-in"; + public static final String AVAILABLEDATASOURCES = "Occurence points and classification search are available with following plug-in"; + + //USED IN GISVIEWER + public static final String LME = "lme"; + public static final String FAOAREA = "faoarea"; + public static final String EEZALL = "eezall"; + public static final String SST_AN_MEAN = "sstAnMean"; + public static final String SALINITY_MEAN = "salinityMean"; + public static final String PRIM_PROD_MEAN = "primProdMean"; + public static final String ENVIRONMENTS = "environments"; + public static final String DEPTH_MEAN_ANNUAL = "DepthMeanAnnual"; + public static final String WORLD_BORDERS = "worldborders"; + + //ELAPSED TIME FORMATTER + public static final String TIME_ZONE_UTC = "UTC"; + public static final String TIMEFORMAT_HH_MM_SS = "HH:mm:ss"; + + //USED IN SERVER/SHARED PACKAGE + public static final String NULL = "null"; + public static final String UNDEFINED = "Undefined"; + public static final String NOT_FOUND = "not found"; + public static int LIMIT_ITEM_DETAILS = 100; + + //USED IN VIEW DETAILSWINDOW + public static final String THE_MAX_NUMBER_OF_ITEMS_DISPLAYABLE_IS = "The max number of items displayable is "; + public static final String ROW_LIMIT_REACHED = "Row limit reached"; + public static final String SAVE_OCCURENCES_POINTS_FROM_SELECTED_RESULTS = "Save occurences points from selected results."; + public static final String SAVES_IN_CSV_FILE_FORMAT = "Saves in CSV file format"; + public static final String CSV = "CSV"; + public static final String SAVES_IN_DARWIN_CORE_FILE_FORMAT = "Saves in Darwin Core file format"; + public static final String DARWIN_CORE = "Darwin Core"; + public static final String OPEN_MODELLER_BY_DATA_SOURCE = "openModeller CSV (by Data Source)"; + public static final String OPEN_MODELLER = "openModeller CSV"; + public static final String PLAIN_CSV_BY_DATA_SOURCE = "plain CSV (by Data Source)"; + public static final String PLAIN_CSV = "plain CSV"; + public static final String SAVE_OCCURRENCES = "Save Occurrences"; + public static final String SHOW_IN_GIS_VIEWER = "Show in Gis Viewer"; +// public static final String SAVES_IN_DARWIN_CORE_ARCHIVE_FORMAT = "Saves in Darwin Core Archive format"; +// public static final String DARWIN_CORE_ARCHIVE = "Darwin Core Archive"; + public static final String SAVE_TAXONOMY_ITEMS = "Save Taxonomy Items"; + public final static String DETAILS = "Details"; + public final static String OCCURRENCEPOINTS = "Occurrence points"; + public final static int SCHEDULE_MILLIS_COUNT_OCCURRENCES = 2500; + public static final int PAGE_SIZE = 25; + public final static String DEFAULTLANGUAGE = "English"; + public final static String BYSCIENTIFICNAME = "by scientific name"; + public final static String SCIENTIFICNAME = "Scientific name"; + public final static String BYCOMMONNAME = "by common name"; + public static final String CAN_NO_BE_RE_SUBMITTED_UNTIL_IT_HAS_COMPLETED = "can no be re-submitted until it has completed!"; + public static final String MESSAGE_CONFIRM_DELETE_JOB = "Are you sure you want to delete the job"; + public static final String CONFIRM_DELETE = "Confirm delete"; + public static final String ALERT = "Alert"; + public static final String IS_NOT_COMPLETED = " is not completed!"; + + //USED IN TABLE FOR TAXONOMY ROW + public static final String SAVES_IN_DARWIN_CORE_ARCHIVE_FORMAT = "Saves in Darwin Core Archive format"; + public static final String DARWIN_CORE_ARCHIVE = "Darwin Core Archive"; + public static final String SAVES_TAXONOMY_CHILDREN_FROM_RESULT = "Saves taxonomy children from result."; + public static final String SAVE_TAXONOMY_CHILDREN = "Save Taxonomy Children"; + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/OccurrencesWindow.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/OccurrencesWindow.java new file mode 100644 index 0000000..bb244e1 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/OccurrencesWindow.java @@ -0,0 +1,120 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.util.GridField; +import org.gcube.portlets.user.speciesdiscovery.client.util.OccurencesGridFields; +import org.gcube.portlets.user.speciesdiscovery.client.util.Util; +import org.gcube.portlets.user.speciesdiscovery.client.util.stream.DataSourceManager; +import org.gcube.portlets.user.speciesdiscovery.client.util.stream.StreamPagingLoader; +import org.gcube.portlets.user.speciesdiscovery.client.util.stream.StreamPagingToolBar; +import org.gcube.portlets.user.speciesdiscovery.shared.SpeciesCapability; + +import com.allen_sauer.gwt.log.client.Log; +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.widget.Window; +import com.extjs.gxt.ui.client.widget.grid.ColumnConfig; +import com.extjs.gxt.ui.client.widget.grid.ColumnModel; +import com.extjs.gxt.ui.client.widget.grid.Grid; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.core.client.Scheduler.ScheduledCommand; +import com.google.gwt.user.client.rpc.AsyncCallback; + + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class OccurrencesWindow extends Window { + + protected static final String OCCURRENCE_POINTS = "Occurrence points"; + + protected static final int PAGE_SIZE = 20; + + protected StreamPagingLoader loader; + protected int count = 0; + private DataSourceManager dataSourceManager; + + + public OccurrencesWindow() + { + setHeading(OCCURRENCE_POINTS); + setLayout(new FitLayout()); + setModal(true); + setResizable(true); + setSize(1200, 500); + + this.dataSourceManager = DataSourceManager.getInstance(); + + List config = new ArrayList(); + + for (GridField field:OccurencesGridFields.values()) config.add(Util.createColumnConfig(field, 150)); + + final ColumnModel cm = new ColumnModel(config); + + initLoader(); + + + Grid grid = new Grid(loader.getStore(), cm); + grid.setBorders(true); + + StreamPagingToolBar toolBar = new StreamPagingToolBar(); + toolBar.bind(loader); + + setBottomComponent(toolBar); + + add(grid); + } + + protected void initLoader() + { + loader = new StreamPagingLoader(PAGE_SIZE); + loader.setDataSource(this.dataSourceManager.getDataSourceByResultType(SpeciesCapability.OCCURRENCESPOINTS)); + } + + public void loadOccurences() + { + Log.trace("Loading occurrences"); + + count = 0; + + dataSourceManager.setExpectedOccurencePoints(count); + + SpeciesDiscovery.taxonomySearchService.retrieveOccurencesFromSelection(new AsyncCallback() { + + @Override + public void onSuccess(Integer expectedPoints) { + Log.trace("Expected points: "+expectedPoints); + dataSourceManager.setExpectedOccurencePoints(expectedPoints); + count = expectedPoints; + loader.startLoading(true); + } + + @Override + public void onFailure(Throwable caught) { + System.err.println("Error getting occurences"); + } + }); + } + + /** + * {@inheritDoc} + */ + @Override + protected void onHide() { + super.onHide(); + Scheduler.get().scheduleDeferred(new ScheduledCommand() { + + @Override + public void execute() { + loader.reset(); + } + }); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/SearchBorderLayoutPanel.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/SearchBorderLayoutPanel.java new file mode 100644 index 0000000..a4079dd --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/SearchBorderLayoutPanel.java @@ -0,0 +1,161 @@ +package org.gcube.portlets.user.speciesdiscovery.client; + + +import org.gcube.portlets.user.speciesdiscovery.client.event.LoadDataSourceEvent; +import org.gcube.portlets.user.speciesdiscovery.client.job.SpeciesJobPanel; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchResultType; + +import com.extjs.gxt.ui.client.Style.LayoutRegion; +import com.extjs.gxt.ui.client.util.Margins; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.layout.BorderLayout; +import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData; +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.core.client.Scheduler.ScheduledCommand; +import com.google.gwt.event.shared.EventBus; +import com.google.gwt.event.shared.SimpleEventBus; +import com.google.gwt.user.client.Timer; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class SearchBorderLayoutPanel extends ContentPanel { + + /** + * This is a singleton + */ + private static SearchBorderLayoutPanel instance; + + private BorderLayoutData northData; + private BorderLayoutData centerData; + private BorderLayoutData westData; + private BorderLayoutData southData; + private final BorderLayout layout = new BorderLayout(); + + private static SearchController searchController; + private SpeciesSearchFormPanel speciesNorthPanel; + private SpeciesResultsPanelCardLayout speciesCenterPanel; + private SpeciesResultFilterAccordionPanel speciesWestPanel; + + private SpeciesJobPanel speciesSouthPanel; + + private final EventBus eventBus; + + + public static final int DEFAULTNORTHHEIGHT = 77; + + public static synchronized SearchBorderLayoutPanel getInstance() { + if (instance == null) + instance = new SearchBorderLayoutPanel(); + return instance; + } + + + private SearchBorderLayoutPanel() { + + setLayout(layout); + setHeaderVisible(false); + + eventBus = new SimpleEventBus(); + + searchController = new SearchController(eventBus, this); + speciesNorthPanel = new SpeciesSearchFormPanel(eventBus); + + speciesSouthPanel = new SpeciesJobPanel(eventBus); + + //TODO REMOVE searchController.getStreamPagingLoader() + speciesCenterPanel = new SpeciesResultsPanelCardLayout(eventBus, searchController.getStreamPagingLoader(), searchController); + + northData = new BorderLayoutData(LayoutRegion.NORTH, DEFAULTNORTHHEIGHT); + northData.setCollapsible(false); + northData.setFloatable(false); + northData.setHideCollapseTool(true); + northData.setSplit(false); + + westData = new BorderLayoutData(LayoutRegion.WEST, 250, 300, 350); + westData.setSplit(true); + westData.setCollapsible(true); + westData.setMargins(new Margins(0,0,0,0)); + + centerData = new BorderLayoutData(LayoutRegion.CENTER); + centerData.setMargins(new Margins(0)); + + southData = new BorderLayoutData(LayoutRegion.SOUTH, 34, 34, 34); +// southData = new BorderLayoutData(LayoutRegion.SOUTH, 150, 250, 250); +// southData.setSplit(true); +// southData.setCollapsible(true); + + southData.setMargins(new Margins(0,0,0,0)); + + speciesWestPanel = new SpeciesResultFilterAccordionPanel(eventBus, searchController.getStreamPagingLoader()); + +// eventBus.fireEvent(new LoadDataSourceEvent()); //load Data source event is fired + + add(speciesNorthPanel, northData); + add(speciesCenterPanel, centerData); + add(speciesWestPanel, westData); + + add(speciesSouthPanel, southData); + + initApplication(); + } + + + private void initApplication(){ + + Scheduler.get().scheduleDeferred(new ScheduledCommand() { + + @Override + public void execute() { + eventBus.fireEvent(new LoadDataSourceEvent()); //load Data source event is fired + + SearchController.excecuteGetJobs(SearchResultType.TAXONOMY_ITEM, false); + SearchController.excecuteGetJobs(SearchResultType.OCCURRENCE_POINT, false); + + pollSpeciesJobs(ConstantsSpeciesDiscovery.JOBPOLLINGMILLISECONDS); + + } + }); + } + + + public static void pollSpeciesJobs(int milliseconds){ + + Timer timer = new Timer() { + @Override + public void run() + { + + SearchController.excecuteGetJobs(SearchResultType.TAXONOMY_ITEM, false); + SearchController.excecuteGetJobs(SearchResultType.OCCURRENCE_POINT, false); + + } + }; + + timer.scheduleRepeating(milliseconds); + } + + public void updateNorthSize(int height){ + northData.setSize(height); + layout(true); + } + + public SpeciesSearchFormPanel getSpeciesNorthPanel() { + return speciesNorthPanel; + } + + public SpeciesResultsPanelCardLayout getSpeciesCenterPanel() { + return speciesCenterPanel; + } + + public SpeciesResultFilterAccordionPanel getSpeciesWestPanel() { + return speciesWestPanel; + } + + + public SpeciesJobPanel getSpeciesSouthPanel() { + return speciesSouthPanel; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/SearchController.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/SearchController.java new file mode 100644 index 0000000..4399665 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/SearchController.java @@ -0,0 +1,1450 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.gcube.portlets.user.gcubegisviewer.client.GCubeGisViewer; +import org.gcube.portlets.user.gcubegisviewer.client.event.SaveEvent; +import org.gcube.portlets.user.gcubegisviewer.client.event.SaveHandler; +import org.gcube.portlets.user.gisviewer.client.GisViewerParameters; +import org.gcube.portlets.user.speciesdiscovery.client.advancedsearch.AdvancedSearchPanelManager; +import org.gcube.portlets.user.speciesdiscovery.client.event.ActiveButtonCheckAllRowEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.ActiveButtonCheckAllRowEventHandler; +import org.gcube.portlets.user.speciesdiscovery.client.event.ActiveFilterOnResultEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.ActiveFilterOnResultEventHandler; +import org.gcube.portlets.user.speciesdiscovery.client.event.ActiveMaskLoadingGrid; +import org.gcube.portlets.user.speciesdiscovery.client.event.ActiveMaskLoadingGridHandler; +import org.gcube.portlets.user.speciesdiscovery.client.event.CapabilitySelectedEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.CapabilitySelectedEventHandler; +import org.gcube.portlets.user.speciesdiscovery.client.event.ChangeFilterClassificationOnResultEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.ChangeFilterClassificationOnResultEventHandler; +import org.gcube.portlets.user.speciesdiscovery.client.event.CompletedLoadDataSourceEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.CompletedLoadDataSourceEventHandler; +import org.gcube.portlets.user.speciesdiscovery.client.event.CreateOccurrenceJobEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.CreateOccurrenceJobEventHandler; +import org.gcube.portlets.user.speciesdiscovery.client.event.CreateTaxonomyJobEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.CreateTaxonomyJobEventHandler; +import org.gcube.portlets.user.speciesdiscovery.client.event.DisableFilterEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.DisableFilterEventHandler; +import org.gcube.portlets.user.speciesdiscovery.client.event.LoadDataSourceEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.LoadDataSourceEventHandler; +import org.gcube.portlets.user.speciesdiscovery.client.event.ReLoadListJobEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.ReLoadListJobEventHandler; +import org.gcube.portlets.user.speciesdiscovery.client.event.ReSubmitJobEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.ReSubmitJobEventHandler; +import org.gcube.portlets.user.speciesdiscovery.client.event.SaveItemsEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.SaveItemsEventHandler; +import org.gcube.portlets.user.speciesdiscovery.client.event.SaveJobEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.SaveJobEventHandler; +import org.gcube.portlets.user.speciesdiscovery.client.event.SearchEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.SearchEventHandler; +import org.gcube.portlets.user.speciesdiscovery.client.event.SearchStartedEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.SetCommonNamesEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.SetCommonNamesEventHandler; +import org.gcube.portlets.user.speciesdiscovery.client.event.ShowOccurrencesEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.ShowOccurrencesEventHandler; +import org.gcube.portlets.user.speciesdiscovery.client.event.ShowOccurrencesMapEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.ShowOccurrencesMapEventHandler; +import org.gcube.portlets.user.speciesdiscovery.client.event.ShowOnlySelectedRowEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.ShowOnlySelectedRowEventHandler; +import org.gcube.portlets.user.speciesdiscovery.client.event.UpdateAllRowSelectionEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.UpdateAllRowSelectionEventHandler; +import org.gcube.portlets.user.speciesdiscovery.client.event.UpdateFilterOnResultEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.UpdateFilterOnResultEventHandler; +import org.gcube.portlets.user.speciesdiscovery.client.event.UpdateRowSelectionEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.UpdateRowSelectionEventHandler; +import org.gcube.portlets.user.speciesdiscovery.client.event.ViewDetailsOfSelectedEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.ViewDetailsOfSelectedEventHandler; +import org.gcube.portlets.user.speciesdiscovery.client.filterresult.ResultFilterPanelManager; +import org.gcube.portlets.user.speciesdiscovery.client.job.occurrence.OccurrenceJobSpeciesPanel; +import org.gcube.portlets.user.speciesdiscovery.client.job.taxonomy.TaxonomyJobSpeciesPanel; +import org.gcube.portlets.user.speciesdiscovery.client.util.SpeciesGridFields; +import org.gcube.portlets.user.speciesdiscovery.client.util.Util; +import org.gcube.portlets.user.speciesdiscovery.client.util.stream.DataSource; +import org.gcube.portlets.user.speciesdiscovery.client.util.stream.DataSourceManager; +import org.gcube.portlets.user.speciesdiscovery.client.util.stream.StreamPagingLoader; +import org.gcube.portlets.user.speciesdiscovery.client.window.MessageDialog; +import org.gcube.portlets.user.speciesdiscovery.client.window.ViewDetailsWindow; +import org.gcube.portlets.user.speciesdiscovery.shared.CommonName; +import org.gcube.portlets.user.speciesdiscovery.shared.Coordinate; +import org.gcube.portlets.user.speciesdiscovery.shared.DataSourceModel; +import org.gcube.portlets.user.speciesdiscovery.shared.DownloadState; +import org.gcube.portlets.user.speciesdiscovery.shared.JobOccurrencesModel; +import org.gcube.portlets.user.speciesdiscovery.shared.JobTaxonomyModel; +import org.gcube.portlets.user.speciesdiscovery.shared.OccurrencesSaveEnum; +import org.gcube.portlets.user.speciesdiscovery.shared.OccurrencesStatus; +import org.gcube.portlets.user.speciesdiscovery.shared.ResultRow; +import org.gcube.portlets.user.speciesdiscovery.shared.SaveFileFormat; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchFilters; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchResultType; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchType; +import org.gcube.portlets.user.speciesdiscovery.shared.SpeciesCapability; +import org.gcube.portlets.user.speciesdiscovery.shared.filter.ResultFilter; +import org.gcube.portlets.user.workspace.lighttree.client.ItemType; +import org.gcube.portlets.user.workspace.lighttree.client.event.DataLoadEvent; +import org.gcube.portlets.user.workspace.lighttree.client.event.DataLoadHandler; +import org.gcube.portlets.user.workspace.lighttree.client.event.PopupEvent; +import org.gcube.portlets.user.workspace.lighttree.client.event.PopupHandler; +import org.gcube.portlets.user.workspace.lighttree.client.save.WorkspaceLightTreeSavePopup; + +import com.allen_sauer.gwt.log.client.Log; +import com.extjs.gxt.ui.client.data.BaseModelData; +import com.extjs.gxt.ui.client.event.Listener; +import com.extjs.gxt.ui.client.event.MessageBoxEvent; +import com.extjs.gxt.ui.client.widget.Dialog; +import com.extjs.gxt.ui.client.widget.Info; +import com.extjs.gxt.ui.client.widget.MessageBox; +import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.core.client.Scheduler.ScheduledCommand; +import com.google.gwt.event.shared.EventBus; +import com.google.gwt.user.client.rpc.AsyncCallback; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" - "Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it" + * + */ +public class SearchController { + + protected static final int PAGE_SIZE = 25; + + public static EventBus eventBus; + protected StreamPagingLoader streamPagingLoader; + protected boolean showOnlySelected = false; + protected boolean isActiveFilterOnResult = false; + protected int currentPage = 1; + protected SearchController instance = null; + + private SearchEvent lastSearchEvent = null; + + private SearchBorderLayoutPanel searchBorderLayoutPanel; + + private DataSourceManager dataSourceManager; + + /** + * @param eventBus + * @param searchBorderLayoutPanel + */ + public SearchController(EventBus eventBus, SearchBorderLayoutPanel searchBorderLayoutPanel) { + SearchController.eventBus = eventBus; //TODO Temporary solution + this.searchBorderLayoutPanel = searchBorderLayoutPanel; + this.dataSourceManager = DataSourceManager.getInstance(); + this.streamPagingLoader = new StreamPagingLoader(PAGE_SIZE); +// initialize(); + bind(); + instance = this; + } + + protected void switchDataSource(SpeciesCapability resultType){ + + setFiltersCriteria(); + + DataSource currentDataSource = dataSourceManager.getDataSourceByResultType(resultType); + + Log.trace("current data source: " + currentDataSource.getInfo()); + + //SET DATASOURCE + this.streamPagingLoader.setDataSource(currentDataSource); + + } + + private void setFiltersCriteria(){ + dataSourceManager.setActiveFilters(isActiveFilterOnResult); + dataSourceManager.setOnlySelected(showOnlySelected); + } + + + /** + * @return the streamPagingLoader + */ + public StreamPagingLoader getStreamPagingLoader() { + return streamPagingLoader; + } + + protected void bind() + { + + eventBus.addHandler(UpdateFilterOnResultEvent.TYPE, new UpdateFilterOnResultEventHandler() { + + @Override + public void onUpdateFilter(UpdateFilterOnResultEvent updateFilterOnResultEvent) { + + ResultFilterPanelManager.getInstance().updateDataSourceFilterById(updateFilterOnResultEvent.getUpdateFilterId()); + } + }); + + eventBus.addHandler(ActiveButtonCheckAllRowEvent.TYPE, new ActiveButtonCheckAllRowEventHandler() { + + @Override + public void onActiveCkeckAllRow(ActiveButtonCheckAllRowEvent activeFilterCheckAllRowEvent) { + + if(lastSearchEvent.getResultType().equals(SpeciesCapability.RESULTITEM)) + searchBorderLayoutPanel.getSpeciesCenterPanel().getResultRowPanel().activeCheckAllRows(activeFilterCheckAllRowEvent.isActiveFilter()); + else if(lastSearchEvent.getResultType().equals(SpeciesCapability.TAXONOMYITEM)) + searchBorderLayoutPanel.getSpeciesCenterPanel().getTaxonomyRowPanel().activeCheckAllRows(activeFilterCheckAllRowEvent.isActiveFilter()); + + } + }); + + + eventBus.addHandler(UpdateAllRowSelectionEvent.TYPE, new UpdateAllRowSelectionEventHandler() { + + @Override + public void onUpdateAllRowSelection(final UpdateAllRowSelectionEvent updateAllRowSelectionEvent) { + + SpeciesDiscovery.taxonomySearchService.updateRowSelections(updateAllRowSelectionEvent.getSelectionValue(), streamPagingLoader.getActiveFilterObject(), new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + Info.display("Error on selected all rows", "An error occurred on selected all rows " + caught); + Log.error("Error on selected all rows", "An error occurred on selected all rows " + caught); + + } + + @Override + public void onSuccess(Integer result) { + + if(result.intValue()>0){ + + boolean selected = updateAllRowSelectionEvent.getSelectionValue(); + + String msgRow = result.intValue()==1?"row":"rows"; + + String msgSel = selected==true?"selected":"deselected"; + + Info.display("Info", result.intValue()+" "+msgRow+" was "+msgSel); + + if(updateAllRowSelectionEvent.getSearchType().equals(SearchResultType.SPECIES_PRODUCT)) + searchBorderLayoutPanel.getSpeciesCenterPanel().getResultRowPanel().selectAllRows(selected); + else if(updateAllRowSelectionEvent.getSearchType().equals(SearchResultType.TAXONOMY_ITEM)) + searchBorderLayoutPanel.getSpeciesCenterPanel().getTaxonomyRowPanel().selectAllRows(selected); + } + } + }); + } + }); + + eventBus.addHandler(ReSubmitJobEvent.TYPE, new ReSubmitJobEventHandler() { + + @Override + public void onResubmitJob(ReSubmitJobEvent reSubmitJobEvent) { + if(reSubmitJobEvent.getLoadType().equals(SearchResultType.OCCURRENCE_POINT)){ + resubmitJob(reSubmitJobEvent.getLoadType(), reSubmitJobEvent.getJobOccurrenceModel().getJobIdentifier()); + } + else if(reSubmitJobEvent.getLoadType().equals(SearchResultType.TAXONOMY_ITEM)){ + resubmitJob(reSubmitJobEvent.getLoadType(), reSubmitJobEvent.getJobTaxonomyModel().getIdentifier()); + } + } + }); + + eventBus.addHandler(ReLoadListJobEvent.TYPE, new ReLoadListJobEventHandler() { + + @Override + public void onLoadJobList(ReLoadListJobEvent loadJobListEvent) { + + if(loadJobListEvent.getLoadType()!=null) + excecuteGetJobs(loadJobListEvent.getLoadType(), true); + } + }); + + + eventBus.addHandler(SearchEvent.TYPE, new SearchEventHandler() { + + @Override + public void onSearch(SearchEvent event) { + //Info.display("Event", event.toString()); + Log.trace(event.toString()); + + lastSearchEvent = event; + + doActiveMaskLoadingGridAndButtonSearch(true); + +// ResultFilterPanelManager.getInstance().setGroupByRank(event.getGroupByRank()); + + if(event.getType().equals(SearchType.BY_COMMON_NAME) || event.getType().equals(SearchType.BY_SCIENTIFIC_NAME)) + search(event.getType(), event.getSearchTerm().trim(), event.getUpperBoundLongitude(), event.getUpperBoundLatitude(), event.getLowerBoundLongitude(), event.getLowerBoundLatitude(), event.getFromDate(), event.getToDate(), event.getLstDataSources(), event.getGroupByRank(), event.getResultType()); + else + searchByQuery(event.getQuery()); + + } + }); + + + eventBus.addHandler(CreateOccurrenceJobEvent.TYPE, new CreateOccurrenceJobEventHandler() { + + @Override + public void onCreateSpeciesJob(CreateOccurrenceJobEvent createOccurrenceJobEvent) { + + List listJobOccurrenceModel = new ArrayList(); + + if(createOccurrenceJobEvent.getListDataSourceFound()==null){ + Info.display("Error on loading", "An error occurred on recover data sources, please close window and try again."); + } + + if(!createOccurrenceJobEvent.isByDataSource()){ //ONE JOB FOR ALL DATASOURCE + + String jobName = createOccurrenceJobEvent.getSearchTerm() + " occurrences from"; + + List dataSourceList = new ArrayList(); + + for (String dataSource : createOccurrenceJobEvent.getListDataSourceFound()) { + dataSourceList.add(new org.gcube.portlets.user.speciesdiscovery.shared.DataSource(dataSource,dataSource)); + jobName+=" "+dataSource; + } + + listJobOccurrenceModel.add(new JobOccurrencesModel("", jobName,createOccurrenceJobEvent.getSearchTerm(), dataSourceList, createOccurrenceJobEvent.getFileFormat(), createOccurrenceJobEvent.getSaveEnum(), createOccurrenceJobEvent.isByDataSource(), createOccurrenceJobEvent.getExpectedOccurrences())); + + }else{ //IS BY DATASOURCE - ONE JOB FOR EACH DATASOURCE + + for (String dataSource : createOccurrenceJobEvent.getListDataSourceFound()) { + +// System.out.println("########DATASOURCE FOUND: "+dataSource); + + String jobName = createOccurrenceJobEvent.getSearchTerm() + " occurrences from " +dataSource; + + List dataSourceList = new ArrayList(); + + dataSourceList.add(new org.gcube.portlets.user.speciesdiscovery.shared.DataSource(dataSource,dataSource)); + + listJobOccurrenceModel.add(new JobOccurrencesModel("", jobName,createOccurrenceJobEvent.getSearchTerm(), dataSourceList, createOccurrenceJobEvent.getFileFormat(), createOccurrenceJobEvent.getSaveEnum(), createOccurrenceJobEvent.isByDataSource())); + } + } + + SpeciesDiscovery.taxonomySearchService.createOccurrencesJob(listJobOccurrenceModel, createOccurrenceJobEvent.getFileFormat(), createOccurrenceJobEvent.getSaveEnum(), createOccurrenceJobEvent.isByDataSource(), createOccurrenceJobEvent.getExpectedOccurrences(), new AsyncCallback>() { + + @Override + public void onFailure(Throwable caught) { + Info.display("Error on loading", "An error occurred on create job, retry."); + Log.error("Error on loading", "An error occurred on create job, retry." +caught.getMessage()); + caught.printStackTrace(); + + } + + @Override + public void onSuccess(List result) { + + if(result!=null){ + if(result.size()>0){ + Info.display("Species Occurrence Job", result.size() + " occurrence job was submitted"); + excecuteGetJobs(SearchResultType.OCCURRENCE_POINT, false); + searchBorderLayoutPanel.getSpeciesSouthPanel().setIconOccurrenceByCounter(result.size()); + } + else{ + Info.display("Species Occurrence Job","An error occurred on submit job, retry"); + } + + } + } + }); + + } + }); + + + eventBus.addHandler(ActiveMaskLoadingGrid.TYPE, new ActiveMaskLoadingGridHandler() { + + @Override + public void onActiveMaskLoadingGrid(ActiveMaskLoadingGrid activeLoadingGrid) { + + doActiveMaskLoadingGridAndButtonSearch(activeLoadingGrid.isActive()); + + } + }); + + eventBus.addHandler(SaveJobEvent.TYPE, new SaveJobEventHandler() { + + @Override + public void onSaveJob(SaveJobEvent saveJobEvent) { + + if(saveJobEvent.getItemType().equals(SearchResultType.TAXONOMY_ITEM)){ + saveTaxonomyJob(saveJobEvent.getJobTaxonomyModel(), saveJobEvent.getScientificName(), saveJobEvent.getListDataSources(), saveJobEvent.getRank()); + } + else if(saveJobEvent.getItemType().equals(SearchResultType.OCCURRENCE_POINT)){ + saveOccurencesJob(saveJobEvent.getJobOccurrenceModel(), saveJobEvent.getScientificName(), saveJobEvent.getListDataSources()); + } + } + + }); + + eventBus.addHandler(CreateTaxonomyJobEvent.TYPE, new CreateTaxonomyJobEventHandler() { + + @Override + public void onCreateSpeciesJob(CreateTaxonomyJobEvent createSpeciesJobEvent) { + + switch (createSpeciesJobEvent.getJobType()) { + + case BYCHILDREN: + + SpeciesDiscovery.taxonomySearchService.createTaxonomyJobByChildren(createSpeciesJobEvent.getTaxonomy(), createSpeciesJobEvent.getDataSourceName(), new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + Log.error("Error on loading", "An error occurred on create job by children, retry." +caught.getMessage()); + + } + + @Override + public void onSuccess(JobTaxonomyModel result) { + + if(result!=null){ + Info.display("Species Taxonomy Job","A new taxonomy job was submitted"); + excecuteGetJobs(SearchResultType.TAXONOMY_ITEM, false); + searchBorderLayoutPanel.getSpeciesSouthPanel().setIconTaxonomyByCounter(1); + } + } + }); + + break; + + case BYIDS: + + SpeciesDiscovery.taxonomySearchService.createTaxonomyJobByIds(lastSearchEvent.getSearchTerm(), lastSearchEvent.getLstDataSources(), new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + Log.error("Error on loading", "An error occurred on create job by ids, retry." +caught.getMessage()); + + } + + @Override + public void onSuccess(JobTaxonomyModel result) { + + if(result!=null){ + Info.display("Species Taxonomy Job","A new taxonomy job was submitted"); + excecuteGetJobs(SearchResultType.TAXONOMY_ITEM, false); + searchBorderLayoutPanel.getSpeciesSouthPanel().setIconTaxonomyByCounter(1); + } + } + + }); + + break; + + default: + break; + } + } + }); + + eventBus.addHandler(CompletedLoadDataSourceEvent.TYPE, new CompletedLoadDataSourceEventHandler() { + + @Override + public void onCompletedLoadDataSource(CompletedLoadDataSourceEvent completedLoadDataSourceEvent) { + + searchBorderLayoutPanel.getSpeciesNorthPanel().unmask(); + eventBus.fireEvent(new CapabilitySelectedEvent(searchBorderLayoutPanel.getSpeciesNorthPanel().getSelectedCapability())); + + } + }); + + eventBus.addHandler(ChangeFilterClassificationOnResultEvent.TYPE, new ChangeFilterClassificationOnResultEventHandler() { + + @Override + public void onChangeFilter(ChangeFilterClassificationOnResultEvent changeFilterClassificationOnResultEvent) { + ResultFilterPanelManager.getInstance().updateFilterCounterForClassification(); + + } + }); + + eventBus.addHandler(CapabilitySelectedEvent.TYPE, new CapabilitySelectedEventHandler() { + + @Override + public void onCapabilitySelected(CapabilitySelectedEvent capabilitySelectedEvent) { + + AdvancedSearchPanelManager.getInstance().setCurrentCapability(capabilitySelectedEvent.getCapability()); + + switch (capabilitySelectedEvent.getCapability()) { + case RESULTITEM: + + searchBorderLayoutPanel.getSpeciesNorthPanel().setValueCheckValidateOcccurrences(true); + searchBorderLayoutPanel.getSpeciesNorthPanel().setVisibleCheckValidateOcccurrences(true); + break; + + default: + searchBorderLayoutPanel.getSpeciesNorthPanel().setValueCheckValidateOcccurrences(false); + searchBorderLayoutPanel.getSpeciesNorthPanel().setVisibleCheckValidateOcccurrences(false); + }; + +// //TODO CHANGE +// searchBorderLayoutPanel.getSpeciesCenterPanel().setCurrentView(capabilitySelectedEvent.getCapability()); + + + } + }); + + eventBus.addHandler(UpdateRowSelectionEvent.TYPE, new UpdateRowSelectionEventHandler() { + + @Override + public void onUpdateRowSelection(final UpdateRowSelectionEvent updateRowSelectionEvent) { + + Log.trace("in update..... rowid "+ updateRowSelectionEvent.getRowId()); + + SpeciesDiscovery.taxonomySearchService.updateRowSelection(updateRowSelectionEvent.getRowId(), updateRowSelectionEvent.getSelectionValue(), new AsyncCallback() { + + @Override + public void onSuccess(Void result) { + Log.trace("rowid "+ updateRowSelectionEvent.getRowId() +" updated"); + + } + + @Override + public void onFailure(Throwable caught) { + Info.display("Error on loading", "An error occurred on check row, please retry."); + Log.error("Error on loading", "An error occurred on check row, please retry." +caught.getMessage()); + } + }); + } + }); + + eventBus.addHandler(ShowOccurrencesEvent.TYPE, new ShowOccurrencesEventHandler() { + + @Override + public void onShowOccurrences(ShowOccurrencesEvent event) { + openOccurenceWindow(); + } + }); + + eventBus.addHandler(SaveItemsEvent.TYPE, new SaveItemsEventHandler() { + + @Override + public void onSaveOccurrences(final SaveItemsEvent event) { + + if(event.getItemType().equals(SearchResultType.OCCURRENCE_POINT)){ + + //OLD CODE*********** + SpeciesDiscovery.taxonomySearchService.getCountOfOccurrencesBatch(new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + Log.error("Error on loading", "An error occurred on count of occurrence point, retry." +caught.getMessage()); + + } + + @Override + public void onSuccess(OccurrencesStatus result) { + + + MessageDialog dialog; + + if(event.getExpectedPoints()>result.getSize()){ + + dialog = new MessageDialog("Info", "Loading in progress", "On server are available only "+result.getSize()+" of "+event.getExpectedPoints()+" occurrence points. Do you want continue?"); + + dialog.getMessageBoxConfirm().addCallback(new Listener() { + + public void handleEvent(MessageBoxEvent be) { + //IF NOT CANCELLED + String clickedButton = be.getButtonClicked().getItemId(); + if(clickedButton.equals(Dialog.YES)) + saveOccurences(event.getFileFormat(), event.getCsvType()); + } + }); + } + + else + saveOccurences(event.getFileFormat(), event.getCsvType()); + } + }); + + //END OLD CODE*********** + saveOccurences(event.getFileFormat(), event.getCsvType()); + + } + + else + if(event.getItemType().equals(SearchResultType.TAXONOMY_ITEM)) + saveTaxonomy(event.getFileFormat()); + + + } + }); + + eventBus.addHandler(ShowOccurrencesMapEvent.TYPE, new ShowOccurrencesMapEventHandler() { + + @Override + public void onShowOccurrencesMap(final ShowOccurrencesMapEvent event) { + + + SpeciesDiscovery.taxonomySearchService.getCountOfOccurrencesBatch(new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + Log.error("Error on loading", "An error occurred on count of occurrence point, retry." +caught.getMessage()); + + } + + @Override + public void onSuccess(OccurrencesStatus result) { + + MessageDialog dialog; + + if(event.getExpectedPoints()>result.getSize()){ + + dialog = new MessageDialog("Info", "Loading in progress", "On server are available only "+result.getSize()+" of "+event.getExpectedPoints()+" occurrences points. Do you want continue?"); + + dialog.getMessageBoxConfirm().addCallback(new Listener() { + + public void handleEvent(MessageBoxEvent be) { + //IF NOT CANCELLED + String clickedButton = be.getButtonClicked().getItemId(); + if(clickedButton.equals(Dialog.YES)) + showOccurrencesMap(); + } + }); + } + + else + showOccurrencesMap(); + } + + }); + } + }); + + eventBus.addHandler(ShowOnlySelectedRowEvent.TYPE, new ShowOnlySelectedRowEventHandler() { + + @Override + public void onShowOnlySelectedRow(ShowOnlySelectedRowEvent event) { + + showFilterResults(event.isOnlySelected()); + } + }); + + + eventBus.addHandler(LoadDataSourceEvent.TYPE, new LoadDataSourceEventHandler() { + + @Override + public void onLoadDataSource(LoadDataSourceEvent loadDataSourceEvent) { + + searchBorderLayoutPanel.getSpeciesNorthPanel().mask("Loading data sources...", ConstantsSpeciesDiscovery.LOADINGSTYLE); + loadDataSourceFromService(); + + } + }); + + eventBus.addHandler(ViewDetailsOfSelectedEvent.TYPE, new ViewDetailsOfSelectedEventHandler() { + + @Override + public void onViewDetails(ViewDetailsOfSelectedEvent viewDetailsOfSelectedEvent) { + + final ViewDetailsWindow view = new ViewDetailsWindow(instance, lastSearchEvent.getResultType(), lastSearchEvent.getType()); + + //IF SELECTED CAPABILITY IS OCCURENCES - IS CALL LOAD OCCURENCES METHOD + if(lastSearchEvent.getResultType().getName().compareTo(SpeciesCapability.RESULTITEM.getName())==0){ + + Scheduler.get().scheduleDeferred(new ScheduledCommand() { + + @Override + public void execute() { + view.loadOccurences(); + } + }); + } + } + }); + + eventBus.addHandler(ActiveFilterOnResultEvent.TYPE, new ActiveFilterOnResultEventHandler() { + + @Override + public void onActiveFilter(ActiveFilterOnResultEvent activeFilterOnResultEvent) { + +// for(Integer id: activeFilterOnResultEvent.getActiveFilterObject().getListByClassification()){ +// Log.trace("current id "+ id + " size " +activeFilterOnResultEvent.getActiveFilterObject().getListByClassification().size()); +// } + doActiveMaskLoadingGridAndButtonSearch(true); + + activeFilterOnResult(true); + setOnlySelected(false); + updateOnlySelectedOnManager(false); + + ResultFilter filterObj = activeFilterOnResultEvent.getActiveFilterObject(); + streamPagingLoader.setActiveFilterObject(filterObj); + streamPagingLoader.reloadPageForFiltering(filterObj.getNumberOfData(), true); + + searchBorderLayoutPanel.getSpeciesCenterPanel().setFilterActive(true, filterObj.getFilterValue()); + + } + }); + + + eventBus.addHandler(SetCommonNamesEvent.TYPE, new SetCommonNamesEventHandler() { + + @Override + public void onSetCommonNames(SetCommonNamesEvent setCommonNamesEvent) { + + final BaseModelData data = setCommonNamesEvent.getBaseModelData(); + + final ResultRow row = (ResultRow) data.get(SpeciesGridFields.ROW.getId()); + + SpeciesDiscovery.taxonomySearchService.loadListCommonNameByRowId(""+row.getId(), new AsyncCallback>() { + + @Override + public void onFailure(Throwable caught) { +// Window.alert(caught.getMessage()); + Info.display("Error on loading", "An error occurred on loading Common Names, retry."); + Log.error("Error in SetCommonNamesEvent: "+caught.getMessage()); + + } + + @Override + public void onSuccess(ArrayListresult) { + + if(result!=null){ + + String matchingTaxonName = data.get(SpeciesGridFields.MATCHING_NAME.getId()); + String matchingAccordionTo = data.get(SpeciesGridFields.MATCHING_AUTHOR.getId()); + String matchingCredits = data.get(SpeciesGridFields.MATCHING_CREDITS.getId()); + + String commonNames = getCommonNamesHTML(matchingTaxonName, matchingAccordionTo, matchingCredits, result); + data.set(SpeciesGridFields.COMMON_NAMES.getId(), commonNames); + } + + row.setCommonNames(result); + } + }); + + } + }); + + eventBus.addHandler(DisableFilterEvent.TYPE, new DisableFilterEventHandler() { + + @Override + public void onDisableFilter(DisableFilterEvent disableFilterEvent) { + + doActiveMaskLoadingGridAndButtonSearch(true); + streamPagingLoader.reloadPageWithoutFiltering(); + disableFilters(); +// updateOnlySelectedOnManager(); + } + }); + + } + + public void resubmitJob(SearchResultType resultType, String jobIdentifier){ + + if(jobIdentifier!=null){ + if(resultType.equals(SearchResultType.OCCURRENCE_POINT)){ + + SpeciesDiscovery.taxonomySearchService.resubmitOccurrencesJob(jobIdentifier, new AsyncCallback>() { + + @Override + public void onFailure(Throwable caught) { + // TODO Auto-generated method stub + + } + + @Override + public void onSuccess(List result) { + + if(result!=null && result.size()>0) + excecuteGetJobs(SearchResultType.OCCURRENCE_POINT, false); + + } + }); + } + + else if(resultType.equals(SearchResultType.TAXONOMY_ITEM)){ + + SpeciesDiscovery.taxonomySearchService.resubmitTaxonomyJob(jobIdentifier, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + Info.display("Error on resubmit", "An error occurred on resubmit job, retry."); + Log.error("Error on resubmit", "An error occurred on resubmit job, retry." +caught.getMessage()); + caught.printStackTrace(); + + } + + @Override + public void onSuccess(JobTaxonomyModel result) { + + if(result!=null) + excecuteGetJobs(SearchResultType.TAXONOMY_ITEM, false); + + } + }); + + } + } + else + Info.display("Error", "job identifier is wrong"); + + } + + protected void activeFilterOnResult(boolean bool){ + isActiveFilterOnResult = bool; + dataSourceManager.setActiveFilters(isActiveFilterOnResult); + } + + protected void disableFilters(){ + + activeFilterOnResult(false); + streamPagingLoader.resetFilters(); + searchBorderLayoutPanel.getSpeciesCenterPanel().setFilterActive(false, ""); + } + + + protected void loadDataSourceFromService() { + + SpeciesDiscovery.taxonomySearchService.loadDataSourceList(new AsyncCallback>() { + + @Override + public void onFailure(Throwable caught) { + Info.display("Error on loading", "An error occurred on loading Data Source, retry."); +// Log.error("Error on loading", "An error occurred on loading Data Source, retry. " +caught.getMessage()); + Log.error("Error on loading", "An error occurred on loading Data Source, retry. " +caught); + + Log.error("Error on loading", "An error occurred on loading Data Source, retry. " +caught.getCause()); + searchBorderLayoutPanel.getSpeciesNorthPanel().unmask(); + } + + @Override + public void onSuccess(List result) { + + if(result!=null && result.size()>0) + AdvancedSearchPanelManager.getInstance().loadDataSource(result); + else + Info.display("Error", "No data sources are loaded, retry"); +// ResultFilterPanelManager.getInstance().loadDataSource(result); + + eventBus.fireEvent(new CompletedLoadDataSourceEvent()); + } + + }); + } + + protected void doActiveMaskLoadingGridAndButtonSearch(boolean mask) { + + searchBorderLayoutPanel.getSpeciesCenterPanel().setMaskGridPanel(mask); + + searchBorderLayoutPanel.getSpeciesNorthPanel().activeButtonSearch(!mask); + } + + protected void showFilterResults(boolean onlySelected) + { + Log.trace("showFilterResults ******* onlySelected "+onlySelected); + + setOnlySelected(onlySelected); + updateOnlySelectedOnManager(onlySelected); + + streamPagingLoader.reset(); + streamPagingLoader.pollingState(); + + if (onlySelected) { + disableFilters(); + streamPagingLoader.setPage(0); + } else { + Log.trace("currentPage: "+currentPage); + currentPage = streamPagingLoader.getCurrentPage(); + streamPagingLoader.setPage(currentPage); + } + } + + public void openOccurenceWindow() { + final OccurrencesWindow occurencesWindow = new OccurrencesWindow(); + occurencesWindow.show(); + + Scheduler.get().scheduleDeferred(new ScheduledCommand() { + + @Override + public void execute() { + occurencesWindow.loadOccurences(); + } + }); + + } + + public void saveOccurences(final SaveFileFormat fileFormat, final OccurrencesSaveEnum typeCSV) { + + String fileName = "Occurrences"; + + switch (fileFormat) { + case CSV: fileName += ".csv"; break; + case DARWIN_CORE: fileName += ".xml"; break; + } + + WorkspaceLightTreeSavePopup popup = new WorkspaceLightTreeSavePopup("Select where to save the Occurrence points", true, fileName); + popup.setModal(false); + popup.setSelectableTypes(ItemType.FOLDER, ItemType.ROOT); + popup.center(); + popup.addPopupHandler(new PopupHandler() { + + public void onPopup(PopupEvent event) { + if (!event.isCanceled()){ + org.gcube.portlets.user.workspace.lighttree.client.Item destinationFolder = event.getSelectedItem(); + final String name = event.getName(); + + Info.display("Saving in progress", "..."); + + SpeciesDiscovery.taxonomySearchService.saveSelectedOccurrencePoints(destinationFolder.getId(), name, fileFormat, typeCSV, new AsyncCallback() { + + @Override + public void onSuccess(Void result) { + Info.display("File saved", "The "+name+" file has been saved in the workspace."); + } + + @Override + public void onFailure(Throwable caught) { + Info.display("Error saving the file", "An error occurred saving the file, retry."); + Log.error("Error saving the file", "An error occurred saving the file, retry." +caught.getMessage()); + } + }); + + } + } + + }); + popup.addDataLoadHandler(new DataLoadHandler() { + + @Override + public void onDataLoad(DataLoadEvent event) { + if (event.isFailed())GWT.log("Workspace loading failure", event.getCaught()); + } + }); + popup.getElement().getStyle().setZIndex(10001); + popup.show(); + + } + + + + public void saveTaxonomyJob(final JobTaxonomyModel jobTaxonomyModel, final String scientificName, final List listDataSources, String rank) { + + // IN THIS CASE THERE IS ONE DATASOURCE + final String dataSourceName = listDataSources.get(0)!=null?listDataSources.get(0).getName():"no datasource"; + + String fileName = "DWCA " +rank + " -"+scientificName +"- from "+dataSourceName+".zip"; + + WorkspaceLightTreeSavePopup popup = new WorkspaceLightTreeSavePopup("Select where to save the Job", true, fileName); + popup.setModal(false); + popup.setSelectableTypes(ItemType.FOLDER, ItemType.ROOT); + popup.center(); + popup.addPopupHandler(new PopupHandler() { + + public void onPopup(PopupEvent event) { + if (!event.isCanceled()){ + org.gcube.portlets.user.workspace.lighttree.client.Item destinationFolder = event.getSelectedItem(); + final String name = event.getName(); + + Info.display("Saving in progress", "..."); + + SpeciesDiscovery.taxonomySearchService.saveTaxonomyJob(jobTaxonomyModel.getIdentifier(), destinationFolder.getId(), name, scientificName, dataSourceName, new AsyncCallback() { + + @Override + public void onSuccess(Boolean result) { + + if(result){ + Info.display("File saved", "The "+name+" file has been saved in the workspace."); + + changeStatusJob(SearchResultType.TAXONOMY_ITEM, jobTaxonomyModel.getIdentifier(), DownloadState.SAVED); + } + } + + @Override + public void onFailure(Throwable caught) { + Info.display("Error saving the file", "An error occurred saving the file, retry."); + Log.error("Error saving the file", "An error occurred saving the file, retry." +caught.getMessage()); + } + }); + } + } + + }); + + popup.addDataLoadHandler(new DataLoadHandler() { + + @Override + public void onDataLoad(DataLoadEvent event) { + if (event.isFailed())GWT.log("Workspace loading failure", event.getCaught()); + } + }); + popup.show(); + + + } + + + private void saveOccurencesJob(final JobOccurrencesModel jobOccurrencesModel,final String scientificName, List dataSourceList) { + + String dataSourceName = ""; + + for (org.gcube.portlets.user.speciesdiscovery.shared.DataSource dataSource : dataSourceList) { + dataSourceName+= dataSource.getName() + "-"; + } + + //remove last - char + dataSourceName = dataSourceName.substring(0, dataSourceName.lastIndexOf("-")); + + String extension = null; + + switch (jobOccurrencesModel.getFileFormat()) { + case CSV: { + extension = "csv"; + } break; + case DARWIN_CORE:{ + extension = "xml"; + } break; + } + + String fileName = "Occurrences results of "+scientificName +"- from "+dataSourceName+"."+extension; + + WorkspaceLightTreeSavePopup popup = new WorkspaceLightTreeSavePopup("Select where to save the Occurrence points", true, fileName); + popup.setModal(false); + popup.setSelectableTypes(ItemType.FOLDER, ItemType.ROOT); + popup.center(); + + final String dataSources = dataSourceName; + + popup.addPopupHandler(new PopupHandler() { + + public void onPopup(PopupEvent event) { + if (!event.isCanceled()){ + org.gcube.portlets.user.workspace.lighttree.client.Item destinationFolder = event.getSelectedItem(); + final String name = event.getName(); + + Info.display("Saving in progress", "..."); + + SpeciesDiscovery.taxonomySearchService.saveOccurrenceJob(jobOccurrencesModel, destinationFolder.getId(), name, scientificName, dataSources, new AsyncCallback() { + + @Override + public void onSuccess(Boolean result) { + + if(result){ + Info.display("File saved", "The "+name+" file has been saved in the workspace."); + changeStatusJob(SearchResultType.OCCURRENCE_POINT, jobOccurrencesModel.getJobIdentifier(), DownloadState.SAVED); + } + } + + @Override + public void onFailure(Throwable caught) { + Info.display("Error saving the file", "An error occurred saving the file, retry."); + Log.error("Error saving the file", "An error occurred saving the file, retry." +caught.getMessage()); + } + }); + } + } + + }); + + popup.addDataLoadHandler(new DataLoadHandler() { + + @Override + public void onDataLoad(DataLoadEvent event) { + if (event.isFailed())GWT.log("Workspace loading failure", event.getCaught()); + } + }); + popup.show(); + + } + + + public void changeStatusJob(SearchResultType jobType, String jobId, DownloadState state){ + + if(jobType.equals(SearchResultType.OCCURRENCE_POINT)){ + SpeciesDiscovery.taxonomySearchService.changeStatusOccurrenceJob(jobId, state, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + Log.error("Error on change status", "An error occurred on change status, retry." +caught.getMessage()); + + } + + @Override + public void onSuccess(Boolean result) { + if(result) + excecuteGetJobs(SearchResultType.OCCURRENCE_POINT, true); + + } + }); + }else if(jobType.equals(SearchResultType.TAXONOMY_ITEM)){ + SpeciesDiscovery.taxonomySearchService.changeStatusTaxonomyJob(jobId, state, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + Log.error("Error on change status", "An error occurred on change status, retry." +caught.getMessage()); + + } + + @Override + public void onSuccess(Boolean result) { + if(result) + excecuteGetJobs(SearchResultType.TAXONOMY_ITEM, true); + + } + }); + } + } + + + public void saveTaxonomy(final SaveFileFormat fileFormat) { + + String fileName = "Taxonomy"; + + switch (fileFormat) { + case DARWIN_CORE_ARCHIVE: fileName += ".zip"; break; + } + + WorkspaceLightTreeSavePopup popup = new WorkspaceLightTreeSavePopup("Select where to save the Taxonomy", true, fileName); + popup.setModal(false); + popup.setSelectableTypes(ItemType.FOLDER, ItemType.ROOT); + popup.center(); + + popup.addPopupHandler(new PopupHandler() { + + public void onPopup(PopupEvent event) { + if (!event.isCanceled()){ + org.gcube.portlets.user.workspace.lighttree.client.Item destinationFolder = event.getSelectedItem(); + final String name = event.getName(); + + Info.display("Saving in progress", "..."); + + SpeciesDiscovery.taxonomySearchService.saveSelectedTaxonomyPoints(destinationFolder.getId(), name, fileFormat, new AsyncCallback() { + + @Override + public void onSuccess(Void result) { + Info.display("File saved", "The "+name+" file has been saved in the workspace."); + } + + @Override + public void onFailure(Throwable caught) { + Info.display("Error saving the file", "An error occurred saving the file, retry."); + Log.error("Error saving the file", "An error occurred saving the file, retry." +caught.getMessage()); + } + }); + + } + } + + }); + popup.addDataLoadHandler(new DataLoadHandler() { + + @Override + public void onDataLoad(DataLoadEvent event) { + if (event.isFailed())GWT.log("Workspace loading failure", event.getCaught()); + } + }); + popup.show(); + + } + + public void showOccurrencesMap() + { + final MessageBox progress = MessageBox.wait("Generating map", "Calculating occurrence points", "generating..."); + + SpeciesDiscovery.taxonomySearchService.generateMapFromSelectedOccurrencePoints(new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + progress.close(); + Info.display("Error generating the map", "An error occurred generating the map, retry"); + Log.error("Error on loading", "An error occurred on edit listner, retry." +caught.getMessage()); + + } + + @Override + public void onSuccess(String layerName) { + progress.close(); + showMap(layerName); + } + }); + } + + public void showMap(String layerName) + { + + Log.trace("show Map layer name returned: "+layerName); + + GisViewerParameters gisViewerParameters = new GisViewerParameters(); + List layers = new ArrayList(); + + layers.add(ConstantsSpeciesDiscovery.ENVIRONMENTS); +// layers.add(ConstantsSpeciesDiscovery.WORLD_BORDERS); + layers.add(ConstantsSpeciesDiscovery.SST_AN_MEAN); + layers.add(ConstantsSpeciesDiscovery.PRIM_PROD_MEAN); + layers.add(ConstantsSpeciesDiscovery.SALINITY_MEAN); + layers.add(ConstantsSpeciesDiscovery.EEZALL); + layers.add(ConstantsSpeciesDiscovery.FAOAREA); + layers.add(ConstantsSpeciesDiscovery.LME); + layers.add(ConstantsSpeciesDiscovery.DEPTH_MEAN_ANNUAL); + layers.add(layerName); + + gisViewerParameters.setOpeningLayers(layers); + GCubeGisViewer gisViewer = new GCubeGisViewer(gisViewerParameters); + + gisViewer.addSaveHandler(new SaveHandler() { + + @Override + public void onSaveSuccess(SaveEvent event) { + Log.trace("onSaveSuccess "+event); + } + + @Override + public void onSaveFailure(SaveEvent event) { + Log.trace("onSaveFailure "+event); + } + + @Override + public void onSave(SaveEvent event) { + Log.trace("onSave "+event); + } + }); + + gisViewer.setMaskOnSaveEvents(); + + gisViewer.show(); + } + + + private void setOnlySelected(boolean b){ + + showOnlySelected = b; + searchBorderLayoutPanel.getSpeciesCenterPanel().activeBtnShowOnlySelected(b); + + } + + + private void updateOnlySelectedOnManager(boolean showOnlySelected){ + dataSourceManager.setOnlySelected(showOnlySelected); + } + + public void reset(){ + streamPagingLoader.reset(); + streamPagingLoader.setActiveFilterObject(null); +// isActiveFilterOnResult = false; + activeFilterOnResult(false); + } + + private void switchView(SpeciesCapability resultType) { + Log.trace("switchView ... "); + searchBorderLayoutPanel.getSpeciesCenterPanel().updateCurrentGridView(resultType); + } + + private AsyncCallback initSearch(){ + + reset(); + searchBorderLayoutPanel.getSpeciesCenterPanel().setFilterActive(false, ""); + setOnlySelected(false); + + return new AsyncCallback() { + + @Override + public void onSuccess(Void voi) { + streamPagingLoader.startLoading(false); + } + + @Override + public void onFailure(Throwable caught) { + Info.display("Error", "An error occurred during the search"); + Log.error("Error during the search", caught.getMessage()); + reset(); + streamPagingLoader.resetFilters(); + } + }; + } + + private AsyncCallback initSearchByQuery(){ + + return new AsyncCallback() { + + @Override + public void onSuccess(SearchResultType resultType) { + + SpeciesCapability capability = Util.getCapabilityFromResultType(resultType); + setDataSourceType(capability); + switchView(capability); + searchBorderLayoutPanel.getSpeciesCenterPanel().activeToolBarButtons(true); +// eventBus.fireEvent(new SearchStartedEvent()); + streamPagingLoader.startLoading(false); + } + + @Override + public void onFailure(Throwable caught) { + Info.display("Error", "An error occurred during the search"); + Log.error("Error during the search", caught.getMessage()); + reset(); + streamPagingLoader.resetFilters(); + } + }; + } + + protected void searchByQuery(String query) { + + Log.trace("IN SEARCH BY QUERY..." + query); + + AsyncCallback callback = initSearchByQuery(); + + reset(); + searchBorderLayoutPanel.getSpeciesCenterPanel().setFilterActive(false, ""); + setOnlySelected(false); + + + SpeciesDiscovery.taxonomySearchService.searchByQuery(query, callback); + + eventBus.fireEvent(new SearchStartedEvent()); + + + } + + protected void search(SearchType type, String searchTerm, Number upperBoundLongitude, Number upperBoundLatitude, Number lowerBoundLongitude, Number lowerBoundLatitude, Date fromDate, Date toDate, List listDataSources, String groupRank, SpeciesCapability resultType) + { + + Log.trace("IN SEARCH.............."); + + AsyncCallback callback = initSearch(); + + Coordinate upperCoordinate = (upperBoundLatitude!=null && upperBoundLongitude!=null)?new Coordinate(upperBoundLatitude.floatValue(), upperBoundLongitude.floatValue()):null; + Coordinate lowerCoordinate = (lowerBoundLatitude!=null && lowerBoundLongitude!=null)?new Coordinate(lowerBoundLatitude.floatValue(), lowerBoundLongitude.floatValue()):null; + + SearchFilters filters = new SearchFilters(upperCoordinate, lowerCoordinate, fromDate, toDate, listDataSources, groupRank, resultType); + + Log.trace("**********result type: " + filters.getResultType()); + + switch (type) { + + case BY_SCIENTIFIC_NAME: + SpeciesDiscovery.taxonomySearchService.searchByScientificName(searchTerm, filters, callback); + break; + case BY_COMMON_NAME: + SpeciesDiscovery.taxonomySearchService.searchByCommonName(searchTerm, filters, callback); + break; + } + + Log.trace("resultType "+ resultType); + + setDataSourceType(resultType); + switchView(resultType); + searchBorderLayoutPanel.getSpeciesCenterPanel().activeToolBarButtons(true); + + + eventBus.fireEvent(new SearchStartedEvent()); + + } + + + private void setDataSourceType(SpeciesCapability resultType) { + switchDataSource(resultType); + } + + protected String getCommonNamesHTML(String scientificName, String author, String credits, List commonNames) + { + StringBuilder html = new StringBuilder("

"); + + html.append(scientificName); + html.append("

"); + + if (commonNames.size()>0) html.append("aka : "); + + html.append(""); + + Set insertedLanguages = new HashSet(); + + for (CommonName commonName:commonNames) { + if (insertedLanguages.contains(commonName.getLanguage())) continue; + else insertedLanguages.add(commonName.getLanguage()); + + html.append(""); + } + + html.append(""); + html.append(""); + html.append(""); + html.append("
"); + html.append(commonName.getLanguage()); + html.append(":"); + html.append(commonName.getName()); + html.append("
Inserted by: "); + html.append(author); + html.append("
Credits: "); + html.append(credits); + html.append("
"); + + html.append("

"); + + return html.toString(); + } + + + public EventBus getEventBus() { + return eventBus; + } + + public SearchEvent getLastSearchEvent() { + return lastSearchEvent; + } + + public static void excecuteGetJobs(SearchResultType type, final boolean resetStructures){ + + + System.out.println("New rpc get list SpeciesJobs......." + type); + + if(type.equals(SearchResultType.TAXONOMY_ITEM)){ + + if(resetStructures) + TaxonomyJobSpeciesPanel.getInstance(eventBus).getGridJob().mask("Loading", ConstantsSpeciesDiscovery.LOADINGSTYLE); + + SpeciesDiscovery.taxonomySearchService.getListTaxonomyJobs(new AsyncCallback>() { + + @Override + public void onFailure(Throwable caught) { + + } + + @Override + public void onSuccess(List result) { + + if(resetStructures) + TaxonomyJobSpeciesPanel.getInstance(eventBus).getGridJob().unmask(); + + if(result.size()>0){ + + if(resetStructures) + TaxonomyJobSpeciesPanel.getInstance(eventBus).resetStructures(); + + TaxonomyJobSpeciesPanel.getInstance(eventBus).addListJob(result); + } + + } + + }); + } + + else if(type.equals(SearchResultType.OCCURRENCE_POINT)){ + + if(resetStructures) + OccurrenceJobSpeciesPanel.getInstance(eventBus).getGridJob().mask("Loading", ConstantsSpeciesDiscovery.LOADINGSTYLE); + + SpeciesDiscovery.taxonomySearchService.getListOccurrencesJob(new AsyncCallback>() { + + @Override + public void onFailure(Throwable caught) { + + } + + @Override + public void onSuccess(List result) { + + if(resetStructures) + OccurrenceJobSpeciesPanel.getInstance(eventBus).getGridJob().unmask(); + + if(result.size()>0){ + + if(resetStructures) + OccurrenceJobSpeciesPanel.getInstance(eventBus).resetStructures(); + + OccurrenceJobSpeciesPanel.getInstance(eventBus).addListJob(result); + } + + } + + }); + } + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/SpeciesDiscovery.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/SpeciesDiscovery.java new file mode 100644 index 0000000..c467088 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/SpeciesDiscovery.java @@ -0,0 +1,95 @@ +package org.gcube.portlets.user.speciesdiscovery.client; + +import org.gcube.portlets.user.speciesdiscovery.client.rpc.TaxonomySearchService; +import org.gcube.portlets.user.speciesdiscovery.client.rpc.TaxonomySearchServiceAsync; + +import com.allen_sauer.gwt.log.client.Log; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.google.gwt.core.client.EntryPoint; +import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.core.client.Scheduler.ScheduledCommand; +import com.google.gwt.event.logical.shared.ResizeEvent; +import com.google.gwt.event.logical.shared.ResizeHandler; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.RootPanel; + +/** + * Entry point classes define onModuleLoad(). + */ + +public class SpeciesDiscovery implements EntryPoint { + + public static final String SPECIES_DISCOVERY_DIV = "SpeciesDiscovery"; + + public static TaxonomySearchServiceAsync taxonomySearchService = GWT.create(TaxonomySearchService.class); + + protected ContentPanel mainPanel; + + /** + * This is the entry point method. + */ + public void onModuleLoad() { + + Log.setUncaughtExceptionHandler(); + + Scheduler.get().scheduleDeferred(new ScheduledCommand() { + + @Override + public void execute() { + onModuleLoad2(); + + Window.addResizeHandler(new ResizeHandler() { + + @Override + public void onResize(ResizeEvent event) { + updateSize(); + + } + }); + + } + }); + } + + public void onModuleLoad2() { + + RootPanel root = RootPanel.get(SPECIES_DISCOVERY_DIV); + createSearchPanel(); + + if (root!=null){ + GWT.log("SPECIES_DISCOVERY_DIV div found, we are on portal"); + updateSize(); + root.add(mainPanel); + + } else{ + GWT.log("SPECIES_DISCOVERY_DIV div not found, we are out of the portal"); + //mainPanel.setWidth("100%"); + mainPanel.setHeight(600); +// mainPanel.setWidth(930); + RootPanel.get().add(mainPanel); + } + + + } + + protected void createSearchPanel() + { + mainPanel = SearchBorderLayoutPanel.getInstance(); + } + + public void updateSize() { + GWT.log("Resizing"); + RootPanel discovery = RootPanel.get(SPECIES_DISCOVERY_DIV); + + int topBorder = discovery.getAbsoluteTop(); + int leftBorder = discovery.getAbsoluteLeft(); + + int rightScrollBar = 17; + int rootHeight = Window.getClientHeight() - topBorder - 34; + int rootWidth = Window.getClientWidth() - 2* leftBorder - rightScrollBar; + + GWT.log("new size "+rootWidth+"x"+rootHeight); + mainPanel.setPixelSize(rootWidth, rootHeight); + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/SpeciesResultFilterAccordionPanel.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/SpeciesResultFilterAccordionPanel.java new file mode 100644 index 0000000..2cae4e7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/SpeciesResultFilterAccordionPanel.java @@ -0,0 +1,41 @@ +package org.gcube.portlets.user.speciesdiscovery.client; + +import org.gcube.portlets.user.speciesdiscovery.client.filterresult.ResultFilterPanelManager; +import org.gcube.portlets.user.speciesdiscovery.client.util.stream.StreamPagingLoader; + +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.layout.AccordionLayout; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.google.gwt.event.shared.EventBus; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class SpeciesResultFilterAccordionPanel extends ContentPanel { + + public final String headerFilterResultPanel = "Filter your results"; + private ResultFilterPanelManager resultFilterManager = ResultFilterPanelManager.getInstance(); + + public SpeciesResultFilterAccordionPanel(EventBus eventBus, StreamPagingLoader streamPagingLoader) { + init(); + resultFilterManager.bind(streamPagingLoader); + resultFilterManager.setEventBus(eventBus); + } + + private void init() { + setHeaderVisible(true); + setHeading(headerFilterResultPanel); + + setBodyBorder(false); + setLayout(new AccordionLayout()); + // setIcon(Resources.ICONS.accordion()); + + for (ContentPanel panel : resultFilterManager.getListResultFilterPanel()) { + panel.setAnimCollapse(false); + panel.setLayout(new FitLayout()); + add(panel); + } + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/SpeciesResultsPanelCardLayout.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/SpeciesResultsPanelCardLayout.java new file mode 100644 index 0000000..55a00d3 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/SpeciesResultsPanelCardLayout.java @@ -0,0 +1,147 @@ +package org.gcube.portlets.user.speciesdiscovery.client; + +import org.gcube.portlets.user.speciesdiscovery.client.gridview.ResultRowResultsPanel; +import org.gcube.portlets.user.speciesdiscovery.client.gridview.TaxonomyRowResultsPanel; +import org.gcube.portlets.user.speciesdiscovery.client.util.stream.StreamPagingLoader; +import org.gcube.portlets.user.speciesdiscovery.shared.SpeciesCapability; + +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.LayoutContainer; +import com.extjs.gxt.ui.client.widget.layout.CardLayout; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.google.gwt.event.shared.EventBus; +import com.google.gwt.user.client.Element; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class SpeciesResultsPanelCardLayout extends LayoutContainer { + + private CardLayout cardLayout = new CardLayout(); + private static SpeciesResultsPanelCardLayout instance; + private ContentPanel activePanel = null; + private ResultRowResultsPanel resultRowPanel; + private TaxonomyRowResultsPanel taxonomyRowPanel; + private SpeciesCapability currentSelectedCapability; + + + public static SpeciesResultsPanelCardLayout getInstance() { + return instance; + } + + + public SpeciesResultsPanelCardLayout(final EventBus eventBus, StreamPagingLoader loader, SearchController searchController) { + this.resultRowPanel = new ResultRowResultsPanel(eventBus, loader,searchController); + this.taxonomyRowPanel = new TaxonomyRowResultsPanel(eventBus, loader); + + } + + @Override + protected void onRender(Element parent, int pos) { + super.onRender(parent, pos); + setLayout(new FitLayout()); + + ContentPanel cp = new ContentPanel(); + cp.setHeaderVisible(false); + cp.setLayout(cardLayout); + + cp.add(resultRowPanel); + cp.add(taxonomyRowPanel); + + cardLayout.setActiveItem(resultRowPanel); + activePanel = resultRowPanel; + + add(cp); + + }; + + + public void updateCurrentGridView(SpeciesCapability capability) { + this.currentSelectedCapability = capability; + switchGridPanel(); + } + + + private void switchGridPanel(){ + + switch (currentSelectedCapability) { + + case RESULTITEM: + + activePanel = resultRowPanel; + resultRowPanel.resetStore(); + cardLayout.setActiveItem(resultRowPanel); + + break; + + case TAXONOMYITEM: + + activePanel = taxonomyRowPanel; + taxonomyRowPanel.resetStore(); + cardLayout.setActiveItem(taxonomyRowPanel); + + break; + + } + + } + + + public void activeToolBarButtons(boolean b) { + + if(activePanel.equals(resultRowPanel)) + resultRowPanel.activeToolBarButtons(b); + else if(activePanel.equals(taxonomyRowPanel)) + taxonomyRowPanel.activeToolBarButtons(b); + } + + + public void setFilterActive(boolean b, String filterValue) { + if(activePanel.equals(resultRowPanel)) + resultRowPanel.setFilterActive(b, filterValue); + else if(activePanel.equals(taxonomyRowPanel)) + taxonomyRowPanel.setFilterActive(b, filterValue); + + } + + + public void activeBtnShowOnlySelected(boolean b) { + if(activePanel.equals(resultRowPanel)) + resultRowPanel.activeBtnShowOnlySelected(b); + else if(activePanel.equals(taxonomyRowPanel)) + taxonomyRowPanel.activeBtnShowOnlySelected(b); + + } + + + public TaxonomyRowResultsPanel getTaxonomyRowPanel() { + return taxonomyRowPanel; + } + + public void setMaskGridPanel(boolean mask){ + + if(activePanel.equals(resultRowPanel)){ + + if(mask) + resultRowPanel.getClassicGridView().mask(ConstantsSpeciesDiscovery.REQUEST_DATA, ConstantsSpeciesDiscovery.LOADINGSTYLE); + else + resultRowPanel.getClassicGridView().unmask(); + } + + else if(activePanel.equals(taxonomyRowPanel)){ + if(mask) + taxonomyRowPanel.getClassicGridView().mask(ConstantsSpeciesDiscovery.REQUEST_DATA, ConstantsSpeciesDiscovery.LOADINGSTYLE); + else + taxonomyRowPanel.getClassicGridView().unmask(); + } + + } + + + public ResultRowResultsPanel getResultRowPanel() { + return resultRowPanel; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/SpeciesSearchFormPanel.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/SpeciesSearchFormPanel.java new file mode 100644 index 0000000..cb47fe2 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/SpeciesSearchFormPanel.java @@ -0,0 +1,503 @@ +package org.gcube.portlets.user.speciesdiscovery.client; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.advancedsearch.AdvancedSearchPanelManager; +import org.gcube.portlets.user.speciesdiscovery.client.event.CapabilitySelectedEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.SearchCompleteEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.SearchCompleteEventHandler; +import org.gcube.portlets.user.speciesdiscovery.client.event.SearchEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.SearchStartedEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.SearchStartedEventHandler; +import org.gcube.portlets.user.speciesdiscovery.client.filterresult.ResultFilterPanelManager; +import org.gcube.portlets.user.speciesdiscovery.client.resources.Resources; +import org.gcube.portlets.user.speciesdiscovery.client.window.HelpQueryWindow; +import org.gcube.portlets.user.speciesdiscovery.shared.DataSourceModel; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchType; +import org.gcube.portlets.user.speciesdiscovery.shared.SpeciesCapability; + +import com.extjs.gxt.ui.client.Style.VerticalAlignment; +import com.extjs.gxt.ui.client.event.ButtonEvent; +import com.extjs.gxt.ui.client.event.ComponentEvent; +import com.extjs.gxt.ui.client.event.KeyListener; +import com.extjs.gxt.ui.client.event.SelectionChangedEvent; +import com.extjs.gxt.ui.client.event.SelectionChangedListener; +import com.extjs.gxt.ui.client.event.SelectionListener; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.HorizontalPanel; +import com.extjs.gxt.ui.client.widget.Html; +import com.extjs.gxt.ui.client.widget.Info; +import com.extjs.gxt.ui.client.widget.button.ToggleButton; +import com.extjs.gxt.ui.client.widget.form.CheckBox; +import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction; +import com.extjs.gxt.ui.client.widget.form.SimpleComboBox; +import com.extjs.gxt.ui.client.widget.form.SimpleComboValue; +import com.extjs.gxt.ui.client.widget.form.TextArea; +import com.extjs.gxt.ui.client.widget.form.TextField; +import com.extjs.gxt.ui.client.widget.layout.FlowLayout; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.dom.client.KeyCodes; +import com.google.gwt.event.shared.EventBus; +import com.google.gwt.user.client.ui.AbstractImagePrototype; +import com.google.gwt.user.client.ui.Button; + + +/** + * + * @author "Federico De Faveri defaveri@isti.cnr.it" - Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class SpeciesSearchFormPanel extends ContentPanel { + protected static final String SEARCH = "Search"; + protected Button buttSimpleSearch; + protected Button buttSimpleExample; + protected SimpleComboBox searchType; + protected SimpleComboBox searchTypeResults; + protected EventBus eventBus; + protected TextField searchField; + private boolean isActiveAdvanced = false; + private HorizontalPanel hpAdvancedSearchLinks = new HorizontalPanel(); + private final Html htmlLabelAdvs = new Html("Advanced Option"); + private HorizontalPanel horizontalQueryPanel = new HorizontalPanel(); + public static final int NORTHHEIGHT = 140; + private List tabItemList = new ArrayList(); + private AdvancedSearchPanelManager advSearchPanelsManager = AdvancedSearchPanelManager.getInstance(); + private final int DEFAULTLINKPANELTHEIGHT = 22; + + public static enum SEARCHTYPE {SIMPLE, FULLTEXT}; + public TextArea textArea = new TextArea(); + + private SEARCHTYPE currentSearchType = SEARCHTYPE.SIMPLE; + private com.extjs.gxt.ui.client.widget.button.Button buttSearchBy = new com.extjs.gxt.ui.client.widget.button.Button(SEARCHBYQUERY); + private final static String SEARCHBYQUERY = "Text query"; + private final static String SEARCHBYSIMPLE = "Simple query"; + + private HorizontalPanel simpleSearchPanel = new HorizontalPanel(); + private HorizontalPanel querySeachPanel = new HorizontalPanel(); + + protected Button buttQuerySearch; + protected Button buttQueryExample; + + protected CheckBox checkValidateOccurrences = new CheckBox(); + + public SpeciesSearchFormPanel(EventBus eventBus) { + + this.eventBus = eventBus; + bind(); + + horizontalQueryPanel.setStyleAttribute("margin-left", "10px"); + horizontalQueryPanel.setStyleAttribute("margin-top", "15px"); + htmlLabelAdvs.setStyleAttribute("font-size", "11px"); + htmlLabelAdvs.setStyleAttribute("margin-left", "10px"); + + buttSearchBy.setStyleName("button-hyperlink"); + buttSearchBy.setStyleAttribute("margin-top", "8px"); + + setLayout(new FlowLayout()); + setFrame(false); + setHeaderVisible(false); + setBorders(false); + + initComboSearchType(); + initComboSearchTypeResult(); + + init(); + + switchSearchType(SEARCHTYPE.SIMPLE); + + add(advSearchPanelsManager.getPanel()); + } + + + private void initComboSearchType(){ + + searchType = new SimpleComboBox(); + searchType.add(Arrays.asList(new String[]{ConstantsSpeciesDiscovery.SCIENTIFIC_NAME, ConstantsSpeciesDiscovery.COMMON_NAME})); + searchType.setEditable(false); + searchType.setTriggerAction(TriggerAction.ALL); + searchType.setSimpleValue(ConstantsSpeciesDiscovery.SCIENTIFIC_NAME); + + } + + private void initComboSearchTypeResult(){ + + searchTypeResults = new SimpleComboBox(); + searchTypeResults.add(Arrays.asList(new String[]{SpeciesCapability.RESULTITEM.getName(), SpeciesCapability.TAXONOMYITEM.getName()})); + searchTypeResults.setEditable(false); + searchTypeResults.setTriggerAction(TriggerAction.ALL); + searchTypeResults.setSimpleValue(SpeciesCapability.RESULTITEM.getName()); + + searchTypeResults.addSelectionChangedListener(new SelectionChangedListener>() { + + @Override + public void selectionChanged(SelectionChangedEvent> se) { + eventBus.fireEvent(new CapabilitySelectedEvent(getCapability(se.getSelectedItem().getValue()))); + + //TODO + } + }); + + + } + + //RETURN RESULT ITEM OR TAXOMONY ITEM + public SpeciesCapability getSelectedCapability(){ + return getCapability(searchTypeResults.getValue().getValue()); + } + + private SpeciesCapability getCapability(String value){ + if(value.compareTo(SpeciesCapability.TAXONOMYITEM.getName())==0) + return SpeciesCapability.TAXONOMYITEM; + else if(value.compareTo(SpeciesCapability.RESULTITEM.getName())==0) + return SpeciesCapability.RESULTITEM; + else if(value.compareTo(SpeciesCapability.NAMESMAPPING.getName())==0) + return SpeciesCapability.NAMESMAPPING; + else if(value.compareTo(SpeciesCapability.SYNONYMS.getName())==0) + return SpeciesCapability.SYNONYMS; + + return SpeciesCapability.UNKNOWN; + } + + public void switchSearchType(SEARCHTYPE searchType){ + + currentSearchType = searchType; + + if(searchType.equals(SEARCHTYPE.SIMPLE)){ + querySeachPanel.setVisible(false); + simpleSearchPanel.setVisible(true); + buttSearchBy.setText(SEARCHBYQUERY); + hpAdvancedSearchLinks.setEnabled(true); + }else if(searchType.equals(SEARCHTYPE.FULLTEXT)){ + simpleSearchPanel.setVisible(false); + querySeachPanel.setVisible(true); + buttSearchBy.setText(SEARCHBYSIMPLE); + hpAdvancedSearchLinks.setEnabled(false); + activeAdvancedSearch(false); + } + + } + + protected void init() + { + horizontalQueryPanel.setBorders(false); + horizontalQueryPanel.setSize(935, 33); + + searchTypeResults.setStyleAttribute("margin-right", "10px"); + + initSimpleSearchPanel(); + initQuerySearchPanel(); + + createAdvancedSeachLinks(); + + + horizontalQueryPanel.add(simpleSearchPanel); + horizontalQueryPanel.add(querySeachPanel); + + buttSearchBy.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + + if(currentSearchType.equals(SEARCHTYPE.SIMPLE)) + switchSearchType(SEARCHTYPE.FULLTEXT); + else + switchSearchType(SEARCHTYPE.SIMPLE); + + } + }); + + horizontalQueryPanel.add(buttSearchBy); + + + add(horizontalQueryPanel); + add(hpAdvancedSearchLinks); + } + + private void initQuerySearchPanel() { + querySeachPanel.setSpacing(5); + + buttQuerySearch = new Button(SEARCH); + buttQuerySearch.setStyleName("wizardButton"); + + + buttQuerySearch.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + searchByQuery(textArea.getValue()); + + } + }); + + buttQueryExample = new Button("Example", new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + textArea.setValue("'Carcharodon carcharias' as ScientificName in Obis, GBIF return * "); + + } + }); + + buttQueryExample.setStyleName("wizardButton"); + + textArea.setSize(450, 37); + textArea.setEmptyText("Write a query"); + textArea.setStyleAttribute("margin-right", "5px"); + + querySeachPanel.add(textArea); + + com.extjs.gxt.ui.client.widget.button.Button buttQueryInfo = new com.extjs.gxt.ui.client.widget.button.Button(); + buttQueryInfo.setStyleAttribute("margin-right", "15px"); + buttQueryInfo.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getHelpIcon())); + + buttQueryInfo.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + new HelpQueryWindow(); + + } + }); + + querySeachPanel.add(buttQueryInfo); + + querySeachPanel.add(buttQuerySearch); + querySeachPanel.add(buttQueryExample); + + + } + + + private void initSimpleSearchPanel() { + + simpleSearchPanel.setSpacing(5); + simpleSearchPanel.add(searchTypeResults); + simpleSearchPanel.add(searchType); + + searchField = new TextField(); + searchField.setStyleAttribute("margin-left", "10px"); + searchField.setStyleAttribute("margin-right", "10px"); + searchField.setEmptyText(SEARCH); + searchField.setWidth(300); + searchField.addKeyListener(new KeyListener(){ + + @Override + public void componentKeyPress(ComponentEvent event) { + if (event.getKeyCode()==KeyCodes.KEY_ENTER) search(); + } + + }); + + simpleSearchPanel.add(searchField); + + + checkValidateOccurrences.setBoxLabel("validate occurrences"); + checkValidateOccurrences.setValueAttribute("validate occurrences"); + checkValidateOccurrences.setStyleAttribute("margin-right", "10px"); + +// simpleSearchPanel.add(checkValidateOccurrences); + + buttSimpleSearch = new Button(SEARCH); + + buttSimpleSearch.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + search(); + + } + }); + + buttSimpleSearch.setStyleName("wizardButton"); + simpleSearchPanel.add(buttSimpleSearch); + + buttSimpleExample = new Button("Example", new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + searchField.setValue("Carcharodon carcharias"); + + } + }); + + buttSimpleExample.setStyleName("wizardButton"); + simpleSearchPanel.add(buttSimpleExample); + + + } + + public boolean getValueCheckValidateOcccurrences(){ + return this.checkValidateOccurrences.getValue(); + } + + public void setValueCheckValidateOcccurrences(boolean bool){ + this.checkValidateOccurrences.setValue(bool); + } + + public void setVisibleCheckValidateOcccurrences(boolean bool){ + this.checkValidateOccurrences.setVisible(bool); + } + + public void activeButtonSearch(boolean bool){ + buttSimpleSearch.setEnabled(bool); + } + + + private void createAdvancedSeachLinks() { + + hpAdvancedSearchLinks.setVerticalAlign(VerticalAlignment.MIDDLE); + hpAdvancedSearchLinks.setStyleAttribute("marginLeft", "15px"); + hpAdvancedSearchLinks.setStyleAttribute("marginRight", "15px"); + hpAdvancedSearchLinks.setStyleAttribute("marginTop", "5px"); + hpAdvancedSearchLinks.setStyleAttribute("border-bottom", "thin solid #99BBE8;"); + hpAdvancedSearchLinks.setStyleAttribute("background-color", "#EFF5FB"); + hpAdvancedSearchLinks.add(htmlLabelAdvs); + hpAdvancedSearchLinks.setHeight(DEFAULTLINKPANELTHEIGHT); +// imageArrowRight.setStyleAttribute("margin-top", "5px"); +// imageArrowDown.setStyleAttribute("margin-top", "5px"); + + for(final String advPanel : advSearchPanelsManager.getListAdvancedSearchPanels()){ + + ToggleButton butt = new ToggleButton(advPanel); + butt.setToggleGroup("tab"); + butt.setSize(100, -1); + butt.setStyleAttribute("marginLeft", "20px"); + butt.setId(advPanel); + butt.setStyleName("button-hyperlink"); + butt.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getArrowRight())); + + tabItemList.add(butt); + + butt.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + +// isActiveAdvanced = !isActiveAdvanced; + + ToggleButton butt = (ToggleButton) ce.getButton(); + + isActiveAdvanced = butt.isPressed(); + + advSearchPanelsManager.setActivePanel(advPanel); + activeAdvancedSearch(isActiveAdvanced); + changeStateIcons(); + } + + private void changeStateIcons() { + + for(ToggleButton toggle : tabItemList){ + if(toggle.isPressed()){ + toggle.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getArrowDown())); + toggle.getElement().getStyle().setBackgroundColor("#D0DEF0"); + + }else{ + toggle.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getArrowRight())); + toggle.getElement().getStyle().clearBackgroundColor(); +// toggle.getElement().getStyle().setFontWeight(Style.FontWeight.NORMAL); + } + } + } + + }); + + + hpAdvancedSearchLinks.add(butt); + + } + + } + + + private void activeAdvancedSearch(boolean bool){ + + if(bool){ +// htmlLabelAdvs.setHtml(messageAdvActive); + SearchBorderLayoutPanel.getInstance().updateNorthSize(NORTHHEIGHT); + } + else{ +// htmlLabelAdvs.setHtml(messageAdvDeactive); + SearchBorderLayoutPanel.getInstance().updateNorthSize(SearchBorderLayoutPanel.DEFAULTNORTHHEIGHT); + } + } + + protected void search() + { + + String searchTerm = searchField.getValue(); + if (searchTerm!=null && searchTerm.length()!=0) { + +// if(isActiveAdvanced){ + search(searchTerm, + advSearchPanelsManager.getUpperBoundLatitudeField().getValue(), + advSearchPanelsManager.getUpperBoundLongitudeField().getValue(), + advSearchPanelsManager.getLowerBoundLatitudeField().getValue(), + advSearchPanelsManager.getLowerBoundLongitudeField().getValue(), + advSearchPanelsManager.getFromDate().getValue(), + advSearchPanelsManager.getToDate().getValue(), + advSearchPanelsManager.getCheckedDataSources(), + ResultFilterPanelManager.getInstance().getGroupByRank(), + advSearchPanelsManager.getCurrentSelectedCapability()); +// }else +// search(searchTerm,null,null,null,null,null,null); + } + else Info.display("No search term specified", "There is not search term specified"); + + } + + protected void search(String searchTerm, Number upperBoundLongitude, Number upperBoundLatitude, Number lowerBoundLongitude, Number lowerBoundLatitude, Date fromDate, Date toDate, List listDataSources, String groupRank, SpeciesCapability resultType) + { + mask("Searching..."); + //searchButton.setEnabled(false); + + SearchType type = null; + if (ConstantsSpeciesDiscovery.SCIENTIFIC_NAME.equals(searchType.getSimpleValue())) type = SearchType.BY_SCIENTIFIC_NAME; + if (ConstantsSpeciesDiscovery.COMMON_NAME.equals(searchType.getSimpleValue())) type = SearchType.BY_COMMON_NAME; + + SearchEvent event = new SearchEvent(type, searchTerm, upperBoundLongitude, upperBoundLatitude, lowerBoundLongitude, lowerBoundLatitude, fromDate, toDate, listDataSources, groupRank, resultType); + eventBus.fireEvent(event); + } + + + protected void searchByQuery(String query) + { + if (query!=null && query.length()!=0) { + SearchEvent event = new SearchEvent(SearchType.BY_QUERY, query); + eventBus.fireEvent(event); + } + else + Info.display("No query specified", "There is not query specified"); + } + + protected void bind() + { + eventBus.addHandler(SearchStartedEvent.TYPE, new SearchStartedEventHandler() { + + @Override + public void onSearchStarted(SearchStartedEvent event) { + unmask(); + } + }); + eventBus.addHandler(SearchCompleteEvent.TYPE, new SearchCompleteEventHandler() { + + @Override + public void onSearchComplete(SearchCompleteEvent event) { + enableSearch(); + } + }); + } + + protected void enableSearch() + { + buttSimpleSearch.setEnabled(true); + } + + protected void disableSearch() + { + buttSimpleSearch.setEnabled(false); + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/AdvancedSearchInterface.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/AdvancedSearchInterface.java new file mode 100644 index 0000000..f2bd30c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/AdvancedSearchInterface.java @@ -0,0 +1,21 @@ +package org.gcube.portlets.user.speciesdiscovery.client.advancedsearch; + +import com.extjs.gxt.ui.client.widget.form.DateField; +import com.extjs.gxt.ui.client.widget.form.NumberField; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public interface AdvancedSearchInterface { + + //Bounds filter + public NumberField getUpperBoundLatitudeField(); + public NumberField getUpperBoundLongitudeField(); + public NumberField getLowerBoundLatitudeField(); + public NumberField getLowerBoundLongitudeField(); + + //Date filter + public DateField getFromDate(); + public DateField getToDate(); +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/AdvancedSearchPanelEnum.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/AdvancedSearchPanelEnum.java new file mode 100644 index 0000000..d493774 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/AdvancedSearchPanelEnum.java @@ -0,0 +1,24 @@ +package org.gcube.portlets.user.speciesdiscovery.client.advancedsearch; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public enum AdvancedSearchPanelEnum { + BOUNDS("Bounds"), DATE("Date"), TYPE("Type"), REGION("Region"), DATASOURCE("Data Source"), CLASSIFICATION("Classification"); + + private String label; + + AdvancedSearchPanelEnum() { + } + + AdvancedSearchPanelEnum(String label) { + this.label = label; + } + + public String getLabel() { + return label; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/AdvancedSearchPanelInterface.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/AdvancedSearchPanelInterface.java new file mode 100644 index 0000000..6a2eca2 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/AdvancedSearchPanelInterface.java @@ -0,0 +1,18 @@ +package org.gcube.portlets.user.speciesdiscovery.client.advancedsearch; + +import java.util.ArrayList; + +import org.gcube.portlets.user.speciesdiscovery.shared.DataSourceModel; + +import com.extjs.gxt.ui.client.widget.ContentPanel; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public interface AdvancedSearchPanelInterface { + public ContentPanel getPanel(); + public String getName(); + public void resetAdvancedFields(); + public ArrayList getAvailablePlugIn(); +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/AdvancedSearchPanelManager.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/AdvancedSearchPanelManager.java new file mode 100644 index 0000000..a696f46 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/AdvancedSearchPanelManager.java @@ -0,0 +1,225 @@ +package org.gcube.portlets.user.speciesdiscovery.client.advancedsearch; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.shared.DataSourceCapability; +import org.gcube.portlets.user.speciesdiscovery.shared.DataSourceModel; +import org.gcube.portlets.user.speciesdiscovery.shared.SpeciesCapability; + +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.form.DateField; +import com.extjs.gxt.ui.client.widget.form.NumberField; +import com.extjs.gxt.ui.client.widget.layout.CardLayout; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class AdvancedSearchPanelManager extends ContentPanel implements AdvancedSearchInterface{ + + private static AdvancedSearchPanelManager instance; + private BoundsFilter boundsFilter; + private DateFilter dateFilter; + private RegionFilter regionFilter; + private DataSourceFilter dataSourceFilter; + private List listAdvacedPanels = new ArrayList(); + private CardLayout cardLayout = new CardLayout(); +// private ClassificationFilter classificationFilter; + private HashMap listDataSources; + private SpeciesCapability currentSelectedCapability; + + public static synchronized AdvancedSearchPanelManager getInstance() { + if (instance == null) + instance = new AdvancedSearchPanelManager(); + return instance; + } + + private AdvancedSearchPanelManager(){ + + boundsFilter = new BoundsFilter(); + dateFilter = new DateFilter(); + regionFilter = new RegionFilter(); + dataSourceFilter = new DataSourceFilter(); +// classificationFilter = new ClassificationFilter(); + + init(); +// listAdvacedPanels.add(classificationFilter.getName()); + listAdvacedPanels.add(dataSourceFilter.getName()); + listAdvacedPanels.add(boundsFilter.getName()); + listAdvacedPanels.add(dateFilter.getName()); +// listAdvacedPanels.add(regionFilter.getName()); + + } + + private void init() { + + setLayout(cardLayout); + setHeaderVisible(false); + setSize(925, 70); + setBodyBorder(false); + + add(boundsFilter.getPanel()); + add(dateFilter.getPanel()); + add(dataSourceFilter.getPanel()); + add(regionFilter.getPanel()); +// add(classificationFilter.getPanel()); + + cardLayout.setActiveItem(boundsFilter.getPanel()); + } + + + public List getListAdvancedSearchPanels(){ + return listAdvacedPanels; + } + + public void setActivePanel(String name){ + if(name.equals(AdvancedSearchPanelEnum.BOUNDS.getLabel())) + cardLayout.setActiveItem(boundsFilter.getPanel()); + else if(name.equals(AdvancedSearchPanelEnum.DATE.getLabel())) + cardLayout.setActiveItem(dateFilter.getPanel()); + else if(name.equals(AdvancedSearchPanelEnum.DATASOURCE.getLabel())) + cardLayout.setActiveItem(dataSourceFilter.getPanel()); + else if(name.equals(AdvancedSearchPanelEnum.REGION.getLabel())) + cardLayout.setActiveItem(regionFilter.getPanel()); +// else if(name.equals(AdvancedSearchPanelEnum.CLASSIFICATION.getLabel())) +// cardLayout.setActiveItem(classificationFilter.getPanel()); + } + + + public ContentPanel getPanel(){ + return this; + } + + + public NumberField getUpperBoundLatitudeField() { + return boundsFilter.getUpperBoundLatitudeField(); + } + + public NumberField getUpperBoundLongitudeField() { + return boundsFilter.getUpperBoundLongitudeField(); + } + + public NumberField getLowerBoundLatitudeField() { + return boundsFilter.getLowerBoundLatitudeField(); + } + + public NumberField getLowerBoundLongitudeField() { + return boundsFilter.getLowerBoundLongitudeField(); + } + + public DateField getFromDate() { + return dateFilter.getFromDate(); + } + + public DateField getToDate() { + return dateFilter.getToDate(); + } + + public void loadDataSource(List result) { + dataSourceFilter.loadDataSource(result); + + listDataSources = new HashMap(); + + //fill hash + for(DataSourceModel dsm: result){ + listDataSources.put(dsm.getId(), dsm); + } + + setAvailableInfoAdvancedFilters(result); + + } + + private void setAvailableInfoAdvancedFilters(List result) { + + for(DataSourceModel dsm: result){ + for (DataSourceCapability dsc : dsm.getListCapabilities()) { + + ArrayList properties = dsc.getListFilters(); + + for (SpeciesCapability capabilityEnum : properties) { + +// System.out.println("capability " + capabilityEnum.toString()); + + if(capabilityEnum.equals(SpeciesCapability.FROMDATE)) + dateFilter.addAvailablePlugInfo(dsm, SpeciesCapability.FROMDATE); + else if(capabilityEnum.equals(SpeciesCapability.LOWERBOUND)) + boundsFilter.addAvailablePlugInfo(dsm, SpeciesCapability.LOWERBOUND); + else if(capabilityEnum.equals(SpeciesCapability.TODATE)) + dateFilter.addAvailablePlugInfo(dsm, SpeciesCapability.TODATE); + else if(capabilityEnum.equals(SpeciesCapability.UPPERBOUND)) + boundsFilter.addAvailablePlugInfo(dsm, SpeciesCapability.UPPERBOUND); + + } + } + } + + + } + + public void setCurrentCapability(SpeciesCapability capability){ + + this.currentSelectedCapability = capability; + + this.capabilityChange(); + + } + + public void setVisibleAllPanel(boolean bool){ + + boundsFilter.getPanel().setVisible(bool); + dateFilter.getPanel().setVisible(bool); + dataSourceFilter.getPanel().setVisible(bool); + regionFilter.getPanel().setVisible(bool); +// classificationFilter.getPanel().setVisible(bool); + + } + + private void capabilityChange() { + +// dataSourceFilter.disableAllCheck(); + dataSourceFilter.enableCheckByCapability(this.currentSelectedCapability); + + } + + public List getCheckedDataSources() { + return dataSourceFilter.getCheckedGroupList(); + + } + + public HashMap findDataSourceByCapability(SpeciesCapability capability) { + + if(capability.getName().compareTo(SpeciesCapability.RESULTITEM.getName())==0){ + return dataSourceFilter.getHashMapDataSourceOccurrences(); + } + else if(capability.getName().compareTo(SpeciesCapability.TAXONOMYITEM.getName())==0){ + + return dataSourceFilter.getHashMapDataSourceClassification(); + } + + return null; + } + + + public DataSourceModel findDataSourceByCapabilityAndName(SpeciesCapability capability, String dataSourceName) { + + HashMap hashDataSource = findDataSourceByCapability(capability); + + if(hashDataSource!=null) + return hashDataSource.get(dataSourceName); + + return null; + } + + + + public SpeciesCapability getCurrentSelectedCapability() { + return currentSelectedCapability; + } + +// public String getGroupByRank(){ +// return classificationFilter.getSelectedRank(); +// } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/BoundsFilter.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/BoundsFilter.java new file mode 100644 index 0000000..41ff2f7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/BoundsFilter.java @@ -0,0 +1,215 @@ +package org.gcube.portlets.user.speciesdiscovery.client.advancedsearch; + + + +import java.util.ArrayList; + +import org.gcube.portlets.user.speciesdiscovery.client.ConstantsSpeciesDiscovery; +import org.gcube.portlets.user.speciesdiscovery.client.resources.Resources; +import org.gcube.portlets.user.speciesdiscovery.shared.DataSourceModel; +import org.gcube.portlets.user.speciesdiscovery.shared.SpeciesCapability; + +import com.extjs.gxt.ui.client.Style.Scroll; +import com.extjs.gxt.ui.client.event.ButtonEvent; +import com.extjs.gxt.ui.client.event.SelectionListener; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.HorizontalPanel; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.button.ButtonBar; +import com.extjs.gxt.ui.client.widget.button.ToggleButton; +import com.extjs.gxt.ui.client.widget.form.MultiField; +import com.extjs.gxt.ui.client.widget.form.NumberField; +import com.extjs.gxt.ui.client.widget.form.TextArea; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.google.gwt.user.client.ui.AbstractImagePrototype; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class BoundsFilter extends ColumnContainer implements AdvancedSearchPanelInterface { + + private NumberField upperBoundLatitudeField; + private NumberField upperBoundLongitudeField; + private NumberField lowerBoundLatitudeField; + private NumberField lowerBoundLongitudeField; + private ArrayList availablePlugin; + + private ContentPanel boundsPanel = new ContentPanel(); + + private Button btnResetAllFilters = new Button("Reset Filters"); + private TextArea txtAreaInfo = new TextArea(); + + + public BoundsFilter() { + initBoundsPanel(); + btnResetAllFilters.setStyleName("button-hyperlink"); + availablePlugin = new ArrayList(); + } + + @Override + public ContentPanel getPanel() { + return boundsPanel; + } + + private void initBoundsPanel() { + + boundsPanel.setHeaderVisible(false); + boundsPanel.setBodyBorder(false); + + upperBoundLatitudeField = new NumberField(); + upperBoundLatitudeField.setPropertyEditorType(Float.class); + upperBoundLatitudeField.setEmptyText("Latitude"); + + upperBoundLongitudeField = new NumberField(); + upperBoundLongitudeField.setPropertyEditorType(Float.class); + upperBoundLongitudeField.setEmptyText("Longitude"); + + MultiField uppertBound = new MultiField("Upper Bound",upperBoundLatitudeField, upperBoundLongitudeField);uppertBound.setSpacing(5); + left.add(uppertBound); + + lowerBoundLatitudeField = new NumberField(); + lowerBoundLatitudeField.setPropertyEditorType(Float.class); + lowerBoundLatitudeField.setEmptyText("Latitude"); + + lowerBoundLongitudeField = new NumberField(); + lowerBoundLongitudeField.setPropertyEditorType(Float.class); + lowerBoundLongitudeField.setEmptyText("Longitude"); + + MultiField lowerBound = new MultiField("Lower Bound",lowerBoundLatitudeField, lowerBoundLongitudeField); + lowerBound.setSpacing(5); + + left.add(lowerBound); + left.add(uppertBound); + +// // Horizontal alignment right +// LayoutContainer containerRightAlign = new LayoutContainer(); +// HBoxLayout layout2 = new HBoxLayout(); +// layout2.setPadding(new Padding(5)); +// layout2.setHBoxLayoutAlign(HBoxLayoutAlign.MIDDLE); +// layout2.setPack(BoxLayoutPack.END); +// containerRightAlign.setLayout(layout2); +// +// HBoxLayoutData layoutData = new HBoxLayoutData(new Margins(0, 5, 0, 0)); +// containerRightAlign.add(btnResetAllFilters, layoutData); + + + btnResetAllFilters.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + resetAdvancedFields(); + + } + }); + + + final ContentPanel cp = new ContentPanel(); + ButtonBar buttonBar = new ButtonBar(); + + ToggleButton toggleInfo = new ToggleButton(""); + toggleInfo.addSelectionListener(new SelectionListener() { + public void componentSelected(ButtonEvent ce) { + + if (cp.isVisible()) { +// cp.el().slideOut(Direction.LEFT, FxConfig.NONE); + cp.setVisible(false); + } else { + cp.setVisible(true); +// cp.el().slideIn(Direction.RIGHT, FxConfig.NONE); + + } +// cp.setVisible(true); +// cp.el().fadeToggle(FxConfig.NONE); + } + }); + + toggleInfo.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getInfoIcon())); + + toggleInfo.toggle(false); + +// buttonBar.add(btnResetAllFilters); + + buttonBar.add(toggleInfo); + + cp.setVisible(false); + cp.setHeading("Bounds"); + cp.setBodyBorder(false); + + txtAreaInfo.setReadOnly(true); + txtAreaInfo.setValue(ConstantsSpeciesDiscovery.AVAILABLEFILTERBOUND + ": \n"); + + cp.setLayout(new FitLayout()); + + cp.add(txtAreaInfo); + cp.setWidth(300); + cp.setHeight(50); + cp.setScrollMode(Scroll.AUTOY); + cp.setHeaderVisible(false); + + + HorizontalPanel hp = new HorizontalPanel(); + cp.setWidth(310); +// hp.setSpacing(5); + + cp.setStyleAttribute("margin-left", "5px"); + cp.setStyleAttribute("margin-top", "2px"); + + toggleInfo.setStyleAttribute("margin-left", "5px"); + toggleInfo.setStyleAttribute("margin-top", "2px"); + + hp.add(btnResetAllFilters); + hp.add(cp); + hp.add(toggleInfo); + + right.add(hp); +// right.add(cp); + + boundsPanel.add(columnContainer); + + + } + + @Override + public String getName() { + return AdvancedSearchPanelEnum.BOUNDS.getLabel(); + } + + + public void resetAdvancedFields() { + upperBoundLatitudeField.reset(); + upperBoundLongitudeField.reset(); + lowerBoundLatitudeField.reset(); + lowerBoundLongitudeField.reset(); + } + + public NumberField getUpperBoundLatitudeField() { + return upperBoundLatitudeField; + } + + public NumberField getUpperBoundLongitudeField() { + return upperBoundLongitudeField; + } + + public NumberField getLowerBoundLatitudeField() { + return lowerBoundLatitudeField; + } + + public NumberField getLowerBoundLongitudeField() { + return lowerBoundLongitudeField; + } + + public void addAvailablePlugInfo(DataSourceModel plugin, SpeciesCapability capability){ + + availablePlugin.add(plugin); + String currentValue = txtAreaInfo.getValue(); + txtAreaInfo.setValue(currentValue + plugin.getName() + " (" + capability.getName() + "); \n"); + } + + @Override + public ArrayList getAvailablePlugIn() { + return availablePlugin; + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/ClassificationFilter.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/ClassificationFilter.java new file mode 100644 index 0000000..808326e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/ClassificationFilter.java @@ -0,0 +1,99 @@ +package org.gcube.portlets.user.speciesdiscovery.client.advancedsearch; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.ConstantsSpeciesDiscovery; +import org.gcube.portlets.user.speciesdiscovery.shared.DataSourceModel; +import org.gcube.portlets.user.speciesdiscovery.shared.MainTaxonomicRankEnum; + +import com.extjs.gxt.ui.client.event.ButtonEvent; +import com.extjs.gxt.ui.client.event.SelectionListener; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction; +import com.extjs.gxt.ui.client.widget.form.SimpleComboBox; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class ClassificationFilter extends ColumnContainer implements AdvancedSearchPanelInterface { + + private Button btnResetAllFilters = new Button("Reset Filters"); + private ContentPanel classificationFilterPanel = new ContentPanel(); + private SimpleComboBox scb; + private String baseClassification = MainTaxonomicRankEnum.CLASS.getLabel(); //is CLASS + + public ClassificationFilter() { + init(); + btnResetAllFilters.setStyleName("button-hyperlink"); + } + + + private void init() { + + classificationFilterPanel.setHeaderVisible(false); + classificationFilterPanel.setBodyBorder(false); + + initComboRankFilter(); + + left.add(scb); + + scb.setSimpleValue(baseClassification); + + right.add(btnResetAllFilters); + + btnResetAllFilters.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + resetAdvancedFields(); + } + }); + + classificationFilterPanel.add(columnContainer); + } + + @Override + public ContentPanel getPanel() { + return classificationFilterPanel; + } + + @Override + public String getName() { + return AdvancedSearchPanelEnum.CLASSIFICATION.getLabel(); + } + + @Override + public void resetAdvancedFields() { + scb.setSimpleValue(baseClassification); + } + + private SimpleComboBox initComboRankFilter() { + + List ls = new ArrayList(); + + for (String rank : MainTaxonomicRankEnum.getListLabels()) ls.add(rank); + + scb = new SimpleComboBox(); + scb.setFieldLabel(ConstantsSpeciesDiscovery.GROUPBYRANK); + scb.setTypeAhead(true); + scb.setEditable(false); + scb.setTriggerAction(TriggerAction.ALL); + + scb.add(ls); + + return scb; + } + + public String getSelectedRank(){ + return this.scb.getSimpleValue(); + } + + + @Override + public ArrayList getAvailablePlugIn() { + return null; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/ColumnContainer.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/ColumnContainer.java new file mode 100644 index 0000000..8728edc --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/ColumnContainer.java @@ -0,0 +1,41 @@ +package org.gcube.portlets.user.speciesdiscovery.client.advancedsearch; + +import com.extjs.gxt.ui.client.widget.LayoutContainer; +import com.extjs.gxt.ui.client.widget.layout.ColumnData; +import com.extjs.gxt.ui.client.widget.layout.ColumnLayout; +import com.extjs.gxt.ui.client.widget.layout.FormLayout; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class ColumnContainer { + + protected LayoutContainer columnContainer = new LayoutContainer(); + protected LayoutContainer left = new LayoutContainer(); + protected LayoutContainer right = new LayoutContainer(); + + + public ColumnContainer() { + + columnContainer.setLayout(new ColumnLayout()); + columnContainer.setStyleAttribute("marginLeft", "10px"); + columnContainer.setStyleAttribute("marginRight", "10px"); + columnContainer.setStyleAttribute("padding", "5px"); + + + left.setStyleAttribute("paddingRight", "10px"); + FormLayout layout = new FormLayout(); + left.setLayout(layout); + + + right.setStyleAttribute("paddingLeft", "10px"); + layout = new FormLayout(); + right.setLayout(layout); + + + columnContainer.add(left, new ColumnData(.5)); + columnContainer.add(right, new ColumnData(.5)); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/DataSourceFilter.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/DataSourceFilter.java new file mode 100644 index 0000000..5e1f581 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/DataSourceFilter.java @@ -0,0 +1,349 @@ +package org.gcube.portlets.user.speciesdiscovery.client.advancedsearch; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.window.WindowCredits; +import org.gcube.portlets.user.speciesdiscovery.shared.DataSourceCapability; +import org.gcube.portlets.user.speciesdiscovery.shared.DataSourceModel; +import org.gcube.portlets.user.speciesdiscovery.shared.SpeciesCapability; + +import com.extjs.gxt.ui.client.event.ButtonEvent; +import com.extjs.gxt.ui.client.event.SelectionListener; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.form.CheckBox; +import com.extjs.gxt.ui.client.widget.form.CheckBoxGroup; +import com.extjs.gxt.ui.client.widget.form.Field; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.extjs.gxt.ui.client.widget.tips.ToolTipConfig; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.user.client.ui.Anchor; +import com.google.gwt.user.client.ui.HasVerticalAlignment; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.VerticalPanel; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class DataSourceFilter implements AdvancedSearchPanelInterface { + + private ContentPanel dataPanel = new ContentPanel(); + private Button btnResetAllFilters = new Button("Reset Filters"); + + private CheckBoxGroup checkGroup = new CheckBoxGroup(); + private CheckBoxGroup checkGroupOccurrences= new CheckBoxGroup(); + private CheckBoxGroup checkGroupClassification = new CheckBoxGroup(); + +// private ArrayList listDataSourceOccurrences = new ArrayList(); +// private ArrayList listDataSourceClassification = new ArrayList(); + + private HashMap hashMapDataSourceClassification = new HashMap(); + private HashMap hashMapDataSourceOccurrences = new HashMap(); + + + public DataSourceFilter() { +// checkGroup.setFieldLabel("Sources"); + initDataSourceFilter(); + addListners(); + btnResetAllFilters.setStyleName("button-hyperlink"); + } + + + private void initDataSourceFilter() { + + dataPanel.setHeaderVisible(false); + dataPanel.setBodyBorder(false); + dataPanel.setLayout(new FitLayout()); + + dataPanel.setStyleAttribute("marginLeft", "10px"); + dataPanel.setStyleAttribute("marginRight", "10px"); + dataPanel.setStyleAttribute("padding", "5px"); + + VerticalPanel vp = new VerticalPanel(); + + HorizontalPanel hp1 = new HorizontalPanel(); + HorizontalPanel hp2 = new HorizontalPanel(); + +// Html htmlSource = new Html("Occurences Sources: "); + + Anchor htmlSource = new Anchor("Occurences Sources: ", true); + htmlSource.setStyleName("margin-occurrence-link"); + + htmlSource.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + new WindowCredits("Occurrences data sources credits", hashMapDataSourceOccurrences); + + } + }); + + + +// Html htmlSource2 = new Html("Classification Sources: "); + + Anchor htmlSource2 = new Anchor("Classification Sources: ", true); + + htmlSource2.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + new WindowCredits("Classification data sources credits", hashMapDataSourceClassification); + + } + }); + + htmlSource2.setStyleName("margin-occurrence-link"); + +// htmlSource.setStyleAttribute("margin-top", "2px"); +// htmlSource.setStyleAttribute("margin-right", "5px"); +// htmlSource2.setStyleAttribute("margin-top", "2px"); +// htmlSource2.setStyleAttribute("margin-right", "5px"); + + hp1.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE); + hp2.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE); + + hp1.add(htmlSource); + hp2.add(htmlSource2); + + hp1.add(checkGroupOccurrences); + hp2.add(checkGroupClassification); + + +// Anchor anchorAbout1 = new Anchor("Abouts", true); +// +// anchorAbout1.addClickHandler(new ClickHandler() { +// +// @Override +// public void onClick(ClickEvent event) { +// new WindowCredits("Occurrences data sources credits", hashMapDataSourceOccurrences); +// +// } +// }); +// +// Anchor anchorAbout2 = new Anchor("Abouts", true); +// +// anchorAbout2.addClickHandler(new ClickHandler() { +// +// @Override +// public void onClick(ClickEvent event) { +// new WindowCredits("Classification data sources credits", hashMapDataSourceClassification); +// +// } +// }); + +// hp1.add(anchorAbout1); +// hp2.add(anchorAbout2); + + vp.add(hp1); + vp.add(hp2); + + dataPanel.add(vp); + + } + + private void addListners(){ + + btnResetAllFilters.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + resetAdvancedFields(); + + } + }); + } + + @Override + public void resetAdvancedFields() { + + List> listChecks = checkGroup.getAll(); + + for (Field item : listChecks) { + CheckBox checkBox = (CheckBox) item; + checkBox.reset(); + } + } + + + @Override + public ContentPanel getPanel() { + return dataPanel; + } + + + @Override + public String getName() { + return AdvancedSearchPanelEnum.DATASOURCE.getLabel(); + } + + + public List getCheckedGroupList() { + + List listDS = new ArrayList(); + + List values = new ArrayList(); + + if(checkGroup.getValues().size()>0) + values = checkGroup.getValues(); + else{ + List> listChecks = checkGroup.getAll(); + for (Field field : listChecks) { + values.add((CheckBox) field); + } + } + + for (CheckBox checkBox : values) { + if (checkBox.isEnabled()) + listDS.add(new DataSourceModel(checkBox.getValueAttribute(), checkBox.getValueAttribute())); + } + + if(listDS.size()==0) + return null; + + return listDS; + } + + private static Comparator COMPARATOR = new Comparator() + { + // This is where the sorting happens. + public int compare(DataSourceModel o1, DataSourceModel o2) + { + return o1.getName().compareToIgnoreCase(o2.getName()); + } + }; + + + public void loadDataSource(List result) { + + Collections.sort(result, COMPARATOR); + + if(result!=null){ + + for(DataSourceModel dsm: result){ + + System.out.println("Data Source name " + dsm.getName()); + CheckBox check = null; + + for (DataSourceCapability dsc : dsm.getListCapabilities()) { + + System.out.println("\tData Source capability name: " + dsc.getCapability().getName()); + + if(dsc.getCapability().getName().compareTo(SpeciesCapability.RESULTITEM.getName())==0){ + + check = createCheckBox(dsm, SpeciesCapability.RESULTITEM.getName()); + checkGroupOccurrences.add(check); +// if(dsm.getDataSourceRepositoryInfo()!=null) +// listDataSourceOccurrences.add(dsm); + hashMapDataSourceOccurrences.put(dsm.getName(), dsm); + + + System.out.println("\t\t added check " + dsm.getName() + " to checkGroupOccurences " + dsc.getCapability().getName()); + + checkGroup.add(check); + + } + + if(dsc.getCapability().getName().compareTo(SpeciesCapability.TAXONOMYITEM.getName())==0){ + + check = createCheckBox(dsm, SpeciesCapability.TAXONOMYITEM.getName()); + checkGroupClassification.add(check); +// if(dsm.getDataSourceRepositoryInfo()!=null) +// listDataSourceClassification.add(dsm); + + hashMapDataSourceClassification.put(dsm.getName(), dsm); + + System.out.println("\t\t added check " + dsm.getName() + " to checkGroupClassification " + dsc.getCapability().getName()); + + checkGroup.add(check); + } + } + } + setVisibility(); + } + } + + private void setVisibility() { + + if(checkGroup.getAll().size()==0) + checkGroup.setVisible(false); + } + + + public void enableCheckByCapability(SpeciesCapability capability){ + setEnableAllCheck(false, checkGroupClassification); + setEnableAllCheck(false, checkGroupOccurrences); + setCheckByCapability(true,capability); + } + + + private void setCheckByCapability(boolean enable, SpeciesCapability capability){ + + if(capability.getName().compareTo(SpeciesCapability.TAXONOMYITEM.getName())==0){ + setEnableAllCheck(enable, checkGroupClassification); +// checkGroupClassification.setEnabled(enable); + setValueAllCheck(enable, checkGroupClassification); + } + else if(capability.getName().compareTo(SpeciesCapability.RESULTITEM.getName())==0){ + setEnableAllCheck(enable, checkGroupOccurrences); +// checkGroupOccurences.setEnabled(enable); + setValueAllCheck(enable, checkGroupOccurrences); + } + } + + public void setValueAllCheck(boolean checkValue, CheckBoxGroup checksGroup){ + + List> listChecks = checksGroup.getAll(); + + for (Field item : listChecks) { + CheckBox check = (CheckBox) item; + check.setValue(checkValue); + } + } + + + public void setEnableAllCheck(boolean checkValue, CheckBoxGroup checksGroup){ + + List> listChecks = checksGroup.getAll(); + + for (Field item : listChecks) { + CheckBox check = (CheckBox) item; + check.setEnabled(checkValue); + } + } + + private CheckBox createCheckBox(DataSourceModel dsm, String property){ + + CheckBox check = new CheckBox(); +// check.setId(dsm.getId()); +// check.setBoxLabel(dsm.getName() + " ("+property+")"); + check.setBoxLabel(dsm.getName()); + check.setValueAttribute(dsm.getName()); + check.setData("capability", dsm); + check.setToolTip(new ToolTipConfig(dsm.getDescription())); + return check; + + } + + + @Override + public ArrayList getAvailablePlugIn() { + return null; + } + + + public HashMap getHashMapDataSourceClassification() { + return hashMapDataSourceClassification; + } + + + public HashMap getHashMapDataSourceOccurrences() { + return hashMapDataSourceOccurrences; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/DateFilter.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/DateFilter.java new file mode 100644 index 0000000..18f262f --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/DateFilter.java @@ -0,0 +1,207 @@ +package org.gcube.portlets.user.speciesdiscovery.client.advancedsearch; + +import java.util.ArrayList; + +import org.gcube.portlets.user.speciesdiscovery.client.ConstantsSpeciesDiscovery; +import org.gcube.portlets.user.speciesdiscovery.client.resources.Resources; +import org.gcube.portlets.user.speciesdiscovery.shared.DataSourceModel; +import org.gcube.portlets.user.speciesdiscovery.shared.SpeciesCapability; + +import com.extjs.gxt.ui.client.Style.Scroll; +import com.extjs.gxt.ui.client.event.ButtonEvent; +import com.extjs.gxt.ui.client.event.Events; +import com.extjs.gxt.ui.client.event.FieldEvent; +import com.extjs.gxt.ui.client.event.Listener; +import com.extjs.gxt.ui.client.event.SelectionListener; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.HorizontalPanel; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.button.ButtonBar; +import com.extjs.gxt.ui.client.widget.button.ToggleButton; +import com.extjs.gxt.ui.client.widget.form.DateField; +import com.extjs.gxt.ui.client.widget.form.MultiField; +import com.extjs.gxt.ui.client.widget.form.TextArea; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.google.gwt.user.client.ui.AbstractImagePrototype; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class DateFilter extends ColumnContainer implements AdvancedSearchPanelInterface { + + private DateField fromDate; + private DateField toDate; + private Button btnResetAllFilters = new Button("Reset Filters"); + private ContentPanel dateFilterPanel = new ContentPanel(); + private ArrayList availablePlugin; + private TextArea txtAreaInfo = new TextArea(); + + @Override + public ContentPanel getPanel() { + return dateFilterPanel; + } + + @Override + public String getName() { + return AdvancedSearchPanelEnum.DATE.getLabel(); + } + + public DateFilter(){ + initDateFilter(); + btnResetAllFilters.setStyleName("button-hyperlink"); + availablePlugin = new ArrayList(); + } + + private void initDateFilter() { + + dateFilterPanel.setHeaderVisible(false); + dateFilterPanel.setBodyBorder(false); + + fromDate = new DateField(); + fromDate.setStyleAttribute("marginRight", "15px"); + fromDate.setEmptyText("From"); + + toDate = new DateField(); + toDate.setEmptyText("To"); + + MultiField dateField = new MultiField("Date bounds", fromDate, toDate); + dateField.setSpacing(5); + + + left.add(dateField); +// right.add(btnResetAllFilters); + + + btnResetAllFilters.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + resetAdvancedFields(); + + } + }); + + + dateFilterPanel.add(columnContainer); + + fromDate.addListener(Events.Change, new Listener() { + + @Override + public void handleEvent(FieldEvent be) { + + if(fromDate.isValid()) + toDate.setMinValue(fromDate.getValue()); + else{ +// toDate.reset(); + toDate.getDatePicker().clearState(); + } + } + }); + + toDate.addListener(Events.Change, new Listener() { + + @Override + public void handleEvent(FieldEvent be) { + + if(toDate.isValid()){ + fromDate.setMaxValue(toDate.getValue()); + } + else{ +// fromDate.reset(); + fromDate.getDatePicker().clearState(); + } + } + }); + + final ContentPanel cp = new ContentPanel(); + ButtonBar buttonBar = new ButtonBar(); + + ToggleButton toggleInfo = new ToggleButton(""); + toggleInfo.addSelectionListener(new SelectionListener() { + public void componentSelected(ButtonEvent ce) { + + if (cp.isVisible()) { +// cp.el().slideOut(Direction.LEFT, FxConfig.NONE); + cp.setVisible(false); + } else { + cp.setVisible(true); +// cp.el().slideIn(Direction.RIGHT, FxConfig.NONE); + + } +// cp.setVisible(true); +// cp.el().fadeToggle(FxConfig.NONE); + } + }); + + toggleInfo.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getInfoIcon())); + + toggleInfo.toggle(false); + +// buttonBar.add(btnResetAllFilters); + + buttonBar.add(toggleInfo); + + cp.setVisible(false); + cp.setHeading("Bounds"); + cp.setBodyBorder(false); + + txtAreaInfo.setReadOnly(true); + txtAreaInfo.setValue(ConstantsSpeciesDiscovery.AVAILABLEFILTERDATE + ": \n"); + + cp.setLayout(new FitLayout()); + + cp.add(txtAreaInfo); + cp.setWidth(300); + cp.setHeight(50); + cp.setScrollMode(Scroll.AUTOY); + cp.setHeaderVisible(false); + + + HorizontalPanel hp = new HorizontalPanel(); + cp.setWidth(310); +// hp.setSpacing(5); + + cp.setStyleAttribute("margin-left", "5px"); + cp.setStyleAttribute("margin-top", "2px"); + + toggleInfo.setStyleAttribute("margin-left", "5px"); + toggleInfo.setStyleAttribute("margin-top", "2px"); + + hp.add(btnResetAllFilters); + hp.add(cp); + hp.add(toggleInfo); + + right.add(hp); + + } + + public void resetAdvancedFields() { + fromDate.getDatePicker().clearState(); + toDate.getDatePicker().clearState(); + fromDate.reset(); + toDate.reset(); + + } + + public DateField getFromDate() { + return fromDate; + } + + public DateField getToDate() { + return toDate; + } + + public void addAvailablePlugInfo(DataSourceModel plugin, SpeciesCapability capability){ + + availablePlugin.add(plugin); + String currentValue = txtAreaInfo.getValue(); + txtAreaInfo.setValue(currentValue + plugin.getName() + " (" + capability.getName() + "); \n"); + } + + @Override + public ArrayList getAvailablePlugIn() { + return availablePlugin; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/RegionFilter.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/RegionFilter.java new file mode 100644 index 0000000..5dcbdbf --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/advancedsearch/RegionFilter.java @@ -0,0 +1,57 @@ +package org.gcube.portlets.user.speciesdiscovery.client.advancedsearch; + +import java.util.ArrayList; + +import org.gcube.portlets.user.speciesdiscovery.shared.DataSourceModel; + +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.button.Button; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class RegionFilter extends ColumnContainer implements AdvancedSearchPanelInterface { + + private Button btnResetAllFilters = new Button("Reset Filters"); + private ContentPanel regionFilterPanel = new ContentPanel(); + + public RegionFilter() { + init(); + btnResetAllFilters.setStyleName("button-hyperlink"); + } + + + private void init() { + + regionFilterPanel.setHeaderVisible(false); + regionFilterPanel.setBodyBorder(false); + + } + + + @Override + public ContentPanel getPanel() { + return regionFilterPanel; + } + + @Override + public String getName() { + return AdvancedSearchPanelEnum.REGION.getLabel(); + } + + @Override + public void resetAdvancedFields() { + // TODO Auto-generated method stub + + } + + + @Override + public ArrayList getAvailablePlugIn() { + return null; + } + + + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/cluster/TabItemForTaxonomyRow.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/cluster/TabItemForTaxonomyRow.java new file mode 100644 index 0000000..6a270d3 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/cluster/TabItemForTaxonomyRow.java @@ -0,0 +1,886 @@ +package org.gcube.portlets.user.speciesdiscovery.client.cluster; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.SpeciesDiscovery; +import org.gcube.portlets.user.speciesdiscovery.client.resources.Resources; +import org.gcube.portlets.user.speciesdiscovery.client.util.TaxonomyGridField; +import org.gcube.portlets.user.speciesdiscovery.shared.CommonName; +import org.gcube.portlets.user.speciesdiscovery.shared.ItemParameter; +import org.gcube.portlets.user.speciesdiscovery.shared.TaxonomyRow; +import org.gcube.portlets.user.speciesdiscovery.shared.util.NormalizeString; + +import com.allen_sauer.gwt.log.client.Log; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.Html; +import com.extjs.gxt.ui.client.widget.Info; +import com.extjs.gxt.ui.client.widget.LayoutContainer; +import com.extjs.gxt.ui.client.widget.TabPanel; +import com.extjs.gxt.ui.client.widget.Text; +import com.extjs.gxt.ui.client.widget.VerticalPanel; +import com.extjs.gxt.ui.client.widget.layout.ColumnLayout; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.shared.EventBus; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.AbstractImagePrototype; +import com.google.gwt.user.client.ui.Anchor; +import com.google.gwt.user.client.ui.FlexTable; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Image; +import com.google.gwt.user.client.ui.Label; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class TabItemForTaxonomyRow { + + private TabPanel tabPanel; + private AbstractImagePrototype imageLoading = AbstractImagePrototype.create(Resources.INSTANCE.loadingBalls()); + private EventBus eventBus; + +// private List parents = null; + private TablesForTaxonomyRow tablesForTaxonomyRow; + + private TaxonomyRow currentTaxonomy; + + public void setCurrentTaxonomy(TaxonomyRow taxonomy){ + this.currentTaxonomy = taxonomy; + } + + + public TabItemForTaxonomyRow(TablesForTaxonomyRow tablesForTaxonomyRow, TabPanel tabPanel2, EventBus eventBus2) { + this.tablesForTaxonomyRow = tablesForTaxonomyRow; + this.tabPanel = tabPanel2; + this.eventBus = eventBus2; + } + + + /** + * + * @param taxonomy + * @param isNewTab - set true if has been clicked a classification link, or false otherwise + * @return + */ + + public VerticalPanel getPanelClassificationForTaxonomy(TaxonomyRow taxonomy, String dataSource, boolean isNewTab){ + + VerticalPanel vpClassification = new VerticalPanel(); + vpClassification.setSpacing(5); + + if(taxonomy!=null){ + + //CREATE CLASSIFICATION FOR PARENT ITEM + int parentsSize = taxonomy.getParents().size(); + for(int i=parentsSize-1; i>=0; i--){ + createPanelForParentTaxonomy(taxonomy.getParents().get(i), vpClassification, taxonomy.getServiceId(), isNewTab, dataSource, i+1); + } + + //CREATE CLASSIFICATION FOR ITEM + createPanelForParentTaxonomy(taxonomy, vpClassification, taxonomy.getServiceId(), isNewTab, dataSource, 0); + } + + return vpClassification; + + } + + /** + * Create a scientific classification: for each parent rank create a link, for current search item create a label + * @param taxon + * @param vpClassification + * @param taxonomyServiceId + * @param isNewTab + * @param parentIndex + */ + public void createPanelForParentTaxonomy(TaxonomyRow taxon, VerticalPanel vpClassification, String taxonomyServiceId, boolean isNewTab, String dataSource, int parentIndex){ + + if(taxon==null) + return; + +// createPanelForParentTaxonomy(taxon.getParents(), vpClassification, taxonomyServiceId, isNewTab, dataSource); + + HorizontalPanel hp = new HorizontalPanel(); + Text labelRank; + if(!NormalizeString.isUndefined(taxon.getRank())) + labelRank = new Text(taxon.getRank()+":"); + else + labelRank = new Text("Rank not found"+":"); +// labelRank.setStyleAttribute("margin-right", "10px"); + hp.add(labelRank); + hp.setCellWidth(labelRank, "120px"); + + Anchor anchor = getAnchorByTaxonomy(taxon, dataSource, parentIndex); + hp.add(anchor); + hp.setCellHorizontalAlignment(anchor, HorizontalPanel.ALIGN_LEFT); + vpClassification.add(hp); + + //DEBUG +// System.out.println("taxon.getName()" +taxon.getName() + " serviceid : "+taxon.getServiceId() + " taxonomyServiceId "+taxonomyServiceId); +// System.out.println("taxon.getServiceId().compareTo(taxonomyServiceId)==0 "+ taxon.getServiceId().compareTo(taxonomyServiceId)); +// System.out.println("isNewTab"+ isNewTab); + if((taxon.getServiceId().compareTo(taxonomyServiceId)==0) && isNewTab){ + loadChildrenListOfItem(vpClassification, taxon, dataSource, taxon.getName(), -1); //parentIndex == -1 means that parent is currentTaxonomy + } + } + + private void loadChildrenListOfItem(final VerticalPanel vpClassification, final TaxonomyRow taxonomyItem, final String dataSource, final String parentName, final int parentIndex){ + + final ContentPanel cp = new ContentPanel(); + cp.setId("cp" + taxonomyItem.getId()); + cp.setHeaderVisible(false); + cp.setBodyBorder(false); + cp.add(imageLoading.createImage()); + vpClassification.add(cp); + + //FOR DEBUG +// TaxonomyRow printParent = taxonomyItem; + System.out.println("Load child of item name: " + parentName + " parent id: " + taxonomyItem.getServiceId()); +// while(printParent!=null){ +// +// System.out.println("Parent Name: " + printParent.getName() + " parent id: " +printParent.getServiceId()); +// printParent = printParent.getParent(); +// } + + SpeciesDiscovery.taxonomySearchService.loadListChildByParentId(taxonomyItem.getServiceId(), new AsyncCallback>() { + + @Override + public void onSuccess(ArrayList result) { + Log.trace("Children returned in client: " + result.size() + " for parentName " +parentName); + + LayoutContainer lc = new LayoutContainer(); + lc.setLayout(new ColumnLayout()); + + vpClassification.remove(cp); + + HorizontalPanel hp = new HorizontalPanel(); + Text labelRank = new Text("Rank not found:"); + hp.add(labelRank); + hp.setCellWidth(labelRank, "120px"); + + boolean setRank = false; + + if(result.size()>0){ + for (int i=0; i"+taxon.getName()+"", true); + + anchor.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + + System.out.println("parent index: "+parentIndex + " size "+currentTaxonomy.getParents().size()); + + if(parentIndex >=0 && parentIndex<=currentTaxonomy.getParents().size()){ + System.out.println("set parent true"); + taxon.setParent(currentTaxonomy.getParents().subList(parentIndex, currentTaxonomy.getParents().size())); + } + else if(parentIndex == -1){ //items loaded from get children - the current Taxonomy item is the parent + + List list = new ArrayList(); + list.add(currentTaxonomy); + list.addAll(currentTaxonomy.getParents()); + + System.out.println("parentIndex == -1"); + printParents(taxon); + taxon.setParent(list); + } + + + printParents(taxon); + + tablesForTaxonomyRow.addTabItem(taxon, dataSource); + + } + }); + } + + return anchor; + } + + + void printParents(TaxonomyRow taxon){ + + System.out.println("principal "+taxon.getName()); + int i = 0; + for (TaxonomyRow tax : taxon.getParents()) { + System.out.println(++i + " parent name " + tax.getName()); + } + } + + + private Text getLabelByTaxonomy(final TaxonomyRow taxon) + { + Text label = null; + + if(taxon!=null){ + if(!NormalizeString.isUndefined(taxon.getName())) + label = new Text(taxon.getName()); + else + label = new Text("Name not found"); + } + return label; + } + + public Html getHTMLTableForTaxonomy(TaxonomyRow row, boolean isNewTab){ + + //Init values + String dataProviderName = ""; + String dataSetCitation= ""; + String matchingAccordionTo= ""; + String rank= ""; +// String matchingCredits= ""; + + String statusName = ""; + String dateModified = ""; + String statusRemark = ""; + + String author = ""; + String lsid = ""; + String credits = ""; + + String propertiesHtml = ""; + + if(row.getDataProviderName()!=null) dataProviderName = row.getDataProviderName(); + if(row.getStatusName()!=null) statusName = row.getStatusName(); + if(row.getDateModified()!=null) dateModified = row.getDateModified(); + + if(row.getDataSetCitation()!=null) dataSetCitation = row.getDataSetCitation(); + if(row.getRank()!=null) rank = row.getRank(); + if(row.getAccordingTo()!=null) matchingAccordionTo = row.getAccordingTo(); + + if(row.getStatusRemarks()!=null) statusRemark = row.getStatusRemarks(); + + if(row.getAuthor()!=null) author = row.getAuthor(); + + if(row.getLsid()!=null) lsid = row.getLsid(); + + if(row.getCredits()!=null) credits = row.getCredits(); + + + if(row.getProperties()!=null){ + + List hashProperties = row.getProperties(); + Collections.sort(hashProperties, ItemParameter.COMPARATOR); + + propertiesHtml+=""; + + for (ItemParameter itemParameter : hashProperties) { + + propertiesHtml+= + "" + + " " + + " " + + ""; + } + + propertiesHtml+="
"+itemParameter.getKey()+""+itemParameter.getValue()+"
"; + } + + + //Create list common name + String commonNames = ""; + +// if(isNewTab){ + if(row.getCommonNames()!=null){ + for (CommonName comName : row.getCommonNames()) { + commonNames+= ""+comName.getName()+"" +" ("+comName.getLanguage()+") - "; + } + } +// } + + + String table = ""; + +// if(isNewTab) + table+= + "" + + " " + + " " + + ""; + + + table+="" + + " " + + " " + + "" + + "" + + " " + + " " + + "" + + "" + + " " + + " " + + "" + + "" + + " " + + " " + + "" + + "" + + " " + + " " + + "" + + "" + + " " + + " " + + "" + +// "" + +// " " + +// " " + +// "" + + "" + + " " + + " " + + "" + + "" + + " " + + " " + + "" + + "" + + " " + + " " + + "" + + + "" + + " " + + " " + + "" + + + "
"+TaxonomyGridField.COMMON_NAMES.getName()+" (Language)"+commonNames+"
"+TaxonomyGridField.STATUSREFNAME.getName()+""+statusName+"
"+TaxonomyGridField.STATUS_REMARKS.getName()+""+statusRemark+"
"+TaxonomyGridField.DATASOURCE.getName()+""+dataProviderName+"
"+TaxonomyGridField.DATEMODIFIED.getName()+""+dateModified+"
"+TaxonomyGridField.MATCHING_RANK.getName()+""+rank+"
"+TaxonomyGridField.CITATION.getName()+""+dataSetCitation+"
"+TaxonomyGridField.MATCHING_AUTHOR.getName()+""+matchingAccordionTo+"
"+TaxonomyGridField.LSID.getName()+""+lsid+"
"+TaxonomyGridField.AUTHOR.getName()+""+author+"
"+TaxonomyGridField.CREDITS.getName()+""+credits+"
"+TaxonomyGridField.PROPERTIES.getName()+""+propertiesHtml+"
"; + return new Html(table); + + } + + + public FlexTable getHTMLTableForTaxonomyWithRef(final TaxonomyRow row,boolean isNewTab, final String dataSource) { + + // Init values + String dataProviderName = ""; + String dataSetCitation = ""; + String matchingAccordionTo = ""; + String rank = ""; + // String matchingCredits= ""; + + String statusName = ""; + String dateModified = ""; + String statusRemark = ""; + + String author = ""; + String lsid = ""; + String credits = ""; + + String refId = null; + + String propertiesHtml = ""; + + if (row.getDataProviderName() != null) + dataProviderName = row.getDataProviderName(); + if (row.getStatusName() != null) + statusName = row.getStatusName(); + if (row.getDateModified() != null) + dateModified = row.getDateModified(); + + if (row.getDataSetCitation() != null) + dataSetCitation = row.getDataSetCitation(); + if (row.getRank() != null) + rank = row.getRank(); + if (row.getAccordingTo() != null) + matchingAccordionTo = row.getAccordingTo(); + + if (row.getStatusRemarks() != null) + statusRemark = row.getStatusRemarks(); + + if (row.getAuthor() != null) + author = row.getAuthor(); + + if (row.getLsid() != null) + lsid = row.getLsid(); + + if (row.getCredits() != null) + credits = row.getCredits(); + + if (row.getStatusRefId() != null && !row.getStatusRefId().isEmpty()) + refId = row.getStatusRefId(); + + if (row.getProperties() != null) { + + List hashProperties = row.getProperties(); + Collections.sort(hashProperties, + ItemParameter.COMPARATOR); + + propertiesHtml += ""; + + for (ItemParameter itemParameter : hashProperties) { + + propertiesHtml += "" + " " + " " + ""; + } + + propertiesHtml += "
" + + itemParameter.getKey() + "" + + itemParameter.getValue() + "
"; + } + + // Create list common name + String commonNames = ""; + + // if(isNewTab){ + if (row.getCommonNames() != null) { + for (CommonName comName : row.getCommonNames()) { + commonNames += "" + comName.getName() + "" + " (" + + comName.getLanguage() + ") - "; + } + } + // } + + final FlexTable flexTable = new FlexTable(); + + flexTable.setStyleName("imagetable"); + + flexTable.setWidget(0, 0,new Label(TaxonomyGridField.COMMON_NAMES.getName())); + flexTable.setWidget(0, 1, new Html(commonNames)); + + flexTable.setWidget(1, 0,new Label(TaxonomyGridField.STATUSREFNAME.getName())); + flexTable.setWidget(1, 1, new Label(statusName)); + + if (refId != null) { + + final String status; + + if(!statusRemark.isEmpty()) + status = statusRemark; + else + status = statusName; + + final String referenceId = refId; + + flexTable.setWidget(2, 0, new Label(TaxonomyGridField.STATUS_REMARKS.getName())); + + AbstractImagePrototype synonyms = AbstractImagePrototype.create(Resources.INSTANCE.getSearch()); + + final Image imageStatusRemark = synonyms.createImage(); + imageStatusRemark.setStyleName("image-load-synonyms"); + imageStatusRemark.setAltText("show accepted name"); + imageStatusRemark.setTitle("show accepted name"); + final LayoutContainer layoutContainer = new LayoutContainer(); + + final Label labelStatusRemark = new Label(statusRemark); + labelStatusRemark.addStyleName("status-of"); + layoutContainer.add(labelStatusRemark); + + imageStatusRemark.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + flexTable.remove(layoutContainer); + if(row.getParents().size()>0) + getTaxonomyByReferenceId(flexTable, 2, 1, status, referenceId, dataSource, row.getParents()); + + } + }); + + layoutContainer.add(labelStatusRemark); + layoutContainer.add(imageStatusRemark); + + flexTable.setWidget(2, 1, layoutContainer); + + } else { + flexTable.setWidget(2, 0, new Label(TaxonomyGridField.STATUS_REMARKS.getName())); + flexTable.setWidget(2, 1, new Label(statusRemark)); + } + + + //Create row get synonyms + flexTable.setWidget(3, 0,new Label(TaxonomyGridField.SYNONYMS.getName())); + + AbstractImagePrototype synonyms = AbstractImagePrototype.create(Resources.INSTANCE.getSearch()); + + final Image imageSynonyms = synonyms.createImage(); + imageSynonyms.setStyleName("image-load-synonyms"); + imageSynonyms.setAltText("show synonyms"); + imageSynonyms.setTitle("show synonyms"); + + imageSynonyms.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + flexTable.remove(imageSynonyms); + +// DEBUG +// System.out.println("getSynonyms of "+row.getName() + " serviceId "+row.getServiceId()); + + + if(row.getParents().size()>0){ + + + //TODO + getSynonymsByReferenceId(flexTable, 3, 1, row.getServiceId(),dataSource, row.getParents()); + + + + } + } + }); + + flexTable.setWidget(3, 1, imageSynonyms); + + + flexTable.setWidget(4, 0,new Label(TaxonomyGridField.DATASOURCE.getName())); + flexTable.setWidget(4, 1, new Label(dataProviderName)); + + flexTable.setWidget(5, 0,new Label(TaxonomyGridField.DATEMODIFIED.getName())); + flexTable.setWidget(5, 1, new Label(dateModified)); + + flexTable.setWidget(6, 0, + new Label(TaxonomyGridField.MATCHING_RANK.getName())); + flexTable.setWidget(6, 1, new Label(rank)); + + flexTable.setWidget(7, 0, + new Label(TaxonomyGridField.CITATION.getName())); + flexTable.setWidget(7, 1, new Label(dataSetCitation)); + + flexTable.setWidget(8, 0, new Label(TaxonomyGridField.LSID.getName())); + flexTable.setWidget(8, 1, new Label(lsid)); + + flexTable + .setWidget(9, 0, new Label(TaxonomyGridField.AUTHOR.getName())); + flexTable.setWidget(9, 1, new Label(author)); + + flexTable.setWidget(10, 0, + new Label(TaxonomyGridField.CREDITS.getName())); + flexTable.setWidget(10, 1, new Label(credits)); + + flexTable.setWidget(11, 0, + new Label(TaxonomyGridField.PROPERTIES.getName())); + flexTable.setWidget(11, 1, new Html(propertiesHtml)); + + for (int i = 0; i < flexTable.getRowCount(); i++) { + flexTable.getFlexCellFormatter().setStyleName(i, 0, "title"); + } + + return flexTable; + + } + + public void getSynonymsByReferenceId(FlexTable flexTable, int row, int col, String refId, final String dataSource, final List parents){ + + final LayoutContainer layoutContainer = new LayoutContainer(); + final Image loading = AbstractImagePrototype.create(Resources.INSTANCE.loadingBalls()).createImage(); + layoutContainer.add(loading); + + flexTable.setWidget(row, col, layoutContainer); + + SpeciesDiscovery.taxonomySearchService.retrieveSynonymsByRefId(refId, new AsyncCallback>() { + + @Override + public void onFailure(Throwable caught) { + Info.display("Error laoding child", "An error occurred in loading, retry."); + Log.error("Error laoding child", "An error occurred in loading, retry." +caught); + + } + + @Override + public void onSuccess(List result) { + + Log.trace("getReferenceById return " +result.size() + " items"); +// System.out.println("getReferenceById return " +result.size() + " items"); + if(result.size()>0){ + layoutContainer.remove(loading); + + LayoutContainer lc = new LayoutContainer(); + lc.setLayout(new ColumnLayout()); + + if(result.size()>0){ + for (int i=0; i parents){ + + final LayoutContainer layoutContainer = new LayoutContainer(); +// hp.getElement().getStyle().setBorderStyle(BorderStyle.NONE); +// hp.getElement().getStyle().setBorderWidth(0, Unit.PX); + final Label status = new Label(statusRemark); + + layoutContainer.add(status); +// hp.setCellWidth(status, "160px"); + final Image loading = AbstractImagePrototype.create(Resources.INSTANCE.loadingBalls()).createImage(); + layoutContainer.add(loading); + + flexTable.setWidget(row, col, layoutContainer); + + List listId = new ArrayList(); + listId.add(refId); + + SpeciesDiscovery.taxonomySearchService.retrieveTaxonomyByIds(listId, new AsyncCallback>() { + + @Override + public void onFailure(Throwable caught) { + Info.display("Error laoding child", "An error occurred in loading, retry."); + Log.error("Error laoding child", "An error occurred in loading, retry." +caught); + + } + + @Override + public void onSuccess(List result) { + + Log.trace("getReferenceById return " +result.size() + " items"); +// System.out.println("getReferenceById return " +result.size() + " items"); + if(result.size()>0){ + layoutContainer.remove(status); + layoutContainer.remove(loading); + + Label labelOf = new Label(statusRemark + " for "); + layoutContainer.add(labelOf); + + LayoutContainer lc = new LayoutContainer(); + lc.setLayout(new ColumnLayout()); + + if(result.size()>0){ + for (int i=0; i

" + taxon.getName() + "


")); +// contentPanel.add(new Html("

Scientific Classification


")); +// +// contentPanel.add(getPanelClassificationForTaxonomy(taxon, dataSource, isNewTab)); +// +// contentPanel.add(getHTMLTableForTaxonomyWithRef(taxon, isNewTab, dataSource,parentIndex)); +// +// return contentPanel; +// +// } + +// protected void addTabItem(final TaxonomyRow taxon, final String dataSource, final int parentIndex){ +// +// +// TabItem tabItem = new TabItem(); +//// tabItem.setLayout(new FitLayout()); +// tabItem.setScrollMode(Scroll.AUTO); +// tabItem.setClosable(true); +// +// +// ContentPanel cp = new ContentPanel(); +// cp.setHeaderVisible(false); +// ToolBar toolbar = new ToolBar(); +// +// +// Button btnSaveTaxonomyChildren = new Button(ConstantsSpeciesDiscovery.SAVE_TAXONOMY_CHILDREN); +// Menu formatSubMenu = new Menu(); +// btnSaveTaxonomyChildren.setMenu(formatSubMenu); +// btnSaveTaxonomyChildren.setScale(ButtonScale.SMALL); +// btnSaveTaxonomyChildren.setIconAlign(IconAlign.TOP); +// btnSaveTaxonomyChildren.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getSaveProducts())); +// btnSaveTaxonomyChildren.setToolTip(new ToolTipConfig(ConstantsSpeciesDiscovery.SAVE_TAXONOMY_CHILDREN, ConstantsSpeciesDiscovery.SAVES_TAXONOMY_CHILDREN_FROM_RESULT)); +// +// MenuItem darwinCoreArchiveItem = new MenuItem(ConstantsSpeciesDiscovery.DARWIN_CORE_ARCHIVE); +// darwinCoreArchiveItem.setToolTip(new ToolTipConfig(ConstantsSpeciesDiscovery.SAVES_IN_DARWIN_CORE_ARCHIVE_FORMAT)); +// darwinCoreArchiveItem.addSelectionListener(new SelectionListener() { +// +// @Override +// public void componentSelected(MenuEvent ce) { +// eventBus.fireEvent(new CreateTaxonomyJobEvent(taxon, dataSource, TaxonomyJobType.BYCHILDREN)); +// } +// }); +// +// formatSubMenu.add(darwinCoreArchiveItem); +// toolbar.add(btnSaveTaxonomyChildren); +// +// cp.setTopComponent(toolbar); +// cp.setBodyBorder(false); +//// cp.setScrollMode(Scroll.AUTOY); +// +// String tabName = taxon.getName() + " ("+ dataSource + ")"; +// tabItem.setText(tabName); +// +// cp.add(getPanelForTaxonomy(taxon, dataSource, true, parentIndex)); +// +// tabItem.add(cp); +// +// tabPanel.add(tabItem); +// +// } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/cluster/TablesForResultRow.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/cluster/TablesForResultRow.java new file mode 100644 index 0000000..a2182d7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/cluster/TablesForResultRow.java @@ -0,0 +1,159 @@ +package org.gcube.portlets.user.speciesdiscovery.client.cluster; + +import java.util.Collections; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.util.SpeciesGridFields; +import org.gcube.portlets.user.speciesdiscovery.shared.CommonName; +import org.gcube.portlets.user.speciesdiscovery.shared.ItemParameter; +import org.gcube.portlets.user.speciesdiscovery.shared.ResultRow; + +import com.extjs.gxt.ui.client.widget.Html; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class TablesForResultRow { + + public static Html getTableForResultRow(ResultRow row, String classification){ + + //Init values + String dataSourceName = ""; + String dataProviderName = ""; + String dataSetName = ""; + String dataSetCitation= ""; + String matchingTaxonName= ""; + String matchingAccordionTo= ""; + String matchingRank= ""; + String matchingCredits= ""; + int occurencesCount = 0; + + String author = ""; + String lsid = ""; + String credits = ""; + + String propertiesHtml = ""; + + + //Validate values + if(row.getParents()!=null){ + + if(row.getParents().get(0).getName()!=null) matchingTaxonName = row.getParents().get(0).getName(); + + if(row.getParents().get(0).getAccordingTo()!=null) matchingAccordionTo = row.getParents().get(0).getAccordingTo(); + + if(row.getParents().get(0).getRank()!=null) matchingRank = row.getParents().get(0).getRank(); + } + + if(row.getDataSourceName()!=null) dataSourceName = row.getDataSourceName(); + if(row.getDataProviderName()!=null) dataProviderName = row.getDataProviderName(); + if(row.getDataSetName()!=null) dataSetName = row.getDataSetName(); + if(row.getDataSetCitation()!=null) dataSetCitation = row.getDataSetCitation(); + if(row.getMatchingCredits()!=null) matchingCredits = row.getMatchingCredits(); + if(row.getOccurencesCount()!=0) occurencesCount = row.getOccurencesCount(); + + + String commonNames = ""; + if(row.getCommonNames()!=null){ + for (CommonName comName : row.getCommonNames()) { + commonNames+= ""+comName.getName()+"" +" ("+comName.getLanguage()+") - "; + } + } + + + if(row.getAuthor()!=null) author = row.getAuthor(); + + if(row.getLsid()!=null) lsid = row.getLsid(); + + if(row.getCredits()!=null) credits = row.getCredits(); + + + if(row.getProperties()!=null){ + + List listProperties = row.getProperties(); + Collections.sort(listProperties, ItemParameter.COMPARATOR); + + propertiesHtml+=""; + + for (ItemParameter itemParameter : listProperties) { + + propertiesHtml+= + "" + + " " + + " " + + ""; + } + + propertiesHtml+="
"+itemParameter.getKey()+""+itemParameter.getValue()+"
"; + } + + String table = "" + + "" + + " " + + "" + + "" + + " " + + " " + + "" + + "" + + " " + + " " + + "" + + + "" + + " " + + " " + + "" + + "" + + " " + + " " + + "" + + "" + + " " + + " " + + "" + +// "" + +// " " + +// " " + +// "" + + "" + + " " + + " " + + "" + + "" + + " " + + " " + + "" + +// "" + +// " " + +// " " + +// "" + + "" + + " " + + " " + + "" + + + "" + + " " + + " " + + "" + + "" + + " " + + " " + + "" + + "" + + " " + + " " + + "" + + + "" + + " " + + " " + + "" + + + "
"+matchingTaxonName+"
"+SpeciesGridFields.CLASSIFICATION_STRING.getName()+""+classification+"
"+SpeciesGridFields.COMMON_NAMES.getName()+" (Language)"+commonNames+"
"+SpeciesGridFields.DATASOURCE.getName()+""+dataSourceName+"
"+SpeciesGridFields.DATAPROVIDER.getName()+""+dataProviderName+"
"+SpeciesGridFields.DATASET.getName()+""+dataSetName+"
"+SpeciesGridFields.MATCHING_AUTHOR.getName()+""+matchingAccordionTo+"
"+SpeciesGridFields.MATCHING_RANK.getName()+""+matchingRank+"
"+SpeciesGridFields.DATASET_CITATION.getName()+""+dataSetCitation+"
"+SpeciesGridFields.MATCHING_CREDITS.getName()+""+matchingCredits+"
"+SpeciesGridFields.PRODUCT_OCCURRENCES.getName()+""+occurencesCount+"
"+SpeciesGridFields.LSID.getName()+""+lsid+"
"+SpeciesGridFields.AUTHOR.getName()+""+author+"
"+SpeciesGridFields.CREDITS.getName()+""+credits+"
"+SpeciesGridFields.PROPERTIES.getName()+""+propertiesHtml+"
"; + return new Html(table); + + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/cluster/TablesForTaxonomyRow.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/cluster/TablesForTaxonomyRow.java new file mode 100644 index 0000000..2eec5ab --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/cluster/TablesForTaxonomyRow.java @@ -0,0 +1,178 @@ +package org.gcube.portlets.user.speciesdiscovery.client.cluster; + +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.ConstantsSpeciesDiscovery; +import org.gcube.portlets.user.speciesdiscovery.client.event.CreateTaxonomyJobEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.CreateTaxonomyJobEvent.TaxonomyJobType; +import org.gcube.portlets.user.speciesdiscovery.client.resources.Resources; +import org.gcube.portlets.user.speciesdiscovery.shared.TaxonomyRow; + +import com.extjs.gxt.ui.client.Style.ButtonScale; +import com.extjs.gxt.ui.client.Style.IconAlign; +import com.extjs.gxt.ui.client.Style.Scroll; +import com.extjs.gxt.ui.client.event.MenuEvent; +import com.extjs.gxt.ui.client.event.SelectionListener; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.Html; +import com.extjs.gxt.ui.client.widget.TabItem; +import com.extjs.gxt.ui.client.widget.TabPanel; +import com.extjs.gxt.ui.client.widget.VerticalPanel; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.menu.Menu; +import com.extjs.gxt.ui.client.widget.menu.MenuItem; +import com.extjs.gxt.ui.client.widget.tips.ToolTipConfig; +import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; +import com.google.gwt.event.shared.EventBus; +import com.google.gwt.user.client.ui.AbstractImagePrototype; +import com.google.gwt.user.client.ui.FlexTable; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class TablesForTaxonomyRow { + + private TabPanel tabPanel; + private EventBus eventBus; + + private List parents = null; + private TabItemForTaxonomyRow tabTR; + +// private HashMap hashTR = new HashMap(); + + + public List getParents() { + return parents; + } + + public void setParents(List parents) { + this.parents = parents; + } + + + public TablesForTaxonomyRow(TabPanel tabPanel2, EventBus eventBus2) { + this.tabPanel = tabPanel2; + this.eventBus = eventBus2; + + this.tabTR = new TabItemForTaxonomyRow(this, this.tabPanel, this.eventBus); + } + + + /** + * + * @param taxonomy + * @param isNewTab - set true if has been clicked a classification link, or false otherwise + * @return + */ + + public VerticalPanel getPanelClassificationForTaxonomy(TaxonomyRow taxonomy, String dataSource, boolean isNewTab){ + +// hashTR.put(taxonomy.getIdToString(),tabTR); + + tabTR.setCurrentTaxonomy(taxonomy); + + //DEBUG + System.out.println("in getPanelClassificationForTaxonomy..."); + System.out.println("principal "+taxonomy.getName() + " id " + taxonomy.getServiceId()+" parents"); + int i=0; + for (TaxonomyRow tax : taxonomy.getParents()) { + System.out.println(++i + " parent name " + tax.getName()); + } + + return tabTR.getPanelClassificationForTaxonomy(taxonomy, dataSource, isNewTab); + } + + + /** + * + * @param row + * @param isNewTab + * @param dataSource + * @param parentIndex + * @return + */ + public FlexTable getHTMLTableForTaxonomyWithRef(final TaxonomyRow row,boolean isNewTab, final String dataSource) { + + return tabTR.getHTMLTableForTaxonomyWithRef(row, isNewTab, dataSource); + } + + + protected ContentPanel getPanelForTaxonomy(TaxonomyRow taxon, String dataSource, boolean isNewTab) { + + ContentPanel contentPanel = new ContentPanel(); +// contentPanel.setLayout(new FitLayout()); + contentPanel.setHeaderVisible(false); + contentPanel.setBodyBorder(false); + + contentPanel.setStyleAttribute("padding", "5px"); + contentPanel.setStyleAttribute("margin", "5px"); + + VerticalPanel verticaPanel = new VerticalPanel(); + verticaPanel.setSize("100%", "100%"); + + contentPanel.add(new Html("

" + taxon.getName() + "


")); + contentPanel.add(new Html("

Scientific Classification


")); + + contentPanel.add(getPanelClassificationForTaxonomy(taxon, dataSource, isNewTab)); + + contentPanel.add(getHTMLTableForTaxonomyWithRef(taxon, isNewTab, dataSource)); + + return contentPanel; + + } + + protected void addTabItem(final TaxonomyRow taxon, final String dataSource){ + + this.tabTR = new TabItemForTaxonomyRow(this, this.tabPanel, this.eventBus); + + TabItem tabItem = new TabItem(); +// tabItem.setLayout(new FitLayout()); + tabItem.setScrollMode(Scroll.AUTO); + tabItem.setClosable(true); + + + ContentPanel cp = new ContentPanel(); + cp.setHeaderVisible(false); + ToolBar toolbar = new ToolBar(); + + + Button btnSaveTaxonomyChildren = new Button(ConstantsSpeciesDiscovery.SAVE_TAXONOMY_CHILDREN); + Menu formatSubMenu = new Menu(); + btnSaveTaxonomyChildren.setMenu(formatSubMenu); + btnSaveTaxonomyChildren.setScale(ButtonScale.SMALL); + btnSaveTaxonomyChildren.setIconAlign(IconAlign.TOP); + btnSaveTaxonomyChildren.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getSaveProducts())); + btnSaveTaxonomyChildren.setToolTip(new ToolTipConfig(ConstantsSpeciesDiscovery.SAVE_TAXONOMY_CHILDREN, ConstantsSpeciesDiscovery.SAVES_TAXONOMY_CHILDREN_FROM_RESULT)); + + MenuItem darwinCoreArchiveItem = new MenuItem(ConstantsSpeciesDiscovery.DARWIN_CORE_ARCHIVE); + darwinCoreArchiveItem.setToolTip(new ToolTipConfig(ConstantsSpeciesDiscovery.SAVES_IN_DARWIN_CORE_ARCHIVE_FORMAT)); + darwinCoreArchiveItem.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(MenuEvent ce) { + eventBus.fireEvent(new CreateTaxonomyJobEvent(taxon, dataSource, TaxonomyJobType.BYCHILDREN)); + } + }); + + formatSubMenu.add(darwinCoreArchiveItem); + toolbar.add(btnSaveTaxonomyChildren); + + cp.setTopComponent(toolbar); + cp.setBodyBorder(false); +// cp.setScrollMode(Scroll.AUTOY); + + String tabName = taxon.getName() + " ("+ dataSource + ")"; + tabItem.setText(tabName); + + cp.add(getPanelForTaxonomy(taxon, dataSource, true)); + + tabItem.add(cp); + + tabPanel.add(tabItem); + + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/detail/SpeciesDetail.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/detail/SpeciesDetail.java new file mode 100644 index 0000000..f764eb1 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/detail/SpeciesDetail.java @@ -0,0 +1,36 @@ +package org.gcube.portlets.user.speciesdiscovery.client.detail; + +import org.gcube.portlets.user.speciesdiscovery.client.util.SpeciesDetailsFields; + +import com.extjs.gxt.ui.client.data.BaseModel; +import com.google.gwt.user.client.rpc.IsSerializable; + +public class SpeciesDetail extends BaseModel implements IsSerializable { + + /** + * + */ + private static final long serialVersionUID = 7073479182629932572L; + + + public SpeciesDetail() { + } + + public SpeciesDetail(String name, String value, String group) { + set(SpeciesDetailsFields.NAME.getId(), name); + set(SpeciesDetailsFields.GROUP.getId(), group); + set(SpeciesDetailsFields.VALUE.getId(), value); + } + + public String getGroup(){ + return get(SpeciesDetailsFields.GROUP.getId()); + } + + public String getName(){ + return get(SpeciesDetailsFields.NAME.getId()); + } + + public String getValue(){ + return get(SpeciesDetailsFields.VALUE.getId()); + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/detail/SpeciesDetailsPanel.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/detail/SpeciesDetailsPanel.java new file mode 100644 index 0000000..ec1be11 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/detail/SpeciesDetailsPanel.java @@ -0,0 +1,122 @@ +package org.gcube.portlets.user.speciesdiscovery.client.detail; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.resources.Resources; +import org.gcube.portlets.user.speciesdiscovery.client.util.SpeciesDetailsFields; +import org.gcube.portlets.user.speciesdiscovery.client.util.SpeciesGridFields; +import org.gcube.portlets.user.speciesdiscovery.client.util.Util; +import org.gcube.portlets.user.speciesdiscovery.shared.CommonName; +import org.gcube.portlets.user.speciesdiscovery.shared.ResultRow; + +import com.extjs.gxt.ui.client.Style.Scroll; +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.store.GroupingStore; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.grid.ColumnConfig; +import com.extjs.gxt.ui.client.widget.grid.ColumnModel; +import com.extjs.gxt.ui.client.widget.grid.Grid; +import com.extjs.gxt.ui.client.widget.grid.GridGroupRenderer; +import com.extjs.gxt.ui.client.widget.grid.GroupColumnData; +import com.extjs.gxt.ui.client.widget.grid.GroupingView; +import com.extjs.gxt.ui.client.widget.layout.FlowLayout; +import com.google.gwt.user.client.ui.Image; + +public class SpeciesDetailsPanel extends ContentPanel { + + private Image image = new Image(Resources.INSTANCE.getNoPictureAvailable()); + + private Grid grid; + + private GroupingStore store = new GroupingStore(); + + public SpeciesDetailsPanel() { + + setLayout(new FlowLayout()); + setHeading("Species Details"); + setScrollMode(Scroll.AUTO); + + image.setTitle("Species picture"); + image.setAltText(""); + image.setSize(String.valueOf(Resources.INSTANCE.getNoPictureAvailable().getWidth()), String.valueOf(Resources.INSTANCE.getNoPictureAvailable().getHeight())); + + + add(image); + + store.groupBy(SpeciesDetailsFields.GROUP.getId()); + List columns = new ArrayList(); + + ColumnConfig name = Util.createColumnConfig(SpeciesDetailsFields.NAME, 100); + columns.add(name); + ColumnConfig value = Util.createColumnConfig(SpeciesDetailsFields.VALUE, 100); + columns.add(value); + ColumnModel cm = new ColumnModel(columns); + + GroupingView view = new GroupingView(); + view.setShowGroupedColumn(false); + view.setForceFit(true); + view.setSortingEnabled(false); + view.setStartCollapsed(true); + + view.setGroupRenderer(new GridGroupRenderer() { + public String render(GroupColumnData data) { + String l = data.models.size() == 1 ? "Item" : "Items"; + return data.group + " (" + data.models.size() + " " + l + ")"; + } + }); + + + grid = new Grid(store, cm); + grid.setView(view); + grid.setBorders(true); + grid.setHeight(318); + + + add(grid); + } + + public void setSpeciesData(ModelData data){ +// System.out.println("Setting details"); + mask("Loading details.."); + + String scientificName = data.get(SpeciesGridFields.MATCHING_NAME.getId()); + setHeading(scientificName+" details."); + + + String imageUrl = data.get(SpeciesGridFields.IMAGE.getId()); + image.setUrl(imageUrl!=null?imageUrl:Resources.INSTANCE.getNoPictureAvailable().getSafeUri().asString()); + image.setAltText("Image for "+scientificName); + image.setTitle(scientificName); + image.setPixelSize(Resources.INSTANCE.getNoPictureAvailable().getWidth(), Resources.INSTANCE.getNoPictureAvailable().getHeight()); + + ArrayList details = new ArrayList(); + + ResultRow row = (ResultRow) data.get(SpeciesGridFields.ROW.getId()); + + + for (CommonName commonName:row.getCommonNames()) { + details.add(new SpeciesDetail(commonName.getLanguage(), commonName.getName(), SpeciesGridFields.COMMON_NAMES.getName())); + } + + + details.add(new SpeciesDetail(SpeciesGridFields.DATASOURCE.getName(), row.getDataSourceName(), SpeciesGridFields.PROVENANCE.getName())); + details.add(new SpeciesDetail(SpeciesGridFields.DATAPROVIDER.getName(), row.getDataProviderName(), SpeciesGridFields.PROVENANCE.getName())); + details.add(new SpeciesDetail(SpeciesGridFields.DATASET.getName(), row.getDataSetName(), SpeciesGridFields.PROVENANCE.getName())); + details.add(new SpeciesDetail(SpeciesGridFields.DATASET_CITATION.getName(), row.getDataSetCitation(), SpeciesGridFields.PROVENANCE.getName())); + +// details.add(new SpeciesDetail(SpeciesGridFields.PRODUCT_IMAGES.getName(), String.valueOf(row.getImagesCount()), SpeciesGridFields.PRODUCTS.getName())); +// details.add(new SpeciesDetail(SpeciesGridFields.PRODUCT_MAPS.getName(), String.valueOf(row.getMapsCount()), SpeciesGridFields.PRODUCTS.getName())); +// details.add(new SpeciesDetail(SpeciesGridFields.PRODUCT_LAYERS.getName(), String.valueOf(row.getLayersCount()), SpeciesGridFields.PRODUCTS.getName())); + details.add(new SpeciesDetail(SpeciesGridFields.PRODUCT_OCCURRENCES.getName(), String.valueOf(row.getOccurencesCount()), SpeciesGridFields.PRODUCTS.getName())); + + store.removeAll(); + store.add(details); +// System.out.println("Details added "+details.size()); + //grid.getView().refresh(false); + unmask(); + //Log.debug("store contains : "+store.getModels().size()); + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ActiveButtonCheckAllRowEvent.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ActiveButtonCheckAllRowEvent.java new file mode 100644 index 0000000..cf0317d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ActiveButtonCheckAllRowEvent.java @@ -0,0 +1,35 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.GwtEvent; + + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class ActiveButtonCheckAllRowEvent extends GwtEvent { + + public static final GwtEvent.Type TYPE = new Type(); + private boolean activeFilter; + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(ActiveButtonCheckAllRowEventHandler handler) { + handler.onActiveCkeckAllRow(this); + } + + public ActiveButtonCheckAllRowEvent(boolean activeFilter) { + this.activeFilter = activeFilter; + } + + public boolean isActiveFilter() { + return activeFilter; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ActiveButtonCheckAllRowEventHandler.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ActiveButtonCheckAllRowEventHandler.java new file mode 100644 index 0000000..5e795e0 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ActiveButtonCheckAllRowEventHandler.java @@ -0,0 +1,16 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.EventHandler; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public interface ActiveButtonCheckAllRowEventHandler extends EventHandler { + public void onActiveCkeckAllRow(ActiveButtonCheckAllRowEvent activeFilterCheckAllRowEvent); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ActiveFilterOnResultEvent.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ActiveFilterOnResultEvent.java new file mode 100644 index 0000000..7bb801f --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ActiveFilterOnResultEvent.java @@ -0,0 +1,37 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import org.gcube.portlets.user.speciesdiscovery.shared.filter.ResultFilter; + +import com.google.gwt.event.shared.GwtEvent; + + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class ActiveFilterOnResultEvent extends GwtEvent { + + public static final GwtEvent.Type TYPE = new Type(); + private ResultFilter activeFilterObject; + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(ActiveFilterOnResultEventHandler handler) { + handler.onActiveFilter(this); + } + + public ActiveFilterOnResultEvent(ResultFilter activeFilter) { + this.activeFilterObject = activeFilter; + } + + public ResultFilter getActiveFilterObject() { + return activeFilterObject; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ActiveFilterOnResultEventHandler.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ActiveFilterOnResultEventHandler.java new file mode 100644 index 0000000..f364a4b --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ActiveFilterOnResultEventHandler.java @@ -0,0 +1,15 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.EventHandler; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface ActiveFilterOnResultEventHandler extends EventHandler { + public void onActiveFilter(ActiveFilterOnResultEvent activeFilterOnResultEvent); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ActiveMaskLoadingGrid.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ActiveMaskLoadingGrid.java new file mode 100644 index 0000000..f5ed67e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ActiveMaskLoadingGrid.java @@ -0,0 +1,38 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.GwtEvent; + + + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class ActiveMaskLoadingGrid extends GwtEvent { + + public static final GwtEvent.Type TYPE = new Type(); + private boolean active; + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(ActiveMaskLoadingGridHandler handler) { + handler.onActiveMaskLoadingGrid(this); + } + + public ActiveMaskLoadingGrid(boolean active) { + this.active = active; + } + + public boolean isActive() { + return active; + } +} + + diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ActiveMaskLoadingGridHandler.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ActiveMaskLoadingGridHandler.java new file mode 100644 index 0000000..11e182a --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ActiveMaskLoadingGridHandler.java @@ -0,0 +1,17 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.EventHandler; + + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public interface ActiveMaskLoadingGridHandler extends EventHandler { + public void onActiveMaskLoadingGrid(ActiveMaskLoadingGrid activeLoadingGrid); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/CapabilitySelectedEvent.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/CapabilitySelectedEvent.java new file mode 100644 index 0000000..08719f1 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/CapabilitySelectedEvent.java @@ -0,0 +1,42 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import org.gcube.portlets.user.speciesdiscovery.shared.SpeciesCapability; + +import com.google.gwt.event.shared.GwtEvent; + + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class CapabilitySelectedEvent extends GwtEvent { + + public static final GwtEvent.Type TYPE = new Type(); + + private SpeciesCapability capability; + + public CapabilitySelectedEvent(SpeciesCapability capability) { + this.capability = capability; + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(CapabilitySelectedEventHandler handler) { + handler.onCapabilitySelected(this); + } + + public SpeciesCapability getCapability() { + return capability; + } + + public void setCapability(SpeciesCapability capability) { + this.capability = capability; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/CapabilitySelectedEventHandler.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/CapabilitySelectedEventHandler.java new file mode 100644 index 0000000..6206bc8 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/CapabilitySelectedEventHandler.java @@ -0,0 +1,15 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.EventHandler; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface CapabilitySelectedEventHandler extends EventHandler { + public void onCapabilitySelected(CapabilitySelectedEvent capabilitySelectedEvent); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ChangeFilterClassificationOnResultEvent.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ChangeFilterClassificationOnResultEvent.java new file mode 100644 index 0000000..0bfde18 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ChangeFilterClassificationOnResultEvent.java @@ -0,0 +1,26 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.GwtEvent; + + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class ChangeFilterClassificationOnResultEvent extends GwtEvent { + + public static final GwtEvent.Type TYPE = new Type(); + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(ChangeFilterClassificationOnResultEventHandler handler) { + handler.onChangeFilter(this); + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ChangeFilterClassificationOnResultEventHandler.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ChangeFilterClassificationOnResultEventHandler.java new file mode 100644 index 0000000..da5ff2e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ChangeFilterClassificationOnResultEventHandler.java @@ -0,0 +1,15 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.EventHandler; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface ChangeFilterClassificationOnResultEventHandler extends EventHandler { + public void onChangeFilter(ChangeFilterClassificationOnResultEvent changeFilterClassificationOnResultEvent); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/CompletedLoadDataSourceEvent.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/CompletedLoadDataSourceEvent.java new file mode 100644 index 0000000..3b6dcf1 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/CompletedLoadDataSourceEvent.java @@ -0,0 +1,29 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.GwtEvent; + + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class CompletedLoadDataSourceEvent extends GwtEvent { + + public static final GwtEvent.Type TYPE = new Type(); + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(CompletedLoadDataSourceEventHandler handler) { + handler.onCompletedLoadDataSource(this); + } + + public CompletedLoadDataSourceEvent() { + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/CompletedLoadDataSourceEventHandler.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/CompletedLoadDataSourceEventHandler.java new file mode 100644 index 0000000..38e18fa --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/CompletedLoadDataSourceEventHandler.java @@ -0,0 +1,17 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.EventHandler; + +/** + * @author francesco-mangiacrapa + * + */ +public interface CompletedLoadDataSourceEventHandler extends EventHandler { + + public void onCompletedLoadDataSource( + CompletedLoadDataSourceEvent completedLoadDataSourceEvent); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/CreateOccurrenceJobEvent.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/CreateOccurrenceJobEvent.java new file mode 100644 index 0000000..2b6ea43 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/CreateOccurrenceJobEvent.java @@ -0,0 +1,104 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.shared.OccurrencesSaveEnum; +import org.gcube.portlets.user.speciesdiscovery.shared.SaveFileFormat; + +import com.google.gwt.event.shared.GwtEvent; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class CreateOccurrenceJobEvent extends GwtEvent { + + public static final GwtEvent.Type TYPE = new Type(); + private SaveFileFormat fileFormat; + private int expectedOccurrences; + private OccurrencesSaveEnum saveEnum; + private List listDataSourceFound; + private String searchTerm; + private boolean isByDataSource; + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(CreateOccurrenceJobEventHandler handler) { + handler.onCreateSpeciesJob(this); + } + + /** + * + * @param fileFormat + * @param expectedOccurrences + * @param save + * @param listDataSourceFound + * @param searchTerm + * @param isByDataSource + */ + public CreateOccurrenceJobEvent(SaveFileFormat fileFormat, int expectedOccurrences, OccurrencesSaveEnum save, List listDataSourceFound, String searchTerm, boolean isByDataSource) { + this.fileFormat = fileFormat; + this.expectedOccurrences = expectedOccurrences; + this.saveEnum = save; + this.listDataSourceFound = listDataSourceFound; + this.searchTerm = searchTerm; + this.isByDataSource = isByDataSource; + } + + public OccurrencesSaveEnum getSaveEnum() { + return saveEnum; + } + + public void setSaveEnum(OccurrencesSaveEnum saveEnum) { + this.saveEnum = saveEnum; + } + + public List getListDataSourceFound() { + return listDataSourceFound; + } + + public void setListDataSourceFound(ArrayList listDataSourceFound) { + this.listDataSourceFound = listDataSourceFound; + } + + public SaveFileFormat getFileFormat() { + return fileFormat; + } + + public void setFileFormat(SaveFileFormat fileFormat) { + this.fileFormat = fileFormat; + } + + public int getExpectedOccurrences() { + return expectedOccurrences; + } + + public void setExpectedOccurrences(int expectedOccurrences) { + this.expectedOccurrences = expectedOccurrences; + } + + public String getSearchTerm() { + return searchTerm; + } + + public void setSearchTerm(String searchTerm) { + this.searchTerm = searchTerm; + } + + public boolean isByDataSource() { + return isByDataSource; + } + + public void setByDataSource(boolean isByDataSource) { + this.isByDataSource = isByDataSource; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/CreateOccurrenceJobEventHandler.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/CreateOccurrenceJobEventHandler.java new file mode 100644 index 0000000..0e9ae71 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/CreateOccurrenceJobEventHandler.java @@ -0,0 +1,17 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.EventHandler; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public interface CreateOccurrenceJobEventHandler extends EventHandler { + + public void onCreateSpeciesJob(CreateOccurrenceJobEvent createOccurrenceJobEvent); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/CreateTaxonomyJobEvent.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/CreateTaxonomyJobEvent.java new file mode 100644 index 0000000..ee808da --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/CreateTaxonomyJobEvent.java @@ -0,0 +1,73 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import org.gcube.portlets.user.speciesdiscovery.shared.TaxonomyRow; + +import com.google.gwt.event.shared.GwtEvent; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class CreateTaxonomyJobEvent extends GwtEvent { + + public static final GwtEvent.Type TYPE = new Type(); + private TaxonomyRow taxonomy; + private String dataSourceName; + public enum TaxonomyJobType {BYCHILDREN, BYIDS}; + private TaxonomyJobType jobType; + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(CreateTaxonomyJobEventHandler handler) { + handler.onCreateSpeciesJob(this); + } + + /** + * + * @param taxonomy + * @param dataSourceName + * @param type + * @param rank + */ + public CreateTaxonomyJobEvent(TaxonomyRow taxonomy, String dataSourceName, TaxonomyJobType jobType) { + this.taxonomy = taxonomy; + this.dataSourceName = dataSourceName; + this.jobType = jobType; + } + + /** + * + * @param jobType + */ + public CreateTaxonomyJobEvent(TaxonomyJobType jobType){ + this.jobType = jobType; + } + + public TaxonomyJobType getJobType() { + return jobType; + } + + public TaxonomyRow getTaxonomy() { + return taxonomy; + } + + public void setTaxonomy(TaxonomyRow taxonomy) { + this.taxonomy = taxonomy; + } + + public String getDataSourceName() { + return dataSourceName; + } + + public void setDataSourceName(String dataSourceName) { + this.dataSourceName = dataSourceName; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/CreateTaxonomyJobEventHandler.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/CreateTaxonomyJobEventHandler.java new file mode 100644 index 0000000..770e57e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/CreateTaxonomyJobEventHandler.java @@ -0,0 +1,17 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.EventHandler; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public interface CreateTaxonomyJobEventHandler extends EventHandler { + + public void onCreateSpeciesJob(CreateTaxonomyJobEvent createSpeciesJobEvent); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/DisableFilterEvent.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/DisableFilterEvent.java new file mode 100644 index 0000000..8d9ee60 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/DisableFilterEvent.java @@ -0,0 +1,28 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.GwtEvent; + + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class DisableFilterEvent extends GwtEvent { + + public static final GwtEvent.Type TYPE = new Type(); + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(DisableFilterEventHandler handler) { + handler.onDisableFilter(this); + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/DisableFilterEventHandler.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/DisableFilterEventHandler.java new file mode 100644 index 0000000..d0bbafa --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/DisableFilterEventHandler.java @@ -0,0 +1,15 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.EventHandler; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface DisableFilterEventHandler extends EventHandler { + public void onDisableFilter(DisableFilterEvent disableFilterEvent); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/LoadDataSourceEvent.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/LoadDataSourceEvent.java new file mode 100644 index 0000000..8006949 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/LoadDataSourceEvent.java @@ -0,0 +1,29 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.GwtEvent; + + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class LoadDataSourceEvent extends GwtEvent { + + public static final GwtEvent.Type TYPE = new Type(); + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(LoadDataSourceEventHandler handler) { + handler.onLoadDataSource(this); + } + + public LoadDataSourceEvent() { + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/LoadDataSourceEventHandler.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/LoadDataSourceEventHandler.java new file mode 100644 index 0000000..e78f16c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/LoadDataSourceEventHandler.java @@ -0,0 +1,15 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.EventHandler; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface LoadDataSourceEventHandler extends EventHandler { + public void onLoadDataSource(LoadDataSourceEvent loadDataSourceEvent); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ReLoadListJobEvent.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ReLoadListJobEvent.java new file mode 100644 index 0000000..267a800 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ReLoadListJobEvent.java @@ -0,0 +1,40 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import org.gcube.portlets.user.speciesdiscovery.shared.SearchResultType; + +import com.google.gwt.event.shared.GwtEvent; + + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class ReLoadListJobEvent extends GwtEvent { + + public static final GwtEvent.Type TYPE = new Type(); + + private SearchResultType loadType; + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public ReLoadListJobEvent(SearchResultType loadType){ + this.loadType = loadType; + } + + public SearchResultType getLoadType() { + return loadType; + } + + @Override + protected void dispatch(ReLoadListJobEventHandler handler) { + handler.onLoadJobList(this); + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ReLoadListJobEventHandler.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ReLoadListJobEventHandler.java new file mode 100644 index 0000000..a8a2bdb --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ReLoadListJobEventHandler.java @@ -0,0 +1,16 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.EventHandler; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public interface ReLoadListJobEventHandler extends EventHandler { + public void onLoadJobList(ReLoadListJobEvent loadJobListEvent); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ReSubmitJobEvent.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ReSubmitJobEvent.java new file mode 100644 index 0000000..a40cf65 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ReSubmitJobEvent.java @@ -0,0 +1,56 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import org.gcube.portlets.user.speciesdiscovery.shared.JobOccurrencesModel; +import org.gcube.portlets.user.speciesdiscovery.shared.JobTaxonomyModel; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchResultType; + +import com.google.gwt.event.shared.GwtEvent; + + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class ReSubmitJobEvent extends GwtEvent { + + public static final GwtEvent.Type TYPE = new Type(); + + private SearchResultType loadType; + + private JobOccurrencesModel jobOccurrenceModel; + + private JobTaxonomyModel jobTaxonomyModel; + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public ReSubmitJobEvent(SearchResultType loadType, JobOccurrencesModel jobOccurrenceModel, JobTaxonomyModel jobTaxonomyModel){ + this.loadType = loadType; + this.jobOccurrenceModel = jobOccurrenceModel; + this.jobTaxonomyModel = jobTaxonomyModel; + } + + public SearchResultType getLoadType() { + return loadType; + } + + @Override + protected void dispatch(ReSubmitJobEventHandler handler) { + handler.onResubmitJob(this); + + } + + public JobOccurrencesModel getJobOccurrenceModel() { + return jobOccurrenceModel; + } + + public JobTaxonomyModel getJobTaxonomyModel() { + return jobTaxonomyModel; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ReSubmitJobEventHandler.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ReSubmitJobEventHandler.java new file mode 100644 index 0000000..0c70a20 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ReSubmitJobEventHandler.java @@ -0,0 +1,15 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.EventHandler; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public interface ReSubmitJobEventHandler extends EventHandler { + public void onResubmitJob(ReSubmitJobEvent reSubmitJobEvent); +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SaveItemsEvent.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SaveItemsEvent.java new file mode 100644 index 0000000..dbe8841 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SaveItemsEvent.java @@ -0,0 +1,91 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import org.gcube.portlets.user.speciesdiscovery.shared.OccurrencesSaveEnum; +import org.gcube.portlets.user.speciesdiscovery.shared.SaveFileFormat; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchResultType; + +import com.google.gwt.event.shared.GwtEvent; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class SaveItemsEvent extends GwtEvent { + + public static final GwtEvent.Type TYPE = new Type(); + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(SaveItemsEventHandler handler) { + handler.onSaveOccurrences(this); + } + + protected SaveFileFormat fileFormat; + protected SearchResultType itemType; + private int expectedPoints; + private OccurrencesSaveEnum csvType; + + + /** + * @param taxonomyItem + * @param fileFormat + * @param count + */ + public SaveItemsEvent(SearchResultType itemType, SaveFileFormat fileFormat, int expectedPoints, OccurrencesSaveEnum csvType) { + this.fileFormat = fileFormat; + this.itemType = itemType; + this.expectedPoints = expectedPoints; + this.setCsvType(csvType); + } + + /** + * @return the fileFormat + */ + public SaveFileFormat getFileFormat() { + return fileFormat; + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("SaveOccurrencesEvent [fileFormat="); + builder.append(fileFormat); + builder.append("]"); + return builder.toString(); + } + + public SearchResultType getItemType() { + return itemType; + } + + public void setItemType(SearchResultType itemType) { + this.itemType = itemType; + } + + public void setFileFormat(SaveFileFormat fileFormat) { + this.fileFormat = fileFormat; + } + + public int getExpectedPoints() { + return expectedPoints; + } + + public void setCsvType(OccurrencesSaveEnum csvType) { + this.csvType = csvType; + } + + public OccurrencesSaveEnum getCsvType() { + return csvType; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SaveItemsEventHandler.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SaveItemsEventHandler.java new file mode 100644 index 0000000..b8a040e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SaveItemsEventHandler.java @@ -0,0 +1,17 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.EventHandler; + + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public interface SaveItemsEventHandler extends EventHandler { + + public void onSaveOccurrences(SaveItemsEvent event); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SaveJobEvent.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SaveJobEvent.java new file mode 100644 index 0000000..9c967ab --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SaveJobEvent.java @@ -0,0 +1,122 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.shared.DataSource; +import org.gcube.portlets.user.speciesdiscovery.shared.JobOccurrencesModel; +import org.gcube.portlets.user.speciesdiscovery.shared.JobTaxonomyModel; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchResultType; + +import com.google.gwt.event.shared.GwtEvent; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class SaveJobEvent extends GwtEvent { + + public static final GwtEvent.Type TYPE = new Type(); + private String jobIdentifier; + private String scientificName; + private String rank; + private SearchResultType itemType; + private List listDataSources; + private JobTaxonomyModel jobTaxonomyModel; + private JobOccurrencesModel jobOccurrenceModel; + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(SaveJobEventHandler handler) { + handler.onSaveJob(this); + } + + + /** + * + * @param jobIdentifier + * @param scientificName + * @param listDataSource + * @param rank + * @param type + * @param jobTaxonomyModel + */ + public SaveJobEvent(String jobIdentifier, String scientificName, List dataSourceList, String rank, SearchResultType type, JobTaxonomyModel jobTaxonomyModel) { + this.jobIdentifier = jobIdentifier; + this.scientificName = scientificName; + this.listDataSources = dataSourceList; + this.rank = rank; + this.itemType = type; + this.jobTaxonomyModel = jobTaxonomyModel; + + } + + /** + * + * @param jobIdentifier + * @param scientificName + * @param dataSourceList + * @param type + * @param jobOccurrenceModel + */ + public SaveJobEvent(String jobIdentifier, String scientificName, List dataSourceList, SearchResultType type, JobOccurrencesModel jobOccurrenceModel) { + this.jobIdentifier = jobIdentifier; + this.scientificName = scientificName; + this.listDataSources = dataSourceList; + this.itemType = type; + this.jobOccurrenceModel = jobOccurrenceModel; + } + + + public String getJobIdentifier() { + return jobIdentifier; + } + + public void setJobIdentifier(String jobIdentifier) { + this.jobIdentifier = jobIdentifier; + } + + public String getScientificName() { + return scientificName; + } + + public String getRank() { + return rank; + } + + public SearchResultType getItemType() { + return itemType; + } + + public JobTaxonomyModel getJobTaxonomyModel() { + return jobTaxonomyModel; + } + + public JobOccurrencesModel getJobOccurrenceModel() { + return jobOccurrenceModel; + } + + public void setJobTaxonomyModel(JobTaxonomyModel jobTaxonomyModel) { + this.jobTaxonomyModel = jobTaxonomyModel; + } + + public void setJobOccurrenceModel(JobOccurrencesModel jobOccurrenceModel) { + this.jobOccurrenceModel = jobOccurrenceModel; + } + + public List getListDataSources() { + return listDataSources; + } + + public void setListDataSources(List listDataSources) { + this.listDataSources = listDataSources; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SaveJobEventHandler.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SaveJobEventHandler.java new file mode 100644 index 0000000..99f46bc --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SaveJobEventHandler.java @@ -0,0 +1,17 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.EventHandler; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public interface SaveJobEventHandler extends EventHandler { + + public void onSaveJob(SaveJobEvent saveJobEvent); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SearchCompleteEvent.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SearchCompleteEvent.java new file mode 100644 index 0000000..869317c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SearchCompleteEvent.java @@ -0,0 +1,26 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.GwtEvent; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class SearchCompleteEvent extends GwtEvent { + + public static GwtEvent.Type TYPE = new Type(); + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(SearchCompleteEventHandler handler) { + handler.onSearchComplete(this); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SearchCompleteEventHandler.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SearchCompleteEventHandler.java new file mode 100644 index 0000000..52a3637 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SearchCompleteEventHandler.java @@ -0,0 +1,16 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.EventHandler; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface SearchCompleteEventHandler extends EventHandler { + + public void onSearchComplete(SearchCompleteEvent event); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SearchEvent.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SearchEvent.java new file mode 100644 index 0000000..34ffc6c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SearchEvent.java @@ -0,0 +1,165 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import java.util.Date; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.shared.DataSourceModel; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchType; +import org.gcube.portlets.user.speciesdiscovery.shared.SpeciesCapability; +import org.gcube.portlets.user.speciesdiscovery.shared.filter.ResultFilter; + +import com.google.gwt.event.shared.GwtEvent; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class SearchEvent extends GwtEvent { + + public static final GwtEvent.Type TYPE = new Type(); + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(SearchEventHandler handler) { + handler.onSearch(this); + } + + protected String searchTerm; + protected SearchType type; + protected Number upperBoundLongitude; + protected Number upperBoundLatitude; + protected Number lowerBoundLongitude; + protected Number lowerBoundLatitude; + protected Date fromDate; + protected Date toDate; + private List lstDataSources; + private String groupByRank; + private SpeciesCapability resultType; + private String query; + private ResultFilter activeFilterOnResult; + + public SearchEvent(SearchType type, String searchTerm, Number upperBoundLongitude, Number upperBoundLatitude, Number lowerBoundLongitude, Number lowerBoundLatitude, + Date fromDate, Date toDate, List listDataSources, String rank, SpeciesCapability resultType) { + this.type = type; + this.searchTerm = searchTerm; + this.upperBoundLongitude = upperBoundLongitude; + this.upperBoundLatitude = upperBoundLatitude; + this.lowerBoundLongitude = lowerBoundLongitude; + this.lowerBoundLatitude = lowerBoundLatitude; + this.fromDate = fromDate; + this.toDate = toDate; + this.lstDataSources = listDataSources; + this.groupByRank = rank; + this.resultType = resultType; + } + + public SearchEvent(SearchType byQuery, String query) { + this.type = byQuery; + this.query = query; + } + + /** + * @return the type + */ + public SearchType getType() { + return type; + } + + /** + * @return the searchTerm + */ + public String getSearchTerm() { + return searchTerm; + } + + /** + * @return the upperBoundLongitude + */ + public Number getUpperBoundLongitude() { + return upperBoundLongitude; + } + + /** + * @return the upperBoundLatitude + */ + public Number getUpperBoundLatitude() { + return upperBoundLatitude; + } + + /** + * @return the lowerBoundLongitude + */ + public Number getLowerBoundLongitude() { + return lowerBoundLongitude; + } + + /** + * @return the lowerBoundLatitude + */ + public Number getLowerBoundLatitude() { + return lowerBoundLatitude; + } + + /** + * @return the fromDate + */ + public Date getFromDate() { + return fromDate; + } + + /** + * @return the toDate + */ + public Date getToDate() { + return toDate; + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("SearchEvent [searchTerm="); + builder.append(searchTerm); + builder.append(", type="); + builder.append(type); + builder.append(", upperBoundLongitude="); + builder.append(upperBoundLongitude); + builder.append(", upperBoundLatitude="); + builder.append(upperBoundLatitude); + builder.append(", lowerBoundLongitude="); + builder.append(lowerBoundLongitude); + builder.append(", lowerBoundLatitude="); + builder.append(lowerBoundLatitude); + builder.append(", fromDate="); + builder.append(fromDate); + builder.append(", toDate="); + builder.append(toDate); + builder.append("]"); + return builder.toString(); + } + + public List getLstDataSources() { + return lstDataSources; + } + + public String getGroupByRank() { + return groupByRank; + } + + public SpeciesCapability getResultType() { + return resultType; + } + + public String getQuery() { + return query; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SearchEventHandler.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SearchEventHandler.java new file mode 100644 index 0000000..4b9fec1 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SearchEventHandler.java @@ -0,0 +1,16 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.EventHandler; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface SearchEventHandler extends EventHandler { + + public void onSearch(SearchEvent event); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SearchStartedEvent.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SearchStartedEvent.java new file mode 100644 index 0000000..5338a86 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SearchStartedEvent.java @@ -0,0 +1,26 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.GwtEvent; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class SearchStartedEvent extends GwtEvent { + + public static GwtEvent.Type TYPE = new Type(); + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(SearchStartedEventHandler handler) { + handler.onSearchStarted(this); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SearchStartedEventHandler.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SearchStartedEventHandler.java new file mode 100644 index 0000000..59087d5 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SearchStartedEventHandler.java @@ -0,0 +1,16 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.EventHandler; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface SearchStartedEventHandler extends EventHandler { + + public void onSearchStarted(SearchStartedEvent event); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SelectAllEvent.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SelectAllEvent.java new file mode 100644 index 0000000..9366567 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SelectAllEvent.java @@ -0,0 +1,53 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.GwtEvent; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class SelectAllEvent extends GwtEvent { + + public static final GwtEvent.Type TYPE = new Type(); + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(SelectAllEventHandler handler) { + handler.onSelectAll(this); + } + + protected boolean selectAll; + + /** + * @param onlySelected + */ + public SelectAllEvent(boolean onlySelected) { + this.selectAll = onlySelected; + } + + /** + * @return the onlySelected + */ + public boolean isOnlySelected() { + return selectAll; + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("SelectAllEvent [onlySelected="); + builder.append(selectAll); + builder.append("]"); + return builder.toString(); + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SelectAllEventHandler.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SelectAllEventHandler.java new file mode 100644 index 0000000..6a12958 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SelectAllEventHandler.java @@ -0,0 +1,16 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.EventHandler; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface SelectAllEventHandler extends EventHandler { + + public void onSelectAll(SelectAllEvent event); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SetCommonNamesEvent.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SetCommonNamesEvent.java new file mode 100644 index 0000000..cebfdb9 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SetCommonNamesEvent.java @@ -0,0 +1,37 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.extjs.gxt.ui.client.data.BaseModelData; +import com.google.gwt.event.shared.GwtEvent; + + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class SetCommonNamesEvent extends GwtEvent { + + public static final GwtEvent.Type TYPE = new Type(); + private BaseModelData baseModelData; + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(SetCommonNamesEventHandler handler) { + handler.onSetCommonNames(this); + } + + public SetCommonNamesEvent(BaseModelData data) { + this.baseModelData = data; + } + + public BaseModelData getBaseModelData() { + return baseModelData; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SetCommonNamesEventHandler.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SetCommonNamesEventHandler.java new file mode 100644 index 0000000..d42bb53 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SetCommonNamesEventHandler.java @@ -0,0 +1,16 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.EventHandler; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public interface SetCommonNamesEventHandler extends EventHandler { + public void onSetCommonNames(SetCommonNamesEvent setCommonNamesEvent); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ShowOccurrencesEvent.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ShowOccurrencesEvent.java new file mode 100644 index 0000000..1e28702 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ShowOccurrencesEvent.java @@ -0,0 +1,36 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.GwtEvent; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class ShowOccurrencesEvent extends GwtEvent { + + public static final GwtEvent.Type TYPE = new Type(); + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(ShowOccurrencesEventHandler handler) { + handler.onShowOccurrences(this); + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("ShowOccurrencesEvent []"); + return builder.toString(); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ShowOccurrencesEventHandler.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ShowOccurrencesEventHandler.java new file mode 100644 index 0000000..4ebb60d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ShowOccurrencesEventHandler.java @@ -0,0 +1,16 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.EventHandler; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface ShowOccurrencesEventHandler extends EventHandler { + + public void onShowOccurrences(ShowOccurrencesEvent event); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ShowOccurrencesMapEvent.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ShowOccurrencesMapEvent.java new file mode 100644 index 0000000..8e048c7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ShowOccurrencesMapEvent.java @@ -0,0 +1,45 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.GwtEvent; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class ShowOccurrencesMapEvent extends GwtEvent { + + public static final GwtEvent.Type TYPE = new Type(); + private int expectedPoints; + + public ShowOccurrencesMapEvent(int expectedPoints) { + this.expectedPoints = expectedPoints; + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(ShowOccurrencesMapEventHandler handler) { + handler.onShowOccurrencesMap(this); + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("ShowOccurrencesMapEvent []"); + return builder.toString(); + } + + public int getExpectedPoints() { + return expectedPoints; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ShowOccurrencesMapEventHandler.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ShowOccurrencesMapEventHandler.java new file mode 100644 index 0000000..e9dd32b --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ShowOccurrencesMapEventHandler.java @@ -0,0 +1,16 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.EventHandler; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface ShowOccurrencesMapEventHandler extends EventHandler { + + public void onShowOccurrencesMap(ShowOccurrencesMapEvent event); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ShowOnlySelectedRowEvent.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ShowOnlySelectedRowEvent.java new file mode 100644 index 0000000..89cb29a --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ShowOnlySelectedRowEvent.java @@ -0,0 +1,53 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.GwtEvent; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class ShowOnlySelectedRowEvent extends GwtEvent { + + public static final GwtEvent.Type TYPE = new Type(); + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(ShowOnlySelectedRowEventHandler handler) { + handler.onShowOnlySelectedRow(this); + } + + protected boolean onlySelected; + + /** + * @param onlySelected + */ + public ShowOnlySelectedRowEvent(boolean onlySelected) { + this.onlySelected = onlySelected; + } + + /** + * @return the onlySelected + */ + public boolean isOnlySelected() { + return onlySelected; + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("ShowOnlySelectedRowEvent [onlySelected="); + builder.append(onlySelected); + builder.append("]"); + return builder.toString(); + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ShowOnlySelectedRowEventHandler.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ShowOnlySelectedRowEventHandler.java new file mode 100644 index 0000000..eb5b338 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ShowOnlySelectedRowEventHandler.java @@ -0,0 +1,16 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.EventHandler; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface ShowOnlySelectedRowEventHandler extends EventHandler { + + public void onShowOnlySelectedRow(ShowOnlySelectedRowEvent event); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/UpdateAllRowSelectionEvent.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/UpdateAllRowSelectionEvent.java new file mode 100644 index 0000000..65b7df4 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/UpdateAllRowSelectionEvent.java @@ -0,0 +1,46 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import org.gcube.portlets.user.speciesdiscovery.shared.SearchResultType; + +import com.google.gwt.event.shared.GwtEvent; + + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class UpdateAllRowSelectionEvent extends GwtEvent { + + public static final GwtEvent.Type TYPE = new Type(); + private boolean selectionValue; + private SearchResultType searchType; + + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(UpdateAllRowSelectionEventHandler handler) { + handler.onUpdateAllRowSelection(this); + } + + public UpdateAllRowSelectionEvent(boolean selectionValue, SearchResultType type){ + this.selectionValue = selectionValue; + this.searchType = type; + + } + + public boolean getSelectionValue() { + return selectionValue; + } + + public SearchResultType getSearchType() { + return searchType; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/UpdateAllRowSelectionEventHandler.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/UpdateAllRowSelectionEventHandler.java new file mode 100644 index 0000000..4ff6d75 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/UpdateAllRowSelectionEventHandler.java @@ -0,0 +1,16 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.EventHandler; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public interface UpdateAllRowSelectionEventHandler extends EventHandler { + public void onUpdateAllRowSelection(UpdateAllRowSelectionEvent updateAllRowSelectionEvent); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/UpdateFilterOnResultEvent.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/UpdateFilterOnResultEvent.java new file mode 100644 index 0000000..68540cf --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/UpdateFilterOnResultEvent.java @@ -0,0 +1,39 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import org.gcube.portlets.user.speciesdiscovery.client.util.SpeciesGridFields; +import org.gcube.portlets.user.speciesdiscovery.shared.filter.ResultFilter; + +import com.google.gwt.event.shared.GwtEvent; + + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class UpdateFilterOnResultEvent extends GwtEvent { + + public static final GwtEvent.Type TYPE = new Type(); + private ResultFilter activeFilterObject; + private SpeciesGridFields updateFilterId; + + public SpeciesGridFields getUpdateFilterId() { + return updateFilterId; + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(UpdateFilterOnResultEventHandler handler) { + handler.onUpdateFilter(this); + } + + public UpdateFilterOnResultEvent(SpeciesGridFields filterId) { + this.updateFilterId = filterId; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/UpdateFilterOnResultEventHandler.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/UpdateFilterOnResultEventHandler.java new file mode 100644 index 0000000..692a453 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/UpdateFilterOnResultEventHandler.java @@ -0,0 +1,15 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.EventHandler; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface UpdateFilterOnResultEventHandler extends EventHandler { + public void onUpdateFilter(UpdateFilterOnResultEvent updateFilterOnResultEvent); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/UpdateRowSelectionEvent.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/UpdateRowSelectionEvent.java new file mode 100644 index 0000000..c2abcf9 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/UpdateRowSelectionEvent.java @@ -0,0 +1,44 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.GwtEvent; + + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class UpdateRowSelectionEvent extends GwtEvent { + + public static final GwtEvent.Type TYPE = new Type(); + private int rowId; + private boolean selectionValue; + + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(UpdateRowSelectionEventHandler handler) { + handler.onUpdateRowSelection(this); + } + + public UpdateRowSelectionEvent(int rowId, boolean selectionValue){ + this.rowId = rowId; + this.selectionValue = selectionValue; + + } + + public int getRowId() { + return rowId; + } + + public boolean getSelectionValue() { + return selectionValue; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/UpdateRowSelectionEventHandler.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/UpdateRowSelectionEventHandler.java new file mode 100644 index 0000000..156b990 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/UpdateRowSelectionEventHandler.java @@ -0,0 +1,15 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.EventHandler; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface UpdateRowSelectionEventHandler extends EventHandler { + public void onUpdateRowSelection(UpdateRowSelectionEvent updateRowSelectionEvent); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ViewDetailsOfSelectedEvent.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ViewDetailsOfSelectedEvent.java new file mode 100644 index 0000000..e908a5c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ViewDetailsOfSelectedEvent.java @@ -0,0 +1,30 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.GwtEvent; + + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class ViewDetailsOfSelectedEvent extends GwtEvent { + + public static final GwtEvent.Type TYPE = new Type(); + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(ViewDetailsOfSelectedEventHandler handler) { + handler.onViewDetails(this); + } + + public ViewDetailsOfSelectedEvent() { + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ViewDetailsOfSelectedEventHandler.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ViewDetailsOfSelectedEventHandler.java new file mode 100644 index 0000000..3d7826c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ViewDetailsOfSelectedEventHandler.java @@ -0,0 +1,15 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.event; + +import com.google.gwt.event.shared.EventHandler; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface ViewDetailsOfSelectedEventHandler extends EventHandler { + public void onViewDetails(ViewDetailsOfSelectedEvent viewDetailsOfSelectedEvent); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/externalsystem/ExternalSystemInterface.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/externalsystem/ExternalSystemInterface.java new file mode 100644 index 0000000..8b773f7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/externalsystem/ExternalSystemInterface.java @@ -0,0 +1,12 @@ +package org.gcube.portlets.user.speciesdiscovery.client.externalsystem; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public interface ExternalSystemInterface { + + public String getName(); + public String getBaseUrl(); + public String getSuffixUrl(); +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/externalsystem/OtherInformationSystemsEnum.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/externalsystem/OtherInformationSystemsEnum.java new file mode 100644 index 0000000..1468a70 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/externalsystem/OtherInformationSystemsEnum.java @@ -0,0 +1,47 @@ +package org.gcube.portlets.user.speciesdiscovery.client.externalsystem; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public enum OtherInformationSystemsEnum implements ExternalSystemInterface{ + +// CATALOGUEOFLIFE("Catalogue Of Life", "http://www.catalogueoflife.org/annual-checklist/2006/search_results.php?search_string="), + CATALOGUEOFLIFE("Catalogue Of Life", " http://www.catalogueoflife.org/col/search/all/key/", "/match/1"), + ENCICOLPEDIAOFLIFE("Encyclopedia of Life","http://www.eol.org/search?ie=UTF-8&search_type=text&q=", ""), + BARCODEOFLIFE("Barcode of Life","http://www.boldsystems.org/index.php/Taxbrowser_Taxonpage?taxon=", ""), + GENBANK("GenBank","http://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?name=", ""), + UBIO("uBio","http://www.ubio.org/browser/search.php?search_all=", ""), + SPECIESIDENTIFICATIONORG("Species-identification.org","http://species-identification.org/search.php?search_mode=basic&search_for=", ""); + + private String name; + private String baseUrl; + private String suffixUrl; + + /** + * + * @param name + * @param value + */ + private OtherInformationSystemsEnum(String name, String baseUrl, String suffixUrl) { + this.name = name; + this.baseUrl = baseUrl; + this.suffixUrl = suffixUrl; + } + + @Override + public String getName() { + return name; + } + + @Override + public String getBaseUrl() { + return baseUrl; + } + + @Override + public String getSuffixUrl() { + return suffixUrl; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/externalsystem/OtherMappingSystemsEnum.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/externalsystem/OtherMappingSystemsEnum.java new file mode 100644 index 0000000..8582844 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/externalsystem/OtherMappingSystemsEnum.java @@ -0,0 +1,42 @@ +package org.gcube.portlets.user.speciesdiscovery.client.externalsystem; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public enum OtherMappingSystemsEnum implements ExternalSystemInterface{ + GBIF("GBIF", "http://data.gbif.org/species/species/", ""), + DISCOVERLIFE("DiscoverLife", "http://www.discoverlife.org/mp/20q?search=", ""); + + + private String name; + private String url; + private String suffixUrl; + + /** + * + * @param name + * @param url + */ + private OtherMappingSystemsEnum(String name, String url, String suffixUrl) { + this.name = name; + this.url = url; + this.suffixUrl = suffixUrl; + } + + @Override + public String getName() { + return name; + } + + @Override + public String getBaseUrl() { + return url; + } + + @Override + public String getSuffixUrl() { + return this.suffixUrl; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/filterresult/ClassificationFilter.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/filterresult/ClassificationFilter.java new file mode 100644 index 0000000..e6ea5e1 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/filterresult/ClassificationFilter.java @@ -0,0 +1,403 @@ +package org.gcube.portlets.user.speciesdiscovery.client.filterresult; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.ConstantsSpeciesDiscovery; +import org.gcube.portlets.user.speciesdiscovery.client.event.ActiveFilterOnResultEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.ChangeFilterClassificationOnResultEvent; +import org.gcube.portlets.user.speciesdiscovery.client.model.ClassificationModel; +import org.gcube.portlets.user.speciesdiscovery.shared.MainTaxonomicRankEnum; +import org.gcube.portlets.user.speciesdiscovery.shared.filter.ResultFilter; + +import com.allen_sauer.gwt.log.client.Log; +import com.extjs.gxt.ui.client.Style.SelectionMode; +import com.extjs.gxt.ui.client.data.ModelIconProvider; +import com.extjs.gxt.ui.client.event.SelectionChangedEvent; +import com.extjs.gxt.ui.client.event.SelectionChangedListener; +import com.extjs.gxt.ui.client.store.Record; +import com.extjs.gxt.ui.client.store.Store; +import com.extjs.gxt.ui.client.store.StoreSorter; +import com.extjs.gxt.ui.client.store.TreeStore; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.Html; +import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction; +import com.extjs.gxt.ui.client.widget.form.SimpleComboBox; +import com.extjs.gxt.ui.client.widget.form.SimpleComboValue; +import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; +import com.extjs.gxt.ui.client.widget.treepanel.TreePanel; +import com.google.gwt.event.shared.EventBus; +import com.google.gwt.user.client.ui.AbstractImagePrototype; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class ClassificationFilter implements ResultFilterPanelInterface{ + + private ContentPanel classifPanel = new ContentPanel(); + private TreePanel treePanel; + private TreeStore store; + private final String NORANK = "NO RANK"; + private SimpleComboBox scbGroupByRank; + private EventBus eventBus; +// private HashMap hashKingdomLevel = new HashMap(); + private ToolBar toolbar = new ToolBar(); + private String currentRank; + + + public ClassificationFilter(){ + setHeaderTitle(); + init(); + setAlphanumericStoreSorter(); + + addDefaultNodes(); + addListners(); + setExpandTreeLevel(ConstantsSpeciesDiscovery.BIOTACLASSID, true); //expand root level + + initComboGroupRankFilter(); + initToolBar(); + + classifPanel.setTopComponent(toolbar); + + } + + private SimpleComboBox initComboGroupRankFilter() { + + List ls = new ArrayList(); + + for (String rank : MainTaxonomicRankEnum.getListLabels()) ls.add(rank); + + scbGroupByRank = new SimpleComboBox(); + scbGroupByRank.setTypeAhead(true); + scbGroupByRank.setEditable(false); + scbGroupByRank.setTriggerAction(TriggerAction.ALL); + + scbGroupByRank.add(ls); + + scbGroupByRank.setSimpleValue(MainTaxonomicRankEnum.CLASS.getLabel()); //is Class + + addListnerOnChangeClassificationFilter(); + + return scbGroupByRank; + } + + public String getGroupRank(){ + return scbGroupByRank.getSimpleValue(); + } + + + public void addListnerOnChangeClassificationFilter(){ + + scbGroupByRank.addSelectionChangedListener(new SelectionChangedListener>() { + + @Override + public void selectionChanged(SelectionChangedEvent> se) { + + if(eventBus!=null){ + eventBus.fireEvent(new ChangeFilterClassificationOnResultEvent()); + } + } + }); + + } + + private void initToolBar(){ + toolbar = new ToolBar(); + + toolbar.setStyleName("toolbar-filter"); + toolbar.setStyleAttribute("padding-right", "1px"); +// toolbar.add(new FillToolItem()); + + Html textGroupBy = new Html("Group by: "); + textGroupBy.setStyleAttribute("font-style", "italic"); + textGroupBy.setStyleAttribute("font-size", "10px"); + textGroupBy.setStyleAttribute("padding-left", "5px"); + textGroupBy.setStyleAttribute("padding-right", "5px"); + + scbGroupByRank.setStyleAttribute("margin-right", "2px"); + toolbar.add(textGroupBy); + + + toolbar.add(textGroupBy); + toolbar.add(scbGroupByRank); + } + + public void setEventBus(EventBus eventBus){ + this.eventBus = eventBus; + } + + + + private void addDefaultNodes(){ + + //INSERT STATIC LEVELS + store.insert(createRoot(), 0, false); +// store.add(store.getRootItems().get(0), createChildren(),false); + } + + private void init() { + + store = new TreeStore(); + + treePanel = new TreePanel(store){ + + @Override + public boolean hasChildren(ClassificationModel parent) { + if (!parent.isLeaf()) { + return true; + } + return super.hasChildren(parent); + } + + }; + + // SET icons in tree panel + treePanel.setIconProvider(new ModelIconProvider() { + + public AbstractImagePrototype getIcon(ClassificationModel model) { + if (!model.isLeaf()){ + +// return Resources.getIconByFolderItemType(model.getGXTFolderItemType()); + } + return null; + } + }); + + treePanel.setStateful(false); + + // statefull components need a defined id + treePanel.setId("treeClassification"); + + treePanel.setDisplayProperty(ConstantsSpeciesDiscovery.NAME); + //Single selection Mode + treePanel.getSelectionModel().setSelectionMode(SelectionMode.SINGLE); + + classifPanel.add(treePanel); + } + + @Override + public ContentPanel getPanel() { + return classifPanel; + } + + @Override + public String getName() { + return ResultFilterPanelEnum.CLASSIFICATION.getLabel(); + } + + @Override + public void setHeaderTitle() { + classifPanel.setHeading(this.getName()); + } + + + private ClassificationModel createRoot(){ + return new ClassificationModel(ConstantsSpeciesDiscovery.BIOTACLASSID, ConstantsSpeciesDiscovery.BIOTACLASS, null, null, false); + } + + + private void setAlphanumericStoreSorter(){ + + // Sorting + store.setStoreSorter(new StoreSorter() { + + @Override + public int compare(Store store, ClassificationModel m1, ClassificationModel m2, String property) { + boolean m1Folder = m1.isLeaf(); + boolean m2Folder = m2.isLeaf(); + + if (m1Folder && !m2Folder) { + return -1; + } else if (!m1Folder && m2Folder) { + return 1; + } + + if(m1.getName().compareToIgnoreCase(m2.getName())<0) + return -1; + else + return 1; + + } + }); + } + + + public void setExpandTreeLevel(String identifier, boolean bool) { + ClassificationModel item = getFileModelByIdentifier(identifier); + if(item!=null) + treePanel.setExpanded(item, bool); + } + + /** + * + * @param id + * @return + */ + public ClassificationModel getFileModelByIdentifier(String id){ + + return treePanel.getStore().findModel(ConstantsSpeciesDiscovery.ID, id); + + } + + + /** + * + * @param fileTarget (MANDATORY) + * @param newName (MANDATORY) + * @param extension OPTIONAL - string or null + */ + public boolean renameItem(String identifier, String newName, Integer counter) { + +// FileModel fileTarget = treePanel.getStore().findModel(ConstantsExplorer.IDENTIFIER, identifier); + + ClassificationModel fileTarget = getFileModelByIdentifier(identifier); + + return renameItem(fileTarget,newName,counter); + + } + + /** + * + * @param identifier + * @param counter + * @return + */ + public boolean updateItemCounter(String parentId, String itemIdentifier, String itemName, String rank, String itemBaseTaxonId, String baseTaxonName, int counter) { + + ClassificationModel fileTarget = getFileModelByIdentifier(itemIdentifier); + + if(fileTarget==null){ + ClassificationModel parent = getFileModelByIdentifier(parentId); +// store.add(parent, new ClassificationModel(itemIdentifier,itemName, itemBaseTaxonId, baseTaxonName, true),false); + store.add(parent, new ClassificationModel(itemIdentifier, itemName, rank, itemBaseTaxonId, baseTaxonName, true, counter),false); + + fileTarget = getFileModelByIdentifier(itemIdentifier); + } + else + fileTarget.setCountOf(counter); + + + return renameItem(fileTarget, itemName, counter); + + } + + /** + * + * @param fileTarget (MANDATORY) + * @param newName (MANDATORY) + * @param extension OPTIONAL - string or null + */ + private boolean renameItem(ClassificationModel fileTarget, String newName, Integer counter) { + + if(fileTarget!=null){ + Record record = treePanel.getStore().getRecord(fileTarget); + if(record!=null){ + if(counter!= null) + if(newName!=null) + record.set(ConstantsSpeciesDiscovery.NAME, newName+"("+counter.intValue()+")"); + else + record.set(ConstantsSpeciesDiscovery.NAME, fileTarget.getName()+"("+counter.intValue()+")"); + else + if(newName!=null) + record.set(ConstantsSpeciesDiscovery.NAME, newName); + else + record.set(ConstantsSpeciesDiscovery.NAME, fileTarget.getName()); + + return true; + } + else + Log.error("Record Error: file target with " + fileTarget.getId() + " identifier not exist in store" ); + } + else + Log.error("Rename Error: file target not exist in store" ); + + return false; + } + + + public void loadDataSourceClassification(HashMap result, String rank) { + + currentRank = rank; + + for(String key: result.keySet()){ + + ClassificationModel cm = result.get(key); + + String name = cm.getClassificationRank() + " - "+cm.getName(); + + String kingdomValue = cm.getBaseTaxonName(); + + //if kingdom value not exists create new kingdom folder in the tree + if(getFileModelByIdentifier(kingdomValue)==null){ + store.add(store.getRootItems().get(0), new ClassificationModel(kingdomValue, kingdomValue, cm.getBaseTaxonId(),cm.getBaseTaxonName(), false),false); + setExpandTreeLevel(kingdomValue, true); + } + + + if(cm.getBaseTaxonName().equalsIgnoreCase(ConstantsSpeciesDiscovery.UNKNOWN)){ + + if(rank.compareToIgnoreCase(cm.getClassificationRank())==0) //in this case was found rank but was not found kingdom + name = cm.getClassificationRank() +" - "+cm.getName(); + else +// name = "["+NORANK+" " + rank+"] - " + cm.getClassificationRank() +" - "+cm.getName(); + name = "["+NORANK+" " + rank+"] - " + cm.getClassificationRank(); + + } + updateItemCounter(kingdomValue, cm.getId(), name, cm.getClassificationRank(), cm.getBaseTaxonId(),cm.getBaseTaxonName(), cm.getCountOf()); + +// System.out.println("################################ key class : "+ key +", item name: "+ cm.getName() + ", item id: " +cm.getId() + ", item baseTaxon: "+cm.getBaseTaxonName() + ", item count " +cm.getGroupedIdClassificationList().size() ); +// for(Integer id: cm.getGroupedIdClassificationList()){ +// System.out.println("current id "+ id); +// } + } + } + + + private void addListners(){ + + treePanel.getSelectionModel().addSelectionChangedListener(new SelectionChangedListener() { + + @Override + public void selectionChanged(SelectionChangedEvent selectedEvent) { + + ClassificationModel cm = selectedEvent.getSelectedItem(); + + if(cm!=null){ + if(cm.isLeaf()){ + ResultFilter activeFilter = new ResultFilter(); + activeFilter.setByClassification(true); +// activeFilter.setListByClassification(cm.getGroupedIdClassificationList()); +// String key = cm.getName().substring(0, cm.getName().indexOf("(")); +// activeFilter.setFilterValue(cm.getName().substring(0, cm.getName().indexOf("("))); + + activeFilter.setClassification(currentRank, cm.getId(), cm.getCountOf()); + + activeFilter.setFilterValue(cm.getId()); //cm.getId() is taxonId stored into DB + + treePanel.disableEvents(true); + treePanel.getSelectionModel().deselect(cm); + treePanel.enableEvents(true); + + eventBus.fireEvent(new ActiveFilterOnResultEvent(activeFilter)); + } + } + } + }); + + } + + public void reset() { + store.removeAll(); + addDefaultNodes(); + setExpandTreeLevel(ConstantsSpeciesDiscovery.BIOTACLASSID, true); //expand BIOTACLASSID level + } + + + @Override + public void loadDataSource(HashMap result) { + return; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/filterresult/DataProviderFilter.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/filterresult/DataProviderFilter.java new file mode 100644 index 0000000..a2f0962 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/filterresult/DataProviderFilter.java @@ -0,0 +1,181 @@ +package org.gcube.portlets.user.speciesdiscovery.client.filterresult; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.ConstantsSpeciesDiscovery; +import org.gcube.portlets.user.speciesdiscovery.client.event.ActiveFilterOnResultEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.UpdateFilterOnResultEvent; +import org.gcube.portlets.user.speciesdiscovery.client.resources.Resources; +import org.gcube.portlets.user.speciesdiscovery.client.util.SpeciesGridFields; +import org.gcube.portlets.user.speciesdiscovery.shared.filter.ResultFilter; + +import com.extjs.gxt.ui.client.Style.Scroll; +import com.extjs.gxt.ui.client.event.ButtonEvent; +import com.extjs.gxt.ui.client.event.SelectionListener; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.VerticalPanel; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem; +import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; +import com.google.gwt.event.shared.EventBus; +import com.google.gwt.user.client.ui.AbstractImagePrototype; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class DataProviderFilter implements ResultFilterPanelInterface{ + + private static final String SORT_RESULTS = "Sort results"; + private ContentPanel dataProvPanel = new ContentPanel(); + private VerticalPanel vp = new VerticalPanel(); + private HashMap hashButton = new HashMap(); + private EventBus eventBus; + + + public DataProviderFilter(){ + setHeaderTitle(); + vp.setStyleAttribute("margin-left", DEFAULTMARGINLEFT); + dataProvPanel.setScrollMode(Scroll.AUTO); + dataProvPanel.add(vp); + createToolBar(); + } + + @Override + public ContentPanel getPanel() { + return dataProvPanel; + } + + @Override + public String getName() { + return ResultFilterPanelEnum.DATAPROVIDER.getLabel(); + } + + @Override + public void setHeaderTitle() { + dataProvPanel.setHeading(this.getName()); + + } + + public void createToolBar(){ + + ToolBar toolbar = new ToolBar(); + + Button buttonSortResult = new Button(SORT_RESULTS); + buttonSortResult.setStyleName("button-noimage"); + buttonSortResult.setWidth(100); + + buttonSortResult.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getSortIcon())); + buttonSortResult.setToolTip(ConstantsSpeciesDiscovery.SORTMESSAGE); + buttonSortResult.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + reloadDataSort(); + } + }); + + toolbar.add(buttonSortResult); + toolbar.add(new FillToolItem()); + + Button buttonReload = new Button(""); + buttonReload.setStyleName("button-noimage"); + buttonReload.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getReload())); + buttonReload.setToolTip("Reload filter"); + buttonReload.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + reset(); + eventBus.fireEvent(new UpdateFilterOnResultEvent(SpeciesGridFields.DATAPROVIDER)); + } + }); + + toolbar.add(buttonReload); + + + toolbar.setStyleName("toolbar-filter"); + + dataProvPanel.setTopComponent(toolbar); + + } + + public void setEventBus(EventBus eventBus){ + this.eventBus = eventBus; + } + + + public void loadDataSource(HashMap result) { + + for(final String key: result.keySet()){ + + Button butt = hashButton.get(key); + final Integer counter = result.get(key); + + if(butt!=null){ + + String oldText = butt.getText(); + + int start = oldText.indexOf("("); + String description = oldText.substring(0,start); + butt.setText(description+" ("+counter+")"); + butt.setData("counter", counter); + + } + else{ + + butt = new Button(key +" ("+counter+")"); + butt.setStyleAttribute("margin", DEFAULTMARGIN); + butt.setData("counter", counter); + butt.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + ResultFilter activeFilter = new ResultFilter(); + activeFilter.setByDataProvider(true); + Integer countValue = (Integer) ce.getButton().getData("counter"); + activeFilter.setDataProviderName(key, countValue.intValue()); + activeFilter.setFilterValue(key); + eventBus.fireEvent(new ActiveFilterOnResultEvent(activeFilter)); + + } + }); + + butt.setStyleName("button-hyperlink"); + butt.setId(key); + + hashButton.put(key, butt); + vp.add(butt); + + } + } + + vp.layout(); + } + + public void reset() { + hashButton.clear(); + vp.removeAll(); + + } + + public void reloadDataSort(){ + + vp.removeAll(); + + if(!hashButton.isEmpty()){ + + List listKey = new ArrayList(hashButton.keySet()); + Collections.sort(listKey); + + for (String key : listKey) + vp.add(hashButton.get(key)); + } + + vp.layout(true); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/filterresult/DataSourceFilter.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/filterresult/DataSourceFilter.java new file mode 100644 index 0000000..49122aa --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/filterresult/DataSourceFilter.java @@ -0,0 +1,188 @@ +package org.gcube.portlets.user.speciesdiscovery.client.filterresult; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.ConstantsSpeciesDiscovery; +import org.gcube.portlets.user.speciesdiscovery.client.event.ActiveFilterOnResultEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.UpdateFilterOnResultEvent; +import org.gcube.portlets.user.speciesdiscovery.client.resources.Resources; +import org.gcube.portlets.user.speciesdiscovery.client.util.SpeciesGridFields; +import org.gcube.portlets.user.speciesdiscovery.shared.filter.ResultFilter; + +import com.extjs.gxt.ui.client.Style.Scroll; +import com.extjs.gxt.ui.client.event.ButtonEvent; +import com.extjs.gxt.ui.client.event.SelectionListener; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.VerticalPanel; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem; +import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; +import com.google.gwt.event.shared.EventBus; +import com.google.gwt.user.client.ui.AbstractImagePrototype; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class DataSourceFilter implements ResultFilterPanelInterface{ + + private ContentPanel dataSourcePanel = new ContentPanel(); + private VerticalPanel vp = new VerticalPanel(); + private HashMap hashButton = new HashMap(); + private EventBus eventBus; + + + public DataSourceFilter(){ + setHeaderTitle(); + dataSourcePanel.setScrollMode(Scroll.AUTO); + vp.setStyleAttribute("margin-left", DEFAULTMARGINLEFT); + dataSourcePanel.add(vp); + createToolBar(); + } + + + @Override + public ContentPanel getPanel() { + return dataSourcePanel; + } + + @Override + public String getName() { + return ResultFilterPanelEnum.DATASOURCE.getLabel(); + } + + @Override + public void setHeaderTitle() { + dataSourcePanel.setHeading(this.getName()); + + } + + + public void reset(){ + + hashButton.clear(); + vp.removeAll(); + + } + + public void loadDataSource(HashMap result) { + + for(final String key: result.keySet()){ + + Button butt = hashButton.get(key); + final Integer counter = result.get(key); + +// System.out.println("##############################found key " + key); +// System.out.println("##############################counter " + counter); + + if(butt!=null){ + String oldText = butt.getText(); + int start = oldText.indexOf("("); + String description = oldText.substring(0,start); + butt.setText(description+" ("+counter+")"); + butt.setData("counter", counter); + } + else{ + + butt = new Button(key +" ("+counter+")"); + butt.setStyleAttribute("margin", DEFAULTMARGIN); + butt.setData("counter", counter); + butt.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + + + ResultFilter activeFilter = new ResultFilter(); + activeFilter.setByDataSourceName(true); + Integer countValue = (Integer) ce.getButton().getData("counter"); + activeFilter.setDataSourceName(key,countValue.intValue()); + activeFilter.setFilterValue(key); + + eventBus.fireEvent(new ActiveFilterOnResultEvent(activeFilter)); + + } + }); + + butt.setStyleName("button-hyperlink"); + butt.setId(key); + + hashButton.put(key, butt); + vp.add(butt); + } + } + + vp.layout(); + + } + + + public void setEventBus(EventBus eventBus) { + this.eventBus = eventBus; + + } + + public void reloadDataSort(){ + + vp.removeAll(); + + if(!hashButton.isEmpty()){ + + List listKey = new ArrayList(hashButton.keySet()); + Collections.sort(listKey); + + for (String key : listKey) + vp.add(hashButton.get(key)); + } + + vp.layout(true); + } + + + public void createToolBar(){ + + ToolBar toolbar = new ToolBar(); + + Button butt = new Button("Sort results"); + butt.setStyleName("button-noimage"); + butt.setWidth(100); + + butt.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getSortIcon())); + butt.setToolTip(ConstantsSpeciesDiscovery.SORTMESSAGE); + butt.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + reloadDataSort(); + } + }); + + toolbar.add(butt); + toolbar.add(new FillToolItem()); + + Button buttonReload = new Button(""); + buttonReload.setStyleName("button-noimage"); + buttonReload.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getReload())); + buttonReload.setToolTip("Reload filter"); + buttonReload.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + reset(); + eventBus.fireEvent(new UpdateFilterOnResultEvent(SpeciesGridFields.DATASOURCE)); + } + }); + + + toolbar.add(buttonReload); + + toolbar.setStyleName("toolbar-filter"); + + dataSourcePanel.setTopComponent(toolbar); + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/filterresult/RankFilter.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/filterresult/RankFilter.java new file mode 100644 index 0000000..804438e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/filterresult/RankFilter.java @@ -0,0 +1,181 @@ +package org.gcube.portlets.user.speciesdiscovery.client.filterresult; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.ConstantsSpeciesDiscovery; +import org.gcube.portlets.user.speciesdiscovery.client.event.ActiveFilterOnResultEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.UpdateFilterOnResultEvent; +import org.gcube.portlets.user.speciesdiscovery.client.resources.Resources; +import org.gcube.portlets.user.speciesdiscovery.client.util.SpeciesGridFields; +import org.gcube.portlets.user.speciesdiscovery.shared.filter.ResultFilter; + +import com.extjs.gxt.ui.client.Style.Scroll; +import com.extjs.gxt.ui.client.event.ButtonEvent; +import com.extjs.gxt.ui.client.event.SelectionListener; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.VerticalPanel; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem; +import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; +import com.google.gwt.event.shared.EventBus; +import com.google.gwt.user.client.ui.AbstractImagePrototype; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class RankFilter implements ResultFilterPanelInterface{ + + private ContentPanel rankFilterPanel = new ContentPanel(); + private VerticalPanel vp = new VerticalPanel(); + private HashMap hashButton = new HashMap(); + private EventBus eventBus; + + + public RankFilter() { + setHeaderTitle(); + vp.setStyleAttribute("margin-left", DEFAULTMARGINLEFT); + rankFilterPanel.setScrollMode(Scroll.AUTO); + rankFilterPanel.add(vp); + createToolBar(); + } + + @Override + public ContentPanel getPanel() { + return rankFilterPanel; + } + + @Override + public String getName() { + return ResultFilterPanelEnum.RANK.getLabel(); + } + + @Override + public void setHeaderTitle() { + rankFilterPanel.setHeading(this.getName()); + + } + + @Override + public void loadDataSource(HashMap result) { + + for(final String key: result.keySet()){ + + Button butt = hashButton.get(key); + final Integer counter = result.get(key); + + if(butt!=null){ + String oldText = butt.getText(); + int start = oldText.indexOf("("); + String description = oldText.substring(0,start); + butt.setText(description+" ("+counter+")"); + butt.setData("counter", counter); + } + else{ + + butt = new Button(key +" ("+counter+")"); + butt.setStyleAttribute("margin", DEFAULTMARGIN); + butt.setData("counter", counter); + butt.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + + + ResultFilter activeFilter = new ResultFilter(); + activeFilter.setByRankFilter(true); + Integer countValue = (Integer) ce.getButton().getData("counter"); + activeFilter.setRankName(key,countValue.intValue()); + activeFilter.setFilterValue(key); + + eventBus.fireEvent(new ActiveFilterOnResultEvent(activeFilter)); + + } + }); + + butt.setStyleName("button-hyperlink"); + butt.setId(key); + + hashButton.put(key, butt); + vp.add(butt); + } + } + + vp.layout(); + + } + + public void reset() { + hashButton.clear(); + vp.removeAll(); + + } + + public void setEventBus(EventBus eventBus) { + this.eventBus = eventBus; + + } + + public void reloadDataSort(){ + + vp.removeAll(); + + if(!hashButton.isEmpty()){ + + List listKey = new ArrayList(hashButton.keySet()); + Collections.sort(listKey); + + for (String key : listKey) + vp.add(hashButton.get(key)); + } + + vp.layout(true); + } + + + public void createToolBar(){ + + ToolBar toolbar = new ToolBar(); + + Button butt = new Button("Sort results"); + butt.setStyleName("button-noimage"); + butt.setWidth(100); + + butt.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getSortIcon())); + butt.setToolTip(ConstantsSpeciesDiscovery.SORTMESSAGE); + butt.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + reloadDataSort(); + } + }); + + toolbar.add(butt); + + toolbar.add(new FillToolItem()); + + Button buttonReload = new Button(""); + buttonReload.setStyleName("button-noimage"); + buttonReload.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getReload())); + buttonReload.setToolTip("Reload filter"); + buttonReload.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + reset(); + eventBus.fireEvent(new UpdateFilterOnResultEvent(SpeciesGridFields.MATCHING_RANK)); + } + }); + + toolbar.add(buttonReload); + + toolbar.setStyleName("toolbar-filter"); + rankFilterPanel.setTopComponent(toolbar); + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/filterresult/ResultFilterPanelEnum.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/filterresult/ResultFilterPanelEnum.java new file mode 100644 index 0000000..18a6c47 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/filterresult/ResultFilterPanelEnum.java @@ -0,0 +1,28 @@ +package org.gcube.portlets.user.speciesdiscovery.client.filterresult; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public enum ResultFilterPanelEnum { + CLASSIFICATION("By Classification"), + RANK("By Rank"), + TYPE("By Type"), + DATAPROVIDER("By Data Provider"), + DATASOURCE("By Data Source"); + + private String label; + + ResultFilterPanelEnum() { + } + + ResultFilterPanelEnum(String label) { + this.label = label; + } + + public String getLabel() { + return label; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/filterresult/ResultFilterPanelInterface.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/filterresult/ResultFilterPanelInterface.java new file mode 100644 index 0000000..bc1ed76 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/filterresult/ResultFilterPanelInterface.java @@ -0,0 +1,20 @@ +package org.gcube.portlets.user.speciesdiscovery.client.filterresult; + +import java.util.HashMap; + +import com.extjs.gxt.ui.client.widget.ContentPanel; + + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public interface ResultFilterPanelInterface { + public ContentPanel getPanel(); + public void setHeaderTitle(); + public String getName(); + public void loadDataSource(HashMap result); + + public final String DEFAULTMARGINLEFT = "5px"; + public final String DEFAULTMARGIN = "5px"; +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/filterresult/ResultFilterPanelManager.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/filterresult/ResultFilterPanelManager.java new file mode 100644 index 0000000..77b7f5b --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/filterresult/ResultFilterPanelManager.java @@ -0,0 +1,322 @@ +package org.gcube.portlets.user.speciesdiscovery.client.filterresult; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.SpeciesDiscovery; +import org.gcube.portlets.user.speciesdiscovery.client.event.ActiveButtonCheckAllRowEvent; +import org.gcube.portlets.user.speciesdiscovery.client.model.ClassificationModel; +import org.gcube.portlets.user.speciesdiscovery.client.util.SpeciesGridFields; +import org.gcube.portlets.user.speciesdiscovery.client.util.stream.StreamPagingLoader; +import org.gcube.portlets.user.speciesdiscovery.client.util.stream.StreamPagingLoaderListener; +import org.gcube.portlets.user.speciesdiscovery.shared.DataSourceModel; + +import com.allen_sauer.gwt.log.client.Log; +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.store.StoreEvent; +import com.extjs.gxt.ui.client.store.StoreListener; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.google.gwt.event.shared.EventBus; +import com.google.gwt.user.client.rpc.AsyncCallback; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class ResultFilterPanelManager{ + private static ResultFilterPanelManager instance; + private ClassificationFilter classificationFilter; + private DataProviderFilter dataProviderFilter; + private TypeFilter typeFilter; + private DataSourceFilter dataSourceFilter; + private RankFilter rankFilter; + private List listResultFilterPanel = new ArrayList(); + private StreamPagingLoader loader; + private int pageSize; + private EventBus eventBus; + private int oldStreamSize= -1; + private boolean isDataLoaded = false; + + private String currentGroupByRank = ""; + + private ResultFilterPanelManager(){ + + classificationFilter = new ClassificationFilter(); + dataProviderFilter = new DataProviderFilter(); + typeFilter = new TypeFilter(); + dataSourceFilter = new DataSourceFilter(); + rankFilter = new RankFilter(); + + listResultFilterPanel.add(classificationFilter.getPanel()); + listResultFilterPanel.add(dataProviderFilter.getPanel()); + listResultFilterPanel.add(dataSourceFilter.getPanel()); + listResultFilterPanel.add(rankFilter.getPanel()); +// listResultFilterPanel.add(typeFilter.getPanel()); + + } + + public List getListResultFilterPanel() { + return listResultFilterPanel; + } + + + public static synchronized ResultFilterPanelManager getInstance() { + if (instance == null) + instance = new ResultFilterPanelManager(); + return instance; + } + + public void loadDataSource(List result) { + +// dataSourceFilter.loadDataSource(result); + + } + + public void setEventBus(EventBus eventBus){ + this.eventBus = eventBus; + classificationFilter.setEventBus(eventBus); + dataProviderFilter.setEventBus(eventBus); + dataSourceFilter.setEventBus(eventBus); + rankFilter.setEventBus(eventBus); + } + + public void setIsDataLoaded(boolean bool){ + isDataLoaded = bool; + } + + + public void bind(StreamPagingLoader loader) + { + this.loader = loader; + this.pageSize = loader.getPageSize(); + loader.addListener(new StreamPagingLoaderListener() { + + @Override + public void onStreamUpdate(int streamSize, int currentStartItem, int currentEndItem) { + Log.trace("in on stream UPDATE - Stream size: " +streamSize); + + if(oldStreamSize != streamSize) + updateDataSourceFilter(); + + oldStreamSize = streamSize; + + setIsDataLoaded(true); + } + + @Override + public void onStreamLoadingComplete() { + Log.trace("####### onStreamLoadingComplete COMPLETED"); + updateDataSourceFilter(); + eventBus.fireEvent(new ActiveButtonCheckAllRowEvent(true)); + + + } + + @Override + public void onStreamStartLoading() { + resetFilters(); + eventBus.fireEvent(new ActiveButtonCheckAllRowEvent(false)); + + } + }); + + loader.getStore().addStoreListener(new StoreListener(){ + + /** + * {@inheritDoc} + */ + @Override + public void storeBeforeDataChanged(StoreEvent se) { + } + + }); + } + + public void updateDataSourceFilterById(SpeciesGridFields filterId){ + + if(filterId==null) + return; + + switch (filterId) { + + case DATASOURCE: + + SpeciesDiscovery.taxonomySearchService.getFilterCounterById(SpeciesGridFields.DATASOURCE, new AsyncCallback>() { + + @Override + public void onSuccess(HashMap result) { + if(result!=null) + dataSourceFilter.loadDataSource(result); + } + + @Override + public void onFailure(Throwable caught) { + resetFilters(); +// errorAlert("Error in SpeciesDiscovery.taxonomySearchService.getFilterCounterById " + caught.getMessage()); + Log.error("Error in SpeciesDiscovery.taxonomySearchService.getFilterCounterById " + caught); + + } + }); + + break; + + case DATAPROVIDER: + + SpeciesDiscovery.taxonomySearchService.getFilterCounterById(SpeciesGridFields.DATAPROVIDER, new AsyncCallback>() { + + @Override + public void onSuccess(HashMap result) { + if(result!=null) + dataProviderFilter.loadDataSource(result); + } + + @Override + public void onFailure(Throwable caught) { + resetFilters(); +// errorAlert("Error in SpeciesDiscovery.taxonomySearchService.getFilterCounterById " + caught.getMessage()); + Log.error("Error in SpeciesDiscovery.taxonomySearchService.getFilterCounterById " + caught); + + } + }); + + break; + + + case MATCHING_RANK: + + SpeciesDiscovery.taxonomySearchService.getFilterCounterById(SpeciesGridFields.MATCHING_RANK, new AsyncCallback>() { + + @Override + public void onSuccess(HashMap result) { + if(result!=null) + rankFilter.loadDataSource(result); + } + + @Override + public void onFailure(Throwable caught) { + resetFilters(); +// errorAlert("Error in SpeciesDiscovery.taxonomySearchService.getFilterCounterById" + caught.getMessage()); + Log.error("Error in SpeciesDiscovery.taxonomySearchService.getFilterCounterById " + caught); + + } + }); + + break; + } + } + + public void updateDataSourceFilter(){ + + SpeciesDiscovery.taxonomySearchService.getFilterCounterById(SpeciesGridFields.DATASOURCE, new AsyncCallback>() { + + @Override + public void onSuccess(HashMap result) { + if(result!=null) + dataSourceFilter.loadDataSource(result); + } + + @Override + public void onFailure(Throwable caught) { + resetFilters(); +// errorAlert("Error in SpeciesDiscovery.taxonomySearchService.getFilterCounterById " + caught.getMessage()); + Log.error("Error in SpeciesDiscovery.taxonomySearchService.getFilterCounterById " + caught); + + } + }); + + SpeciesDiscovery.taxonomySearchService.getFilterCounterById(SpeciesGridFields.DATAPROVIDER, new AsyncCallback>() { + + @Override + public void onSuccess(HashMap result) { + if(result!=null) + dataProviderFilter.loadDataSource(result); + } + + @Override + public void onFailure(Throwable caught) { + resetFilters(); +// errorAlert("Error in SpeciesDiscovery.taxonomySearchService.getFilterCounterById " + caught.getMessage()); + Log.error("Error in SpeciesDiscovery.taxonomySearchService.getFilterCounterById " + caught); + + } + }); + + SpeciesDiscovery.taxonomySearchService.getFilterCounterById(SpeciesGridFields.MATCHING_RANK, new AsyncCallback>() { + + @Override + public void onSuccess(HashMap result) { + if(result!=null) + rankFilter.loadDataSource(result); + } + + @Override + public void onFailure(Throwable caught) { + resetFilters(); +// errorAlert("Error in SpeciesDiscovery.taxonomySearchService.getFilterCounterById" + caught.getMessage()); + Log.error("Error in SpeciesDiscovery.taxonomySearchService.getFilterCounterById " + caught); + + } + }); + + SpeciesDiscovery.taxonomySearchService.getFilterCounterForClassification(getUpdatedGroupByRank() , callbackFilterCounter); + } + + + private void resetFilters() { + dataSourceFilter.reset(); + dataProviderFilter.reset(); + classificationFilter.reset(); + rankFilter.reset(); + oldStreamSize = -1; + setIsDataLoaded(false); + + } + + public void updateFilterCounterForClassification(){ + + if(isDataLoaded) + SpeciesDiscovery.taxonomySearchService.getFilterCounterForClassification(getUpdatedGroupByRank(), callbackFilterCounter); + + } + + public String getUpdatedGroupByRank() { + + if(currentGroupByRank.compareTo(classificationFilter.getGroupRank())!=0) + classificationFilter.reset(); + + setGroupByRank(classificationFilter.getGroupRank()); + + return currentGroupByRank; + } + + public void setGroupByRank(String groupByRank) { + currentGroupByRank = groupByRank; + + } + + public String getGroupByRank() { + return classificationFilter.getGroupRank(); + } + + + private AsyncCallback> callbackFilterCounter = new AsyncCallback>() { + + @Override + public void onFailure(Throwable caught) { + resetFilters(); +// errorAlert("Error in SpeciesDiscovery.taxonomySearchService.getFilterCounterForClassification" + caught.getMessage()); + Log.error("Error in SpeciesDiscovery.taxonomySearchService.getFilterCounterForClassification " + caught); + + } + + @Override + public void onSuccess(HashMap result) { + if(result!=null) + classificationFilter.loadDataSourceClassification(result, currentGroupByRank); + } + }; + + + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/filterresult/TypeFilter.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/filterresult/TypeFilter.java new file mode 100644 index 0000000..6dc3304 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/filterresult/TypeFilter.java @@ -0,0 +1,43 @@ +package org.gcube.portlets.user.speciesdiscovery.client.filterresult; + +import java.util.HashMap; + +import com.extjs.gxt.ui.client.widget.ContentPanel; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + *NOT USED + */ +public class TypeFilter implements ResultFilterPanelInterface{ + + private ContentPanel typeFilterPanel = new ContentPanel(); + + public TypeFilter() { + setHeaderTitle(); + } + + @Override + public ContentPanel getPanel() { + return typeFilterPanel; + } + + @Override + public String getName() { + return ResultFilterPanelEnum.TYPE.getLabel(); + } + + @Override + public void setHeaderTitle() { + typeFilterPanel.setHeading(this.getName()); + + } + + @Override + public void loadDataSource(HashMap result) { + // TODO Auto-generated method stub + return; + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/gridview/OccurrenceJobGridManager.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/gridview/OccurrenceJobGridManager.java new file mode 100644 index 0000000..72ca63d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/gridview/OccurrenceJobGridManager.java @@ -0,0 +1,120 @@ +package org.gcube.portlets.user.speciesdiscovery.client.gridview; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.SpeciesDiscovery; +import org.gcube.portlets.user.speciesdiscovery.client.event.CreateOccurrenceJobEvent; +import org.gcube.portlets.user.speciesdiscovery.shared.DataSource; +import org.gcube.portlets.user.speciesdiscovery.shared.OccurrencesSaveEnum; +import org.gcube.portlets.user.speciesdiscovery.shared.SaveFileFormat; +import org.gcube.portlets.user.speciesdiscovery.shared.util.NormalizeString; + +import com.allen_sauer.gwt.log.client.Log; +import com.extjs.gxt.ui.client.widget.Info; +import com.google.gwt.event.shared.EventBus; +import com.google.gwt.user.client.rpc.AsyncCallback; + +public class OccurrenceJobGridManager { + + private int expectedPoints; + private List listDataSource; + private SaveFileFormat fileFormat; + private OccurrencesSaveEnum saveType; + private String searchTerm; + private boolean isByDataSource; + private EventBus eventBus; + private boolean isSearchByCommonName; + + private static int EMPTY = -1; + private static final String SCIENTIFIC_NAME = "(scientific name)"; + private static final String COMMON_NAME = "(common name)"; + + public OccurrenceJobGridManager(EventBus eventBus, SaveFileFormat fileFormat, OccurrencesSaveEnum save, String searchTerm, boolean isByDataSource, boolean isSearchByCommonName) { + this.expectedPoints = EMPTY; + this.listDataSource = null; + + this.eventBus = eventBus; + + this.fileFormat = fileFormat; + this.saveType = save; + this.searchTerm = searchTerm; + this.isByDataSource = isByDataSource; + + this.isSearchByCommonName = isSearchByCommonName; + + } + + public void saveOccurrence(){ + + SpeciesDiscovery.taxonomySearchService.loadDataSourceForResultRow(true, true, new AsyncCallback>() { + + @Override + public void onSuccess(List result) { + + listDataSource = new ArrayList(); + + if(result!=null){ + for (DataSource dataSource : result) + listDataSource.add(dataSource.getName()); + } + else + Info.display("Error", "Error getting data source list, retry"); + + createOccurrenceJobEventCallback(); + } + + @Override + public void onFailure(Throwable caught) { + Info.display("Error getting data source list", "Error getting data source list, retry"); + Log.error("An error occured in loadDataSourceForResultRow "+caught); + + } + }); + + SpeciesDiscovery.taxonomySearchService.retrieveOccurencesFromSelection(new AsyncCallback() { + + @Override + public void onSuccess(Integer points) { + Log.trace("Expected points: "+expectedPoints); + + expectedPoints = points.intValue(); + + if(expectedPoints>0) + createOccurrenceJobEventCallback(); + else + Info.display("Info", "There are no occurrence points to save"); + } + + @Override + public void onFailure(Throwable caught) { + Info.display("Error getting occurrences", "Error getting occurrences, retry"); + Log.trace("Error getting occurrences", caught); + } + }); + + + } + + private void createOccurrenceJobEventCallback() { + + if(listDataSource==null || expectedPoints==EMPTY) //control if both async call is completed + return; + + String jobName = getSearchTermBySearchType(isSearchByCommonName, searchTerm); + + eventBus.fireEvent(new CreateOccurrenceJobEvent(fileFormat, expectedPoints, saveType, listDataSource, jobName, isByDataSource)); + + } + + public static String getSearchTermBySearchType(boolean isSearchByCommonName, String searchTerm){ + + if(isSearchByCommonName) + return NormalizeString.lowerCaseUpFirstChar(searchTerm) + " " + COMMON_NAME; + else + return NormalizeString.lowerCaseUpFirstChar(searchTerm) + " " + SCIENTIFIC_NAME; + } + + + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/gridview/ResultRowResultsPanel.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/gridview/ResultRowResultsPanel.java new file mode 100644 index 0000000..ae8757b --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/gridview/ResultRowResultsPanel.java @@ -0,0 +1,569 @@ +package org.gcube.portlets.user.speciesdiscovery.client.gridview; + +import org.gcube.portlets.user.speciesdiscovery.client.ConstantsSpeciesDiscovery; +import org.gcube.portlets.user.speciesdiscovery.client.SearchController; +import org.gcube.portlets.user.speciesdiscovery.client.event.DisableFilterEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.ShowOnlySelectedRowEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.UpdateAllRowSelectionEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.ViewDetailsOfSelectedEvent; +import org.gcube.portlets.user.speciesdiscovery.client.resources.Resources; +import org.gcube.portlets.user.speciesdiscovery.client.resultview.DescriptiveSpeciesGrid; +import org.gcube.portlets.user.speciesdiscovery.client.resultview.SpeciesGrid; +import org.gcube.portlets.user.speciesdiscovery.client.util.stream.StreamPagingLoader; +import org.gcube.portlets.user.speciesdiscovery.client.util.stream.StreamPagingToolBar; +import org.gcube.portlets.user.speciesdiscovery.shared.OccurrencesSaveEnum; +import org.gcube.portlets.user.speciesdiscovery.shared.SaveFileFormat; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchResultType; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchType; + +import com.extjs.gxt.ui.client.Style.ButtonScale; +import com.extjs.gxt.ui.client.Style.Scroll; +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.event.ButtonEvent; +import com.extjs.gxt.ui.client.event.MenuEvent; +import com.extjs.gxt.ui.client.event.SelectionListener; +import com.extjs.gxt.ui.client.store.ListStore; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.button.ToggleButton; +import com.extjs.gxt.ui.client.widget.layout.AnchorData; +import com.extjs.gxt.ui.client.widget.layout.AnchorLayout; +import com.extjs.gxt.ui.client.widget.menu.Menu; +import com.extjs.gxt.ui.client.widget.menu.MenuItem; +import com.extjs.gxt.ui.client.widget.tips.ToolTipConfig; +import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem; +import com.extjs.gxt.ui.client.widget.toolbar.LabelToolItem; +import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem; +import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.event.shared.EventBus; +import com.google.gwt.user.client.ui.AbstractImagePrototype; + +public class ResultRowResultsPanel extends ContentPanel { + + + private static final String ONLY_SELECTED = "Only selected"; + + private static final String SHOWS_ONLY_THE_SELECTED_RESULTS = "Shows only the selected results."; + + private static final String SHOW_ONLY_SELECTED = "Show only selected"; + + public static final String TOGGLE_CLASS = "SPECIES_TOGGLE"; + + protected final static String TOGGLE_GROUP = "SPECIES_VIEW"; + + private static ResultRowResultsPanel instance; + + protected SpeciesGrid classicGridView; + + protected DescriptiveSpeciesGrid descriptiveGridView; + + public final static AbstractImagePrototype deleteFilterImage = AbstractImagePrototype.create(Resources.INSTANCE.getDelete()); + + public final static AbstractImagePrototype imgCheckBoxFull = AbstractImagePrototype.create(Resources.INSTANCE.getCheckBoxFull()); + + public final static AbstractImagePrototype imgCheckBoxEmpty = AbstractImagePrototype.create(Resources.INSTANCE.getCheckBoxEmpty()); + + public final static AbstractImagePrototype imgCheckSelected = AbstractImagePrototype.create(Resources.INSTANCE.getCheckSelected()); + + public final static AbstractImagePrototype imgDetailsWindow = AbstractImagePrototype.create(Resources.INSTANCE.getDetailsWindow()); + + protected ContentPanel currentView; + + protected ToggleButton classicGridViewButton; + + protected ToggleButton descriptiveGridViewButton; + + protected Button actionButton; + + protected Button btnSelectAllRow; + +// protected Button btnDeselectAllRow; + + protected EventBus eventBus; + + protected StreamPagingToolBar pageToolBar; + + private LabelToolItem labelFilter; + + private LabelToolItem labelFilterValue; + + private Button btnViewDetails; + + private Button btnRemoveFilter; + + private ToolBar viewsToolBar = new ToolBar(); + + private final ToggleButton btnShowOnlySelectedButton; + + private ListStore store; + + private Button btnDeSelectAllRow; + + private SearchController searchController; + + private Button btnShowInGisViewer; + private Button btnOccurrencesMenu; + + public static ResultRowResultsPanel getInstance() { + return instance; + } + + + public ResultRowResultsPanel(final EventBus eventBus, StreamPagingLoader loader, SearchController searchController) { + + instance=this; + setBodyBorder(false); + this.eventBus = eventBus; + this.store = loader.getStore(); + this.searchController = searchController; + + bind(eventBus, loader); + + setFrame(false); + setCollapsible(false); + setAnimCollapse(false); + setHeaderVisible(false); + setLayout(new AnchorLayout()); + setScrollMode(Scroll.AUTOX); + + + classicGridView = new SpeciesGrid(loader.getStore(), eventBus); +// classicGridView.setBodyBorder(false); + + descriptiveGridView = new DescriptiveSpeciesGrid(loader.getStore()); +// descriptiveGridView.setBodyBorder(false); + + viewsToolBar = new ToolBar(); + + + classicGridViewButton = new ToggleButton("", AbstractImagePrototype.create(Resources.INSTANCE.getGridSpeciesIcon())); + classicGridViewButton.setToggleGroup(TOGGLE_GROUP); + classicGridViewButton.setScale(ButtonScale.MEDIUM); + classicGridViewButton.addSelectionListener(new SelectionListener() { + @Override + public void componentSelected(ButtonEvent ce) { + toggleView(classicGridView); + } + }); + classicGridViewButton.setAllowDepress(false); + classicGridViewButton.setToolTip(new ToolTipConfig("Scientific view", "Shows species as a basic grid")); + viewsToolBar.add(classicGridViewButton); + + descriptiveGridViewButton = new ToggleButton("", AbstractImagePrototype.create(Resources.INSTANCE.getDescriptiveSpeciesIcon())); + descriptiveGridViewButton.setScale(ButtonScale.MEDIUM); + descriptiveGridViewButton.setToggleGroup(TOGGLE_GROUP); + descriptiveGridViewButton.addSelectionListener(new SelectionListener() { + @Override + public void componentSelected(ButtonEvent ce) { + toggleView(descriptiveGridView); + } + }); + + + descriptiveGridViewButton.setAllowDepress(false); + descriptiveGridViewButton.setToolTip(new ToolTipConfig("Expandable List view", "Shows species as a grid letting users to expand interested rows.")); + viewsToolBar.add(descriptiveGridViewButton); + + LabelToolItem labelView = new LabelToolItem("Switch view"); + viewsToolBar.add(labelView); + + actionButton = new Button("Actions"); + + viewsToolBar.add(new SeparatorToolItem()); + + btnShowOnlySelectedButton = new ToggleButton(ONLY_SELECTED); + btnShowOnlySelectedButton.setIcon(imgCheckSelected); + btnShowOnlySelectedButton.setScale(ButtonScale.MEDIUM); + btnShowOnlySelectedButton.addSelectionListener(btnOnlySelectedListner); + btnShowOnlySelectedButton.setToolTip(new ToolTipConfig(SHOW_ONLY_SELECTED, SHOWS_ONLY_THE_SELECTED_RESULTS)); + viewsToolBar.add(btnShowOnlySelectedButton); + + + btnViewDetails = new Button(ConstantsSpeciesDiscovery.VIEWDETAILS); + btnViewDetails.setScale(ButtonScale.MEDIUM); + btnViewDetails.setIcon(imgDetailsWindow); + btnViewDetails.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + eventBus.fireEvent(new ViewDetailsOfSelectedEvent()); + + } + + }); + + viewsToolBar.add(new SeparatorToolItem()); + viewsToolBar.add(btnViewDetails); + + btnSelectAllRow = new Button(ConstantsSpeciesDiscovery.SELECTALL); + btnSelectAllRow.setIcon(imgCheckBoxFull); + btnSelectAllRow.setScale(ButtonScale.MEDIUM); + btnSelectAllRow.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + +// if(btnToggleSelectAllRow.isPressed()){ +// btnToggleSelectAllRow.setText(ConstantsSpeciesDiscovery.DESELECTALL); +// btnToggleSelectAllRow.setIcon(imgCheckBoxEmpty); +// eventBus.fireEvent(new UpdateAllRowSelectionEvent(true, SearchResultType.SPECIES_PRODUCT)); +// }else{ +// btnToggleSelectAllRow.setText(ConstantsSpeciesDiscovery.SELECTALL); +// btnToggleSelectAllRow.setIcon(imgCheckBoxFull); +// eventBus.fireEvent(new UpdateAllRowSelectionEvent(false, SearchResultType.SPECIES_PRODUCT)); +// } + + eventBus.fireEvent(new UpdateAllRowSelectionEvent(true, SearchResultType.SPECIES_PRODUCT)); + } + + }); + + viewsToolBar.add(new SeparatorToolItem()); + viewsToolBar.add(btnSelectAllRow); + + + btnDeSelectAllRow = new Button(ConstantsSpeciesDiscovery.DESELECTALL); + btnDeSelectAllRow.setIcon(imgCheckBoxEmpty); + btnDeSelectAllRow.setScale(ButtonScale.MEDIUM); + btnDeSelectAllRow.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + eventBus.fireEvent(new UpdateAllRowSelectionEvent(false, SearchResultType.SPECIES_PRODUCT)); + } + + }); + + viewsToolBar.add(new SeparatorToolItem()); + viewsToolBar.add(btnDeSelectAllRow); + + viewsToolBar.add(new SeparatorToolItem()); + addButtonsOccurrencesJob(); + + viewsToolBar.add(new FillToolItem()); + + labelFilter = new LabelToolItem(ConstantsSpeciesDiscovery.FILTER); + viewsToolBar.add(labelFilter); + + labelFilterValue = new LabelToolItem(ConstantsSpeciesDiscovery.NONE); + viewsToolBar.add(labelFilterValue); + + btnRemoveFilter = new Button(); + btnRemoveFilter.setIcon(deleteFilterImage); + btnRemoveFilter.getElement().getStyle().setLeft(5, Unit.PX); + btnRemoveFilter.setVisible(false); + + + btnRemoveFilter.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + eventBus.fireEvent(new DisableFilterEvent()); + + } + }); + + btnRemoveFilter.setToolTip(ConstantsSpeciesDiscovery.REMOVEFILTERTOOLTIP); + + viewsToolBar.add(btnRemoveFilter); + + setTopComponent(viewsToolBar); + + pageToolBar = new StreamPagingToolBar(); + + pageToolBar.bind(loader); + + setBottomComponent(pageToolBar); + + add(classicGridView, new AnchorData("100% 100%")); + add(descriptiveGridView, new AnchorData("100% 100%")); + + activeToolBarButtons(false); //DEFAULT DISABLE BUTTONS + btnSelectAllRow.setEnabled(false); + btnDeSelectAllRow.setEnabled(false); + + toggleView(classicGridView); + + + + } + + public void activeToolBarButtons(boolean bool){ + btnShowOnlySelectedButton.setEnabled(bool); + btnViewDetails.setEnabled(bool); +// btnShowInGisViewer.setEnabled(bool); + btnOccurrencesMenu.setEnabled(bool); + + } + + public void resetFilter (){ + labelFilter.setLabel(ConstantsSpeciesDiscovery.FILTER); + labelFilterValue.setLabel(ConstantsSpeciesDiscovery.NONE); + btnRemoveFilter.setVisible(false); + classicGridView.setBodyStyleAsFiltered(false); + + pageToolBar.reset(); //ADDED 03/08/2012 + } + + public void setFilterActive(boolean isActive, String label){ + + if(isActive){ + labelFilterValue.setLabel(label); + btnRemoveFilter.setVisible(true); + classicGridView.setBodyStyleAsFiltered(true); + } + else + resetFilter(); + } + + protected void bind(EventBus eventBus, StreamPagingLoader loader) + { +// this.gridViewManager = new GridViewManager(eventBus, loader); + } + + protected void toggleView(ContentPanel view) + { + instance.mask("Switching view.."); + + actionButton.setEnabled(false); + + if (view.equals(classicGridView)) { + classicGridViewButton.toggle(true); + classicGridView.show(); + actionButton.setEnabled(true); + } else { + classicGridViewButton.toggle(false); + classicGridView.hide(); + } + + if (view.equals(descriptiveGridView)) { + descriptiveGridViewButton.toggle(true); + descriptiveGridView.show(); + actionButton.setEnabled(true); + } else { + descriptiveGridViewButton.toggle(false); + descriptiveGridView.hide(); + } + + currentView = view; + instance.unmask(); + + + } + + @Override + protected void onAfterLayout() { + super.onAfterLayout(); + descriptiveGridView.layout(); +// imageGridView.layout(); + reload(); + } + + public void reload() { +// if (currentView!=null) +// this.gridViewManager.reload(); + } + + + public void activeBtnShowOnlySelected(boolean bool) { + + this.btnShowOnlySelectedButton.removeSelectionListener(btnOnlySelectedListner); + this.btnShowOnlySelectedButton.toggle(bool); + this.btnShowOnlySelectedButton.addSelectionListener(btnOnlySelectedListner); + + } + + private SelectionListener< ButtonEvent> btnOnlySelectedListner = new SelectionListener() { + @Override + public void componentSelected(ButtonEvent ce) { + eventBus.fireEvent(new ShowOnlySelectedRowEvent(btnShowOnlySelectedButton.isPressed())); + } + }; + + public void resetStore() { + this.store.removeAll(); + } + + + public SpeciesGrid getClassicGridView() { + return classicGridView; + } + + + public void selectAllRows(boolean selectionValue) { + if(selectionValue) + classicGridView.selectAll(); + else + classicGridView.deselectAll(); + + } + + public void activeCheckAllRows(boolean active) { + btnSelectAllRow.setEnabled(active); + btnDeSelectAllRow.setEnabled(active); + } + + public void addButtonsOccurrencesJob(){ + +// btnShowInGisViewer = new Button(ConstantsSpeciesDiscovery.SHOW_IN_GIS_VIEWER); +// btnShowInGisViewer.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getGisProducts())); +// btnShowInGisViewer.setToolTip(new ToolTipConfig(ConstantsSpeciesDiscovery.SHOW_IN_GIS_VIEWER, "Show occurences points from selected results in a Gis Viewer Map.")); +// btnShowInGisViewer.setScale(ButtonScale.SMALL); +//// btnShowInGisViewer.setIconAlign(IconAlign.TOP); +// btnShowInGisViewer.setArrowAlign(ButtonArrowAlign.BOTTOM); +// btnShowInGisViewer.addSelectionListener(new SelectionListener() { +// +// @Override +// public void componentSelected(ButtonEvent ce) { +// +// SpeciesDiscovery.taxonomySearchService.retrieveOccurencesFromSelection(new AsyncCallback() { +// +// @Override +// public void onSuccess(Integer points) { +// Log.trace("Expected points: "+points); +// +// int expectedPoints = points.intValue(); +// +// if(expectedPoints>0) +// eventBus.fireEvent(new ShowOccurrencesMapEvent(expectedPoints)); +// } +// +// @Override +// public void onFailure(Throwable caught) { +// Info.display("Error getting occurrences", "Error getting occurrences, retry"); +// Log.trace("Error getting occurrences", caught); +// } +// }); +// +// +// } +// }); + + btnOccurrencesMenu = new Button(ConstantsSpeciesDiscovery.SAVE_OCCURRENCES); + Menu formatSubMenu = new Menu(); + btnOccurrencesMenu.setMenu(formatSubMenu); + btnOccurrencesMenu.setScale(ButtonScale.MEDIUM); +// btnOccurrencesMenu.setIconAlign(IconAlign.TOP); + btnOccurrencesMenu.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getSaveProducts24())); + btnOccurrencesMenu.setToolTip(new ToolTipConfig(ConstantsSpeciesDiscovery.SAVE_OCCURRENCES, ConstantsSpeciesDiscovery.SAVE_OCCURENCES_POINTS_FROM_SELECTED_RESULTS)); + + MenuItem csvFormatItem = new MenuItem(ConstantsSpeciesDiscovery.CSV); + csvFormatItem.setToolTip(new ToolTipConfig(ConstantsSpeciesDiscovery.SAVES_IN_CSV_FILE_FORMAT)); + csvFormatItem.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(MenuEvent ce) { + + OccurrenceJobGridManager occurrenceJobMng = new OccurrenceJobGridManager(eventBus,SaveFileFormat.CSV, OccurrencesSaveEnum.STANDARD,searchController.getLastSearchEvent().getSearchTerm(), false, isSearchByCommonName()); + + occurrenceJobMng.saveOccurrence(); + } + }); + + + formatSubMenu.add(csvFormatItem); + + Menu csvTypeMenu = new Menu(); + + MenuItem csvStandard = new MenuItem(ConstantsSpeciesDiscovery.PLAIN_CSV); + + csvStandard.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(MenuEvent ce) { + + + OccurrenceJobGridManager occurrenceJobMng = new OccurrenceJobGridManager(eventBus,SaveFileFormat.CSV, OccurrencesSaveEnum.STANDARD,searchController.getLastSearchEvent().getSearchTerm(), false, isSearchByCommonName()); + + occurrenceJobMng.saveOccurrence(); + + + } + }); + + + MenuItem csvStandardByDataSource = new MenuItem(ConstantsSpeciesDiscovery.PLAIN_CSV_BY_DATA_SOURCE); + + csvStandardByDataSource.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(MenuEvent ce) { + + OccurrenceJobGridManager occurrenceJobMng = new OccurrenceJobGridManager(eventBus,SaveFileFormat.CSV, OccurrencesSaveEnum.STANDARD,searchController.getLastSearchEvent().getSearchTerm(), true, isSearchByCommonName()); + + occurrenceJobMng.saveOccurrence(); + + } + }); + + + MenuItem csvOpenModeller = new MenuItem(ConstantsSpeciesDiscovery.OPEN_MODELLER); + + csvOpenModeller.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(MenuEvent ce) { + + OccurrenceJobGridManager occurrenceJobMng = new OccurrenceJobGridManager(eventBus,SaveFileFormat.CSV, OccurrencesSaveEnum.OPENMODELLER,searchController.getLastSearchEvent().getSearchTerm(), false, isSearchByCommonName()); + + occurrenceJobMng.saveOccurrence(); + + } + }); + + + MenuItem csvOpenModellerByDataSource = new MenuItem(ConstantsSpeciesDiscovery.OPEN_MODELLER_BY_DATA_SOURCE); + + csvOpenModellerByDataSource.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(MenuEvent ce) { + + + OccurrenceJobGridManager occurrenceJobMng = new OccurrenceJobGridManager(eventBus,SaveFileFormat.CSV, OccurrencesSaveEnum.OPENMODELLER,searchController.getLastSearchEvent().getSearchTerm(), true, isSearchByCommonName()); + + occurrenceJobMng.saveOccurrence(); + + } + }); + + csvTypeMenu.add(csvStandard); + + csvTypeMenu.add(csvStandardByDataSource); + + csvTypeMenu.add(csvOpenModeller); + + csvTypeMenu.add(csvOpenModellerByDataSource); + + csvFormatItem.setSubMenu(csvTypeMenu); + + MenuItem darwinCoreFormatItem = new MenuItem(ConstantsSpeciesDiscovery.DARWIN_CORE); + darwinCoreFormatItem.setToolTip(new ToolTipConfig(ConstantsSpeciesDiscovery.SAVES_IN_DARWIN_CORE_FILE_FORMAT)); + darwinCoreFormatItem.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(MenuEvent ce) { + + OccurrenceJobGridManager occurrenceJobMng = new OccurrenceJobGridManager(eventBus,SaveFileFormat.DARWIN_CORE, null,searchController.getLastSearchEvent().getSearchTerm(), false, isSearchByCommonName()); + + occurrenceJobMng.saveOccurrence(); + + } + }); + formatSubMenu.add(darwinCoreFormatItem); + + viewsToolBar.add(btnOccurrencesMenu); +// viewsToolBar.add(new SeparatorToolItem()); +// viewsToolBar.add(btnShowInGisViewer); + } + + + protected boolean isSearchByCommonName() { + + if(searchController.getLastSearchEvent().getType().equals(SearchType.BY_COMMON_NAME)) + return true; + + return false; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/gridview/TaxonomyRowResultsPanel.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/gridview/TaxonomyRowResultsPanel.java new file mode 100644 index 0000000..982ac19 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/gridview/TaxonomyRowResultsPanel.java @@ -0,0 +1,419 @@ +package org.gcube.portlets.user.speciesdiscovery.client.gridview; + +import org.gcube.portlets.user.speciesdiscovery.client.ConstantsSpeciesDiscovery; +import org.gcube.portlets.user.speciesdiscovery.client.event.DisableFilterEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.ShowOnlySelectedRowEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.UpdateAllRowSelectionEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.ViewDetailsOfSelectedEvent; +import org.gcube.portlets.user.speciesdiscovery.client.resources.Resources; +import org.gcube.portlets.user.speciesdiscovery.client.resultview.DescriptiveTaxonomyGrid; +import org.gcube.portlets.user.speciesdiscovery.client.resultview.TaxonomyGrid; +import org.gcube.portlets.user.speciesdiscovery.client.util.stream.StreamPagingLoader; +import org.gcube.portlets.user.speciesdiscovery.client.util.stream.StreamPagingToolBar; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchResultType; + +import com.extjs.gxt.ui.client.Style.ButtonScale; +import com.extjs.gxt.ui.client.Style.Scroll; +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.event.ButtonEvent; +import com.extjs.gxt.ui.client.event.SelectionListener; +import com.extjs.gxt.ui.client.store.ListStore; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.button.ToggleButton; +import com.extjs.gxt.ui.client.widget.layout.AnchorData; +import com.extjs.gxt.ui.client.widget.layout.AnchorLayout; +import com.extjs.gxt.ui.client.widget.tips.ToolTipConfig; +import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem; +import com.extjs.gxt.ui.client.widget.toolbar.LabelToolItem; +import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem; +import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.event.shared.EventBus; +import com.google.gwt.user.client.ui.AbstractImagePrototype; + +public class TaxonomyRowResultsPanel extends ContentPanel { + + public static final String TOGGLE_CLASS = "SPECIES_TOGGLE"; + + protected final static String TOGGLE_GROUP = "SPECIES_VIEW"; + + private static final String ONLY_SELECTED = "Only selected"; + + private static final String SHOW_ONLY_SELECTED = "Show only selected"; + + private static final String SHOWS_ONLY_THE_SELECTED_RESULTS = "Shows only the selected results."; + + private static TaxonomyRowResultsPanel instance; + + protected TaxonomyGrid classicGridView; + + protected DescriptiveTaxonomyGrid descriptiveGridView; + + protected ContentPanel imageGridView = new ContentPanel(); + + public final static AbstractImagePrototype deleteFilterImage = AbstractImagePrototype.create(Resources.INSTANCE.getDelete()); + + public final static AbstractImagePrototype imgCheckBoxFull = AbstractImagePrototype.create(Resources.INSTANCE.getCheckBoxFull()); + + public final static AbstractImagePrototype imgCheckBoxEmpty = AbstractImagePrototype.create(Resources.INSTANCE.getCheckBoxEmpty()); + + public final static AbstractImagePrototype imgCheckSelected = AbstractImagePrototype.create(Resources.INSTANCE.getCheckSelected()); + + public final static AbstractImagePrototype imgDetailsWindow = AbstractImagePrototype.create(Resources.INSTANCE.getDetailsWindow()); + + protected ContentPanel currentView; + + protected ToggleButton classicGridViewButton; + + protected ToggleButton descriptiveGridViewButton; + + protected Button actionButton; + + protected EventBus eventBus; + + protected StreamPagingToolBar pageToolBar; + + private LabelToolItem labelFilter; + + private LabelToolItem labelFilterValue; + + private Button btnViewDetails; + + private Button btnRemoveFilter; + + private ToolBar viewsToolBar = new ToolBar(); + + private final ToggleButton btnShowOnlySelectedButton; + + private ListStore store; + + protected Button btnSelectAllRow; + + private Button btnDeSelectAllRow; + + + public static TaxonomyRowResultsPanel getInstance() { + return instance; + } + + + public TaxonomyRowResultsPanel(final EventBus eventBus, StreamPagingLoader loader) { + + instance=this; + setBodyBorder(false); + this.eventBus = eventBus; + this.store = loader.getStore(); + +// bind(eventBus, loader); + + setFrame(false); + setCollapsible(false); + setAnimCollapse(false); + setHeaderVisible(false); + setLayout(new AnchorLayout()); + setScrollMode(Scroll.AUTOX); + + classicGridView = new TaxonomyGrid(this.store, eventBus); +// classicGridView.setBodyBorder(false); + + descriptiveGridView = new DescriptiveTaxonomyGrid(loader.getStore()); +// descriptiveGridView.setBodyBorder(false); + + /* viewsToolBar = new ToolBar(); + LabelToolItem labelView = new LabelToolItem("Switch view : "); + viewsToolBar.add(labelView); + + classicGridViewButton = new ToggleButton("", AbstractImagePrototype.create(Resources.INSTANCE.getGridSpeciesIcon())); + classicGridViewButton.setToggleGroup(TOGGLE_GROUP); + classicGridViewButton.addSelectionListener(new SelectionListener() { + @Override + public void componentSelected(ButtonEvent ce) { + toggleView(classicGridView); + } + }); + classicGridViewButton.setAllowDepress(false); + classicGridViewButton.setToolTip(new ToolTipConfig("Scientific view", "Shows species as a basic grid")); + viewsToolBar.add(classicGridViewButton); + + descriptiveGridViewButton = new ToggleButton("", AbstractImagePrototype.create(Resources.INSTANCE.getDescriptiveSpeciesIcon())); + descriptiveGridViewButton.setToggleGroup(TOGGLE_GROUP); + descriptiveGridViewButton.addSelectionListener(new SelectionListener() { + @Override + public void componentSelected(ButtonEvent ce) { + toggleView(descriptiveGridView); + } + }); + + descriptiveGridViewButton.setAllowDepress(false); + descriptiveGridViewButton.setToolTip(new ToolTipConfig("Expandable List view", "Shows species as a grid letting users to expand interested rows.")); + viewsToolBar.add(descriptiveGridViewButton); + */ + + viewsToolBar = new ToolBar(); + + classicGridViewButton = new ToggleButton("", AbstractImagePrototype.create(Resources.INSTANCE.getGridSpeciesIcon())); + classicGridViewButton.setToggleGroup(TOGGLE_GROUP); + classicGridViewButton.setScale(ButtonScale.MEDIUM); + classicGridViewButton.addSelectionListener(new SelectionListener() { + @Override + public void componentSelected(ButtonEvent ce) { + toggleView(classicGridView); + } + }); + classicGridViewButton.setAllowDepress(false); + classicGridViewButton.setToolTip(new ToolTipConfig("Scientific view", "Shows species as a basic grid")); + viewsToolBar.add(classicGridViewButton); + + descriptiveGridViewButton = new ToggleButton("", AbstractImagePrototype.create(Resources.INSTANCE.getDescriptiveSpeciesIcon())); + descriptiveGridViewButton.setScale(ButtonScale.MEDIUM); + descriptiveGridViewButton.setToggleGroup(TOGGLE_GROUP); + descriptiveGridViewButton.addSelectionListener(new SelectionListener() { + @Override + public void componentSelected(ButtonEvent ce) { + toggleView(descriptiveGridView); + } + }); + + + descriptiveGridViewButton.setAllowDepress(false); + descriptiveGridViewButton.setToolTip(new ToolTipConfig("Expandable List view", "Shows species as a grid letting users to expand interested rows.")); + viewsToolBar.add(descriptiveGridViewButton); + + LabelToolItem labelView = new LabelToolItem("Switch view"); + viewsToolBar.add(labelView); + + + actionButton = new Button("Actions"); + + viewsToolBar.add(new SeparatorToolItem()); + + btnShowOnlySelectedButton = new ToggleButton(ONLY_SELECTED); + btnShowOnlySelectedButton.setIcon(imgCheckSelected); + btnShowOnlySelectedButton.setScale(ButtonScale.MEDIUM); + btnShowOnlySelectedButton.addSelectionListener(btnOnlySelectedListner); + btnShowOnlySelectedButton.setToolTip(new ToolTipConfig(SHOW_ONLY_SELECTED, SHOWS_ONLY_THE_SELECTED_RESULTS)); + viewsToolBar.add(btnShowOnlySelectedButton); + + + btnViewDetails = new Button(ConstantsSpeciesDiscovery.VIEWDETAILS); + btnViewDetails.setScale(ButtonScale.MEDIUM); + btnViewDetails.setIcon(imgDetailsWindow); + btnViewDetails.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + eventBus.fireEvent(new ViewDetailsOfSelectedEvent()); + + } + + }); + + viewsToolBar.add(new SeparatorToolItem()); + viewsToolBar.add(btnViewDetails); + + btnSelectAllRow = new Button(ConstantsSpeciesDiscovery.SELECTALL); + btnSelectAllRow.setIcon(imgCheckBoxFull); + btnSelectAllRow.setScale(ButtonScale.MEDIUM); + btnSelectAllRow.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + +// if(btnToggleSelectAllRow.isPressed()){ +// btnToggleSelectAllRow.setText(ConstantsSpeciesDiscovery.DESELECTALL); +// btnToggleSelectAllRow.setIcon(imgCheckBoxEmpty); +// eventBus.fireEvent(new UpdateAllRowSelectionEvent(true, SearchResultType.SPECIES_PRODUCT)); +// }else{ +// btnToggleSelectAllRow.setText(ConstantsSpeciesDiscovery.SELECTALL); +// btnToggleSelectAllRow.setIcon(imgCheckBoxFull); +// eventBus.fireEvent(new UpdateAllRowSelectionEvent(false, SearchResultType.SPECIES_PRODUCT)); +// } + + eventBus.fireEvent(new UpdateAllRowSelectionEvent(true, SearchResultType.TAXONOMY_ITEM)); + } + + }); + + viewsToolBar.add(new SeparatorToolItem()); + viewsToolBar.add(btnSelectAllRow); + + + btnDeSelectAllRow = new Button(ConstantsSpeciesDiscovery.DESELECTALL); + btnDeSelectAllRow.setIcon(imgCheckBoxEmpty); + btnDeSelectAllRow.setScale(ButtonScale.MEDIUM); + btnDeSelectAllRow.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + eventBus.fireEvent(new UpdateAllRowSelectionEvent(false, SearchResultType.TAXONOMY_ITEM)); + } + + }); + + viewsToolBar.add(new SeparatorToolItem()); + viewsToolBar.add(btnDeSelectAllRow); + + viewsToolBar.add(new FillToolItem()); + + labelFilter = new LabelToolItem(ConstantsSpeciesDiscovery.FILTER); + viewsToolBar.add(labelFilter); +// viewsToolBar.add(new SeparatorToolItem()); + + labelFilterValue = new LabelToolItem(ConstantsSpeciesDiscovery.NONE); + viewsToolBar.add(labelFilterValue); + + btnRemoveFilter = new Button(); + btnRemoveFilter.setIcon(deleteFilterImage); + btnRemoveFilter.getElement().getStyle().setLeft(5, Unit.PX); + btnRemoveFilter.setVisible(false); + + + btnRemoveFilter.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + eventBus.fireEvent(new DisableFilterEvent()); + + } + }); + + btnRemoveFilter.setToolTip(ConstantsSpeciesDiscovery.REMOVEFILTERTOOLTIP); + + viewsToolBar.add(btnRemoveFilter); + + setTopComponent(viewsToolBar); + + pageToolBar = new StreamPagingToolBar(); + + pageToolBar.bind(loader); + + setBottomComponent(pageToolBar); + + add(classicGridView, new AnchorData("100% 100%")); + add(descriptiveGridView, new AnchorData("100% 100%")); + + activeToolBarButtons(false); //DEFAULT DISABLE BUTTONS + btnSelectAllRow.setEnabled(false); + btnDeSelectAllRow.setEnabled(false); + + toggleView(classicGridView); + + } + + public void activeToolBarButtons(boolean bool){ + btnShowOnlySelectedButton.setEnabled(bool); + btnViewDetails.setEnabled(bool); +// btnSelectAllRow.setEnabled(bool); +// btnDeSelectAllRow.setEnabled(bool); + } + + public void resetFilter (){ + labelFilter.setLabel(ConstantsSpeciesDiscovery.FILTER); + labelFilterValue.setLabel(ConstantsSpeciesDiscovery.NONE); + btnRemoveFilter.setVisible(false); + classicGridView.setBodyStyleAsFiltered(false); + + pageToolBar.reset(); //ADDED 03/08/2012 + } + + public void setFilterActive(boolean isActive, String label){ + + if(isActive){ + labelFilterValue.setLabel(label); + btnRemoveFilter.setVisible(true); + classicGridView.setBodyStyleAsFiltered(true); + } + else + resetFilter(); + + } + + protected void bind(EventBus eventBus, StreamPagingLoader loader) + { +// this.gridViewManager = new GridViewManager(eventBus, loader); + } + + protected void toggleView(ContentPanel view) + { + instance.mask("Switching view.."); + + actionButton.setEnabled(false); + + if (view.equals(classicGridView)) { + classicGridViewButton.toggle(true); + classicGridView.show(); + actionButton.setEnabled(true); + } else { + classicGridViewButton.toggle(false); + classicGridView.hide(); + } + + if (view.equals(descriptiveGridView)) { + descriptiveGridViewButton.toggle(true); + descriptiveGridView.show(); + actionButton.setEnabled(true); + } else { + descriptiveGridViewButton.toggle(false); + descriptiveGridView.hide(); + } + + currentView = view; + instance.unmask(); + + + } + + @Override + protected void onAfterLayout() { + super.onAfterLayout(); + descriptiveGridView.layout(); + imageGridView.layout(); + reload(); + } + + public void reload() { +// if (currentView!=null) this.gridViewManager.reload(); + } + + + public void activeBtnShowOnlySelected(boolean bool) { + + this.btnShowOnlySelectedButton.removeSelectionListener(btnOnlySelectedListner); + this.btnShowOnlySelectedButton.toggle(bool); + this.btnShowOnlySelectedButton.addSelectionListener(btnOnlySelectedListner); + + } + + private SelectionListener< ButtonEvent> btnOnlySelectedListner = new SelectionListener() { + @Override + public void componentSelected(ButtonEvent ce) { + eventBus.fireEvent(new ShowOnlySelectedRowEvent(btnShowOnlySelectedButton.isPressed())); + } + }; + + + public void resetStore(){ + this.store.removeAll(); + } + + + public TaxonomyGrid getClassicGridView() { + return classicGridView; + } + + + public void selectAllRows(boolean selectionValue) { + if(selectionValue) + classicGridView.selectAll(); + else + classicGridView.deselectAll(); + } + + + public void activeCheckAllRows(boolean active) { + btnSelectAllRow.setEnabled(active); + btnDeSelectAllRow.setEnabled(active); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/SpeciesJobPanel.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/SpeciesJobPanel.java new file mode 100644 index 0000000..918ba0a --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/SpeciesJobPanel.java @@ -0,0 +1,164 @@ +package org.gcube.portlets.user.speciesdiscovery.client.job; + +import org.gcube.portlets.user.speciesdiscovery.client.job.occurrence.OccurrenceJobSpeciesPanel; +import org.gcube.portlets.user.speciesdiscovery.client.job.taxonomy.TaxonomyJobSpeciesPanel; +import org.gcube.portlets.user.speciesdiscovery.client.resources.Resources; + +import com.extjs.gxt.ui.client.Style.ButtonScale; +import com.extjs.gxt.ui.client.event.ButtonEvent; +import com.extjs.gxt.ui.client.event.SelectionListener; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem; +import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; +import com.google.gwt.event.shared.EventBus; +import com.google.gwt.user.client.ui.AbstractImagePrototype; + +public class SpeciesJobPanel extends ContentPanel{ + + private ToolBar toolbar = new ToolBar(); + private TaxonomyJobSpeciesPanel taxonomyJobPanelInstance; + private OccurrenceJobSpeciesPanel occurrenceJobPanelInstance; + private Button btnTaxonomyJobs; + private Button btnOccurrenceJobs; + private int jobOccurrenceCount = 0; + private int jobTaxonomyCount = 0; + + + public SpeciesJobPanel(EventBus eventBus) { + this.setTopComponent(toolbar); + setLayout(new FitLayout()); + setHeaderVisible(false); + + taxonomyJobPanelInstance = TaxonomyJobSpeciesPanel.getInstance(eventBus); + occurrenceJobPanelInstance = OccurrenceJobSpeciesPanel.getInstance(eventBus); + + createOccurrencesToolBar(); + + toolbar.add(new SeparatorToolItem()); + + createTaxonomyToolBar(); + } + + private void createOccurrencesToolBar(){ + + btnTaxonomyJobs = new Button("Species Taxonomy Jobs"); + btnTaxonomyJobs.setScale(ButtonScale.MEDIUM); + setIconTaxonomyByCounter(0); + + btnTaxonomyJobs.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + + resetTaxonoyCouter(); + taxonomyJobPanelInstance.getSpeciesJobWindow().show(); + } + + }); + toolbar.add(btnTaxonomyJobs); + + } + + private void resetTaxonoyCouter(){ + jobTaxonomyCount = 0; + setIconTaxonomyByCounter(0); + } + + private void createTaxonomyToolBar(){ + + btnOccurrenceJobs = new Button("Species Occurrence Jobs"); + btnOccurrenceJobs.setScale(ButtonScale.MEDIUM); + setIconOccurrenceByCounter(0); + + btnOccurrenceJobs.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + + resetOccurrenceCounter(); + occurrenceJobPanelInstance.getSpeciesJobWindow().show(); + } + + }); + toolbar.add(btnOccurrenceJobs); + } + + private void resetOccurrenceCounter(){ + jobOccurrenceCount = 0; + setIconOccurrenceByCounter(0); + } + + public void setIconOccurrenceByCounter(int count){ + this.jobOccurrenceCount += count; + + switch (jobOccurrenceCount) { + + case 0: + + btnOccurrenceJobs.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getBluePlace())); + + break; + case 1: + + btnOccurrenceJobs.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getBluePlace1())); + + break; + case 2: + + btnOccurrenceJobs.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getBluePlace2())); + break; + case 3: + + btnOccurrenceJobs.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getBluePlace3())); + break; + case 4: + + btnOccurrenceJobs.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getBluePlace4())); + break; + default: + btnOccurrenceJobs.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getBluePlace4More())); + } + + + toolbar.layout(); + } + + + public void setIconTaxonomyByCounter(int count){ + this.jobTaxonomyCount += count; + + switch (jobTaxonomyCount) { + + case 0: + + btnTaxonomyJobs.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getTaxonomy())); + + break; + case 1: + + btnTaxonomyJobs.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getTaxonomy1())); + + break; + case 2: + + btnTaxonomyJobs.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getTaxonomy2())); + break; + case 3: + + btnTaxonomyJobs.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getTaxonomy3())); + break; + case 4: + + btnTaxonomyJobs.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getTaxonomy4())); + break; + default: + btnTaxonomyJobs.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getTaxonomy4More())); + } + + + toolbar.layout(); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/occurrence/OccurrenceGridJob.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/occurrence/OccurrenceGridJob.java new file mode 100644 index 0000000..c4cf9a3 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/occurrence/OccurrenceGridJob.java @@ -0,0 +1,589 @@ +package org.gcube.portlets.user.speciesdiscovery.client.job.occurrence; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.ConstantsSpeciesDiscovery; +import org.gcube.portlets.user.speciesdiscovery.client.SpeciesDiscovery; +import org.gcube.portlets.user.speciesdiscovery.client.event.ReLoadListJobEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.ReSubmitJobEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.SaveJobEvent; +import org.gcube.portlets.user.speciesdiscovery.client.resources.Resources; +import org.gcube.portlets.user.speciesdiscovery.client.window.MessageBoxConfirm; +import org.gcube.portlets.user.speciesdiscovery.shared.DataSource; +import org.gcube.portlets.user.speciesdiscovery.shared.DownloadState; +import org.gcube.portlets.user.speciesdiscovery.shared.JobOccurrencesModel; +import org.gcube.portlets.user.speciesdiscovery.shared.JobTaxonomyModel; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchResultType; + +import com.allen_sauer.gwt.log.client.Log; +import com.extjs.gxt.ui.client.Style.ButtonScale; +import com.extjs.gxt.ui.client.Style.SelectionMode; +import com.extjs.gxt.ui.client.data.BaseModelData; +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.event.BaseEvent; +import com.extjs.gxt.ui.client.event.ButtonEvent; +import com.extjs.gxt.ui.client.event.Events; +import com.extjs.gxt.ui.client.event.GridEvent; +import com.extjs.gxt.ui.client.event.Listener; +import com.extjs.gxt.ui.client.event.MenuEvent; +import com.extjs.gxt.ui.client.event.MessageBoxEvent; +import com.extjs.gxt.ui.client.event.SelectionChangedEvent; +import com.extjs.gxt.ui.client.event.SelectionChangedListener; +import com.extjs.gxt.ui.client.event.SelectionListener; +import com.extjs.gxt.ui.client.store.ListStore; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.Dialog; +import com.extjs.gxt.ui.client.widget.Info; +import com.extjs.gxt.ui.client.widget.MessageBox; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.grid.ColumnConfig; +import com.extjs.gxt.ui.client.widget.grid.ColumnData; +import com.extjs.gxt.ui.client.widget.grid.ColumnModel; +import com.extjs.gxt.ui.client.widget.grid.Grid; +import com.extjs.gxt.ui.client.widget.grid.GridCellRenderer; +import com.extjs.gxt.ui.client.widget.grid.filters.DateFilter; +import com.extjs.gxt.ui.client.widget.grid.filters.GridFilters; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.extjs.gxt.ui.client.widget.menu.Menu; +import com.extjs.gxt.ui.client.widget.menu.MenuItem; +import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem; +import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem; +import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; +import com.google.gwt.event.shared.EventBus; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.AbstractImagePrototype; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class OccurrenceGridJob extends ContentPanel{ + + + private static final String REFRESH_LIST = "Refresh List"; + private static final String RE_SUBMIT = "Re-submit"; + private static final String SAVE = "Save"; + private static final String CANCEL = "Cancel"; + private static final String INFO = "Info"; + // public static final String DATE_TIME_FORMAT = "yyyy.MM.dd 'at' HH:mm:ss"; + // private ListStore store = ListStoreModel.getInstance().getStore(); + private ListStore store; + private ToolBar toolBar = new ToolBar(); + private Grid grid; + private HashMap listWindowInfo = new HashMap(); + private EventBus eventBus; + + private Button buttonInfo; + private Button buttonCancel; + private Button buttonSave; + private Button buttonReSubmit; + private Button buttonRefreshList; + private Menu menu = new Menu(); + + public OccurrenceGridJob(EventBus eventBus) { + + this.eventBus = eventBus; + + ColumnConfig name = new ColumnConfig(JobOccurrencesModel.JOBNAME, JobOccurrencesModel.JOBNAME, 220); + ColumnConfig dataSources = new ColumnConfig(JobOccurrencesModel.DATASOURCESASSTRING, JobOccurrencesModel.DATASOURCESASSTRING, 140); + ColumnConfig progress = new ColumnConfig(JobOccurrencesModel.PROGRESS, JobOccurrencesModel.PROGRESS, 150); + + ColumnConfig creationDate = new ColumnConfig(JobOccurrencesModel.STARTTIME, JobOccurrencesModel.STARTTIME, 140); +// creationDate.setDateTimeFormat(DateTimeFormat.getFormat(DATE_TIME_FORMAT)); + + ColumnConfig endTime = new ColumnConfig(JobOccurrencesModel.ENDTIME, JobOccurrencesModel.ENDTIME, 140); +// endTime.setDateTimeFormat(DateTimeFormat.getFormat(DATE_TIME_FORMAT)); + + ColumnConfig elapsedTime = new ColumnConfig(JobOccurrencesModel.ELAPSEDTIME, JobOccurrencesModel.ELAPSEDTIME + " " + ConstantsSpeciesDiscovery.TIMEFORMAT_HH_MM_SS, 100); + elapsedTime.setHidden(true); + + ColumnConfig fileFormat = new ColumnConfig(JobOccurrencesModel.FILEFORMAT, JobOccurrencesModel.FILEFORMAT, 100); + + ColumnConfig csvType = new ColumnConfig(JobOccurrencesModel.CSVTYPE, JobOccurrencesModel.CSVTYPE, 100); + + ColumnConfig status = new ColumnConfig(JobOccurrencesModel.STATUS, JobOccurrencesModel.STATUS, 80); + + ColumnConfig itemsCount = new ColumnConfig(JobOccurrencesModel.ITEMSNUMBER, JobOccurrencesModel.ITEMSNUMBER, 95); + + final ColumnModel cm = new ColumnModel(Arrays.asList(name, dataSources, itemsCount, progress, creationDate, endTime, elapsedTime, fileFormat, csvType, status)); + + setBodyBorder(false); + setHeaderVisible(false); + setLayout(new FitLayout()); + + GridFilters filters = new GridFilters(); + filters.setLocal(true); + + DateFilter dateFilterStart = new DateFilter(JobOccurrencesModel.STARTTIME); + DateFilter dateFilterEnd = new DateFilter(JobOccurrencesModel.ENDTIME); + + filters.addFilter(dateFilterStart); + filters.addFilter(dateFilterEnd); + + store = new ListStore(); + + grid = new Grid(store, cm); + grid.setLoadMask(true); + + GridCellRenderer downloadStateRenderer = new GridCellRenderer() { + @Override + public String render(BaseModelData model, String property, ColumnData config, int rowIndex, int colIndex, ListStore store, Grid grid) { + String val = model.get(property).toString(); + String color="black"; + +// ONGOING, ONGOINGWITHFAILURES, FAILED, COMPLETED, COMPLETEDWITHFAILURES + + if(val!=null){ + if(val.compareTo(DownloadState.SAVING.toString())==0){ + color = "#7093DB"; + }else if(val.compareTo(DownloadState.FAILED.toString())==0){ + color = "#f00"; + } + } + else + val = ""; + + return "" + val + ""; + + } + }; + + GridCellRenderer jobSpeciesRenderer = new GridCellRenderer() { + + public Object render(final BaseModelData model, String property, ColumnData config, final int rowIndex, + final int colIndex, ListStore store, Grid grid) { + + grid.addListener(Events.ColumnResize, new Listener>() { + + public void handleEvent(GridEvent be) { + + for (int i = 0; i < be.getGrid().getStore().getCount(); i++) { + if (be.getGrid().getView().getWidget(i, be.getColIndex()) != null + && be.getGrid().getView().getWidget(i, be.getColIndex()) instanceof OccurrenceJobSpeciesProgressBar) { + ((OccurrenceJobSpeciesProgressBar) be.getGrid().getView().getWidget(i, be.getColIndex())).setWidth(be.getWidth() - 10); + } + } + } + }); + + return model.get(property); + } + }; + + progress.setRenderer(jobSpeciesRenderer); + status.setRenderer(downloadStateRenderer); + + +// grid.getView().setAutoFill(true); + + grid.getView().setEmptyText("Empty"); + + grid.getView().setShowDirtyCells(false); + grid.getView().setShowInvalidCells(false); + +// setAlphanumericStoreSorter(grid); + +// grid.setAutoExpandColumn(JobOccurrencesModel.JOBNAME); + grid.setBorders(false); +// grid.setStripeRows(true); + grid.setColumnLines(true); + grid.addPlugin(filters); + + grid.getSelectionModel().setSelectionMode(SelectionMode.SINGLE); + + grid.getSelectionModel().addSelectionChangedListener(new SelectionChangedListener() { + + @Override + public void selectionChanged(SelectionChangedEvent se) { +// System.out.println("selection grid change"); + + ModelData target = se.getSelectedItem(); + + if(target!=null) + enableButtonOnClick(true); + else + enableButtonOnClick(false); + + } + }); + + add(grid); + + createGridToolBar(); + createMenuItemsOnGrid(); + } + + public void addJobIntoGrid(JobOccurrencesModel jobModel, OccurrenceJobSpeciesProgressBar jobProgressBar) { + + BaseModelData baseModelData = new BaseModelData(); + + baseModelData.set(JobOccurrencesModel.JOBINDENTIFIER, jobModel.getJobIdentifier()); + baseModelData.set(JobOccurrencesModel.JOBNAME, jobModel.getJobName()); + baseModelData.set(JobOccurrencesModel.PROGRESS, jobProgressBar); + baseModelData.set(JobOccurrencesModel.STATUS, jobModel.getDownloadState().toString()); + + baseModelData.set(JobOccurrencesModel.STARTTIME, jobModel.getStartTime()); + baseModelData.set(JobOccurrencesModel.ENDTIME, jobModel.getEndTime()); + + baseModelData.set(JobOccurrencesModel.FILEFORMAT, jobModel.getFileFormat()); + baseModelData.set(JobOccurrencesModel.CSVTYPE, jobModel.getCsvType()); + + baseModelData.set(JobOccurrencesModel.ELAPSEDTIME, jobModel.getElapsedTime()); + + baseModelData.set(JobOccurrencesModel.COMPLETEDENTRY, jobModel.getNodeCompleted()); + + baseModelData.set(JobOccurrencesModel.ITEMSNUMBER, jobModel.getTotalOccurrences()); + + String dataSources = ""; + for (DataSource dataSource : jobModel.getDataSources()) { + dataSources+= " "+dataSource.getName() + ","; + } + + //Trim + dataSources = dataSources.trim(); + + //Remove last char , + dataSources = dataSources.substring(0, dataSources.lastIndexOf(",")); + + baseModelData.set(JobOccurrencesModel.DATASOURCESASSTRING, dataSources); + baseModelData.set(JobOccurrencesModel.SCIENTIFICNAME, jobModel.getScientificName()); + + baseModelData.set(JobOccurrencesModel.DESCRIPTION, jobModel.getDescription()); + + baseModelData.set(jobModel.getJobIdentifier(), jobModel); //store object JobOccurrencesModel + + store.add(baseModelData); + updateJobInfo(jobModel); + } + + private void updateJobInfo(JobOccurrencesModel jobModel){ + + OccurrenceWindowInfoJobsSpecies win=listWindowInfo.get(jobModel.getJobIdentifier()); + + if(win==null){ + win = new OccurrenceWindowInfoJobsSpecies(); + win.setWindowTitle("Job " + jobModel.getJobName() + " description:"); + } + + win.updateDescription(jobModel); + + listWindowInfo.put(jobModel.getJobIdentifier(), win); + } + + public void updateStatus(JobOccurrencesModel jobModel, OccurrenceJobSpeciesProgressBar jobProgressBar){ + + BaseModelData job = store.findModel(JobOccurrencesModel.JOBINDENTIFIER, jobModel.getJobIdentifier()); + + if(job!=null){ + + job.set(JobOccurrencesModel.PROGRESS, jobProgressBar); + job.set(JobOccurrencesModel.STARTTIME, jobModel.getStartTime()); + job.set(JobOccurrencesModel.STATUS, jobModel.getDownloadState().toString()); + job.set(JobOccurrencesModel.ENDTIME, jobModel.getEndTime()); + job.set(JobOccurrencesModel.ELAPSEDTIME, jobModel.getElapsedTime()); + + updateJobInfo(jobModel); + + store.update(job); + } + + } + + + public void removeSpeciesJobByIdentifier(String jobIdentifier) { + BaseModelData job = store.findModel(JobOccurrencesModel.JOBINDENTIFIER, jobIdentifier); + if(job!=null){ + store.remove(job); + } + } + + private void viewInfoJob() { + + BaseModelData baseModelData = grid.getSelectionModel().getSelectedItem(); + + if(baseModelData!=null){ + + OccurrenceWindowInfoJobsSpecies win = listWindowInfo.get(baseModelData.get(JobOccurrencesModel.JOBINDENTIFIER)); + win.show(); + } + } + + private void cancelJob() { + + final BaseModelData baseModelData = grid.getSelectionModel().getSelectedItem(); + + if(baseModelData!=null){ + + String name = baseModelData.get(JobOccurrencesModel.JOBNAME); + + MessageBoxConfirm mbc = new MessageBoxConfirm(ConstantsSpeciesDiscovery.CONFIRM_DELETE, ConstantsSpeciesDiscovery.MESSAGE_CONFIRM_DELETE_JOB + " "+ name+"?"); + mbc.getMessageBoxConfirm().addCallback(new Listener() { + + public void handleEvent(MessageBoxEvent be) { + + //IF CANCELLED + String clickedButton = be.getButtonClicked().getItemId(); + if(clickedButton.equals(Dialog.YES)){ + + final String jobIdentifier = baseModelData.get(JobOccurrencesModel.JOBINDENTIFIER); + + SpeciesDiscovery.taxonomySearchService.cancelOccurrenceJob(jobIdentifier, new AsyncCallback() { + + @Override + public void onSuccess(Boolean result) { + + if(result) + removeSpeciesJobByIdentifier(jobIdentifier); + + } + + @Override + public void onFailure(Throwable caught) { + Info.display("Error", "An error occurred during the cancel"); + Log.error("Error during the cancel", caught.getMessage()); + + } + }); + + } + } + }); + + } + + } + + private void saveJob() { + BaseModelData baseModelData = grid.getSelectionModel().getSelectedItem(); + + if(baseModelData!=null){ + + String load = baseModelData.get(JobOccurrencesModel.STATUS).toString(); + + if(load.compareTo(DownloadState.COMPLETED.toString())==0 || load.compareTo(DownloadState.SAVED.toString())==0 ){ + + String jobIdentifier = baseModelData.get(JobOccurrencesModel.JOBINDENTIFIER); + String scientificName = baseModelData.get(JobOccurrencesModel.SCIENTIFICNAME); + + JobOccurrencesModel jobModel = baseModelData.get(jobIdentifier); + + List dataSourceList = jobModel.getDataSources(); + + eventBus.fireEvent(new SaveJobEvent(jobIdentifier, scientificName, dataSourceList, SearchResultType.OCCURRENCE_POINT, jobModel)); + } + + else{ + String name = baseModelData.get(JobOccurrencesModel.JOBNAME); + MessageBox.alert(ConstantsSpeciesDiscovery.ALERT, "The job "+ name+ " " +ConstantsSpeciesDiscovery.IS_NOT_COMPLETED, null); + } + } + + } + + + private void resubmitJob() { + + BaseModelData baseModelData = grid.getSelectionModel().getSelectedItem(); + + if(baseModelData!=null){ + + String load = baseModelData.get(JobTaxonomyModel.STATUS).toString(); + + if(load.compareTo(DownloadState.FAILED.toString())==0 || load.compareTo(DownloadState.COMPLETED.toString())==0 || load.compareTo(DownloadState.SAVED.toString())==0 ){ + + String jobIdentifier = baseModelData.get(JobOccurrencesModel.JOBINDENTIFIER); + + JobOccurrencesModel jobModel = (JobOccurrencesModel) baseModelData.get(jobIdentifier); //get object JobOccurrencesModel + + eventBus.fireEvent(new ReSubmitJobEvent(SearchResultType.OCCURRENCE_POINT, jobModel, null)); + } + + else{ + String name = baseModelData.get(JobTaxonomyModel.JOBNAME); + MessageBox.alert(INFO, "The job "+ name+ " " + ConstantsSpeciesDiscovery.CAN_NO_BE_RE_SUBMITTED_UNTIL_IT_HAS_COMPLETED, null); + + + } + } + + } + + private void createGridToolBar(){ + + + buttonInfo = new Button(INFO); + buttonInfo.setScale(ButtonScale.MEDIUM); + buttonInfo.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getInfoIcon())); + buttonInfo.setStyleAttribute("margin-left", "5px"); + buttonInfo.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + viewInfoJob(); + } + }); + + buttonCancel = new Button(CANCEL); + buttonCancel.setScale(ButtonScale.MEDIUM); + buttonCancel.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getDelete())); + + buttonCancel.addListener(Events.OnClick, new Listener() { + + @Override + public void handleEvent(BaseEvent be) { + + cancelJob(); + } + + }); + + buttonSave = new Button(SAVE); + buttonSave.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getSaveProducts())); + buttonSave.setScale(ButtonScale.MEDIUM); + buttonSave.addListener(Events.OnClick, new Listener() { + + @Override + public void handleEvent(BaseEvent be) { + + saveJob(); + } + }); + + buttonReSubmit = new Button(RE_SUBMIT); + buttonReSubmit.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getReSubmit())); + buttonReSubmit.setScale(ButtonScale.MEDIUM); + buttonReSubmit.addListener(Events.OnClick, new Listener() { + + @Override + public void handleEvent(BaseEvent be) { + + resubmitJob(); + } + + }); + + + buttonRefreshList = new Button(REFRESH_LIST); + buttonRefreshList.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getRefresh())); + buttonRefreshList.setScale(ButtonScale.MEDIUM); + buttonRefreshList.addListener(Events.OnClick, new Listener() { + + @Override + public void handleEvent(BaseEvent be) { + +// resetStore(); + eventBus.fireEvent(new ReLoadListJobEvent(SearchResultType.OCCURRENCE_POINT)); + + } + }); + + + + toolBar.add(buttonInfo); + toolBar.add(new SeparatorToolItem()); + + toolBar.add(buttonSave); + toolBar.add(new SeparatorToolItem()); + + toolBar.add(buttonCancel); + toolBar.add(new SeparatorToolItem()); + + toolBar.add(buttonReSubmit); + toolBar.add(new SeparatorToolItem()); + + toolBar.add(new FillToolItem()); + toolBar.add(new SeparatorToolItem()); + toolBar.add(buttonRefreshList); + + setTopComponent(toolBar); + + enableButtonOnClick(false); + } + + public void enableToolBar(boolean bool){ + this.toolBar.setEnabled(bool); + } + + public void resetStore(){ + store.removeAll(); + } + + public void enableButtonOnClick(boolean bool){ + this.buttonCancel.setEnabled(bool); + this.buttonInfo.setEnabled(bool); + this.buttonSave.setEnabled(bool); + this.buttonReSubmit.setEnabled(bool); + } + + public void createMenuItemsOnGrid(){ + + MenuItem menuInfo = new MenuItem(); + menuInfo.setText(INFO); + menuInfo.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getInfoIcon())); + + menuInfo.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(MenuEvent ce) { + viewInfoJob(); + } + + }); + + menu.add(menuInfo); + + MenuItem menuSave= new MenuItem(); + menuSave.setText(SAVE); + menuSave.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getSaveProducts())); + + menuSave.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(MenuEvent ce) { + saveJob(); + } + + }); + + menu.add(menuSave); + + + MenuItem menuCancel= new MenuItem(); + menuCancel.setText(CANCEL); + menuCancel.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getDelete())); + + menuCancel.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(MenuEvent ce) { + + cancelJob(); + } + + }); + + menu.add(menuCancel); + + MenuItem menuResubmit= new MenuItem(); + menuResubmit.setText(RE_SUBMIT); + menuResubmit.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getReSubmit())); + + menuResubmit.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(MenuEvent ce) { + resubmitJob(); + } + + }); + + menu.add(menuResubmit); + + grid.setContextMenu(menu); + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/occurrence/OccurrenceJobInfoFields.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/occurrence/OccurrenceJobInfoFields.java new file mode 100644 index 0000000..5972a6b --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/occurrence/OccurrenceJobInfoFields.java @@ -0,0 +1,32 @@ +package org.gcube.portlets.user.speciesdiscovery.client.job.occurrence; + +import org.gcube.portlets.user.speciesdiscovery.client.util.GridField; + +public enum OccurrenceJobInfoFields implements GridField{ + NAME("name","Name"), + LOADING("loading","Loading"); + + private String id; + private String name; + + private OccurrenceJobInfoFields(String id, String name) { + this.id=id; + this.name=name; + } + + @Override + public String getId() { + return this.id; + } + + @Override + public String getName() { + return this.name; + } + + @Override + public boolean isSortable() { + return false; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/occurrence/OccurrenceJobSpeciesPanel.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/occurrence/OccurrenceJobSpeciesPanel.java new file mode 100644 index 0000000..576a80f --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/occurrence/OccurrenceJobSpeciesPanel.java @@ -0,0 +1,352 @@ +package org.gcube.portlets.user.speciesdiscovery.client.job.occurrence; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.resources.Resources; +import org.gcube.portlets.user.speciesdiscovery.shared.JobOccurrencesModel; + +import com.extjs.gxt.ui.client.Style.Scroll; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.Html; +import com.extjs.gxt.ui.client.widget.LayoutContainer; +import com.extjs.gxt.ui.client.widget.Window; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.google.gwt.event.shared.EventBus; +import com.google.gwt.user.client.ui.AbstractImagePrototype; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class OccurrenceJobSpeciesPanel extends ContentPanel { + + + /** + * This is a singleton + */ + private static OccurrenceJobSpeciesPanel instance; + private static ContentPanel cp; + private ContentPanel vp; + private static HashMap hashProgressBars; + private static HashMap hashLoadCompletedNotify; + private static HashMap hashTableContentPanels; + private static String LASTOPERATION = "Last Operation: "; + private Html lastOperation = new Html(LASTOPERATION); + private LayoutContainer lc; + private static String WINDOWTITLE = "Species Occurrence Jobs"; + private static final String FAILED = "failed"; + private static final String COMPLETED = "completed"; + private static final String LOADING = "loading"; + private static final String PENDING = "pending"; + private static final String OPERATIONONE = "none"; + private static final String SAVING = "saving"; + + private OccurrenceGridJob gridJob; + private EventBus eventBus; + + protected Window speciesJobWindow = new Window(); + + public static synchronized OccurrenceJobSpeciesPanel getInstance(EventBus eventBus) { + if (instance == null) + instance = new OccurrenceJobSpeciesPanel(eventBus); + return instance; + } + + private OccurrenceJobSpeciesPanel(EventBus eventBus) { + this.eventBus = eventBus; + this.gridJob = new OccurrenceGridJob(eventBus); + + this.setHeaderVisible(false); + this.setLayout(new FitLayout()); + createSpeciesJobWindow(); +// createToolBar(); + } + + private void createSpeciesJobWindow(){ + + lc = new LayoutContainer(); + lc.setStyleAttribute("margin", "5px"); + cp = new ContentPanel(); + cp.setBodyBorder(true); + cp.setStyleAttribute("padding", "5px"); + cp.setLayout(new FitLayout()); + + cp.add(gridJob); + + cp.setHeight(550); + cp.setHeaderVisible(false); + hashProgressBars = new HashMap(); + hashTableContentPanels = new HashMap(); + hashLoadCompletedNotify = new HashMap(); + cp.setScrollMode(Scroll.AUTO); + + lastOperation.setHtml(LASTOPERATION + OPERATIONONE); + +// cp.add(vp); + lc.add(lastOperation); + lc.add(cp); +// + speciesJobWindow.setHeading(WINDOWTITLE); + speciesJobWindow.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getBluePlace16px())); + speciesJobWindow.setSize(1020, 600); + speciesJobWindow.setResizable(true); + speciesJobWindow.setScrollMode(Scroll.AUTOX); + speciesJobWindow.add(lc); + } + +// private void createToolBar(){ +// ToolBar toolbar = new ToolBar(); +// +// Button btnJobs = new Button("Species Jobs"); +// btnJobs.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getJob())); +// +// btnJobs.addSelectionListener(new SelectionListener() { +// +// @Override +// public void componentSelected(ButtonEvent ce) { +// +// speciesJobWindow.show(); +// } +// +// }); +// toolbar.add(btnJobs); +// this.setTopComponent(toolbar); +// } + + /** + * + * @param jobsModel + * @return true if almost one progress bar is ongoing + */ + public boolean addListJob(List jobsModel){ + + boolean isLoading = false; + + for(final JobOccurrencesModel jobModel : jobsModel){ + + isLoading = addJob(jobModel); + } + + return isLoading; + + } + + + public boolean addJob(final JobOccurrencesModel jobModel){ + + boolean isLoading = false; + +// Log.trace("add job :" +jobModel); + + OccurrenceJobSpeciesProgressBar jobsBar = hashProgressBars.get(jobModel.getJobIdentifier()); + + if(jobsBar!=null){ //is update + + OccurrenceWindowInfoJobsSpecies win = (OccurrenceWindowInfoJobsSpecies) jobsBar.getData("win"); + + if(win!=null){ + win.updateDescription(jobModel); + win.layout(); + jobsBar.setData("win", win); + } + + //IF job is COMPLETED OR FAILED OR COMPLETED WITH ERROR, IS NOT UPDATE + if(jobsBar.isCompleted()){ + //FOR DEBUG +// Log.trace("jobsBar " +jobModel.getName() + " completed, return" ); + return true; + } + + + updateProgressBarView(jobsBar, jobModel); + + gridJob.updateStatus(jobModel, jobsBar); + + } + else{ //create new grid item that contains new progress bar + + + OccurrenceJobSpeciesProgressBar jobProgressBar = new OccurrenceJobSpeciesProgressBar(jobModel.getJobIdentifier(), jobModel.getDownloadState().toString()); + + gridJob.addJobIntoGrid(jobModel, jobProgressBar); + + updateProgressBarView(jobProgressBar, jobModel); + +// hashTableContentPanels.put(jobModel.getIdentifier(), panelTable); //add contentPanel into hashTableContentPanels + hashProgressBars.put(jobModel.getJobIdentifier(), jobProgressBar); //add progressBar into hashProgressBars + hashLoadCompletedNotify.put(jobModel.getJobIdentifier(), false); //add false (at load completed event) into hashLoadCompletedNotify + } + + gridJob.layout(); + cp.layout(); + + return isLoading; + } + + + private boolean updateProgressBarView(OccurrenceJobSpeciesProgressBar jobsBar, JobOccurrencesModel jobModel){ + + switch (jobModel.getDownloadState()) { + + case PENDING:{ + jobsBar.setProgressText(PENDING); + break; + } + + case SAVING:{ + lastOperation.setHtml(LASTOPERATION + jobModel.getJobName() + " saving"); + jobsBar.getElement().getStyle().setBorderColor("#7093DB"); +// jobsBar.progressStart(); + jobsBar.setProgressText(SAVING); + break; + } + + case COMPLETED:{ + + lastOperation.setHtml(LASTOPERATION + jobModel.getJobName() + " completed"); + + jobsBar.getElement().getStyle().setBorderColor("#000000"); +// jobsBar.progressStop(); + jobsBar.updateProgressWithoutPercentage(100); + jobsBar.setCompleted(true); + jobsBar.updateText(COMPLETED); + + break; + } + + case ONGOING:{ + + if(jobModel.getPercentage()<100) + jobsBar.setProgressText(LOADING); + else + jobsBar.setProgressText(SAVING); + + jobsBar.updateProgressWithPercentage(jobModel.getPercentage()); + +// jobsBar.progressStart(); + + return true; + } + + case SAVED:{ + + lastOperation.setHtml(LASTOPERATION + jobModel.getJobName() + " saved"); + + jobsBar.getElement().getStyle().setBorderColor("#000000"); +// jobsBar.progressStop(); + jobsBar.updateProgressWithoutPercentage(100); +// jobsBar.updateProgressWithPercentage(jobModel.getPercentage(), jobModel.getDownloadState().toString()); + jobsBar.setCompleted(true); + jobsBar.updateText(COMPLETED); + + break; + } + + case ONGOINGWITHFAILURES: { + + jobsBar.getElement().getStyle().setBorderColor("#f00"); + jobsBar.updateText("loading " + jobModel.getJobName() + " with failures"); + + break; + } + + case FAILED:{ + + jobsBar.getElement().getStyle().setBorderColor("#f00"); +// jobsBar.progressStop(); + jobsBar.setProgressText(FAILED); + jobsBar.updateProgressWithPercentage(jobModel.getPercentage()); + jobsBar.setCompleted(true); + jobsBar.updateText(FAILED); + + break; + } + + case COMPLETEDWITHFAILURES:{ + + jobsBar.getElement().getStyle().setBorderColor("#f00"); + jobsBar.updateText("loading " + jobModel.getJobName() + " with failures"); + jobsBar.updateProgressWithoutPercentage(100); + jobsBar.setCompleted(true); + + break; + } + } + + return false; + + } + + public void removeSpeciesJob(String hashHPKey) { + + + ContentPanel cp = hashTableContentPanels.get(hashHPKey); + + vp.remove(cp); + lastOperation.setHtml(LASTOPERATION + cp.getId() + " deleted"); + hashProgressBars.remove(hashHPKey); //remove progress bar from hash + hashTableContentPanels.remove(hashHPKey); //remove hp from hash + hashLoadCompletedNotify.remove(hashHPKey); //remove notify event + + vp.layout(); + + } + + @SuppressWarnings("unused") + private void deleteProgressCompleted(List progressIdFound){ + + List progressIdNotFound = new ArrayList(); + + for(String key : hashTableContentPanels.keySet()){ + +// System.out.println("Key " + key ); + + if(!progressIdFound.contains(key)){ //if key isn't not found - progress is completed so is removed + +// System.out.println("Key is not present " + key ); + + OccurrenceJobSpeciesProgressBar bulkPB = hashProgressBars.get(key); + lastOperation.setHtml(LASTOPERATION + bulkPB.getProgressText() + " uploading completed"); + +// bulkPB.updateProgress(100); + progressIdNotFound.add(key); + } + } + + for(String key : progressIdNotFound){ + + OccurrenceJobSpeciesProgressBar bulkPB = hashProgressBars.get(key); + lastOperation.setHtml(LASTOPERATION + bulkPB.getProgressText() + " uploading completed"); + +// vp.remove(hashHorizontalPanels.get(key)); //remove hp from view + hashProgressBars.remove(key); //remove progress bar from hash + hashTableContentPanels.remove(key); //remove hp from hash + } + + vp.layout(); + cp.layout(); + } + + public Window getSpeciesJobWindow() { + return speciesJobWindow; + } + + public void resetStructures(){ + + this.gridJob.resetStore(); + + hashProgressBars.clear(); + lastOperation.setHtml(LASTOPERATION); + hashTableContentPanels.clear(); + hashLoadCompletedNotify.clear(); + } + + public OccurrenceGridJob getGridJob() { + return gridJob; + } + + +} + diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/occurrence/OccurrenceJobSpeciesProgressBar.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/occurrence/OccurrenceJobSpeciesProgressBar.java new file mode 100644 index 0000000..3df8d51 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/occurrence/OccurrenceJobSpeciesProgressBar.java @@ -0,0 +1,74 @@ +package org.gcube.portlets.user.speciesdiscovery.client.job.occurrence; + +import com.extjs.gxt.ui.client.widget.ProgressBar; + +public class OccurrenceJobSpeciesProgressBar extends ProgressBar { + + private String progressText; + private float progress; +// private final Timer timer; + private boolean isCompleted = false; + + public OccurrenceJobSpeciesProgressBar(String idJob, final String text) { + + this.progressText = text; + setSize(140, 20); + + updateProgress(progress, text); + +// timer = new Timer() { +// float i; +// +// @Override +// public void run() { +// updateProgress(i / 100, progressText); +// i += 5; +// if (i > 105) { +// if(!isCompleted) +// i = 0; +// } +// } +// }; + } +/* + public void progressStart(){ + timer.scheduleRepeating(500); + } + + public void progressStop(){ + timer.cancel(); + } + + */ + + public void updateProgressWithoutPercentage(float counter) { + progress = counter / 100; + updateProgress(progress, progressText); + } + + + public void updateProgressWithPercentage(float counter) { + progress = counter / 100; + updateProgress(progress, counter +"% " + progressText); + } + + public String getProgressText() { + return progressText; + } + + public void setProgressText(String progressText) { + this.progressText = progressText; + } + + public float getProgress() { + return progress; + } + + public boolean isCompleted() { + return isCompleted; + } + + public void setCompleted(boolean isCompleted) { + this.isCompleted = isCompleted; + } +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/occurrence/OccurrenceJobTable.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/occurrence/OccurrenceJobTable.java new file mode 100644 index 0000000..e9ac4ca --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/occurrence/OccurrenceJobTable.java @@ -0,0 +1,108 @@ +package org.gcube.portlets.user.speciesdiscovery.client.job.occurrence; + +import com.extjs.gxt.ui.client.Style.HorizontalAlignment; +import com.extjs.gxt.ui.client.Style.Scroll; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.Label; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.layout.TableData; +import com.extjs.gxt.ui.client.widget.layout.TableLayout; +import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem; +import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; + +/** + * Entry point classes define onModuleLoad(). + */ + +public class OccurrenceJobTable { + + public static ContentPanel getJobTableWithoutHeading(String name, String startTime, String endTime, OccurrenceJobSpeciesProgressBar status, String elapsedTime, Button btnInfo, Button btnCancel, Button btnSave){ + + ContentPanel cpTableLayout = new ContentPanel(); + cpTableLayout.setHeaderVisible(false); + cpTableLayout.setStyleAttribute("margin-top", "10px"); + cpTableLayout.setAutoHeight(true); + cpTableLayout.setWidth(964); + cpTableLayout.setScrollMode(Scroll.AUTO); + + TableLayout tablelayout = new TableLayout(5); + tablelayout.setCellHorizontalAlign(HorizontalAlignment.CENTER); + cpTableLayout.setLayout(tablelayout); + + ContentPanel panel; + + //NAME + TableData layoutData = new TableData(); + layoutData.setWidth("300px"); + panel = new ContentPanel(); + panel.setScrollMode(Scroll.AUTO); + panel.setHeading("Name"); + panel.setHeight(55); + panel.add(new Label(name)); + panel.setWidth(300); + cpTableLayout.add(panel, layoutData); + + //Status + layoutData = new TableData(); + layoutData.setWidth("302px"); + panel = new ContentPanel(); + panel.setHeight(55); + panel.setHeading("Status"); + panel.setScrollMode(Scroll.AUTO); + panel.add(status); + panel.setWidth(302); + cpTableLayout.add(panel, layoutData); + + //Start Time + layoutData = new TableData(); + layoutData.setWidth("120px"); + panel = new ContentPanel(); + panel.setScrollMode(Scroll.AUTO); + panel.setHeight(55); + panel.setHeading("Start Time"); + panel.addText(startTime); + panel.setWidth(120); + cpTableLayout.add(panel, layoutData); + + //End Time + layoutData = new TableData(); + layoutData.setWidth("120px"); + panel = new ContentPanel(); + panel.setHeading("End Time"); + panel.setScrollMode(Scroll.AUTO); + panel.setHeight(55); + if(endTime!=null) + panel.addText(endTime); + panel.setWidth(120); + cpTableLayout.add(panel, layoutData); + + //Elapsed Time + layoutData = new TableData(); + layoutData.setWidth("120px"); + panel = new ContentPanel(); + panel.setHeading("Elapsed Time"); + panel.setScrollMode(Scroll.AUTO); + panel.setHeight(55); + if(elapsedTime!=null) + panel.addText(elapsedTime); + panel.setWidth(120); + cpTableLayout.add(panel, layoutData); + + + ToolBar toolBar = new ToolBar(); + + toolBar.add(btnInfo); + toolBar.add(new SeparatorToolItem()); + + toolBar.add(btnSave); + toolBar.add(new SeparatorToolItem()); + + toolBar.add(btnCancel); + toolBar.add(new SeparatorToolItem()); + + cpTableLayout.setBottomComponent(toolBar); + + return cpTableLayout; + + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/occurrence/OccurrenceJobsInfoContainer.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/occurrence/OccurrenceJobsInfoContainer.java new file mode 100644 index 0000000..d19e2fd --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/occurrence/OccurrenceJobsInfoContainer.java @@ -0,0 +1,51 @@ +package org.gcube.portlets.user.speciesdiscovery.client.job.occurrence; + +import com.extjs.gxt.ui.client.Style.HorizontalAlignment; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.LayoutContainer; +import com.extjs.gxt.ui.client.widget.form.TextArea; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; + +public class OccurrenceJobsInfoContainer extends LayoutContainer { + + private ContentPanel cp; + private TextArea textArea = new TextArea(); + private String description; + + + public OccurrenceJobsInfoContainer(String description) { + textArea.setReadOnly(true); + initContentPanel(); + updateDescription(description); + } + + private void initContentPanel() { + setLayout(new FitLayout()); + getAriaSupport().setPresentation(true); + cp = new ContentPanel(); + cp.setHeaderVisible(false); + cp.setBodyBorder(true); + cp.setLayout(new FitLayout()); + cp.setButtonAlign(HorizontalAlignment.CENTER); + cp.setLayout(new FitLayout()); +// cp.getHeader().setIconAltText("Grid Icon"); + cp.setSize(400, 250); + + cp.add(textArea); + + add(cp); + } + + public void updateDescription(String description){ + this.description = description; + textArea.reset(); + textArea.setValue(this.description); + cp.layout(); + } + + public void setHeaderTitle(String title) { + cp.setHeading(title); + cp.layout(); + } + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/occurrence/OccurrenceWindowInfoJobsSpecies.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/occurrence/OccurrenceWindowInfoJobsSpecies.java new file mode 100644 index 0000000..56cd238 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/occurrence/OccurrenceWindowInfoJobsSpecies.java @@ -0,0 +1,60 @@ +package org.gcube.portlets.user.speciesdiscovery.client.job.occurrence; + + +import org.gcube.portlets.user.speciesdiscovery.shared.DownloadState; +import org.gcube.portlets.user.speciesdiscovery.shared.JobOccurrencesModel; + +import com.extjs.gxt.ui.client.widget.Window; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; + +public class OccurrenceWindowInfoJobsSpecies extends Window{ + + private OccurrenceJobsInfoContainer jobInfo = new OccurrenceJobsInfoContainer(""); + + public OccurrenceWindowInfoJobsSpecies(OccurrenceJobsInfoContainer jobInfoContainer) { + setModal(true); + setSize(450, 300); + this.jobInfo = jobInfoContainer; + add(jobInfo); + } + + public OccurrenceWindowInfoJobsSpecies() { + setModal(true); + setSize(450, 300); + setLayout(new FitLayout()); + add(jobInfo); + } + + + public void setWindowTitle(String title) { + this.setHeading(title); + + } + + public void updateDescription(JobOccurrencesModel jobModel) { + + String description = "\nName: \n" + jobModel.getJobName() + "\n"; + +// description += "Description: \n" + Util.cleanValue(jobModel.getDescription()); + description += "\n\nData Sources: \n"; + + for (String dataSource : jobModel.getDataSourcesNameAsString()) { + description += dataSource + ", "; + } + //remove last comma char + description = description.substring(0, description.lastIndexOf(",")); + + description += "\n\nStart Time: \n" + jobModel.getStartTime(); + description += "\n\nEnd Time: \n" + jobModel.getEndTime(); + description += "\n\nItems collected: \n" + jobModel.getNodeCompleted() + " of " + jobModel.getTotalOccurrences(); + + if(jobModel.getDownloadState().equals(DownloadState.COMPLETED) && jobModel.getNodeCompleted() store = ListStoreModel.getInstance().getStore(); + private ListStore store; + private ToolBar toolBar = new ToolBar(); + private Grid grid; + private HashMap listWindowInfo = new HashMap(); + private EventBus eventBus; + + private Button buttonInfo; + private Button buttonCancel; + private Button buttonSave; + private Button buttonReSubmit; + private Button buttonRefreshList; + + private Menu menu = new Menu(); + + public TaxonomyGridJob(EventBus eventBus) { + + this.eventBus = eventBus; + + ColumnConfig name = new ColumnConfig(JobTaxonomyModel.JOBNAME, JobTaxonomyModel.JOBNAME, 220); + ColumnConfig dataSources = new ColumnConfig(JobTaxonomyModel.DATASOURCE, JobTaxonomyModel.DATASOURCE, 90); + ColumnConfig progress = new ColumnConfig(JobTaxonomyModel.PROGRESS, JobTaxonomyModel.PROGRESS, 250); + ColumnConfig creationDate = new ColumnConfig(JobTaxonomyModel.STARTTIME, JobTaxonomyModel.STARTTIME, 140); +// creationDate.setDateTimeFormat(DateTimeFormat.getFormat(DATE_TIME_FORMAT)); + + ColumnConfig endTime = new ColumnConfig(JobTaxonomyModel.ENDTIME, JobTaxonomyModel.ENDTIME, 140); +// endTime.setDateTimeFormat(DateTimeFormat.getFormat(DATE_TIME_FORMAT)); + + ColumnConfig elapsedTime = new ColumnConfig(JobTaxonomyModel.ELAPSEDTIME, JobTaxonomyModel.ELAPSEDTIME + " " + ConstantsSpeciesDiscovery.TIMEFORMAT_HH_MM_SS, 140); + ColumnConfig status = new ColumnConfig(JobTaxonomyModel.STATUS, JobTaxonomyModel.STATUS, 80); + + final ColumnModel cm = new ColumnModel(Arrays.asList(name, dataSources, progress, creationDate, endTime, elapsedTime, status)); + + setBodyBorder(false); + setHeaderVisible(false); + setLayout(new FitLayout()); + + GridFilters filters = new GridFilters(); + filters.setLocal(true); + + DateFilter dateFilterStart = new DateFilter(JobTaxonomyModel.STARTTIME); + DateFilter dateFilterEnd = new DateFilter(JobTaxonomyModel.ENDTIME); + + + + filters.addFilter(dateFilterStart); + filters.addFilter(dateFilterEnd); + + store = new ListStore(); + + grid = new Grid(store, cm); + grid.setLoadMask(true); + + GridCellRenderer downloadStateRenderer = new GridCellRenderer() { + @Override + public String render(BaseModelData model, String property, ColumnData config, int rowIndex, int colIndex, ListStore store, Grid grid) { + String val = model.get(property).toString(); + String color="black"; + +// ONGOING, ONGOINGWITHFAILURES, FAILED, COMPLETED, COMPLETEDWITHFAILURES + + if(val!=null){ + +// if(val.compareTo(DownloadState.COMPLETED.toString())==0){ +// color ="#0000EE"; +// }else + if(val.compareTo(DownloadState.SAVING.toString())==0){ + color = "#7093DB"; + }else if(val.compareTo(DownloadState.FAILED.toString())==0){ + color = "#f00"; + } + } + else + val = ""; + + return "" + val + ""; + + } + }; + + GridCellRenderer jobSpeciesRenderer = new GridCellRenderer() { + + public Object render(final BaseModelData model, String property, ColumnData config, final int rowIndex, + final int colIndex, ListStore store, Grid grid) { + + grid.addListener(Events.ColumnResize, new Listener>() { + + public void handleEvent(GridEvent be) { + + for (int i = 0; i < be.getGrid().getStore().getCount(); i++) { + if (be.getGrid().getView().getWidget(i, be.getColIndex()) != null + && be.getGrid().getView().getWidget(i, be.getColIndex()) instanceof TaxonomyJobSpeciesProgressBar) { + ((TaxonomyJobSpeciesProgressBar) be.getGrid().getView().getWidget(i, be.getColIndex())).setWidth(be.getWidth() - 10); + } + } + } + }); + + return model.get(property); + } + }; + + progress.setRenderer(jobSpeciesRenderer); + status.setRenderer(downloadStateRenderer); + + +// grid.getView().setAutoFill(true); + + grid.getView().setEmptyText("Empty"); + + grid.getView().setShowDirtyCells(false); + grid.getView().setShowInvalidCells(false); + +// setAlphanumericStoreSorter(grid); + +// grid.setAutoExpandColumn(JobTaxonomyModel.JOBNAME); + grid.setBorders(false); +// grid.setStripeRows(true); + grid.setColumnLines(true); + grid.addPlugin(filters); + + grid.getSelectionModel().setSelectionMode(SelectionMode.SINGLE); + + grid.getSelectionModel().addSelectionChangedListener(new SelectionChangedListener() { + + @Override + public void selectionChanged(SelectionChangedEvent se) { +// System.out.println("selection grid change"); + + ModelData target = se.getSelectedItem(); + + if(target!=null) + enableButtonOnClick(true); + else + enableButtonOnClick(false); + + } + }); + + add(grid); + + createGridToolBar(); + createMenuItemsOnGrid(); + } + + public void addJobIntoGrid(JobTaxonomyModel jobModel, TaxonomyJobSpeciesProgressBar jobProgressBar) { + + BaseModelData baseModelData = new BaseModelData(); + + baseModelData.set(JobTaxonomyModel.JOBINDENTIFIER, jobModel.getIdentifier()); + baseModelData.set(JobTaxonomyModel.JOBNAME, jobModel.getName()); + baseModelData.set(JobTaxonomyModel.PROGRESS, jobProgressBar); + baseModelData.set(JobTaxonomyModel.STATUS, jobModel.getDownloadState().toString()); + + baseModelData.set(JobTaxonomyModel.STARTTIME, jobModel.getStartTime()); + baseModelData.set(JobTaxonomyModel.ENDTIME, jobModel.getEndTime()); + + baseModelData.set(JobTaxonomyModel.ELAPSEDTIME, jobModel.getElapsedTime()); + + baseModelData.set(JobTaxonomyModel.DATASOURCE, jobModel.getDataSource()); + baseModelData.set(JobTaxonomyModel.SCIENTIFICNAME, jobModel.getScientificName()); + baseModelData.set(JobTaxonomyModel.RANK, jobModel.getRank()); + + baseModelData.set(jobModel.getIdentifier(), jobModel); + + store.add(baseModelData); + + updateJobInfo(jobModel); + + } + + + /* + private void updateStringToDate(BaseModelData baseModel, String property, String dateValue){ + + Date date = null; + try { + if(dateValue!=null && !dateValue.isEmpty()) + date = DateTimeFormat.getFormat(DATE_TIME_FORMAT).parse(dateValue); + + } catch (Exception e) { + Log.trace("error in update date "+dateValue); + Log.error(e.getMessage()); + } + + baseModel.set(property, date); + } + */ + + private void updateJobInfo(JobTaxonomyModel jobModel){ + + TaxonomyWindowInfoJobsSpecies win=listWindowInfo.get(jobModel.getIdentifier()); + + if(win==null) + win = new TaxonomyWindowInfoJobsSpecies(); + + win.setWindowTitle("Job " + jobModel.getName() + " Status"); + win.updateListStore(jobModel); + + listWindowInfo.put(jobModel.getIdentifier(), win); + } + + public void updateStatus(JobTaxonomyModel jobModel, TaxonomyJobSpeciesProgressBar jobProgressBar){ + + BaseModelData job = store.findModel(JobTaxonomyModel.JOBINDENTIFIER, jobModel.getIdentifier()); + + if(job!=null){ + + job.set(JobTaxonomyModel.PROGRESS, jobProgressBar); + +// updateStringToDate(job, JobSpeciesModel.STARTTIME, jobModel.getStartTime()); +// updateStringToDate(job, JobSpeciesModel.ENDTIME, jobModel.getEndTime()); + + job.set(JobTaxonomyModel.STARTTIME, jobModel.getStartTime()); + job.set(JobTaxonomyModel.STATUS, jobModel.getDownloadState().toString()); + job.set(JobTaxonomyModel.ENDTIME, jobModel.getEndTime()); + job.set(JobTaxonomyModel.ELAPSEDTIME, jobModel.getElapsedTime()); + + job.set(jobModel.getIdentifier(), jobModel); //Store jobModel + + updateJobInfo(jobModel); + + store.update(job); + +// this.layout(); + } + + } + + + public void removeSpeciesJobByIdentifier(String jobIdentifier) { + BaseModelData job = store.findModel(JobTaxonomyModel.JOBINDENTIFIER, jobIdentifier); + if(job!=null){ + store.remove(job); +// this.layout(); + } + } + + private void viewInfoJob() { + + BaseModelData baseModelData = grid.getSelectionModel().getSelectedItem(); + + if(baseModelData!=null){ + + TaxonomyWindowInfoJobsSpecies win = listWindowInfo.get(baseModelData.get(JobTaxonomyModel.JOBINDENTIFIER)); + win.show(); + } + + } + + private void cancelJob() { + + final BaseModelData baseModelData = grid.getSelectionModel().getSelectedItem(); + + if(baseModelData!=null){ + + String name = baseModelData.get(JobTaxonomyModel.JOBNAME); + + MessageBoxConfirm mbc = new MessageBoxConfirm(ConstantsSpeciesDiscovery.CONFIRM_DELETE, ConstantsSpeciesDiscovery.MESSAGE_CONFIRM_DELETE_JOB + " "+ name+"?"); + mbc.getMessageBoxConfirm().addCallback(new Listener() { + + public void handleEvent(MessageBoxEvent be) { + + //IF CANCELLED + String clickedButton = be.getButtonClicked().getItemId(); + if(clickedButton.equals(Dialog.YES)){ + + final String jobIdentifier = baseModelData.get(JobTaxonomyModel.JOBINDENTIFIER); + + SpeciesDiscovery.taxonomySearchService.cancelTaxonomyJob(jobIdentifier, new AsyncCallback() { + + @Override + public void onSuccess(Boolean result) { + + if(result) + removeSpeciesJobByIdentifier(jobIdentifier); + + } + + @Override + public void onFailure(Throwable caught) { + Info.display("Error", "An error occurred during the cancel"); + Log.error("Error during the cancel", caught.getMessage()); + + } + }); + + } + } + }); + + } + + } + + private void saveJob() { + + BaseModelData baseModelData = grid.getSelectionModel().getSelectedItem(); + + if(baseModelData!=null){ + + String load = baseModelData.get(JobTaxonomyModel.STATUS).toString(); + + if(load.compareTo(DownloadState.COMPLETED.toString())==0 || load.compareTo(DownloadState.SAVED.toString())==0 ){ + + String jobIdentifier = baseModelData.get(JobTaxonomyModel.JOBINDENTIFIER); + String scientificName = baseModelData.get(JobTaxonomyModel.SCIENTIFICNAME); + String dataSource = baseModelData.get(JobTaxonomyModel.DATASOURCE); + String rank = baseModelData.get(JobTaxonomyModel.RANK); + + JobTaxonomyModel jobModel = baseModelData.get(jobIdentifier); + + List dataSourceList = new ArrayList(); + + dataSourceList.add(new DataSource(dataSource,dataSource)); + + eventBus.fireEvent(new SaveJobEvent(jobIdentifier, scientificName, dataSourceList, rank, SearchResultType.TAXONOMY_ITEM, jobModel)); + } + + else{ + String name = baseModelData.get(JobTaxonomyModel.JOBNAME); + MessageBox.alert(ConstantsSpeciesDiscovery.ALERT, "The job "+ name+ " " +ConstantsSpeciesDiscovery.IS_NOT_COMPLETED, null); + } + } + + } + + private void resubmitJob() { + + BaseModelData baseModelData = grid.getSelectionModel().getSelectedItem(); + + if(baseModelData!=null){ + + String load = baseModelData.get(JobTaxonomyModel.STATUS).toString(); + + if(load.compareTo(DownloadState.FAILED.toString())==0 || load.compareTo(DownloadState.COMPLETED.toString())==0 || load.compareTo(DownloadState.SAVED.toString())==0){ + + String jobIdentifier = baseModelData.get(JobTaxonomyModel.JOBINDENTIFIER); + + JobTaxonomyModel jobModel = (JobTaxonomyModel) baseModelData.get(jobIdentifier); //get object JobOccurrencesModel + + eventBus.fireEvent(new ReSubmitJobEvent(SearchResultType.TAXONOMY_ITEM, null, jobModel)); + } + + else{ + String name = baseModelData.get(JobTaxonomyModel.JOBNAME); + MessageBox.alert(INFO, "The job "+ name+" "+ConstantsSpeciesDiscovery.CAN_NO_BE_RE_SUBMITTED_UNTIL_IT_HAS_COMPLETED, null); + } + } + + } + + private void createGridToolBar(){ + buttonInfo = new Button(INFO); + buttonInfo.setScale(ButtonScale.MEDIUM); +// buttonInfo.setIconAlign(IconAlign.LEFT); +// buttonInfo.setArrowAlign(ButtonArrowAlign.RIGHT); + buttonInfo.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getInfoIcon())); + buttonInfo.setStyleAttribute("margin-left", "5px"); + buttonInfo.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + viewInfoJob(); + } + }); + + buttonCancel = new Button(CANCEL); + buttonCancel.setScale(ButtonScale.MEDIUM); +// buttonCancel.setIconAlign(IconAlign.TOP); +// buttonCancel.setArrowAlign(ButtonArrowAlign.BOTTOM); + buttonCancel.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getDelete())); + + buttonCancel.addListener(Events.OnClick, new Listener() { + + @Override + public void handleEvent(BaseEvent be) { + cancelJob(); + } + }); + + buttonSave = new Button(SAVE); + buttonSave.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getSaveProducts())); + buttonSave.setScale(ButtonScale.MEDIUM); +// buttonSave.setIconAlign(IconAlign.TOP); +// buttonSave.setArrowAlign(ButtonArrowAlign.BOTTOM); + + buttonSave.addListener(Events.OnClick, new Listener() { + + @Override + public void handleEvent(BaseEvent be) { + saveJob(); + } + }); + + buttonReSubmit = new Button(RE_SUBMIT); + buttonReSubmit.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getReSubmit())); + buttonReSubmit.setScale(ButtonScale.MEDIUM); + buttonReSubmit.addListener(Events.OnClick, new Listener() { + + @Override + public void handleEvent(BaseEvent be) { + resubmitJob(); + } + }); + + buttonRefreshList = new Button(REFRESH_LIST); + buttonRefreshList.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getRefresh())); + buttonRefreshList.setScale(ButtonScale.MEDIUM); + buttonRefreshList.addListener(Events.OnClick, new Listener() { + + @Override + public void handleEvent(BaseEvent be) { +// resetStore(); + eventBus.fireEvent(new ReLoadListJobEvent(SearchResultType.TAXONOMY_ITEM)); + + } + }); + + + toolBar.add(buttonInfo); + toolBar.add(new SeparatorToolItem()); + + toolBar.add(buttonSave); + toolBar.add(new SeparatorToolItem()); + + toolBar.add(buttonCancel); + toolBar.add(new SeparatorToolItem()); + + toolBar.add(buttonReSubmit); + toolBar.add(new SeparatorToolItem()); + + + toolBar.add(new FillToolItem()); + toolBar.add(new SeparatorToolItem()); + + toolBar.add(buttonRefreshList); + + setTopComponent(toolBar); + + enableButtonOnClick(false); + } + + public void enableButtonOnClick(boolean bool){ + this.buttonCancel.setEnabled(bool); + this.buttonInfo.setEnabled(bool); + this.buttonSave.setEnabled(bool); + this.buttonReSubmit.setEnabled(bool); + } + + public void resetStore(){ + store.removeAll(); + } + + public void createMenuItemsOnGrid(){ + + MenuItem menuInfo = new MenuItem(); + menuInfo.setText(INFO); + menuInfo.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getInfoIcon())); + menuInfo.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(MenuEvent ce) { + viewInfoJob(); + } + }); + + menu.add(menuInfo); + + MenuItem menuSave= new MenuItem(); + menuSave.setText(SAVE); + menuSave.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getSaveProducts())); + menuSave.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(MenuEvent ce) { + saveJob(); + } + }); + + menu.add(menuSave); + + MenuItem menuCancel= new MenuItem(); + menuCancel.setText(CANCEL); + menuCancel.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getDelete())); + menuCancel.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(MenuEvent ce) { + + cancelJob(); + } + + }); + + menu.add(menuCancel); + + MenuItem menuResubmit= new MenuItem(); + menuResubmit.setText(RE_SUBMIT); + menuResubmit.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getReSubmit())); + + menuResubmit.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(MenuEvent ce) { + resubmitJob(); + } + + }); + + menu.add(menuResubmit); + + grid.setContextMenu(menu); + + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/taxonomy/TaxonomyJobInfoFields.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/taxonomy/TaxonomyJobInfoFields.java new file mode 100644 index 0000000..fba116c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/taxonomy/TaxonomyJobInfoFields.java @@ -0,0 +1,32 @@ +package org.gcube.portlets.user.speciesdiscovery.client.job.taxonomy; + +import org.gcube.portlets.user.speciesdiscovery.client.util.GridField; + +public enum TaxonomyJobInfoFields implements GridField{ + NAME("name","Name"), + LOADING("loading","Loading"); + + private String id; + private String name; + + private TaxonomyJobInfoFields(String id, String name) { + this.id=id; + this.name=name; + } + + @Override + public String getId() { + return this.id; + } + + @Override + public String getName() { + return this.name; + } + + @Override + public boolean isSortable() { + return false; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/taxonomy/TaxonomyJobSpeciesPanel.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/taxonomy/TaxonomyJobSpeciesPanel.java new file mode 100644 index 0000000..bac4d72 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/taxonomy/TaxonomyJobSpeciesPanel.java @@ -0,0 +1,328 @@ +package org.gcube.portlets.user.speciesdiscovery.client.job.taxonomy; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.resources.Resources; +import org.gcube.portlets.user.speciesdiscovery.shared.JobTaxonomyModel; + +import com.extjs.gxt.ui.client.Style.Scroll; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.Html; +import com.extjs.gxt.ui.client.widget.LayoutContainer; +import com.extjs.gxt.ui.client.widget.Window; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.google.gwt.event.shared.EventBus; +import com.google.gwt.user.client.ui.AbstractImagePrototype; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class TaxonomyJobSpeciesPanel extends ContentPanel { + + + /** + * This is a singleton + */ + private static TaxonomyJobSpeciesPanel instance; + private static ContentPanel cp; + private ContentPanel vp; + private static HashMap hashProgressBars; + private static HashMap hashLoadCompletedNotify; + private static HashMap hashTableContentPanels; + private static String LASTOPERATION = "Last Operation: "; + private Html lastOperation = new Html(LASTOPERATION); + private LayoutContainer lc; + private static String WINDOWTITLE = "Species Taxonomy Jobs"; + private static final String FAILED = "failed"; + private static final String COMPLETED = "completed"; + private static final String LOADING = "loading"; + private static final String PENDING = "pending"; + private static final String OPERATIONONE = "none"; + private static final String SAVING = "saving"; + + private TaxonomyGridJob gridJob; + private EventBus eventBus; + + protected Window speciesJobWindow = new Window(); + + public static synchronized TaxonomyJobSpeciesPanel getInstance(EventBus eventBus) { + if (instance == null) + instance = new TaxonomyJobSpeciesPanel(eventBus); + return instance; + } + + private TaxonomyJobSpeciesPanel(EventBus eventBus) { + this.eventBus = eventBus; + this.gridJob = new TaxonomyGridJob(eventBus); + + speciesJobWindow.setSize(1020, 600); + this.setHeaderVisible(false); + this.setLayout(new FitLayout()); + createSpeciesJobWindow(); +// createToolBar(); + } + + private void createSpeciesJobWindow(){ + + lc = new LayoutContainer(); + lc.setStyleAttribute("margin", "5px"); + cp = new ContentPanel(); + cp.setBodyBorder(true); + cp.setStyleAttribute("padding", "5px"); + cp.setLayout(new FitLayout()); + + cp.add(gridJob); + + cp.setHeight(550); + cp.setHeaderVisible(false); + hashProgressBars = new HashMap(); + hashTableContentPanels = new HashMap(); + hashLoadCompletedNotify = new HashMap(); + cp.setScrollMode(Scroll.AUTO); + + lastOperation.setHtml(LASTOPERATION + OPERATIONONE); + +// cp.add(vp); + lc.add(lastOperation); + lc.add(cp); +// + speciesJobWindow.setHeading(WINDOWTITLE); + speciesJobWindow.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getTaxonomy16px())); + speciesJobWindow.setResizable(false); + speciesJobWindow.add(lc); + } + + /** + * + * @param jobsModel + * @return true if almost one progress bar is ongoing + */ + public boolean addListJob(List jobsModel){ + + boolean isLoading = false; + + for(final JobTaxonomyModel jobModel : jobsModel){ + + isLoading = addJob(jobModel); + } + + return isLoading; + + } + + + public boolean addJob(final JobTaxonomyModel jobModel){ + + boolean isLoading = false; + +// Log.trace("add job :" +jobModel); + + TaxonomyJobSpeciesProgressBar jobsBar = hashProgressBars.get(jobModel.getIdentifier()); + + if(jobsBar!=null){ //is update + + TaxonomyWindowInfoJobsSpecies win = (TaxonomyWindowInfoJobsSpecies) jobsBar.getData("win"); + + if(win!=null){ + win.updateListStore(jobModel); + win.layout(); + jobsBar.setData("win", win); + } + + //IF job is COMPLETED OR FAILED OR COMPLETED WITH ERROR, IS NOT UPDATE + if(jobsBar.isCompleted()){ + //FOR DEBUG +// Log.trace("jobsBar " +jobModel.getName() + " completed, return" ); + return true; + } + + + updateProgressBarView(jobsBar, jobModel); + + gridJob.updateStatus(jobModel, jobsBar); + + } + else{ //create new grid item that contains new progress bar + + TaxonomyJobSpeciesProgressBar jobProgressBar = new TaxonomyJobSpeciesProgressBar(jobModel.getIdentifier(), jobModel.getDownloadState().toString()); + + gridJob.addJobIntoGrid(jobModel, jobProgressBar); + + updateProgressBarView(jobProgressBar, jobModel); + +// hashTableContentPanels.put(jobModel.getIdentifier(), panelTable); //add contentPanel into hashTableContentPanels + hashProgressBars.put(jobModel.getIdentifier(), jobProgressBar); //add progressBar into hashProgressBars + hashLoadCompletedNotify.put(jobModel.getIdentifier(), false); //add false (at load completed event) into hashLoadCompletedNotify + } + + gridJob.layout(); + cp.layout(); + + return isLoading; + } + + + private boolean updateProgressBarView(TaxonomyJobSpeciesProgressBar jobsBar, JobTaxonomyModel jobModel){ + + + switch (jobModel.getDownloadState()) { + + case PENDING:{ + jobsBar.setProgressText(PENDING); + break; + } + + case SAVING:{ + lastOperation.setHtml(LASTOPERATION + jobModel.getName() + " saving"); + jobsBar.getElement().getStyle().setBorderColor("#7093DB"); + jobsBar.progressStart(); + jobsBar.setProgressText(SAVING); + break; + } + + case COMPLETED:{ + + lastOperation.setHtml(LASTOPERATION + jobModel.getName() + " completed"); +// notifyInfoCompleted(jobModel.getIdentifier(), jobsBar.getProgressText()); + + jobsBar.getElement().getStyle().setBorderColor("#000000"); + jobsBar.progressStop(); + jobsBar.updateProgress(100); + jobsBar.setCompleted(true); + jobsBar.updateText(COMPLETED); + + break; + } + + + case SAVED:{ + + lastOperation.setHtml(LASTOPERATION + jobModel.getName() + " saved"); +// notifyInfoCompleted(jobModel.getIdentifier(), jobsBar.getProgressText()); + + jobsBar.getElement().getStyle().setBorderColor("#000000"); + jobsBar.progressStop(); + jobsBar.updateProgress(100); + jobsBar.setCompleted(true); + jobsBar.updateText(COMPLETED); + + break; + } + + case ONGOING:{ + + jobsBar.setProgressText(LOADING); + jobsBar.progressStart(); + + return true; + } + + case ONGOINGWITHFAILURES: { + + jobsBar.getElement().getStyle().setBorderColor("#f00"); + String job = jobModel.getFailuresNumbers()==1?"job":"jobs"; + jobsBar.updateText("loading " + jobModel.getName() + " with " + jobModel.getFailuresNumbers() + " " +job +" "+ FAILED); + + break; + } + + case FAILED:{ + + jobsBar.getElement().getStyle().setBorderColor("#f00"); + jobsBar.progressStop(); + jobsBar.updateProgress(100); + jobsBar.setCompleted(true); + jobsBar.updateText(FAILED); + + break; + } + + case COMPLETEDWITHFAILURES:{ + + jobsBar.getElement().getStyle().setBorderColor("#f00"); + String job = jobModel.getFailuresNumbers()==1?"job":"jobs"; + jobsBar.updateText("job completed with " + jobModel.getFailuresNumbers() + " " +job +" "+ FAILED); + jobsBar.updateProgress(100); + jobsBar.setCompleted(true); + + break; + } + } + + return false; + + } + + public void removeSpeciesJob(String hashHPKey) { + + + ContentPanel cp = hashTableContentPanels.get(hashHPKey); + + vp.remove(cp); + lastOperation.setHtml(LASTOPERATION + cp.getId() + " deleted"); + hashProgressBars.remove(hashHPKey); //remove progress bar from hash + hashTableContentPanels.remove(hashHPKey); //remove hp from hash + hashLoadCompletedNotify.remove(hashHPKey); //remove notify event + + vp.layout(); + + } + + @SuppressWarnings("unused") + private void deleteProgressCompleted(List progressIdFound){ + + List progressIdNotFound = new ArrayList(); + + for(String key : hashTableContentPanels.keySet()){ + +// System.out.println("Key " + key ); + + if(!progressIdFound.contains(key)){ //if key isn't not found - progress is completed so is removed + +// System.out.println("Key is not present " + key ); + + TaxonomyJobSpeciesProgressBar bulkPB = hashProgressBars.get(key); + lastOperation.setHtml(LASTOPERATION + bulkPB.getProgressText() + " uploading completed"); + +// bulkPB.updateProgress(100); + progressIdNotFound.add(key); + } + } + + for(String key : progressIdNotFound){ + + TaxonomyJobSpeciesProgressBar bulkPB = hashProgressBars.get(key); + lastOperation.setHtml(LASTOPERATION + bulkPB.getProgressText() + " uploading completed"); + +// vp.remove(hashHorizontalPanels.get(key)); //remove hp from view + hashProgressBars.remove(key); //remove progress bar from hash + hashTableContentPanels.remove(key); //remove hp from hash + } + + vp.layout(); + cp.layout(); + } + + public Window getSpeciesJobWindow() { + return speciesJobWindow; + } + + public void resetStructures(){ + + this.gridJob.resetStore(); + + hashProgressBars.clear(); + lastOperation.setHtml(LASTOPERATION); + hashTableContentPanels.clear(); + hashLoadCompletedNotify.clear(); + + } + + public TaxonomyGridJob getGridJob() { + return gridJob; + } +} + diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/taxonomy/TaxonomyJobSpeciesProgressBar.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/taxonomy/TaxonomyJobSpeciesProgressBar.java new file mode 100644 index 0000000..c55bc7f --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/taxonomy/TaxonomyJobSpeciesProgressBar.java @@ -0,0 +1,68 @@ +package org.gcube.portlets.user.speciesdiscovery.client.job.taxonomy; + +import com.extjs.gxt.ui.client.widget.ProgressBar; +import com.google.gwt.user.client.Timer; + +public class TaxonomyJobSpeciesProgressBar extends ProgressBar { + + private String progressText; + private float progress; + private final Timer timer; + private boolean isCompleted = false; + + public TaxonomyJobSpeciesProgressBar(String idJob, final String text) { + + this.progressText = text; + setSize(240, 20); +// setBounds(10, 10, 200, Style.DEFAULT); + + updateProgress(progress, text); + + timer = new Timer() { + float i; + + @Override + public void run() { + updateProgress(i / 100, progressText); + i += 5; + if (i > 105) { + if(!isCompleted) + i = 0; + } + } + }; + } + + public void progressStart(){ + timer.scheduleRepeating(500); + } + + public void progressStop(){ + timer.cancel(); + } + + public void updateProgress(float counter) { + progress = counter / 100; + updateProgress(progress, progressText); + } + + public String getProgressText() { + return progressText; + } + + public void setProgressText(String progressText) { + this.progressText = progressText; + } + + public float getProgress() { + return progress; + } + + public boolean isCompleted() { + return isCompleted; + } + + public void setCompleted(boolean isCompleted) { + this.isCompleted = isCompleted; + } +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/taxonomy/TaxonomyJobTable.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/taxonomy/TaxonomyJobTable.java new file mode 100644 index 0000000..9089461 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/taxonomy/TaxonomyJobTable.java @@ -0,0 +1,108 @@ +package org.gcube.portlets.user.speciesdiscovery.client.job.taxonomy; + +import com.extjs.gxt.ui.client.Style.HorizontalAlignment; +import com.extjs.gxt.ui.client.Style.Scroll; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.Label; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.layout.TableData; +import com.extjs.gxt.ui.client.widget.layout.TableLayout; +import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem; +import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; + +/** + * Entry point classes define onModuleLoad(). + */ + +public class TaxonomyJobTable { + + public static ContentPanel getJobTableWithoutHeading(String name, String startTime, String endTime, TaxonomyJobSpeciesProgressBar status, String elapsedTime, Button btnInfo, Button btnCancel, Button btnSave){ + + ContentPanel cpTableLayout = new ContentPanel(); + cpTableLayout.setHeaderVisible(false); + cpTableLayout.setStyleAttribute("margin-top", "10px"); + cpTableLayout.setAutoHeight(true); + cpTableLayout.setWidth(964); + cpTableLayout.setScrollMode(Scroll.AUTO); + + TableLayout tablelayout = new TableLayout(5); + tablelayout.setCellHorizontalAlign(HorizontalAlignment.CENTER); + cpTableLayout.setLayout(tablelayout); + + ContentPanel panel; + + //NAME + TableData layoutData = new TableData(); + layoutData.setWidth("300px"); + panel = new ContentPanel(); + panel.setScrollMode(Scroll.AUTO); + panel.setHeading("Name"); + panel.setHeight(55); + panel.add(new Label(name)); + panel.setWidth(300); + cpTableLayout.add(panel, layoutData); + + //Status + layoutData = new TableData(); + layoutData.setWidth("302px"); + panel = new ContentPanel(); + panel.setHeight(55); + panel.setHeading("Status"); + panel.setScrollMode(Scroll.AUTO); + panel.add(status); + panel.setWidth(302); + cpTableLayout.add(panel, layoutData); + + //Start Time + layoutData = new TableData(); + layoutData.setWidth("120px"); + panel = new ContentPanel(); + panel.setScrollMode(Scroll.AUTO); + panel.setHeight(55); + panel.setHeading("Start Time"); + panel.addText(startTime); + panel.setWidth(120); + cpTableLayout.add(panel, layoutData); + + //End Time + layoutData = new TableData(); + layoutData.setWidth("120px"); + panel = new ContentPanel(); + panel.setHeading("End Time"); + panel.setScrollMode(Scroll.AUTO); + panel.setHeight(55); + if(endTime!=null) + panel.addText(endTime); + panel.setWidth(120); + cpTableLayout.add(panel, layoutData); + + //Elapsed Time + layoutData = new TableData(); + layoutData.setWidth("120px"); + panel = new ContentPanel(); + panel.setHeading("Elapsed Time"); + panel.setScrollMode(Scroll.AUTO); + panel.setHeight(55); + if(elapsedTime!=null) + panel.addText(elapsedTime); + panel.setWidth(120); + cpTableLayout.add(panel, layoutData); + + + ToolBar toolBar = new ToolBar(); + + toolBar.add(btnInfo); + toolBar.add(new SeparatorToolItem()); + + toolBar.add(btnSave); + toolBar.add(new SeparatorToolItem()); + + toolBar.add(btnCancel); + toolBar.add(new SeparatorToolItem()); + + cpTableLayout.setBottomComponent(toolBar); + + return cpTableLayout; + + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/taxonomy/TaxonomyJobsInfoContainer.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/taxonomy/TaxonomyJobsInfoContainer.java new file mode 100644 index 0000000..b1a2c1a --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/taxonomy/TaxonomyJobsInfoContainer.java @@ -0,0 +1,104 @@ +package org.gcube.portlets.user.speciesdiscovery.client.job.taxonomy; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.util.Util; + +import com.extjs.gxt.ui.client.Style.HorizontalAlignment; +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.store.GroupingStore; +import com.extjs.gxt.ui.client.store.ListStore; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.LayoutContainer; +import com.extjs.gxt.ui.client.widget.grid.ColumnConfig; +import com.extjs.gxt.ui.client.widget.grid.ColumnModel; +import com.extjs.gxt.ui.client.widget.grid.Grid; +import com.extjs.gxt.ui.client.widget.grid.GridGroupRenderer; +import com.extjs.gxt.ui.client.widget.grid.GroupColumnData; +import com.extjs.gxt.ui.client.widget.grid.GroupingView; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; + +public class TaxonomyJobsInfoContainer extends LayoutContainer { + + private ColumnModel cm; + private Grid grid; + private ContentPanel cp; + private GroupingStore store; + + public TaxonomyJobsInfoContainer(GroupingStore store) { + + this.store = store; + this.store.groupBy(TaxonomyJobInfoFields.LOADING.getId()); + + initContentPanel(); + + List columns = new ArrayList(); + + ColumnConfig name = Util.createColumnConfig(TaxonomyJobInfoFields.NAME, 230); + columns.add(name); + + ColumnConfig status = Util.createColumnConfig(TaxonomyJobInfoFields.LOADING, 70); + columns.add(status); + + cm = new ColumnModel(columns); + + final ColumnModel columnModel = cm; + + grid = new Grid(this.store, cm); + + GroupingView view = new GroupingView(); + view.setShowGroupedColumn(true); + this.grid.setView(view); + + view.setGroupRenderer(new GridGroupRenderer() { + public String render(GroupColumnData data) { + String f = columnModel.getColumnById(data.field).getHeader(); + String l = data.models.size() == 1 ? "Item" : "Items"; + return f + ": " + data.group + " (" + data.models.size() + " " + l + ")"; + } + }); + + grid.setBorders(true); + grid.setStripeRows(true); + grid.getView().setAutoFill(true); + grid.setColumnLines(true); + grid.setColumnReordering(true); + grid.setStyleAttribute("borderTop", "none"); + + cp.add(grid); + } + + private void initContentPanel() { + setLayout(new FitLayout()); + getAriaSupport().setPresentation(true); + cp = new ContentPanel(); + cp.setHeaderVisible(false); + cp.setBodyBorder(true); + cp.setLayout(new FitLayout()); + cp.setButtonAlign(HorizontalAlignment.CENTER); + cp.setLayout(new FitLayout()); +// cp.getHeader().setIconAltText("Grid Icon"); + cp.setSize(400, 250); + + add(cp); + } + + public void updateStore(ListStore store){ + + this.grid.getStore().removeAll(); +// for (ModelData modelData : store.getModels()){ +// this.grid.getStore().add(modelData); +// } + + this.grid.getStore().add(store.getModels()); + +// cp.layout(); + } + + public void setHeaderTitle(String title) { + cp.setHeading(title); +// cp.layout(); + } + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/taxonomy/TaxonomyWindowInfoJobsSpecies.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/taxonomy/TaxonomyWindowInfoJobsSpecies.java new file mode 100644 index 0000000..83532a6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/taxonomy/TaxonomyWindowInfoJobsSpecies.java @@ -0,0 +1,57 @@ +package org.gcube.portlets.user.speciesdiscovery.client.job.taxonomy; + + +import org.gcube.portlets.user.speciesdiscovery.shared.JobTaxonomyModel; + +import com.extjs.gxt.ui.client.data.BaseModelData; +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.store.GroupingStore; +import com.extjs.gxt.ui.client.widget.Window; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; + +public class TaxonomyWindowInfoJobsSpecies extends Window{ + + private TaxonomyJobsInfoContainer jobInfo = new TaxonomyJobsInfoContainer(new GroupingStore()); + + public TaxonomyWindowInfoJobsSpecies(TaxonomyJobsInfoContainer jobInfoContainer) { + setModal(true); + setSize(450, 300); + this.jobInfo = jobInfoContainer; + add(jobInfo); + } + + + public TaxonomyWindowInfoJobsSpecies() { + setModal(true); + setSize(450, 300); + setLayout(new FitLayout()); + add(jobInfo); + } + + public void updateListStore(JobTaxonomyModel jobModel){ + + GroupingStore list = new GroupingStore(); + +// System.out.println("jobModel.getId " + jobModel.getIdentifier() + " children num: " +jobModel.getListChildStatus().size()); + + for (JobTaxonomyModel childJob : jobModel.getListChildStatus()) { + BaseModelData data = new BaseModelData(); + data.set(TaxonomyJobInfoFields.NAME.getId(), childJob.getName()); + data.set(TaxonomyJobInfoFields.LOADING.getId(), childJob.getDownloadState()); + list.add(data); + } + + updateJobsInfoContainer(list); + + } + + private void updateJobsInfoContainer(GroupingStore list) { + this.jobInfo.updateStore(list); + } + + public void setWindowTitle(String title) { + this.setHeading(title); + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/model/ClassificationModel.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/model/ClassificationModel.java new file mode 100644 index 0000000..1d1b268 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/model/ClassificationModel.java @@ -0,0 +1,115 @@ +package org.gcube.portlets.user.speciesdiscovery.client.model; + + +import java.io.Serializable; + +import org.gcube.portlets.user.speciesdiscovery.client.ConstantsSpeciesDiscovery; + +import com.extjs.gxt.ui.client.data.BaseModelData; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class ClassificationModel extends BaseModelData implements Serializable{ + + /** + * + */ + private static final long serialVersionUID = 1L; + + + //USED FOR STATIC FIELDS + public ClassificationModel(String id, String name, String baseTaxonId, String baseTaxonName, boolean isLeaf) { + setId(id); + setName(name); + setIsLeaf(isLeaf); + setBaseTaxonId(baseTaxonId); + setBaseTaxonName(baseTaxonName); + } + + + public ClassificationModel(String id, String name, String classificationRank, String baseTaxonId, String baseTaxonName, boolean isLeaf, int counter) { + setId(id); + setName(name); + setIsLeaf(isLeaf); + setBaseTaxonName(baseTaxonName); + setClassificationRank(classificationRank); + setCountOf(counter); + } + + + public ClassificationModel() {} + + @Override + public boolean equals(Object obj) { + if (obj != null && obj instanceof ClassificationModel) { + ClassificationModel mobj = (ClassificationModel) obj; + return getId().equals(mobj.getId()); + } + return super.equals(obj); + } + + public String getId(){ + return get(ConstantsSpeciesDiscovery.ID); + } + + private void setId(String id) { + set(ConstantsSpeciesDiscovery.ID, id); + } + + private void setName(String name) { + set(ConstantsSpeciesDiscovery.NAME, name); + } + + public String getName() { + return get(ConstantsSpeciesDiscovery.NAME); + } + + private void setIsLeaf(boolean isLeaf) { + set(ConstantsSpeciesDiscovery.ISLEAF, isLeaf); + } + + private void setBaseTaxonId(String baseTaxonId) { + set(ConstantsSpeciesDiscovery.BASETAXONID, baseTaxonId); + } + + public String getBaseTaxonId() { + return get(ConstantsSpeciesDiscovery.BASETAXONID); + } + + + private void setBaseTaxonName(String baseTaxonName) { + set(ConstantsSpeciesDiscovery.BASETAXONNAME, baseTaxonName); + } + + public String getBaseTaxonName() { + return get(ConstantsSpeciesDiscovery.BASETAXONNAME); + } + + public boolean isLeaf() { + Boolean isLeaf = (Boolean) get(ConstantsSpeciesDiscovery.ISLEAF); + return isLeaf.booleanValue(); + } + + public int getCountOf(){ + return (Integer) get(ConstantsSpeciesDiscovery.COUNTOF); + } + + public void setCountOf(int count){ + set(ConstantsSpeciesDiscovery.COUNTOF, count); + } + + public void incrCountOf(){ + int count = getCountOf(); + set(ConstantsSpeciesDiscovery.COUNTOF, count+1); + } + + public String getClassificationRank(){ + return get(ConstantsSpeciesDiscovery.RANK); + } + + public void setClassificationRank(String classificationRank){ + set(ConstantsSpeciesDiscovery.RANK, classificationRank); + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/model/QueryModel.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/model/QueryModel.java new file mode 100644 index 0000000..494f8cf --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/model/QueryModel.java @@ -0,0 +1,18 @@ +package org.gcube.portlets.user.speciesdiscovery.client.model; + +import com.extjs.gxt.ui.client.data.BaseModelData; + +public class QueryModel extends BaseModelData { + + /** + * + */ + private static final long serialVersionUID = 1L; + + public QueryModel(String name, String description, String queryString) { + set("name", name); + set("description", description); + set("queryString", queryString); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/Resources.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/Resources.java new file mode 100644 index 0000000..62b6a1b --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/Resources.java @@ -0,0 +1,164 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.resources; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.ImageResource; +import com.google.gwt.resources.client.TextResource; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface Resources extends ClientBundle { + + public Resources INSTANCE = GWT.create(Resources.class); + + @Source("loading-balls.gif") + ImageResource loadingBalls(); + + @Source("detailsview.png") + ImageResource getDescriptiveSpeciesIcon(); + + @Source("gridview.png") + ImageResource getGridSpeciesIcon(); + + @Source("imagesGrid.png") + ImageResource getGridImagesIcon(); + + @Source("collapse.png") + ImageResource getCollapse(); + + @Source("expand.png") + ImageResource getExpand(); + + @Source("Toggle.js") + TextResource getToggleJavaScript(); + + @Source("nopicavailable.png") + ImageResource getNoPictureAvailable(); + + @Source("show_products.png") + ImageResource getShowProducts(); + + @Source("save_products.png") + ImageResource getSaveProducts(); + + @Source("save_products24.png") + ImageResource getSaveProducts24(); + + @Source("gis_products.png") + ImageResource getGisProducts(); + + @Source("arrow-down.png") + ImageResource getArrowDown(); + + @Source("arrow-right.png") + ImageResource getArrowRight(); + + @Source("arrow-turn.png") + ImageResource getArrowTurn(); + + @Source("gbif.gif") + ImageResource getGbif(); + + @Source("delete.png") + ImageResource getDelete(); + +// @Source("order_alphabetical_asc.gif") + @Source("sortascending.gif") + ImageResource getSortIcon(); + + @Source("info-icon.png") + ImageResource getInfoIcon(); + + @Source("help.jpeg") + ImageResource getHelpIcon(); + + @Source("checkyes.png") + ImageResource getCheckYes(); + + @Source("checkno.png") + ImageResource getCheckNo(); + + @Source("gear.png") + ImageResource getReSubmit(); + + @Source("credits.png") + ImageResource getCredits(); + + @Source("image-notfound.png") + ImageResource getImageNotFound(); + + @Source("getSynonyms.png") + ImageResource getSynonyms(); + + @Source("search-icon.png") + ImageResource getSearch(); + + @Source("occurrence/blueplace.png") + ImageResource getBluePlace(); + + @Source("occurrence/blueplace16px.png") + ImageResource getBluePlace16px(); + + @Source("occurrence/blueplace1.png") + ImageResource getBluePlace1(); + + @Source("occurrence/blueplace2.png") + ImageResource getBluePlace2(); + + @Source("occurrence/blueplace3.png") + ImageResource getBluePlace3(); + + @Source("occurrence/blueplace4.png") + ImageResource getBluePlace4(); + + @Source("occurrence/blueplace4+.png") + ImageResource getBluePlace4More(); + + @Source("taxonomy/taxonomy.png") + ImageResource getTaxonomy(); + + @Source("taxonomy/taxonomy16px.png") + ImageResource getTaxonomy16px(); + + @Source("taxonomy/taxonomy1.png") + ImageResource getTaxonomy1(); + + @Source("taxonomy/taxonomy2.png") + ImageResource getTaxonomy2(); + + @Source("taxonomy/taxonomy3.png") + ImageResource getTaxonomy3(); + + @Source("taxonomy/taxonomy4.png") + ImageResource getTaxonomy4(); + + @Source("taxonomy/taxonomy4More.png") + ImageResource getTaxonomy4More(); + + @Source("refresh.gif") + ImageResource getRefresh(); + + @Source("reload-icon.png") + ImageResource getReload(); + + @Source("checkbox-empty.png") + ImageResource getCheckBoxEmpty(); + + @Source("checkbox-full.png") + ImageResource getCheckBoxFull(); + + @Source("select-icon.png") + ImageResource getCheckSelected(); + + @Source("datailsWindow.png") + ImageResource getDetailsWindow(); + + @Source("attention.png") + ImageResource getAttention(); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/Toggle.js b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/Toggle.js new file mode 100644 index 0000000..742eee9 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/Toggle.js @@ -0,0 +1,37 @@ +function toggleSingle(obj) { + var el = document.getElementById(obj); + el.style.display = el.style.display != 'none' ? 'none' : '' ; +} + + +function getElementsByClass(searchClass,node,tag) { + + var classElements = new Array(); + + if ( node == null ) node = document; + + if ( tag == null ) tag = '*'; + + var els = node.getElementsByTagName(tag); + + var elsLen = els.length; + + var pattern = new RegExp('(^|\\\\s)'+searchClass+'(\\\\s|$)'); + + for (i = 0, j = 0; i < elsLen; i++) { + if ( pattern.test(els[i].className) ) { + classElements[j] = els[i]; + j++; + } + } + return classElements; +} + +function toggle(searchClass,obj,tag) { + var el = document.getElementById(obj); + var classElements = getElementsByClass(searchClass,el,tag); + + for ( var i=0; i < classElements.length; i++ ) { + classElements[i].style.display = classElements[i].style.display != 'none' ? 'none' : '' ; + } +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/arrow-down.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/arrow-down.png new file mode 100644 index 0000000..2a8830e Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/arrow-down.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/arrow-down2.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/arrow-down2.png new file mode 100644 index 0000000..8830695 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/arrow-down2.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/arrow-right.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/arrow-right.png new file mode 100644 index 0000000..e252606 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/arrow-right.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/arrow-right2.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/arrow-right2.png new file mode 100644 index 0000000..651d40e Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/arrow-right2.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/arrow-turn.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/arrow-turn.png new file mode 100644 index 0000000..2a4517f Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/arrow-turn.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/attention.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/attention.png new file mode 100644 index 0000000..c5f97b4 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/attention.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/blueplace.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/blueplace.png new file mode 100644 index 0000000..ab170a1 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/blueplace.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/checkbox-empty.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/checkbox-empty.png new file mode 100644 index 0000000..541761b Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/checkbox-empty.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/checkbox-full.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/checkbox-full.png new file mode 100644 index 0000000..888bab4 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/checkbox-full.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/checkno.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/checkno.png new file mode 100644 index 0000000..36c3880 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/checkno.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/checkyes.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/checkyes.png new file mode 100644 index 0000000..9cd1590 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/checkyes.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/collapse.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/collapse.png new file mode 100644 index 0000000..3452e99 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/collapse.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/credits.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/credits.png new file mode 100644 index 0000000..b9e2d6d Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/credits.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/datailsWindow.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/datailsWindow.png new file mode 100644 index 0000000..03dace3 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/datailsWindow.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/delete.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/delete.png new file mode 100644 index 0000000..b870b37 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/delete.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/detailsview.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/detailsview.png new file mode 100644 index 0000000..624ec7c Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/detailsview.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/detailsview2.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/detailsview2.png new file mode 100644 index 0000000..4a8672b Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/detailsview2.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/expand.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/expand.png new file mode 100644 index 0000000..20f8d51 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/expand.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/gbif.gif b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/gbif.gif new file mode 100644 index 0000000..1a24f51 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/gbif.gif differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/gear.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/gear.png new file mode 100644 index 0000000..efc599d Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/gear.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/getSynonyms.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/getSynonyms.png new file mode 100644 index 0000000..e4a1ecb Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/getSynonyms.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/gis_products.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/gis_products.png new file mode 100644 index 0000000..f90ef25 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/gis_products.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/gridview.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/gridview.png new file mode 100644 index 0000000..ee6eee0 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/gridview.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/gridview2.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/gridview2.png new file mode 100644 index 0000000..97b2e03 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/gridview2.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/help.jpeg b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/help.jpeg new file mode 100644 index 0000000..6fa6b6f Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/help.jpeg differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/help.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/help.png new file mode 100644 index 0000000..bfe1013 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/help.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/image-notfound.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/image-notfound.png new file mode 100644 index 0000000..20ced28 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/image-notfound.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/imagesGrid.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/imagesGrid.png new file mode 100644 index 0000000..6e6e852 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/imagesGrid.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/info-icon.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/info-icon.png new file mode 100644 index 0000000..bbf51fc Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/info-icon.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/loading-balls.gif b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/loading-balls.gif new file mode 100644 index 0000000..9ce214b Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/loading-balls.gif differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/nopicavailable.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/nopicavailable.png new file mode 100644 index 0000000..106c81a Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/nopicavailable.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/occurrence/blueplace.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/occurrence/blueplace.png new file mode 100755 index 0000000..3d69f11 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/occurrence/blueplace.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/occurrence/blueplace1.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/occurrence/blueplace1.png new file mode 100755 index 0000000..10adb9a Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/occurrence/blueplace1.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/occurrence/blueplace16px.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/occurrence/blueplace16px.png new file mode 100644 index 0000000..557a59e Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/occurrence/blueplace16px.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/occurrence/blueplace2.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/occurrence/blueplace2.png new file mode 100755 index 0000000..161e997 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/occurrence/blueplace2.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/occurrence/blueplace3.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/occurrence/blueplace3.png new file mode 100755 index 0000000..a618f48 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/occurrence/blueplace3.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/occurrence/blueplace4+.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/occurrence/blueplace4+.png new file mode 100755 index 0000000..d3cf625 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/occurrence/blueplace4+.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/occurrence/blueplace4.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/occurrence/blueplace4.png new file mode 100755 index 0000000..664e8a1 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/occurrence/blueplace4.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/order_alphabetical_asc.gif b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/order_alphabetical_asc.gif new file mode 100644 index 0000000..f4a4d44 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/order_alphabetical_asc.gif differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/refresh.gif b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/refresh.gif new file mode 100644 index 0000000..7db2dd5 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/refresh.gif differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/reload-icon.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/reload-icon.png new file mode 100644 index 0000000..28a3d6d Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/reload-icon.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/save_products.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/save_products.png new file mode 100644 index 0000000..a3145d9 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/save_products.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/save_products24.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/save_products24.png new file mode 100644 index 0000000..1f49f4d Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/save_products24.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/save_products_old.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/save_products_old.png new file mode 100644 index 0000000..99d532e Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/save_products_old.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/search-icon.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/search-icon.png new file mode 100644 index 0000000..8d525d3 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/search-icon.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/select-icon.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/select-icon.png new file mode 100644 index 0000000..4f91e4d Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/select-icon.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/select-icon2.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/select-icon2.png new file mode 100644 index 0000000..7ebda86 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/select-icon2.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/select-icon3.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/select-icon3.png new file mode 100644 index 0000000..a723210 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/select-icon3.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/show_products.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/show_products.png new file mode 100644 index 0000000..abcd936 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/show_products.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/sortascending.gif b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/sortascending.gif new file mode 100644 index 0000000..3c65dc4 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/sortascending.gif differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/sortascending.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/sortascending.png new file mode 100644 index 0000000..18de597 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/sortascending.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/sorter.jpg b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/sorter.jpg new file mode 100644 index 0000000..05f846e Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/sorter.jpg differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/taxonomy/category.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/taxonomy/category.png new file mode 100644 index 0000000..fc7a74b Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/taxonomy/category.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/taxonomy/taxonomy.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/taxonomy/taxonomy.png new file mode 100644 index 0000000..02c5fbd Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/taxonomy/taxonomy.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/taxonomy/taxonomy1.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/taxonomy/taxonomy1.png new file mode 100644 index 0000000..c867020 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/taxonomy/taxonomy1.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/taxonomy/taxonomy16px.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/taxonomy/taxonomy16px.png new file mode 100644 index 0000000..a63f99a Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/taxonomy/taxonomy16px.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/taxonomy/taxonomy2.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/taxonomy/taxonomy2.png new file mode 100644 index 0000000..21f4eda Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/taxonomy/taxonomy2.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/taxonomy/taxonomy3.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/taxonomy/taxonomy3.png new file mode 100644 index 0000000..952a07e Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/taxonomy/taxonomy3.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/taxonomy/taxonomy4.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/taxonomy/taxonomy4.png new file mode 100644 index 0000000..2db7c34 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/taxonomy/taxonomy4.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/taxonomy/taxonomy4More.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/taxonomy/taxonomy4More.png new file mode 100644 index 0000000..cbeaa79 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/taxonomy/taxonomy4More.png differ diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resultview/DescriptiveSpeciesGrid.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resultview/DescriptiveSpeciesGrid.java new file mode 100644 index 0000000..3719951 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resultview/DescriptiveSpeciesGrid.java @@ -0,0 +1,95 @@ +package org.gcube.portlets.user.speciesdiscovery.client.resultview; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.resources.Resources; +import org.gcube.portlets.user.speciesdiscovery.client.util.JavascriptInjector; +import org.gcube.portlets.user.speciesdiscovery.client.util.SpeciesGridFields; +import org.gcube.portlets.user.speciesdiscovery.client.util.Util; +import org.gcube.portlets.user.speciesdiscovery.client.view.SpeciesViewInterface; +import org.gcube.portlets.user.speciesdiscovery.shared.ResultRow; + +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.store.ListStore; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.grid.ColumnConfig; +import com.extjs.gxt.ui.client.widget.grid.ColumnModel; +import com.extjs.gxt.ui.client.widget.grid.Grid; +import com.extjs.gxt.ui.client.widget.layout.AnchorData; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; + +public class DescriptiveSpeciesGrid extends ContentPanel implements SpeciesViewInterface { + + protected static final String TOGGLE_CLASS = "SPECIES_TOGGLE"; + + private Grid grid; + + public DescriptiveSpeciesGrid(ListStore store) { + + setLayout(new FitLayout()); + setHeaderVisible(false); + + List columns = new ArrayList(); + + ColumnConfig descriptiveName = Util.createColumnConfig(SpeciesGridFields.COMMON_NAMES, 250); + columns.add(descriptiveName); + + JavascriptInjector.inject(Resources.INSTANCE.getToggleJavaScript().getText()); + + ColumnConfig descriptiveTaxonomy = Util.createColumnConfig(SpeciesGridFields.TAXON, 350); + columns.add(descriptiveTaxonomy); + + ColumnConfig datasourceColumn = Util.createColumnConfig(SpeciesGridFields.PROVENANCE, 350); + columns.add(datasourceColumn); + + ColumnConfig productsColumn = Util.createColumnConfig(SpeciesGridFields.PRODUCTS, 350); + columns.add(productsColumn); + + final ColumnModel descriptiveColumnModel = new ColumnModel(columns); + + grid = new Grid(store,descriptiveColumnModel); + grid.setBorders(true); + grid.setStripeRows(true); + + add(grid, new AnchorData("100% 100%")); + + } + @Override + protected void onShow() { + super.onShow(); + reload(); + } + + public void reload(){ + //grid.getStore().getLoader().load(); + } + + /** + * {@inheritDoc} + */ + @Override + public List getSelectedRows() { + List selectedRows = new LinkedList(); + for (ModelData selected: grid.getSelectionModel().getSelectedItems()) selectedRows.add((ResultRow) selected.get(SpeciesGridFields.ROW.getId())); + return selectedRows; + } + + public void setBodyStyleAsFiltered(boolean isFiltered){ + + if (this.getElement("body") != null) { + + if (isFiltered) { + this.getElement("body").getStyle().setBorderColor("#32CD32"); + } else + this.getElement("body").getStyle().setBorderColor("#99BBE8"); + + } + } + @Override + public ContentPanel getPanel() { + return this; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resultview/DescriptiveTaxonomyGrid.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resultview/DescriptiveTaxonomyGrid.java new file mode 100644 index 0000000..0d2235b --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resultview/DescriptiveTaxonomyGrid.java @@ -0,0 +1,97 @@ +package org.gcube.portlets.user.speciesdiscovery.client.resultview; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.resources.Resources; +import org.gcube.portlets.user.speciesdiscovery.client.util.JavascriptInjector; +import org.gcube.portlets.user.speciesdiscovery.client.util.SpeciesGridFields; +import org.gcube.portlets.user.speciesdiscovery.client.util.TaxonomyGridField; +import org.gcube.portlets.user.speciesdiscovery.client.util.Util; +import org.gcube.portlets.user.speciesdiscovery.client.view.SpeciesViewInterface; +import org.gcube.portlets.user.speciesdiscovery.shared.ResultRow; + +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.store.ListStore; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.grid.ColumnConfig; +import com.extjs.gxt.ui.client.widget.grid.ColumnModel; +import com.extjs.gxt.ui.client.widget.grid.Grid; +import com.extjs.gxt.ui.client.widget.layout.AnchorData; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; + +public class DescriptiveTaxonomyGrid extends ContentPanel implements SpeciesViewInterface { + + protected static final String TOGGLE_CLASS = "SPECIES_TOGGLE"; + + private Grid grid; + + public DescriptiveTaxonomyGrid(ListStore store) { + + setLayout(new FitLayout()); + setHeaderVisible(false); + + List columns = new ArrayList(); + + ColumnConfig descriptiveName = Util.createColumnConfig(TaxonomyGridField.SCIENTIFIC_NAME, 250); + columns.add(descriptiveName); + + JavascriptInjector.inject(Resources.INSTANCE.getToggleJavaScript().getText()); + + ColumnConfig descriptiveTaxonomy = Util.createColumnConfig(TaxonomyGridField.TAXONOMY, 350); + columns.add(descriptiveTaxonomy); + + ColumnConfig datasourceColumn = Util.createColumnConfig(TaxonomyGridField.PROVENANCE, 350); + columns.add(datasourceColumn); + + ColumnConfig productsColumn = Util.createColumnConfig(TaxonomyGridField.PRODUCTS, 350); + columns.add(productsColumn); + + final ColumnModel descriptiveColumnModel = new ColumnModel(columns); + + grid = new Grid(store,descriptiveColumnModel); + grid.setBorders(true); + grid.setStripeRows(true); + + add(grid, new AnchorData("100% 100%")); + + } + @Override + protected void onShow() { + super.onShow(); + reload(); + } + + public void reload(){ + //grid.getStore().getLoader().load(); + } + + /** + * {@inheritDoc} + */ + @Override + public List getSelectedRows() { + List selectedRows = new LinkedList(); + for (ModelData selected: grid.getSelectionModel().getSelectedItems()) selectedRows.add((ResultRow) selected.get(SpeciesGridFields.ROW.getId())); + return selectedRows; + } + + public void setBodyStyleAsFiltered(boolean isFiltered){ + + if (this.getElement("body") != null) { + + if (isFiltered) { + this.getElement("body").getStyle().setBorderColor("#32CD32"); + } else + this.getElement("body").getStyle().setBorderColor("#99BBE8"); + + } + } + + @Override + public ContentPanel getPanel() { + return this; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resultview/SpeciesGrid.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resultview/SpeciesGrid.java new file mode 100644 index 0000000..8ecf16e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resultview/SpeciesGrid.java @@ -0,0 +1,220 @@ +package org.gcube.portlets.user.speciesdiscovery.client.resultview; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.ConstantsSpeciesDiscovery; +import org.gcube.portlets.user.speciesdiscovery.client.event.UpdateRowSelectionEvent; +import org.gcube.portlets.user.speciesdiscovery.client.util.SpeciesGridFields; +import org.gcube.portlets.user.speciesdiscovery.client.util.TaxonomyGridField; +import org.gcube.portlets.user.speciesdiscovery.client.util.Util; +import org.gcube.portlets.user.speciesdiscovery.client.view.SpeciesViewInterface; +import org.gcube.portlets.user.speciesdiscovery.shared.ResultRow; + +import com.extjs.gxt.ui.client.Style.SelectionMode; +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.event.GridEvent; +import com.extjs.gxt.ui.client.store.ListStore; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.grid.AggregationRowConfig; +import com.extjs.gxt.ui.client.widget.grid.CheckBoxSelectionModel; +import com.extjs.gxt.ui.client.widget.grid.ColumnConfig; +import com.extjs.gxt.ui.client.widget.grid.ColumnModel; +import com.extjs.gxt.ui.client.widget.grid.EditorGrid; +import com.extjs.gxt.ui.client.widget.grid.EditorGrid.ClicksToEdit; +import com.extjs.gxt.ui.client.widget.grid.HeaderGroupConfig; +import com.extjs.gxt.ui.client.widget.grid.SummaryType; +import com.extjs.gxt.ui.client.widget.layout.AnchorData; +import com.extjs.gxt.ui.client.widget.layout.AnchorLayout; +import com.google.gwt.event.shared.EventBus; +import com.google.gwt.i18n.client.NumberFormat; + +public class SpeciesGrid extends ContentPanel implements SpeciesViewInterface { + + public enum ColumnModelType{ + SCIENTIFIC,EXPANDED + } + + private EditorGrid grid; + private EventBus eventBus; + + private boolean isMouseDown = false; + private List columns; + private ColumnConfig columnProductOccurences; + private final CheckBoxSelectionModel sm; + + public SpeciesGrid(ListStore store, final EventBus eventBus) { + this.eventBus = eventBus; + + setLayout(new AnchorLayout()); + setHeaderVisible(false); + + columns = new ArrayList(); + + sm = new CheckBoxSelectionModel(){ + + @Override + protected void handleMouseDown(GridEvent e){ + isMouseDown = true; +// Log.trace("on handleMouseDown"); + super.handleMouseDown(e); +// Window.alert("mouse down"); + } + + @Override + protected void onHeaderClick(GridEvent e){ + isMouseDown = true; +// Log.trace("on header click"); + super.onHeaderClick(e); + } + + protected void onAdd(List models){ + super.onAdd(models); + + for (ModelData md : models) { + if(md.get(SpeciesGridFields.ROW.getId()) instanceof ResultRow){ + + ResultRow rs = (ResultRow) md.get(SpeciesGridFields.ROW.getId()); + if(rs.isSelected()){ + isMouseDown = false; + select(md, true); + } + } + } + + } + + @Override + protected void onSelectChange(ModelData model, boolean select){ + super.onSelectChange(model, select); +// Log.trace("onSelectChange"); + if(isMouseDown){ +// Window.alert("onSelectChange"); + int rowId = ((ResultRow) model.get(SpeciesGridFields.ROW.getId())).getId(); + eventBus.fireEvent(new UpdateRowSelectionEvent(rowId, select)); + } + } + + }; + + columns.add(sm.getColumn()); + + ColumnConfig dataSource = Util.createColumnConfig(SpeciesGridFields.DATASOURCE, 120); + columns.add(dataSource); + + ColumnConfig dataProvider = Util.createColumnConfig(SpeciesGridFields.DATAPROVIDER, 310); + dataProvider.setHidden(true); + columns.add(dataProvider); + + ColumnConfig dataSet = Util.createColumnConfig(SpeciesGridFields.DATASET, 200); + columns.add(dataSet); + + ColumnConfig dataSetCitation = Util.createColumnConfig(SpeciesGridFields.DATASET_CITATION, 360); + dataSetCitation.setHidden(true); + columns.add(dataSetCitation); + + ColumnConfig matchingName = Util.createColumnConfig(SpeciesGridFields.MATCHING_NAME, 180); + columns.add(matchingName); + + ColumnConfig author = Util.createColumnConfig(TaxonomyGridField.AUTHOR, 150); + columns.add(author); + + ColumnConfig accordingTo = Util.createColumnConfig(SpeciesGridFields.MATCHING_AUTHOR, 200); + columns.add(accordingTo); + + ColumnConfig matchingCategory = Util.createColumnConfig(SpeciesGridFields.MATCHING_RANK, 80); + columns.add(matchingCategory); + + ColumnConfig matchingCredits = Util.createColumnConfig(SpeciesGridFields.MATCHING_CREDITS, 80); + matchingCredits.setHidden(true); + columns.add(matchingCredits); + + + columnProductOccurences = Util.createColumnConfig(SpeciesGridFields.PRODUCT_OCCURRENCES, 90); +// productOccurences.setHidden(true); + columns.add(columnProductOccurences); + + final ColumnModel classicColumnModel = new ColumnModel(columns); + + classicColumnModel.addHeaderGroup(0, 1, new HeaderGroupConfig(SpeciesGridFields.PROVENANCE.getName(), 1, 3)); + classicColumnModel.addHeaderGroup(0, 5, new HeaderGroupConfig("Matching", 1, 4)); + classicColumnModel.addHeaderGroup(0, 9, new HeaderGroupConfig(SpeciesGridFields.PRODUCTS.getName(), 1, 4)); + + AggregationRowConfig counts = new AggregationRowConfig(); + counts.setHtml(SpeciesGridFields.DATASOURCE.getId(), "Count"); + + counts.setSummaryType(SpeciesGridFields.PRODUCT_OCCURRENCES.getId(), SummaryType.SUM); + counts.setSummaryFormat(SpeciesGridFields.PRODUCT_OCCURRENCES.getId(), NumberFormat.getDecimalFormat()); + + classicColumnModel.addAggregationRow(counts); + + grid = new EditorGrid(store, classicColumnModel); + grid.setLoadMask(true); + grid.setBorders(true); + grid.setStripeRows(true); +// grid.getView().setForceFit(true); + grid.getView().setAutoFill(true); + grid.setClicksToEdit(ClicksToEdit.ONE); + grid.getView().setEmptyText(ConstantsSpeciesDiscovery.NORESULTS); + grid.setSelectionModel(sm); + grid.addPlugin(sm); + grid.getSelectionModel().setSelectionMode(SelectionMode.SIMPLE); + + add(grid, new AnchorData("100% 100%")); + } + + @Override + protected void onShow() { + super.onShow(); + reload(); + } + + public void reload(){ + //grid.getStore().getLoader().load(); + } + + /** + * {@inheritDoc} + */ + @Override + public List getSelectedRows() { + List selectedRows = new LinkedList(); + //FIXME for (ModelData selected: selectionModel.getSelectedItems()) selectedRows.add((ResultRow) selected.get(SpeciesGridFields.ROW.getId())); + return selectedRows; + } + + @Override + public void setBodyStyleAsFiltered(boolean isFiltered) { + + if (this.getElement("body") != null) { + + if (isFiltered) { + this.getElement("body").getStyle().setBorderColor("#32CD32"); + } else + this.getElement("body").getStyle().setBorderColor("#99BBE8"); + + } + } + + public void setOccurencesVisible(boolean b) { + + ColumnConfig productOccurences = grid.getColumnModel().getColumnById(SpeciesGridFields.PRODUCT_OCCURRENCES.getId()); + + grid.getColumnModel().setHidden(grid.getColumnModel().getColumnCount()-1, !b); //TODO Temporary + } + + @Override + public ContentPanel getPanel() { + return this; + } + + public void selectAll(){ + sm.selectAll(); + } + + public void deselectAll(){ + sm.deselectAll(); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resultview/TaxonomyGrid.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resultview/TaxonomyGrid.java new file mode 100644 index 0000000..57ffb87 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resultview/TaxonomyGrid.java @@ -0,0 +1,186 @@ +package org.gcube.portlets.user.speciesdiscovery.client.resultview; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.ConstantsSpeciesDiscovery; +import org.gcube.portlets.user.speciesdiscovery.client.event.UpdateRowSelectionEvent; +import org.gcube.portlets.user.speciesdiscovery.client.util.TaxonomyGridField; +import org.gcube.portlets.user.speciesdiscovery.client.util.Util; +import org.gcube.portlets.user.speciesdiscovery.client.view.SpeciesViewInterface; +import org.gcube.portlets.user.speciesdiscovery.shared.ResultRow; +import org.gcube.portlets.user.speciesdiscovery.shared.TaxonomyRow; + +import com.extjs.gxt.ui.client.Style.SelectionMode; +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.event.GridEvent; +import com.extjs.gxt.ui.client.store.ListStore; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.grid.CheckBoxSelectionModel; +import com.extjs.gxt.ui.client.widget.grid.ColumnConfig; +import com.extjs.gxt.ui.client.widget.grid.ColumnModel; +import com.extjs.gxt.ui.client.widget.grid.EditorGrid; +import com.extjs.gxt.ui.client.widget.grid.EditorGrid.ClicksToEdit; +import com.extjs.gxt.ui.client.widget.grid.HeaderGroupConfig; +import com.extjs.gxt.ui.client.widget.layout.AnchorData; +import com.extjs.gxt.ui.client.widget.layout.AnchorLayout; +import com.google.gwt.event.shared.EventBus; + +public class TaxonomyGrid extends ContentPanel implements SpeciesViewInterface { + + private EditorGrid grid; + private EventBus eventBus; + + private boolean isMouseDown = false; + private List columns; + + private CheckBoxSelectionModel sm; + + public TaxonomyGrid(ListStore store, final EventBus eventBus) { + this.eventBus = eventBus; + + setLayout(new AnchorLayout()); + setHeaderVisible(false); + + columns = new ArrayList(); + + sm = new CheckBoxSelectionModel(){ + + @Override + protected void handleMouseDown(GridEvent e){ + + isMouseDown = true; + super.handleMouseDown(e); + } + + @Override + protected void onHeaderClick(GridEvent e){ + isMouseDown = true; + super.onHeaderClick(e); + } + + protected void onAdd(List models){ + super.onAdd(models); + + for (ModelData md : models) { + + if(md.get(TaxonomyGridField.ROW.getId()) instanceof TaxonomyRow){ + + TaxonomyRow rs = (TaxonomyRow) md.get(TaxonomyGridField.ROW.getId()); + if(rs.isSelected()){ + isMouseDown = false; + select(md, true); + } + } + } + + } + + + @Override + protected void onSelectChange(ModelData model, boolean select){ + super.onSelectChange(model, select); + + if(isMouseDown){ + int rowId = ((TaxonomyRow) model.get(TaxonomyGridField.ROW.getId())).getId(); + eventBus.fireEvent(new UpdateRowSelectionEvent(rowId, select)); + } + } + + }; + + columns.add(sm.getColumn()); + + + ColumnConfig matchingName = Util.createColumnConfig(TaxonomyGridField.SCIENTIFIC_NAME, 180); + columns.add(matchingName); + + ColumnConfig author = Util.createColumnConfig(TaxonomyGridField.AUTHOR, 150); + columns.add(author); + + ColumnConfig dataProvider = Util.createColumnConfig(TaxonomyGridField.DATASOURCE, 250); + columns.add(dataProvider); + + ColumnConfig dataSetCitation = Util.createColumnConfig(TaxonomyGridField.CITATION, 180); + columns.add(dataSetCitation); + + ColumnConfig rank = Util.createColumnConfig(TaxonomyGridField.MATCHING_RANK, 80); + columns.add(rank); + + ColumnConfig status = Util.createColumnConfig(TaxonomyGridField.STATUSREFNAME, 60); + columns.add(status); + + ColumnConfig statusRemarks = Util.createColumnConfig(TaxonomyGridField.STATUS_REMARKS, 90); + columns.add(statusRemarks); + + final ColumnModel classicColumnModel = new ColumnModel(columns); + + classicColumnModel.addHeaderGroup(0, 1, new HeaderGroupConfig(TaxonomyGridField.PROVENANCE.getName(), 1, 3)); + + + grid = new EditorGrid(store, classicColumnModel); + grid.setLoadMask(true); + grid.setBorders(true); + grid.setStripeRows(true); + grid.getView().setAutoFill(true); + grid.setClicksToEdit(ClicksToEdit.ONE); + grid.getView().setEmptyText(ConstantsSpeciesDiscovery.NORESULTS); + grid.setSelectionModel(sm); + grid.addPlugin(sm); + grid.getSelectionModel().setSelectionMode(SelectionMode.SIMPLE); + + add(grid, new AnchorData("100% 100%")); + } + + @Override + protected void onShow() { + super.onShow(); + reload(); + } + + public void reload(){ + //grid.getStore().getLoader().load(); + } + + /** + * {@inheritDoc} + */ + @Override + public List getSelectedRows() { + List selectedRows = new LinkedList(); + //FIXME for (ModelData selected: selectionModel.getSelectedItems()) selectedRows.add((ResultRow) selected.get(SpeciesGridFields.ROW.getId())); + return selectedRows; + } + + @Override + public void setBodyStyleAsFiltered(boolean isFiltered) { + + if (this.getElement("body") != null) { + + if (isFiltered) { + this.getElement("body").getStyle().setBorderColor("#32CD32"); + } else + this.getElement("body").getStyle().setBorderColor("#99BBE8"); + + } + } + + public void setOccurencesVisible(boolean b) { + + grid.getColumnModel().setHidden(grid.getColumnModel().getColumnCount()-1, !b); //TODO Temporary + } + + @Override + public ContentPanel getPanel() { + return this; + } + + public void selectAll(){ + sm.selectAll(); + } + + public void deselectAll(){ + sm.deselectAll(); + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/rpc/TaxonomySearchService.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/rpc/TaxonomySearchService.java new file mode 100644 index 0000000..6d06acb --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/rpc/TaxonomySearchService.java @@ -0,0 +1,158 @@ +package org.gcube.portlets.user.speciesdiscovery.client.rpc; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.model.ClassificationModel; +import org.gcube.portlets.user.speciesdiscovery.client.util.GridField; +import org.gcube.portlets.user.speciesdiscovery.shared.CommonName; +import org.gcube.portlets.user.speciesdiscovery.shared.DataSource; +import org.gcube.portlets.user.speciesdiscovery.shared.DataSourceModel; +import org.gcube.portlets.user.speciesdiscovery.shared.DownloadState; +import org.gcube.portlets.user.speciesdiscovery.shared.JobOccurrencesModel; +import org.gcube.portlets.user.speciesdiscovery.shared.JobTaxonomyModel; +import org.gcube.portlets.user.speciesdiscovery.shared.OccurrenceBatch; +import org.gcube.portlets.user.speciesdiscovery.shared.OccurrencesSaveEnum; +import org.gcube.portlets.user.speciesdiscovery.shared.OccurrencesStatus; +import org.gcube.portlets.user.speciesdiscovery.shared.ResultRow; +import org.gcube.portlets.user.speciesdiscovery.shared.SaveFileFormat; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchFilters; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchResult; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchResultType; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchServiceException; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchStatus; +import org.gcube.portlets.user.speciesdiscovery.shared.Taxon; +import org.gcube.portlets.user.speciesdiscovery.shared.TaxonomyRow; +import org.gcube.portlets.user.speciesdiscovery.shared.cluster.ClusterStructuresForResultRow; +import org.gcube.portlets.user.speciesdiscovery.shared.cluster.ClusterStructuresForTaxonomyRow; +import org.gcube.portlets.user.speciesdiscovery.shared.filter.ResultFilter; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +/** + * The client side stub for the RPC service. + */ +@RemoteServiceRelativePath("taxonomy") +public interface TaxonomySearchService extends RemoteService { + + public void searchByScientificName(String searchTerm, + SearchFilters searchFilters) throws SearchServiceException; + + public void searchByCommonName(String searchTerm, + SearchFilters searchFilters) throws SearchServiceException; + + public SearchResultType searchByQuery(String query) + throws SearchServiceException; + + public SearchStatus getSearchStatus(boolean onlySelected, + boolean isActiveFilterOnResult) throws SearchServiceException; + + public void stopSearch() throws SearchServiceException; + + public void updateRowSelection(int rowId, boolean selection) + throws SearchServiceException; + + public Integer updateRowSelections(boolean selection, ResultFilter activeFiltersObject) throws SearchServiceException; + + public int retrieveOccurencesFromSelection() throws SearchServiceException; + + public OccurrenceBatch getOccurrencesBatch(int start, int count) + throws SearchServiceException; + + public void stopRetrievingOccurrences() throws SearchServiceException; + + public String generateMapFromSelectedOccurrencePoints() + throws SearchServiceException; + + // Added by Francesco M. + public void saveSelectedOccurrencePoints(String destinationFolderId, + String fileName, SaveFileFormat fileFormat, + OccurrencesSaveEnum typeCSV) throws SearchServiceException; + + public List loadDataSourceList() throws Exception; + + public HashMap getFilterCounterById(GridField field) + throws Exception; + + public List getParentsList(Taxon taxon) throws Exception; + + public HashMap getFilterCounterForClassification( + String rank) throws Exception; + + public ArrayList loadListCommonNameByRowId(String resultRowId) + throws Exception; + + public int countOfSelectedRow() throws SearchServiceException; + + public SearchResult getSearchResultRows(int start, int limit, + ResultFilter activeFiltersObject, boolean onlySelected) + throws SearchServiceException; + + public SearchResult getSearchTaxonomyRow(int start, int limit, + ResultFilter activeFiltersObject, boolean showOnlySelected) + throws SearchServiceException; + + public ArrayList loadListChildByParentId(String parentId) + throws Exception; + + void saveSelectedTaxonomyPoints(String destinationFolderId, + String fileName, SaveFileFormat fileFormat) + throws SearchServiceException; + + public OccurrencesStatus getCountOfOccurrencesBatch() + throws SearchServiceException; + + public List getListTaxonomyJobs() throws Exception; + + public JobTaxonomyModel createTaxonomyJobByChildren(TaxonomyRow taxonomy, + String dataSourceName) throws Exception; + + public boolean cancelTaxonomyJob(String jobIdentifier) throws Exception; + + public boolean saveTaxonomyJob(String jobIdentifier, + String destinationFolderId, String fileName, String scientificName, + String dataSourceName) throws Exception; + + public List retrieveTaxonomyByIds(List ids) + throws Exception; + + public List retrieveSynonymsByRefId(String refId) + throws Exception; + + public List createOccurrencesJob( + List listJobOccurrenceModel, + SaveFileFormat saveFileFormat, OccurrencesSaveEnum csvType, + boolean isByDataSource, int expectedOccurrence) throws Exception; + + public List getListOccurrencesJob() throws Exception; + + public boolean saveOccurrenceJob(JobOccurrencesModel jobModel, + String destinationFolderId, String fileName, String scientificName, + String dataSourceName) throws Exception; + + public boolean cancelOccurrenceJob(String jobIdentifier) throws Exception; + + public List resubmitOccurrencesJob(String jobIdentifier) + throws Exception; + + public JobTaxonomyModel resubmitTaxonomyJob(String jobIdentifier) + throws Exception; + + public ClusterStructuresForResultRow loadStructuresForResultRowClustering() throws Exception; + + public ClusterStructuresForTaxonomyRow loadStructuresForTaxonomyClustering() + throws Exception; + + public boolean changeStatusOccurrenceJob(String jobIdentifier, DownloadState state) throws Exception; + + public boolean changeStatusTaxonomyJob(String jobIdentifier, DownloadState state) throws Exception; + + + public List loadDataSourceForResultRow(boolean selected, boolean distinct) throws Exception; + + public JobTaxonomyModel createTaxonomyJobByIds(String search, + List dataSources) throws Exception; + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/rpc/TaxonomySearchServiceAsync.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/rpc/TaxonomySearchServiceAsync.java new file mode 100644 index 0000000..53a1c1b --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/rpc/TaxonomySearchServiceAsync.java @@ -0,0 +1,140 @@ +package org.gcube.portlets.user.speciesdiscovery.client.rpc; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.model.ClassificationModel; +import org.gcube.portlets.user.speciesdiscovery.client.util.GridField; +import org.gcube.portlets.user.speciesdiscovery.shared.CommonName; +import org.gcube.portlets.user.speciesdiscovery.shared.DataSource; +import org.gcube.portlets.user.speciesdiscovery.shared.DataSourceModel; +import org.gcube.portlets.user.speciesdiscovery.shared.DownloadState; +import org.gcube.portlets.user.speciesdiscovery.shared.JobOccurrencesModel; +import org.gcube.portlets.user.speciesdiscovery.shared.JobTaxonomyModel; +import org.gcube.portlets.user.speciesdiscovery.shared.OccurrenceBatch; +import org.gcube.portlets.user.speciesdiscovery.shared.OccurrencesSaveEnum; +import org.gcube.portlets.user.speciesdiscovery.shared.OccurrencesStatus; +import org.gcube.portlets.user.speciesdiscovery.shared.ResultRow; +import org.gcube.portlets.user.speciesdiscovery.shared.SaveFileFormat; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchFilters; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchResult; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchResultType; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchStatus; +import org.gcube.portlets.user.speciesdiscovery.shared.Taxon; +import org.gcube.portlets.user.speciesdiscovery.shared.TaxonomyRow; +import org.gcube.portlets.user.speciesdiscovery.shared.cluster.ClusterStructuresForResultRow; +import org.gcube.portlets.user.speciesdiscovery.shared.cluster.ClusterStructuresForTaxonomyRow; +import org.gcube.portlets.user.speciesdiscovery.shared.filter.ResultFilter; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +/** + * The async counterpart of GreetingService. + */ +public interface TaxonomySearchServiceAsync { + + public void searchByScientificName(String searchTerm, SearchFilters searchFilters, AsyncCallback callback); + + public void searchByCommonName(String searchTerm, SearchFilters searchFilters, AsyncCallback callback); + + void getSearchStatus(boolean onlySelected, boolean isActiveFilterOnResult, + AsyncCallback callback); + +// void getSearchStatus(boolean onlySelected, AsyncCallback callback); + + public void stopSearch(AsyncCallback callback); + + public void updateRowSelection(int rowId, boolean selection, AsyncCallback callback); + + public void retrieveOccurencesFromSelection(AsyncCallback callback); + + void getOccurrencesBatch(int start, int count, AsyncCallback callback); + + public void stopRetrievingOccurrences(AsyncCallback callback); + + public void generateMapFromSelectedOccurrencePoints(AsyncCallback callback); + + //Added by Francesco M. + + void saveSelectedOccurrencePoints(String destinationFolderId, String fileName, SaveFileFormat fileFormat, OccurrencesSaveEnum typeCSV, AsyncCallback callback); + + void updateRowSelections(boolean selection, + ResultFilter activeFiltersObject, AsyncCallback callback); + + void loadDataSourceList(AsyncCallback> callback); + + void getFilterCounterById(GridField field, AsyncCallback> callback); + + void getParentsList(Taxon taxon, AsyncCallback> callback); + + void getFilterCounterForClassification(String rank, AsyncCallback> callback); + + void loadListCommonNameByRowId(String resultRowId, AsyncCallback> asyncCallback); + + void countOfSelectedRow(AsyncCallback callback); + + void searchByQuery(String query, AsyncCallback callback); + + void getSearchResultRows(int start, int limit, + ResultFilter activeFiltersObject, + boolean onlySelected, + AsyncCallback> callback); + + public void getSearchTaxonomyRow(int start, int limit, + ResultFilter activeFiltersObject, + boolean showOnlySelected, + AsyncCallback> asyncCallback); + + void loadListChildByParentId(String parentId, AsyncCallback> callback); + + void saveSelectedTaxonomyPoints(String destinationFolderId, String fileName, SaveFileFormat fileFormat, AsyncCallback callback); + + void getCountOfOccurrencesBatch(AsyncCallback callback); + + void getListTaxonomyJobs(AsyncCallback> callback); + + void createTaxonomyJobByChildren(TaxonomyRow taxonomy, String dataSourceName, + AsyncCallback callback); + + void cancelTaxonomyJob(String jobIdentifier, AsyncCallback callback); + + void saveTaxonomyJob(String jobIdentifier, String destinationFolderId, String fileName, String scientificName, String dataSourceName, AsyncCallback callback); + + void retrieveTaxonomyByIds(List ids, AsyncCallback> callback); + + void retrieveSynonymsByRefId(String refId, AsyncCallback> callback); + + void createOccurrencesJob(List listJobOccurrenceModel, SaveFileFormat saveFileFormat, OccurrencesSaveEnum csvType, boolean isByDataSource, int expectedOccurrence, AsyncCallback> callback); + + void getListOccurrencesJob(AsyncCallback> callback); + + void saveOccurrenceJob(JobOccurrencesModel jobModel, + String destinationFolderId, String fileName, String scientificName, + String dataSourceName, AsyncCallback callback); + + void cancelOccurrenceJob(String jobIdentifier, AsyncCallback callback); + + void resubmitTaxonomyJob(String jobIdentifier, + AsyncCallback callback); + + void resubmitOccurrencesJob(String jobIdentifier, AsyncCallback> callback); + + void loadStructuresForResultRowClustering( + AsyncCallback callback); + + void loadStructuresForTaxonomyClustering( + AsyncCallback callback); + + void changeStatusOccurrenceJob(String jobIdentifier, DownloadState state, + AsyncCallback callback); + + void changeStatusTaxonomyJob(String jobIdentifier, DownloadState state, + AsyncCallback callback); + + void loadDataSourceForResultRow(boolean selected, boolean distinct, + AsyncCallback> callback); + + void createTaxonomyJobByIds(String search, List dataSources, AsyncCallback callback); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/ExtendedTimer.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/ExtendedTimer.java new file mode 100644 index 0000000..3d110c3 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/ExtendedTimer.java @@ -0,0 +1,42 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.util; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.core.client.Scheduler.RepeatingCommand; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public abstract class ExtendedTimer { + + protected boolean canceled = false; + + public void cancel() + { + Log.trace("ExtendedTimer CANCEL"); + canceled = true; + } + + public abstract void run(); + + public void scheduleRepeating(int delayMs) + { + canceled = false; + Log.trace("ExtendedTimer scheduleRepeating delayMs: "+delayMs); + Scheduler.get().scheduleFixedDelay(new RepeatingCommand() { + + @Override + public boolean execute() { + Log.trace("ExtendedTimer RUNNING"); + run(); + Log.trace("ExtendedTimer RUN COMPLETE returning "+(!canceled)); + return !canceled; + } + }, delayMs); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/GridField.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/GridField.java new file mode 100644 index 0000000..18ac7e2 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/GridField.java @@ -0,0 +1,16 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.util; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface GridField { + + public String getId(); + public String getName(); + public boolean isSortable(); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/JavascriptInjector.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/JavascriptInjector.java new file mode 100644 index 0000000..0fbf3c8 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/JavascriptInjector.java @@ -0,0 +1,39 @@ +package org.gcube.portlets.user.speciesdiscovery.client.util; + +import com.google.gwt.dom.client.Document; +import com.google.gwt.dom.client.Element; +import com.google.gwt.dom.client.HeadElement; +import com.google.gwt.dom.client.ScriptElement; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class JavascriptInjector { + + private static HeadElement head; + + public static void inject(String javascript) { + HeadElement head = getHead(); + ScriptElement element = createScriptElement(); + element.setText(javascript); + head.appendChild(element); + } + + private static ScriptElement createScriptElement() { + ScriptElement script = Document.get().createScriptElement(); + script.setAttribute("language", "javascript"); + return script; + } + + private static HeadElement getHead() { + if (head == null) { + Element element = Document.get().getElementsByTagName("head").getItem(0); + assert element != null : "HTML Head element required"; + HeadElement head = HeadElement.as(element); + JavascriptInjector.head = head; + } + return JavascriptInjector.head; + } + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/OccurencesGridFields.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/OccurencesGridFields.java new file mode 100644 index 0000000..81b5e50 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/OccurencesGridFields.java @@ -0,0 +1,78 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.util; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public enum OccurencesGridFields implements GridField { + + INSTITUTION_CODE("institutionCode", "InstitutionCode"), + COLLECTION_CODE("collectionCode", "CollectionCode"), + CATALOGUE_NUMBER("catalogueNumber", "CatalogueNumber"), + + //ADDED BY FRANCESCO 30-08 + DATASOURCE("dataSource", "Data Source"), + DATAPROVIDER("dataProvider", "Data Provider"), + DATASET("dataSet","Dataset"), + + AUTHOR("author", "Author"), + CREDITS("credits", "Credits"), +// LSID("lsid", "LSID"), + PROPERTIES("properties", "Properties"), + + RECORDED_BY("recordedBy", "RecordedBy"), + EVENT_DATE("eventDate", "EventDate"), + MODIFIED("modified", "Modified"), + SCIENTIFIC_NAME("scientificName", "ScientificName"), + KINGDOM("kingdom", "Kingdom"), + FAMILY("family", "Family"), + LOCALITY("locality", "Locality"), + COUNTRY("country", "Country"), + CITATION("citation", "Citation"), + DECIMAL_LATITUDE("decimalLatitude", "DecimalLatitude"), + DECIMAL_LONGITUDE("decimalLongitude", "DecimalLongitude"), + COORDINATE_UNCERTAINTY_IN_METERS("coordinateUncertaintyInMeters", "CoordinateUncertaintyInMeters"), + MAX_DEPTH("MaxDepth", "maxDepth"), + MIN_DEPTH("MinDepth", "minDepth"), + BASIS_OF_RECORD("basisOfRecord", "BasisOfRecord"); + + private String id; + private String name; + private boolean sortable; + + /** + * @param id the field id. + * @param name the field name. + */ + private OccurencesGridFields(String id, String name) { + this(id, name, false); + } + + private OccurencesGridFields(String id, String name, boolean sortable) { + this.id = id; + this.name = name; + this.sortable = sortable; + } + + /** + * {@inheritDoc} + */ + public String getId() { + return id; + } + + /** + * {@inheritDoc} + */ + public String getName() { + return name; + } + + @Override + public boolean isSortable() { + return sortable; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/SpeciesDetailsFields.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/SpeciesDetailsFields.java new file mode 100644 index 0000000..8af143f --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/SpeciesDetailsFields.java @@ -0,0 +1,52 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.util; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public enum SpeciesDetailsFields implements GridField { + NAME("PARAMETER_NAME", "Parameter"), + VALUE("PARAMETER_VALUE", "Value"), + GROUP("PARAMETER_GROUP", "Group") + ; + + private String id; + private String name; + private boolean sortable; + + /** + * @param id the field id. + * @param name the field name. + */ + private SpeciesDetailsFields(String id, String name) { + this(id, name, false); + } + + private SpeciesDetailsFields(String id, String name, boolean sortable) { + this.id = id; + this.name = name; + this.sortable = sortable; + } + + /** + * {@inheritDoc} + */ + public String getId() { + return id; + } + + /** + * {@inheritDoc} + */ + public String getName() { + return name; + } + + @Override + public boolean isSortable() { + return sortable; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/SpeciesFilterFields.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/SpeciesFilterFields.java new file mode 100644 index 0000000..c4533ee --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/SpeciesFilterFields.java @@ -0,0 +1,56 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.util; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public enum SpeciesFilterFields implements GridField { + + NAME("name","Name"), + VALUE("value","Value"), + TYPE("type","Type"), + OPERATOR("operator","Operator"), + LABEL("label","Label") + ; + + private String id; + private String name; + private boolean sortable; + + /** + * @param id the field id. + * @param name the field name. + */ + private SpeciesFilterFields(String id, String name) { + this(id, name, false); + } + + private SpeciesFilterFields(String id, String name, boolean sortable) { + this.id = id; + this.name = name; + this.sortable = sortable; + } + + /** + * {@inheritDoc} + */ + public String getId() { + return id; + } + + /** + * {@inheritDoc} + */ + public String getName() { + return name; + } + + @Override + public boolean isSortable() { + return sortable; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/SpeciesGridFields.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/SpeciesGridFields.java new file mode 100644 index 0000000..c847ef1 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/SpeciesGridFields.java @@ -0,0 +1,82 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.util; + + + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public enum SpeciesGridFields implements GridField { + DATASOURCE("datasource", "Data Source"), + DATAPROVIDER("dataprovider", "Data Provider"), + SCIENTIFIC_NAME("scientificName", "Scientific Name"), + DATASET("dataset","Dataset"), + DATASET_CITATION("datasetCitation", "Data Set Citation"), + MATCHING_NAME("matchingName", "Name"), + MATCHING_AUTHOR("accordingTo", "According to"), + MATCHING_RANK("matchingRank", "Rank"), + MATCHING_CREDITS("matchingCredits", "Credits"), + + PRODUCT_IMAGES("productImages", "Images"), + PRODUCT_MAPS("productMaps", "Maps"), + PRODUCT_LAYERS("productLayers", "Layers"), + PRODUCT_OCCURRENCES("productOccurrences", "Occurrences"), + + AUTHOR("author", "Author"), + CREDITS("credits", "Credits"), + LSID("lsid", "LSID"), + PROPERTIES("properties", "Properties"), + + + CLASSIFICATION_STRING("classificationString", "Classification"), + + COMMON_NAMES("commonNames", "Names"), + TAXON("taxon", "Classification"), + PRODUCTS("products", "Products"), + PROVENANCE("provenance", "Provenance"), + IMAGE("image","Image"), + SELECTION("selection","Selection"), + ROW("row","row"), + + UNKNOWN("unknown", "unknown"); + + private String id; + private String name; + private boolean sortable; + + /** + * @param id the field id. + * @param name the field name. + */ + private SpeciesGridFields(String id, String name) { + this(id, name, false); + } + + private SpeciesGridFields(String id, String name, boolean sortable) { + this.id = id; + this.name = name; + this.sortable = sortable; + } + + /** + * {@inheritDoc} + */ + public String getId() { + return id; + } + + /** + * {@inheritDoc} + */ + public String getName() { + return name; + } + + @Override + public boolean isSortable() { + return sortable; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/TaxonomyGridField.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/TaxonomyGridField.java new file mode 100644 index 0000000..ff400a4 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/TaxonomyGridField.java @@ -0,0 +1,82 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.util; + + + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public enum TaxonomyGridField implements GridField { + DATASOURCE("datasource", "Data Source"), + SYNONYMS("synonyms", "Synonyms"), + SCIENTIFIC_NAME("scientificName", "Scientific Name"), + CITATION("citation", "Citation"), +// NAME("name", "Name"), + MATCHING_AUTHOR("accordingTo", "According to"), + + AUTHOR("author", "Author"), + CREDITS("credits", "Credits"), + LSID("lsid", "LSID"), + PROPERTIES("properties", "Properties"), + + MATCHING_RANK("matchingRank", "Rank"), + MATCHING_ACCORDING_TO("matchingCredits", "Credits"), + STATUS_REMARKS("statusRemarks", "Status Remarks"), + + +// PRODUCT_LAYERS("productLayers", "Layers"), +// PRODUCT_OCCURRENCES("productOccurrences", "Occurrences"), + + CLASSIFICATION_STRING("classificationString", "Classification"), + + COMMON_NAMES("commonNames", "Names"), + TAXONOMY("taxonomy", "Classification"), + PRODUCTS("products", "Products"), + PROVENANCE("provenance", "Provenance"), + SELECTION("selection","Selection"), + ROW("row","row"), + STATUSREFNAME("statusRefName", "Status Name"), + STATUSREFID("statusRefId", "Status ID"), + DATEMODIFIED("dateModified", "Date Modified"), + UNKNOWN("unknown", "unknown"); + + private String id; + private String name; + private boolean sortable; + + /** + * @param id the field id. + * @param name the field name. + */ + private TaxonomyGridField(String id, String name) { + this(id, name, false); + } + + private TaxonomyGridField(String id, String name, boolean sortable) { + this.id = id; + this.name = name; + this.sortable = sortable; + } + + /** + * {@inheritDoc} + */ + public String getId() { + return id; + } + + /** + * {@inheritDoc} + */ + public String getName() { + return name; + } + + @Override + public boolean isSortable() { + return sortable; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/Util.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/Util.java new file mode 100644 index 0000000..6987d95 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/Util.java @@ -0,0 +1,52 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.util; + +import org.gcube.portlets.user.speciesdiscovery.shared.SearchResultType; +import org.gcube.portlets.user.speciesdiscovery.shared.SpeciesCapability; + +import com.extjs.gxt.ui.client.widget.grid.ColumnConfig; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class Util { + + protected static final String[] MAIN_TAXONOMIC_RANK = new String[]{"unranked", "domain", "kingdom", "phylum", "division", "class", "order", "family", "genus", "species"}; + + + public static boolean isMainTaxonomicRank(String rank) + { + for (String mainRank:MAIN_TAXONOMIC_RANK) if (mainRank.equalsIgnoreCase(rank)) return true; + return false; + } + + public static ColumnConfig createColumnConfig(GridField field, int width) + { + ColumnConfig columnConfig = new ColumnConfig(field.getId(), field.getName(), width); + columnConfig.setSortable(field.isSortable()); + + return columnConfig; + } + + public static SpeciesCapability getCapabilityFromResultType(SearchResultType resultType) + { + + switch (resultType) { + case SPECIES_PRODUCT: return SpeciesCapability.RESULTITEM; + case OCCURRENCE_POINT: return SpeciesCapability.OCCURRENCESPOINTS; + case TAXONOMY_ITEM: return SpeciesCapability.TAXONOMYITEM; + } + return null; + } + + public static String cleanValue(String value) + { + if (value==null || value.isEmpty()) return ""; + return value; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/DataSource.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/DataSource.java new file mode 100644 index 0000000..e98bb62 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/DataSource.java @@ -0,0 +1,25 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.util.stream; + +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.shared.filter.ResultFilter; + +import com.extjs.gxt.ui.client.data.ModelData; +import com.google.gwt.user.client.rpc.AsyncCallback; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface DataSource { + + public void getStreamState(AsyncCallback callback); + + public void getData(int start, int limit, ResultFilter activeFiltersObject, final AsyncCallback> callback); + + public String getInfo(); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/DataSourceManager.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/DataSourceManager.java new file mode 100644 index 0000000..477135e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/DataSourceManager.java @@ -0,0 +1,108 @@ +package org.gcube.portlets.user.speciesdiscovery.client.util.stream; + +import org.gcube.portlets.user.speciesdiscovery.shared.SpeciesCapability; + +import com.allen_sauer.gwt.log.client.Log; + +public class DataSourceManager { + + private static DataSourceManager instance; + protected boolean onlySelected = false; + protected boolean isActiveFilters = false; + protected int expectedPoints = 0; + + private ResultRowDataSource resulRowDataSource; + private TaxonomyRowDataSource taxonomyRowDataSource; + private OccurrencesDataSource occurrencesDataSource; + + private DataSource activeDataSource = null; + + + private DataSourceManager(){ + + this.resulRowDataSource = new ResultRowDataSource(); + this.taxonomyRowDataSource = new TaxonomyRowDataSource(); + this.occurrencesDataSource = new OccurrencesDataSource(); + + } + + public static synchronized DataSourceManager getInstance() { + if (instance == null) + instance = new DataSourceManager(); + return instance; + } + + public DataSource getDataSourceByResultType(SpeciesCapability resultType){ + + + switch (resultType) { + + case RESULTITEM: + + Log.trace("RESULTITEM "); + resulRowDataSource.setActiveFilterOnResult(isActiveFilters); + resulRowDataSource.setShowOnlySelected(onlySelected); + activeDataSource = resulRowDataSource; + return resulRowDataSource; + + case OCCURRENCESPOINTS: + + Log.trace("OCCURRENCESPOINTS "); + + this.occurrencesDataSource.setCount(expectedPoints); + return occurrencesDataSource; + + case TAXONOMYITEM: + + Log.trace("TAXONOMYITEM "); + + taxonomyRowDataSource.setActiveFilterOnResult(isActiveFilters); + taxonomyRowDataSource.setShowOnlySelected(onlySelected); + activeDataSource = taxonomyRowDataSource; + return taxonomyRowDataSource; + + default: + return null; + } + } + + + public boolean isOnlySelected() { + return onlySelected; + } + + + public void setOnlySelected(boolean onlySelected) { + this.onlySelected = onlySelected; + updateOnlySelectedValue(); + } + + + public boolean isActiveFilters() { + return isActiveFilters; + } + + public void setActiveFilters(boolean isActiveFilters) { + this.isActiveFilters = isActiveFilters; + updateActiveFiltersValue(); + } + + public void setExpectedOccurencePoints(Integer expectedPoints) { + this.expectedPoints = expectedPoints; + updateExpectedPoints(); + } + + private void updateExpectedPoints(){ + this.occurrencesDataSource.setCount(expectedPoints); + } + + private void updateOnlySelectedValue(){ + resulRowDataSource.setShowOnlySelected(onlySelected); + taxonomyRowDataSource.setShowOnlySelected(onlySelected); + } + + private void updateActiveFiltersValue(){ + resulRowDataSource.setActiveFilterOnResult(isActiveFilters); + taxonomyRowDataSource.setActiveFilterOnResult(isActiveFilters); + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/EditListener.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/EditListener.java new file mode 100644 index 0000000..8f003b8 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/EditListener.java @@ -0,0 +1,16 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.util.stream; + +import com.extjs.gxt.ui.client.store.Record; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface EditListener { + + public void onEdit(Record record); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/OccurrencesDataSource.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/OccurrencesDataSource.java new file mode 100644 index 0000000..bc501f7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/OccurrencesDataSource.java @@ -0,0 +1,141 @@ +package org.gcube.portlets.user.speciesdiscovery.client.util.stream; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.SpeciesDiscovery; +import org.gcube.portlets.user.speciesdiscovery.client.util.OccurencesGridFields; +import org.gcube.portlets.user.speciesdiscovery.shared.ItemParameter; +import org.gcube.portlets.user.speciesdiscovery.shared.Occurrence; +import org.gcube.portlets.user.speciesdiscovery.shared.OccurrenceBatch; +import org.gcube.portlets.user.speciesdiscovery.shared.filter.ResultFilter; + +import com.allen_sauer.gwt.log.client.Log; +import com.extjs.gxt.ui.client.data.BaseModelData; +import com.extjs.gxt.ui.client.data.ModelData; +import com.google.gwt.user.client.rpc.AsyncCallback; + +public class OccurrencesDataSource implements DataSource{ + + private int count; + + + @Override + public void getStreamState(AsyncCallback callback) { + callback.onSuccess(new StreamState(count, true, false)); + } + + @Override + public void getData(int start, int limit, ResultFilter activeFiltersObject, final AsyncCallback> callback) { + SpeciesDiscovery.taxonomySearchService.getOccurrencesBatch(start, limit, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + Log.error("Error retrieving occurrences points", "Error retrieving occurrences points, please retry"); + callback.onFailure(caught); + + } + + @Override + public void onSuccess(OccurrenceBatch result) { + + Log.trace("Retrieved Occurrence Batch: "+result); + + if (result.getOccurrences()!=null) { + Log.trace("#Occurrences: "+result.getOccurrences().size()); + + List data = new ArrayList(result.getOccurrences().size()); + for (Occurrence occurence:result.getOccurrences()) { + data.add(convertToData(occurence)); + } + callback.onSuccess(data); + } + } + }); + } + + + protected BaseModelData convertToData(Occurrence occurrence) + { + BaseModelData data = new BaseModelData(); + + String author = ""; + String lsid = ""; + String credits = ""; + + String propertiesHtml = ""; + + if(occurrence.getAuthor()!=null) author = occurrence.getAuthor(); + + if(occurrence.getLsid()!=null) lsid = occurrence.getLsid(); + + if(occurrence.getCredits()!=null) credits = occurrence.getCredits(); + + + if(occurrence.getProperties()!=null){ + + List listProperties = occurrence.getProperties(); + Collections.sort(listProperties, ItemParameter.COMPARATOR); + + propertiesHtml+=""; + + for (ItemParameter itemParameter : listProperties) { + + propertiesHtml+= + "" + + " " + + " " + + ""; + } + + propertiesHtml+="
"+itemParameter.getKey()+""+itemParameter.getValue()+"
"; + } + + data.set(OccurencesGridFields.INSTITUTION_CODE.getId(), occurrence.getInstitutionCode()); + data.set(OccurencesGridFields.COLLECTION_CODE.getId(), occurrence.getCollectionCode()); + data.set(OccurencesGridFields.CATALOGUE_NUMBER.getId(), occurrence.getCatalogueNumber()); + + data.set(OccurencesGridFields.DATASET.getId(), occurrence.getDataSet()); + data.set(OccurencesGridFields.DATAPROVIDER.getId(), occurrence.getDataProvider()); + data.set(OccurencesGridFields.DATASOURCE.getId(), occurrence.getDataSource()); + + + data.set(OccurencesGridFields.AUTHOR.getId(),author); +// data.set(OccurencesGridFields.LSID.getId(), lsid); + data.set(OccurencesGridFields.CREDITS.getId(), credits); + data.set(OccurencesGridFields.PROPERTIES.getId(), propertiesHtml); + + data.set(OccurencesGridFields.RECORDED_BY.getId(), occurrence.getRecordedBy()); + data.set(OccurencesGridFields.EVENT_DATE.getId(), occurrence.getEventDate()); + data.set(OccurencesGridFields.MODIFIED.getId(), occurrence.getModified()); + data.set(OccurencesGridFields.SCIENTIFIC_NAME.getId(), occurrence.getScientificName()); + data.set(OccurencesGridFields.KINGDOM.getId(), occurrence.getKingdom()); + data.set(OccurencesGridFields.FAMILY.getId(), occurrence.getFamily()); + data.set(OccurencesGridFields.LOCALITY.getId(), occurrence.getLocality()); + data.set(OccurencesGridFields.COUNTRY.getId(), occurrence.getCountry()); + data.set(OccurencesGridFields.CITATION.getId(), occurrence.getCitation()); + data.set(OccurencesGridFields.DECIMAL_LATITUDE.getId(), occurrence.getDecimalLatitude()); + data.set(OccurencesGridFields.DECIMAL_LONGITUDE.getId(), occurrence.getDecimalLongitude()); + data.set(OccurencesGridFields.COORDINATE_UNCERTAINTY_IN_METERS.getId(), occurrence.getCoordinateUncertaintyInMeters()); + data.set(OccurencesGridFields.MAX_DEPTH.getId(), occurrence.getMaxDepth()); + data.set(OccurencesGridFields.MIN_DEPTH.getId(), occurrence.getMinDepth()); + data.set(OccurencesGridFields.BASIS_OF_RECORD.getId(), occurrence.getBasisOfRecord()); + + + return data; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + @Override + public String getInfo() { + return "OccurrencesDataSource"; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/ResultRowDataSource.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/ResultRowDataSource.java new file mode 100644 index 0000000..dfa5d21 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/ResultRowDataSource.java @@ -0,0 +1,418 @@ +package org.gcube.portlets.user.speciesdiscovery.client.util.stream; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.gcube.portlets.user.speciesdiscovery.client.SearchController; +import org.gcube.portlets.user.speciesdiscovery.client.SpeciesDiscovery; +import org.gcube.portlets.user.speciesdiscovery.client.event.ActiveMaskLoadingGrid; +import org.gcube.portlets.user.speciesdiscovery.client.gridview.ResultRowResultsPanel; +import org.gcube.portlets.user.speciesdiscovery.client.resources.Resources; +import org.gcube.portlets.user.speciesdiscovery.client.util.SpeciesGridFields; +import org.gcube.portlets.user.speciesdiscovery.client.util.Util; +import org.gcube.portlets.user.speciesdiscovery.shared.CommonName; +import org.gcube.portlets.user.speciesdiscovery.shared.ItemParameter; +import org.gcube.portlets.user.speciesdiscovery.shared.ResultRow; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchResult; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchStatus; +import org.gcube.portlets.user.speciesdiscovery.shared.Taxon; +import org.gcube.portlets.user.speciesdiscovery.shared.filter.ResultFilter; +import org.gcube.portlets.user.speciesdiscovery.shared.util.NormalizeString; + +import com.allen_sauer.gwt.log.client.Log; +import com.extjs.gxt.ui.client.data.BaseModelData; +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.widget.Info; +import com.google.gwt.dom.client.Document; +import com.google.gwt.user.client.rpc.AsyncCallback; + +public class ResultRowDataSource implements DataSource { + + protected boolean showOnlySelected = false; + protected boolean isActiveFilterOnResult = false; + + @Override + public void getStreamState(final AsyncCallback callback) { + + SpeciesDiscovery.taxonomySearchService.getSearchStatus(showOnlySelected, isActiveFilterOnResult, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + Info.display("Error", "An error occurred on retriving search results"); + Log.error("Error retriving get stream state", caught); + callback.onFailure(caught); + } + + @Override + public void onSuccess(SearchStatus result) { + + SearchController.eventBus.fireEvent(new ActiveMaskLoadingGrid(false)); + + if(result!=null) + callback.onSuccess(new StreamState(result.getSize(), result.isResultEOF(), result.isMaxSize())); + else + Log.error("Error retriving search status is null"); + } + }); + } + + + + @Override + public void getData(int start, int limit, ResultFilter activeFiltersObject, final AsyncCallback> callback) { + + SpeciesDiscovery.taxonomySearchService.getSearchResultRows(start, limit, activeFiltersObject, showOnlySelected, new AsyncCallback>() { + + @Override + public void onFailure(Throwable caught) { + Info.display("Error", "An error occurred on retriving search results, retry."); + Log.error("Error retriving search results", caught); + callback.onFailure(caught); +// reset(); +// streamPagingLoader.resetFilters(); + } + + @Override + public void onSuccess(SearchResult result) { + if(result!=null){ + List data = convertData(result.getResults()); + + callback.onSuccess(data); + } + else + Log.error("Error retriving search result is null"); + } + }); + + } + + + protected List convertData(ArrayList rows) + { + + List data = new ArrayList(rows.size()); + for (ResultRow row:rows) + data.add(convertResultRow(row)); + + return data; + } + + //TODO modified + public static String getClassification(List listTaxon) + { + StringBuilder sb = new StringBuilder(); + + for (int i = listTaxon.size()-1; i >= 0; i--) { + Taxon taxon = listTaxon.get(i); + + sb.append(""); + + if(!NormalizeString.isUndefined(taxon.getRank())) + sb.append(taxon.getRank()); + else + sb.append("Rank not found"); + + sb.append(": "); + + if(!NormalizeString.isUndefined(taxon.getName())) + sb.append(taxon.getName()); + else + sb.append("Name not found"); + + if(i!=0) + sb.append(" -> "); + } + return sb.toString(); + } + + protected BaseModelData convertResultRow(ResultRow row) + { + BaseModelData data = new BaseModelData(); + + //Init values + String dataSourceName = ""; + String dataProviderName = ""; + String dataSetName = ""; + String dataSetCitation= ""; + String matchingTaxonName= ""; + String matchingAccordionTo= ""; + String matchingRank= ""; + String matchingCredits= ""; + int imagesCount= 0; + int mapCount= 0; + int layerCount = 0; + int occurencesCount = 0; + String author = ""; + + List listProperties = new ArrayList(); + + //Validate values + if(row.getParents()!=null){ + + if(row.getParents().get(0).getName()!=null) matchingTaxonName = row.getParents().get(0).getName(); + + if(row.getParents().get(0).getAccordingTo()!=null) matchingAccordionTo = row.getParents().get(0).getAccordingTo(); + + if(row.getParents().get(0).getRank()!=null) matchingRank = row.getParents().get(0).getRank(); + + String rankHTML = getRankHtml(row.getParents()); + data.set(SpeciesGridFields.TAXON.getId(), rankHTML); + + String classificationString = getClassification(row.getParents()); + data.set(SpeciesGridFields.CLASSIFICATION_STRING.getId(), classificationString); + + } + + if(row.getDataSourceName()!=null) dataSourceName = row.getDataSourceName(); + if(row.getDataProviderName()!=null) dataProviderName = row.getDataProviderName(); + if(row.getDataSetName()!=null) dataSetName = row.getDataSetName(); + if(row.getDataSetCitation()!=null) dataSetCitation = row.getDataSetCitation(); + if(row.getMatchingCredits()!=null) matchingCredits = row.getMatchingCredits(); + if(row.getImagesCount()!=0) imagesCount = row.getImagesCount(); + if(row.getMapsCount()!=0) mapCount = row.getMapsCount(); + if(row.getLayersCount()!=0) layerCount = row.getLayersCount(); + if(row.getOccurencesCount()!=0) occurencesCount = row.getOccurencesCount(); + if(row.getAuthor()!=null) author = row.getAuthor(); + + if(row.getProperties()!=null) listProperties = row.getProperties(); + + + data.set(SpeciesGridFields.SELECTION.getId(), row.isSelected()); + data.set(SpeciesGridFields.DATASOURCE.getId(), dataSourceName); + data.set(SpeciesGridFields.DATAPROVIDER.getId(), dataProviderName); + data.set(SpeciesGridFields.DATASET.getId(), dataSetName); + data.set(SpeciesGridFields.DATASET_CITATION.getId(), dataSetCitation); + + + data.set(SpeciesGridFields.MATCHING_NAME.getId(), matchingTaxonName); + data.set(SpeciesGridFields.MATCHING_AUTHOR.getId(), matchingAccordionTo); + data.set(SpeciesGridFields.MATCHING_RANK.getId(), matchingRank); + + data.set(SpeciesGridFields.MATCHING_CREDITS.getId(),matchingCredits); + data.set(SpeciesGridFields.PROPERTIES.getId(),listProperties); + data.set(SpeciesGridFields.AUTHOR.getId(), author); + + List listCommonName = new ArrayList(); + + if(row.getCommonNames()!=null){ + listCommonName = row.getCommonNames(); + } + + String commonNames = getCommonNamesHTML(matchingTaxonName, matchingAccordionTo, matchingCredits, listCommonName); + data.set(SpeciesGridFields.COMMON_NAMES.getId(), commonNames); + +// if(row.existsCommonName()) +// eventBus.fireEvent(new SetCommonNamesEvent(data)); + + data.set(SpeciesGridFields.PRODUCT_IMAGES.getId(), imagesCount); + data.set(SpeciesGridFields.PRODUCT_MAPS.getId(), mapCount); + data.set(SpeciesGridFields.PRODUCT_LAYERS.getId(), layerCount); + data.set(SpeciesGridFields.PRODUCT_OCCURRENCES.getId(), occurencesCount); + + String provenance = getProvenanceHTML(dataSourceName, dataProviderName, dataSetName, dataSetCitation); + data.set(SpeciesGridFields.PROVENANCE.getId(), provenance); + + String products = getProdutcsHTML(imagesCount, mapCount, layerCount, occurencesCount); + data.set(SpeciesGridFields.PRODUCTS.getId(), products); + + data.set(SpeciesGridFields.ROW.getId(), row); + + Log.info("Result row on client id: "+row.getId() + " service id: " +row.getServiceId()); + + return data; + } + + + protected String getRankHtml(List listTaxon) + { + String id = Document.get().createUniqueId(); + StringBuilder html = new StringBuilder("


"); + int offset = html.length(); + html.append(""); + boolean addToggler = false; + + for (Taxon taxon : listTaxon) { + if (!Util.isMainTaxonomicRank(taxon.getRank())) { + html.append(""); + } + html.append("
"); + addToggler = true; + } else html.append("
"); + + + if(!NormalizeString.isUndefined(taxon.getRank())) + html.append(taxon.getRank()); + else + html.append("Rank not found"); + + html.append(":{"); + + if(!NormalizeString.isUndefined(taxon.getName())) + html.append(taxon.getName()); + else + html.append("Name not found"); + +// html.append(taxon.getRank()); +// html.append(":{"); +// html.append(taxon.getName()); + html.append("}
"); + + + if (addToggler) { + StringBuilder toggler = new StringBuilder(); + + String idImgExpand = Document.get().createUniqueId(); + String idImgCollapse = Document.get().createUniqueId(); + + toggler.append(""); + + + toggler.append(""); + + toggler.append(""); + + toggler.append(""); + + + html.insert(offset, toggler.toString()); + } else { + html.insert(offset, "

"); + html.append("
"); + } + html.append("

"); + + return html.toString(); + } + + protected String getCommonNamesHTML(String scientificName, String author, String credits, List commonNames) + { + StringBuilder html = new StringBuilder("

"); + + html.append(scientificName); + html.append("

"); + + if (commonNames.size()>0) html.append("aka : "); + + html.append(""); + + Set insertedLanguages = new HashSet(); + + for (CommonName commonName:commonNames) { + if (insertedLanguages.contains(commonName.getLanguage())) continue; + else insertedLanguages.add(commonName.getLanguage()); + + html.append(""); + } + + html.append(""); + html.append(""); + html.append(""); + html.append("
"); + html.append(commonName.getLanguage()); + html.append(":"); + html.append(commonName.getName()); + html.append("
Inserted by: "); + html.append(author); + html.append("
Credits: "); + html.append(credits); + html.append("
"); + + html.append("

"); + + return html.toString(); + } + + protected String getProvenanceHTML(String datasource, String dataprovider, String dataset, String datasetCitation) + { + StringBuilder html = new StringBuilder("


"); + + html.append(""); + + html.append(""); + + html.append(""); + + html.append(""); + + html.append("
Data Source:"); + html.append(datasource); + html.append("
Data Provider:"); + html.append(dataprovider); + html.append("
Data Set:"); + html.append(dataset); + html.append("
Citation:"); + html.append(datasetCitation); + html.append("

"); + + return html.toString(); + } + + protected String getProdutcsHTML(int imagesCount, int mapCounts, int layersCount, int occurencesCount) + { + StringBuilder html = new StringBuilder("


"); + html.append(""); + + html.append("
"); + html.append(SpeciesGridFields.PRODUCT_OCCURRENCES.getName()); + html.append(":"); + html.append(occurencesCount); + html.append("

"); + + return html.toString(); + } + + + + public boolean isShowOnlySelected() { + return showOnlySelected; + } + + + + public void setShowOnlySelected(boolean showOnlySelected) { + this.showOnlySelected = showOnlySelected; + } + + + + public boolean isActiveFilterOnResult() { + return isActiveFilterOnResult; + } + + + + public void setActiveFilterOnResult(boolean isActiveFilterOnResult) { + this.isActiveFilterOnResult = isActiveFilterOnResult; + } + + + + @Override + public String getInfo() { + return "ResultRowDataSource"; + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/StreamPagingLoader.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/StreamPagingLoader.java new file mode 100644 index 0000000..38a24ec --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/StreamPagingLoader.java @@ -0,0 +1,666 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.util.stream; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.util.ExtendedTimer; +import org.gcube.portlets.user.speciesdiscovery.shared.filter.ResultFilter; + +import com.allen_sauer.gwt.log.client.Log; +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.store.ListStore; +import com.extjs.gxt.ui.client.store.Record; +import com.extjs.gxt.ui.client.store.Record.RecordUpdate; +import com.extjs.gxt.ui.client.store.Store; +import com.extjs.gxt.ui.client.store.StoreEvent; +import com.extjs.gxt.ui.client.store.StoreListener; +import com.google.gwt.user.client.Timer; +import com.google.gwt.user.client.rpc.AsyncCallback; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" - "Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it" + * + */ +public class StreamPagingLoader { + + protected static final int STREAM_STATUS_POLL_DELAY = 2000; + protected static final int STREAM_FILL_POLL_DELAY = 1000; + + protected ListStore store; + protected EditListener editListener; + protected DataSource dataSource; + protected List listeners; + protected int pageSize; + + protected int currentPage; + protected int currentStartItem; + protected int currentEndItem; + protected int streamSize; + protected boolean streamComplete = false; + + protected boolean isFilteredStream = false; + private int limitOnDataFilter = 0; + + protected Timer streamSizePoller; + protected ExtendedTimer storeFiller; + + protected boolean pageComplete = false; + + private ResultFilter activeFilterObject = null; + + private int itemsLoaded = 0; + private boolean reloadWithoutFilter; + private int start = 0; + private int oldStartItem = 0; + private int oldLimit = 0; + private int limit = 0; + private boolean isNewPage = true; + + private boolean isOccurrences = false; + + /** + * @param pageSize + */ + public StreamPagingLoader(int pageSize) { + this.pageSize = pageSize; + listeners = new ArrayList(1); + initialize(); + } + + + /** + * @param editListener the editListener to set + */ + public void setEditListener(EditListener editListener) { + this.editListener = editListener; + } + + public void addListener(StreamPagingLoaderListener listener) + { + listeners.add(listener); + } + + protected void initialize() + { + store = new ListStore(); + store.addStoreListener(new StoreListener(){ + + /** + * {@inheritDoc} + */ + @Override + public void storeUpdate(StoreEvent se) { + Log.trace("storeUpdate: "+se.getOperation()); + if (editListener!=null && se.getOperation()==RecordUpdate.EDIT) { + final Record record = se.getRecord(); + editListener.onEdit(record); + } + } + }); + + streamSizePoller = new Timer() { + + @Override + public void run() { + pollStreamState(); + } + }; + + storeFiller = new ExtendedTimer() { + + @Override + public void run() { + fillPage(); + } + }; + + } + + /** + * @return the pageSize + */ + public int getPageSize() { + return pageSize; + } + + /** + * @return the currentPage + */ + public int getCurrentPage() { + return currentPage; + } + + public void reset() + { + currentPage = 0; + currentStartItem = 0; + + start = 0; + oldStartItem = 0; + oldLimit = 0; + limit = 0; + isNewPage = false; + isOccurrences = false; + + currentEndItem = 0; + streamComplete = false; + streamSizePoller.cancel(); + storeFiller.cancel(); + pageComplete = false; + itemsLoaded = 0; + +// streamSizePoller.cancel(); + } + + public void startLoading(boolean isOccurrences) + { + + isFilteredStream = false; + limitOnDataFilter = 0; + + this.isOccurrences = isOccurrences; + + Log.trace("start loading set is occurrences " + isOccurrences); + + fireStreamStartLoading(); + + //we anticipate the first polling + pollStreamState(); +// streamSizePoller.scheduleRepeating(STREAM_STATUS_POLL_DELAY); + streamSizePollerStart(); + nextPage(); + } + + + public void streamSizePollerStart(){ + streamSizePoller.scheduleRepeating(STREAM_STATUS_POLL_DELAY); + } + + public ListStore getStore() + { + return store; + } + + public void pollStreamState() + { + + dataSource.getStreamState(new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + Log.error("Failed getting stream state", caught.getMessage()); + //TODO retry policy + reset(); + resetFilters(); + } + + @Override + public void onSuccess(StreamState result) { +// Log.error("+++++++++++++++++++++++++stream state completed " + result.isComplete()); + itemsLoaded = result.getSize(); + setStreamState(result); + if (streamComplete) + streamComplete(); + } + }); + } + + protected void setPageComplete(boolean bool){ + pageComplete = bool; + } + + + protected boolean getPageCompleted(){ + return this.pageComplete; + } + + protected void setStreamState(StreamState state) + { + Log.trace("setStreamState state: "+state); + + //if isBufferFull = true, the MAXIMUM ELEMENTS are reached +// if(state.isBufferFull()) +// Log.error("+++++++++++++++++++++++++MAX_BUFFERING_ELEMENTS is reached"); +// Log.error("+++++++setStreamState ++++++++++++state.getSize(): "+ state.getSize()); + + streamSize = state.getSize(); + streamComplete = state.isComplete(); + fireStreamUpdate(); + } + + protected void streamComplete() + { + streamSizePoller.cancel(); + fireStreamLoadingComplete(); + } + + public void setPage(int page) + { + int maxPage = (streamSize/pageSize)+1; + currentPage = Math.min(page, maxPage); + currentPage = Math.max(currentPage, 1); + setIsNewPage(true); + startFilling(); + } + + public void nextPage() + { + currentPage++; + setPageComplete(false); + setIsNewPage(true); + startFilling(); + } + + public void prevPage() + { + currentPage--; + setPageComplete(false); + setIsNewPage(true); + startFilling(); + } + + public void reloadPageForFiltering(int limitFilter, boolean isFirstStart){ + +// int start; +// int limit; + + isFilteredStream = true; + + if(limitFilter!=-1) + this.limitOnDataFilter = limitFilter; + + + if(isFirstStart){ + reset(); + currentPage = 1; + setIsNewPage(true); + } + + currentStartItem = (currentPage-1)*pageSize; + if(currentStartItem<0) currentStartItem = 0; + + + if(limit>0){ + oldStartItem = start; + oldLimit = limit; + } + + start = currentStartItem; + limit = Math.min(limitOnDataFilter-currentStartItem, pageSize); + +// limit = Math.min(pageSize, limitOnDataFilter-store.getCount()); + + Log.trace(" OLD START: "+oldStartItem + + " OLD LIMIT: "+oldLimit + + " START: " +start + + " LIMIT: " + limit + + " LIMIT ON DATA: " + limitOnDataFilter); + + //EXIT IF START ITEM NOT CHANGE + if(oldStartItem==start && !isNewPage() && limit>=oldLimit && !isOccurrences) { + Log.trace("NOT FILL PAGE - CONDITION oldStartItem==start is true, check page complete"); + if (pageComplete) pageComplete(); + } + + else{ + + if(limit>0) + setIsNewPage(false); + + Log.trace("reloadPageForFiltering startFilling " + + " currentPage: " +currentPage+ + " currentStartItem: "+currentStartItem + + " pageSize: " + pageSize + + // " activeFilterObject: " + activeFilterObject + + " limitOnDataFilter: " + limitOnDataFilter); + + + store.removeAll(); + + Log.trace("Firing BeforeDataChanged"); + store.fireEvent(Store.BeforeDataChanged, new StoreEvent(store)); + Log.trace("Fired BeforeDataChanged"); + + Log.trace("reloadPageForFiltering fillPage start: "+start+" limit: "+limit); + + if (limit >= 0) { + final long startTime = System.currentTimeMillis(); + + dataSource.getData(start, limit, activeFilterObject, new AsyncCallback>() { + + @Override + public void onFailure(Throwable caught) { + Log.error("Failed loading results", caught.getMessage()); +// Log.error("Failed loading results"); +// System.out.println("Failed loading results" + caught.getMessage()); + reset(); + resetFilters(); + } + + @Override + public void onSuccess(List result) { + Log.trace("dataLoaded "+result.size()+" in "+(System.currentTimeMillis()-startTime)); + + if(!exceedPage(result.size())){ + loadData(result); + pollStreamState(); + } + else{ + setPageComplete(true); + pageComplete(); + } + // checkPageComplete(); + } + }); + } else { + Log.trace("There is no data to download, skipping"); + } + + } + + + } + + public void resetFilters(){ + setActiveFilterObject(null); + isFilteredStream = false; + } + + + public void reloadPageWithoutFiltering(){ + + reset(); + resetFilters(); + + reloadWithoutFilter = true; + + currentStartItem = (currentPage-1)*pageSize; + if(currentStartItem<0) currentStartItem = 0; + + Log.trace("reloadPageWithoutFiltering" + + " currentPage: " +currentPage+ + " currentStartItem: "+currentStartItem + + " pageSize: " + pageSize + + " streamSize: " + streamSize + + " store.getCount(): " + store.getCount()); + +// store.removeAll(); + Log.trace("Firing BeforeDataChanged"); + store.fireEvent(Store.BeforeDataChanged, new StoreEvent(store)); + Log.trace("Fired BeforeDataChanged"); + + pollingState(); + + setPage(0); + + } + + public void pollingState(){ + + if(!streamComplete) + streamSizePoller.scheduleRepeating(STREAM_STATUS_POLL_DELAY); + else + pollStreamState(); + + } + + protected void startFilling() + { + + if(!isFilteredStream){ + currentStartItem = (currentPage-1)*pageSize; + Log.trace("startFilling currentPage: "+currentPage+ " currentStartItem: "+currentStartItem); + + store.removeAll(); + Log.trace("Firing BeforeDataChanged"); + store.fireEvent(Store.BeforeDataChanged, new StoreEvent(store)); + Log.trace("Fired BeforeDataChanged"); + + //we anticipate the filling + fillPage(); + storeFiller.scheduleRepeating(STREAM_FILL_POLL_DELAY); + } + else + reloadPageForFiltering(-1, false); + } + + + protected void fillPage() + { + + /* oldLimit = limit; + + limit = Math.min(pageSize-store.getCount(), streamSize-start); + + if(limit>0) + oldStartItem = start; + + start = currentStartItem + store.getCount(); + */ + + if(limit>0){ + oldStartItem = start; + oldLimit = limit; + } + + start = currentStartItem + store.getCount(); + limit = Math.min(pageSize-store.getCount(), streamSize-start); + + Log.trace(" OLD START: "+oldStartItem + + " OLD LIMIT: "+oldLimit + + " START: " +start + + " LIMIT: " + limit + + " IS NEW PAGE: " +isNewPage()); + + +// //EXIT IF START ITEM NOT CHANGE +// if(oldStartItem==start && start!=(currentPage-1)*pageSize && limit>=oldLimit && limit<0) { +// Log.trace("NOT FILL PAGE - CONDITION oldStartItem==start is true, check page complete"); +// if (pageComplete) pageComplete(); +// } + + //EXIT IF START ITEM NOT CHANGE + if(oldStartItem==start && !isNewPage() && limit>=oldLimit && !isOccurrences) { + Log.trace("NOT FILL PAGE - CONDITION oldStartItem==start is true, check page complete"); + if (pageComplete) pageComplete(); +// checkPageComplete(); + } + else{ + + Log.trace("fillPage" + + " currentPage: " +currentPage+ + " currentStartItem: "+currentStartItem + + " pageSize: " + pageSize + + " streamSize: " + streamSize + + " store.getCount(): " + store.getCount()); + + Log.trace("fillPage start: "+start+" limit: "+limit); + + if(limit>0) + setIsNewPage(false); + + if (limit >= 0) { + + final long startTime = System.currentTimeMillis(); + + dataSource.getData(start, limit, activeFilterObject, new AsyncCallback>() { + + @Override + public void onFailure(Throwable caught) { + Log.error("Failed loading results", caught); + //TODO retry policy + reset(); + resetFilters(); + } + + @Override + public void onSuccess(List result) { + Log.trace("dataLoaded "+result.size()+" in "+(System.currentTimeMillis()-startTime)); + + if(!exceedPage(result.size())) + loadData(result); + else{ + setPageComplete(true); + pageComplete(); + } + // checkPageComplete(); + } + }); + } else { + + Log.trace("Limit is < 0 - there is no data to download, skipping"); + checkPageComplete(); + } + } + } + + + public boolean exceedPage(int storeSize){ + + boolean cond; + int currentEnd = store.getCount() + storeSize; + + if (streamComplete) { + int expectedPageSize = Math.min(pageSize, streamSize-currentStartItem); + int calc = ((currentPage-1)*pageSize)+(streamSize-currentStartItem); + int expectedEndElements = Math.min(currentPage*pageSize, calc); + + Log.trace("Exceed Page - stream completed: true "); + Log.trace("expectedPageSize: "+expectedPageSize); + Log.trace("expectedEndElements: "+expectedEndElements); + Log.trace("currentEnd: "+currentEnd); + Log.trace(" store.getCount(): "+ store.getCount()); + Log.trace(" streamSize: "+ streamSize); +// cond = (store.getCount() >= expectedPageSize) || (currentEndItem > expectedEndElements); + cond = currentEnd > expectedEndElements; + } + else{ + cond = currentEnd > (currentPage*pageSize); + } + + Log.trace("Exceed Page cond: "+cond +" pageSize: " + pageSize + " currentEnd: " + currentEnd); + + return cond; + + } + + protected void loadData(List data) + { + int prevStoreCount = store.getCount(); + + for (ModelData row:data) store.add(row); + + if (prevStoreCount == 0 && data.size()>0) store.fireEvent(Store.DataChanged, new StoreEvent(store)); + + checkPageComplete(); + } + + protected void checkPageComplete() + { + updateCurrentValues(); + +// pageComplete = isPageComplete(); +// if (pageComplete) pageComplete(); + +// setPageComplete(isPageComplete()); +// if (pageComplete) pageComplete(); + + if(!pageComplete){ + setPageComplete(isPageComplete()); + } + + if (pageComplete) pageComplete(); + + + } + + protected void pageComplete() + { + Log.trace("page complete"); + store.fireEvent(Store.DataChanged, new StoreEvent(store)); + storeFiller.cancel(); + } + + protected void updateCurrentValues() + { + currentEndItem = currentStartItem + store.getCount(); + Log.trace("updateCurrentValues currentPage: "+currentPage+" currentStartItem: "+currentStartItem+" currentEndItem: "+currentEndItem); + fireStreamUpdate(); + } + + protected boolean isPageComplete() + { + Log.trace("checking if the page is complete loaded (store count: "+store.getCount()+")"); + Log.trace("streamComplete: "+streamComplete); + + boolean cond; + + //no more data is expected from the stream + if (streamComplete) { + + int expectedPageSize = Math.min(pageSize, streamSize-currentStartItem); + + return store.getCount() == expectedPageSize; + } + + cond = store.getCount() == pageSize; +// Log.error("++++++isPageComplete: "+cond +" ++++++++++++ pageSize " + pageSize + " store.getCount() "+store.getCount()); + + return cond; + } + + protected void fireStreamUpdate() + { + for (StreamPagingLoaderListener listener:listeners) listener.onStreamUpdate(streamSize, currentStartItem, currentEndItem); + } + + protected void fireStreamLoadingComplete() + { + for (StreamPagingLoaderListener listener:listeners) listener.onStreamLoadingComplete(); + } + + protected void fireStreamStartLoading() + { + for (StreamPagingLoaderListener listener:listeners) listener.onStreamStartLoading(); + } + + public ResultFilter getActiveFilterObject() { + return activeFilterObject; + } + + public void setActiveFilterObject(ResultFilter activeFilterObject) { + this.activeFilterObject = activeFilterObject; + } + + public boolean isStreamComplete() { + return streamComplete; + } + + public void setDataSource(DataSource dataSource) { + this.dataSource = dataSource; + } + + + public int getStart() { + return start; + } + + + public void setStart(int start) { + this.start = start; + } + + + public boolean isNewPage() { + return isNewPage; + } + + + public void setIsNewPage(boolean isNewPage) { + this.isNewPage = isNewPage; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/StreamPagingLoaderListener.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/StreamPagingLoaderListener.java new file mode 100644 index 0000000..27a08a6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/StreamPagingLoaderListener.java @@ -0,0 +1,16 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.util.stream; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface StreamPagingLoaderListener { + + public void onStreamStartLoading(); + public void onStreamUpdate(int streamSize, int currentStartItem, int currentEndItem); + public void onStreamLoadingComplete(); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/StreamPagingToolBar.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/StreamPagingToolBar.java new file mode 100644 index 0000000..c2a3be0 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/StreamPagingToolBar.java @@ -0,0 +1,246 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.util.stream; + +import com.extjs.gxt.ui.client.GXT; +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.event.ButtonEvent; +import com.extjs.gxt.ui.client.event.ComponentEvent; +import com.extjs.gxt.ui.client.event.Events; +import com.extjs.gxt.ui.client.event.Listener; +import com.extjs.gxt.ui.client.event.SelectionListener; +import com.extjs.gxt.ui.client.store.StoreEvent; +import com.extjs.gxt.ui.client.store.StoreListener; +import com.extjs.gxt.ui.client.util.Format; +import com.extjs.gxt.ui.client.util.IconHelper; +import com.extjs.gxt.ui.client.widget.Component; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem; +import com.extjs.gxt.ui.client.widget.toolbar.LabelToolItem; +import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem; +import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; +import com.google.gwt.user.client.ui.AbstractImagePrototype; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class StreamPagingToolBar extends ToolBar { + + protected static final String DISPLAY_TEXT_COUNTING = "Displaying {0} - {1} of {2} and counting..."; + protected static final String DISPLAY_TEXT = "Displaying {0} - {1} of {2}"; + protected static final String PAGE_TEXT = "Page {0} of {1}"; + + protected Button prev, next; + protected LabelToolItem pageText, displayText; + + protected AbstractImagePrototype prevImage = GXT.isHighContrastMode? IconHelper.create("gxt/themes/access/images/grid/page-prev.gif") : GXT.IMAGES.paging_toolbar_prev(); + protected AbstractImagePrototype prevImageDisabled = GXT.IMAGES.paging_toolbar_prev_disabled(); + + protected AbstractImagePrototype nextImage = GXT.isHighContrastMode ? IconHelper.create("gxt/themes/access/images/grid/page-next.gif") : GXT.IMAGES.paging_toolbar_next(); + protected AbstractImagePrototype nextImageDisabled = GXT.IMAGES.paging_toolbar_next_disabled(); + + protected String nextText = GXT.MESSAGES.pagingToolBar_nextText(); + protected String prevText = GXT.MESSAGES.pagingToolBar_prevText(); + + protected int currentPage = 0; + protected int numPages = 0; + + protected boolean counting = false; + protected int currentStartItem = 0; + protected int currentEndItem = 0; + protected int numItems = 0; + + protected int pageSize; + + protected StreamPagingLoader loader; + + protected Listener componentListener = new Listener() { + + public void handleEvent(ComponentEvent be) { + Component c = be.getComponent(); + if (be.getType() == Events.Disable) { + if (c == prev) { + prev.setIcon(prevImageDisabled); + } else if (c == next) { + next.setIcon(nextImageDisabled); + } + } else { + if (c == prev) { + prev.setIcon(prevImage); + } else if (c == next) { + next.setIcon(prevImageDisabled); + } + } + } + }; + + public StreamPagingToolBar() + { + init(); + update(); + } + + public void bind(StreamPagingLoader loader) + { + this.loader = loader; + this.pageSize = loader.getPageSize(); + loader.addListener(new StreamPagingLoaderListener() { + + @Override + public void onStreamUpdate(int streamSize, int currentStartItem, int currentEndItem) { + setStreamSize(streamSize); + setCurrent(currentStartItem, currentEndItem); + } + + @Override + public void onStreamLoadingComplete() { + setStreamLoadingComplete(false); + } + + @Override + public void onStreamStartLoading() { + reset(); + } + }); + loader.getStore().addStoreListener(new StoreListener(){ + + /** + * {@inheritDoc} + */ + @Override + public void storeBeforeDataChanged(StoreEvent se) { + beforeDataChange(); + } + + }); + } + + public void reset() + { + currentPage = 0; + numPages = 0; + counting = true; + currentStartItem = 0; + currentEndItem = 0; + numItems = 0; + update(); + } + + protected void beforeDataChange() + { + prev.setEnabled(false); + next.setEnabled(false); + } + + public void setStreamSize(int count) + { + numItems = count; + update(); + } + + /** + * @param counting the counting to set + */ + public void setStreamLoadingComplete(boolean counting) { + this.counting = counting; + update(); + } + + public void setCurrent(int currentStartItem, int currentEndItem) + { + this.currentStartItem = currentStartItem; + this.currentEndItem = currentEndItem; + update(); + } + + protected void init() + { + prev = new Button(); + prev.setToolTip(prevText); + prev.addListener(Events.Disable, componentListener); + prev.addListener(Events.Enable, componentListener); + prev.addSelectionListener(new SelectionListener() { + public void componentSelected(ButtonEvent ce) { + previous(); + } + }); + add(prev); + + add(new SeparatorToolItem()); + + pageText = new LabelToolItem(); + pageText.setStyleName("my-paging-text"); + add(pageText); + + add(new SeparatorToolItem()); + + next = new Button(); + next.setToolTip(nextText); + next.addListener(Events.Disable, componentListener); + next.addListener(Events.Enable, componentListener); + next.addSelectionListener(new SelectionListener() { + public void componentSelected(ButtonEvent ce) { + next(); + } + }); + add(next); + + add(new FillToolItem()); + + displayText = new LabelToolItem(); + displayText.setId(getId() + "-display"); + displayText.setStyleName("my-paging-display"); + + add(displayText); + } + + protected void update() + { + updateSizes(); + updateButtons(); + updateImages(); + updateText(); + } + + protected void updateSizes() + { + currentPage = (int) Math.ceil((double) (currentStartItem + pageSize) / pageSize); + numPages = numItems < pageSize ? 1 : (int) Math.ceil((double) numItems / pageSize); + } + + protected void updateButtons() + { + next.setEnabled(currentPage != numPages); + prev.setEnabled((currentPage != 1) && (currentPage != 0)); //TODO Modified by Francesco + } + + protected void updateImages() { + + prev.setIcon(prev.isEnabled() ? prevImage : prevImageDisabled); + next.setIcon(next.isEnabled() ? nextImage : nextImageDisabled); + } + + protected void updateText() + { + Object[] params = new Object[]{currentPage, numPages}; + String page = Format.substitute(PAGE_TEXT, params); + pageText.setLabel(page); + + params = new Object[]{currentStartItem, currentEndItem, numItems}; + String display = Format.substitute(counting?DISPLAY_TEXT_COUNTING:DISPLAY_TEXT, params); + displayText.setLabel(display); + } + + protected void previous() + { + if (loader!=null) loader.prevPage(); + } + + protected void next() + { + if (loader!=null) loader.nextPage(); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/StreamState.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/StreamState.java new file mode 100644 index 0000000..ddae2c0 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/StreamState.java @@ -0,0 +1,59 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.client.util.stream; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class StreamState { + + protected int size; + protected boolean complete; + private boolean isBufferFull; + + /** + * @param size + * @param complete + * @param isMaxSize + */ + public StreamState(int size, boolean complete, boolean isBufferFull) { + this.size = size; + this.complete = complete; + this.isBufferFull = isBufferFull; + } + + /** + * @return the size + */ + public int getSize() { + return size; + } + + /** + * @return the complete + */ + public boolean isComplete() { + return complete; + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("StreamState [size="); + builder.append(size); + builder.append(", complete="); + builder.append(complete); + builder.append("]"); + return builder.toString(); + } + + public boolean isBufferFull() { + return isBufferFull; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/TaxonomyRowDataSource.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/TaxonomyRowDataSource.java new file mode 100644 index 0000000..c39d010 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/util/stream/TaxonomyRowDataSource.java @@ -0,0 +1,342 @@ +package org.gcube.portlets.user.speciesdiscovery.client.util.stream; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.SearchController; +import org.gcube.portlets.user.speciesdiscovery.client.SpeciesDiscovery; +import org.gcube.portlets.user.speciesdiscovery.client.event.ActiveMaskLoadingGrid; +import org.gcube.portlets.user.speciesdiscovery.client.gridview.ResultRowResultsPanel; +import org.gcube.portlets.user.speciesdiscovery.client.resources.Resources; +import org.gcube.portlets.user.speciesdiscovery.client.util.SpeciesGridFields; +import org.gcube.portlets.user.speciesdiscovery.client.util.TaxonomyGridField; +import org.gcube.portlets.user.speciesdiscovery.client.util.Util; +import org.gcube.portlets.user.speciesdiscovery.shared.ItemParameter; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchResult; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchStatus; +import org.gcube.portlets.user.speciesdiscovery.shared.TaxonomyRow; +import org.gcube.portlets.user.speciesdiscovery.shared.filter.ResultFilter; +import org.gcube.portlets.user.speciesdiscovery.shared.util.NormalizeString; + +import com.allen_sauer.gwt.log.client.Log; +import com.extjs.gxt.ui.client.data.BaseModelData; +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.widget.Info; +import com.google.gwt.dom.client.Document; +import com.google.gwt.user.client.rpc.AsyncCallback; + +public class TaxonomyRowDataSource implements DataSource { + + protected boolean showOnlySelected = false; + protected boolean isActiveFilterOnResult = false; + + @Override + public void getStreamState(final AsyncCallback callback) { + + SpeciesDiscovery.taxonomySearchService.getSearchStatus(showOnlySelected, isActiveFilterOnResult, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + Info.display("Error", "An error occurred on retriving search results"); + Log.error("Error retriving get stream state", caught); + callback.onFailure(caught); + } + + @Override + public void onSuccess(SearchStatus result) { + + SearchController.eventBus.fireEvent(new ActiveMaskLoadingGrid(false)); + + if(result!=null) + callback.onSuccess(new StreamState(result.getSize(), result.isResultEOF(), result.isMaxSize())); + else + Log.error("Error retriving search status is null"); + } + }); + } + + + + @Override + public void getData(int start, int limit, ResultFilter activeFiltersObject, final AsyncCallback> callback) { + + SpeciesDiscovery.taxonomySearchService.getSearchTaxonomyRow(start, limit, activeFiltersObject, showOnlySelected, new AsyncCallback>() { + + @Override + public void onFailure(Throwable caught) { + Info.display("Error", "An error occurred on retriving search results, retry."); + Log.error("Error retriving search results", caught); + callback.onFailure(caught); +// reset(); +// streamPagingLoader.resetFilters(); + } + + @Override + public void onSuccess(SearchResult result) { + if(result!=null){ + List data = convertData(result.getResults()); + callback.onSuccess(data); + } + else + Log.error("Error retriving search result is null"); + } + }); + + } + + + protected List convertData(ArrayList rows) + { + List data = new ArrayList(rows.size()); + for (TaxonomyRow row:rows) + data.add(convertTaxonomyRow(row)); + + return data; + } + + protected BaseModelData convertTaxonomyRow(TaxonomyRow row) + { + BaseModelData data = new BaseModelData(); + + //Init values + String dataProviderName = ""; + String dataSetCitation= ""; + String rank= ""; +// String matchingAccordingTo= ""; + String statusRedId= ""; + String statusRefName= ""; + String dateModified = ""; + String name = ""; + String statusRemarks = ""; + String classificationString = ""; + String author = ""; + List hashProperties = new ArrayList(); + + Log.trace("Taxonomy returned in client: " + row); + + if(row.getDataProviderName()!=null) dataProviderName = row.getDataProviderName(); + if(row.getDataSetCitation()!=null) dataSetCitation = row.getDataSetCitation(); + if(row.getRank()!=null) rank = row.getRank(); + if(row.getStatusRefId()!=null) statusRedId = row.getStatusRefId(); + if(row.getStatusName()!=null) statusRefName = row.getStatusName(); + if(row.getDateModified()!=null) dateModified = row.getDateModified(); + if(row.getName()!=null) name = row.getName(); +// if(row.getAccordingTo()!=null) matchingAccordingTo = row.getAccordingTo(); + if(row.getStatusRemarks()!=null) statusRemarks = row.getStatusRemarks(); + if(row.getProperties()!=null) hashProperties = row.getProperties(); + if(row.getAuthor()!=null) author = row.getAuthor(); + + if(row.getParents()!=null){ + classificationString = getClassification(row.getParents()); + data.set(TaxonomyGridField.CLASSIFICATION_STRING.getId(), classificationString); + String rankHTML = getRankHtml(row.getParents()); + data.set(TaxonomyGridField.TAXONOMY.getId(), rankHTML); + } + + data.set(TaxonomyGridField.SCIENTIFIC_NAME.getId(), name); + data.set(TaxonomyGridField.SELECTION.getId(), row.isSelected()); + data.set(TaxonomyGridField.DATASOURCE.getId(), dataProviderName); + data.set(TaxonomyGridField.CITATION.getId(), dataSetCitation); + data.set(TaxonomyGridField.MATCHING_RANK.getId(), rank); + data.set(TaxonomyGridField.STATUSREFNAME.getId(), statusRefName); + data.set(TaxonomyGridField.STATUSREFID.getId(), statusRedId); + data.set(TaxonomyGridField.DATEMODIFIED.getId(), dateModified); + data.set(TaxonomyGridField.AUTHOR.getId(), author); +// data.set(TaxonomyGridField.MATCHING_ACCORDING_TO.getId(),matchingAccordingTo); + data.set(TaxonomyGridField.STATUS_REMARKS.getId(),statusRemarks); + + data.set(TaxonomyGridField.PROPERTIES.getId(),hashProperties); + +// String products = getProdutcsHTML(layerCount, occurencesCount); +// data.set(TaxonomyGridField.PRODUCTS.getId(), products); + + String provenance = getProvenanceHTML(dataProviderName, dataSetCitation); + data.set(SpeciesGridFields.PROVENANCE.getId(), provenance); + + data.set(TaxonomyGridField.ROW.getId(), row); + + return data; + } + + public String getClassification(List listTaxonomy) + { + StringBuilder sb = new StringBuilder(); + for (int i = listTaxonomy.size()-1; i >= 0; i--) { + TaxonomyRow taxonomy = listTaxonomy.get(i); + + sb.append(""); + + if(!NormalizeString.isUndefined(taxonomy.getRank())) + sb.append(taxonomy.getRank()); + else + sb.append("Rank not found"); + + sb.append(": "); + if(!NormalizeString.isUndefined(taxonomy.getName())) + sb.append(taxonomy.getName()); + else + sb.append("Name not found"); + + if(i!=0) + sb.append(" -> "); + } + + return sb.toString(); + + } + + + //TODO MODIFY + + protected String getRankHtml(List listTaxonomy) + { + String id = Document.get().createUniqueId(); + StringBuilder html = new StringBuilder("


"); + int offset = html.length(); + html.append(""); + boolean addToggler = false; + for (TaxonomyRow taxonomy : listTaxonomy) { + if (!Util.isMainTaxonomicRank(taxonomy.getRank())) { + html.append(""); + + } + html.append("
"); + addToggler = true; + } else html.append("
"); + + if(!NormalizeString.isUndefined(taxonomy.getRank())) + html.append(taxonomy.getRank()); + else + html.append("Rank not found"); + +// html.append(taxonomy.getRank()); + html.append(":{"); + + if(!NormalizeString.isUndefined(taxonomy.getName())) + html.append(taxonomy.getName()); + else + html.append("Name not found"); + +// html.append(taxonomy.getName()); + html.append("}
"); + + if (addToggler) { + StringBuilder toggler = new StringBuilder(); + + String idImgExpand = Document.get().createUniqueId(); + String idImgCollapse = Document.get().createUniqueId(); + + toggler.append(""); + + + toggler.append(""); + + toggler.append(""); + + toggler.append(""); + + + html.insert(offset, toggler.toString()); + } else { + html.insert(offset, "

"); + html.append("
"); + } + html.append("

"); + + return html.toString(); + } + + + + protected String getProvenanceHTML(String dataSource, String datasetCitation) + { + StringBuilder html = new StringBuilder("


"); + +// html.append(""); +// + html.append(""); + +// html.append(""); + + html.append(""); + + html.append("
Data Source:"); +// html.append(datasource); +// html.append("
Data Source:"); + html.append(dataSource); + html.append("
Data Set:"); +// html.append(dataset); +// html.append("
Citation:"); + html.append(datasetCitation); + html.append("

"); + + return html.toString(); + } + +// protected String getProdutcsHTML(int layersCount, int occurencesCount) +// { +// StringBuilder html = new StringBuilder("


"); +// html.append(""); +// +// html.append("
"); +// html.append(TaxonomyGridField.PRODUCT_OCCURRENCES.getName()); +// html.append(":"); +// html.append(layersCount); +// html.append("

"); +// +// return html.toString(); +// } + + + + public boolean isShowOnlySelected() { + return showOnlySelected; + } + + + + public void setShowOnlySelected(boolean showOnlySelected) { + this.showOnlySelected = showOnlySelected; + } + + + + public boolean isActiveFilterOnResult() { + return isActiveFilterOnResult; + } + + + + public void setActiveFilterOnResult(boolean isActiveFilterOnResult) { + this.isActiveFilterOnResult = isActiveFilterOnResult; + } + + + + @Override + public String getInfo() { + return "TaxonomyRowDataSource"; + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/view/ExtendedLiveGridView.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/view/ExtendedLiveGridView.java new file mode 100644 index 0000000..81e3325 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/view/ExtendedLiveGridView.java @@ -0,0 +1,20 @@ +package org.gcube.portlets.user.speciesdiscovery.client.view; + +import com.extjs.gxt.ui.client.core.XDOM; +import com.extjs.gxt.ui.client.widget.grid.LiveGridView; + +public class ExtendedLiveGridView extends LiveGridView { + + + public ExtendedLiveGridView() { + super(); + scrollOffset = Math.max(19, XDOM.getScrollBarWidth()); + setEmptyText("No rows available on the server."); + setForceFit(true); + setAdjustForHScroll(true); + setCacheSize(80); + } + + +} + diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/view/SpeciesThumbsView.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/view/SpeciesThumbsView.java new file mode 100644 index 0000000..144f4b8 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/view/SpeciesThumbsView.java @@ -0,0 +1,161 @@ +package org.gcube.portlets.user.speciesdiscovery.client.view; + +import java.util.LinkedList; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.detail.SpeciesDetailsPanel; +import org.gcube.portlets.user.speciesdiscovery.client.resources.Resources; +import org.gcube.portlets.user.speciesdiscovery.client.util.SpeciesGridFields; +import org.gcube.portlets.user.speciesdiscovery.shared.ResultRow; + +import com.extjs.gxt.ui.client.Style.LayoutRegion; +import com.extjs.gxt.ui.client.Style.SelectionMode; +import com.extjs.gxt.ui.client.core.XTemplate; +import com.extjs.gxt.ui.client.data.BeanModel; +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.event.Events; +import com.extjs.gxt.ui.client.event.Listener; +import com.extjs.gxt.ui.client.event.SelectionChangedEvent; +import com.extjs.gxt.ui.client.store.ListStore; +import com.extjs.gxt.ui.client.util.Format; +import com.extjs.gxt.ui.client.util.Margins; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.ListView; +import com.extjs.gxt.ui.client.widget.layout.BorderLayout; +import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; + +public class SpeciesThumbsView extends ContentPanel implements SpeciesViewInterface { + + private ListView view; + private SpeciesDetailsPanel detailsPanel; + private XTemplate detailTp; + + private static final String NAME = "NAME"; + public static final String PATH = "PATH"; + + public SpeciesThumbsView(ListStore store, int pageSize) { + setBorders(true); + setBodyBorder(false); + setLayout(new BorderLayout()); + this.setHeight(400); + this.setWidth(500); + + final BorderLayout layout = new BorderLayout(); + setLayout(layout); + setHeaderVisible(false); + + BorderLayoutData centerData = new BorderLayoutData(LayoutRegion.CENTER); + centerData.setMargins(new Margins(0)); + + ContentPanel viewPanel = new ContentPanel(new FitLayout()); + viewPanel.setHeaderVisible(false); + viewPanel.setHeight(400); + viewPanel.setWidth(500); + viewPanel.setId("images-view"); + + view = new ListView(store) { + @Override + protected ModelData prepareData(ModelData model) { + String scientificName = model.get(SpeciesGridFields.MATCHING_NAME.getId()); + + model.set(NAME, Format.ellipse(scientificName, 15)); + + String imageUrl = model.get(SpeciesGridFields.IMAGE.getId()); + model.set(PATH, imageUrl!=null?imageUrl:Resources.INSTANCE.getNoPictureAvailable().getSafeUri().asString()); + return model; + } + }; + view.setId("img-chooser-view"); + + + view.setTemplate(getTemplate()); + + view.setBorders(false); + view.setStore(store); + view.setItemSelector("div.thumb-wrap"); + view.setLoadingText("Retrieving data from server.."); + view.setOverStyle(""); + + view.getSelectionModel().setSelectionMode(SelectionMode.SINGLE); + view.getSelectionModel().addListener(Events.SelectionChange, new Listener>() { + public void handleEvent(SelectionChangedEvent be) { + onSelectionChange(be); + } + }); + viewPanel.add(view); + + add(viewPanel, centerData); + + + BorderLayoutData eastData = new BorderLayoutData(LayoutRegion.EAST, 350); + eastData.setSplit(false); + eastData.setCollapsible(true); + + detailsPanel = new SpeciesDetailsPanel(); + + add(detailsPanel, eastData); + + //FIXME detailsPanel.hide(); + } + @Override + protected void onShow() { + super.onShow(); + reload(); + } + public void reload(){ + //view.getStore().getLoader().load(); + } + + private void onSelectionChange(SelectionChangedEvent se) { +// System.out.println("Selection changed"); + if (se.getSelection().size() > 0) { + detailsPanel.show(); + detailsPanel.setSpeciesData(se.getSelectedItem()); + } else { + detailsPanel.hide(); + } + } + + private native String getTemplate() /*-{ + return ['', + '
', + '
', + '{NAME}
', + '
', + '
'].join(""); + + }-*/; + + /** + * {@inheritDoc} + */ + @Override + public List getSelectedRows() { + List selectedRows = new LinkedList(); + for (ModelData selected: view.getSelectionModel().getSelectedItems()) selectedRows.add((ResultRow) selected.get(SpeciesGridFields.ROW.getId())); + return selectedRows; + } + + + @Override + public void setBodyStyleAsFiltered(boolean isFiltered) { + + if(this.getElement("body")!=null){ + + if(isFiltered){ + this.getElement("body").getStyle().setBorderColor("#32CD32"); + } + else + this.getElement("body").getStyle().setBorderColor("#99BBE8"); + + } + + } + @Override + public ContentPanel getPanel() { + return this; + } + + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/view/SpeciesViewInterface.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/view/SpeciesViewInterface.java new file mode 100644 index 0000000..1b53028 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/view/SpeciesViewInterface.java @@ -0,0 +1,19 @@ +package org.gcube.portlets.user.speciesdiscovery.client.view; + +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.shared.ResultRow; + +import com.extjs.gxt.ui.client.widget.ContentPanel; + +public interface SpeciesViewInterface { + + public void reload(); + + public List getSelectedRows(); + + public void setBodyStyleAsFiltered(boolean isFiltered); + + public ContentPanel getPanel(); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/window/HelpQueryWindow.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/window/HelpQueryWindow.java new file mode 100644 index 0000000..5c655d3 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/window/HelpQueryWindow.java @@ -0,0 +1,87 @@ +package org.gcube.portlets.user.speciesdiscovery.client.window; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.model.QueryModel; + +import com.extjs.gxt.ui.client.Style.HorizontalAlignment; +import com.extjs.gxt.ui.client.Style.Scroll; +import com.extjs.gxt.ui.client.store.ListStore; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.Dialog; +import com.extjs.gxt.ui.client.widget.Html; +import com.extjs.gxt.ui.client.widget.ListView; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class HelpQueryWindow extends Dialog { + + private Html helpHtml = new Html(); + + public HelpQueryWindow() { + + setButtonAlign(HorizontalAlignment.CENTER); + setHideOnButtonClick(true); + setHeading("Query examples"); + setModal(true); + // setBodyBorder(true); + setBodyStyle("padding: 9px; background: none"); + setWidth(530); + setResizable(false); + setButtons(Dialog.OK); + + helpHtml.setHtml("All result items with scientfic name 'Mola mola' in the Obis and GBIF datasources:" + + "'Mola mola', 'Abra alba' as ScientificName in Obis, GBIF return *"); + + ListStore employeeList = new ListStore(); + employeeList.add(getQueries()); + + ListView lView = new ListView(); + // getTemplate() returns the desired template + lView.setTemplate(getTemplate()); + lView.setStore(employeeList); + + ContentPanel cp = new ContentPanel(); + cp.setBodyBorder(false); + cp.setHeaderVisible(false); + cp.setButtonAlign(HorizontalAlignment.CENTER); + cp.setLayout(new FitLayout()); + cp.setSize(500, 420); + cp.add(lView); + cp.setScrollMode(Scroll.AUTOY); + + add(cp); + + this.show(); + } + + private native String getTemplate() /*-{ + return [ + '', + '
', + '
{name}
', + '
Description:
{description}
', + '
Query:
{queryString}
', + '
', '
', '' ].join(""); + + }-*/; + + public static List getQueries() { + List listQueries = new ArrayList(); + + listQueries.add(new QueryModel( + "Example Query by scientific name", + "All result items with scientfic name 'Mola mola' and 'Abra alba' in the Obis and GBIF datasources", + "'Mola mola', 'Abra alba' as ScientificName in Obis, GBIF return *")); + + + + return listQueries; + + } + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/window/MessageBoxConfirm.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/window/MessageBoxConfirm.java new file mode 100644 index 0000000..7c83383 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/window/MessageBoxConfirm.java @@ -0,0 +1,26 @@ +package org.gcube.portlets.user.speciesdiscovery.client.window; + +import com.extjs.gxt.ui.client.event.Listener; +import com.extjs.gxt.ui.client.event.MessageBoxEvent; +import com.extjs.gxt.ui.client.widget.MessageBox; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class MessageBoxConfirm { + + private MessageBox box = null; + + public MessageBoxConfirm(String title, String msg) { + box = MessageBox.confirm(title, msg, null); + } + + public MessageBoxConfirm(String title, String msg, Listener listener){ + box = MessageBox.confirm(title, msg, listener); + } + + public MessageBox getMessageBoxConfirm(){ + return box; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/window/MessageDialog.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/window/MessageDialog.java new file mode 100644 index 0000000..337006e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/window/MessageDialog.java @@ -0,0 +1,23 @@ +package org.gcube.portlets.user.speciesdiscovery.client.window; + +import com.extjs.gxt.ui.client.widget.MessageBox; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class MessageDialog { + + private final MessageBox info; + + public MessageDialog(String headingTxt, String msgTitle, String msgTxt) { + + info = MessageBox.confirm(msgTitle, msgTxt, null); + info.show(); + } + + public MessageBox getMessageBoxConfirm(){ + return info; + } + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/window/ViewDetailsWindow.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/window/ViewDetailsWindow.java new file mode 100644 index 0000000..54c1f1c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/window/ViewDetailsWindow.java @@ -0,0 +1,1344 @@ +package org.gcube.portlets.user.speciesdiscovery.client.window; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.client.ConstantsSpeciesDiscovery; +import org.gcube.portlets.user.speciesdiscovery.client.SearchController; +import org.gcube.portlets.user.speciesdiscovery.client.SpeciesDiscovery; +import org.gcube.portlets.user.speciesdiscovery.client.advancedsearch.AdvancedSearchPanelManager; +import org.gcube.portlets.user.speciesdiscovery.client.cluster.TablesForResultRow; +import org.gcube.portlets.user.speciesdiscovery.client.cluster.TablesForTaxonomyRow; +import org.gcube.portlets.user.speciesdiscovery.client.event.CreateOccurrenceJobEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.CreateTaxonomyJobEvent; +import org.gcube.portlets.user.speciesdiscovery.client.event.CreateTaxonomyJobEvent.TaxonomyJobType; +import org.gcube.portlets.user.speciesdiscovery.client.event.ShowOccurrencesMapEvent; +import org.gcube.portlets.user.speciesdiscovery.client.externalsystem.OtherInformationSystemsEnum; +import org.gcube.portlets.user.speciesdiscovery.client.externalsystem.OtherMappingSystemsEnum; +import org.gcube.portlets.user.speciesdiscovery.client.gridview.OccurrenceJobGridManager; +import org.gcube.portlets.user.speciesdiscovery.client.resources.Resources; +import org.gcube.portlets.user.speciesdiscovery.client.util.GridField; +import org.gcube.portlets.user.speciesdiscovery.client.util.OccurencesGridFields; +import org.gcube.portlets.user.speciesdiscovery.client.util.Util; +import org.gcube.portlets.user.speciesdiscovery.client.util.stream.DataSourceManager; +import org.gcube.portlets.user.speciesdiscovery.client.util.stream.ResultRowDataSource; +import org.gcube.portlets.user.speciesdiscovery.client.util.stream.StreamPagingLoader; +import org.gcube.portlets.user.speciesdiscovery.client.util.stream.StreamPagingToolBar; +import org.gcube.portlets.user.speciesdiscovery.shared.DataSourceModel; +import org.gcube.portlets.user.speciesdiscovery.shared.OccurrencesSaveEnum; +import org.gcube.portlets.user.speciesdiscovery.shared.OccurrencesStatus; +import org.gcube.portlets.user.speciesdiscovery.shared.ResultRow; +import org.gcube.portlets.user.speciesdiscovery.shared.SaveFileFormat; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchType; +import org.gcube.portlets.user.speciesdiscovery.shared.SpeciesCapability; +import org.gcube.portlets.user.speciesdiscovery.shared.TaxonomyRow; +import org.gcube.portlets.user.speciesdiscovery.shared.cluster.ClusterCommonNameDataSource; +import org.gcube.portlets.user.speciesdiscovery.shared.cluster.ClusterStructuresForResultRow; +import org.gcube.portlets.user.speciesdiscovery.shared.cluster.ClusterStructuresForTaxonomyRow; + +import com.allen_sauer.gwt.log.client.Log; +import com.extjs.gxt.ui.client.Style.ButtonArrowAlign; +import com.extjs.gxt.ui.client.Style.ButtonScale; +import com.extjs.gxt.ui.client.Style.HorizontalAlignment; +import com.extjs.gxt.ui.client.Style.IconAlign; +import com.extjs.gxt.ui.client.Style.Scroll; +import com.extjs.gxt.ui.client.Style.VerticalAlignment; +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.event.BoxComponentEvent; +import com.extjs.gxt.ui.client.event.ButtonEvent; +import com.extjs.gxt.ui.client.event.Events; +import com.extjs.gxt.ui.client.event.Listener; +import com.extjs.gxt.ui.client.event.MenuEvent; +import com.extjs.gxt.ui.client.event.SelectionListener; +import com.extjs.gxt.ui.client.event.WindowEvent; +import com.extjs.gxt.ui.client.event.WindowListener; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.HorizontalPanel; +import com.extjs.gxt.ui.client.widget.Html; +import com.extjs.gxt.ui.client.widget.Info; +import com.extjs.gxt.ui.client.widget.Label; +import com.extjs.gxt.ui.client.widget.LayoutContainer; +import com.extjs.gxt.ui.client.widget.TabItem; +import com.extjs.gxt.ui.client.widget.TabPanel; +import com.extjs.gxt.ui.client.widget.VerticalPanel; +import com.extjs.gxt.ui.client.widget.Window; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.grid.ColumnConfig; +import com.extjs.gxt.ui.client.widget.grid.ColumnModel; +import com.extjs.gxt.ui.client.widget.grid.Grid; +import com.extjs.gxt.ui.client.widget.layout.ColumnData; +import com.extjs.gxt.ui.client.widget.layout.ColumnLayout; +import com.extjs.gxt.ui.client.widget.layout.FitData; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.extjs.gxt.ui.client.widget.layout.FormLayout; +import com.extjs.gxt.ui.client.widget.layout.TableData; +import com.extjs.gxt.ui.client.widget.menu.Menu; +import com.extjs.gxt.ui.client.widget.menu.MenuItem; +import com.extjs.gxt.ui.client.widget.tips.ToolTipConfig; +import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem; +import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.core.client.Scheduler.ScheduledCommand; +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.user.client.Timer; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.AbstractImagePrototype; +import com.google.gwt.user.client.ui.Anchor; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class ViewDetailsWindow extends Window { + + protected final ViewDetailsWindow INSTANCE; + + protected StreamPagingLoader loader; + protected int count = 0; + private int numberOfSelectedRow = 0; + private ContentPanel container = new ContentPanel(); + private TabPanel tabPanel = new TabPanel(); + private TabItem tabItemOccrs = new TabItem(ConstantsSpeciesDiscovery.OCCURRENCEPOINTS); + private TabItem tabItemDetails = new TabItem(ConstantsSpeciesDiscovery.DETAILS); + private ContentPanel panelDetails = new ContentPanel(); + private ContentPanel panelOccurrences = new ContentPanel(); + + private int width = 900; + private int height = 600; + private int widthPanelOccurrences = 1200; + private int heightPanelOccurrences = height-70; + public final static String FIVEPX = "5px"; + + + private SearchController searchController; + private ToolBar toolbarOccurrences; + private DataSourceManager dataSourceManager; + private AbstractImagePrototype imageYes = AbstractImagePrototype.create(Resources.INSTANCE.getCheckYes()); + private AbstractImagePrototype imageNo = AbstractImagePrototype.create(Resources.INSTANCE.getCheckNo()); + + private AbstractImagePrototype imgAttention = AbstractImagePrototype.create(Resources.INSTANCE.getAttention()); + + private ToolBar toolbarTaxonomy; + private SearchType searchType; + private boolean isSearchByCommonName = false; + private Timer timerGetCountOfOccurrences; + + private List lastlistDataSourceFound = null; + private String lastScientificName = null; + + public ViewDetailsWindow(SearchController searchController, SpeciesCapability capability, SearchType searchType) { + + INSTANCE = this; + this.setCollapsible(false); + this.setMaximizable(true); +// this.setHideCollapseTool(true); + this.searchController = searchController; + this.dataSourceManager = DataSourceManager.getInstance(); + this.searchType = searchType; + + if(searchType.equals(SearchType.BY_COMMON_NAME)) + isSearchByCommonName = true; + + container.setHeaderVisible(false); + container.setBodyBorder(false); + container.setLayout(new FitLayout()); + + setSize(width, height); + setPlain(true); + setModal(false); + setBlinkModal(false); + setHeading("View Details"); + setLayout(new FitLayout()); + addWindowListener(new WindowListener() { + @Override + public void windowHide(WindowEvent we) { + + //loader is null if items are taxonomy + if(loader!=null) + loader.reset(); + + if(timerGetCountOfOccurrences!=null) + stopTimerGetCountOfOccurrences(500); + + } + }); + + addListener(Events.Resize, new Listener() { + public void handleEvent(BoxComponentEvent event) { + windowResize(INSTANCE.getWidth(), INSTANCE.getHeight()); + } + }); + + tabPanel = new TabPanel(); + tabPanel.setBorders(false); + + if(capability.getName().compareTo(SpeciesCapability.RESULTITEM.getName())==0){ + this.toolbarOccurrences = createToolbarOccurrences(); + createTabItemDisplayResultItem(); + } + else if(capability.getName().compareTo(SpeciesCapability.TAXONOMYITEM.getName())==0){ + this.toolbarTaxonomy = createToolbarTaxonomy(); + cretateTabItemDisplayTaxonomyItem(); + } + + container.add(tabPanel,new FitData(4)); + add(container); + + show(); + + } + + protected void windowResize(int width,int height){ + + if(width>widthPanelOccurrences) + panelOccurrences.setWidth(width-20); + else + panelOccurrences.setWidth(widthPanelOccurrences); + + if(height>heightPanelOccurrences) + panelOccurrences.setHeight(height-70); + else + panelOccurrences.setHeight(heightPanelOccurrences); + + } + + + private void cretateTabItemDisplayTaxonomyItem() { + + tabItemDetails.setScrollMode(Scroll.AUTO); + + ContentPanel cpDetailsTaxonomy = new ContentPanel(); + cpDetailsTaxonomy.setHeaderVisible(false); + cpDetailsTaxonomy.setBodyBorder(false); + cpDetailsTaxonomy.add(panelDetails); + cpDetailsTaxonomy.setTopComponent(this.toolbarTaxonomy); + tabItemDetails.add(cpDetailsTaxonomy); + + panelDetails.setHeaderVisible(false); + panelDetails.setBodyBorder(false); +// panelDetails.setStyleAttribute("padding", FIVEPX); + + panelDetails.setStyleAttribute("padding-left", FIVEPX); + panelDetails.setStyleAttribute("padding-right", FIVEPX); + panelDetails.setStyleAttribute("padding-bottom", FIVEPX); + + panelDetails.setStyleAttribute("margin-left", FIVEPX); + panelDetails.setStyleAttribute("margin-right", FIVEPX); + panelDetails.setStyleAttribute("margin-bottom", FIVEPX); + +// panelDetails.setTopComponent(this.toolbarTaxonomy); + + tabItemDetails.add(panelDetails); + + setFocusWidget(getButtonBar().getItem(0)); + + tabItemDetails.mask("Loading...", ConstantsSpeciesDiscovery.LOADINGSTYLE); + enableToolbarTaxonomy(false); + + loadStructuresAndFillingPage(SpeciesCapability.TAXONOMYITEM); + + tabPanel.add(tabItemDetails); + + + } + + private void createTabItemDisplayResultItem() { + + tabItemOccrs.setToolTip(new ToolTipConfig("Show Occurrences", "Shows occurences points from selected results.")); + + tabItemDetails.setScrollMode(Scroll.AUTO); + + panelDetails.setHeaderVisible(false); + panelDetails.setBodyBorder(false); + panelDetails.setStyleAttribute("padding", FIVEPX); + panelDetails.setStyleAttribute("margin", FIVEPX); + +// panelDetails.add(createButtonSaveAsHtml()); + + panelOccurrences.setHeaderVisible(false); + panelOccurrences.setBodyBorder(false); +// panelOccurences.setStyleAttribute("padding", FIVEPX); + panelOccurrences.setScrollMode(Scroll.AUTO); + panelOccurrences.setSize(widthPanelOccurrences, heightPanelOccurrences); + panelOccurrences.setLayout(new FitLayout()); + panelOccurrences.setTopComponent(this.toolbarOccurrences); + + tabItemDetails.add(panelDetails); + tabItemOccrs.add(panelOccurrences); + + setFocusWidget(getButtonBar().getItem(0)); + + createOccurrencesWindow(); + + tabItemDetails.mask("Loading...",ConstantsSpeciesDiscovery.LOADINGSTYLE); + enableToolbarOccurrence(false); + +// loadNumberOfSelectedRowAndDetailsFilling(SpeciesCapability.RESULTITEM); + + loadStructuresAndFillingPage(SpeciesCapability.RESULTITEM); + + tabPanel.add(tabItemDetails); + tabPanel.add(tabItemOccrs); + + } + + private void enableToolbarOccurrence(boolean bool){ + toolbarOccurrences.setEnabled(bool); + } + + private void enableToolbarTaxonomy(boolean bool){ + toolbarTaxonomy.setEnabled(bool); + } + + + public void loadStructuresAndFillingPage(final SpeciesCapability capability){ + + final long startTime = System.currentTimeMillis(); + + if(capability.getName().compareTo(SpeciesCapability.RESULTITEM.getName())==0) + SpeciesDiscovery.taxonomySearchService.loadStructuresForResultRowClustering(new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + Info.display("Sorry", "Error retriving selected results"); + tabItemDetails.unmask(); + enableToolbarOccurrence(true); + + } + + @Override + public void onSuccess(ClusterStructuresForResultRow result) { + + int size = result.getResult().size(); + + long returnedTime = System.currentTimeMillis(); + + long loadTime = returnedTime-startTime; + + Log.trace("fillPageDetailsForOccurences: " +size +" cluster result row was loaded in "+ loadTime +" msc"); + + String items = size>0?"items":"item"; + + String msg = ""; + + if(result.getTotalRow()>size){ + msg = ConstantsSpeciesDiscovery.ROW_LIMIT_REACHED + " - "; + tabItemDetails.setIcon(imgAttention); + tabItemDetails.setToolTip(ConstantsSpeciesDiscovery.THE_MAX_NUMBER_OF_ITEMS_DISPLAYABLE_IS+ConstantsSpeciesDiscovery.LIMIT_ITEM_DETAILS); + } + + msg+= tabItemDetails.getText() + " ("+size +" "+ items+")"; + tabItemDetails.setText(msg); + + createCommonNameDetailsPageForResultRow(searchController.getLastSearchEvent().getSearchTerm(), result); + + enableToolbarOccurrence(true); + tabItemDetails.unmask(); + + long avilableTime = System.currentTimeMillis()-returnedTime; + + Log.trace("fillPageDetailsForOccurences: " +size +" view details result row are available in "+ avilableTime +" msc"); + + } + + + }); + + else if(capability.getName().compareTo(SpeciesCapability.TAXONOMYITEM.getName())==0){ + + SpeciesDiscovery.taxonomySearchService.loadStructuresForTaxonomyClustering(new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + Info.display("Sorry", "Error retriving selected results"); + tabItemDetails.unmask(); + enableToolbarTaxonomy(true); + + } + + @Override + public void onSuccess(ClusterStructuresForTaxonomyRow result) { + + int size = result.getResult().size(); + + long returnedTime = System.currentTimeMillis(); + + long loadTime = returnedTime-startTime; + + Log.trace("fillPageDetailsForTaxonomy: " +size +" cluster taxonomy row was loaded in "+ loadTime +" msc"); + +// TablesForTaxonomyRow tableClassification = new TablesForTaxonomyRow(result, DEFAULTLANGUAGE, tabPanel, isSearchByCommonName, searchController.getEventBus()); + + String items = size>0?"items":"item"; + + String msg = ""; + + if(result.getTotalRow()>size){ + msg = ConstantsSpeciesDiscovery.ROW_LIMIT_REACHED + " - "; + tabItemDetails.setIcon(imgAttention); + tabItemDetails.setToolTip(ConstantsSpeciesDiscovery.THE_MAX_NUMBER_OF_ITEMS_DISPLAYABLE_IS+ConstantsSpeciesDiscovery.LIMIT_ITEM_DETAILS); + } + + msg+= tabItemDetails.getText() + " ("+size +" "+ items+")"; + tabItemDetails.setText(msg); + + + createCommonNameDetailsPageForTaxonomyRow(result, searchController.getLastSearchEvent().getSearchTerm()); + enableToolbarTaxonomy(true); + tabItemDetails.unmask(); + + long avilableTime = returnedTime-loadTime; + + Log.trace("fillPageDetailsForTaxonomy: " +size +" view details taxonomy row are available in "+ avilableTime +" msc"); + } + + + }); + } + } + + private void createCommonNameDetailsPageForTaxonomyRow(ClusterStructuresForTaxonomyRow result,String searchTerm) { + HashMap> hashTaxonomyRowID = result.getHashClusterScientificNameTaxonomyRowID(); +// ArrayList listDataSourceFound = tableClassification.getListFoundDataSources(); + HashMap> hashClusterCommonNamesDataSources = result.getHashClusterCommonNamesDataSources(); + +// HashMap> hashHTMLTables = result.getHashClassificationTables(); + + String title = getSearchTitle(); + panelDetails.add(new Html(title)); + +// for (String dataSource : listDataSourceFound) { +// System.out.println("############# Data Source found " + dataSource); +// } + + List listKey = new ArrayList(hashTaxonomyRowID.keySet()); + Collections.sort(listKey); + + + final Anchor anchorIndex = new Anchor(); + anchorIndex.setName("indexOfContents"); + + panelDetails.add(new Html("

Index of Contents"+anchorIndex+"


")); + panelDetails.add(createIndexOfContents(listKey)); + + //update last list data source found + lastlistDataSourceFound = result.getListFoundDataSources(); + + //Create panels about + panelDetails.add(new Html("

")); + VerticalPanel verticaPanelAbouts = createPanelAbout(SpeciesCapability.TAXONOMYITEM, result.getListFoundDataSources()); + panelDetails.add(verticaPanelAbouts); + panelDetails.add(new Html("
")); + + for (final String scientificName : listKey) { + + Anchor anchor = new Anchor("[top index]"); + anchor.setName(scientificName); + + anchor.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent event) { + com.google.gwt.user.client.Window.Location.assign("#indexOfContents"); + } + }); + + LayoutContainer titleContainer = new LayoutContainer(); + titleContainer.setLayout(new ColumnLayout()); + titleContainer.setWidth(width-80); + + LayoutContainer left = new LayoutContainer(); + FormLayout layout = new FormLayout(); + left.setLayout(layout); + + LayoutContainer right = new LayoutContainer(); + layout = new FormLayout(); + right.setLayout(layout); + + + HorizontalPanel hp = new HorizontalPanel(); + hp.setTableWidth("100%"); + TableData td = new TableData(); + td.setHorizontalAlign(HorizontalAlignment.RIGHT); + hp.add(anchor, td); + + + titleContainer.add(left, new ColumnData(.8)); + titleContainer.add(right, new ColumnData(.2)); + +// HorizontalPanel hp = new HorizontalPanel(); +// hp.setHorizontalAlign(HorizontalAlignment.CENTER); +// hp.setStyleAttribute("margin", FIVEPX); + + this.lastScientificName = scientificName; + + left.add(new Html("

" + ConstantsSpeciesDiscovery.SCIENTIFICNAME + ": " + scientificName + "

")); + right.add(hp); + + panelDetails.add(titleContainer); + panelDetails.add(new Html("

")); + panelDetails.add(createExternalLinks(scientificName)); + + String commonNamesTitle = "

Common Names (Data Source/s)

"; + panelDetails.add(new Html(commonNamesTitle)); + + ClusterCommonNameDataSource cluster = hashClusterCommonNamesDataSources.get(scientificName); + + String tableCommonName = createTableWithCheckCommonNameDataSource(cluster.getHashMapCommonNameDataSources(), cluster.getListDataSourcesFound()); + panelDetails.add(new Html("
"+tableCommonName+"
")); + + ArrayList arrayTaxonomyID = hashTaxonomyRowID.get(scientificName); + + for(int i=0; i

Scientific Classification of "+ scientificName + " on " +dataSource+ " Data Source

")); + horizontalPanel.setVerticalAlign(VerticalAlignment.BOTTOM); + + DataSourceModel ds = AdvancedSearchPanelManager.getInstance().findDataSourceByCapabilityAndName(SpeciesCapability.TAXONOMYITEM, dataSource); + + Anchor createAbout = createAbout(ds,true); + if(createAbout!=null){ + createAbout.getElement().getStyle().setMarginLeft(25, Unit.PX); + horizontalPanel.add(createAbout); + } + + panelDetails.add(horizontalPanel); + panelDetails.add(tables.getPanelClassificationForTaxonomy(taxonomy, dataSource, false)); + + tables.setParents(taxonomy.getParents()); + panelDetails.add(tables.getHTMLTableForTaxonomyWithRef(taxonomy, false, dataSource)); + } + } + + panelDetails.layout(true); + + } + + private void createCommonNameDetailsPageForResultRow(String searchTerm, ClusterStructuresForResultRow result) { + + HashMap> hashResultRowIdTables = result.getHashClusterScientificNameResultRowID(); + HashMap> hashClusterCommonNamesDataSources = result.getHashClusterCommonNamesDataSources(); + + String title = getSearchTitle(); + + panelDetails.add(new Html(title)); + + List listKey = new ArrayList(hashResultRowIdTables.keySet()); + Collections.sort(listKey); + + final Anchor anchorIndex = new Anchor(); + anchorIndex.setName("indexOfContents"); + + panelDetails.add(new Html("

Index of Contents"+anchorIndex+"


")); + panelDetails.add(createIndexOfContents(listKey)); + + panelDetails.add(new Html("

")); + + //update last list data source found + lastlistDataSourceFound = result.getListFoundDataSources(); + + VerticalPanel verticaPanelAbouts = createPanelAbout(SpeciesCapability.RESULTITEM, result.getListFoundDataSources()); + panelDetails.add(verticaPanelAbouts); + panelDetails.add(new Html("
")); + + for (final String scientificName : listKey) { + + Anchor anchor = new Anchor("[top index]"); + anchor.setName(scientificName); + + anchor.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent event) { + com.google.gwt.user.client.Window.Location.assign("#indexOfContents"); + } + }); + + LayoutContainer titleContainer = new LayoutContainer(); + titleContainer.setLayout(new ColumnLayout()); + titleContainer.setWidth(width-80); + + LayoutContainer left = new LayoutContainer(); + FormLayout layout = new FormLayout(); + left.setLayout(layout); + + LayoutContainer right = new LayoutContainer(); + layout = new FormLayout(); + right.setLayout(layout); + + + HorizontalPanel hp = new HorizontalPanel(); + hp.setTableWidth("100%"); + TableData td = new TableData(); + td.setHorizontalAlign(HorizontalAlignment.RIGHT); + hp.add(anchor, td); + + + titleContainer.add(left, new ColumnData(.8)); + titleContainer.add(right, new ColumnData(.2)); + + this.lastScientificName = scientificName; + + left.add(new Html("

" + ConstantsSpeciesDiscovery.SCIENTIFICNAME + ": " + scientificName + "

")); + right.add(hp); + + panelDetails.add(titleContainer); + + panelDetails.add(new Html("

")); + + panelDetails.add(createExternalLinks(scientificName)); + + String commonNamesTitle = "

Common Names (Data Source/s)

"; + panelDetails.add(new Html(commonNamesTitle)); + + ClusterCommonNameDataSource cluster = hashClusterCommonNamesDataSources.get(scientificName); + + String tableCommonName = createTableWithCheckCommonNameDataSource(cluster.getHashMapCommonNameDataSources(), cluster.getListDataSourcesFound()); + panelDetails.add(new Html("
"+tableCommonName+"

")); + + ArrayList arrayRowID = hashResultRowIdTables.get(scientificName); + + for(int i=0; i() { +// +// @Override +// public void componentSelected(ButtonEvent ce) { +// searchController.getEventBus().fireEvent(new SaveItemsEvent(SearchResultType.TAXONOMY_ITEM, SaveFileFormat.DARWIN_CORE_ARCHIVE, count, null)); +// +// } +// }); + + MenuItem darwinCoreArchiveItem = new MenuItem(ConstantsSpeciesDiscovery.DARWIN_CORE_ARCHIVE); + darwinCoreArchiveItem.setToolTip(new ToolTipConfig(ConstantsSpeciesDiscovery.SAVES_IN_DARWIN_CORE_ARCHIVE_FORMAT)); + darwinCoreArchiveItem.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(MenuEvent ce) { + + searchController.getEventBus().fireEvent(new CreateTaxonomyJobEvent(TaxonomyJobType.BYIDS)); + +// searchController.getEventBus().fireEvent(new SaveItemsEvent(SearchResultType.TAXONOMY_ITEM, SaveFileFormat.DARWIN_CORE_ARCHIVE, count, null)); + } + }); + + formatSubMenu.add(darwinCoreArchiveItem); + + toolbar.add(btnTaxonomyMenu); + + return toolbar; + + + } + + public ToolBar createToolbarOccurrences(){ + + ToolBar toolbar = new ToolBar(); + + Button btnShowInGisViewer = new Button(ConstantsSpeciesDiscovery.SHOW_IN_GIS_VIEWER); + btnShowInGisViewer.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getGisProducts())); + btnShowInGisViewer.setToolTip(new ToolTipConfig(ConstantsSpeciesDiscovery.SHOW_IN_GIS_VIEWER, "Show occurences points from selected results in a Gis Viewer Map.")); + btnShowInGisViewer.setScale(ButtonScale.SMALL); + btnShowInGisViewer.setIconAlign(IconAlign.TOP); + btnShowInGisViewer.setArrowAlign(ButtonArrowAlign.BOTTOM); + btnShowInGisViewer.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + searchController.getEventBus().fireEvent(new ShowOccurrencesMapEvent(count)); + } + }); + + + Button btnOccurrencesMenu = new Button(ConstantsSpeciesDiscovery.SAVE_OCCURRENCES); + Menu formatSubMenu = new Menu(); + btnOccurrencesMenu.setMenu(formatSubMenu); + btnOccurrencesMenu.setScale(ButtonScale.SMALL); + btnOccurrencesMenu.setIconAlign(IconAlign.TOP); + btnOccurrencesMenu.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getSaveProducts())); + btnOccurrencesMenu.setToolTip(new ToolTipConfig(ConstantsSpeciesDiscovery.SAVE_OCCURRENCES, ConstantsSpeciesDiscovery.SAVE_OCCURENCES_POINTS_FROM_SELECTED_RESULTS)); + + MenuItem csvFormatItem = new MenuItem(ConstantsSpeciesDiscovery.CSV); + csvFormatItem.setToolTip(new ToolTipConfig(ConstantsSpeciesDiscovery.SAVES_IN_CSV_FILE_FORMAT)); + csvFormatItem.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(MenuEvent ce) { +// searchController.getEventBus().fireEvent(new SaveItemsEvent(SearchResultType.OCCURRENCE_POINT, SaveFileFormat.CSV, count, OccurrencesSaveEnum.STANDARD)); + + String searchTerm = OccurrenceJobGridManager.getSearchTermBySearchType(isSearchByCommonName, searchController.getLastSearchEvent().getSearchTerm()); + + searchController.getEventBus().fireEvent(new CreateOccurrenceJobEvent(SaveFileFormat.CSV, count, OccurrencesSaveEnum.STANDARD, lastlistDataSourceFound, searchTerm,false)); + } + }); + + + formatSubMenu.add(csvFormatItem); + + Menu csvTypeMenu = new Menu(); + + MenuItem csvStandard = new MenuItem(ConstantsSpeciesDiscovery.PLAIN_CSV); + + csvStandard.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(MenuEvent ce) { +// searchController.getEventBus().fireEvent(new SaveItemsEvent(SearchResultType.OCCURRENCE_POINT, SaveFileFormat.CSV, count, OccurrencesSaveEnum.STANDARD)); + + String searchTerm = OccurrenceJobGridManager.getSearchTermBySearchType(isSearchByCommonName, searchController.getLastSearchEvent().getSearchTerm()); + + searchController.getEventBus().fireEvent(new CreateOccurrenceJobEvent(SaveFileFormat.CSV, count, OccurrencesSaveEnum.STANDARD, lastlistDataSourceFound, searchTerm,false)); + } + }); + + + MenuItem csvStandardByDataSource = new MenuItem(ConstantsSpeciesDiscovery.PLAIN_CSV_BY_DATA_SOURCE); + + csvStandardByDataSource.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(MenuEvent ce) { +// searchController.getEventBus().fireEvent(new SaveItemsEvent(SearchResultType.OCCURRENCE_POINT, SaveFileFormat.CSV, count, OccurrencesSaveEnum.STANDARD)); + + String searchTerm = OccurrenceJobGridManager.getSearchTermBySearchType(isSearchByCommonName, searchController.getLastSearchEvent().getSearchTerm()); + + searchController.getEventBus().fireEvent(new CreateOccurrenceJobEvent(SaveFileFormat.CSV, count, OccurrencesSaveEnum.STANDARD, lastlistDataSourceFound, searchTerm,true)); + } + }); + + + MenuItem csvOpenModeller = new MenuItem(ConstantsSpeciesDiscovery.OPEN_MODELLER); + + csvOpenModeller.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(MenuEvent ce) { + +// searchController.getEventBus().fireEvent(new SaveItemsEvent(SearchResultType.OCCURRENCE_POINT, SaveFileFormat.CSV, count, OccurrencesSaveEnum.OPENMODELLER)); + + String searchTerm = OccurrenceJobGridManager.getSearchTermBySearchType(isSearchByCommonName, searchController.getLastSearchEvent().getSearchTerm()); + + searchController.getEventBus().fireEvent(new CreateOccurrenceJobEvent(SaveFileFormat.CSV, count, OccurrencesSaveEnum.OPENMODELLER, lastlistDataSourceFound, searchTerm,false)); + } + }); + + + MenuItem csvOpenModellerByDataSource = new MenuItem(ConstantsSpeciesDiscovery.OPEN_MODELLER_BY_DATA_SOURCE); + + csvOpenModellerByDataSource.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(MenuEvent ce) { + +// searchController.getEventBus().fireEvent(new SaveItemsEvent(SearchResultType.OCCURRENCE_POINT, SaveFileFormat.CSV, count, OccurrencesSaveEnum.OPENMODELLER)); + + String searchTerm = OccurrenceJobGridManager.getSearchTermBySearchType(isSearchByCommonName, searchController.getLastSearchEvent().getSearchTerm()); + + searchController.getEventBus().fireEvent(new CreateOccurrenceJobEvent(SaveFileFormat.CSV, count, OccurrencesSaveEnum.OPENMODELLER, lastlistDataSourceFound, searchTerm,true)); + } + }); + + csvTypeMenu.add(csvStandard); + + csvTypeMenu.add(csvStandardByDataSource); + + csvTypeMenu.add(csvOpenModeller); + + csvTypeMenu.add(csvOpenModellerByDataSource); + + csvFormatItem.setSubMenu(csvTypeMenu); + + MenuItem darwinCoreFormatItem = new MenuItem(ConstantsSpeciesDiscovery.DARWIN_CORE); + darwinCoreFormatItem.setToolTip(new ToolTipConfig(ConstantsSpeciesDiscovery.SAVES_IN_DARWIN_CORE_FILE_FORMAT)); + darwinCoreFormatItem.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(MenuEvent ce) { +// searchController.getEventBus().fireEvent(new SaveItemsEvent(SearchResultType.OCCURRENCE_POINT, SaveFileFormat.DARWIN_CORE, count, null)); + + String searchTerm = OccurrenceJobGridManager.getSearchTermBySearchType(isSearchByCommonName, searchController.getLastSearchEvent().getSearchTerm()); + + searchController.getEventBus().fireEvent(new CreateOccurrenceJobEvent(SaveFileFormat.DARWIN_CORE, count, null, lastlistDataSourceFound, searchTerm, false)); + } + }); + formatSubMenu.add(darwinCoreFormatItem); + + toolbar.add(btnOccurrencesMenu); + toolbar.add(new SeparatorToolItem()); + toolbar.add(btnShowInGisViewer); + return toolbar; + } + + + private String getSearchType(){ + + String searchType = ""; + switch (searchController.getLastSearchEvent().getType()) { + case BY_COMMON_NAME: + + searchType = ConstantsSpeciesDiscovery.BYCOMMONNAME; + + break; + + case BY_SCIENTIFIC_NAME: + + searchType = ConstantsSpeciesDiscovery.BYSCIENTIFICNAME; + + break; + } + return searchType; + } + + private String getSearchTitle(){ + + + return "

" + searchController.getLastSearchEvent().getSearchTerm() + "

" + + "

search "+getSearchType()+"




"; + + } + + + /** + * + * @param searchValue + * @return a vetical panel with external links on input + */ + public static VerticalPanel createExternalLinks(final String searchValue){ + + VerticalPanel vpExternalLink = new VerticalPanel(); + + // Create Links to Other Information Systems + Html htmlLinkOIS = new Html("

Links to Other Information Systems

"); + VerticalPanel vpOIS = new VerticalPanel(); + vpOIS.setStyleAttribute("margin", FIVEPX); + vpOIS.setStyleAttribute("padding", FIVEPX); + + + for (final OtherInformationSystemsEnum infSystem : OtherInformationSystemsEnum.values()) { + + Anchor anchor = new Anchor(infSystem.getName()); + anchor.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + String url = infSystem.getBaseUrl() + searchValue + infSystem.getSuffixUrl(); + new WindowOpenUrl(url, "_blank", null); + + } + }); + + vpOIS.add(anchor); + } + + // Create Links to Other Mapping Systems + Html htmlLinkOMS = new Html("

Links to Other Mapping Systems

"); + VerticalPanel vpOMS = new VerticalPanel(); + vpOMS.setStyleAttribute("margin", FIVEPX); + vpOMS.setStyleAttribute("padding", FIVEPX); + + + for (final OtherMappingSystemsEnum infSystem : OtherMappingSystemsEnum.values()) { + + Anchor anchor = new Anchor(infSystem.getName()); + anchor.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + String url = infSystem.getBaseUrl() + searchValue + infSystem.getSuffixUrl(); + new WindowOpenUrl(url, "_blank", null); + + } + }); + + vpOMS.add(anchor); + } + + vpExternalLink.add(htmlLinkOIS); + vpExternalLink.add(vpOIS); + + vpExternalLink.add(htmlLinkOMS); + vpExternalLink.add(vpOMS); + + return vpExternalLink; + } + + + protected void initLoader() + { + loader = new StreamPagingLoader(ConstantsSpeciesDiscovery.PAGE_SIZE); + +// loader = new StreamPagingLoader(PAGE_SIZE); + loader.setDataSource(dataSourceManager.getDataSourceByResultType(SpeciesCapability.OCCURRENCESPOINTS)); + + } + + + public void createOccurrencesWindow() + { + + List config = new ArrayList(); + + for (GridField field:OccurencesGridFields.values()) config.add(Util.createColumnConfig(field, 150)); + + final ColumnModel cm = new ColumnModel(config); + + initLoader(); + + Grid grid = new Grid(loader.getStore(), cm); + grid.setBorders(true); + grid.getView().setEmptyText(ConstantsSpeciesDiscovery.NORESULTS); + + StreamPagingToolBar toolBar = new StreamPagingToolBar(); + toolBar.bind(loader); + + panelOccurrences.setBottomComponent(toolBar); + + panelOccurrences.add(grid); + } + + public void loadOccurences() + { + Log.trace("Loading occurrences"); + + count = 0; + dataSourceManager.setExpectedOccurencePoints(count); + + SpeciesDiscovery.taxonomySearchService.retrieveOccurencesFromSelection(new AsyncCallback() { + + @Override + public void onSuccess(Integer expectedPoints) { + Log.trace("Expected points: "+expectedPoints); + dataSourceManager.setExpectedOccurencePoints(expectedPoints); + + count = expectedPoints.intValue(); + String items = count>0?"items":"item"; + tabItemOccrs.setText(tabItemOccrs.getText() + " ("+count +" "+ items+")"); + + dataSourceManager.setExpectedOccurencePoints(count); +// count = expectedPoints; + loader.startLoading(true); + + pollingGetCountOfOcccurrences(count); + + } + + @Override + public void onFailure(Throwable caught) { + Info.display("Error getting occurrences", "Error getting occurrences, retry"); + Log.trace("Error getting occurrences", caught); + } + }); + } + + + private void pollingGetCountOfOcccurrences(final int allItems){ + + toolbarOccurrences.add(new SeparatorToolItem()); + final Label labelLoading = new Label("loading 0 of "+allItems); + labelLoading.setStyleAttribute("paddingLeft", "20px"); + labelLoading.setData("count", new Integer(0)); + toolbarOccurrences.add(labelLoading); + + timerGetCountOfOccurrences = new Timer() { + @Override + public void run() { + + SpeciesDiscovery.taxonomySearchService.getCountOfOccurrencesBatch(new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + Log.error("Error on loading", "An error occurred on count of occurrence point, retry." +caught.getMessage()); + + } + + @Override + public void onSuccess(OccurrencesStatus result) { + + int currentValue = ((Integer) labelLoading.getData("count")).intValue(); + + + if(result.getSize()>currentValue && result.getSize() listDataSourcesFound) { + + VerticalPanel verticalPanel = new VerticalPanel(); + verticalPanel.setStyleAttribute("margin", FIVEPX); + verticalPanel.setStyleAttribute("padding", FIVEPX); + + verticalPanel.add(new Html("

About Data Sources


")); + + for (String dataSoruceName : listDataSourcesFound) { + DataSourceModel dataSource = AdvancedSearchPanelManager.getInstance().findDataSourceByCapabilityAndName(capability, dataSoruceName); + Anchor createAbout = createAbout(dataSource,false); + if(createAbout!=null) + verticalPanel.add(createAbout); + } + + return verticalPanel; + } + + private VerticalPanel createIndexOfContents(List listScientificName){ + + VerticalPanel verticalPanel = new VerticalPanel(); + verticalPanel.setStyleAttribute("margin", FIVEPX); + verticalPanel.setStyleAttribute("padding", FIVEPX); + + int i=0; + + for (final String scientificName : listScientificName) { + + Anchor anchor = new Anchor(++i +". "+scientificName); + + anchor.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent event) { + com.google.gwt.user.client.Window.Location.assign("#"+scientificName); + } + }); + + verticalPanel.add(anchor); + } + + return verticalPanel; + } + + private Anchor createAbout(final DataSourceModel ds, boolean insertAboutCitation) + { + Anchor anchor = null; + + if(ds!=null){ + String anchorValue = ""; + + if(insertAboutCitation) + anchorValue = "About "+ds.getName()+""; + else + anchorValue = ""+ds.getName()+""; + + anchor = new Anchor(anchorValue, true); + + anchor.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + ArrayList list = new ArrayList(); + list.add(ds); + new WindowCredits("About "+ds.getName(), list); + + } + }); + } + + return anchor; + } + + + private String createTableWithCheckCommonNameDataSource(HashMap> hashCommonNameDataSources, ArrayList listDataSourceFound){ + + + List listCommonNames = new ArrayList(hashCommonNameDataSources.keySet()); + Collections.sort(listCommonNames, String.CASE_INSENSITIVE_ORDER); + String table; + /* + To sort an ArrayList object, use Collection.sort method. This is a + static method. It sorts an ArrayList object's elements into ascending order. + */ + Collections.sort(listDataSourceFound); + + + //USE FOR DEBUG +// System.out.println("############# Common Name size " + listCommonNames.size()); +// System.out.println("############# Data Source size " + listDataSourceFound.size()); +// +// for (String dataSource : listDataSourceFound) { +// System.out.println("############# Data Source " + dataSource); +// } + + if(listCommonNames.size()>0){ + + int[][] checkCommonNameDataSources = new int[listCommonNames.size()][listDataSourceFound.size()]; + + //Create a matrix common names / data sources with 1 in coincidence values + for (int i=0; i< listCommonNames.size(); i++) { + + String commonName = listCommonNames.get(i); + + ArrayList cmDataSources = hashCommonNameDataSources.get(commonName); + + for (String dataSource : cmDataSources) { +// System.out.println("dataSource " + dataSource); + int index = listDataSourceFound.indexOf(dataSource); +// System.out.println("i: " + i + " index " + index); + checkCommonNameDataSources[i][index] = 1; + } + + } + + //USE FOR DEBUG +// for (int i=0; iCommon names / Data Sources"; + + for (String dataSource: listDataSourceFound) { + + table+=""+dataSource+""; + } + + table+=""; + for (int i=0; i"+listCommonNames.get(i)+""; + + for (int j=0; j"; + else + table+=""+imageNo.getHTML()+""; + } + table+=""; + } + + table+=""; + } + else + table = "Not found"; + + + return table; + + } + + /** + * {@inheritDoc} + */ + @Override + protected void onHide() { + super.onHide(); + Scheduler.get().scheduleDeferred(new ScheduledCommand() { + + @Override + public void execute() { + + if(loader!=null){ + loader.reset(); + SpeciesDiscovery.taxonomySearchService.stopRetrievingOccurrences(new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + Log.error("An error occurred in stopRetrievingOccurrences: " + caught); + + } + + @Override + public void onSuccess(Void result) { + Log.trace("Stop retrieving Occurrences: OK"); + + } + }); + } + + } + }); + } + + + //TEST + public Button createButtonSaveAsHtml(){ + + ToolBar toolbar = new ToolBar(); + + Button btnExportAsHtml = new Button("Export As Html"); + btnExportAsHtml.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getSaveProducts())); + btnExportAsHtml.setToolTip(new ToolTipConfig("Show in Gis Viewer", "Show occurences points from selected results in a Gis Viewer Map.")); + btnExportAsHtml.setScale(ButtonScale.SMALL); + btnExportAsHtml.setIconAlign(IconAlign.TOP); + btnExportAsHtml.setArrowAlign(ButtonArrowAlign.BOTTOM); + btnExportAsHtml.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { +// searchController.getEventBus().fireEvent(new ShowOccurrencesMapEvent()); + + String html = " " + + "" + + "" + + ""+searchController.getLastSearchEvent().getSearchTerm()+"" + + "" + + " "+panelDetails.getElement().getInnerHTML()+"" + + " "; + +// System.out.println(html); + } + }); + + return btnExportAsHtml; + + } + + + private String getCssStyles(){ + + return ".button-hyperlink .x-btn-text {" + + "cursor: pointer !important;" + + "cursor: hand !important;" + + "border: none !important;" + + "/* Disable the button-style */" + + "background-color: transparent !important;" + + "background: none !important;" + + "background-image: none !important;" + + "padding: 0px !important;" + + "color: #4784C3 !important;" + + "font-size: 10px;" + + "font-family: Serif, \"Times New Roman\", Georgia,;" + + "text-decoration: underline !important;" + + "}" + + ".button-hyperlink .x-btn-tl,.button-hyperlink.x-btn-tr,.button-hyperlink " + + ".x-btn-tc,.button-hyperlink .x-btn-ml,.button-hyperlink .x-btn-mr,.button-hyperlink " + + ".x-btn-mc,.button-hyperlink .x-btn-bl,.button-hyperlink .x-btn-br,.button-hyperlink .x-btn-bc" + + "{" + + "background-image: none !important;" + + "background: none !important;" + + "}" + + ".button-hyperlink .x-btn-small .x-btn-mr, .button-hyperlink .x-btn-small .x-btn-ml,.button-hyperlink .x-btn-small .x-btn-mc," + + ".button-hyperlink .x-btn-small .x-btn-br,.button-hyperlink .x-btn-small .x-btn-bl,.button-hyperlink .x-btn-small .x-btn-bc," + + ".button-hyperlink .x-btn-small .x-btn-tc,.button-hyperlink .x-btn-small .x-btn-tr,.button-hyperlink .x-btn-small .x-btn-tl" + + "{" + + "background-image: none !important;" + + "background: none !important;" + + "}" + + ".button-hyperlink .x-btn-tl i,.button-hyperlink .x-btn-tr i,.button-hyperlink .x-btn-tc i,.button-hyperlink .x-btn-ml i,.button-hyperlink .x-btn-mr i,.button-hyperlink .x-btn-mc i,.button-hyperlink .x-btn-bl i,.button-hyperlink .x-btn-br i,.button-hyperlink .x-btn-bc i" + + "{" + + "font-size: 0px;" + + "}" + + "table.imagetable {" + + "font-family: verdana,arial,sans-serif;" + + "font-size:10px;" + + "border: 1px solid #e3e3e3;" + + "background-color: #f2f2f2;" + + "width: 100%;" + + "border-radius: 6px;" + + "-webkit-border-radius: 6px;" + + "-moz-border-radius: 6px;" + + "}" + + "table.imagetable .title {" + + "background:#b5cfd2;" + + "border-width: 1px;" + + "width: 30%;" + + "padding: 8px;" + + "border-style: solid;" + + "border-color: #999999;" + + "}" + + "table.imagetable td {" + + "background:#dcddc0;" + + "border-width: 1px;" + + "padding: 8px;" + + "border-style: solid;" + + "border-color: #999999;" + + "}" + + "table.imagetable th {" + + "height: 35px;" + + "font-weight: bold;" + + "font-size: 12px;" + + "}"; + } + + public SearchController getSearchController() { + return searchController; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/window/WindowCredits.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/window/WindowCredits.java new file mode 100644 index 0000000..51ab645 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/window/WindowCredits.java @@ -0,0 +1,262 @@ +package org.gcube.portlets.user.speciesdiscovery.client.window; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.gcube.portlets.user.speciesdiscovery.client.resources.Resources; +import org.gcube.portlets.user.speciesdiscovery.shared.DataSourceModel; +import org.gcube.portlets.user.speciesdiscovery.shared.DataSourceRepositoryInfo; + +import com.extjs.gxt.ui.client.Style.HorizontalAlignment; +import com.extjs.gxt.ui.client.Style.Scroll; +import com.extjs.gxt.ui.client.Style.VerticalAlignment; +import com.extjs.gxt.ui.client.event.BaseEvent; +import com.extjs.gxt.ui.client.event.ButtonEvent; +import com.extjs.gxt.ui.client.event.Events; +import com.extjs.gxt.ui.client.event.Listener; +import com.extjs.gxt.ui.client.event.SelectionListener; +import com.extjs.gxt.ui.client.widget.Component; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.Dialog; +import com.extjs.gxt.ui.client.widget.Text; +import com.extjs.gxt.ui.client.widget.VerticalPanel; +import com.extjs.gxt.ui.client.widget.form.Field; +import com.extjs.gxt.ui.client.widget.form.TextField; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.user.client.ui.Anchor; +import com.google.gwt.user.client.ui.HasVerticalAlignment; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Image; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class WindowCredits extends Dialog { + + private TextField txt; + private int widht = 950; + private int height = 400; + private VerticalPanel vpContainer = new VerticalPanel(); + + public WindowCredits(String headingTxt, List listDasourceModel) { + + initLayout(headingTxt); + + + for (DataSourceModel dataSource : listDasourceModel) + addCredits(dataSource); + + add(vpContainer); + + this.show(); + } + + private void initLayout(String headingTxt){ + + + setButtonAlign(HorizontalAlignment.CENTER); + setLayout(new FitLayout()); + +// vpContainer.setHorizontalAlign(HorizontalAlignment.CENTER); + vpContainer.setVerticalAlign(VerticalAlignment.MIDDLE); + vpContainer.getElement().getStyle().setPadding(5, Unit.PX); + vpContainer.setScrollMode(Scroll.AUTOY); + setHeading(headingTxt); + setScrollMode(Scroll.AUTO); + setModal(true); + setBodyStyle("padding: 10px; background: none"); + setWidth(widht); + setHeight(height); + setResizable(true); + setButtons(Dialog.OK); + + getButtonById(Dialog.OK).addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + hide(); + } + + }); + } + + private void addCredits(DataSourceModel dataSource){ + + ContentPanel cp = new ContentPanel(); + cp.setHeaderVisible(false); + cp.setWidth(900); + cp.setScrollMode(Scroll.AUTOX); + + cp.setStyleAttribute("margin-top", "20px"); + cp.setStyleAttribute("margin-bottom", "20px"); + + VerticalPanel verticalPanel = new VerticalPanel(); + + final DataSourceRepositoryInfo dataSourceRepositoryInfo = dataSource.getDataSourceRepositoryInfo(); + + if(dataSourceRepositoryInfo!=null){ + + Image img; + + if(dataSourceRepositoryInfo.getLogoUrl()!=null){ + img = new Image(dataSourceRepositoryInfo.getLogoUrl()); + } + else{ + img = new Image(Resources.INSTANCE.getImageNotFound()); + } + + img.setStyleName("logoDataSource"); + +// img.setWidth("80px"); +// img.setHeight("80px"); + + Anchor anchor = new Anchor(dataSource.getName()); + anchor.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + String url = dataSourceRepositoryInfo.getPageUrl(); + new WindowOpenUrl(url, "_blank", null); + + } + }); + + HorizontalPanel hp = new HorizontalPanel(); + hp.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE); + Text webPage = new Text("Web Page:"); + webPage.setStyleAttribute("margin", "20px"); + hp.add(webPage); + hp.add(anchor); + + VerticalPanel vp = new VerticalPanel(); + Text description = new Text("Description: " +dataSourceRepositoryInfo.getDescription()); + description.setStyleAttribute("margin", "20px"); + + vp.add(description); + addParameters(dataSourceRepositoryInfo.getProperties(),vp); + + verticalPanel.add(img); + verticalPanel.add(hp); + verticalPanel.add(vp); + cp.add(verticalPanel); + vpContainer.add(cp); + + } + + + } + + public WindowCredits(String headingTxt, HashMap hashMapDataSourceClassification) { + + initLayout(headingTxt); + + for (String key : hashMapDataSourceClassification.keySet()) + addCredits(hashMapDataSourceClassification.get(key)); + + add(vpContainer); + + this.show(); + + + } + + private void addParameters(Map mapParameters, VerticalPanel vpParameters){ + + if(mapParameters!=null && mapParameters.size()>0){ + + //ALPHABETICAL ORDER OF THE PARAMETERS + List listKey = Arrays.asList((mapParameters.keySet().toArray(new String[mapParameters.keySet().size()]))); + + Collections.sort(listKey); + + for (String parameter: listKey) { + + String value = mapParameters.get(parameter); + + HorizontalPanel hp = new HorizontalPanel(); + + Text txtParameter = new Text(parameter+":"); + + TextField txtValue = new TextField(); + txtValue.setReadOnly(true); + setTextFieldAttr(txtValue, "background-image", "none"); + setTextFieldAttr(txtValue, "background-color", "none"); + setTextFieldAttr(txtValue, "border-style", "none"); + + if(value!=null && !value.isEmpty()) + txtValue.setValue(value); + else + txtValue.setValue("not found"); + + txtParameter.addStyleName("labelParameters"); + txtValue.addStyleName("valueParameters"); + + hp.add(txtParameter); + hp.add(txtValue); + + hp.setCellWidth(txtParameter, "185px"); + hp.setCellVerticalAlignment(txtParameter, HasVerticalAlignment.ALIGN_MIDDLE); + + hp.setCellHeight(txtParameter, "27px"); + + hp.setCellHeight(txtValue,"27px"); + hp.setCellVerticalAlignment(txtValue, HasVerticalAlignment.ALIGN_MIDDLE); + + vpParameters.add(hp); + + } + } + } + + public String getTxtValue() { + + return txt.getValue(); + } + + public void selectTxt(){ + txt.select(0, txt.getValue().length()); + } + + public interface Function { + public void execute (); + } + + /** + * Safe function call on a component, which was rendered or not. + * + * @param c Component object that must be not null. + * @param f Function object with the function that must be called. + */ + public static void safeFunctionCallOn(final Component c, final Function f) { + c.enableEvents(true); + if (c.isRendered()) { + f.execute(); + } else { + final Listener lsnr = new Listener() { + @Override + public void handleEvent(final BaseEvent be) { + f.execute(); + + } + }; + c.addListener(Events.Render, lsnr); + } + } + + /* Sets a style attribute for the text-field control */ + public static void setTextFieldAttr(final Field textField, final String cssAttrNm, final String attrVal) { + safeFunctionCallOn(textField, new Function() { + @Override + public void execute() { + textField.el().firstChild().setStyleAttribute(cssAttrNm, attrVal); + } + }); + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/window/WindowOpenUrl.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/window/WindowOpenUrl.java new file mode 100644 index 0000000..83f2567 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/window/WindowOpenUrl.java @@ -0,0 +1,15 @@ +package org.gcube.portlets.user.speciesdiscovery.client.window; + +import com.google.gwt.user.client.Window; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class WindowOpenUrl { + + public WindowOpenUrl(String url, String name, String features){ + + Window.open(url, name, features); + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/TaxonomySearchServiceImpl.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/TaxonomySearchServiceImpl.java new file mode 100644 index 0000000..57a9df2 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/TaxonomySearchServiceImpl.java @@ -0,0 +1,2018 @@ +package org.gcube.portlets.user.speciesdiscovery.server; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import javax.persistence.EntityManager; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; + +import net.sf.csv4j.CSVWriter; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.gcube.application.framework.core.session.ASLSession; +import org.gcube.data.spd.model.OccurrencePoint; +import org.gcube.data.spd.model.ResultElement; +import org.gcube.data.spd.model.TaxonomyItem; +import org.gcube.data.spd.stubs.types.Status; +import org.gcube.portlets.user.homelibrary.home.HomeLibrary; +import org.gcube.portlets.user.homelibrary.home.workspace.Workspace; +import org.gcube.portlets.user.homelibrary.home.workspace.WorkspaceFolder; +import org.gcube.portlets.user.homelibrary.util.WorkspaceUtil; +import org.gcube.portlets.user.speciesdiscovery.client.ConstantsSpeciesDiscovery; +import org.gcube.portlets.user.speciesdiscovery.client.model.ClassificationModel; +import org.gcube.portlets.user.speciesdiscovery.client.rpc.TaxonomySearchService; +import org.gcube.portlets.user.speciesdiscovery.client.util.GridField; +import org.gcube.portlets.user.speciesdiscovery.server.asl.SessionUtil; +import org.gcube.portlets.user.speciesdiscovery.server.job.OccurrenceJobUtil; +import org.gcube.portlets.user.speciesdiscovery.server.job.OccurrenceKeys; +import org.gcube.portlets.user.speciesdiscovery.server.job.TaxonomyJobUtil; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.DaoSession; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.OccurrenceJobPersistence; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.OccurrenceRowPersistence; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.ResultRowPersistence; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.TaxonRowPersistence; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.TaxonomyJobPersistence; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.TaxonomyRowPersistence; +import org.gcube.portlets.user.speciesdiscovery.server.service.IteratorChainBuilder; +import org.gcube.portlets.user.speciesdiscovery.server.service.SpeciesService; +import org.gcube.portlets.user.speciesdiscovery.server.service.TaxonomyItemConverter; +import org.gcube.portlets.user.speciesdiscovery.server.session.FetchingSession; +import org.gcube.portlets.user.speciesdiscovery.server.session.FetchingSessionUtil; +import org.gcube.portlets.user.speciesdiscovery.server.session.FilterableFetchingBuffer; +import org.gcube.portlets.user.speciesdiscovery.server.session.SelectableFetchingBuffer; +import org.gcube.portlets.user.speciesdiscovery.server.stream.CSVGenerator; +import org.gcube.portlets.user.speciesdiscovery.server.stream.CloseableIterator; +import org.gcube.portlets.user.speciesdiscovery.server.stream.IteratorPointInfo; +import org.gcube.portlets.user.speciesdiscovery.server.stream.OccurenceCSVConverter; +import org.gcube.portlets.user.speciesdiscovery.server.stream.OccurenceCSVConverterOpenModeller; +import org.gcube.portlets.user.speciesdiscovery.server.stream.StreamExtend; +import org.gcube.portlets.user.speciesdiscovery.server.stream.aggregation.FieldAggregator; +import org.gcube.portlets.user.speciesdiscovery.server.stream.aggregation.TaxonomyClassificationAggregator; +import org.gcube.portlets.user.speciesdiscovery.server.util.DateUtil; +import org.gcube.portlets.user.speciesdiscovery.server.util.QueryUtil; +import org.gcube.portlets.user.speciesdiscovery.shared.CommonName; +import org.gcube.portlets.user.speciesdiscovery.shared.DataSource; +import org.gcube.portlets.user.speciesdiscovery.shared.DataSourceModel; +import org.gcube.portlets.user.speciesdiscovery.shared.DownloadState; +import org.gcube.portlets.user.speciesdiscovery.shared.FetchingElement; +import org.gcube.portlets.user.speciesdiscovery.shared.ItemParameter; +import org.gcube.portlets.user.speciesdiscovery.shared.JobOccurrencesModel; +import org.gcube.portlets.user.speciesdiscovery.shared.JobTaxonomyModel; +import org.gcube.portlets.user.speciesdiscovery.shared.MainTaxonomicRankEnum; +import org.gcube.portlets.user.speciesdiscovery.shared.Occurrence; +import org.gcube.portlets.user.speciesdiscovery.shared.OccurrenceBatch; +import org.gcube.portlets.user.speciesdiscovery.shared.OccurrencesJob; +import org.gcube.portlets.user.speciesdiscovery.shared.OccurrencesSaveEnum; +import org.gcube.portlets.user.speciesdiscovery.shared.OccurrencesStatus; +import org.gcube.portlets.user.speciesdiscovery.shared.ResultRow; +import org.gcube.portlets.user.speciesdiscovery.shared.SaveFileFormat; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchFilters; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchResult; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchResultType; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchServiceException; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchStatus; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchType; +import org.gcube.portlets.user.speciesdiscovery.shared.Taxon; +import org.gcube.portlets.user.speciesdiscovery.shared.TaxonomyJob; +import org.gcube.portlets.user.speciesdiscovery.shared.TaxonomyRow; +import org.gcube.portlets.user.speciesdiscovery.shared.cluster.ClusterStructuresForResultRow; +import org.gcube.portlets.user.speciesdiscovery.shared.cluster.ClusterStructuresForTaxonomyRow; +import org.gcube.portlets.user.speciesdiscovery.shared.filter.ResultFilter; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +/** + * The server side implementation of the RPC service. + * @author "Federico De Faveri defaveri@isti.cnr.it" - + * @author "Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it" + */ +public class TaxonomySearchServiceImpl extends RemoteServiceServlet implements TaxonomySearchService { + + protected static final String SAVE_CHILDREN_OF = "Save children of "; + protected static final String RESUBMIT = "Resubmit"; + + private static final long serialVersionUID = -287193068445844326L; + + protected static final long MAX_BUFFERING_ELEMENTS = 1000; + protected static final long BUFFER_LIMIT = 10; + + protected Logger logger = Logger.getLogger(TaxonomySearchService.class); + + public static final String TAXONOMYUNKNOWN = "Unknown"; + public static final String BASETAXONOMY = "Kingdom"; + public static final String UNK = "Unk"; + + static { + Logger root = Logger.getLogger("org.gcube.portlets.user.speciesdiscovery"); + root.setLevel(Level.ALL); + } + + protected ASLSession getASLSession() + { + return SessionUtil.getAslSession(this.getThreadLocalRequest().getSession()); + } + + protected SpeciesService getSpeciesService() throws SearchServiceException + { + try { + ASLSession session = getASLSession(); + return SessionUtil.getService(session); + } catch (Exception e) { + e.printStackTrace(); + logger.error("An error occurred retrieving the service", e); + // System.out.println("An error occurred retrieving the service" +e); + throw new SearchServiceException("An error occurred retrieving the service: "+e.getMessage()); + } + } + + protected FetchingSession getSearchSession() throws SearchServiceException + { + ASLSession session = getASLSession(); + FetchingSession searchSession = SessionUtil.getCurrentSearchSession(session); + + if (searchSession == null) { + logger.error("No search session found for user "+session.getUsername()); + throw new SearchServiceException("No search session found for user "+session.getUsername()); + } + + return searchSession; + } + + + + protected FetchingSession getOccurrenceSession() throws SearchServiceException + { + ASLSession session = getASLSession(); + FetchingSession occurrenceSession = SessionUtil.getCurrentOccurrenceSession(session); + + if (occurrenceSession == null) { + logger.error("No occurrence session found for user "+session.getUsername()); + throw new SearchServiceException("No occurrence session found for user "+session.getUsername()); + } + + return occurrenceSession; + } + + /** + * {@inheritDoc} + */ + @Override + public void searchByScientificName(String searchTerm, SearchFilters searchFilters) throws SearchServiceException { + logger.trace("searchByScientificName searchTerm: "+searchTerm+" searchFilters: "+searchFilters); + +// System.out.println("searchByScientificName searchTerm: "+searchTerm+" searchFilters: "+searchFilters); + + stopSearch(); + search(searchTerm, SearchType.BY_SCIENTIFIC_NAME, searchFilters); + } + + /** + * {@inheritDoc} + */ + @Override + public void searchByCommonName(String searchTerm, SearchFilters searchFilters) throws SearchServiceException { + logger.trace("searchByCommonName searchTerm: "+searchTerm+" searchFilters: "+searchFilters); + + stopSearch(); + search(searchTerm, SearchType.BY_COMMON_NAME, searchFilters); + } + + protected SearchResultType search(String searchTerm, SearchType searchType, SearchFilters searchFilters) throws SearchServiceException + { + try { + deleteAllRowIntoDaoTable(); //RESET TABLE + + ASLSession aslSession = getASLSession(); + + // logger.trace("In search session id: " + aslSession.getExternalSessionID() + " sessione username: " +aslSession.getUsername() + " session scope: "+aslSession.getScopeName()); + + SpeciesService taxonomyService = getSpeciesService(); + CloseableIterator input = taxonomyService.searchByFilters(searchTerm, searchType, searchFilters); + //DEBUG +// System.out.println("returned input stream by service..."); + logger.trace("returned input stream by service..."); + + SearchResultType resultType = QueryUtil.getResultType(searchFilters); + CloseableIterator output = IteratorChainBuilder.buildChain(input, resultType, aslSession); + FetchingSessionUtil.createFetchingSession(output, resultType, aslSession); + return resultType; + } catch (Exception e) { + logger.error("Error starting search "+searchType+" for term \""+searchTerm+"\" with filters "+searchFilters, e); + e.printStackTrace(); + throw new SearchServiceException(e.getMessage()); + + } + } + + + @Override + public SearchResultType searchByQuery(String query) throws SearchServiceException { + logger.trace("searchByQuery - query: "+query); + + stopSearch(); + + try { + deleteAllRowIntoDaoTable(); //RESET TABLE + + ASLSession aslSession = getASLSession(); + + // logger.trace("In searchByQuery session id: " + aslSession.getExternalSessionID() + " sessione username: " +aslSession.getUsername() + " session scope: "+aslSession.getScopeName()); + + SpeciesService taxonomyService = getSpeciesService(); + CloseableIterator input = taxonomyService.searchByQuery(query); + + //DEBUG + System.out.println("returned input stream by service..."); + logger.trace("returned input stream by service..."); + + SearchResultType resultType = QueryUtil.getQueryResultType(query); + CloseableIterator output = IteratorChainBuilder.buildChain(input, resultType, aslSession); + FetchingSessionUtil.createFetchingSession(output, resultType, aslSession); + + return resultType; + + } catch (Exception e) { + logger.error("Error starting search by query", e); + throw new SearchServiceException(e.getMessage()); + } + } + + + private void deleteAllRowIntoDaoTable() throws Exception{ + +// BaseDaoImpl daoResultRow = null; + ResultRowPersistence daoResultRow = null; + TaxonRowPersistence daoTaxon = null; +// BaseDaoImpl daoCommonName = null; + TaxonomyRowPersistence daoTaxonomyRow = null; + ASLSession session = getASLSession(); + + try { + daoResultRow = DaoSession.getResultRowDAO(session); + daoTaxon = DaoSession.getTaxonDAO(session); + daoTaxonomyRow = DaoSession.getTaxonomyDAO(session); + + } catch (Exception e) { + logger.error("Error in delete all row - getDao's " +e.getMessage(), e); + throw new Exception("Error in delete all row- getDao's " + e.getMessage(), e); + } + + + try { + if(daoResultRow!=null){ + daoResultRow.removeAll(); + } + + if(daoTaxon!=null){ + daoTaxon.removeAll(); + } + + if(daoTaxonomyRow!=null) + daoTaxonomyRow.removeAll(); + + } catch (Exception e) { + logger.error("Error in delete all row"); + throw new Exception("Error in delete all row" + e.getCause(), e); + } + } + + /** + * {@inheritDoc} + */ + @SuppressWarnings("unchecked") + @Override + public SearchResult getSearchResultRows(int start, int limit, ResultFilter activeFiltersObject, boolean onlySelected) throws SearchServiceException { + logger.trace("getSearchResultRows start: "+start+" limit: "+limit+" onlySelected: "+onlySelected); + Long startTime = System.currentTimeMillis(); + + FetchingSession searchSession = (FetchingSession) getSearchSession(); + + ArrayList chunk = new ArrayList(); + + + try { + List data = new ArrayList(); + if (onlySelected) { + SelectableFetchingBuffer buffer = (SelectableFetchingBuffer) searchSession.getBuffer(); + data = buffer.getSelected(); + + int end = Math.min(start+limit, data.size()); + start = Math.min(start, end); + + logger.trace("chunk selected data bounds [start: "+start+" end: " + end+"]"); + + data = data.subList(start, end); + + } else if (activeFiltersObject == null || (!activeFiltersObject.isActiveFilters())) { + if(limit>0){ + data = searchSession.getBuffer().getList(start,limit); + } + } else { + FilterableFetchingBuffer buffer = (FilterableFetchingBuffer) searchSession.getBuffer(); + data = buffer.getFilteredList(activeFiltersObject); + + int end = Math.min(start+limit, data.size()); + start = Math.min(start, end); + + logger.trace("chunk filtered data bounds [start: "+start+" end: " + end+"]"); + + data = data.subList(start, end); + } + + logger.trace("Fetching data from search session buffer, size: "+data.size()); + +// int end = Math.min(start+limit, data.size()); +// start = Math.min(start, end); + + for (ResultRow resultRow : data) { + + //return common names? + if(activeFiltersObject == null || !activeFiltersObject.isLoadCommonName() || !resultRow.existsCommonName()){ + resultRow.setCommonNames(null); + } + + //return properties? + if(activeFiltersObject == null || !resultRow.existsProperties() || !activeFiltersObject.isLoadAllProperties()){ + resultRow.setProperties(null); + } + +// System.out.println("resultRow "+resultRow); + + chunk.add(resultRow); + + logger.trace("getSearchResultRows return on client result item with id: " +resultRow.getId() + " service id: "+resultRow.getServiceId()); + +// DEBUG +// logger.trace("getSearchResultRows return on client result row: " +resultRow); + //System.out.println("getSearchResultRows return on client result item with id: " +resultRow.getId() + " service id: "+resultRow.getServiceId()); + } + + Long endTime = System.currentTimeMillis() - startTime; + String time = String.format("%d msc %d sec", endTime, TimeUnit.MILLISECONDS.toSeconds(endTime)); + logger.trace("returning "+chunk.size()+" elements in " + time); + // result = new SearchResult(chunk); + + } catch (Exception e) { + logger.error("Error in getSearchResultRows " + e.getMessage()); + e.printStackTrace(); + // System.out.println("Error in getSearchResultRows " +e); + // System.out.println("Error in getSearchResultRows " +e.getMessage()); + throw new SearchServiceException(e.getMessage()); + } + +// return new SearchResult(new ArrayList()); + + return new SearchResult(chunk); + } + + private void printProperties(List properties){ + + for (ItemParameter itemParameter : properties) { + System.out.println("Property "+itemParameter); + } + + } + + @SuppressWarnings("unchecked") + @Override + public SearchResult getSearchTaxonomyRow(int start, int limit, ResultFilter activeFiltersObject, boolean onlySelected) throws SearchServiceException { + + logger.trace("getSearchResultRows start: "+start+" limit: "+limit+" onlySelected: "+onlySelected); + Long startTime = System.currentTimeMillis(); + + FetchingSession searchSession = (FetchingSession) getSearchSession(); + + ArrayList chunk = new ArrayList(); + + try { + + logger.trace("current buffer size "+searchSession.getBuffer().size()); + List data = new ArrayList(); + + if (onlySelected) { + logger.trace("getting only selected data"); + SelectableFetchingBuffer buffer = (SelectableFetchingBuffer) searchSession.getBuffer(); + data = buffer.getSelected(); + + int end = Math.min(start+limit, data.size()); + start = Math.min(start, end); + + logger.trace("chunk selected data bounds [start: "+start+" end: " + end+"]"); + + data = data.subList(start, end); + + } else if (activeFiltersObject == null || (!activeFiltersObject.isActiveFilters())) { + logger.trace("getting all available data"); + + if(limit>0){ + Map filterAndMap = new HashMap(); + filterAndMap.put(TaxonomyRow.IS_PARENT, "false"); + data = searchSession.getBuffer().getList(filterAndMap, start,limit); + } + } else { + logger.trace("getting filtered data"); + FilterableFetchingBuffer buffer = (FilterableFetchingBuffer) searchSession.getBuffer(); + data = buffer.getFilteredList(activeFiltersObject); + + int end = Math.min(start+limit, data.size()); + start = Math.min(start, end); + + logger.trace("chunk filtered data bounds [start: "+start+" end: " + end+"]"); + + data = data.subList(start, end); + } + + logger.trace("Fetching data from search session buffer, size: "+data.size()); + + for (TaxonomyRow taxonomyRow : data) { + //ADD common names + + //return common names? + if(activeFiltersObject == null || !activeFiltersObject.isLoadCommonName() || !taxonomyRow.existsCommonName()){ + taxonomyRow.setCommonNames(null); + } + + //return properties? + if(activeFiltersObject == null || !taxonomyRow.existsProperties() || !activeFiltersObject.isLoadAllProperties()){ + taxonomyRow.setProperties(null); + } + + // logger.trace("getSearchTaxonomyRow return on client taxonomy row: " +taxonomyRow.getId()); + + logger.trace("getSearchTaxonomyRow return on client taxonomy item with id: " +taxonomyRow.getId() + " service id: "+taxonomyRow.getServiceId()); + // System.out.println("getSearchTaxonomyRow return on client taxonomy item with id: " +taxonomyRow.getId() + " service id: "+taxonomyRow.getServiceId()); + + chunk.add(taxonomyRow); + + } + + Long endTime = System.currentTimeMillis() - startTime; + String time = String.format("%d msc %d sec", endTime, TimeUnit.MILLISECONDS.toSeconds(endTime)); + logger.trace("returning "+chunk.size()+" elements in " + time); + + } catch (Exception e) { + logger.error("Error in getSearchTaxonomyRow " + e.getMessage(), e); + e.printStackTrace(); + // System.out.println("Error in getSearchTaxonomyRow " +e); + // System.out.println("Error in getSearchTaxonomyRow " +e.getMessage()); + throw new SearchServiceException(e.getMessage()); + } + + return new SearchResult(chunk); + } + + public TaxonomyRow loadTaxonomyParentByParentId(String parentID) throws Exception { + + TaxonomyRow taxonomyRow = null; + logger.trace("loadTaxonomyParentByParentId: "+ parentID); + + try { + + TaxonomyRowPersistence dao = DaoSession.getTaxonomyDAO(getASLSession()); + + CriteriaBuilder queryBuilder = dao.getCriteriaBuilder(); + CriteriaQuery cq = queryBuilder.createQuery(); + Predicate pr1 = queryBuilder.equal(dao.rootFrom(cq).get(TaxonomyRow.PARENT_ID), parentID); + cq.where(pr1); + + Iterator iterator = dao.executeCriteriaQuery(cq).iterator(); + + if(iterator!=null && iterator.hasNext()){ + taxonomyRow = iterator.next(); + } + + } catch (Exception e) { + logger.error("Error in loadTaxonomyParentsByRowId", e); + throw new Exception(e); + } + + return taxonomyRow; + } + +// public void loadParentsListOfTaxonomy(TaxonomyRow taxonomy) throws Exception { +// +// taxonomy.setParent(setParentListOfTaxonomy(taxonomy.getParent())); +// } +// +// private TaxonomyRow setParentListOfTaxonomy(TaxonomyRow taxonomy) throws Exception{ +// +// if (taxonomy == null) return null; +// // DaoSession.getTaxonomyDAO(getASLSession()).refresh(taxonomy.getParent()); +// taxonomy.setParent(setParentListOfTaxonomy(taxonomy.getParent())); +// return taxonomy; +// } + + + + /** + * {@inheritDoc} + */ + @Override + public HashMap getFilterCounterById(GridField field) throws Exception { + logger.trace("Filter Counter for: "+ field); + try { + FetchingSession searchSession = (FetchingSession) getSearchSession(); + FieldAggregator aggregator = (FieldAggregator) searchSession.getAggregator(FieldAggregator.getFieldAggregatorName(field)); + if (aggregator!=null) return aggregator.getAggregation(); + else return new HashMap(); + } catch(Exception e) + { + logger.error("Error in getFilterCounterById "+ field.getId()+" "+field.getName(), e); + throw new SearchServiceException(e.getMessage()); + } + } + + + @Override + public HashMap getFilterCounterForClassification(String rankLabel) throws Exception { + logger.trace("Counter for classification: "+ rankLabel); + try { + MainTaxonomicRankEnum rank = MainTaxonomicRankEnum.valueOfLabel(rankLabel); + + if (rank!=null) { + FetchingSession searchSession = (FetchingSession) getSearchSession(); + TaxonomyClassificationAggregator classificationAggregator = (TaxonomyClassificationAggregator) searchSession.getAggregator(TaxonomyClassificationAggregator.NAME); + return classificationAggregator.getAggregation().get(rank); + } else return new HashMap(); + } catch(Exception e) + { + logger.error("Error in getFilterCounterForClassification "+ rankLabel, e); + throw new SearchServiceException(e.getMessage()); + } + } + + + /** + * {@inheritDoc} + */ + @Override + public SearchStatus getSearchStatus(boolean onlySelected, boolean isActiveFilterOnResult) throws SearchServiceException { + logger.trace("getSearchStatus onlySelected: "+onlySelected); + + FetchingSession searchSession = getSearchSession(); + + SearchStatus status = new SearchStatus(); + int bufferSize = 0; + + try { + bufferSize = isActiveFilterOnResult?((FilterableFetchingBuffer) searchSession.getBuffer()).getFilteredListSize():searchSession.getBufferSize(); + } catch (Exception e) { + logger.trace("getSearchStatus bufferSize error : "+e.getMessage(), e); + throw new SearchServiceException(e.getMessage()); + } + + logger.trace("getSearchStatus bufferSize " + bufferSize); + //if buffer size is >= the MAXIMUM ELEMENTS. Maximun is reached and the search is stopped + if(bufferSize>=MAX_BUFFERING_ELEMENTS){ + logger.trace("getSearchStatus MAX_BUFFERING_ELEMENTS is reached - stop search"); + stopSearchWithoutRemove(); + status.setResultEOF(true); + status.setSize(bufferSize); + status.setIsMaxSize(true); + return status; + } + + // logger.trace("Control !onlySelected && !isActiveFilterOnResult"); + if (!onlySelected && !isActiveFilterOnResult) { + status.setResultEOF(searchSession.isComplete()); + status.setSize(bufferSize); + // logger.trace("Control isActiveFilterOnResult "+ isActiveFilterOnResult); + } else if(isActiveFilterOnResult){ + status.setResultEOF(true); + + try { + status.setSize(((FilterableFetchingBuffer) searchSession.getBuffer()).getFilteredListSize()); + } catch (Exception e) { + logger.error("isActiveFilterOnResult - An error occured in getSearchStatus " +e.getMessage(), e); + throw new SearchServiceException(e.getMessage()); + } + } + else{ + + status.setResultEOF(true); + + try { + status.setSize(((SelectableFetchingBuffer) searchSession.getBuffer()).getSelected().size()); + } catch (Exception e) { + logger.error("An error occured in getSearchStatus " +e.getMessage(), e); + throw new SearchServiceException(e.getMessage()); + } + } + + logger.trace("getSearchStatus return status size: "+status.getSize() +" EOF: " + status.isResultEOF()); + return status; + } + + + /** + * {@inheritDoc} + */ + public void stopSearchWithoutRemove() throws SearchServiceException { + logger.trace("stopSearch()"); + + ASLSession session = getASLSession(); + //we safely get the session if exists + FetchingSession searchSession = SessionUtil.getCurrentSearchSession(session); + + if (searchSession != null) { + try { + searchSession.close(); + } catch (IOException e) { + throw new SearchServiceException(e.getMessage()); + } + } else logger.warn("Search session not found"); + } + + /** + * {@inheritDoc} + */ + @Override + public void stopSearch() throws SearchServiceException { + logger.trace("stopSearch()"); + + ASLSession session = getASLSession(); + FetchingSession searchSession = SessionUtil.getCurrentSearchSession(session); + + if (searchSession != null) { + try { + searchSession.close(); + } catch (IOException e) { + throw new SearchServiceException(e.getMessage()); + } + SessionUtil.setCurrentSearchSession(session, null); + } else logger.warn("Search session not found"); + } + + /** + * {@inheritDoc} + */ + @Override + public void updateRowSelection(int rowId, boolean selection) throws SearchServiceException { + logger.trace("updateRowSelection rowId: "+rowId+" selection: "+selection); + + try { + ASLSession session = getASLSession(); + FetchingSession searchSession = SessionUtil.getCurrentSearchSession(session); + SelectableFetchingBuffer buffer = (SelectableFetchingBuffer) searchSession.getBuffer(); + buffer.updateSelection(rowId, selection); + + } catch(Exception e){ + logger.error("Error in updateRowSelection rowId: "+rowId+" selection: "+selection, e); + throw new SearchServiceException(e.getMessage()); + } + } + + + /** + * {@inheritDoc} + */ + @Override + public Integer updateRowSelections(boolean selection, ResultFilter activeFiltersObject) throws SearchServiceException { + logger.trace("updateRowSelections selection: "+selection); + List data; + FetchingSession searchSession = getSearchSession(); + int size = 0; + try { + + if (activeFiltersObject == null || (!activeFiltersObject.isActiveFilters())) { + SelectableFetchingBuffer buffer = (SelectableFetchingBuffer) searchSession.getBuffer(); + buffer.updateAllSelection(selection); + size = buffer.size(); + } else { + @SuppressWarnings("unchecked") + FilterableFetchingBuffer buffer = (FilterableFetchingBuffer) searchSession.getBuffer(); + data = buffer.getFilteredList(activeFiltersObject); + + if(data!=null){ + for (FetchingElement fetchingElement : data) + updateRowSelection(fetchingElement.getId(), selection); + + size = data.size(); + } + } + + } catch (Exception e) { + logger.error("An error occurred in updateRowSelections", e); + throw new SearchServiceException(e.getMessage()); + } + + return Integer.valueOf(size); + } + + + /** + * {@inheritDoc} + * @throws SearchServiceException + */ + @Override + public int countOfSelectedRow() throws SearchServiceException{ + logger.trace("countOfSelectedRow()"); + + FetchingSession searchSession = getSearchSession(); + + try { + + SelectableFetchingBuffer buffer = (SelectableFetchingBuffer) searchSession.getBuffer(); + return buffer.sizeSelected(); + + } catch (Exception e) { + logger.error("An error occurred in updateRowSelections", e); + throw new SearchServiceException(e.getMessage()); + } + } + + + /** + * {@inheritDoc} + */ + @SuppressWarnings("unchecked") + @Override + public int retrieveOccurencesFromSelection() throws SearchServiceException { + logger.trace("retrieveOccurencesFromSelection()"); + + int count = 0; + FetchingSession searchSession = (FetchingSession) getSearchSession(); + + try { + Collection selectedRows = ((SelectableFetchingBuffer) searchSession.getBuffer()).getSelected(); + logger.trace("found "+selectedRows.size()+" selected rows"); + + List keys = new ArrayList(selectedRows.size()); + + for (ResultRow row:selectedRows) { + //ADD KEY ONLY IF IS NOT EQUAL NULL AND SIZE IS > 0 + if(row.getOccurencesKey()!=null && row.getOccurencesKey().length()>0){ + keys.add(row.getOccurencesKey()); + count += row.getOccurencesCount(); + } + } + + logger.trace("found "+count+" occurrence points"); + + //TODO remove + if (logger.isTraceEnabled()) logger.trace("selected keys: "+keys); + + SpeciesService taxonomyService = getSpeciesService(); + + CloseableIterator source = taxonomyService.getOccurrencesByKeys(keys); + CloseableIterator input = IteratorChainBuilder.buildOccurrenceConverter(source); + + //DELETE ALL ROW INTO DAO OCCURENCES + OccurrenceRowPersistence occurrencesDao = DaoSession.getOccurrenceDAO(getASLSession()); + occurrencesDao.removeAll(); + FetchingSessionUtil.createOccurrenceFetchingSession(input, getASLSession()); + + } catch (Exception e) { + logger.error("An error occurred getting the number of occurrence points", e); + throw new SearchServiceException(e.getMessage()); + } + + return count; + } + + @Override + public OccurrenceBatch getOccurrencesBatch(int start, int limit) throws SearchServiceException { + logger.trace("getOccurrencesBatch: start: "+start+" limit: "+limit); + + FetchingSession occurrenceSession = getOccurrenceSession(); + + // ASLSession session = getASLSession(); + // FetchingSession occurrenceSession = SessionUtil.getCurrentOccurrenceSession(session); + + List buffer; + OccurrenceBatch result = null; + + try { + buffer = occurrenceSession.getBuffer().getList(); + + logger.trace("Fetching data from occurrence session buffer, size: "+buffer.size()); + + int end = Math.min(start+limit, buffer.size()); + + logger.trace("chunk bounds[start: "+start+" end: " + end+"]"); + + ArrayList data = new ArrayList(buffer.subList(start, end)); + logger.trace("returning "+data.size()+" elements"); + + //DEBUG +// for (Occurrence occurrence : data) { +// logger.trace("citation :" + occurrence.getCitation()+ +// " catalog number: "+occurrence.getCatalogueNumber()+ +// " country: " +occurrence.getCountry()+ +// " family: "+occurrence.getFamily()+ +// " id: "+ occurrence.getId() + +// " institute code: " +occurrence.getInstitutionCode() + +// " kingdom: " + occurrence.getKingdom()+ +// " scientific name: "+ occurrence.getScientificName()+ +// " basis of record: "+occurrence.getBasisOfRecord()); +// +// } + + result = new OccurrenceBatch(data); + result.setResultEOF(occurrenceSession.isComplete()); + + } catch (Exception e) { + logger.error("An error occurred getting the occurrence points", e); + throw new SearchServiceException(e.getMessage()); + } + + return result; + } + + @Override + public OccurrencesStatus getCountOfOccurrencesBatch() throws SearchServiceException { + logger.trace("get CountOf Occurrences Batch"); + + FetchingSession occurrenceSession = getOccurrenceSession(); + List buffer; + + try { + buffer = occurrenceSession.getBuffer().getList(); + + logger.trace("Fetching data from occurrence session buffer, size: "+buffer.size()); + + + return new OccurrencesStatus(occurrenceSession.isComplete(), buffer.size()); + + } catch (Exception e) { + logger.error("An error occurred getting the occurrence points", e); + throw new SearchServiceException(e.getMessage()); + } + } + + /** + * {@inheritDoc} + */ + @Override + public void stopRetrievingOccurrences() throws SearchServiceException { + logger.trace("stop Retrieving Occurrences "); + + ASLSession session = getASLSession(); + FetchingSession occurrenceSearchSession = SessionUtil.getCurrentOccurrenceSession(session); + + if (occurrenceSearchSession != null) { + try { + occurrenceSearchSession.close(); + logger.trace("Occurrence session removed"); + } catch (IOException e) { + throw new SearchServiceException(e.getMessage()); + } + SessionUtil.setCurrentOccurrenceSession(session, null); + } else logger.warn("Occurrence session not found"); + } + + /** + * {@inheritDoc} + */ + @Override + public String generateMapFromSelectedOccurrencePoints() throws SearchServiceException { + + logger.trace("generate Map From Occurrence Points"); + + Iterator iteratorOccurrences = getIteratorSelectedOccurrenceIds(); + IteratorPointInfo streamKey = new IteratorPointInfo(iteratorOccurrences); + + try { + SpeciesService taxonomyService = getSpeciesService(); + String groupName = taxonomyService.generateMapFromOccurrencePoints(streamKey); + logger.trace("generated groupName: "+groupName); + return groupName; + } catch (Exception e) { + logger.error("An error occurred creating the map", e); + throw new SearchServiceException(e.getMessage()); + } + } + + //USED FOR DEBUG + protected void printId(List listId){ + + for (String id : listId) { + System.out.println("Found id : " +id); + } + + } + + protected List getSelectedOccurrenceIds() throws SearchServiceException{ + + FetchingSession occurrenceSession = getOccurrenceSession(); + + List buffer; + List listId = new ArrayList(); + + try { + + buffer = occurrenceSession.getBuffer().getList(); + + for (Occurrence occurrence : buffer) { + listId.add(occurrence.getServiceId()); + } + + return listId; + } catch (Exception e) { + + logger.error("An error occurred on getSelectedOccurrenceIds", e); + throw new SearchServiceException(e.getMessage()); + } + + } + + protected Iterator getIteratorSelectedOccurrenceIds() throws SearchServiceException{ + + FetchingSession occurrenceSession = getOccurrenceSession(); + try { + return occurrenceSession.getBuffer().getList().iterator(); + } catch (Exception e) { + logger.error("An error occurred on getIteratorSelectedOccurrenceIds", e); + throw new SearchServiceException(e.getMessage()); + } + + } + + @Override + public void saveSelectedOccurrencePoints(String destinationFolderId, String fileName, SaveFileFormat fileFormat, OccurrencesSaveEnum typeCSV) throws SearchServiceException { + logger.trace("saveSelectedOccurrencePoints destinationFolderId: "+destinationFolderId+" fileName: "+fileName+" fileFormat: "+fileFormat+" typeCSV: "+typeCSV); + + /* List listId = getSelectedOccurrenceIds(); + printId(listId); + + //RETURN IF SIZE OF LIST OCCURRENCE ID IS 0 + if(listId.size()==0){ + logger.error("There are not occurrences point to save"); + throw new SearchServiceException("There are not occurrences point to save"); + } + + File file = null; + String mimeType = null; + + switch (fileFormat) { + case CSV: { + mimeType = "text/csv"; + try { + file = generateCSVFile(listId, typeCSV); + } catch (Exception e) { + logger.error("An error occurred generating the csv file", e); + throw new SearchServiceException(e.getMessage()); + } + + } break; + case DARWIN_CORE:{ + mimeType = "application/xhtml+xml"; + try { + SpeciesService taxonomyService = getSpeciesService(); + file = taxonomyService.getOccurrencesAsDarwinCoreByIds(listId); + } catch (Exception e) { + logger.error("An error occurred retrieving the darwin core file", e); + throw new SearchServiceException(e.getMessage()); + } + } break; + } + + try { + logger.trace("tmp file: "+file.getAbsolutePath()); + + Workspace workspace = HomeLibrary.getUserWorkspace(getASLSession()); + + WorkspaceFolder folder = (WorkspaceFolder)workspace.getItem(destinationFolderId); + fileName = WorkspaceUtil.getUniqueName(fileName, folder); + folder.createExternalFileItem(fileName, "Occurrence points generated files", mimeType, new FileInputStream(file)); + + file.delete(); + + logger.trace("Save complete"); + + } catch (Exception e) { + + logger.error("An error occurred saving the generated file into the workspace", e); + throw new SearchServiceException(e.getMessage()); + } + + */ + } + + @Override + public void saveSelectedTaxonomyPoints(String destinationFolderId, String fileName, SaveFileFormat fileFormat) throws SearchServiceException { + /* + logger.trace("saveSelectedTaxonomyPoints destinationFolderId: "+destinationFolderId+" fileName: "+fileName+" fileFormat: "+fileFormat); + + List listId = getSelectedTaxonomyId(); + printId(listId); + + File file = null; + String mimeType = null; + + switch (fileFormat) { + case DARWIN_CORE_ARCHIVE:{ + mimeType = ""; + try { + SpeciesService taxonomyService = getSpeciesService(); + file = taxonomyService.getOccurrencesAsDarwinCoreArchive(listId); + } catch (Exception e) { + logger.error("An error occurred retrieving the darwin core file", e); + throw new SearchServiceException(e.getMessage()); + } + } break; + } + + try { + logger.trace("tmp file: "+file.getAbsolutePath()); + + Workspace workspace = HomeLibrary.getUserWorkspace(getASLSession()); + + WorkspaceFolder folder = (WorkspaceFolder)workspace.getItem(destinationFolderId); + fileName = WorkspaceUtil.getUniqueName(fileName, folder); + folder.createExternalFileItem(fileName, "Occurrence points generated files", mimeType, new FileInputStream(file)); + + file.delete(); + + logger.trace("Save complete"); + + } catch (Exception e) { + + logger.error("An error occurred saving the generated file into the workspace", e); + throw new SearchServiceException(e.getMessage()); + } + + */ + } + + @SuppressWarnings("unchecked") + protected List getSelectedOccurrenceKeys() throws SearchServiceException + { + FetchingSession searchSession = (FetchingSession) getSearchSession(); + + Collection selectedRows; + + List keys = null; + try { + selectedRows = ((SelectableFetchingBuffer) searchSession.getBuffer()).getSelected(); + + logger.trace("found "+selectedRows.size()+" selected rows"); + + keys = new ArrayList(selectedRows.size()); + int count = 0; + + for (ResultRow row:selectedRows) { + keys.add(row.getOccurencesKey()); + count += row.getOccurencesCount(); + } + + logger.trace("found "+count+" occurrence points and "+keys.size()+" keys"); + + //TODO remove + if (logger.isTraceEnabled()) logger.trace("selected keys: "+keys); + + } catch (Exception e) { + logger.error("An error occured in getSelectedOccurrenceKeys" + e.getMessage()); + throw new SearchServiceException(e.getMessage()); + } + + return keys; + } + + + @SuppressWarnings("unchecked") + protected List getSelectedResultRowId() throws SearchServiceException + { + FetchingSession searchSession = (FetchingSession) getSearchSession(); + + Collection selectedRows; + + List listId = null; + try { + selectedRows = ((SelectableFetchingBuffer) searchSession.getBuffer()).getSelected(); + + logger.trace("found "+selectedRows.size()+" selected rows"); + + listId = new ArrayList(selectedRows.size()); + + for (ResultRow row:selectedRows) + listId.add(row.getServiceId()); + + logger.trace("found "+listId.size()+" ids"); + + //TODO remove + if (logger.isTraceEnabled()) logger.trace("selected ids: "+listId); + + } catch (Exception e) { + logger.error("An error occured in getSelectedOccurrenceKeys" + e.getMessage()); + throw new SearchServiceException(e.getMessage()); + } + + return listId; + } + + + @SuppressWarnings("unchecked") + protected List getSelectedTaxonomyId() throws SearchServiceException + { + FetchingSession searchSession = (FetchingSession) getSearchSession(); + + Collection selectedRows; + + List listId = null; + try { + selectedRows = ((SelectableFetchingBuffer) searchSession.getBuffer()).getSelected(); + + logger.trace("found "+selectedRows.size()+" selected rows"); + + listId = new ArrayList(selectedRows.size()); + + for (TaxonomyRow row:selectedRows){ + listId.add(row.getServiceId()); + logger.trace("add this id: "+row.getServiceId()+" to list"); + } + + logger.trace("found "+listId.size()+" id"); + + //TODO remove + if (logger.isTraceEnabled()) logger.trace("selected ids: "+listId); + + } catch (Exception e) { + logger.error("An error occured in getSelectedOccurrenceKeys" + e.getMessage()); + throw new SearchServiceException(e.getMessage()); + } + + return listId; + } + + protected File generateCSVFile(List ids, OccurrencesSaveEnum csvType) throws Exception + { + File csvFile = File.createTempFile("test", ".csv"); + logger.trace("outputfile "+csvFile.getAbsolutePath()); + + FileWriter fileWriter = new FileWriter(csvFile); + CSVWriter writer = new CSVWriter(fileWriter); + + SpeciesService taxonomyService = getSpeciesService(); + + CloseableIterator source = taxonomyService.getOccurrencesByIds(ids); + CloseableIterator result = IteratorChainBuilder.buildOccurrenceConverter(source); + + CSVGenerator csvGenerator = null; + + switch (csvType) { + + case OPENMODELLER: { + + OccurenceCSVConverterOpenModeller converterOpenModeller = new OccurenceCSVConverterOpenModeller(); + csvGenerator = new CSVGenerator(result, converterOpenModeller, OccurenceCSVConverterOpenModeller.HEADER); + + }break; + + case STANDARD:{ + + OccurenceCSVConverter converter = new OccurenceCSVConverter(); + csvGenerator = new CSVGenerator(result, converter, OccurenceCSVConverter.HEADER); + + }break; + } + + + // OccurenceCSVConverter converter = new OccurenceCSVConverter(); + // ConversionIterator> occurrencesConverter = new ConversionIterator>(result, converter); + + while(csvGenerator.hasNext()) writer.writeLine(csvGenerator.next()); + + fileWriter.close(); + + return csvFile; + } + + + @Override + public List loadDataSourceList() throws Exception { + logger.trace("loadDataSourceList... "); +// System.out.println("loadDataSourceList loadDataSourceList loadDataSourceList loadDataSourceList loadDataSourceList "); + List listDS = null; + + + + try { + DaoSession.initSessionDaoObjects(getASLSession()); //FIXME temporary? + logger.trace("DAOs OK... "); + System.out.println("DAOs OK"); + SpeciesService taxonomyService = getSpeciesService(); + System.out.println("Species Services OK"); + logger.trace("Species Services OK... "); + listDS = taxonomyService.getPlugins(); + System.out.println("Plugins OK"); + logger.trace("Plugins OK"); + logger.trace("Return list plugin - size: " +listDS.size()); + + } catch (Exception e) { + logger.error("Error on loadDataSourceList",e); + e.printStackTrace(); + throw new Exception("Error on loadDataSourceLists", e); + } + + return listDS; + } + + + @Override + public ArrayList loadListCommonNameByRowId(String resultRowId) throws Exception { + + ArrayList listCommonName = new ArrayList(); + + + //TODO +// try { +// Dao commonDao = DaoSession.getCommonNameDAO(getASLSession()); +// +// QueryBuilder queryBuilder = commonDao.queryBuilder(); +// +// com.j256.ormlite.dao.CloseableIterator iterator = queryBuilder.where().eq(CommonName.REFERENCE_RESULTROW_ID, resultRowId).iterator(); +// +// while(iterator.hasNext()){ +// listCommonName.add(iterator.next()); +// } +// +// iterator.close(); +// +// } catch (Exception e) { +// logger.error("Error on loadListCommonNameByRowId",e); +// throw new Exception("Error on loadListCommonNameByRowId", e); +// } + + return listCommonName; + } + + @Override + public List getParentsList(Taxon taxon) throws Exception { + +// ArrayList listParent = new ArrayList(); +// +// getParentListOfTaxon(taxon.getParent(), listParent); +// +// return listParent; + + return null; + } + +// private void getParentListOfTaxon(Taxon parent, List listParent) throws Exception{ +// +// if(parent!=null){ +// if (parent.getParent()!=null) { +// DaoSession.getTaxonDAO(getASLSession()).refresh(parent.getParent()); +// getParentListOfTaxon(parent.getParent(),listParent); +// } +// listParent.add(parent); +// } +// } + + @Override + public ArrayList loadListChildByParentId(String parentId) throws Exception { + logger.trace("Load List Children By ParentId: " + parentId); + //FOR DEBUG +// System.out.println("Load List Children By ParentId: " + parentId); + ArrayList listTaxonomyRow = new ArrayList(); + try { + + SpeciesService taxonomyService = getSpeciesService(); + CloseableIterator streamIterator = taxonomyService.getTaxonChildrenByParentId(parentId); + TaxonomyItemConverter converter = new TaxonomyItemConverter(getASLSession()); + + int i = 0; + while (streamIterator.hasNext()) { + TaxonomyItem tax = streamIterator.next(); + // from TaxonomyItem to TaxonomyRow + TaxonomyRow taxonomyRow = converter.convert(tax); + listTaxonomyRow.add(taxonomyRow); + logger.trace(i + ") taxonomyRow: " + taxonomyRow); + i++; + } + + streamIterator.close(); + + } catch (Exception e) { + logger.error("Error on loadListChildByParentId ", e); + throw new Exception("Error on loadListChildByParentId", e); + } + + logger.trace("Return list children By ParentId - size"+ listTaxonomyRow.size()); + + return listTaxonomyRow; + } + + @Override + public List getListTaxonomyJobs() throws Exception { + logger.trace("getListTaxonomyJobs... "); +// System.out.println("getListSpeciesJobs..."); + + TaxonomyJobPersistence taxonomyJobDao = DaoSession.getTaxonomyJobDAO(getASLSession()); + + Iterator iterator = taxonomyJobDao.getList().iterator(); + + SpeciesService taxonomyService = getSpeciesService(); + + List listJobs = new ArrayList(); + + while(iterator!=null && iterator.hasNext()){ + TaxonomyJob job = iterator.next(); + + logger.trace("get taxonomy job "+job.getId()+ " from service"); +// System.out.println("get taxonomy job "+job.getId()+ " from service"); + + try{ + + Status statusResponse = taxonomyService.getTaxonomyJobById(job.getId()); + + if(statusResponse!=null){ + logger.trace("statusResponse is not null..." + job.getId()); +// System.out.println("statusResponse is not null..." + job.getId()); + JobTaxonomyModel jobSpeciesModel = TaxonomyJobUtil.convertJob(job, statusResponse, taxonomyJobDao); + + //FOR DEBUG +// System.out.println("getListTaxonomyJobs added list: "+jobSpeciesModel); + logger.trace("added list jobTaxonomyId: "+job.getTaxonomyId() + " status "+job.getState()); + + if(jobSpeciesModel!=null) + listJobs.add(jobSpeciesModel); + } + else{ + logger.trace("TaxonomyJob statusResponse is null..." + job.getId()); +// System.out.println("TaxonomyJob statusResponse is null..." + job.getId()); +// System.out.println("statusResponse is null..." + job.getId()); + TaxonomyJobUtil.deleteTaxonomyJobById(job.getId(),taxonomyJobDao); + } + + }catch (Exception e) { + e.printStackTrace(); + logger.error("Error on getListSpeciesJobs ", e); + throw new Exception("Error on getListSpeciesJobs", e); + } + } + + return listJobs; + + } + + @Override + public JobTaxonomyModel createTaxonomyJobByChildren(TaxonomyRow taxonomy, String dataSourceName) throws Exception { + + logger.trace("Create job for taxonomy id: " + taxonomy.getServiceId()); +// System.out.println("Create job for taxonomy id: " + taxonomy.getServiceId()); + + JobTaxonomyModel jobSpeciesModel = null; + + TaxonomyJobPersistence taxonomyJobDao = DaoSession.getTaxonomyJobDAO(getASLSession()); + + SpeciesService taxonomyService = getSpeciesService(); + + String speciesJobId = taxonomyService.createTaxonomyJobForDWCAByChildren(taxonomy.getServiceId()); + + long startTime = Calendar.getInstance().getTimeInMillis(); + + //STORE INTO DAO + TaxonomyJob speciesJob = new TaxonomyJob(speciesJobId, DownloadState.PENDING.toString(), SAVE_CHILDREN_OF+taxonomy.getName(), taxonomy.getName(), dataSourceName, taxonomy.getRank(), startTime, 0, taxonomy.getServiceId()); + taxonomyJobDao.insert(speciesJob); + + jobSpeciesModel = new JobTaxonomyModel(speciesJob.getId(), speciesJob.getDescriptiveName(), DownloadState.PENDING, null, taxonomy.getName(), dataSourceName, taxonomy.getRank()); + + Date start = DateUtil.millisecondsToDate(speciesJob.getStartTime()); +// jobSpeciesModel.setStartTime(DateUtil.dateToDateFormatString(start)); + jobSpeciesModel.setStartTime(start); + jobSpeciesModel.setEndTime(null); + + return jobSpeciesModel; + } + + + @Override + public JobTaxonomyModel createTaxonomyJobByIds(String search, List dataSources) throws Exception { + + logger.trace("Create job ForDWCAByIds for: " + search); + + List listId = getSelectedTaxonomyId(); +// printId(listId); + +// System.out.println("Create job for taxonomy id: " + taxonomy.getServiceId()); + + JobTaxonomyModel jobSpeciesModel = null; + + TaxonomyJobPersistence taxonomyJobDao = DaoSession.getTaxonomyJobDAO(getASLSession()); + + SpeciesService taxonomyService = getSpeciesService(); + + String speciesJobId = taxonomyService.createTaxonomyJobForDWCAByIds(listId); + + long startTime = Calendar.getInstance().getTimeInMillis(); + + String name = "Save DWCA with "+listId.size()+ " "; + + name += listId.size()>1?"items":"item"; + name += " "+search; + + String dataSourceName = ""; + + for (DataSourceModel dataSource : dataSources) { + dataSourceName+=dataSource.getName() + ", "; + } + + //STORE INTO DAO + TaxonomyJob speciesJob = new TaxonomyJob(speciesJobId, DownloadState.PENDING.toString(), name, name, dataSourceName, "", startTime, 0, speciesJobId); + taxonomyJobDao.insert(speciesJob); + + jobSpeciesModel = new JobTaxonomyModel(speciesJob.getId(), speciesJob.getDescriptiveName(), DownloadState.PENDING, null, name, dataSourceName, ""); + + Date start = DateUtil.millisecondsToDate(speciesJob.getStartTime()); +// jobSpeciesModel.setStartTime(DateUtil.dateToDateFormatString(start)); + jobSpeciesModel.setStartTime(start); + jobSpeciesModel.setEndTime(null); + + return jobSpeciesModel; + } + + + @Override + public JobTaxonomyModel resubmitTaxonomyJob(String jobIdentifier) throws Exception { + + logger.trace("Resubmit taxonomy job for id: " + jobIdentifier); + //FOR DEBUG +// System.out.println("Resubmit taxonomy job for id: " + jobIdentifier); + + JobTaxonomyModel jobSpeciesModel = null; + + + //Get Dao with list taxonomy jobs + TaxonomyJobPersistence taxonomyJobDao = DaoSession.getTaxonomyJobDAO(getASLSession()); + + CriteriaBuilder queryBuilder = taxonomyJobDao.getCriteriaBuilder(); + CriteriaQuery cq = queryBuilder.createQuery(); + Predicate pr1 = queryBuilder.equal(taxonomyJobDao.rootFrom(cq).get(TaxonomyJob.ID_FIELD), jobIdentifier); + cq.where(pr1); + + Iterator iterator = taxonomyJobDao.executeCriteriaQuery(cq).iterator(); + + TaxonomyJob taxonomy; + + if(iterator.hasNext()) + taxonomy = iterator.next(); + else + return jobSpeciesModel; + + SpeciesService taxonomyService = getSpeciesService(); + + //recover taxomyId + String speciesJobId = taxonomyService.createTaxonomyJobForDWCAByChildren(taxonomy.getTaxonomyId()); + + long startTime = Calendar.getInstance().getTimeInMillis(); + + //STORE INTO DAO + TaxonomyJob speciesJob = new TaxonomyJob(speciesJobId, DownloadState.PENDING.toString(), RESUBMIT + " " + SAVE_CHILDREN_OF+taxonomy.getDescriptiveName(), taxonomy.getDescriptiveName(), taxonomy.getDataSourceName(), taxonomy.getRank(), startTime, 0, taxonomy.getTaxonomyId()); + taxonomyJobDao.insert(speciesJob); + + jobSpeciesModel = new JobTaxonomyModel(speciesJob.getId(), speciesJob.getDescriptiveName(), DownloadState.PENDING, null, taxonomy.getDescriptiveName(), taxonomy.getDataSourceName(), taxonomy.getRank()); + + Date start = DateUtil.millisecondsToDate(speciesJob.getStartTime()); +// jobSpeciesModel.setStartTime(DateUtil.dateToDateFormatString(start)); + jobSpeciesModel.setStartTime(start); + jobSpeciesModel.setEndTime(null); + + return jobSpeciesModel; + } + + @Override + public boolean cancelTaxonomyJob(String jobIdentifier) throws Exception { + + try{ + + SpeciesService taxonomyService = getSpeciesService(); + + //REMOVE JOB ON THE SERVICE + taxonomyService.cancelTaxonomyJobById(jobIdentifier); + + TaxonomyJobPersistence speciesJobDao = DaoSession.getTaxonomyJobDAO(getASLSession()); + + int count = TaxonomyJobUtil.deleteTaxonomyJobById(jobIdentifier, speciesJobDao); + + if(count==1) + return true; + + }catch (Exception e) { + logger.error("Error on cancel taxonomy job ", e); + throw new Exception("Error on cancel taxonomy job", e); + } + + return false; + } + + @Override + public boolean saveTaxonomyJob(String jobIdentifier, String destinationFolderId, String fileName, String scientificName, String dataSourceName) throws Exception { + + logger.trace("saveSpeciesJob jobId: "+jobIdentifier+" destinationFolderId: "+destinationFolderId+" fileName: "+fileName); +// System.out.println("saveSpeciesJob jobId: "+jobIdentifier+" destinationFolderId: "+destinationFolderId+" fileName: "+fileName); + + try { + + SpeciesService taxonomyService = getSpeciesService(); + String mimeType = "application/zip"; + + InputStream inputStream = taxonomyService.getTaxonomyJobFileById(jobIdentifier); + + if(inputStream!=null){ + Workspace workspace = HomeLibrary.getUserWorkspace(getASLSession()); + logger.trace("input stream is not null"); +// System.out.println("input stream is not null"); + + WorkspaceFolder folder = (WorkspaceFolder) workspace.getItem(destinationFolderId); + fileName = WorkspaceUtil.getUniqueName(fileName, folder); + folder.createExternalFileItem(fileName,"Taxonomy job generated files", mimeType, inputStream); + logger.trace("Save file with taxonomy was completed"); + } + else{ + + logger.trace("input stream is null"); + return false; + } + + + return true; + + } catch (Exception e) { + + logger.error("An error occurred saving the generated file into the workspace",e); + throw new SearchServiceException(e.getMessage()); + } + + } + + @Override + public List retrieveTaxonomyByIds(List ids) throws Exception{ + logger.trace("retrieveTaxonomyByIds ids size: " + ids.size()); + +// System.out.println("retrieveTaxonomyByIds ids size: " + ids.size() + " first id " + ids.get(0)); + + List listTaxonomyRow = new ArrayList(); + try { + + SpeciesService taxonomyService = getSpeciesService(); + StreamExtend convert = new StreamExtend(ids.iterator()); + + CloseableIterator streamIterator = taxonomyService.retrieveTaxonomyById(convert); + + TaxonomyItemConverter taxonomyItemConverter = new TaxonomyItemConverter(getASLSession()); + + int i = 1; + while (streamIterator.hasNext()) { + TaxonomyItem tax = streamIterator.next(); + // from TaxonomyItem to TaxonomyRow + TaxonomyRow taxonomyRow = taxonomyItemConverter.convert(tax); + listTaxonomyRow.add(taxonomyRow); + logger.trace(i + ") retrieveTaxonomyById: " + taxonomyRow); +// System.out.println(i + ") retrieveTaxonomyById: " + taxonomyRow); + i++; + } + + streamIterator.close(); + + } catch (Exception e) { + + e.printStackTrace(); + logger.error("An error retrieve taxonomy by Id",e); +// throw new Exception(e.getMessage()); + } + + return listTaxonomyRow; + + } + + @Override + public List retrieveSynonymsByRefId(String refId) throws Exception{ + logger.trace("retrieveSynonymsById id: " + refId); + + //FOR DEBUG +// System.out.println("retrieveSynonymsById id: " + refId); + + List listTaxonomyRow = new ArrayList(); + try { + + SpeciesService taxonomyService = getSpeciesService(); + + CloseableIterator streamIterator = taxonomyService.retrieveSynonymsById(refId); + + TaxonomyItemConverter taxonomyItemConverter = new TaxonomyItemConverter(getASLSession()); + + int i = 1; + while (streamIterator.hasNext()) { + TaxonomyItem tax = streamIterator.next(); + // from TaxonomyItem to TaxonomyRow + TaxonomyRow taxonomyRow = taxonomyItemConverter.convert(tax); + listTaxonomyRow.add(taxonomyRow); + logger.trace(i + ") retrieveSynonymsById: " + taxonomyRow); +// System.out.println(i + ") retrieveSynonymsById: " + taxonomyRow); + i++; + } + + streamIterator.close(); + + } catch (Exception e) { + + e.printStackTrace(); + logger.error("An error retrieve synonyms by Id",e); +// throw new Exception(e.getMessage()); + } + + return listTaxonomyRow; + + } + + + + /** + * {@inheritDoc} + */ + @Override + public List createOccurrencesJob(List listJobOccurrenceModel, SaveFileFormat saveFileFormat, OccurrencesSaveEnum csvType, boolean isByDataSource, int expectedOccurrence) throws Exception { + logger.trace("createOccurencesJobFromSelection..."); + + List listResultJobModel = new ArrayList(); + @SuppressWarnings("unchecked") + FetchingSession searchSession = (FetchingSession) getSearchSession(); + SpeciesService taxonomyService = getSpeciesService(); + ASLSession aslSession = getASLSession(); + String dataSourceAsXml = ""; + + try { + + List keys = null; + //Get Dao with list occurrences jobs + OccurrenceJobPersistence occurrencesJobDao = DaoSession.getOccurrencesJobDAO(aslSession); + + if(!isByDataSource){ //NOT IS BY DATASOURCE - CREATE ONE JOB + + keys = OccurrenceJobUtil.getListOfSelectedKey(searchSession); + + if(listJobOccurrenceModel!=null && listJobOccurrenceModel.get(0)!=null){ //IN THIS CASE - THERE IS ONE JOBMODEL + + List dataSourceList = listJobOccurrenceModel.get(0).getDataSources(); + + //ADDED DATA SOURCE LIST + + listResultJobModel.add(OccurrenceJobUtil.createOccurrenceJobOnServiceByKeys(listJobOccurrenceModel.get(0), taxonomyService, occurrencesJobDao, keys, dataSourceList, saveFileFormat, csvType, expectedOccurrence)); + } + + } + + else{ //IS BY DATASOURCE - CREATE MORE JOB, ONE FOR EACH DATASOURCE + + for (JobOccurrencesModel jobModel : listJobOccurrenceModel) { //IN THIS CASE - FOR EACH JOBMODEL THERE IS ONE DATASOURCE + + dataSourceAsXml = ""; + + if(jobModel.getDataSources()!=null && jobModel.getDataSources().get(0)!=null){ + + //recover keys + DataSource dataSource = jobModel.getDataSources().get(0); + + OccurrenceKeys occKey = OccurrenceJobUtil.getListOfSelectedKeyByDataSource(dataSource.getName(), aslSession); + + List dataSourceList = jobModel.getDataSources(); + + //ADDED DATA SOURCE LIST + + listResultJobModel.add(OccurrenceJobUtil.createOccurrenceJobOnServiceByKeys(jobModel, taxonomyService, occurrencesJobDao, occKey.getListKey(), dataSourceList, saveFileFormat, csvType, occKey.getTotalOccurrence())); + } + } + + } + + + return listResultJobModel; + + } catch (Exception e) { + logger.error("An error occurred in createOccurencesJobFromSelection", e); + //FOR DEBUG +// System.out.println("Exception in createOccurrencesJob"); + e.printStackTrace(); + throw new Exception(e.getMessage()); + } + + } + + @Override + public List resubmitOccurrencesJob(String jobIdentifier) throws Exception { + logger.trace("createOccurencesJobFromSelection..."); + + List listResultJobModel = new ArrayList(); + SpeciesService taxonomyService = getSpeciesService(); + ASLSession aslSession = getASLSession(); + List keys = null; + + try { + + //Get Dao with list occurrences jobs + OccurrenceJobPersistence occurrencesJobDao = DaoSession.getOccurrencesJobDAO(aslSession); + + CriteriaBuilder queryBuilder = occurrencesJobDao.getCriteriaBuilder(); + CriteriaQuery cq = queryBuilder.createQuery(); + Predicate pr1 = queryBuilder.equal(occurrencesJobDao.rootFrom(cq).get(OccurrencesJob.ID_FIELD), jobIdentifier); + cq.where(pr1); + + Iterator iterator = occurrencesJobDao.executeCriteriaQuery(cq).iterator(); + + OccurrencesJob job; + + if(iterator.hasNext()) + job = iterator.next(); + else + return listResultJobModel; + + + //recover keys + keys = OccurrenceJobUtil.revertListKeyFromStoredXMLString(job.getResultRowKeysAsXml()); + + //recover file format + SaveFileFormat fileFormat = OccurrenceJobUtil.converFileFormat(job.getFileFormat()); + + //recover csv type + OccurrencesSaveEnum csvType = OccurrenceJobUtil.convertCsvType(job.getCsvType()); + + JobOccurrencesModel jobModel = new JobOccurrencesModel("",job.getName(), job.getScientificName(), job.getDataSources(), fileFormat, csvType, job.isByDataSource()); + jobModel.setTotalOccurrences(job.getExpectedOccurrence()); + + listResultJobModel.add(OccurrenceJobUtil.createOccurrenceJobOnServiceByKeys(jobModel, taxonomyService, occurrencesJobDao, keys, job.getDataSources(), fileFormat, csvType, jobModel.getTotalOccurrences())); + + } catch (Exception e) { + logger.error("An error occurred in createOccurencesJobFromSelection", e); + //FOR DEBUG +// System.out.println("Exception in createOccurrencesJob"); + e.printStackTrace(); + throw new Exception(e.getMessage()); + } + + return listResultJobModel; + + } + + @Override + public List getListOccurrencesJob() throws Exception{ + logger.trace("getListOccurencesJob... "); + // System.out.println("getListSpeciesJobs..."); + List listJobs = new ArrayList(); + + try { + + OccurrenceJobPersistence occurrencesJobDao = DaoSession.getOccurrencesJobDAO(getASLSession()); + + Iterator iterator = occurrencesJobDao.getList().iterator(); + + SpeciesService taxonomyService = getSpeciesService(); + + while (iterator!=null && iterator.hasNext()) { + OccurrencesJob job = iterator.next(); + + Status statusResponse = taxonomyService.getOccurrenceJobById(job.getId()); + + logger.trace("get occurrence job "+job.getId()+ " from service"); + + //FOR DEBUG +// System.out.println("get occurrence job "+job.getId()+ " from service"); + + try{ + + if(statusResponse!=null){ + logger.trace("statusResponse of occurrence job is not null..." + job.getId()); +// System.out.println("statusResponse is not null..." + job.getId()); + JobOccurrencesModel jobOccurrenceModel = OccurrenceJobUtil.convertJob(job, statusResponse, occurrencesJobDao); + + if(jobOccurrenceModel!=null){ + //FOR DEBUG + logger.trace("added list jobOccurrenceId: "+jobOccurrenceModel.getJobIdentifier() + " status "+jobOccurrenceModel.getDownloadState()); + //FOR DEBUG +// System.out.println("added list jobOccurrenceId: "+jobOccurrenceModel.getJobIdentifier() + " status "+jobOccurrenceModel.getDownloadState()); +// System.out.println("keys: "+job.getResultRowKeysAsXml()); +// System.out.println("dataSources: "+job.getDataSourcesAsXml()); + + listJobs.add(jobOccurrenceModel); + } + } + else{ + logger.trace("statusResponse of occurrence job is null..." + job.getId()); + logger.trace("delete job ..." + job.getId()); +// System.out.println("statusResponse is null..." + job.getId()); + OccurrenceJobUtil.deleteOccurrenceJobById(job.getId(),occurrencesJobDao); + } + + }catch (Exception e) { + e.printStackTrace(); + logger.error("Error on getListOccurencesJob ", e); + throw new Exception("Error on getListOccurencesJob", e); + } + } + +// if(iterator!=null) +// iterator.close(); +// else +// logger.warn("Warn on getListOccurrencesJob, iterator is null"); + + } catch (Exception e) { + logger.error("Error on get iterator "+e, e); + } + + return listJobs; + + } + + @Override + public boolean saveOccurrenceJob(JobOccurrencesModel jobModel, String destinationFolderId, String fileName, String scientificName, String dataSourceName) throws Exception { + + logger.trace("saveOccurrenceJob jobId: "+jobModel.getJobIdentifier()+" destinationFolderId: "+destinationFolderId+" fileName: "+fileName + " file format: "+jobModel.getFileFormat()); +// System.out.println("saveSpeciesJob jobId: "+jobIdentifier+" destinationFolderId: "+destinationFolderId+" fileName: "+fileName); + + try { + + SpeciesService taxonomyService = getSpeciesService(); + + String mimeType = null; + + switch (jobModel.getFileFormat()) { + case CSV: { + mimeType = "text/csv"; + } break; + case DARWIN_CORE:{ + mimeType = "application/xhtml+xml"; + } break; + } + + InputStream inputStream = taxonomyService.getOccurrenceJobFileById(jobModel.getJobIdentifier()); + + if(inputStream!=null){ + Workspace workspace = HomeLibrary.getUserWorkspace(getASLSession()); + logger.trace("input stream is not null"); +// System.out.println("input stream is not null"); + + WorkspaceFolder folder = (WorkspaceFolder) workspace.getItem(destinationFolderId); + fileName = WorkspaceUtil.getUniqueName(fileName, folder); + folder.createExternalFileItem(fileName,"Occurrence job generated files", mimeType, inputStream); + logger.trace("Save file with occurrences was completed"); + } + else{ + + logger.trace("input stream is null"); + return false; + } + + + return true; + + } catch (Exception e) { + + logger.error("An error occurred saving the generated file into the workspace",e); + throw new SearchServiceException(e.getMessage()); + } + + } + + @Override + public boolean cancelOccurrenceJob(String jobIdentifier) throws Exception { + + try{ + + SpeciesService taxonomyService = getSpeciesService(); + + //REMOVE JOB ON THE SERVICE + taxonomyService.cancelTaxonomyJobById(jobIdentifier); + + OccurrenceJobPersistence occurrenceJobDAO = DaoSession.getOccurrencesJobDAO(getASLSession()); + + int count = OccurrenceJobUtil.deleteOccurrenceJobById(jobIdentifier, occurrenceJobDAO); + + if(count==1) + return true; + + }catch (Exception e) { + logger.error("Error on cancel occurrence job ", e); + throw new Exception("Error on cancel occurrence job", e); + } + + return false; + } + + @Override + public ClusterStructuresForResultRow loadStructuresForResultRowClustering() throws Exception { + + int countSelectedRow = countOfSelectedRow(); + boolean isReduced = false; + int totalRow = countSelectedRow; + + //LIMIT NUMBER OF ITEMS TO ConstantsSpeciesDiscovery.LIMIT_ITEM_DETAILS + if(countSelectedRow>ConstantsSpeciesDiscovery.LIMIT_ITEM_DETAILS) + countSelectedRow = ConstantsSpeciesDiscovery.LIMIT_ITEM_DETAILS; + + ResultFilter filter = new ResultFilter(false, true, true); + + SearchResult searchResults = getSearchResultRows(0, countSelectedRow, filter, true); + + return new ClusterStructuresForResultRow(searchResults,isReduced, totalRow); + + } + + + @Override + public List loadDataSourceForResultRow(boolean selected, boolean distinct) throws Exception { + + ResultRowPersistence daoResultRow = null; + ASLSession session = getASLSession(); + List listDataSource = new ArrayList(); + + try { + daoResultRow = DaoSession.getResultRowDAO(session); + + EntityManager em = daoResultRow.createNewManager(); + List listDN = new ArrayList(); + try { + String selectString = "select "; + if(distinct) + selectString+= "distinct "; + + Query query = em.createQuery(selectString + "t."+ResultRow.DATASOURCE_NAME+" from ResultRow t where t.selected = "+selected ); + + listDN = query.getResultList(); + + } finally { + em.close(); + } + + for (String dataSourceName : listDN) { + //FOR DEBUG +// System.out.println("row datasource #################################" +resultRow); + listDataSource.add(new DataSource(dataSourceName, dataSourceName)); + } + +// distinctQueryBuilder.clear(); + + } catch (Exception e) { + logger.error("Error in loadDataSourceForResultRow " +e.getMessage(), e); + throw new Exception("Error in loadDataSourceForResultRow " + e.getMessage(), e); + } + + return listDataSource; + + } + + + @Override + public ClusterStructuresForTaxonomyRow loadStructuresForTaxonomyClustering() throws Exception { + + int countSelectedRow = countOfSelectedRow(); + boolean isReduced = false; + int totalRow = countSelectedRow; + + //LIMIT NUMBER OF ITEMS TO ConstantsSpeciesDiscovery.LIMIT_ITEM_DETAILS + if(countSelectedRow>ConstantsSpeciesDiscovery.LIMIT_ITEM_DETAILS){ + countSelectedRow = ConstantsSpeciesDiscovery.LIMIT_ITEM_DETAILS; + isReduced = true; + } + + ResultFilter filter = new ResultFilter(false, true, true); + + SearchResult searchResults = getSearchTaxonomyRow(0, countSelectedRow, filter, true); + + return new ClusterStructuresForTaxonomyRow(searchResults, isReduced, totalRow); + + } + + @Override + public boolean changeStatusOccurrenceJob(String jobIdentifier, DownloadState state) throws Exception { + + OccurrenceJobPersistence occurrenceJobDAO = DaoSession.getOccurrencesJobDAO(getASLSession()); + + int count = OccurrenceJobUtil.changeStatusOccurrenceJobById(jobIdentifier, state, occurrenceJobDAO); + + if(count==1) + return true; + + return false; + + } + + @Override + public boolean changeStatusTaxonomyJob(String jobIdentifier, DownloadState state) throws Exception { + + TaxonomyJobPersistence taxonomyJobDAO = DaoSession.getTaxonomyJobDAO(getASLSession()); + + int count = TaxonomyJobUtil.changeStatusTaxonomyJobById(jobIdentifier, state, taxonomyJobDAO); + + if(count==1) + return true; + + return false; + + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/asl/SessionUtil.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/asl/SessionUtil.java new file mode 100644 index 0000000..d965d1f --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/asl/SessionUtil.java @@ -0,0 +1,175 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.asl; + +import javax.persistence.EntityManagerFactory; +import javax.servlet.http.HttpSession; + +import org.apache.log4j.Logger; +import org.gcube.application.framework.core.session.ASLSession; +import org.gcube.application.framework.core.session.SessionManager; +import org.gcube.common.core.scope.GCUBEScope; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.OccurrenceJobPersistence; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.OccurrenceRowPersistence; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.ResultRowPersistence; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.TaxonRowPersistence; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.TaxonomyJobPersistence; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.TaxonomyRowPersistence; +import org.gcube.portlets.user.speciesdiscovery.server.service.SpeciesService; +import org.gcube.portlets.user.speciesdiscovery.server.session.FetchingSession; +import org.gcube.portlets.user.speciesdiscovery.shared.FetchingElement; +import org.gcube.portlets.user.speciesdiscovery.shared.Occurrence; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class SessionUtil { + + public static final String SPECIES_SERVICE = "SPECIES_SERVICE"; + public static final String SEARCH_SESSION = "SEARCH_SESSION"; + public static final String TAXONOMY_OCCURRENCE = "TAXONOMY_OCCURRENCE"; + public static final String CONNECTION_SOURCE = "CONNECTION_SOURCE"; + public static final String USERNAME_ATTRIBUTE = "username"; + public static final String ENTITY_FACTORY = "ENTITY_FACTORY"; + public static final String EJB_RESULT_ROW = "EJB_RESULT_ROW"; + public static final String EJB_TAXON_ROW = "EJB_TAXON_ROW"; + public static final String EJB_OCCURENCE = "EJB_OCCURENCE"; + public static final String EJB_TAXONOMY = "EJB_TAXONOMY"; + public static final String EJB_OCCURRENCES_JOB = "EJB_OCCURRENCES_JOB"; + public static final String EJB_TAXONOMY_JOB = "EJB_TAXONOMY_JOB"; + + protected static Logger logger = Logger.getLogger(SessionUtil.class); + + + public static EntityManagerFactory getEntityManagerFactory(ASLSession session) { + return (EntityManagerFactory) session.getAttribute(ENTITY_FACTORY); + } + + public static void setEntityManagerFactory(ASLSession session, EntityManagerFactory factory) { + session.setAttribute(ENTITY_FACTORY, factory); + } + + public static SpeciesService getService(ASLSession session) throws Exception + { + SpeciesService service = (SpeciesService) session.getAttribute(SPECIES_SERVICE); + + if (service==null) { + logger.trace("Service not found, creating it"); + GCUBEScope scope = session.getScope(); + service = new SpeciesService(scope, session); + session.setAttribute(SPECIES_SERVICE, service); + } + + return service; + } + + @SuppressWarnings("unchecked") + public static FetchingSession getCurrentSearchSession(ASLSession session) + { + return (FetchingSession) session.getAttribute(SEARCH_SESSION); + } + + public static void setCurrentSearchSession(ASLSession session, FetchingSession searchSession){ + session.setAttribute(SEARCH_SESSION, searchSession); + } + + + @SuppressWarnings("unchecked") + public static FetchingSession getCurrentOccurrenceSession(ASLSession session){ + return (FetchingSession) session.getAttribute(TAXONOMY_OCCURRENCE); + } + + + public static void setCurrentOccurrenceSession(ASLSession session, FetchingSession searchSession){ + session.setAttribute(TAXONOMY_OCCURRENCE, searchSession); + } + +// public static void setCurrentTaxonomyChildrenSession(ASLSession session, FetchingSession searchSession) +// { +// session.setAttribute(TAXONOMY_CHILD, searchSession); +// } + + public static ASLSession getAslSession(HttpSession httpSession) + { + String sessionID = httpSession.getId(); + String user = (String) httpSession.getAttribute(USERNAME_ATTRIBUTE); + + if (user == null) { + + logger.error("TaxonomySearchServiceImpl STARTING IN TEST MODE - NO USER FOUND"); + + //for test only + user = "test.user"; +// user = "francesco.mangiacrapa"; +// user = "pasquale.pagano"; +// user = "lucio.lelii"; + httpSession.setAttribute(USERNAME_ATTRIBUTE, user); + ASLSession session = SessionManager.getInstance().getASLSession(sessionID, user); + session.setScope("/gcube/devsec"); +// session.setScope("/gcube/devsec"); + + return session; + } + + return SessionManager.getInstance().getASLSession(sessionID, user); + } + + //MODIFIED****************************************************************************************** + + + public static void setCurrentEJBResultRow(ASLSession session, ResultRowPersistence resultRowPersistence) { + session.setAttribute(EJB_RESULT_ROW, resultRowPersistence); + } + + public static ResultRowPersistence getCurrentEJBResultRow(ASLSession session) { + return (ResultRowPersistence) session.getAttribute(EJB_RESULT_ROW); + } + + public static void setCurrentEJBTaxonRow(ASLSession session,TaxonRowPersistence taxonRowPersistence) { + session.setAttribute(EJB_TAXON_ROW, taxonRowPersistence); + } + + public static TaxonRowPersistence getCurrentEJBTaxonRow(ASLSession session) { + return (TaxonRowPersistence) session.getAttribute(EJB_TAXON_ROW); + } + + public static void setCurrentEJBOccurrence(ASLSession session, OccurrenceRowPersistence occurrenceRowPersistence) { + session.setAttribute(EJB_OCCURENCE, occurrenceRowPersistence); + } + + public static OccurrenceRowPersistence getCurrentEJBOccurrence(ASLSession session) { + return (OccurrenceRowPersistence) session.getAttribute(EJB_OCCURENCE); + } + + @SuppressWarnings("unchecked") + public static TaxonomyRowPersistence getCurrentEJBTaxonomyItem(ASLSession session) { + return (TaxonomyRowPersistence) session.getAttribute(EJB_TAXONOMY); + } + + public static void setCurrentEJBTaxonomyItem(ASLSession session, TaxonomyRowPersistence taxonomyItemDAO) { + session.setAttribute(EJB_TAXONOMY, taxonomyItemDAO); + + } + + public static void setCurrentEJBOccurrencesJob(ASLSession session, OccurrenceJobPersistence occurrenceJobPersistence) { + session.setAttribute(EJB_OCCURRENCES_JOB, occurrenceJobPersistence); + + } + + @SuppressWarnings("unchecked") + public static OccurrenceJobPersistence getCurrentDaoOccurrencesJob(ASLSession session) { + return (OccurrenceJobPersistence) session.getAttribute(EJB_OCCURRENCES_JOB); + } + + @SuppressWarnings("unchecked") + public static TaxonomyJobPersistence getCurrentDAOTaxonomyJob(ASLSession session) { + return (TaxonomyJobPersistence) session.getAttribute(EJB_TAXONOMY_JOB); + } + + public static void setCurrentDAOTaxonomyJob(ASLSession session, TaxonomyJobPersistence taxonomyJobPeristence) { + session.setAttribute(EJB_TAXONOMY_JOB, taxonomyJobPeristence); + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/job/KeyStringList.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/job/KeyStringList.java new file mode 100644 index 0000000..23e3029 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/job/KeyStringList.java @@ -0,0 +1,21 @@ +package org.gcube.portlets.user.speciesdiscovery.server.job; + +import java.util.ArrayList; +import java.util.List; + +public class KeyStringList { + + private List listKeys = new ArrayList(); + + public List getListKeys() { + return listKeys; + } + + public KeyStringList(){ + } + + public void addKey(String key){ + listKeys.add(key); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/job/OccurrenceJobUtil.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/job/OccurrenceJobUtil.java new file mode 100644 index 0000000..253e072 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/job/OccurrenceJobUtil.java @@ -0,0 +1,436 @@ +package org.gcube.portlets.user.speciesdiscovery.server.job; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collection; +import java.util.Date; +import java.util.Iterator; +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; + +import org.apache.log4j.Logger; +import org.gcube.application.framework.core.session.ASLSession; +import org.gcube.data.spd.stubs.types.Status; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.DaoSession; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.OccurrenceJobPersistence; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.ResultRowPersistence; +import org.gcube.portlets.user.speciesdiscovery.server.service.SpeciesService; +import org.gcube.portlets.user.speciesdiscovery.server.session.FetchingSession; +import org.gcube.portlets.user.speciesdiscovery.server.session.SelectableFetchingBuffer; +import org.gcube.portlets.user.speciesdiscovery.server.stream.StreamExtend; +import org.gcube.portlets.user.speciesdiscovery.server.util.DateUtil; +import org.gcube.portlets.user.speciesdiscovery.server.util.XStreamUtil; +import org.gcube.portlets.user.speciesdiscovery.shared.DataSource; +import org.gcube.portlets.user.speciesdiscovery.shared.DownloadState; +import org.gcube.portlets.user.speciesdiscovery.shared.JobOccurrencesModel; +import org.gcube.portlets.user.speciesdiscovery.shared.OccurrencesJob; +import org.gcube.portlets.user.speciesdiscovery.shared.OccurrencesSaveEnum; +import org.gcube.portlets.user.speciesdiscovery.shared.ResultRow; +import org.gcube.portlets.user.speciesdiscovery.shared.SaveFileFormat; + +public class OccurrenceJobUtil { + + //STATE RETURNED BY STATUS RESPONSE + public static final String COMPLETED = "COMPLETED"; + public static final String FAILED = "FAILED"; + public static final String RUNNING = "RUNNING"; + public static final String PENDING = "PENDING"; + + private static final String ALIASKEY = "key"; + + protected static Logger logger = Logger.getLogger(OccurrenceJobUtil.class); + + public static JobOccurrencesModel convertJob(OccurrencesJob job, Status statusResponse, OccurrenceJobPersistence occurrencesJobDao) { + //TODO SET END TIME + JobOccurrencesModel jobOccurrenceModel; + DownloadState downloadState = null; + long endTime = 0; + + String status = statusResponse.getStatus(); + downloadState = getDownloadState(status); + logger.trace("jobId: "+job.getId() +" download state: " + downloadState); + + //FOR DEBUG +// System.out.println("jobId: "+job.getId() +" download state: " + downloadState); + + if(downloadState==null) //Case with exception + return null; + + //SET START TIME + long startTime = job.getStartTime(); + Date start = DateUtil.millisecondsToDate(startTime); +// jobSpeciesModel.setStartTime(DateUtil.dateToDateFormatString(start)); + + int completedEntry = 0; + if(statusResponse.getCompletedEntries()>0) + completedEntry = statusResponse.getCompletedEntries(); + + boolean changeStatus = false; + + //if status is completed and job was saved, update status as saved + if(downloadState.equals(DownloadState.COMPLETED)){ + if(job.getState().compareTo(DownloadState.SAVED.toString())==0){ + downloadState = DownloadState.SAVED; + changeStatus = true; + } + } + + jobOccurrenceModel = new JobOccurrencesModel(job.getId(), job.getName(), job.getDescription(), downloadState, job.getScientificName(), job.getDataSources(), start, null,completedEntry, job.getExpectedOccurrence()); + + try{ + + boolean changeEndTime = false; + + //UPDATE END TIME + if(downloadState.equals(DownloadState.FAILED) || downloadState.equals(DownloadState.COMPLETED)){ + + if(job.getEndTime()==0){ //UPDATE end time first time only + + logger.trace("UPDATE end time first time only - " + downloadState); + endTime = Calendar.getInstance().getTimeInMillis(); + job.setEndTime(endTime); + changeEndTime = true; + } + } + + + //UPDATE DAO + if(changeStatus || changeEndTime){ + job.setState(downloadState.toString()); + occurrencesJobDao.update(job); + } + + }catch (Exception e) { + logger.error("An error occurred on update the occurrencesJobDao ", e); + } + + + endTime = job.getEndTime(); + long elapsedTime = 0; + + //SET END TIME + if(endTime!=0){ + Date end = DateUtil.millisecondsToDate(endTime); + jobOccurrenceModel.setEndTime(end); + elapsedTime = endTime; + } + else + elapsedTime = Calendar.getInstance().getTimeInMillis(); + + + //SET ELAPSED TIME + jobOccurrenceModel.setElapsedTime(DateUtil.getDifference(startTime, elapsedTime)); + + + //OTHERS SET + jobOccurrenceModel.setFileFormat(converFileFormat(job.getFileFormat())); + jobOccurrenceModel.setCsvType(convertCsvType(job.getCsvType())); + jobOccurrenceModel.setByDataSource(job.isByDataSource()); + + return jobOccurrenceModel; + } + + public static DownloadState getDownloadState(String status){ + + if(status!=null){ + if(status.compareToIgnoreCase(PENDING)==0){ + return DownloadState.PENDING; + }else if(status.compareToIgnoreCase(RUNNING)==0){ + return DownloadState.ONGOING; + }else if(status.compareToIgnoreCase(FAILED)==0){ + return DownloadState.FAILED; + }else if(status.compareToIgnoreCase(COMPLETED)==0){ + return DownloadState.COMPLETED; + } + } + return null; + + } + + public static OccurrencesSaveEnum convertCsvType(String csvType) { + + if(csvType!=null){ + if(csvType.compareToIgnoreCase(OccurrencesSaveEnum.STANDARD.toString())==0){ + return OccurrencesSaveEnum.STANDARD; + }else if(csvType.compareToIgnoreCase(OccurrencesSaveEnum.OPENMODELLER.toString())==0){ + return OccurrencesSaveEnum.OPENMODELLER; + } + } + return null; + } + + + public static SaveFileFormat converFileFormat(String fileFormat) { + + if(fileFormat!=null){ + if(fileFormat.compareToIgnoreCase(SaveFileFormat.CSV.toString())==0){ + return SaveFileFormat.CSV; + }else if(fileFormat.compareToIgnoreCase(SaveFileFormat.DARWIN_CORE.toString())==0){ + return SaveFileFormat.DARWIN_CORE; + } + } + return null; + + } + + + public static int deleteOccurrenceJobById(String jobIdentifier, OccurrenceJobPersistence occurrencesJobDao){ + logger.trace("Delete occurrence job id: " + jobIdentifier); + + try{ + int removed = occurrencesJobDao.deleteItemByIdField(jobIdentifier); + return 1; + + }catch (Exception e) { + logger.error("An error occured deleteOccurrenceJobById jobId: " + jobIdentifier + " exception: "+e, e); + + } + + logger.trace("job not exists : " +jobIdentifier); + return 0; + } + + + public static int changeStatusOccurrenceJobById(String jobIdentifier, DownloadState state, OccurrenceJobPersistence occurrencesJobDao){ + logger.trace("Change status occurrence job id: " + jobIdentifier); +// System.out.println("Delete job id: " + jobIdentifier); + + int result = 0; + + try{ + + CriteriaBuilder queryBuilder = occurrencesJobDao.getCriteriaBuilder(); + CriteriaQuery cq = queryBuilder.createQuery(); + Predicate pr1 = queryBuilder.equal(occurrencesJobDao.rootFrom(cq).get(OccurrencesJob.ID_FIELD), jobIdentifier); + cq.where(pr1); + + Iterator iterator = occurrencesJobDao.executeCriteriaQuery(cq).iterator(); + + OccurrencesJob job; + + if(iterator.hasNext()) + job = iterator.next(); + else + return 0; + + job.setState(state.toString()); + + occurrencesJobDao.update(job); + + }catch (Exception e) { + logger.error("An error occured in change status jobId: " + jobIdentifier + " exception: "+e, e ); + } + + return result; + } + + + public static List getListOfSelectedKey(FetchingSession searchSession) throws Exception{ + + Collection selectedRows = ((SelectableFetchingBuffer) searchSession.getBuffer()).getSelected(); + logger.trace("found "+selectedRows.size()+" selected rows"); + + int count = 0; + + List keys = new ArrayList(selectedRows.size()); + + for (ResultRow row:selectedRows) { + //ADD KEY ONLY IF IS NOT EQUAL NULL AND SIZE IS > 0 + if(row.getOccurencesKey()!=null && row.getOccurencesKey().length()>0){ + keys.add(row.getOccurencesKey()); + count += row.getOccurencesCount(); + } + } + + logger.trace("found "+count+" occurrence points"); + + return keys; + + } + + + public static OccurrenceKeys getListOfSelectedKeyByDataSource(String dataSource, ASLSession session) { + logger.trace("getListOfSelectedKeyByDataSource..."); + + OccurrenceKeys occurrenceKeys = new OccurrenceKeys(); + + List keys = new ArrayList(); + + Iterator resulRowIt = null; + + int count = 0; + + try{ + +// System.out.println("dasource name: "+dataSource); + logger.trace("datasource name: "+dataSource); + + ResultRowPersistence resultRowDao = DaoSession.getResultRowDAO(session); + + /*CriteriaBuilder cb = resultRowDao.getCriteriaBuilder(); + + CriteriaQuery cq = cb.createQuery(); + + Predicate pr1 = cb.equal(resultRowDao.rootFrom(cq).get(ResultRow.DATASOURCE_NAME), dataSource); + + Predicate pr2 = cb.equal(resultRowDao.rootFrom(cq).get(ResultRow.SELECTED), true); + + cq.where(cb.and(pr1,pr2)); + + Iterator resulRowIt = resultRowDao.executeCriteriaQuery(cq).iterator(); + */ + + EntityManager em = resultRowDao.createNewManager(); + try { + + Query query = em.createQuery("select t from ResultRow t where t."+ResultRow.DATASOURCE_NAME +" = '"+dataSource+ "' AND t."+ResultRow.SELECTED+" = true"); + + resulRowIt = query.getResultList().iterator(); + + + } catch (Exception e) { + logger.error("Error in update: "+e.getMessage(), e); + return null; + } + finally { + em.close(); + } + + while(resulRowIt.hasNext()){ + + ResultRow row = resulRowIt.next(); + + if(row.getOccurencesKey()!=null && row.getOccurencesKey().length()>0){ + keys.add(row.getOccurencesKey()); + count += row.getOccurencesCount(); + } + + } + + occurrenceKeys.setListKey(keys); + occurrenceKeys.setTotalOccurrence(count); + + }catch (Exception e) { + logger.error("error in getListOfSelectedKeyByDataSource "+ e); + } + + logger.trace("found "+count+" occurrence points"); + + return occurrenceKeys; + + } + + + public static JobOccurrencesModel createOccurrenceJobOnServiceByKeys(JobOccurrencesModel jobModel,SpeciesService taxonomyService, OccurrenceJobPersistence occurrencesJobDao, List keys, List dataSources, SaveFileFormat saveFileFormat, OccurrencesSaveEnum csvType, int expectedOccurrence) { + String serviceJobId = null; + + StreamExtend streamKeys = new StreamExtend(keys.iterator()); //convert + + String csvTypeString = null; + + try { + + switch (saveFileFormat) { + + case CSV: + + if(csvType.equals(OccurrencesSaveEnum.STANDARD)) + serviceJobId = taxonomyService.createOccurrenceCSVJob(streamKeys); + else if(csvType.equals(OccurrencesSaveEnum.OPENMODELLER)) + serviceJobId = taxonomyService.createOccurrenceCSVOpenModellerJob(streamKeys); + + if(jobModel.getCsvType()!=null) + csvTypeString = jobModel.getCsvType().toString(); //CASE CSV + + break; + + case DARWIN_CORE: + + serviceJobId = taxonomyService.createOccurrenceDARWINCOREJob(streamKeys); + + csvTypeString = ""; + + break; + + default: + serviceJobId = taxonomyService.createOccurrenceCSVJob(streamKeys); + } + + } catch (Exception e) { + logger.error("An error occured in create new occurrences job on server ",e); + return null; + } + + + long startTimeInMillis = Calendar.getInstance().getTimeInMillis(); + + try { + + //STORE INTO DAO + OccurrencesJob occurrenceJob = new OccurrencesJob(serviceJobId, jobModel.getJobName(), jobModel.getDescription(), jobModel.getScientificName(), dataSources, DownloadState.PENDING.toString(), "", startTimeInMillis, 0, jobModel.getFileFormat().toString(),csvTypeString, jobModel.isByDataSource(), convertListKeyIntoStoreXMLString(keys), expectedOccurrence); + + //for debug +// System.out.println("INTO createOccurrenceJobOnServiceByKeys " + occurrenceJob); + + occurrencesJobDao.insert(occurrenceJob); + + Date start = DateUtil.millisecondsToDate(startTimeInMillis); + jobModel.setStartTime(start); + + //FILL MODEL WITH OTHER DATA + jobModel.setId(serviceJobId); + jobModel.setState(DownloadState.PENDING); + jobModel.setEndTime(null); + + }catch (Exception e) { + logger.error("An error occured in create new occurrences job on dao object " +e,e); + } + + return jobModel; + + } + + + public static String convertListKeyIntoStoreXMLString(List keys){ + String storeKeys = ""; + + KeyStringList keyStringList = new KeyStringList(); + + XStreamUtil xstreamUtil = new XStreamUtil(ALIASKEY,KeyStringList.class); + + for (String key : keys) { + System.out.println("key :"+ key); + keyStringList.addKey(key); + } + + storeKeys = xstreamUtil.toXML(keyStringList); + + //FOR DEBUG +// System.out.println("stored keys: "+storeKeys); + + return storeKeys; + } + + public static List revertListKeyFromStoredXMLString(String storedKeysAsXml){ + + List listKey = new ArrayList(); + + XStreamUtil xstreamUtil = new XStreamUtil(ALIASKEY,KeyStringList.class); + + KeyStringList keyStringList = (KeyStringList) xstreamUtil.fromXML(storedKeysAsXml); + + for (String key : keyStringList.getListKeys()) { +// for debug +// System.out.println("key :"+ key); + listKey.add(key); + } + + return listKey; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/job/OccurrenceKeys.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/job/OccurrenceKeys.java new file mode 100644 index 0000000..80d581c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/job/OccurrenceKeys.java @@ -0,0 +1,34 @@ +package org.gcube.portlets.user.speciesdiscovery.server.job; + +import java.util.ArrayList; +import java.util.List; + +public class OccurrenceKeys { + + private List listKey = new ArrayList(); + private int totalOccurrence = 0; + + public OccurrenceKeys() { + } + + public OccurrenceKeys(List listKey, int totalOccurrence) { + this.listKey = listKey; + this.totalOccurrence = totalOccurrence; + } + + + public List getListKey() { + return listKey; + } + public void setListKey(List listKey) { + this.listKey = listKey; + } + public int getTotalOccurrence() { + return totalOccurrence; + } + public void setTotalOccurrence(int totalOccurrence) { + this.totalOccurrence = totalOccurrence; + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/job/TaxonomyJobUtil.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/job/TaxonomyJobUtil.java new file mode 100644 index 0000000..064a2a2 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/job/TaxonomyJobUtil.java @@ -0,0 +1,200 @@ +package org.gcube.portlets.user.speciesdiscovery.server.job; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.Iterator; +import java.util.UUID; + +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; + +import org.apache.log4j.Logger; +import org.gcube.data.spd.stubs.types.NodeStatus; +import org.gcube.data.spd.stubs.types.Status; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.TaxonomyJobPersistence; +import org.gcube.portlets.user.speciesdiscovery.server.util.DateUtil; +import org.gcube.portlets.user.speciesdiscovery.shared.DownloadState; +import org.gcube.portlets.user.speciesdiscovery.shared.JobTaxonomyModel; +import org.gcube.portlets.user.speciesdiscovery.shared.TaxonomyJob; + +public class TaxonomyJobUtil { + + //STATE RETURNED BY STATUS RESPONSE + public static final String COMPLETED = "COMPLETED"; + public static final String FAILED = "FAILED"; + public static final String RUNNING = "RUNNING"; + public static final String PENDING = "PENDING"; + + protected static Logger logger = Logger.getLogger(TaxonomyJobUtil.class); + + + public static JobTaxonomyModel convertJob(TaxonomyJob job, Status statusResponse, TaxonomyJobPersistence speciesJobDao) throws SQLException{ + + //TODO SET END TIME + JobTaxonomyModel jobSpeciesModel; + String status = statusResponse.getStatus(); + DownloadState downloadState = null; + long endTime = 0; + + downloadState = getDownloadState(status); + logger.trace("download state: " + downloadState); + + + if(downloadState==null) //Case with exception + return null; + + boolean onSaving = true; + + + //GET CHILDREN + ArrayList listChildJob = new ArrayList(); + + if(statusResponse.getSubNodes()!=null){ + + for (NodeStatus nodeStatus : statusResponse.getSubNodes()){ + + DownloadState downloadStateChildren = getDownloadState(nodeStatus.getStatus()); + if(!downloadStateChildren.equals(DownloadState.COMPLETED)) + onSaving=false; + + listChildJob.add(new JobTaxonomyModel(UUID.randomUUID().toString(), nodeStatus.getScientificName(),downloadStateChildren)); + } + }else + onSaving=false; + + boolean changeStatus = false; + + //If status of children is completed and job status is not completed (the file is generated) or failed, set download state on saving + if(onSaving &&(!downloadState.equals(DownloadState.COMPLETED) && !downloadState.equals(DownloadState.FAILED))){ + downloadState = DownloadState.SAVING; + changeStatus = true; + + //if status is completed and job was saved, update status as saved + }else if(downloadState.equals(DownloadState.COMPLETED)){ + if(job.getState().compareTo(DownloadState.SAVED.toString())==0){ + downloadState = DownloadState.SAVED; + changeStatus = true; + } + } + + jobSpeciesModel = new JobTaxonomyModel(job.getId(), job.getDescriptiveName(), downloadState, null, job.getScientificName(), job.getDataSourceName(), job.getRank()); + + jobSpeciesModel.setListChildJobs(listChildJob); + + boolean changeEndTime = false; + + //UPDATE END TIME + if(downloadState.equals(DownloadState.FAILED) || downloadState.equals(DownloadState.COMPLETED)){ + + if(job.getEndTime()==0){ //UPDATE end time first time only + + logger.trace("UPDATE end time first time only - " + downloadState); + endTime = Calendar.getInstance().getTimeInMillis(); + job.setEndTime(endTime); + changeEndTime = true; +// speciesJobDao.update(job); + + } + } + + //UPDATE DAO + if(changeStatus || changeEndTime){ + job.setState(downloadState.toString()); + speciesJobDao.update(job); + } + + //SET START TIME + long startTime = job.getStartTime(); + Date start = DateUtil.millisecondsToDate(startTime); +// jobSpeciesModel.setStartTime(DateUtil.dateToDateFormatString(start)); + jobSpeciesModel.setStartTime(start); + + endTime = job.getEndTime(); + long elapsedTime = 0; + + //SET END TIME + if(endTime!=0){ + Date end = DateUtil.millisecondsToDate(endTime); +// jobSpeciesModel.setEndTime(DateUtil.dateToDateFormatString(end)); + jobSpeciesModel.setEndTime(end); + elapsedTime = endTime; + } + else + elapsedTime = Calendar.getInstance().getTimeInMillis(); + + + //SET ELAPSED TIME + jobSpeciesModel.setElapsedTime(DateUtil.getDifference(startTime, elapsedTime)); + + return jobSpeciesModel; + } + + public static DownloadState getDownloadState(String status){ + + if(status!=null){ + if(status.compareToIgnoreCase(PENDING)==0){ + return DownloadState.PENDING; + }else if(status.compareToIgnoreCase(RUNNING)==0){ + return DownloadState.ONGOING; + }else if(status.compareToIgnoreCase(FAILED)==0){ + return DownloadState.FAILED; + }else if(status.compareToIgnoreCase(COMPLETED)==0){ + return DownloadState.COMPLETED; + } + } + return null; + + } + + public static int deleteTaxonomyJobById(String jobIdentifier, TaxonomyJobPersistence taxonomyJobDao) throws SQLException{ + logger.trace("Delete taxonomy job id: " + jobIdentifier); + try{ + + int removed = taxonomyJobDao.deleteItemByIdField(jobIdentifier); + return 1; + + }catch (Exception e) { + logger.error("An error occured deleteTaxonomyJobById " + jobIdentifier + " exception: "+e, e); + e.printStackTrace(); + } + + return 0; + } + + + public static int changeStatusTaxonomyJobById(String jobIdentifier,DownloadState state, TaxonomyJobPersistence taxonomyJobDAO) { + logger.trace("Change status taxonomy job id: " + jobIdentifier); +// System.out.println("Delete job id: " + jobIdentifier); + + int result = 0; + + try{ + + CriteriaBuilder queryBuilder = taxonomyJobDAO.getCriteriaBuilder(); + CriteriaQuery cq = queryBuilder.createQuery(); + Predicate pr1 = queryBuilder.equal(taxonomyJobDAO.rootFrom(cq).get(TaxonomyJob.ID_FIELD), jobIdentifier); + cq.where(pr1); + + Iterator iterator = taxonomyJobDAO.executeCriteriaQuery(cq).iterator(); + + TaxonomyJob job; + + if(iterator.hasNext()) + job = iterator.next(); + else + return 0; + + job.setState(state.toString()); + + taxonomyJobDAO.update(job); + + }catch (Exception e) { + logger.error("An error occured in change status jobId: " + jobIdentifier + " exception: "+e, e ); + } + + return result; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/AbstractDaoBuffer.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/AbstractDaoBuffer.java new file mode 100644 index 0000000..2e8535b --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/AbstractDaoBuffer.java @@ -0,0 +1,76 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.persistence; + +import java.util.List; +import java.util.Map; + +import org.gcube.common.core.utils.logging.GCUBELog; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.AbstractPersistence; +import org.gcube.portlets.user.speciesdiscovery.server.session.FetchingBuffer; +import org.gcube.portlets.user.speciesdiscovery.shared.FetchingElement; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public abstract class AbstractDaoBuffer implements FetchingBuffer { + + protected GCUBELog logger = new GCUBELog(AbstractDaoBuffer.class); + + protected AbstractPersistence dao; + + public AbstractDaoBuffer(AbstractPersistence dao) + { + this.dao = dao; + } + + /** + * {@inheritDoc} + */ + @Override + public void add(T item) throws Exception + { + try{ + //DEBUG +// logger.trace("Add item "+ item.getId() +" to table "+dao.getTableConfig().getTableName()); + + dao.insert(item); + } + catch (Exception e) { +// System.out.println("Error in add item: "+e); + logger.error("Error in add item: "+e,e); +// throw new SQLException(e); + } +// dao.create(item); + } + + /** + * {@inheritDoc} + */ + @Override + public int size() throws Exception + { + return (int) dao.countItems(); + } + + /** + * {@inheritDoc} + */ + @Override + public List getList() throws Exception{ + return dao.getList(); + } + + @Override + public List getList(int startIndex, int offset) throws Exception{ + return dao.getList(startIndex, offset); + } + + @Override + public List getList(Map filterANDMap, int startIndex, int offset) throws Exception{ + return dao.getList(filterANDMap, startIndex, offset); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/AbstractSelectableDaoBuffer.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/AbstractSelectableDaoBuffer.java new file mode 100644 index 0000000..e9a6341 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/AbstractSelectableDaoBuffer.java @@ -0,0 +1,75 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.persistence; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; + +import org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.AbstractPersistence; +import org.gcube.portlets.user.speciesdiscovery.server.session.SelectableFetchingBuffer; +import org.gcube.portlets.user.speciesdiscovery.shared.SelectableElement; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public abstract class AbstractSelectableDaoBuffer extends AbstractDaoBuffer implements SelectableFetchingBuffer { + + protected String idField; + protected String selectionField; + + public AbstractSelectableDaoBuffer(AbstractPersistence dao, String idField, String selectionField) { + super(dao); + this.idField = idField; + this.selectionField = selectionField; + } + + /** + * {@inheritDoc} + */ + @Override + public List getSelected() throws SQLException + { + + List selectedItems = new ArrayList(); + + CriteriaBuilder queryBuilder = dao.getCriteriaBuilder(); + CriteriaQuery cq = queryBuilder.createQuery(); + Predicate pr1 = queryBuilder.equal(dao.rootFrom(cq).get(selectionField), true); + cq.where(pr1); + + selectedItems = dao.executeCriteriaQuery(cq); + + logger.trace("get selected return size: "+ selectedItems.size() ); + return selectedItems; + } + + @Override + public void updateSelection(int id, boolean selection) throws Exception { + T item = dao.getItemByKey(id); + item.setSelected(selection); + dao.update(item); + } + + /** + * {@inheritDoc} + */ + @Override + public abstract void updateAllSelection(boolean selection) throws Exception; + + /** + * {@inheritDoc} + */ + @Override + public int sizeSelected() throws Exception { + return getSelected().size(); + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/DaoSession.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/DaoSession.java new file mode 100644 index 0000000..739f5c9 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/DaoSession.java @@ -0,0 +1,286 @@ +package org.gcube.portlets.user.speciesdiscovery.server.persistence; + +import java.util.HashMap; +import java.util.Map; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; + +import org.apache.log4j.Logger; +import org.gcube.application.framework.core.session.ASLSession; +import org.gcube.portlets.user.speciesdiscovery.server.asl.SessionUtil; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.OccurrenceJobPersistence; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.OccurrenceRowPersistence; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.ResultRowPersistence; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.TaxonRowPersistence; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.TaxonomyJobPersistence; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.TaxonomyRowPersistence; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class DaoSession { + + protected static final String PROPERTY_CATALINA_HOME = "catalina.home"; + protected static final String CATALINA_HOME = "CATALINA_HOME"; + protected static final String TEMP_H2DBSPECIES_H2 = "temp/h2dbspecies/h2"; + public static Logger logger = Logger.getLogger(DaoSession.class); + private static final String JDBCDRIVER = "jdbc:h2:"; + + + public static String getUsernameScopeValue(String username, String scope){ + + scope = scope.replaceAll("/",""); + username = username.replaceAll("\\.",""); + + return username+scope; + } + + + + + /** + * + * @return $CATALINA_HOME + * @throws Exception + */ + public static String getTomcatFolder(){ + + String catalinaHome = System.getenv(CATALINA_HOME) != null ? System.getenv(CATALINA_HOME) : System.getProperty(PROPERTY_CATALINA_HOME); + + if(catalinaHome == null || catalinaHome.isEmpty()) + logger.error("CATALINA_HOME ENVIROMENT NOT FOUND - RETURNED / PATH"); + + + return catalinaHome.endsWith("/") ? catalinaHome : catalinaHome+"/"; + } + + + public static String getConnectionUrl(ASLSession session){ + + String username = session.getUsername(); + String scope = session.getScopeName(); + return JDBCDRIVER +getTomcatFolder()+TEMP_H2DBSPECIES_H2+getUsernameScopeValue(username,scope)+";create=true"; + } + + + public static void initSessionDaoObjects(ASLSession session) throws Exception{ + + getTaxonDAO(session); + getResultRowDAO(session); + getTaxonomyDAO(session); + getOccurrencesJobDAO(session); + getTaxonomyJobDAO(session); + } + + + //MODIFIED**************************************************************************************+ + + + + public static EntityManager newEntityManager(ASLSession session){ + + return getEntityManagerFactory(session).createEntityManager(); + } + + public static EntityManagerFactory getEntityManagerFactory(ASLSession session){ + + + EntityManagerFactory factory = SessionUtil.getEntityManagerFactory(session); + + if(factory==null){ + factory = createEntityManagerFactory(session); + SessionUtil.setEntityManagerFactory(session, factory); + } + + return factory; + } + + public static OccurrenceJobPersistence getOccurrencesJobDAO(ASLSession session) throws Exception + { + + OccurrenceJobPersistence occurrencesJobDao = SessionUtil.getCurrentDaoOccurrencesJob(session); + + if(occurrencesJobDao==null){ + occurrencesJobDao = initOccurrencesJobsDao(session); + SessionUtil.setCurrentEJBOccurrencesJob(session, occurrencesJobDao); + } + + return occurrencesJobDao; + } + + + + public static TaxonomyJobPersistence getTaxonomyJobDAO(ASLSession session) throws Exception + { + + TaxonomyJobPersistence taxonomyJobPeristence = SessionUtil.getCurrentDAOTaxonomyJob(session); + + if(taxonomyJobPeristence==null){ + taxonomyJobPeristence = initTaxonomyJobsDao(session); + SessionUtil.setCurrentDAOTaxonomyJob(session, taxonomyJobPeristence); + } + + return taxonomyJobPeristence; + } + + public static EntityManagerFactory createEntityManagerFactory(ASLSession session){ + + Map properties = new HashMap(); +// properties.put("javax.persistence.jdbc.driver", jdbcDriverH2); + + try{ + properties.put("javax.persistence.jdbc.url", getConnectionUrl(session)); + } + catch (Exception e) { + logger.error("error on get connection url "+e, e); + String username = session.getUsername(); + String scope = session.getScopeName(); + properties.put("javax.persistence.jdbc.url", JDBCDRIVER+"/temp/h2dbspecies/h2"+getUsernameScopeValue(username,scope)+";create=true"); + } + //emf = Persistence.createEntityManagerFactory("jpablogPUnit"); + return Persistence.createEntityManagerFactory("SPD_PERSISTENCE_FACTORY",properties); + + } + + + public static OccurrenceJobPersistence initOccurrencesJobsDao(ASLSession session) throws Exception + { + + String username = session.getUsername(); + String scope = session.getScopeName(); + return createOccurrencesJobDao(username, scope, session); + + } + + + public static TaxonomyJobPersistence initTaxonomyJobsDao(ASLSession session) throws Exception{ + TaxonomyJobPersistence occurrenceJobPersistence = new TaxonomyJobPersistence(getEntityManagerFactory(session)); + SessionUtil.setCurrentDAOTaxonomyJob(session, occurrenceJobPersistence); + return occurrenceJobPersistence; + + } + + public static OccurrenceJobPersistence createOccurrencesJobDao(String username, String scope, ASLSession session) throws Exception{ + + OccurrenceJobPersistence occurrenceJobPersistence = new OccurrenceJobPersistence(getEntityManagerFactory(session)); + SessionUtil.setCurrentEJBOccurrencesJob(session, occurrenceJobPersistence); + +// logger.trace("ResultRow Dao IS READY AT CONNECTION URL: " + jdbcDriver + " table name "+ resultRowDAO.getTableInfo().getTableName()); + + return occurrenceJobPersistence; + } + + public static ResultRowPersistence initResultRowDao(ASLSession session) throws Exception + { + + ResultRowPersistence resultRowPersistence = new ResultRowPersistence(getEntityManagerFactory(session)); + SessionUtil.setCurrentEJBResultRow(session, resultRowPersistence); + +// logger.trace("ResultRow Dao IS READY AT CONNECTION URL: " + jdbcDriver + " table name "+ resultRowDAO.getTableInfo().getTableName()); + + return resultRowPersistence; + + } + + public static OccurrenceRowPersistence getOccurrenceDAO(ASLSession session) throws Exception + { + + OccurrenceRowPersistence occurrenceEJB = SessionUtil.getCurrentEJBOccurrence(session); + + if(occurrenceEJB==null){ + occurrenceEJB = initOccurrenceDao(session); + SessionUtil.setCurrentEJBOccurrence(session, occurrenceEJB); + } + + return occurrenceEJB; + } + + public static TaxonRowPersistence initTaxonDao(ASLSession session) throws Exception + { + + TaxonRowPersistence taxonRowPersistence = new TaxonRowPersistence(getEntityManagerFactory(session)); + SessionUtil.setCurrentEJBTaxonRow(session, taxonRowPersistence); + +// logger.trace("ResultRow Dao IS READY AT CONNECTION URL: " + jdbcDriver + " table name "+ resultRowDAO.getTableInfo().getTableName()); + + return taxonRowPersistence; + + } + + private static OccurrenceRowPersistence initOccurrenceDao(ASLSession session) throws Exception { + + OccurrenceRowPersistence occurrenceRowPersistence = new OccurrenceRowPersistence(getEntityManagerFactory(session)); + SessionUtil.setCurrentEJBOccurrence(session, occurrenceRowPersistence); + +// logger.trace("ResultRow Dao IS READY AT CONNECTION URL: " + jdbcDriver + " table name "+ resultRowDAO.getTableInfo().getTableName()); + + return occurrenceRowPersistence; + + } + + public static TaxonRowPersistence getTaxonDAO(ASLSession session) throws Exception + { + + TaxonRowPersistence taxonDao = SessionUtil.getCurrentEJBTaxonRow(session); + + if(taxonDao==null){ + taxonDao = initTaxonDao(session); + SessionUtil.setCurrentEJBTaxonRow(session, taxonDao); + } + +// System.out.println("Return taxon Dao : " + taxonDao + " table name: " + taxonDao.getTableConfig().getTableName()); +// System.out.println("session id: " + session.getExternalSessionID() + " sessione username: " +session.getUsername() + " session scope: "+session.getScopeName()); + + return taxonDao; + } + + public static TaxonomyRowPersistence getTaxonomyDAO(ASLSession session) throws Exception + { + logger.trace("In getTaxonomyDAO..."); + + TaxonomyRowPersistence taxonItemDAO = SessionUtil.getCurrentEJBTaxonomyItem(session); + + if(taxonItemDAO==null){ + taxonItemDAO = initTaxonomyItemDao(session, "taxonomyrow"); + SessionUtil.setCurrentEJBTaxonomyItem(session, taxonItemDAO); + } + +// logger.trace("Return taxonomy row Dao : " + taxonItemDAO + " table name: " + taxonItemDAO.getTableConfig().getTableName()); +// logger.trace("session id: " + session.getExternalSessionID() + " sessione username: " +session.getUsername() + " session scope: "+session.getScopeName()); + + return taxonItemDAO; + } + + private static TaxonomyRowPersistence initTaxonomyItemDao(ASLSession session, String tableName) throws Exception{ + + TaxonomyRowPersistence taxonomyRP = new TaxonomyRowPersistence(getEntityManagerFactory(session)); + SessionUtil.setCurrentEJBTaxonomyItem(session, taxonomyRP); + + return taxonomyRP; + } + + public static ResultRowPersistence getResultRowDAO(ASLSession session) throws Exception + { + + logger.trace("In getResultRowDAO..."); + + ResultRowPersistence resultRowEJB = SessionUtil.getCurrentEJBResultRow(session); + + if(resultRowEJB==null){ + resultRowEJB = initResultRowDao(session); + SessionUtil.setCurrentEJBResultRow(session, resultRowEJB); + } + +// logger.trace("Return result row Dao : " + resultRowEJB + " table name: " + resultRowDAO.getTableConfig().getTableName()); +// logger.trace("session id: " + session.getExternalSessionID() + " sessione username: " +session.getUsername() + " session scope: "+session.getScopeName()); + + return resultRowEJB; + } + + + + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/OccurrenceBuffer.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/OccurrenceBuffer.java new file mode 100644 index 0000000..67dc5d5 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/OccurrenceBuffer.java @@ -0,0 +1,27 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.persistence; + +import org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.AbstractPersistence; +import org.gcube.portlets.user.speciesdiscovery.shared.Occurrence; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class OccurrenceBuffer extends AbstractDaoBuffer { + + public OccurrenceBuffer(AbstractPersistence dao) { + super(dao); + } + + @Override + public void add(Occurrence occurrence) throws Exception + { + logger.trace("Add occurrence "+ occurrence.getServiceId()); +// logger.trace("Add occurrence "+ occurrence); + super.add(occurrence); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/ResultRowBuffer.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/ResultRowBuffer.java new file mode 100644 index 0000000..33e4f1e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/ResultRowBuffer.java @@ -0,0 +1,241 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.persistence; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; + +import org.apache.log4j.Logger; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.AbstractPersistence; +import org.gcube.portlets.user.speciesdiscovery.server.session.FilterableFetchingBuffer; +import org.gcube.portlets.user.speciesdiscovery.shared.MainTaxonomicRankEnum; +import org.gcube.portlets.user.speciesdiscovery.shared.ResultRow; +import org.gcube.portlets.user.speciesdiscovery.shared.Taxon; +import org.gcube.portlets.user.speciesdiscovery.shared.filter.FilterCriteria; +import org.gcube.portlets.user.speciesdiscovery.shared.filter.ResultFilter; +import org.gcube.portlets.user.speciesdiscovery.shared.util.NormalizeString; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class ResultRowBuffer extends AbstractSelectableDaoBuffer implements FilterableFetchingBuffer { + + protected Logger logger = Logger.getLogger(ResultRowBuffer.class); + + private AbstractPersistence taxonDao; + private int filteredListSize = 0; + + public ResultRowBuffer(AbstractPersistence dao, AbstractPersistence taxonDao) + { + super(dao, ResultRow.ID_FIELD, ResultRow.SELECTED); + this.taxonDao = taxonDao; + } + + /** + * {@inheritDoc} + * @throws Exception + */ + @Override + public void add(ResultRow row) throws Exception{ + //FOR DEBUG +// logger.trace("Add item "+ row.getServiceId()); + logger.trace("Add item "+ row.getId() + " service id: " +row.getServiceId()); + + super.add(row); + } + + public int getFilteredListSize() throws SQLException + { + return filteredListSize; + } + + + //TODO MODIFIED + @Override + public List getFilteredList(FilterCriteria filterCriteria) throws SQLException { + + ResultFilter activeFiltersObject = (ResultFilter) filterCriteria; + List list = new ArrayList(); + Iterator iterator = null; + String value; + + if(activeFiltersObject!=null){ + + //FILTER BY CLASSIFICATION + if(activeFiltersObject.isByClassification()){ + +// List listId = activeFiltersObject.getListByClassification(); + + int counter = activeFiltersObject.getNumberOfData(); + + logger.trace("in classification filter - counter: "+counter); + logger.trace("in classification filter - rank: "+activeFiltersObject.getRankClassification()); + logger.trace("in classification filter - classification id: "+activeFiltersObject.getClassificationId()); + + String columName = null; + + if(activeFiltersObject.getRankClassification().compareTo(MainTaxonomicRankEnum.KINGDOM.getLabel())==0) + columName = ResultRow.KINGDOM_ID; + else if(activeFiltersObject.getRankClassification().compareTo(MainTaxonomicRankEnum.FAMILY.getLabel())==0) + columName = ResultRow.FAMILY_ID; + else if(activeFiltersObject.getRankClassification().compareTo(MainTaxonomicRankEnum.GENUS.getLabel())==0) + columName = ResultRow.GENUS_ID; + else if(activeFiltersObject.getRankClassification().compareTo(MainTaxonomicRankEnum.CLASS.getLabel())==0) + columName = ResultRow.CLASS_ID; + else if(activeFiltersObject.getRankClassification().compareTo(MainTaxonomicRankEnum.ORDER.getLabel())==0) + columName = ResultRow.ORDER_ID; + else if(activeFiltersObject.getRankClassification().compareTo(MainTaxonomicRankEnum.PHYLUM.getLabel())==0) + columName = ResultRow.PHYLUM_ID; + else if(activeFiltersObject.getRankClassification().compareTo(MainTaxonomicRankEnum.SPECIES.getLabel())==0) + columName = ResultRow.SPECIES_ID; + +// logger.trace("in classification filter - columName: "+columName); + + try { + + CriteriaBuilder queryBuilder = dao.getCriteriaBuilder(); + + Query query = dao.createNewManager().createQuery("select r FROM ResultRow r where r."+columName+ "='"+activeFiltersObject.getClassificationId()+"'"); +// + query.setMaxResults(counter); + + iterator = query.getResultList().iterator(); +// logger.trace("in classification filter - statement: "+queryBuilder.where().eq(columName, activeFiltersObject.getClassificationId()).getStatement()); + + } catch (Exception e) { + logger.error("Error in activeFiltersObject.isByClassification(): "+e, e); + } + + //FILTER BY DATA PROVIDER + }else if(activeFiltersObject.isByDataProvider()){ + + try { + CriteriaBuilder queryBuilder = dao.getCriteriaBuilder(); + value = activeFiltersObject.getDataProviderName(); + CriteriaQuery cq = queryBuilder.createQuery(); + Predicate pr1 = queryBuilder.equal(dao.rootFrom(cq).get(ResultRow.DATAPROVIDER_NAME), value); + cq.where(pr1); + + //TODO FIXME empty value + logger.trace("FILTER BY DATA PROVIDER: "+ value ); + + iterator = dao.executeCriteriaQuery(cq).iterator(); + + } catch (Exception e) { + logger.error("Error in activeFiltersObject.isByDataProvider(): "+e, e); + e.printStackTrace(); + } + + //FILTER BY DATA SOURCE + }else if(activeFiltersObject.isByDataSourceName()){ + + try { + CriteriaBuilder queryBuilder = dao.getCriteriaBuilder(); + value = activeFiltersObject.getDataSourceName(); + CriteriaQuery cq = queryBuilder.createQuery(); + Predicate pr1 = queryBuilder.equal(dao.rootFrom(cq).get(ResultRow.DATASOURCE_NAME), NormalizeString.validateUndefined(value)); + cq.where(pr1); + + logger.trace("FILTER BY DATA DATA SOURCE NAME: "+ value ); + + iterator = dao.executeCriteriaQuery(cq).iterator(); + + } catch (Exception e) { + logger.error("Error in activeFiltersObject.isByDataSourceName(): "+e, e); + e.printStackTrace(); + } + + //FILTER BY RANK + }else if(activeFiltersObject.isByRank()){ + + try { + + CriteriaBuilder queryBuilder = taxonDao.getCriteriaBuilder(); + value = NormalizeString.lowerCaseUpFirstChar(activeFiltersObject.getRankName()); + CriteriaQuery cq = queryBuilder.createQuery(); + Predicate pr1 = queryBuilder.equal(taxonDao.rootFrom(cq).get(Taxon.RANK), NormalizeString.validateUndefined(value)); + cq.where(pr1); + + Iterator iteratorTaxon = taxonDao.executeCriteriaQuery(cq).iterator(); + + logger.trace("in rank filter - value: "+value); + + List listTaxonId = new ArrayList(); + + if(iteratorTaxon!=null){ + + while(iteratorTaxon.hasNext()){ + + Taxon tax = iteratorTaxon.next(); + listTaxonId.add(tax.getId()); + } + } + + logger.trace("in rank filter - listTaxonId size: "+listTaxonId.size()); + + + queryBuilder = dao.getCriteriaBuilder(); + cq = queryBuilder.createQuery(); + pr1 = dao.rootFrom(cq).get(ResultRow.PARENT_FOREIGN_KEY_TAXON).in(listTaxonId); + cq.where(pr1); + + iterator = dao.executeCriteriaQuery(cq).iterator(); + + } catch (Exception e) { + logger.error("Error in activeFiltersObject.isByRank(): "+e, e); + e.printStackTrace(); + } + } + + if(iterator!=null){ + + while(iterator.hasNext()){ + + ResultRow row = iterator.next(); + list.add(row); + } + + filteredListSize = list.size(); + + } + } + + logger.trace("RETURNED List size " + list.size()); + + return list; + } + + @Override + public void updateAllSelection(boolean selection) throws Exception { + + EntityManager em = dao.createNewManager(); + + //TODO use filterMap + + try { + em.getTransaction().begin(); + + int updateCount = em.createQuery("UPDATE ResultRow SET " + ResultRow.SELECTED + " = "+ selection).executeUpdate(); + + logger.trace("Updated " + updateCount + " item"); + + em.getTransaction().commit(); + } finally { + if (em.getTransaction().isActive()) + em.getTransaction().rollback(); + em.close(); + } + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/TaxonomyRowBuffer.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/TaxonomyRowBuffer.java new file mode 100644 index 0000000..dc98317 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/TaxonomyRowBuffer.java @@ -0,0 +1,213 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.persistence; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; + +import org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.AbstractPersistence; +import org.gcube.portlets.user.speciesdiscovery.server.session.FilterableFetchingBuffer; +import org.gcube.portlets.user.speciesdiscovery.shared.MainTaxonomicRankEnum; +import org.gcube.portlets.user.speciesdiscovery.shared.ResultRow; +import org.gcube.portlets.user.speciesdiscovery.shared.TaxonomyRow; +import org.gcube.portlets.user.speciesdiscovery.shared.filter.FilterCriteria; +import org.gcube.portlets.user.speciesdiscovery.shared.filter.ResultFilter; +import org.gcube.portlets.user.speciesdiscovery.shared.util.NormalizeString; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class TaxonomyRowBuffer extends AbstractSelectableDaoBuffer implements FilterableFetchingBuffer { + + private int filteredListSize = 0; + + public TaxonomyRowBuffer(AbstractPersistence dao) { + super(dao, TaxonomyRow.ID_FIELD, TaxonomyRow.SELECTED); + } + + /** + * {@inheritDoc} + * @throws Exception + */ + @Override + public void add(TaxonomyRow row) throws Exception + { + //DEBUG + logger.trace("Add item "+ row.getId() + " service id: " +row.getServiceId()); +// logger.trace("Add item "+ row); + + super.add(row); + } + + @Override + public List getFilteredList(FilterCriteria filterCriteria) throws SQLException { + ResultFilter activeFiltersObject = (ResultFilter) filterCriteria; + List list = new ArrayList(); + Iterator iterator = null; +// QueryBuilder queryBuilder = dao.queryBuilder(); + String value; + + if(activeFiltersObject!=null){ + //FILTER BY CLASSIFICATION + if(activeFiltersObject.isByClassification()){ + + int counter = activeFiltersObject.getNumberOfData(); + String columName = null; + + if(activeFiltersObject.getRankClassification().compareTo(MainTaxonomicRankEnum.KINGDOM.getLabel())==0) + columName = TaxonomyRow.KINGDOM_ID; + else if(activeFiltersObject.getRankClassification().compareTo(MainTaxonomicRankEnum.FAMILY.getLabel())==0) + columName = TaxonomyRow.FAMILY_ID; + else if(activeFiltersObject.getRankClassification().compareTo(MainTaxonomicRankEnum.GENUS.getLabel())==0) + columName = TaxonomyRow.GENUS_ID; + else if(activeFiltersObject.getRankClassification().compareTo(MainTaxonomicRankEnum.CLASS.getLabel())==0) + columName = TaxonomyRow.CLASS_ID; + else if(activeFiltersObject.getRankClassification().compareTo(MainTaxonomicRankEnum.ORDER.getLabel())==0) + columName = TaxonomyRow.ORDER_ID; + else if(activeFiltersObject.getRankClassification().compareTo(MainTaxonomicRankEnum.PHYLUM.getLabel())==0) + columName = TaxonomyRow.PHYLUM_ID; + else if(activeFiltersObject.getRankClassification().compareTo(MainTaxonomicRankEnum.SPECIES.getLabel())==0) + columName = TaxonomyRow.SPECIES_ID; +// +// logger.trace("in classification filter - columName: "+columName); + + try { + + CriteriaBuilder queryBuilder = dao.getCriteriaBuilder(); + + Query query = dao.createNewManager().createQuery("select r FROM TaxonomyRow r where r."+columName+ "='"+activeFiltersObject.getClassificationId()+"'"); +// + query.setMaxResults(counter); + + iterator = query.getResultList().iterator(); +// logger.trace("in classification filter - statement: "+queryBuilder.where().eq(columName, activeFiltersObject.getClassificationId()).getStatement()); + + } catch (Exception e) { + logger.error("Error in activeFiltersObject.isByClassification(): "+e, e); + e.printStackTrace(); + } + + //FILTER BY DATA PROVIDER + }else if(activeFiltersObject.isByDataProvider()){ + + try { + CriteriaBuilder queryBuilder = dao.getCriteriaBuilder(); + value = activeFiltersObject.getDataProviderName(); + CriteriaQuery cq = queryBuilder.createQuery(); + Predicate pr1 = queryBuilder.equal(dao.rootFrom(cq).get(TaxonomyRow.DATAPROVIDER_NAME), value); + cq.where(pr1); + + //TODO FIXME empty value + logger.trace("FILTER BY DATA PROVIDER: "+ value ); + + iterator = dao.executeCriteriaQuery(cq).iterator(); + + } catch (Exception e) { + logger.error("Error in activeFiltersObject.isByDataProvider(): "+e, e); + e.printStackTrace(); + } + + //FILTER BY DATA SOURCE + }else if(activeFiltersObject.isByDataSourceName()){ + + try { + CriteriaBuilder queryBuilder = dao.getCriteriaBuilder(); + value = activeFiltersObject.getDataSourceName(); + CriteriaQuery cq = queryBuilder.createQuery(); + Predicate pr1 = queryBuilder.equal(dao.rootFrom(cq).get(TaxonomyRow.DATAPROVIDER_NAME), value); + cq.where(pr1); + + //TODO FIXME empty value + logger.trace("FILTER BY DATA PROVIDER: "+ value ); + + iterator = dao.executeCriteriaQuery(cq).iterator(); + + } catch (Exception e) { + logger.error("Error in activeFiltersObject.isByDataProvider(): "+e, e); + e.printStackTrace(); + } + + +// //FILTER BY RANK + }else if(activeFiltersObject.isByRank()){ + + try { + + CriteriaBuilder queryBuilder = dao.getCriteriaBuilder(); + value = NormalizeString.lowerCaseUpFirstChar(activeFiltersObject.getRankName()); + logger.trace("in rank filter - value: "+value); + CriteriaQuery cq = queryBuilder.createQuery(); + Predicate pr1 = queryBuilder.equal(dao.rootFrom(cq).get(TaxonomyRow.RANK), NormalizeString.validateUndefined(value)); + cq.where(pr1); + + iterator = dao.executeCriteriaQuery(cq).iterator(); + + + } catch (Exception e) { + logger.error("Error in activeFiltersObject.isByRank(): "+e, e); + } + + } + + if(iterator!=null){ + + while(iterator.hasNext()){ + + TaxonomyRow row = iterator.next(); + list.add(row); + } + + filteredListSize = list.size(); + + } + } + + logger.trace("RETURNED List size " + list.size()); + + return list; + } + + @Override + public int getFilteredListSize() throws SQLException { +// return 0; + return filteredListSize; + } + + @Override + public void updateAllSelection(boolean selection) throws Exception { + + EntityManager em = dao.createNewManager(); + + //TODO generalize? + String queryString = "UPDATE TaxonomyRow SET " + + ResultRow.SELECTED + " = "+ selection + +" where "+TaxonomyRow.IS_PARENT +"=false"; + + try { + em.getTransaction().begin(); + + int updateCount = em.createQuery(queryString).executeUpdate(); + + logger.trace("Updated " + updateCount + " item"); + + em.getTransaction().commit(); + } finally { + if (em.getTransaction().isActive()) + em.getTransaction().rollback(); + em.close(); + } + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/dao/AbstractPersistence.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/dao/AbstractPersistence.java new file mode 100644 index 0000000..7e3f4ea --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/dao/AbstractPersistence.java @@ -0,0 +1,202 @@ +package org.gcube.portlets.user.speciesdiscovery.server.persistence.dao; + +import java.util.List; +import java.util.Map; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; + +import org.gcube.common.core.utils.logging.GCUBELog; + +public abstract class AbstractPersistence { + + protected EntityManagerFactory entityManagerFactory; + + public final String AND = "AND"; + + protected GCUBELog logger = new GCUBELog(AbstractPersistence.class); + + AbstractPersistence(EntityManagerFactory factory){ + this.entityManagerFactory = factory; + } + /** + * + * @param item + * @return + */ + public boolean insert(T item){ + EntityManager em = createNewManager(); + try { + + em.getTransaction().begin(); + em.persist(item); + em.getTransaction().commit(); + + } catch (Exception e) { + + logger.error("Error in insert: "+e.getMessage(), e); + } + finally { + if (em.getTransaction().isActive()) + em.getTransaction().rollback(); + em.close(); + } + + return true; + }; + + + /** + * + * @param item + * @return + */ + public T update(T item){ + EntityManager em = createNewManager(); + try { + + em.getTransaction().begin(); + item = em.merge(item); + em.getTransaction().commit(); + + } catch (Exception e) { + logger.error("Error in update: "+e.getMessage(), e); + } + finally { + if (em.getTransaction().isActive()) + em.getTransaction().rollback(); + em.close(); + } + + return item; + } + + /** + * + * @param item + * @return + */ + public boolean remove(T item, boolean transaction){ + EntityManager em = createNewManager(); + try { + + if(transaction){ + em.getTransaction().begin(); + em.remove(item); + em.getTransaction().commit(); + } + else + em.remove(item); + + } catch (Exception e) { + logger.error("Error in remove: "+e.getMessage(), e); + } + finally { + if (em.getTransaction().isActive()) + em.getTransaction().rollback(); + em.close(); + } + + + return true; + } + + /** + * + * @return + */ + public abstract int removeAll(); + + /** + * + * @param filerMap + * @return + */ + public abstract List getList(); + + /** + * + * @return + */ + public abstract List getList(int startIndex, int offset) throws Exception; + + /** + * + * @return + */ + public abstract int countItems(); + + /** + * + * @param employeeId + * @return + */ + public abstract T getItemByKey(Integer id); + /** + * + * @param builder + * @return + */ + public abstract List executeCriteriaQuery(CriteriaQuery criteriaQuery); + + + /** + * + * @return + */ + public EntityManagerFactory getEntityManagerFactory() { + return entityManagerFactory; + } + + /** + * + * @return + */ + public EntityManager createNewManager(){ + if(entityManagerFactory!=null) + return entityManagerFactory.createEntityManager(); + + return null; + } + /** + * + * @return + */ + public abstract CriteriaBuilder getCriteriaBuilder(); + + + /** + * + * @return + */ + public abstract List executeTypedQuery(CriteriaQuery cq, int startIndex, int offset); + + /** + * + * @param cq + * @return + */ + public abstract Root rootFrom(CriteriaQuery cq); + + /** + * + * @param filterMap + * @param startIndex + * @param offset + * @return + */ + public abstract List getList(Map filterMap, int startIndex, int offset); + + + /** + * + * @param idField + * @return + */ + public abstract int deleteItemByIdField(String idField); + + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/dao/OccurrenceJobPersistence.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/dao/OccurrenceJobPersistence.java new file mode 100644 index 0000000..c4d1e1a --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/dao/OccurrenceJobPersistence.java @@ -0,0 +1,207 @@ +package org.gcube.portlets.user.speciesdiscovery.server.persistence.dao; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Query; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; + +import org.gcube.portlets.user.speciesdiscovery.shared.OccurrencesJob; + +public class OccurrenceJobPersistence extends AbstractPersistence{ + + public OccurrenceJobPersistence(EntityManagerFactory factory) { + super(factory); + } + + @Override + public int removeAll() { + EntityManager em = super.createNewManager(); + int removed = 0; + try { + + em.getTransaction().begin(); + removed = em.createQuery("DELETE FROM OccurrencesJob").executeUpdate(); + em.getTransaction().commit(); + logger.trace("DELETE FROM OccurrenceJob " + removed +" items"); + + } catch (Exception e) { + logger.error("Error in removeAll: " + e.getMessage(), e); + + } finally { + em.close(); + } + + return removed; + } + + @Override + public List getList() { + EntityManager em = super.createNewManager(); + List listOccurrencesJob = new ArrayList(); + try { + Query query = em.createQuery("select t from OccurrencesJob t"); + + listOccurrencesJob = query.getResultList(); + + } finally { + em.close(); + } + return listOccurrencesJob; + } + + @Override + public int countItems() { + return getList().size(); + } + + @Override + public OccurrencesJob getItemByKey(Integer id) { + logger.trace("getItemByKey id: "+id); + EntityManager em = super.createNewManager(); + OccurrencesJob occurrencesJob = null; + try { + occurrencesJob = em.getReference(OccurrencesJob.class, id); + + } finally { + em.close(); + } + if(occurrencesJob!=null) + logger.trace("getItemByKey return row: "+occurrencesJob.getId()); + else + logger.trace("getItemByKey return null"); + + //FOR DEBUG +// System.out.println("getItemByKey return: "+row ); + + return occurrencesJob; + } + + @Override + public List executeCriteriaQuery(CriteriaQuery criteriaQuery) { + EntityManager em = super.createNewManager(); + List listOJ = new ArrayList(); + try { + + Query query = em.createQuery(criteriaQuery); + + listOJ = query.getResultList(); + } finally { + em.close(); + } + + return listOJ; + } + + @Override + public CriteriaBuilder getCriteriaBuilder() { + return createNewManager().getCriteriaBuilder(); + } + + @Override + public Root rootFrom(CriteriaQuery cq) { + return cq.from(OccurrencesJob.class); + } + + @Override + public List getList(int startIndex, int offset) throws Exception { + EntityManager em = super.createNewManager(); + List listOJ = new ArrayList(); + try { + Query query = em.createQuery("select t from OccurrencesJob t"); + query.setFirstResult(startIndex); + query.setMaxResults(offset); + listOJ = query.getResultList(); + + } finally { + em.close(); + } + return listOJ; + } + + @Override + public List getList(Map filterMap, int startIndex, int offset) { + + EntityManager em = super.createNewManager(); + List listOJ = new ArrayList(); + try { + String queryString = "select t from OccurrencesJob t"; + + if(filterMap!=null && filterMap.size()>0){ + queryString+=" where "; + for (String param : filterMap.keySet()) { + String value = filterMap.get(param); + queryString+=" t."+param+"="+value; + queryString+=AND; + } + + queryString = queryString.substring(0, queryString.lastIndexOf(AND)); + } + Query query = em.createQuery(queryString); + + if(startIndex>-1) + query.setFirstResult(startIndex); + if(offset>-1) + query.setMaxResults(offset); + + listOJ = query.getResultList(); + } finally { + em.close(); + } + return listOJ; + } + + @Override + public List executeTypedQuery(CriteriaQuery cq, int startIndex, int offset) { + + EntityManager em = super.createNewManager(); + List listOJ = new ArrayList(); + try { + + TypedQuery typedQuery = em.createQuery(cq); + + if(startIndex>-1) + typedQuery.setFirstResult(startIndex); + if(offset>-1) + typedQuery.setMaxResults(offset); + + listOJ = typedQuery.getResultList(); + + } finally { + em.close(); + } + + return listOJ; + + } + + @Override + public int deleteItemByIdField(String idField) { + EntityManager em = super.createNewManager(); + int removed = 0; + + try { + em.getTransaction().begin(); + removed = em.createQuery("DELETE FROM OccurrencesJob t WHERE t."+OccurrencesJob.ID_FIELD+"='"+idField+"'").executeUpdate(); + em.getTransaction().commit(); + logger.trace("Item "+ idField + " was deleted from OccurrencesJob"); + + } catch (Exception e) { + logger.error("Error in OccurrencesJob deleteItemByIdField: " + e.getMessage(), e); + e.printStackTrace(); + + } finally { + em.close(); + } + + return removed; + } + + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/dao/OccurrenceRowPersistence.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/dao/OccurrenceRowPersistence.java new file mode 100644 index 0000000..04a5268 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/dao/OccurrenceRowPersistence.java @@ -0,0 +1,219 @@ +package org.gcube.portlets.user.speciesdiscovery.server.persistence.dao; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Query; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; + +import org.gcube.common.core.utils.logging.GCUBELog; +import org.gcube.portlets.user.speciesdiscovery.shared.Occurrence; + +public class OccurrenceRowPersistence extends AbstractPersistence{ + + protected CriteriaBuilder criteriaBuilder; + protected CriteriaQuery criteriaQuery; + protected Root rootFrom; + protected GCUBELog logger = new GCUBELog(OccurrenceRowPersistence.class); + + public OccurrenceRowPersistence(EntityManagerFactory factory){ + super(factory); + criteriaBuilder = super.createNewManager().getCriteriaBuilder(); + } + + @Override + public Root rootFrom(CriteriaQuery cq){ + return cq.from(Occurrence.class); + } + + @SuppressWarnings("unchecked") + @Override + public List getList() { + EntityManager em = super.createNewManager(); + List listResultRow = new ArrayList(); + try { + Query query = em.createQuery("select t from Occurrence t"); + + listResultRow = query.getResultList(); + } finally { + em.close(); + } + return listResultRow; + } + + @Override + public int countItems() { + return getList().size(); + } + + @SuppressWarnings({ "unchecked"}) + @Override + public List executeCriteriaQuery(CriteriaQuery criteriaQuery) { + + EntityManager em = super.createNewManager(); + List listResultRow = new ArrayList(); + try { + + Query query = em.createQuery(criteriaQuery); + + listResultRow = query.getResultList(); + } finally { + em.close(); + } + + return listResultRow; + } + + @Override + public Occurrence getItemByKey(Integer id) { + logger.trace("getItemByKey id: "+id); + EntityManager em = super.createNewManager(); + Occurrence row = null; + try { + row = em.getReference(Occurrence.class, id); + + } finally { + em.close(); + } + if(row!=null) + logger.trace("getItemByKey return row: "+row.getId() + ", service id: " + row.getServiceId()); + else + logger.trace("getItemByKey return null"); + + //FOR DEBUG +// System.out.println("getItemByKey return: "+row ); + + return row; + } + + @Override + public CriteriaBuilder getCriteriaBuilder(){ + return createNewManager().getCriteriaBuilder(); + } + + /** + * + * @return + */ + public int removeAll() { + EntityManager em = super.createNewManager(); + int removed = 0; + try { + + em.getTransaction().begin(); + removed = em.createQuery("DELETE FROM Occurrence").executeUpdate(); + em.getTransaction().commit(); + logger.trace("DELETE FROM Occurrence " + removed +" items"); + + } catch (Exception e) { + logger.error("Error in removeAll: " + e.getMessage(), e); + + } finally { + em.close(); + } + + return removed; + } + + @Override + public List getList(int startIndex, int offset) + throws Exception { + + EntityManager em = super.createNewManager(); + List listOccurrence = new ArrayList(); + try { + Query query = em.createQuery("select t from Occurrence t"); + query.setFirstResult(startIndex); + query.setMaxResults(offset); + listOccurrence = query.getResultList(); + + } finally { + em.close(); + } + return listOccurrence; + } + + @Override + public List getList(Map filterMap, int startIndex, int offset) { + + EntityManager em = super.createNewManager(); + List listOccurrence = new ArrayList(); + try { + String queryString = "select t from Occurrence t"; + + if(filterMap!=null && filterMap.size()>0){ + queryString+=" where "; + for (String param : filterMap.keySet()) { + String value = filterMap.get(param); + queryString+=" t."+param+"="+value; + queryString+=AND; + } + + queryString = queryString.substring(0, queryString.lastIndexOf(AND)); + } + Query query = em.createQuery(queryString); + + if(startIndex>-1) + query.setFirstResult(startIndex); + if(offset>-1) + query.setMaxResults(offset); + + listOccurrence = query.getResultList(); + } finally { + em.close(); + } + return listOccurrence; + } + + + @Override + public List executeTypedQuery(CriteriaQuery cq, int startIndex, int offset) { + + EntityManager em = super.createNewManager(); + List listOJ = new ArrayList(); + try { + + TypedQuery typedQuery = em.createQuery(cq); + + if(startIndex>-1) + typedQuery.setFirstResult(startIndex); + if(offset>-1) + typedQuery.setMaxResults(offset); + + listOJ = typedQuery.getResultList(); + + } finally { + em.close(); + } + + return listOJ; + + } + + @Override + public int deleteItemByIdField(String idField) { + EntityManager em = super.createNewManager(); + int removed = 0; + + try { + em.getTransaction().begin(); + removed = em.createQuery("DELETE FROM Occurrence t WHERE t."+Occurrence.ID_FIELD+"='"+idField+"'").executeUpdate(); + em.getTransaction().commit(); + logger.trace("Item "+ idField + " was deleted from Occurrence"); + + } catch (Exception e) { + logger.error("Error in Occurrence deleteJobById: " + e.getMessage(), e); + + } finally { + em.close(); + } + + return removed; + } +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/dao/ResultRowPersistence.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/dao/ResultRowPersistence.java new file mode 100644 index 0000000..0bd33d0 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/dao/ResultRowPersistence.java @@ -0,0 +1,217 @@ +package org.gcube.portlets.user.speciesdiscovery.server.persistence.dao; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Query; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; + +import org.gcube.common.core.utils.logging.GCUBELog; +import org.gcube.portlets.user.speciesdiscovery.shared.ResultRow; + +public class ResultRowPersistence extends AbstractPersistence{ + + // Query for a List of objects. + protected CriteriaBuilder criteriaBuilder; + protected CriteriaQuery criteriaQuery; + protected Root rootFrom; + protected GCUBELog logger = new GCUBELog(ResultRowPersistence.class); + + public ResultRowPersistence(EntityManagerFactory factory){ + super(factory); + criteriaBuilder = super.createNewManager().getCriteriaBuilder(); +// CriteriaQuery cq = criteriaBuilder.createQuery(); +// Root rootFrom = cq.from(ResultRow.class); + } + + @Override + public Root rootFrom(CriteriaQuery cq){ + return cq.from(ResultRow.class); + } + + @SuppressWarnings("unchecked") + @Override + public List getList() { + EntityManager em = super.createNewManager(); + List listResultRow = new ArrayList(); + try { + Query query = em.createQuery("select t from ResultRow t"); + + listResultRow = query.getResultList(); + + } finally { + em.close(); + } + return listResultRow; + } + + @Override + public int countItems() { + return getList().size(); + } + + @SuppressWarnings({ "unchecked"}) + @Override + public List executeCriteriaQuery(CriteriaQuery criteriaQuery) { + + EntityManager em = super.createNewManager(); + List listResultRow = new ArrayList(); + try { + + Query query = em.createQuery(criteriaQuery); + + listResultRow = query.getResultList(); + } finally { + em.close(); + } + + return listResultRow; + } + + @Override + public ResultRow getItemByKey(Integer id) { + logger.trace("getItemByKey id: "+id); + EntityManager em = super.createNewManager(); + ResultRow row = null; + try { + row = em.getReference(ResultRow.class, id); + + } finally { + em.close(); + } + if(row!=null) + logger.trace("getItemByKey return row: "+row.getId() + ", service id: " + row.getServiceId()); + else + logger.trace("getItemByKey return null"); + + //FOR DEBUG +// System.out.println("getItemByKey return: "+row ); + + return row; + } + + + @Override + public CriteriaBuilder getCriteriaBuilder(){ + return createNewManager().getCriteriaBuilder(); + } + + /** + * + * @return + */ + public int removeAll() { + EntityManager em = super.createNewManager(); + int removed = 0; + try { + + em.getTransaction().begin(); + removed = em.createQuery("DELETE FROM ResultRow").executeUpdate(); + em.getTransaction().commit(); + logger.trace("DELETE FROM ResultRow " + removed +" items"); + + } catch (Exception e) { + logger.error("Error in removeAll: " + e.getMessage(), e); + + } finally { + em.close(); + } + + return removed; + } + + @Override + public List getList(int startIndex, int offset) throws Exception { + + EntityManager em = super.createNewManager(); + List listResultRow = new ArrayList(); + try { + Query query = em.createQuery("select t from ResultRow t"); + query.setFirstResult(startIndex); + query.setMaxResults(offset); + listResultRow = query.getResultList(); + + } finally { + em.close(); + } + return listResultRow; + } + + @Override + public List getList(Map filterMap, int startIndex, int offset) { + + EntityManager em = super.createNewManager(); + List listResultRow = new ArrayList(); + try { + String queryString = "select t from ResultRow t"; + + if(filterMap!=null && filterMap.size()>0){ + queryString+=" where "; + for (String param : filterMap.keySet()) { + String value = filterMap.get(param); + queryString+=" t."+param+"="+value; + queryString+=AND; + } + + queryString = queryString.substring(0, queryString.lastIndexOf(AND)); + } + Query query = em.createQuery(queryString); + + listResultRow = query.getResultList(); + } finally { + em.close(); + } + return listResultRow; + } + + @Override + public List executeTypedQuery(CriteriaQuery cq, int startIndex, int offset) { + + EntityManager em = super.createNewManager(); + List listOJ = new ArrayList(); + try { + + TypedQuery typedQuery = em.createQuery(cq); + + if(startIndex>-1) + typedQuery.setFirstResult(startIndex); + if(offset>-1) + typedQuery.setMaxResults(offset); + + listOJ = typedQuery.getResultList(); + + } finally { + em.close(); + } + + return listOJ; + + } + + @Override + public int deleteItemByIdField(String idField) { + EntityManager em = super.createNewManager(); + int removed = 0; + + try { + em.getTransaction().begin(); + removed = em.createQuery("DELETE FROM ResultRow t WHERE t."+ResultRow.ID_FIELD+"='"+idField+"'").executeUpdate(); + em.getTransaction().commit(); + logger.trace("Item "+ idField + " was deleted from ResultRow"); + + } catch (Exception e) { + logger.error("Error in ResultRow deleteJobById: " + e.getMessage(), e); + + } finally { + em.close(); + } + + return removed; + } +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/dao/TaxonRowPersistence.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/dao/TaxonRowPersistence.java new file mode 100644 index 0000000..24ad65d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/dao/TaxonRowPersistence.java @@ -0,0 +1,201 @@ +package org.gcube.portlets.user.speciesdiscovery.server.persistence.dao; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Query; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; + +import org.gcube.portlets.user.speciesdiscovery.shared.Taxon; + + +public class TaxonRowPersistence extends AbstractPersistence{ + + public TaxonRowPersistence(EntityManagerFactory factory) { + super(factory); + } + + @Override + public int removeAll() { + EntityManager em = super.createNewManager(); + int removed = 0; + try { + + em.getTransaction().begin(); + removed = em.createQuery("DELETE FROM Taxon").executeUpdate(); + em.getTransaction().commit(); + logger.trace("DELETE FROM Taxon " + removed +" items"); + + } catch (Exception e) { + logger.error("Error in removeAll: " + e.getMessage(), e); + + } finally { + em.close(); + } + + return removed; + } + + @Override + public List getList() { + EntityManager em = super.createNewManager(); + List listTaxon = new ArrayList(); + try { + Query query = em.createQuery("select t from Taxon t"); + + listTaxon = query.getResultList(); + + } finally { + em.close(); + } + return listTaxon; + } + + @Override + public List getList(int startIndex, int offset) throws Exception { + + EntityManager em = super.createNewManager(); + List listTaxon = new ArrayList(); + try { + Query query = em.createQuery("select t from Taxon t"); + query.setFirstResult(startIndex); + query.setMaxResults(offset); + listTaxon = query.getResultList(); + + } finally { + em.close(); + } + return listTaxon; + } + + @Override + public int countItems() { + return getList().size(); + } + + @Override + public Taxon getItemByKey(Integer id) { + logger.trace("getItemByKey id: "+id); + EntityManager em = super.createNewManager(); + Taxon row = null; + try { + row = em.getReference(Taxon.class, id); + + } finally { + em.close(); + } + if(row!=null) + logger.trace("getItemByKey return row id: "+row.getId()); + else + logger.trace("getItemByKey return null"); + + //FOR DEBUG +// System.out.println("getItemByKey return: "+row ); + + return row; + } + + @Override + public List executeCriteriaQuery(CriteriaQuery criteriaQuery) { + EntityManager em = super.createNewManager(); + List listTaxon = new ArrayList(); + try { + + Query query = em.createQuery(criteriaQuery); + + listTaxon = query.getResultList(); + } finally { + em.close(); + } + + return listTaxon; + } + + @Override + public CriteriaBuilder getCriteriaBuilder() { + return createNewManager().getCriteriaBuilder(); + } + + @Override + public Root rootFrom(CriteriaQuery cq) { + return cq.from(Taxon.class); + } + + @Override + public List getList(Map filterMap, int startIndex, + int offset) { + EntityManager em = super.createNewManager(); + List listTaxon = new ArrayList(); + try { + String queryString = "select t from Taxon t"; + + if(filterMap!=null && filterMap.size()>0){ + queryString+=" where "; + for (String param : filterMap.keySet()) { + String value = filterMap.get(param); + queryString+=" t."+param+"="+value; + queryString+=AND; + } + + queryString = queryString.substring(0, queryString.lastIndexOf(AND)); + } + Query query = em.createQuery(queryString); + + listTaxon = query.getResultList(); + } finally { + em.close(); + } + return listTaxon; + } + + @Override + public List executeTypedQuery(CriteriaQuery cq, + int startIndex, int offset) { + EntityManager em = super.createNewManager(); + List listTaxon = new ArrayList(); + try { + + TypedQuery typedQuery = em.createQuery(cq); + + if(startIndex>-1) + typedQuery.setFirstResult(startIndex); + if(offset>-1) + typedQuery.setMaxResults(offset); + + listTaxon = typedQuery.getResultList(); + + } finally { + em.close(); + } + + return listTaxon; + } + + @Override + public int deleteItemByIdField(String idField) { + EntityManager em = super.createNewManager(); + int removed = 0; + + try { + em.getTransaction().begin(); + removed = em.createQuery("DELETE FROM Taxon t WHERE t."+Taxon.ID_FIELD+"='"+idField+"'").executeUpdate(); + em.getTransaction().commit(); + logger.trace("Item "+ idField + " was deleted from Taxon"); + + } catch (Exception e) { + logger.error("Error in Taxon deleteJobById: " + e.getMessage(), e); + + } finally { + em.close(); + } + + return removed; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/dao/TaxonomyJobPersistence.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/dao/TaxonomyJobPersistence.java new file mode 100644 index 0000000..36a9b64 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/dao/TaxonomyJobPersistence.java @@ -0,0 +1,209 @@ +package org.gcube.portlets.user.speciesdiscovery.server.persistence.dao; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Query; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; + +import org.gcube.portlets.user.speciesdiscovery.shared.TaxonomyJob; + +public class TaxonomyJobPersistence extends AbstractPersistence{ + + public TaxonomyJobPersistence(EntityManagerFactory factory) { + super(factory); + } + + @Override + public int removeAll() { + EntityManager em = super.createNewManager(); + int removed = 0; + try { + + em.getTransaction().begin(); + removed = em.createQuery("DELETE FROM TaxonomyJob").executeUpdate(); + em.getTransaction().commit(); + logger.trace("DELETE FROM TaxonomyJob " + removed +" items"); + + } catch (Exception e) { + logger.error("Error in removeAll: " + e.getMessage(), e); + + } finally { + em.close(); + } + + return removed; + } + + @Override + public int deleteItemByIdField(String idField){ + EntityManager em = super.createNewManager(); + int removed = 0; + + try { + em.getTransaction().begin(); + removed = em.createQuery("DELETE FROM TaxonomyJob t WHERE t."+TaxonomyJob.ID_FIELD+"='"+idField+"'").executeUpdate(); + em.getTransaction().commit(); + logger.trace("Item "+ idField + " was deleted from TaxonomyJob. removed "+ removed + " item" ); +// System.out.println("Item "+ idField + " was deleted from TaxonomyJob. removed "+ removed + " item" ); + + } catch (Exception e) { + logger.error("Error in TaxonomyJob deleteJobById: " + e.getMessage(), e); + e.printStackTrace(); + + } finally { + em.close(); + } + + return removed; + } + + @Override + public List getList() { + EntityManager em = super.createNewManager(); + List listTaxJob = new ArrayList(); + try { + Query query = em.createQuery("select t from TaxonomyJob t"); + + listTaxJob = query.getResultList(); + + } finally { + em.close(); + } + return listTaxJob; + } + + @Override + public int countItems() { + return getList().size(); + } + + @Override + public TaxonomyJob getItemByKey(Integer id) { + logger.trace("getItemByKey id: "+id); + EntityManager em = super.createNewManager(); + TaxonomyJob taxJob = null; + try { + taxJob = em.getReference(TaxonomyJob.class, id); + + } finally { + em.close(); + } + if(taxJob!=null) + logger.trace("getItemByKey return row: "+taxJob.getId()); + else + logger.trace("getItemByKey return null"); + + //FOR DEBUG +// System.out.println("getItemByKey return: "+row ); + + return taxJob; + } + + @Override + public List executeCriteriaQuery(CriteriaQuery criteriaQuery) { + EntityManager em = super.createNewManager(); + List listTaxJob = new ArrayList(); + try { + + Query query = em.createQuery(criteriaQuery); + + listTaxJob = query.getResultList(); + } finally { + em.close(); + } + + return listTaxJob; + } + + + @Override + public CriteriaBuilder getCriteriaBuilder() { + return createNewManager().getCriteriaBuilder(); + } + + @Override + public Root rootFrom(CriteriaQuery cq) { + return cq.from(TaxonomyJob.class); + } + + @Override + public List getList(int startIndex, int offset) throws Exception { + EntityManager em = super.createNewManager(); + List listTaxJob = new ArrayList(); + try { + Query query = em.createQuery("select t from TaxonomyJob t"); + query.setFirstResult(startIndex); + query.setMaxResults(offset); + listTaxJob = query.getResultList(); + + } finally { + em.close(); + } + return listTaxJob; + } + + @Override + public List getList(Map filterMap, int startIndex, int offset) { + + EntityManager em = super.createNewManager(); + List listTaxJob = new ArrayList(); + try { + String queryString = "select t from TaxonomyJob t"; + + if(filterMap!=null && filterMap.size()>0){ + queryString+=" where "; + for (String param : filterMap.keySet()) { + String value = filterMap.get(param); + queryString+=" t."+param+"="+value; + queryString+=AND; + } + + queryString = queryString.substring(0, queryString.lastIndexOf(AND)); + } + Query query = em.createQuery(queryString); + + if(startIndex>-1) + query.setFirstResult(startIndex); + if(offset>-1) + query.setMaxResults(offset); + + listTaxJob = query.getResultList(); + } finally { + em.close(); + } + return listTaxJob; + } + + @Override + public List executeTypedQuery(CriteriaQuery cq, int startIndex, int offset) { + + EntityManager em = super.createNewManager(); + List listOJ = new ArrayList(); + try { + + TypedQuery typedQuery = em.createQuery(cq); + + if(startIndex>-1) + typedQuery.setFirstResult(startIndex); + if(offset>-1) + typedQuery.setMaxResults(offset); + + listOJ = typedQuery.getResultList(); + + } finally { + em.close(); + } + + return listOJ; + + } + + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/dao/TaxonomyRowPersistence.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/dao/TaxonomyRowPersistence.java new file mode 100644 index 0000000..422a344 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/persistence/dao/TaxonomyRowPersistence.java @@ -0,0 +1,210 @@ +package org.gcube.portlets.user.speciesdiscovery.server.persistence.dao; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Query; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; + +import org.gcube.portlets.user.speciesdiscovery.shared.TaxonomyRow; + +public class TaxonomyRowPersistence extends AbstractPersistence{ + + public TaxonomyRowPersistence(EntityManagerFactory factory) { + super(factory); + } + + @Override + public int removeAll() { + EntityManager em = super.createNewManager(); + int removed = 0; + try { + + em.getTransaction().begin(); + removed = em.createQuery("DELETE FROM TaxonomyRow").executeUpdate(); + em.getTransaction().commit(); + logger.trace("DELETE FROM TaxonomyRow " + removed +" items"); + + } catch (Exception e) { + logger.error("Error in removeAll: " + e.getMessage(), e); + + } finally { + em.close(); + } + + return removed; + } + + @Override + public List getList() { + EntityManager em = super.createNewManager(); + List listTaxonomy = new ArrayList(); + try { + Query query = em.createQuery("select t from TaxonomyRow t"); + + listTaxonomy = query.getResultList(); + + } finally { + em.close(); + } + return listTaxonomy; + } + + @Override + public int countItems() { + Map filterAndMap = new HashMap(); + filterAndMap.put(TaxonomyRow.IS_PARENT, "false"); + return getList(filterAndMap,-1,-1).size(); + } + + @Override + public TaxonomyRow getItemByKey(Integer id) { + logger.trace("getItemByKey id: "+id); + EntityManager em = super.createNewManager(); + TaxonomyRow row = null; + try { + row = em.getReference(TaxonomyRow.class, id); + + } finally { + em.close(); + } + if(row!=null) + logger.trace("getItemByKey return row: "+row.getId() + ", service id: " + row.getServiceId()); + else + logger.trace("getItemByKey return null"); + + //FOR DEBUG +// System.out.println("getItemByKey return: "+row ); + + return row; + } + + @Override + public List executeCriteriaQuery(CriteriaQuery criteriaQuery) { + EntityManager em = super.createNewManager(); + List listTaxonomyRow = new ArrayList(); + try { + + Query query = em.createQuery(criteriaQuery); + + listTaxonomyRow = query.getResultList(); + } finally { + em.close(); + } + + return listTaxonomyRow; + } + + + @Override + public CriteriaBuilder getCriteriaBuilder() { + return createNewManager().getCriteriaBuilder(); + } + + @Override + public Root rootFrom(CriteriaQuery cq) { + return cq.from(TaxonomyRow.class); + } + + @Override + public List getList(int startIndex, int offset) throws Exception { + EntityManager em = super.createNewManager(); + List listTaxonomyRow = new ArrayList(); + try { + Query query = em.createQuery("select t from TaxonomyRow t"); + query.setFirstResult(startIndex); + query.setMaxResults(offset); + listTaxonomyRow = query.getResultList(); + + } finally { + em.close(); + } + return listTaxonomyRow; + } + + @Override + public List getList(Map filterMap, int startIndex, int offset) { + + EntityManager em = super.createNewManager(); + List listTaxonomyRow = new ArrayList(); + try { + String queryString = "select t from TaxonomyRow t"; + + if(filterMap!=null && filterMap.size()>0){ + queryString+=" where "; + for (String param : filterMap.keySet()) { + String value = filterMap.get(param); + queryString+=" t."+param+"="+value; + queryString+=AND; + } + + queryString = queryString.substring(0, queryString.lastIndexOf(AND)); + } + Query query = em.createQuery(queryString); + + if(startIndex>-1) + query.setFirstResult(startIndex); + if(offset>-1) + query.setMaxResults(offset); + + listTaxonomyRow = query.getResultList(); + } finally { + em.close(); + } + return listTaxonomyRow; + } + + @Override + public List executeTypedQuery(CriteriaQuery cq, int startIndex, int offset) { + + EntityManager em = super.createNewManager(); + List listOJ = new ArrayList(); + try { + + TypedQuery typedQuery = em.createQuery(cq); + + if(startIndex>-1) + typedQuery.setFirstResult(startIndex); + if(offset>-1) + typedQuery.setMaxResults(offset); + + listOJ = typedQuery.getResultList(); + + } finally { + em.close(); + } + + return listOJ; + + } + + @Override + public int deleteItemByIdField(String idField) { + EntityManager em = super.createNewManager(); + int removed = 0; + + try { + em.getTransaction().begin(); + removed = em.createQuery("DELETE FROM TaxonomyRow t WHERE t."+TaxonomyRow.ID_FIELD+"='"+idField+"'").executeUpdate(); + em.getTransaction().commit(); + logger.trace("Item "+ idField + " was deleted from TaxonomyRow"); + + } catch (Exception e) { + logger.error("Error in TaxonomyRow deleteJobById: " + e.getMessage(), e); + + } finally { + em.close(); + } + + return removed; + } + + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/IteratorChainBuilder.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/IteratorChainBuilder.java new file mode 100644 index 0000000..c1e7f2b --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/IteratorChainBuilder.java @@ -0,0 +1,77 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.service; + +import org.gcube.application.framework.core.session.ASLSession; +import org.gcube.data.spd.model.OccurrencePoint; +import org.gcube.data.spd.model.ResultElement; +import org.gcube.data.spd.model.ResultItem; +import org.gcube.data.spd.model.TaxonomyItem; +import org.gcube.portlets.user.speciesdiscovery.server.stream.CastConverter; +import org.gcube.portlets.user.speciesdiscovery.server.stream.CloseableIterator; +import org.gcube.portlets.user.speciesdiscovery.server.stream.ConversionIterator; +import org.gcube.portlets.user.speciesdiscovery.shared.FetchingElement; +import org.gcube.portlets.user.speciesdiscovery.shared.Occurrence; +import org.gcube.portlets.user.speciesdiscovery.shared.ResultRow; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchResultType; +import org.gcube.portlets.user.speciesdiscovery.shared.TaxonomyRow; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class IteratorChainBuilder { + + @SuppressWarnings("unchecked") + public static CloseableIterator buildChain(CloseableIterator input, SearchResultType type, ASLSession session) + { + switch (type) { + case SPECIES_PRODUCT: return (CloseableIterator) buildSpecieProductChain(input, session); + case TAXONOMY_ITEM: return (CloseableIterator) buildTaxonomyItemChain(input, session); + default: + break; + } + + return null; + } + + protected static CloseableIterator buildSpecieProductChain(CloseableIterator input, ASLSession session) + { + //from ResultElement to ResultItem + ConversionIterator caster = buildCaster(input); + + //from ResultItem to ResultRow + ResultItemConverter converter = new ResultItemConverter(session); + ConversionIterator inputConverter = new ConversionIterator(caster, converter); + + return inputConverter; + } + + protected static CloseableIterator buildTaxonomyItemChain(CloseableIterator input, ASLSession session) + { + //from ResultElement to TaxonomyItem + ConversionIterator caster = buildCaster(input); + + //from TaxonomyItem to TaxonomyRow + TaxonomyItemConverter converter = new TaxonomyItemConverter(session); + ConversionIterator inputConverter = new ConversionIterator(caster, converter); + + return inputConverter; + } + + protected static ConversionIterator buildCaster(CloseableIterator input) + { + CastConverter elementConverter = new CastConverter(); + ConversionIterator caster = new ConversionIterator(input, elementConverter); + return caster; + } + + public static CloseableIterator buildOccurrenceConverter(CloseableIterator input) + { + OccurrenceConverter occurrenceConverter = new OccurrenceConverter(); + ConversionIterator converter = new ConversionIterator(input, occurrenceConverter); + return converter; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/OccurrenceConverter.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/OccurrenceConverter.java new file mode 100644 index 0000000..2a642da --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/OccurrenceConverter.java @@ -0,0 +1,132 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.service; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.lang.StringEscapeUtils; +import org.gcube.data.spd.model.BasisOfRecord; +import org.gcube.data.spd.model.OccurrencePoint; +import org.gcube.data.spd.model.util.ElementProperty; +import org.gcube.portlets.user.speciesdiscovery.client.ConstantsSpeciesDiscovery; +import org.gcube.portlets.user.speciesdiscovery.server.stream.Converter; +import org.gcube.portlets.user.speciesdiscovery.server.util.XStreamUtil; +import org.gcube.portlets.user.speciesdiscovery.server.util.XStreamUtil.AliasItem; +import org.gcube.portlets.user.speciesdiscovery.shared.ItemParameter; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class OccurrenceConverter implements Converter { + +// protected static final SimpleDateFormat FORMAT = new SimpleDateFormat(); + protected static final SimpleDateFormat FORMAT = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); //Added for Gianpaolo Ticket #824 + protected int id = 0; + private XStreamUtil xstreamUtil; + + public OccurrenceConverter() { + xstreamUtil = new XStreamUtil(AliasItem.OCCURRECENCE, ItemParameter.class); + } + + + @Override + public org.gcube.portlets.user.speciesdiscovery.shared.Occurrence convert(OccurrencePoint input) throws Exception { + + org.gcube.portlets.user.speciesdiscovery.shared.Occurrence occurrence = new org.gcube.portlets.user.speciesdiscovery.shared.Occurrence(); + + occurrence.setId(id++); + + occurrence.setServiceId(input.getId()); + + //Retrieve Properties + List listProperties = input.getProperties(); + + //Fill properties + if(listProperties!=null){ + for (ElementProperty elementProperty : listProperties) + occurrence.getProperties().add(new ItemParameter(elementProperty.getName(), elementProperty.getValue())); + + occurrence.setExistsProperties(true); + } + + + + //set author + if(input.getAuthor()!=null && !input.getAuthor().isEmpty()){ + occurrence.setAuthor(StringEscapeUtils.escapeSql(input.getAuthor())); + } + else + occurrence.setAuthor(ConstantsSpeciesDiscovery.NOT_FOUND); + + //set credits + if(input.getCredits()!=null && !input.getCredits().isEmpty()){ + occurrence.setCredits(StringEscapeUtils.escapeSql(input.getCredits())); + } + else + occurrence.setCredits(ConstantsSpeciesDiscovery.NOT_FOUND); + + + + if(input.getDataSet()!=null){ + occurrence.setDataSet(cleanValueEscapeSql(input.getDataSet().getName())); + + if(input.getDataSet().getDataProvider()!=null){ + occurrence.setDataProvider(cleanValueEscapeSql(input.getDataSet().getDataProvider().getName())); + } + else + occurrence.setDataProvider(ConstantsSpeciesDiscovery.NOT_FOUND); + } + else{ + occurrence.setDataSet(ConstantsSpeciesDiscovery.NOT_FOUND); + occurrence.setDataProvider(ConstantsSpeciesDiscovery.NOT_FOUND); + } + + +// occurrence.setDataProvider(input.getDataSet().getDataProvider().getName()); + + occurrence.setDataSource(cleanValueEscapeSql(input.getProvider())); + occurrence.setInstitutionCode(cleanValueEscapeSql(input.getInstitutionCode())); + occurrence.setCollectionCode(cleanValueEscapeSql(input.getCollectionCode())); + occurrence.setCatalogueNumber(cleanValueEscapeSql(input.getCatalogueNumber())); + occurrence.setRecordedBy(cleanValueEscapeSql(input.getRecordedBy())); + occurrence.setEventDate(cleanValue(input.getEventDate())); + occurrence.setModified(cleanValue(input.getModified())); + occurrence.setScientificName(cleanValueEscapeSql(input.getScientificName())); + occurrence.setKingdom(cleanValueEscapeSql(input.getKingdom())); + occurrence.setFamily(cleanValueEscapeSql(input.getFamily())); + occurrence.setLocality(cleanValueEscapeSql(input.getLocality())); + occurrence.setCountry(cleanValueEscapeSql(input.getCountry())); + occurrence.setCitation(cleanValueEscapeSql(input.getCitation())); + occurrence.setDecimalLatitude(String.valueOf(input.getDecimalLatitude())); + occurrence.setDecimalLongitude(String.valueOf(input.getDecimalLongitude())); + occurrence.setCoordinateUncertaintyInMeters(cleanValueEscapeSql(input.getCoordinateUncertaintyInMeters())); + occurrence.setMaxDepth(String.valueOf(input.getMaxDepth())); + occurrence.setMinDepth(String.valueOf(input.getMinDepth())); + occurrence.setBasisOfRecord(cleanValue(input.getBasisOfRecord())); + + return occurrence; + } + + protected static String cleanValue(BasisOfRecord basisOfRecord) + { + if (basisOfRecord==null) return ""; + return basisOfRecord.toString(); + } + + protected static String cleanValue(Calendar value) + { + if (value==null) return ""; + return FORMAT.format(value.getTime()); + } + + protected static String cleanValueEscapeSql(String value) + { + if (value==null || value.isEmpty()) return ConstantsSpeciesDiscovery.NOT_FOUND; + return StringEscapeUtils.escapeSql(value); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/QueryBuilder.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/QueryBuilder.java new file mode 100644 index 0000000..da3313a --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/QueryBuilder.java @@ -0,0 +1,131 @@ +package org.gcube.portlets.user.speciesdiscovery.server.service; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Iterator; +import java.util.List; + +import org.gcube.data.spd.model.Properties; +import org.gcube.data.spd.model.Property; +import org.gcube.portlets.user.speciesdiscovery.shared.Coordinate; +import org.gcube.portlets.user.speciesdiscovery.shared.DataSourceModel; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchFilters; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchType; + +public class QueryBuilder { + + + public static String buildQuery(String searchTerm, SearchType searchType, SearchFilters searchFilters){ + StringBuilder query = new StringBuilder(); + + //ADD search term; + query.append('\''); + query.append(searchTerm); + query.append('\''); + + //ADD search type; + switch (searchType) { + case BY_SCIENTIFIC_NAME: query.append(" as ScientificName "); break; + case BY_COMMON_NAME: query.append(" as CommonName "); break; + } + + + //ADD data sources; + if (searchFilters.getListDataSources()!=null && searchFilters.getListDataSources().size()>0) { + query.append(" in "); + + Iterator dsIterator = searchFilters.getListDataSources().iterator(); + while(dsIterator.hasNext()) { + DataSourceModel ds = dsIterator.next(); + query.append(" "); + query.append(ds.getId()); + if (dsIterator.hasNext()) query.append(", "); + else query.append(" "); + } + } + + + List properties = createFilterProperties(searchFilters); + + //ADD filters + if(properties.size()>0){ + query.append(" where "); + + Iterator pIterator = properties.iterator(); + while (pIterator.hasNext()) { + Property property = pIterator.next(); + String statement = getQueryStatementFromProperty(property); + query.append(statement); + + if (pIterator.hasNext()) query.append(" AND "); + else query.append(" "); + + } + } + + //ADD return type + + query.append(" return "); + if (searchFilters.getResultType()!=null) { + switch (searchFilters.getResultType()) { +// case RESULTITEM: query.append("*"); break; //Modify by Francesco + case RESULTITEM: query.append("* having Occurrence"); break; + case TAXONOMYITEM: query.append("Taxon"); break; + } + } else { +// query.append("*"); Modify by Francesco + query.append("* having Occurrence"); + } + + return query.toString(); + + } + + protected static String getQueryStatementFromProperty(Property property){ + + String statement = null; + Properties prop = property.getProp(); + + if(prop.equals(Properties.CoordinateTo)){ + statement= Properties.CoordinateTo.name() + " IS " + property.getValue(); + + }else if(prop.equals(Properties.CoordinateFrom)){ + statement= Properties.CoordinateFrom.name() + " IS " + property.getValue(); + + }else if(prop.equals(Properties.DateFrom)){ + statement= Properties.DateFrom.name() + " IS " + property.getValue(); + + }else if(prop.equals(Properties.DateTo)){ + statement= Properties.DateTo.name() + " IS " + property.getValue(); + + } + + return statement; + + } + + protected static List createFilterProperties(SearchFilters searchFilters) + { + List properties = new ArrayList(); + if (searchFilters.getUpperBound()!=null) properties.add(new Property(Properties.CoordinateTo, convert(searchFilters.getUpperBound()))); + if (searchFilters.getLowerBound()!=null) properties.add(new Property(Properties.CoordinateFrom, convert(searchFilters.getLowerBound()))); + + if (searchFilters.getFromDate()!=null) { + Calendar fromDate = Calendar.getInstance(); + fromDate.setTime(searchFilters.getFromDate()); + properties.add(new Property(Properties.DateFrom, fromDate)); + } + if (searchFilters.getToDate()!=null) { + Calendar toDate = Calendar.getInstance(); + toDate.setTime(searchFilters.getToDate()); + properties.add(new Property(Properties.DateTo, toDate)); + } + + return properties; + } + + protected static org.gcube.data.spd.model.Coordinate convert(Coordinate coordinate) + { + return new org.gcube.data.spd.model.Coordinate(coordinate.getLatitude(), coordinate.getLongitude()); + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/ResultItemConverter.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/ResultItemConverter.java new file mode 100644 index 0000000..d7d568e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/ResultItemConverter.java @@ -0,0 +1,191 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.service; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.application.framework.core.session.ASLSession; +import org.gcube.common.core.utils.logging.GCUBEClientLog; +import org.gcube.data.spd.model.DataProvider; +import org.gcube.data.spd.model.DataSet; +import org.gcube.data.spd.model.Product; +import org.gcube.data.spd.model.ResultItem; +import org.gcube.data.spd.model.util.ElementProperty; +import org.gcube.portlets.user.speciesdiscovery.client.ConstantsSpeciesDiscovery; +import org.gcube.portlets.user.speciesdiscovery.server.TaxonomySearchServiceImpl; +import org.gcube.portlets.user.speciesdiscovery.server.stream.Converter; +import org.gcube.portlets.user.speciesdiscovery.shared.CommonName; +import org.gcube.portlets.user.speciesdiscovery.shared.ItemParameter; +import org.gcube.portlets.user.speciesdiscovery.shared.ResultRow; +import org.gcube.portlets.user.speciesdiscovery.shared.Taxon; +import org.gcube.portlets.user.speciesdiscovery.shared.util.NormalizeString; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class ResultItemConverter implements Converter { + + protected GCUBEClientLog logger = new GCUBEClientLog(ResultItemConverter.class); + protected int id = 0; + protected ASLSession session; + + public ResultItemConverter(ASLSession session) { + this.session = session; + } + + @Override + public ResultRow convert(ResultItem input) throws Exception { + + ResultRow row = new ResultRow(id++); + + row.setServiceId(input.getId()); + + //Retrieve Properties + List listProperties = input.getProperties(); + + //Fill properties + if(listProperties!=null){ + for (ElementProperty elementProperty : listProperties) +// row.getProperties().add(new ItemParameter(StringEscapeUtils.escapeSql(elementProperty.getName()), StringEscapeUtils.escapeSql(elementProperty.getValue()))); + row.getProperties().add(new ItemParameter(elementProperty.getName(), elementProperty.getValue())); + + row.setExistsProperties(true); + } + + //set author + if(input.getAuthor()!=null && !input.getAuthor().isEmpty()){ +// row.setAuthor(StringEscapeUtils.escapeSql(input.getAuthor())); + row.setAuthor(input.getAuthor()); + } + else + row.setAuthor(ConstantsSpeciesDiscovery.NOT_FOUND); + + //set credits + if(input.getCredits()!=null && !input.getCredits().isEmpty()){ +// row.setCredits(StringEscapeUtils.escapeSql(input.getCredits())); + row.setCredits(input.getCredits()); + } + else + row.setCredits(ConstantsSpeciesDiscovery.NOT_FOUND); + + //set lsid + if(input.getLsid()!=null && !input.getLsid().isEmpty()){ +// row.setLsid(StringEscapeUtils.escapeSql(input.getLsid())); + row.setLsid(input.getLsid()); + } + else + row.setLsid(ConstantsSpeciesDiscovery.NOT_FOUND); + + + if(input.getProvider()!=null && !input.getProvider().isEmpty()){ +// row.setDataSourceId(StringEscapeUtils.escapeSql(input.getProvider())); +// row.setDataSourceName(StringEscapeUtils.escapeSql(input.getProvider())); + row.setDataSourceId(input.getProvider()); + row.setDataSourceName(input.getProvider()); + }else{ + row.setDataSourceId("Provider Id not found"); + row.setDataSourceName("Provider Name not found"); + } + + if (input.getDataSet()!=null) { + DataSet dataSet = input.getDataSet(); + + if(dataSet.getCitation()==null || dataSet.getCitation().isEmpty()) + row.setDataSetCitation("Citation Id not found"); + else +// row.setDataSetCitation(StringEscapeUtils.escapeSql(dataSet.getCitation())); + row.setDataSetCitation(dataSet.getCitation()); + + if(dataSet.getId()==null || dataSet.getId().isEmpty()) + row.setDataSetId("Data Set Id not found"); + else + row.setDataSetId(dataSet.getId()); + + if(dataSet.getName()==null || dataSet.getName().isEmpty()) + row.setDataSetName("Data Set Name not found"); + else +// row.setDataSetName(StringEscapeUtils.escapeSql(dataSet.getName())); + row.setDataSetName(dataSet.getName()); + + + if (input.getDataSet().getDataProvider()!=null) { + DataProvider dataProvider = dataSet.getDataProvider(); + + if(dataProvider.getId() == null || dataProvider.getId().isEmpty()) + row.setDataProviderId("Data Provider Id not found"); + else +// row.setDataProviderId(StringEscapeUtils.escapeSql(dataProvider.getId())); + row.setDataProviderId(dataProvider.getId()); + + if(dataProvider.getName()==null || dataProvider.getName().isEmpty()) + row.setDataProviderName("Data Provider not found"); + else +// row.setDataProviderName(StringEscapeUtils.escapeSql(dataProvider.getName())); + row.setDataProviderName(dataProvider.getName()); + } + } + + if(input.getCommonNames()!=null){ + for (org.gcube.data.spd.model.CommonName commonName : input.getCommonNames()){ + + CommonName com = new CommonName(commonName.getName(), commonName.getLanguage(), row.getId()); +// DaoSession.createOrUpdateCommonName(com, session); + row.getCommonNames().add(com); + row.setExistsCommonName(true); + } + } + + + if (input.getProducts()!=null) { + for (Product product:input.getProducts()) { + switch (product.getType()) { + case Occurences: { + row.setOccurencesCount(product.getCount()); + row.setOccurencesKey(product.getKey()); + } break; + } + } + } + + row.setMatchingTaxon(convertTaxon(input)); + + row.setBaseTaxonValue(NormalizeString.lowerCaseUpFirstChar(getBaseTaxonValue(TaxonomySearchServiceImpl.BASETAXONOMY,input))); +// row.setMatchingCredits(StringEscapeUtils.escapeSql(input.getCredits())); + row.setMatchingCredits(input.getCredits()); + +// logger.trace("convert completed: " +row); + + return row; + } + + private String getBaseTaxonValue(String rank, org.gcube.data.spd.model.TaxonomyInterface taxon){ + + while(taxon!=null){ + + if(taxon.getRank()!=null && taxon.getRank().equalsIgnoreCase(rank)) + return taxon.getRank(); + + taxon = taxon.getParent(); + } + + return TaxonomySearchServiceImpl.TAXONOMYUNKNOWN; + } + + + protected List convertTaxon(org.gcube.data.spd.model.TaxonomyInterface taxon) + { + List listTaxon = new ArrayList(); + int count=0; + while(taxon != null){ +// Taxon tax = new Taxon(count++, StringEscapeUtils.escapeSql(taxon.getScientificName()), StringEscapeUtils.escapeSql(taxon.getCitation()), taxon.getRank()); + Taxon tax = new Taxon(count++, taxon.getScientificName(), taxon.getCitation(), NormalizeString.lowerCaseUpFirstChar(taxon.getRank())); + listTaxon.add(tax); + taxon = taxon.getParent(); + } + return listTaxon; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/SpeciesService.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/SpeciesService.java new file mode 100644 index 0000000..fe58fea --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/SpeciesService.java @@ -0,0 +1,566 @@ +package org.gcube.portlets.user.speciesdiscovery.server.service; + +import static org.gcube.data.spd.client.plugins.AbstractPlugin.classification; +import static org.gcube.data.spd.client.plugins.AbstractPlugin.executor; +import static org.gcube.data.spd.client.plugins.AbstractPlugin.manager; +import static org.gcube.data.spd.client.plugins.AbstractPlugin.occurrence; +import static org.gcube.data.streams.dsl.Streams.convert; + +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import org.apache.log4j.Logger; +import org.gcube.application.framework.core.session.ASLSession; +import org.gcube.common.core.scope.GCUBEScope; +import org.gcube.common.scope.api.ScopeProvider; +import org.gcube.data.spd.client.proxies.Classification; +import org.gcube.data.spd.client.proxies.Executor; +import org.gcube.data.spd.client.proxies.Manager; +import org.gcube.data.spd.client.proxies.Occurrence; +import org.gcube.data.spd.model.OccurrencePoint; +import org.gcube.data.spd.model.Properties; +import org.gcube.data.spd.model.Property; +import org.gcube.data.spd.model.ResultElement; +import org.gcube.data.spd.model.TaxonomyItem; +import org.gcube.data.spd.model.util.Capabilities; +import org.gcube.data.spd.stubs.exceptions.InvalidIdentifierException; +import org.gcube.data.spd.stubs.types.CapabilityDescription; +import org.gcube.data.spd.stubs.types.PluginDescription; +import org.gcube.data.spd.stubs.types.PluginProperty; +import org.gcube.data.spd.stubs.types.RepositoryInfo; +import org.gcube.data.spd.stubs.types.Status; +import org.gcube.data.streams.Stream; +import org.gcube.portlets.user.speciesdiscovery.server.stream.CloseableIterator; +import org.gcube.portlets.user.speciesdiscovery.server.stream.IteratorPointInfo; +import org.gcube.portlets.user.speciesdiscovery.server.util.StorageUtil; +import org.gcube.portlets.user.speciesdiscovery.shared.Coordinate; +import org.gcube.portlets.user.speciesdiscovery.shared.DataSourceCapability; +import org.gcube.portlets.user.speciesdiscovery.shared.DataSourceModel; +import org.gcube.portlets.user.speciesdiscovery.shared.DataSourceRepositoryInfo; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchFilters; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchServiceException; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchType; +import org.gcube.portlets.user.speciesdiscovery.shared.SpeciesCapability; + +//import org.gcube.contentmanager.storageclient.model.protocol.smp.Handler; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class SpeciesService { + + protected Logger logger = Logger.getLogger(SpeciesService.class); + + protected GCUBEScope scope; + protected ASLSession session; + + protected Manager call; + protected Occurrence occurrencesCall; + protected Classification classificationCall; + protected Executor executorCall; + + + public SpeciesService(GCUBEScope scope, ASLSession session) throws Exception + { + this(scope); + this.session = session; + } + + + public SpeciesService(GCUBEScope scope) throws Exception + { + this.scope = scope; + ScopeProvider.instance.set(scope.toString()); +// this.call = manager().at( URI.create("http://node24.d.d4science.research-infrastructures.eu:9000")).withTimeout(3, TimeUnit.MINUTES).build(); +// this.occurrencesCall = occurrences().at( URI.create("http://node24.d.d4science.research-infrastructures.eu:9000")).withTimeout(3, TimeUnit.MINUTES).build(); +// this.classificationCall = classification().at( URI.create("http://node24.d.d4science.research-infrastructures.eu:9000")).withTimeout(3, TimeUnit.MINUTES).build(); + System.out.println("CALLING MANAGER "); + this.call = manager().withTimeout(3, TimeUnit.MINUTES).build(); + this.executorCall = executor().withTimeout(3, TimeUnit.MINUTES).build(); + this.occurrencesCall = occurrence().withTimeout(3, TimeUnit.MINUTES).build(); + this.classificationCall = classification().withTimeout(3, TimeUnit.MINUTES).build(); + } + + + public SpeciesService(GCUBEScope scope, boolean instanceOnlyOccurrence) throws Exception + { + this.scope = scope; + + if(instanceOnlyOccurrence){ + ScopeProvider.instance.set(scope.toString()); + System.out.println("CALLING OCCURRENCE MANAGER "); + this.occurrencesCall = occurrence().withTimeout(3, TimeUnit.MINUTES).build(); + } + } + + + public CloseableIterator searchByFilters(String searchTerm, SearchType searchType, SearchFilters searchFilters) throws SearchServiceException { + logger.trace("searchByFilters searchTerm: "+searchTerm+ " usearchFilters: "+searchFilters); + + try { + System.out.println("query building..."); + String query = QueryBuilder.buildQuery(searchTerm, searchType, searchFilters); +// System.out.println("query build - OK " + query); + logger.trace("query build - OK " + query); +// System.out.println("query: "+query); + return searchByQuery(query); + } catch (Exception e) { + logger.error("Error calling the Species Service: " + e.getMessage(), e); + throw new SearchServiceException("Error calling the Species Service: "+e.getMessage()); + } + } + + + public CloseableIterator retrieveTaxonomyById(Stream streamIds) throws SearchServiceException { + logger.trace("retrieveTaxonomyById..."); + + try { + ScopeProvider.instance.set(scope.toString()); + Stream stream = classificationCall.getTaxaByIds(streamIds); + return new StreamIterator(stream); + } catch (Exception e) { + logger.error("Error calling the Species Service: " + e.getMessage(), e); + throw new SearchServiceException("Error calling the Species Service: "+e.getMessage()); + } + } + + + public CloseableIterator retrieveSynonymsById(String id) throws SearchServiceException { + logger.trace("retrieveSynonymsById..."); + + try { + ScopeProvider.instance.set(scope.toString()); + Stream stream = classificationCall.getSynonymsById(id); + return new StreamIterator(stream); + } catch (Exception e) { + logger.error("Error calling the Species Service: " + e.getMessage(), e); + throw new SearchServiceException("Error calling the Species Service: "+e.getMessage()); + } + } + + + public CloseableIterator searchByQuery(String query) throws SearchServiceException { + logger.trace("searchByQuery query: "+query); +// System.out.println("searchByQuery query: "+query); + + try { + ScopeProvider.instance.set(scope.toString()); +// System.err.println("ScopeProvider SCOPE "+ScopeProvider.instance.get()); + logger.trace("call species service search..."); +// System.out.println("call species service search..."); + Stream stream = call.search(query); + return new StreamIterator(stream); + } catch (Exception e) { + logger.error("Error calling the Species Service: " + e.getMessage(), e); + throw new SearchServiceException("Error calling the Species Service: "+e.getMessage()); + } + } + + + public Stream searchByQuery2(String query) throws SearchServiceException { + logger.trace("searchByQuery query: "+query); +// System.out.println("searchByQuery query: "+query); + + try { + ScopeProvider.instance.set(scope.toString()); +// System.err.println("ScopeProvider SCOPE "+ScopeProvider.instance.get()); + logger.trace("call species service search..."); + System.out.println("call species service search..."); + return call.search(query); + } catch (Exception e) { + logger.error("Error calling the Species Service: " + e.getMessage(), e); + throw new SearchServiceException("Error calling the Species Service: "+e.getMessage()); + } + } + + + public List getPlugins() throws SearchServiceException { + logger.trace("getPlugins..."); + try { + + List listDsModel = new ArrayList(); + + ScopeProvider.instance.set(scope.toString()); + List plugin = call.getPluginsDescription(); + + if(plugin!=null){ + + logger.trace("*****PluginDescription is NOT null - length: " + plugin.size()); + + for (int i = 0; i < plugin.size(); i++) { + + PluginDescription pluginDescription = plugin.get(i); + List listCapabilityDescription = pluginDescription.getCapabilities(); + + ArrayList listCapabilities = new ArrayList(); //new Array List DataSourceCapability + logger.trace("getCapabilities for..." + pluginDescription.getName()); + for (CapabilityDescription capabilityDescription : listCapabilityDescription){ + List properties = capabilityDescription.getProperties(); + ArrayList listProperties = properties!=null?new ArrayList(properties):new ArrayList(); + ArrayList listPropertiesEnum = new ArrayList(); + + for (String property : listProperties) + listPropertiesEnum.add(getFilterCapabilityFromProperties(property)); + + listCapabilities.add(new DataSourceCapability(getGxtCapabilityValueFromCapability(capabilityDescription.getName()), listPropertiesEnum)); + } + + RepositoryInfo rep = pluginDescription.getRepositoryInfo(); + + //CREATE DataSourceRepositoryInfo + DataSourceRepositoryInfo dsInfo = new DataSourceRepositoryInfo(); + + if(rep!=null){ +// System.out.println("DESCRIPTION REPOSITORY: " + rep.getDescription()); + dsInfo.setLogoUrl(rep.getLogoUrl()); + dsInfo.setPageUrl(rep.getReferencePageUrl()); + dsInfo.setProperties(getPropertiesFromRepositoryInfoType(rep)); + dsInfo.setDescription(rep.getDescription()); +// dsInfo = new DataSourceRepositoryInfo(rep.getLogoUrl(), rep.getReferencePageUrl(),getPropertiesFromRepositoryInfoType(rep), rep.getDescription()); + logger.trace("DataSourceRepositoryInfo :"+dsInfo); +// logger.trace("Repository description size: " + rep.getDescription().length()); + } + + listDsModel.add(new DataSourceModel(pluginDescription.getName(), pluginDescription.getName(), pluginDescription.getDescription(), listCapabilities, dsInfo)); + + } + } + else + logger.trace("*****PluginDescription is null"); + + return listDsModel; + + } catch (Exception e) { + logger.error("Error calling the Species Service: " + e.getMessage(), e); +// System.out.println("Error calling the Species Service: " + e); + e.printStackTrace(); + throw new SearchServiceException("Error calling the Species Service: "+e.getMessage()); + } + } + + private Map getPropertiesFromRepositoryInfoType(RepositoryInfo rep){ + + Map mapProperties = new HashMap(); + + if(rep.getProperties()==null){ + logger.trace("*****Properties From RepositoryInfoType is null"); + return mapProperties; + } + + for (PluginProperty prop : rep.getProperties()) + + mapProperties.put(prop.getKey(), prop.getValue()); + + return mapProperties; + } + + private SpeciesCapability getFilterCapabilityFromProperties(String property){ + + if(property.compareTo(Properties.DateFrom.name())==0) + return SpeciesCapability.FROMDATE; + else if(property.compareTo(Properties.DateTo.name())==0) + return SpeciesCapability.TODATE; + else if(property.compareTo(Properties.CoordinateTo.name())==0) + return SpeciesCapability.UPPERBOUND; + else if(property.compareTo(Properties.CoordinateFrom.name())==0) + return SpeciesCapability.LOWERBOUND; + + return SpeciesCapability.UNKNOWN; + } + + private SpeciesCapability getGxtCapabilityValueFromCapability(String capability){ + + if(capability.compareTo(Capabilities.Classification.name())==0) + return SpeciesCapability.TAXONOMYITEM; + else if(capability.compareTo(Capabilities.Occurences.name())==0) + return SpeciesCapability.RESULTITEM; + else if(capability.compareTo(Capabilities.NamesMapping.name())==0) + return SpeciesCapability.NAMESMAPPING; + else if(capability.compareTo(Capabilities.Synonims.name())==0) + return SpeciesCapability.SYNONYMS; + + return SpeciesCapability.UNKNOWN; + } + + protected List createFilterProperties(SearchFilters searchFilters) + { + List properties = new ArrayList(); + if (searchFilters.getUpperBound()!=null) properties.add(new Property(Properties.CoordinateTo, convertCoordinate(searchFilters.getUpperBound()))); + if (searchFilters.getLowerBound()!=null) properties.add(new Property(Properties.CoordinateFrom, convertCoordinate(searchFilters.getLowerBound()))); + + if (searchFilters.getFromDate()!=null) { + Calendar fromDate = Calendar.getInstance(); + fromDate.setTime(searchFilters.getFromDate()); + properties.add(new Property(Properties.DateFrom, fromDate)); + } + if (searchFilters.getToDate()!=null) { + Calendar toDate = Calendar.getInstance(); + toDate.setTime(searchFilters.getToDate()); + properties.add(new Property(Properties.DateTo, toDate)); + } + + return properties; + } + + protected org.gcube.data.spd.model.Coordinate convertCoordinate(Coordinate coordinate) + { + return new org.gcube.data.spd.model.Coordinate(coordinate.getLatitude(), coordinate.getLongitude()); + } + + public CloseableIterator getOccurrencesByKeys(List keys) throws SearchServiceException { + try { + Stream keysStream = convert(keys); + ScopeProvider.instance.set(scope.toString()); + Stream stream = occurrencesCall.getByKeys(keysStream); + return new StreamIterator(stream); + } catch (Exception e) { + logger.error("Error calling the Species Service: " + e.getMessage(), e); + throw new SearchServiceException("Error calling the Species Service: "+e.getMessage()); + } + } + + public CloseableIterator getOccurrencesByIds(List ids) throws SearchServiceException { + try { + Stream idsStream = convert(ids); + ScopeProvider.instance.set(scope.toString()); + Stream stream = occurrencesCall.getByIds(idsStream); + return new StreamIterator(stream); + } catch (Exception e) { + logger.error("Error calling the Species Service: " + e.getMessage(), e); + throw new SearchServiceException("Error calling the Species Service: "+e.getMessage()); + } + } + +// public String generateMapFromOccurrencePoints(List keys) throws SearchServiceException { +// try { +// Stream keysStream = convert(keys); +// ScopeProvider.instance.set(scope.toString()); +// return occurrencesCall.getLayerByIds(keysStream); +// } catch (Exception e) { +// logger.error("Error calling the Species Service: " + e.getMessage(), e); +// throw new SearchServiceException("Error calling the Species Service: "+e.getMessage()); +// } +// } + + public String generateMapFromOccurrencePoints(IteratorPointInfo streamKey) throws SearchServiceException { + try { +// Stream keysStream = convert(keys); + ScopeProvider.instance.set(scope.toString()); + + return occurrencesCall.createLayer(streamKey); + } catch (Exception e) { + logger.error("Error calling the Species Service: " + e.getMessage(), e); + throw new SearchServiceException("Error calling the Species Service: "+e.getMessage()); + } + } + + +// public File getOccurrencesAsDarwinCoreByIds(List ids) throws SearchServiceException { +// try { +// Stream keysStream = convert(ids); +// ScopeProvider.instance.set(scope.toString()); +// File occurrenceFile = occurrencesCall.getDarwinCoreByIds(keysStream); +// return occurrenceFile; +// } catch (Exception e) { +// logger.error("Error calling the Species Service: " + e.getMessage(), e); +// throw new SearchServiceException("Error calling the Species Service: "+e.getMessage()); +// } +// } +// +// public File getOccurrencesAsDarwinCoreArchive(List ids) throws SearchServiceException { +// try { +// Stream keysStream = convert(ids); +// ScopeProvider.instance.set(scope.toString()); +// File occurrenceFile = classificationCall.getDarwinCoreArchive(keysStream); +// return occurrenceFile; +// } catch (Exception e) { +// logger.error("Error calling the Species Service: " + e.getMessage(), e); +// throw new SearchServiceException("Error calling the Species Service: "+e.getMessage()); +// } +// } + + public StreamIterator getTaxonChildrenByParentId(String parentId) throws Exception{ + + try { + ScopeProvider.instance.set(scope.toString()); + Stream items = classificationCall.getTaxonChildrenById(parentId); + return new StreamIterator(items); + } catch (Exception e) { +// e.printStackTrace(); + logger.error("Error calling the Species Service: " + e.getMessage(), e); + throw new Exception("Error calling the Species Service: "+e.getMessage()); + } + } + + public Status getTaxonomyJobById(String jobId) { + + ScopeProvider.instance.set(scope.toString()); + Status status = null; + + try{ + + status = this.executorCall.getStatus(jobId); + + }catch (InvalidIdentifierException e) { + logger.error("Error on service for get job by Id - InvalidIdentifierException"); + status = null; + + }catch (Exception e) { + logger.error("Error on service for get job by Id: " + e.getMessage(), e); + status = null; +// return new Status(); + } + + return status; + } + + public InputStream getTaxonomyJobFileById(String jobIdentifier) throws Exception { + + InputStream is = null; + ScopeProvider.instance.set(scope.toString()); + + try { + String url = this.executorCall.getResultLink(jobIdentifier); + logger.trace("URL returned by species service is: "+url); + is = StorageUtil.getInputStreamByStorageClient(url); + + } catch (Exception e) { +// e.printStackTrace(); + logger.error("Error saving file: "+e.getMessage(), e); + throw new Exception("Error saving file: "+e.getMessage()); + } + + return is; + } + + public String createTaxonomyJobForDWCAByChildren(String taxonomyId) throws Exception { + + ScopeProvider.instance.set(scope.toString()); + + try { + return this.executorCall.createDwCAByChildren(taxonomyId); + + } catch (Exception e) { + logger.error("Error in createTaxonomyJob: "+e.getMessage(), e); + throw new Exception("Error in createTaxonomyJob: "+e.getMessage()); + } + } + + public String createTaxonomyJobForDWCAByIds(List ids) throws Exception { + + ScopeProvider.instance.set(scope.toString()); + + try { + Stream keysStream = convert(ids); + return executorCall.createDwCAByIds(keysStream); + } catch (Exception e) { + logger.error("Error in createTaxonomyJobForDWCA: "+e.getMessage(), e); + throw new Exception("Error in createTaxonomyJobForDWCA: "+e.getMessage()); + } + } + + public void cancelTaxonomyJobById(String jobIdentifier){ + + try{ + ScopeProvider.instance.set(scope.toString()); + this.executorCall.removeJob(jobIdentifier); + }catch (Exception e) { + logger.error("Error on service for remove job: " + e.getMessage(), e); + } + } + + + public Status getOccurrenceJobById(String jobId) { + + try{ + ScopeProvider.instance.set(scope.toString()); + return this.executorCall.getStatus(jobId); //CHANGE INTO OCCURRENCE JOB ************************************************************************************** //TODO + + }catch (InvalidIdentifierException e) { + logger.error("Error on service for get job by Id - InvalidIdentifierException"); + return null; + + }catch (Exception e) { + logger.error("Error on service for get job by Id: " + e.getMessage()); + return null; + } + } + + + public String createOccurrenceCSVJob(Stream streamKey) throws Exception{ + + try { + ScopeProvider.instance.set(scope.toString()); + return this.executorCall.createCSV(streamKey); + + } catch (Exception e) { + logger.error("Error in createOccurrenceCSVJob: "+e.getMessage(), e); + throw new Exception("Error in createOccurrenceCSVJob: "+e.getMessage()); + } + } + + + public String createOccurrenceDARWINCOREJob(Stream streamKey) throws Exception{ + + try { + ScopeProvider.instance.set(scope.toString()); + return this.executorCall.createDarwincoreFromOccurrenceKeys(streamKey); + + } catch (Exception e) { + logger.error("Error in createOccurrenceDARWINCOREJob: "+e.getMessage(), e); + throw new Exception("Error in createOccurrenceDARWINCOREJob: "+e.getMessage()); + } + } + + + public String createOccurrenceCSVOpenModellerJob(Stream streamKey) throws Exception{ + + try { + ScopeProvider.instance.set(scope.toString()); + return this.executorCall.createCSVforOM(streamKey); + + } catch (Exception e) { + logger.error("Error in createOccurrenceCSVOpenModellerJob: "+e.getMessage(), e); + throw new Exception("Error in createOccurrenceCSVOpenModellerJob: "+e.getMessage()); + } + } + + + public void cancelOccurrenceJobById(String jobIdentifier){ + + try{ + ScopeProvider.instance.set(scope.toString()); + this.executorCall.removeJob(jobIdentifier); //CHANGE INTO OCCURRENCE JOB ************************************************************************************** ** //TODO + }catch (Exception e) { + logger.error("Error on service for remove job: " + e.getMessage(), e); + } + } + + + public InputStream getOccurrenceJobFileById(String jobIdentifier) throws Exception { + + InputStream is = null; + ScopeProvider.instance.set(scope.toString()); + + try { + String url = this.executorCall.getResultLink(jobIdentifier); //CHANGE INTO OCCURRENCE JOB ************************************************************************************** ** //TODO + logger.trace("URL returned by species service is: "+url); + is = StorageUtil.getInputStreamByStorageClient(url); + + } catch (Exception e) { +// e.printStackTrace(); + logger.error("Error saving file: "+e.getMessage(), e); + throw new Exception("Error saving file: "+e.getMessage()); + } + + return is; + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/StreamIterator.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/StreamIterator.java new file mode 100644 index 0000000..0622c24 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/StreamIterator.java @@ -0,0 +1,56 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.service; + +import org.gcube.data.streams.Stream; +import org.gcube.portlets.user.speciesdiscovery.server.stream.CloseableIterator; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class StreamIterator implements CloseableIterator { + + protected Stream stream; + + /** + * @param stream + */ + public StreamIterator(Stream stream) { + this.stream = stream; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean hasNext() { + return stream.hasNext(); + } + + /** + * {@inheritDoc} + */ + @Override + public T next() { + return stream.next(); + } + + /** + * {@inheritDoc} + */ + @Override + public void remove() { + stream.remove(); + } + + /** + * {@inheritDoc} + */ + @Override + public void close() { + stream.close(); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/TaxonomyItemConverter.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/TaxonomyItemConverter.java new file mode 100644 index 0000000..b3468ca --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/TaxonomyItemConverter.java @@ -0,0 +1,195 @@ +package org.gcube.portlets.user.speciesdiscovery.server.service; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.lang.StringEscapeUtils; +import org.apache.log4j.Logger; +import org.gcube.application.framework.core.session.ASLSession; +import org.gcube.data.spd.model.TaxonomyItem; +import org.gcube.data.spd.model.util.ElementProperty; +import org.gcube.portlets.user.speciesdiscovery.client.ConstantsSpeciesDiscovery; +import org.gcube.portlets.user.speciesdiscovery.server.TaxonomySearchServiceImpl; +import org.gcube.portlets.user.speciesdiscovery.server.stream.Converter; +import org.gcube.portlets.user.speciesdiscovery.shared.CommonName; +import org.gcube.portlets.user.speciesdiscovery.shared.ItemParameter; +import org.gcube.portlets.user.speciesdiscovery.shared.TaxonomyRow; +import org.gcube.portlets.user.speciesdiscovery.shared.util.NormalizeString; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class TaxonomyItemConverter implements Converter { + + protected Logger logger = Logger.getLogger(TaxonomyItemConverter.class); + protected int id = 0; + private ASLSession session; + + /** + * @param dataProviderId + */ + public TaxonomyItemConverter(ASLSession session) { + this.session = session; + } + + @Override + public TaxonomyRow convert(TaxonomyItem input) throws Exception { + + TaxonomyRow taxonomy = createTaxonomyRow(input); + + //SET PARENTS + taxonomy.setParent(convertParentsTaxonomy(input)); + + //SET BASE TAXON + taxonomy.setBaseTaxonValue(NormalizeString.lowerCaseUpFirstChar(getTaxonomyValue(TaxonomySearchServiceImpl.BASETAXONOMY,taxonomy))); +// System.out.println("#############################PARENT ID: " + taxonomy.getParent().getId()); + + if(taxonomy.getParents()!=null && taxonomy.getParents().size()>0) + taxonomy.setParentID(""+taxonomy.getParents().get(0).getId()); + + return taxonomy; + } + + protected TaxonomyRow createTaxonomyRow(TaxonomyItem input) throws Exception{ + + TaxonomyRow tax = new TaxonomyRow(id++); + + //Retrieve Properties + List listProperties = input.getProperties(); + + //Fill properties + if(listProperties!=null){ + for (ElementProperty elementProperty : listProperties) + tax.getProperties().add(new ItemParameter(StringEscapeUtils.escapeSql(elementProperty.getName()), StringEscapeUtils.escapeSql(elementProperty.getValue()))); + + tax.setExistsProperties(true); + } + + if(input.getId()!=null){ + tax.setServiceId(StringEscapeUtils.escapeSql(input.getId())); + } + + if(input.getAuthor()!=null && !input.getAuthor().isEmpty()){ + tax.setAuthor(StringEscapeUtils.escapeSql(input.getAuthor())); + } + else + tax.setAuthor(ConstantsSpeciesDiscovery.NOT_FOUND); + + if(input.getCredits()!=null && !input.getCredits().isEmpty()){ + tax.setCredits(StringEscapeUtils.escapeSql(input.getCredits())); + } + else + tax.setCredits(ConstantsSpeciesDiscovery.NOT_FOUND); + + if(input.getLsid()!=null && !input.getLsid().isEmpty()){ + tax.setLsid(StringEscapeUtils.escapeSql(input.getLsid())); + } + else + tax.setLsid(ConstantsSpeciesDiscovery.NOT_FOUND); + + if(input.getProvider()!=null && !input.getProvider().isEmpty()){ + tax.setDataProviderId(StringEscapeUtils.escapeSql(input.getProvider())); + tax.setDataProviderName(StringEscapeUtils.escapeSql(input.getProvider())); + }else{ + tax.setDataProviderId(ConstantsSpeciesDiscovery.NOT_FOUND); + tax.setDataProviderName(ConstantsSpeciesDiscovery.NOT_FOUND); + } + + if(input.getCitation()!=null && !input.getCitation().isEmpty()){ + tax.setDataSetCitation(StringEscapeUtils.escapeSql(input.getCitation())); + }else{ + tax.setDataSetCitation(ConstantsSpeciesDiscovery.NOT_FOUND); + } + + if(input.getRank()!=null && !input.getRank().isEmpty()){ + tax.setRank(StringEscapeUtils.escapeSql(NormalizeString.lowerCaseUpFirstChar(input.getRank()))); + }else{ + tax.setRank(ConstantsSpeciesDiscovery.NOT_FOUND); + } + + if(input.getScientificName()!=null && !input.getScientificName().isEmpty()){ + tax.setName(StringEscapeUtils.escapeSql(input.getScientificName())); + }else{ + tax.setName(ConstantsSpeciesDiscovery.NOT_FOUND); + } + + if(input.getStatus()!=null){ + + if(input.getStatus().getRefId()!=null && !input.getStatus().getRefId().isEmpty()){ + tax.setStatusRefId(StringEscapeUtils.escapeSql(input.getStatus().getRefId())); + }else{ + tax.setStatusRefId(""); + } + + + if(input.getStatus().getStatusAsString()!=null && !input.getStatus().getStatusAsString().isEmpty()){ + tax.setStatusRemarks(StringEscapeUtils.escapeSql(input.getStatus().getStatusAsString())); + }else{ + tax.setStatusRemarks(ConstantsSpeciesDiscovery.NOT_FOUND); + } + + if(input.getStatus().getStatus()!=null){ + + if(input.getStatus().getStatus().name()!=null && !input.getStatus().getStatus().name().isEmpty()){ + tax.setStatusName(StringEscapeUtils.escapeSql(input.getStatus().getStatus().name())); + }else{ + tax.setStatusName(ConstantsSpeciesDiscovery.NOT_FOUND); + } + + } + + } + + if(input.getModified()!=null){ + tax.setDateModified(input.getModified().getTime().toString()); + } + + if(input.getCommonNames()!=null){ + for (org.gcube.data.spd.model.CommonName commonName : input.getCommonNames()){ + + CommonName com = new CommonName(commonName.getName(), commonName.getLanguage(), tax.getId()); +// DaoSession.createOrUpdateCommonName(com, session); + tax.getCommonNames().add(com); + tax.setExistsCommonName(true); + } + } + +// System.out.println("convert completed: " +tax); + + return tax; + } + + private String getTaxonomyValue(String rank, TaxonomyRow taxon){ + + List listTaxonomy = taxon.getParents(); + + for (TaxonomyRow taxonomyRow : listTaxonomy) { + + if(taxonomyRow.getRank().compareToIgnoreCase(rank)==0) + return taxonomyRow.getName(); + } + + return TaxonomySearchServiceImpl.TAXONOMYUNKNOWN; + } + + + protected List convertParentsTaxonomy(TaxonomyItem taxon) throws Exception + { + if (taxon == null) return null; + List listTaxonomy = new ArrayList(); + TaxonomyItem parent = taxon.getParent(); + + while(parent!=null){ + TaxonomyRow row = createTaxonomyRow(parent); + row.setParent(true); + listTaxonomy.add(row); + parent = parent.getParent(); + } + + return listTaxonomy; + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/session/Fetcher.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/session/Fetcher.java new file mode 100644 index 0000000..fcdd02c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/session/Fetcher.java @@ -0,0 +1,110 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.session; + +import java.io.Closeable; +import java.io.IOException; + +import org.apache.log4j.Logger; +import org.gcube.portlets.user.speciesdiscovery.server.stream.CloseableIterator; +import org.gcube.portlets.user.speciesdiscovery.shared.FetchingElement; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class Fetcher implements Runnable, Closeable { + + protected Logger logger = Logger.getLogger(Fetcher.class); + + protected FetchingBuffer buffer; + protected CloseableIterator source; + protected boolean complete = false; + + public Fetcher(CloseableIterator source, FetchingBuffer buffer) { + this.source = source; + this.complete = false; + this.buffer = buffer; + } + + /** + * @return the source + */ + public CloseableIterator getSource() { + return source; + } + + /** + * @param source the source to set + */ + public void setSource(CloseableIterator source) { + this.source = source; + } + + /** + * {@inheritDoc} + */ + @Override + public void run() { + + T next = null; + int count = 0; + try { + + while(source!=null && source.hasNext() && !complete) { + + try { + next = source.next(); + + if(next!=null){ + logger.trace("item "+count++ +" fetch new row: "+next.getId()); + buffer.add(next); + } + else{ + logger.trace("fetch new row: null"); + } + + } catch (Exception e) { + logger.error("Error in source.next() " + e.getMessage(), e); + } + + + } + + } catch (Exception e) { + logger.error("Error in add row " + e.getMessage()); +// System.out.println("Error in add row " + e.getMessage()); +// e.printStackTrace(); + silentClose(); + } + + if(source==null) + logger.trace("exit because source iterator is null"); + + logger.trace("exit fetch run - complete true"); + complete = true; + +// System.out.println("#################################TOTAL " + count); + } + + protected void silentClose() + { + try { + close(); + } catch (IOException e) { + logger.warn("Error during silent close", e); + } + } + + public void close() throws IOException + { + complete = true; + source.close(); + } + + public boolean isComplete() + { + return complete; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/session/FetchingBuffer.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/session/FetchingBuffer.java new file mode 100644 index 0000000..3254948 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/session/FetchingBuffer.java @@ -0,0 +1,20 @@ +package org.gcube.portlets.user.speciesdiscovery.server.session; + +import java.util.List; +import java.util.Map; + +import org.gcube.portlets.user.speciesdiscovery.shared.FetchingElement; + +public interface FetchingBuffer { + + public abstract void add(T e) throws Exception; + + public abstract List getList() throws Exception; + + public abstract int size() throws Exception; + + public abstract List getList(int startIndex, int offset) throws Exception; + + public abstract List getList(Map filterANDMap, int startIndex, int offset) throws Exception; + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/session/FetchingSession.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/session/FetchingSession.java new file mode 100644 index 0000000..09ca8b6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/session/FetchingSession.java @@ -0,0 +1,88 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.session; + +import java.io.Closeable; +import java.io.IOException; +import java.sql.SQLException; + +import org.apache.log4j.Logger; +import org.gcube.portlets.user.speciesdiscovery.server.stream.Aggregator; +import org.gcube.portlets.user.speciesdiscovery.server.stream.AggregatorIterator; +import org.gcube.portlets.user.speciesdiscovery.server.stream.CloseableIterator; +import org.gcube.portlets.user.speciesdiscovery.shared.FetchingElement; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class FetchingSession implements Closeable { + + protected Logger logger = Logger.getLogger(FetchingSession.class); + + protected FetchingBuffer buffer; + protected Fetcher fetcher; + protected Thread fetcherThread; + protected CloseableIterator source; + protected AggregatorIterator aggregatorIterator; + + public FetchingSession(CloseableIterator source, FetchingBuffer buffer) { + this.source = source; + this.buffer = buffer; + this.fetcher = new Fetcher(source,buffer); + } + + public void addAggregator(Aggregator aggregator) + { + if (aggregatorIterator == null) setupAggregatorIterator(); + aggregatorIterator.addAggregator(aggregator); + } + + protected void setupAggregatorIterator() + { + aggregatorIterator = new AggregatorIterator(source); + fetcher.setSource(aggregatorIterator); + } + + public Aggregator getAggregator(String name) + { + if (aggregatorIterator!=null) return aggregatorIterator.getAggregator(name); + return null; + } + + public void startFetching() + { + fetcherThread = new Thread(fetcher); + logger.trace("###fetcherThread start"); +// System.out.println("#######fetcherThread start"); + fetcherThread.start(); + } + + public void close() throws IOException + { + logger.trace("fetcherThread close..."); + fetcher.close(); +// logger.trace("###fetcherThread close - OK"); + logger.trace("###fetcherThread close - OK"); + } + + public boolean isComplete() + { + return fetcher.isComplete(); + } + + public FetchingBuffer getBuffer() throws Exception { + logger.trace("fetcherThread is alive: " + fetcherThread.isAlive()); + try { + logger.trace("buffer size: " + buffer.size()); + } catch (SQLException e) { + logger.error("error in getBuffer: " +e); + } + return buffer; + } + + public int getBufferSize() throws Exception { + return buffer.size(); + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/session/FetchingSessionUtil.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/session/FetchingSessionUtil.java new file mode 100644 index 0000000..a9ed49d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/session/FetchingSessionUtil.java @@ -0,0 +1,77 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.session; + +import org.gcube.application.framework.core.session.ASLSession; +import org.gcube.portlets.user.speciesdiscovery.client.util.SpeciesGridFields; +import org.gcube.portlets.user.speciesdiscovery.client.util.TaxonomyGridField; +import org.gcube.portlets.user.speciesdiscovery.server.asl.SessionUtil; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.DaoSession; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.OccurrenceBuffer; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.ResultRowBuffer; +import org.gcube.portlets.user.speciesdiscovery.server.persistence.TaxonomyRowBuffer; +import org.gcube.portlets.user.speciesdiscovery.server.stream.CloseableIterator; +import org.gcube.portlets.user.speciesdiscovery.server.stream.aggregation.FieldAggregator; +import org.gcube.portlets.user.speciesdiscovery.server.stream.aggregation.SpeciesKeyProvider; +import org.gcube.portlets.user.speciesdiscovery.server.stream.aggregation.TaxonomyClassificationAggregator; +import org.gcube.portlets.user.speciesdiscovery.server.stream.aggregation.TaxonomyKeyProvider; +import org.gcube.portlets.user.speciesdiscovery.shared.FetchingElement; +import org.gcube.portlets.user.speciesdiscovery.shared.Occurrence; +import org.gcube.portlets.user.speciesdiscovery.shared.ResultRow; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchResultType; +import org.gcube.portlets.user.speciesdiscovery.shared.TaxonomyRow; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class FetchingSessionUtil { + + @SuppressWarnings("unchecked") + public static FetchingSession createFetchingSession(CloseableIterator source, SearchResultType type, ASLSession session) throws Exception + { + switch (type) { + case SPECIES_PRODUCT: return createSpeciesProductFetchingSession((CloseableIterator) source, session); + case TAXONOMY_ITEM: return createTaxonomyItemFetchingSession((CloseableIterator) source, session); + default: + break; + } + return null; + } + + protected static FetchingSession createSpeciesProductFetchingSession(CloseableIterator source, ASLSession session) throws Exception + { + FetchingBuffer buffer = new ResultRowBuffer(DaoSession.getResultRowDAO(session), DaoSession.getTaxonDAO(session)); + FetchingSession fetchingSession = new FetchingSession(source, buffer); + fetchingSession.addAggregator(new FieldAggregator(new SpeciesKeyProvider(SpeciesGridFields.DATASOURCE))); + fetchingSession.addAggregator(new FieldAggregator(new SpeciesKeyProvider(SpeciesGridFields.MATCHING_RANK))); + fetchingSession.addAggregator(new FieldAggregator(new SpeciesKeyProvider(SpeciesGridFields.DATAPROVIDER))); + fetchingSession.addAggregator(new TaxonomyClassificationAggregator()); + fetchingSession.startFetching(); + SessionUtil.setCurrentSearchSession(session, fetchingSession); + return fetchingSession; + } + + protected static FetchingSession createTaxonomyItemFetchingSession(CloseableIterator source, ASLSession session) throws Exception + { + FetchingBuffer buffer = new TaxonomyRowBuffer(DaoSession.getTaxonomyDAO(session)); + FetchingSession fetchingSession = new FetchingSession(source, buffer); + fetchingSession.addAggregator(new FieldAggregator(new TaxonomyKeyProvider(TaxonomyGridField.MATCHING_RANK))); + fetchingSession.addAggregator(new FieldAggregator(new TaxonomyKeyProvider(TaxonomyGridField.DATASOURCE))); + fetchingSession.addAggregator(new TaxonomyClassificationAggregator()); + fetchingSession.startFetching(); + SessionUtil.setCurrentSearchSession(session, fetchingSession); + return fetchingSession; + } + + public static FetchingSession createOccurrenceFetchingSession(CloseableIterator source, ASLSession session) throws Exception + { + FetchingBuffer buffer = new OccurrenceBuffer(DaoSession.getOccurrenceDAO(session)); + FetchingSession fetchingSession = new FetchingSession(source, buffer); + fetchingSession.startFetching(); + SessionUtil.setCurrentOccurrenceSession(session, fetchingSession); + return fetchingSession; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/session/FilterableFetchingBuffer.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/session/FilterableFetchingBuffer.java new file mode 100644 index 0000000..eb28bdc --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/session/FilterableFetchingBuffer.java @@ -0,0 +1,24 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.session; + +import java.sql.SQLException; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.shared.FetchingElement; +import org.gcube.portlets.user.speciesdiscovery.shared.filter.FilterCriteria; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface FilterableFetchingBuffer extends FetchingBuffer { + + + public List getFilteredList(FilterCriteria filterCriteria) throws SQLException; + + //TODO remove ASAP + public int getFilteredListSize() throws SQLException; + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/session/SelectableFetchingBuffer.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/session/SelectableFetchingBuffer.java new file mode 100644 index 0000000..318bf6c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/session/SelectableFetchingBuffer.java @@ -0,0 +1,24 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.session; + +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.shared.SelectableElement; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface SelectableFetchingBuffer extends FetchingBuffer { + + public List getSelected() throws Exception; + + public void updateSelection(int rowId, boolean selection) throws Exception; + + public void updateAllSelection(boolean selection) throws Exception; + + public int sizeSelected() throws Exception; + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/Aggregator.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/Aggregator.java new file mode 100644 index 0000000..2dc1975 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/Aggregator.java @@ -0,0 +1,18 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.stream; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface Aggregator { + + public String getName(); + + public void aggregate(I input); + + public O getAggregation(); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/AggregatorIterator.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/AggregatorIterator.java new file mode 100644 index 0000000..c989e8f --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/AggregatorIterator.java @@ -0,0 +1,60 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.stream; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class AggregatorIterator implements CloseableIterator { + + protected CloseableIterator source; + protected Map> aggregators; + + /** + * @param source + */ + public AggregatorIterator(CloseableIterator source) { + this.source = source; + aggregators = new HashMap>(); + } + + public void addAggregator(Aggregator aggregator) + { + aggregators.put(aggregator.getName(), aggregator); + } + + public Aggregator getAggregator(String name) + { + return aggregators.get(name); + } + + @Override + public boolean hasNext() { + return source.hasNext(); + } + + @Override + public I next() { + I input = source.next(); + for (Aggregator aggregator:aggregators.values()) aggregator.aggregate(input); + return input; + } + + @Override + public void remove() { + source.remove(); + } + + @Override + public void close() throws IOException { + + source.close(); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/CSVGenerator.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/CSVGenerator.java new file mode 100644 index 0000000..6e65c2e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/CSVGenerator.java @@ -0,0 +1,77 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.stream; + +import java.io.IOException; +import java.util.List; + +import org.apache.log4j.Logger; + +/** + * Utility class for convert an input into a different kind of output. + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class CSVGenerator implements CloseableIterator> { + + protected Logger logger = Logger.getLogger(CSVGenerator.class); + + protected CloseableIterator source; + protected Converter> converter; + protected List header; + protected boolean writerHeader = true; + + public CSVGenerator(CloseableIterator source, Converter> converter, List header) { + this.source = source; + this.converter = converter; + this.header = header; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean hasNext() { + return writerHeader || source.hasNext(); + } + + /** + * {@inheritDoc} + */ + @Override + public List next() { + + assert hasNext(); + + if (writerHeader) { + writerHeader = false; + return header; + } + + try { + I input = source.next(); + List output = converter.convert(input); + return output; + } catch (Exception e) { + logger.error("Error converting element", e); + } + return null; + } + + + + /** + * {@inheritDoc} + */ + @Override + public void close() throws IOException { + source.close(); + } + + /** + * {@inheritDoc} + */ + @Override + public void remove() {} +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/CastConverter.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/CastConverter.java new file mode 100644 index 0000000..52c207d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/CastConverter.java @@ -0,0 +1,18 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.stream; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class CastConverter implements Converter { + + @SuppressWarnings("unchecked") + @Override + public O convert(I input) throws Exception { + return (O)input; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/CloseableIterator.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/CloseableIterator.java new file mode 100644 index 0000000..9882ff0 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/CloseableIterator.java @@ -0,0 +1,15 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.stream; + +import java.io.Closeable; +import java.util.Iterator; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface CloseableIterator extends Iterator, Closeable { + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/ConversionIterator.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/ConversionIterator.java new file mode 100644 index 0000000..e0f4923 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/ConversionIterator.java @@ -0,0 +1,67 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.stream; + +import java.io.IOException; + +import org.apache.log4j.Logger; + +/** + * Utility class for convert an input into a different kind of output. + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class ConversionIterator implements CloseableIterator { + + protected Logger logger = Logger.getLogger(ConversionIterator.class); + + protected CloseableIterator source; + protected Converter converter; + + public ConversionIterator( CloseableIterator source, Converter converter) { + this.source = source; + this.converter = converter; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean hasNext() { + return source.hasNext(); + } + + /** + * {@inheritDoc} + */ + @Override + public O next() { + + assert hasNext(); + try { + I input = source.next(); + O output = converter.convert(input); + return output; + } catch (Exception e) { + logger.error("Error converting element", e); + } + return null; + } + + + + /** + * {@inheritDoc} + */ + @Override + public void close() throws IOException { + source.close(); + } + + /** + * {@inheritDoc} + */ + @Override + public void remove() {} +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/Converter.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/Converter.java new file mode 100644 index 0000000..4f582cc --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/Converter.java @@ -0,0 +1,14 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.stream; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface Converter { + + public O convert(I input) throws Exception; + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/CounterAggregator.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/CounterAggregator.java new file mode 100644 index 0000000..80d8305 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/CounterAggregator.java @@ -0,0 +1,49 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.stream; + +import java.util.HashMap; + + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public abstract class CounterAggregator implements Aggregator> { + + protected String name; + protected HashMap aggregation; + protected KeyProvider keyProvider; + + /** + * @param name + */ + public CounterAggregator(String name, KeyProvider keyProvider) { + this.name = name; + aggregation = new HashMap(); + this.keyProvider = keyProvider; + } + + @Override + public String getName() { + return name; + } + + @Override + public void aggregate(T input) { + String key = keyProvider.getKey(input); + Integer counter = aggregation.get(key); + if (counter == null) counter = 0; + aggregation.put(key, counter+1); + } + + /** + * {@inheritDoc} + */ + @Override + public HashMap getAggregation() { + return aggregation; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/IteratorPointInfo.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/IteratorPointInfo.java new file mode 100644 index 0000000..e744470 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/IteratorPointInfo.java @@ -0,0 +1,133 @@ +package org.gcube.portlets.user.speciesdiscovery.server.stream; + +import java.net.URI; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.apache.log4j.Logger; +import org.gcube.data.spd.model.KeyValue; +import org.gcube.data.spd.model.PointInfo; +import org.gcube.data.streams.Stream; +import org.gcube.portlets.user.speciesdiscovery.shared.Occurrence; +import org.gcube.portlets.user.speciesdiscovery.shared.util.NormalizeString; + +public class IteratorPointInfo implements Stream { + + protected Logger logger = Logger.getLogger(IteratorPointInfo.class); + + private Iterator iterator; +// protected Logger logger = Logger.getLogger(IteratorCoordinate.class); + + public IteratorPointInfo(Iterator iterator) { + this.iterator = iterator; + } + + @Override + public boolean hasNext() { + if (iterator.hasNext()) + return true; + return false; + } + + @Override + public PointInfo next() { + Occurrence occrs = iterator.next(); +// Coordinate coordinate = null; + PointInfo pointInfo = null; + + if (occrs != null){ + logger.trace("get occurences id "+occrs.getServiceId()); + Double decimalLatitude = null; + Double decimalLongitude = null; + + try{ + decimalLatitude = Double.valueOf(occrs.getDecimalLatitude()); + decimalLongitude = Double.valueOf(occrs.getDecimalLongitude()); + } + + catch (Exception e) { + logger.error("error in get coordinate return null"); + return null; + } + +// coordinate = new Coordinate(decimalLatitude,decimalLongitude); + pointInfo = new PointInfo(decimalLongitude, decimalLatitude); + +// LinkedHashMap listMetaData = new LinkedHashMap(); + + List listMetaData = new ArrayList(); + + listMetaData.add(new KeyValue(Occurrence.BASIS_OF_RECORD, NormalizeString.validateUndefined(occrs.getBasisOfRecord()))); + listMetaData.add(new KeyValue(Occurrence.CATALOGUE_NUMBER, NormalizeString.validateUndefined(occrs.getCatalogueNumber()))); + listMetaData.add(new KeyValue(Occurrence.CITATION, NormalizeString.validateUndefined(occrs.getCitation()))); + listMetaData.add(new KeyValue(Occurrence.COLLECTION_CODE, NormalizeString.validateUndefined(occrs.getCollectionCode()))); + listMetaData.add(new KeyValue(Occurrence.COORDINATE_INMETERS, NormalizeString.validateUndefined(occrs.getCoordinateUncertaintyInMeters()))); + + listMetaData.add(new KeyValue(Occurrence.COUNTRY, NormalizeString.validateUndefined(occrs.getCountry()))); + listMetaData.add(new KeyValue(Occurrence.DATAPROVIDER, NormalizeString.validateUndefined(occrs.getDataProvider()))); + listMetaData.add(new KeyValue(Occurrence.DATASET, NormalizeString.validateUndefined(occrs.getDataSet()))); + + listMetaData.add(new KeyValue(Occurrence.AUTHOR, NormalizeString.validateUndefined(occrs.getAuthor()))); + listMetaData.add(new KeyValue(Occurrence.LSID, NormalizeString.validateUndefined(occrs.getLsid()))); + listMetaData.add(new KeyValue(Occurrence.CREDITS, NormalizeString.validateUndefined(occrs.getCredits()))); + + listMetaData.add(new KeyValue(Occurrence.DATASOURCE, NormalizeString.validateUndefined(occrs.getDataSource()))); + + listMetaData.add(new KeyValue(Occurrence.EVENT_DATE, NormalizeString.validateUndefined(occrs.getEventDate()))); + + listMetaData.add(new KeyValue(Occurrence.FAMILY, NormalizeString.validateUndefined(occrs.getFamily()))); + + listMetaData.add(new KeyValue(Occurrence.ID_FIELD, NormalizeString.validateUndefined(""+occrs.getId()))); + listMetaData.add(new KeyValue(Occurrence.INSTITUTE_CODE, NormalizeString.validateUndefined(occrs.getInstitutionCode()))); + + listMetaData.add(new KeyValue(Occurrence.LOCALITY, NormalizeString.validateUndefined(occrs.getLocality()))); + listMetaData.add(new KeyValue(Occurrence.MAX_DEPTH, NormalizeString.validateUndefined(occrs.getMaxDepth()))); + listMetaData.add(new KeyValue(Occurrence.MIN_DEPTH, NormalizeString.validateUndefined(occrs.getMinDepth()))); + listMetaData.add(new KeyValue(Occurrence.MODIFIED, NormalizeString.validateUndefined(occrs.getModified()))); + + listMetaData.add(new KeyValue(Occurrence.RECORD_BY, NormalizeString.validateUndefined(occrs.getRecordedBy()))); + listMetaData.add(new KeyValue(Occurrence.SCIENTIFICNAME, NormalizeString.validateUndefined(occrs.getScientificName()))); + + listMetaData.add(new KeyValue(Occurrence.DECIMAL_LATITUDE, decimalLatitude+"")); + listMetaData.add(new KeyValue(Occurrence.DECIMAL_LONGITUDE, decimalLongitude+"")); + +// pointInfo.setPropertiesMap(listMetaData); + + pointInfo.setPropertiesList(listMetaData); + + logger.trace("create new object point info lat: "+decimalLatitude +" long: "+decimalLongitude); + + return pointInfo; + } + + logger.trace("get occurences null - return null"); + return null; + + } + + @Override + public void remove() { + iterator.remove(); + // throw new UnsupportedOperationException(); + } + + public Iterator iterator() { + return this; + } + + @Override + public void close() { + } + + @Override + public URI locator() throws IllegalStateException { + return null; + } + + @Override + public boolean isClosed() { + return false; + + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/IteratorWrapper.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/IteratorWrapper.java new file mode 100644 index 0000000..ef5ccbc --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/IteratorWrapper.java @@ -0,0 +1,53 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.stream; + +import java.util.Iterator; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class IteratorWrapper implements CloseableIterator { + + protected Iterator iterator; + + /** + * @param iterator + */ + public IteratorWrapper(Iterator iterator) { + this.iterator = iterator; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean hasNext() { + return iterator.hasNext(); + } + + /** + * {@inheritDoc} + */ + @Override + public E next() { + return iterator.next(); + } + + /** + * {@inheritDoc} + */ + @Override + public void remove() { + iterator.remove(); + } + + /** + * {@inheritDoc} + */ + @Override + public void close() { + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/KeyProvider.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/KeyProvider.java new file mode 100644 index 0000000..d2724a2 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/KeyProvider.java @@ -0,0 +1,14 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.stream; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface KeyProvider { + + public String getKey(T value); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/OccurenceCSVConverter.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/OccurenceCSVConverter.java new file mode 100644 index 0000000..2b43892 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/OccurenceCSVConverter.java @@ -0,0 +1,87 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.stream; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.shared.Occurrence; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class OccurenceCSVConverter implements Converter> { + + public static final List HEADER = Arrays.asList(new String[]{ + "institutionCode", + "collectionCode", + "catalogueNumber", + + "dataSet", + "dataProvider", + "dataSource", + + "author", +// "lsid", + "credits", + + "recordedBy", + "eventDate", + "modified", + "scientificName", + "kingdom", + "family", + "locality", + "country", + "citation", + "decimalLatitude", + "decimalLongitude", + "coordinateUncertaintyInMeters", + "maxDepth", + "minDepth", + "basisOfRecord"}); + + @Override + public List convert(Occurrence input) throws Exception { + + List fields = new LinkedList(); + fields.add(cleanValue(input.getInstitutionCode())); + fields.add(cleanValue(input.getCollectionCode())); + fields.add(cleanValue(input.getCatalogueNumber())); + + fields.add(cleanValue(input.getDataSet())); + fields.add(cleanValue(input.getDataProvider())); + fields.add(cleanValue(input.getDataSource())); + + fields.add(cleanValue(input.getAuthor())); +// fields.add(cleanValue(input.getLsid())); + fields.add(cleanValue(input.getCredits())); + + fields.add(cleanValue(input.getRecordedBy())); + fields.add(cleanValue(input.getEventDate())); + fields.add(cleanValue(input.getModified())); + fields.add(cleanValue(input.getScientificName())); + fields.add(cleanValue(input.getKingdom())); + fields.add(cleanValue(input.getFamily())); + fields.add(cleanValue(input.getLocality())); + fields.add(cleanValue(input.getCountry())); + fields.add(cleanValue(input.getCitation())); + fields.add(cleanValue(input.getDecimalLatitude())); + fields.add(cleanValue(input.getDecimalLongitude())); + fields.add(cleanValue(input.getCoordinateUncertaintyInMeters())); + fields.add(cleanValue(input.getMaxDepth())); + fields.add(cleanValue(input.getMinDepth())); + fields.add(cleanValue(input.getBasisOfRecord())); + return fields; + } + + protected static String cleanValue(String value) + { + if (value==null) return ""; + return value; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/OccurenceCSVConverterOpenModeller.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/OccurenceCSVConverterOpenModeller.java new file mode 100644 index 0000000..53a494e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/OccurenceCSVConverterOpenModeller.java @@ -0,0 +1,47 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.stream; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.shared.Occurrence; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class OccurenceCSVConverterOpenModeller implements Converter> { + + public static final List HEADER = Arrays.asList(new String[]{ + "#id", + "label", + "long", + "lat", + "abundance"}); + +// id, label, longitude, latitude, abundance + + protected final static String PRESENCE = "1"; //Abundance should be 1 for a presence point. + + @Override + public List convert(Occurrence input) throws Exception { + + List fields = new LinkedList(); + fields.add(cleanValue(input.getServiceId())); + fields.add(cleanValue(input.getScientificName())); + fields.add(cleanValue(input.getDecimalLongitude())); + fields.add(cleanValue(input.getDecimalLatitude())); + fields.add(PRESENCE); + return fields; + } + + protected static String cleanValue(String value) + { + if (value==null) return ""; + return value; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/StreamExtend.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/StreamExtend.java new file mode 100644 index 0000000..e7e9eda --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/StreamExtend.java @@ -0,0 +1,50 @@ +package org.gcube.portlets.user.speciesdiscovery.server.stream; + +import java.net.URI; +import java.util.Iterator; + +import org.gcube.data.streams.Stream; + +public class StreamExtend implements Stream { + + private Iterator iterator; + + public StreamExtend(Iterator iterator){ + this.iterator = iterator; + } + + @Override + public void remove() { + iterator.remove(); + } + + @Override + public void close() { + } + + @Override + public boolean hasNext() { + if (iterator.hasNext()) + return true; + return false; + } + + @Override + public boolean isClosed() { + return false; + } + + @Override + public URI locator() { + return null; + } + + @Override + public I next() { + I item = iterator.next(); + if(item!=null) + return item; + + return null; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/aggregation/FieldAggregator.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/aggregation/FieldAggregator.java new file mode 100644 index 0000000..db7d2a7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/aggregation/FieldAggregator.java @@ -0,0 +1,26 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.stream.aggregation; + +import org.gcube.portlets.user.speciesdiscovery.client.util.GridField; +import org.gcube.portlets.user.speciesdiscovery.server.stream.CounterAggregator; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class FieldAggregator extends CounterAggregator { + + protected static final String NAME_PREFIX = FieldAggregator.class.getName(); + + public static String getFieldAggregatorName(F field) + { + return NAME_PREFIX+field.toString(); + } + + public FieldAggregator(FieldKeyProvider keyProvider) { + super(getFieldAggregatorName(keyProvider.getField()), keyProvider); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/aggregation/FieldKeyProvider.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/aggregation/FieldKeyProvider.java new file mode 100644 index 0000000..a512ab0 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/aggregation/FieldKeyProvider.java @@ -0,0 +1,38 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.stream.aggregation; + +import org.gcube.portlets.user.speciesdiscovery.client.util.GridField; +import org.gcube.portlets.user.speciesdiscovery.server.stream.KeyProvider; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public abstract class FieldKeyProvider implements KeyProvider { + + protected F field; + + /** + * @param field + */ + public FieldKeyProvider(F field) { + this.field = field; + } + + /** + * @return the field + */ + public F getField() { + return field; + } + + public String getKey(T value) + { + return getKey(value, field); + } + + public abstract String getKey(T value, F field); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/aggregation/SpeciesKeyProvider.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/aggregation/SpeciesKeyProvider.java new file mode 100644 index 0000000..48eb8f4 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/aggregation/SpeciesKeyProvider.java @@ -0,0 +1,31 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.stream.aggregation; + +import org.gcube.portlets.user.speciesdiscovery.client.util.SpeciesGridFields; +import org.gcube.portlets.user.speciesdiscovery.shared.ResultRow; +import org.gcube.portlets.user.speciesdiscovery.shared.util.NormalizeString; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class SpeciesKeyProvider extends FieldKeyProvider { + + + public SpeciesKeyProvider(SpeciesGridFields field) { + super(field); + } + + @Override + public String getKey(ResultRow value, SpeciesGridFields field) { + switch (field) { + case DATASOURCE: return value.getDataSourceName(); + case MATCHING_RANK: return NormalizeString.lowerCaseUpFirstChar(value.getParents().get(0).getRank()); + case DATAPROVIDER: return value.getDataProviderName(); + } + return null; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/aggregation/TaxonomyClassificationAggregator.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/aggregation/TaxonomyClassificationAggregator.java new file mode 100644 index 0000000..983eac2 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/aggregation/TaxonomyClassificationAggregator.java @@ -0,0 +1,219 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.stream.aggregation; + +import java.util.EnumMap; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.gcube.portlets.user.speciesdiscovery.client.model.ClassificationModel; +import org.gcube.portlets.user.speciesdiscovery.server.stream.Aggregator; +import org.gcube.portlets.user.speciesdiscovery.shared.MainTaxonomicRankEnum; +import org.gcube.portlets.user.speciesdiscovery.shared.TaxonomyInterface; +import org.gcube.portlets.user.speciesdiscovery.shared.TaxonomyProvider; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class TaxonomyClassificationAggregator implements Aggregator>> { + + public static final String NAME = "ClassificationAggregator"; + public static final String TAXONOMYUNKNOWN = "Unknown"; + public static final String BASETAXONOMY = "Kingdom"; + public static final String UNK = "Unk"; + public static final String UNDEFINED = "Undefined"; + + public static final Map RANKS = new HashMap(); + static{ + for (MainTaxonomicRankEnum rank:MainTaxonomicRankEnum.values()) RANKS.put(rank.getLabel().toLowerCase(), rank); + } + + protected EnumMap> aggregations; + + /** + * @param aggregationRank + */ + public TaxonomyClassificationAggregator() { + aggregations = new EnumMap>(MainTaxonomicRankEnum.class); + } + + @Override + public String getName() { + return NAME; + } + + @Override + public void aggregate(TaxonomyProvider row) { + +// System.out.println("TaxonomyProvider " + row); + + List matchingTaxon = row.getParents(); + + if(matchingTaxon == null) return; + + EnumMap groupedTaxon = groupTaxonByRank(matchingTaxon); + + for (MainTaxonomicRankEnum aggregationRank: MainTaxonomicRankEnum.values()){ + + TaxonomyInterface taxon = groupedTaxon.get(aggregationRank); + + String taxonId; + + //IF RANK CLASS EXISTS INSERT INTO HASHMAP GROUP BY RANK + if (taxon!=null && taxon.getName()!=null) { + taxonId = addTaxonToAggregation(aggregationRank, taxon, row.getBaseTaxonValue(), row.getBaseTaxonValue(), taxon.getRank()); + setClassification(row, aggregationRank, taxonId); + } else { + + String unknownRank = matchingTaxon.get(0).getRank()!=null?matchingTaxon.get(0).getRank():TAXONOMYUNKNOWN; // GET THE FIRST RANK CLASS + + //IF BASETAXONOMY CLASS IS NOT UNKNOWN - INSERT INTO HASHMAP GROUP BY FIRST RANK + if(!row.getBaseTaxonValue().equalsIgnoreCase(TAXONOMYUNKNOWN)) { + taxonId = addTaxonToAggregation(aggregationRank, row.getParents().get(0), row.getBaseTaxonValue(), row.getBaseTaxonValue(), unknownRank); + setClassification(row, aggregationRank, taxonId); + } else { + //BASETAXONOMY UNKNOWN - INSERT INTO HASHMAP GROUP BY haskKey UNKNOWN RANK + + String haskKey = "["+UNK+" "+aggregationRank+"]" + " "+unknownRank; + String unkName = matchingTaxon.get(0).getName()!=null?matchingTaxon.get(0).getName():TAXONOMYUNKNOWN; // GET THE FIRST RANK NAME + + taxonId = addTaxonToAggregation(aggregationRank, haskKey, unkName, row.getBaseTaxonValue(), row.getBaseTaxonValue(), unknownRank); + setClassification(row, aggregationRank, taxonId); + } + + } + } + + +// TODO RIFARE +// TaxonomyInterface matchingTaxon = row.getParents(); +// +// if(matchingTaxon == null) return; +// +// EnumMap groupedTaxon = groupTaxonByRank(matchingTaxon); +// +// for (MainTaxonomicRankEnum aggregationRank: MainTaxonomicRankEnum.values()){ +// +// TaxonomyInterface taxon = groupedTaxon.get(aggregationRank); +// +// String taxonId; +// +// //IF RANK CLASS EXISTS INSERT INTO HASHMAP GROUP BY RANK +// if (taxon!=null && taxon.getName()!=null) { +// taxonId = addTaxonToAggregation(aggregationRank, taxon, row.getBaseTaxonValue(), row.getBaseTaxonValue(), taxon.getRank()); +// setClassification(row, aggregationRank, taxonId); +// } else { +// +// String unknownRank = matchingTaxon.getRank()!=null?matchingTaxon.getRank():TAXONOMYUNKNOWN; // GET THE FIRST RANK CLASS +// +// //IF BASETAXONOMY CLASS IS NOT UNKNOWN - INSERT INTO HASHMAP GROUP BY FIRST RANK +// if(!row.getBaseTaxonValue().equalsIgnoreCase(TAXONOMYUNKNOWN)) { +// taxonId = addTaxonToAggregation(aggregationRank, row.getParents(), row.getBaseTaxonValue(), row.getBaseTaxonValue(), unknownRank); +// setClassification(row, aggregationRank, taxonId); +// } else { +// //BASETAXONOMY UNKNOWN - INSERT INTO HASHMAP GROUP BY haskKey UNKNOWN RANK +// +// String haskKey = "["+UNK+" "+aggregationRank+"]" + " "+unknownRank; +// String unkName = matchingTaxon.getName()!=null?matchingTaxon.getName():TAXONOMYUNKNOWN; // GET THE FIRST RANK NAME +// +// taxonId = addTaxonToAggregation(aggregationRank, haskKey, unkName, row.getBaseTaxonValue(), row.getBaseTaxonValue(), unknownRank); +// setClassification(row, aggregationRank, taxonId); +// } +// +// } +// } + } + + protected void setClassification(TaxonomyProvider input, MainTaxonomicRankEnum rank, String value) + { + switch (rank) { + case CLASS: input.setClassID(value); break; + case FAMILY: input.setFamilyID(value); break; + case GENUS: input.setGenusID(value); break; + case KINGDOM: input.setKingdomID(value); break; + case ORDER: input.setOrderID(value); break; + case PHYLUM: input.setPhylumID(value); break; + case SPECIES: input.setSpeciesID(value); break; + } + + } + + protected EnumMap groupTaxonByRank(List listTaxonomyInteface) + { + EnumMap groupedTaxon = new EnumMap(MainTaxonomicRankEnum.class); + + for (TaxonomyInterface taxonomyInterface : listTaxonomyInteface) { + if (taxonomyInterface.getRank()!=null) { + MainTaxonomicRankEnum rank = RANKS.get(taxonomyInterface.getRank().toLowerCase()); + if (rank!=null) groupedTaxon.put(rank, taxonomyInterface); + } + } + +// while(taxon!=null){ +// if (taxon.getRank()!=null) { +// MainTaxonomicRankEnum rank = RANKS.get(taxon.getRank().toLowerCase()); +// if (rank!=null) groupedTaxon.put(rank, taxon); +// } +// taxon = taxon.getParent(); +// } + + return groupedTaxon; + } + +// protected EnumMap groupTaxonByRank(TaxonomyInterface taxon) +// { +// EnumMap groupedTaxon = new EnumMap(MainTaxonomicRankEnum.class); +// +// while(taxon!=null){ +// if (taxon.getRank()!=null) { +// MainTaxonomicRankEnum rank = RANKS.get(taxon.getRank().toLowerCase()); +// if (rank!=null) groupedTaxon.put(rank, taxon); +// } +// taxon = taxon.getParent(); +// } +// +// return groupedTaxon; +// } + + protected String addTaxonToAggregation(MainTaxonomicRankEnum aggregationRank, TaxonomyInterface taxon, String baseTaxonId, String baseTaxonValue, String classificationRank) + { + String taxonName = taxon.getName().toLowerCase(); + return addTaxonToAggregation(aggregationRank, taxonName, taxonName, baseTaxonId, baseTaxonValue, classificationRank); + } + + protected String addTaxonToAggregation(MainTaxonomicRankEnum aggregationRank, String taxonId, String classificationName, String baseTaxonId, String baseTaxonValue, String classificationRank) + { + HashMap aggregation = getAggregation(aggregationRank); + ClassificationModel classification = aggregation.get(taxonId); + if (classification == null) { + classification = new ClassificationModel(taxonId, classificationName, classificationRank.toLowerCase(), baseTaxonId, baseTaxonValue, true, 1); + aggregation.put(taxonId, classification); + } else classification.incrCountOf(); +// classification.getGroupedIdClassificationList().add(rowId); + + return taxonId; + } + + protected HashMap getAggregation(MainTaxonomicRankEnum rank) + { + HashMap aggregation = aggregations.get(rank); + if (aggregation == null) { + aggregation = new HashMap(); + aggregations.put(rank, aggregation); + } + return aggregation; + } + + + /** + * {@inheritDoc} + */ + @Override + public EnumMap> getAggregation() { + return aggregations; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/aggregation/TaxonomyKeyProvider.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/aggregation/TaxonomyKeyProvider.java new file mode 100644 index 0000000..4baa0e7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/stream/aggregation/TaxonomyKeyProvider.java @@ -0,0 +1,30 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.server.stream.aggregation; + +import org.gcube.portlets.user.speciesdiscovery.client.util.TaxonomyGridField; +import org.gcube.portlets.user.speciesdiscovery.shared.TaxonomyRow; +import org.gcube.portlets.user.speciesdiscovery.shared.util.NormalizeString; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class TaxonomyKeyProvider extends FieldKeyProvider { + + + public TaxonomyKeyProvider(TaxonomyGridField field) { + super(field); + } + + @Override + public String getKey(TaxonomyRow value, TaxonomyGridField field) { + switch (field) { + case MATCHING_RANK: return NormalizeString.lowerCaseUpFirstChar(value.getRank()); + case DATASOURCE: return value.getDataProviderName(); + } + return null; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/util/DateUtil.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/util/DateUtil.java new file mode 100644 index 0000000..09c736d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/util/DateUtil.java @@ -0,0 +1,167 @@ +package org.gcube.portlets.user.speciesdiscovery.server.util; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.TimeZone; + +import org.apache.log4j.Logger; +import org.gcube.portlets.user.speciesdiscovery.client.ConstantsSpeciesDiscovery; + +public class DateUtil { + + public static enum TIMETYPE{DAYS, HOURS, MINUTES, SECONDS}; + + public static Logger logger = Logger.getLogger(DateUtil.class); + + public static final String DATE_TIME_FORMAT = "yyyy.MM.dd 'at' HH:mm:ss"; + + + public static final String DATE_TIME_FORMAT_2 = "dd-MM, yyyy HH:mm:ss z"; + + + public static Date toDate(Calendar calendar) + { + if (calendar == null) return new Date(0); + return calendar.getTime(); + + } + + public static String toDateFormatToString(Calendar calendar){ + + SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_TIME_FORMAT); + + Date resultdate = getDate(calendar); + + return dateFormat.format(resultdate); + } + + + public static Date toDateFormat(Calendar calendar){ + + SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_TIME_FORMAT); + + Date resultdate = getDate(calendar); + + try { + + resultdate = dateFormat.parse(dateFormat.format(resultdate)); + + } catch (ParseException e) { + logger.error(e.getMessage()); + resultdate = new Date(0); + } + + return resultdate; + } + + + public static Date getDateFormat(Calendar calendar){ + + SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_TIME_FORMAT); + Date resultdate = null; + + if (calendar == null) + resultdate = new Date(0); + else + resultdate = getDate(calendar); + + try { + + resultdate = dateFormat.parse(dateFormat.format(resultdate)); + + } catch (ParseException e) { + logger.error(e.getMessage()); + resultdate = new Date(0); + } + + return resultdate; + } + + + public static Date getDate(Calendar calendar) { + + Date resultdate = null; + + if (calendar == null) + resultdate = new Date(0); + else + resultdate = new Date(calendar.getTimeInMillis()); + + return resultdate; + + } + + public static Date stringToDateFormat(String date){ + + SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_TIME_FORMAT); + Date resultdate = null; + + try { + resultdate = dateFormat.parse(date); + } catch (ParseException e) { + logger.error(e.getMessage()); + resultdate = new Date(0); + } + + return resultdate; + } + + + public static String dateToDateFormatString(Date date){ + + SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_TIME_FORMAT); + String dateString = null; + + if(date!=null) + dateString = dateFormat.format(date); + else + dateString = dateFormat.format(new Date(0)); + + return dateString; + } + + public static Date millisecondsToDate(long milliseconds){ + + Date date = null; + + try { + date= new Date(milliseconds); + } catch (Exception e) { + logger.error(e.getMessage()); + date = new Date(0); + } + + return date; + } + + public static long getDifference(long date1, long date2, TIMETYPE timeType){ + + // Calculates the difference in milliseconds. + long millisDiff = date2 - date1; + + switch (timeType) { + case DAYS: return (long) (millisDiff / 86400000); + case HOURS: return (long) (millisDiff / 3600000 % 24); + case MINUTES: return (long) (millisDiff / 60000 % 60); + case SECONDS: return (long) (millisDiff / 1000 % 60); + + default: + return (long) (millisDiff / 1000 % 60); + } + } + + + public static String getDifference(long date1, long date2){ + long millisDiff = date2 - date1; +// System.out.println("millisDiff: "+millisDiff); + Date date = new Date(millisDiff); + DateFormat outFormat = new SimpleDateFormat(ConstantsSpeciesDiscovery.TIMEFORMAT_HH_MM_SS); + outFormat.setTimeZone(TimeZone.getTimeZone(ConstantsSpeciesDiscovery.TIME_ZONE_UTC)); + return outFormat.format(date); + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/util/QueryUtil.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/util/QueryUtil.java new file mode 100644 index 0000000..869f1ec --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/util/QueryUtil.java @@ -0,0 +1,71 @@ +package org.gcube.portlets.user.speciesdiscovery.server.util; + +import org.antlr.runtime.ANTLRStringStream; +import org.antlr.runtime.CommonTokenStream; +import org.antlr.runtime.RecognitionException; +import org.apache.log4j.Logger; +import org.gcube.dataaccess.spql.SPQLLexer; +import org.gcube.dataaccess.spql.SPQLParser; +import org.gcube.dataaccess.spql.model.ParsingResult; +import org.gcube.dataaccess.spql.model.ReturnType; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchFilters; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchResultType; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchServiceException; +import org.gcube.portlets.user.speciesdiscovery.shared.SpeciesCapability; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class QueryUtil { + + protected static Logger logger = Logger.getLogger(QueryUtil.class); + + public static SearchResultType getQueryResultType(String query) throws SearchServiceException + { + try { + SPQLLexer lexer = new SPQLLexer(new ANTLRStringStream(query)); + CommonTokenStream tokens = new CommonTokenStream(lexer); + SPQLParser parser = new SPQLParser(tokens); + ParsingResult result = parser.query(); + + ReturnType type = result.getReturnExpression().getType(); + if (type == null) return SearchResultType.SPECIES_PRODUCT; + switch (type) { + case ALL: return SearchResultType.SPECIES_PRODUCT; + case OCCURRENCE: return SearchResultType.OCCURRENCE_POINT; + case TAXON: return SearchResultType.TAXONOMY_ITEM; + default: logger.error("Unknow return type: "+type); + } + + } catch (RecognitionException e) { + logger.warn("Error parsing the user query", e); + throw new SearchServiceException("Wrong query: "+e.getMessage()); + } + + + return null; + } + + public static SearchResultType getResultType(SearchFilters searchFilters) + { + + switch (searchFilters.getResultType()) { + case RESULTITEM: return SearchResultType.SPECIES_PRODUCT; + case TAXONOMYITEM: return SearchResultType.TAXONOMY_ITEM; + default: logger.error("Unknow return type: "+searchFilters.getResultType()); + } + return null; + } + + public static SpeciesCapability getResultType(SearchResultType resultType) + { + + switch (resultType) { + case SPECIES_PRODUCT: return SpeciesCapability.RESULTITEM; + case OCCURRENCE_POINT: return SpeciesCapability.OCCURRENCESPOINTS; + case TAXONOMY_ITEM: return SpeciesCapability.TAXONOMYITEM; + } + return null; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/util/StorageUtil.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/util/StorageUtil.java new file mode 100644 index 0000000..04d09c2 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/util/StorageUtil.java @@ -0,0 +1,82 @@ +package org.gcube.portlets.user.speciesdiscovery.server.util; + +import java.io.InputStream; +import java.net.MalformedURLException; + +import org.gcube.common.core.scope.GCUBEScope; +import org.gcube.common.core.utils.logging.GCUBELog; +import org.gcube.contentmanagement.blobstorage.service.IClient; +import org.gcube.contentmanager.storageclient.model.protocol.smp.StringEncrypter; +import org.gcube.contentmanager.storageclient.wrapper.AccessType; +import org.gcube.contentmanager.storageclient.wrapper.StorageClient; + +public class StorageUtil { + protected static GCUBELog logger = new GCUBELog(StorageUtil.class); + + public static InputStream getInputStreamByStorageClient(String url) throws Exception { + + logger.trace("url :" + url); + + String [] urlParam=url.split("\\?"); +// String param=urlParam[1]; + logger.info("String encrypted "+urlParam[1]); + String param=new StringEncrypter("DES").decrypt(urlParam[1]); + logger.info("String decrypted: "+param); + String [] getParam=param.split("\\&"); + String serviceClass=null; + String serviceName=null; + String owner=null; + String accessType=null; + String scopeType=null; + AccessType type = null; + String server= null; + String [] par1; + for(String par : getParam){ + if(par.contains("ServiceClass")){ + par1=par.split("="); + serviceClass=par1[1]; + }else if(par.contains("ServiceName")){ + par1=par.split("="); + serviceName=par1[1]; + }else if(par.contains("owner")){ + par1=par.split("="); + owner=par1[1]; + }else if(par.contains("scope")){ + par1=par.split("="); + scopeType=par1[1]; + }else if(par.contains("server")){ + par1=par.split("="); + server=par1[1]; + }else if(par.contains("AccessType")){ + par1=par.split("="); + accessType=par1[1]; + if(accessType.equalsIgnoreCase("public")){ + type=AccessType.PUBLIC; + }else if(accessType.equalsIgnoreCase("shared")){ + type=AccessType.SHARED; + } + }else{ + ; + } + } + if((serviceName==null) || (serviceClass==null) || (owner == null) || (scopeType==null) || (type == null)) + throw new MalformedURLException(); + GCUBEScope scope=GCUBEScope.getScope(scopeType); + String location=extractLocation(urlParam[0]); + + logger.trace("Storage instance with parameters "+serviceClass+" "+serviceName+" "+owner+" "+type+" "+scope+ " location: "+urlParam[0]); + IClient client=new StorageClient(serviceClass, serviceName, owner, type, scope, server).getClient(); + InputStream is=null; + is=client.get().RFileAStream(location); + +// createFileTest(is); + return is; + } + + public static String extractLocation(String url) { + String [] loc=url.split("//"); + logger.trace("url extracted: "+loc[1]); + return loc[1]; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/util/XStreamUtil.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/util/XStreamUtil.java new file mode 100644 index 0000000..5730818 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/util/XStreamUtil.java @@ -0,0 +1,56 @@ +package org.gcube.portlets.user.speciesdiscovery.server.util; + +import com.thoughtworks.xstream.XStream; + +public class XStreamUtil extends XStream{ + + private String aliasName = ""; + + public enum AliasItem {OCCURRECENCE,RESULTROW,TAXONOMYROW}; + + public XStreamUtil(AliasItem alias, Class type){ + + switch (alias) { + + case OCCURRECENCE: + + this.aliasName = "occurrenceItem"; + + break; + + case RESULTROW: + + this.aliasName = "resultItem"; + + break; + + case TAXONOMYROW: + + this.aliasName = "taxonomyItem"; + + break; + + default: + break; + } + + this.alias(aliasName, type); + } + + public XStreamUtil(String aliasName, Class type){ + + this.aliasName = aliasName; + this.alias(aliasName, type); + } + + public XStreamUtil(){ + } + + public String getAliasName() { + return aliasName; + } + + public void setAliasName(String aliasName) { + this.aliasName = aliasName; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/CommonName.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/CommonName.java new file mode 100644 index 0000000..b034246 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/CommonName.java @@ -0,0 +1,101 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.shared; + +import java.io.Serializable; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +@Entity +public class CommonName implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1140787822064828769L; + + public final static String ID_FIELD = "id"; + public final static String NAME= "name"; + public final static String LANGUAGE= "language"; + public final static String REFERENCE_RESULTROW_ID = "resultRowId"; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int internalId; + + + protected int id; + + private int resultRowId; + + protected String name; + + protected String language; + + public CommonName(){} + + /** + * @param name + * @param language + */ + public CommonName(String name, String language, int resultRowId) { + this.name = name; + this.language = language; + this.resultRowId = resultRowId; + } + + /** + * @return the name + */ + public String getName() { + return name; + } + + /** + * @param name the name to set + */ + public void setName(String name) { + this.name = name; + } + + /** + * @return the language + */ + public String getLanguage() { + return language; + } + + /** + * @param language the language to set + */ + public void setLanguage(String language) { + this.language = language; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("CommonName [id="); + builder.append(id); + builder.append(", name="); + builder.append(name); + builder.append(", language="); + builder.append(language); + builder.append("]"); + return builder.toString(); + } + + public int getResultRowId() { + return resultRowId; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/Coordinate.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/Coordinate.java new file mode 100644 index 0000000..b832714 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/Coordinate.java @@ -0,0 +1,74 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.shared; + +import java.io.Serializable; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class Coordinate implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -2357675565732391317L; + + protected float latitude; + protected float longitude; + + public Coordinate(){} + + /** + * @param latitude + * @param longitude + */ + public Coordinate(float latitude, float longitude) { + this.latitude = latitude; + this.longitude = longitude; + } + + /** + * @return the latitude + */ + public float getLatitude() { + return latitude; + } + + /** + * @param latitude the latitude to set + */ + public void setLatitude(float latitude) { + this.latitude = latitude; + } + + /** + * @return the longitude + */ + public float getLongitude() { + return longitude; + } + + /** + * @param longitude the longitude to set + */ + public void setLongitude(float longitude) { + this.longitude = longitude; + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("Coordinate [latitude="); + builder.append(latitude); + builder.append(", longitude="); + builder.append(longitude); + builder.append("]"); + return builder.toString(); + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/DataSource.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/DataSource.java new file mode 100644 index 0000000..81f1ee7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/DataSource.java @@ -0,0 +1,89 @@ +package org.gcube.portlets.user.speciesdiscovery.shared; + +import java.io.Serializable; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ + +@Entity +public class DataSource implements Serializable{ + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + protected int internalId; + + private String id; + private String name; + private String description; + + /** + * + * @param id + * @param name + * @param description + */ + public DataSource(String id, String name, String description) { + setId(id); + setName(name); + setDescription(description); + } + + //Used in Data Source advanced option to create the check list + public DataSource(String id, String name){ + setId(id); + setName(name); + } + + public DataSource() {} + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("DataSource [internalId="); + builder.append(internalId); + builder.append(", id="); + builder.append(id); + builder.append(", name="); + builder.append(name); + builder.append(", description="); + builder.append(description); + builder.append("]"); + return builder.toString(); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/DataSourceCapability.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/DataSourceCapability.java new file mode 100644 index 0000000..9b16247 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/DataSourceCapability.java @@ -0,0 +1,77 @@ +package org.gcube.portlets.user.speciesdiscovery.shared; + +import java.io.Serializable; +import java.util.ArrayList; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class DataSourceCapability implements Serializable{ + + /** + * + */ + private static final long serialVersionUID = 1L; + + private ArrayList listFilters; + +// private String id; +// private String name; + private SpeciesCapability capability; + +// +// public DataSourceCapability(String id, String name, ArrayList listFilters) { +// super(); +// this.id=id; +// this.name=name; +// this.listFilters = listFilters; +// +// } + + public DataSourceCapability(SpeciesCapability capability, ArrayList listFilters) { + super(); + this.capability = capability; + this.listFilters = listFilters; + + } + + + public DataSourceCapability() {} + + + +// public String getId() { +// return id; +// } +// +// public void setId(String id) { +// this.id = id; +// } +// +// public String getName() { +// return name; +// } +// +// public void setName(String name) { +// this.name = name; +// } + + public ArrayList getListFilters() { + return listFilters; + } + + public void setListFilters(ArrayList listFilters) { + this.listFilters = listFilters; + } + + public SpeciesCapability getCapability() { + return capability; + } + + public void setCapability(SpeciesCapability capability) { + this.capability = capability; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/DataSourceModel.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/DataSourceModel.java new file mode 100644 index 0000000..83271a6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/DataSourceModel.java @@ -0,0 +1,73 @@ +package org.gcube.portlets.user.speciesdiscovery.shared; + +import java.util.ArrayList; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ + +public class DataSourceModel extends DataSource{ + + private static final long serialVersionUID = 1L; + + private ArrayList listCapabilities; + private DataSourceRepositoryInfo dataSourceRepositoryInfo; + /** + * + * @param id + * @param name + * @param description + * @param listCapabilities + * @param dsInfo + */ + public DataSourceModel(String id, String name, String description, ArrayList listCapabilities, DataSourceRepositoryInfo dsInfo) { + super(id,name,description); + setListCapabilities(listCapabilities); + setDataSourceRepositoryInfo(dsInfo); + } + + private void setDataSourceRepositoryInfo(DataSourceRepositoryInfo dsInfo) { + this.dataSourceRepositoryInfo = dsInfo; + + } + + //Used in Data Source advanced option to create the check list + public DataSourceModel(String id, String name){ + super(id,name); + } + + public DataSourceModel() {} + + public ArrayList getListCapabilities() { + return listCapabilities; + } + + public void setListCapabilities(ArrayList listCapabilities) { + this.listCapabilities = listCapabilities; + } + + public DataSourceRepositoryInfo getDataSourceRepositoryInfo() { + return dataSourceRepositoryInfo; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("DataSourceModel [listCapabilities="); + builder.append(listCapabilities); + builder.append(", dataSourceRepositoryInfo="); + builder.append(dataSourceRepositoryInfo); + builder.append(", getId()="); + builder.append(getId()); + builder.append(", getName()="); + builder.append(getName()); + builder.append(", getDescription()="); + builder.append(getDescription()); + builder.append("]"); + return builder.toString(); + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/DataSourceRepositoryInfo.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/DataSourceRepositoryInfo.java new file mode 100644 index 0000000..5300cd9 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/DataSourceRepositoryInfo.java @@ -0,0 +1,76 @@ +package org.gcube.portlets.user.speciesdiscovery.shared; + +import java.io.Serializable; +import java.util.Map; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ + +public class DataSourceRepositoryInfo implements Serializable{ + + + /** + * + */ + private static final long serialVersionUID = 1L; + + private String logoUrl; + private String pageUrl; + private Map properties; + private String name; + private String description; + + public DataSourceRepositoryInfo(String logoUrl, String pageUrl, Map properties, String description) { + this.logoUrl = logoUrl; + this.pageUrl = pageUrl; + this.properties = properties; + this.description = description; + } + public DataSourceRepositoryInfo() {} + + public String getLogoUrl() { + return logoUrl; + } + public void setLogoUrl(String logoUrl) { + this.logoUrl = logoUrl; + } + public String getPageUrl() { + return pageUrl; + } + public void setPageUrl(String pageUrl) { + this.pageUrl = pageUrl; + } + public Map getProperties() { + return properties; + } + public void setProperties(Map properties) { + this.properties = properties; + } + public String getName() { + return name; + } + public String getDescription() { + return description; + } + public void setDescription(String description) { + this.description = description; + } + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("DataSourceRepositoryInfo [logoUrl="); + builder.append(logoUrl); + builder.append(", pageUrl="); + builder.append(pageUrl); + builder.append(", properties="); + builder.append(properties); + builder.append(", name="); + builder.append(name); + builder.append("]"); + return builder.toString(); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/DownloadState.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/DownloadState.java new file mode 100644 index 0000000..2546e4d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/DownloadState.java @@ -0,0 +1,15 @@ +package org.gcube.portlets.user.speciesdiscovery.shared; + +import java.io.Serializable; + +public enum DownloadState implements Serializable { + PENDING, + ONGOING, + ONGOINGWITHFAILURES, + FAILED, + COMPLETED, + COMPLETEDWITHFAILURES, + SAVING, + SAVED, + SERVICE_UNKNOWN +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/FetchingElement.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/FetchingElement.java new file mode 100644 index 0000000..0f6c7cd --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/FetchingElement.java @@ -0,0 +1,14 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.shared; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface FetchingElement { + + public int getId(); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/FieldVerifier.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/FieldVerifier.java new file mode 100644 index 0000000..d4bbad9 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/FieldVerifier.java @@ -0,0 +1,42 @@ +package org.gcube.portlets.user.speciesdiscovery.shared; + +/** + *

+ * FieldVerifier validates that the name the user enters is valid. + *

+ *

+ * This class is in the shared packing because we use it in both + * the client code and on the server. On the client, we verify that the name is + * valid before sending an RPC request so the user doesn't have to wait for a + * network round trip to get feedback. On the server, we verify that the name is + * correct to ensure that the input is correct regardless of where the RPC + * originates. + *

+ *

+ * When creating a class that is used on both the client and the server, be sure + * that all code is translatable and does not use native JavaScript. Code that + * is note translatable (such as code that interacts with a database or the file + * system) cannot be compiled into client side JavaScript. Code that uses native + * JavaScript (such as Widgets) cannot be run on the server. + *

+ */ +public class FieldVerifier { + + /** + * Verifies that the specified name is valid for our service. + * + * In this example, we only require that the name is at least four + * characters. In your application, you can use more complex checks to ensure + * that usernames, passwords, email addresses, URLs, and other fields have the + * proper syntax. + * + * @param name the name to validate + * @return true if valid, false if invalid + */ + public static boolean isValidName(String name) { + if (name == null) { + return false; + } + return name.length() > 3; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/ItemParameter.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/ItemParameter.java new file mode 100644 index 0000000..f458d7f --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/ItemParameter.java @@ -0,0 +1,78 @@ +package org.gcube.portlets.user.speciesdiscovery.shared; + +import java.io.Serializable; +import java.util.Comparator; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +@Entity +public class ItemParameter implements Serializable{ + + /** + * + */ + private static final long serialVersionUID = 1L; + private String key; + private String value; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + protected int internalId; + + ItemParameter(){} + + public ItemParameter(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static Comparator COMPARATOR = new Comparator() + { + // This is where the sorting happens. + public int compare(ItemParameter o1, ItemParameter o2) + { + return o1.getKey().compareToIgnoreCase(o2.getKey()); + } + }; + + public int getInternalId() { + return internalId; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("ItemParameter [key="); + builder.append(key); + builder.append(", value="); + builder.append(value); + builder.append(", internalId="); + builder.append(internalId); + builder.append("]"); + return builder.toString(); + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/JobOccurrencesModel.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/JobOccurrencesModel.java new file mode 100644 index 0000000..15aa2cf --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/JobOccurrencesModel.java @@ -0,0 +1,301 @@ +package org.gcube.portlets.user.speciesdiscovery.shared; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class JobOccurrencesModel implements Serializable{ + + + /** + * + */ + private static final long serialVersionUID = 1L; + + public static final String JOBINDENTIFIER = "jobIdentifier"; + public static final String JOBNAME = "Name"; + public static final String STARTTIME = "Start Time"; + public static final String PROGRESS = "Progress"; + public static final String ENDTIME = "End Time"; + public static final String ELAPSEDTIME = "Elapsed Time"; + public static final String DATASOURCESASSTRING = "Data Sources"; + public static final String SCIENTIFICNAME = "Scientific Name"; + public static final String PERCENTAGE = "Percentage"; + public static final String DESCRIPTION = "Description"; + public static final String STATUS = "Status"; + public static final String FILEFORMAT = "File format"; //CSV o DARWIN_CORE + public static final String CSVTYPE = "CSV type"; //STANDARD o OPENMODELLER + public static final String BYDATASOURCE = "byDataSource"; + public static final String COMPLETEDENTRY = "Completed Entry"; + public static final String ITEMSNUMBER = "Number of items"; + + private String scientificName; + private String jobIdentifier; + private String jobName; + private DownloadState downloadState; + protected Date startTime; + protected Date endTime; + protected String elapsedTime; + private List dataSources; + private String description; + private float percentage; + private int nodeCompleted; + + private int totalOccurrences; + + private SaveFileFormat fileFormat; + private OccurrencesSaveEnum csvType; + + private boolean byDataSource; + + public JobOccurrencesModel(){ + } + + /** + * + * @param jobIdentifier + * @param currentJobName + */ + public JobOccurrencesModel(String jobIdentifier, String jobName) { + setId(jobIdentifier); + setJobName(jobName); + } + + + public void setJobName(String jobName) { + this.jobName = jobName; + + } + + + /** + * USED FROM GET LIST ON SERVER + * @param jobIdentifier + * @param jobName + * @param description + * @param state + * @param scientificName + * @param dataSources + * @param startTime + * @param endTime + * @param nodeCompleted + * @param totalOccurrence + */ + public JobOccurrencesModel(String jobIdentifier, String jobName, String description, DownloadState state, String scientificName, List listDataSource, Date startTime, Date endTime, int nodeCompleted, int totalOccurrence) { + this(jobIdentifier,jobName); + setScientificName(scientificName); + setStartTime(startTime); + setState(state); + setDataSources(listDataSource); + setEndTime(endTime); + setDescription(description); + setNodeCompleted(nodeCompleted); + setTotalOccurrences(totalOccurrence); + + setPercentage(nodeCompleted*100/totalOccurrence); + } + + /** + * USED FROM CREATE JOB ON CLIENT + * @param jobIdentifier + * @param jobName2 + * @param scientificName2 + * @param dataSourceList + * @param fileFormat + * @param saveEnum + * @param byDataSource + */ + public JobOccurrencesModel(String jobIdentifier,String jobName2,String scientificName2, List dataSourceList,SaveFileFormat fileFormat, OccurrencesSaveEnum csvType,boolean byDataSource, int totalOccurrence) { + this(jobIdentifier,jobName2); + setScientificName(scientificName2); + setDataSources(dataSourceList); + setFileFormat(fileFormat); + setCsvType(csvType); + setByDataSource(byDataSource); + setTotalOccurrences(totalOccurrence); + } + + //By datasource + public JobOccurrencesModel(String jobIdentifier, String jobName2, + String scientificName2, List dataSourceList, + SaveFileFormat fileFormat2, OccurrencesSaveEnum csvType, + boolean byDataSource2) { + this(jobIdentifier,jobName2); + setScientificName(scientificName2); + setDataSources(dataSourceList); + setFileFormat(fileFormat2); + setCsvType(csvType); + setByDataSource(byDataSource2); + } + + public void setScientificName(String scientificName) { + this.scientificName = scientificName; + + } + + public void setId(String jobId){ + this.jobIdentifier = jobId; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getDescription() { + return description; + } + + public String getJobIdentifier(){ + return jobIdentifier; + } + + public String getJobName(){ + return jobName; + } + + public String getScientificName(){ + return scientificName; + } + + public void setDataSources(List dataSources){ + this.dataSources = dataSources; + } + + public List getDataSources(){ + return this.dataSources; + } + + public Date getStartTime(){ + return startTime; + } + + public void setStartTime(Date startTime){ + this.startTime = startTime; + } + + public void setEndTime(Date endTime){ + this.endTime = endTime; + } + + public Date getEndTime(){ + return endTime; + } + + public void setPercentage(float percentage){ + this.percentage = percentage; + } + public float getPercentage(){ + return percentage; + } + + public void setState(DownloadState state){ + this.downloadState = state; + } + + public DownloadState getDownloadState(){ + return downloadState; + } + + public String getElapsedTime() { + return elapsedTime; + } + + public void setElapsedTime(String elapsedTime) { + this.elapsedTime = elapsedTime; + } + + public SaveFileFormat getFileFormat() { + return fileFormat; + } + + public void setFileFormat(SaveFileFormat fileFormat) { + this.fileFormat = fileFormat; + } + + public OccurrencesSaveEnum getCsvType() { + return csvType; + } + + public void setCsvType(OccurrencesSaveEnum csvType) { + this.csvType = csvType; + } + + public boolean isByDataSource() { + return byDataSource; + } + + public void setByDataSource(boolean byDataSource) { + this.byDataSource = byDataSource; + } + + public int getNodeCompleted() { + return nodeCompleted; + } + + public void setNodeCompleted(int nodeCompleted) { + this.nodeCompleted = nodeCompleted; + } + + public List getDataSourcesNameAsString(){ + List listDataSourceName = new ArrayList(); + + if(dataSources!=null){ + for (DataSource dataSource : dataSources) + listDataSourceName.add(dataSource.getName()); + } + + return listDataSourceName; + } + + public int getTotalOccurrences() { + return totalOccurrences; + } + + public void setTotalOccurrences(int totalOccurrences) { + this.totalOccurrences = totalOccurrences; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("JobOccurrencesModel [scientificName="); + builder.append(scientificName); + builder.append(", jobIdentifier="); + builder.append(jobIdentifier); + builder.append(", jobName="); + builder.append(jobName); + builder.append(", downloadState="); + builder.append(downloadState); + builder.append(", startTime="); + builder.append(startTime); + builder.append(", endTime="); + builder.append(endTime); + builder.append(", elapsedTime="); + builder.append(elapsedTime); + builder.append(", dataSources="); + builder.append(dataSources); + builder.append(", description="); + builder.append(description); + builder.append(", percentage="); + builder.append(percentage); + builder.append(", nodeCompleted="); + builder.append(nodeCompleted); + builder.append(", totalOccurrences="); + builder.append(totalOccurrences); + builder.append(", fileFormat="); + builder.append(fileFormat); + builder.append(", csvType="); + builder.append(csvType); + builder.append(", byDataSource="); + builder.append(byDataSource); + builder.append("]"); + return builder.toString(); + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/JobTaxonomyModel.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/JobTaxonomyModel.java new file mode 100644 index 0000000..8b4cfcf --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/JobTaxonomyModel.java @@ -0,0 +1,208 @@ +package org.gcube.portlets.user.speciesdiscovery.shared; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class JobTaxonomyModel implements Serializable { + + + /** + * + */ + private static final long serialVersionUID = -8242850808034222413L; + + private String jobIdentifier; + private String currentJob; + private DownloadState downloadState; + private int failuresNumbers; + protected Date startTime; + protected Date endTime; + protected String elapsedTime; + + public static final String JOBINDENTIFIER = "jobIdentifier"; + public static final String JOBNAME = "Name"; + public static final String STARTTIME = "Start Time"; + public static final String PROGRESS = "Progress"; + public static final String ENDTIME = "End Time"; + public static final String ELAPSEDTIME = "Elapsed Time"; + public static final String INFO = "info"; + public static final String STATUS = "Status"; + public static final String DATASOURCE = "Data Source"; + public static final String SCIENTIFICNAME = "Scientific Name"; + public static final String RANK = "Rank"; + + public static final String ITEMSNUMBER = "Number of Items"; + + + private List listChildStatus = new ArrayList(); + private String dataSource; + private String scientificName; + private String rank; + + public JobTaxonomyModel(){ + } + + private JobTaxonomyModel(String jobIdentifier, String currentJobName) { + setJobsIdentifier(jobIdentifier); + setCurrentJobName(currentJobName); + } + + + //USED FOR CHILDREN + + /** + * + * @param jobIdentifier + * @param currentJobName + * @param state + */ + public JobTaxonomyModel(String jobIdentifier, String currentJobName, DownloadState state) { + this(jobIdentifier,currentJobName); + setDownloadState(state); + setScientificName(scientificName); + setDataSource(dataSource); + } + + //USED FOR GET LIST JOBS + /** + * + * @param jobIdentifier + * @param currentJobName + * @param state + * @param listStatusChild + * @param scientificName + * @param dataSource + */ + public JobTaxonomyModel(String jobIdentifier, String currentJobName, DownloadState state, List listStatusChild, String scientificName, String dataSource, String rank) { + this(jobIdentifier,currentJobName); + setDownloadState(state); + setListChildJobs(listStatusChild); + setScientificName(scientificName); + setDataSource(dataSource); + setRank(rank); + } + + public void setListChildJobs(List listStatusChild) { + this.listChildStatus = listStatusChild; + } + + public String getIdentifier() { + return jobIdentifier; + } + + public void setJobsIdentifier(String identifier) { + this.jobIdentifier = identifier; + } + + public String getName() { + return currentJob; + } + + public void setCurrentJobName(String name) { + this.currentJob = name; + } + + public DownloadState getDownloadState() { + return downloadState; + } + + public void setDownloadState(DownloadState downloadState) { + this.downloadState = downloadState; + } + + public int getFailuresNumbers() { + return failuresNumbers; + } + + public void setFailuresNumbers(int failuresNumbers) { + this.failuresNumbers = failuresNumbers; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public String getElapsedTime() { + return elapsedTime; + } + + public void setElapsedTime(String elapsedTime) { + this.elapsedTime = elapsedTime; + } + + public List getListChildStatus() { + return listChildStatus; + } + + public String getDataSource() { + return dataSource; + } + + public void setDataSource(String dataSource) { + this.dataSource = dataSource; + } + + public String getScientificName() { + return scientificName; + } + + public void setScientificName(String scientificName) { + this.scientificName = scientificName; + } + + public String getRank() { + return rank; + } + + public void setRank(String rank) { + this.rank = rank; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("JobTaxonomyModel [jobIdentifier="); + builder.append(jobIdentifier); + builder.append(", currentJob="); + builder.append(currentJob); + builder.append(", downloadState="); + builder.append(downloadState); + builder.append(", failuresNumbers="); + builder.append(failuresNumbers); + builder.append(", startTime="); + builder.append(startTime); + builder.append(", endTime="); + builder.append(endTime); + builder.append(", elapsedTime="); + builder.append(elapsedTime); + builder.append(", listChildStatus="); + builder.append(listChildStatus); + builder.append(", dataSource="); + builder.append(dataSource); + builder.append(", scientificName="); + builder.append(scientificName); + builder.append(", rank="); + builder.append(rank); + builder.append("]"); + return builder.toString(); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/MainTaxonomicRankEnum.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/MainTaxonomicRankEnum.java new file mode 100644 index 0000000..8559149 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/MainTaxonomicRankEnum.java @@ -0,0 +1,53 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.shared; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public enum MainTaxonomicRankEnum { + + KINGDOM("kingdom"), + PHYLUM("phylum"), + CLASS("class"), + ORDER("order"), + FAMILY("family"), + GENUS("genus"), + SPECIES("species"); + + protected String label; + + MainTaxonomicRankEnum(String label) + { + this.label = label; + } + + /** + * @return the label + */ + public String getLabel() { + return label; + } + + public static List getListLabels(){ + + List listLabels = new ArrayList(); + + for (MainTaxonomicRankEnum item : MainTaxonomicRankEnum.values()) + listLabels.add(item.getLabel()); + + return listLabels; + } + + + public static MainTaxonomicRankEnum valueOfLabel(String label) + { + for (MainTaxonomicRankEnum value:values()) if (value.getLabel().equals(label)) return value; + return null; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/Occurrence.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/Occurrence.java new file mode 100644 index 0000000..544318c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/Occurrence.java @@ -0,0 +1,503 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.shared; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; + + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +@Entity +public class Occurrence implements Serializable, FetchingElement { + + protected static final long serialVersionUID = -8668653643227636763L; + + public final static String ID_FIELD = "id"; + public final static String INSTITUTE_CODE = "institutionCode"; + public final static String COLLECTION_CODE = "collectionCode"; + public final static String CATALOGUE_NUMBER = "catalogueNumber"; + public final static String RECORD_BY = "recordedBy"; + public final static String EVENT_DATE = "eventDate"; + public final static String MODIFIED = "modified"; + public final static String SCIENTIFICNAME = "scientificName"; + public final static String KINGDOM = "kingdom"; + + public final static String FAMILY = "family"; + public final static String LOCALITY = "locality"; + public final static String COUNTRY = "country"; + public final static String CITATION = "citation"; + public final static String DECIMAL_LATITUDE = "decimalLatitude"; + + public final static String DECIMAL_LONGITUDE = "decimalLongitude"; + public final static String BASIS_OF_RECORD = "basisOfRecord"; + public final static String COORDINATE_INMETERS = "coordinateUncertaintyInMeters"; + public final static String MAX_DEPTH = "maxDepth"; + public final static String MIN_DEPTH = "minDepth"; + + public final static String DATAPROVIDER = "dataProvider"; + public final static String DATASET = "dataSet"; + public final static String DATASOURCE = "dataSource"; + + public final static String SERVICE_ID_FIELD = "serviceIdField"; + + public final static String AUTHOR = "author"; //USED + public final static String CREDITS = "credits"; //USED + public final static String LSID = "lsid"; //USED + public final static String PROPERTIES = "properties"; //TODO + + public static final String EXISTS_PROPERTIES = "existsProperties"; //USED + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + protected int id; + protected String institutionCode; + protected String collectionCode; + protected String catalogueNumber; + protected String recordedBy; + protected String eventDate; + protected String modified; + protected String scientificName; + protected String kingdom; + protected String family; + protected String locality; + protected String country; + protected String citation; + protected String decimalLatitude; + protected String decimalLongitude; + protected String coordinateUncertaintyInMeters; + protected String maxDepth; + protected String minDepth; + protected String basisOfRecord; + private String serviceIdField; + protected String dataProvider; + protected String dataSet; + protected String dataSource; + protected String author; + protected String credits; + protected String lsid; + + @OneToMany(cascade=CascadeType.PERSIST, fetch=FetchType.EAGER) + protected List properties = new ArrayList(); + + protected boolean existsProperties = false; + + /** + * + */ + public Occurrence() { + } + + /** + * @return the id + */ + public int getId() { + return id; + } + + /** + * @param id the id to set + */ + public void setId(int id) { + this.id = id; + } + + /** + * @return the institutionCode + */ + public String getInstitutionCode() { + return institutionCode; + } + + /** + * @param institutionCode the institutionCode to set + */ + public void setInstitutionCode(String institutionCode) { + this.institutionCode = institutionCode; + } + + /** + * @return the collectionCode + */ + public String getCollectionCode() { + return collectionCode; + } + + /** + * @param collectionCode the collectionCode to set + */ + public void setCollectionCode(String collectionCode) { + this.collectionCode = collectionCode; + } + + /** + * @return the catalogueNumber + */ + public String getCatalogueNumber() { + return catalogueNumber; + } + + /** + * @param catalogueNumber the catalogueNumber to set + */ + public void setCatalogueNumber(String catalogueNumber) { + this.catalogueNumber = catalogueNumber; + } + + /** + * @return the recordedBy + */ + public String getRecordedBy() { + return recordedBy; + } + + /** + * @param recordedBy the recordedBy to set + */ + public void setRecordedBy(String recordedBy) { + this.recordedBy = recordedBy; + } + + /** + * @return the eventDate + */ + public String getEventDate() { + return eventDate; + } + + /** + * @param eventDate the eventDate to set + */ + public void setEventDate(String eventDate) { + this.eventDate = eventDate; + } + + /** + * @return the modified + */ + public String getModified() { + return modified; + } + + /** + * @param modified the modified to set + */ + public void setModified(String modified) { + this.modified = modified; + } + + /** + * @return the scientificName + */ + public String getScientificName() { + return scientificName; + } + + /** + * @param scientificName the scientificName to set + */ + public void setScientificName(String scientificName) { + this.scientificName = scientificName; + } + + /** + * @return the kingdom + */ + public String getKingdom() { + return kingdom; + } + + /** + * @param kingdom the kingdom to set + */ + public void setKingdom(String kingdom) { + this.kingdom = kingdom; + } + + /** + * @return the family + */ + public String getFamily() { + return family; + } + + /** + * @param family the family to set + */ + public void setFamily(String family) { + this.family = family; + } + + /** + * @return the locality + */ + public String getLocality() { + return locality; + } + + /** + * @param locality the locality to set + */ + public void setLocality(String locality) { + this.locality = locality; + } + + /** + * @return the country + */ + public String getCountry() { + return country; + } + + /** + * @param country the country to set + */ + public void setCountry(String country) { + this.country = country; + } + + /** + * @return the citation + */ + public String getCitation() { + return citation; + } + + /** + * @param citation the citation to set + */ + public void setCitation(String citation) { + this.citation = citation; + } + + /** + * @return the decimalLatitude + */ + public String getDecimalLatitude() { + return decimalLatitude; + } + + /** + * @param decimalLatitude the decimalLatitude to set + */ + public void setDecimalLatitude(String decimalLatitude) { + this.decimalLatitude = decimalLatitude; + } + + /** + * @return the decimalLongitude + */ + public String getDecimalLongitude() { + return decimalLongitude; + } + + /** + * @param decimalLongitude the decimalLongitude to set + */ + public void setDecimalLongitude(String decimalLongitude) { + this.decimalLongitude = decimalLongitude; + } + + /** + * @return the coordinateUncertaintyInMeters + */ + public String getCoordinateUncertaintyInMeters() { + return coordinateUncertaintyInMeters; + } + + /** + * @param coordinateUncertaintyInMeters the coordinateUncertaintyInMeters to set + */ + public void setCoordinateUncertaintyInMeters(String coordinateUncertaintyInMeters) { + this.coordinateUncertaintyInMeters = coordinateUncertaintyInMeters; + } + + /** + * @return the maxDepth + */ + public String getMaxDepth() { + return maxDepth; + } + + /** + * @param maxDepth the maxDepth to set + */ + public void setMaxDepth(String maxDepth) { + this.maxDepth = maxDepth; + } + + /** + * @return the minDepth + */ + public String getMinDepth() { + return minDepth; + } + + /** + * @param minDepth the minDepth to set + */ + public void setMinDepth(String minDepth) { + this.minDepth = minDepth; + } + + /** + * @return the basisOfRecord + */ + public String getBasisOfRecord() { + return basisOfRecord; + } + + /** + * @param basisOfRecord the basisOfRecord to set + */ + public void setBasisOfRecord(String basisOfRecord) { + this.basisOfRecord = basisOfRecord; + } + + public String getServiceId() { + return serviceIdField; + } + + public void setServiceId(String serviceIdField) { + this.serviceIdField = serviceIdField; + } + + public void setDataProvider(String dataProvider) { + this.dataProvider = dataProvider; + } + + public String getDataSet() { + return dataSet; + } + + public void setDataSet(String dataSet) { + this.dataSet = dataSet; + } + + public String getDataSource() { + return dataSource; + } + + public void setDataSource(String dataSource) { + this.dataSource = dataSource; + } + + public String getDataProvider() { + return dataProvider; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public String getCredits() { + return credits; + } + + public void setCredits(String credits) { + this.credits = credits; + } + + public String getLsid() { + return lsid; + } + + public void setLsid(String lsid) { + this.lsid = lsid; + } + + public void setExistsProperties(boolean b) { + this.existsProperties = b; + + } + + public List getProperties() { + return properties; + } + + public void setProperties(List properties) { + this.properties = properties; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("Occurrence [id="); + builder.append(id); + builder.append(", institutionCode="); + builder.append(institutionCode); + builder.append(", collectionCode="); + builder.append(collectionCode); + builder.append(", catalogueNumber="); + builder.append(catalogueNumber); + builder.append(", recordedBy="); + builder.append(recordedBy); + builder.append(", eventDate="); + builder.append(eventDate); + builder.append(", modified="); + builder.append(modified); + builder.append(", scientificName="); + builder.append(scientificName); + builder.append(", kingdom="); + builder.append(kingdom); + builder.append(", family="); + builder.append(family); + builder.append(", locality="); + builder.append(locality); + builder.append(", country="); + builder.append(country); + builder.append(", citation="); + builder.append(citation); + builder.append(", decimalLatitude="); + builder.append(decimalLatitude); + builder.append(", decimalLongitude="); + builder.append(decimalLongitude); + builder.append(", coordinateUncertaintyInMeters="); + builder.append(coordinateUncertaintyInMeters); + builder.append(", maxDepth="); + builder.append(maxDepth); + builder.append(", minDepth="); + builder.append(minDepth); + builder.append(", basisOfRecord="); + builder.append(basisOfRecord); + builder.append(", serviceIdField="); + builder.append(serviceIdField); + builder.append(", dataProvider="); + builder.append(dataProvider); + builder.append(", dataSet="); + builder.append(dataSet); + builder.append(", dataSource="); + builder.append(dataSource); + builder.append(", author="); + builder.append(author); + builder.append(", credits="); + builder.append(credits); + builder.append(", lsid="); + builder.append(lsid); + builder.append(", properties="); + builder.append(properties); + builder.append(", existsProperties="); + builder.append(existsProperties); + builder.append("]"); + return builder.toString(); + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/OccurrenceBatch.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/OccurrenceBatch.java new file mode 100644 index 0000000..96a9338 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/OccurrenceBatch.java @@ -0,0 +1,67 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.shared; + +import java.io.Serializable; +import java.util.ArrayList; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class OccurrenceBatch implements Serializable { + + private static final long serialVersionUID = -8014025568421065573L; + + protected ArrayList occurrences; + protected boolean resultEOF = false; + + public OccurrenceBatch(){} + + /** + * @param occurences + * @param resultEOF + */ + public OccurrenceBatch(ArrayList occurrences) { + this.occurrences = occurrences; + } + /** + * @return the occurences + */ + public ArrayList getOccurrences() { + return occurrences; + } + /** + * @param occurrences the occurences to set + */ + public void setOccurrences(ArrayList occurrences) { + this.occurrences = occurrences; + } + /** + * @return the resultEOF + */ + public boolean isResultEOF() { + return resultEOF; + } + /** + * @param resultEOF the resultEOF to set + */ + public void setResultEOF(boolean resultEOF) { + this.resultEOF = resultEOF; + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("OccurrenceBatch [occurences="); + builder.append(occurrences); + builder.append(", resultEOF="); + builder.append(resultEOF); + builder.append("]"); + return builder.toString(); + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/OccurrencesJob.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/OccurrencesJob.java new file mode 100644 index 0000000..312daee --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/OccurrencesJob.java @@ -0,0 +1,251 @@ +package org.gcube.portlets.user.speciesdiscovery.shared; + +import java.io.Serializable; +import java.util.List; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +@Entity +public class OccurrencesJob implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; + + public final static String ID_FIELD = "id"; + public final static String NAME = "name"; + public final static String DESCRIPTION = "description"; + public final static String STARTTIME = "startTime"; + public final static String ENDTIME = "endTime"; + public final static String SCIENTIFICNAME = "scientificName"; + public static final String STATE = "state"; + public static final String REFSTORAGE = "refStorage"; + public static final String FILEFORMAT = "fileFormat"; //CSV o DARWIN_CORE + public static final String CSVTYPE = "csvType"; //STANDARD o OPENMODELLER + public static final String BYDATASOURCE = "byDataSource"; + public static final String EXPECTEDOCCURRENCE = "expectedOccurrence"; + public static final String RESULTROW_KEYS_AS_XML = "resultRowKeysAsXml"; + +// //@DatabaseField(id = true, columnName = ID_FIELD) + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + protected int internalId; + + protected String id; + protected String name; + protected long startTime; + protected long endTime; + protected String scientificName; + protected String resultRowKeysAsXml; + protected String description; + protected List dataSources; + protected String state; + protected String refStorage; + private String fileFormat; + private String csvType; + private boolean byDataSource; + private int expectedOccurrence; + + + public OccurrencesJob() { + } + + public OccurrencesJob(String id) { + this.id = id; + } + + + /** + * + * @param jobId + * @param jobName + * @param jobDescription + * @param scientificName + * @param dataSourcesAsXml + * @param state + * @param storage + * @param startTime + * @param endTime + * @param fileFormat + * @param csvType + * @param isByDataSource + * @param resultRowKeys + * @param expectedOccurrence + */ + public OccurrencesJob(String jobId, String jobName, String jobDescription, String scientificName, List dataSources, String state, String storage, long startTime, long endTime, String fileFormat, String csvType, boolean isByDataSource, String resultRowKeys, int expectedOccurrence) { + this.id = jobId; + this.name = jobName; + this.startTime = startTime; + this.endTime = endTime; + this.state = state; + this.dataSources = dataSources; + this.scientificName = scientificName; + this.description = jobDescription; + this.csvType = csvType; + this.fileFormat = fileFormat; + this.byDataSource = isByDataSource; + this.resultRowKeysAsXml = resultRowKeys; + this.expectedOccurrence = expectedOccurrence; + } + + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public long getStartTime() { + return startTime; + } + + public void setStartTime(long startTime) { + this.startTime = startTime; + } + + public long getEndTime() { + return endTime; + } + + public void setEndTime(long endTime) { + this.endTime = endTime; + } + + public String getScientificName() { + return scientificName; + } + + public void setScientificName(String scientificName) { + this.scientificName = scientificName; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getRefStorage() { + return refStorage; + } + + public void setRefStorage(String refStorage) { + this.refStorage = refStorage; + } + + public String getFileFormat() { + return fileFormat; + } + + public void setFileFormat(String fileFormat) { + this.fileFormat = fileFormat; + } + + public String getCsvType() { + return csvType; + } + + public void setCsvType(String csvType) { + this.csvType = csvType; + } + + public boolean isByDataSource() { + return byDataSource; + } + + public void setByDataSource(boolean byDataSource) { + this.byDataSource = byDataSource; + } + + public String getResultRowKeysAsXml() { + return resultRowKeysAsXml; + } + + public void setResultRowKeysAsXml(String resultRowKeysAsXml) { + this.resultRowKeysAsXml = resultRowKeysAsXml; + } + + public int getExpectedOccurrence() { + return expectedOccurrence; + } + + public void setExpectedOccurrence(int expectedOccurrence) { + this.expectedOccurrence = expectedOccurrence; + } + + public List getDataSources() { + return dataSources; + } + + public void setDataSources(List dataSources) { + this.dataSources = dataSources; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("OccurrencesJob [internalId="); + builder.append(internalId); + builder.append(", id="); + builder.append(id); + builder.append(", name="); + builder.append(name); + builder.append(", startTime="); + builder.append(startTime); + builder.append(", endTime="); + builder.append(endTime); + builder.append(", scientificName="); + builder.append(scientificName); + builder.append(", resultRowKeysAsXml="); + builder.append(resultRowKeysAsXml); + builder.append(", description="); + builder.append(description); + builder.append(", dataSources="); + builder.append(dataSources); + builder.append(", state="); + builder.append(state); + builder.append(", refStorage="); + builder.append(refStorage); + builder.append(", fileFormat="); + builder.append(fileFormat); + builder.append(", csvType="); + builder.append(csvType); + builder.append(", byDataSource="); + builder.append(byDataSource); + builder.append(", expectedOccurrence="); + builder.append(expectedOccurrence); + builder.append("]"); + return builder.toString(); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/OccurrencesSaveEnum.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/OccurrencesSaveEnum.java new file mode 100644 index 0000000..6b20918 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/OccurrencesSaveEnum.java @@ -0,0 +1,42 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.shared; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public enum OccurrencesSaveEnum { + + STANDARD("standard"), + OPENMODELLER("openModeller"); + + protected String label; + + OccurrencesSaveEnum(String label) + { + this.label = label; + } + + /** + * @return the label + */ + public String getLabel() { + return label; + } + + public static List getListLabels(){ + + List listLabels = new ArrayList(); + + for (OccurrencesSaveEnum item : OccurrencesSaveEnum.values()) + listLabels.add(item.getLabel()); + + return listLabels; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/OccurrencesStatus.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/OccurrencesStatus.java new file mode 100644 index 0000000..73c941e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/OccurrencesStatus.java @@ -0,0 +1,71 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.shared; + +import java.io.Serializable; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class OccurrencesStatus implements Serializable { + + private static final long serialVersionUID = -2234701519362803828L; + + protected boolean resultEOF = false; + protected int size = 0; + + public OccurrencesStatus() + { + + } + + /** + * @param resultEOF + * @param size + */ + public OccurrencesStatus(boolean resultEOF, int size) { + this.resultEOF = resultEOF; + this.size = size; + } + + /** + * @return the resultEOF + */ + public boolean isResultEOF() { + return resultEOF; + } + + /** + * @param resultEOF the resultEOF to set + */ + public void setResultEOF(boolean resultEOF) { + this.resultEOF = resultEOF; + } + + /** + * @return the size + */ + public int getSize() { + return size; + } + + /** + * @param size the size to set + */ + public void setSize(int size) { + this.size = size; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("OccurrencesStatus [resultEOF="); + builder.append(resultEOF); + builder.append(", size="); + builder.append(size); + builder.append("]"); + return builder.toString(); + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/ResultRow.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/ResultRow.java new file mode 100644 index 0000000..7a18e9b --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/ResultRow.java @@ -0,0 +1,642 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.shared; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +@Entity +public class ResultRow implements FetchingElement, SelectableElement, Serializable, TaxonomyProvider { + + private static final long serialVersionUID = 1028839024130840026L; + + public final static String ID_FIELD = "id"; + public final static String SERVICE_ID_FIELD = "serviceIdField"; + public final static String PARENT_FOREIGN_KEY_TAXON = "matchingTaxon"; + public final static String DATAPROVIDER_NAME = "dataProviderName"; + public final static String DATASOURCE_NAME = "dataSourceName"; + public final static String SELECTED = "selected"; + public final static String DATASET_NAME = "dataSetName"; + public final static String DATASET_ID = "dataSetId"; + public final static String DATASET_CITATION = "dataSetCitation"; + public final static String MATCHING_CREDITS = "matchingCredits"; + public final static String EXISTS_COMMONNAME = "existsCommonName"; + public final static String IMAGE_COUNT = "imagesCount"; + public static final String IMAGE_KEY = "imagesKey"; + public static final String LAYERS_COUNT = "layersCount"; + public static final String LAYERS_KEY = "layersKey"; + public static final String OCCURRENCES_COUNT = "occurencesCount"; + public static final String OCCURRENCES_KEY = "occurencesKey"; + public static final String MAP_COUNT = "mapsCount"; + public static final String MAP_KEY = "mapsKey"; + public static final String BASE_TAXON_VALUE = "baseTaxonValue"; + public static final String DATAPROVIDER_ID = "dataProviderId"; + public static final String DATASOURCE_ID = "dataSourceId"; + + public static final String KINGDOM_ID = "kingdomID"; + public static final String PHYLUM_ID = "phylumID"; + public static final String CLASS_ID = "classID"; + public static final String ORDER_ID = "orderID"; + public static final String FAMILY_ID = "familyID"; + public static final String GENUS_ID = "genusID"; + public static final String SPECIES_ID = "speciesID"; + + public final static String AUTHOR = "author"; //USED + public final static String CREDITS = "credits"; //USED + public final static String LSID = "lsid"; //USED + public final static String PROPERTIES = "properties"; //USED + public static final String EXISTS_PROPERTIES = "existsProperties"; //USED + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + protected int id; + + protected boolean selected = false; + protected String dataSourceId; + protected String dataSourceName; + protected String dataProviderId; + protected String dataProviderName; + protected String serviceIdField; + protected String dataSetId; + protected String dataSetName; + protected String dataSetCitation; + protected String matchingCredits; + protected boolean existsCommonName = false; + + @OneToMany(cascade=CascadeType.PERSIST, fetch=FetchType.EAGER) + protected List commonNames = new ArrayList(); + + @OneToMany(cascade=CascadeType.PERSIST, fetch=FetchType.EAGER) + protected List matchingTaxon = new ArrayList(); + + @OneToMany(cascade=CascadeType.PERSIST, fetch=FetchType.EAGER) + protected List properties = new ArrayList(); + + protected int imagesCount; + protected String imagesKey; + protected int layersCount; + protected String layersKey; + protected int occurencesCount; + protected String occurencesKey; + protected int mapsCount; + protected String mapsKey; + protected String baseTaxonValue; + protected String kingdomID; + protected String phylumID; + protected String classID; + protected String orderID; + protected String familyID; + protected String genusID; + protected String speciesID; + protected String author; + protected String credits; + protected String lsid; +// protected String propertiesAsXml; + +// protected ItemParameterList properties; + + protected boolean existsProperties = false; + + + protected ResultRow() { + } + + + /** + * @param id + */ + public ResultRow(int id) { + this.id = id; + } + + /** + * @return the id + */ + public int getId() { + return id; + } + + /** + * @return the id + */ + public String getIdToString() { + return id+""; + } + + + /** + * @return the selected + */ + public boolean isSelected() { + return selected; + } + + /** + * @param selected + * the selected to set + */ + public void setSelected(boolean selected) { + this.selected = selected; + } + + /** + * @return the dataSourceId + */ + public String getDataSourceId() { + return dataSourceId; + } + + + /** + * @param dataSourceId + * the dataSourceId to set + */ + public void setDataSourceId(String dataSourceId) { + this.dataSourceId = dataSourceId; + } + + /** + * @return the dataSourceName + */ + public String getDataSourceName() { + return dataSourceName; + } + + /** + * @param dataSourceName + * the dataSourceName to set + */ + public void setDataSourceName(String dataSourceName) { + this.dataSourceName = dataSourceName; + } + + /** + * @return the dataProviderId + */ + public String getDataProviderId() { + return dataProviderId; + } + + /** + * @param dataProviderId + * the dataProviderId to set + */ + public void setDataProviderId(String dataProviderId) { + this.dataProviderId = dataProviderId; + } + + /** + * @return the dataProviderName + */ + public String getDataProviderName() { + return dataProviderName; + } + + /** + * @param dataProviderName + * the dataProviderName to set + */ + public void setDataProviderName(String dataProviderName) { + this.dataProviderName = dataProviderName; + } + + /** + * @return the dataSetId + */ + public String getDataSetId() { + return dataSetId; + } + + /** + * @param dataSetId + * the dataSetId to set + */ + public void setDataSetId(String dataSetId) { + this.dataSetId = dataSetId; + } + + /** + * @return the dataSetName + */ + public String getDataSetName() { + return dataSetName; + } + + /** + * @param dataSetName + * the dataSetName to set + */ + public void setDataSetName(String dataSetName) { + this.dataSetName = dataSetName; + } + + /** + * @return the dataSetCitation + */ + public String getDataSetCitation() { + return dataSetCitation; + } + + /** + * @param dataSetCitation + * the dataSetCitation to set + */ + public void setDataSetCitation(String dataSetCitation) { + this.dataSetCitation = dataSetCitation; + } + + /** + * @return the imagesCount + */ + public int getImagesCount() { + return imagesCount; + } + + /** + * @param imagesCount + * the imagesCount to set + */ + public void setImagesCount(int imagesCount) { + this.imagesCount = imagesCount; + } + + /** + * @return the layersCount + */ + public int getLayersCount() { + return layersCount; + } + + /** + * @param layersCount + * the layersCount to set + */ + public void setLayersCount(int layersCount) { + this.layersCount = layersCount; + } + + /** + * @return the occurencesCount + */ + public int getOccurencesCount() { + return occurencesCount; + } + + /** + * @param occurencesCount + * the occurencesCount to set + */ + public void setOccurencesCount(int occurencesCount) { + this.occurencesCount = occurencesCount; + } + + /** + * @return the mapsCount + */ + public int getMapsCount() { + return mapsCount; + } + + /** + * @param mapsCount + * the mapsCount to set + */ + public void setMapsCount(int mapsCount) { + this.mapsCount = mapsCount; + } + + /** + * @return the imagesKey + */ + public String getImagesKey() { + return imagesKey; + } + + /** + * @param imagesKey + * the imagesKey to set + */ + public void setImagesKey(String imagesKey) { + this.imagesKey = imagesKey; + } + + /** + * @return the layersKey + */ + public String getLayersKey() { + return layersKey; + } + + /** + * @param layersKey + * the layersKey to set + */ + public void setLayersKey(String layersKey) { + this.layersKey = layersKey; + } + + /** + * @return the occurencesKey + */ + public String getOccurencesKey() { + return occurencesKey; + } + + /** + * @param occurencesKey + * the occurencesKey to set + */ + public void setOccurencesKey(String occurencesKey) { + this.occurencesKey = occurencesKey; + } + + /** + * @return the mapsKey + */ + public String getMapsKey() { + return mapsKey; + } + + /** + * @param mapsKey + * the mapsKey to set + */ + public void setMapsKey(String mapsKey) { + this.mapsKey = mapsKey; + } + + /** + * @return the matchingCredits + */ + public String getMatchingCredits() { + return matchingCredits; + } + + /** + * @param matchingCredits + * the matchingCredits to set + */ + public void setMatchingCredits(String matchingCredits) { + this.matchingCredits = matchingCredits; + } + + public void setBaseTaxonValue(String taxonomyValue) { + this.baseTaxonValue = taxonomyValue; + + } + + public String getBaseTaxonValue() { + return baseTaxonValue; + } + + /** + * + * @return true if there are common names + */ + public boolean existsCommonName() { + return existsCommonName; + } + + /** + * + * @param the + * boolean to set + */ + public void setExistsCommonName(boolean existsCommonName) { + this.existsCommonName = existsCommonName; + } + + public List getCommonNames() { + return commonNames; + } + + public void setCommonNames(List commonNames) { + this.commonNames = commonNames; + } + + public String getKingdomID() { + return kingdomID; + } + + public void setKingdomID(String kingdomID) { + this.kingdomID = kingdomID; + } + + public String getPhylumID() { + return phylumID; + } + + public void setPhylumID(String phylumID) { + this.phylumID = phylumID; + } + + public String getClassID() { + return classID; + } + + public void setClassID(String classID) { + this.classID = classID; + } + + public String getOrderID() { + return orderID; + } + + public void setOrderID(String orderID) { + this.orderID = orderID; + } + + public String getFamilyID() { + return familyID; + } + + public void setFamilyID(String familyID) { + this.familyID = familyID; + } + + public String getGenusID() { + return genusID; + } + + public void setGenusID(String genusID) { + this.genusID = genusID; + } + + public String getSpeciesID() { + return speciesID; + } + + public void setSpeciesID(String speciesID) { + this.speciesID = speciesID; + } + + public String getServiceId() { + return serviceIdField; + } + + public void setServiceId(String serviceIdField) { + this.serviceIdField = serviceIdField; + } + + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public String getCredits() { + return credits; + } + + public void setCredits(String credits) { + this.credits = credits; + } + + public String getLsid() { + return lsid; + } + + public void setLsid(String lsid) { + this.lsid = lsid; + } + + public void setExistsProperties(boolean b) { + this.existsProperties = b; + } + + public boolean existsProperties() { + return existsProperties; + } + + + public List getParents() { + return matchingTaxon; + } + + + public void setMatchingTaxon(List matchingTaxon) { + this.matchingTaxon = matchingTaxon; + } + + + public String getServiceIdField() { + return serviceIdField; + } + + + public boolean isExistsCommonName() { + return existsCommonName; + } + + + public List getProperties() { + return properties; + } + + + public boolean isExistsProperties() { + return existsProperties; + } + + + public void setProperties(List properties) { + this.properties = properties; + } + + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("ResultRow [id="); + builder.append(id); + builder.append(", selected="); + builder.append(selected); + builder.append(", dataSourceId="); + builder.append(dataSourceId); + builder.append(", dataSourceName="); + builder.append(dataSourceName); + builder.append(", dataProviderId="); + builder.append(dataProviderId); + builder.append(", dataProviderName="); + builder.append(dataProviderName); + builder.append(", serviceIdField="); + builder.append(serviceIdField); + builder.append(", dataSetId="); + builder.append(dataSetId); + builder.append(", dataSetName="); + builder.append(dataSetName); + builder.append(", dataSetCitation="); + builder.append(dataSetCitation); + builder.append(", matchingCredits="); + builder.append(matchingCredits); + builder.append(", existsCommonName="); + builder.append(existsCommonName); + builder.append(", commonNames="); + builder.append(commonNames); + builder.append(", matchingTaxon="); + builder.append(matchingTaxon); + builder.append(", properties="); + builder.append(properties); + builder.append(", imagesCount="); + builder.append(imagesCount); + builder.append(", imagesKey="); + builder.append(imagesKey); + builder.append(", layersCount="); + builder.append(layersCount); + builder.append(", layersKey="); + builder.append(layersKey); + builder.append(", occurencesCount="); + builder.append(occurencesCount); + builder.append(", occurencesKey="); + builder.append(occurencesKey); + builder.append(", mapsCount="); + builder.append(mapsCount); + builder.append(", mapsKey="); + builder.append(mapsKey); + builder.append(", baseTaxonValue="); + builder.append(baseTaxonValue); + builder.append(", kingdomID="); + builder.append(kingdomID); + builder.append(", phylumID="); + builder.append(phylumID); + builder.append(", classID="); + builder.append(classID); + builder.append(", orderID="); + builder.append(orderID); + builder.append(", familyID="); + builder.append(familyID); + builder.append(", genusID="); + builder.append(genusID); + builder.append(", speciesID="); + builder.append(speciesID); + builder.append(", author="); + builder.append(author); + builder.append(", credits="); + builder.append(credits); + builder.append(", lsid="); + builder.append(lsid); + builder.append(", existsProperties="); + builder.append(existsProperties); + builder.append("]"); + return builder.toString(); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/SaveFileFormat.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/SaveFileFormat.java new file mode 100644 index 0000000..6bca610 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/SaveFileFormat.java @@ -0,0 +1,18 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.shared; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public enum SaveFileFormat { + + //OCCURRENCES + CSV, + DARWIN_CORE, + + //TAXONOMY + DARWIN_CORE_ARCHIVE; +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/SearchFilters.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/SearchFilters.java new file mode 100644 index 0000000..5a11e17 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/SearchFilters.java @@ -0,0 +1,147 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.shared; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class SearchFilters implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -608272336048083389L; + + protected Coordinate upperBound; + protected Coordinate lowerBound; + protected Date fromDate; + protected Date toDate; + private List listDataSources; + private String classificationGroupByRank; + private SpeciesCapability resultType; + + + public SearchFilters(){}; + + /** + * @param upperBound + * @param lowerBound + * @param fromDate + * @param toDate + * @param listDataSources + * @param classificationGroupRank + */ + public SearchFilters(Coordinate upperBound, Coordinate lowerBound, Date fromDate, Date toDate, List listDataSources, String classificationGroupRank, SpeciesCapability resultType) { + this.upperBound = upperBound; + this.lowerBound = lowerBound; + this.fromDate = fromDate; + this.toDate = toDate; + this.listDataSources = listDataSources; + this.classificationGroupByRank = classificationGroupRank; + this.resultType = resultType; + } + + /** + * @return the upperBound + */ + public Coordinate getUpperBound() { + return upperBound; + } + + /** + * @param upperBound the upperBound to set + */ + public void setUpperBound(Coordinate upperBound) { + this.upperBound = upperBound; + } + + /** + * @return the lowerBound + */ + public Coordinate getLowerBound() { + return lowerBound; + } + + /** + * @param lowerBound the lowerBound to set + */ + public void setLowerBound(Coordinate lowerBound) { + this.lowerBound = lowerBound; + } + + /** + * @return the fromDate + */ + public Date getFromDate() { + return fromDate; + } + + /** + * @param fromDate the fromDate to set + */ + public void setFromDate(Date fromDate) { + this.fromDate = fromDate; + } + + /** + * @return the toDate + */ + public Date getToDate() { + return toDate; + } + + /** + * @param toDate the toDate to set + */ + public void setToDate(Date toDate) { + this.toDate = toDate; + } + + + public List getListDataSources() { + return listDataSources; + } + + public String getClassificationGroupByRank() { + return classificationGroupByRank; + } + + public SpeciesCapability getResultType() { + return resultType; + } + + public void setResultType(SpeciesCapability resultType) { + this.resultType = resultType; + } + + public void setListDataSources(List listDataSources) { + this.listDataSources = listDataSources; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("SearchFilters [upperBound="); + builder.append(upperBound); + builder.append(", lowerBound="); + builder.append(lowerBound); + builder.append(", fromDate="); + builder.append(fromDate); + builder.append(", toDate="); + builder.append(toDate); + builder.append(", listDataSources="); + builder.append(listDataSources); + builder.append(", classificationGroupByRank="); + builder.append(classificationGroupByRank); + builder.append(", resultType="); + builder.append(resultType); + builder.append("]"); + return builder.toString(); + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/SearchResult.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/SearchResult.java new file mode 100644 index 0000000..ead0d56 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/SearchResult.java @@ -0,0 +1,48 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.shared; + +import java.io.Serializable; +import java.util.ArrayList; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + * @param + */ +public class SearchResult implements Serializable { + + private static final long serialVersionUID = -8014025568421065573L; + protected ArrayList resultsRow; + + public SearchResult(){} + + /** + * @param results + */ + public SearchResult(ArrayList results) { + this.resultsRow = results; + } + + + /** + * @return the results + */ + public ArrayList getResults() { + return resultsRow; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("SearchResult [resultsRow="); + builder.append(resultsRow); + builder.append("]"); + return builder.toString(); + } + + + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/SearchResultType.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/SearchResultType.java new file mode 100644 index 0000000..48f22fe --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/SearchResultType.java @@ -0,0 +1,36 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.shared; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public enum SearchResultType { + + + SPECIES_PRODUCT("RESULTITEM", "Occurrences"), + TAXONOMY_ITEM("TAXONOMYITEM", "Taxonomy"), + OCCURRENCE_POINT("OCCURRENCESPOINTS", "OccurrencesPoints"); + + private String id; + private String name; + + + private SearchResultType(String id, String name) { + this.id = id; + this.name = name; + } + + + public String getId() { + return id; + } + + + public String getName() { + return name; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/SearchServiceException.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/SearchServiceException.java new file mode 100644 index 0000000..18135a4 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/SearchServiceException.java @@ -0,0 +1,22 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.shared; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class SearchServiceException extends Exception { + + private static final long serialVersionUID = 7385940364610061433L; + + public SearchServiceException(){} + + /** + * @param message + */ + public SearchServiceException(String message) { + super(message); + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/SearchStatus.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/SearchStatus.java new file mode 100644 index 0000000..9b04438 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/SearchStatus.java @@ -0,0 +1,84 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.shared; + +import java.io.Serializable; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class SearchStatus implements Serializable { + + private static final long serialVersionUID = -2234701519362803828L; + + protected boolean resultEOF = false; + protected int size = 0; + protected boolean isMaxSize = false; + + public SearchStatus() + { + + } + + /** + * @param resultEOF + * @param size + */ + public SearchStatus(boolean resultEOF, int size, boolean isMaxSize) { + this.resultEOF = resultEOF; + this.size = size; + this.isMaxSize = isMaxSize; + } + + /** + * @return the resultEOF + */ + public boolean isResultEOF() { + return resultEOF; + } + + /** + * @param resultEOF the resultEOF to set + */ + public void setResultEOF(boolean resultEOF) { + this.resultEOF = resultEOF; + } + + /** + * @return the size + */ + public int getSize() { + return size; + } + + /** + * @param size the size to set + */ + public void setSize(int size) { + this.size = size; + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("SearchStatus [resultEOF="); + builder.append(resultEOF); + builder.append(", size="); + builder.append(size); + builder.append("]"); + return builder.toString(); + } + + public boolean isMaxSize() { + return isMaxSize; + } + + public void setIsMaxSize(boolean isMaxSize) { + this.isMaxSize = isMaxSize; + } +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/SearchType.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/SearchType.java new file mode 100644 index 0000000..88370c8 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/SearchType.java @@ -0,0 +1,28 @@ +package org.gcube.portlets.user.speciesdiscovery.shared; + +public enum SearchType { + + BY_SCIENTIFIC_NAME("SCIENTIFIC_NAME", "Scientific_Name"), + BY_COMMON_NAME("COMMON_NAME", "Common_Name"), + BY_QUERY("QUERY", "Query"); + + private String id; + private String name; + + SearchType() { + } + + private SearchType(String id, String name) { + this.id = id; + this.name = name; + } + + public String getId() { + return id; + } + + public String getName() { + return name; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/SelectableElement.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/SelectableElement.java new file mode 100644 index 0000000..d7a743c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/SelectableElement.java @@ -0,0 +1,16 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.shared; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface SelectableElement extends FetchingElement { + + public void setSelected(boolean selected); + + public boolean isSelected(); + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/SpeciesCapability.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/SpeciesCapability.java new file mode 100644 index 0000000..8320926 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/SpeciesCapability.java @@ -0,0 +1,47 @@ +package org.gcube.portlets.user.speciesdiscovery.shared; + + +public enum SpeciesCapability { + + //Filters + FROMDATE("FROMDATE", "Date From"), + TODATE("DATETO", "Date To"), + LOWERBOUND("LOWERBOUND", "Lower Bound"), + UPPERBOUND("UPPERBOUND", "Upper Bound"), + + //Capabilities + RESULTITEM("RESULTITEM", "Occurrences"), + TAXONOMYITEM("TAXONOMYITEM", "Taxonomy"), + OCCURRENCESPOINTS("OCCURRENCESPOINTS", "OccurrencesPoints"), + + + SYNONYMS("SYNONYMS", "Synonyms"), + NAMESMAPPING("NAMESMAPPING", "Names Mapping"), + + UNKNOWN("UNKNOWN", "unknown"); + + private String id; + private String name; + + SpeciesCapability(){ + } + + + private SpeciesCapability(String id, String name) { + this.id = id; + this.name = name; + } + + + public String getId() { + return id; + } + + + public String getName() { + return name; + } + + + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/Taxon.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/Taxon.java new file mode 100644 index 0000000..fb977bf --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/Taxon.java @@ -0,0 +1,125 @@ +package org.gcube.portlets.user.speciesdiscovery.shared; + +import java.io.Serializable; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +@Entity +public class Taxon implements Serializable, FetchingElement, TaxonomyInterface { + + private static final long serialVersionUID = -3579358036639552802L; + + public final static String ID_FIELD = "id"; + public final static String PARENTFOREIGN_KEY_TAXON = "parent"; + public final static String RANK = "rank"; + public static final String NAME = "name"; + public static final String ACCORDING_TO = "accordingTo"; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + protected int id; + + protected String name; + protected String accordingTo; + protected String rank; + + public Taxon() { + } + + public Taxon(int id) { + this.id = id; + } + + /** + * Creates a new Taxon. + * + * @param id + * the Taxon id. + * @param name + * the Taxon name. + * @param accordingTo + * the Taxon name author. + * @param rank + * the Taxon rank. + */ + public Taxon(int id, String name, String accordingTo, String rank) { + this.id = id; + this.name = name; + this.accordingTo = accordingTo; + this.rank = rank; + } + + + /** + * {@inheritDoc} + */ + + public String getTaxonId() { + return id+""; + } + + /** + * {@inheritDoc} + */ + + public String getName() { + return name; + } + + /** + * {@inheritDoc} + */ + + public String getAccordingTo() { + return accordingTo; + } + + /** + * {@inheritDoc} + */ + @Override + public String getRank() { + return rank; + } + + public void setName(String name) { + this.name = name; + } + + public void setRank(String rank) { + this.rank = rank; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("Taxon [id="); + builder.append(id); + builder.append(", name="); + builder.append(name); + builder.append(", accordingTo="); + builder.append(accordingTo); + builder.append(", rank="); + builder.append(rank); + builder.append("]"); + return builder.toString(); + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/TaxonChildren.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/TaxonChildren.java new file mode 100644 index 0000000..a5a04be --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/TaxonChildren.java @@ -0,0 +1,72 @@ +package org.gcube.portlets.user.speciesdiscovery.shared; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +public class TaxonChildren implements Serializable{ + + /** + * + */ + private static final long serialVersionUID = 1L; + + List listChildren = new ArrayList(); + int startIndex = UNDEFINED; + int offset = UNDEFINED; + int fullSize = UNDEFINED; + public static final int UNDEFINED = -1; + + public TaxonChildren(int startIndex, int endIndex, int fullSize, List listChildren) { + this.startIndex = startIndex; + this.offset = endIndex; + this.fullSize = fullSize; + this.listChildren = listChildren; + } + + public TaxonChildren() { + } + + + public static long getSerialversionuid() { + return serialVersionUID; + } + + public List getListChildren() { + return listChildren; + } + + public int getStartIndex() { + return startIndex; + } + + public int getOffset() { + return offset; + } + + public int getFullSize() { + return fullSize; + } + + public static int getUndefined() { + return UNDEFINED; + } + + + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("TaxonChildren [listChildren="); + builder.append(listChildren); + builder.append(", startItem="); + builder.append(startIndex); + builder.append(", offset="); + builder.append(offset); + builder.append(", fullSize="); + builder.append(fullSize); + builder.append("]"); + return builder.toString(); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/TaxonomyInterface.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/TaxonomyInterface.java new file mode 100644 index 0000000..6adaaeb --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/TaxonomyInterface.java @@ -0,0 +1,31 @@ +package org.gcube.portlets.user.speciesdiscovery.shared; + + +public interface TaxonomyInterface { + +// /** +// * @return the parent +// */ +// public List getParent(); + + /** + * @return the id + */ + public abstract String getTaxonId(); + + /** + * @return the name + */ + public abstract String getName(); + + /** + * @return the accordingTo + */ + public abstract String getAccordingTo(); + + /** + * @return the rank + */ + public abstract String getRank(); + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/TaxonomyJob.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/TaxonomyJob.java new file mode 100644 index 0000000..547276e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/TaxonomyJob.java @@ -0,0 +1,189 @@ +package org.gcube.portlets.user.speciesdiscovery.shared; + +import java.io.Serializable; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +@Entity +public class TaxonomyJob implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -8525420257121366179L; + + public final static String ID_FIELD = "jobId"; + public final static String NAME = "descriptiveName"; + + public final static String STARTTIME = "startTime"; + public final static String ENDTIME = "endTime"; + + public final static String DATASOURCE_NAME = "dataSourceName"; + public final static String SCIENTIFICNAME = "scientificName"; + + public final static String RANK = "rank"; + + public static final String TAXONOMYID = "taxonomyId"; + + public static final String STATE = "state"; + + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + protected int internalId; + + protected String jobId; + + protected String descriptiveName; + + protected long startTime; + + protected long endTime; + + protected String scientificName; + + protected String dataSourceName; + + protected String rank; + + protected String taxonomyId; + + protected String state; + + public TaxonomyJob() { + } + + public TaxonomyJob(String id) { + this.jobId = id; + } + + + /** + * + * @param jobId + * @param state + * @param descriptiveName + * @param scientificName + * @param dataSourceName + * @param rank + * @param startTime + * @param endTime + * @param taxonomyId + */ + public TaxonomyJob(String jobId, String state, String descriptiveName, String scientificName, String dataSourceName, String rank, long startTime, long endTime, String taxonomyId) { + this.jobId = jobId; + this.descriptiveName = descriptiveName; + this.startTime = startTime; + this.endTime = endTime; + + this.state = state; + + this.scientificName = scientificName; + this.dataSourceName = dataSourceName; + + this.rank = rank; + + this.taxonomyId = taxonomyId; + } + + + public String getId() { + return jobId; + } + + public void setId(String id) { + this.jobId = id; + } + + public long getStartTime() { + return startTime; + } + + public void setStartTime(long startTime) { + this.startTime = startTime; + } + + public long getEndTime() { + return endTime; + } + + public void setEndTime(long endTime) { + this.endTime = endTime; + } + + public String getScientificName() { + return scientificName; + } + + public void setScientificName(String scientificName) { + this.scientificName = scientificName; + } + + public String getDescriptiveName() { + return descriptiveName; + } + + public void setDescriptiveName(String descriptiveName) { + this.descriptiveName = descriptiveName; + } + + public String getDataSourceName() { + return dataSourceName; + } + + public String getRank() { + return rank; + } + + public String getTaxonomyId() { + return taxonomyId; + } + + public void setTaxonomyId(String taxonomyId) { + this.taxonomyId = taxonomyId; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("TaxonomyJob [internalId="); + builder.append(internalId); + builder.append(", jobId="); + builder.append(jobId); + builder.append(", descriptiveName="); + builder.append(descriptiveName); + builder.append(", startTime="); + builder.append(startTime); + builder.append(", endTime="); + builder.append(endTime); + builder.append(", scientificName="); + builder.append(scientificName); + builder.append(", dataSourceName="); + builder.append(dataSourceName); + builder.append(", rank="); + builder.append(rank); + builder.append(", taxonomyId="); + builder.append(taxonomyId); + builder.append(", state="); + builder.append(state); + builder.append("]"); + return builder.toString(); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/TaxonomyProvider.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/TaxonomyProvider.java new file mode 100644 index 0000000..36fb564 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/TaxonomyProvider.java @@ -0,0 +1,25 @@ +package org.gcube.portlets.user.speciesdiscovery.shared; + +import java.util.List; + +public interface TaxonomyProvider { + + public List getParents(); + + public String getBaseTaxonValue(); + + public void setClassID(String value); + + public void setFamilyID(String value); + + public void setGenusID(String value); + + public void setKingdomID(String value); + + public void setOrderID(String value); + + public void setPhylumID(String value); + + public void setSpeciesID(String value); + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/TaxonomyRow.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/TaxonomyRow.java new file mode 100644 index 0000000..6841ab5 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/TaxonomyRow.java @@ -0,0 +1,494 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.shared; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +@Entity +//@Customizer(org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.TaxonomyCustomizer.class) +public class TaxonomyRow implements FetchingElement, Serializable, TaxonomyInterface, TaxonomyProvider, SelectableElement { + + private static final long serialVersionUID = 1028839024130840026L; + + public final static String ID_FIELD = "id"; + public final static String DATAPROVIDER_NAME = "dataProviderName"; + public static final String BASE_TAXON_VALUE = "baseTaxonValue"; + public static final String DATAPROVIDER_ID = "dataProviderId"; + public final static String RANK = "rank"; + public static final String NAME = "name"; + public static final String STATUSREFID = "statusRefId"; + public static final String STATUSNAME = "statusName"; + public static final String DATEMODIFIED = "dateModified"; + public final static String PARENT_ID = "parentID"; + public final static String IS_PARENT = "isParent"; + public final static String DATASET_CITATION = "dataSetCitation"; + public final static String EXISTS_COMMONNAME = "existsCommonName"; + public final static String SELECTED = "selected"; + public final static String MATCHING_ACCORDING_TO = "matchingAccording"; + public final static String SERVICE_ID_FIELD = "serviceIdField"; + public final static String STATUS_REMARKS = "statusRemarks"; + + public final static String AUTHOR = "author"; //USED + public final static String CREDITS = "credits"; //USED + public final static String LSID = "lsid"; //USED + public final static String PROPERTIES = "properties"; //TODO + public static final String PROPERTIESASXML = "propertiesAsXml"; + + public static final String KINGDOM_ID = "kingdomID"; + public static final String PHYLUM_ID = "phylumID"; + public static final String CLASS_ID = "classID"; + public static final String ORDER_ID = "orderID"; + public static final String FAMILY_ID = "familyID"; + public static final String GENUS_ID = "genusID"; + public static final String SPECIES_ID = "speciesID"; + + public static final String EXISTS_PROPERTIES = "existsProperties"; //USED + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + protected int id; + protected String author; + protected String credits; + protected String lsid; + + protected String name; + protected String serviceIdField; + protected boolean selected = false; + protected String dataProviderId; + protected String dataProviderName; + protected String dataSetCitation; + protected String matchingAccording; + protected String baseTaxonValue; + protected String rank; + private String statusRefId; + private String statusName; + private String dateModified; + protected String kingdomID; + protected String phylumID; + protected String classID; + protected String orderID; + protected String familyID; + protected String genusID; + protected String speciesID; + protected boolean existsCommonName = false; + protected String statusRemarks; + protected boolean existsProperties = false; + + private boolean isParent = false; + + @OneToMany(cascade=CascadeType.PERSIST, fetch=FetchType.EAGER) + protected List commonNames = new ArrayList(); + + @OneToMany(cascade=CascadeType.PERSIST, fetch=FetchType.EAGER) + protected List properties = new ArrayList(); + + @OneToMany(cascade=CascadeType.PERSIST, fetch=FetchType.EAGER) + protected List parents; + + protected String parentID; + + protected TaxonomyRow() { + + + } + + /** + * @param id + */ + public TaxonomyRow(int id) { + this.id = id; + } + + /** + * @return the id + */ + public int getId() { + return id; + } + + /** + * @return the id + */ + public String getIdToString() { + return id+""; + } + + /** + * @return the selected + */ + public boolean isSelected() { + return selected; + } + + /** + * @param selected + * the selected to set + */ + public void setSelected(boolean selected) { + this.selected = selected; + } + + /** + * @return the dataProviderId + */ + public String getDataProviderId() { + return dataProviderId; + } + + /** + * @param dataProviderId + * the dataProviderId to set + */ + public void setDataProviderId(String dataProviderId) { + this.dataProviderId = dataProviderId; + } + + /** + * @return the dataProviderName + */ + public String getDataProviderName() { + return dataProviderName; + } + + /** + * @param dataProviderName + * the dataProviderName to set + */ + public void setDataProviderName(String dataProviderName) { + this.dataProviderName = dataProviderName; + } + + + public List getCommonNames() { +// return new ArrayList(commonNames); + return commonNames; + } + + public void setCommonNames(List commonNames) { + this.commonNames = commonNames; + } + + /** + * @return the dataSetCitation + */ + public String getDataSetCitation() { + return dataSetCitation; + } + + /** + * @param dataSetCitation + * the dataSetCitation to set + */ + public void setDataSetCitation(String dataSetCitation) { + this.dataSetCitation = dataSetCitation; + } + + + public void setBaseTaxonValue(String taxonomyValue) { + this.baseTaxonValue = taxonomyValue; + + } + + public String getBaseTaxonValue() { + return baseTaxonValue; + } + + public String getRank() { + return rank; + } + + public void setRank(String rank) { + this.rank = rank; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public void setStatusRefId(String statusRefId) { + this.statusRefId = statusRefId; + + } + + public void setStatusName(String statusName) { + this.statusName = statusName; + + } + + public void setDateModified(String dateModified) { + this.dateModified = dateModified; + + } + + public void setParent(List parent) { + this.parents = parent; + } + + @Override + public List getParents() { + return parents; + } + + public String getStatusRefId() { + return statusRefId; + } + + public String getStatusName() { + return statusName; + } + + public String getDateModified() { + return dateModified; + } + + public String getKingdomID() { + return kingdomID; + } + + public void setKingdomID(String kingdomID) { + this.kingdomID = kingdomID; + } + + public String getPhylumID() { + return phylumID; + } + + public void setPhylumID(String phylumID) { + this.phylumID = phylumID; + } + + public String getClassID() { + return classID; + } + + public void setClassID(String classID) { + this.classID = classID; + } + + public String getOrderID() { + return orderID; + } + + public void setOrderID(String orderID) { + this.orderID = orderID; + } + + public String getFamilyID() { + return familyID; + } + + public void setFamilyID(String familyID) { + this.familyID = familyID; + } + + public String getGenusID() { + return genusID; + } + + public void setGenusID(String genusID) { + this.genusID = genusID; + } + + public String getSpeciesID() { + return speciesID; + } + + public void setSpeciesID(String speciesID) { + this.speciesID = speciesID; + } + + @Override + public String getTaxonId() { + // FIXME + return ""+id; + } + + @Override + public String getAccordingTo() { + return this.matchingAccording; + } + + /** + * + * @return true if there are common names + */ + public boolean existsCommonName() { + return existsCommonName; + } + + /** + * + * @param the + * boolean to set + */ + public void setExistsCommonName(boolean existsCommonName) { + this.existsCommonName = existsCommonName; + } + + public void setMatchingAccording(String matchingAccording) { + this.matchingAccording = matchingAccording; + } + + public String getParentID() { + return parentID; + } + + public void setParentID(String parentID) { + this.parentID = parentID; + } + + public String getServiceId() { + return serviceIdField; + } + + public void setServiceId(String serviceIdField) { + this.serviceIdField = serviceIdField; + } + + public String getStatusRemarks() { + return statusRemarks; + } + + public void setStatusRemarks(String statusRemarks) { + this.statusRemarks = statusRemarks; + } + + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public String getCredits() { + return credits; + } + + public void setCredits(String credits) { + this.credits = credits; + } + + public String getLsid() { + return lsid; + } + + public void setLsid(String lsid) { + this.lsid = lsid; + } + + public List getProperties() { +// return new ArrayList(properties); + return properties; + } + + public void setProperties(List properties) { + this.properties = properties; + } + + public void setExistsProperties(boolean b) { + this.existsProperties = b; + } + public boolean existsProperties() { + return existsProperties; + } + + public boolean isParent() { + return isParent; + } + + public void setParent(boolean isParent) { + this.isParent = isParent; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("TaxonomyRow [id="); +// builder.append(id); +// builder.append(", author="); +// builder.append(author); +// builder.append(", credits="); +// builder.append(credits); +// builder.append(", lsid="); +// builder.append(lsid); +// builder.append(", name="); +// builder.append(name); +// builder.append(", serviceIdField="); +// builder.append(serviceIdField); +// builder.append(", selected="); +// builder.append(selected); +// builder.append(", dataProviderId="); +// builder.append(dataProviderId); +// builder.append(", dataProviderName="); +// builder.append(dataProviderName); +// builder.append(", dataSetCitation="); +// builder.append(dataSetCitation); +// builder.append(", matchingAccording="); +// builder.append(matchingAccording); +// builder.append(", baseTaxonValue="); +// builder.append(baseTaxonValue); +// builder.append(", rank="); +// builder.append(rank); +// builder.append(", statusRefId="); +// builder.append(statusRefId); +// builder.append(", statusName="); +// builder.append(statusName); +// builder.append(", dateModified="); +// builder.append(dateModified); +// builder.append(", kingdomID="); +// builder.append(kingdomID); +// builder.append(", phylumID="); +// builder.append(phylumID); +// builder.append(", classID="); +// builder.append(classID); +// builder.append(", orderID="); +// builder.append(orderID); +// builder.append(", familyID="); +// builder.append(familyID); +// builder.append(", genusID="); +// builder.append(genusID); +// builder.append(", speciesID="); +// builder.append(speciesID); +// builder.append(", existsCommonName="); +// builder.append(existsCommonName); +// builder.append(", statusRemarks="); +// builder.append(statusRemarks); +// builder.append(", existsProperties="); +// builder.append(existsProperties); +// builder.append(", isParent="); +// builder.append(isParent); + builder.append(", commonNames="); + builder.append(commonNames); + builder.append(", properties="); + builder.append(properties); +// builder.append(", parents="); +// builder.append(parents); + builder.append(", parentID="); + builder.append(parentID); + builder.append("]"); + return builder.toString(); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/cluster/ClusterCommonNameDataSource.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/cluster/ClusterCommonNameDataSource.java new file mode 100644 index 0000000..11c9551 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/cluster/ClusterCommonNameDataSource.java @@ -0,0 +1,113 @@ +package org.gcube.portlets.user.speciesdiscovery.shared.cluster; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.gcube.portlets.user.speciesdiscovery.shared.CommonName; +import org.gcube.portlets.user.speciesdiscovery.shared.FetchingElement; +import org.gcube.portlets.user.speciesdiscovery.shared.ResultRow; +import org.gcube.portlets.user.speciesdiscovery.shared.TaxonomyRow; +import org.gcube.portlets.user.speciesdiscovery.shared.util.NormalizeString; + +public class ClusterCommonNameDataSource implements Serializable{ + + /** + * + */ + private static final long serialVersionUID = -4602671242562941238L; + + private HashMap> hashMapCommonNameDataSources = new HashMap>(); + private ArrayList listDataSourcesFound = new ArrayList(); + + public ClusterCommonNameDataSource() { + } + + //UPDATE A HASH MAP WITH ALL COMMON NAME - DATA SORUCES. + public void updateHashCommonNamesDataSources(T item) { + + if(item instanceof ResultRow) + updateHashCommonNamesDataSources((ResultRow) item); + + else if (item instanceof TaxonomyRow) + updateHashCommonNamesDataSources((TaxonomyRow) item); + + } + + //UPDATE A HASH MAP WITH ALL COMMON NAME - DATA SORUCES. THIS IS USED FOR COMMON NAME + private void updateHashCommonNamesDataSources(TaxonomyRow row) { + + addDataSourceIfNotExists(row.getDataProviderName()); + updateHashCommonNamesDataSources(row.getDataProviderName(), row.getCommonNames()); + + } + + + //UPDATE A HASH MAP WITH ALL COMMON NAME - DATA SORUCES. THIS IS USED FOR COMMON NAMES + private void updateHashCommonNamesDataSources(ResultRow row) { + + addDataSourceIfNotExists(row.getDataSourceName()); + updateHashCommonNamesDataSources(row.getDataSourceName(), row.getCommonNames()); + } + + private void addDataSourceIfNotExists(String dataSourceName){ + + if(listDataSourcesFound.indexOf(dataSourceName)==-1) + listDataSourcesFound.add(dataSourceName); + + } + + + //UPDATE A HASH MAP WITH ALL COMMON NAME - DATA SORUCES. THIS IS USED FOR COMMON NAME + private void updateHashCommonNamesDataSources(String dataProviderName, List listCommonName) { + + if(listCommonName!=null){ + + //CREATE HASH CONTAINS COMMON NAME + for (CommonName comName : listCommonName) { + + String commonNameKey = comName.getName() + " (" +comName.getLanguage() + ")"; +// System.out.println("common name: "+comName.getName()); +// System.out.println("common name key: "+commonNameKey); + + ArrayList dataSources = hashMapCommonNameDataSources.get(NormalizeString.lowerCaseUpFirstChar(commonNameKey)); + + if(dataSources==null){ + + dataSources=new ArrayList(); + + dataSources.add(dataProviderName); + + hashMapCommonNameDataSources.put(NormalizeString.lowerCaseUpFirstChar(commonNameKey), dataSources); + + } + else{ + + //DEBUG +// System.out.println("dataSources.contains : "+dataSources.contains(dataProviderName)); +// System.out.println("row.getDataProviderName(): "+dataProviderName); + + if(!dataSources.contains(dataProviderName)){ + + dataSources.add(dataProviderName); + hashMapCommonNameDataSources.put(NormalizeString.lowerCaseUpFirstChar(commonNameKey), dataSources); + + //DEBUG +// System.out.println("put "+ commonNameKey +" in datasource list: "+dataProviderName); + } + } + } + } + + } + + public HashMap> getHashMapCommonNameDataSources() { + return hashMapCommonNameDataSources; + } + + public ArrayList getListDataSourcesFound() { + return listDataSourcesFound; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/cluster/ClusterStructuresForResultRow.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/cluster/ClusterStructuresForResultRow.java new file mode 100644 index 0000000..8baf2c2 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/cluster/ClusterStructuresForResultRow.java @@ -0,0 +1,148 @@ +package org.gcube.portlets.user.speciesdiscovery.shared.cluster; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.gcube.portlets.user.speciesdiscovery.shared.ResultRow; +import org.gcube.portlets.user.speciesdiscovery.shared.SearchResult; +import org.gcube.portlets.user.speciesdiscovery.shared.util.NormalizeString; + +//import com.extjs.gxt.ui.client.widget.Html; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class ClusterStructuresForResultRow implements Serializable{ + + /** + * + */ + private static final long serialVersionUID = 1205113606387863736L; + + private ArrayList listResultRowID; + private Map hashResult = new HashMap(); + private ArrayList listFoundDataSources = new ArrayList(); + private HashMap> hashClusterCommonNamesDataSources = new HashMap>(); //HASH scientific name - cluster + private HashMap> hashScientificNameResultRowID = new HashMap>(); //HASH scientific name - result row ID + private boolean isReduced; + private int totalRow; + + public ClusterStructuresForResultRow(){} + + public ClusterStructuresForResultRow(SearchResult result, boolean isReduced, int totalRow){ + + //Create hashMap ID - resultRow + for (ResultRow row : result.getResults()) { + hashResult.put(row.getIdToString(), row); + } + + this.isReduced = isReduced; + this.totalRow = totalRow; + + createStructures(result.getResults()); + createStructuresForCommonName(); + } + + public void createStructuresForCommonName(){ + + if(hashScientificNameResultRowID.size()>0){ + + for(String scientificName : hashScientificNameResultRowID.keySet()){ + + ArrayList listResultRowServiceID = hashScientificNameResultRowID.get(scientificName); //get RR serviceID + + ClusterCommonNameDataSource cluster = new ClusterCommonNameDataSource(); //NEW CLUSTER + + for(int i=0; i arrayListRR){ + + if(arrayListRR.size()>0){ + + for (ResultRow row : arrayListRR) { + + String keyScientificName = "Name not found"; + + if(row.getParents().get(0)!=null){ + + keyScientificName = row.getParents().get(0).getName(); + if(keyScientificName== null || keyScientificName.isEmpty()) + keyScientificName = "Undefined"; + else + keyScientificName = NormalizeString.lowerCaseUpFirstChar(keyScientificName); + + if(hashScientificNameResultRowID.get(keyScientificName)==null){ + + listResultRowID = new ArrayList(); //USED FOR CLUSTER COMMON NAMES + } + else{ + + listResultRowID = hashScientificNameResultRowID.get(keyScientificName); //USED FOR CLUSTER COMMON NAMES + } + } + + String dataSource = row.getDataSourceName(); + + if(dataSource==null || dataSource.isEmpty()) + dataSource = "Data Source not found"; + + if(listFoundDataSources.indexOf(dataSource)==-1) + listFoundDataSources.add(dataSource); + + listResultRowID.add(row.getIdToString()+""); + //USED FOR CLUSTER COMMON NAMES + hashScientificNameResultRowID.put(keyScientificName, listResultRowID); + } + } + } + + public HashMap> getHashClusterScientificNameResultRowID() { + return hashScientificNameResultRowID; + } + + public List getListFoundDataSources() { + return listFoundDataSources; + } + + public HashMap> getHashClusterCommonNamesDataSources() { + return hashClusterCommonNamesDataSources; + } + + public List getResult() { + return new ArrayList(hashResult.values()); + } + + public ResultRow getResultRowByRowID(String key) { + return hashResult.get(key); + } + + public boolean isReduced() { + return isReduced; + } + + public void setReduced(boolean isReduced) { + this.isReduced = isReduced; + } + + public int getTotalRow() { + return totalRow; + } + + public void setTotalRow(int totalRow) { + this.totalRow = totalRow; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/cluster/ClusterStructuresForTaxonomyRow.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/cluster/ClusterStructuresForTaxonomyRow.java new file mode 100644 index 0000000..5d38030 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/cluster/ClusterStructuresForTaxonomyRow.java @@ -0,0 +1,185 @@ +package org.gcube.portlets.user.speciesdiscovery.shared.cluster; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.gcube.portlets.user.speciesdiscovery.shared.SearchResult; +import org.gcube.portlets.user.speciesdiscovery.shared.TaxonomyRow; +import org.gcube.portlets.user.speciesdiscovery.shared.util.NormalizeString; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class ClusterStructuresForTaxonomyRow implements Serializable{ + + private static final String DATA_SOURCE_NOT_FOUND = "Data Source not found"; + + /** + * + */ + private static final long serialVersionUID = 2680552140187511057L; + + private Map hashResult = new HashMap(); + private HashMap> hashClusterCommonNamesDataSources = new HashMap>(); + private HashMap> hashClusterScientificNameTaxonomyRowID = new HashMap>(); //HASH scientific name - taxonomy row ID + private ArrayList listFoundDataSources = new ArrayList(); + private ArrayList listTaxonomyRowID; + + private boolean isReduced; + + private int totalRow; + + public ClusterStructuresForTaxonomyRow(){ + + } + + public ClusterStructuresForTaxonomyRow(SearchResult result, boolean isReduced, int totalRow) { + //Create hashMap row ID - resultRow + for (TaxonomyRow row : result.getResults()) { + hashResult.put(row.getIdToString(), row); + +// int parentsSize = row.getParents().size(); +// +// //FILL LIST PARENT FOR PARENTS ITEM +// for(int i=parentsSize-1; i>=0; i--){ +// TaxonomyRow taxon = row.getParents().get(i); +// List sublistParents = new ArrayList(); +//// for (TaxonomyRow taxon : taxonomy.getParents()) { +// +// if(i+1!=parentsSize) +// sublistParents.addAll(row.getParents().subList(i+1, parentsSize)); +// +// taxon.setParent(sublistParents); +// +////// DEBUG +//// System.out.println("parent of "+taxon.getName()); +//// for (TaxonomyRow tax : sublistParents) { +//// System.out.println("taxon.getName() " + tax.getName()); +//// } +//// System.out.println("\n\n"); +// } + + //DEBUG +// System.out.println("principal "+row.getName() + " id " + row.getServiceId()+" parents"); +// for (TaxonomyRow tax : row.getParents()) { +// System.out.println("taxon.getName() " + tax.getName()); +// System.out.println("parent of "+tax.getName()); +// for (TaxonomyRow taxon : tax.getParents()) { +// System.out.println("taxon.getName() " + taxon.getName()); +// } +// System.out.println("\n\n"); +// } + } + + this.isReduced = isReduced; + this.totalRow = totalRow; + + createStructures(result.getResults()); + createStructuresForCommonName(); + } + + public void createStructures(ArrayList arrayListTax){ + + if(arrayListTax.size()>0){ + + for (TaxonomyRow row : arrayListTax) { + + String dataSource = row.getDataProviderName(); + + if(dataSource==null || dataSource.isEmpty()) + dataSource = DATA_SOURCE_NOT_FOUND; + + String keyScientificName = row.getName(); + + if(keyScientificName== null || keyScientificName.isEmpty()) + keyScientificName = "Undefined"; + else + keyScientificName = NormalizeString.lowerCaseUpFirstChar(keyScientificName); + + if(hashClusterScientificNameTaxonomyRowID.get(keyScientificName)==null){ + + listTaxonomyRowID = new ArrayList(); //USED FOR CLUSTER COMMON NAMES + + } + else{ + + listTaxonomyRowID = hashClusterScientificNameTaxonomyRowID.get(keyScientificName); //USED FOR CLUSTER COMMON NAMES + } + + if(listFoundDataSources.indexOf(dataSource)==-1) + listFoundDataSources.add(dataSource); + + listTaxonomyRowID.add(row.getIdToString()); + hashClusterScientificNameTaxonomyRowID.put(keyScientificName, listTaxonomyRowID); + + } + } + + } + + + public void createStructuresForCommonName(){ + + if(hashClusterScientificNameTaxonomyRowID.size()>0){ + + for(String scientificName : hashClusterScientificNameTaxonomyRowID.keySet()){ + + ArrayList listTaxonomyRowID = hashClusterScientificNameTaxonomyRowID.get(scientificName); + + ClusterCommonNameDataSource cluster = new ClusterCommonNameDataSource(); //NEW CLUSTER + + for(int i=0; i getListFoundDataSources() { + return listFoundDataSources; + } + + public HashMap> getHashClusterScientificNameTaxonomyRowID() { + return hashClusterScientificNameTaxonomyRowID; + } + + public HashMap> getHashClusterCommonNamesDataSources() { + return hashClusterCommonNamesDataSources; + } + + public ArrayList getResult() { + return new ArrayList(hashResult.values()); + } + + public TaxonomyRow getTaxonomyRowByKey(String key) { + return hashResult.get(key); + } + + public boolean isReduced() { + return isReduced; + } + + public void setReduced(boolean isReduced) { + this.isReduced = isReduced; + } + + public int getTotalRow() { + return totalRow; + } + + public void setTotalRow(int totalRow) { + this.totalRow = totalRow; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/filter/FilterCriteria.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/filter/FilterCriteria.java new file mode 100644 index 0000000..f4cfe8f --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/filter/FilterCriteria.java @@ -0,0 +1,12 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.shared.filter; + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public interface FilterCriteria { + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/filter/ResultFilter.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/filter/ResultFilter.java new file mode 100644 index 0000000..f3b5cd9 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/filter/ResultFilter.java @@ -0,0 +1,187 @@ +/** + * + */ +package org.gcube.portlets.user.speciesdiscovery.shared.filter; + +import java.io.Serializable; + + +/** + * @author "Federico De Faveri defaveri@isti.cnr.it" + * + */ +public class ResultFilter implements FilterCriteria, Serializable { + + private static final long serialVersionUID = -1263032818979002405L; + + private boolean isByClassification; + private String classificationId; + private String rankClassification; + + private boolean isByDataProvider; + private String dataProviderName; + + private boolean isByDataSourceName; + private String dataSourceName; + + private boolean isByRank; + private String rankName; + + private int numberOfData; + + private String filterValue; + + private boolean loadCommonName; + + private boolean activeFilters; + + private boolean loadAllProperties; + + /** + * default behavior activeFilters is true, loadCommonName = false + */ + public ResultFilter(){ + super(); + this.activeFilters = true; + this.loadCommonName = false; + this.loadAllProperties = false; + initFilter(); + } + + /** + * + * @param activeFilters + * @param loadAllCommonName + */ + public ResultFilter(boolean activeFilters, boolean loadAllCommonName, boolean loadAllProperties) { + this.loadCommonName = loadAllCommonName; + this.loadAllProperties = loadAllProperties; + this.activeFilters = activeFilters; + initFilter(); + } + + + private void initFilter(){ + filterValue = ""; + isByClassification = false; + isByDataProvider = false; + isByDataSourceName = false; + isByRank = false; + + dataProviderName = null; + classificationId = null; + rankClassification = null; + rankName = null; + dataSourceName = null; + numberOfData = 0; + filterValue = null; + +// listByClassification = null; + } + + public boolean isByClassification() { + return isByClassification; + } + + public void setByClassification(boolean isByClassification) { + this.isByClassification = isByClassification; + } + + public void setClassification(String rank, String classificationId, int numberOfData) { + this.rankClassification = rank; + this.classificationId = classificationId; + this.numberOfData = numberOfData; + } + + public boolean isByDataProvider() { + return isByDataProvider; + } + + public boolean isByDataSourceName() { + return isByDataSourceName ; + } + + public void setByDataProvider(boolean isByDataProvider) { + this.isByDataProvider = isByDataProvider; + } + + public String getDataProviderName() { + return dataProviderName; + } + + public void setDataProviderName(String dataProviderName, int numberOfData) { + this.dataProviderName = dataProviderName; + this.numberOfData = numberOfData; + } + + public String getDataSourceName() { + return dataSourceName; + } + + public void setDataSourceName(String dataSourceName, int numberOfData) { + this.dataSourceName = dataSourceName; + this.numberOfData = numberOfData; + } + + public void resetAllFilters(){ + initFilter(); + } + + public int getNumberOfData(){ + return numberOfData; + } + + public void setByDataSourceName(boolean isByDataSourceName) { + this.isByDataSourceName = isByDataSourceName; + } + + public void setByRankFilter(boolean b) { + this.isByRank = b; + } + + public String getRankName() { + return rankName; + } + + public void setRankName(String rankName, int numberOfData) { + this.rankName = rankName; + this.numberOfData = numberOfData; + } + + public boolean isByRank() { + return isByRank; + } + + public String getFilterValue() { + return filterValue; + } + + public void setFilterValue(String filterValue) { + this.filterValue = filterValue; + } + + public String getClassificationId() { + return classificationId; + } + + public String getRankClassification() { + return rankClassification; + } + + public void setRankClassification(String rankClassification) { + this.rankClassification = rankClassification; + } + + public boolean isLoadCommonName() { + return loadCommonName; + } + + public boolean isActiveFilters() { + return activeFilters; + } + + public boolean isLoadAllProperties() { + return loadAllProperties; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/util/NormalizeString.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/util/NormalizeString.java new file mode 100644 index 0000000..8bcc50e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/shared/util/NormalizeString.java @@ -0,0 +1,50 @@ +package org.gcube.portlets.user.speciesdiscovery.shared.util; + +import org.gcube.portlets.user.speciesdiscovery.client.ConstantsSpeciesDiscovery; + +public final class NormalizeString { + + /** + * + * @param value + * @return empty string if value is null or UNDEFINED, value otherwise + */ + public static String validateUndefined(String value){ + + if(value == null || value.equalsIgnoreCase(ConstantsSpeciesDiscovery.UNDEFINED) || value.equalsIgnoreCase(ConstantsSpeciesDiscovery.NULL)) + return ""; + + return value; + + } + + public static boolean isUndefined(String value){ + + if(value == null || value.equalsIgnoreCase(ConstantsSpeciesDiscovery.UNDEFINED) || value.equalsIgnoreCase(ConstantsSpeciesDiscovery.NULL)) + return true; + + return false; + + } + + public static String lowerCaseUpFirstChar(String value){ + +// logger.trace("Normalize...: "+value); + + if(value == null || value.length()==0) + return ""; + + value = value.trim(); + + String firstChar = value.substring(0, 1); + String lastChars = value.substring(1, value.length()); + + if(lastChars!=null) + lastChars = lastChars.toLowerCase(); + +// logger.trace("Normalized in: "+firstChar.toUpperCase() + lastChars); + + return firstChar.toUpperCase() + lastChars; + + } +} diff --git a/src/main/resources/org/gcube/portlets/user/speciesdiscovery/SpeciesDiscovery.gwt.xml b/src/main/resources/org/gcube/portlets/user/speciesdiscovery/SpeciesDiscovery.gwt.xml new file mode 100644 index 0000000..7e74ba2 --- /dev/null +++ b/src/main/resources/org/gcube/portlets/user/speciesdiscovery/SpeciesDiscovery.gwt.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/SpeciesDiscovery.css b/src/main/webapp/SpeciesDiscovery.css new file mode 100644 index 0000000..12edd96 --- /dev/null +++ b/src/main/webapp/SpeciesDiscovery.css @@ -0,0 +1,345 @@ +/** Add css rules here for your application. */ + +#images-view .x-panel-body { + background: none repeat scroll 0 0 white; + font: 11px Arial,Helvetica,sans-serif; +} +#images-view .thumb { + background: none repeat scroll 0 0 #DDDDDD; + padding: 3px; +} +#images-view .thumb img { + height: 60px; + width: 80px; +} +#images-view .thumb-wrap { + border: 1px solid white; + float: left; + margin: 4px 0 4px 4px; + padding: 5px; +} +.x-theme-access #images-view .thumb-wrap { + border: 1px solid #232D38; +} +#images-view .thumb-wrap span { + display: block; + overflow: hidden; + text-align: center; +} +#images-view .x-view-over { + background: url("../gxt/images/default/grid/row-over.gif") repeat-x scroll left top #EFEFEF; + border: 1px solid #DDDDDD; + padding: 4px; +} +#images-view .x-view-selected { + background: none no-repeat scroll right bottom #EFF5FB; + border: 1px solid #99BBE8; + padding: 4px; +} +#images-view .x-view-selected .thumb { + background: none repeat scroll 0 0 transparent; +} +#images-view .loading-indicator { + background-image: url("../gxt/resources/images/default/grid/loading.gif"); + background-position: left center; + background-repeat: no-repeat; + font-size: 11px; + margin: 10px; + padding-left: 20px; +} + +/**FIX for portal css interference**/ +table { clear: none !important; } + + +.button-hyperlink .x-btn-text { + cursor: pointer !important; + cursor: hand !important; + border: none !important; + /* Disable the button-style */ + background-color: transparent !important; + background: none !important; + background-image: none !important; + padding: 0px !important; + color: #4784C3 !important; + /*color: #000 !important;*/ + font-size: 10px; + /*font-family: Serif, "Times New Roman", Georgia;*/ + /*color: black;*/ /*font-weight: bold;*/ + text-decoration: underline !important; +} +/* remove images */ +.button-hyperlink .x-btn-tl,.button-hyperlink.x-btn-tr,.button-hyperlink .x-btn-tc,.button-hyperlink .x-btn-ml,.button-hyperlink .x-btn-mr,.button-hyperlink .x-btn-mc,.button-hyperlink .x-btn-bl,.button-hyperlink .x-btn-br,.button-hyperlink .x-btn-bc +{ + background-image: none !important; + background: none !important; +} +.button-hyperlink .x-btn-small .x-btn-mr, +.button-hyperlink .x-btn-small .x-btn-ml, +.button-hyperlink .x-btn-small .x-btn-mc, +.button-hyperlink .x-btn-small .x-btn-br, +.button-hyperlink .x-btn-small .x-btn-bl, +.button-hyperlink .x-btn-small .x-btn-bc, +.button-hyperlink .x-btn-small .x-btn-tc, +.button-hyperlink .x-btn-small .x-btn-tr, +.button-hyperlink .x-btn-small .x-btn-tl +{ + background-image: none !important; + background: none !important; +} +/* remove little dots in FF */ +.button-hyperlink .x-btn-tl i,.button-hyperlink .x-btn-tr i,.button-hyperlink .x-btn-tc i,.button-hyperlink .x-btn-ml i,.button-hyperlink .x-btn-mr i,.button-hyperlink .x-btn-mc i,.button-hyperlink .x-btn-bl i,.button-hyperlink .x-btn-br i,.button-hyperlink .x-btn-bc i + { + font-size: 0px; +} +table.imagetable { + font-family: verdana,arial,sans-serif; + font-size:10px; + /*color:#333333; + border-width: 1px; + border-color: #999999; + */ + border-collapse: collapse; + border-spacing: 0px; + border: 1px solid #e3e3e3; + background-color: #f2f2f2; + width: 100%; + margin-bottom: 20px; + /*border-radius: 6px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + */ +} +table.imagetable .title { + /*background:#b5cfd2 url('images/cell-blue.jpg');*/ + background-color:#D3E1F1; + border-width: 1px; + width: 30%; + padding: 5px; + /*background-repeat: repeat;*/ + border-style: solid; + border-color: #999999; +} +table.imagetable td { + /*background:#dcddc0 url('images/cell-grey.jpg');*/ + background-color:#FFF; + border-width: 1px; + border-style: solid; + border-color: #999999; + border-collapse: collapse; + border-spacing: 0px; + height: 22px; + padding: 5px; + /*background-repeat: repeat;*/ +} + +table.imagetable th { + font-weight: bold; + font-size: 12px; + height: 30px; + border-collapse: collapse; + border-spacing: 0px; +} + + + + + +table.simpletable { + table-layout: fixed; + text-align: center; + width: 100%; + padding: 0px; + margin: 0px; + border-collapse: collapse; + border-spacing: 0px; + border: 1px solid #024e68; + font-size: 12px; +} + +table.simpletable th { + font-weight: bold; + height: 30px; + text-align: center; + background-color: #f2f2f2; + border-collapse: collapse; + border-spacing: 0px; + border: 1px solid #024e68; +} + +table.simpletable td { + text-align: center; + /*background:#FFD340;*/ + background-color:#FFF; + border-collapse: collapse; + border-spacing: 0px; + border: 1px solid #024e68; +} + +table.simpletable .commonname { + text-align: center; + width: 30%; + height: 22px; + background:#b5cfd2; + /*background:#b5cfd2;*/ +} + + + + +.wizardButton { + height: 22px !important; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + background: #F2F2F2; + /*background: #F2F2F2 url(images/white-grad.png) repeat-x scroll left top;*/ + border-color: #BBB; + color: #464646; + font-size: 12px; + border-width: 1px; + border-style: solid; + cursor: pointer; + cursor: hand; + margin-right: 5px; + margin-right: 3px; +} + +.wizardButton[disabled]:hover,.wizardButton[disabled]:active,.wizardButton[disabled] + { + color: #CCC; + border-color: #BBB; + cursor: default; + opacity: 1.0; + /*background: #F2F2F2 url(images/white-grad.png) repeat-x scroll left top;*/ + background: #F2F2F2; +} + +.wizardButton:hover { + border-color: #222; + color: #222; + opacity: 0.8; +} + +.wizardButton:active { + /*background: #e3e8f3 url(images/white-grad.png) repeat-x scroll left top;*/ +} + + +.toolbar-filter { + background-image: none !important; + border-width: 1px; + /*border-style: inset;*/ + border-bottom-style: solid; + border-color: #B3B3B3; + background-color: #EEEEEE; + /*font-family: tahoma,arial,verdana,sans-serif;*/ +} + + +.button-noimage .x-btn-text { + cursor: pointer !important; + cursor: hand !important; + border: none !important; + /* Disable the button-style */ + background-color: transparent !important; + background: none !important; + background-image: none !important; + padding: 0px !important; + /*color: #000 !important;*/ + font-size: 10px; + /*font-family: Serif, "Times New Roman", Georgia;*/ +} +/* remove images */ +.button-noimage .x-btn-tl, +.button-noimage-btn-tr, +.button-noimage .x-btn-tc, +.button-noimage .x-btn-ml, +.button-noimage .x-btn-mr, +.button-noimage .x-btn-mc, +.button-noimage .x-btn-bl, +.button-noimage .x-btn-br, +.button-noimage .x-btn-bc +{ + background-image: none !important; + background: none !important; +} +.button-noimage .x-btn-small .x-btn-mr, +.button-noimage .x-btn-small .x-btn-ml, +.button-noimage .x-btn-small .x-btn-mc, +.button-noimage .x-btn-small .x-btn-br, +.button-noimage .x-btn-small .x-btn-bl, +.button-noimage .x-btn-small .x-btn-bc, +.button-noimage .x-btn-small .x-btn-tc, +.button-noimage .x-btn-small .x-btn-tr, +.button-noimage .x-btn-small .x-btn-tl +{ + background-image: none !important; + background: none !important; +} +/* remove little dots in FF */ +.button-noimage .x-btn-tl i, +.button-noimage .x-btn-tr i, +.button-noimage .x-btn-tc i, +.button-noimage .x-btn-ml i, +.button-noimage .x-btn-mr i, +.button-noimage .x-btn-mc i, +.button-noimage .x-btn-bl i, +.button-noimage .x-btn-br i, +.button-noimage .x-btn-bc i + { + font-size: 0px; +} + +.labelCredits{ + font-size: 11px; + font-style: italic; + font-weight: bold; + margin-top: 5px; + margin-right: 5px; + margin-left: 30px; +} + +.labelParameters{ + font-size: 11px; + color: black; + font-weight: bold; +} + +.logoDataSource{ + margin: 15px; +} + +.valueParameters{ + font-size: 11px; + color: black; + margin-left: 20px; +} + +table.parameters { + font-family: verdana,arial,sans-serif; + font-size:10px; + border-spacing: 0px; + border: none; + padding: 1px; + width: 99%; +} + +table.parameters .title{ + font-weight: bold; +} + +.status-of{ + margin-right: 20px; +} + +.image-load-synonyms{ + cursor: pointer !important; + cursor: hand !important; + border: none !important; + margin-top: 3px; +} + +.margin-occurrence-link{ + margin-right: 5px; +} \ No newline at end of file diff --git a/src/main/webapp/SpeciesDiscovery.html b/src/main/webapp/SpeciesDiscovery.html new file mode 100644 index 0000000..6892e34 --- /dev/null +++ b/src/main/webapp/SpeciesDiscovery.html @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + Species Discovery + + + + + + + + + + + + + + + + + + +
+ + diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..5e5c69b --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,71 @@ + + + + + + taxonomyServlet + org.gcube.portlets.user.speciesdiscovery.server.TaxonomySearchServiceImpl + + + + taxonomyServlet + /speciesdiscovery/taxonomy + + + + + GisViewerService + org.gcube.portlets.user.gcubegisviewer.server.GCubeGisViewerServletImpl + + + + GisViewerService + /speciesdiscovery/GisViewerService + + + + + MapGenerator + org.gcube.portlets.user.gisviewer.server.MapGenerator + + + + MapGenerator + /speciesdiscovery/MapGenerator + + + + + WorkspaceLightService + org.gcube.portlets.user.workspace.lighttree.server.WorkspaceServiceImpl + + + + WorkspaceLightService + /speciesdiscovery/WorkspaceLightService + + + + jUnitHostImpl + com.google.gwt.junit.server.JUnitHostImpl + + + jUnitHostImpl + /speciesdiscovery/junithost/* + + + + jUnitHostImpl + /org.gcube.portlets.user.speciesdiscovery.SpeciesDiscoveryJUnit/junithost/* + + + + + + SpeciesDiscovery.html + + + diff --git a/src/main/webapp/gxt/chart/open-flash-chart.swf b/src/main/webapp/gxt/chart/open-flash-chart.swf new file mode 100644 index 0000000..5ec4444 Binary files /dev/null and b/src/main/webapp/gxt/chart/open-flash-chart.swf differ diff --git a/src/main/webapp/gxt/css/gxt-all.css b/src/main/webapp/gxt/css/gxt-all.css new file mode 100644 index 0000000..1e8b8ef --- /dev/null +++ b/src/main/webapp/gxt/css/gxt-all.css @@ -0,0 +1,7454 @@ +html,body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquote,th,td{margin:0;padding:0;}img,body,html{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}ol,ul {list-style:none;}caption,th {text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;}q:before,q:after{content:'';} +.x-contrast-test { + background: url(../images/default/s.gif); + visibility: hidden; + position: relative; + left: -1000px; + top: -1000px; +} +.ext-el-mask { + z-index: 100; + position: absolute; + top: 0; + left: 0; + -moz-opacity: 0.5; + opacity: .50; + filter: alpha(opacity = 50); + width: 100%; + height: 100%; + zoom: 1; +} + +.ext-el-mask-msg { + z-index: 101; + position: absolute; + top: 0; + left: 0; + border: 1px solid; + background: repeat-x 0 -16px; + padding: 2px; +} + +.ext-el-mask-msg div { + padding: 5px 10px 5px 10px; + border: 1px solid; + cursor: wait; +} + +.ext-webkit *:focus { + outline: none !important; +} + +.ext-webkit .x-form-check-wrap input:focus { + outline: auto !important; +} + +.ext-shim { + position: absolute; + visibility: hidden; + left: 0; + top: 0; + overflow: hidden; +} + +.ext-ie .ext-shim { + filter: alpha(opacity = 0); +} + +.ext-ie6 .ext-shim { + margin-left: 5px; + margin-top: 3px; +} + +.x-mask-loading div { + padding: 5px 10px 5px 25px; + background: no-repeat 5px 5px; + line-height: 16px; +} + +.x-hidden,.x-hide-offsets { + position: absolute !important; + left: -10000px !important; + top: -10000px !important; + visibility: hidden !important; +} + +.x-hide-display { + display: none !important; +} + +.x-hide-visibility { + visibility: hidden !important; +} + +.x-masked { + overflow: hidden !important; +} + +.x-masked-relative { + position: relative !important; +} + +.x-masked select,.x-masked object,.x-masked embed { + visibility: hidden; +} + +.x-layer { + visibility: hidden; +} + +.x-unselectable,.x-unselectable * { + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore; +} + +.x-unselectable-single { + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore; +} + +.x-selectable,.x-selectable * { + -moz-user-select: text !important; + -webkit-user-select: auto; +} + +.x-repaint { + zoom: 1; + background-color: transparent; + -moz-outline: none; + outline: 0 none; +} + +.x-item-disabled { + cursor: default; + opacity: .6; + -moz-opacity: .6; + filter: alpha(opacity = 60); +} + +.ext-ie .x-item-disabled { + filter: none !important; +} + +.x-item-disabled * { + cursor: default !important; +} + +.x-splitbar-proxy { + position: absolute; + visibility: hidden; + z-index: 20001; + zoom: 1; + line-height: 1px; + font-size: 1px; + overflow: hidden; +} + +.x-splitbar-h,.x-splitbar-proxy-h { + cursor: e-resize; + cursor: col-resize; +} + +.x-splitbar-v,.x-splitbar-proxy-v { + cursor: s-resize; + cursor: row-resize; +} + +.x-color-palette { + width: 150px; + height: 92px; + cursor: pointer; + -moz-outline: 0 none; + outline: 0 none; +} + +.x-color-palette a { + border: 1px solid; + float: left; + padding: 2px; + text-decoration: none; + -moz-outline: 0 none; + outline: 0 none; + cursor: pointer; +} + +.x-color-palette a.x-color-palette-hover,.x-color-palette a.x-color-palette-sel { + border: 1px solid; +} + +.x-color-palette em { + display: block; + border: 1px solid; +} + +.x-color-palette em span { + cursor: pointer; + display: block; + height: 10px; + line-height: 10px; + width: 10px; +} + +.x-ie-shadow { + display: none; + position: absolute; + overflow: hidden; + left: 0; + top: 0; + zoom: 1; +} + +.x-shadow { + display: none; + position: absolute; + overflow: hidden; + left: 0; + top: 0; +} + +.x-shadow * { + overflow: hidden; +} + +.x-shadow * { + padding: 0; + border: 0; + margin: 0; + clear: none; + zoom: 1; +} + +.x-shadow .xstc,.x-shadow .xsbc { + height: 6px; + float: left; +} + +.x-shadow .xstl,.x-shadow .xstr,.x-shadow .xsbl,.x-shadow .xsbr { + width: 6px; + height: 6px; + float: left; +} + +.x-shadow .xsc { + width: 100%; +} + +.x-shadow .xsml,.x-shadow .xsmr { + width: 6px; + float: left; + height: 100%; +} + +.x-shadow .xsmc { + float: left; + height: 100%; + background: transparent; +} + +.x-shadow .xst,.x-shadow .xsb { + height: 6px; + overflow: hidden; + width: 100%; +} + +.x-shadow .xsml { + background: transparent repeat-y 0 0; +} + +.x-shadow .xsmr { + background: transparent repeat-y -6px 0; +} + +.x-shadow .xstl { + background: transparent no-repeat 0 0; +} + +.x-shadow .xstc { + background: transparent repeat-x 0 -30px; +} + +.x-shadow .xstr { + background: transparent repeat-x 0 -18px; +} + +.x-shadow .xsbl { + background: transparent no-repeat 0 -12px; +} + +.x-shadow .xsbc { + background: transparent repeat-x 0 -36px; +} + +.x-shadow .xsbr { + background: transparent repeat-x 0 -6px; +} + +.loading-indicator { + background: no-repeat left; + padding-left: 20px; + line-height: 16px; + margin: 3px; +} + +.x-text-resize { + position: absolute; + left: -1000px; + top: -1000px; + visibility: hidden; + zoom: 1; +} + +.x-drag-overlay { + width: 100%; + height: 100%; + display: none; + position: absolute; + left: 0; + top: 0; + background-image: url(../images/default/s.gif); + z-index: 20000; +} + +.x-clear { + clear: both; + overflow: hidden; + line-height: 0; + font-size: 0; +} + +.x-spotlight { + z-index: 8999; + position: absolute; + top: 0; + left: 0; + -moz-opacity: 0.5; + opacity: .50; + filter: alpha(opacity = 50); + width: 0; + height: 0; + zoom: 1; +} + +#x-history-frame { + position: absolute; + top: -1px; + left: 0; + width: 1px; + height: 1px; + visibility: hidden; +} + +#x-history-field { + position: absolute; + top: 0; + left: -1px; + width: 1px; + height: 1px; + visibility: hidden; +} + +.x-portlet { + margin-bottom: 10px; +} + +.x-portlet .x-panel-body { + background-color: white !important; +} + +.ext-ie .x-btn-icon .x-btn-center .x-btn-text { + height: auto; +} + +.x-portal-insert div { + height: 4px; + font-size: 0px; + border: 2px dotted blue; +} + +.icon-wait { + background: url(../images/gxt/icons/wait.gif) no-repeat !important; +} + +.x-panel-icon { + padding-left: 20px !important; +} + +.x-icon-btn { + width: 16px; + height: 16px; + overflow: hidden; + background-repeat: no-repeat; + cursor: pointer; +} + +.x-panel-inline-icon { + margin-top: 0; +} + +.x-modal { + position: absolute; + z-index: 10; + background-color: black; + filter: alpha(opacity = 10); + opacity: .1; + left: 0px; + top: 0px; +} + +.x-progress { + font-family: tahoma, arial, helvetica, sans-serif; +} + +.x-float-right { + float: right; +} + +.x-toolbar .x-float-right { + margin-right: 4px; +} + +.x-border { + border: 1px solid #99BBE8; +} + +.x-border-top { + border-top: 1px solid #99BBE8; +} + +.x-layout-popup { + background-color: #DFE8F6; + border: 1px solid #7CA4D9; +} + +.x-panel-popup-body { + border-top: 1px solid #99BBE8; +} + +.x-layout-collapsed .x-panel-header { + border-left: none; + border-right: none; + border-top: none; +} + +.x-layout-collapsed .x-panel-header .x-tool { + margin: 0 0 0 -4px; + padding: 0px; +} + +.x-layout-collapsed { + position: absolute; + visibility: hidden; + background-color: #d2e0f2; + width: 20px; + height: 20px; + overflow: hidden; + border: 1px solid #98c0f4; + z-index: 20; +} + +.ext-border-box .x-layout-collapsed { + width: 22px; + height: 22px; +} + +.x-layout-collapsed-over { + cursor: pointer; + background-color: #d9e8fb; +} + +.x-layout-collapsed-west .x-layout-collapsed-tools,.x-layout-collapsed-east .x-layout-collapsed-tools { + position: absolute; + top: 0; + left: 0; + width: 20px; + height: 20px; +} + +.x-panel-toolbar { + float: right; +} + +.x-cursor-row-resize { + cursor: n-resize; + cursor: row-resize; +} + +.x-date-picker,.x-date-picker a { + font-size: 11px; +} + +.x-date-days { + table-layout: fixed; + width: 100%; +} + +.x-date-days td { + width: 25px; + border: none; +} + +.x-date-days td span { + display: block; + padding: 2px 7px 2px 2px; +} + +.x-date-days td { + background: #DFECFB url(../images/default/shared/glass-bg.gif) repeat-x scroll left top; + border-bottom: 1px solid #A3BAD9; + border-collapse: separate; + color: #233D6D; + cursor: default; + font-family: arial, helvetica, tahoma, sans-serif; + font-size: 10px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: normal; + line-height: normal; + padding: 0pt; + text-align: right !important; +} + +.x-date-picker .x-date-header { + background: url(../images/default/shared/hd-sprite.gif) repeat-x 0 -83px; + height: 22px; + left: 10px; + top: 10px; + width: 157px; +} + +.x-date-header .x-btn .x-btn-text { + color: #fff; +} + +.x-date-picker-footer { + width: 100%; +} + +.x-date-picker-footer td { + text-align: center; +} + +.x-date-left { + background: transparent url(../images/default/shared/hd-sprite.gif) repeat-x scroll 0pt -83px; + color: #FFFFFF; + font-family: "sans serif", tahoma, verdana, helvetica; + font-size: 11px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: bold; + line-height: normal; + overflow: hidden; +} + +.x-modal { + position: absolute; + z-index: 10; + background-color: black; + filter: alpha(opacity = 10); + opacity: .1; + left: 0px; + top: 0px; +} + +.x-progress { + font-family: tahoma, arial, helvetica, sans-serif; +} + +.x-float-right { + float: right; +} + +.x-layout-popup { + background-color: #DFE8F6; + border: 1px solid #7CA4D9; +} + +.x-layout-collapsed .x-panel-header .x-tool { + margin: 0 0 0 -4px; + padding: 0px; +} + +.ext-border-box .x-layout-collapsed { + width: 22px; + height: 22px; +} + +.x-layout-collapsed-over { + cursor: pointer; + background-color: #d9e8fb; +} + +.x-layout-collapsed-west .x-layout-collapsed-tools,.x-layout-collapsed-east .x-layout-collapsed-tools { + position: absolute; + top: 0; + left: 0; + width: 20px; + height: 20px; +} + +.x-panel-toolbar { + float: right; +} + +.x-cursor-col-resize { + cursor: e-resize; + cursor: col-resize; +} + +.x-cursor-row-resize { + cursor: n-resize; + cursor: row-resize; +} + +.x-drag-proxy { + border: 1px dashed #3b5a82; + background-color: #EDEDED; + filter: alpha(opacity = 50); + opacity: .5; + background-color: #c3daf9; + z-index: 20000; + overflow: hidden; + position: absolute; + left: 0;; + top: 0; + cursor: move; +}.x-tab-panel { + overflow: hidden; + -moz-outline: none; + outline: 0 none; +} + +.x-tab-panel-header,.x-tab-panel-footer { + border: 1px solid; + overflow: hidden; + zoom: 1; +} + +.x-tab-panel-header { + border: 1px solid; + padding-bottom: 2px; +} + +.x-tab-panel-footer { + border: 1px solid; + padding-top: 2px; +} + +.x-tab-strip-wrap { + width: 100%; + overflow: hidden; + position: relative; + zoom: 1; +} + +ul.x-tab-strip { + display: block; + width: 7000px; + zoom: 1; +} + +ul.x-tab-strip-top { + padding-top: 1px; + background: repeat-x bottom; + border-bottom: 1px solid; +} + +ul.x-tab-strip-bottom { + padding-bottom: 1px; + background: repeat-x top; + border-top: 1px solid; + border-bottom: 0 none; +} + +.x-tab-panel-header-plain .x-tab-strip-top { + background: transparent !important; + padding-top: 0 !important; +} + +.x-tab-panel-header-plain { + background: transparent !important; + border-width: 0 !important; + padding-bottom: 0 !important; +} + +.x-tab-panel-header-plain .x-tab-strip-spacer,.x-tab-panel-footer-plain .x-tab-strip-spacer + { + border: 1px solid; + height: 2px; + font-size: 1px; + line-height: 1px; +} + +.x-tab-panel-header-plain .x-tab-strip-spacer { + border-top: 0 none; +} + +.x-tab-panel-footer-plain .x-tab-strip-spacer { + border-bottom: 0 none; +} + +.x-tab-panel-footer-plain .x-tab-strip-bottom { + background: transparent !important; + padding-bottom: 0 !important; +} + +.x-tab-panel-footer-plain { + background: transparent !important; + border-width: 0 !important; + padding-top: 0 !important; +} + +.ext-border-box .x-tab-panel-header-plain .x-tab-strip-spacer,.ext-border-box .x-tab-panel-footer-plain .x-tab-strip-spacer + { + height: 3px; +} + +ul.x-tab-strip li { + float: left; + position: relative; + margin-left: 2px; +} + +ul.x-tab-strip li.x-tab-edge { + float: left; + margin: 0 !important; + padding: 0 !important; + border: 0 none !important; + font-size: 1px !important; + line-height: 1px !important; + overflow: hidden; + zoom: 1; + background: transparent !important; + width: 1px; +} + +.x-tab-strip a,.x-tab-strip span,.x-tab-strip em { + display: block; +} + +.x-tab-strip a { + text-decoration: none !important; + -moz-outline: none; + outline: none; + cursor: pointer; +} + +.x-tab-strip-inner { + overflow: hidden; + text-overflow: ellipsis; +} + +.x-tab-strip span.x-tab-strip-text { + white-space: nowrap; + cursor: pointer; + padding: 4px 0; +} + +.x-tab-strip-top .x-tab-with-icon .x-tab-right { + padding-left: 6px; +} + +.x-tab-strip .x-tab-with-icon span.x-tab-strip-text { + padding-left: 20px; + background-position: 0 3px; + background-repeat: no-repeat; +} + +.x-tab-strip-active,.x-tab-strip-active a.x-tab-right { + cursor: default; +} + +.x-tab-strip-active span.x-tab-strip-text { + cursor: default; +} + +.x-tab-strip-disabled .x-tabs-text { + cursor: default; +} + +.x-tab-panel-body { + overflow: hidden; +} + +.x-tab-panel-bwrap { + overflow: hidden; +} + +.ext-ie .x-tab-strip .x-tab-right { + position: relative; +} + +.x-tab-strip-top .x-tab-strip-active .x-tab-right { + margin-bottom: -1px; +} + +.x-tab-strip-top .x-tab-strip-active .x-tab-right span.x-tab-strip-text + { + padding-bottom: 5px; +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right { + margin-top: -1px; +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right span.x-tab-strip-text + { + padding-top: 5px; +} + +.x-tab-strip-top .x-tab-right { + background: transparent no-repeat 0 -51px; + padding-left: 10px; +} + +.x-tab-strip-top .x-tab-left { + background: transparent no-repeat right -351px; + padding-right: 10px; +} + +.x-tab-strip-top .x-tab-strip-inner { + background: transparent repeat-x 0 -201px; +} + +.x-tab-strip-top .x-tab-strip-over .x-tab-right { + background-position: 0 -101px; +} + +.x-tab-strip-top .x-tab-strip-over .x-tab-left { + background-position: right -401px; +} + +.x-tab-strip-top .x-tab-strip-over .x-tab-strip-inner { + background-position: 0 -251px; +} + +.x-tab-strip-top .x-tab-strip-active .x-tab-right { + background-position: 0 0; +} + +.x-tab-strip-top .x-tab-strip-active .x-tab-left { + background-position: right -301px; +} + +.x-tab-strip-top .x-tab-strip-active .x-tab-strip-inner { + background-position: 0 -151px; +} + +.x-tab-strip-bottom .x-tab-right { + background: no-repeat bottom right; +} + +.x-tab-strip-bottom .x-tab-left { + background: no-repeat bottom left; +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right { + background: no-repeat bottom left; +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-left { + background: no-repeat bottom right; +} + +.x-tab-strip-bottom .x-tab-left { + padding: 0 10px; +} + +.x-tab-strip-bottom .x-tab-right { + padding: 0; +} + +.x-tab-strip .x-tab-strip-close { + display: none; +} + +.x-tab-strip-closable { + position: relative; +} + +.x-tab-strip-closable .x-tab-left { + padding-right: 19px; +} + +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close { + opacity: .6; + -moz-opacity: .6; + background-repeat: no-repeat; + display: block; + width: 11px; + height: 11px; + position: absolute; + top: 3px; + right: 3px; + cursor: pointer; + z-index: 2; +} + +.x-tab-strip .x-tab-strip-active a.x-tab-strip-close { + opacity: .8; + -moz-opacity: .8; +} + +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover { + opacity: 1; + -moz-opacity: 1; +} + +.x-tab-panel-body { + border: 1px solid; +} + +.x-tab-panel-body-top { + border-top: 0 none; +} + +.x-tab-panel-body-bottom { + border-bottom: 0 none; +} + +.x-tab-scroller-left { + background: transparent no-repeat -18px 0; + border-bottom: 1px solid; + width: 18px; + position: absolute; + left: 0; + top: 0; + z-index: 10; + cursor: pointer; +} + +.x-tab-scroller-left-over { + background-position: 0 0; +} + +.x-tab-scroller-left-disabled { + background-position: -18px 0; + opacity: .5; + -moz-opacity: .5; + filter: alpha(opacity = 50); + cursor: default; +} + +.x-tab-scroller-right { + background: transparent no-repeat 0 0; + border-bottom: 1px solid; + width: 18px; + position: absolute; + right: 0; + top: 0; + z-index: 10; + cursor: pointer; +} + +.x-tab-scroller-right-over { + background-position: -18px 0; +} + +.x-tab-scroller-right-disabled { + background-position: 0 0; + opacity: .5; + -moz-opacity: .5; + filter: alpha(opacity = 50); + cursor: default; +} + +.x-tab-scrolling-bottom .x-tab-scroller-left,.x-tab-scrolling-bottom .x-tab-scroller-right + { + margin-top: 1px; +} + +.x-tab-scrolling .x-tab-strip-wrap { + margin-left: 18px; + margin-right: 18px; +} + +.x-tab-scrolling { + position: relative; +} + +.x-tab-panel-bbar .x-toolbar { + border: 1px solid; + border-top: 0 none; + overflow: hidden; + padding: 2px; +} + +.x-tab-panel-tbar .x-toolbar { + border: 1px solid; + border-top: 0 none; + overflow: hidden; + padding: 2px; +} + +.x-tab-strip li .x-tab-image { + position: absolute; + top: 3px; + left: 5px; +} + +.ext-ie8 .x-tab-strip li .x-tab-image,.ext-ie8-compatibility .x-tab-strip li .x-tab-image { + top: 4px; + left: 6px; +} + +.ext-ie8 .x-tab-strip-top .x-tab-right,.ext-ie8-compatibility .x-tab-strip-top .x-tab-right + { + top: 1px; +} + +.ext-strict .ext-ie8 .x-tab-strip-top .x-tab-right,.ext-ie8 .x-tab-panel-header-plain .x-tab-strip-top .x-tab-right,.ext-ie8-compatibility .x-tab-panel-header-plain .x-tab-strip-top .x-tab-right + { + top: 0; +} +.ext-strict .ext-ie7 .x-panel-body { + position: relative !important; +} + +.x-form-field { + margin: 0; +} + +.foo { + padding: 1px; +} + +.foo { + margin: 4px; +} + +.x-form-text,textarea.x-form-field { + padding: 1px 3px; + background: repeat-x 0 0; + border: 1px solid; +} + +.ext-gecko textarea.x-form-field { + padding: 0; +} + +.x-form-text,.ext-ie .x-form-file { + height: 22px; + line-height: 18px; + vertical-align: middle; +} + +.ext-ie6 .x-form-text,.ext-ie7 .x-form-text { + margin: -1px 0; + height: 22px; /* ie quirks */ + line-height: 18px; +} + +.ext-ie8-compatibility .x-form-text { + margin: 0; +} + +.ext-ie textarea.x-form-field { + margin: -1px 0; /* ie bogus margin bug */ +} + +.ext-strict .ext-ie8 textarea.x-form-field,.ext-strict .ext-ie8-compatibility textarea.x-form-field { + margin: 0; +} + +.x-form-field-wrap .x-form-text { + position: relative; +} + +.ext-strict .x-form-text { + height: 18px; +} + +.ext-safari.ext-mac textarea.x-form-field { + margin-bottom: -2px; +} + +.ext-gecko .x-form-text,.ext-ie8 .x-form-text { + padding-top: 2px; + padding-bottom: 0; +} + +textarea { + resize: none; +} + +.x-form-select-one { + height: 20px; + line-height: 18px; + vertical-align: middle; + border: 1px solid; +} + +.x-form-check-wrap { + line-height: 18px; + height: 22px; + white-space: nowrap; +} + +.x-editor .x-form-check-wrap { + border: 1px solid; + padding: 2px; + height: 14px; +} + +.x-editor .x-form-checkbox { + height: 13px; +} + +.x-form-check-group-label { + border-bottom: 1px solid; + margin-bottom: 5px; + padding-left: 3px !important; + float: none !important; +} + +.x-form-field-wrap .x-form-trigger { + width: 17px; + height: 21px; + border: 0; + background: transparent no-repeat 0 0; + cursor: pointer; + border-bottom: 1px solid; + position: absolute; + top: 0; +} + +.ext-safari .x-form-field-wrap .x-form-trigger { + height: 21px; +} + +.ext-strict .ext-safari .x-form-field-wrap .x-form-trigger { + height: 23px; +} + +.ext-strict .ext-safari .x-small-editor .x-form-field-wrap .x-form-trigger { + height: 19px; +} + +.ext-strict .ext-ie8 .x-small-editor .x-form-field-wrap .x-form-trigger { + height: 20px !important; +} + +.ext-strict .ext-gecko .x-small-editor .x-form-field-wrap .x-form-trigger { + height: 21px !important; +} + +.x-form-field-wrap .x-form-date-trigger,.x-form-field-wrap .x-form-clear-trigger,.x-form-field-wrap .x-form-search-trigger + { + cursor: pointer; +} + +.ext-safari .x-form-field-wrap .x-form-trigger,.ext-gecko .x-form-field-wrap .x-form-trigger { + right: 0; +} + +.x-form-field-wrap .x-form-twin-triggers .x-form-trigger { + position: static; + top: auto; + vertical-align: top; +} + +.x-form-field-wrap { + position: relative; + left: 0; + top: 0; + zoom: 1; + white-space: nowrap; + text-align: left; +} + +.x-form-field-wrap .x-form-trigger-over { + background-position: -17px 0; +} + +.x-form-field-wrap .x-form-trigger-click { + background-position: -34px 0; +} + +.x-trigger-wrap-focus .x-form-trigger { + background-position: -51px 0; +} + +.x-trigger-wrap-focus .x-form-trigger-over { + background-position: -68px 0; +} + +.x-trigger-wrap-focus .x-form-trigger-click { + background-position: -85px 0; +} + +.x-trigger-wrap-focus .x-form-trigger { + border-bottom: 1px solid; +} + +.x-item-disabled .x-form-trigger-over { + background-position: 0 0 !important; + border-bottom: 1px solid; +} + +.x-item-disabled .x-form-trigger-click { + background-position: 0 0 !important; + border-bottom: 1px solid; +} + +.x-form-focus,textarea.x-form-focus { + border: 1px solid; +} + +.x-form-invalid,textarea.x-form-invalid { + background: repeat-x bottom; + border: 1px solid; +} + +.ext-safari .x-form-invalid { + border: 1px solid; +} + +.x-form-inner-invalid,textarea.x-form-inner-invalid { + background: repeat-x bottom; +} + +.x-editor { + padding: 0; + margin: 0; +} + +.x-form-grow-sizer { + left: -10000px; + padding: 8px 3px; + position: absolute; + visibility: hidden; + top: -10000px; + white-space: pre-wrap; + white-space: -moz-pre-wrap; + white-space: -pre-wrap; + white-space: -o-pre-wrap; + word-wrap: break-word; + zoom: 1; +} + +.x-form-grow-sizer p { + margin: 0 !important; + border: 0 none !important; + padding: 0 !important; +} + +.x-form-item { + display: block; + margin-bottom: 4px; +} + +.x-form-item .x-form-item-label { + display: block; + float: left; + width: 100px; + padding: 3px; + padding-left: 0; + clear: left; + z-index: 2; + position: relative; +} + +.x-form-element { + padding-left: 105px; + position: relative; +} + +.x-form-invalid-msg { + padding: 2px; + padding-left: 18px; + background: transparent no-repeat 0 2px; + line-height: 16px; + width: 200px; +} + +.x-form-label-left .x-form-item-label { + text-align: left; +} + +.x-form-label-right .x-form-item-label { + text-align: right; +} + +.x-form-label-top .x-form-item .x-form-item-label { + width: auto; + float: none; + clear: none; + display: inline; + margin-bottom: 4px; + position: static; +} + +.x-form-label-top .x-form-element { + padding-left: 0; + padding-top: 4px; +} + +.x-form-label-top .x-form-item { + padding-bottom: 4px; +} + +.x-small-editor .x-form-text { + height: 20px; + line-height: 16px; + vertical-align: middle; +} + +.ext-ie6 .x-small-editor .x-form-text,.ext-ie7 .x-small-editor .x-form-text { + height: 20px !important; + line-height: 16px !important; +} + +.ext-strict .x-small-editor .x-form-text { + height: 16px !important; +} + +.ext-strict .ext-ie8 .x-small-editor .x-form-text { + height: 17px !important; +} + +.ext-strict .ext-webkit .x-small-editor .x-form-text { + height: 18px !important; + padding: 0px 3px; +} + +.ext-strict .ext-gecko .x-small-editor .x-form-text { + height: 18px !important; +} + +.ext-strict .ext-gecko .x-edit-grid .x-small-editor .x-form-text { + height:17px !important; +} + +.ext-border-box .x-small-editor .x-form-text { + height: 20px; +} + +.x-small-editor .x-form-select-one { + height: 20px; + line-height: 16px; + vertical-align: middle; +} + +.x-small-editor .x-form-num-field { + text-align: right; +} + +.x-small-editor .x-form-field-wrap .x-form-trigger { + height: 19px; +} + +.x-form-clear { + clear: both; + overflow: hidden; + line-height: 0; + font-size: 0; + height: 0; +} + +.x-form-clear-left { + clear: left; + overflow: hidden; + line-height: 0; + font-size: 0; + height: 0; +} + +.x-form-cb-label { + width: auto !important; + float: none !important; + clear: none !important; + display: inline !important; + margin-left: 4px; +} + +.x-form-column { + float: left; + padding: 0; + margin: 0; + width: 48%; + overflow: hidden; + zoom: 1; +} + +.x-form .x-form-btns-ct .x-btn { + float: right; + clear: none; +} + +.x-form .x-form-btns-ct .x-form-btns td { + border: 0; + padding: 0; +} + +.x-form .x-form-btns-ct .x-form-btns-right table { + float: right; + clear: none; +} + +.x-form .x-form-btns-ct .x-form-btns-left table { + float: left; + clear: none; +} + +.x-form .x-form-btns-ct .x-form-btns-center { + text-align: center; +} + +.x-form .x-form-btns-ct .x-form-btns-center table { + margin: 0 auto; +} + +.x-form .x-form-btns-ct table td.x-form-btn-td { + padding: 3px; +} + +.x-form .x-form-btns-ct .x-btn-focus .x-btn-left { + background-position: 0 -147px; +} + +.x-form .x-form-btns-ct .x-btn-focus .x-btn-right { + background-position: 0 -168px; +} + +.x-form .x-form-btns-ct .x-btn-focus .x-btn-center { + background-position: 0 -189px; +} + +.x-form .x-form-btns-ct .x-btn-click .x-btn-center { + background-position: 0 -126px; +} + +.x-form .x-form-btns-ct .x-btn-click .x-btn-right { + background-position: 0 -84px; +} + +.x-form .x-form-btns-ct .x-btn-click .x-btn-left { + background-position: 0 -63px; +} + +.x-form-invalid-icon { + width: 16px; + height: 18px; + position: absolute; + left: 0; + top: 0; + display: block; + background: transparent no-repeat 0 2px; +} + +.x-fieldset { + border: 1px solid; + padding: 10px; + margin-bottom: 10px; + display: block; +} + +.ext-ie .x-fieldset legend { + margin-bottom: 10px; +} + +.ext-ie .x-fieldset { + padding-top: 0; + padding-bottom: 10px; +} + +.x-fieldset legend .x-tool-toggle { + margin-right: 3px; + margin-left: 0; + float: left !important; +} + +.x-fieldset legend input { + margin-right: 3px; + float: left !important; + height: 13px; + width: 13px; +} + +fieldset.x-panel-collapsed { + padding-bottom: 0 !important; + border-width: 1px 1px 0 1px !important; + border-left-color: transparent; + border-right-color: transparent; +} + +.ext-ie6 fieldset.x-panel-collapsed { + padding-bottom: 0 !important; + border-width: 1px 0 0 0 !important; + margin-left: 1px; + margin-right: 1px; +} + +fieldset.x-panel-collapsed .x-fieldset-bwrap { + visibility: hidden; + position: absolute; + left: -1000px; + top: -1000px; +} + +.ext-ie .x-fieldset-bwrap { + zoom: 1; +} + +.x-fieldset-noborder { + border: 0px none transparent; +} + +.x-fieldset-noborder legend { + margin-left: -3px; +} + +.ext-ie .x-fieldset-noborder legend { + position: relative; + margin-bottom: 23px; +} + +.ext-ie .x-fieldset-noborder legend span { + position: absolute; + left: 16px; +} + +.ext-gecko .x-form-item { + -moz-outline: none; + outline: 0 none; +} + +.x-hide-label label.x-form-item-label { + display: none !important; +} + +.x-hide-label .x-form-element { + padding-left: 0 !important; +} + +.x-fieldset { + overflow: hidden; +} + +/* make top of checkbox/tools visible in webkit */ +.ext-webkit .x-fieldset-header, .ext-ie .x-fieldset-header { + padding-top: 1px; +} + +.x-fieldset-bwrap { + overflow: hidden; + zoom: 1; +} + +.x-fieldset-body { + overflow: hidden; +} + +.x-combo-list .x-combo-selected { + border-color: #a3bae9 !important; +} + +.x-combo-list { + background-color: white !important; +} + +.ext-gecko .x-form-file { + height: inherit !important; +} + +.x-form-check { + background: none !important +} + +.x-form-radio { + background: none !important +} + +.x-form-label { + padding: 2px 3px 3px 0px; + font-size: 12px; +} + +.x-form-label-top .x-form-item { + padding-bottom: 0px; + margin-bottom: 2px; +} + +.ext-safari .x-form-text { + height: 22px; /* safari always same size */ + padding: 0 3px; + /* remove extra top/bottom padding */ +} + +.ext-safari .x-small-editor .x-form-text { + height: 20px; +} + +.x-form-group-label,.x-form-cb-label { + font: normal 12px tahoma, arial, helvetica, sans-serif; + padding-right: 10px; +} + +.x-form-list { + background: #FFFFFF url(../images/default/form/text-bg.gif) repeat-x scroll 0 0; + border: 1px solid #B5B8C8; +} + +/* + * FileUploadField component styles + */ +.x-form-file-wrap { + height: 22px; +} + +.x-form-file-wrap .x-form-file { + position: absolute; + right: 0; + -moz-opacity: 0; + filter: alpha(opacity : 0); + opacity: 0; + z-index: 2; + height: 22px; + top: 0; +} + +.x-form-file-wrap .x-form-file-btn { + position: absolute; + right: 0; + z-index: 1; + top: 0; +} + +.x-form-file-wrap .x-form-file-text { + z-index: 3; + color: #777; +} + +.x-form-invalid-icon { + background-position: 0 0 !important; +} + +.x-triggerfield-noedit { + cursor: pointer; +} + +.ext-webkit .x-form-checkbox:focus { + outline: auto !important; +} + +.x-spinner-field .x-form-twin-triggers .x-form-spinner-up, .x-spinner-field .x-form-twin-triggers .x-form-spinner-down { + height: 10px; + position: absolute; +} + +.ext-strict .ext-safari .x-form-field-wrap .x-form-spinner-up { + height: 10px; +} + +.ext-strict .ext-safari .x-form-field-wrap .x-form-spinner-down { + height: 12px; +} + +.x-spinner-field .x-form-twin-triggers .x-form-spinner-up { + top:0px; +} + +.x-spinner-field .x-form-twin-triggers .x-form-spinner-down { + top:11px; +} + +.x-spinner-field .x-form-twin-triggers { + width: 17px; +} + +.x-spinner-field .x-form-spinner-down { + background-position:0 -12px; +} + +.x-trigger-wrap-focus .x-form-spinner-up { + background-position:-85px 0; +} + +.x-trigger-wrap-focus .x-form-spinner-down { + background-position:-85px -12px; +} + +.x-form-field-wrap .x-form-spinner-overup{ + background-position:-17px 0; +} +.x-form-field-wrap .x-form-spinner-clickup{ + background-position:-34px 0; +} + +.x-trigger-wrap-focus .x-form-spinner-overup{ + background-position:-102px 0; +} + +.x-trigger-wrap-focus .x-form-spinner-clickup{ + background-position:-119px 0; +} + +.x-form-field-wrap .x-form-spinner-overdown{ + background-position:-51px -12px; +} +.x-form-field-wrap .x-form-spinner-clickdown{ + background-position:-68px -12px; +} +.x-trigger-wrap-focus .x-form-spinner-overdown{ + background-position:-136px -12px; +} +.x-trigger-wrap-focus .x-form-spinner-clickdown{ + background-position:-153px -12px; +}.x-btn{ + cursor:pointer; + white-space: nowrap; +} +.x-btn button{ + border:0 none; + background:transparent; + padding-left:3px; + padding-right:3px; + cursor:pointer; + margin:0; + overflow:hidden; + width:auto; + -moz-outline:0 none; + outline:0 none; +} +* html .ext-ie .x-btn button { + width:1px; +} +.ext-ie .x-item-disabled .x-btn-mc img { + filter: alpha(opacity=60); +} +.ext-gecko .x-btn button,.ext-webkit .x-btn button { + padding-left:0; + padding-right:0; +} +.ext-gecko .x-btn button::-moz-focus-inner { + padding:0; +} +.ext-ie .x-btn button { + padding-top:2px; +} +.x-btn td { + padding:0 !important; +} +.x-btn-text { + cursor:pointer; + white-space: nowrap; + padding:0; +} +.x-btn-noicon .x-btn-small .x-btn-text{ + height: 16px; +} +.x-btn-noicon .x-btn-medium .x-btn-text{ + height: 24px; +} +.x-btn-noicon .x-btn-large .x-btn-text{ + height: 32px; +} +.x-btn-icon .x-btn-text{ + background-position: center; + background-repeat: no-repeat; +} +.x-btn-icon .x-btn-small .x-btn-text{ + height: 16px; + width: 16px; +} +.x-btn-icon .x-btn-medium .x-btn-text{ + height: 24px; + width: 24px; +} +.x-btn-icon .x-btn-large .x-btn-text{ + height: 32px; + width: 32px; +} +.x-btn-text-icon .x-btn-icon-small-left .x-btn-text{ + background-position: 0 center; + background-repeat: no-repeat; + padding-left:18px; + height:16px; +} +.x-btn-text-icon .x-btn-icon-medium-left .x-btn-text{ + background-position: 0 center; + background-repeat: no-repeat; + padding-left:26px; + height:24px; +} +.x-btn-text-icon .x-btn-icon-large-left .x-btn-text{ + background-position: 0 center; + background-repeat: no-repeat; + padding-left:34px; + height:32px; +} +.x-btn-text-icon .x-btn-icon-small-top .x-btn-text{ + background-position: center 0; + background-repeat: no-repeat; + padding-top:18px; +} +.x-btn-text-icon .x-btn-icon-medium-top .x-btn-text{ + background-position: center 0; + background-repeat: no-repeat; + padding-top:26px; +} +.x-btn-text-icon .x-btn-icon-large-top .x-btn-text{ + background-position: center 0; + background-repeat: no-repeat; + padding-top:34px; +} +.x-btn-text-icon .x-btn-icon-small-right .x-btn-text{ + background-position: right center; + background-repeat: no-repeat; + padding-right:18px; + height:16px; +} +.x-btn-text-icon .x-btn-icon-medium-right .x-btn-text{ + background-position: right center; + background-repeat: no-repeat; + padding-right:26px; + height:24px; +} +.x-btn-text-icon .x-btn-icon-large-right .x-btn-text{ + background-position: right center; + background-repeat: no-repeat; + padding-right:34px; + height:32px; +} +.x-btn-text-icon .x-btn-icon-small-bottom .x-btn-text{ + background-position: center bottom; + background-repeat: no-repeat; + padding-bottom:18px; +} +.x-btn-text-icon .x-btn-icon-medium-bottom .x-btn-text{ + background-position: center bottom; + background-repeat: no-repeat; + padding-bottom:26px; +} +.x-btn-text-icon .x-btn-icon-large-bottom .x-btn-text{ + background-position: center bottom; + background-repeat: no-repeat; + padding-bottom:34px; +} +.x-btn-tr i, .x-btn-tl i, .x-btn-mr i, .x-btn-ml i, .x-btn-br i, .x-btn-bl i{ + font-size:1px; + line-height:1px; + width:3px; + display:block; + overflow:hidden; +} +.x-btn-tr i, .x-btn-tl i, .x-btn-br i, .x-btn-bl i{ + height:3px; +} +.x-btn-tl{ + width:3px; + height:3px; + background:no-repeat 0 0; +} +.x-btn-tr{ + width:3px; + height:3px; + background:no-repeat -3px 0; +} +.x-btn-tc{ + height:3px; + background:repeat-x 0 -6px; +} +.x-btn-ml{ + width:3px; + background:no-repeat 0 -24px; +} +.x-btn-mr{ + width:3px; + background:no-repeat -3px -24px; +} +.x-btn-mc{ + background:repeat-x 0 -1096px; + vertical-align: middle; + text-align:center; + padding:0 5px; + cursor:pointer; + white-space:nowrap; +} +.x-btn-bl{ + width:3px; + height:3px; + background:no-repeat 0 -3px; +} +.x-btn-br{ + width:3px; + height:3px; + background:no-repeat -3px -3px; +} +.x-btn-bc{ + height:3px; + background:repeat-x 0 -15px; +} +.x-btn-over .x-btn-tl{ + background-position: -6px 0; +} +.x-btn-over .x-btn-tr{ + background-position: -9px 0; +} +.x-btn-over .x-btn-tc{ + background-position: 0 -9px; +} +.x-btn-over .x-btn-ml{ + background-position: -6px -24px; +} +.x-btn-over .x-btn-mr{ + background-position: -9px -24px; +} +.x-btn-over .x-btn-mc{ + background-position: 0 -2168px; +} +.x-btn-over .x-btn-bl{ + background-position: -6px -3px; +} +.x-btn-over .x-btn-br{ + background-position: -9px -3px; +} +.x-btn-over .x-btn-bc{ + background-position: 0 -18px; +} +.ext-webkit .x-btn-focus .x-btn-tl{ + background-position: -6px 0; +} +.ext-webkit .x-btn-focus .x-btn-tr{ + background-position: -9px 0; +} +.ext-webkit .x-btn-focus .x-btn-tc{ + background-position: 0 -9px; +} +.ext-webkit .x-btn-focus .x-btn-ml{ + background-position: -6px -24px; +} +.ext-webkit .x-btn-focus .x-btn-mr{ + background-position: -9px -24px; +} +.ext-webkit .x-btn-focus .x-btn-mc{ + background-position: 0 -2168px; +} +.ext-webkit .x-btn-focus .x-btn-bl{ + background-position: -6px -3px; +} +.ext-webkit .x-btn-focus .x-btn-br{ + background-position: -9px -3px; +} +.ext-webkit .x-btn-focus .x-btn-bc{ + background-position: 0 -18px; +} +.x-btn-click .x-btn-tl, .x-btn-menu-active .x-btn-tl, .x-btn-pressed .x-btn-tl{ + background-position: -12px 0 !important; +} +.x-btn-click .x-btn-tr, .x-btn-menu-active .x-btn-tr, .x-btn-pressed .x-btn-tr{ + background-position: -15px 0 !important; +} +.x-btn-click .x-btn-tc, .x-btn-menu-active .x-btn-tc, .x-btn-pressed .x-btn-tc{ + background-position: 0 -12px !important; +} +.x-btn-click .x-btn-ml, .x-btn-menu-active .x-btn-ml, .x-btn-pressed .x-btn-ml{ + background-position: -12px -24px !important; +} +.x-btn-click .x-btn-mr, .x-btn-menu-active .x-btn-mr, .x-btn-pressed .x-btn-mr{ + background-position: -15px -24px !important; +} +.x-btn-click .x-btn-mc, .x-btn-menu-active .x-btn-mc, .x-btn-pressed .x-btn-mc{ + background-position: 0 -3240px !important; +} +.x-btn-click .x-btn-bl, .x-btn-menu-active .x-btn-bl, .x-btn-pressed .x-btn-bl{ + background-position: -12px -3px !important; +} +.x-btn-click .x-btn-br, .x-btn-menu-active .x-btn-br, .x-btn-pressed .x-btn-br{ + background-position: -15px -3px !important; +} +.x-btn-click .x-btn-bc, .x-btn-menu-active .x-btn-bc, .x-btn-pressed .x-btn-bc{ + background-position: 0 -21px !important; +} +.x-btn-disabled *{ + cursor:default !important; +} +.x-btn-mc em.x-btn-arrow { + display:block; + background:transparent no-repeat right center; + padding-right:10px; +} +.x-btn-mc em.x-btn-split { + display:block; + background:transparent no-repeat right center; + padding-right:14px; +} +.x-btn-mc em.x-btn-arrow-bottom { + display:block; + background:transparent no-repeat center bottom; + padding-bottom:14px; +} +.x-btn-mc em.x-btn-split-bottom { + display:block; + background:transparent no-repeat center bottom; + padding-bottom:14px; +} +.x-btn-as-arrow .x-btn-mc em { + display:block; + background:transparent; + padding-bottom:14px; +} +.x-btn-group { + padding:1px; +} +.x-btn-group-header { + padding:2px; + text-align:center; +} +.x-btn-group-tc { + background: transparent repeat-x 0 0; + overflow:hidden; +} +.x-btn-group-tl { + background: transparent no-repeat 0 0; + padding-left:3px; + zoom:1; +} +.x-btn-group-tr { + background: transparent no-repeat right 0; + zoom:1; + padding-right:3px; +} +.x-btn-group-bc { + background: transparent repeat-x 0 bottom; + zoom:1; +} +.x-btn-group-bc .x-panel-footer { + zoom:1; +} +.x-btn-group-bl { + background: transparent no-repeat 0 bottom; + padding-left:3px; + zoom:1; +} +.x-btn-group-br { + background: transparent no-repeat right bottom; + padding-right:3px; + zoom:1; +} +.x-btn-group-mc { + border:0 none; + padding:1px 0 0 0; + margin:0; +} +.x-btn-group-mc .x-btn-group-body { + background:transparent; + border: 0 none; +} +.x-btn-group-ml { + background: transparent repeat-y 0 0; + padding-left:3px; + zoom:1; +} +.x-btn-group-mr { + background: transparent repeat-y right 0; + padding-right:3px; + zoom:1; +} +.x-btn-group-bc .x-btn-group-footer { + padding-bottom:6px; +} +.x-panel-nofooter .x-btn-group-bc { + height:3px; + font-size:0; + line-height:0; +} +.x-btn-group-bwrap { + overflow:hidden; + zoom:1; +} +.x-btn-group-body { + overflow:hidden; + zoom:1; +} +.x-btn-group-notitle .x-btn-group-tc { + background: transparent repeat-x 0 0; + overflow:hidden; + height:2px; +} +.x-toolbar{ + border-style:solid; + border-width:0 0 1px 0; + display: block; + padding:2px; + background:repeat-x top left; + position:relative; + left:0; + top:0; + zoom:1; + overflow:hidden; +} +.x-toolbar .x-item-disabled .x-btn-icon { + opacity: .35; + -moz-opacity: .35; + filter: alpha(opacity=35); +} +.x-toolbar td { + vertical-align:middle; +} +.x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label{ + white-space: nowrap; +} +.x-toolbar .x-item-disabled { + cursor:default; + opacity:.6; + -moz-opacity:.6; + filter:alpha(opacity=60); +} + +.x-toolbar .x-item-disabled *{ + cursor:default; +} + +.x-toolbar .x-toolbar-cell { + vertical-align:middle; +} +.x-toolbar .x-btn-tl, .x-toolbar .x-btn-tr, .x-toolbar .x-btn-tc, .x-toolbar .x-btn-ml, .x-toolbar .x-btn-mr, +.x-toolbar .x-btn-mc, .x-toolbar .x-btn-bl, .x-toolbar .x-btn-br, .x-toolbar .x-btn-bc +{ + background-position: 500px 500px; +} +.x-toolbar .x-btn-over .x-btn-tl{ + background-position: -6px 0; +} +.x-toolbar .x-btn-over .x-btn-tr{ + background-position: -9px 0; +} +.x-toolbar .x-btn-over .x-btn-tc{ + background-position: 0 -9px; +} +.x-toolbar .x-btn-over .x-btn-ml{ + background-position: -6px -24px; +} +.x-toolbar .x-btn-over .x-btn-mr{ + background-position: -9px -24px; +} +.x-toolbar .x-btn-over .x-btn-mc{ + background-position: 0 -2168px; +} +.x-toolbar .x-btn-over .x-btn-bl{ + background-position: -6px -3px; +} +.x-toolbar .x-btn-over .x-btn-br{ + background-position: -9px -3px; +} +.x-toolbar .x-btn-over .x-btn-bc{ + background-position: 0 -18px; +} +.x-toolbar .x-btn-click .x-btn-tl, .x-toolbar .x-btn-menu-active .x-btn-tl, .x-toolbar .x-btn-pressed .x-btn-tl{ + background-position: -12px 0; +} +.x-toolbar .x-btn-click .x-btn-tr, .x-toolbar .x-btn-menu-active .x-btn-tr, .x-toolbar .x-btn-pressed .x-btn-tr{ + background-position: -15px 0; +} +.x-toolbar .x-btn-click .x-btn-tc, .x-toolbar .x-btn-menu-active .x-btn-tc, .x-toolbar .x-btn-pressed .x-btn-tc{ + background-position: 0 -12px; +} +.x-toolbar .x-btn-click .x-btn-ml, .x-toolbar .x-btn-menu-active .x-btn-ml, .x-toolbar .x-btn-pressed .x-btn-ml{ + background-position: -12px -24px; +} +.x-toolbar .x-btn-click .x-btn-mr, .x-toolbar .x-btn-menu-active .x-btn-mr, .x-toolbar .x-btn-pressed .x-btn-mr{ + background-position: -15px -24px; +} +.x-toolbar .x-btn-click .x-btn-mc, .x-toolbar .x-btn-menu-active .x-btn-mc, .x-toolbar .x-btn-pressed .x-btn-mc{ + background-position: 0 -3240px; +} +.x-toolbar .x-btn-click .x-btn-bl, .x-toolbar .x-btn-menu-active .x-btn-bl, .x-toolbar .x-btn-pressed .x-btn-bl{ + background-position: -12px -3px; +} +.x-toolbar .x-btn-click .x-btn-br, .x-toolbar .x-btn-menu-active .x-btn-br, .x-toolbar .x-btn-pressed .x-btn-br{ + background-position: -15px -3px; +} +.x-toolbar .x-btn-click .x-btn-bc, .x-toolbar .x-btn-menu-active .x-btn-bc, .x-toolbar .x-btn-pressed .x-btn-bc{ + background-position: 0 -21px; +} +.x-toolbar div.xtb-text{ + padding:2px 2px 0; + line-height:16px; + display:block; +} +.x-toolbar .xtb-sep { + background-position: center; + background-repeat: no-repeat; + display: block; + font-size: 1px; + height: 16px; + width:4px; + overflow: hidden; + cursor:default; + margin: 0 2px 0; + border:0; +} +.x-toolbar .xtb-spacer { + width:2px; +} +.x-tbar-page-number{ + width:24px; + height:14px; +} +.x-paging-info { + position:absolute; + top:5px; + right: 8px; +} +.x-toolbar-ct { + width:100%; +} +.x-panel-tbar, .x-panel-bbar, .x-window-tbar, .x-window-bbar, .x-tab-panel-tbar, .x-tab-panel-bbar, .x-plain-tbar, .x-plain-bbar { + overflow:hidden; + zoom:1; +} +.x-toolbar-more .x-btn-small .x-btn-text{ + height: 16px; + width: 12px; +} +.x-toolbar-more em.x-btn-arrow { + display:inline; + background:transparent; + padding-right:0; +} +.x-toolbar-more .x-btn-mc em.x-btn-arrow { + background-image: none; +} +div.x-toolbar-no-items { + color:gray !important; + padding:5px 10px !important; +}.x-resizable-handle { + position:absolute; + z-index:100; + font-size:1px; + line-height:6px; + overflow:hidden; + filter:alpha(opacity=0); + opacity:0; + zoom:1; +} +.x-resizable-handle-east{ + width:6px; + cursor:e-resize; + right:0; + top:0; + height:100%; +} +.ext-ie .x-resizable-handle-east { + margin-right:-1px; +} +.x-resizable-handle-south{ + width:100%; + cursor:s-resize; + left:0; + bottom:0; + height:6px; +} +.ext-ie .x-resizable-handle-south { + margin-bottom:-1px; +} +.x-resizable-handle-west{ + width:6px; + cursor:w-resize; + left:0; + top:0; + height:100%; +} +.x-resizable-handle-north{ + width:100%; + cursor:n-resize; + left:0; + top:0; + height:6px; +} +.x-resizable-handle-southeast{ + width:6px; + cursor:se-resize; + right:0; + bottom:0; + height:6px; + z-index:101; +} +.x-resizable-handle-northwest{ + width:6px; + cursor:nw-resize; + left:0; + top:0; + height:6px; + z-index:101; +} +.x-resizable-handle-northeast{ + width:6px; + cursor:ne-resize; + right:0; + top:0; + height:6px; + z-index:101; +} +.x-resizable-handle-southwest{ + width:6px; + cursor:sw-resize; + left:0; + bottom:0; + height:6px; + z-index:101; +} +.x-resizable-over .x-resizable-handle, .x-resizable-pinned .x-resizable-handle{ + filter:alpha(opacity=100); + opacity:1; +} +.x-resizable-over .x-resizable-handle-east, .x-resizable-pinned .x-resizable-handle-east, +.x-resizable-over .x-resizable-handle-west, .x-resizable-pinned .x-resizable-handle-west +{ + background-position: left; +} +.x-resizable-over .x-resizable-handle-south, .x-resizable-pinned .x-resizable-handle-south, +.x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north +{ + background-position: top; +} +.x-resizable-over .x-resizable-handle-southeast, .x-resizable-pinned .x-resizable-handle-southeast{ + background-position: top left; +} +.x-resizable-over .x-resizable-handle-northwest, .x-resizable-pinned .x-resizable-handle-northwest{ + background-position:bottom right; +} +.x-resizable-over .x-resizable-handle-northeast, .x-resizable-pinned .x-resizable-handle-northeast{ + background-position: bottom left; +} +.x-resizable-over .x-resizable-handle-southwest, .x-resizable-pinned .x-resizable-handle-southwest{ + background-position: top right; +} +.x-resizable-proxy{ + border: 1px dashed; + position:absolute; + overflow:hidden; + display:none; + left:0; + top:0; + z-index:50000; +} +.x-resizable-overlay{ + width:100%; + height:100%; + display:none; + position:absolute; + left:0; + top:0; + z-index:200000; + -moz-opacity: 0; + opacity:0; + filter: alpha(opacity=0); +} +.x-grid3 { + position: relative; + overflow: hidden; +} + +.x-grid-panel { + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.x-grid-panel .x-panel-body { + overflow: hidden !important; +} + +.x-grid-panel .x-panel-mc .x-panel-body { + border: 1px solid; +} + +.x-grid3 .x-grid3-row-table, .x-grid3 .x-grid3-summary-table { + table-layout: fixed; +} + +.x-grid3-viewport { + overflow: hidden; +} + +.x-grid3-hd-row .x-grid3-hd,.x-grid3-row .x-grid3-hd,.x-grid3-summary-row .x-grid3-hd { + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.x-grid3-summary-row { + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore; + outline: 0 none; +} + +.x-grid3-row td.x-grid3-cell,.x-grid3-summary-row td.x-grid3-cell { + line-height: 14px; + vertical-align: top; + padding-left: 1px; + padding-right: 1px; + -moz-outline: none; + outline: 0 none; +} + +.x-grid3-hd-row .x-grid3-hd { + line-height: 15px; + vertical-align: middle; + border-left: 1px solid; + border-right: 1px solid; +} + +.x-grid3-hd-row .x-grid3-marker-hd { + padding: 3px; +} + +.x-grid3-row .x-grid3-marker { + padding: 3px; +} + +.x-grid3-cell-inner,.x-grid3-hd-inner { + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + padding: 3px 3px 3px 5px; + white-space: nowrap; +} + +.x-grid3-hd-inner { + position: relative; + cursor: inherit; + padding: 4px 3px 4px 5px; + vertical-align: middle; +} + +.x-grid3-row-body { + white-space: normal; + font-size: 11px; +} + +.x-grid3-body-cell { + -moz-outline: 0 none; + outline: 0 none; +} + +.ext-ie .x-grid3-cell-inner,.ext-ie .x-grid3-hd-inner { + width: 100%; +} + +.ext-strict .x-grid3-cell-inner,.ext-strict .x-grid3-hd-inner { + width: auto; +} + +.x-grid-row-loading { + background: no-repeat center center; +} + +.x-grid-page { + overflow: hidden; +} + +.x-grid3-row { + cursor: default; + border: 1px solid; + width: 100%; +} + +.x-grid3-row-over { + border: 1px solid; + background: repeat-x left top; +} + +.x-grid3-resize-proxy { + width: 1px; + left: 0; + cursor: e-resize; + cursor: col-resize; + position: absolute; + top: 0; + height: 100px; + overflow: hidden; + visibility: hidden; + border: 0 none; + z-index: 7; +} + +.x-grid3-resize-marker { + width: 1px; + left: 0; + position: absolute; + top: 0; + height: 100px; + overflow: hidden; + visibility: hidden; + border: 0 none; + z-index: 7; +} + +.x-grid3-focus { + position: absolute; + left: 0; + top: 0; + width: 1px; + height: 1px; + line-height: 1px; + font-size: 1px; + -moz-outline: 0 none; + outline: 0 none; + -moz-user-select: text; + -khtml-user-select: text; + -webkit-user-select: ignore; +} + +.x-grid3-header { + background: repeat-x 0 bottom; + cursor: default; + zoom: 1; + padding: 0px 0 0 0; +} + +.x-grid3-header-pop { + border-left: 1px solid; + float: right; + clear: none; +} + +.x-grid3-header-pop-inner { + border-left: 1px solid; + width: 14px; + height: 19px; + background: transparent no-repeat center center; +} + +.ext-ie .x-grid3-header-pop-inner { + width: 15px; +} + +.ext-strict .x-grid3-header-pop-inner { + width: 14px; +} + +.x-grid3-header-inner { + overflow: hidden; + zoom: 1; + float: left; +} + +.x-grid3-header-offset { + padding-left: 1px; +} + +td.x-grid3-hd-over,td.sort-desc,td.sort-asc,td.x-grid3-hd-menu-open { + border-left: 1px solid; + border-right: 1px solid; +} + +td.x-grid3-hd-over .x-grid3-hd-inner,td.sort-desc .x-grid3-hd-inner,td.sort-asc .x-grid3-hd-inner,td.x-grid3-hd-menu-open .x-grid3-hd-inner + { + background: repeat-x left bottom; +} + +.x-grid3-sort-icon { + background-repeat: no-repeat; + display: none; + height: 4px; + width: 13px; + margin-left: 3px; + vertical-align: middle; +} + +.sort-asc .x-grid3-sort-icon,.sort-desc .x-grid3-sort-icon { + display: inline; +} + +.ext-strict .ext-ie .x-grid3-header-inner,.ext-strict .ext-ie6 .x-grid3-hd { + position: relative; +} + +.ext-strict .ext-ie6 .x-grid3-hd-inner { + position: static; +} + +.x-grid3-body { + zoom: 1; +} + +.x-grid3-scroller { + overflow: auto; + zoom: 1; + position: relative; +} + +.x-grid3-cell-text,.x-grid3-hd-text { + display: block; + padding: 3px 5px 3px 5px; +} + +.x-grid3-split { + background-position: center; + background-repeat: no-repeat; + cursor: e-resize; + cursor: col-resize; + display: block; + font-size: 1px; + height: 16px; + overflow: hidden; + position: absolute; + top: 2px; + width: 6px; + z-index: 3; +} + +.x-dd-drag-proxy .x-grid3-hd-inner { + background: repeat-x left bottom; + width: 120px; + padding: 3px; + border: 1px solid; + overflow: hidden; +} + +.col-move-top,.col-move-bottom { + width: 9px; + height: 9px; + position: absolute; + top: 0; + line-height: 1px; + font-size: 1px; + overflow: hidden; + visibility: hidden; + z-index: 20000; + background: transparent no-repeat left top; +} + +.x-grid3-row-selected { + border: 1px dotted; +} + +.x-grid3-locked td.x-grid3-row-marker,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker { + background: repeat-x 0 bottom !important; + vertical-align: middle !important; + padding: 0; + border-top: 1px solid; + border-bottom: none !important; + border-right: 1px solid !important; + text-align: center; +} + +.x-grid3-locked td.x-grid3-row-marker div,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker div { + padding: 0 4px; + text-align: center; +} + +.x-grid3-dirty-cell { + background: transparent no-repeat 0 0; +} + +.x-grid3-invalid-cell { + background: repeat-x bottom; +} + +.x-grid3-topbar,.x-grid3-bottombar { + overflow: hidden; + display: none; + zoom: 1; + position: relative; +} + +.x-grid3-topbar .x-toolbar { + border-right: 0 none; +} + +.x-grid3-bottombar .x-toolbar { + border-right: 0 none; + border-bottom: 0 none; + border-top: 1px solid; +} + +.x-props-grid .x-grid3-cell { + padding: 1px; +} + +.x-props-grid .x-grid3-td-name .x-grid3-cell-inner { + background: transparent repeat-y -16px !important; + padding-left: 12px; +} + +.x-props-grid .x-grid3-body .x-grid3-td-name { + padding: 1px; + padding-right: 0; + border: 0 none; + border-right: 1px solid; +} + +.x-grid3-col-dd { + border: 0 none; + padding: 0; + background: transparent; +} + +.x-dd-drag-ghost .x-grid3-dd-wrap { + padding: 1px 3px 3px 1px; +} + +.x-grid3-hd { + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore; +} + +.x-grid3-hd-btn { + display: none; + position: absolute; + width: 14px; + background: no-repeat left center; + right: 0; + top: 0; + z-index: 2; + cursor: pointer; + outline: none; +} + +.x-grid3-hd-over .x-grid3-hd-btn,.x-grid3-hd-menu-open .x-grid3-hd-btn { + display: block; +} + +a.x-grid3-hd-btn:hover { + background-position: -14px center; +} + +.x-grid3-body .x-grid3-td-expander { + background: transparent repeat-y right; +} + +.x-grid3-body .x-grid3-td-expander .x-grid3-cell-inner { + padding: 0 !important; + height: 100%; +} + +.x-grid3-row-expander { + width: 100%; + height: 18px; + background-position: 4px 2px; + background-repeat: no-repeat; + background-color: transparent; +} + +.x-grid3-row-collapsed .x-grid3-row-expander { + background-position: 4px 2px; +} + +.x-grid3-row-expanded .x-grid3-row-expander { + background-position: -21px 2px; +} + +.x-grid3-row-collapsed .x-grid3-row-body { + display: none !important; +} + +.x-grid3-row-expanded .x-grid3-row-body { + display: block !important; +} + +.x-grid3-body .x-grid3-td-checker { + background: transparent repeat-y right; +} + +.x-grid3-body .x-grid3-td-checker .x-grid3-cell-inner,.x-grid3-header .x-grid3-td-checker .x-grid3-hd-inner { + padding: 0 !important; + height: 100%; +} + +.x-grid3-group-checker { + float: left; +} + +.x-grid3-row-checker,.x-grid3-hd-checker { + width: 100%; + height: 18px; + background-position: 2px 2px; + background-repeat: no-repeat; + background-color: transparent; +} + +.x-grid3-hd-checker { + padding-bottom: 0px !important; +} + +.x-grid3-row .x-grid3-row-checker { + background-position: 2px 2px; +} + +.x-grid3-row-selected .x-grid3-row-checker,.x-grid3-hd-checker-on .x-grid3-hd-checker,.x-grid3-row-checked .x-grid3-row-checker + { + background-position: -23px 2px; +} + +.x-grid3-hd-checker { + background-position: 2px 3px; +} + +.x-grid3-hd-checker-on .x-grid3-hd-checker { + background-position: -23px 3px; +} + +.x-grid3-body .x-grid3-td-numberer { + background: transparent repeat-y right; +} + +.x-grid3-body .x-grid3-td-numberer .x-grid3-cell-inner { + padding: 3px 5px 0 0 !important; + text-align: right; +} + +.x-grid3-body .x-grid3-td-row-icon { + background: transparent repeat-y right; + vertical-align: top; + text-align: center; +} + +.x-grid3-body .x-grid3-td-row-icon .x-grid3-cell-inner { + padding: 0 !important; + background-position: center center; + background-repeat: no-repeat; + width: 16px; + height: 16px; + margin-left: 2px; + margin-top: 3px; +} + +.x-grid3-body .x-grid3-row-selected .x-grid3-td-numberer,.x-grid3-body .x-grid3-row-selected .x-grid3-td-checker,.x-grid3-body .x-grid3-row-selected .x-grid3-td-expander + { + background: transparent repeat-y right; +} + +.x-grid3-body .x-grid3-check-col-td .x-grid3-cell-inner { + padding: 1px 0 0 0 !important; +} + +.x-grid3-check-col { + width: 100%; + height: 16px; + background-position: center center; + background-repeat: no-repeat; + background-color: transparent; +} + +.x-grid3-check-col-on { + width: 100%; + height: 16px; + background-position: center center; + background-repeat: no-repeat; + background-color: transparent; +} + +.x-grid-group,.x-grid-group-body,.x-grid-group-hd { + zoom: 1; +} + +.x-grid-group-hd { + border-bottom: 2px solid; + cursor: pointer; + padding-top: 6px; +} + +.x-grid-group-hd .x-grid-group-div { + background: transparent no-repeat 3px -47px; + padding: 4px 4px 4px 17px; +} + +.x-grid-group-collapsed .x-grid-group-hd .x-grid-group-div { + background-position: 3px 3px; +} + +.x-grid-group-collapsed .x-grid-group-body { + display: none; +} + +.x-grid-empty { + padding: 10px; +} + +.ext-ie7 .x-grid-panel .x-panel-bbar { + position: relative; +} + +.x-grid-with-col-lines .x-grid3-row td.x-grid3-cell { + padding-right: 0; + border-right: 1px solid; +} + +.ext-ie6 .x-grid3-header { + position: relative; +} + +.x-grid3-check-col-disabled { + width: 100%; + height: 16px; + background-position: center center; + background-repeat: no-repeat; +} + +.x-row-editor-header { + height: 2px; + overflow: hidden; +} + +.x-row-editor-footer { + height: 2px; + overflow: hidden; +} + +.ext-ie .x-row-editor-footer { + margin-top: -1px; +} + +.x-row-editor-body { + overflow: hidden; + zoom: 1; + padding-top: 2px; +} + +.x-row-editor .x-btns { + position: absolute; + top: 28px; + left: 20px; + padding-left: 5px; +} + +.x-row-editor .x-btns .x-plain-bwrap { + padding-right: 5px; +} + +.x-row-editor .x-btns .x-plain-body { + height: 31px; +} + +.x-row-editor .x-btns .x-table-layout-cell { + padding: 3px; +} + +.x-grid3-footer { + background: #f7f7f7 none repeat scroll 0 0; + border-top: 1px solid #DDDDDD; + border-bottom: 1px solid #DDDDDD; + display: block; + overflow: hidden; + position: relative; +} + +.x-grid3-footer-row { + border: 1px solid #EEEEEE; + background-color: #f7f7f7; + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore; + cursor: default; +} + +.x-grid3-footer-row td { + line-height: 13px; + vertical-align: top; + padding-left: 1px; + padding-right: 1px; + font: normal 11px arial, tahoma, helvetica, sans-serif; +} + +.ext-ie6 .x-grid3 .x-editor .x-form-text,.ext-ie7 .x-grid3 .x-editor .x-form-text { + top: -1px; +} + +.ext-ie8-compatibility .x-grid3 .x-editor .x-form-text { + top: 0; +} + +.x-grid-panel .x-livegrid-scroller { + z-index: 1; + position: absolute; + right: 0px; + overflow-y: scroll; + overflow-x: hidden; +} + +.x-grid3-group-checker div { + width: 14px; + height: 18px; + background-position: -1 -2px; + background-repeat: no-repeat; + background-color: transparent; +} + +.x-grid-group-hd .x-grid3-group-check { + background-image: url(../images/default/menu/checked.gif); +} + +.x-grid-group-hd .x-grid3-group-uncheck { + background-image: url(../images/default/menu/unchecked.gif); +} + +.x-grid3-hd-row .x-filtered-column { + font-style: italic !important; + font-weight: bold !important; +} + +.ext-strict .ext-gecko .x-inline-editor .x-small-editor .x-form-text { + height: 18px !important; +} +.x-dd-drag-proxy{ + position:absolute; + left:0; + top:0; + visibility:hidden; + z-index:15000; +} +.x-dd-drag-ghost{ + -moz-opacity: 0.85; + opacity:.85; + filter: alpha(opacity=85); + border: 1px solid; + padding:3px; + padding-left:20px; + white-space:nowrap; +} +.x-dd-drag-repair .x-dd-drag-ghost{ + -moz-opacity: 0.4; + opacity:.4; + filter: alpha(opacity=40); + border:0 none; + padding:0; + background-color:transparent; +} +.x-dd-drag-repair .x-dd-drop-icon{ + visibility:hidden; +} +.x-dd-drop-icon{ + position:absolute; + top:3px; + left:3px; + display:block; + width:16px; + height:16px; + background-color:transparent; + background-position: center; + background-repeat: no-repeat; + z-index:1; +} +.x-view-selector { + position:absolute; + left:0; + top:0; + width:0; + border:1px dotted; + opacity: .5; + -moz-opacity: .5; + filter:alpha(opacity=50); + zoom:1; +} + +.x-dd-cursor { + cursor: default !important; +} + +.x-insert-bar { + position: absolute; + + z-index: 99999; +} + +.x-insert-bar td { + line-height: 1px; + font-size: 1px; +} + +.x-insert-left { + background: url(../images/gxt/dd/insert-bg.gif) no-repeat; +} + +.x-insert-mid { + background: url(../images/gxt/dd/insert-bg.gif) repeat-x 0 -12px; +} + +.x-insert-right { + background: url(../images/gxt/dd/insert-bg.gif) no-repeat 0px -6px; +} +.tree-folder { + background: url(../images/gxt/icons/folder-closed.gif) no-repeat center + left !important; +} + +.tree-folder-open { + background: url(../images/gxt/icons/folder.gif) no-repeat center left + !important; +} + +.my-tree { + cursor: default; + font-size: 11px; + -moz-outline: none; + -moz-user-focus: none; +} + +.my-root-item { + padding: 4px; +} + +.my-tree-item,.my-tree-item table,.my-tree-item table td { + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; + font-size: 11px; +} + +.my-tree-item td { + height: 19px; +} + +.my-tree-indent { + line-height: 1px; + font-size: 1px; +} + +.my-tree-joint div { + width: 15px; + height: 19px; + line-height: 1px; + font-size: 1px; +} + +.my-tree-left,.my-tree-left div,.my-tree-right { + line-height: 1px; + font-size: 1px; + width: 3px; +} + +.my-tree-left div,.my-tree-right div { + width: 3px; +} + +.my-tree-item,.my-treeitem-wrap { + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-tree-check div { + width: 17px; + height: 17px; + line-height: 1px; + font-size: 1px; +} + +.my-tree-icon div { + width: 16px; + height: 17px; + cursor: pointer; + background-repeat: no-repeat; + background-position: center; +} + +.my-tree-item-text span { + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 12px; + white-space: nowrap; + padding-left: 3px; + padding-right: 3px; + display: block; + height: 15px; + cursor: pointer; +} + +.my-tree-over .my-tree-left { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left + -57px; +} + +.my-tree-over .my-tree-right { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right + -76px; +} + +.my-tree-over .my-tree-check,.my-tree-over .my-tree-icon,.my-tree-over .my-tree-item-text + { + background: url(../images/gxt/shared/select-19-bg.gif) left -95px; +} + +.my-tree-sel .my-tree-left { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left + 0px; +} + +.my-tree-sel .my-tree-right { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right + -19px; +} + +.my-tree-sel .my-tree-check,.my-tree-sel .my-tree-icon,.my-tree-sel .my-tree-item-text + { + background: url(../images/gxt/shared/select-19-bg.gif) left -38px; +} + +.my-tree-drop .my-tree-left { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left + -115px; +} + +.my-tree-drop .my-tree-right { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right + -133px; +} + +.my-tree-drop .my-tree-check,.my-tree-drop .my-tree-icon,.my-tree-drop .my-tree-item-text + { + background: url(../images/gxt/shared/select-19-bg.gif) left -152px; +} + +.my-tree-close { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px + 1px; +} + +.my-tree-open { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px + -32px; +} + +.my-tree-joint-over .my-tree-open { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px + -48px; +} + +.my-tree-joint-over .my-tree-close { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px + -15px; +} + +.my-tree-notchecked { + background: url(../images/gxt/tree/notchecked.gif) no-repeat 0px 50%; +} + +.my-tree-checked { + background: url(../images/gxt/tree/checked.gif) no-repeat 0px 50%; +} + +.my-tree-loading .tree-folder { + background: url(../images/gxt/icons/wait.gif) no-repeat 0px -1px + !important; +} + +.my-tree-loading .my-tree-item-text span { + font-style: italic; +} + +.x-ftree-selected .x-ftree-text { + background-color: #d9e8fb; +} + +.x-ftree-node-over .x-ftree-text { + background-color: #eee; +} + +.x-ftree-item { + line-height: 18px; +} + +.x-ftree-joint,.x-ftree-icon { + border: 0 none; + height: 18px; + margin: 0; + padding: 0; + vertical-align: top; + width: 16px; + background-position: center; + background-repeat: no-repeat; +} + +.x-ftree-text { + color: black; + font: normal 11px arial, tahoma, helvetica, sans-serif; + white-space: nowrap; + text-decoration: none; + color: black; + padding-left: 4px; + vertical-align: middle; + line-height: 18px; + padding: 2px 4px 4px 4px; +} + +/* some default icons for leaf/folder */ +.x-ftree-expanded .x-ftree-icon { + background-image: url(../images/default/tree/folder-open.gif); +} + +.x-ftree-leaf .x-ftree-icon { + background-image: url(../images/default/tree/leaf.gif); +} + +.x-ftree-collapsed .x-ftree-icon { + background-image: url(../images/gxt/icons/folder-closed.gif); +} + +/* Arrows */ +.x-ftree-arrows .x-ftree-joint { + background: transparent; +} + +.x-ftree-arrows .x-ftree-joint-plus { + background: transparent url(../images/default/tree/arrows.gif) no-repeat + 0 0; +} + +.x-ftree-arrows .x-ftree-joint-minus { + background: transparent url(../images/default/tree/arrows.gif) no-repeat + -16px 0; +} + +.x-ftree-arrows .x-ftree-ec-over .x-ftree-joint-plus { + background-position: -32px 0; +} + +.x-ftree-arrows .x-ftree-ec-over .x-ftree-joint-minus { + background-position: -48px 0; +} + +.x-ftree2-highlightrow { + border: 1px dotted #545352; +} + +.x-ftree2-selected { + background-color: #d9e8fb !important; +} + +.x-ftree2-node-over { + background-color: #eee; +} + +.x-ftree2-node-drop { + background-color: #defadc; +} + +.x-ftree2-joint,.x-ftree2-icon { + border: 0 none; + height: 18px; + margin: 0; + padding: 0; + vertical-align: top; + width: 16px; + background-position: center; + background-repeat: no-repeat; +} + +.x-ftree2-joint div { + width: 16px; +} + +.x-ftree2-el-ct { + display: none; +} + +.x-ftree2-node { + padding-bottom: 1px; +} + +.x-ftree2-text { + vertical-align: middle !important; + white-space: nowrap !important; +} + +.x-ftree2-text span { + color: black; + font: normal 11px arial, tahoma, helvetica, sans-serif; + white-space: nowrap; + text-decoration: none; + color: black; + padding: 2px 4px 2px 1px; + display: block; +} + +.ext-ie .x-ftree2-text span { + padding-left: 3px; +} + +.x-ftree2-check { + width: 17px; +} + +.x-ftree2-check div { + width: 17px; + height: 17px; +} + +/* some default icons for leaf/folder */ +.x-ftree2-expanded .x-ftree2-icon { + background-image: url(../images/default/tree/folder-open.gif); +} + +.x-ftree2-leaf .x-ftree2-icon { + background-image: url(../images/default/tree/leaf.gif); +} + +.x-ftree2-collapsed .x-ftree2-icon { + background-image: url(../images/gxt/icons/folder-closed.gif); +} + +/* Arrows */ +.x-ftree2-arrows .x-ftree2-joint { + background: transparent; +} + +.x-ftree2-arrows .x-ftree2-joint-plus { + background: transparent url(../images/default/tree/arrows.gif) no-repeat + 0 0; +} + +.x-ftree2-arrows .x-ftree2-joint-minus { + background: transparent url(../images/default/tree/arrows.gif) no-repeat + -16px 0; +} + +.x-ftree2-arrows .x-ftree2-ec-over .x-ftree2-joint-plus { + background-position: -32px 0; +} + +.x-ftree2-arrows .x-ftree2-ec-over .x-ftree2-joint-minus { + background-position: -48px 0; +} + +.x-treegrid { + -moz-outline: none; + -moz-user-focus: none; + outline: 0 none; +} + +.x-treegrid .x-treegrid-column .x-grid3-cell-inner { + padding: 0px !important; +} + +.x-tree3 { + cursor: default; + -moz-outline: none; + -moz-user-focus: none; + outline: 0 none; +} + +.ext-strict .ext-gecko .x-tree3, .ext-strict .ext-webkit .x-tree3 { + padding-bottom: 1px; +} + +.x-tree3-node { + cursor: default; +} + +.x-tree3-el { + white-space: nowrap; + height: 21px; + position: relative; +} + +.x-tree3-node-text { + white-space: nowrap; + line-height: 11px; + text-decoration: none; + padding: 0 0 0 3px; + position: relative; + top: -4px; +} + +.ext-ie9 .x-tree3-node-text-widget { + display: block; +} + +.x-tree3-node-ct { + display: none; +} + +.x-tree3-node-text-widget { + position: static !important; + padding: 0px !important; +}.x-date-picker { + border: 1px solid; + border-top:0 none; + position:relative; + -moz-outline:0 none; + outline:0 none; +} +.x-date-picker a { + -moz-outline:0 none; + outline:0 none; +} +.x-date-inner, .x-date-inner td, .x-date-inner th{ + border-collapse:separate; +} +.x-date-middle,.x-date-left,.x-date-right { + background: repeat-x 0 -83px; + overflow:hidden; +} +.x-date-middle .x-btn-tc,.x-date-middle .x-btn-tl,.x-date-middle .x-btn-tr, +.x-date-middle .x-btn-mc,.x-date-middle .x-btn-ml,.x-date-middle .x-btn-mr, +.x-date-middle .x-btn-bc,.x-date-middle .x-btn-bl,.x-date-middle .x-btn-br{ + background:transparent !important; + vertical-align:middle; +} +.x-date-middle .x-btn-mc em.x-btn-arrow { + background:transparent no-repeat right 0; +} +.x-date-right, .x-date-left { + width:18px; +} +.x-date-right{ + text-align:right; +} +.x-date-middle { + padding-top:2px; + padding-bottom:2px; + width:130px; +} +.x-date-right a, .x-date-left a{ + display:block; + width:16px; + height:16px; + background-position: center; + background-repeat: no-repeat; + cursor:pointer; + -moz-opacity: 0.6; + opacity:.6; + filter: alpha(opacity=60); +} +.x-date-right a:hover, .x-date-left a:hover{ + -moz-opacity: 1; + opacity:1; + filter: alpha(opacity=100); +} +.x-date-right a { + margin-right:2px; + text-decoration:none !important; +} +.x-date-left a{ + margin-left:2px; + text-decoration:none !important; +} +table.x-date-inner { + width:100%; + table-layout:fixed; +} +.x-date-inner th { + width:25px; +} +.x-date-inner th { + background: repeat-x left top; + text-align:right !important; + border-bottom: 1px solid; + cursor:default; + padding:0; + border-collapse:separate; +} +.x-date-inner th span { + display:block; + padding:2px; + padding-right:7px; +} +.x-date-inner td { + border: 1px solid; + text-align:right; + padding:0; +} +.x-date-inner a { + padding:2px 5px; + display:block; + text-decoration:none; + text-align:right; + zoom:1; +} +.x-date-inner .x-date-active{ + cursor:pointer; + color:black; +} +.x-date-inner .x-date-selected a{ + background: repeat-x left top; + border:1px solid; + padding:1px 4px; +} +.x-date-inner .x-date-today a{ + border: 1px solid; + padding:1px 4px; +} +.x-date-inner .x-date-prevday a,.x-date-inner .x-date-nextday a { + text-decoration:none !important; +} +.x-date-bottom { + padding:4px; + border-top: 1px solid; + background: repeat-x left top; +} +.x-date-inner a:hover, .x-date-inner .x-date-disabled a:hover{ + text-decoration:none !important; +} +.x-date-inner .x-date-disabled a { + cursor:default; +} +.x-date-mmenu .x-menu-item { + padding:1px 24px 1px 4px; + white-space: nowrap; +} +.x-date-mmenu .x-menu-item .x-menu-item-icon { + width:10px; + height:10px; + margin-right:5px; + background-position:center -4px !important; +} +.x-date-mp { + position:absolute; + left:0; + top:0; + display:none; +} +.x-date-mp td { + padding:2px; + font:normal 11px arial, helvetica,tahoma,sans-serif; +} +td.x-date-mp-month,td.x-date-mp-year,td.x-date-mp-ybtn { + border: 0 none; + text-align:center; + vertical-align: middle; + width:25%; +} +.x-date-mp-ok { + margin-right:3px; +} +.x-date-mp-btns button { + text-decoration:none; + text-align:center; + text-decoration:none !important; + border:1px solid; + padding:1px 3px 1px; + cursor:pointer; +} +.x-date-mp-btns { + background: repeat-x left top; +} +.x-date-mp-btns td { + border-top: 1px solid; + text-align:center; +} +td.x-date-mp-month a,td.x-date-mp-year a { + display:block; + padding:2px 4px; + text-decoration:none; + text-align:center; +} +td.x-date-mp-month a:hover,td.x-date-mp-year a:hover { + text-decoration:none; + cursor:pointer; +} +td.x-date-mp-sel a { + padding:1px 3px; + background: repeat-x left top; + border:1px solid; +} +.x-date-mp-ybtn a { + overflow:hidden; + width:15px; + height:15px; + cursor:pointer; + background:transparent no-repeat; + display:block; + margin:0 auto; +} +.x-date-mp-ybtn a.x-date-mp-next { + background-position:0 -120px; +} +.x-date-mp-ybtn a.x-date-mp-next:hover { + background-position:-15px -120px; +} +.x-date-mp-ybtn a.x-date-mp-prev { + background-position:0 -105px; +} +.x-date-mp-ybtn a.x-date-mp-prev:hover { + background-position:-15px -105px; +} +.x-date-mp-ybtn { + text-align:center; +} +td.x-date-mp-sep { + border-right:1px solid; +} + +.x-date-picker, .x-date-picker a { + font-size: 11px; +} + +.x-date-right-icon { + background-image: url(../images/default/shared/right-btn.gif); + margin-right: 2px; + text-decoration: none !important; +} + +.x-date-left-icon { + background-image: url(../images/default/shared/left-btn.gif); + margin-left: 4px; + text-decoration: none !important; +} + +.x-date-days { + table-layout: fixed; + width: 100%; +} + +.x-date-days td { + width: 25px; + border: none; +} + +.x-date-days td span { + display: block; + padding: 2px 7px 2px 2px; +} + +.x-date-days td { + background: #DFECFB url(../images/default/shared/glass-bg.gif) repeat-x scroll left top; + border-bottom: 1px solid #A3BAD9; + border-collapse: separate; + color: #233D6D; + cursor: default; + font-family: arial, helvetica, tahoma, sans-serif; + font-size: 10px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: normal; + line-height: normal; + padding: 0pt; + text-align: right !important; +} + +.x-date-picker .x-date-header { + background: url(../images/default/shared/hd-sprite.gif) repeat-x 0 -83px; + height: 22px; + left: 10px; + top: 10px; + width: 157px; +} + +.x-date-header .x-btn .x-btn-text { + color: #fff; +} + +.x-date-picker-footer { + width: 100%; +} + +.x-date-picker-footer td { + text-align: center; +} + +.x-date-left { + background: transparent url(../images/default/shared/hd-sprite.gif) repeat-x scroll 0pt -83px; + color: #FFFFFF; + font-family: "sans serif", tahoma, verdana, helvetica; + font-size: 11px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: bold; + line-height: normal; + overflow: hidden; +} + +.x-date-inner .x-date-active-hover { + background: #ddecfe !important; +}.x-tip{ + position: absolute; + top: 0; + left:0; + visibility: hidden; + z-index: 20000; + border:0 none; +} +.x-tip .x-tip-close{ + height: 15px; + float:right; + width: 15px; + margin:0 0 2px 2px; + cursor:pointer; + display:none; +} +.x-tip .x-tip-tc { + background: transparent no-repeat 0 -62px; + padding-top:3px; + overflow:hidden; + zoom:1; +} +.x-tip .x-tip-tl { + background: transparent no-repeat 0 0; + padding-left:6px; + overflow:hidden; + zoom:1; +} +.x-tip .x-tip-tr { + background: transparent no-repeat right 0; + padding-right:6px; + overflow:hidden; + zoom:1; +} +.x-tip .x-tip-bc { + background: transparent no-repeat 0 -121px; + height:3px; + overflow:hidden; +} +.x-tip .x-tip-bl { + background: transparent no-repeat 0 -59px; + padding-left:6px; + zoom:1; +} +.x-tip .x-tip-br { + background: transparent no-repeat right -59px; + padding-right:6px; + zoom:1; +} +.x-tip .x-tip-mc { + border:0 none; +} +.x-tip .x-tip-ml { + background: no-repeat 0 -124px; + padding-left:6px; + zoom:1; +} +.x-tip .x-tip-mr { + background: transparent no-repeat right -124px; + padding-right:6px; + zoom:1; +} +.ext-ie .x-tip .x-tip-header,.ext-ie .x-tip .x-tip-tc { + font-size:0; + line-height:0; +} +.ext-border-box .x-tip .x-tip-header,.ext-border-box .ext-ie .x-tip .x-tip-tc { + line-height:1px; +} +.x-tip .x-tip-header-text { + padding:0; + margin:0 0 2px 0; +} +.x-tip .x-tip-body { + margin:0 !important; + line-height:14px; + padding:0; +} +.x-tip .x-tip-body .loading-indicator { + margin:0; +} +.x-tip-draggable .x-tip-header,.x-tip-draggable .x-tip-header-text { + cursor:move; +} +.x-form-invalid-tip .x-tip-tc { + background: repeat-x 0 -12px; + padding-top:6px; +} +.x-form-invalid-tip .x-tip-bc { + background: repeat-x 0 -18px; + height:6px; +} +.x-form-invalid-tip .x-tip-bl { + background: no-repeat 0 -6px; +} +.x-form-invalid-tip .x-tip-br { + background: no-repeat right -6px; +} +.x-form-invalid-tip .x-tip-body { + padding:2px; +} +.x-form-invalid-tip .x-tip-body { + padding-left:24px; + background:transparent no-repeat 2px 2px; +} +.x-tip-anchor { + position: absolute; + width: 9px; + height: 10px; + overflow:hidden; + background: transparent no-repeat 0 0; + zoom:1; +} +.x-tip-anchor-bottom { + background-position: -9px 0; +} +.x-tip-anchor-right { + background-position: -18px 0; + width: 10px; +} +.x-tip-anchor-left { + background-position: -28px 0; + width: 10px; +} +.x-menu { + border: 1px solid; + z-index: 15000; + zoom: 1; + background: repeat-y; + -moz-outline: none; + outline: 0 none; +} + +.x-menu a { + text-decoration: none !important; +} + +.ext-ie .x-menu { + zoom: 1; + overflow: hidden; +} + +.x-menu-list { + padding: 2px; + background: transparent; + border: 0 none; + overflow: hidden; + overflow-y: hidden; +} + +.ext-strict .ext-ie .x-menu-list { + position: relative; +} + +.x-menu x-menu-sep-li { + font-size: 1px; + line-height: 1px; +} + +.x-menu-list-item { + white-space: nowrap; + display: block; + padding: 1px; +} + +.x-menu-item { + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore +} + +.x-menu-item-arrow { + background: transparent no-repeat right; +} + +.x-menu-sep { + display: block; + font-size: 1px; + line-height: 1px; + margin: 2px 3px; + border-bottom: 1px solid; + overflow: hidden; +} + +.x-menu-focus { + position: absolute; + left: -1px; + top: -1px; + width: 1px; + height: 1px; + line-height: 1px; + font-size: 1px; + -moz-outline: 0 none; + outline: 0 none; + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore + overflow: hidden; + display: block; +} + +a.x-menu-item { + cursor: pointer; + display: block; + line-height: 16px; + outline-color: -moz-use-text-color; + outline-style: none; + outline-width: 0; + padding: 3px 21px 3px 27px; + position: relative; + text-decoration: none; + white-space: nowrap; +} + +.x-menu-item-active { + border-style: solid; + border-width: 1px; + padding: 0; +} + +.x-menu-item-icon { + border: 0 none; + height: 16px; + padding: 0; + vertical-align: top; + width: 16px; + position: absolute; + left: 3px; + top: 3px; + margin: 0; + background-position: center; +} + +.ext-ie .x-menu-item-icon { + left: -24px; +} + +.ext-strict .x-menu-item-icon { + left: 3px; +} + +.ext-ie6 .x-menu-item-icon { + left: -24px; +} + +.ext-ie .x-menu-item-icon { + vertical-align: middle; +} + +.x-date-menu .x-menu-list { + padding: 0; +} + +.x-menu-date-item { + padding: 0; +} + +.x-menu .x-color-palette,.x-menu .x-date-picker { + margin-left: 26px; + margin-right: 4px; +} + +.x-menu .x-date-picker { + border: 1px solid; + margin-top: 2px; + margin-bottom: 2px; +} + +.x-menu-plain .x-color-palette,.x-menu-plain .x-date-picker { + margin: 0; + border: 0 none; +} + +.x-date-menu { + padding: 0 !important; +} + +.x-cycle-menu .x-menu-item-checked { + border: 1px dotted !important; + padding: 0; +} + +.x-menu .x-menu-scroller { + width: 100%; + background-repeat: no-repeat; + background-position: center; + height: 8px; + line-height: 8px; + cursor: pointer; + margin: 0; + padding: 0; +} + +.x-menu .x-menu-scroller-active { + height: 6px; + line-height: 6px; +} + +.x-menu-list-item-indent { + padding-left: 27px !important; +} + +.x-menu-text { + + border-style: solid; + background: #D6E3F2; + border-color:#DAE6F4 #99bbe8 #99bbe8 #DAE6F4; + border-width: 1px; + margin:-2px -2px 0; + color:#15428b; + font:bold 10px tahoma,arial,verdana,sans-serif; + display:block; + padding:3px; +} + +.x-menubar { + padding: 3px; + border-style: solid; + border-width: 0 0 1px 0; + cursor: default; + border-color: #a9bfd3; + background-color: #d0def0; + padding: 3px; + background-image: url(../images/default/toolbar/bg.gif); +} + +.x-menubar-item { + padding: 1px 8px; + font: 12px arial, verdana, sans-serif; +} + +.x-menubar-item-over { + background-color: #98c5f5; +} + +.x-menubar-item-active { + background-color: #98c5f5; +}.x-box-tl { + background: transparent no-repeat 0 0; + zoom:1; +} +.x-box-tc { + height: 8px; + background: transparent repeat-x 0 0; + overflow: hidden; +} +.x-box-tr { + background: transparent no-repeat right -8px; +} +.x-box-ml { + background: transparent repeat-y 0; + padding-left: 4px; + overflow: hidden; + zoom:1; +} +.x-box-mc { + background: repeat-x 0 -16px; + padding: 4px 10px; +} +.x-box-mc h3 { + margin: 0 0 4px 0; + zoom:1; +} +.x-box-mr { + background: transparent repeat-y right; + padding-right: 4px; + overflow: hidden; +} +.x-box-bl { + background: transparent no-repeat 0 -16px; + zoom:1; +} +.x-box-bc { + background: transparent repeat-x 0 -8px; + height: 8px; + overflow: hidden; +} +.x-box-br { + background: transparent no-repeat right -24px; +} +.x-box-tl, .x-box-bl { + padding-left: 8px; + overflow: hidden; +} +.x-box-tr, .x-box-br { + padding-right: 8px; + overflow: hidden; +} +.x-combo-list { + border:1px solid; + zoom:1; + overflow:hidden; + position: absolute; +} +.x-combo-list-inner { + overflow:auto; + position:relative; + zoom:1; + overflow-x:hidden; +} +.x-combo-list-hd { + border-bottom:1px solid; + padding:3px; +} +.x-resizable-pinned .x-combo-list-inner { + border-bottom:1px solid; +} +.x-combo-list-item { + padding:2px; + border:1px solid; + white-space: nowrap; + overflow:hidden; + text-overflow: ellipsis; +} +.x-combo-list .x-combo-selected{ + border:1px dotted !important; + cursor:pointer; +} +.x-combo-list .x-toolbar { + border-top:1px solid; + border-bottom:0 none; +} +.x-panel { + border-style: solid; + border-width:0; + outline: 0 none; +} +.x-panel-header { + overflow:hidden; + zoom:1; + padding:5px 3px 4px 5px; + border:1px solid; + line-height: 15px; + background: transparent repeat-x 0 -1px; +} +.x-panel-body { + border:1px solid; + border-top:0 none; + overflow:hidden; + position: relative; +} +.x-panel-bbar .x-toolbar, .x-panel-tbar .x-toolbar { + border:1px solid; + border-top:0 none; + overflow:hidden; + padding:2px; +} +.x-panel-tbar-noheader .x-toolbar, .x-panel-mc .x-panel-tbar .x-toolbar { + border-top:1px solid; + border-bottom: 0 none; +} +.x-panel-body-noheader, .x-panel-mc .x-panel-body { + border-top:1px solid; +} +.x-panel-header { + overflow:hidden; + zoom:1; +} +.x-panel-tl .x-panel-header { + padding:5px 0 4px 0; + border:0 none; + background:transparent; + line-height: 15px; +} +.x-panel-tl .x-panel-icon, .x-window-tl .x-panel-icon { + padding-left:20px !important; + background-repeat:no-repeat; + background-position:0 4px; + zoom:1; +} +.x-panel-inline-icon { + width:16px; + height:16px; + background-repeat:no-repeat; + background-position:0 0; + vertical-align:middle; + margin-right:4px; + margin-top:-1px; + margin-bottom:-1px; +} +.x-panel-tc { + background: transparent repeat-x 0 0; + overflow:hidden; +} +.ext-strict .ext-ie7 .x-panel-tc { + overflow: visible; +} +.x-panel-tl { + background: transparent no-repeat 0 0; + padding-left:6px; + zoom:1; + border-bottom:1px solid; +} +.x-panel-tr { + background: transparent no-repeat right 0; + zoom:1; + padding-right:6px; +} +.x-panel-bc { + background: transparent repeat-x 0 bottom; + zoom:1; +} +.x-panel-bc .x-panel-footer { + zoom:1; +} +.x-panel-bl { + background: transparent no-repeat 0 bottom; + padding-left:6px; + zoom:1; +} +.x-panel-br { + background: transparent no-repeat right bottom; + padding-right:6px; + zoom:1; +} +.x-panel-mc { + border:0 none; + padding:0; + margin:0; + padding-top:6px; +} +.x-panel-mc .x-panel-body { + background:transparent; + border: 0 none; +} +.x-panel-ml { + background: repeat-y 0 0; + padding-left:6px; + zoom:1; +} +.x-panel-mr { + background: transparent repeat-y right 0; + padding-right:6px; + zoom:1; +} +.x-panel-bc .x-panel-footer { + padding-bottom:6px; +} +.x-panel-nofooter .x-panel-bc, .x-panel-nofooter .x-window-bc { + height:6px; + font-size:0; + line-height:0; +} +.x-panel-bwrap { + overflow:hidden; + zoom:1; + left:0; + top:0; +} +.x-panel-body { + overflow:hidden; + zoom:1; +} +.x-panel-collapsed .x-resizable-handle{ + display:none; +} +.ext-gecko .x-panel-animated * { + overflow:hidden !important; +} +.x-plain-body { + overflow:hidden; +} +.x-plain-bbar .x-toolbar { + overflow:hidden; + padding:2px; +} +.x-plain-tbar .x-toolbar { + overflow:hidden; + padding:2px; +} +.x-plain-bwrap { + overflow:hidden; + zoom:1; +} +.x-plain { + overflow:hidden; +} +.x-tool { + overflow:hidden; + width:15px; + height:15px; + float:right; + cursor:pointer; + background:transparent no-repeat; + margin-left:2px; +} +.x-tool-toggle { + background-position:0 -60px; +} +.x-tool-toggle-over { + background-position:-15px -60px; +} +.x-panel-collapsed .x-tool-toggle { + background-position:0 -75px; +} +.x-panel-collapsed .x-tool-toggle-over { + background-position:-15px -75px; +} +.x-tool-close { + background-position:0 -0; +} +.x-tool-close-over { + background-position:-15px 0; +} +.x-tool-minimize { + background-position:0 -15px; +} +.x-tool-minimize-over { + background-position:-15px -15px; +} +.x-tool-maximize { + background-position:0 -30px; +} +.x-tool-maximize-over { + background-position:-15px -30px; +} +.x-tool-restore { + background-position:0 -45px; +} +.x-tool-restore-over { + background-position:-15px -45px; +} +.x-tool-gear { + background-position:0 -90px; +} +.x-tool-gear-over { + background-position:-15px -90px; +} +.x-tool-pin { + background-position:0 -135px; +} +.x-tool-pin-over { + background-position:-15px -135px; +} +.x-tool-unpin { + background-position:0 -150px; +} +.x-tool-unpin-over { + background-position:-15px -150px; +} +.x-tool-right { + background-position:0 -165px; +} +.x-tool-right-over { + background-position:-15px -165px; +} +.x-tool-left { + background-position:0 -180px; +} +.x-tool-left-over { + background-position:-15px -180px; +} +.x-tool-up { + background-position:0 -210px; +} +.x-tool-up-over { + background-position:-15px -210px; +} +.x-tool-down { + background-position:0 -195px; +} +.x-tool-down-over { + background-position:-15px -195px; +} +.x-tool-refresh { + background-position:0 -225px; +} +.x-tool-refresh-over { + background-position:-15px -225px; +} +.x-tool-minus { + background-position:0 -255px; +} +.x-tool-minus-over { + background-position:-15px -255px; +} +.x-tool-plus { + background-position:0 -240px; +} +.x-tool-plus-over { + background-position:-15px -240px; +} +.x-tool-search { + background-position:0 -270px; +} +.x-tool-search-over { + background-position:-15px -270px; +} +.x-tool-save { + background-position:0 -285px; +} +.x-tool-save-over { + background-position:-15px -285px; +} +.x-tool-help { + background-position:0 -300px; +} +.x-tool-help-over { + background-position:-15px -300px; +} +.x-tool-print { + background-position:0 -315px; +} +.x-tool-print-over { + background-position:-15px -315px; +} +.x-panel-ghost { + z-index:12000; + overflow:hidden; + position:absolute; + left:0;top:0; + opacity:.65; + -moz-opacity:.65; + filter:alpha(opacity=65); +} +.x-panel-ghost ul { + margin:0; + padding:0; + overflow:hidden; + font-size:0; + line-height:0; + border:1px solid; + border-top:0 none; + display:block; +} +.x-panel-ghost * { + cursor:move !important; +} +.x-panel-dd-spacer { + border:2px dashed; +} +.x-panel-btns { + padding:5px; + overflow:hidden; +} +.x-panel-btns-left .x-buttonbar { + clear:none; +} +.x-panel-btns-center{ + text-align:center; +} +.x-panel-btns-center .x-toolbar-ct { + margin:0 auto; + text-align:left; + width:auto; +} +.x-panel-fbar td.x-toolbar-cell{ + padding:0px; +} +.x-panel-fbar { + display: block; + padding:2px; + position:relative; + left:0; + top:0; + zoom:1; + overflow:hidden; +} + +.x-panel-fbar .x-toolbar-cell { + vertical-align:middle; +} + +.x-panel-fbar td { + vertical-align:middle; +} +.x-panel-btns .x-btn-focus .x-btn-left{ + background-position:0 -147px; +} +.x-panel-btns .x-btn-focus .x-btn-right{ + background-position:0 -168px; +} +.x-panel-btns .x-btn-focus .x-btn-center{ + background-position:0 -189px; +} +.x-panel-btns .x-btn-over .x-btn-left{ + background-position:0 -63px; +} +.x-panel-btns .x-btn-over .x-btn-right{ + background-position:0 -84px; +} +.x-panel-btns .x-btn-over .x-btn-center{ + background-position:0 -105px; +} +.x-panel-btns .x-btn-click .x-btn-center{ + background-position:0 -126px; +} +.x-panel-btns .x-btn-click .x-btn-right{ + background-position:0 -84px; +} +.x-panel-btns .x-btn-click .x-btn-left{ + background-position:0 -63px; +} +.x-panel-fbar td,.x-panel-fbar span,.x-panel-fbar input,.x-panel-fbar div,.x-panel-fbar select,.x-panel-fbar label{ + white-space: nowrap; +} +.x-window { + zoom:1; + -moz-outline: none; + outline: 0 none; +} +.x-window .x-resizable-handle { + opacity:0; + -moz-opacity:0; + filter:alpha(opacity=0); +} +.x-window-proxy { + border:1px solid; + z-index:12000; + overflow:hidden; + position:absolute; + left:0;top:0; + display:none; + opacity:.5; + -moz-opacity:.5; + filter:alpha(opacity=50); +} +.x-window-header { + overflow:hidden; + zoom:1; +} +.x-window-bwrap { + z-index:1; + position:relative; + zoom:1; + left:0;top:0; +} +.x-window-tl .x-window-header { + padding:5px 0 4px 0; +} +.x-window-header-text { + cursor:pointer; +} +.x-window-tc { + background: transparent repeat-x 0 0; + overflow:hidden; + zoom:1; +} +.x-window-tl { + background: transparent no-repeat 0 0; + padding-left:6px; + zoom:1; + z-index:1; + position:relative; +} +.x-window-tr { + background: transparent no-repeat right 0; + padding-right:6px; +} +.x-window-bc { + background: transparent repeat-x 0 bottom; + zoom:1; +} +.x-window-bc .x-window-footer { + padding-bottom:6px; + zoom:1; + font-size:0; + line-height:0; +} +.x-window-bl { + background: transparent no-repeat 0 bottom; + padding-left:6px; + zoom:1; +} +.x-window-br { + background: transparent no-repeat right bottom; + padding-right:6px; + zoom:1; +} +.x-window-mc { + border:1px solid; + padding:0; + margin:0; +} +.x-window-ml { + background: transparent repeat-y 0 0; + padding-left:6px; + zoom:1; +} +.x-window-mr { + background: transparent repeat-y right 0; + padding-right:6px; + zoom:1; +} +.x-window-body { + overflow:hidden; +} +.x-window-bwrap { + overflow:hidden; +} +.x-window-maximized .x-window-bl, .x-window-maximized .x-window-br, + .x-window-maximized .x-window-ml, .x-window-maximized .x-window-mr, + .x-window-maximized .x-window-tl, .x-window-maximized .x-window-tr { + padding:0; +} +.x-window-maximized .x-window-footer { + padding-bottom:0; +} +.x-window-maximized .x-window-tc { + padding-left:3px; + padding-right:3px; +} +.x-window-maximized .x-window-mc { + border-left:0 none; + border-right:0 none; +} +.x-window-tbar .x-toolbar, .x-window-bbar .x-toolbar { + border-left:0 none; + border-right: 0 none; +} +.x-window-bbar .x-toolbar { + border-top:1px solid; + border-bottom:0 none; +} +.x-window-draggable, .x-window-draggable .x-window-header-text { + cursor:move; +} +.x-window-maximized .x-window-draggable, .x-window-maximized .x-window-draggable .x-window-header-text { + cursor:default; +} +.x-window-body { + background:transparent; +} +.x-panel-ghost .x-window-tl { + border-bottom:1px solid; +} +.x-panel-collapsed .x-window-tl { + border-bottom:1px solid; +} +.x-window-maximized-ct { + overflow:hidden; +} +.x-window-sizing-ghost ul { + border:0 none !important; +} +.x-dlg-focus{ + -moz-outline:0 none; + outline:0 none; + width:0; + height:0; + overflow:hidden; + position:absolute; + top:0; + left:0; +} +.x-dlg-mask{ + z-index:10000; + display:none; + position:absolute; + top:0; + left:0; + -moz-opacity: 0.5; + opacity:.50; + filter: alpha(opacity=50); +} +body.ext-ie6.x-body-masked select { + visibility:hidden; +} +body.ext-ie6.x-body-masked .x-window select { + visibility:visible; +} +.x-window-plain .x-window-mc { + border: 1px solid; +} +.x-window-plain .x-window-body { + border: 1px solid; + background:transparent !important; +} +.x-html-editor-wrap { + border:1px solid; +} + +.x-html-editor-tb .x-btn-text { + background:transparent no-repeat; +} + +.x-html-editor-tip .x-tip-bd .x-tip-bd-inner { + padding:5px; + padding-bottom:1px; +} + +.x-html-editor-tb .x-toolbar { + position:static !important; +}.x-panel-noborder .x-panel-body-noborder { + border-width:0; +} +.x-panel-noborder .x-panel-header-noborder { + border-width:0 0 1px; + border-style:solid; +} +.x-panel-noborder .x-panel-tbar-noborder .x-toolbar { + border-width:0 0 1px; + border-style:solid; +} +.x-panel-noborder .x-panel-bbar-noborder .x-toolbar { + border-width:1px 0 0 0; + border-style:solid; +} +.x-window-noborder .x-window-mc { + border-width:0; +} +.x-window-plain .x-window-body-noborder { + border-width:0; +} +.x-tab-panel-noborder .x-tab-panel-body-noborder { + border-width:0; +} +.x-tab-panel-noborder .x-tab-panel-header-noborder { + border-width: 0 0 1px 0; +} +.x-tab-panel-noborder .x-tab-panel-footer-noborder { + border-width: 1px 0 0 0; +} +.x-tab-panel-bbar-noborder .x-toolbar { + border-width: 1px 0 0 0; + border-style:solid; +} +.x-tab-panel-tbar-noborder .x-toolbar { + border-width:0 0 1px; + border-style:solid; +} +.x-border-panel { + position:absolute !important; + left:0; + top:0; +} +.x-tool-collapse-south { + background-position:0 -195px; +} +.x-tool-collapse-south-over { + background-position:-15px -195px; +} +.x-tool-collapse-north { + background-position:0 -210px; +} +.x-tool-collapse-north-over { + background-position:-15px -210px; +} +.x-tool-collapse-west { + background-position:0 -180px; +} +.x-tool-collapse-west-over { + background-position:-15px -180px; +} +.x-tool-collapse-east { + background-position:0 -165px; +} +.x-tool-collapse-east-over { + background-position:-15px -165px; +} +.x-tool-expand-south { + background-position:0 -210px; +} +.x-tool-expand-south-over { + background-position:-15px -210px; +} +.x-tool-expand-north { + background-position:0 -195px; +} +.x-tool-expand-north-over { + background-position:-15px -195px; +} +.x-tool-expand-west { + background-position:0 -165px; +} +.x-tool-expand-west-over { + background-position:-15px -165px; +} +.x-tool-expand-east { + background-position:0 -180px; +} +.x-tool-expand-east-over { + background-position:-15px -180px; +} +.x-tool-expand-north, .x-tool-expand-south { + float:right; + margin:3px; +} +.x-tool-expand-east, .x-tool-expand-west { + float:none; + margin:3px auto; +} +.x-accordion-hd .x-tool-toggle { + background-position:0 -255px; +} +.x-accordion-hd .x-tool-toggle-over { + background-position:-15px -255px; +} +.x-panel-collapsed .x-accordion-hd .x-tool-toggle { + background-position:0 -240px; +} +.x-panel-collapsed .x-accordion-hd .x-tool-toggle-over { + background-position:-15px -240px; +} +.x-accordion-hd { + padding-top:4px; + padding-bottom:3px; + border-top:0 none; + background: transparent repeat-x 0 -9px; +} +.x-layout-collapsed{ + position:absolute; + left:-10000px; + top:-10000px; + visibility:hidden; + width:20px; + height:20px; + overflow:hidden; + border:1px solid; + z-index:20; +} +.ext-border-box .x-layout-collapsed{ + width:22px; + height:22px; +} +.x-layout-collapsed-over{ + cursor:pointer; +} +.x-layout-collapsed-west .x-layout-collapsed-tools, .x-layout-collapsed-east .x-layout-collapsed-tools{ + position:absolute; + top:0; + left:0; + width:20px; + height:20px; +} +.x-layout-split{ + position:absolute; + height:5px; + width:5px; + line-height:1px; + font-size:1px; + z-index:3; + background-color:transparent; +} +.ext-strict .ext-ie6 .x-layout-split{ + background-color: #fff !important; + filter: alpha(opacity=1); +} +.x-layout-split-h{ + background-image:url(../images/default/s.gif); + background-position: left; +} +.x-layout-split-v{ + background-image:url(../images/default/s.gif); + background-position: top; +} +.x-column-layout-ct { + overflow:hidden; + zoom:1; +} +.x-column { + float:left; + padding:0; + margin:0; + overflow:hidden; + zoom:1; +} +.x-column-inner { + overflow:hidden; + zoom:1; +} +.x-layout-mini { + position:absolute; + top:0; + left:0; + display:block; + width:5px; + height:35px; + cursor:pointer; + opacity:.5; + -moz-opacity:.5; + filter:alpha(opacity=50); +} +.x-layout-mini-over, .x-layout-collapsed-over .x-layout-mini{ + opacity:1; + -moz-opacity:1; + filter:none; +} +.x-layout-split-west .x-layout-mini { + top:48%; +} +.x-layout-split-east .x-layout-mini { + top:48%; +} +.x-layout-split-north .x-layout-mini { + left:48%; + height:5px; + width:35px; +} +.x-layout-split-south .x-layout-mini { + left:48%; + height:5px; + width:35px; +} +.x-layout-cmini-west .x-layout-mini { + top:48%; +} +.x-layout-cmini-east .x-layout-mini { + top:48%; +} +.x-layout-cmini-north .x-layout-mini { + left:48%; + height:5px; + width:35px; +} +.x-layout-cmini-south .x-layout-mini { + left:48%; + height:5px; + width:35px; +} +.x-layout-cmini-west, .x-layout-cmini-east { + border:0 none; + width:5px !important; + padding:0; + background:transparent; +} +.x-layout-cmini-north, .x-layout-cmini-south { + border:0 none; + height:5px !important; + padding:0; + background:transparent; +} +.x-viewport, .x-viewport body { + margin: 0; + padding: 0; + border: 0 none; + overflow: hidden; + height: 100%; +} +.x-abs-layout-item { + position:absolute !important; + left:0; + top:0; +} +.x-abs-layout-container { + position:relative; +} +.ext-ie input.x-abs-layout-item, .ext-ie textarea.x-abs-layout-item { + margin:0; +} +.x-box-layout-ct { + overflow:hidden; + zoom:1; +} +.x-box-inner { + overflow:hidden; + zoom:1; + position:relative; + left:0; + top:0; +} +.x-box-item { + position:absolute !important; + left:0; + top:0; +} +.x-border-layout-ct { + position: relative; +} +.x-progress-wrap { + border:1px solid; + overflow:hidden; +} +.x-progress-inner { + height:18px; + background:repeat-x; + position:relative; +} +.x-progress-bar { + height:18px; + float:left; + width:0; + background: repeat-x left center; + border-top:1px solid; + border-bottom:1px solid; + border-right:1px solid; +} +.x-progress-text { + padding:1px 5px; + overflow:hidden; + position:absolute; + left:0; + text-align:center; +} +.x-progress-text-back { + line-height:16px; +} +.ext-ie .x-progress-text-back { + line-height:15px; +} +.x-slider { + zoom:1; + -moz-outline: none; + outline: 0 none; +} +.x-slider-thumb { + line-height: 0px; + font-size: 0px; + position: absolute; + background:transparent no-repeat 0 0; +} +.x-slider-inner { + position:relative; + left:0; + top:0; + overflow:visible; + zoom:1; +} +.x-slider-focus { + position:absolute; + left:0; + top:0; + width:1px; + height:1px; + line-height:1px; + font-size:1px; + -moz-outline:0 none; + outline:0 none; + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore + display:block; + overflow:hidden; +} +.x-slider-horz { + padding-left:7px; + background:transparent no-repeat 0 -22px; +} +.x-slider-horz .x-slider-end { + padding-right:7px; + zoom:1; + background:transparent no-repeat right -44px; +} +.x-slider-horz .x-slider-inner { + background:transparent repeat-x 0 0; + height:22px; +} +.x-slider-horz .x-slider-thumb { + width:14px; + height:15px; + left:0; + top:3px; +} +.x-slider-horz .x-slider-thumb-over { + background-position: -14px -15px; +} +.x-slider-horz .x-slider-thumb-drag { + background-position: -28px -30px; +} +.x-slider-vert { + padding-top:7px; + background:transparent no-repeat -44px 0; + width:22px; +} +.x-slider-vert .x-slider-end { + padding-bottom:7px; + zoom:1; + background:transparent no-repeat -22px bottom; +} +.x-slider-vert .x-slider-inner { + background:transparent repeat-y 0 0; +} +.x-slider-vert .x-slider-thumb { + width:15px; + height:14px; + left:3px; + bottom:0; +} +.x-slider-vert .x-slider-thumb-over { + background-position: -15px -14px; +} +.x-slider-vert .x-slider-thumb-drag { + background-position: -30px -28px; +} +.x-window-dlg .x-window-body { + border:0 none !important; + padding:5px 10px; + overflow:hidden !important; +} +.x-window-dlg .x-window-mc { + border:0 none !important; +} +.x-window-dlg .ext-mb-input { + margin-top:4px; + width:95%; +} +.x-window-dlg .ext-mb-textarea { + margin-top:4px; +} +.x-window-dlg .x-progress-wrap { + margin-top:4px; +} +.ext-ie .x-window-dlg .x-progress-wrap { + margin-top:6px; +} +.x-window-dlg .x-msg-box-wait { + background:transparent no-repeat left; + display:block; + width:300px; + padding-left:18px; + line-height:18px; +} +.x-window-dlg .ext-mb-icon { + float:left; + width:47px; + height:32px; +} +.ext-ie .x-window-dlg .ext-mb-icon { + width:44px; +} +.x-window-dlg .x-dlg-icon .ext-mb-content{ + zoom: 1; margin-left: 47px; +} +.x-window-dlg .ext-mb-info, .x-window-dlg .ext-mb-warning, .x-window-dlg .ext-mb-question, .x-window-dlg .ext-mb-error { + background:transparent no-repeat top left; +} +.ext-gecko2 .ext-mb-fix-cursor { + overflow:auto; +} +.arrow-top { + background: url(../images/gxt/icons/top2.gif) no-repeat center left !important; +} +.arrow-bottom { + background: url(../images/gxt/icons/bottom2.gif) no-repeat center left !important; +} +.arrow-up { + background: url(../images/gxt/icons/up2.gif) no-repeat center left !important; +} +.arrow-down { + background: url(../images/gxt/icons/down2.gif) no-repeat center left !important; +} +.arrow-left { + background: url(../images/gxt/icons/left2.gif) no-repeat center left !important; +} +.arrow-double-left { + background: url(../images/gxt/icons/doubleleft2.gif) no-repeat center left !important; +} +.arrow-right { + background: url(../images/gxt/icons/right2.gif) no-repeat center left !important; +} +.arrow-double-right { + background: url(../images/gxt/icons/doubleright2.gif) no-repeat center left !important; +} +.x-info { + border-style: solid; + border-color: #99bbe8; + border-width: 0; + z-index: 99999999; +} + +.x-info-header { + overflow: hidden; + zoom: 1; + color: black; + font: bold 13px tahoma, arial, verdana, sans-serif; + padding: 5px 3px 4px 5px; + line-height: 15px; + background: transparent url(../images/default/panel/white-top-bottom.gif) repeat-x 0 -1px; +} + +.x-info-body { + border-top: 0 none; + overflow: hidden; + background: white; + position: relative; /* added for item scroll positioning */ +} + +.x-info-header { + overflow: hidden; + zoom: 1; +} + +.x-info-tl .x-info-header { + color: #555555; + font-family: tahoma, arial, sans-serif; + font-size: 13px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: bold; + line-height: normal; + padding: 5px 0 4px 0; + border: 0 none; + background: transparent; +} + +.x-info-tl .x-info-icon,.x-window-tl .x-info-icon { + padding-left: 20px !important; + background-repeat: no-repeat; + background-position: 0 4px; + zoom: 1; +} + +.x-info-inline-icon { + width: 16px; + height: 16px; + background-repeat: no-repeat; + background-position: 0 0; + vertical-align: middle; + margin-right: 4px; + margin-top: -1px; + margin-bottom: -1px; +} + +.x-info-tc { + background: transparent url(../images/gxt/info/top-bottom.gif) repeat-x 0 0; + overflow: hidden; +} + +/* fix ie7 strict mode bug */ +.ext-ie7 .x-info-tc { + overflow: visible; +} + +.x-info-tl { + background: transparent url(../images/gxt/info/corners-sprite.gif) no-repeat 0 0; + padding-left: 6px; + zoom: 1; +} + +.x-info-tr { + background: transparent url(../images/gxt/info/corners-sprite.gif) no-repeat right 0; + zoom: 1; + padding-right: 6px; +} + +.x-info-bc { + background: transparent url(../images/default/panel/top-bottom.gif) repeat-x 0 bottom; + zoom: 1; + font-size: 0px; +} + +.x-info-bc .x-info-footer { + zoom: 1; +} + +.x-info-bl { + background: transparent url(../images/default/panel/corners-sprite.gif) no-repeat 0 bottom; + padding-left: 6px; + zoom: 1; +} + +.x-info-br { + background: transparent url(../images/default/panel/corners-sprite.gif) no-repeat right bottom; + padding-right: 6px; + zoom: 1; +} + +.x-info-mc { + border: 0 none; + padding: 0; + margin: 0; + font: normal 11px tahoma, arial, helvetica, sans-serif; + background: #dfe8f6; +} + +.x-info-mc .x-info-body { + background: transparent; + border: 0 none; +} + +.x-info-ml { + background: #fff url(../images/default/panel/left-right.gif) repeat-y 0 0; + padding-left: 6px; + zoom: 1; +} + +.x-info-mr { + background: transparent url(../images/default/panel/left-right.gif) repeat-y right 0; + padding-right: 6px; + zoom: 1; +} + +.x-info-bc .x-info-footer { + padding-bottom: 6px; +} + +.x-info-nofooter .x-info-bc,.x-panel-nofooter .x-info-bc { + height: 6px; + font-size: 0; + line-height: 0; +} + +.x-info-bwrap { + overflow: hidden; + zoom: 1; +} + +.x-info-body { + overflow: hidden; + zoom: 1; + color: #555555; + font-family: tahoma, arial, sans-serif; + font-size: 12px; + font-size-adjust: none; + font-style: normal; + font-variant: normal; + font-weight: normal; +}.x-combo-over { + border: 1px dotted #B5B4B4 !important; + background: #F1F1F1; + cursor: pointer; +} + +.my-list { + border: 1px solid #99BBE8; + -moz-outline: none; + outline: 0 none; + -moz-user-focus: normal; + background-color: white; + font-family: "Myriad Pro", "Myriad Web", "Tahoma", "Helvetica", "Arial", sans-serif; +} + +.my-list-notchecked { + background: url(../images/gxt/tree/notchecked.gif) no-repeat 0px 0px !important; + margin: 3px 0pt 0pt 0px; +} + +.my-list-checked { + background: url(../images/gxt/tree/checked.gif) no-repeat 0px 0px !important; + margin: 3px 0pt 0pt 0px; +} + +.ext-ie .my-list-notchecked { + margin: 2px 0pt 0pt 0px; +} + +.ext-ie .my-list-checked { + margin: 2px 0pt 0pt 0px; +} + +.my-list-flat { + border: 1px solid #6593cf; + -moz-outline: none; + outline: 0 none; + -moz-user-focus: normal; + background-color: white; + cursor: default; +} + +.my-list-item { + cursor: pointer; + -moz-outline: none; + outline: 0 none; + -moz-user-focus: normal; +} + +.my-list-flat .my-list-item { + height: 19px; + border: 1px solid white; +} + +.my-list-flat .my-list-item-over { + background-color: #F1F1F1; + border: 1px dotted #B5B4B4; +} + +.my-list-flat .my-list-item-sel { + background-color: #DFE8F6; + border: 1px dotted #9EB8ED; +} + +.my-list-flat .my-list-item-over .my-list-item-l { + background: none; +} + +.my-list-flat .my-list-item-over .my-list-item-icon,.my-list-flat .my-list-item-over .my-list-item-ml,.my-list-flat .my-list-item-over .my-list-item-c + { + background: none; +} + +.my-list-flat .my-list-item-over .my-list-item-r { + background: none; +} + +.my-list-flat .my-list-item-sel .my-list-item-l { + background: none; +} + +.my-list-flat .my-list-item-sel .my-list-item-icon,.my-list-flat .my-list-item-sel .my-list-item-ml,.my-list-flat .my-list-item-sel .my-list-item-c + { + background: none; +} + +.my-list-flat .my-list-item-sel .my-list-item-r { + background: none; +} + +.my-list-item-text { + font-size: 11px; + padding-top: 3px; + padding-left: 2px; + white-space: nowrap; + overflow: hidden; + line-height: 19px; +} + +.my-list-item-l div { + width: 5px; +} + +.my-list-item-ml { + width: 18px; +} + +.my-list-item-c { + width: 100%; +} + +.my-list-item-r div { + width: 3px; +} + +.my-list-item-over .my-list-item-l { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left -57px; +} + +.my-list-item-over .my-list-item-icon,.my-list-item-over .my-list-item-check,.my-list-item-over .my-list-item-c + { + background: url(../images/gxt/shared/select-19-bg.gif) repeat-x left -95px; +} + +.my-list-item-over .my-list-item-r { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right -76px; +} + +.my-list-item-sel .my-list-item-l { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left 0px; +} + +.my-list-item-sel .my-list-item-icon,.my-list-item-sel .my-list-item-check,.my-list-item-sel .my-list-item-c + { + background: url(../images/gxt/shared/select-19-bg.gif) left -38px; +} + +.my-list-item-sel .my-list-item-r { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right -19px; +}.x-view { + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; + background-color: white; + cursor: default; + border: 1px solid #98C0F4; + overflow: auto; + padding: 0px; + zoom: 1; +} + +.x-view-item { + border: 1px solid #FFFFFF; + font-family: tahoma, arial, helvetica, sans-serif; + font-size: 12px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: normal; + line-height: normal; + overflow: hidden; + padding: 2px; + white-space: nowrap; +} + +.x-view-highlightrow { + border: 1px dotted #545352 !important; +} + +.x-view-item-over { + background: #efefef url(../images/default/grid/row-over.gif) repeat-x left top; + border: 1px dotted #dddddd !important; + cursor: pointer; +} + +.x-view-item-sel { + background: #DFE8F6 none repeat scroll 0%; + border: 1px dotted #A3BAE9 !important; + cursor: pointer; +} +.x-view-item-check { + padding: 0px; +} +.x-view-item-check td { + font-family: tahoma, arial, helvetica, sans-serif; + font-size: 12px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: normal; + line-height: normal; + white-space: nowrap; + vertical-align: middle; + padding-left: 1px; +} + +.x-splitbar-shim { + filter: alpha(opacity = 1); + opacity: 0; + position: absolute; + width: 100%; + height: 100%; + z-index: 10; + background-color: white; + -moz-user-select: none; + -khtml-user-select: none; + user-select: none; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.x-vsplitbar { + background: url(../images/default/s.gif); + position: absolute; + z-index: 3; + cursor: e-resize; + cursor: col-resize; +} + +.x-hsplitbar { + background: url(../images/default/s.gif); + position: absolute; + font-size: 1px; + line-height: 1px; + z-index: 3; + cursor: s-resize; + cursor: row-resize; +} + +.x-splitbar-proxy { + position: absolute; + background-color: #929090; + font-size: 1px; + line-height: 1px; + z-index: 200; +} + +.my-splitbar-shim { + filter: alpha(opacity = 1); + opacity: 0; + position: absolute; + width: 100%; + height: 100%; + z-index: 10; + background-color: white; + -moz-user-select: none; + -khtml-user-select: none; + user-select: none; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-splitbar-transparent { + background: none; + font-size: 1px; + line-height: 1px; + z-index: 2000; +} + +.my-splitbar-proxy { + position: absolute; + background-color: #929090; + font-size: 1px; + line-height: 1px; + z-index: 200; +}.x-status { + padding: 0 4px; + height: 21px; + line-height: 21px !important; + cursor: default; +} +.x-status .x-status-text{ + padding: 2px; + line-height: 21px !important; +} +.x-status-icon { + padding-left: 25px !important; + background: transparent no-repeat left center; +} +.x-status-busy { + background-image: url(../images/default/grid/loading.gif); +} +.x-status-text-panel { + border: 1px solid; + border-color: #99bbe8 #fff #fff #99bbe8; +} +.my-tbl { + border: 1px solid #99BBE8; + cursor: default; + background-color: white; + overflow: hidden; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 11px; + table-layout: fixed; +} + +.my-tbl-col-overflow { + overflow: hidden; +} + +.ext-ie .my-tbl-col-overflow { + +} + +.my-tbl-col-text { + color: black; + padding: 5px 4px 0 4px; + display: block; + white-space: nowrap; + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 11px; +} + +.my-tbl-col { + border-right: 1px solid #D5D5D5; + background: url(../images/gxt/table/vs-column-bg.gif) repeat-x; +} + +.my-tbl-col-splitter { + position: absolute; + top: 0; + width: 6px; + z-index: 100; + height: 100%; + right: 0px; +} + +.my-tbl-col-over { + background: url(../images/gxt/table/vs-column-bg.gif) repeat-x 0px -24px; +} + +.my-tbl-col-sort { + background-position: 0px -48px; +} + +.my-icon-asc { + background-image: url(../images/gxt/icons/hmenu-asc.gif) !important; +} + +.my-icon-desc { + background-image: url(../images/gxt/icons/hmenu-desc.gif) !important; +} + +.my-tbl-col-asc { + background: url(../images/gxt/table/vsort-asc.gif) no-repeat 50% top; +} + +.my-tbl-col-desc { + background: url(../images/gxt/table/vsort-desc.gif) no-repeat 50% top; +} + +.my-tbl-col-splitter { + background: none; +} + +.my-tbl-data { + background-color: white; + overflow: hidden; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-tbl-item { + border-top: 1px solid white; + border-bottom: 1px solid white; + border-bottom: 1px solid #EDEDED; + cursor: default; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-tbl-item table { + -moz-outline: none; + -moz-user-focus: normal; + table-layout: fixed; + outline: 0 none; +} + +.my-tbl-data .my-tbl-item-cell { + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-tbl-item td { + -moz-user-select: none; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-tbl-vlines .my-tbl-data .my-tbl-item-cell-overflow { + border-right: 1px solid #EDEDED; +} + +.my-tbl-data .my-tbl-item-cell-overflow { + white-space: nowrap; + overflow: hidden; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-tbl-data .my-tbl-item-cell-text { + padding: 3px 4px; + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 11px; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-tbl-data .my-tbl-item-cell-widget { + padding: 1px 4px; +} + +.my-tbl-data tr { + overflow: hidden; +} + +.my-tbl-item-over { + border-top: 1px solid #dddddd; + border-bottom: 1px solid #dddddd; + background: #efefef url(../images/default/grid/row-over.gif) repeat-x left top; +} + +.my-tbl-item-sel { + background-image: none !important; + background-color: #D9E1ED !important; + border-top: 1px dotted #9EB8ED !important; + border-bottom: 1px dotted #9EB8ED !important; +} + +.ext-ie .my-tbl TD .x-form-text { + POSITION: static; + TOP: 0px; +}.tree-folder { + background: url(../images/gxt/icons/folder-closed.gif) no-repeat -1px -1px; +} + +.tree-folder-open { + background: url(../images/gxt/icons/folder.gif) no-repeat -1px -1px; +} + +.my-treetbl-tree { + cursor: default; +} + +.my-treetblitem,.my-treetblitem table,.my-treetblitem table td { + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-treetblitem td { + height: 19px; +} + +.my-treetbl-indent { + line-height: 1px; + font-size: 1px; +} + +.my-treetbl-joint div { + width: 15px; + height: 19px; + line-height: 1px; + font-size: 1px; +} + +.my-treetbl-left,.my-treetbl-left div,.my-treetbl-right { + line-height: 1px; + font-size: 1px; + width: 3px; +} + +.my-treetbl-left div,.my-treetbl-right div { + width: 3px; +} + +.my-treetbl-check div { + width: 17px; + height: 19px; + line-height: 1px; + font-size: 1px; + display: block; +} + +.my-treetbl-icon div { + width: 16px; + height: 16px; + margin-top: 1px; + cursor: pointer; + background-repeat: no-repeat; + background-position: center; +} + +.my-ie .my-treetbl-icon { + padding-top: 2px; +} + +.my-ie .my-treetbl-icon div { + position: static; +} + +.my-treetbl-item-text span { + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 12px; + white-space: nowrap; + padding-left: 3px; + padding-right: 3px; + display: block; + height: 15px; + cursor: pointer; +} + +.my-treetbl-over .my-treetbl-left { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left -57px; +} + +.my-treetbl-over .my-treetbl-right { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right -76px; +} + +.my-treetbl-over .my-treetbl-check,.my-treetbl-over .my-treetbl-icon,.my-treetbl-over .my-treetbl-item-text + { + background: url(../images/gxt/shared/select-19-bg.gif) left -95px; +} + +.my-treetbl-sel .my-treetbl-left { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left 0px; +} + +.my-treetbl-sel .my-treetbl-right { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right -19px; +} + +.my-treetbl-sel .my-treetbl-check,.my-treetbl-sel .my-treetbl-icon,.my-treetbl-sel .my-treetbl-item-text + { + background: url(../images/gxt/shared/select-19-bg.gif) left -38px; +} + +.my-treetbl-close { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px 1px; +} + +.my-treetbl-open { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px -32px; +} + +.my-treetbl-joint-over .my-treetbl-open { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px -48px; +} + +.my-treetbl-joint-over .my-treetbl-close { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px -15px; +} + +.my-treetbl-notchecked { + background: url(../images/gxt/tree/notchecked.gif) no-repeat 0px 50%; +} + +.my-treetbl-checked { + background: url(../images/gxt/tree/checked.gif) no-repeat 0px 50%; +} + +.my-treetbl-loading .tree-folder { + background: url(../images/gxt/icons/wait.gif) no-repeat 0px -1px; +} + +.my-treetbl-loading .my-treetbl-item-text span { + font-style: italic; +} + +.my-treetbl { + border: 1px solid #99BBE8; + cursor: default; + background-color: white; + overflow: hidden; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-treetbl-col-overflow { + overflow: hidden; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-treetbl-col-text { + color: black; + padding: 5px 4px 0 4px; + display: block; + white-space: nowrap; + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 12px; +} + +.my-treetbl-col { + border-right: 1px solid #D5D5D5; + background: url(../images/gxt/table/vs-column-bg.gif) repeat-x; +} + +.my-treetbl-col-splitter { + position: absolute; + top: 0; + width: 6px; + z-index: 100; + height: 100%; + right: 0px; +} + +.my-treetbl-col-over { + background: url(../images/gxt/table/vs-column-bg.gif) repeat-x 0px -24px; +} + +.my-treetbl-col-sort { + background-position: 0px -48px; +} + +.my-treetbl-col-asc { + background: url(../images/gxt/table/vsort-asc.gif) no-repeat 50% top; +} + +.my-treetbl-col-desc { + background: url(../images/gxt/table/vsort-desc.gif) no-repeat 50% top; +} + +.my-treetbl-col-splitter { + background: none; +} + +.my-treetbl-data { + background-color: white; + overflow: hidden; +} + +.my-treetbl-data .my-treetbl-cell { + height: 20px; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-treetbl-data .my-treetbl-cell-overflow { + white-space: nowrap; + overflow: hidden; +} + +.my-treetbl-data .my-treetbl-cell-text { + padding: 0px 0px; + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 12px; +} + +.my-treetbl-data tr { + overflow: hidden; +} + +.my-treetbl-item { + border-top: 1px solid white; + border-bottom: 1px solid white; + border-bottom: 1px solid #EDEDED; + cursor: default; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-treetbl-item-over { + border-top: 1px solid #dddddd; + border-bottom: 1px solid #dddddd; + background: #efefef url(../images/default/grid/row-over.gif) repeat-x left top; +} + +.my-treetbl-item-sel { + background-image: none; + background-color: #D9E1ED; + border-top: 1px dotted #9EB8ED; + border-bottom: 1px dotted #9EB8ED; +} + +.my-treetbl .x-grid3-td-numberer { + background: transparent url(../images/gxt/tree/tree-table-special-col.gif) repeat-y + scroll left center; + height: 19px; + line-height: normal; + padding-left: 0px; + margin-left: 0px; +} + +.x-grid3-td-numberer div { + font-size: 11px; + font-family: "segoe ui", tahoma, arial, sans-serif; + color: #444444; + padding: 3px 0px 0 5px !important; +} + +.ext-ie .my-treetbl .x-grid3-td-numberer { + height: 20px; +} + +.my-treetbl-item-sel .x-grid3-td-numberer { + background: transparent url(../images/gxt/tree/tree-table-special-col-sel.gif) repeat-y + scroll left center; +}.ext-el-mask { + background-color: #ccc; +} +.ext-el-mask-msg { + border-color:#6593cf; + background-color:#c3daf9; + background-image:url(../images/default/box/tb-blue.gif); +} +.ext-el-mask-msg div { + background-color: white; + border-color:#a3bad9; + color:#222; + font:normal 11px tahoma, arial, helvetica, sans-serif; +} +.x-mask-loading div { + background-color:#fbfbfb; + background-image:url(../images/default/grid/loading.gif); +} +.x-item-disabled { + color: gray; +} +.x-item-disabled * { + color: gray !important; +} +.x-splitbar-proxy { + background-color: #aaa; +} +.x-color-palette a { + border-color:#fff; +} +.x-color-palette a.x-color-palette-hover, .x-color-palette a.x-color-palette-sel { + border-color:#8bb8f3; + background-color: #deecfd; +} +.x-color-palette em { + border-color:#aca899; +} +.x-ie-shadow { + background-color:#777; +} +.x-shadow .xsmc { + background-image: url(../images/default/shadow-c.png); +} +.x-shadow .xsml, .x-shadow .xsmr { + background-image: url(../images/default/shadow-lr.png); +} +.x-shadow .xstl, .x-shadow .xstc, .x-shadow .xstr, .x-shadow .xsbl, .x-shadow .xsbc, .x-shadow .xsbr{ + background-image: url(../images/default/shadow.png); +} +.loading-indicator { + font-size: 11px; + background-image: url(../images/default/grid/loading.gif); +} +.x-spotlight { + background-color: #ccc; +} +.x-aria-focusframe-side { + background-color: #15428B; + line-height: 2px; + font-size: 2px; +} +.x-tab-panel-header, .x-tab-panel-footer { + background-color: #deecfd; + border-color:#8db2e3; + overflow:hidden; + zoom:1; +} +.x-tab-panel-header, .x-tab-panel-footer { + border-color:#8db2e3; +} +ul.x-tab-strip-top{ + background-color:#cedff5; + background-image: url(../images/default/tabs/tab-strip-bg.gif); + border-bottom-color:#8db2e3; +} +ul.x-tab-strip-bottom{ + background-color:#cedff5; + background-image: url(../images/default/tabs/tab-strip-btm-bg.gif); + border-top-color:#8db2e3; +} +.x-tab-panel-header-plain .x-tab-strip-spacer, +.x-tab-panel-footer-plain .x-tab-strip-spacer { + border-color:#8db2e3; + background-color: #deecfd; +} +.x-tab-strip span.x-tab-strip-text { + font:normal 11px tahoma,arial,helvetica; + color:#416aa3; +} +.x-tab-strip-over span.x-tab-strip-text { + color:#15428b; +} +.x-tab-strip-active span.x-tab-strip-text { + color:#15428b; + font-weight:bold; +} +.x-tab-strip-disabled .x-tabs-text { + color:#aaaaaa; +} +.x-tab-strip-top .x-tab-right, .x-tab-strip-top .x-tab-left, .x-tab-strip-top .x-tab-strip-inner{ + background-image: url(../images/default/tabs/tabs-sprite.gif); +} +.x-tab-strip-bottom .x-tab-right { + background-image: url(../images/default/tabs/tab-btm-inactive-right-bg.gif); +} +.x-tab-strip-bottom .x-tab-left { + background-image: url(../images/default/tabs/tab-btm-inactive-left-bg.gif); +} +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right { + background-image: url(../images/default/tabs/tab-btm-right-bg.gif); +} +.x-tab-strip-bottom .x-tab-strip-active .x-tab-left { + background-image: url(../images/default/tabs/tab-btm-left-bg.gif); +} +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close { + background-image:url(../images/default/tabs/tab-close.gif); +} +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover{ + background-image:url(../images/default/tabs/tab-close.gif); +} +.x-tab-panel-body { + border-color:#8db2e3; + background-color:#fff; +} +.x-tab-panel-body-top { + border-top: 0 none; +} +.x-tab-panel-body-bottom { + border-bottom: 0 none; +} +.x-tab-scroller-left { + background-image:url(../images/default/tabs/scroll-left.gif); + border-bottom-color:#8db2e3; +} +.x-tab-scroller-left-over { + background-position: 0 0; +} +.x-tab-scroller-left-disabled { + background-position: -18px 0; + opacity:.5; + -moz-opacity:.5; + filter:alpha(opacity=50); + cursor:default; +} +.x-tab-scroller-right { + background-image:url(../images/default/tabs/scroll-right.gif); + border-bottom-color:#8db2e3; +} +.x-tab-panel-bbar .x-toolbar, .x-tab-panel-tbar .x-toolbar { + border-color:#99bbe8; +} +.x-form-field { + font: normal 12px tahoma, arial, helvetica, sans-serif; +} + +.x-form-text,textarea.x-form-field { + background-color: #fff; + background-image: url(../images/default/form/text-bg.gif); + border-color: #b5b8c8; +} + +.x-form-select-one { + background-color: #fff; + border-color: #b5b8c8; +} + +.x-form-check-group-label { + border-bottom: 1px solid #99bbe8; + color: #15428b; +} + +.x-editor .x-form-check-wrap { + background-color: #fff; +} + +.x-form-field-wrap .x-form-trigger { + background-image: url(../images/default/form/trigger.gif); + border-bottom-color: #b5b8c8; +} + +.x-form-field-wrap .x-form-date-trigger { + background-image: url(../images/default/form/date-trigger.gif); +} + +.x-form-field-wrap .x-form-clear-trigger { + background-image: url(../images/default/form/clear-trigger.gif); +} + +.x-form-field-wrap .x-form-search-trigger { + background-image: url(../images/default/form/search-trigger.gif); +} + +.x-trigger-wrap-focus .x-form-trigger { + border-bottom-color: #7eadd9; +} + +.x-item-disabled .x-form-trigger-over { + border-bottom-color: #b5b8c8; +} + +.x-item-disabled .x-form-trigger-click { + border-bottom-color: #b5b8c8; +} + +.x-form-focus,textarea.x-form-focus { + border-color: #7eadd9; +} + +.x-form-invalid,textarea.x-form-invalid { + background-color: #fff; + background-image: url(../images/default/grid/invalid_line.gif); + border-color: #c30; +} + +.ext-safari .x-form-invalid { + background-color: #fee; + border-color: #ff7870; +} + +.x-form-inner-invalid,textarea.x-form-inner-invalid { + background-color: #fff; + background-image: url(../images/default/grid/invalid_line.gif); +} + +.x-form-grow-sizer { + font: normal 12px tahoma, arial, helvetica, sans-serif; +} + +.x-form-item { + font: normal 12px tahoma, arial, helvetica, sans-serif; +} + +.x-form-invalid-msg { + color: #c0272b; + font: normal 11px tahoma, arial, helvetica, sans-serif; + background-image: url(../images/default/shared/warning.gif); +} + +.x-form-empty-field { + color: gray; +} + +.x-small-editor .x-form-field { + font: normal 11px arial, tahoma, helvetica, sans-serif; +} + +.ext-safari .x-small-editor .x-form-field { + font: normal 12px arial, tahoma, helvetica, sans-serif; +} + +.x-form-invalid-icon { + background-image: url(../images/default/form/exclamation.gif); +} + +.x-fieldset { + border-color: #b5b8c8; +} + +.x-fieldset legend { + font: bold 11px tahoma, arial, helvetica, sans-serif; + color: #15428b; +} + +.x-editor .x-form-check-wrap { + border-color: #7eadd9; +} + +.x-spinner-field .x-form-spinner-up { + background-image: url('../images/default/form/spinner.gif'); +} +.x-spinner-field .x-form-spinner-down { + background-image: url('../images/default/form/spinner.gif'); +}.x-btn{ + font:normal 11px tahoma, verdana, helvetica; +} +.x-btn button{ + font:normal 11px arial,tahoma,verdana,helvetica; + color:#333; +} +.x-btn em { + font-style:normal; + font-weight:normal; +} +.x-btn-tl, .x-btn-tr, .x-btn-tc, .x-btn-ml, .x-btn-mr, .x-btn-mc, .x-btn-bl, .x-btn-br, .x-btn-bc{ + background-image:url(../images/default/button/btn.gif); +} +.x-btn-click .x-btn-text, .x-btn-menu-active .x-btn-text, .x-btn-pressed .x-btn-text{ + color:#000; +} +.x-btn-disabled *{ + color:gray !important; +} +.x-btn-mc em.x-btn-arrow { + background-image:url(../images/default/button/arrow.gif); +} +.x-btn-mc em.x-btn-split { + background-image:url(../images/default/button/s-arrow.gif); +} +.x-btn-over .x-btn-mc em.x-btn-split, .x-btn-click .x-btn-mc em.x-btn-split, .x-btn-menu-active .x-btn-mc em.x-btn-split, .x-btn-pressed .x-btn-mc em.x-btn-split { + background-image:url(../images/default/button/s-arrow-o.gif); +} +.x-btn-mc em.x-btn-arrow-bottom { + background-image:url(../images/default/button/s-arrow-b-noline.gif); +} +.x-btn-mc em.x-btn-split-bottom { + background-image:url(../images/default/button/s-arrow-b.gif); +} +.x-btn-over .x-btn-mc em.x-btn-split-bottom, .x-btn-click .x-btn-mc em.x-btn-split-bottom, .x-btn-menu-active .x-btn-mc em.x-btn-split-bottom, .x-btn-pressed .x-btn-mc em.x-btn-split-bottom { + background-image:url(../images/default/button/s-arrow-bo.gif); +} +.x-btn-group-header { + color: #3e6aaa; +} +.x-btn-group-tc { + background-image: url(../images/default/button/group-tb.gif); +} +.x-btn-group-tl { + background-image: url(../images/default/button/group-cs.gif); +} +.x-btn-group-tr { + background-image: url(../images/default/button/group-cs.gif); +} +.x-btn-group-bc { + background-image: url(../images/default/button/group-tb.gif); +} +.x-btn-group-bl { + background-image: url(../images/default/button/group-cs.gif); +} +.x-btn-group-br { + background-image: url(../images/default/button/group-cs.gif); +} +.x-btn-group-ml { + background-image: url(../images/default/button/group-lr.gif); +} +.x-btn-group-mr { + background-image: url(../images/default/button/group-lr.gif); +} +.x-btn-group-notitle .x-btn-group-tc { + background-image: url(../images/default/button/group-tb.gif); +} +.x-toolbar { + border-color: #a9bfd3; + background-color: #d0def0; + background-image: url(../images/default/toolbar/bg.gif); +} + +.x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label { + font: normal 11px arial, tahoma, helvetica, sans-serif; +} + +.x-toolbar .x-item-disabled { + color: gray; +} + +.x-toolbar .x-item-disabled * { + color: gray; +} + +.x-toolbar .x-btn-mc em.x-btn-split { + background-image: url(../images/default/button/s-arrow-noline.gif); +} + +.x-toolbar .x-btn-over .x-btn-mc em.x-btn-split,.x-toolbar .x-btn-click .x-btn-mc em.x-btn-split,.x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split,.x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split + { + background-image: url(../images/default/button/s-arrow-o.gif); +} + +.x-toolbar .x-btn-mc em.x-btn-split-bottom { + background-image: url(../images/default/button/s-arrow-b-noline.gif); +} + +.x-toolbar .x-btn-over .x-btn-mc em.x-btn-split-bottom,.x-toolbar .x-btn-click .x-btn-mc em.x-btn-split-bottom,.x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split-bottom,.x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split-bottom + { + background-image: url(../images/default/button/s-arrow-bo.gif); +} + +.x-toolbar .xtb-sep { + background-image: url(../images/default/grid/grid-blue-split.gif); +} + +.x-tbar-page-first { + background-image: url(../images/default/grid/page-first.gif) !important; +} + +.x-tbar-refresh { + background-image: url(../images/default/grid/refresh.gif) !important; +} + +.x-tbar-page-last { + background-image: url(../images/default/grid/page-last.gif) !important; +} + +.x-tbar-page-next { + background-image: url(../images/default/grid/page-next.gif) !important; +} + +.x-tbar-page-prev { + background-image: url(../images/default/grid/page-prev.gif) !important; +} + +.x-tbar-loading { + background-image: url(../images/default/grid/loading.gif) !important; +} + +.x-item-disabled .x-tbar-page-first { + background-image: url(../images/default/grid/page-first-disabled.gif) !important; +} + +.x-item-disabled .x-tbar-page-last { + background-image: url(../images/default/grid/page-last-disabled.gif) !important; +} + +.x-item-disabled .x-tbar-page-next { + background-image: url(../images/default/grid/page-next-disabled.gif) !important; +} + +.x-item-disabled .x-tbar-page-prev { + background-image: url(../images/default/grid/page-prev-disabled.gif) !important; +} + +.x-paging-info { + color: #444; +} + +.x-toolbar-more-icon { + background-image: url(../images/default/toolbar/more.gif) !important; +}.x-resizable-handle { + background-color:#fff; +} +.x-resizable-over .x-resizable-handle-east, .x-resizable-pinned .x-resizable-handle-east, +.x-resizable-over .x-resizable-handle-west, .x-resizable-pinned .x-resizable-handle-west +{ + background-image:url(../images/default/sizer/e-handle.gif); +} +.x-resizable-over .x-resizable-handle-south, .x-resizable-pinned .x-resizable-handle-south, +.x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north +{ + background-image:url(../images/default/sizer/s-handle.gif); +} +.x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north{ + background-image:url(../images/default/sizer/s-handle.gif); +} +.x-resizable-over .x-resizable-handle-southeast, .x-resizable-pinned .x-resizable-handle-southeast{ + background-image:url(../images/default/sizer/se-handle.gif); +} +.x-resizable-over .x-resizable-handle-northwest, .x-resizable-pinned .x-resizable-handle-northwest{ + background-image:url(../images/default/sizer/nw-handle.gif); +} +.x-resizable-over .x-resizable-handle-northeast, .x-resizable-pinned .x-resizable-handle-northeast{ + background-image:url(../images/default/sizer/ne-handle.gif); +} +.x-resizable-over .x-resizable-handle-southwest, .x-resizable-pinned .x-resizable-handle-southwest{ + background-image:url(../images/default/sizer/sw-handle.gif); +} +.x-resizable-proxy{ + border-color:#3b5a82; +} +.x-resizable-overlay{ + background-color:#fff; +} +.x-grid3 { + background-color: #fff; +} + +.x-grid-panel .x-panel-mc .x-panel-body { + border-color: #99bbe8; +} + +.x-grid3-hd-row .x-grid3-hd,.x-grid3-row .x-grid3-cell,.x-grid3-summary-row .x-grid3-cell { + font: normal 11px arial, tahoma, helvetica, sans-serif; +} + +.x-grid3-hd-row .x-grid3-hd { + border-left-color: #eee; + border-right-color: #d0d0d0; +} + +.x-grid-row-loading { + background-color: #fff; + background-image: url(../images/default/shared/loading-balls.gif); +} + +.x-grid3-row { + border-color: #ededed; + border-top-color: #fff; +} + +.x-grid3-row-alt { + background-color: #fafafa; +} + +.x-grid3-row-over { + border-color: #ddd; + background-color: #efefef; + background-image: url(../images/default/grid/row-over.gif); +} + +.x-grid3-resize-proxy { + background-color: #777; +} + +.x-grid3-resize-marker { + background-color: #777; +} + +.x-grid3-header { + background-color: #f9f9f9; + background-image: url(../images/default/grid/grid3-hrow.gif); +} + +.x-grid3-header-pop { + border-left-color: #d0d0d0; +} + +.x-grid3-header-pop-inner { + border-left-color: #eee; + background-image: url(../images/default/grid/hd-pop.gif); +} + +td.x-grid3-hd-over,td.sort-desc,td.sort-asc,td.x-grid3-hd-menu-open { + border-left-color: #aaccf6; + border-right-color: #aaccf6; +} + +td.x-grid3-hd-over .x-grid3-hd-inner,td.sort-desc .x-grid3-hd-inner,td.sort-asc .x-grid3-hd-inner,td.x-grid3-hd-menu-open .x-grid3-hd-inner + { + background-color: #ebf3fd; + background-image: url(../images/default/grid/grid3-hrow-over.gif); +} + +.sort-asc .x-grid3-sort-icon { + background-image: url(../images/default/grid/sort_asc.gif); +} + +.sort-desc .x-grid3-sort-icon { + background-image: url(../images/default/grid/sort_desc.gif); +} + +.x-grid3-cell-text,.x-grid3-hd-text { + color: #000; +} + +.x-grid3-split { + background-image: url(../images/default/grid/grid-split.gif); +} + +.x-grid3-hd-text { + color: #15428b; +} + +.x-dd-drag-proxy .x-grid3-hd-inner { + background-color: #ebf3fd; + background-image: url(../images/default/grid/grid3-hrow-over.gif); + border-color: #aaccf6; +} + +.col-move-top { + background-image: url(../images/default/grid/col-move-top.gif); +} + +.col-move-bottom { + background-image: url(../images/default/grid/col-move-bottom.gif); +} + +.x-grid3-highlightrow { + border: 1px dotted #545352; +} + +.x-grid3-row-selected { + background-image: none !important; + background-color: #dfe8f6 !important; + border-color: #a3bae9; +} + +.x-grid3-cell-selected { + background-color: #b8cfee !important; + color: #000; +} + +.x-grid3-group-selected { + background-color: #b8cfee !important; +} + +.x-grid3-cell-selected span { + color: #000 !important; +} + +.x-grid3-cell-selected .x-grid3-cell-text { + color: #000; +} + +.x-grid3-locked td.x-grid3-row-marker,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker { + background-color: #ebeadb !important; + background-image: url(../images/default/grid/grid-hrow.gif) !important; + color: #000; + border-top-color: #fff; + border-right-color: #6fa0df !important; +} + +.x-grid3-locked td.x-grid3-row-marker div,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker div { + color: #15428b !important; +} + +.x-grid3-dirty-cell { + background-image: url(../images/default/grid/dirty.gif); +} + +.x-grid3-invalid-cell { + background-image: url(../images/default/grid/invalid_line.gif); +} + +.x-grid3-topbar,.x-grid3-bottombar { + font: normal 11px arial, tahoma, helvetica, sans-serif; +} + +.x-grid3-bottombar .x-toolbar { + border-top-color: #a9bfd3; +} + +.x-props-grid .x-grid3-td-name .x-grid3-cell-inner { + background-image: url(../images/default/grid/grid3-special-col-bg.gif) !important; + color: #000 !important; +} + +.x-props-grid .x-grid3-body .x-grid3-td-name { + background-color: #fff !important; + border-right-color: #eee; +} + +.xg-hmenu-sort-asc .x-menu-item-icon { + background-image: url(../images/default/grid/hmenu-asc.gif); +} + +.xg-hmenu-sort-desc .x-menu-item-icon { + background-image: url(../images/default/grid/hmenu-desc.gif); +} + +.xg-hmenu-lock .x-menu-item-icon { + background-image: url(../images/default/grid/hmenu-lock.gif); +} + +.xg-hmenu-unlock .x-menu-item-icon { + background-image: url(../images/default/grid/hmenu-unlock.gif); +} + +.x-grid3-hd-btn { + background-color: #c3daf9; + background-image: url(../images/default/grid/grid3-hd-btn.gif); +} + +.x-grid3-body .x-grid3-td-expander { + background-image: url(../images/default/grid/grid3-special-col-bg.gif); +} + +.x-grid3-row-expander { + background-image: url(../images/default/grid/row-expand-sprite.gif); +} + +.x-grid3-body .x-grid3-td-checker { + background-image: url(../images/default/grid/grid3-special-col-bg.gif); +} + +.x-grid3-row-checker,.x-grid3-hd-checker { + background-image: url(../images/default/grid/row-check-sprite.gif); +} + +.x-grid3-body .x-grid3-td-numberer { + background-image: url(../images/default/grid/grid3-special-col-bg.gif); +} + +.x-grid3-body .x-grid3-td-numberer .x-grid3-cell-inner { + color: #444; +} + +.x-grid3-body .x-grid3-td-row-icon { + background-image: url(../images/default/grid/grid3-special-col-bg.gif); +} + +.x-grid3-body .x-grid3-row-selected .x-grid3-td-numberer,.x-grid3-body .x-grid3-row-selected .x-grid3-td-checker,.x-grid3-body .x-grid3-row-selected .x-grid3-td-expander + { + background-image: url(../images/default/grid/grid3-special-col-sel-bg.gif); +} + +.x-grid3-check-col { + background-image: url(../images/default/menu/unchecked.gif); +} + +.x-grid3-check-col-on { + background-image: url(../images/default/menu/checked.gif); +} + +.x-grid-group,.x-grid-group-body,.x-grid-group-hd { + zoom: 1; +} + +.x-grid-group-hd { + border-bottom-color: #99bbe8; +} + +.x-grid-group-hd .x-grid-group-div { + background-image: url(../images/default/grid/group-expand-sprite.gif); + color: #3764a0; + font: bold 11px tahoma, arial, helvetica, sans-serif; +} + +.x-group-by-icon { + background-image: url(../images/default/grid/group-by.gif); +} + +.x-cols-icon { + background-image: url(../images/default/grid/columns.gif); +} + +.x-show-groups-icon { + background-image: url(../images/default/grid/group-by.gif); +} + +.x-grid-empty { + color: gray; + font: normal 11px tahoma, arial, helvetica, sans-serif; +} + +.x-grid-with-col-lines .x-grid3-row td.x-grid3-cell { + border-right-color: #ededed; +} + +.x-grid-with-col-lines .x-grid3-row-selected { + border-top-color: #a3bae9; +} + +.x-grid3-check-col-disabled { + background-color: transparent; + background-image: url(../images/gxt/menu/disabledcheck.gif); +} + +.x-row-editor-header { + background: transparent url(../images/gxt/grid/row-editor-bg.gif) repeat-x 0 0; +} + +.x-row-editor-footer { + background: transparent url(../images/gxt/grid/row-editor-bg.gif) repeat-x 0 -2px; +} + +.x-row-editor-body { + background: #ebf2fb; +} + +.x-row-editor .x-btns { + background: transparent url(../images/gxt/grid/row-editor-btns.gif) no-repeat 0 0; +} + +.x-row-editor .x-btns .x-plain-bwrap { + background: transparent url(../images/gxt/grid/row-editor-btns.gif) no-repeat right -31px; +} + +.x-row-editor .x-btns .x-plain-body { + background: transparent url(../images/gxt/grid/row-editor-btns.gif) repeat-x 0 -62px; +} + +.x-inserted-row { + background-color: #f7f9cc +}.x-dd-drag-ghost{ + color:#000; + font: normal 11px arial, helvetica, sans-serif; + border-color: #ddd #bbb #bbb #ddd; + background-color:#fff; +} +.x-dd-drop-nodrop .x-dd-drop-icon{ + background-image: url(../images/default/dd/drop-no.gif); +} +.x-dd-drop-ok .x-dd-drop-icon{ + background-image: url(../images/default/dd/drop-yes.gif); +} +.x-dd-drop-ok-add .x-dd-drop-icon{ + background-image: url(../images/default/dd/drop-add.gif); +} +.x-view-selector { + background-color:#c3daf9; + border-color:#3399bb; +} +.x-tree-drop-ok-append .x-dd-drop-icon { + background-image: url(../images/default/tree/drop-add.gif); +} + +.x-tree-drop-ok-above .x-dd-drop-icon { + background-image: url(../images/default/tree/drop-over.gif); +} + +.x-tree-drop-ok-below .x-dd-drop-icon { + background-image: url(../images/default/tree/drop-under.gif); +} + +.x-tree-drop-ok-between .x-dd-drop-icon { + background-image: url(../images/default/tree/drop-between.gif); +} + +.x-tree3-loading { + background-image: url(../images/default/tree/loading.gif); +} + +.x-tree3-node-text { + font: normal 11px arial, tahoma, helvetica, sans-serif; + color: black; +}.x-date-picker { + border-color: #1b376c; + background-color:#fff; +} +.x-date-middle,.x-date-left,.x-date-right { + background-image: url(../images/default/shared/hd-sprite.gif); + color:#fff; + font:bold 11px "sans serif", tahoma, verdana, helvetica; +} +.x-date-middle .x-btn .x-btn-text { + color:#fff; +} +.x-date-middle .x-btn-mc em.x-btn-arrow { + background-image:url(../images/default/toolbar/btn-arrow-light.gif); +} +.x-date-right a { + background-image: url(../images/default/shared/right-btn.gif); +} +.x-date-left a{ + background-image: url(../images/default/shared/left-btn.gif); +} +.x-date-inner th { + background-color:#dfecfb; + background-image:url(../images/default/shared/glass-bg.gif); + border-bottom-color:#a3bad9; + font:normal 10px arial, helvetica,tahoma,sans-serif; + color:#233d6d; +} +.x-date-inner td { + border-color:#fff; +} +.x-date-inner a { + font:normal 11px arial, helvetica,tahoma,sans-serif; + color:#000; +} +.x-date-inner .x-date-active{ + color:#000; +} +.x-date-inner .x-date-selected a{ + background-color:#dfecfb; + background-image:url(../images/default/shared/glass-bg.gif); + border-color:#8db2e3; +} +.x-date-inner .x-date-today a{ + border-color:darkred; +} +.x-date-inner .x-date-selected span{ + font-weight:bold; +} +.x-date-inner .x-date-prevday a,.x-date-inner .x-date-nextday a { + color:#aaa; +} +.x-date-bottom { + border-top-color:#a3bad9; + background-color:#dfecfb; + background-image:url(../images/default/shared/glass-bg.gif); +} +.x-date-inner .x-date-disabled a { + background-color:#eee; + color:#bbb; +} +.x-date-mmenu{ + background-color:#eee !important; +} +.x-date-mmenu .x-menu-item { + font-size:10px; + color:#000; +} +.x-date-mp { + background-color:#fff; +} +.x-date-mp td { + font:normal 11px arial, helvetica,tahoma,sans-serif; +} +.x-date-mp-btns button { + background-color:#083772; + color:#fff; + border-color: #3366cc #000055 #000055 #3366cc; + font:normal 11px arial, helvetica,tahoma,sans-serif; +} +.x-date-mp-btns { + background-color: #dfecfb; + background-image: url(../images/default/shared/glass-bg.gif); +} +.x-date-mp-btns td { + border-top-color: #c5d2df; +} +td.x-date-mp-month a,td.x-date-mp-year a { + color:#15428b; +} +td.x-date-mp-sel a { + background-color: #dfecfb; + background-image: url(../images/default/shared/glass-bg.gif); + border-color:#8db2e3; +} +.x-date-mp-ybtn a { + background-image:url(../images/default/panel/tool-sprites.gif); +} +td.x-date-mp-sep { + border-right-color:#c5d2df; +} +.x-tip .x-tip-close{ + background-image: url(../images/default/qtip/close.gif); +} +.x-tip .x-tip-tc, .x-tip .x-tip-tl, .x-tip .x-tip-tr, .x-tip .x-tip-bc, .x-tip .x-tip-bl, .x-tip .x-tip-br, .x-tip .x-tip-ml, .x-tip .x-tip-mr { + background-image: url(../images/default/qtip/tip-sprite.gif); +} +.x-tip .x-tip-mc { + font: normal 11px tahoma,arial,helvetica,sans-serif; +} +.x-tip .x-tip-ml { + background-color: #fff; +} +.x-tip .x-tip-header-text { + font: bold 11px tahoma,arial,helvetica,sans-serif; + color:#444; +} +.x-tip .x-tip-body { + font: normal 11px tahoma,arial,helvetica,sans-serif; + color:#444; +} +.x-form-invalid-tip .x-tip-tc, .x-form-invalid-tip .x-tip-tl, .x-form-invalid-tip .x-tip-tr, .x-form-invalid-tip .x-tip-bc, +.x-form-invalid-tip .x-tip-bl, .x-form-invalid-tip .x-tip-br, .x-form-invalid-tip .x-tip-ml, .x-form-invalid-tip .x-tip-mr +{ + background-image: url(../images/default/form/error-tip-corners.gif); +} +.x-form-invalid-tip .x-tip-body { + background-image:url(../images/default/form/exclamation.gif); +} +.x-tip-anchor { + background-image:url(../images/default/qtip/tip-anchor-sprite.gif); +} +.x-menu { + border-color:#718bb7; + background-color:#f0f0f0; + background-image:url(../images/default/menu/menu.gif); +} +.x-menu-nosep { + background-image:none; +} +.x-menu-list-item{ + font:normal 11px tahoma,arial, sans-serif; +} +.x-menu-item-arrow{ + background-image:url(../images/default/menu/menu-parent.gif); +} +.x-menu-sep { + background-color:#e0e0e0; + border-bottom-color:#fff; +} +a.x-menu-item { + color:#222; +} +.x-menu-item-active { + background:#ebf3fd url(../images/default/menu/item-over.gif) repeat-x left bottom; + border:1px solid #aaccf6; + padding:0; +} +.x-menu-item-active a.x-menu-item { + color:#233d6d; +} + +.x-menu-plain { + background-color:#fff !important; +} +.x-menu .x-date-picker{ + border-color:#a3bad9; +} +.x-cycle-menu .x-menu-item-checked { + border-color:#a3bae9 !important; + background-color:#def8f6; +} +.x-menu-scroller-top { + background-image:url(../images/default/layout/mini-top.gif); +} +.x-menu-scroller-bottom { + background-image:url(../images/default/layout/mini-bottom.gif); +} + +.x-menu-scroller{ + border-width: 1px 0; +} +.x-box-tl { + background-image: url(../images/default/box/corners.gif); +} +.x-box-tc { + background-image: url(../images/default/box/tb.gif); +} +.x-box-tr { + background-image: url(../images/default/box/corners.gif); +} +.x-box-ml { + background-image: url(../images/default/box/l.gif); +} +.x-box-mc { + background-color: #eee; + background-image: url(../images/default/box/tb.gif); + font-family: "Myriad Pro","Myriad Web","Tahoma","Helvetica","Arial",sans-serif; + color: #393939; + font-size: 12px; +} +.x-box-mc h3 { + font-size: 14px; + font-weight: bold; +} +.x-box-mr { + background-image: url(../images/default/box/r.gif); +} +.x-box-bl { + background-image: url(../images/default/box/corners.gif); +} +.x-box-bc { + background-image: url(../images/default/box/tb.gif); +} +.x-box-br { + background-image: url(../images/default/box/corners.gif); +} +.x-box-blue .x-box-bl, .x-box-blue .x-box-br, .x-box-blue .x-box-tl, .x-box-blue .x-box-tr { + background-image: url(../images/default/box/corners-blue.gif); +} +.x-box-blue .x-box-bc, .x-box-blue .x-box-mc, .x-box-blue .x-box-tc { + background-image: url(../images/default/box/tb-blue.gif); +} +.x-box-blue .x-box-mc { + background-color: #c3daf9; +} +.x-box-blue .x-box-mc h3 { + color: #17385b; +} +.x-box-blue .x-box-ml { + background-image: url(../images/default/box/l-blue.gif); +} +.x-box-blue .x-box-mr { + background-image: url(../images/default/box/r-blue.gif); +} +.x-combo-list { + border-color:#98c0f4; + background-color:#ddecfe; + font:normal 12px tahoma, arial, helvetica, sans-serif; +} +.x-combo-list-inner { + background-color:#fff; +} +.x-combo-list-hd { + font:bold 11px tahoma, arial, helvetica, sans-serif; + color:#15428b; + background-image: url(../images/default/layout/panel-title-light-bg.gif); + border-bottom-color:#98c0f4; +} +.x-resizable-pinned .x-combo-list-inner { + border-bottom-color:#98c0f4; +} +.x-combo-list-item { + border-color:#fff; +} +.x-combo-list .x-combo-selected{ + border-color:#a3bae9 !important; + background-color:#dfe8f6; +} +.x-combo-list .x-toolbar { + border-top-color:#98c0f4; +} +.x-combo-list-small { + font:normal 11px tahoma, arial, helvetica, sans-serif; +} +.x-panel { + border-color: #99bbe8; +} +.x-panel-header { + color:#15428b; + font-weight:bold; + font-size: 11px; + font-family: tahoma,arial,verdana,sans-serif; + border-color:#99bbe8; + background-image: url(../images/default/panel/white-top-bottom.gif); +} +.x-panel-body { + border-color:#99bbe8; + background-color:#fff; +} +.x-panel-bbar .x-toolbar, .x-panel-tbar .x-toolbar { + border-color:#99bbe8; +} +.x-panel-tbar-noheader .x-toolbar, .x-panel-mc .x-panel-tbar .x-toolbar { + border-top-color:#99bbe8; +} +.x-panel-body-noheader, .x-panel-mc .x-panel-body { + border-top-color:#99bbe8; +} +.x-panel-tl .x-panel-header { + color:#15428b; + font-weight:bold; + font-size: 11px; + font-family: tahoma,arial,verdana,sans-serif; +} +.x-panel-tc { + background-image: url(../images/default/panel/top-bottom.gif); +} +.x-panel-tl, .x-panel-tr, .x-panel-bl, .x-panel-br{ + background-image: url(../images/default/panel/corners-sprite.gif); + border-bottom-color:#99bbe8; +} +.x-panel-bc { + background-image: url(../images/default/panel/top-bottom.gif); +} +.x-panel-mc { + font: normal 11px tahoma,arial,helvetica,sans-serif; + background-color:#dfe8f6; +} +.x-panel-ml { + background-color: #fff; + background-image:url(../images/default/panel/left-right.gif); +} +.x-panel-mr { + background-image: url(../images/default/panel/left-right.gif); +} +.x-tool { + background-image:url(../images/default/panel/tool-sprites.gif); +} +.x-panel-ghost { + background-color:#cbddf3; +} +.x-panel-ghost ul { + border-color:#99bbe8; +} +.x-panel-dd-spacer { + border-color:#99bbe8; +} +.x-panel-fbar td,.x-panel-fbar span,.x-panel-fbar input,.x-panel-fbar div,.x-panel-fbar select,.x-panel-fbar label{ + font:normal 11px arial,tahoma, helvetica, sans-serif; +} +.x-window-proxy { + background-color:#c7dffc; + border-color:#99bbe8; +} +.x-window-tl .x-window-header { + color:#15428b; + font:bold 11px tahoma,arial,verdana,sans-serif; +} +.x-window-tc { + background-image: url(../images/default/window/top-bottom.png); +} +.x-window-tl { + background-image: url(../images/default/window/left-corners.png); +} +.x-window-tr { + background-image: url(../images/default/window/right-corners.png); +} +.x-window-bc { + background-image: url(../images/default/window/top-bottom.png); +} +.x-window-bl { + background-image: url(../images/default/window/left-corners.png); +} +.x-window-br { + background-image: url(../images/default/window/right-corners.png); +} +.x-window-mc { + border-color:#99bbe8; + font: normal 11px tahoma,arial,helvetica,sans-serif; + background-color:#dfe8f6; +} +.x-window-ml { + background-image: url(../images/default/window/left-right.png); +} +.x-window-mr { + background-image: url(../images/default/window/left-right.png); +} +.x-window-maximized .x-window-tc { + background-color:#fff; +} +.x-window-bbar .x-toolbar { + border-top-color:#99bbe8; +} +.x-panel-ghost .x-window-tl { + border-bottom-color:#99bbe8; +} +.x-panel-collapsed .x-window-tl { + border-bottom-color:#84a0c4; +} +.x-dlg-mask{ + background-color:#ccc; +} +.x-window-plain .x-window-mc { + background-color: #ccd9e8; + border-color: #a3bae9 #dfe8f6 #dfe8f6 #a3bae9; +} +.ext-ie .x-window-plain .x-window-mc { + background-color: #c9d5e4; +} +.x-window-plain .x-window-body { + border-color: #dfe8f6 #a3bae9 #a3bae9 #dfe8f6; +} +body.x-body-masked .x-window-plain .x-window-mc { + background-color: #ccd9e8; +} +.x-html-editor-wrap { + border-color:#a9bfd3; + background-color:#fff; +} + +.x-html-editor-tb .x-edit-bold, .x-menu-item .x-edit-bold { + background-position:0 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-italic, .x-menu-item .x-edit-italic { + background-position:-16px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-underline, .x-menu-item .x-edit-underline { + background-position:-32px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-forecolor, .x-menu-item .x-edit-forecolor { + background-position:-160px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-backcolor, .x-menu-item .x-edit-backcolor { + background-position:-176px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-justifyleft, .x-menu-item .x-edit-justifyleft { + background-position:-112px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-justifycenter, .x-menu-item .x-edit-justifycenter { + background-position:-128px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-justifyright, .x-menu-item .x-edit-justifyright { + background-position:-144px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-insertorderedlist, .x-menu-item .x-edit-insertorderedlist { + background-position:-80px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-insertunorderedlist, .x-menu-item .x-edit-insertunorderedlist { + background-position:-96px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-increasefontsize, .x-menu-item .x-edit-increasefontsize { + background-position:-48px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-decreasefontsize, .x-menu-item .x-edit-decreasefontsize { + background-position:-64px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-sourceedit, .x-menu-item .x-edit-sourceedit { + background-position:-192px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-createlink, .x-menu-item .x-edit-createlink { + background-position:-208px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +}.x-panel-noborder .x-panel-header-noborder { + border-bottom-color:#99bbe8; +} +.x-panel-noborder .x-panel-tbar-noborder .x-toolbar { + border-bottom-color:#99bbe8; +} +.x-panel-noborder .x-panel-bbar-noborder .x-toolbar { + border-top-color:#99bbe8; +} +.x-tab-panel-bbar-noborder .x-toolbar { + border-top-color:#99bbe8; +} +.x-tab-panel-tbar-noborder .x-toolbar { + border-bottom-color:#99bbe8; +} +.x-border-layout-ct { + background-color:#dfe8f6; +} +.x-accordion-hd { + color:#222; + font-weight:normal; + background-image: url(../images/default/panel/light-hd.gif); +} +.x-layout-collapsed{ + background-color:#d2e0f2; + border-color:#98c0f4; +} +.x-layout-collapsed-over{ + background-color:#d9e8fb; +} +.x-layout-split-west .x-layout-mini { + background-image:url(../images/default/layout/mini-left.gif); +} +.x-layout-split-east .x-layout-mini { + background-image:url(../images/default/layout/mini-right.gif); +} +.x-layout-split-north .x-layout-mini { + background-image:url(../images/default/layout/mini-top.gif); +} +.x-layout-split-south .x-layout-mini { + background-image:url(../images/default/layout/mini-bottom.gif); +} +.x-layout-cmini-west .x-layout-mini { + background-image:url(../images/default/layout/mini-right.gif); +} +.x-layout-cmini-east .x-layout-mini { + background-image:url(../images/default/layout/mini-left.gif); +} +.x-layout-cmini-north .x-layout-mini { + background-image:url(../images/default/layout/mini-bottom.gif); +} +.x-layout-cmini-south .x-layout-mini { + background-image:url(../images/default/layout/mini-top.gif); +} +.x-progress-wrap { + border-color:#6593cf; +} +.x-progress-inner { + background-color:#e0e8f3; + background-image:url(../images/default/qtip/bg.gif); +} +.x-progress-bar { + background-color:#9cbfee; + background-image:url(../images/default/progress/progress-bg.gif); + border-top-color:#d1e4fd; + border-bottom-color:#7fa9e4; + border-right-color:#7fa9e4; +} +.x-progress-text { + font-size:11px; + font-weight:bold; + color:#fff; +} +.x-progress-text-back { + color:#396095; +} +.x-slider-horz, .x-slider-horz .x-slider-end, .x-slider-horz .x-slider-inner { + background-image:url(../images/default/slider/slider-bg.png); +} +.x-slider-horz .x-slider-thumb { + background-image:url(../images/default/slider/slider-thumb.png); +} +.x-slider-vert, .x-slider-vert .x-slider-end, .x-slider-vert .x-slider-inner { + background-image:url(../images/default/slider/slider-v-bg.png); +} +.x-slider-vert .x-slider-thumb { + background-image:url(../images/default/slider/slider-v-thumb.png); +} +.x-window-dlg .ext-mb-text, +.x-window-dlg .x-window-header-text { + font-size:12px; +} +.x-window-dlg .ext-mb-textarea { + font:normal 12px tahoma,arial,helvetica,sans-serif; +} +.x-window-dlg .x-msg-box-wait { + background-image:url(../images/default/grid/loading.gif); +} +.x-window-dlg .ext-mb-info { + background-image:url(../images/default/window/icon-info.gif); +} +.x-window-dlg .ext-mb-warning { + background-image:url(../images/default/window/icon-warning.gif); +} +.x-window-dlg .ext-mb-question { + background-image:url(../images/default/window/icon-question.gif); +} +.x-window-dlg .ext-mb-error { + background-image:url(../images/default/window/icon-error.gif); +} diff --git a/src/main/webapp/gxt/css/gxt-gray.css b/src/main/webapp/gxt/css/gxt-gray.css new file mode 100644 index 0000000..bc31336 --- /dev/null +++ b/src/main/webapp/gxt/css/gxt-gray.css @@ -0,0 +1,493 @@ +.x-panel { + border-style: solid; + border-color: #d0d0d0; +} +.x-panel-header { + color:#333; + border:1px solid #d0d0d0; + background-image:url(../images/gray/panel/white-top-bottom.gif); +} + +.x-panel-body { + border-color:#d0d0d0; +} + +.x-panel-bbar .x-toolbar { + border-color:#d0d0d0; +} + +.x-panel-tbar .x-toolbar { + border-color:#d0d0d0; +} + +.x-panel-tbar-noheader .x-toolbar, .x-panel-mc .x-panel-tbar .x-toolbar { + border-color:#d0d0d0; +} +.x-panel-body-noheader, .x-panel-mc .x-panel-body { + border-color:#d0d0d0; +} +.x-panel-tl .x-panel-header { + color:#333; +} +.x-panel-tc { + background-image:url(../images/gray/panel/top-bottom.gif); +} +.x-panel-tl { + background-image:url(../images/gray/panel/corners-sprite.gif); + border-color:#d0d0d0; +} +.x-panel-tr { + background-image:url(../images/gray/panel/corners-sprite.gif); +} +.x-panel-bc { + background-image:url(../images/gray/panel/top-bottom.gif); +} +.x-panel-bl { + background-image:url(../images/gray/panel/corners-sprite.gif); +} +.x-panel-br { + background-image:url(../images/gray/panel/corners-sprite.gif); +} +.x-panel-mc { + background:#f1f1f1; +} +.x-panel-mc .x-panel-body { + background:transparent; + border: 0 none; +} +.x-panel-ml { + background-image:url(../images/gray/panel/left-right.gif); +} +.x-panel-mr { + background-image:url(../images/gray/panel/left-right.gif); +} + +/* Tools */ +.x-tool { + background-image:url(../images/gray/panel/tool-sprites.gif); +} + +/* Ghosting */ +.x-panel-ghost { + background:#e0e0e0; +} + +.x-panel-ghost ul { + border-color:#b0b0b0; +} + +.x-grid-panel .x-panel-mc .x-panel-body { + border:1px solid #d0d0d0; +} + +/* Buttons */ + +.x-btn-left{ + background-image:url(../images/gray/button/btn-sprite.gif); +} +.x-btn-right{ + background-image:url(../images/gray/button/btn-sprite.gif); +} +.x-btn-center{ + background-image:url(../images/gray/button/btn-sprite.gif); +} + +.x-btn-group-header { + color: #333333; +} +.x-btn-group-tc { + background-image: url(../images/gray/button/group-tb.gif); +} +.x-btn-group-tl { + background-image: url(../images/gray/button/group-cs.gif); +} +.x-btn-group-tr { + background-image: url(../images/gray/button/group-cs.gif); +} +.x-btn-group-bc { + background-image: url(../images/gray/button/group-tb.gif); +} +.x-btn-group-bl { + background-image: url(../images/gray/button/group-cs.gif); +} +.x-btn-group-br { + background-image: url(../images/gray/button/group-cs.gif); +} +.x-btn-group-ml { + background-image: url(../images/gray/button/group-lr.gif); +} +.x-btn-group-mr { + background-image: url(../images/gray/button/group-lr.gif); +} +.x-btn-group-notitle .x-btn-group-tc { + background-image: url(../images/gray/button/group-tb.gif); +} + +/* Layout classes */ + +.x-border-layout-ct { + background:#f0f0f0; +} + +.x-accordion-hd { + background-image:url(../images/gray/panel/light-hd.gif); +} + +.x-layout-collapsed{ + background-color:#eee; + border-color:#e0e0e0; +} +.x-layout-collapsed-over{ + background-color:#fbfbfb; +} + + +/* qtips */ +.x-tip .x-tip-top { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-top-left { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-top-right { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-ft { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-ft-left { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-ft-right { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-bd-left { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-bd-right { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} + +/* Toolbars */ + +.x-toolbar{ + border-color:#d0d0d0; + background:#f0f4f5 url(../images/gray/toolbar/bg.gif) repeat-x top left; +} +.x-toolbar button { + color:#444; +} +.x-toolbar .x-btn-menu-arrow-wrap .x-btn-center button { + background-image:url(../images/gray/toolbar/btn-arrow.gif); +} +.x-toolbar .x-btn-text-icon .x-btn-menu-arrow-wrap .x-btn-center button { + background-image:url(../images/gray/toolbar/btn-arrow.gif); +} +.x-toolbar .x-btn-over .x-btn-left{ + background-image:url(../images/gray/toolbar/tb-btn-sprite.gif); +} +.x-toolbar .x-btn-over .x-btn-right{ + background-image:url(../images/gray/toolbar/tb-btn-sprite.gif); +} +.x-toolbar .x-btn-over .x-btn-center{ + background-image:url(../images/gray/toolbar/tb-btn-sprite.gif); +} +.x-toolbar .x-btn-over button { + color:#111; +} +.x-toolbar .x-btn-click .x-btn-left, .x-toolbar .x-btn-pressed .x-btn-left, .x-toolbar .x-btn-menu-active .x-btn-left{ + background-image:url(../images/gray/toolbar/tb-btn-sprite.gif); +} +.x-toolbar .x-btn-click .x-btn-right, .x-toolbar .x-btn-pressed .x-btn-right, .x-toolbar .x-btn-menu-active .x-btn-right{ + background-image:url(../images/gray/toolbar/tb-btn-sprite.gif); +} + +.x-toolbar .x-btn-click .x-btn-center, .x-toolbar .x-btn-pressed .x-btn-center, .x-toolbar .x-btn-menu-active .x-btn-center{ + background-image:url(../images/gray/toolbar/tb-btn-sprite.gif); +} +.x-toolbar .xtb-sep { + background-image: url(../images/gray/grid/grid-split.gif); +} + +/* Tabs */ + +.x-tab-panel-header, .x-tab-panel-footer { + background: #EAEAEA; + border-color:#d0d0d0; +} + + +.x-tab-panel-header { + border-color:#d0d0d0; +} + +.x-tab-panel-footer { + border-color:#d0d0d0; +} + +ul.x-tab-strip-top{ + background:#dbdbdb url(../images/gray/tabs/tab-strip-bg.gif) repeat-x left top; + border-color:#d0d0d0; + padding-top: 2px; +} + +ul.x-tab-strip-bottom{ + background-image:url(../images/gray/tabs/tab-strip-btm-bg.gif); + border-color:#d0d0d0; +} + +.x-tab-strip span.x-tab-strip-text { + color:#333; +} +.x-tab-strip-over span.x-tab-strip-text { + color:#111; +} + +.x-tab-strip-active span.x-tab-strip-text { + color:#333; +} + +.x-tab-strip-disabled .x-tabs-text { + color:#aaaaaa; +} + +.x-tab-strip-top .x-tab-right { + background-image:url(../images/gray/tabs/tabs-sprite.gif); +} + +.x-tab-strip-top .x-tab-left { + background-image:url(../images/gray/tabs/tabs-sprite.gif); +} +.x-tab-strip-top .x-tab-strip-inner { + background-image:url(../images/gray/tabs/tabs-sprite.gif); +} + +.x-tab-strip-bottom .x-tab-right { + background-image:url(../images/gray/tabs/tab-btm-inactive-right-bg.gif); +} + +.x-tab-strip-bottom .x-tab-left { + background-image:url(../images/gray/tabs/tab-btm-inactive-left-bg.gif); +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right { + background-image:url(../images/gray/tabs/tab-btm-right-bg.gif); +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-left { + background-image:url(../images/gray/tabs/tab-btm-left-bg.gif); +} + +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close { + background-image:url(../images/gray/tabs/tab-close.gif); +} +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover{ + background-image:url(../images/gray/tabs/tab-close.gif); +} + +.x-tab-panel-body { + border-color:#d0d0d0; + background:#fff; +} +.x-tab-panel-bbar .x-toolbar { + border-color: #d0d0d0; +} + +.x-tab-panel-tbar .x-toolbar { + border-color: #d0d0d0; +} + +.x-tab-panel-header-plain .x-tab-strip-spacer { + border-color:#d0d0d0; + background: #eaeaea; +} + +.x-tab-scroller-left { + background-image: url(../images/gray/tabs/scroll-left.gif); + border-color:#aeaeae; +} +.x-tab-scroller-right { + background-image: url(../images/gray/tabs/scroll-right.gif); + border-color:#aeaeae; +} + +/* Window */ + +.x-window-proxy { + background:#e0e0e0; + border-color:#b0b0b0; +} + +.x-window-tl .x-window-header { + color:#555; +} +.x-window-tc { + background-image:url(../images/gray/window/top-bottom.png); +} +.x-window-tl { + background-image:url(../images/gray/window/left-corners.png); +} +.x-window-tr { + background-image:url(../images/gray/window/right-corners.png); +} +.x-window-bc { + background-image:url(../images/gray/window/top-bottom.png); +} +.x-window-bl { + background-image:url(../images/gray/window/left-corners.png); +} +.x-window-br { + background-image:url(../images/gray/window/right-corners.png); +} +.x-window-mc { + border:1px solid #d0d0d0; + background:#e8e8e8; +} +.ext-ie .x-window-plain .x-window-mc { + background-color: #e3e3e3; +} + +.x-window-ml { + background-image:url(../images/gray/window/left-right.png); +} +.x-window-mr { + background-image:url(../images/gray/window/left-right.png); +} +.x-panel-ghost .x-window-tl { + border-color:#d0d0d0; +} +.x-panel-collapsed .x-window-tl { + border-color:#d0d0d0; +} + +.x-window-plain .x-window-mc { + background: #e8e8e8; + border-right:1px solid #eee; + border-bottom:1px solid #eee; + border-top:1px solid #d0d0d0; + border-left:1px solid #d0d0d0; +} + +.x-window-plain .x-window-body { + border-left:1px solid #eee; + border-top:1px solid #eee; + border-bottom:1px solid #d0d0d0; + border-right:1px solid #d0d0d0; + background:transparent !important; +} + +body.x-body-masked .x-window-mc, body.x-body-masked .x-window-plain .x-window-mc { + background-color: #e4e4e4; +} + + +/* misc */ +.x-html-editor-wrap { + border-color:#d0d0d0; +} + +/* Borders go last for specificity */ +.x-panel-noborder .x-panel-body-noborder { + border-width:0; +} + +.x-panel-noborder .x-panel-header-noborder { + border-width:0; + border-bottom:1px solid #d0d0d0; +} + +.x-panel-noborder .x-panel-tbar-noborder .x-toolbar { + border-width:0; + border-bottom:1px solid #d0d0d0; +} + +.x-panel-noborder .x-panel-bbar-noborder .x-toolbar { + border-width:0; + border-top:1px solid #d0d0d0; +} + +.x-window-noborder .x-window-mc { + border-width:0; +} +.x-window-plain .x-window-body-noborder { + border-width:0; +} + +.x-tab-panel-noborder .x-tab-panel-body-noborder { + border-width:0; +} + +.x-tab-panel-noborder .x-tab-panel-header-noborder { + border-top-width:0; + border-left-width:0; + border-right-width:0; +} + +.x-tab-panel-noborder .x-tab-panel-footer-noborder { + border-bottom-width:0; + border-left-width:0; + border-right-width:0; +} + + +.x-tab-panel-bbar-noborder .x-toolbar { + border-width:0; + border-top:1px solid #d0d0d0; +} + +.x-tab-panel-tbar-noborder .x-toolbar { + border-width:0; + border-bottom:1px solid #d0d0d0; +} + +.x-spinner-field .x-form-spinner-up { + background-image: url('../images/gray/form/spinner.gif'); +} +.x-spinner-field .x-form-spinner-down { + background-image: url('../images/gray/form/spinner.gif'); +}.x-accordion-hd { + background-color: #e5e5e5; +}.x-border { + border: 1px solid #D0D0D0; +} + +.x-layout-popup { + background-color: #F0F0F0; + border: 1px solid #D0D0D0; +} + +.my-list { + border: 1px solid #D0D0D0; +} + +.x-view { + border:1px solid #D0D0D0; +} + +.x-menubar { + border-color: #D0D0D0; + background-color: #F0F0F0; + background-image: url(../images/gray/toolbar/bg.gif); +} + +.x-menubar-item-active { + background-color: #D9E8FB; +} + +.x-menubar-item-active { + background-color: #D9E8FB; +}.x-date-right-icon { + background-image: url(../images/default/shared/right-btn.gif); + margin-right: 2px; + text-decoration: none !important; +} + +.x-date-left-icon { + background-image: url(../images/default/shared/left-btn.gif); + margin-right: 2px; + text-decoration: none !important; +}.my-tbl { + border: 1px solid #C6C5C5; +}.my-treetbl { + border: 1px solid #C6C5C5; +} \ No newline at end of file diff --git a/src/main/webapp/gxt/desktop/css/desktop.css b/src/main/webapp/gxt/desktop/css/desktop.css new file mode 100644 index 0000000..1db8a3b --- /dev/null +++ b/src/main/webapp/gxt/desktop/css/desktop.css @@ -0,0 +1,638 @@ +/* + * Ext JS Library 2.1 + * Copyright(c) 2006-2008, Ext JS, LLC. + * licensing@extjs.com + * + * http://extjs.com/license + */ +html,body { + background: #3d71b8 url(../wallpapers/desktop.jpg) no-repeat left top; + font: normal 12px tahoma, arial, verdana, sans-serif; + margin: 0; + padding: 0; + border: 0 none; + overflow: hidden; + height: 100%; +} + +.start { + background-image: url( ../images/taskbar/black/startbutton-icon.gif ) !important; +} + +.bogus { + background-image: url( ../images/bogus.png ) !important; +} + +.logout { + background-image: url( ../images/logout.gif ) !important; +} + +.settings { + background-image: url( ../images/gears.gif ) !important; +} + +#dpanels { + width: 250px; + float: right; +} + +#dpanels .x-panel { + margin: 15px; +} + +#dpanels .x-date-picker { + border: 0 none; + border-top: 0 none; + background: transparent; +} + +#dpanels .x-date-picker td.x-date-active { + background: #ffffff; +} + +#dpanels .x-date-picker { + width: 100% !important; +} + +#x-desktop { + width: 100%; + height: 100%; + border: 0 none; + position: relative; + overflow: hidden; + zoom: 1; +} + +#ux-taskbar .x-btn { + float: left; + margin: 1px 0 0 1px; + position: relative; +} + +#ux-taskbar-start .x-btn { + float: left; + margin: 0; + position: relative; +} + +#ux-taskbar button { /* width: 150px; + overflow: hidden; */ + text-align: left; + color: #ffffff; +} + +#title-bar-wrapper { + height: 35px; +} + +#title-bar { + color: #225599; + padding: 9px 7px; + font: bold 16px tahoma, arial, verdana, sans-serif; + float: left; +} + +#x-logout { + float: right; + padding: 6px 7px; +} + +.x-btn-text-icon .x-btn-center .logout { + background-position: 0pt 3px; + background-repeat: no-repeat; + padding: 3px 0pt 3px 18px; +} + +#ux-taskbar { + background: transparent none; + height: 30px; + margin: 0; + padding: 0; + position: relative; + z-index: 12001; +} + +.x-btn-icon .ux-taskbutton-center .x-btn-text { + background-position: center; + background-repeat: no-repeat; + height: 16px; + width: 16px; + cursor: pointer; + white-space: nowrap; + padding: 0; +} + +.x-btn-icon .ux-taskbutton-center { + padding: 1px; +} + +.ux-startbutton-center .x-btn-text { + color: #000000 !important; + font-weight: bold; +} + +.ux-taskbutton-left,.ux-taskbutton-right { + font-size: 1px; + line-height: 1px; +} + +.ux-taskbutton-left { + width: 4px; + height: 28px; + background: url( ../images/taskbar/black/taskbutton.gif ) no-repeat 0 0; +} + +.ux-taskbutton-right { + width: 4px; + height: 28px; + background: url( ../images/taskbar/black/taskbutton.gif ) no-repeat 0 -28px; +} + +.ux-taskbutton-left i,.ux-taskbutton-right i { + display: block; + width: 4px; + overflow: hidden; + font-size: 1px; + line-height: 1px; +} + +.ux-taskbutton-center { + background: url( ../images/taskbar/black/taskbutton.gif ) repeat-x 0 -56px; + vertical-align: middle; + text-align: center; + padding: 0 5px; + cursor: pointer; + white-space: nowrap; +} + +#ux-taskbar .ux-taskbutton-left { + background-position: 0 0; +} + +#ux-taskbar .ux-taskbutton-right { + background-position: 0 -28px; +} + +#ux-taskbar .ux-taskbutton-center { + background-position: 0 -56px; +} + +#ux-taskbar .x-btn-over .ux-taskbutton-left { + background-position: 0 -252px; +} + +#ux-taskbar .x-btn-over .ux-taskbutton-right { + background-position: 0 -280px; +} + +#ux-taskbar .x-btn-over .ux-taskbutton-center { + background-position: 0 -308px; +} + +#ux-taskbar .x-btn-click .ux-taskbutton-left { + background-position: 0 -168px; +} + +#ux-taskbar .x-btn-click .ux-taskbutton-right { + background-position: 0 -196px; +} + +#ux-taskbar .x-btn-click .ux-taskbutton-center { + background-position: 0 -224px; +} + +#ux-taskbar .active-win .ux-taskbutton-left { + background-position: 0 -84px; +} + +#ux-taskbar .active-win .ux-taskbutton-right { + background: url( ../images/taskbar/black/taskbutton.gif ) no-repeat 0 -112px; +} + +#ux-taskbar .active-win .ux-taskbutton-center { + background: url( ../images/taskbar/black/taskbutton.gif ) repeat-x 0 -140px; +} + +#ux-taskbar .active-win .ux-taskbutton-center button { + color: #fff; +} + +#spacer { + height: 25px; + float: left; + width: 0; + overflow: hidden; + margin-top: 2px; +} + +.x-window-body p,.x-panel-body p { + padding: 10px; + margin: 0; +} + +.x-window-maximized .x-window-bc { + height: 0; +} + +.add { + background-image: url(../images/add.gif) !important; +} + +.option { + background-image: url(../images/plugin.gif) !important; +} + +.remove { + background-image: url(../images/delete.gif) !important; +} + +.tabs { + background-image: url(../images/tabs.gif) !important; +} + +.ux-start-menu { + background: transparent none; + border: 0px none; + padding: 0; +} + +.ux-start-menu-tl .x-window-header { + color: #f1f1f1; + font: bold 11px tahoma, arial, verdana, sans-serif; + padding: 5px 0 4px 0; +} + +.x-panel-tl .x-panel-icon,.ux-start-menu-tl .x-panel-icon { + background-position: 0pt 4px; + background-repeat: no-repeat; + padding-left: 20px !important; +} + +.ux-start-menu-tl { + background: transparent url( ../images/taskbar/black/start-menu-left-corners.png ) no-repeat 0 0; + padding-left: 6px; + zoom: 1; + z-index: 1; + position: relative; +} + +.ux-start-menu-tr { + background: transparent url( ../images/taskbar/black/start-menu-right-corners.png ) no-repeat right + 0; + padding-right: 6px; +} + +.ux-start-menu-tc { + background: transparent url( ../images/taskbar/black/start-menu-top-bottom.png ) repeat-x 0 0; + overflow: hidden; + zoom: 1; +} + +.ux-start-menu-ml { + background: transparent url( ../images/taskbar/black/start-menu-left-right.png ) repeat-y 0 0; + padding-left: 6px; + zoom: 1; +} + +.ux-start-menu-bc { + background: transparent url( ../images/taskbar/black/start-menu-top-bottom.png ) repeat-x 0 bottom; + zoom: 1; +} + +.ux-start-menu-bc .x-window-footer { + padding-bottom: 6px; + zoom: 1; + font-size: 0; + line-height: 0; +} + +.ux-start-menu-bl { + background: transparent url( ../images/taskbar/black/start-menu-left-corners.png ) no-repeat 0 + bottom; + padding-left: 6px; + zoom: 1; +} + +.ux-start-menu-br { + background: transparent url( ../images/taskbar/black/start-menu-right-corners.png ) no-repeat right + bottom; + padding-right: 6px; + zoom: 1; +} + +.x-panel-nofooter .ux-start-menu-bc { + height: 6px; +} + +.ux-start-menu-splitbar-h { + background-color: #d0d0d0; +} + +.ux-start-menu-bwrap { + background: transparent none; + border: 0px none; +} + +.ux-start-menu-body { + background: transparent none; + border: 0px none; +} + +.ux-start-menu-apps-panel { + background: #ffffff none; + border: 1px solid #1e2124; +} + +.ux-start-menu-tools-panel { + border: 0px none; + background: transparent url( ../images/taskbar/black/start-menu-right.png ) repeat-y scroll right + 0pt; +} + +#ux-taskbar-start { + background: #000000 url( ../images/taskbar/black/taskbar-start-panel-bg.gif ) repeat-x left top; + left: 0px; + padding: 0; + position: absolute; +} + +#ux-taskbar-start .x-toolbar { + background: none; + padding: 0px; + border: 0px none; +} + +#ux-taskbuttons-panel { + background: #000000 url( ../images/taskbar/black/taskbuttons-panel-bg.gif ) repeat-x left top; + padding-top: 0; + position: relative; +} + +.ux-taskbuttons-strip-wrap { /* overflow:hidden; + position:relative; + width:100%; */ + width: 100%; + overflow: hidden; + position: relative; + zoom: 1; +} + +ul.ux-taskbuttons-strip { + display: block; + width: 5000px; + zoom: 1; +} + +ul.ux-taskbuttons-strip li { + float: left; + margin-left: 2px; +} + +ul.ux-taskbuttons-strip li.ux-taskbuttons-edge { + float: left; + margin: 0 !important; + padding: 0 !important; + border: 0 none !important; + font-size: 1px !important; + line-height: 1px !important; + overflow: hidden; + zoom: 1; + background: transparent !important; + width: 1px; +} + +.x-clear { + clear: both; + height: 0; + overflow: hidden; + line-height: 0; + font-size: 0; +} + +.x-taskbuttons-scrolling { + position: relative; +} + +.x-taskbuttons-scrolling .ux-taskbuttons-strip-wrap { + margin-left: 18px; + margin-right: 18px; +} + +td.ux-taskButtons-edge { /*float:left;*/ + margin: 0 !important; + padding: 0 !important; + border: 0 none !important; + font-size: 1px !important; + line-height: 1px !important; + overflow: hidden; + zoom: 1; + background: transparent !important; + width: 1px; +} + +.ux-taskbuttons-scroller-left { + background: transparent url( ../images/taskbar/black/scroll-left.gif ) no-repeat -18px 0; + width: 18px; + position: absolute; + left: 1px; + top: 0px; + z-index: 10; + cursor: pointer; +} + +.ux-taskbuttons-scroller-left-over { + background-position: 0 0; +} + +.ux-taskbuttons-scroller-left-disabled { + background-position: -18px 0; + opacity: .5; + -moz-opacity: .5; + filter: alpha(opacity = 50); + cursor: default; +} + +.ux-taskbuttons-scroller-right { + background: transparent url( ../images/taskbar/black/scroll-right.gif ) no-repeat 0 0; + width: 18px; + position: absolute; + right: 0; + top: 0px; + z-index: 10; + cursor: pointer; +} + +.ux-taskbuttons-scroller-right-over { + background-position: -18px 0; +} + +.ux-taskbuttons-scroller-right-disabled { + background-position: 0 0; + opacity: .5; + -moz-opacity: .5; + filter: alpha(opacity = 50); + cursor: default; +} + +.ux-toolmenu-sep { + background-color: #18191a; + border-bottom: 1px solid #858789; + display: block; + font-size: 1px; + line-height: 1px; + margin: 2px 3px; +} + +.ux-start-menu-tools-panel ul.x-menu-list li.x-menu-list-item a.x-menu-item { + color: #ffffff; +} + +.ux-start-menu-tools-panel ul.x-menu-list li.x-menu-list-item .x-menu-item-active a.x-menu-item { + color: #000000; +} + +.ux-start-menu-tools-panel .x-menu-item-active { + background: #525456 url( ../images/taskbar/black/item-over.gif ) repeat-x left bottom; + border: 1px solid #000000; + padding: 0; +} + +#ux-taskbar .x-splitbar-h { + background: #000000 url( ../images/taskbar/black/taskbar-split-h.gif ) no-repeat 0 0; + width: 8px; +} + +.x-window-header-text { + cursor: default; +} + +/* + * Begin Start button + */ +.ux-startbutton-left,.ux-startbutton-right { + font-size: 1px; + line-height: 1px; +} + +.ux-startbutton-left { + width: 10px; + height: 28px; + background: url( ../images/taskbar/black/startbutton.gif ) no-repeat 0 0; +} + +.ux-startbutton-right { + width: 10px; + height: 30px; + background: url( ../images/taskbar/black/startbutton.gif ) no-repeat 0 -28px; +} + +.ux-startbutton-left i,.ux-startbutton-right i { + display: block; + width: 10px; + overflow: hidden; + font-size: 1px; + line-height: 1px; +} + +.ux-startbutton-center { + background: url( ../images/taskbar/black/startbutton.gif ) repeat-x 0 -56px; + vertical-align: middle; + text-align: center; + padding: 0; + cursor: pointer; + white-space: nowrap; +} + +#ux-taskbar .ux-startbutton-left { + background-position: 0 0; +} + +#ux-taskbar .ux-startbutton-right { + background-position: 0 -30px; +} + +#ux-taskbar .ux-startbutton-center { + background-position: 0 -60px; +} + +#ux-taskbar .x-btn-over .ux-startbutton-left { + background-position: 0 -270px; +} + +#ux-taskbar .x-btn-over .ux-startbutton-right { + background-position: 0 -300px; +} + +#ux-taskbar .x-btn-over .ux-startbutton-center { + background-position: 0 -330px; +} + +#ux-taskbar .x-btn-click .ux-startbutton-left { + background-position: 0 -180px; +} + +#ux-taskbar .x-btn-click .ux-startbutton-right { + background-position: 0 -210px; +} + +#ux-taskbar .x-btn-click .ux-startbutton-center { + background-position: 0 -240px; +} + +#ux-taskbar .active-win .ux-startbutton-left { + background-position: 0 -90px; +} + +#ux-taskbar .active-win .ux-startbutton-right { + background: url( ../images/taskbar/black/startbutton.gif ) no-repeat 0 -120px; +} + +#ux-taskbar .active-win .ux-startbutton-center { + background: url( ../images/taskbar/black/startbutton.gif ) repeat-x 0 -150px; +} + +#ux-taskbar .active-win .ux-startbutton-center button { + color: #fff; +} + +/* + * End Start button + */ +.x-resizable-proxy { + background: #C7DFFC; + opacity: .5; + -moz-opacity: .5; + filter: alpha(opacity = 50); + border: 1px solid #3b5a82; +} + +/* Desktop Shortcuts */ +#x-shortcuts dt { + float: left; + margin: 15px 0 0 15px; + clear: left; + width: 64px; + font: normal 10px tahoma, arial, verdana, sans-serif; + text-align: center; + zoom: 1; + display: block; +} + +#x-shortcuts dt a { + width: 64px; + display: block; + color: white; + text-decoration: none; +} + +#x-shortcuts dt div { + width: 100%; + color: white; + overflow: hidden; + text-overflow: ellipsis; + cursor: pointer; +} + +#x-shortcuts dt a:hover { + text-decoration: underline; +} diff --git a/src/main/webapp/gxt/desktop/images/add.gif b/src/main/webapp/gxt/desktop/images/add.gif new file mode 100644 index 0000000..9319525 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/add.gif differ diff --git a/src/main/webapp/gxt/desktop/images/delete.gif b/src/main/webapp/gxt/desktop/images/delete.gif new file mode 100644 index 0000000..5e2a3b1 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/delete.gif differ diff --git a/src/main/webapp/gxt/desktop/images/desktop.gif b/src/main/webapp/gxt/desktop/images/desktop.gif new file mode 100644 index 0000000..f305cb6 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/desktop.gif differ diff --git a/src/main/webapp/gxt/desktop/images/desktop3.jpg b/src/main/webapp/gxt/desktop/images/desktop3.jpg new file mode 100644 index 0000000..daca8bc Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/desktop3.jpg differ diff --git a/src/main/webapp/gxt/desktop/images/gears.gif b/src/main/webapp/gxt/desktop/images/gears.gif new file mode 100644 index 0000000..2bf6bd7 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/gears.gif differ diff --git a/src/main/webapp/gxt/desktop/images/gears.png b/src/main/webapp/gxt/desktop/images/gears.png new file mode 100644 index 0000000..6acdc98 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/gears.png differ diff --git a/src/main/webapp/gxt/desktop/images/grid.png b/src/main/webapp/gxt/desktop/images/grid.png new file mode 100644 index 0000000..c4da495 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/grid.png differ diff --git a/src/main/webapp/gxt/desktop/images/hatch.gif b/src/main/webapp/gxt/desktop/images/hatch.gif new file mode 100644 index 0000000..6a044a8 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/hatch.gif differ diff --git a/src/main/webapp/gxt/desktop/images/hd-bg.gif b/src/main/webapp/gxt/desktop/images/hd-bg.gif new file mode 100644 index 0000000..f35a53f Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/hd-bg.gif differ diff --git a/src/main/webapp/gxt/desktop/images/hd-tb-bg.gif b/src/main/webapp/gxt/desktop/images/hd-tb-bg.gif new file mode 100644 index 0000000..f800edb Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/hd-tb-bg.gif differ diff --git a/src/main/webapp/gxt/desktop/images/icon_padlock.png b/src/main/webapp/gxt/desktop/images/icon_padlock.png new file mode 100644 index 0000000..92625ff Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/icon_padlock.png differ diff --git a/src/main/webapp/gxt/desktop/images/icons-bg.png b/src/main/webapp/gxt/desktop/images/icons-bg.png new file mode 100644 index 0000000..6557cbb Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/icons-bg.png differ diff --git a/src/main/webapp/gxt/desktop/images/launcher-bg.gif b/src/main/webapp/gxt/desktop/images/launcher-bg.gif new file mode 100644 index 0000000..c7cfd83 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/launcher-bg.gif differ diff --git a/src/main/webapp/gxt/desktop/images/launcher-btn.gif b/src/main/webapp/gxt/desktop/images/launcher-btn.gif new file mode 100644 index 0000000..a9a72d7 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/launcher-btn.gif differ diff --git a/src/main/webapp/gxt/desktop/images/logout.gif b/src/main/webapp/gxt/desktop/images/logout.gif new file mode 100644 index 0000000..a4f3738 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/logout.gif differ diff --git a/src/main/webapp/gxt/desktop/images/logout.png b/src/main/webapp/gxt/desktop/images/logout.png new file mode 100644 index 0000000..1fcb386 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/logout.png differ diff --git a/src/main/webapp/gxt/desktop/images/member.gif b/src/main/webapp/gxt/desktop/images/member.gif new file mode 100644 index 0000000..216c839 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/member.gif differ diff --git a/src/main/webapp/gxt/desktop/images/member.png b/src/main/webapp/gxt/desktop/images/member.png new file mode 100644 index 0000000..0f3657f Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/member.png differ diff --git a/src/main/webapp/gxt/desktop/images/plugin.gif b/src/main/webapp/gxt/desktop/images/plugin.gif new file mode 100644 index 0000000..209c121 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/plugin.gif differ diff --git a/src/main/webapp/gxt/desktop/images/powered.gif b/src/main/webapp/gxt/desktop/images/powered.gif new file mode 100644 index 0000000..8ce74b8 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/powered.gif differ diff --git a/src/main/webapp/gxt/desktop/images/powered.png b/src/main/webapp/gxt/desktop/images/powered.png new file mode 100644 index 0000000..5b2a0b8 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/powered.png differ diff --git a/src/main/webapp/gxt/desktop/images/s.gif b/src/main/webapp/gxt/desktop/images/s.gif new file mode 100644 index 0000000..1d11fa9 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/s.gif differ diff --git a/src/main/webapp/gxt/desktop/images/tabs.gif b/src/main/webapp/gxt/desktop/images/tabs.gif new file mode 100644 index 0000000..759de0f Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/tabs.gif differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/item-over.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/item-over.gif new file mode 100644 index 0000000..26c1fc2 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/item-over.gif differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/scroll-left.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/scroll-left.gif new file mode 100644 index 0000000..94fea48 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/scroll-left.gif differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/scroll-right.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/scroll-right.gif new file mode 100644 index 0000000..94b5669 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/scroll-right.gif differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-left-corners.png b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-left-corners.png new file mode 100644 index 0000000..d6e5196 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-left-corners.png differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-left-right.png b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-left-right.png new file mode 100644 index 0000000..a577d1b Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-left-right.png differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-right-corners.png b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-right-corners.png new file mode 100644 index 0000000..b683301 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-right-corners.png differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-right.png b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-right.png new file mode 100644 index 0000000..e5fa2b8 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-right.png differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-top-bottom.png b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-top-bottom.png new file mode 100644 index 0000000..fbea3cb Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-top-bottom.png differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/startbutton-icon.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/startbutton-icon.gif new file mode 100644 index 0000000..8dcd2d1 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/startbutton-icon.gif differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/startbutton.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/startbutton.gif new file mode 100644 index 0000000..683313e Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/startbutton.gif differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/taskbar-split-h.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbar-split-h.gif new file mode 100644 index 0000000..13564ad Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbar-split-h.gif differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/taskbar-start-panel-bg.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbar-start-panel-bg.gif new file mode 100644 index 0000000..9794880 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbar-start-panel-bg.gif differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/taskbutton.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbutton.gif new file mode 100644 index 0000000..df13974 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbutton.gif differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/taskbuttons-panel-bg.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbuttons-panel-bg.gif new file mode 100644 index 0000000..0865c45 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbuttons-panel-bg.gif differ diff --git a/src/main/webapp/gxt/desktop/images/winbar-bg.gif b/src/main/webapp/gxt/desktop/images/winbar-bg.gif new file mode 100644 index 0000000..45295a6 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/winbar-bg.gif differ diff --git a/src/main/webapp/gxt/desktop/images/winbar-btn.gif b/src/main/webapp/gxt/desktop/images/winbar-btn.gif new file mode 100644 index 0000000..2c8c024 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/winbar-btn.gif differ diff --git a/src/main/webapp/gxt/desktop/images/windows-bg.gif b/src/main/webapp/gxt/desktop/images/windows-bg.gif new file mode 100644 index 0000000..396471e Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/windows-bg.gif differ diff --git a/src/main/webapp/gxt/desktop/wallpapers/desktop.jpg b/src/main/webapp/gxt/desktop/wallpapers/desktop.jpg new file mode 100644 index 0000000..8e1fcb0 Binary files /dev/null and b/src/main/webapp/gxt/desktop/wallpapers/desktop.jpg differ diff --git a/src/main/webapp/gxt/flash/swfobject.js b/src/main/webapp/gxt/flash/swfobject.js new file mode 100644 index 0000000..4b704c5 --- /dev/null +++ b/src/main/webapp/gxt/flash/swfobject.js @@ -0,0 +1,5 @@ +/* SWFObject v2.1 + Copyright (c) 2007-2008 Geoff Stearns, Michael Williams, and Bobby van der Sluis + This software is released under the MIT License +*/ +var swfobject=function(){var b="undefined",Q="object",n="Shockwave Flash",p="ShockwaveFlash.ShockwaveFlash",P="application/x-shockwave-flash",m="SWFObjectExprInst",j=window,K=document,T=navigator,o=[],N=[],i=[],d=[],J,Z=null,M=null,l=null,e=false,A=false;var h=function(){var v=typeof K.getElementById!=b&&typeof K.getElementsByTagName!=b&&typeof K.createElement!=b,AC=[0,0,0],x=null;if(typeof T.plugins!=b&&typeof T.plugins[n]==Q){x=T.plugins[n].description;if(x&&!(typeof T.mimeTypes!=b&&T.mimeTypes[P]&&!T.mimeTypes[P].enabledPlugin)){x=x.replace(/^.*\s+(\S+\s+\S+$)/,"$1");AC[0]=parseInt(x.replace(/^(.*)\..*$/,"$1"),10);AC[1]=parseInt(x.replace(/^.*\.(.*)\s.*$/,"$1"),10);AC[2]=/r/.test(x)?parseInt(x.replace(/^.*r(.*)$/,"$1"),10):0}}else{if(typeof j.ActiveXObject!=b){var y=null,AB=false;try{y=new ActiveXObject(p+".7")}catch(t){try{y=new ActiveXObject(p+".6");AC=[6,0,21];y.AllowScriptAccess="always"}catch(t){if(AC[0]==6){AB=true}}if(!AB){try{y=new ActiveXObject(p)}catch(t){}}}if(!AB&&y){try{x=y.GetVariable("$version");if(x){x=x.split(" ")[1].split(",");AC=[parseInt(x[0],10),parseInt(x[1],10),parseInt(x[2],10)]}}catch(t){}}}}var AD=T.userAgent.toLowerCase(),r=T.platform.toLowerCase(),AA=/webkit/.test(AD)?parseFloat(AD.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,q=false,z=r?/win/.test(r):/win/.test(AD),w=r?/mac/.test(r):/mac/.test(AD);/*@cc_on q=true;@if(@_win32)z=true;@elif(@_mac)w=true;@end@*/return{w3cdom:v,pv:AC,webkit:AA,ie:q,win:z,mac:w}}();var L=function(){if(!h.w3cdom){return }f(H);if(h.ie&&h.win){try{K.write("