Browse Source

branch for release 4.2

git-svn-id: https://svn.d4science-ii.research-infrastructures.eu/gcube/branches/common/common-smartgears/2.1@134815 82a268e6-3cf1-43bd-a215-b396298e98cf
pull/1/head
Lucio Lelii 5 years ago
commit
702a724422
  1. 41
      .classpath
  2. 23
      .project
  3. 1
      distro/LICENSE
  4. 70
      distro/README
  5. 39
      distro/changelog.xml
  6. 32
      distro/descriptor.xml
  7. 26
      distro/profile.xml
  8. 2
      distro/smartgears-config.xml
  9. BIN
      endpoint.xml
  10. BIN
      endpoint.xml.backup
  11. 612
      extra/originals.graffle
  12. 270
      pom.xml
  13. 149
      src/main/java/org/gcube/smartgears/Bootstrap.java
  14. 222
      src/main/java/org/gcube/smartgears/Constants.java
  15. 12
      src/main/java/org/gcube/smartgears/configuration/Mode.java
  16. 169
      src/main/java/org/gcube/smartgears/configuration/application/ApplicationConfiguration.java
  17. 149
      src/main/java/org/gcube/smartgears/configuration/application/ApplicationConfigurationBinder.java
  18. 75
      src/main/java/org/gcube/smartgears/configuration/application/ApplicationExtensions.java
  19. 141
      src/main/java/org/gcube/smartgears/configuration/application/ApplicationHandlers.java
  20. 162
      src/main/java/org/gcube/smartgears/configuration/application/BridgedApplicationConfiguration.java
  21. 312
      src/main/java/org/gcube/smartgears/configuration/application/DefaultApplicationConfiguration.java
  22. 79
      src/main/java/org/gcube/smartgears/configuration/application/Exclude.java
  23. 501
      src/main/java/org/gcube/smartgears/configuration/container/ContainerConfiguration.java
  24. 101
      src/main/java/org/gcube/smartgears/configuration/container/ContainerConfigurationBinder.java
  25. 44
      src/main/java/org/gcube/smartgears/configuration/container/ContainerHandlers.java
  26. 52
      src/main/java/org/gcube/smartgears/configuration/container/ProxyAddress.java
  27. 152
      src/main/java/org/gcube/smartgears/configuration/container/Site.java
  28. 79
      src/main/java/org/gcube/smartgears/configuration/library/SmartGearsConfiguration.java
  29. 47
      src/main/java/org/gcube/smartgears/configuration/library/SmartGearsConfigurationBinder.java
  30. 171
      src/main/java/org/gcube/smartgears/context/Properties.java
  31. 155
      src/main/java/org/gcube/smartgears/context/Property.java
  32. 82
      src/main/java/org/gcube/smartgears/context/application/ApplicationContext.java
  33. 113
      src/main/java/org/gcube/smartgears/context/application/DefaultApplicationContext.java
  34. 56
      src/main/java/org/gcube/smartgears/context/container/ContainerContext.java
  35. 81
      src/main/java/org/gcube/smartgears/context/container/DefaultContainerContext.java
  36. 37
      src/main/java/org/gcube/smartgears/extensions/ApiMethodSignature.java
  37. 150
      src/main/java/org/gcube/smartgears/extensions/ApiResource.java
  38. 51
      src/main/java/org/gcube/smartgears/extensions/ApiSignature.java
  39. 43
      src/main/java/org/gcube/smartgears/extensions/ApplicationExtension.java
  40. 245
      src/main/java/org/gcube/smartgears/extensions/HttpController.java
  41. 88
      src/main/java/org/gcube/smartgears/extensions/HttpExtension.java
  42. 49
      src/main/java/org/gcube/smartgears/extensions/RequestExceptionBarrier.java
  43. 44
      src/main/java/org/gcube/smartgears/extensions/resource/ConfigurationResource.java
  44. 152
      src/main/java/org/gcube/smartgears/extensions/resource/FrontPageResource.java
  45. 102
      src/main/java/org/gcube/smartgears/extensions/resource/LifecycleResource.java
  46. 42
      src/main/java/org/gcube/smartgears/extensions/resource/ProfileResource.java
  47. 37
      src/main/java/org/gcube/smartgears/extensions/resource/RemoteResource.java
  48. 20
      src/main/java/org/gcube/smartgears/handlers/AbstractHandler.java
  49. 35
      src/main/java/org/gcube/smartgears/handlers/Event.java
  50. 22
      src/main/java/org/gcube/smartgears/handlers/Handler.java
  51. 78
      src/main/java/org/gcube/smartgears/handlers/Pipeline.java
  52. 24
      src/main/java/org/gcube/smartgears/handlers/ProfileEvents.java
  53. 24
      src/main/java/org/gcube/smartgears/handlers/application/ApplicationEvent.java
  54. 16
      src/main/java/org/gcube/smartgears/handlers/application/ApplicationHandler.java
  55. 49
      src/main/java/org/gcube/smartgears/handlers/application/ApplicationLifecycleEvent.java
  56. 47
      src/main/java/org/gcube/smartgears/handlers/application/ApplicationLifecycleHandler.java
  57. 42
      src/main/java/org/gcube/smartgears/handlers/application/ApplicationPipeline.java
  58. 72
      src/main/java/org/gcube/smartgears/handlers/application/RequestEvent.java
  59. 68
      src/main/java/org/gcube/smartgears/handlers/application/RequestHandler.java
  60. 28
      src/main/java/org/gcube/smartgears/handlers/application/ResponseEvent.java
  61. 70
      src/main/java/org/gcube/smartgears/handlers/application/lifecycle/ProfileBuilder.java
  62. 306
      src/main/java/org/gcube/smartgears/handlers/application/lifecycle/ProfileManager.java
  63. 214
      src/main/java/org/gcube/smartgears/handlers/application/lifecycle/ProfilePublisher.java
  64. 95
      src/main/java/org/gcube/smartgears/handlers/application/request/RequestAccounting.java
  65. 122
      src/main/java/org/gcube/smartgears/handlers/application/request/RequestError.java
  66. 66
      src/main/java/org/gcube/smartgears/handlers/application/request/RequestException.java
  67. 190
      src/main/java/org/gcube/smartgears/handlers/application/request/RequestValidator.java
  68. 41
      src/main/java/org/gcube/smartgears/handlers/container/ContainerHandler.java
  69. 50
      src/main/java/org/gcube/smartgears/handlers/container/ContainerLifecycleEvent.java
  70. 40
      src/main/java/org/gcube/smartgears/handlers/container/ContainerPipeline.java
  71. 36
      src/main/java/org/gcube/smartgears/handlers/container/lifecycle/AccountingManager.java
  72. 366
      src/main/java/org/gcube/smartgears/handlers/container/lifecycle/ProfileBuilder.java
  73. 289
      src/main/java/org/gcube/smartgears/handlers/container/lifecycle/ProfileManager.java
  74. 233
      src/main/java/org/gcube/smartgears/handlers/container/lifecycle/ProfilePublisher.java
  75. 63
      src/main/java/org/gcube/smartgears/lifecycle/DefaultLifecycle.java
  76. 39
      src/main/java/org/gcube/smartgears/lifecycle/Lifecycle.java
  77. 24
      src/main/java/org/gcube/smartgears/lifecycle/State.java
  78. 38
      src/main/java/org/gcube/smartgears/lifecycle/application/ApplicationLifecycle.java
  79. 95
      src/main/java/org/gcube/smartgears/lifecycle/application/ApplicationState.java
  80. 58
      src/main/java/org/gcube/smartgears/lifecycle/container/ContainerLifecycle.java
  81. 135
      src/main/java/org/gcube/smartgears/lifecycle/container/ContainerState.java
  82. 363
      src/main/java/org/gcube/smartgears/managers/ApplicationManager.java
  83. 327
      src/main/java/org/gcube/smartgears/managers/ContainerManager.java
  84. 13
      src/main/java/org/gcube/smartgears/managers/ContextEvents.java
  85. 234
      src/main/java/org/gcube/smartgears/managers/RequestManager.java
  86. 96
      src/main/java/org/gcube/smartgears/persistence/DefaultPersistence.java
  87. 13
      src/main/java/org/gcube/smartgears/persistence/Persistence.java
  88. 24
      src/main/java/org/gcube/smartgears/probe/ContainerListener.java
  89. 387
      src/main/java/org/gcube/smartgears/provider/DefaultProvider.java
  90. 56
      src/main/java/org/gcube/smartgears/provider/OfflinePublisher.java
  91. 89
      src/main/java/org/gcube/smartgears/provider/Provider.java
  92. 14
      src/main/java/org/gcube/smartgears/provider/ProviderFactory.java
  93. 17
      src/main/java/org/gcube/smartgears/utils/ScopeEvent.java
  94. 221
      src/main/java/org/gcube/smartgears/utils/Utils.java
  95. 5
      src/main/resources/META-INF/container-handlers.xml
  96. 4
      src/main/resources/META-INF/default-extensions.xml
  97. 10
      src/main/resources/META-INF/default-handlers.xml
  98. 268
      src/main/resources/META-INF/frontpage.html
  99. 1
      src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer
  100. 1
      src/main/resources/META-INF/services/org.gcube.smartgears.extensions.ApplicationExtension

