Task #16415 Migrate gcube-url-shortener to Firebase Dynamic Links APIs
Released for gCube 4.15 Updated pom version at 1.5.0 git-svn-id: http://svn.d4science-ii.research-infrastructures.eu/gcube/branches/portlets/user/gcube-url-shortener/1.5@181186 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
commit
b65971b540
|
@ -0,0 +1,34 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="src" output="target/gcube-url-shortener-1.0.0-SNAPSHOT/WEB-INF/classes" path="src/main/java">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="optional" value="true"/>
|
||||||
|
<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 kind="src" path="src/test/resources"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
|
<attribute name="org.eclipse.jst.component.nondependency" value=""/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry excluding="**" kind="src" output="target/gcube-url-shortener-1.0.0-SNAPSHOT/WEB-INF/classes" path="src/main/resources">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="maven.pomderived" 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="owner.project.facets" value="java"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
|
||||||
|
<classpathentry kind="output" path="target/gcube-url-shortener-1.0.0-SNAPSHOT/WEB-INF/classes"/>
|
||||||
|
</classpath>
|
|
@ -0,0 +1,36 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>gcube-url-shortener</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.wst.common.project.facet.core.builder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.wst.validation.validationbuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.m2e.core.maven2Builder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
|
||||||
|
<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
<nature>org.eclipse.m2e.core.maven2Nature</nature>
|
||||||
|
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
|
@ -0,0 +1,5 @@
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
encoding//src/main/java=UTF-8
|
||||||
|
encoding//src/main/resources=UTF-8
|
||||||
|
encoding//src/test/java=UTF-8
|
||||||
|
encoding/<project>=UTF-8
|
|
@ -0,0 +1,8 @@
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
|
||||||
|
org.eclipse.jdt.core.compiler.compliance=1.7
|
||||||
|
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.7
|
|
@ -0,0 +1,4 @@
|
||||||
|
activeProfiles=
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
resolveWorkspaceProjects=true
|
||||||
|
version=1
|
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
|
||||||
|
<wb-module deploy-name="gcube-url-shortener">
|
||||||
|
<wb-resource deploy-path="/" source-path="/src/main/java"/>
|
||||||
|
<wb-resource deploy-path="/" source-path="/src/main/resources"/>
|
||||||
|
</wb-module>
|
||||||
|
</project-modules>
|
|
@ -0,0 +1,5 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<faceted-project>
|
||||||
|
<installed facet="jst.utility" version="1.0"/>
|
||||||
|
<installed facet="java" version="1.7"/>
|
||||||
|
</faceted-project>
|
|
@ -0,0 +1,2 @@
|
||||||
|
disabled=06target
|
||||||
|
eclipse.preferences.version=1
|
|
@ -0,0 +1,313 @@
|
||||||
|
European Union Public Licence V. 1.1
|
||||||
|
|
||||||
|
|
||||||
|
EUPL © the European Community 2007
|
||||||
|
|
||||||
|
|
||||||
|
This European Union Public Licence (the “EUPL”) applies to the Work or Software
|
||||||
|
(as defined below) which is provided under the terms of this Licence. Any use of
|
||||||
|
the Work, other than as authorised under this Licence is prohibited (to the
|
||||||
|
extent such use is covered by a right of the copyright holder of the Work).
|
||||||
|
|
||||||
|
The Original Work is provided under the terms of this Licence when the Licensor
|
||||||
|
(as defined below) has placed the following notice immediately following the
|
||||||
|
copyright notice for the Original Work:
|
||||||
|
|
||||||
|
Licensed under the EUPL V.1.1
|
||||||
|
|
||||||
|
or has expressed by any other mean his willingness to license under the EUPL.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1. Definitions
|
||||||
|
|
||||||
|
In this Licence, the following terms have the following meaning:
|
||||||
|
|
||||||
|
- The Licence: this Licence.
|
||||||
|
|
||||||
|
- The Original Work or the Software: the software distributed and/or
|
||||||
|
communicated by the Licensor under this Licence, available as Source Code and
|
||||||
|
also as Executable Code as the case may be.
|
||||||
|
|
||||||
|
- Derivative Works: the works or software that could be created by the Licensee,
|
||||||
|
based upon the Original Work or modifications thereof. This Licence does not
|
||||||
|
define the extent of modification or dependence on the Original Work required
|
||||||
|
in order to classify a work as a Derivative Work; this extent is determined by
|
||||||
|
copyright law applicable in the country mentioned in Article 15.
|
||||||
|
|
||||||
|
- The Work: the Original Work and/or its Derivative Works.
|
||||||
|
|
||||||
|
- The Source Code: the human-readable form of the Work which is the most
|
||||||
|
convenient for people to study and modify.
|
||||||
|
|
||||||
|
- The Executable Code: any code which has generally been compiled and which is
|
||||||
|
meant to be interpreted by a computer as a program.
|
||||||
|
|
||||||
|
- The Licensor: the natural or legal person that distributes and/or communicates
|
||||||
|
the Work under the Licence.
|
||||||
|
|
||||||
|
- Contributor(s): any natural or legal person who modifies the Work under the
|
||||||
|
Licence, or otherwise contributes to the creation of a Derivative Work.
|
||||||
|
|
||||||
|
- The Licensee or “You”: any natural or legal person who makes any usage of the
|
||||||
|
Software under the terms of the Licence.
|
||||||
|
|
||||||
|
- Distribution and/or Communication: any act of selling, giving, lending,
|
||||||
|
renting, distributing, communicating, transmitting, or otherwise making
|
||||||
|
available, on-line or off-line, copies of the Work or providing access to its
|
||||||
|
essential functionalities at the disposal of any other natural or legal
|
||||||
|
person.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2. Scope of the rights granted by the Licence
|
||||||
|
|
||||||
|
The Licensor hereby grants You a world-wide, royalty-free, non-exclusive,
|
||||||
|
sub-licensable licence to do the following, for the duration of copyright vested
|
||||||
|
in the Original Work:
|
||||||
|
|
||||||
|
- use the Work in any circumstance and for all usage, reproduce the Work, modify
|
||||||
|
- the Original Work, and make Derivative Works based upon the Work, communicate
|
||||||
|
- to the public, including the right to make available or display the Work or
|
||||||
|
- copies thereof to the public and perform publicly, as the case may be, the
|
||||||
|
- Work, distribute the Work or copies thereof, lend and rent the Work or copies
|
||||||
|
- thereof, sub-license rights in the Work or copies thereof.
|
||||||
|
|
||||||
|
Those rights can be exercised on any media, supports and formats, whether now
|
||||||
|
known or later invented, as far as the applicable law permits so.
|
||||||
|
|
||||||
|
In the countries where moral rights apply, the Licensor waives his right to
|
||||||
|
exercise his moral right to the extent allowed by law in order to make effective
|
||||||
|
the licence of the economic rights here above listed.
|
||||||
|
|
||||||
|
The Licensor grants to the Licensee royalty-free, non exclusive usage rights to
|
||||||
|
any patents held by the Licensor, to the extent necessary to make use of the
|
||||||
|
rights granted on the Work under this Licence.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
3. Communication of the Source Code
|
||||||
|
|
||||||
|
The Licensor may provide the Work either in its Source Code form, or as
|
||||||
|
Executable Code. If the Work is provided as Executable Code, the Licensor
|
||||||
|
provides in addition a machine-readable copy of the Source Code of the Work
|
||||||
|
along with each copy of the Work that the Licensor distributes or indicates, in
|
||||||
|
a notice following the copyright notice attached to the Work, a repository where
|
||||||
|
the Source Code is easily and freely accessible for as long as the Licensor
|
||||||
|
continues to distribute and/or communicate the Work.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
4. Limitations on copyright
|
||||||
|
|
||||||
|
Nothing in this Licence is intended to deprive the Licensee of the benefits from
|
||||||
|
any exception or limitation to the exclusive rights of the rights owners in the
|
||||||
|
Original Work or Software, of the exhaustion of those rights or of other
|
||||||
|
applicable limitations thereto.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
5. Obligations of the Licensee
|
||||||
|
|
||||||
|
The grant of the rights mentioned above is subject to some restrictions and
|
||||||
|
obligations imposed on the Licensee. Those obligations are the following:
|
||||||
|
|
||||||
|
Attribution right: the Licensee shall keep intact all copyright, patent or
|
||||||
|
trademarks notices and all notices that refer to the Licence and to the
|
||||||
|
disclaimer of warranties. The Licensee must include a copy of such notices and a
|
||||||
|
copy of the Licence with every copy of the Work he/she distributes and/or
|
||||||
|
communicates. The Licensee must cause any Derivative Work to carry prominent
|
||||||
|
notices stating that the Work has been modified and the date of modification.
|
||||||
|
|
||||||
|
Copyleft clause: If the Licensee distributes and/or communicates copies of the
|
||||||
|
Original Works or Derivative Works based upon the Original Work, this
|
||||||
|
Distribution and/or Communication will be done under the terms of this Licence
|
||||||
|
or of a later version of this Licence unless the Original Work is expressly
|
||||||
|
distributed only under this version of the Licence. The Licensee (becoming
|
||||||
|
Licensor) cannot offer or impose any additional terms or conditions on the Work
|
||||||
|
or Derivative Work that alter or restrict the terms of the Licence.
|
||||||
|
|
||||||
|
Compatibility clause: If the Licensee Distributes and/or Communicates Derivative
|
||||||
|
Works or copies thereof based upon both the Original Work and another work
|
||||||
|
licensed under a Compatible Licence, this Distribution and/or Communication can
|
||||||
|
be done under the terms of this Compatible Licence. For the sake of this clause,
|
||||||
|
“Compatible Licence” refers to the licences listed in the appendix attached to
|
||||||
|
this Licence. Should the Licensee’s obligations under the Compatible Licence
|
||||||
|
conflict with his/her obligations under this Licence, the obligations of the
|
||||||
|
Compatible Licence shall prevail.
|
||||||
|
|
||||||
|
Provision of Source Code: When distributing and/or communicating copies of the
|
||||||
|
Work, the Licensee will provide a machine-readable copy of the Source Code or
|
||||||
|
indicate a repository where this Source will be easily and freely available for
|
||||||
|
as long as the Licensee continues to distribute and/or communicate the Work.
|
||||||
|
|
||||||
|
Legal Protection: This Licence does not grant permission to use the trade names,
|
||||||
|
trademarks, service marks, or names of the Licensor, except as required for
|
||||||
|
reasonable and customary use in describing the origin of the Work and
|
||||||
|
reproducing the content of the copyright notice.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
6. Chain of Authorship
|
||||||
|
|
||||||
|
The original Licensor warrants that the copyright in the Original Work granted
|
||||||
|
hereunder is owned by him/her or licensed to him/her and that he/she has the
|
||||||
|
power and authority to grant the Licence.
|
||||||
|
|
||||||
|
Each Contributor warrants that the copyright in the modifications he/she brings
|
||||||
|
to the Work are owned by him/her or licensed to him/her and that he/she has the
|
||||||
|
power and authority to grant the Licence.
|
||||||
|
|
||||||
|
Each time You accept the Licence, the original Licensor and subsequent
|
||||||
|
Contributors grant You a licence to their contributions to the Work, under the
|
||||||
|
terms of this Licence.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty
|
||||||
|
|
||||||
|
The Work is a work in progress, which is continuously improved by numerous
|
||||||
|
contributors. It is not a finished work and may therefore contain defects or
|
||||||
|
“bugs” inherent to this type of software development.
|
||||||
|
|
||||||
|
For the above reason, the Work is provided under the Licence on an “as is” basis
|
||||||
|
and without warranties of any kind concerning the Work, including without
|
||||||
|
limitation merchantability, fitness for a particular purpose, absence of defects
|
||||||
|
or errors, accuracy, non-infringement of intellectual property rights other than
|
||||||
|
copyright as stated in Article 6 of this Licence.
|
||||||
|
|
||||||
|
This disclaimer of warranty is an essential part of the Licence and a condition
|
||||||
|
for the grant of any rights to the Work.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
8. Disclaimer of Liability
|
||||||
|
|
||||||
|
Except in the cases of wilful misconduct or damages directly caused to natural
|
||||||
|
persons, the Licensor will in no event be liable for any direct or indirect,
|
||||||
|
material or moral, damages of any kind, arising out of the Licence or of the use
|
||||||
|
of the Work, including without limitation, damages for loss of goodwill, work
|
||||||
|
stoppage, computer failure or malfunction, loss of data or any commercial
|
||||||
|
damage, even if the Licensor has been advised of the possibility of such
|
||||||
|
damage. However, the Licensor will be liable under statutory product liability
|
||||||
|
laws as far such laws apply to the Work.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
9. Additional agreements
|
||||||
|
|
||||||
|
While distributing the Original Work or Derivative Works, You may choose to
|
||||||
|
conclude an additional agreement to offer, and charge a fee for, acceptance of
|
||||||
|
support, warranty, indemnity, or other liability obligations and/or services
|
||||||
|
consistent with this Licence. However, in accepting such obligations, You may
|
||||||
|
act only on your own behalf and on your sole responsibility, not on behalf of
|
||||||
|
the original Licensor or any other Contributor, and only if You agree to
|
||||||
|
indemnify, defend, and hold each Contributor harmless for any liability incurred
|
||||||
|
by, or claims asserted against such Contributor by the fact You have accepted
|
||||||
|
any such warranty or additional liability.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
10. Acceptance of the Licence
|
||||||
|
|
||||||
|
The provisions of this Licence can be accepted by clicking on an icon “I agree”
|
||||||
|
placed under the bottom of a window displaying the text of this Licence or by
|
||||||
|
affirming consent in any other similar way, in accordance with the rules of
|
||||||
|
applicable law. Clicking on that icon indicates your clear and irrevocable
|
||||||
|
acceptance of this Licence and all of its terms and conditions.
|
||||||
|
|
||||||
|
Similarly, you irrevocably accept this Licence and all of its terms and
|
||||||
|
conditions by exercising any rights granted to You by Article 2 of this Licence,
|
||||||
|
such as the use of the Work, the creation by You of a Derivative Work or the
|
||||||
|
Distribution and/or Communication by You of the Work or copies thereof.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
11. Information to the public
|
||||||
|
|
||||||
|
In case of any Distribution and/or Communication of the Work by means of
|
||||||
|
electronic communication by You (for example, by offering to download the Work
|
||||||
|
from a remote location) the distribution channel or media (for example, a
|
||||||
|
website) must at least provide to the public the information requested by the
|
||||||
|
applicable law regarding the Licensor, the Licence and the way it may be
|
||||||
|
accessible, concluded, stored and reproduced by the Licensee.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
12. Termination of the Licence
|
||||||
|
|
||||||
|
The Licence and the rights granted hereunder will terminate automatically upon
|
||||||
|
any breach by the Licensee of the terms of the Licence.
|
||||||
|
|
||||||
|
Such a termination will not terminate the licences of any person who has
|
||||||
|
received the Work from the Licensee under the Licence, provided such persons
|
||||||
|
remain in full compliance with the Licence.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
13. Miscellaneous
|
||||||
|
|
||||||
|
Without prejudice of Article 9 above, the Licence represents the complete
|
||||||
|
agreement between the Parties as to the Work licensed hereunder.
|
||||||
|
|
||||||
|
If any provision of the Licence is invalid or unenforceable under applicable
|
||||||
|
law, this will not affect the validity or enforceability of the Licence as a
|
||||||
|
whole. Such provision will be construed and/or reformed so as necessary to make
|
||||||
|
it valid and enforceable.
|
||||||
|
|
||||||
|
The European Commission may publish other linguistic versions and/or new
|
||||||
|
versions of this Licence, so far this is required and reasonable, without
|
||||||
|
reducing the scope of the rights granted by the Licence. New versions of the
|
||||||
|
Licence will be published with a unique version number.
|
||||||
|
|
||||||
|
All linguistic versions of this Licence, approved by the European Commission,
|
||||||
|
have identical value. Parties can take advantage of the linguistic version of
|
||||||
|
their choice.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
14. Jurisdiction
|
||||||
|
|
||||||
|
Any litigation resulting from the interpretation of this License, arising
|
||||||
|
between the European Commission, as a Licensor, and any Licensee, will be
|
||||||
|
subject to the jurisdiction of the Court of Justice of the European Communities,
|
||||||
|
as laid down in article 238 of the Treaty establishing the European Community.
|
||||||
|
|
||||||
|
Any litigation arising between Parties, other than the European Commission, and
|
||||||
|
resulting from the interpretation of this License, will be subject to the
|
||||||
|
exclusive jurisdiction of the competent court where the Licensor resides or
|
||||||
|
conducts its primary business.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
15. Applicable Law
|
||||||
|
|
||||||
|
This Licence shall be governed by the law of the European Union country where
|
||||||
|
the Licensor resides or has his registered office.
|
||||||
|
|
||||||
|
This licence shall be governed by the Belgian law if:
|
||||||
|
|
||||||
|
- a litigation arises between the European Commission, as a Licensor, and any
|
||||||
|
- Licensee; the Licensor, other than the European Commission, has no residence
|
||||||
|
- or registered office inside a European Union country.
|
||||||
|
|
||||||
|
|
||||||
|
===
|
||||||
|
|
||||||
|
|
||||||
|
Appendix
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
“Compatible Licences” according to article 5 EUPL are:
|
||||||
|
|
||||||
|
|
||||||
|
- GNU General Public License (GNU GPL) v. 2
|
||||||
|
|
||||||
|
- Open Software License (OSL) v. 2.1, v. 3.0
|
||||||
|
|
||||||
|
- Common Public License v. 1.0
|
||||||
|
|
||||||
|
- Eclipse Public License v. 1.0
|
||||||
|
|
||||||
|
- Cecill v. 2.0
|
|
@ -0,0 +1,74 @@
|
||||||
|
The gCube System - gcube-url-shortener
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
The Gcube Url Shortener uses the Firebase Dynamic Links Short Links API provided by Google (at https://firebase.google.com/docs/reference/dynamic-links/link-shortener).
|
||||||
|
It is a service that takes long URLs and squeezes them into fewer characters to make a link that is easier to share, tweet, or email to friends.
|
||||||
|
|
||||||
|
|
||||||
|
This software is part of the gCube Framework (https://www.gcube-system.org/): an
|
||||||
|
open-source software toolkit used for building and operating Hybrid Data
|
||||||
|
Infrastructures enabling the dynamic deployment of Virtual Research Environments
|
||||||
|
by favouring the realisation of reuse oriented policies.
|
||||||
|
|
||||||
|
The projects leading to this software have received funding from a series of
|
||||||
|
European Union programmes including:
|
||||||
|
* the Sixth Framework Programme for Research and Technological Development -
|
||||||
|
DILIGENT (grant no. 004260);
|
||||||
|
* the Seventh Framework Programme for research, technological development and
|
||||||
|
demonstration - D4Science (grant no. 212488), D4Science-II (grant no.
|
||||||
|
239019),ENVRI (grant no. 283465), EUBrazilOpenBio (grant no. 288754), iMarine
|
||||||
|
(grant no. 283644);
|
||||||
|
* the H2020 research and innovation programme - BlueBRIDGE (grant no. 675680),
|
||||||
|
EGIEngage (grant no. 654142), ENVRIplus (grant no. 654182), Parthenos (grant
|
||||||
|
no. 654119), SoBigData (grant no. 654024), AGINFRA PLUS (grant no. 731001).
|
||||||
|
|
||||||
|
|
||||||
|
Version
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
1.5.0-SNAPSHOT (2019-07-05)
|
||||||
|
|
||||||
|
Please see the file named "changelog.xml" in this directory for the release notes.
|
||||||
|
|
||||||
|
|
||||||
|
Authors
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
* Francesco Mangiacrapa (francesco.mangiacrapa-AT-isti.cnr.it), Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo" - CNR, Pisa (Italy).
|
||||||
|
|
||||||
|
Maintainers
|
||||||
|
-----------
|
||||||
|
|
||||||
|
* Francesco Mangiacrapa (francesco.mangiacrapa-AT-isti.cnr.it), Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo" - CNR, Pisa (Italy).
|
||||||
|
|
||||||
|
Download information
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
Source code is available from SVN:
|
||||||
|
https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/gcube-url-shortener
|
||||||
|
|
||||||
|
Binaries can be downloaded from the gCube website:
|
||||||
|
https://www.gcube-system.org/
|
||||||
|
|
||||||
|
|
||||||
|
Installation
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
Documentation
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
Documentation is available on-line in the gCube Wiki:
|
||||||
|
https://wiki.gcube-system.org/gcube/index.php
|
||||||
|
|
||||||
|
Support
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
Bugs and support requests can be reported in the gCube issue tracking tool:
|
||||||
|
https://support.d4science.org/projects/gcube/
|
||||||
|
|
||||||
|
|
||||||
|
Licensing
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
This software is licensed under the terms you may find in the file named "LICENSE" in this directory.
|
|
@ -0,0 +1,33 @@
|
||||||
|
<ReleaseNotes>
|
||||||
|
<Changeset component="org.gcube.portlets.user.gcube-url-shortener.1-5-0"
|
||||||
|
date="2019-07-05">
|
||||||
|
<Change>[Task #16415] Migrate to Firebase Dynamic Links APIs</Change>
|
||||||
|
</Changeset>
|
||||||
|
<Changeset component="org.gcube.portlets.user.gcube-url-shortener.1-2-0"
|
||||||
|
date="2017-06-14">
|
||||||
|
<Change>[Support #8940] src/it/simple-it/pom.xm</Change>
|
||||||
|
</Changeset>
|
||||||
|
<Changeset component="org.gcube.portlets.user.gcube-url-shortener.1-1-1"
|
||||||
|
date="2016-12-19">
|
||||||
|
<Change>removed lo4j dependency from pom</Change>
|
||||||
|
</Changeset>
|
||||||
|
<Changeset component="org.gcube.portlets.user.gcube-url-shortener.1-1-0"
|
||||||
|
date="2016-09-27">
|
||||||
|
<Change>removed jump of scope during read of Runtime
|
||||||
|
HTTP-URL-Shortener
|
||||||
|
</Change>
|
||||||
|
<Change>removed constructor with the parameter scope</Change>
|
||||||
|
</Changeset>
|
||||||
|
<Changeset component="org.gcube.portlets.user.gcube-url-shortener.1-0-2"
|
||||||
|
date="2016-06-30">
|
||||||
|
<Change>removed maven portal bom dependency</Change>
|
||||||
|
</Changeset>
|
||||||
|
<Changeset component="org.gcube.portlets.user.gcube-url-shortener.1-0-1"
|
||||||
|
date="2016-04-26">
|
||||||
|
<Change>maven-bom replaced by portal-bom</Change>
|
||||||
|
</Changeset>
|
||||||
|
<Changeset component="org.gcube.portlets.user.gcube-url-shortener.1-0-0"
|
||||||
|
date="2014-10-13">
|
||||||
|
<Change>First Release</Change>
|
||||||
|
</Changeset>
|
||||||
|
</ReleaseNotes>
|
|
@ -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>distro</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/gcube-url-shortener-1.5.0-SNAPSHOT.jar</source>
|
||||||
|
<outputDirectory>/gcube-url-shortener</outputDirectory>
|
||||||
|
</file>
|
||||||
|
|
||||||
|
</files>
|
||||||
|
</assembly>
|
|
@ -0,0 +1,26 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
|
<ID></ID>
|
||||||
|
<Type>Service</Type>
|
||||||
|
<Profile>
|
||||||
|
<Description>The Gcube Url Shortener uses the Firebase Dynamic Links Short Links API provided by Google (at https://firebase.google.com/docs/reference/dynamic-links/link-shortener).
|
||||||
|
It is a service that takes long URLs and squeezes them into fewer characters to make a link that is easier to share, tweet, or email to friends.</Description>
|
||||||
|
<Class>PortletUser</Class>
|
||||||
|
<Name>gcube-url-shortener</Name>
|
||||||
|
<Version>1.5.0-SNAPSHOT</Version>
|
||||||
|
<Packages>
|
||||||
|
<Software>
|
||||||
|
<Name>gcube-url-shortener</Name>
|
||||||
|
<Version>1.5.0-SNAPSHOT</Version>
|
||||||
|
<MavenCoordinates>
|
||||||
|
<groupId>org.gcube.portlets.user</groupId>
|
||||||
|
<artifactId>gcube-url-shortener</artifactId>
|
||||||
|
<version>1.5.0-SNAPSHOT</version>
|
||||||
|
</MavenCoordinates>
|
||||||
|
<Files>
|
||||||
|
<File>target/gcube-url-shortener-1.5.0-SNAPSHOT.war</File>
|
||||||
|
</Files>
|
||||||
|
</Software>
|
||||||
|
</Packages>
|
||||||
|
</Profile>
|
||||||
|
</Resource>
|
|
@ -0,0 +1,224 @@
|
||||||
|
<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">
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<artifactId>maven-parent</artifactId>
|
||||||
|
<groupId>org.gcube.tools</groupId>
|
||||||
|
<version>1.0.0</version>
|
||||||
|
<relativePath />
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>org.gcube.portlets.user</groupId>
|
||||||
|
<artifactId>gcube-url-shortener</artifactId>
|
||||||
|
<version>1.5.0-SNAPSHOT</version>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
<name>gcube-url-shortener </name>
|
||||||
|
<description>The Gcube Url Shortener uses the Firebase Dynamic Links Short Links API provided by Google (at https://firebase.google.com/docs/reference/dynamic-links/link-shortener).
|
||||||
|
It is a service that takes long URLs and squeezes them into fewer characters to make a link that is easier to share, tweet, or email to friends.</description>
|
||||||
|
<scm>
|
||||||
|
<url>https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/${project.artifactId}</url>
|
||||||
|
</scm>
|
||||||
|
|
||||||
|
<developers>
|
||||||
|
<developer>
|
||||||
|
<name>Francesco Mangiacrapa</name>
|
||||||
|
<email>francesco.mangiacrapa@isti.cnr.it</email>
|
||||||
|
<organization>CNR Pisa, Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo"</organization>
|
||||||
|
<roles>
|
||||||
|
<role>architect</role>
|
||||||
|
<role>developer</role>
|
||||||
|
</roles>
|
||||||
|
</developer>
|
||||||
|
</developers>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<distroDirectory>${project.basedir}/distro</distroDirectory>
|
||||||
|
<webappDirectory>${project.build.directory}/${project.build.finalName}</webappDirectory>
|
||||||
|
<release.date>${buildDate}</release.date>
|
||||||
|
<templatesDirectory>templates</templatesDirectory>
|
||||||
|
<distroDirectory>distro</distroDirectory>
|
||||||
|
<configDirectory>config</configDirectory>
|
||||||
|
<maven.compiler.source>1.8</maven.compiler.source>
|
||||||
|
<maven.compiler.target>1.8</maven.compiler.target>
|
||||||
|
|
||||||
|
<!-- Convenience property to set the GWT version -->
|
||||||
|
<gwtVersion>2.5.1</gwtVersion>
|
||||||
|
<!-- To make this work on gwt-run you need to set up global env vars. on
|
||||||
|
MacOSX edit this file /etc/launchd.conf and put "setenv GLOBUS_LOCATION /Users/massi/portal/Portal-Bundle/gCore"
|
||||||
|
on Linux? -->
|
||||||
|
<GLOBUS_LOCATION>${env.GLOBUS_LOCATION}</GLOBUS_LOCATION>
|
||||||
|
<!-- GWT needs at least java 1.5 -->
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencyManagement>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.gcube.distribution</groupId>
|
||||||
|
<artifactId>gcube-bom</artifactId>
|
||||||
|
<version>LATEST</version>
|
||||||
|
<type>pom</type>
|
||||||
|
<scope>import</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</dependencyManagement>
|
||||||
|
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
|
||||||
|
<!-- FWS -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.gcube.resources.discovery</groupId>
|
||||||
|
<artifactId>ic-client</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<!-- END FWS -->
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-httpclient</groupId>
|
||||||
|
<artifactId>commons-httpclient</artifactId>
|
||||||
|
<version>3.1</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.gcube.core</groupId>
|
||||||
|
<artifactId>common-encryption</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.validation</groupId>
|
||||||
|
<artifactId>validation-api</artifactId>
|
||||||
|
<version>1.0.0.GA</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.validation</groupId>
|
||||||
|
<artifactId>validation-api</artifactId>
|
||||||
|
<version>1.0.0.GA</version>
|
||||||
|
<classifier>sources</classifier>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>slf4j-log4j12</artifactId>
|
||||||
|
<version>1.6.4</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- JSON PARSER -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.json</groupId>
|
||||||
|
<artifactId>json</artifactId>
|
||||||
|
<version>20090211</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- JUNIT -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>4.8.1</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<!-- Generate compiled stuff in the folder used for developing mode -->
|
||||||
|
<outputDirectory>${webappDirectory}/WEB-INF/classes</outputDirectory>
|
||||||
|
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<source>${maven.compiler.source}</source>
|
||||||
|
<target>${maven.compiler.target}</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<version>2.16</version>
|
||||||
|
<configuration>
|
||||||
|
<skipTests>true</skipTests>
|
||||||
|
</configuration>
|
||||||
|
<!-- TODO check if needed -->
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.maven.surefire</groupId>
|
||||||
|
<artifactId>surefire-junit47</artifactId>
|
||||||
|
<version>2.16</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<!-- Maven -->
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-resources-plugin</artifactId>
|
||||||
|
<version>2.6</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>copy-distro-resources</id>
|
||||||
|
<phase>process-resources</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>copy-resources</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<outputDirectory>${distroDirectory}</outputDirectory>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<directory>${templatesDirectory}</directory>
|
||||||
|
<filtering>true</filtering>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-clean-plugin</artifactId>
|
||||||
|
<version>2.5</version>
|
||||||
|
<configuration>
|
||||||
|
<filesets>
|
||||||
|
<fileset>
|
||||||
|
<directory>${distroDirectory}</directory>
|
||||||
|
<includes>
|
||||||
|
<include>**</include>
|
||||||
|
</includes>
|
||||||
|
<followSymlinks>false</followSymlinks>
|
||||||
|
</fileset>
|
||||||
|
<fileset>
|
||||||
|
<directory>${configDirectory}</directory>
|
||||||
|
<includes>
|
||||||
|
<include>**</include>
|
||||||
|
</includes>
|
||||||
|
<followSymlinks>false</followSymlinks>
|
||||||
|
</fileset>
|
||||||
|
</filesets>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-assembly-plugin</artifactId>
|
||||||
|
<version>2.2</version>
|
||||||
|
<configuration>
|
||||||
|
<descriptors>
|
||||||
|
<descriptor>${templatesDirectory}/descriptor.xml</descriptor>
|
||||||
|
</descriptors>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>servicearchive</id>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>single</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,265 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package org.gcube.portlets.user.urlshortener;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.apache.commons.httpclient.Credentials;
|
||||||
|
import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
|
||||||
|
import org.apache.commons.httpclient.HttpClient;
|
||||||
|
import org.apache.commons.httpclient.HttpException;
|
||||||
|
import org.apache.commons.httpclient.HttpStatus;
|
||||||
|
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
|
||||||
|
import org.apache.commons.httpclient.UsernamePasswordCredentials;
|
||||||
|
import org.apache.commons.httpclient.auth.AuthScope;
|
||||||
|
import org.apache.commons.httpclient.methods.ByteArrayRequestEntity;
|
||||||
|
import org.apache.commons.httpclient.methods.GetMethod;
|
||||||
|
import org.apache.commons.httpclient.methods.PostMethod;
|
||||||
|
import org.apache.commons.httpclient.params.HttpMethodParams;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Class HttpCallerUtil.
|
||||||
|
*
|
||||||
|
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
|
||||||
|
* Jun 14, 2017
|
||||||
|
*/
|
||||||
|
public class HttpCallerUtil {
|
||||||
|
|
||||||
|
public static final Logger logger = LoggerFactory.getLogger(HttpCallerUtil.class);
|
||||||
|
|
||||||
|
public static final int TIME_OUT_REQUESTS = 5000;
|
||||||
|
|
||||||
|
|
||||||
|
private String urlService = "";
|
||||||
|
private HttpClient httpClient = null;
|
||||||
|
private String username = "";
|
||||||
|
private String password = "";
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instantiates a new http caller util.
|
||||||
|
*
|
||||||
|
* @param url the url
|
||||||
|
* @param user the user
|
||||||
|
* @param password the password
|
||||||
|
*/
|
||||||
|
public HttpCallerUtil(String url, String user, String password) {
|
||||||
|
this.urlService = url;
|
||||||
|
MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
|
||||||
|
connectionManager.getParams().setSoTimeout(TIME_OUT_REQUESTS);
|
||||||
|
this.httpClient = new HttpClient(connectionManager);
|
||||||
|
|
||||||
|
this.username = user;
|
||||||
|
this.password = password;
|
||||||
|
Credentials defaultcreds = new UsernamePasswordCredentials(user, password);
|
||||||
|
httpClient.getState().setCredentials(AuthScope.ANY, defaultcreds);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call get.
|
||||||
|
*
|
||||||
|
* @param urlMethod the url method
|
||||||
|
* @param parameters the parameters
|
||||||
|
* @return the string
|
||||||
|
* @throws Exception the exception
|
||||||
|
*/
|
||||||
|
public String callGet(String urlMethod, Map<String, String> parameters) throws Exception {
|
||||||
|
|
||||||
|
// Create an instance of HttpClient.
|
||||||
|
HttpClient client = new HttpClient();
|
||||||
|
|
||||||
|
String query = UrlEncoderUtil.encodeQuery(parameters);
|
||||||
|
|
||||||
|
String fullUrl = urlService+"/"+urlMethod+"?"+query;
|
||||||
|
|
||||||
|
logger.info("call get .... " + fullUrl);
|
||||||
|
|
||||||
|
// Create a method instance.
|
||||||
|
GetMethod method = new GetMethod(fullUrl);
|
||||||
|
|
||||||
|
// Provide custom retry handler is necessary
|
||||||
|
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false));
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Execute the method.
|
||||||
|
int statusCode = client.executeMethod(method);
|
||||||
|
|
||||||
|
if (statusCode != HttpStatus.SC_OK) {
|
||||||
|
logger.error("Method failed: " + method.getStatusLine());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read the response body.
|
||||||
|
byte[] responseBody = method.getResponseBody();
|
||||||
|
|
||||||
|
// Deal with the response.
|
||||||
|
// Use caution: ensure correct character encoding and is not binary
|
||||||
|
// data
|
||||||
|
return new String(responseBody);
|
||||||
|
|
||||||
|
} catch (HttpException e) {
|
||||||
|
logger.error("Fatal protocol violation: " + e.getMessage());
|
||||||
|
throw new Exception("Fatal protocol violation: " + e.getMessage());
|
||||||
|
} catch (IOException e) {
|
||||||
|
logger.error("Fatal transport error: " + e.getMessage());
|
||||||
|
throw new Exception("Fatal transport violation: " + e.getMessage());
|
||||||
|
} finally {
|
||||||
|
// Release the connection.
|
||||||
|
method.releaseConnection();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call post.
|
||||||
|
*
|
||||||
|
* @param urlMethod the url method
|
||||||
|
* @param body the body
|
||||||
|
* @param contentType the content type
|
||||||
|
* @return the string
|
||||||
|
* @throws Exception the exception
|
||||||
|
*/
|
||||||
|
public String callPost(String urlMethod, String body, String contentType) throws Exception {
|
||||||
|
|
||||||
|
// Create a method instance.
|
||||||
|
PostMethod method = new PostMethod(this.urlService + "/" + urlMethod);
|
||||||
|
|
||||||
|
method.setRequestHeader("Content-type", contentType);
|
||||||
|
|
||||||
|
logger.trace("call post .... " + this.urlService + "/" + urlMethod);
|
||||||
|
logger.debug(" call post body.... " + body);
|
||||||
|
// System.out.println("post body .... " + body);
|
||||||
|
|
||||||
|
method.setRequestEntity(new ByteArrayRequestEntity(body.getBytes()));
|
||||||
|
|
||||||
|
// Provide custom retry handler is necessary
|
||||||
|
// method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,new DefaultHttpMethodRetryHandler(3, false));
|
||||||
|
|
||||||
|
byte[] responseBody = null;
|
||||||
|
try {
|
||||||
|
// Execute the method.
|
||||||
|
int statusCode = httpClient.executeMethod(method);
|
||||||
|
|
||||||
|
if (statusCode != HttpStatus.SC_OK && statusCode != HttpStatus.SC_CREATED) {
|
||||||
|
logger.error("Method failed: " + method.getStatusLine()+"; Response bpdy: "+method.getResponseBody());
|
||||||
|
method.releaseConnection();
|
||||||
|
throw new Exception("Method failed: " + method.getStatusLine()+"; Response body: "+new String(method.getResponseBody()));
|
||||||
|
}
|
||||||
|
// Read the response body.
|
||||||
|
responseBody = method.getResponseBody();
|
||||||
|
|
||||||
|
// Deal with the response.
|
||||||
|
// Use caution: ensure correct character encoding and is not binary data
|
||||||
|
// System.out.println(new String(responseBody));
|
||||||
|
} catch (HttpException e) {
|
||||||
|
logger.error("Fatal protocol violation: ", e);
|
||||||
|
// e.printStackTrace();
|
||||||
|
method.releaseConnection();
|
||||||
|
throw new Exception("Fatal protocol violation: " + e.getMessage());
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error("Fatal transport error: ", e);
|
||||||
|
// e.printStackTrace();
|
||||||
|
method.releaseConnection();
|
||||||
|
throw new Exception("Fatal transport error: " + e.getMessage());
|
||||||
|
}
|
||||||
|
method.releaseConnection();
|
||||||
|
return new String(responseBody);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the urlservice.
|
||||||
|
*
|
||||||
|
* @return the urlservice
|
||||||
|
*/
|
||||||
|
public String getUrlservice() {
|
||||||
|
return urlService;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the urlservice.
|
||||||
|
*
|
||||||
|
* @param urlservice the new urlservice
|
||||||
|
*/
|
||||||
|
public void setUrlservice(String urlservice) {
|
||||||
|
this.urlService = urlservice;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the client.
|
||||||
|
*
|
||||||
|
* @return the client
|
||||||
|
*/
|
||||||
|
public HttpClient getClient() {
|
||||||
|
return httpClient;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the client.
|
||||||
|
*
|
||||||
|
* @param client the new client
|
||||||
|
*/
|
||||||
|
public void setClient(HttpClient client) {
|
||||||
|
this.httpClient = client;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the username.
|
||||||
|
*
|
||||||
|
* @return the username
|
||||||
|
*/
|
||||||
|
public String getUsername() {
|
||||||
|
return username;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the username.
|
||||||
|
*
|
||||||
|
* @param username the new username
|
||||||
|
*/
|
||||||
|
public void setUsername(String username) {
|
||||||
|
this.username = username;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the password.
|
||||||
|
*
|
||||||
|
* @return the password
|
||||||
|
*/
|
||||||
|
public String getPassword() {
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the password.
|
||||||
|
*
|
||||||
|
* @param password the new password
|
||||||
|
*/
|
||||||
|
public void setPassword(String password) {
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see java.lang.Object#toString()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
builder.append("HttpCallerUtil [urlService=");
|
||||||
|
builder.append(urlService);
|
||||||
|
builder.append(", httpClient=");
|
||||||
|
builder.append(httpClient);
|
||||||
|
builder.append(", username=");
|
||||||
|
builder.append(username);
|
||||||
|
builder.append(", password=");
|
||||||
|
builder.append(password);
|
||||||
|
builder.append("]");
|
||||||
|
return builder.toString();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package org.gcube.portlets.user.urlshortener;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Class ScopeUtil.
|
||||||
|
*
|
||||||
|
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
|
||||||
|
* Jun 14, 2017
|
||||||
|
*/
|
||||||
|
public class ScopeUtil {
|
||||||
|
|
||||||
|
private static final String SCOPE_SEPARATOR = "/";
|
||||||
|
public static final Logger logger = LoggerFactory.getLogger(ScopeUtil.class);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the infrastructure name from scope.
|
||||||
|
*
|
||||||
|
* @param scope the scope
|
||||||
|
* @return the infrastructure name from scope
|
||||||
|
* @throws Exception the exception
|
||||||
|
*/
|
||||||
|
public static String getInfrastructureNameFromScope(String scope) throws Exception{
|
||||||
|
|
||||||
|
if(scope==null || scope.isEmpty()){
|
||||||
|
throw new Exception("Scope is null or empty");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!scope.startsWith(SCOPE_SEPARATOR)){
|
||||||
|
logger.warn("Input scope: "+scope+" not have / is a really scope?");
|
||||||
|
scope = SCOPE_SEPARATOR+scope;
|
||||||
|
logger.warn("Tentative as scope: "+scope);
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] splitScope = scope.split(SCOPE_SEPARATOR);
|
||||||
|
|
||||||
|
String rootScope = SCOPE_SEPARATOR + splitScope[1];
|
||||||
|
|
||||||
|
if(rootScope.length()<2){
|
||||||
|
throw new Exception("Infrastructure name not found in "+scope);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rootScope;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,105 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package org.gcube.portlets.user.urlshortener;
|
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Class UrlEncoderUtil.
|
||||||
|
*
|
||||||
|
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
|
||||||
|
* Jun 14, 2017
|
||||||
|
*/
|
||||||
|
public class UrlEncoderUtil {
|
||||||
|
|
||||||
|
public static String charset = "UTF-8";
|
||||||
|
|
||||||
|
protected static Logger logger = LoggerFactory.getLogger(UrlEncoderUtil.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encode query.
|
||||||
|
*
|
||||||
|
* @param parameters the parameters
|
||||||
|
* @return the string
|
||||||
|
*/
|
||||||
|
public static String encodeQuery(String... parameters){
|
||||||
|
|
||||||
|
String query = "";
|
||||||
|
for (String string : parameters) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
query+=URLEncoder.encode(string, charset)+"&";
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
|
||||||
|
logger.error("encodeQuery error: ", e);
|
||||||
|
return query;
|
||||||
|
} catch (Exception e) {
|
||||||
|
|
||||||
|
logger.error("encodeQuery error: ", e);
|
||||||
|
return query;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
return removeLastChar(query);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encode query.
|
||||||
|
*
|
||||||
|
* @param parameters the parameters
|
||||||
|
* @return the string
|
||||||
|
*/
|
||||||
|
public static String encodeQuery(Map<String, String> parameters){
|
||||||
|
|
||||||
|
String query = "";
|
||||||
|
|
||||||
|
if(parameters==null)
|
||||||
|
return query;
|
||||||
|
|
||||||
|
for (String key : parameters.keySet()) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
query+=String.format(key+"=%s", URLEncoder.encode(parameters.get(key), charset))+"&";
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
|
||||||
|
logger.error("encodeQuery error: ", e);
|
||||||
|
return query;
|
||||||
|
} catch (Exception e) {
|
||||||
|
|
||||||
|
logger.error("encodeQuery error: ", e);
|
||||||
|
return query;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return removeLastChar(query);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the last char.
|
||||||
|
*
|
||||||
|
* @param string the string
|
||||||
|
* @return the string
|
||||||
|
*/
|
||||||
|
public static String removeLastChar(String string){
|
||||||
|
|
||||||
|
if(string == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
if(string.length()>0)
|
||||||
|
return string.substring(0, string.length()-1);
|
||||||
|
|
||||||
|
return string;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,328 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package org.gcube.portlets.user.urlshortener;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
|
||||||
|
* @Jun 28, 2013
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
import static org.gcube.resources.discovery.icclient.ICFactory.clientFor;
|
||||||
|
import static org.gcube.resources.discovery.icclient.ICFactory.queryFor;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.OutputStreamWriter;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.gcube.common.encryption.encrypter.StringEncrypter;
|
||||||
|
import org.gcube.common.resources.gcore.ServiceEndpoint;
|
||||||
|
import org.gcube.common.resources.gcore.ServiceEndpoint.AccessPoint;
|
||||||
|
import org.gcube.common.resources.gcore.ServiceEndpoint.Property;
|
||||||
|
import org.gcube.common.scope.api.ScopeProvider;
|
||||||
|
import org.gcube.resources.discovery.client.api.DiscoveryClient;
|
||||||
|
import org.gcube.resources.discovery.client.queries.impl.XQuery;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.json.JSONTokener;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Class UrlShortener.
|
||||||
|
*
|
||||||
|
* @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it)
|
||||||
|
*
|
||||||
|
* May 31, 2019
|
||||||
|
*/
|
||||||
|
public final class UrlShortener {
|
||||||
|
|
||||||
|
|
||||||
|
protected static final String APPLICATION_JSON = "application/json";
|
||||||
|
protected static final String LONG_DYNAMIC_LINK = "longDynamicLink";
|
||||||
|
protected static final String SHORTENER = "HTTP-URL-Shortener-DL";
|
||||||
|
protected static final String KEY = "key";
|
||||||
|
protected static final String DYNAMIC_LINK = "dynamic-link";
|
||||||
|
protected static final String SUFFIX = "suffix";
|
||||||
|
private static String shortnerServiceUrl = null;
|
||||||
|
private static String decryptedKEY = null;
|
||||||
|
private static String suffixOption = null;
|
||||||
|
private static String dynamicLink = null;
|
||||||
|
|
||||||
|
protected static Logger logger = LoggerFactory.getLogger(UrlShortener.class);
|
||||||
|
private String uriRequest;
|
||||||
|
private boolean isAvailable = false;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instantiates a new url shortener.
|
||||||
|
* It uses the scope from {@link ScopeProvider#instance} to read the Runtime Resource {@link UrlShortener#SHORTENER}}
|
||||||
|
* @throws Exception the exception
|
||||||
|
*/
|
||||||
|
public UrlShortener() throws Exception{
|
||||||
|
this(ScopeProvider.instance.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instantiates a new url shortener.
|
||||||
|
*
|
||||||
|
* @param scope the scope
|
||||||
|
* @throws Exception the exception
|
||||||
|
*/
|
||||||
|
private UrlShortener(String scope) throws Exception {
|
||||||
|
|
||||||
|
try{
|
||||||
|
logger.info("Trying to read the Runtime Resource with name {}, in the scope: {}",SHORTENER,scope);
|
||||||
|
|
||||||
|
if(scope==null || scope.isEmpty()){
|
||||||
|
String msg = "Scope is null or empty! You must set the scope into: "+ScopeProvider.instance.getClass();
|
||||||
|
throw new Exception(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
XQuery query = queryFor(ServiceEndpoint.class);
|
||||||
|
query.addCondition("$resource/Profile/Name/text() eq '"+SHORTENER+"'").setResult("$resource/Profile/AccessPoint");
|
||||||
|
DiscoveryClient<AccessPoint> client = clientFor(AccessPoint.class);
|
||||||
|
List<AccessPoint> endpoints = client.submit(query);
|
||||||
|
|
||||||
|
if (endpoints.size() == 0){
|
||||||
|
isAvailable = false;
|
||||||
|
logger.warn("Runtime Resource " +SHORTENER+ " not found");
|
||||||
|
throw new Exception("No Runtime Resource with name: "+SHORTENER+" is available in the scope: "+scope);
|
||||||
|
}
|
||||||
|
|
||||||
|
AccessPoint shortnerAP = endpoints.get(0);
|
||||||
|
|
||||||
|
if(shortnerAP!=null){
|
||||||
|
shortnerServiceUrl = shortnerAP.address();
|
||||||
|
//READING THE PROPERTIES
|
||||||
|
Map<String, Property> propertiesMap = shortnerAP.propertyMap();
|
||||||
|
if(propertiesMap==null || propertiesMap.size()==0) {
|
||||||
|
throw new Exception("You need to add the configurations as properties to "+SHORTENER);
|
||||||
|
}
|
||||||
|
|
||||||
|
//READING KEY
|
||||||
|
String encrKey = readPropertyValue(propertiesMap, KEY);
|
||||||
|
logger.debug("Read property with name {} and value {}", KEY, encrKey);
|
||||||
|
if(encrKey!=null) {
|
||||||
|
decryptedKEY = StringEncrypter.getEncrypter().decrypt(encrKey);
|
||||||
|
logger.debug("Decrypted {}: {}+++MASKED-KEY+++", KEY, decryptedKEY.substring(0, decryptedKEY.length()-10));
|
||||||
|
}
|
||||||
|
|
||||||
|
dynamicLink = readPropertyValue(propertiesMap, DYNAMIC_LINK);
|
||||||
|
logger.debug("Read property with name {} and value {}", DYNAMIC_LINK, dynamicLink);
|
||||||
|
suffixOption = readPropertyValue(propertiesMap, SUFFIX);
|
||||||
|
logger.debug("Read property with name {} and value {}", SUFFIX, suffixOption);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(shortnerServiceUrl==null || decryptedKEY==null) {
|
||||||
|
String error = "The access point in the RR: "+SHORTENER+" for scope "+scope+" is not available correctly. Impossible to read the service URL or decrypt the password";
|
||||||
|
logger.warn(error);
|
||||||
|
throw new Exception(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.trace("The shortner service URL is: {}",shortnerServiceUrl);
|
||||||
|
String getParam = "";
|
||||||
|
|
||||||
|
//ACTIVE THIS AFTER RELEASE
|
||||||
|
if(decryptedKEY!=null && !decryptedKEY.isEmpty()){
|
||||||
|
getParam = "?"+KEY +"="+decryptedKEY;
|
||||||
|
//getParam = "?"+KEY +"=AIzaSyCRGq1oO76Xi-pQEMPbdGWIUGVwueVbE5Y";
|
||||||
|
}
|
||||||
|
|
||||||
|
uriRequest = shortnerServiceUrl+getParam;
|
||||||
|
logger.info("HTTP-URL-Shortener found in scope {}, uriRequest: {}... KEY MASKED",scope, uriRequest.substring(0,uriRequest.length()-10));
|
||||||
|
isAvailable = true;
|
||||||
|
|
||||||
|
}catch (Exception e) {
|
||||||
|
logger.error("An error occurred reading Runtime Resource for name: "+SHORTENER+", the scope is: "+scope, e);
|
||||||
|
isAvailable = false;
|
||||||
|
throw new Exception("No "+SHORTENER+" available!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read property value.
|
||||||
|
*
|
||||||
|
* @param propertiesMap the properties map
|
||||||
|
* @param key the key
|
||||||
|
* @return the string
|
||||||
|
* @throws Exception the exception
|
||||||
|
*/
|
||||||
|
public String readPropertyValue(Map<String, Property> propertiesMap, String key) throws Exception{
|
||||||
|
Property theProperty = propertiesMap.get(key)!=null?propertiesMap.get(key):null;
|
||||||
|
if(theProperty==null)
|
||||||
|
throw new Exception("You need to add the "+key+" Property in the "+SHORTENER);
|
||||||
|
|
||||||
|
return theProperty.value();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shorten.
|
||||||
|
*
|
||||||
|
* @param longUrl the long url
|
||||||
|
* @return a shorten url
|
||||||
|
* @throws Exception the exception
|
||||||
|
*/
|
||||||
|
public String shorten(String longUrl) throws Exception{
|
||||||
|
|
||||||
|
if (longUrl == null) {
|
||||||
|
return longUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
logger.debug("shorten the input longUrl: "+longUrl);
|
||||||
|
|
||||||
|
URL url = new URL(uriRequest);
|
||||||
|
|
||||||
|
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
||||||
|
connection.setDoOutput(true);
|
||||||
|
connection.setRequestMethod("POST");
|
||||||
|
connection.setRequestProperty("Content-Type", APPLICATION_JSON);
|
||||||
|
|
||||||
|
JSONObject jsonObj = new JSONObject();
|
||||||
|
//jsonObj.put(LONG_URL, longUrl);
|
||||||
|
String toLongURL = String.format("%s?link=%s",dynamicLink,longUrl);
|
||||||
|
jsonObj.put(LONG_DYNAMIC_LINK, toLongURL);
|
||||||
|
|
||||||
|
JSONObject jsonObjSuffix = null;
|
||||||
|
//suffixOption = null;
|
||||||
|
if(suffixOption!=null) {
|
||||||
|
jsonObjSuffix = new JSONObject(suffixOption);
|
||||||
|
}else {
|
||||||
|
//DEFAULT OPTION IS SHORT
|
||||||
|
jsonObjSuffix = new JSONObject();
|
||||||
|
jsonObjSuffix.put("option", "SHORT");
|
||||||
|
}
|
||||||
|
|
||||||
|
jsonObj.put("suffix", jsonObjSuffix);
|
||||||
|
// //ACTIVE THIS AFTER RELEASE
|
||||||
|
// if(paramKeyValue!=null && !paramKeyValue.isEmpty()){
|
||||||
|
// jsonObj.put(KEY, paramKeyValue);
|
||||||
|
// }
|
||||||
|
|
||||||
|
logger.debug("Performing POST request to URI: {}+++MASKED-KEY+++",uriRequest.substring(0,uriRequest.length()-10));
|
||||||
|
logger.debug("the body contains the JSON request: \n{}",jsonObj.toString(3));
|
||||||
|
OutputStreamWriter wr = new OutputStreamWriter(connection.getOutputStream());
|
||||||
|
wr.write(jsonObj.toString());
|
||||||
|
wr.flush();
|
||||||
|
BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
|
||||||
|
|
||||||
|
JSONTokener tokener = new JSONTokener(rd);
|
||||||
|
JSONObject jsonObject = new JSONObject(tokener);
|
||||||
|
logger.debug("response contains the json: "+jsonObject.toString());
|
||||||
|
|
||||||
|
wr.close();
|
||||||
|
rd.close();
|
||||||
|
return (String) jsonObject.get("shortLink"); //it is the SHORT URL
|
||||||
|
|
||||||
|
} catch (MalformedURLException e) {
|
||||||
|
logger.error("MalformedURLException error in UrlShortener", e);
|
||||||
|
return longUrl;
|
||||||
|
|
||||||
|
} catch (IOException e) {
|
||||||
|
logger.error("IOException error in UrlShortener", e);
|
||||||
|
return longUrl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if is available.
|
||||||
|
*
|
||||||
|
* @return true, if is available
|
||||||
|
*/
|
||||||
|
public boolean isAvailable() {
|
||||||
|
return isAvailable;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the shortner server url.
|
||||||
|
*
|
||||||
|
* @return the shortner server url
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public static String getShortnerServerUrl() {
|
||||||
|
return shortnerServiceUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the shortner service url.
|
||||||
|
*
|
||||||
|
* @return the shortner service url
|
||||||
|
*/
|
||||||
|
public static String getShortnerServiceUrl() {
|
||||||
|
return shortnerServiceUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the key.
|
||||||
|
*
|
||||||
|
* @return the key
|
||||||
|
*/
|
||||||
|
public static String getKey() {
|
||||||
|
return KEY;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the param key value.
|
||||||
|
*
|
||||||
|
* @return the param key value
|
||||||
|
*/
|
||||||
|
public static String getParamKeyValue() {
|
||||||
|
return decryptedKEY;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the uri request.
|
||||||
|
*
|
||||||
|
* @return the uri request
|
||||||
|
*/
|
||||||
|
public String getUriRequest() {
|
||||||
|
return uriRequest;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the suffix option.
|
||||||
|
*
|
||||||
|
* @return the suffix option
|
||||||
|
*/
|
||||||
|
public static String getSuffixOption() {
|
||||||
|
return suffixOption;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the dynamic link.
|
||||||
|
*
|
||||||
|
* @return the dynamic link
|
||||||
|
*/
|
||||||
|
public static String getDynamicLink() {
|
||||||
|
return dynamicLink;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see java.lang.Object#toString()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
builder.append("UrlShortener [uriRequest=");
|
||||||
|
builder.append(uriRequest);
|
||||||
|
builder.append(", isAvailable=");
|
||||||
|
builder.append(isAvailable);
|
||||||
|
builder.append("]");
|
||||||
|
return builder.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
package org.gcube.portlets.user.urlshortener;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class Encoder {
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void encode() {
|
||||||
|
|
||||||
|
// System.out.println(UrlEncoderUtil.encodeQuery("request=GetStyles", "layers=test Name", "service=WMS", "version=1.1.1"));
|
||||||
|
|
||||||
|
HashMap<String, String> parameters = new HashMap<String, String>();
|
||||||
|
|
||||||
|
parameters.put("request", "GetStyles");
|
||||||
|
parameters.put("layers", "test Name");
|
||||||
|
parameters.put("version", "1.1.1");
|
||||||
|
|
||||||
|
System.out.println(UrlEncoderUtil.encodeQuery(parameters));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
package org.gcube.portlets.user.urlshortener;
|
||||||
|
import org.gcube.common.scope.api.ScopeProvider;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
|
||||||
|
* @Oct 13, 2014
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class Shortener {
|
||||||
|
|
||||||
|
protected static Logger logger = LoggerFactory.getLogger(Shortener.class);
|
||||||
|
protected static int tnt = 0;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testShortener(){
|
||||||
|
|
||||||
|
Thread th = new Thread(){
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
String scope ="/gcube";
|
||||||
|
ScopeProvider.instance.set(scope);
|
||||||
|
UrlShortener urlSh = new UrlShortener();
|
||||||
|
System.out.println("UrlShortener: "+urlSh);
|
||||||
|
//https://example.page.link/?link=https://www.example.com/&apn=com.example.android&ibi=com.example.ios"
|
||||||
|
String shorten = urlSh.shorten("https://data-d.d4science.org/shub/E_YmhuTVJ0R1F4SkhodmhZR2E1V2V3OGRFU0JOandPMEhnWVlEeXlkYlNBdW5YcGtWT2E4OEhOV2dLdTVFbGFhUg==");
|
||||||
|
//String shorten = urlSh.shorten("https://data-dev.d4science.net?link=https://next.d4science.org/group/next/workspace?itemid%3D1b3a7f43-8a07-43f1-af0b-ac8396634891%26operation%3Dgotofolder");
|
||||||
|
|
||||||
|
|
||||||
|
//String shorten = urlSh.shorten("https://developers.google.com/url-shortener/v1/getting_started?hl=it "+new Random().nextDouble());
|
||||||
|
System.out.println("Shorted: "+shorten);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*while (true) {
|
||||||
|
System.out.println("Tentative: "+tnt);
|
||||||
|
incrementCount();
|
||||||
|
th.run();
|
||||||
|
}*/
|
||||||
|
|
||||||
|
th.run();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static synchronized void incrementCount() {
|
||||||
|
tnt++;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
package org.gcube.portlets.user.urlshortener;
|
||||||
|
import org.gcube.common.scope.api.ScopeProvider;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
|
||||||
|
* @Oct 13, 2014
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class TestUrlShortener {
|
||||||
|
|
||||||
|
protected static Logger logger = LoggerFactory.getLogger(TestUrlShortener.class);
|
||||||
|
protected static int tnt = 0;
|
||||||
|
|
||||||
|
// @Test
|
||||||
|
public void testShortener(){
|
||||||
|
|
||||||
|
Thread th = new Thread(){
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
String scope ="/gcube/devsec";
|
||||||
|
ScopeProvider.instance.set(scope);
|
||||||
|
UrlShortener urlSh = new UrlShortener();
|
||||||
|
System.out.println("UrlShortener: "+urlSh);
|
||||||
|
String shorten = urlSh.shorten("http://data.d4science.org/uri-resolver/UUFYTGtkaEtiK2s0TURzdTBQckpBSDJmbVkrOXAzazVHbWJQNStIS0N6Yz0");
|
||||||
|
//String shorten = urlSh.shorten("https://developers.google.com/url-shortener/v1/getting_started?hl=it "+new Random().nextDouble());
|
||||||
|
System.out.println("Shorted: "+shorten);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*while (true) {
|
||||||
|
System.out.println("Tentative: "+tnt);
|
||||||
|
incrementCount();
|
||||||
|
th.run();
|
||||||
|
}*/
|
||||||
|
|
||||||
|
th.run();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static synchronized void incrementCount() {
|
||||||
|
tnt++;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
${gcube.license}
|
|
@ -0,0 +1,60 @@
|
||||||
|
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
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
* Francesco Mangiacrapa (francesco.mangiacrapa-AT-isti.cnr.it), Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo" - CNR, Pisa (Italy).
|
||||||
|
|
||||||
|
Maintainers
|
||||||
|
-----------
|
||||||
|
|
||||||
|
* Francesco Mangiacrapa (francesco.mangiacrapa-AT-isti.cnr.it), Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo" - CNR, Pisa (Italy).
|
||||||
|
|
||||||
|
Download information
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
Source code is available from SVN:
|
||||||
|
${scm.url}
|
||||||
|
|
||||||
|
Binaries can be downloaded from the gCube website:
|
||||||
|
${gcube.website}
|
||||||
|
|
||||||
|
|
||||||
|
Installation
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
Documentation
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
Documentation is available on-line in the gCube Wiki:
|
||||||
|
${gcube.wikiRoot}
|
||||||
|
|
||||||
|
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.
|
|
@ -0,0 +1,33 @@
|
||||||
|
<ReleaseNotes>
|
||||||
|
<Changeset component="${groupId}.${artifactId}.1-5-0"
|
||||||
|
date="${buildDate}">
|
||||||
|
<Change>[Task #16415] Migrate to Firebase Dynamic Links APIs</Change>
|
||||||
|
</Changeset>
|
||||||
|
<Changeset component="${groupId}.${artifactId}.1-2-0"
|
||||||
|
date="2017-06-14">
|
||||||
|
<Change>[Support #8940] src/it/simple-it/pom.xm</Change>
|
||||||
|
</Changeset>
|
||||||
|
<Changeset component="${groupId}.${artifactId}.1-1-1"
|
||||||
|
date="2016-12-19">
|
||||||
|
<Change>removed lo4j dependency from pom</Change>
|
||||||
|
</Changeset>
|
||||||
|
<Changeset component="${groupId}.${artifactId}.1-1-0"
|
||||||
|
date="2016-09-27">
|
||||||
|
<Change>removed jump of scope during read of Runtime
|
||||||
|
HTTP-URL-Shortener
|
||||||
|
</Change>
|
||||||
|
<Change>removed constructor with the parameter scope</Change>
|
||||||
|
</Changeset>
|
||||||
|
<Changeset component="${groupId}.${artifactId}.1-0-2"
|
||||||
|
date="2016-06-30">
|
||||||
|
<Change>removed maven portal bom dependency</Change>
|
||||||
|
</Changeset>
|
||||||
|
<Changeset component="${groupId}.${artifactId}.1-0-1"
|
||||||
|
date="2016-04-26">
|
||||||
|
<Change>maven-bom replaced by portal-bom</Change>
|
||||||
|
</Changeset>
|
||||||
|
<Changeset component="${groupId}.${artifactId}.1-0-0"
|
||||||
|
date="2014-10-13">
|
||||||
|
<Change>First Release</Change>
|
||||||
|
</Changeset>
|
||||||
|
</ReleaseNotes>
|
|
@ -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>
|
|
@ -0,0 +1,25 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
|
<ID></ID>
|
||||||
|
<Type>Service</Type>
|
||||||
|
<Profile>
|
||||||
|
<Description>${description}</Description>
|
||||||
|
<Class>PortletUser</Class>
|
||||||
|
<Name>${artifactId}</Name>
|
||||||
|
<Version>${version}</Version>
|
||||||
|
<Packages>
|
||||||
|
<Software>
|
||||||
|
<Name>${artifactId}</Name>
|
||||||
|
<Version>${version}</Version>
|
||||||
|
<MavenCoordinates>
|
||||||
|
<groupId>${groupId}</groupId>
|
||||||
|
<artifactId>${artifactId}</artifactId>
|
||||||
|
<version>${version}</version>
|
||||||
|
</MavenCoordinates>
|
||||||
|
<Files>
|
||||||
|
<File>target/${build.finalName}.war</File>
|
||||||
|
</Files>
|
||||||
|
</Software>
|
||||||
|
</Packages>
|
||||||
|
</Profile>
|
||||||
|
</Resource>
|
Loading…
Reference in New Issue