Massimiliano Assante 11 years ago
parent 0aa5406efe
commit 74f72f488d

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<fileset-config file-format-version="1.2.0" simple-config="true" sync-formatter="false">
<fileset name="all" enabled="true" check-config-name="CustomChecks" local="false">
<file-match-pattern match-pattern="." include-pattern="true"/>
</fileset>
<filter name="UnOpenedFiles" enabled="true"/>
</fileset-config>

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry including="**/*.java" kind="src" output="target/classes" path="src/main/java"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"/>
<classpathentry kind="output" path="target/classes"/>
</classpath>

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>ResourceManagementSupport</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>net.sf.eclipsecs.core.CheckstyleBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>net.sf.eclipsecs.core.CheckstyleNature</nature>
</natures>
</projectDescription>

@ -0,0 +1,4 @@
#Wed Dec 19 12:49:25 CET 2012
eclipse.preferences.version=1
encoding//src/main/java=UTF-8
encoding/<project>=UTF-8

@ -0,0 +1,13 @@
#Wed Dec 19 12:49:25 CET 2012
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.6
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.source=1.6

@ -0,0 +1,5 @@
#Wed Dec 19 12:41:58 CET 2012
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1

@ -0,0 +1 @@
Used as a Web service in the gCube Framework

@ -0,0 +1,8 @@
gCube System - License
------------------------------------------------------------
The gCube/gCore software is licensed as Free Open Source software conveying to
the EUPL (http://ec.europa.eu/idabc/eupl).
The software and documentation is provided by its authors/distributors "as is"
and no expressed or implied warranty is given for its use, quality or fitness
for a particular case.

@ -0,0 +1,2 @@
Daniele Strollo (daniele.strollo@isti.cnr.it), CNR Pisa,
Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo"

@ -0,0 +1,45 @@
The gCube System
------------------------------------------------------------
This work is partially funded by the European Commission in the
context of the D4Science project (www.d4science.eu), under the 1st
call of FP7 IST priority.
Authors
-------
* Daniele Strollo (daniele.strollo@isti.cnr.it), CNR Pisa,
Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo"
Version and Release Date
------------------------
version 1.0.0 (20-05-2010)
Description
--------------------
Consists of a gcube service able to properly manage the scheduling and
the deployment planning of services in a gcube infrastructure.
Download information
--------------------
Source code is available from SVN:
http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/vre-management/ResourceBroker/org.gcube.vremanagement.resourcebroker/
Binaries can be downloaded from:
http://software.d4science.research-infrastructures.eu/
Documentation
-------------
VREManager documentation is available on-line from the Projects Documentation Wiki:
https://gcube.wiki.gcube-system.org/gcube/index.php/Resource_Broker
Licensing
---------
This software is licensed under the terms you may find in the file named "LICENSE" in this directory.

@ -0,0 +1,10 @@
<ReleaseNotes
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="xsd/changelog.xsd">
<Changeset component="org.gcube.resourcemanagement.support.1-0-0" date="2010-10-15">
<Change>First release</Change>
</Changeset>
<Changeset component="org.gcube.resourcemanagement.support.1-1-0" date="2010-10-24">
<Change>For 1.2.0 of resource management</Change>
</Changeset>
</ReleaseNotes>

@ -0,0 +1,48 @@
<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>INSTALL</include>
<include>MAINTAINERS</include>
<include>changelog.xml</include>
</includes>
<fileMode>755</fileMode>
<filtered>true</filtered>
</fileSet>
<fileSet>
<directory>target/apidocs</directory>
<outputDirectory>/${artifactId}/doc/api</outputDirectory>
<useDefaultExcludes>true</useDefaultExcludes>
<fileMode>755</fileMode>
</fileSet>
</fileSets>
<files>
<file>
<source>${distroDirectory}/profile.xml</source>
<outputDirectory>./</outputDirectory>
<filtered>true</filtered>
</file>
<file>
<source>target/${build.finalName}.jar</source>
<outputDirectory>/${artifactId}</outputDirectory>
</file>
<file>
<source>${distroDirectory}/svnpath.txt</source>
<outputDirectory>/${artifactId}</outputDirectory>
<filtered>true</filtered>
</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>Library</Type>
<Profile>
<Description>Resource Management Portlet Common IS Operations Support Library</Description>
<Class>PortletsAdmin</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>

@ -0,0 +1 @@
${scm.url}

@ -0,0 +1,4 @@
name = ResourceManagerSupport
package = org.gcube.resourcemanagement.support
package.dir = org/gcube/resourcemanagement/support
lib.dir = ResourceManagementPortlet/war/WEB-INF/lib

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<Resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../xsd/service.xsd">
<ID/>
<Type>Library</Type>
<Profile>
<Description>ResourceManagement Support Library</Description>
<Class>portlet</Class>
<Name>ResourceManagementSupport</Name>
<Version>1.0.0</Version>
<Packages>
<Software>
<Description>ResourceManagement Support Library</Description>
<Name>ResourceManagement-support</Name>
<Version>1.0.1</Version>
<Files>
<File>org.gcube.resourcemanagement.support.jar</File>
</Files>
</Software>
</Packages>
</Profile>
</Resource>

@ -0,0 +1,152 @@
<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.portlets.admin</groupId>
<artifactId>rmp-common-library</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>Resource Management Portlet Common IS Operations Support Library</name>
<properties>
<distroDirectory>distro</distroDirectory>
<maven.compiler.source>1.6</maven.compiler.source>
<maven.compiler.target>1.6</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.5</version>
<executions>
<execution>
<id>copy-profile</id>
<phase>install</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>target</outputDirectory>
<resources>
<resource>
<directory>${distroDirectory}</directory>
<filtering>true</filtering>
<includes>
<include>profile.xml</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<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>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.gcube.core</groupId>
<artifactId>gcf</artifactId>
<version>[1.4.0,1.5.0]</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.gcube.applicationsupportlayer</groupId>
<artifactId>aslcore</artifactId>
<version>3.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.gcube.resourcemanagement</groupId>
<artifactId>softwarerepository-stubs</artifactId>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.gcube.resourcemanagement</groupId>
<artifactId>resource-manager-stubs</artifactId>
<version>2.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.gcube.resourcemanagement</groupId>
<artifactId>ghnmanager-stubs</artifactId>
<version>1.5.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>

@ -0,0 +1,48 @@
/****************************************************************************
* This software is part of the gCube Project.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: AbstractResourceException.java
****************************************************************************
* @author <a href="mailto:daniele.strollo@isti.cnr.it">Daniele Strollo</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.exceptions;
/**
* Represents the basic type of exception thrown by functionalities exposed
* in this library.
*
* The reason is to provide an access point for serialization issues
* (e.g. for GWT based portlets that require additional serialization
* annotations).
*
* @author Daniele Strollo (ISTI-CNR)
*/
public class AbstractResourceException extends Exception {
private static final long serialVersionUID = 4851998460190622583L;
public AbstractResourceException() {
super();
}
public AbstractResourceException(final String message, final Throwable cause) {
super(message, cause);
}
public AbstractResourceException(final String message) {
super(message);
}
public AbstractResourceException(final Throwable cause) {
super(cause);
}
}

@ -0,0 +1,43 @@
/****************************************************************************
* This software is part of the gCube Project.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: ResourceAccessException.java
****************************************************************************
* @author <a href="mailto:daniele.strollo@isti.cnr.it">Daniele Strollo</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.exceptions;
/**
* Thrown when is required an operation the user is not allowed to execute.
*
* @author Daniele Strollo (ISTI-CNR)
*/
public class ResourceAccessException extends AbstractResourceException {
private static final long serialVersionUID = -4491094127600507185L;
public ResourceAccessException() {
super();
}
public ResourceAccessException(final String message, final Throwable cause) {
super(message, cause);
}
public ResourceAccessException(final String message) {
super(message);
}
public ResourceAccessException(final Throwable cause) {
super(cause);
}
}

@ -0,0 +1,55 @@
/****************************************************************************
* This software is part of the gCube Project.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: ResourceOperationException.java
****************************************************************************
* @author <a href="mailto:daniele.strollo@isti.cnr.it">Daniele Strollo</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.exceptions;
/**
* If an operation of the library internally fails.
* @author Daniele Strollo (ISTI-CNR)
*/
public class ResourceOperationException extends AbstractResourceException {
private static final long serialVersionUID = -8748539948441128210L;
/**
*
*/
public ResourceOperationException() {
super();
}
/**
* @param message
*/
public ResourceOperationException(final String message) {
super(message);
}
/**
* @param cause
*/
public ResourceOperationException(final Throwable cause) {
super(cause);
}
/**
* @param message
* @param cause
*/
public ResourceOperationException(final String message, final Throwable cause) {
super(message, cause);
}
}

@ -0,0 +1,42 @@
/****************************************************************************
* This software is part of the gCube Project.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: ResourceParameterException.java
****************************************************************************
* @author <a href="mailto:daniele.strollo@isti.cnr.it">Daniele Strollo</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.exceptions;
/**
* Wrong parameters provided by the user.
* @author Daniele Strollo (ISTI-CNR)
*/
public class ResourceParameterException extends AbstractResourceException {
private static final long serialVersionUID = -1117521050663690780L;
public ResourceParameterException() {
super();
}
public ResourceParameterException(final String message, final Throwable cause) {
super(message, cause);
}
public ResourceParameterException(final String message) {
super(message);
}
public ResourceParameterException(final Throwable cause) {
super(cause);
}
}

@ -0,0 +1,56 @@
/****************************************************************************
* This software is part of the gCube Project.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: ReportBuilder.java
****************************************************************************
* @author <a href="mailto:daniele.strollo@isti.cnr.it">Daniele Strollo</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.managers.report;
import java.util.List;
import java.util.Vector;
/**
* @author Daniele Strollo (ISTI-CNR)
*
*/
public class ReportBuilder {
private List<ReportEntry> entries = null;
public ReportBuilder() {
entries = new Vector<ReportEntry>();
}
public final void addEntry(final ReportEntry entry) {
this.entries.add(entry);
}
public final int size() {
return this.entries.size();
}
public final String getXML() {
StringBuilder builder = new StringBuilder();
builder.append("<Report>\n");
for (ReportEntry entry : this.entries) {
builder.append(entry.toXML());
}
builder.append("</Report>\n");
return builder.toString();
}
@Override
public final String toString() {
return this.getXML();
}
}

@ -0,0 +1,100 @@
/****************************************************************************
* This software is part of the gCube Project.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: ReportEntry.java
****************************************************************************
* @author <a href="mailto:daniele.strollo@isti.cnr.it">Daniele Strollo</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.managers.report;
import org.gcube.resourcemanagement.support.exceptions.AbstractResourceException;
import org.gcube.resourcemanagement.support.managers.resources.AbstractResourceManager;
/**
* @author Daniele Strollo (ISTI-CNR)
*
*/
public class ReportEntry {
private ReportOperation operation = null;
private AbstractResourceManager resource = null;
private boolean success = false;
private String message = null;
public ReportEntry(
final ReportOperation operation,
final AbstractResourceManager resource
) throws AbstractResourceException {
this(operation, resource, null, false);
}
public ReportEntry(
final ReportOperation operation,
final AbstractResourceManager resource,
final boolean success
) throws AbstractResourceException {
this(operation, resource, null, success);
}
public ReportEntry(
final ReportOperation operation,
final AbstractResourceManager resource,
final String message,
final boolean success
) throws AbstractResourceException {
this.operation = operation;
this.resource = resource;
this.success = success;
this.message = message;
}
public final ReportOperation getOperation() {
return operation;
}
public final AbstractResourceManager getResource() {
return resource;
}
public final boolean isSuccess() {
return success;
}
public final void setSuccess(final boolean success) {
this.success = success;
}
public final void setMessage(final String message) {
this.message = message;
}
public final void setMessage(final Throwable ex) {
this.message = ex.getMessage();
}
@Override
public final String toString() {
return this.toXML();
}
public final String toXML() {
return
"\t<Operation type=\"" + this.getOperation().getLabel() + "\">\n" +
"\t\t<Status>" + (this.isSuccess() ? "SUCCESS" : "FAILURE") + "</Status>\n" +
"\t\t<Resource>\n" +
"\t\t\t<ID>" + this.getResource().getID() + "</ID>\n" +
// If the resource has a name
(this.getResource().getName() != null ?
"\t\t\t<Name>" + this.getResource().getName() + "</Name>\n" : "") +
"\t\t\t<Type>" + this.getResource().getType() + "</Type>\n" +
// If a message is present
(this.message != null ?
"\t\t\t<Message>\n\t\t\t\t" + this.message.trim() + "\n\t\t\t</Message>\n" : "") +
"\t\t</Resource>\n" +
"\t</Operation>\n";
}
}

@ -0,0 +1,33 @@
/****************************************************************************
* This software is part of the gCube Project.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: ReportOperation.java
****************************************************************************
* @author <a href="mailto:daniele.strollo@isti.cnr.it">Daniele Strollo</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.managers.report;
/**
* @author Daniele Strollo (ISTI-CNR)
*
*/
public enum ReportOperation {
AddToScope("Add To Scope");
private String label = null;
private ReportOperation(final String label) {
this.label = label;
}
public final String getLabel() {
return this.label;
}
}

@ -0,0 +1,798 @@
/****************************************************************************
* This software is part of the gCube Project.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: ResourceManager.java
****************************************************************************
* @author <a href="mailto:daniele.strollo@isti.cnr.it">Daniele Strollo</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.managers.resources;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Vector;
import org.apache.axis.message.addressing.EndpointReferenceType;
import org.gcube.common.core.contexts.GCUBERemotePortTypeContext;
import org.gcube.common.core.contexts.GHNContext;
import org.gcube.common.core.informationsystem.client.AtomicCondition;
import org.gcube.common.core.informationsystem.client.ISClient;
import org.gcube.common.core.informationsystem.client.XMLResult;
import org.gcube.common.core.informationsystem.client.queries.GCUBEGenericQuery;
import org.gcube.common.core.informationsystem.client.queries.GCUBERIQuery;
import org.gcube.common.core.informationsystem.publisher.ISPublisher;
import org.gcube.common.core.resources.GCUBEResource;
import org.gcube.common.core.resources.GCUBERunningInstance;
import org.gcube.common.core.scope.GCUBEScope;
import org.gcube.common.core.scope.GCUBEScope.Type;
import org.gcube.common.core.security.GCUBESecurityManagerImpl;
import org.gcube.resourcemanagement.support.exceptions.AbstractResourceException;
import org.gcube.resourcemanagement.support.exceptions.ResourceAccessException;
import org.gcube.resourcemanagement.support.exceptions.ResourceOperationException;
import org.gcube.resourcemanagement.support.exceptions.ResourceParameterException;
import org.gcube.resourcemanagement.support.managers.report.ReportBuilder;
import org.gcube.resourcemanagement.support.managers.report.ReportEntry;
import org.gcube.resourcemanagement.support.managers.report.ReportOperation;
import org.gcube.resourcemanagement.support.managers.scope.ScopeManager;
import org.gcube.resourcemanagement.support.types.AllowedResourceTypes;
import org.gcube.resourcemanagement.support.utils.Assertion;
import org.gcube.resourcemanagement.support.utils.ServerConsole;
import org.gcube.vremanagement.resourcemanager.stubs.binder.AddResourcesParameters;
import org.gcube.vremanagement.resourcemanager.stubs.binder.RemoveResourcesParameters;
import org.gcube.vremanagement.resourcemanager.stubs.binder.ResourceBinderPortType;
import org.gcube.vremanagement.resourcemanager.stubs.binder.ResourceItem;
import org.gcube.vremanagement.resourcemanager.stubs.binder.ResourceList;
import org.gcube.vremanagement.resourcemanager.stubs.binder.service.ResourceBinderServiceAddressingLocator;
import org.gcube.vremanagement.resourcemanager.stubs.reporting.ReportingPortType;
import org.gcube.vremanagement.resourcemanager.stubs.reporting.service.ReportingServiceAddressingLocator;
/**
* The minimal interface all the resource managers must implement.
* Here is implemented the greatest part of the operations exposed in the
* <a href="https://gcube.wiki.gcube-system.org/gcube/index.php/Programmatic_Administration_Interface">
* official wiki</a>.
* @author Daniele Strollo (ISTI-CNR)
*/
public abstract class AbstractResourceManager {
private String id = null;
private String name = null;
private AllowedResourceTypes type = null;
private String subType = null;
private ISClient client = null;
private GCUBESecurityManagerImpl managerSec = null;
private ISPublisher publisher = null;
private static final String LOG_PREFIX = "[AbstractResMgr]";
/**
* @deprecated discouraged use. With no ID some operations cannot be accessed. For internal use only.
*/
public AbstractResourceManager(final AllowedResourceTypes type)
throws ResourceParameterException, ResourceAccessException {
Assertion<ResourceParameterException> checker = new Assertion<ResourceParameterException>();
checker.validate(type != null, new ResourceParameterException("Invalid Parameter type"));
this.type = type;
/**
* Initially the security management is disabled.
*/
this.managerSec = new GCUBESecurityManagerImpl() {
public boolean isSecurityEnabled() {
return false;
}
};
try {
client = GHNContext.getImplementation(ISClient.class);
} catch (Exception e) {
throw new ResourceAccessException("Cannot instantiate the ISClient");
}
try {
this.publisher = GHNContext.getImplementation(ISPublisher.class);
} catch (Exception e) {
ServerConsole.error(LOG_PREFIX, e);
}
}
/**
* Instantiate the handler of a resource given its identifier and its type.
* Notice that this constructor is implicitly invoked when instantiating the
* concrete resource manager (e.g. new GHNManager(id)).
* @param id the identifier of the resource the manage
* @param type the type (GHN, RI, ...).
* @throws ResourceParameterException
* @throws ResourceAccessException
*/
public AbstractResourceManager(
final String id,
final AllowedResourceTypes type)
throws ResourceParameterException, ResourceAccessException {
this(type);
Assertion<ResourceParameterException> checker = new Assertion<ResourceParameterException>();
checker.validate(id != null && id.trim().length() > 0, new ResourceParameterException("Invalid Parameter id"));
this.id = id.trim();
}
public AbstractResourceManager(
final String id,
final String name,
final AllowedResourceTypes type)
throws ResourceParameterException, ResourceAccessException {
this(id, type);
Assertion<ResourceParameterException> checker = new Assertion<ResourceParameterException>();
checker.validate(name != null && name.trim().length() > 0, new ResourceParameterException("Invalid Parameter name"));
this.name = name;
}
public AbstractResourceManager(
final String id,
final String name,
final AllowedResourceTypes type,
final String subtype)
throws ResourceParameterException, ResourceAccessException {
this(id, name, type);
if (subtype != null) {
this.subType = subtype.trim();
}
}
/**
* The singleton ISClient instance is preferred.
* All resource managers can internally access this instance
* to make queries to the IS.
* @return
*/
protected final ISClient getISClient() {
return this.client;
}
/**
* The singleton ISPublisher instance is preferred.
* All resource managers can internally access this instance
* to interact with ISPublisher to handle resources.
* @return
*/
public final ISPublisher getISPublisher() {
return publisher;
}
public final void setSecurityManager(final GCUBESecurityManagerImpl securityManager) {
this.managerSec = securityManager;
}
/**
* The security manager is initially instantiated with empty permissions.
* The {@link AbstractResourceManager#setSecurityManager} can be used to
* change it.
* @return
*/
public final GCUBESecurityManagerImpl getSecurityManager() {
return this.managerSec;
}
/**
* All resources must be identifiable through an unique ID.
* <br/>
* <b>This field is mandatory</b>
* @return
*/
public final String getID() {
return this.id;
}
public final void setID(final String id) {
this.id = id;
}
/**
* All resources must have a valid name.
* </br>
* <b>This field is mandatory</b>
* @return
*/
public final String getName() {
return this.name;
}
/**
* All resources have a type.
* </br>
* <b>This field is mandatory</b>
* @return
*/
public final AllowedResourceTypes getType() {
return this.type;
}
/**
* Resources can have a subtype (e.g. for GHNs is the domain).
* </br>
* <b>This field is optional</b>
* @return
*/
public final String getSubType() {
return this.subType;
}
/**
* Internally used by {@link AbstractResourceManager#getResourceManager(GCUBEScope)}.
* @param scope
* @return a raw list of resource manager descriptors.
* @throws Exception
*/
private List<GCUBERunningInstance> getResourceManagerFromScope(final GCUBEScope scope)
throws Exception {
GCUBERIQuery query = this.client.getQuery(GCUBERIQuery.class);
query.addAtomicConditions(new AtomicCondition("//Profile/ServiceClass", "VREManagement"));
query.addAtomicConditions(new AtomicCondition("//Profile/ServiceName", "ResourceManager"));
List<GCUBERunningInstance> result = client.execute(query, scope);
List<GCUBERunningInstance> toReturn = new ArrayList<GCUBERunningInstance>();
for (GCUBERunningInstance ri : result) {
if (ri.getScopes().containsValue(scope)) {
toReturn.add(ri);
}
}
return toReturn;
}
/**
* The the list of resource managers able to handle the resource in a given scope.
* @param scope the scope in which to operate
* @return all the available managers
* @throws ResourceAccessException if no manager can be instantiated
* @throws ResourceParameterException if the parameters are invalid
*/
public final List<ResourceBinderPortType> getResourceManagers(final GCUBEScope scope) throws ResourceAccessException, ResourceParameterException {
Assertion<ResourceParameterException> checker = new Assertion<ResourceParameterException>();
checker.validate(scope != null, new ResourceParameterException("Invalid scope"));
List<GCUBERunningInstance> resourceManagerList = null;
try {
resourceManagerList = this.getResourceManagerFromScope(scope);
} catch (Exception e) {
e.printStackTrace();
throw new ResourceAccessException("Cannot retrieve the managers for resource: " + this.getID());
}
List<ResourceBinderPortType> retval = new Vector<ResourceBinderPortType>();
if (resourceManagerList.isEmpty()) {
throw new ResourceAccessException("Unable to find ResourceManagers for resource " + this.getType() + " in scope: " + scope.toString());
}
EndpointReferenceType endpoint = null;
ResourceBinderPortType pt = null;
for (GCUBERunningInstance resourceManager : resourceManagerList) {
try {
endpoint = resourceManager.getAccessPoint().getEndpoint("gcube/vremanagement/resourcemanager/binder");
pt = GCUBERemotePortTypeContext.getProxy(
new ResourceBinderServiceAddressingLocator()
.getResourceBinderPortTypePort(endpoint),
scope,
this.managerSec);
if (pt != null) {
retval.add(pt);
}
} catch (Throwable e) {
// trying on next entry
ServerConsole.error(LOG_PREFIX, e);
}
}
if (retval != null && retval.size() > 0) {
// Return a random manager from the available ones
return retval;
}
// no managers found
throw new ResourceAccessException("Unable to find ResourceManagers for resource " + this.getID() + "in scope: " + scope.toString());
}
/**
* The the list of resource report managers able to handle the resource in a given scope.
* @param scope the scope in which to operate
* @return all the available managers
* @throws ResourceAccessException if no manager can be instantiated
* @throws ResourceParameterException if the parameters are invalid
*/
public final List<ReportingPortType> getResourceReportManagers(final GCUBEScope scope) throws ResourceAccessException, ResourceParameterException {
Assertion<ResourceParameterException> checker = new Assertion<ResourceParameterException>();
checker.validate(scope != null, new ResourceParameterException("Invalid scope"));
List<GCUBERunningInstance> resourceManagerList = null;
try {
resourceManagerList = this.getResourceManagerFromScope(scope);
} catch (Exception e) {
e.printStackTrace();
throw new ResourceAccessException("Cannot retrieve the managers for resource: " + this.getID());
}
List<ReportingPortType> retval = new Vector<ReportingPortType>();
if (resourceManagerList.isEmpty()) {
throw new ResourceAccessException("Unable to find ResourceManagers for resource " + this.getType() + " in scope: " + scope.toString());
}
EndpointReferenceType endpoint = null;
ReportingPortType pt = null;
for (GCUBERunningInstance resourceManager : resourceManagerList) {
try {
endpoint = resourceManager.getAccessPoint().getEndpoint("gcube/vremanagement/resourcemanager/reporting");
pt = GCUBERemotePortTypeContext.getProxy(
new ReportingServiceAddressingLocator().getReportingPortTypePort(endpoint),
scope,
this.managerSec);
if (pt != null) {
retval.add(pt);
}
} catch (Throwable e) {
// trying on next entry
ServerConsole.error(LOG_PREFIX, e);
}
}
if (retval != null && retval.size() > 0) {
// Return a random report manager from the available ones
return retval;
}
// no managers found
throw new ResourceAccessException("Unable to find ReportResourceManagers for resource " + this.getID() + "in scope: " + scope.toString());
}
/**
* The resource manager needed to handle the resource in a given scope.
* @param scope the scope in which to operate
* @return a random chosen manager from the avaiable ones
* @throws ResourceAccessException if no manager can be instantiated
* @throws ResourceParameterException if the parameters are invalid
*/
public final ResourceBinderPortType getResourceManager(final GCUBEScope scope)
throws AbstractResourceException {
ServerConsole.info(LOG_PREFIX, "Getting Resource Manager in scope [" + scope.toString() + "]");
List<ResourceBinderPortType> retval = this.getResourceManagers(scope);
if (retval != null && retval.size() > 0) {
Random generator = new Random();
// Return a random manager from the available ones
ResourceBinderPortType manager = retval.get(generator.nextInt(retval.size()));
return manager;
}
// no managers found
throw new ResourceAccessException("Unable to find ResourceManagers for resource " + this.getType() + " in scope: " + scope.toString());
}
/**
* The report resource manager needed to handle the resource in a given scope.
* @param scope the scope in which to operate
* @return a random chosen manager from the avaiable ones
* @throws ResourceAccessException if no manager can be instantiated
* @throws ResourceParameterException if the parameters are invalid
*/
public final ReportingPortType getReportResourceManager(final GCUBEScope scope)
throws AbstractResourceException {
ServerConsole.info(LOG_PREFIX, "Getting Resource Manager in scope [" + scope.toString() + "]");
List<ReportingPortType> retval = this.getResourceReportManagers(scope);
if (retval != null && retval.size() > 0) {
Random generator = new Random();
// Return a random manager from the available ones
ReportingPortType manager = retval.get(generator.nextInt(retval.size()));
return manager;
}
// no managers found
throw new ResourceAccessException("Unable to find ResourceManagers for resource " + this.getType() + " in scope: " + scope.toString());
}
/**
* Once the conditions for binding a resource to a target scope are satisfied
* (see the
* <a href="https://gcube.wiki.gcube-system.org/gcube/index.php/Programmatic_Administration_Interface">
* official wiki</a>
* for scope binding rules) this method is internally called.
* @param targetScope
* @return
* @throws ResourceOperationException
*/
private String bindToScope(final GCUBEScope targetScope) throws AbstractResourceException {
Assertion<AbstractResourceException> checker = new Assertion<AbstractResourceException>();
checker.validate(targetScope != null, new ResourceParameterException("Invalid parameter targetScope. null not allowed."));
checker.validate(this.getID() != null, new ResourceOperationException("Invalid resource ID. null not allowed."));
ServerConsole.trace(
LOG_PREFIX,
"[BIND-SCOPE-ENTER] Adding " + this.getType() + " " + this.getID() + " to scope [" +
targetScope.toString() + "]");
AddResourcesParameters addParam = new AddResourcesParameters();
ResourceItem toAdd = new ResourceItem();
toAdd.setID(this.getID());
toAdd.setType(this.getType().name());
ResourceList r = new ResourceList();
r.setResource(new ResourceItem[]{toAdd});
addParam.setResources(r);
addParam.setTargetScope(targetScope.toString());
ResourceBinderPortType manager = this.getResourceManager(targetScope);
try {
String reportID = manager.addResources(addParam);
ServerConsole.trace(
LOG_PREFIX,
"[BIND-SCOPE-EXIT] Applyed Adding " + this.getType() + " " + this.getID() + " to scope [" +
targetScope.toString() + "]... reportID: " + reportID);
ReportingPortType pt = this.getReportResourceManager(targetScope);
return pt.getReport(reportID);
} catch (Exception e) {
e.printStackTrace();
ServerConsole.trace(
LOG_PREFIX,
"[BIND-SCOPE-EXIT] [FAILURE]");
throw new ResourceOperationException("During resource::addToScope: " + e.getMessage());
}
}
/**
* Add a scope to a gHN and the related Service Map is already available on the gHN.
* @param nestingPublication true for resources different from gHN and RI.
* @return the reportID generated
*/
public final String addToExistingScope(
final GCUBEScope sourceScope, final GCUBEScope targetScope)
throws AbstractResourceException {
Assertion<AbstractResourceException> checker = new Assertion<AbstractResourceException>();
checker.validate(sourceScope != null, new ResourceParameterException("Invalid parameter sourceScope. null not allowed."));
checker.validate(targetScope != null, new ResourceParameterException("Invalid parameter targetScope. null not allowed."));
checker.validate(this.getID() != null, new ResourceOperationException("Invalid resource ID. null not allowed."));
ReportBuilder report = new ReportBuilder();
ServerConsole.trace(
LOG_PREFIX,
"[ADD-ToExistingScope] Adding from scope [" +
sourceScope.toString() +
"] to existing scope [" +
targetScope.toString() +
"] " + this.getType() + " " + this.getID());
// If not RI or GHN and the scopes are sibling and VO copyFromToVO
if (!(this.getType() == AllowedResourceTypes.GHN) &&
!(this.getType() == AllowedResourceTypes.RunningInstance) &&
sourceScope.getType() == Type.VO && targetScope.getType() == Type.VO) {
return copyFromToVO(sourceScope, targetScope);
}
// Add a gCube Resource to
// (i) a VRE scope from the parent VO or
// (ii) a VO scope from the infrastructure scope
if (!targetScope.isEnclosedIn(sourceScope)) {
throw new ResourceOperationException(
"You are not allowed to apply to this scope. Target scope is not enclosed in the source one.");
}
report.addEntry(new ReportEntry(ReportOperation.AddToScope, this,
"Added " + this.getType() + " " + this.getID() + " to parent scope " +
targetScope.toString() + " the remote report ID is: " +
this.bindToScope(targetScope), true));
return report.getXML();
}
/**
* Similar to the {@link AbstractResourceManager#addToExistingScope} method but involves
* two scopes of type VO.
* Notice that this operation in reserved for resources different from gHN and RI.
* See
* <a href="https://gcube.wiki.gcube-system.org/gcube/index.php/Programmatic_Administration_Interface#Add_a_gCube_Resource_from_a_VO_to_another_VO">
* here</a> for further details.
* @param sourceScope
* @param targetScope
* @return
* @throws AbstractResourceException
*/
public final String copyFromToVO(final GCUBEScope sourceScope, final GCUBEScope targetScope)
throws AbstractResourceException {
Assertion<AbstractResourceException> checker = new Assertion<AbstractResourceException>();
checker.validate(
sourceScope != null && sourceScope.getType() == Type.VO,
new ResourceParameterException("The sourceScope is invalid or not of type VO."));
checker.validate(
targetScope != null && targetScope.getType() == Type.VO,
new ResourceParameterException("The targetScope is invalid or not of type VO."));
checker.validate(
sourceScope.getEnclosingScope() == targetScope.getEnclosingScope(),
new ResourceParameterException("The sourceScope and targetScope must be children of the same root VO."));
checker.validate(this.getType() != AllowedResourceTypes.GHN && this.getType() != AllowedResourceTypes.RunningInstance,
new ResourceAccessException("Operation not allowed for RI and GHNs."));
checker.validate(this.getID() != null,
new ResourceAccessException("Operation not allowed on resources with no ID."));
// Phase 1. retrieve the resource to copy
GCUBEResource resStub = this.getGCUBEResource(sourceScope);
// Phase 2. Before to register the resource, the scope must be
// bound to the local GCUBEResource
this.bindToScope(targetScope);
// Phase 3. Register to the new VO through the ISPublisher
try {
return this.getISPublisher().registerGCUBEResource(resStub, targetScope, this.getSecurityManager());
} catch (Exception e) {
throw new ResourceAccessException(e.getMessage());
}
}
/**
* Given the XML profile representation of a gcube resource, its GCUBEResource is built.
* Since it depends on the type of the resource, each concrete implementation of resource
* managers must implement it.
* @param xmlRepresentation
* @return
* @throws AbstractResourceException
*/
protected abstract GCUBEResource buildGCUBEResource(final String xmlRepresentation) throws AbstractResourceException;
/**
* From a resource retrieves its GCUBEResource depending on the scope in which it is
* published.
* @param scope
* @return
* @throws AbstractResourceException
*/
public final GCUBEResource getGCUBEResource(final GCUBEScope scope) throws AbstractResourceException {
return this.buildGCUBEResource(this.getXMLDescription(scope));
}
/**
* Returns the XML profile of a resource (given its ID that is encapsulated inside the resource
* manager).
* @param scope
* @return
* @throws AbstractResourceException
*/
protected final String getXMLDescription(final GCUBEScope scope) throws AbstractResourceException {
Assertion<AbstractResourceException> checker = new Assertion<AbstractResourceException>();
checker.validate(this.getID() != null, new ResourceAccessException("Cannot execute on resources with no ID."));
// Phase 1. retrieve the resource to copy
GCUBEGenericQuery query = null;
try {
query = this.getISClient().getQuery(GCUBEGenericQuery.class);
query.setExpression(
"for $resource in collection('/db/Profiles/" + this.getType().name() + "')//Resource " +
"where ( $resource/ID/string() eq '" +
this.getID() +
"') " +
"return $resource"
);
} catch (Exception e) {
throw new ResourceAccessException(e);
}
XMLResult resDescription = null;
try {
resDescription = this.getISClient().execute(query, scope).get(0);
return resDescription.toString();
} catch (Exception e) {
throw new ResourceAccessException("Cannot retrieve the IS profile for resource: " + this.getID() +
" in scope: " + scope.toString());
}
}
/**
* The first phase of remove form scope.
* This is common to all the resources (RI and GHNs).
* @param scope
* @return
* @throws AbstractResourceException
*/
private String basicRemoveFromScope(final GCUBEScope scope)
throws AbstractResourceException {
Assertion<AbstractResourceException> checker = new Assertion<AbstractResourceException>();
checker.validate(scope != null, new ResourceParameterException("Invalid parameter scope. null not allowed."));
checker.validate(this.getID() != null, new ResourceOperationException("Invalid ID. null not allowed."));
ServerConsole.trace(LOG_PREFIX, "[REMOVE-FROM-SCOPE] Removing from scope [" + scope.toString() + "] " + this.getType() + " " + this.getID());
String retval = null;
RemoveResourcesParameters params = new RemoveResourcesParameters();
ResourceItem toRemove = new ResourceItem();
toRemove.setID(this.getID());
toRemove.setType(this.getType().name());
ResourceList resourcesToRemove = new ResourceList();
resourcesToRemove.setResource(new ResourceItem[]{toRemove});
params.setResources(resourcesToRemove);
params.setTargetScope(scope.toString());
ServerConsole.trace(LOG_PREFIX, "[REMOVE-FROM-SCOPE] Sending the Remove Resource request....");
try {
ResourceBinderPortType manager = this.getResourceManager(scope);
retval = manager.removeResources(params);
} catch (Exception e) {
throw new ResourceOperationException("During removeFrom scope of "
+ this.getType()
+ " " + this.getID() + ": " + e.getMessage());
}
return retval;
}
/**
* Removes the current resource from the scope.
* @param nestingRemoval true for resources different from gHN and RI
*/
public final String removeFromScope(final GCUBEScope scope)
throws AbstractResourceException {
Assertion<AbstractResourceException> checker = new Assertion<AbstractResourceException>();
checker.validate(scope != null, new ResourceParameterException("Invalid parameter scope. null not allowed."));
checker.validate(this.getID() != null, new ResourceOperationException("Invalid ID. null not allowed."));
String retval = this.basicRemoveFromScope(scope);
// -- PHASE 2 - optional
// Builds the stub without the removed scope
GCUBEResource resStub = this.getGCUBEResource(scope);
// Refreshes the local profile
resStub.removeScope(scope);
/*
* These steps are for resources different from GHN and RI
*/
if (!this.getType().equals(AllowedResourceTypes.GHN.name()) &&
!this.getType().equals(AllowedResourceTypes.RunningInstance.name())) {
// Phase 1
// if the resource joins only the current scope, after the removal it has also to be deleted
try {
List<GCUBEScope> boundedScopes = this.validateScopes(resStub.getScopes().values().toArray(new GCUBEScope[]{}));
if (boundedScopes == null) {
ServerConsole.warn(LOG_PREFIX, "[REMOVE-FROM-SCOPE] The resource " + this.getType() + " has no bound scopes");
return retval;
}
if (boundedScopes.size() == 0) {
ServerConsole.trace(LOG_PREFIX, "[REMOVE-FROM-SCOPE] [DELETE-BRANCH] deleting resource since no more scopes remained");
this.getISPublisher().removeGCUBEResource(
this.getID(), this.getType().name(), scope, this.getSecurityManager());
return retval;
} else {
// requires the update of the resources in all other scopes
for (GCUBEScope _scope : boundedScopes) {
if (!scope.equals(_scope)) {
try {
ServerConsole.trace(LOG_PREFIX, "[REMOVE-FROM-SCOPE] [UPDATE-BRANCH] Updating profile in scope [" + _scope.toString() + "]");
this.getISPublisher().updateGCUBEResource(resStub, _scope, getSecurityManager());
} catch (Exception e) {
ServerConsole.error(LOG_PREFIX, e);
}
}
}
}
} catch (Exception e) {
throw new ResourceOperationException(e);
}
}
return retval;
}
/**
* Adds to scopes the required maps (if needed).
* Internally used to ensure that the scopes at Infrastructure or VO level
* have correctly setup the maps.
* @param scopes
* @return
*/
protected List<GCUBEScope> validateScopes(final GCUBEScope[] scopes) {
List<GCUBEScope> retval = new Vector<GCUBEScope>();
for (GCUBEScope scope : scopes) {
try {
retval.add(ScopeManager.getScope(scope.toString()));
} catch (Exception e) {
ServerConsole.error(LOG_PREFIX, e);
}
}
return retval;
}
/**
* @deprecated you must be sure before requiring this operation... take care
* @param scope where the resource is bound
* @throws AbstractResourceException
*/
public final void forceDelete(final GCUBEScope scope) throws AbstractResourceException {
ServerConsole.trace(LOG_PREFIX, "[DELETE] [DELETE-BRANCH] deleting resource since no more scopes remained");
try {
this.getISPublisher().removeGCUBEResource(
this.getID(), this.getType().name(), scope, this.getSecurityManager());
} catch (Exception e) {
ServerConsole.error(LOG_PREFIX, e);
}
}
/**
* Removes a resource.
* According to the
* <a href="https://gcube.wiki.gcube-system.org/gcube/index.php/Programmatic_Administration_Interface">
* official wiki</a> the resource is deleted only if is not bound in other scopes. Otherwise this
* operation simply corresponds to the in deep remove from scope.
* @param scope
* @throws ResourceOperationException
*/
public final void delete(final GCUBEScope scope) throws AbstractResourceException {
Assertion<AbstractResourceException> checker = new Assertion<AbstractResourceException>();
checker.validate(scope != null, new ResourceParameterException("Invalid parameter scope. null not allowed."));
checker.validate(this.getID() != null, new ResourceOperationException("Invalid ID. null not allowed."));
System.out.println("DELETING TYPE: "+ this.getType());
GCUBEResource resStub = this.getGCUBEResource(scope);
List<GCUBEScope> boundedScopes = this.validateScopes(resStub.getScopes().values().toArray(new GCUBEScope[]{}));
ServerConsole.trace(LOG_PREFIX, "[DELETE] " + this.getType() + " " + this.getID() + " in scope [" + scope + "]");
ServerConsole.trace(LOG_PREFIX, "[DELETE] " + this.getType() + " " + this.getID() + " is bound to (" + boundedScopes.size() + ") scopes");
/*
* Removefromscope accetta un boolean piu la resource gia ottenuta.
* boolean per decidere se saltare fase due di update che la ripeto piu volte
* rispetto a qui che lo faccio una volta sola.
*/
for (GCUBEScope _scope : boundedScopes) {
// Removing from the children scopes
if (_scope.isEnclosedIn(scope) || scope.equals(_scope)) {
this.basicRemoveFromScope(_scope);
resStub.removeScope(_scope);
}
}
// Phase 2
// after the removal, the resource must be also updated in the other scopes it belongs to,
// otherwise it will wrongly report there a scope where actually it is not registered anymore.
// In order to do so, the just removed scope must be removed from the local
// GCUBEResource object by invoking the method GCUBEResource.removeScope(<scope to remove>)
// and then the resource must be updated in all the remaining scopes.
if (resStub.getScopes().isEmpty()) {
ServerConsole.trace(LOG_PREFIX, "[DELETE] [DELETE-BRANCH] deleting resource since no more scopes remained");
try {
this.getISPublisher().removeGCUBEResource(
this.getID(), this.getType().name(), scope, this.getSecurityManager());
} catch (Exception e) {
}
} else {
boundedScopes = this.validateScopes(resStub.getScopes().values().toArray(new GCUBEScope[]{}));
for (GCUBEScope _scope : boundedScopes) {
try {
ServerConsole.trace(LOG_PREFIX, "[DELETE] [UPDATE-BRANCH]" + this.getType() + " " + this.getID() + " in scope [" + _scope + "]");
this.getISPublisher().updateGCUBEResource(resStub, _scope, getSecurityManager());
} catch (Exception e) {
ServerConsole.error(LOG_PREFIX, e);
}
}
}
}
}

@ -0,0 +1,84 @@
/****************************************************************************
* This software is part of the gCube Project.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: CollectionManager.java
****************************************************************************
* @author <a href="mailto:daniele.strollo@isti.cnr.it">Daniele Strollo</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.managers.resources;
import java.io.StringReader;
import org.gcube.common.core.contexts.GHNContext;
import org.gcube.common.core.resources.GCUBECollection;
import org.gcube.common.core.resources.GCUBEResource;
import org.gcube.resourcemanagement.support.exceptions.AbstractResourceException;
import org.gcube.resourcemanagement.support.exceptions.ResourceAccessException;
import org.gcube.resourcemanagement.support.exceptions.ResourceParameterException;
import org.gcube.resourcemanagement.support.types.AllowedResourceTypes;
/**
* @author Daniele Strollo (ISTI-CNR)
*
*/
public class CollectionManager extends AbstractResourceManager {
/**
* @deprecated discouraged use. With no ID some operations cannot be accessed.
*/
public CollectionManager()
throws ResourceParameterException, ResourceAccessException {
super(AllowedResourceTypes.Collection);
}
public CollectionManager(final String id)
throws ResourceParameterException, ResourceAccessException {
super(id, AllowedResourceTypes.Collection);
}
/**
* @param id
* @param name
* @throws ResourceParameterException
* @throws ResourceAccessException
*/
public CollectionManager(final String id, final String name)
throws ResourceParameterException, ResourceAccessException {
super(id, name, AllowedResourceTypes.Collection);
}
/**
* @param id
* @param name
* @param subtype
* @throws ResourceParameterException
* @throws ResourceAccessException
*/
public CollectionManager(final String id, final String name, final String subtype)
throws ResourceParameterException, ResourceAccessException {
super(id, name, AllowedResourceTypes.Collection, subtype);
}
/**
* {@inheritDoc}
*/
@Override
protected final GCUBEResource buildGCUBEResource(final String xmlRepresentation)
throws AbstractResourceException {
try {
GCUBECollection impl = GHNContext.getImplementation(GCUBECollection.class);
impl.load(new StringReader(xmlRepresentation));
return impl;
} catch (Exception e) {
throw new ResourceAccessException("Cannot load the stub for resource " + this.getType(), e);
}
}
}

@ -0,0 +1,210 @@
/****************************************************************************
* This software is part of the gCube Project.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: GHNManager.java
****************************************************************************
* @author <a href="mailto:daniele.strollo@isti.cnr.it">Daniele Strollo</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.managers.resources;
import java.io.StringReader;
import org.apache.axis.message.addressing.Address;
import org.apache.axis.message.addressing.EndpointReferenceType;
import org.gcube.common.core.contexts.GCUBERemotePortTypeContext;
import org.gcube.common.core.contexts.GHNContext;
import org.gcube.common.core.resources.GCUBEHostingNode;
import org.gcube.common.core.resources.GCUBEResource;
import org.gcube.common.core.scope.GCUBEScope;
import org.gcube.common.vremanagement.ghnmanager.stubs.AddScopeInputParams;
import org.gcube.common.vremanagement.ghnmanager.stubs.GHNManagerPortType;
import org.gcube.common.vremanagement.ghnmanager.stubs.ShutdownOptions;
import org.gcube.common.vremanagement.ghnmanager.stubs.service.GHNManagerServiceAddressingLocator;
import org.gcube.resourcemanagement.support.exceptions.AbstractResourceException;
import org.gcube.resourcemanagement.support.exceptions.ResourceAccessException;
import org.gcube.resourcemanagement.support.exceptions.ResourceOperationException;
import org.gcube.resourcemanagement.support.exceptions.ResourceParameterException;
import org.gcube.resourcemanagement.support.types.AllowedResourceTypes;
import org.gcube.resourcemanagement.support.utils.Assertion;
import org.gcube.resourcemanagement.support.utils.ServerConsole;
/**
* @author Daniele Strollo (ISTI-CNR)
*
*/
public class GHNManager extends AbstractResourceManager {
private static final String LOG_PREFIX = "[GHN-MGR]";
/**
* @deprecated discouraged use. With no ID some operations cannot be accessed.
*/
public GHNManager()
throws ResourceParameterException, ResourceAccessException {
super(AllowedResourceTypes.GHN);
}
/**
* @param id the identifier of wrapper resource.
* @throws ResourceParameterException
* @throws ResourceAccessException
*/
public GHNManager(final String id)
throws ResourceParameterException, ResourceAccessException {
super(id, AllowedResourceTypes.GHN);
}
/**
* @param id
* @param name
* @throws ResourceParameterException
* @throws ResourceAccessException
*/
public GHNManager(final String id, final String name)
throws ResourceParameterException, ResourceAccessException {
super(id, name, AllowedResourceTypes.GHN);
}
/**
* @param id
* @param name
* @param subtype
* @throws ResourceParameterException
* @throws ResourceAccessException
*/
public GHNManager(final String id, final String name, final String subtype)
throws ResourceParameterException, ResourceAccessException {
super(id, name, AllowedResourceTypes.GHN, subtype);
}
/**
* Add a scope to a gHN and the related Service Map that is not available on the gHN.
* <p>
* <b>Required information:</b>
* <br/>
* The <i>ID</i> of the resource must be specified and valid.</p>
* @param scope
* @param scopeMap
* @return the generated reportID
* @throws ResourceParameterException
* @throws ResourceOperationException
*/
public final String addToNewScope(
final GCUBEScope sourceScope,
final GCUBEScope targetScope,
final String scopeMap)
throws AbstractResourceException {
Assertion<AbstractResourceException> checker = new Assertion<AbstractResourceException>();
checker.validate(sourceScope != null, new ResourceParameterException("Parameter sourceScope null not allowed."));
checker.validate(targetScope != null, new ResourceParameterException("Parameter targetScope null not allowed."));
checker.validate(scopeMap != null && scopeMap.trim().length() > 0, new ResourceParameterException("Invalid scopeMap parameter."));
checker.validate(this.getID() != null, new ResourceOperationException("This operation cannot be applied to resources with no ID."));
if (!targetScope.isEnclosedIn(sourceScope)) {
throw new ResourceOperationException(
"You are not allowed to apply to this scope. Target scope is not enclosed in the source one.");
}
ServerConsole.trace(
LOG_PREFIX,
"Adding from scope " +
sourceScope.toString() +
"Adding to existing scope " +
targetScope.toString() +
" " + this.getType() + " " + this.getID());
AddScopeInputParams params = new AddScopeInputParams();
params.setScope(sourceScope.toString());
params.setMap(scopeMap.trim()); //eventually, set here the new Service Map
try {
this.getGHNManager(sourceScope).addScope(params);
} catch (Exception e) {
throw new ResourceOperationException(
"Failed to add the new scope to the gHN " + this.getID() + ": " + e.getMessage());
}
return this.addToExistingScope(sourceScope, targetScope);
}
/**
* <p>
* <b>Required information:</b>
* <br/>
* The <i>name</i> of the resource must be specified and valid. It is used to retrieve the GHN manager URL.</p>
* @param scope the scope in which the manager is bound.
* @return
* @throws AbstractResourceException
*/
public final GHNManagerPortType getGHNManager(final GCUBEScope scope)
throws AbstractResourceException {
Assertion<AbstractResourceException> checker = new Assertion<AbstractResourceException>();
checker.validate(scope != null, new ResourceParameterException("Invalid scope"));
checker.validate(this.getName() != null, new ResourceOperationException("This operation cannot be applied to resources with no name."));
EndpointReferenceType endpoint = new EndpointReferenceType();
try {
endpoint.setAddress(new Address("http://" + this.getName() + "/wsrf/services/gcube/common/vremanagement/GHNManager"));
GHNManagerServiceAddressingLocator locator = new GHNManagerServiceAddressingLocator();
GHNManagerPortType pt = locator.getGHNManagerPortTypePort(endpoint);
pt = GCUBERemotePortTypeContext.getProxy(pt, scope, this.getSecurityManager());
return pt;
} catch (Exception e) {
throw new ResourceAccessException(e.getMessage());
}
}
/**
* Implements all the three possible shutdown policies according to
* restart and clean parameters.
* <p>
* <b>Required information:</b>
* <br/>
* The <i>ID</i> of the resource must be specified and valid.</p>
* @param scope
* @param restart
* @param clean
* @throws ResourceOperationException
* @throws ResourceAccessException
* @throws ResourceParameterException
*/
public final void shutDown(final GCUBEScope scope, final boolean restart, final boolean clean)
throws AbstractResourceException {
Assertion<ResourceAccessException> checker = new Assertion<ResourceAccessException>();
checker.validate(this.getID() != null, new ResourceAccessException("This operation cannot be applied to resources with no ID."));
GHNManagerPortType ghnManager = this.getGHNManager(scope);
ServerConsole.trace(LOG_PREFIX, "Shutting down " + scope.toString() + " " + this.getType() + " " + this.getID());
ShutdownOptions options = new ShutdownOptions();
options.setRestart(restart);
options.setClean(clean);
try {
ghnManager.shutdown(options);
} catch (Exception e) {
throw new ResourceOperationException("Cannot shutdown ghn: " + this.getID());
}
}
@Override
protected final GCUBEResource buildGCUBEResource(final String xmlRepresentation)
throws AbstractResourceException {
try {
GCUBEHostingNode impl = GHNContext.getImplementation(GCUBEHostingNode.class);
impl.load(new StringReader(xmlRepresentation));
return impl;
} catch (Exception e) {
throw new ResourceAccessException("Cannot load the stub for resource " + this.getType(), e);
}
}
}

@ -0,0 +1,203 @@
/****************************************************************************
* This software is part of the gCube Project.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: GenericResourceManager.java
****************************************************************************
* @author <a href="mailto:daniele.strollo@isti.cnr.it">Daniele Strollo</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.managers.resources;
import java.io.StringReader;
import org.gcube.common.core.contexts.GHNContext;
import org.gcube.common.core.informationsystem.publisher.ISPublisher;
import org.gcube.common.core.resources.GCUBEGenericResource;
import org.gcube.common.core.resources.GCUBEResource;
import org.gcube.common.core.scope.GCUBEScope;
import org.gcube.resourcemanagement.support.exceptions.AbstractResourceException;
import org.gcube.resourcemanagement.support.exceptions.ResourceAccessException;
import org.gcube.resourcemanagement.support.exceptions.ResourceOperationException;
import org.gcube.resourcemanagement.support.exceptions.ResourceParameterException;
import org.gcube.resourcemanagement.support.managers.scope.ScopeManager;
import org.gcube.resourcemanagement.support.types.AllowedResourceTypes;
import org.gcube.resourcemanagement.support.utils.Assertion;
import org.gcube.resourcemanagement.support.utils.ServerConsole;
import org.w3c.dom.Document;
/**
* @author Daniele Strollo (ISTI-CNR)
*
*/
public class GenericResourceManager extends AbstractResourceManager {
// Used internally to require static functionalities (e.g. deploy).
private static GenericResourceManager singleton = null;
private static final String LOG_PREFIX = "[GenericResource-MGR]";
static {
if (GenericResourceManager.singleton == null) {
try {
GenericResourceManager.singleton = new GenericResourceManager("dummyservice", "dummyservice");
} catch (Exception e) {
ServerConsole.error(LOG_PREFIX, e);
}
}
}
/**
* @deprecated discouraged use. With no ID some operations cannot be accessed.
*/
public GenericResourceManager()
throws ResourceParameterException,
ResourceAccessException {
super(AllowedResourceTypes.GenericResource);
}
public GenericResourceManager(final String id)
throws ResourceParameterException,
ResourceAccessException {
super(id, AllowedResourceTypes.GenericResource);
}
/**
* @param id
* @param name
* @param type
* @throws ResourceParameterException
* @throws ResourceAccessException
*/
public GenericResourceManager(final String id, final String name)
throws ResourceParameterException,
ResourceAccessException {
super(id, name, AllowedResourceTypes.GenericResource);
}
/**
* @param id
* @param name
* @param type
* @param subtype
* @throws ResourceParameterException
* @throws ResourceAccessException
*/
public GenericResourceManager(final String id, final String name, final String subtype)
throws ResourceParameterException, ResourceAccessException {
super(id, name, AllowedResourceTypes.GenericResource, subtype);
}
/**
* Updates the resource.
* @param name (Mandatory) the name to assign to the resource
* @param description (optional) if null it will not be changed
* @param body (optional) if null it will not be changed
* @param subType (optional) if null it will not be changed
* @param scope (optional) if null it will not be changed
* @throws AbstractResourceException
*/
public final void update(
final String name,
final String description,
final String body,
final String subType,
final GCUBEScope scope)
throws AbstractResourceException {
Assertion<AbstractResourceException> checker = new Assertion<AbstractResourceException>();
checker.validate(name != null && name.trim().length() != 0, new ResourceParameterException("Invalid field name. Null or empty value not allowed"));
ServerConsole.trace(LOG_PREFIX, "[RES-UPDATE] updating resource " + this.getType() + " " + this.getID());
GCUBEGenericResource res = (GCUBEGenericResource) this.getGCUBEResource(scope);
res.setName(name.trim());
if (description != null) {
res.setDescription(description.trim());
}
if (body != null) {
res.setBody(body.trim());
}
if (subType != null) {
res.setSecondaryType(subType.trim());
}
try {
this.getISPublisher().updateGCUBEResource(res, scope, this.getSecurityManager());
/* FIXME old release
* List<GCUBEScope> boundedScopes = this.validateScopes(res.getScopes().values().toArray(new GCUBEScope[]{}));
for (GCUBEScope _scope : boundedScopes) {
ServerConsole.trace(LOG_PREFIX, "[RES-UPDATE] ISPublisher updating resource " + this.getType() + " " + this.getID() + " in scope: [" + _scope + "]");
this.getISPublisher().updateGCUBEResource(res, _scope, this.getSecurityManager());
}
*/
} catch (Exception e) {
throw new ResourceOperationException(e.getMessage());
}
}
/**
* Creates a Generic Resource and returns the ID given by the
* resource manager at creation phase.
* @return the id assigned to the newly created resource
*/
public static final synchronized String create(
final String ID,
final GCUBEScope scope,
final String name,
final String description,
final String body,
final String subType)
throws Exception {
Assertion<AbstractResourceException> checker = new Assertion<AbstractResourceException>();
checker.validate(name != null && name.trim().length() != 0, new ResourceParameterException("Invalid field name. Null or empty value not allowed"));
checker.validate(subType != null && subType.trim().length() != 0, new ResourceParameterException("Invalid field subType. Null or empty value not allowed"));
GCUBEGenericResource resource = GHNContext.getImplementation(GCUBEGenericResource.class);
if (ID != null) {
resource.setID(ID);
}
resource.setName(name.trim());
if (description != null) {
resource.setDescription(description.trim());
}
if (body != null) {
resource.setBody(body.trim());
}
resource.setSecondaryType(subType.trim());
resource.addScope(scope);
GenericResourceManager gm = new GenericResourceManager();
ISPublisher publisher = gm.getISPublisher();
String retval = publisher.registerGCUBEResource(resource, scope, gm.getSecurityManager());
if (retval == null || retval.length() == 0) {
throw new Exception("The GenericResource has not been created");
}
Document doc = ScopeManager.getDocumentGivenXML(retval);
String id = doc.getElementsByTagName("ID").item(0).getFirstChild().getNodeValue();
ServerConsole.info(LOG_PREFIX, "Resource Created with ID: " + id);
return id;
}
@Override
protected final GCUBEResource buildGCUBEResource(
final String xmlRepresentation) throws AbstractResourceException {
try {
GCUBEGenericResource impl = GHNContext.getImplementation(GCUBEGenericResource.class);
impl.load(new StringReader(xmlRepresentation));
return impl;
} catch (Exception e) {
throw new ResourceAccessException("Cannot load the stub for resource " + this.getType(), e);
}
}
}

@ -0,0 +1,340 @@
/****************************************************************************
* This software is part of the gCube Project.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: ManagementUtils.java
****************************************************************************
* @author <a href="mailto:daniele.strollo@isti.cnr.it">Daniele Strollo</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.managers.resources;
import java.io.File;
import java.rmi.RemoteException;
import java.util.List;
import java.util.Vector;
import org.gcube.common.core.faults.GCUBEFault;
import org.gcube.common.core.informationsystem.client.AtomicCondition;
import org.gcube.common.core.informationsystem.client.queries.GCUBEServiceQuery;
import org.gcube.common.core.resources.GCUBEResource;
import org.gcube.common.core.resources.GCUBEService;
import org.gcube.common.core.scope.GCUBEScope;
import org.gcube.common.core.scope.GCUBEScope.Type;
import org.gcube.resourcemanagement.support.exceptions.AbstractResourceException;
import org.gcube.resourcemanagement.support.exceptions.ResourceAccessException;
import org.gcube.resourcemanagement.support.exceptions.ResourceOperationException;
import org.gcube.resourcemanagement.support.exceptions.ResourceParameterException;
import org.gcube.resourcemanagement.support.managers.scope.ScopeManager;
import org.gcube.resourcemanagement.support.types.AllowedResourceTypes;
import org.gcube.resourcemanagement.support.utils.Assertion;
import org.gcube.resourcemanagement.support.utils.ServerConsole;
import org.gcube.vremanagement.resourcemanager.stubs.binder.AddResourcesParameters;
import org.gcube.vremanagement.resourcemanager.stubs.binder.PackageItem;
import org.gcube.vremanagement.resourcemanager.stubs.binder.ResourceBinderPortType;
import org.gcube.vremanagement.resourcemanager.stubs.binder.ResourceItem;
import org.gcube.vremanagement.resourcemanager.stubs.binder.ResourceList;
import org.gcube.vremanagement.resourcemanager.stubs.binder.SoftwareList;
/**
* A support class containing operations to manage multiple resources.
* Here are provided the functionalities to delete/addToScope/deploy
* groups of homogeneous resources.
* @author Daniele Strollo (ISTI-CNR)
*/
public class ManagementUtils {
private static final String LOG_PREFIX = "[MANAGEMENT-UTILS]";
/**
* Applies the add to scope to multiple resources having the same type.
* @param type
* @param resources
* @param sourceScope
* @param targetScope
* @return the generated report ID
*/
public static final synchronized String addToExistingScope(
final AllowedResourceTypes type,
final String[] resourceIDs,
final GCUBEScope sourceScope,
final GCUBEScope targetScope)
throws Exception {
ServerConsole.trace(
LOG_PREFIX,
"[ADD-ToExistingScope] Adding from scope [" +
sourceScope.toString() +
"] to existing scope [" +
targetScope.toString() +
"] resources having type " + type.name());
// 1 - If not RI or GHN and the scopes are sibling and VO copyFromToVO
if (!(type == AllowedResourceTypes.GHN) &&
!(type == AllowedResourceTypes.RunningInstance) &&
sourceScope.getType() == Type.VO && targetScope.getType() == Type.VO) {
// Phase 1. retrieve the resource to copy
//GCUBEResource resStub = this.getGCUBEResource(sourceScope);
// Phase 2. Before to register the resource, the scope must be
// bound to the local GCUBEResource
String retval = bindToScope(type, resourceIDs, targetScope);
// Phase 3. Register to the new VO through the ISPublisher
// applies a copy of old descriptors bound in other scopes.
try {
for (String id : resourceIDs) {
AbstractResourceManager res = ResourceFactory.createResourceManager(type, id);
GCUBEResource resStub = res.getGCUBEResource(sourceScope);
res.getISPublisher().registerGCUBEResource(resStub, targetScope, res.getSecurityManager());
}
} catch (Exception e) {
throw new ResourceAccessException(e.getMessage());
}
return retval;
}
// Add a gCube Resource to
// (i) a VRE scope from the parent VO or
// (ii) a VO scope from the infrastructure scope
if (!targetScope.isEnclosedIn(sourceScope)) {
throw new ResourceOperationException(
"You are not allowed to apply to this scope. Target scope is not enclosed in the source one.");
}
// 2 - Applies the normal scope binding
return bindToScope(type, resourceIDs, targetScope);
}
/**
* Applies the add to scope to multiple resources having the same type.
* @param type
* @param resources
* @param sourceScope
* @param targetScope
* @return the generated report ID
*/
public static final synchronized String removeFromExistingScope(final AllowedResourceTypes type, final String[] resourceIDs,
final GCUBEScope sourceScope, final GCUBEScope targetScope) throws Exception {
ServerConsole.trace(
LOG_PREFIX,
"[REMOVE-FromExistingScope] Removing scope [" +
sourceScope.toString() +
"] to existing scope [" +
targetScope.toString() +
"] resources having type " + type.name());
// cannot remove a Scope if its the same
if (targetScope.toString().compareTo(sourceScope.toString()) == 0) {
return "You are not allowed to remove this scope. Current and Target scope are the same.";
}
AbstractResourceManager resource = ResourceFactory.createResourceManager(type);
for (String id : resourceIDs) {
try {
resource.setID(id);
resource.delete(targetScope);
} catch (AbstractResourceException e) {
ServerConsole.error(LOG_PREFIX, e);
}
}
return "ACK";
}
/**
*
* @param type
* @param resourceIDs
* @param targetScope
* @return the ID of generated report
* @throws AbstractResourceException
*/
private static synchronized String bindToScope(
final AllowedResourceTypes type,
final String[] resourceIDs,
final GCUBEScope targetScope)
throws AbstractResourceException {
AddResourcesParameters addParam = new AddResourcesParameters();
ResourceBinderPortType manager = ResourceFactory.createResourceManager(type).getResourceManager(targetScope);
List<ResourceItem> resToBind = new Vector<ResourceItem>();
for (String id : resourceIDs) {
ResourceItem toAdd = new ResourceItem();
toAdd.setID(id);
toAdd.setType(type.name());
resToBind.add(toAdd);
}
ResourceList r = new ResourceList();
r.setResource(resToBind.toArray(new ResourceItem[]{}));
addParam.setResources(r);
addParam.setTargetScope(targetScope.toString());
try {
String reportID = manager.addResources(addParam);
ServerConsole.trace(
LOG_PREFIX,
"[BIND-SCOPE-EXIT] Applyed Adding of resources " + type.name() + " to scope [" +
targetScope.toString() + "]... reportID: " + reportID);
return reportID;
} catch (Exception e) {
ServerConsole.trace(
LOG_PREFIX,
"[BIND-SCOPE-EXIT] [FAILURE]");
throw new ResourceOperationException("During resource::addToScope: " + e.getMessage());
}
}
public static synchronized void delete(
final AllowedResourceTypes type,
final String[] resourceIDs,
final GCUBEScope scope)
throws AbstractResourceException {
AbstractResourceManager resource = ResourceFactory.createResourceManager(type);
for (String id : resourceIDs) {
try {
resource.setID(id);
resource.delete(scope);
} catch (AbstractResourceException e) {
ServerConsole.error(LOG_PREFIX, e);
}
}
}
/**
* Makes the deployment of software on a list of ghns.
* @param ghnsID
* @param servicesID
* @return the generated report ID
* @throws Exception
*/
public static final synchronized String deploy(
final GCUBEScope scope,
final String[] ghnsID,
final String[] servicesID)
throws Exception {
Assertion<Exception> checker = new Assertion<Exception>();
checker.validate(ghnsID != null && ghnsID.length != 0, new ResourceParameterException("Invalid ghnsID parameter. It cannot be null or empty."));
checker.validate(servicesID != null && servicesID.length != 0, new ResourceParameterException("Invalid servicesID parameter. It cannot be null or empty."));
checker.validate(scope != null, new Exception("Cannot retrieve the scope."));
AbstractResourceManager resource = ResourceFactory.createResourceManager(AllowedResourceTypes.Service);
ResourceBinderPortType manager = ResourceFactory.createResourceManager(AllowedResourceTypes.Service).getResourceManager(scope);
System.out.println("\n\n**** These are the service ids to deploy on SCOPE " + scope);
for (String sid : servicesID) {
System.out.println(sid);
}
System.out.println("\n\n**** These are the gHNs ids to deploy on SCOPE " + scope);
for (String ghn : ghnsID) {
System.out.println(ghn);
}
List<PackageItem> serviceProfiles = new Vector<PackageItem>();
// Retrieves the profiles of services
final GCUBEServiceQuery query = resource.getISClient().getQuery(GCUBEServiceQuery.class);
prepareServices: for (String serviceID : servicesID) {
System.out.println("\n\n**** Query the IsClient to get the profile");
query.clearConditions();
query.addAtomicConditions(new AtomicCondition("/ID", serviceID));
System.out.println("**** Query : " + query.getExpression());
List<GCUBEService> results = resource.getISClient().execute(query, scope);
System.out.println("**** results received : " + results.size());
GCUBEService ret = null;
if (results != null && results.size() > 0) {
ret = results.get(0);
} else {
continue prepareServices;
}
if (ret == null ||
ret.getServiceClass() == null ||
ret.getServiceName() == null ||
ret.getVersion() == null) {
ServerConsole.error(LOG_PREFIX, "found an invalid service profile");
continue;
}
PackageItem toAdd = new PackageItem();
toAdd.setServiceClass(ret.getServiceClass());
toAdd.setServiceName(ret.getServiceName());
toAdd.setServiceVersion(ret.getVersion());
if (ret.getPackages().size() == 1) {
toAdd.setPackageName(ret.getPackages().get(0).getName());
toAdd.setPackageVersion(ret.getPackages().get(0).getVersion());
} else {
for (org.gcube.common.core.resources.service.Package p : ret.getPackages()) {
if (p.getClass().isAssignableFrom(org.gcube.common.core.resources.service.MainPackage.class)) {
toAdd.setPackageName(p.getName());
toAdd.setPackageVersion(p.getVersion());
break;
}
}
}
serviceProfiles.add(toAdd);
}
SoftwareList serviceList = new SoftwareList();
serviceList.setSuggestedTargetGHNNames(ghnsID);
serviceList.setSoftware(serviceProfiles.toArray(new PackageItem[0]));
AddResourcesParameters addResourcesParameters = new AddResourcesParameters();
addResourcesParameters.setSoftware(serviceList);
addResourcesParameters.setTargetScope(scope.toString());
System.out.println("\n\n**** These is the ServiceList i pass to ResourceManagerPortType: ");
for (int i = 0; i < serviceList.getSoftware().length; i++) {
System.out.println(serviceList.getSoftware()[i]);
}
String id = "";
try {
id = manager.addResources(addResourcesParameters);
ServerConsole.debug(LOG_PREFIX, "Report ID = " + id);
} catch (GCUBEFault e) {
ServerConsole.error(LOG_PREFIX, "during deployment.", e);
throw e;
} catch (RemoteException e) {
ServerConsole.error(LOG_PREFIX, "during deployment.", e);
throw e;
}
System.out.println("Returning.... no exceptions");
return id;
}
public static final void main(final String[] args) {
List<String> ids = new Vector<String>();
ids.add(null);
ids.add("id2");
ids.add(null);
ScopeManager.setScopeConfigFile("test-suite" + File.separator + "scopes" + File.separator + "scopedata.xml");
try {
ManagementUtils.delete(AllowedResourceTypes.GenericResource,
new String[]{
"3f7384a0-d51c-11df-80cc-ece35605c26c",
"975419b0-d2e1-11df-b0ed-f8e6e669b8ad",
null,
"test"
},
ScopeManager.getScope("/gcube/devsec/devVRE"));
} catch (Exception e) {
ServerConsole.error(LOG_PREFIX, e);
}
}
}

@ -0,0 +1,71 @@
/****************************************************************************
* This software is part of the gCube Project.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: ResourceFactory.java
****************************************************************************
* @author <a href="mailto:daniele.strollo@isti.cnr.it">Daniele Strollo</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.managers.resources;
import org.gcube.resourcemanagement.support.exceptions.ResourceOperationException;
import org.gcube.resourcemanagement.support.types.AllowedResourceTypes;
import org.gcube.resourcemanagement.support.utils.ServerConsole;
/**
* For lazy developers here given the facilities to instantiate the proper
* resource manager of a resource given its identifier and type.
* @author Daniele Strollo (ISTI-CNR)
*/
public class ResourceFactory {
private static final String LOG_PREFIX = "[RES-MGR-FACTORY]";
public static final AbstractResourceManager createResourceManager(final AllowedResourceTypes type)
throws ResourceOperationException {
return createResourceManager(type, null);
}
/**
*
* @param type
* @param id if null the default constructor (empty params) will be used
* @return
* @throws ResourceOperationException
*/
public static final AbstractResourceManager createResourceManager(final AllowedResourceTypes type, final String id)
throws ResourceOperationException {
ServerConsole.info(LOG_PREFIX, "ResourceFactory building the " + type.name() + "Manager");
String classToLoad =
// It is supposed that the other classes are in this package
ResourceFactory.class.getPackage().getName() + "."
+ type.name() + "Manager";
try {
if (id == null) {
return (AbstractResourceManager) Class.forName(classToLoad).newInstance();
}
return (AbstractResourceManager) Class.forName(classToLoad).getConstructor(String.class).newInstance(id);
} catch (Exception e) {
throw new ResourceOperationException(e);
}
}
public static final void main(final String[] args) throws Exception {
for (AllowedResourceTypes res : AllowedResourceTypes.values()) {
try {
ServerConsole.info(LOG_PREFIX,
"Loaded " + res.name() + " with ID: " +
ResourceFactory.createResourceManager(res, "HelloID").getID());
} catch (Exception e) {
ServerConsole.error(LOG_PREFIX, "[ERR] Failed to load: " + res.name());
}
}
}
}

@ -0,0 +1,215 @@
/****************************************************************************
* This software is part of the gCube Project.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: RunningInstanceManager.java
****************************************************************************
* @author <a href="mailto:daniele.strollo@isti.cnr.it">Daniele Strollo</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.managers.resources;
import java.io.StringReader;
import java.util.List;
import java.util.Vector;
import org.gcube.common.core.contexts.GHNContext;
import org.gcube.common.core.informationsystem.client.AtomicCondition;
import org.gcube.common.core.informationsystem.client.queries.GCUBEServiceQuery;
import org.gcube.common.core.resources.GCUBEResource;
import org.gcube.common.core.resources.GCUBERunningInstance;
import org.gcube.common.core.resources.GCUBEService;
import org.gcube.common.core.scope.GCUBEScope;
import org.gcube.resourcemanagement.support.exceptions.AbstractResourceException;
import org.gcube.resourcemanagement.support.exceptions.ResourceAccessException;
import org.gcube.resourcemanagement.support.exceptions.ResourceOperationException;
import org.gcube.resourcemanagement.support.exceptions.ResourceParameterException;
import org.gcube.resourcemanagement.support.types.AllowedResourceTypes;
import org.gcube.resourcemanagement.support.utils.Assertion;
import org.gcube.resourcemanagement.support.utils.ServerConsole;
import org.gcube.vremanagement.resourcemanager.stubs.binder.AddResourcesParameters;
import org.gcube.vremanagement.resourcemanager.stubs.binder.PackageItem;
import org.gcube.vremanagement.resourcemanager.stubs.binder.RemoveResourcesParameters;
import org.gcube.vremanagement.resourcemanager.stubs.binder.ResourceBinderPortType;
import org.gcube.vremanagement.resourcemanager.stubs.binder.ResourceItem;
import org.gcube.vremanagement.resourcemanager.stubs.binder.ResourceList;
import org.gcube.vremanagement.resourcemanager.stubs.binder.SoftwareList;
import org.gcube.vremanagement.resourcemanager.stubs.reporting.ReportingPortType;
/**
* @author Daniele Strollo (ISTI-CNR)
*
*/
public class RunningInstanceManager extends AbstractResourceManager {
// Used internally to require static functionalities (e.g. deploy).
private static final String LOG_PREFIX = "[RI-MGR]";
/**
* @deprecated discouraged use. With no ID some operations cannot be accessed.
*/
public RunningInstanceManager()
throws ResourceParameterException, ResourceAccessException {
super(AllowedResourceTypes.RunningInstance);
}
public RunningInstanceManager(final String id)
throws ResourceParameterException, ResourceAccessException {
super(id, AllowedResourceTypes.RunningInstance);
}
public RunningInstanceManager(final String id, final String name)
throws ResourceParameterException, ResourceAccessException {
super(id, name, AllowedResourceTypes.RunningInstance);
}
public RunningInstanceManager(final String id, final String name, final String subType)
throws ResourceParameterException, ResourceAccessException {
super(id, name, AllowedResourceTypes.RunningInstance, subType);
}
public final String deploy(
final GCUBEScope scope, final String[] ghnsID, final String[] servicesID)
throws ResourceParameterException, ResourceOperationException {
Assertion<ResourceParameterException> checker = new Assertion<ResourceParameterException>();
checker.validate(servicesID != null && servicesID.length != 0,
new ResourceParameterException("Invalid servicesID parameter. It cannot be null or empty."));
checker.validate(scope != null,
new ResourceParameterException("Cannot retrieve the scope."));
List<PackageItem> serviceProfiles = new Vector<PackageItem>();
try {
// Retrieves the profiles of services
final GCUBEServiceQuery query = this.getISClient().getQuery(GCUBEServiceQuery.class);
prepareServices: for (String serviceID : servicesID) {
query.addAtomicConditions(new AtomicCondition("/ID", serviceID));
List<GCUBEService> results = this.getISClient().execute(query, scope);
GCUBEService ret = null;
if (results != null && results.size() > 0) {
ret = results.get(0);
} else {
continue prepareServices;
}
if (ret == null ||
ret.getServiceClass() == null ||
ret.getServiceName() == null ||
ret.getVersion() == null) {
ServerConsole.error(LOG_PREFIX, "found an invalid service profile");
continue;
}
PackageItem toAdd = new PackageItem();
toAdd.setServiceClass(ret.getServiceClass());
toAdd.setServiceName(ret.getServiceName());
toAdd.setServiceVersion(ret.getVersion());
if (ret.getPackages().size() == 1) {
toAdd.setPackageName(ret.getPackages().get(0).getName());
toAdd.setPackageVersion(ret.getPackages().get(0).getVersion());
} else {
for (org.gcube.common.core.resources.service.Package p : ret.getPackages()) {
if (p.getClass().isAssignableFrom(org.gcube.common.core.resources.service.MainPackage.class)) {
toAdd.setPackageName(p.getName());
toAdd.setPackageVersion(p.getVersion());
break;
}
}
}
serviceProfiles.add(toAdd);
}
SoftwareList serviceList = new SoftwareList();
// The GHNs are optional, suggested gHNs to use.
if (ghnsID != null && ghnsID.length > 0) {
serviceList.setSuggestedTargetGHNNames(ghnsID);
}
serviceList.setSoftware(serviceProfiles.toArray(new PackageItem[0]));
AddResourcesParameters addResourcesParameters = new AddResourcesParameters();
addResourcesParameters.setSoftware(serviceList);
addResourcesParameters.setTargetScope(scope.toString());
String reportID = this.getResourceManager(scope).addResources(addResourcesParameters);
ServerConsole.debug(LOG_PREFIX, "Report ID = " + reportID);
return reportID;
} catch (Exception e) {
ServerConsole.error(LOG_PREFIX, "Error during deployment.", e);
throw new ResourceOperationException("Software deployment failure: " + e.getMessage());
}
}
public final String undeploy(
final GCUBEScope scope)
throws AbstractResourceException {
Assertion<AbstractResourceException> checker = new Assertion<AbstractResourceException>();
checker.validate(scope != null,
new ResourceParameterException("Cannot retrieve the scope."));
checker.validate(this.getID() != null,
new ResourceOperationException("Invalid ID."));
try {
ResourceBinderPortType rm = this.getResourceManager(scope);
//prepare the parameters
RemoveResourcesParameters params = new RemoveResourcesParameters();
ResourceItem[] resourcelist = new ResourceItem[1];
resourcelist[0] = new ResourceItem();
resourcelist[0].setID(this.getID());
resourcelist[0].setType(this.getType().name());
ResourceList r = new ResourceList();
r.setResource(resourcelist);
params.setResources(r);
params.setTargetScope(scope.toString());
//sending the request
ServerConsole.info(LOG_PREFIX, "Sending the Remove Resource request....");
String reportID = rm.removeResources(params);
ServerConsole.info(LOG_PREFIX, "Returned report ID: " + reportID);
return reportID;
} catch (Exception e) {
ServerConsole.error(LOG_PREFIX, "Error during deployment.", e);
throw new ResourceOperationException("Software deployment failure: " + e.getMessage());
}
}
public final String checkDeployStatus(final GCUBEScope scope, final String deployID)
throws AbstractResourceException {
Assertion<ResourceParameterException> checker = new Assertion<ResourceParameterException>();
checker.validate(scope != null,
new ResourceParameterException("Invalid scope passed"));
checker.validate(deployID != null && deployID.trim().length() > 0,
new ResourceParameterException("Invalid reportID passed"));
ReportingPortType vreManagerPortType = this.getReportResourceManager(scope);
try {
return vreManagerPortType.getReport(deployID);
} catch (Exception e) {
ServerConsole.error(LOG_PREFIX, e);
throw new ResourceOperationException("Cannot retrieve the report: " + deployID + " " + e.getMessage());
}
}
@Override
protected final GCUBEResource buildGCUBEResource(final String xmlRepresentation)
throws AbstractResourceException {
try {
GCUBERunningInstance impl = GHNContext.getImplementation(GCUBERunningInstance.class);
impl.load(new StringReader(xmlRepresentation));
return impl;
} catch (Exception e) {
throw new ResourceAccessException("Cannot load the stub for resource " + this.getType(), e);
}
}
}

@ -0,0 +1,109 @@
/****************************************************************************
* This software is part of the gCube Project.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: RuntimeResourceManager.java
****************************************************************************
* @author <a href="mailto:assante@isti.cnr.it">Massimiliano Assante</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.managers.resources;
import java.io.StringReader;
import org.gcube.common.core.contexts.GHNContext;
import org.gcube.common.core.resources.GCUBEResource;
import org.gcube.common.core.resources.GCUBERuntimeResource;
import org.gcube.common.core.scope.GCUBEScope;
import org.gcube.resourcemanagement.support.exceptions.AbstractResourceException;
import org.gcube.resourcemanagement.support.exceptions.ResourceAccessException;
import org.gcube.resourcemanagement.support.exceptions.ResourceOperationException;
import org.gcube.resourcemanagement.support.exceptions.ResourceParameterException;
import org.gcube.resourcemanagement.support.types.AllowedResourceTypes;
import org.gcube.resourcemanagement.support.utils.Assertion;
import org.gcube.resourcemanagement.support.utils.ServerConsole;
import org.gcube.vremanagement.resourcemanager.stubs.binder.ResourceBinderPortType;
import org.gcube.vremanagement.resourcemanager.stubs.reporting.ReportingPortType;
/**
* @author Massimiliano Assante (ISTI-CNR)
*
*/
public class RuntimeResourceManager extends AbstractResourceManager {
// Used internally to RuntimeResourceManager static functionalities (e.g. deploy).
private static RuntimeResourceManager singleton = null;
private static final String LOG_PREFIX = "[RR-MGR]";
static {
if (RuntimeResourceManager.singleton == null) {
try {
RuntimeResourceManager.singleton = new RuntimeResourceManager("dummyservice", "dummyservice");
} catch (Exception e) {
ServerConsole.error(LOG_PREFIX, e);
}
}
}
/**
* @deprecated discouraged use. With no ID some operations cannot be accessed.
*/
public RuntimeResourceManager()
throws ResourceParameterException, ResourceAccessException {
super(AllowedResourceTypes.RuntimeResource);
}
public RuntimeResourceManager(final String id)
throws ResourceParameterException, ResourceAccessException {
super(id, AllowedResourceTypes.RuntimeResource);
}
public RuntimeResourceManager(final String id, final String name)
throws ResourceParameterException, ResourceAccessException {
super(id, name, AllowedResourceTypes.RuntimeResource);
}
public RuntimeResourceManager(final String id, final String name, final String subType)
throws ResourceParameterException, ResourceAccessException {
super(id, name, AllowedResourceTypes.RuntimeResource, subType);
}
public final String checkDeployStatus(final GCUBEScope scope, final String deployID)
throws AbstractResourceException {
Assertion<ResourceParameterException> checker = new Assertion<ResourceParameterException>();
checker.validate(scope != null,
new ResourceParameterException("Invalid scope passed"));
checker.validate(deployID != null && deployID.trim().length() > 0,
new ResourceParameterException("Invalid reportID passed"));
ReportingPortType vreManagerPortType = this.getReportResourceManager(scope);
try {
return vreManagerPortType.getReport(deployID);
} catch (Exception e) {
ServerConsole.error(LOG_PREFIX, e);
throw new ResourceOperationException("Cannot retrieve the report: " + deployID + " " + e.getMessage());
}
}
@Override
protected final GCUBEResource buildGCUBEResource(final String xmlRepresentation)
throws AbstractResourceException {
try {
GCUBERuntimeResource impl = GHNContext.getImplementation(GCUBERuntimeResource.class);
impl.load(new StringReader(xmlRepresentation));
return impl;
} catch (Exception e) {
throw new ResourceAccessException("Cannot load the stub for resource " + this.getType(), e);
}
}
}

@ -0,0 +1,83 @@
/****************************************************************************
* This software is part of the gCube Project.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: ServiceManager.java
****************************************************************************
* @author <a href="mailto:daniele.strollo@isti.cnr.it">Daniele Strollo</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.managers.resources;
import java.io.StringReader;
import org.gcube.common.core.contexts.GHNContext;
import org.gcube.common.core.resources.GCUBEResource;
import org.gcube.common.core.resources.GCUBEService;
import org.gcube.resourcemanagement.support.exceptions.AbstractResourceException;
import org.gcube.resourcemanagement.support.exceptions.ResourceAccessException;
import org.gcube.resourcemanagement.support.exceptions.ResourceParameterException;
import org.gcube.resourcemanagement.support.types.AllowedResourceTypes;
/**
* @author Daniele Strollo (ISTI-CNR)
*
*/
public class ServiceManager extends AbstractResourceManager {
/**
* @deprecated discouraged use. With no ID some operations cannot be accessed.
*/
public ServiceManager() throws ResourceParameterException, ResourceAccessException {
super(AllowedResourceTypes.Service);
}
public ServiceManager(final String id)
throws ResourceParameterException, ResourceAccessException {
super(id, AllowedResourceTypes.Service);
}
/**
* @param id
* @param name
* @param type
* @throws ResourceParameterException
* @throws ResourceAccessException
*/
public ServiceManager(final String id, final String name)
throws ResourceParameterException, ResourceAccessException {
super(id, name, AllowedResourceTypes.Service);
}
/**
* @param id
* @param name
* @param type
* @param subtype
* @throws ResourceParameterException
* @throws ResourceAccessException
*/
public ServiceManager(final String id, final String name, final String subtype)
throws ResourceParameterException,
ResourceAccessException {
super(id, name, AllowedResourceTypes.Service, subtype);
}
@Override
protected final GCUBEResource buildGCUBEResource(final String xmlRepresentation)
throws AbstractResourceException {
try {
GCUBEService impl = GHNContext.getImplementation(GCUBEService.class);
impl.load(new StringReader(xmlRepresentation));
return impl;
} catch (Exception e) {
throw new ResourceAccessException("Cannot load the stub for resource " + this.getType(), e);
}
}
}

@ -0,0 +1,86 @@
/****************************************************************************
* This software is part of the gCube System.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: MetadataCollectionManager.java
****************************************************************************
* @author <a href="mailto:daniele.strollo@isti.cnr.it">Daniele Strollo</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.managers.resources;
import java.io.StringReader;
import org.gcube.common.core.contexts.GHNContext;
import org.gcube.common.core.resources.GCUBEMCollection;
import org.gcube.common.core.resources.GCUBEResource;
import org.gcube.resourcemanagement.support.exceptions.AbstractResourceException;
import org.gcube.resourcemanagement.support.exceptions.ResourceAccessException;
import org.gcube.resourcemanagement.support.exceptions.ResourceParameterException;
import org.gcube.resourcemanagement.support.types.AllowedResourceTypes;
/**
* @author Daniele Strollo (ISTI-CNR)
*
*/
public class ViewManager extends AbstractResourceManager {
/**
* @deprecated discouraged use. With no ID some operations cannot be accessed.
*/
public ViewManager()
throws ResourceParameterException,
ResourceAccessException {
super(AllowedResourceTypes.VIEW);
}
public ViewManager(final String id)
throws ResourceParameterException,
ResourceAccessException {
super(id, AllowedResourceTypes.VIEW);
}
/**
* @param id
* @param name
* @param type
* @throws ResourceParameterException
* @throws ResourceAccessException
*/
public ViewManager(final String id, final String name)
throws ResourceParameterException,
ResourceAccessException {
super(id, name, AllowedResourceTypes.VIEW);
}
/**
* @param id
* @param name
* @param type
* @param subtype
* @throws ResourceParameterException
* @throws ResourceAccessException
*/
public ViewManager(final String id, final String name, final String subtype)
throws ResourceParameterException, ResourceAccessException {
super(id, name, AllowedResourceTypes.VIEW, subtype);
}
@Override
protected final GCUBEResource buildGCUBEResource(final String xmlRepresentation)
throws AbstractResourceException {
try {
GCUBEMCollection impl = GHNContext.getImplementation(GCUBEMCollection.class);
impl.load(new StringReader(xmlRepresentation));
return impl;
} catch (Exception e) {
throw new ResourceAccessException("Cannot load the stub for resource " + this.getType(), e);
}
}
}

@ -0,0 +1,236 @@
/****************************************************************************
* This software is part of the gCube Project.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: ScopeManager.java
****************************************************************************
* @author <a href="mailto:daniele.strollo@isti.cnr.it">Daniele Strollo</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.managers.scope;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.gcube.common.core.contexts.GHNContext;
import org.gcube.common.core.informationsystem.ISException;
import org.gcube.common.core.informationsystem.client.AtomicCondition;
import org.gcube.common.core.informationsystem.client.ISClient;
import org.gcube.common.core.informationsystem.client.queries.GCUBEGenericResourceQuery;
import org.gcube.common.core.resources.GCUBEGenericResource;
import org.gcube.common.core.scope.GCUBEScope;
import org.gcube.common.core.scope.ServiceMap;
import org.gcube.common.core.scope.VO;
import org.gcube.common.core.scope.VRE;
import org.gcube.resourcemanagement.support.utils.ServerConsole;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
* Scopes and their maps are persisted in this structure.
*
* @author Massimiliano Assante (ISTI-CNR)
* @author Daniele Strollo
*
*/
public class ScopeManager {
private static final Map<String, GCUBEScope> SCOPES = new LinkedHashMap<String, GCUBEScope>();
private static String confFile = null;
private static final String LOG_PREFIX = "[SCOPE-MGR]";
public static GCUBEScope getScope(final String scope) throws Exception {
synchronized (SCOPES) {
if (getAvailableScopes().containsKey(scope)) {
return getAvailableScopes().get(scope);
}
}
ServerConsole.warn(LOG_PREFIX, "Using DEFAULT scope manager");
return GCUBEScope.getScope(scope);
}
public static void setScopeConfigFile(final String file) {
confFile = file;
}
/**
* Refreshes the list of scopes and associated maps.
*/
public static Map<String, GCUBEScope> getAvailableScopes()
throws Exception {
if (SCOPES.size() == 0) {
update();
}
return SCOPES;
}
public static void clear() {
SCOPES.clear();
}
public static void update()
throws Exception {
if (confFile == null) {
throw new NullPointerException("the scope file has not been defined");
}
String scopeXML = fileToString(confFile);
ServerConsole.info(LOG_PREFIX, "Starting retrieving scopes..");
Document scopeDocument = getDocumentGivenXML(scopeXML);
NodeList voElements = scopeDocument.getElementsByTagName("vo");
for (int i = 0; i < voElements.getLength(); i++) {
NodeList voDetails = voElements.item(i).getChildNodes();
String voString = voDetails.item(5).getFirstChild().getNodeValue();
String fileName = voDetails.item(3).getFirstChild().getNodeValue();
// String voName = voDetails.item(1).getFirstChild().getNodeValue();
GCUBEScope vo = GCUBEScope.getScope(voString);
try {
vo.setServiceMap(loadServiceMap((VO) vo, fileName));
SCOPES.put(vo.toString(), vo);
ServerConsole.info(LOG_PREFIX, " Scopes in VO " + vo.toString());
try {
for (VRE vre : getVREFromVO((VO) vo)) {
// This operation overrides the vo map
vre.getEnclosingScope().setServiceMap(vo.getServiceMap());
SCOPES.put(vre.toString(), vre);
}
} catch (ISException e) {
ServerConsole.error(LOG_PREFIX, "Exception raised while loading VREs for VO : " + vo, e);
}
}
catch (FileNotFoundException e) {
ServerConsole.warn(LOG_PREFIX, "skipping... map not found for VO : " + vo, e);
}
}
ServerConsole.info(LOG_PREFIX, "*** found scopes : " + SCOPES.keySet());
}
protected static List<VRE> getVREFromVO(final VO vo)
throws Exception {
ServerConsole.info(LOG_PREFIX, "*******************\n\n********************\nStarting Retrieving VREs for VO : " + vo);
List<VRE> toReturn = new ArrayList<VRE>();
ISClient client = GHNContext.getImplementation(ISClient.class);
// FIXME query to get VREs
try {
GCUBEGenericResourceQuery query = client.getQuery(GCUBEGenericResourceQuery.class);
query.addAtomicConditions(new AtomicCondition("/Profile/SecondaryType", "VRE"));
//query.addGenericCondition("not($result/Scopes/Scope/string() eq '" + vo.toString() + "')");
System.out.println( "************** \n\n\n *****************\nready to query : " + query.getExpression());
for (GCUBEGenericResource resource : client.execute(query, vo)) {
ServerConsole.info(LOG_PREFIX, "Found: " + resource.getName());
for (String vreName : resource.getScopes().keySet()) {
GCUBEScope vre = resource.getScopes().get(vreName);
if (vre.getType().equals(GCUBEScope.Type.VRE)) {
toReturn.add((VRE) vre);
}
}
}
} catch (Exception e) {
ServerConsole.error(LOG_PREFIX, e);
}
return toReturn;
}
/**
* Given a scope, if it is a VO or an infrastructure, the corresponding
* map file is retrieved from the globus location and the contained xml
* representation is returned.
* @param searchvo
* @return
* @throws Exception
*/
public static String getMapXML(final GCUBEScope searchvo) throws Exception {
if (confFile == null) {
throw new NullPointerException("the scope file has not been defined");
}
String scopeXML = fileToString(confFile);
ServerConsole.info(LOG_PREFIX, "Starting retrieving scopes..");
Document scopeDocument = getDocumentGivenXML(scopeXML);
NodeList voElements = scopeDocument.getElementsByTagName("vo");
for (int i = 0; i < voElements.getLength(); i++) {
NodeList voDetails = voElements.item(i).getChildNodes();
String voString = voDetails.item(5).getFirstChild().getNodeValue();
String fileName = voDetails.item(3).getFirstChild().getNodeValue();
// String voName = voDetails.item(1).getFirstChild().getNodeValue();
GCUBEScope vo = GCUBEScope.getScope(voString);
if (vo.equals(searchvo)) {
return fileToString(System.getenv("GLOBUS_LOCATION") + File.separator + "config" + File.separator + fileName);
}
}
ServerConsole.error(LOG_PREFIX, "*** maps for " + searchvo + " not found");
return null;
}
private static ServiceMap loadServiceMap(final VO vo, final String fileName) throws Exception {
ServiceMap map = new ServiceMap();
String filePath = System.getenv("GLOBUS_LOCATION") + File.separator + "config" + File.separator + fileName;
ServerConsole.info(LOG_PREFIX, "--- Loading " + vo.getName() + " from: " + filePath);
map.load(new FileReader(filePath));
return map;
}
public static String fileToString(final String path) throws IOException {
BufferedReader filebuf = null;
String nextStr = null;
StringBuilder ret = new StringBuilder();
filebuf = new BufferedReader(new FileReader(path));
nextStr = filebuf.readLine(); // legge una riga dal file
while (nextStr != null) {
ret.append(nextStr);
nextStr = filebuf.readLine(); // legge la prossima riga
}
filebuf.close(); // chiude il file
return ret.toString();
}
public static Document getDocumentGivenXML(final String result) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setValidating(false);
DocumentBuilder db;
Document document = null;
try {
db = dbf.newDocumentBuilder();
document = db.parse(new ByteArrayInputStream(result.getBytes()));
} catch (ParserConfigurationException e1) {
e1.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return document;
}
}

@ -0,0 +1,187 @@
/****************************************************************************
* This software is part of the gCube Project.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: SWRepositoryManager.java
****************************************************************************
* @author <a href="mailto:daniele.strollo@isti.cnr.it">Daniele Strollo</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.managers.services;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Vector;
import org.apache.axis.message.addressing.EndpointReferenceType;
import org.gcube.common.core.contexts.GCUBERemotePortTypeContext;
import org.gcube.common.core.contexts.GHNContext;
import org.gcube.common.core.informationsystem.client.AtomicCondition;
import org.gcube.common.core.informationsystem.client.ISClient;
import org.gcube.common.core.informationsystem.client.queries.GCUBERIQuery;
import org.gcube.common.core.resources.GCUBERunningInstance;
import org.gcube.common.core.scope.GCUBEScope;
import org.gcube.common.core.security.GCUBESecurityManagerImpl;
import org.gcube.resourcemanagement.support.exceptions.ResourceAccessException;
import org.gcube.resourcemanagement.support.exceptions.ResourceParameterException;
import org.gcube.resourcemanagement.support.utils.Assertion;
import org.gcube.resourcemanagement.support.utils.ServerConsole;
import org.gcube.vremanagement.softwarerepository.stubs.SoftwareRepositoryPortType;
import org.gcube.vremanagement.softwarerepository.stubs.service.SoftwareRepositoryServiceAddressingLocator;
/**
* A support library to handle and retrieve remote software
* repository manager.
* <br/>
* Useful to handle the proxy for repository manager.
* <br/>Usage:
* <pre>
* <b>SWRepositoryManager</b> repMgr = new SWRepositoryManager();
* // if needed sets the time out for socket connection
* // -- repMgr.setCallTimeOut(240000);
* SoftwareRepositoryPortType swrep = repMgr.getSoftwareRepository(scope);
* // Applies a deploy
* swrep.<i>store(...)</i>;
* </pre>
* @author Daniele Strollo (ISTI-CNR)
*/
public class SWRepositoryManager {
private GCUBESecurityManagerImpl managerSec = null;
private ISClient client = null;
private int callTimeOut = 240000;
private static final String LOG_PREFIX = "[SW-UPDT-MGR]";
public SWRepositoryManager() throws ResourceAccessException {
/**
* Initially the security management is disabled.
*/
this.managerSec = new GCUBESecurityManagerImpl() {
public boolean isSecurityEnabled() {
return false;
}
};
try {
client = GHNContext.getImplementation(ISClient.class);
} catch (Exception e) {
throw new ResourceAccessException("Cannot instantiate the ISClient");
}
}
/**
* Internally used by {@link AbstractResourceManager#getResourceManager(GCUBEScope)}.
* @param scope
* @return a raw list of resource manager descriptors.
* @throws Exception
*/
private List<GCUBERunningInstance> getSoftwareRepositoryFromScope(final GCUBEScope scope)
throws Exception {
GCUBERIQuery query = this.client.getQuery(GCUBERIQuery.class);
query.addAtomicConditions(new AtomicCondition("//Profile/ServiceClass", "VREManagement"));
query.addAtomicConditions(new AtomicCondition("//Profile/ServiceName", "SoftwareRepository"));
List<GCUBERunningInstance> result = client.execute(query, scope);
List<GCUBERunningInstance> toReturn = new ArrayList<GCUBERunningInstance>();
for (GCUBERunningInstance ri : result) {
if (ri.getScopes().containsValue(scope)) {
toReturn.add(ri);
}
}
return toReturn;
}
/**
* The the list of resource managers able to handle the resource in a given scope.
* @param scope the scope in which to operate
* @return all the available managers
* @throws ResourceAccessException if no manager can be instantiated
* @throws ResourceParameterException if the parameters are invalid
*/
private List<SoftwareRepositoryPortType> getSoftwareRepositories(final GCUBEScope scope)
throws ResourceAccessException, ResourceParameterException {
Assertion<ResourceParameterException> checker = new Assertion<ResourceParameterException>();
checker.validate(scope != null, new ResourceParameterException("Invalid scope"));
List<GCUBERunningInstance> resourceManagerList = null;
try {
resourceManagerList = this.getSoftwareRepositoryFromScope(scope);
} catch (Exception e) {
throw new ResourceAccessException("Cannot retrieve the software repository in scope: " + scope.toString());
}
List<SoftwareRepositoryPortType> retval = new Vector<SoftwareRepositoryPortType>();
if (resourceManagerList.isEmpty()) {
throw new ResourceAccessException("Unable to find the software repository in scope: " + scope.toString());
}
EndpointReferenceType endpoint = null;
SoftwareRepositoryPortType pt = null;
for (GCUBERunningInstance resourceManager : resourceManagerList) {
try {
endpoint = resourceManager.getAccessPoint().getEndpoint("gcube/vremanagement/softwarerepository/SoftwareRepository");
pt = GCUBERemotePortTypeContext.getProxy(
new SoftwareRepositoryServiceAddressingLocator()
.getSoftwareRepositoryPortTypePort(endpoint),
scope,
this.callTimeOut,
this.managerSec);
if (pt != null) {
retval.add(pt);
}
} catch (Throwable e) {
// trying on next entry
ServerConsole.error(LOG_PREFIX, e);
}
}
if (retval != null && retval.size() > 0) {
// Return a random manager from the available ones
return retval;
}
// no managers found
throw new ResourceAccessException("Unable to find the software repository in scope: " + scope.toString());
}
/**
* Retrieves form the current scope the list of registered software managers
* and returns one of them (random choice).
* @param scope the scope in which search the sw repository
* @return one randomly chosen repository manager (if many available).
* @throws ResourceAccessException if no sw manager found
* @throws ResourceParameterException if wrong parameters passed
*/
public final SoftwareRepositoryPortType getSoftwareRepository(final GCUBEScope scope)
throws ResourceAccessException, ResourceParameterException {
List<SoftwareRepositoryPortType> retval = this.getSoftwareRepositories(scope);
if (retval != null && retval.size() > 0) {
Random generator = new Random();
// Return a random software repository manager from the available ones
return retval.get(generator.nextInt(retval.size()));
}
// no managers found
throw new ResourceAccessException("Unable to find SoftwareRepository in scope: " + scope.toString());
}
/**
* Used to set the time out for socket connection with the software repository
* to update.
* @param callTimeOut
*/
public final void setCallTimeOut(final int callTimeOut) {
this.callTimeOut = callTimeOut;
}
public final int getCallTimeOut() {
return callTimeOut;
}
}

@ -0,0 +1,571 @@
/****************************************************************************
* This software is part of the gCube Project.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: SWRepositoryUpgrader.java
****************************************************************************
* @author <a href="mailto:daniele.strollo@isti.cnr.it">Daniele Strollo</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.managers.services;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Vector;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.gcube.common.core.types.StringArray;
import org.gcube.resourcemanagement.support.exceptions.ResourceAccessException;
import org.gcube.resourcemanagement.support.exceptions.ResourceParameterException;
import org.gcube.resourcemanagement.support.managers.scope.ScopeManager;
import org.gcube.resourcemanagement.support.utils.Assertion;
import org.gcube.resourcemanagement.support.utils.ServerConsole;
import org.gcube.vremanagement.softwarerepository.stubs.ListServicePackagesMessage;
import org.gcube.vremanagement.softwarerepository.stubs.SoftwareRepositoryPortType;
import org.gcube.vremanagement.softwarerepository.stubs.Store;
import org.gcube.vremanagement.softwarerepository.stubs.StoreItem;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
class UpgradeStatus implements Serializable {
private static final long serialVersionUID = 2884364307629521252L;
private double currentPackage = 0;
private double totalPackages = 0;
/**
* @deprecated for serialization only
*/
public UpgradeStatus() {
super();
}
public UpgradeStatus(final double currentPackage, final double totalPackages) {
this.currentPackage = currentPackage;
this.totalPackages = totalPackages;
}
public double getCurrentPackage() {
return this.currentPackage;
}
public double getTotalPackages() {
return this.totalPackages;
}
}
/**
* <p>
* Responsible to interact with the repository manager to require
* an update of the infrastructure.
* </p>
* <p>To facilitate the monitoring of main steps involved the
* {@link UpgradeListener} class has been introduced.
* </p>
* <p>
* <b>Notice</b> that one single update per time can be required.
* If a pending update is running the next request will be blocked
* and an exception will be raised.
* </p>
* <p>
* Three files will be created at update request (the folder in which they
* will be created depends on the parameter <i>reportsDir</i>).
* <ul>
* <li><b>swupdt-rept-&lt;timestamp&gt;.txt</b> containing
* the final report of the sw repository update procedure</li>
* <li><b>swupdt-dist-&lt;timestamp&gt;.txt</b> that stores the list of packages to update</li>
* <li><b>swreport.lock</b> represents the lock file and has a double purpose
* <br/>
* <i>i) avoids multiple requests of update</i>
* <br/>
* <i>ii) contains information about the progress status</i>.
* </li>
* </ul>
* </p>
* <b>Usage:</b>
* <pre>
* // [optional]
* // to ensure at least a repository manager is registered in the scope
* new SWRepositoryManager().getSoftwareRepository(scope);
* ServerConsole.info(LOG_PREFIX, "Software repository [FOUND]");
*
* new <b>SWRepositoryUpgrader</b>(
* // The URL containing the list of packages to update
* "http://acme.org/builds/build.txt",
* // The directory to store report files
* "temp",
* // The scope
* "/gcube/devsec")
* // requires the upgrade
* .<b>doUpgrade()</b>;
* </pre>
* @author Daniele Strollo (ISTI-CNR)
*
*/
public class SWRepositoryUpgrader implements Serializable {
private static final long serialVersionUID = 733460314188332825L;
private static final String LOG_PREFIX = "[SW-UPGR]";
private String todeployTxtURL = null;
private String reportFileName = null;
private String distributionFileName = null;
private String scope = null;
private String reportsDir = "temp";
private String lockFile = null;
private List<UpgradeListener> listeners = new Vector<UpgradeListener>();
/**
* @deprecated for internal use only. Required for serialization.
*/
private SWRepositoryUpgrader() {
super();
}
/**
* Builds a new instance of repository update manager.
*
* @param todeployTxtURL the URL to use to retrieve the list of software to update
* @param reportsDir where the reports must be stored
* @throws Exception
*/
public SWRepositoryUpgrader(
final String todeployTxtURL,
final String reportsDir,
final String scope) throws Exception {
this();
// Checks parameters
Assertion<ResourceParameterException> checker = new Assertion<ResourceParameterException>();
checker.validate(todeployTxtURL != null && todeployTxtURL.trim().length() > 0,
new ResourceParameterException("Invalid parameter todeployTxtURL"));
checker.validate(reportsDir != null && reportsDir.trim().length() > 0,
new ResourceParameterException("Invalid parameter reportsDir"));
checker.validate(scope != null && scope.trim().length() > 0 && ScopeManager.getScope(scope) != null,
new ResourceParameterException("Invalid parameter scope"));
this.reportsDir = reportsDir;
// Create the folder if it does not exist
boolean success = (new File(this.reportsDir)).mkdirs();
if (success) {
ServerConsole.trace(LOG_PREFIX, "Directory " + this.reportsDir + " [CREATED]");
}
this.todeployTxtURL = todeployTxtURL;
SimpleDateFormat dateFormatter = new SimpleDateFormat("yyMMdd-hhmm");
Date date = new Date();
String curDate = dateFormatter.format(date);
this.reportFileName = this.reportsDir + File.separator + "swupdt-rept-" + curDate + ".txt";
this.distributionFileName = this.reportsDir + File.separator + "swupdt-dist-" + curDate + ".txt";
this.lockFile = this.reportsDir + File.separator + "swreport.lock";
ServerConsole.trace(LOG_PREFIX, "Setting report file: " + this.reportFileName);
ServerConsole.trace(LOG_PREFIX, "Setting distribution file: " + this.distributionFileName);
this.scope = scope;
}
public final String getScope() {
return this.scope;
}
/**
* Upgrades a software repository.
* @param softwareRepositoryURL the url to contact the service repository
* @param todeployTxtURL the txt file containing software descriptions
* @param reportFileName the filename where report must be stored
* @param distributionFileName the filename where distribution must be stored
* @param scope
*/
public final void doUpgrade() throws Exception {
try {
this.reserve();
} catch (Exception e) {
this.release();
throw new Exception("The required report file already exists. It cannot be replaced.");
}
File reportFile = new File(reportFileName);
if (reportFile.exists()) {
this.release();
throw new Exception("The required report file already exists. It cannot be replaced.");
}
File distributionFile = new File(distributionFileName);
if (distributionFile.exists()) {
this.release();
throw new Exception("The required distribution file already exists. It cannot be replaced.");
}
SoftwareRepositoryPortType swManager = null;
try {
swManager = new SWRepositoryManager().getSoftwareRepository(ScopeManager.getScope(this.scope));
} catch (Exception e) {
this.release();
throw new Exception("The swManager cannot be instantiated. " + e.getMessage());
}
ArrayList<String> listIds = new ArrayList<String>();
List<ListServicePackagesMessage> listServicePackagesMessages = new ArrayList<ListServicePackagesMessage>();
List<StoreItem> storeItemsList = null;
try {
storeItemsList = parseTxtFile(this.todeployTxtURL);
} catch (Exception e) {
this.release();
throw new Exception("The passed update URL is not valid. " + e.getMessage());
}
try {
stringToFile("<Services>\n", reportFile);
} catch (IOException e) {
ServerConsole.error(LOG_PREFIX, "doUpgrade", e);
}
for (int i = 0; i < storeItemsList.size(); i++) {
StoreItem[] storeItems = new StoreItem[1];
storeItems[0] = storeItemsList.get(i);
Store store = new Store();
store.setStoreMessage(storeItems);
try {
String ret = swManager.store(store);
ret = ret.replace("<Services>\n", "");
ret = ret.replace("</Services>\n", "");
listIds.add(parseXMLStoreSoftwareArchive(ret, listServicePackagesMessages));
stringToFile(ret, reportFile);
// -- PROGRESS UPDATE PROCEDURE
// updates the status so that the client can retrieve
// the current update progress (0..1).
UpgradeStatus status = new UpgradeStatus(i + 1, storeItemsList.size());
this.storeStatus(status);
double progress = 1.0d * (status.getCurrentPackage() / status.getTotalPackages());
// Informs the listeners of update progress
for (UpgradeListener listener : this.listeners) {
listener.onProgress(progress);
}
ServerConsole.trace(LOG_PREFIX, "*** UPDATED [" + (i + 1) + "/" + storeItemsList.size() + "]");
// -- ENDOF PROGRESS UPDATE PROCEDURE
} catch (Exception e) {
ServerConsole.error(LOG_PREFIX, e);
}
}
try {
stringToFile("</Services>\n", reportFile);
} catch (IOException e) {
e.printStackTrace();
}
StringBuilder sb = new StringBuilder();
sb.append("<Packages>\n");
for (int k = 0; k < listIds.size(); k++) {
try {
StringArray stringArray = swManager.listUniquesServicePackages(listServicePackagesMessages.get(k));
if (stringArray != null) {
String[] aux = stringArray.getItems();
for (int i = 0; i < aux.length; i++) {
sb.append(aux[i]);
}
} else {
ServerConsole.info(LOG_PREFIX, "listServicePackages return null");
continue;
}
} catch (Exception e) {
ServerConsole.error(LOG_PREFIX, "Error getting package list Service with Class=" +
listServicePackagesMessages.get(k).getServiceClass() +
" Name=" + listServicePackagesMessages.get(k).getServiceName() +
" Version=" + listServicePackagesMessages.get(k).getServiceVersion() + "\n\n");
// Informs the listeners of update exception
for (UpgradeListener listener : this.listeners) {
listener.onError(
// provides the package raising update failure
"Error getting package list Service with Class=" +
listServicePackagesMessages.get(k).getServiceClass() +
" Name=" + listServicePackagesMessages.get(k).getServiceName() +
" Version=" + listServicePackagesMessages.get(k).getServiceVersion(),
e);
}
// Continues to next package
continue;
}
}
sb.append("</Packages>");
try {
stringToFile(sb.toString(), distributionFile);
} catch (IOException e) {
ServerConsole.info(LOG_PREFIX, "Unable to write on output file");
ServerConsole.error(LOG_PREFIX, e);
}
this.release();
ServerConsole.debug(LOG_PREFIX, "Infrastructure Update [DONE]");
// Informs the release has been done
for (UpgradeListener listener : this.listeners) {
listener.onFinish(this.todeployTxtURL, this.reportFileName, this.distributionFileName);
}
}
/**
* Each time a single update can be required.
* For a such reason the repository upgrader must be reserved and
* released at the end of the process.
*/
private void reserve() throws Exception {
if (isReserved()) {
throw new ResourceAccessException("The Infrastracture update cannot be executed. It is already locked by another process. Try later.");
}
// Informs the release has been done
for (UpgradeListener listener : this.listeners) {
listener.onReserve();
}
stringToFile("Reserved by: " + this.reportFileName, new File(this.lockFile));
this.storeStatus(new UpgradeStatus(0, 1));
}
private void storeStatus(final UpgradeStatus status) {
ServerConsole.info(LOG_PREFIX, "Storing status");
try {
File file = new File(this.lockFile);
ObjectOutputStream mine = new ObjectOutputStream(new FileOutputStream(file));
mine.reset();
mine.writeObject(status);
mine.flush();
mine.close();
} catch (Exception e) {
ServerConsole.error(LOG_PREFIX, e);
}
}
/**
* Gives the completed upgrade percentage (0...1).
* @return
*/
public final double getProgressStatus() {
ServerConsole.info(LOG_PREFIX, "Getting status");
if (!this.isReserved()) {
return 1.0;
}
try {
File file = new File(this.lockFile);
ObjectInputStream mine = new ObjectInputStream(new FileInputStream(file));
UpgradeStatus status = (UpgradeStatus) mine.readObject();
mine.close();
double retval = 1.0d * (status.getCurrentPackage() / status.getTotalPackages());
ServerConsole.info(LOG_PREFIX, "Current Status: " + retval);
return retval;
} catch (Exception e) {
return 1;
}
}
/**
* Checks if the software update is locked by another process.
* @return
*/
private boolean isReserved() {
return new File(this.lockFile).exists();
}
/**
* Releases the reservation (removes the lock file).
*/
private void release() {
// Informs the release has been done
for (UpgradeListener listener : this.listeners) {
listener.onRelease();
}
ServerConsole.debug(LOG_PREFIX, "Releasing lock for " + this.reportFileName);
new File(this.lockFile).delete();
}
private List<StoreItem> parseTxtFile(final String txtURL) throws Exception {
List<StoreItem> ret = new ArrayList<StoreItem>();
ServerConsole.info(LOG_PREFIX, "Opening URL connection to " + txtURL);
final URL url = new URL(txtURL);
final HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("GET");
httpURLConnection.setDoInput(true);
httpURLConnection.setDoOutput(true);
httpURLConnection.setUseCaches(false);
ServerConsole.info(LOG_PREFIX, "Getting data from given URL " + txtURL);
InputStream is = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is));
ServerConsole.info(LOG_PREFIX, "Connection return code: " + httpURLConnection.getResponseCode());
ServerConsole.info(LOG_PREFIX, "Bytes available: " + is.available() + "\n\n\n");
String nextStr = bufferedReader.readLine(); // read a row
while (nextStr != null) {
String row = nextStr.toLowerCase();
if (!row.contains("-servicearchive-")) {
nextStr = bufferedReader.readLine(); // read the next row before continuing
continue;
}
String serviceClass = "Class";
ServerConsole.info(LOG_PREFIX, "Service Class = " + serviceClass);
String serviceName = "Name";
ServerConsole.info(LOG_PREFIX, "Service Name = " + serviceName);
//String version = nextStr.split("-servicearchive-")[1];
String version = "1.0.0";
// version = version.split("-")[0];
ServerConsole.info(LOG_PREFIX, "Version = " + version);
String softwareArchiveURL = nextStr;
ServerConsole.info(LOG_PREFIX, "URL = " + nextStr);
String description = "ETICS Client programmed Description";
ServerConsole.info(LOG_PREFIX, "Description = " + description + "\n\n\n");
String[] scopes = new String[] {scope};
StoreItem storeItem = new StoreItem();
storeItem.setServiceClass(serviceClass);
storeItem.setServiceName(serviceName);
storeItem.setServiceVersion(version);
storeItem.setURL(softwareArchiveURL);
storeItem.setDescription(description);
storeItem.setScopes(scopes);
ret.add(storeItem);
nextStr = bufferedReader.readLine(); // read the next row
}
bufferedReader.close();
httpURLConnection.disconnect();
return ret;
}
/**
*
* @param xml
* @return
*/
private String parseXMLStoreSoftwareArchive(
final String xml,
final List<ListServicePackagesMessage> listServicePackagesMessages) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = null;
try {
db = dbf.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
Document document = null;
try {
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(xml.getBytes());
document = db.parse(byteArrayInputStream);
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Element root = document.getDocumentElement();
NodeList nl = root.getChildNodes();
String id = "";
ListServicePackagesMessage listServicePackagesMessage = new ListServicePackagesMessage();
for (int i = 0; i < nl.getLength(); i++) {
if (!(nl.item(i) instanceof Element)) {
continue;
}
Element el = (Element) nl.item(i);
if (el == null) {
continue;
} else if (el.getTagName().compareTo("ServiceClass") == 0) {
listServicePackagesMessage.setServiceClass(el.getTextContent());
} else if (el.getTagName().compareTo("ID") == 0) {
id = el.getTextContent();
} else if (el.getTagName().compareTo("ServiceName") == 0) {
listServicePackagesMessage.setServiceName(el.getTextContent());
} else if (el.getTagName().compareTo("ServiceVersion") == 0) {
listServicePackagesMessage.setServiceVersion(el.getTextContent());
}
}
listServicePackagesMessages.add(listServicePackagesMessage);
ServerConsole.info(LOG_PREFIX, "required store for SA ID: " + id);
return id;
}
/**
* @param str string
* @param targetFile Target File
* @throws IOException if fails
*/
private void stringToFile(
final String str,
final File targetFile) throws IOException {
try {
FileWriter fw = new FileWriter(targetFile, true);
fw.append(str);
fw.flush();
fw.close();
} catch (IOException e) {
throw e;
}
}
public final void addListener(final UpgradeListener listener) {
if (listener == null) {
return;
}
listener.setUpgrader(this);
this.listeners.add(listener);
}
}