41
.classpath

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="target/classes" path="src/main/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" path="target/generated-sources">
<attributes>
<attribute name="optional" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/classes"/>
</classpath>

23
.project

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>common-service</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
</natures>
</projectDescription>

1
distro/LICENSE

@ -0,0 +1 @@
${gcube.license}

70
distro/README

@ -0,0 +1,70 @@
The gCube System - ${name}
--------------------------------------------------
${description}
${gcube.description}
${gcube.funding}
Version
--------------------------------------------------
${version} (${buildDate})
Please see the file named "changelog.xml" in this directory for the release notes.
Authors
--------------------------------------------------
* Fabio Simeoni (fabio.simeoni@fao.org), FAO of the UN, Italy
* Luca Frosini (luca.frosini@isti.cnr.it), CNR, Italy
* Lucio Lelii (lucio.lelii@isti.cnr.it), CNT, Italy
Maintainers
-----------
* Luca Frosini (luca.frosini@isti.cnr.it), CNR, Italy
* Lucio Lelii (lucio.lelii@isti.cnr.it), CNT, Italy
Download information
--------------------------------------------------
Source code is available from SVN:
${scm.url}
Binaries can be downloaded from the gCube website:
${gcube.website}
Installation
--------------------------------------------------
Installation documentation is available on-line in the gCube Wiki:
${gcube.wikiRoot}/Smartgears
Documentation
--------------------------------------------------
Documentation is available on-line in the gCube Wiki:
${gcube.wikiRoot}/Smartgears
Support
--------------------------------------------------
Bugs and support requests can be reported in the gCube issue tracking tool:
${gcube.issueTracking}
Licensing
--------------------------------------------------
This software is licensed under the terms you may find in the file named "LICENSE" in this directory.

39
distro/changelog.xml

@ -0,0 +1,39 @@
<ReleaseNotes>
<Changeset component="common-smartgears-2.1.0" date="2016-10-24">
<Change>proxy configuration added</Change>
<Change>solved a bug in events registration for ProfileManager</Change>
<Change>added a scheduler for period update of GCoreEnpoints</Change>
<Change>Exclude modified to support exclude for sub-group of handlers</Change>
</Changeset>
<Changeset component="common-smartgears-2.0.0" date="2016-03-10">
<Change>integration with Authorization 2.0</Change>
</Changeset>
<Changeset component="common-smartgears-1.2.6" date="2015-12-22">
<Change>Added flush of accounting data</Change>
</Changeset>
<Changeset component="common-smartgears-1.2.5" date="2015-12-22">
<Change>Changed accounting version</Change>
</Changeset>
<Changeset component="common-smartgears-1.2.4" date="2015-10-06">
<Change>Transparent accounting added on service calls</Change>
</Changeset>
<Changeset component="common-smartgears-1.2.3" date="2015-07-27">
<Change>Authorization token control added</Change>
<Change>Added support to HTTP Basic authorization</Change>
</Changeset>
<Changeset component="common-smartgears-1.2.2" date="2015-04-27">
<Change>Fixed available space information on ghn profile</Change>
</Changeset>
<Changeset component="common-smartgears-1.2.1" date="2014-02-13">
<Change>scopes can be removed from container</Change>
<Change>node profile set to static</Change>
<Change>internal adjustments for move to Java 7</Change>
<Change>wildcard allowed in exclude directives</Change>
<Change>domain corrected derived in gHN profile</Change>
<Change>cleaner shutdown</Change>
<Change>further improvement in shutdown handling</Change>
</Changeset>
<Changeset component="common-smartgears-1.0.0" date="2013-10-24">
<Change>First Release</Change>
</Changeset>
</ReleaseNotes>

32
distro/descriptor.xml

@ -0,0 +1,32 @@
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>servicearchive</id>
<formats>
<format>tar.gz</format>
</formats>
<baseDirectory>/</baseDirectory>
<fileSets>
<fileSet>
<directory>${distroDirectory}</directory>
<outputDirectory>/</outputDirectory>
<useDefaultExcludes>true</useDefaultExcludes>
<includes>
<include>README</include>
<include>LICENSE</include>
<include>changelog.xml</include>
<include>profile.xml</include>
</includes>
<fileMode>755</fileMode>
<filtered>true</filtered>
</fileSet>
</fileSets>
<files>
<file>
<source>target/${build.finalName}.${project.packaging}</source>
<outputDirectory>/${artifactId}</outputDirectory>
</file>
</files>
</assembly>

26
distro/profile.xml

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<Resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ID />
<Type>Service</Type>
<Profile>
<Description>${description}</Description>
<Class>Common</Class>
<Name>${artifactId}</Name>
<Version>1.0.0</Version>
<Packages>
<Software>
<Name>${artifactId}</Name>
<Version>${version}</Version>
<MavenCoordinates>
<groupId>${groupId}</groupId>
<artifactId>${artifactId}</artifactId>
<version>${version}</version>
</MavenCoordinates>
<Files>
<File>${build.finalName}.jar</File>
</Files>
</Software>
</Packages>
</Profile>
</Resource>

2
distro/smartgears-config.xml

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<smartgears version="${project.version}" />

BIN
endpoint.xml

Binary file not shown.

BIN
endpoint.xml.backup

Binary file not shown.

612
extra/originals.graffle

@ -0,0 +1,612 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>ActiveLayerIndex</key>
<integer>0</integer>
<key>ApplicationVersion</key>
<array>
<string>com.omnigroup.OmniGrafflePro</string>
<string>138.17.0.133677</string>
</array>
<key>AutoAdjust</key>
<true/>
<key>BackgroundGraphic</key>
<dict>
<key>Bounds</key>
<string>{{0, 0}, {559, 783}}</string>
<key>Class</key>
<string>SolidGraphic</string>
<key>ID</key>
<integer>2</integer>
<key>Style</key>
<dict>
<key>shadow</key>
<dict>
<key>Draws</key>
<string>NO</string>
</dict>
<key>stroke</key>
<dict>
<key>Draws</key>
<string>NO</string>
</dict>
</dict>
</dict>
<key>CanvasOrigin</key>
<string>{0, 0}</string>
<key>ColumnAlign</key>
<integer>1</integer>
<key>ColumnSpacing</key>
<real>36</real>
<key>CreationDate</key>
<string>2013-08-26 14:09:56 +0000</string>
<key>Creator</key>
<string>fabio</string>
<key>DisplayScale</key>
<string>1 0/72 in = 1 0/72 in</string>
<key>GraphDocumentVersion</key>
<integer>6</integer>
<key>GraphicsList</key>
<array>
<dict>
<key>Bounds</key>
<string>{{182, 101.9996}, {27.164064, 25.574612}}</string>
<key>Class</key>
<string>ShapedGraphic</string>
<key>ID</key>
<integer>8</integer>
<key>Shape</key>
<string>Circle</string>
<key>Style</key>
<dict>
<key>fill</key>
<dict>
<key>Color</key>
<dict>
<key>b</key>
<string>0.863685</string>
<key>g</key>
<string>0.863671</string>
<key>r</key>
<string>0.863697</string>
</dict>
</dict>
<key>shadow</key>
<dict>
<key>Draws</key>
<string>NO</string>
</dict>
<key>stroke</key>
<dict>
<key>Color</key>
<dict>
<key>b</key>
<string>0.491337</string>
<key>g</key>
<string>0.325267</string>
<key>r</key>
<string>0.192584</string>
</dict>
</dict>
</dict>
<key>Text</key>
<dict>
<key>Text</key>
<string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset0 HelveticaNeue-Light;}
{\colortbl;\red255\green255\blue255;\red21\green111\blue181;}
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
\f0\fs42 \cf2 C}</string>
</dict>
</dict>
<dict>
<key>Bounds</key>
<string>{{132.60156, 101.9996}, {27.164064, 25.574612}}</string>
<key>Class</key>
<string>ShapedGraphic</string>
<key>ID</key>
<integer>3</integer>
<key>Shape</key>
<string>Circle</string>
<key>Style</key>
<dict>
<key>fill</key>
<dict>
<key>Color</key>
<dict>
<key>b</key>
<string>0.863685</string>
<key>g</key>
<string>0.863671</string>
<key>r</key>
<string>0.863697</string>
</dict>
</dict>
<key>shadow</key>
<dict>
<key>Draws</key>
<string>NO</string>
</dict>
<key>stroke</key>
<dict>
<key>Color</key>
<dict>
<key>b</key>
<string>0.491337</string>
<key>g</key>
<string>0.325267</string>
<key>r</key>
<string>0.192584</string>
</dict>
</dict>
</dict>
<key>Text</key>
<dict>
<key>Text</key>
<string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset0 HelveticaNeue-Light;}
{\colortbl;\red255\green255\blue255;\red21\green111\blue181;}
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
\f0\fs42 \cf2 P}</string>
</dict>
</dict>
</array>
<key>GridInfo</key>
<dict/>
<key>GuidesLocked</key>
<string>NO</string>
<key>GuidesVisible</key>
<string>YES</string>
<key>HPages</key>
<integer>1</integer>
<key>ImageCounter</key>
<integer>4</integer>
<key>KeepToScale</key>
<false/>
<key>Layers</key>
<array>
<dict>
<key>Lock</key>
<string>NO</string>
<key>Name</key>
<string>Layer 1</string>
<key>Print</key>
<string>YES</string>
<key>View</key>
<string>YES</string>
</dict>
</array>
<key>LayoutInfo</key>
<dict>
<key>Animate</key>
<string>NO</string>
<key>circoMinDist</key>
<real>18</real>
<key>circoSeparation</key>
<real>0.0</real>
<key>layoutEngine</key>
<string>dot</string>
<key>neatoSeparation</key>
<real>0.0</real>
<key>twopiSeparation</key>
<real>0.0</real>
</dict>
<key>LinksVisible</key>
<string>NO</string>
<key>MagnetsVisible</key>
<string>NO</string>
<key>MasterSheets</key>
<array/>
<key>ModificationDate</key>
<string>2013-08-27 13:29:54 +0000</string>
<key>Modifier</key>
<string>fabio</string>
<key>NotesVisible</key>
<string>NO</string>
<key>Orientation</key>
<integer>2</integer>
<key>OriginVisible</key>
<string>NO</string>
<key>PageBreaks</key>
<string>YES</string>
<key>PrintInfo</key>
<dict>
<key>NSBottomMargin</key>
<array>
<string>float</string>
<string>41</string>
</array>
<key>NSLeftMargin</key>
<array>
<string>float</string>
<string>18</string>
</array>
<key>NSPaperSize</key>
<array>
<string>size</string>
<string>{595, 842}</string>
</array>
<key>NSRightMargin</key>
<array>
<string>float</string>
<string>18</string>
</array>
<key>NSTopMargin</key>
<array>
<string>float</string>
<string>18</string>
</array>
</dict>
<key>PrintOnePage</key>
<false/>
<key>QuickLookPreview</key>
<data>
JVBERi0xLjMKJcTl8uXrp/Og0MTGCjUgMCBvYmoKPDwgL0xlbmd0aCA2IDAgUiAvRmls
dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGlk02O2zAMhfc+BZftIhqREiVq26Cb
rjqIgR7A6KAYTAaY5v5An2Lrp+h0UTRGYvlFpMjHz2/0SG/kcakWyhbo53f6Rq/0cL4x
bTfi+3Xb6OSd1g34vWKz9aeX/Wmp/7/s2/blj99jnmpOqTm9s+K5JH53ddsWVnXZslLK
2Ykq40hO7HzhDE2cJI6TkqLjFAuNOC2OM/OyQfMuWoiUFLtyRlxkZxZsUkJymgtyH3GE
uMBOsqKGI/sylF5Bj2t1Iq5nN9QZzaYKDuWd/jZ6gtFf8H3ebTpfYI7E7BUZ0IEPRThh
pamKhS5nDA4O4jrVG0azbLCpWcceHkaYMlnH7F0OloZ1zOYswOARJ8GZWJmtY8EuEcS1
5obSLOAjbrauZR/WjQp6XKtzso496lSWYV1ThnW9v40ugLjx6p03CSolVtfui4pZ9sVg
IQHkyTWOybGFhBmbE8y3OvhpJTl8xf2kzpIm9J5dLPgIrVd6WFfQCPvXJ/rw9SOtz/R5
RRUgO4UEkPZFZrwVVTGtJwtaZbg/US2YSMTLMKgeSqP6CFtmOEsBwlwmhAtwxYwmxdSV
bEg9QW3epRyXxjTxLozjuUdNSPfcHel+fkP6j94q0feh3EnmImp1JEFUUvUnFg4h/w3j
lq5P+YqhHFZ1hibloLiHTRC3UgeyrZ2htKZniA9nBsNdaC9Rj5oQ7rk7wv38prR59t52
gv+N3KJODdP+H3DPA9zHX03XNKcKZW5kc3RyZWFtCmVuZG9iago2IDAgb2JqCjU1NApl
bmRvYmoKMyAwIG9iago8PCAvVHlwZSAvUGFnZSAvUGFyZW50IDQgMCBSIC9SZXNvdXJj
ZXMgNyAwIFIgL0NvbnRlbnRzIDUgMCBSIC9NZWRpYUJveCBbMCAwIDU1OSA3ODNdCj4+
CmVuZG9iago3IDAgb2JqCjw8IC9Qcm9jU2V0IFsgL1BERiAvVGV4dCBdIC9Db2xvclNw
YWNlIDw8IC9DczEgOCAwIFIgL0NzMiA5IDAgUiA+PiAvRm9udCA8PAovVFQxLjAgMTAg
MCBSID4+ID4+CmVuZG9iagoxMSAwIG9iago8PCAvTGVuZ3RoIDEyIDAgUiAvTiAzIC9B
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
s/2W462OvgV95/pd+y/e9rp95Y7/nRsDiwb67i6+e/9e3D3pfd790QepD14/zHo4/Wj9
Y+zjoicKTyqeqj+t/dX412apvfTsoNdgz7OIZ4+GuEMv/5X5r0/DBc+pzytGtEbqR61H
z4z5jN16sfTF8MuMl9Pjhb8p/rb3ldGrn353+71nYsnE8GvR65k/St6ovjn61vZt52To
5NN3ae+mp4req74/9oH9oftj9MeR6exP+E+Vn40/d3wJ/PJ4Jm1m5t/3hPP7CmVuZHN0
cmVhbQplbmRvYmoKMTQgMCBvYmoKMjYxMgplbmRvYmoKOSAwIG9iagpbIC9JQ0NCYXNl
ZCAxMyAwIFIgXQplbmRvYmoKNCAwIG9iago8PCAvVHlwZSAvUGFnZXMgL01lZGlhQm94
IFswIDAgNjEyIDc5Ml0gL0NvdW50IDEgL0tpZHMgWyAzIDAgUiBdID4+CmVuZG9iagox
NSAwIG9iago8PCAvVHlwZSAvQ2F0YWxvZyAvT3V0bGluZXMgMiAwIFIgL1BhZ2VzIDQg
MCBSID4+CmVuZG9iagoyIDAgb2JqCjw8IC9MYXN0IDE2IDAgUiAvRmlyc3QgMTcgMCBS
ID4+CmVuZG9iagoxNyAwIG9iago8PCAvUGFyZW50IDE4IDAgUiAvQ291bnQgMCAvRGVz
dCBbIDMgMCBSIC9YWVogMCA3ODMgbnVsbCBdIC9UaXRsZSAoQ2FudmFzIDEpCj4+CmVu
ZG9iagoxOCAwIG9iago8PCA+PgplbmRvYmoKMTYgMCBvYmoKPDwgL1BhcmVudCAxOCAw
IFIgL0NvdW50IDAgL0Rlc3QgWyAzIDAgUiAvWFlaIDAgNzgzIG51bGwgXSAvVGl0bGUg
KENhbnZhcyAxKQo+PgplbmRvYmoKMTAgMCBvYmoKPDwgL1R5cGUgL0ZvbnQgL1N1YnR5
cGUgL1RydWVUeXBlIC9CYXNlRm9udCAvWU5TU1ZWK0hlbHZldGljYU5ldWUtTGlnaHQg
L0ZvbnREZXNjcmlwdG9yCjE5IDAgUiAvRW5jb2RpbmcgL01hY1JvbWFuRW5jb2Rpbmcg
L0ZpcnN0Q2hhciA2NyAvTGFzdENoYXIgODAgL1dpZHRocyBbIDcwNAowIDAgMCAwIDAg
MCAwIDAgMCAwIDAgMCA2MzAgXSA+PgplbmRvYmoKMTkgMCBvYmoKPDwgL1R5cGUgL0Zv
bnREZXNjcmlwdG9yIC9Gb250TmFtZSAvWU5TU1ZWK0hlbHZldGljYU5ldWUtTGlnaHQg
L0ZsYWdzIDMyIC9Gb250QkJveApbLTQzMCAtMzM3IDE0MjAgMTE2M10gL0l0YWxpY0Fu
Z2xlIDAgL0FzY2VudCA5NjcgL0Rlc2NlbnQgLTIxMyAvQ2FwSGVpZ2h0Cjg1OSAvU3Rl
bVYgMCAvTGVhZGluZyAyOSAvWEhlaWdodCA2NDQgL01heFdpZHRoIDE0ODAgL0ZvbnRG
aWxlMiAyMCAwIFIgPj4KZW5kb2JqCjIwIDAgb2JqCjw8IC9MZW5ndGggMjEgMCBSIC9M
ZW5ndGgxIDIyNDQgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBxVVdTFtl
GH6/c9rS8lNaxv8Z3TkrrUA76Fpg/Agro/wMCDJAck4iwwZaYAGHkyEzM/ZGklVCTEzM
TLzwysQrjzFZOm4gXvh7Y4xeaLg1WXZllpk441qf77Q2orhwscSvec73/n/v95zmPevX
rseomBIkUnh+NbpGxrKEsbXOb6zLhkrse+yn42uLqzn9NyJT5+LKjXhWt9wkYg+XYtGF
rE5/YG9fgiEX34q9fml1fTOrW7hevHJ1Pue3rEO3rkY3c+fTAXT5pehqLBtvvY3dv3b1
FR6HZeVxDWvXYrl4pkJ/rfneuXe4N7vsaAmSSDepgF4FBMPuIgimTjLBy/3A4M7s/Fzp
s7+yGvEej7nT/2iY79/cNr2Qnkx/bN42vQXVlqtg5IhfZHxUZ/4yPZmRzdtGJZ7y1xJT
VO5LUaGPdpHFqNjHdtGKyIU9nH2J+qmVPFSFhDLfHplJpWHqoAaqNiy0h7Q5Gqce8lNt
LkikJXoeiQGqywbtkgWZThzE5IHXl6sjKSIfXOX4dVEbReg8NHvmAhUKJioVPgW+plJ4
CZH+0RTZJtRPGNvRUizzZooidXdxS3Hu8hlU9MvywHJEZy9CEfwwNCmQRL88qIuewUnV
rclJOXlxISkPykvRBd3kMXY4YkmtRdZpSl3Gc1pV9LAm5cWYpnWhjonXQQrCkxoqXMlV
wG6YWh4jyOwflXXRO6FeUvVERNLDEU1SFHlA359Q9f2IpGgaoiz5TtExZyHbcwF6tjTB
b81WmUINlNCSSV4TmuBV9P1kUkriJobFraQY5Qy4KY8RPQMpFp5QuSvsViRucCtuBX1o
EdS2+Uen1AF0ovBOCp9MaVG+UcQWo70ig9KSp0Sp/TiUlh6LUke+00OUOtGzg1Nalqc0
LOmUp9St6Il/EEr/yXCe8vARlCeylCeOoPzEIcrLn0x5Rf4i6LoS7VcYlFc9Jcqrj0N5
zbEor813eohyCT3XcspP/o+U1/2NcgwU9pCCwj55hQ3MLD4N+RzFPMc08mLvJ/u/5qER
YDyyU/gk7dDvGHFBpH8Gk4j5XIShZG7BaGgJnPUoTsXjVJxsN51gifQme9vKfrGmcxOY
kTfzQPhA+JEaaXWXZKSKGIKyo09CDzJVAl6gHRgEZoA4sAFsAe8CHwJ3gM+Bktk+M/0A
4WdAmMXMlshhlJQcfMZ6DNniCJxloWbRfdouVJS7hFCwVzjntkNvFtpae6G7BGEyUtD2
XDQ0/cZ0UxMe5xfHAgURc33XRHAo3nfqVF986Jmh7kb2oGOm29WzuDUyshXvaRi5ciEw
1Vvfrr3c1b2mtVf5+/hHCtwKGua1FV+JWymqadkFrRjPfNw7oANlB6DsAM3/hO/AfUCY
BQU2CDVAI9AJXAQ0YBm4AdwC3gM+Au4CXwEls9mqRd/iLRTiKBsO40fZwAB/t1wmMHDC
GQpWVpRb3MwZgtiLqzcL7u37Q6o6lP4u8igw3uFydYwH2AqrHx4ZGWaXH7ezoNQ2FgiM
tUn8XsbKvM/f/RFLhM1LITwZleX+Rxb+CdTGp6ZmZnzDsZWN2PryfHQ8dj12Zmx5cWn9
T34W9U0KZW5kc3RyZWFtCmVuZG9iagoyMSAwIG9iagoxMTg2CmVuZG9iagoyMiAwIG9i
agooTWFjIE9TIFggMTAuOC40IFF1YXJ0eiBQREZDb250ZXh0KQplbmRvYmoKMjMgMCBv
YmoKKEQ6MjAxMzA4MjkxOTU4MjZaMDAnMDAnKQplbmRvYmoKMSAwIG9iago8PCAvUHJv
ZHVjZXIgMjIgMCBSIC9DcmVhdGlvbkRhdGUgMjMgMCBSIC9Nb2REYXRlIDIzIDAgUiA+
PgplbmRvYmoKeHJlZgowIDI0CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwNzEyNSAw
MDAwMCBuIAowMDAwMDA1MDEyIDAwMDAwIG4gCjAwMDAwMDA2NjkgMDAwMDAgbiAKMDAw
MDAwNDg2MyAwMDAwMCBuIAowMDAwMDAwMDIyIDAwMDAwIG4gCjAwMDAwMDA2NTAgMDAw
MDAgbiAKMDAwMDAwMDc3MyAwMDAwMCBuIAowMDAwMDAyMDU1IDAwMDAwIG4gCjAwMDAw
MDQ4MjcgMDAwMDAgbiAKMDAwMDAwNTI3NCAwMDAwMCBuIAowMDAwMDAwODg0IDAwMDAw
IG4gCjAwMDAwMDIwMzQgMDAwMDAgbiAKMDAwMDAwMjA5MSAwMDAwMCBuIAowMDAwMDA0
ODA2IDAwMDAwIG4gCjAwMDAwMDQ5NDYgMDAwMDAgbiAKMDAwMDAwNTE3OCAwMDAwMCBu
IAowMDAwMDA1MDYwIDAwMDAwIG4gCjAwMDAwMDUxNTYgMDAwMDAgbiAKMDAwMDAwNTQ4
NyAwMDAwMCBuIAowMDAwMDA1NzM0IDAwMDAwIG4gCjAwMDAwMDcwMTAgMDAwMDAgbiAK
MDAwMDAwNzAzMSAwMDAwMCBuIAowMDAwMDA3MDgzIDAwMDAwIG4gCnRyYWlsZXIKPDwg
L1NpemUgMjQgL1Jvb3QgMTUgMCBSIC9JbmZvIDEgMCBSIC9JRCBbIDxmZGRiMmE0NjQ3
MmU0OGZmNWU4MjA5Mjk0Njg2N2Y0Yz4KPGZkZGIyYTQ2NDcyZTQ4ZmY1ZTgyMDkyOTQ2
ODY3ZjRjPiBdID4+CnN0YXJ0eHJlZgo3MjAwCiUlRU9GCjEgMCBvYmoKPDwvQXV0aG9y
IChmYWJpbykvQ3JlYXRpb25EYXRlIChEOjIwMTMwODI2MTQwOTAwWikvQ3JlYXRvciAo
T21uaUdyYWZmbGUgUHJvZmVzc2lvbmFsIDUuMi4zKS9Nb2REYXRlIChEOjIwMTMwODI3
MTMyOTAwWikvUHJvZHVjZXIgMjIgMCBSIC9UaXRsZSAob3JpZ2luYWxzLmdyYWZmbGUp
Pj4KZW5kb2JqCnhyZWYKMSAxCjAwMDAwMDc4MzcgMDAwMDAgbiAKdHJhaWxlcgo8PC9J
RCBbPGZkZGIyYTQ2NDcyZTQ4ZmY1ZTgyMDkyOTQ2ODY3ZjRjPiA8ZmRkYjJhNDY0NzJl
NDhmZjVlODIwOTI5NDY4NjdmNGM+XSAvSW5mbyAxIDAgUiAvUHJldiA3MjAwIC9Sb290
IDE1IDAgUiAvU2l6ZSAyND4+CnN0YXJ0eHJlZgo4MDE3CiUlRU9GCg==
</data>
<key>QuickLookThumbnail</key>
<data>
TU0AKgAAAJaAP+BP8AQWDQeEQmFQuGQaBv9xN1xABhuB4AB/goFAAXhMCgAUiMOAACAM
Bwx4u51gBXs1zyQAycUB4FxiBsBgNAAOgCR8MBQGgAPgiCPl/zIQyOFr5eM0APgQBYAC
4Bv4APYBgGbQJoNBsgAGhSageFPJ8P0ACoSB+GNZuN0AOZzPcAPIB2QZB8EgCAgAAA8B
AAADAAAAAQANAAABAQADAAAAAQAEAAABAgADAAAABAAAAVABAwADAAAAAQAFAAABBgAD
AAAAAQACAAABEQAEAAAAAQAAAAgBEgADAAAAAQABAAABFQADAAAAAQAEAAABFgADAAAA
AQAEAAABFwAEAAAAAQAAAI0BHAADAAAAAQABAAABPQADAAAAAQACAAABUgADAAAAAQAB
AAABUwADAAAABAAAAViHcwAHAAAatAAAAWAAAAAAAAgACAAIAAgAAQABAAEAAQAAGrRh
cHBsAhAAAG1udHJSR0IgWFlaIAfdAAcABQATADIAOmFjc3BBUFBMAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD21gABAAAAANMtYXBwbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWRlc2MAAAFQAAAAYmRzY20AAAG0AAADuGNw
cnQAAAVsAAAAJHd0cHQAAAWQAAAAFHJYWVoAAAWkAAAAFGdYWVoAAAW4AAAAFGJYWVoA
AAXMAAAAFHJUUkMAAAXgAAAIDGFhcmcAAA3sAAAAIHZjZ3QAAA4MAAAGEm5kaW4AABQg
AAAGPmNoYWQAABpgAAAALG1tb2QAABqMAAAAKGJUUkMAAAXgAAAIDGdUUkMAAAXgAAAI
DGFhYmcAAA3sAAAAIGFhZ2cAAA3sAAAAIGRlc2MAAAAAAAAACERpc3BsYXkAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAB4AAAAMc2tTSwAAABYAAAF4
Y2FFUwAAABgAAAGOaGVJTAAAABYAAAGmcHRCUgAAABgAAAG8aXRJVAAAABQAAAHUaHVI
VQAAABQAAAHodWtVQQAAABwAAAH8a29LUgAAAAwAAAIYbmJOTwAAABIAAAIkY3NDWgAA
ABYAAAI2emhUVwAAAAwAAAJMZGVERQAAABAAAAJYcm9STwAAABIAAAJoc3ZTRQAAABAA
AAJ6emhDTgAAAAwAAAJMamFKUAAAAA4AAAKKYXIAAAAAABQAAAKYZWxHUgAAACIAAAKs
cHRQVAAAABYAAALObmxOTAAAABYAAALkZnJGUgAAABYAAAL6ZXNFUwAAABIAAAJodGhU
SAAAAAwAAAMQdHJUUgAAABQAAAMcZmlGSQAAABAAAAMwaHJIUgAAABQAAANAcGxQTAAA
ABIAAANUcnVSVQAAACQAAANmZW5VUwAAABIAAAOKZGFESwAAABwAAAOcAEYAYQByAGUA
YgBuAOkAIABMAEMARABMAEMARAAgAGUAbgAgAGMAbwBsAG8AciAPAEwAQwBEACAF5gXR
BeIF1QXgBdkATABDAEQAIABDAG8AbABvAHIAaQBkAG8ATABDAEQAIABjAG8AbABvAHIA
aQBTAHoA7QBuAGUAcwAgAEwAQwBEBBoEPgQ7BEwEPgRABD4EMgQ4BDkAIABMAEMARM7s
t+wAIABMAEMARABGAGEAcgBnAGUALQBMAEMARABCAGEAcgBlAHYAbgD9ACAATABDAERf
aYJyACAATABDAEQARgBhAHIAYgAtAEwAQwBEAEwAQwBEACAAYwBvAGwAbwByAEYA5ABy
AGcALQBMAEMARDCrMOkw/AAgAEwAQwBEIA8ATABDAEQAIAZFBkQGSAZGBikDiAOzA8cD
wQPJA7wDtwAgA78DuAPMA70DtwAgAEwAQwBEAEwAQwBEACAAYQAgAEMAbwByAGUAcwBL
AGwAZQB1AHIAZQBuAC0ATABDAEQATABDAEQAIABjAG8AdQBsAGUAdQByAEwAQwBEACAO
Kg41AFIAZQBuAGsAbABpACAATABDAEQAVgDkAHIAaQAtAEwAQwBEAEwAQwBEACAAdQAg
AGIAbwBqAGkASwBvAGwAbwByACAATABDAEQEJgQyBDUEQgQ9BD4EOQAgBBYEGgAtBDQE
OARBBD8EOwQ1BDkAQwBvAGwAbwByACAATABDAEQATABDAEQALQBmAGEAcgB2AGUAcwBr
AOYAcgBtdGV4dAAAAABDb3B5cmlnaHQgQXBwbGUsIEluYy4sIDIwMTMAWFlaIAAAAAAA
APNSAAEAAAABFs9YWVogAAAAAAAAansAADcfAAABw1hZWiAAAAAAAABl1gAAut0AAAgK
WFlaIAAAAAAAACaFAAAOBAAAyWBjdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgA
LQAyADYAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8AowCo
AK0AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIB
OAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHy
AfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC
6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQT
BCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcF
hgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcr
Bz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJ
JQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtR
C2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN
3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCb
ELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QT
xRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcd
F0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa
7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7p
HxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgj
ZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgN
KD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwt
QS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKb
MtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4
jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6g
PuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJF
VUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwq
THJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19T
qlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtF
W5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Nj
l2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/
bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1
KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5i
fsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASI
aYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6
kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPed
ZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhS
qMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660
JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/er/1
wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXM
tc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls
2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbn
H+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC
9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23//3BhcmEAAAAAAAMA
AAACZmYAAPKnAAANWQAAE9AAAAoOdmNndAAAAAAAAAAAAAMBAAACAAAAAwANACAAPABi
AJMAzgESAVgBqAICAm0C4wNlA/IEiwUwBeAGnQdqCEQJJgoOCwIMAw0RDisPSRByEaES
3RQeFWIWshgEGWAawBwfHYke8SBdIcsjOiSlJhQngCjnKk4rry0OLmMvszD7MjszczSf
NcQ24Tf5OQw6GjsqPDg9RD5OP1pAaEF2QoZDlkSoRbpGykfaSOhJ90sETBBNHE4nTzFQ
OlFCUklTTlRSVVVWV1dYWFlZWlpaW1pcWl1aXlhfVmBSYU1iRmM+ZDVlKmYfZxNoB2j7
ae5q4WvUbMdtuW6rb51wjXF5cmFzQXQZdO51wXaXd294Snkjef1613uvfIh9YH43fw5/
5YC7gZKCaIM9hBOE6IW+hpOHaIg8iRaJ/YsEjD6NrY84kLKR/ZMflCuVLpYwlzGYM5k0
mjWbNZw2nTqeRp9loJih2KMVpEGlXaZup3qohqmRqpurpayvrbmuw6/SsO2yIbNwtNC2
KbdsuJi5trrPu+e8/r4WvzHAVsGSwujESMWbxs3H4cjwygbLJcxHzWTOc89s0FXRN9Ie
0wrT+dTj1c3Wv9e62LzZv9rB277cr92R3mzfQuAZ4PLh0OK546jkm+WQ5oXneeht6WDq
Tesz7BLs6+3G7qTvhvBq8U7yNPMi9Cn1Xfa++DD5lPrf/Bn9WP6k//8AAAACAAsAGwAy
AFIAegCsAOYBJwFvAcACGwKCAvIDcAP4BIgFIQXFBnQHLgfzCMIJnQp9C2QMWA1TDlgP
YhB1EYsSqBPQFPgWJxddGJMZzxsNHEwdjB7OIA0hUSKRI9AlCyZFJ3YopinRKvQsEC0o
LjQvOTA5MTMyKTMeNBA1ATX0NuU31zjIObk6qTuaPIs9ez5qP1tATkFCQjdDLkQkRRpG
EEcGR/tI8EnlSthLzEy+TbBOok+TUIRRc1JhU1BUPlUrVhhXBVfxWNxZyFqzW59ciV1z
Xl1fRWAsYRNh+GLdY8FkpGWIZmtnTWgvaRFp82rVa7ZsmG15blhvNnAScOlxv3KTc2R0
NXUFddZ2pXd1eEV5FHnjerJ7gHxOfRx96n66f42AaoFSgkSDPYQ6hTaGMIcriCWJH4oZ
ixKMC40Ejf2O9o/xkPKR+ZMHlBiVKJY3l0SYUJlbmmebcpx9nYeekp+coKehuKLSo/ml
KaZcp4uotanaqv6sIa1FrmivjbC3se6zNbSFtdG3Dbg9uWm6mbvLvP++Nb9swKTB3MMR
xEDFacaLx6rIyMnpyw3MM81azoLPrNDX0gbTNNRf1YTWpNfE2ObaCtsv3FTded6e38fg
9+Ix43Lks+Xy5yzoZ+mj6t/sG+1Y7pzv8PF28y31EvcK+QL66/y7/mn//wAAAAIACgAX
ACwASABrAJcAygEGAUcBkQHjAj0CoQMNA4UEBwSSBSYFwAZkBxIHyQiICU4KHwr5C9QM
uA2lDpkPkhCPEZISmhOlFLYVyBbeF/kZEhotG0YcYR18HpcfriDCIdQi5SPtJPIl8Cbo
J9gowimlKoMrWiwvLQEt0i6kL3cwSjEgMfcyzjOmNH41VTYsNwI32DitOYI6VjsqO/08
0D2jPnc/SkAfQPVBzEKlQ35EVkUuRgVG3Ee0SIpJYEo2SwtL4Ey1TYlOXU8xUAVQ2VGs
UoBTU1QlVPZVyFaaV2tYO1kLWdtaq1t6XEhdFl3kXrFff2BLYRdh42KuY3pkRmURZdtm
pmdxaDtpBGnOapdrYGwpbPFtuG6Ab0ZwCXDMcYxySnMIc8V0gnU+dft2t3dzeC546Xmk
el97GnvUfI59SH4Cfr5/foBIgR2B+4Lgg8iEsYWbhoSHbYhWiT6KJosNi/WM3I3DjqqP
lJCBkXeScpNwlHGVcZZxl3GYcJlummmbYJxTnUqeTJ9doHmhnaLFo+6lFaY3p0yoUqlR
qlure6y0rfuvR7CTsd+zK7R2tcG3C7hTuZi627whvWy+vcATwWrCw8QbxXTGzsgmyX3K
1MwqzYLO49BW0dbTY9T11ojYGtmt20Dc1t6A4E3iU+SQ5vfplOzF8VT32f//AABuZGlu
AAAAAAAABjYAAKVGAABWlAAAUzkAAKWOAAAlqAAADTwAAFANAABUOQACGZkAAb1wAAFc
KAADAQAAAgAAAB4AQQBiAIMApADFAOYBBgEnAUkBawGNAa8B0QH0AhcCOwJfAoMCqALO
AvMDGgNBA2gDkAO4A+IECwQ2BGEEjQS5BOcFFQVFBXUFpgXYBgwGQQZ3Bq4G6AciB18H
ngfeCCIIaAiwCP0JTAmgCfYKUAqtCw0LbgvSDDgMoQ0LDXYN4w5RDsEPMg+kEBkQkBEJ
EYUSAhKCEwUTiRQQFJkVJRWzFkQW2BdvGAgYpBlDGeQahxstG9Ucfx0sHdwejh9EH/0g
uiF6Ij4jBSPPJJwlayY9JxIn6ijEKaIqgitlLEwtOS4uLy8wPjFVMmwzgzSaNbU20zf2
OR06Rzt2PKk93z8ZQFdBmULfRChFdUbGSBpJZ0qVS5dMdk1ATf9OwU+MUGpRaVKEU7BU
5FYaV1NYjlnMWw1cUV2WXthgD2EzYkdjVWRkZX9mq2foaTFqgWvTbShugG/acTdylnP4
dVd2rHfteRd6MHtCfFl9f365gAmBaILNhDaFoocPiH6J54tBjISNtY7gkA6RTpKwlDSV
xZdOmM2aSJvGnVGe+KDIor6ksqaXqHqqaaxbrkGwFbHhs621f7deuVq7fL23v/nCOcRt
xorImcqkzK/OvtDR0ufVCNc92Y3b9N5a4LXjC+Vh57rqCOwn7gDvnfEe8pj0HPW29235
Nfr8/Lb+X///AAAAJABLAHEAlgC8AOIBCAEuAVQBegGiAckB8QIZAkICawKVAsAC6wMW
A0MDcAOdA8wD+wQrBFwEjgTBBPUFKgVhBZgF0QYLBkcGhQbEBwYHSgePB9gIJAhzCMUJ
HAl3CdYKOQqgCwoLdwvnDFgMzQ1DDbwOOA62DzYPuRA/EMYRTxHZEmUS8hOCFBQUqBU/
FdkWdRcUF7YYWhkCGawaWRsJG7wccx0sHegepx9pIC4g9iHBIo8jXyQzJQol5CbCJ6Qo
iSlzKmArUSxFLTwuNy81MDYxOjJCM000WzVuNoY3pjjPOf47NDxvPa4+8kA5QYRC00Qn
RX9G20g7SZ1K/UxQTZNOyk/8US5SZFOeVNpWGldcWKFZ6ls1XINd018lYHNhvGL+ZD1l
fWbBaAlpVmqla/dtTG6jb/xxWXK4dBl1fHbaeDB5e3q9e/p9On6Bf86BIoJ5g9OFMIaO
h+6JToqqi/uNQI58j7WQ9ZJEk6KVCZZyl9iZPpqjnAidb57WoD2hpqMUpImmBqeOqR6q
tKxNreOveLELsp+0NLXKt2C49bqIvBy9tb9XwQLCtcRpxhzHzsmAyzTM6s6j0FvSEdO/
1WPXANib2jnb3d2H3zLg3+KM5Dvl7Oee6U7q9eyI7fnvSfCF8bHyzvPo9P/2GPcz+FT5
fPqq++r9OP6V//8AAAApAFQAfwCpANMA/gEpAVQBgAGsAdgCBgI0AmICkQLBAvIDIwNW
A4kDvQPzBCkEYASZBNMFDwVMBYsFywYNBlIGmQbiBy0HfQfPCCYIgQjhCUcJsgokCpsL
FguVDBYMmg0fDaYOMA68D0wP3xB1EQ8RrBJNEvETmRREFPIVoxZWFwsXwRh6GTYZ9hq5
G38cSR0XHegevR+VIHIhUSI0IxokBCTyJeMm2SfSKM8p0CrVK94s6y38LxIwLDFKMmwz
kzS+Ne03IDhXOZI60jwVPV0+qj/7QVBCqkQJRW1G10hKScZLTEzYTmlQAFGbUzxU4laO
WD9Z9VuxXXJfNmDyYptkK2WtZypopmoma6ltL265cEdx2HNtdQZ2onhBed97eH0Gfo6A
FIGZgyKErYY7h82JY4sBjKuOXJAGkZuTHpSVlgeXd5jnmlqb051YnvSgqaJlpAeliqb2
qFiptasUrHSt1q85sJ6yBbNutNm2R7e5uTC6qrwkvZu/DsB9werDV8TExjLHockSyoTL
981szuTQXdHZ01fU19ZU18nZMtqS2+vdPt6O393hLeJ+49DlI+Z4583pI+p268Ds/u4x
70rwWfFZ8k7zPPQj9Qf14va694D4Pfjw+YH6Evqg+wn7cfvZ/EL8mfzo/Tf9hf3U/iP+
af6t/vD/NP94/7v//wAAc2YzMgAAAAAAAQxCAAAF3v//8yYAAAeSAAD9kf//+6L///2j
AAAD3AAAwGxtbW9kAAAAAAAABhAAAJzFAAAAAMZ644AAAAAAAAAAAAAAAAAAAAAA
</data>
<key>ReadOnly</key>
<string>NO</string>
<key>RowAlign</key>
<integer>1</integer>
<key>RowSpacing</key>
<real>36</real>
<key>SheetTitle</key>
<string>Canvas 1</string>
<key>SmartAlignmentGuidesActive</key>
<string>YES</string>
<key>SmartDistanceGuidesActive</key>
<string>YES</string>
<key>UniqueID</key>
<integer>1</integer>
<key>UseEntirePage</key>
<false/>
<key>VPages</key>
<integer>1</integer>
<key>WindowInfo</key>
<dict>
<key>CurrentSheet</key>
<integer>0</integer>
<key>ExpandedCanvases</key>
<array>
<dict>
<key>name</key>
<string>Canvas 1</string>
</dict>
</array>
<key>Frame</key>
<string>{{320, -1}, {693, 774}}</string>
<key>ListView</key>
<true/>
<key>OutlineWidth</key>
<integer>142</integer>
<key>RightSidebar</key>
<false/>
<key>ShowRuler</key>
<true/>
<key>Sidebar</key>
<true/>
<key>SidebarWidth</key>
<integer>120</integer>
<key>VisibleRegion</key>
<string>{{0, 0}, {558, 619}}</string>
<key>Zoom</key>
<real>1</real>
<key>ZoomValues</key>
<array>
<array>
<string>Canvas 1</string>
<real>1</real>
<real>1</real>
</array>
</array>
</dict>
<key>saveQuickLookFiles</key>
<string>YES</string>
</dict>
</plist>