@ -0,0 +1,102 @@
/****************************************************************************
* This software is part of the gCube Project.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: UpgradeListener.java
****************************************************************************
* @author <a href="mailto:daniele.strollo@isti.cnr.it">Daniele Strollo</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.managers.services;
import org.gcube.resourcemanagement.support.utils.ServerConsole;
/**
* @author Daniele Strollo (ISTI-CNR)
*
*/
/**
* To an upgrade process can be attached an handler to perform
* additional operations at the happening of events.
* @author Daniele Strollo (ISTI-CNR)
*
*/
public abstract class UpgradeListener {
protected static final String LOG_PREFIX = "[SW-UPGR-LISTENER]";
private SWRepositoryUpgrader upgrader = null;
public UpgradeListener() {
this.onInit();
}
/**
* Method invoked at construction of listener.
*/
public abstract void onInit();
/**
* Automatically invoked when the listener is attached to an upgrader.
*
* @param upgrader
*/
public final void setUpgrader(final SWRepositoryUpgrader upgrader) {
this.upgrader = upgrader;
}
public final SWRepositoryUpgrader getUpgrader() {
return this.upgrader;
}
/**
* Invoked each time the update progresses.
* @param progress
*/
public abstract void onProgress(final double progress);
/**
* Invoked in case of failure during update operation.
* @param failure
*/
public final void onError(final Exception failure) {
ServerConsole.error(LOG_PREFIX, failure);
}
/**
* Invoked in case of failure during update operation.
* @param failure
*/
public final void onError(final String message, final Exception failure) {
ServerConsole.error(LOG_PREFIX, message, failure);
}
/**
* In successful update, the resulting report files will be
* provided in input.
*/
public abstract void onFinish(
final String deployURL,
final String reportFileName,
final String distributionFileName);
/**
* Invoked once the lock has been acquired.
*/
public final void onReserve() {
ServerConsole.info(LOG_PREFIX, "Software repository lock request [DONE]");
}
/**
* Once finished the lock is released and this event raised.
* The release is called both if the process successfully finish
* or an abort is required.
*/
public void onRelease() {
ServerConsole.info(LOG_PREFIX, "Software repository lock release [DONE]");
}
}