270
pom.xml

@ -0,0 +1,270 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>maven-parent</artifactId>
<groupId>org.gcube.tools</groupId>
<version>1.0.0</version>
<relativePath />
</parent>
<groupId>org.gcube.core</groupId>
<artifactId>common-smartgears</artifactId>
<version>2.1.0-SNAPSHOT</version>
<name>SmartGears</name>
<properties>
<distroDirectory>distro</distroDirectory>
<tomcat.version>7.0.42</tomcat.version>
<jersey.version>1.17.1</jersey.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<scm>
<connection>scm:svn:http://svn.d4science.research-infrastructures.eu/gcube/trunk/Common/${project.artifactId}</connection>
<developerConnection>scm:svn:https://svn.d4science.research-infrastructures.eu/gcube/trunk/Common/${project.artifactId}</developerConnection>
<url>http://svn.d4science.research-infrastructures.eu/gcube/trunk/Common/${project.artifactId}</url>
</scm>
<dependencies>
<dependency>
<groupId>org.gcube.common</groupId>
<artifactId>authorization-client</artifactId>
<version>[2.0.0-SNAPSHOT,3.0.0-SNAPSHOT)</version>
</dependency>
<dependency>
<groupId>org.gcube.common</groupId>
<artifactId>common-authorization</artifactId>
<version>[2.0.0-SNAPSHOT,3.0.0-SNAPSHOT)</version>
</dependency>
<dependency>
<groupId>org.gcube.data.publishing</groupId>
<artifactId>document-store-lib</artifactId>
<version>[1.0.0-SNAPSHOT,2.0.0-SNAPSHOT)</version>
</dependency>
<dependency>
<groupId>org.gcube.accounting</groupId>
<artifactId>accounting-lib</artifactId>
<version>[2.0.0-SNAPSHOT,3.0.0-SNAPSHOT)</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.gcube.resources</groupId>
<artifactId>registry-publisher</artifactId>
<version>[1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT)</version>
</dependency>
<dependency>
<groupId>org.gcube.resources</groupId>
<artifactId>common-gcore-resources</artifactId>
<version>[1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT)</version>
</dependency>
<dependency>
<groupId>org.gcube.core</groupId>
<artifactId>common-validator</artifactId>
<version>[1.0.0-SNAPSHOT,2.0.0-SNAPSHOT)</version>
</dependency>
<dependency>
<groupId>org.gcube.core</groupId>
<artifactId>common-scope</artifactId>
<version>[1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT)</version>
</dependency>
<dependency>
<groupId>org.gcube.core</groupId>
<artifactId>common-events</artifactId>
<version>[1.0.0-SNAPSHOT,2.0.0-SNAPSHOT)</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<!-- ***************** test ******************* -->
<dependency>
<groupId>org.jboss.shrinkwrap.resolver</groupId>
<artifactId>shrinkwrap-resolver-depchain</artifactId>
<version>2.0.0-beta-2</version>
<type>pom</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>${jersey.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>${tomcat.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-logging-log4j</artifactId>
<version>${tomcat.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>${tomcat.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.13</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.9.0</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2</version>
<configuration>
<descriptors>
<descriptor>${distroDirectory}/descriptor.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>servicearchive</id>
<phase>install</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- excludes probe package from jar -->
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.2</version>
<executions>
<execution>
<id>default-jar</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<excludes>
<exclude>**/probe/**/*</exclude>
</excludes>
</configuration>
</execution>
</executions>
</plugin>
<!-- include probe in attached war -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<primaryArtifact>false</primaryArtifact>
<classifier>probe</classifier>
<packagingIncludes>WEB-INF/classes/org/gcube/smartgears/probe/**/*</packagingIncludes>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
<executions>
<execution>
<id>probe-war</id>
<phase>package</phase>
<goals>
<goal>war</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.15</version>
<configuration>
<!-- tomcat annotation discovery won't work with the default manifest-only
jar -->
<useManifestOnlyJar>false</useManifestOnlyJar>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<!-- interpolates and copies configuration.properties -->
<execution>
<id>copy-configuration</id>
<goals>
<goal>copy-resources</goal>
</goals>
<phase>validate</phase>
<configuration>
<outputDirectory>src/main/resources/META-INF</outputDirectory>
<overwrite>true</overwrite>
<encoding>UTF-8</encoding>
<resources>
<resource>
<directory>${distroDirectory}</directory>
<includes>
<include>smartgears-config.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

149
src/main/java/org/gcube/smartgears/Bootstrap.java

@ -0,0 +1,149 @@
package org.gcube.smartgears;
import java.util.Set;
import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import org.gcube.smartgears.context.application.ApplicationContext;
import org.gcube.smartgears.context.container.ContainerContext;
import org.gcube.smartgears.managers.ApplicationManager;
import org.gcube.smartgears.managers.ContainerManager;
import org.gcube.smartgears.provider.ProviderFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Bootstraps management of all deployed applications which require it.
*
* @author Fabio Simeoni
*
*/
public class Bootstrap implements ServletContainerInitializer {
private static Logger log = LoggerFactory.getLogger(Bootstrap.class);
private static boolean smartgearsHasStarted = false;
private static boolean containerHasFailed = false;
private static ContainerManager manager;
private static ContainerContext context;
public Bootstrap() {
if (smartgearsHasStarted)
return;
smartgearsHasStarted = true;
initialiseContainer();
//this can fail the app: managed resources need a working container
startContainerIfItHasntAlreadyFailed();
}
@Override
public void onStartup(Set<Class<?>> c, ServletContext application) throws ServletException {
ApplicationManager appManager = new ApplicationManager();
//act only on resources
if (isResource(application)) {
try {
log.info("starting management of application @ {}", application.getContextPath());
ApplicationContext app = appManager.start(context, application);
manager.manage(app);
context.configuration().app(app.configuration());
} catch (Throwable t) {
appManager.stop();
throw new ServletException("cannot manage application @ " + application.getContextPath()
+ " (see cause)", t);
}
}
}
// helpers
private void initialiseContainer() {
try {
log.trace("smartgears is starting");
/* Get the ContainerContext. Look at DefaultProvider */
context = ProviderFactory.provider().containerContext();
/* Validate the configuration retrieved by ContainerContext
* using gcube facilities annotation based
* ( i.e org.gcube.common.validator.annotations)
*/
context.configuration().validate();
} catch (RuntimeException e) {
containerHasFailed = true;
log.error("cannot start smartgears", e);
//we let the container continue
}
}
private void startContainerIfItHasntAlreadyFailed() {
if (containerHasFailed)
throw new IllegalStateException("container is not managed due to previous failure");
ClassLoader contextCL = Thread.currentThread().getContextClassLoader();
// we initialise the container in the same classloader as this
// lib, lest container bind its resources to the current webapp
try {
// TODO Ask why is needed?
Thread.currentThread().setContextClassLoader(ContainerManager.class.getClassLoader());
manager = ContainerManager.instance;
context = manager.start(context);
} catch (RuntimeException e) {
containerHasFailed = true;
throw new IllegalStateException("cannot manage container", e);
}
finally {//restore the classloader of the current application
Thread.currentThread().setContextClassLoader(contextCL);
}
}
private boolean isResource(ServletContext application) {
//with care: smartgears may have already failed at this stage but we want to recognise
//apps that would have been managed otherwise and give specific errors for those
return (!containerHasFailed && context.configuration().app(application.getContextPath())!=null)
||
application.getResourceAsStream(Constants.configuration_file_path) != null;
}
}

222
src/main/java/org/gcube/smartgears/Constants.java

@ -0,0 +1,222 @@
package org.gcube.smartgears;
import org.gcube.smartgears.extensions.resource.RemoteResource;
import org.gcube.smartgears.handlers.application.lifecycle.ProfileManager;
import org.gcube.smartgears.handlers.application.request.RequestValidator;
import org.gcube.smartgears.handlers.container.lifecycle.AccountingManager;
/**
* Library-wide constants.
*
*
* @author Fabio Simeoni
*
*/
public class Constants {
/**
* The environment variable that points to the container configuration directory.
*/
public static final String ghn_home_env = "GHN_HOME";
/**
* The system property that points to the container configuration directory.
*/
public static final String ghn_home_property = "ghn.home";
/**
* The container configuration file path, relative to the container configuration directory.
*/
public static final String container_configuraton_file_path = "container.xml";
/**
* The path of the application profile file, relative to the container configuration directory.
*/
public static final String container_profile_file_path = "ghn.xml";
public static final String container_profile_file_path_copy = "ghn.xml.copy";
/**
* The container lifecycle configuration resource path.
*/
public static final String container_handlers_file_path = "/META-INF/container-handlers.xml";
/**
* The library configuration resource path.
*/
public static final String library_configuration_file_path = "/META-INF/smartgears-config.xml";
/**
* The name of the context property that contains the node profile.
*/
public static final String container_profile_property = "ghn-profile";
/**
* The default value of for the container publication frequency.
*/
public static final long default_container_publication_frequency_in_seconds = 60;
/**
* The application configuration resource path.
*/
public static final String configuration_file_path = "/WEB-INF/gcube-app.xml";
/**
* The application lifecycle configuration resource path.
*/
public static final String handlers_file_path = "/WEB-INF/gcube-handlers.xml";
/**
* The default application lifecycle configuration resource path.
*/
public static final String default_handlers_file_path = "/META-INF/default-handlers.xml";
/**
* The wildcard exclude directive.
*/
public static final String EXCLUDE_ALL = "*";
/**
* The mapping root of all extensions.
*/
public static final String root_mapping = "/gcube/resource";
/**
* The application extensions configuration resource path.
*/
public static final String extensions_file_path = "/WEB-INF/gcube-extensions.xml";
/**
* The default application extensions configuration resource path.
*/
public static final String default_extensions_file_path = "/META-INF/default-extensions.xml";
/**
* The application frontpage resource path.
*/
public static final String frontpage_file_path = "/META-INF/frontpage.html";
/**
* The configuration name of {@link ProfileManager}s.
*/
public static final String profile_management = "profile-management";
/**
* The configuration name of {@link RequestValidator}s.
*/
public static final String request_validation = "request-validation";
/**
* The configuration name of {@link AccountingManager}s.
*/
public static final String accounting_management = "accounting-management";
/**
* The configuration name of {@link RequestAccounting}s.
*/
public static final String request_accounting = "request-accounting";
/**
* The configuration name of {@link RemoteResource}s.
*/
public static final String remote_management = "remote-management";
/**
* The path of the application profile file, relative to the service configuration directory.
*/
public static final String profile_file_path = "endpoint.xml";
/**
* The name of the context property that contains the endpoint profile.
*/
public static final String profile_property = "endpoint-profile";
/**
* The name of the attribute in the servlet context that contains the context of an application.
*/
public static final String context_attribute ="gcube-application-context";
/**
* The name of the HTTP header that contains the scope of requests
*/
public static final String scope_header="gcube-scope";
/**
* The name of the HTTP header that contains the authorization token of requests
*/
public static final String token_header="gcube-token";
/**
* The event for token registration for app.
*/
public static final String token_registered = "token-registered";
/**
* The event for token removal for app.
*/
public static final String token_removed = "token-removed";
/**
* The name of the HTTP header for standard HTTP basic authorization
*/
public static final String authorization_header ="Authorization";
/**
* The name of the HTTP header that contains the called method of the current request
*/
public static final String called_method_header="gcube-method";
/**
* The name of the Content-Type HTTP header
*/
public static final String content_type="Content-Type";
/**
* The name of the Accept HTTP header
*/
public static final String accept="Accept";
/**
* The name of the Allow HTTP header
*/
public static final String allow="Allow";
/**
* The name of the XML media type.
*/
public static final String plain_text="text/plain";
/**
* The name of the XML media type.
*/
public static final String application_xml="application/xml";
/**
* The name of the XHTML media type.
*/
public static final String application_xhtml="application/xhtml+xml";
/**
* The name of the Json media type.
*/
public static final String application_json="application/json";
public static final int application_republish_frequency_in_minutes = 20;
}

12
src/main/java/org/gcube/smartgears/configuration/Mode.java

@ -0,0 +1,12 @@
package org.gcube.smartgears.configuration;
/**
* The management mode the container or its applications.
*
* @author Fabio Simeoni
*
*/
public enum Mode {
online,
offline
}

169
src/main/java/org/gcube/smartgears/configuration/application/ApplicationConfiguration.java

@ -0,0 +1,169 @@
package org.gcube.smartgears.configuration.application;
import java.util.Set;
import org.gcube.smartgears.configuration.Mode;
import org.gcube.smartgears.persistence.Persistence;
/**
* The configuration of the application.
*
* @author Fabio Simeoni
*
*/
public interface ApplicationConfiguration {
/**
* Returns the management mode of the application.
* @return the management mode
*/
Mode mode();
/**
* Returns true if the application is secure (accessible only in https).
* @return secure or not
*/
boolean secure();
/**
* Returns true if the application is behind a proxy.
* @return secure or not
*/
ApplicationConfiguration proxied(boolean proxied);
/**
* Returns the context path of the application
* @return the context path
*/
String context();
boolean proxied();
/**
* Sets the context path of the application
* @param context the context path
* @return this configuration
*/
ApplicationConfiguration context(String context);
/**
* Sets the management mode of this application.
* @param the management mode
* @return this configuration
*/
ApplicationConfiguration mode(Mode mode);
ApplicationConfiguration secure(boolean value);
/**
* Returns the name of the application.
* @return the name
*/
String name();
/**
* Sets the name of the application.
* @param name the name
* @return this configuration
*/
ApplicationConfiguration name(String name);
/**
* Returns the class of the application
* @return the class
*/
String serviceClass();
/**
* Sets the class of the application.
* @param serviceClass the class
* @return this configuration
*/
ApplicationConfiguration serviceClass(String serviceClass);
/**
* Returns the version of the application.
* @return the version
*/
String version();
/**
* Sets the version of the application.
* @param version the version
* @return this configuration
*/
ApplicationConfiguration version(String version);
/**
* Returns the description of the application.
* @return the description
*/
String description();
/**
* Sets the description of the application.
* @param description the description
* @return this configuration
*/
ApplicationConfiguration description(String description);
/**
* Returns the tokens in which the application operates when it first starts.
* @return the tokens
*/
Set<String> startTokens();
/**
* Sets the tokens in which the application operates when it first starts.
* @param scopes the scopes
* @return this configuration
*/
ApplicationConfiguration startTokens(Set<String> tokens);
/**
* Returns the persistence manager of the application.
* @return the manager
*/
Persistence persistence();
/**
* Returns a set of request paths that should not be subjected to request management.
* @return the set of exclude paths.
*/
Set<Exclude> excludes();
/**
* Sets the persistence manager of the application.
* @param manager the manager
* @return this configuration
*/
ApplicationConfiguration persistence(Persistence manager);
/**
* Validates this configuration.
*
* @throws IllegalStateException if the configuration is not valid
*/
void validate();
/**
* Merges this configuration with another configuration
* @param config the other configuration
*/
void merge(ApplicationConfiguration config);
ApplicationConfiguration excludes(Exclude ... excludes);
}

149
src/main/java/org/gcube/smartgears/configuration/application/ApplicationConfigurationBinder.java

@ -0,0 +1,149 @@
package org.gcube.smartgears.configuration.application;
import static org.gcube.smartgears.utils.Utils.*;
import java.io.InputStream;
import java.lang.reflect.Modifier;
import java.util.HashSet;
import java.util.ServiceLoader;
import java.util.Set;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import org.gcube.smartgears.extensions.ApplicationExtension;
import org.gcube.smartgears.handlers.application.ApplicationHandler;
/**
* Binds {@link ApplicationConfiguration}s to and from XML serialisations.