@ -0,0 +1,187 @@
/****************************************************************************
* This software is part of the gCube Project.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: GenericTest.java
****************************************************************************
* @author <a href="mailto:daniele.strollo@isti.cnr.it">Daniele Strollo</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.tests;
import java.io.File;
import java.util.Map;
import org.gcube.common.core.contexts.GHNContext.Status;
import org.gcube.common.core.resources.GCUBEHostingNode;
import org.gcube.common.core.scope.GCUBEScope;
import org.gcube.common.core.scope.GCUBEScope.Type;
import org.gcube.resourcemanagement.support.managers.resources.GHNManager;
import org.gcube.resourcemanagement.support.managers.resources.GenericResourceManager;
import org.gcube.resourcemanagement.support.managers.resources.ResourceFactory;
import org.gcube.resourcemanagement.support.managers.scope.ScopeManager;
import org.gcube.resourcemanagement.support.types.AllowedResourceTypes;
import org.gcube.resourcemanagement.support.utils.ServerConsole;
/**
* @author Daniele Strollo (ISTI-CNR)
*
*/
public class GenericTest {
private static final String LOG_PREFIX = "[SW-SUPPORT-TEST]";
public static void testScope() {
try {
Map<String, GCUBEScope> scopes = ScopeManager.getAvailableScopes();
System.out.println("\n\n\n******************** TEST SCOPE ***************\n");
for (GCUBEScope scope : scopes.values()) {
if ((scope.getType().compareTo(Type.INFRASTRUCTURE) == 0)
|| (scope.getType().compareTo(Type.VO) == 0)) {
if (scope.getServiceMap() != null) {
ServerConsole.trace(null, "*** Map loaded for " + scope.getType() + " " + scope.toString() + " [OK]");
} else {
ServerConsole.trace(null, "*** Map loaded for " + scope.getType() + " " + scope.toString() + " [ERR]");
}
} else {
try {
if (scope.getEnclosingScope().getServiceMap() != null) {
ServerConsole.trace(null, "*** Map loaded for " + scope.getType() + scope.toString() + " [OK]");
}
} catch (Exception e) {
ServerConsole.trace(null, "*** Map loaded for " + scope.getType() + scope.toString() + " [ERR]");
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("\n******************** TEST SCOPE END ***************\n");
}
}
public static String testCreation() {
System.out.println("\n\n\n******************** TEST CREATION ***************");
String resID = null;
try {
resID = GenericResourceManager.create(
null,
ScopeManager.getScope("/gcube/devsec"),
"GR Test",
"GR Test Description",
"<TestBody>Hello</TestBody>",
"XXX");
ServerConsole.trace(null, "Generic Resource Created with ID: " + resID);
} catch (Exception e) {
ServerConsole.error(LOG_PREFIX, e);
} finally {
System.out.println("\n******************** TEST CREATION END ***************\n");
}
return resID;
}
public static void testScopeCopy(final String resID, final String fromScope, final String toScope) {
System.out.println("\n\n\n******************** TEST SCOPE COPY ***************");
try {
GenericResourceManager res = new GenericResourceManager(resID);
ServerConsole.trace(null,
res.addToExistingScope(ScopeManager.getScope(fromScope), ScopeManager.getScope(toScope))
);
} catch (Exception e) {
ServerConsole.error(LOG_PREFIX, e);
} finally {
System.out.println("\n******************** TEST SCOPE COPY END ***************\n");
}
}
public static void testResourceEdit(final String resID, final GCUBEScope scope) {
System.out.println("\n\n\n******************** TEST RESEDIT COPY ***************");
try {
GenericResourceManager res = new GenericResourceManager(resID);
res.update("New Name", "updated description", null, null, scope);
} catch (Exception e) {
ServerConsole.error(LOG_PREFIX, e);
} finally {
System.out.println("\n******************** TEST RESEDIT END ***************\n");
}
}
public static void testModeGHN(final String resID, final String scope)
throws Exception {
GCUBEScope queryScope = ScopeManager.getScope(scope);
GHNManager ghnManager = new GHNManager(resID);
GCUBEHostingNode res = (GCUBEHostingNode) ghnManager.getGCUBEResource(queryScope);
res.getNodeDescription().setStatus(Status.UNREACHABLE);
ghnManager.getISPublisher().updateGCUBEResource(res, queryScope, ghnManager.getSecurityManager());
}
public static void testGHN() {
System.out.println("\n\n\n******************** TEST GHN ***************");
try {
GHNManager ghn1 = new GHNManager("20ddb210-b779-11df-96c9-a66904b26e27", "pc-strollo");
ghn1.addToExistingScope(ScopeManager.getScope("/gcube"), ScopeManager.getScope("/gcube/devsec"));
} catch (Exception e) {
ServerConsole.error(LOG_PREFIX, e);
} finally {
System.out.println("\n******************** TEST GHN END ***************\n");
}
}
public static void testRemoveFromScope(final String resID, final GCUBEScope scope) {
System.out.println("\n\n\n******************** TEST RESOURCE REMOVEFROMSCOPE ***************");
try {
GenericResourceManager res = new GenericResourceManager(resID);
res.removeFromScope(scope);
} catch (Exception e) {
ServerConsole.error(LOG_PREFIX, e);
} finally {
System.out.println("\n******************** TEST RESOURCE REMOVEFROMSCOPE END ***************\n");
}
}
public static void testDelete(final String resID, final GCUBEScope scope) {
System.out.println("\n\n\n******************** TEST RESOURCE DELETE ***************");
try {
GenericResourceManager res = new GenericResourceManager(resID);
res.delete(scope);
} catch (Exception e) {
ServerConsole.error(LOG_PREFIX, e);
} finally {
System.out.println("\n******************** TEST RESOURCE DELETE END ***************\n");
}
}
@SuppressWarnings("deprecation")
public static void main(final String[] args) throws Exception {
// The scopes must be initialized
ScopeManager.setScopeConfigFile("test-suite" + File.separator + "scopes" + File.separator + "scopedata_admin.xml");
boolean deepTest = false;
// testScope();
// testGHN();
if (deepTest) {
String resID = testCreation();
testScopeCopy(resID, "/gcube/devsec", "/gcube/devsec/devVRE");
System.out.println("\n\nWaiting for resource refresh 60secs.\n\n\n");
Thread.sleep(60000);
//testResourceEdit(resID, ScopeManager.getScope("/gcube/devsec"));
testDelete(resID, ScopeManager.getScope("/gcube/devsec/devVRE"));
// testRemoveFromScope(resID, ScopeManager.getScope("/gcube/devsec"));
} else {
testModeGHN("f5cb0640-f1a7-11df-93d0-fc409084cf46", "/gcube/devsec/devVRE");
}
}
}

@ -0,0 +1,45 @@
/****************************************************************************
* This software is part of the gCube Project.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: ScopeTest.java
****************************************************************************
* @author <a href="mailto:daniele.strollo@isti.cnr.it">Daniele Strollo</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.tests;
import java.io.File;
import org.gcube.resourcemanagement.support.managers.scope.ScopeManager;
/**
* Makes tests on ScopeManager.
* @author Daniele Strollo (ISTI-CNR)
*/
public class ScopeTest {
public static final void testLoadScopes() {
ScopeManager.setScopeConfigFile("test-suite" + File.separator + "scopes" + File.separator + "scopedata_admin.xml");
try {
ScopeManager.update();
} catch (Exception e) {
e.printStackTrace();
System.out.println("Scopes retrievial [ERR]");
return;
}
System.out.println("Scopes retrievial [DONE]");
}
public static void main(final String[] args) {
testLoadScopes();
}
}

@ -0,0 +1,31 @@
/****************************************************************************
* This software is part of the gCube Project.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: AllowedResourceTypes.java
****************************************************************************
* @author <a href="mailto:daniele.strollo@isti.cnr.it">Daniele Strollo</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.types;
/**
* @author Massimiliano Assante (ISTI-CNR)
*
*/
public enum AllowedResourceTypes {
GHN(),
RunningInstance(),
Service(),
VIEW(),
GenericResource(),
RuntimeResource(),
Collection();
}

@ -0,0 +1,65 @@
/****************************************************************************
* This software is part of the gCube Project.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: Assertion.java
****************************************************************************
* @author <a href="mailto:daniele.strollo@isti.cnr.it">Daniele Strollo</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.utils;
import java.io.Serializable;
/**
* General purpose assertion handler.
* Assertion can be generalized to check a boolean expression and
* to raise an exception in correspondence to a failure happening
* during checking.
* <pre>
* <b>Example:</b>
*
* <b>Assertion</b>&lt;<i>TheExceptionType</i>&gt; assertion = new Assertion&lt;ParamException&gt; ();
* assertion.<b>validate</b> (param != null, new <i>TheExceptionType</i>("invalid parameter null"));
*
* <b>or</b>, in a more compact form:
* <i>// The exception to throw in case of failure
* // during the evaluation of the expected condition</i>
* new <b>Assertion</b>&lt;<i>TheExceptionType</i>&gt;().<b>validate</b>(
* i>5, <i>// The expected boolean <b>condition</b></i>
* new <i>TheExceptionType</i>("Parameter must be greater than 5")); <i>//The <b>error</b> message</i>
*
* </pre>
*
* @author Daniele Strollo (ISTI-CNR)
*/
public class Assertion <T extends Throwable> implements Serializable {
private static final long serialVersionUID = -2007903339251667541L;
/**
* Makes an assertion and if the expression evaluation fails, throws an
* exception of type T.
* <pre>
* Example:
* new Assertion&lt;MyException&gt;().validate(whatExpected, new MyException("guard failed"));
* </pre>
* @param assertion the boolean expression to evaluate
* @param exc the exception to throw if the condition does not hold
* @throws T the exception extending {@link java.lang.Throwable}
*/
public final void validate(final boolean assertion, final T exc)
throws T {
// TOCHECK junit.framework.Assert.assertTrue(assertion);
if (!assertion) {
throw exc;
}
}
}

@ -0,0 +1,60 @@
/****************************************************************************
* This software is part of the gCube Project.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: ServerConsole.java
****************************************************************************
* @author <a href="mailto:daniele.strollo@isti.cnr.it">Daniele Strollo</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.utils;
import org.gcube.common.core.utils.logging.GCUBEClientLog;
import org.gcube.resourcemanagement.support.managers.resources.AbstractResourceManager;
/**
* @author Daniele Strollo (ISTI-CNR)
*
*/
public class ServerConsole {
private static final GCUBEClientLog LOGGER = new GCUBEClientLog(AbstractResourceManager.class);
private static final String LOG_PREFIX = "*** [RMP] ";
public static void error(final String prefix, final String msg) {
LOGGER.error(LOG_PREFIX + ((prefix != null) ? prefix + " " : "") + msg);
}
public static void error(final String prefix, final Throwable exc) {
LOGGER.error(LOG_PREFIX + ((prefix != null) ? prefix : ""), exc);
}
public static void error(final String prefix, final String msg, final Throwable exc) {
LOGGER.error(LOG_PREFIX + ((prefix != null) ? prefix + " " : "") + msg, exc);
}
public static void warn(final String prefix, final String msg) {
LOGGER.warn(LOG_PREFIX + ((prefix != null) ? prefix + " " : "") + msg);
}
public static void warn(final String prefix, final String msg, final Throwable exc) {
LOGGER.warn(LOG_PREFIX + ((prefix != null) ? prefix + " " : "") + msg, exc);
}
public static void info(final String prefix, final String msg) {
LOGGER.info(LOG_PREFIX + ((prefix != null) ? prefix + " " : "") + msg);
}
public static void trace(final String prefix, final String msg) {
LOGGER.trace(LOG_PREFIX + ((prefix != null) ? prefix + " " : "") + msg);
}
public static void debug(final String prefix, final String msg) {
LOGGER.debug(LOG_PREFIX + ((prefix != null) ? prefix + " " : "") + msg);
}
public static void fatal(final String prefix, final String msg) {
LOGGER.fatal(LOG_PREFIX + ((prefix != null) ? prefix + " " : "") + msg);
}
public static void fatal(final String prefix, final String msg, final Throwable exc) {
LOGGER.fatal(LOG_PREFIX + ((prefix != null) ? prefix + " " : "") + msg, exc);
}
}

@ -0,0 +1,62 @@
/****************************************************************************
* This software is part of the gCube Project.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: PersistenceHandler.java
****************************************************************************
* @author <a href="mailto:daniele.strollo@isti.cnr.it">Daniele Strollo</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.utils.persistence;
/**
* @author Daniele Strollo (ISTI-CNR)
*
*/
public interface PersistenceHandler<T> {
/**
* The code to execute once the persistent object is refreshed.
*/
void onRefresh();
/**
* Automatically invoked by the library at instantiation
* of persistent items.
* Used to make initializations before starting the persistence
* manager.
*/
void onLoad();
/**
* When the item need no more to be persisted
* the refresh loop is closed and this method is
* invoked.
*/
void onDestroy();
/**
* Requires the destroy of the persistent resource.
* The persistent file will be deleted and the onDestroy
* event will be raised.
*/
void destroy();
/**
* The implementation to retrieve data from the persistence manager.
* @return
*/
T getData();
/**
* Sets the new data to persist.
* @param data
*/
void setData(final T data);
}

@ -0,0 +1,152 @@
/****************************************************************************
* This software is part of the gCube Project.
* Site: http://www.gcube-system.org/
****************************************************************************
* The gCube/gCore software is licensed as Free Open Source software
* conveying to the EUPL (http://ec.europa.eu/idabc/eupl).
* The software and documentation is provided by its authors/distributors
* "as is" and no expressed or
* implied warranty is given for its use, quality or fitness for a
* particular case.
****************************************************************************
* Filename: PersistentItem.java
****************************************************************************
* @author <a href="mailto:daniele.strollo@isti.cnr.it">Daniele Strollo</a>
***************************************************************************/
package org.gcube.resourcemanagement.support.utils.persistence;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.Serializable;
import java.util.List;
import java.util.Vector;
import org.gcube.resourcemanagement.support.utils.ServerConsole;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.StaxDriver;
/**
* Wrapping for data that can be persisted on the filesystem.
* <pre>
* new <b>PersistentItem</b><i>&lt;DataTypeToPersist&gt;</i>(fileToStore, refreshDelay) {
* <b>public void</b> onLoad() {
* <i>//...</i>
* }
* <i>
* // The other methods to overload
* // ...
* </i>
* }
* </pre>
* @author Daniele Strollo (ISTI-CNR)
*/
public abstract class PersistentItem<T extends Serializable>
implements PersistenceHandler<T> {
protected static final String LOG_PREFIX = "[PERSISTENCE]";
private long refreshDelay = -1;
private boolean processClosed = false;
private String persistenceFileName = null;
private XStream serializer = null;
/**
* @deprecated for internal use only.
*/
public PersistentItem() {
}
public PersistentItem(final String persistenceFileName) {
this(persistenceFileName, -1);
}
public PersistentItem(final String persistenceFileName, final long refreshDelay) {
this.setRefreshDelay(refreshDelay);
this.setPersistenceFileName(persistenceFileName);
this.onLoad();
// loops to retrieve the data to persist
if (this.refreshDelay > 0) {
new Thread() {
public void run() {
while (!processClosed) {
try {
sleep(refreshDelay);
} catch (final InterruptedException e) {
ServerConsole.error(LOG_PREFIX, e);
}
// time elapsed... do refresh
onRefresh();
}
}
} .start();
}
}
public PersistentItem(final T data, final String persistenceFileName, final long refreshDelay) {
this(persistenceFileName, refreshDelay);
this.setData(data);
}
protected final void setPersistenceFileName(final String persistenceFileName) {
this.persistenceFileName = persistenceFileName;
}
protected final void setRefreshDelay(final long refreshDelay) {
this.refreshDelay = refreshDelay;
}
private synchronized XStream getSerializer() {
if (this.serializer == null) {
StaxDriver driver = new StaxDriver();
driver.setRepairingNamespace(false);
this.serializer = new XStream(driver);
this.serializer.addDefaultImplementation(Vector.class, List.class);
}
return this.serializer;
}
public final void destroy() {
this.processClosed = true;
// Thread has finished... invoking destroy
onDestroy();
}
/**
* Returns the corresponding persistent data.
* @return
*/
@SuppressWarnings("unchecked")
public final T getData() {
try {
StringBuilder xml = new StringBuilder();
BufferedReader reader = new BufferedReader(new FileReader(persistenceFileName));
String currLine = null;
while ((currLine = reader.readLine()) != null) {
xml.append(currLine);
}
return (T) this.getSerializer().fromXML(xml.toString());
} catch (Exception e) {
ServerConsole.error(LOG_PREFIX, e);
return null;
}
}
public final void setData(final T data) {
String xmlData = this.getSerializer().toXML(data);
BufferedOutputStream mine = null;
try {
mine = new BufferedOutputStream(new FileOutputStream(persistenceFileName));
mine.write(xmlData.getBytes());
//mine.flush();
mine.close();
} catch (Exception e) {
ServerConsole.error(LOG_PREFIX, e);
return;
}
}
}

@ -0,0 +1,46 @@
package org.gcube.resourcemanagement.support.utils.persistence;
import java.io.File;
import org.gcube.common.core.scope.GCUBEScope;
import org.gcube.resourcemanagement.support.managers.scope.ScopeManager;
import org.gcube.resourcemanagement.support.utils.ServerConsole;
public class TestPersistence {
/**
* @param args
*/
public static void main(final String[] args) {
PersistentItem<GCUBEScope[]> persistentScopes = new PersistentItem<GCUBEScope[]>("data.xml", 10000) {
// Builds the data to persist
private void refreshData() {
try {
GCUBEScope[] toStore =
ScopeManager.getAvailableScopes().values().toArray(new GCUBEScope[]{});
this.setData(toStore);
} catch (Exception e) {
ServerConsole.error(LOG_PREFIX, e);
}
}
public void onLoad() {
ScopeManager.setScopeConfigFile("test-suite" + File.separator + "scopes" + File.separator + "scopedata_admin.xml");
this.refreshData();
}
public void onRefresh() {
this.refreshData();
GCUBEScope[] scopes = this.getData();
System.out.println(scopes);
}
public void onDestroy() {
this.setData(null);
}
};
}
}

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<infrastructures>
<!--
<infrastructure>
<name>d4science</name>
<vos>
<vo>
<name>d4science</name>
<src>ServiceMap_d4science.research-infrastructures.eu.xml</src>
<scope>/d4science.research-infrastructures.eu</scope>
</vo>
<vo>
<name>d4science/FARM</name>
<src>ServiceMap_FARM.xml</src>
<scope>/d4science.research-infrastructures.eu/FARM</scope>
</vo>
<vo>
<name>d4science/Ecosystem</name>
<src>ServiceMap_Ecosystem.xml</src>
<scope>/d4science.research-infrastructures.eu/Ecosystem</scope>
</vo>
</vos>
</infrastructure>
-->
<infrastructure>
<name>gcube</name>
<vos>
<vo>
<name>gcube</name>
<src>ServiceMap_gcube.xml</src>
<scope>/gcube</scope>
</vo>
<vo>
<name>gcube/devsec</name>
<src>ServiceMap_devsec.xml</src>
<scope>/gcube/devsec</scope>
</vo>
</vos>
</infrastructure>
<!--
<infrastructure>
<name>testing</name>
<vos>
<vo>
<name>testing</name>
<src>ServiceMap_testing.xml</src>
<scope>/testing</scope>
</vo>
<vo>
<name>testing/vo1</name>
<src>ServiceMap_vo1.xml</src>
<scope>/testing/vo1</scope>
</vo>
</vos>
</infrastructure>
-->
</infrastructures>

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8"?>
<infrastructures>
<infrastructure>
<name>d4science</name>
<vos>
<vo>
<name>d4science</name>
<src>ServiceMap_d4science.research-infrastructures.eu.xml</src>
<scope>/d4science.research-infrastructures.eu</scope>
</vo>
<vo>
<name>d4science/FARM</name>
<src>ServiceMap_FARM.xml</src>
<scope>/d4science.research-infrastructures.eu/FARM</scope>
</vo>
<vo>
<name>d4science/Ecosystem</name>
<src>ServiceMap_Ecosystem.xml</src>
<scope>/d4science.research-infrastructures.eu/Ecosystem</scope>
</vo>
<vo>
<name>d4science/INSPIRE</name>
<src>ServiceMap_INSPIRE.xml</src>
<scope>/d4science.research-infrastructures.eu/INSPIRE</scope>
</vo>
<vo>
<name>d4science/Arts-Humanities</name>
<src>ServiceMap_Arts-Humanities.xml</src>
<scope>/d4science.research-infrastructures.eu/Arts-Humanities</scope>
</vo>
</vos>
</infrastructure>
<infrastructure>
<name>gcube</name>
<vos>
<vo>
<name>gcube</name>
<src>ServiceMap_gcube.xml</src>
<scope>/gcube</scope>
</vo>
<vo>
<name>gcube/devsec</name>
<src>ServiceMap_devsec.xml</src>
<scope>/gcube/devsec</scope>
</vo>
<vo>
<name>gcube/devNext</name>
<src>ServiceMap_devNext.xml</src>
<scope>/gcube/devNext</scope>
</vo>
</vos>
</infrastructure>
</infrastructures>
Loading…
Cancel
Save