merged
git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/spatial-data/sdi-service@152450 82a268e6-3cf1-43bd-a215-b396298e98cfmaster
parent
3e4744f651
commit
f05904a914
@ -1,6 +1,7 @@
|
||||
eclipse.preferences.version=1
|
||||
encoding//src/main/java=UTF-8
|
||||
encoding//src/main/resources=UTF-8
|
||||
encoding//src/main/webapp=UTF-8
|
||||
encoding//src/test/java=UTF-8
|
||||
encoding//src/test/resources=UTF-8
|
||||
encoding/<project>=UTF-8
|
||||
|
@ -1,8 +1,8 @@
|
||||
eclipse.preferences.version=1
|
||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
|
||||
org.eclipse.jdt.core.compiler.compliance=1.7
|
||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
|
||||
org.eclipse.jdt.core.compiler.compliance=1.8
|
||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
|
||||
org.eclipse.jdt.core.compiler.source=1.7
|
||||
org.eclipse.jdt.core.compiler.source=1.8
|
||||
|
@ -1,8 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<faceted-project>
|
||||
<fixed facet="wst.jsdt.web"/>
|
||||
<installed facet="java" version="1.7"/>
|
||||
<installed facet="jst.web" version="3.0"/>
|
||||
<installed facet="jst.jaxrs" version="2.0"/>
|
||||
<installed facet="wst.jsdt.web" version="1.0"/>
|
||||
<installed facet="java" version="1.8"/>
|
||||
</faceted-project>
|
||||
|
@ -0,0 +1,38 @@
|
||||
package org.gcube.spatial.data.sdi;
|
||||
import javax.xml.bind.annotation.XmlRootElement;
|
||||
|
||||
import org.gcube.smartgears.handlers.application.ApplicationLifecycleEvent.Start;
|
||||
import org.gcube.smartgears.handlers.application.ApplicationLifecycleEvent.Stop;
|
||||
import org.gcube.smartgears.handlers.application.ApplicationLifecycleHandler;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@Slf4j
|
||||
@XmlRootElement(name = "sdi-lifecycle")
|
||||
public class SDIServiceLifecycleManager extends ApplicationLifecycleHandler{
|
||||
|
||||
|
||||
|
||||
public SDIServiceLifecycleManager() {
|
||||
// System.out.println("SDI Lifecycle manager created ");
|
||||
// System.out.println("persistence manager is "+persistence);
|
||||
// System.out.println("template manager is "+templateManager);
|
||||
// for(StackTraceElement el:Thread.currentThread().getStackTrace())
|
||||
// System.out.println(""+el);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onStart(Start e) {
|
||||
super.onStart(e);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop(Stop e) {
|
||||
super.onStop(e);
|
||||
// System.out.println("********************** SDI SHUTDOWN *****************************");
|
||||
// persistence.shutdown();
|
||||
}
|
||||
|
||||
}
|
@ -1,33 +1,22 @@
|
||||
package org.gcube.spatial.data.sdi;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.gcube.smartgears.ApplicationManager;
|
||||
import org.gcube.smartgears.ContextProvider;
|
||||
import org.gcube.smartgears.context.application.ApplicationContext;
|
||||
import org.gcube.spatial.data.sdi.engine.MetadataTemplateManager;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@Slf4j
|
||||
public class SDIServiceManager implements ApplicationManager {
|
||||
|
||||
@Inject
|
||||
MetadataTemplateManager templateManager;
|
||||
|
||||
|
||||
@Override
|
||||
public void onInit() {
|
||||
log.trace("Initializing template manager..");
|
||||
|
||||
ApplicationContext ctx = ContextProvider.get();
|
||||
templateManager.init(ctx);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onShutdown() {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,10 +1,14 @@
|
||||
package org.gcube.spatial.data.sdi.engine;
|
||||
|
||||
import org.gcube.spatial.data.sdi.engine.impl.faults.ConfigurationNotFoundException;
|
||||
import org.gcube.spatial.data.sdi.engine.impl.faults.ServiceRegistrationException;
|
||||
import org.gcube.spatial.data.sdi.model.health.ServiceHealthReport;
|
||||
import org.gcube.spatial.data.sdi.model.service.GeoServerClusterConfiguration;
|
||||
import org.gcube.spatial.data.sdi.model.services.GeoServerDefinition;
|
||||
|
||||
public interface GISManager {
|
||||
|
||||
public GeoServerClusterConfiguration getConfiguration() throws ConfigurationNotFoundException;
|
||||
|
||||
public ServiceHealthReport getHealthReport();
|
||||
public String registerService(GeoServerDefinition definition)throws ServiceRegistrationException;
|
||||
}
|
||||
|
@ -1,10 +1,15 @@
|
||||
package org.gcube.spatial.data.sdi.engine;
|
||||
|
||||
import org.gcube.spatial.data.sdi.engine.impl.faults.ConfigurationNotFoundException;
|
||||
import org.gcube.spatial.data.sdi.engine.impl.faults.ServiceRegistrationException;
|
||||
import org.gcube.spatial.data.sdi.model.health.ServiceHealthReport;
|
||||
import org.gcube.spatial.data.sdi.model.service.GeoNetworkConfiguration;
|
||||
import org.gcube.spatial.data.sdi.model.services.GeoNetworkServiceDefinition;
|
||||
|
||||
public interface GeoNetworkManager {
|
||||
|
||||
public GeoNetworkConfiguration getConfiguration() throws ConfigurationNotFoundException;
|
||||
public ServiceHealthReport getHealthReport();
|
||||
public String registerService(GeoNetworkServiceDefinition definition)throws ServiceRegistrationException;
|
||||
|
||||
}
|
||||
|
@ -1,18 +1,19 @@
|
||||
package org.gcube.spatial.data.sdi.engine;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Set;
|
||||
|
||||
import org.gcube.smartgears.context.application.ApplicationContext;
|
||||
import org.gcube.spatial.data.sdi.model.metadata.MetadataReport;
|
||||
import org.gcube.spatial.data.sdi.model.metadata.TemplateDescriptor;
|
||||
import javax.xml.transform.TransformerException;
|
||||
|
||||
import org.gcube.spatial.data.sdi.engine.impl.metadata.TemplateApplicationReport;
|
||||
import org.gcube.spatial.data.sdi.model.metadata.TemplateCollection;
|
||||
import org.gcube.spatial.data.sdi.model.metadata.TemplateInvocation;
|
||||
|
||||
public interface MetadataTemplateManager {
|
||||
|
||||
|
||||
public Set<TemplateDescriptor> getAvailableTemplates();
|
||||
public MetadataReport applyTemplates(File original,Set<TemplateInvocation> invocations);
|
||||
public void init(ApplicationContext ctx);
|
||||
public TemplateCollection getAvailableTemplates();
|
||||
public TemplateApplicationReport applyTemplates(File original,Set<TemplateInvocation> invocations) throws IOException, TransformerException;
|
||||
|
||||
}
|
||||
|
@ -1,9 +1,15 @@
|
||||
package org.gcube.spatial.data.sdi.engine;
|
||||
|
||||
import org.gcube.spatial.data.sdi.engine.impl.faults.ServiceRegistrationException;
|
||||
import org.gcube.spatial.data.sdi.model.ScopeConfiguration;
|
||||
import org.gcube.spatial.data.sdi.model.health.HealthReport;
|
||||
import org.gcube.spatial.data.sdi.model.services.ServiceDefinition;
|
||||
|
||||
public interface SDIManager {
|
||||
|
||||
public ScopeConfiguration getContextConfiguration();
|
||||
|
||||
public HealthReport getHealthReport();
|
||||
|
||||
public String registerService(ServiceDefinition definition) throws ServiceRegistrationException;
|
||||
}
|
||||
|
@ -0,0 +1,16 @@
|
||||
package org.gcube.spatial.data.sdi.engine;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
public interface TemporaryPersistence {
|
||||
|
||||
public void init() throws IOException;
|
||||
public String store(InputStream is) throws FileNotFoundException, IOException;
|
||||
public void clean(String id) throws IOException;
|
||||
public void update(String id, InputStream is) throws FileNotFoundException, IOException;
|
||||
public File getById(String id) throws FileNotFoundException;
|
||||
public void shutdown();
|
||||
}
|
@ -1,10 +1,14 @@
|
||||
package org.gcube.spatial.data.sdi.engine;
|
||||
|
||||
import org.gcube.spatial.data.sdi.engine.impl.faults.ConfigurationNotFoundException;
|
||||
import org.gcube.spatial.data.sdi.engine.impl.faults.ServiceRegistrationException;
|
||||
import org.gcube.spatial.data.sdi.model.health.ServiceHealthReport;
|
||||
import org.gcube.spatial.data.sdi.model.service.ThreddsConfiguration;
|
||||
import org.gcube.spatial.data.sdi.model.services.ThreddsDefinition;
|
||||
|
||||
public interface ThreddsManager {
|
||||
|
||||
public ThreddsConfiguration getConfiguration() throws ConfigurationNotFoundException;
|
||||
|
||||
public ServiceHealthReport getHealthReport();
|
||||
public String registerService(ThreddsDefinition definition)throws ServiceRegistrationException;
|
||||
}
|
||||
|
@ -0,0 +1,36 @@
|
||||
package org.gcube.spatial.data.sdi.engine.impl;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@Slf4j
|
||||
public class NetUtils {
|
||||
|
||||
public static boolean isUp(String url) throws IOException {
|
||||
String finalUrl=resolveRedirects(url);
|
||||
log.debug("Checking {} availability .. ",finalUrl);
|
||||
URL urlObj=new URL(finalUrl);
|
||||
HttpURLConnection connection = (HttpURLConnection) urlObj.openConnection();
|
||||
int status=connection.getResponseCode();
|
||||
log.trace("HTTP Status response code for {} is {} ",finalUrl,status);
|
||||
return status>=200&&status<300;
|
||||
}
|
||||
|
||||
|
||||
public static String resolveRedirects(String url) throws IOException{
|
||||
log.debug("Resolving redirect for url {} ",url);
|
||||
URL urlObj=new URL(url);
|
||||
HttpURLConnection connection = (HttpURLConnection) urlObj.openConnection();
|
||||
int status=connection.getResponseCode();
|
||||
if(status>=300&&status<400){
|
||||
String newUrl=connection.getHeaderField("Location");
|
||||
log.debug("Following redirect from {} to {} ",url,newUrl);
|
||||
return resolveRedirects(newUrl);
|
||||
}else return url;
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,178 @@
|
||||
package org.gcube.spatial.data.sdi.engine.impl;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileFilter;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.annotation.PreDestroy;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.gcube.spatial.data.sdi.LocalConfiguration;
|
||||
import org.gcube.spatial.data.sdi.engine.TemporaryPersistence;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@Slf4j
|
||||
@Singleton
|
||||
public class TemporaryPersistenceImpl implements TemporaryPersistence {
|
||||
|
||||
private final static String UPLOADING_FILE_SUFFIX=".part";
|
||||
|
||||
private final static FileFilter TO_CHECK_FILES_FILTER=new FileFilter() {
|
||||
|
||||
@Override
|
||||
public boolean accept(File pathname) {
|
||||
return !pathname.isDirectory()&&!pathname.getName().endsWith(UPLOADING_FILE_SUFFIX);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// *************** CHECKER THREAD
|
||||
|
||||
@AllArgsConstructor
|
||||
private static class CleanUpThread implements Runnable{
|
||||
private Long TTL;
|
||||
private File persistenceLocation;
|
||||
private FileFilter toCheckFiles;
|
||||
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
try{
|
||||
log.debug("Executing cleanup..");
|
||||
long count=0l;
|
||||
for(File found:persistenceLocation.listFiles(toCheckFiles))
|
||||
if(found.lastModified()-System.currentTimeMillis()>=TTL){
|
||||
try{
|
||||
Files.delete(found.toPath());
|
||||
}catch(Throwable t){
|
||||
log.warn("Unable to delete {} ",found.getAbsolutePath(),t);
|
||||
}
|
||||
}
|
||||
log.debug("Cleaned up {} files.",count);
|
||||
}catch(Throwable t){
|
||||
log.error("Unexpected error.",t);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// private static TemporaryPersistenceImpl singleton=null;
|
||||
|
||||
// *************** INSTANCE LOGIC
|
||||
|
||||
private File persistenceLocation=null;
|
||||
|
||||
private ScheduledExecutorService service=null;
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
try {
|
||||
persistenceLocation=Files.createTempDirectory("SDI").toFile();
|
||||
System.out.println("************************************** TEMPORARY PERSISTENCE INIT **************************");
|
||||
System.out.println("SDI-Service - Temporary persistence location is "+persistenceLocation.getAbsolutePath());
|
||||
System.out.println("**************************************");
|
||||
|
||||
log.trace("Temporary persistence is "+persistenceLocation.getAbsolutePath());
|
||||
|
||||
// init check thread
|
||||
service = new ScheduledThreadPoolExecutor (1);
|
||||
|
||||
|
||||
long TTL=Long.parseLong(LocalConfiguration.get().getProperty(LocalConfiguration.TEMPORARY_PERSISTENCE_TTL, "120000"));
|
||||
log.debug("Temp TTL is {} ",TTL);
|
||||
long delay=TTL/4;
|
||||
|
||||
service.scheduleWithFixedDelay(new CleanUpThread(TTL, persistenceLocation, TO_CHECK_FILES_FILTER), delay, delay, TimeUnit.MILLISECONDS);
|
||||
}catch(Throwable t) {
|
||||
throw new RuntimeException("Unable to init persistence ",t);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public File getById(String id) throws FileNotFoundException {
|
||||
File toReturn=new File(persistenceLocation,id);
|
||||
if(!toReturn.exists()) throw new FileNotFoundException();
|
||||
return toReturn;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String store(InputStream is) throws FileNotFoundException, IOException {
|
||||
String partUUID=getUUID()+".part";
|
||||
log.debug("Storing file "+partUUID);
|
||||
File created=transferStream(is, new File(persistenceLocation,partUUID));
|
||||
String toReturn=created.getName().substring(0, created.getName().lastIndexOf(".")-1);
|
||||
created.renameTo(new File(persistenceLocation,toReturn));
|
||||
log.debug("Completed. Part renamed to "+toReturn);
|
||||
return toReturn;
|
||||
}
|
||||
|
||||
@Override
|
||||
@PreDestroy
|
||||
public void clean(String id){
|
||||
try{
|
||||
System.out.println("*************************************** TEMPORARY PERSISTENCE PRE DESTROY ******************************");
|
||||
Files.delete(Paths.get(persistenceLocation.getAbsolutePath(), id));
|
||||
}catch(Throwable t) {
|
||||
throw new RuntimeException("Unable to clean up temporary persistence. ",t);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void shutdown() {
|
||||
log.debug("Shutting down persistence..");
|
||||
service.shutdownNow();
|
||||
log.debug("Clearing persistence folder..");
|
||||
for(File f:persistenceLocation.listFiles())
|
||||
try{
|
||||
if(!f.delete()) f.deleteOnExit();
|
||||
}catch(Throwable t){
|
||||
log.warn("Exception while clearing persistence.. ",t);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(String id, InputStream is) throws FileNotFoundException, IOException {
|
||||
File toUpdate=getById(id);
|
||||
transferStream(is,toUpdate);
|
||||
}
|
||||
|
||||
private static File transferStream(InputStream in, File destination) throws FileNotFoundException, IOException{
|
||||
|
||||
FileOutputStream out=null;
|
||||
try{
|
||||
;
|
||||
out=new FileOutputStream(destination,false);
|
||||
|
||||
int read = 0;
|
||||
byte[] bytes = new byte[1024];
|
||||
|
||||
while ((read = in.read(bytes)) != -1) {
|
||||
out.write(bytes, 0, read);
|
||||
}
|
||||
out.flush();
|
||||
return destination;
|
||||
}finally{
|
||||
if(out!=null) IOUtils.closeQuietly(out);
|
||||
}
|
||||
}
|
||||
|
||||
private static String getUUID(){
|
||||
return UUID.randomUUID().toString().replace(" ", "_");
|
||||
}
|
||||
}
|
@ -0,0 +1,156 @@
|
||||
package org.gcube.spatial.data.sdi.engine.impl.cache;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.gcube.common.resources.gcore.GCoreEndpoint;
|
||||
import org.gcube.common.resources.gcore.ServiceEndpoint;
|
||||
import org.gcube.common.resources.gcore.ServiceEndpoint.Profile;
|
||||
import org.gcube.common.resources.gcore.common.Platform;
|
||||
import org.gcube.spatial.data.geonetwork.utils.ScopeUtils;
|
||||
import org.gcube.spatial.data.sdi.LocalConfiguration;
|
||||
import org.gcube.spatial.data.sdi.engine.impl.faults.InvalidServiceDefinitionException;
|
||||
import org.gcube.spatial.data.sdi.engine.impl.faults.ServiceRegistrationException;
|
||||
import org.gcube.spatial.data.sdi.model.health.Level;
|
||||
import org.gcube.spatial.data.sdi.model.health.ServiceHealthReport;
|
||||
import org.gcube.spatial.data.sdi.model.health.Status;
|
||||
import org.gcube.spatial.data.sdi.model.services.ServiceDefinition;
|
||||
|
||||
import lombok.Synchronized;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@Slf4j
|
||||
public abstract class AbstractISModule<T> implements ISModule<T> {
|
||||
|
||||
protected abstract String getGCoreEndpointServiceClass();
|
||||
protected abstract String getGCoreEndpointServiceName();
|
||||
protected abstract String getServiceEndpointAccessPointName();
|
||||
protected abstract String getServiceEndpointCategory();
|
||||
protected abstract String getServiceEndpointPlatformName();
|
||||
|
||||
protected abstract String getManagedServiceType();
|
||||
|
||||
|
||||
@Override
|
||||
public ServiceHealthReport getHealthReport() {
|
||||
List<Status> checkStatuses=new ArrayList<>();
|
||||
try {
|
||||
|
||||
log.trace("Checking {} heatlh under context {} ",getManagedServiceType(),ScopeUtils.getCurrentScope());
|
||||
//Check if existing
|
||||
List<GCoreEndpoint> gCoreEndpoints=getGcoreEndpoints();
|
||||
List<ServiceEndpoint> serviceEndpoints=getServiceEndpoints();
|
||||
log.debug("Found {} GC Endpoints and {} SE Endpoints",gCoreEndpoints.size(),serviceEndpoints.size());
|
||||
|
||||
if(serviceEndpoints.isEmpty())
|
||||
if(gCoreEndpoints.isEmpty())checkStatuses.add(new Status("No "+getManagedServiceType()+" found in context "+ScopeUtils.getCurrentScope(),Level.ERROR));
|
||||
else checkStatuses.add(new Status("Unregistered "+getManagedServiceType()+" instances found. Check following messages",Level.ERROR));
|
||||
|
||||
//For each GC check for missing SE
|
||||
for(GCoreEndpoint gc:gCoreEndpoints) {
|
||||
String hostname= gc.profile().endpoints().iterator().next().uri().getHost();
|
||||
if(ISUtils.getGCEByHostname(hostname, serviceEndpoints)==null) {
|
||||
String msg="Found unregistered "+getManagedServiceType()+" hosted on "+hostname;
|
||||
log.debug(msg);
|
||||
checkStatuses.add(new Status(msg,Level.WARNING));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for(ServiceEndpoint se : serviceEndpoints) {
|
||||
checkStatuses.addAll(performInstanceCheck(se));
|
||||
}
|
||||
|
||||
}catch(Throwable t) {
|
||||
log.error("Unable to perform checks", t);
|
||||
checkStatuses.add(new Status("Internal error while checking "+getManagedServiceType()+" Status.",Level.ERROR));
|
||||
}
|
||||
return new ServiceHealthReport(checkStatuses);
|
||||
}
|
||||
|
||||
protected abstract List<Status> performInstanceCheck(ServiceEndpoint se);
|
||||
|
||||
|
||||
protected List<GCoreEndpoint> getGcoreEndpoints(){
|
||||
String geClass=getGCoreEndpointServiceClass();
|
||||
String geName=getGCoreEndpointServiceName();
|
||||
return ISUtils.queryForGCoreEndpoint(geClass, geName);
|
||||
}
|
||||
|
||||
|
||||
protected List<ServiceEndpoint> getServiceEndpoints(){
|
||||
String seCategory=getServiceEndpointCategory();
|
||||
String sePlatform=getServiceEndpointPlatformName();
|
||||
return ISUtils.queryForServiceEndpoints(seCategory, sePlatform);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Synchronized
|
||||
public String registerService(ServiceDefinition definition) throws ServiceRegistrationException {
|
||||
log.info("Registering {} ",definition);
|
||||
log.debug("Checking definition type..");
|
||||
checkDefinitionType(definition);
|
||||
log.debug("Checking IS ..");
|
||||
checkDefinition(definition);
|
||||
log.debug("Performing type specific checks..");
|
||||
checkDefinitionForServiceType(definition);
|
||||
log.debug("Preparing ServiceEndpoint.. ");
|
||||
ServiceEndpoint ep=prepareEndpoint(definition);
|
||||
log.debug("Publishing resource..");
|
||||
String id=ISUtils.registerService(ep);
|
||||
|
||||
List<String> registered=null;
|
||||
long registrationTime=System.currentTimeMillis();
|
||||
long timeout=Long.parseLong(LocalConfiguration.get().getProperty(LocalConfiguration.IS_REGISTRATION_TIMEOUT));
|
||||
do{
|
||||
log.debug("Waiting for IS to update. Passed {} ms.",(System.currentTimeMillis()-registrationTime));
|
||||
try{Thread.sleep(500);
|
||||
}catch(Exception e) {}
|
||||
|
||||
registered=ISUtils.queryById(id);
|
||||
}while(registered.isEmpty()&&((System.currentTimeMillis()-registrationTime)<=timeout));
|
||||
if(registered.isEmpty()) {
|
||||
log.warn("Registered resource [ID :{}] was not found before Timeout of {} ms. Returning id. ",id,timeout);
|
||||
return id;
|
||||
}else return registered.get(0);
|
||||
}
|
||||
|
||||
|
||||
protected abstract void checkDefinitionForServiceType(ServiceDefinition definition) throws InvalidServiceDefinitionException;
|
||||
protected abstract void checkDefinitionType(ServiceDefinition definition) throws InvalidServiceDefinitionException;
|
||||
|
||||
protected void checkDefinition(ServiceDefinition definition) throws ServiceRegistrationException {
|
||||
String hostname=definition.getHostname();
|
||||
List<ServiceEndpoint> serviceEndpoints=getServiceEndpoints();
|
||||
ServiceEndpoint existing=ISUtils.getGCEByHostname(hostname, serviceEndpoints);
|
||||
if(existing!=null) {
|
||||
throw new ServiceRegistrationException("Service is already registered");
|
||||
}
|
||||
List<GCoreEndpoint> gCoreNodes=getGcoreEndpoints();
|
||||
GCoreEndpoint running=ISUtils.getGCEByHostname(hostname, gCoreNodes);
|
||||
if(running==null) throw new ServiceRegistrationException("No GCoreEndpoint found for "+definition);
|
||||
}
|
||||
|
||||
protected ServiceEndpoint prepareEndpoint(ServiceDefinition definition) {
|
||||
ServiceEndpoint toCreate=new ServiceEndpoint();
|
||||
Profile profile=toCreate.newProfile();
|
||||
profile.category(getServiceEndpointCategory());
|
||||
profile.description(definition.getDescription());
|
||||
Platform platform=profile.newPlatform();
|
||||
platform.name(getServiceEndpointPlatformName()).
|
||||
version(definition.getMajorVersion()).
|
||||
minorVersion(definition.getMinorVersion()).
|
||||
revisionVersion(definition.getReleaseVersion());
|
||||
|
||||
org.gcube.common.resources.gcore.ServiceEndpoint.Runtime runtime=profile.newRuntime();
|
||||
runtime.hostedOn(definition.getHostname());
|
||||
|
||||
GCoreEndpoint relatedGHN=ISUtils.getGCEByHostname(definition.getHostname(), getGcoreEndpoints());
|
||||
|
||||
runtime.ghnId(relatedGHN.id());
|
||||
runtime.status("READY");
|
||||
|
||||
return toCreate;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
package org.gcube.spatial.data.sdi.engine.impl.cache;
|
||||
|
||||
import org.gcube.spatial.data.sdi.engine.impl.faults.ConfigurationNotFoundException;
|
||||
import org.gcube.spatial.data.sdi.engine.impl.faults.ServiceRegistrationException;
|
||||
import org.gcube.spatial.data.sdi.model.health.ServiceHealthReport;
|
||||
import org.gcube.spatial.data.sdi.model.services.ServiceDefinition;
|
||||
|
||||
public interface ISModule<T> {
|
||||
|
||||
public T getObject()throws ConfigurationNotFoundException;
|
||||
public ServiceHealthReport getHealthReport();
|
||||
public String registerService(ServiceDefinition definition) throws ServiceRegistrationException;
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
package org.gcube.spatial.data.sdi.engine.impl.cache;
|
||||
|
||||
import org.gcube.spatial.data.sdi.engine.impl.faults.ConfigurationNotFoundException;
|
||||
|
||||
public interface ObjectRetriever<T> {
|
||||
|
||||
public T getObject()throws ConfigurationNotFoundException;
|
||||
|
||||
}
|
@ -0,0 +1,41 @@
|
||||
package org.gcube.spatial.data.sdi.engine.impl.faults;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
|
||||
import javax.ws.rs.WebApplicationException;
|
||||
import javax.ws.rs.core.MediaType;
|
||||
import javax.ws.rs.core.Response;
|
||||
import javax.ws.rs.ext.ExceptionMapper;
|
||||
|
||||
import org.gcube.spatial.data.sdi.model.faults.ErrorMessage;
|
||||
|
||||
|
||||
public class GenericExceptionMapper implements ExceptionMapper<Throwable> {
|
||||
|
||||
@Override
|
||||
public Response toResponse(Throwable ex) {
|
||||
|
||||
ErrorMessage errorMessage = new ErrorMessage();
|
||||
setHttpStatus(ex, errorMessage);
|
||||
errorMessage.setCode(500);
|
||||
errorMessage.setMessage(ex.getMessage());
|
||||
StringWriter errorStackTrace = new StringWriter();
|
||||
ex.printStackTrace(new PrintWriter(errorStackTrace));
|
||||
errorMessage.setDeveloperMessage(errorStackTrace.toString());
|
||||
errorMessage.setLink("www.d4science.org");
|
||||
|
||||
return Response.status(errorMessage.getStatus())
|
||||
.entity(errorMessage)
|
||||
.type(MediaType.APPLICATION_JSON)
|
||||
.build();
|
||||
}
|
||||
|
||||
private void setHttpStatus(Throwable ex, ErrorMessage errorMessage) {
|
||||
if(ex instanceof WebApplicationException ) {
|
||||
errorMessage.setStatus(((WebApplicationException)ex).getResponse().getStatus());
|
||||
} else {
|
||||
errorMessage.setStatus(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()); //defaults to internal server error 500
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
package org.gcube.spatial.data.sdi.engine.impl.faults;
|
||||
|
||||
public class InvalidServiceDefinitionException extends ServiceRegistrationException {
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = -5251767289981417513L;
|
||||
|
||||
public InvalidServiceDefinitionException() {
|
||||
super();
|
||||
// TODO Auto-generated constructor stub
|
||||
}
|
||||
|
||||
public InvalidServiceDefinitionException(String message, Throwable cause, boolean enableSuppression,
|
||||
boolean writableStackTrace) {
|
||||
super(message, cause, enableSuppression, writableStackTrace);
|
||||
// TODO Auto-generated constructor stub
|
||||
}
|
||||
|
||||
public InvalidServiceDefinitionException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
// TODO Auto-generated constructor stub
|
||||
}
|
||||
|
||||
public InvalidServiceDefinitionException(String message) {
|
||||
super(message);
|
||||
// TODO Auto-generated constructor stub
|
||||
}
|
||||
|
||||
public InvalidServiceDefinitionException(Throwable cause) {
|
||||
super(cause);
|
||||
// TODO Auto-generated constructor stub
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
package org.gcube.spatial.data.sdi.engine.impl.faults;
|
||||
|
||||
public class ServiceRegistrationException extends Exception {
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = -1570185699121566715L;
|
||||
|
||||
public ServiceRegistrationException() {
|
||||
super();
|
||||
// TODO Auto-generated constructor stub
|
||||
}
|
||||
|
||||
public ServiceRegistrationException(String message, Throwable cause, boolean enableSuppression,
|
||||
boolean writableStackTrace) {
|
||||
super(message, cause, enableSuppression, writableStackTrace);
|
||||
// TODO Auto-generated constructor stub
|
||||
}
|
||||
|
||||
public ServiceRegistrationException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
// TODO Auto-generated constructor stub
|
||||
}
|
||||
|
||||
public ServiceRegistrationException(String message) {
|
||||
super(message);
|
||||
// TODO Auto-generated constructor stub
|
||||
}
|
||||
|
||||
public ServiceRegistrationException(Throwable cause) {
|
||||
super(cause);
|
||||
// TODO Auto-generated constructor stub
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package org.gcube.spatial.data.sdi.engine.impl.metadata;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import org.gcube.spatial.data.sdi.model.metadata.TemplateInvocation;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class TemplateApplicationReport {
|
||||
|
||||
private String generatedFilePath;
|
||||
private Set<String> appliedTemplates;
|
||||
private Set<TemplateInvocation> requestedInvocations;
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
package org.gcube.spatial.data.sdi.model.health;
|
||||
|
||||
import javax.xml.bind.annotation.XmlAccessType;
|
||||
import javax.xml.bind.annotation.XmlAccessorType;
|
||||
import javax.xml.bind.annotation.XmlRootElement;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
||||
@XmlRootElement
|
||||
@XmlAccessorType(XmlAccessType.FIELD)
|
||||
@Getter
|
||||
@Setter
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@ToString
|
||||
@EqualsAndHashCode
|
||||
public class HealthReport {
|
||||
|
||||
private Level overallStatus;
|
||||
|
||||
private String context;
|
||||
|
||||
private ServiceHealthReport thredds;
|
||||
private ServiceHealthReport geonetwork;
|
||||
private ServiceHealthReport geoserverCluster;
|
||||
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package org.gcube.spatial.data.sdi.model.health;
|
||||
|
||||
import javax.xml.bind.annotation.XmlEnum;
|
||||
|
||||
@XmlEnum
|
||||
public enum Level{
|
||||
WARNING,ERROR,OK
|
||||
}
|
@ -0,0 +1,48 @@
|
||||
package org.gcube.spatial.data.sdi.model.health;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.xml.bind.annotation.XmlAccessType;
|
||||
import javax.xml.bind.annotation.XmlAccessorType;
|
||||
import javax.xml.bind.annotation.XmlRootElement;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
||||
|
||||
@XmlRootElement
|
||||
@XmlAccessorType(XmlAccessType.FIELD)
|
||||
@Getter
|
||||
@Setter
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@ToString
|
||||
@EqualsAndHashCode
|
||||
public class ServiceHealthReport {
|
||||
|
||||
private Level overallStatus;
|
||||
|
||||
private List<Status> checkReports;
|
||||
|
||||
public ServiceHealthReport(List<Status> checkReports) {
|
||||
super();
|
||||
this.checkReports = checkReports;
|
||||
overallStatus =Level.OK;
|
||||
for(Status st:checkReports)
|
||||
if(st.getLevel().equals(Level.ERROR)) {
|
||||
overallStatus=Level.ERROR;
|
||||
break;
|
||||
}
|
||||
else if(st.getLevel().equals(Level.WARNING)&&(overallStatus.equals(Level.OK)))
|
||||
overallStatus=Level.WARNING;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
package org.gcube.spatial.data.sdi.model.health;
|
||||
|
||||
import javax.xml.bind.annotation.XmlAccessType;
|
||||
import javax.xml.bind.annotation.XmlAccessorType;
|
||||
import javax.xml.bind.annotation.XmlRootElement;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
||||
@XmlRootElement
|
||||
@XmlAccessorType(XmlAccessType.FIELD)
|
||||
@Getter
|
||||
@Setter
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@ToString
|
||||
@EqualsAndHashCode
|
||||
public class Status {
|
||||
|
||||
private String message;
|
||||
|
||||
|
||||
private Level level;
|
||||
}
|
@ -0,0 +1 @@
|
||||
org.gcube.spatial.data.sdi.SDIServiceLifecycleManager
|
@ -0,0 +1,5 @@
|
||||
<handlers>
|
||||
<lifecycle>
|
||||
<sdi-lifecycle />
|
||||
</lifecycle>
|
||||
</handlers>
|
@ -1,19 +1,25 @@
|
||||
<web-app>
|
||||
<servlet>
|
||||
<servlet-name>org.gcube.spatial.data.sdi.SDIService</servlet-name>
|
||||
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
|
||||
<init-param>
|
||||
<param-name>javax.ws.rs.Application</param-name>
|
||||
<param-value>org.gcube.spatial.data.sdi.SDIService</param-value>
|
||||
</init-param>
|
||||
<init-param>
|
||||
<param-name>jersey.config.server.provider.classnames</param-name>
|
||||
<param-value>org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
|
||||
</init-param>
|
||||
<load-on-startup>1</load-on-startup>
|
||||
</servlet>
|
||||
<servlet-mapping>
|
||||
<servlet-name>org.gcube.spatial.data.sdi.SDIService</servlet-name>
|
||||
<url-pattern>/gcube/service/*</url-pattern>
|
||||
</servlet-mapping>
|
||||
<servlet-name>org.gcube.spatial.data.sdi.SDIService</servlet-name>
|
||||
<servlet-class>org.glassfish.jersey.servlet.ServletContainer
|
||||
</servlet-class>
|
||||
<init-param>
|
||||
<param-name>javax.ws.rs.Application</param-name>
|
||||
<param-value>org.gcube.spatial.data.sdi.SDIService</param-value>
|
||||
</init-param>
|
||||
<init-param>
|
||||
<param-name>jersey.config.server.provider.classnames</param-name>
|
||||
<param-value>org.glassfish.jersey.media.multipart.MultiPartFeature
|
||||
</param-value>
|
||||
</init-param>
|
||||
<init-param>
|
||||
<param-name>jersey.config.xml.formatOutput</param-name>
|
||||
<param-value>true</param-value>
|
||||
</init-param>
|
||||
<load-on-startup>1</load-on-startup>
|
||||
</servlet>
|
||||
<servlet-mapping>
|
||||
<servlet-name>org.gcube.spatial.data.sdi.SDIService</servlet-name>
|
||||
<url-pattern>/gcube/service/*</url-pattern>
|
||||
</servlet-mapping>
|
||||
</web-app>
|
@ -0,0 +1,37 @@
|
||||
package org.gcube.spatial.data.sdi.test;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Paths;
|
||||
|
||||
import javax.xml.transform.TransformerException;
|
||||
|
||||
import org.gcube.spatial.data.sdi.LocalConfiguration;
|
||||
import org.gcube.spatial.data.sdi.engine.MetadataTemplateManager;
|
||||
import org.gcube.spatial.data.sdi.engine.impl.metadata.MetadataTemplateManagerImpl;
|
||||
import org.gcube.spatial.data.sdi.engine.impl.metadata.TemplateApplicationReport;
|
||||
import org.gcube.spatial.data.sdi.model.metadata.TemplateInvocationBuilder;
|
||||
import org.junit.Test;
|
||||
|
||||
public class MetadataApplicationTest {
|
||||
|
||||
@Test
|
||||
public void apply() throws IOException, TransformerException{
|
||||
TokenSetter.set("/gcube/devsec/devVRE");
|
||||
MetadataTemplateManagerImpl manager=new MetadataTemplateManagerImpl();
|
||||
// LocalConfiguration.init(Paths.get("src/main/webapp/WEB-INF/config.properties").toUri().toURL())
|
||||
// .setTemplateConfigurationObject(Paths.get("src/main/webapp/WEB-INF/metadataTemplates").toFile());
|
||||
|
||||
manager.init(Paths.get("src/main/webapp/WEB-INF/metadataTemplates").toFile());
|
||||
|
||||
|
||||
System.out.println(manager.getAvailableTemplates());
|
||||
|
||||
|
||||
TemplateInvocationBuilder builder=new TemplateInvocationBuilder();
|
||||
builder.threddsOnlineResources("localhost", "someFileName.sc", "newCatalog");
|
||||
TemplateApplicationReport report=manager.applyTemplates(Paths.get("src/test/resources/xml/toEnrichMetadata.xml").toFile(), builder.get());
|
||||
System.out.println(report);
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -1,9 +1,11 @@
|
||||
package org.gcube.spatial.data.sdi.test;
|
||||
package org.gcube.spatial.data.sdi.test.factories;
|
||||
|
||||
import org.gcube.spatial.data.sdi.engine.GISManager;
|
||||
import org.gcube.spatial.data.sdi.engine.impl.GISManagerImpl;
|
||||
import org.gcube.spatial.data.sdi.engine.impl.faults.ConfigurationNotFoundException;
|
||||
import org.gcube.spatial.data.sdi.model.service.GeoServerClusterConfiguration;
|
||||
import org.gcube.spatial.data.sdi.test.TestCommon;
|
||||
import org.gcube.spatial.data.sdi.test.TokenSetter;
|
||||
import org.glassfish.hk2.api.Factory;
|
||||
|
||||
public class GISManagerFactory implements Factory<GISManager>{
|
@ -1,9 +1,11 @@
|
||||
package org.gcube.spatial.data.sdi.test;
|
||||
package org.gcube.spatial.data.sdi.test.factories;
|
||||
|
||||
import org.gcube.spatial.data.sdi.engine.GeoNetworkManager;
|
||||
import org.gcube.spatial.data.sdi.engine.impl.GeoNetworkManagerImpl;
|
||||
import org.gcube.spatial.data.sdi.engine.impl.faults.ConfigurationNotFoundException;
|
||||
import org.gcube.spatial.data.sdi.model.service.GeoNetworkConfiguration;
|
||||
import org.gcube.spatial.data.sdi.test.TestCommon;
|
||||
import org.gcube.spatial.data.sdi.test.TokenSetter;
|
||||
import org.glassfish.hk2.api.Factory;
|
||||
|
||||
public class GeoNetworkManagerFactory implements Factory<GeoNetworkManager>{
|
@ -1,9 +1,10 @@
|
||||
package org.gcube.spatial.data.sdi.test;
|
||||
package org.gcube.spatial.data.sdi.test.factories;
|
||||
|
||||
import org.gcube.spatial.data.geonetwork.GeoNetworkAdministration;
|
||||
import org.gcube.spatial.data.sdi.engine.GeoNetworkProvider;
|
||||
import org.gcube.spatial.data.sdi.engine.impl.GeoNetworkProviderImpl;
|
||||
import org.gcube.spatial.data.sdi.engine.impl.faults.ClientInitializationException;
|
||||
import org.gcube.spatial.data.sdi.test.TokenSetter;
|
||||
import org.glassfish.hk2.api.Factory;
|
||||
|
||||
|
@ -0,0 +1,26 @@
|
||||
package org.gcube.spatial.data.sdi.test.factories;
|
||||
|
||||
import java.nio.file.Paths;
|
||||
|
||||
import org.gcube.spatial.data.sdi.engine.MetadataTemplateManager;
|
||||
import org.gcube.spatial.data.sdi.engine.impl.metadata.MetadataTemplateManagerImpl;
|
||||
import org.glassfish.hk2.api.Factory;
|
||||
|
||||
public class MetadataTemplateManagerFactory implements Factory<MetadataTemplateManager>{
|
||||
|
||||
public MetadataTemplateManagerFactory() {
|
||||
// TODO Auto-generated constructor stub
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dispose(MetadataTemplateManager arg0) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
@Override
|
||||
public MetadataTemplateManager provide() {
|
||||
MetadataTemplateManagerImpl manager=new MetadataTemplateManagerImpl();
|
||||
manager.init(Paths.get("src/main/webapp/WEB-INF/metadataTemplates").toFile());
|
||||
return manager;
|
||||
}
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
package org.gcube.spatial.data.sdi.test.factories;
|
||||
|
||||
import org.gcube.spatial.data.sdi.engine.TemporaryPersistence;
|
||||
import org.gcube.spatial.data.sdi.engine.impl.TemporaryPersistenceImpl;
|
||||
import org.glassfish.hk2.api.Factory;
|
||||
|
||||
public class TemporaryPersistenceFactory implements Factory<TemporaryPersistence>{
|
||||
|
||||
|
||||
@Override
|
||||
public void dispose(TemporaryPersistence arg0) {
|
||||
arg0.shutdown();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TemporaryPersistence provide() {
|
||||
TemporaryPersistenceImpl temp=new TemporaryPersistenceImpl();
|
||||
|
||||
temp.init();
|
||||
|
||||
return temp;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,446 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<gmd:MD_Metadata xmlns:gmi="http://www.isotc211.org/2005/gmi" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmx="http://www.isotc211.org/2005/gmx" xmlns:fra="http://www.cnig.gouv.fr/2005/fra" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
|
||||
<gmd:language>
|
||||
<gmd:LanguageCode codeListValue="eng" codeList="http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/ML_gmxCodelists.xml#LanguageCode">English</gmd:LanguageCode>
|
||||
</gmd:language>
|
||||
<gmd:characterSet>
|
||||
<gmd:MD_CharacterSetCode codeListValue="utf8" codeList="http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#MD_CharacterSetCode">UTF-8</gmd:MD_CharacterSetCode>
|
||||
</gmd:characterSet>
|
||||
<gmd:hierarchyLevel>
|
||||
<gmd:MD_ScopeCode codeSpace="eng" codeListValue="dataset" codeList="http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#MD_ScopeCode">Dataset</gmd:MD_ScopeCode>
|
||||
</gmd:hierarchyLevel>
|
||||
<gmd:contact>
|
||||
<gmd:CI_ResponsibleParty>
|
||||
<gmd:individualName>
|
||||
<gco:CharacterString>fabio.sinibaldi</gco:CharacterString>
|
||||
</gmd:individualName>
|
||||
<gmd:organisationName>
|
||||
<gco:CharacterString>iMarine Consortium</gco:CharacterString>
|
||||
</gmd:organisationName>
|
||||
<gmd:role>
|
||||
<gmd:CI_RoleCode codeListValue="author" codeList="http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#CI_RoleCode">Author</gmd:CI_RoleCode>
|
||||
</gmd:role>
|
||||
</gmd:CI_ResponsibleParty>
|
||||
</gmd:contact>
|
||||
<gmd:contact>
|
||||
<gmd:CI_ResponsibleParty>
|
||||
<gmd:individualName>
|
||||
<gco:CharacterString>iMarine Consortium</gco:CharacterString>
|
||||
</gmd:individualName>
|
||||
<gmd:organisationName>
|
||||
<gco:CharacterString>iMarine.eu</gco:CharacterString>
|
||||
</gmd:organisationName>
|
||||
<gmd:contactInfo>
|
||||
<gmd:CI_Contact>
|
||||
<gmd:address>
|
||||
<gmd:CI_Address>
|
||||
<gmd:electronicMailAddress>
|
||||
<gco:CharacterString>info@i-marine.eu</gco:CharacterString>
|
||||
</gmd:electronicMailAddress>
|
||||
</gmd:CI_Address>
|
||||
</gmd:address>
|
||||
<gmd:onlineResource>
|
||||
<gmd:CI_OnlineResource>
|
||||
<gmd:linkage>
|
||||
<gmd:URL>http://www.i-marine.eu</gmd:URL>
|
||||
</gmd:linkage>
|
||||
<gmd:protocol>
|
||||
<gco:CharacterString>WWW:LINK-1.0-http--link</gco:CharacterString>
|
||||
</gmd:protocol>
|
||||
<gmd:name>
|
||||
<gco:CharacterString>i-Marine project website</gco:CharacterString>
|
||||
</gmd:name>
|
||||
</gmd:CI_OnlineResource>
|
||||
</gmd:onlineResource>
|
||||
</gmd:CI_Contact>
|
||||
</gmd:contactInfo>
|
||||
<gmd:role>
|
||||
<gmd:CI_RoleCode codeListValue="distributor" codeList="http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#CI_RoleCode">Distributor</gmd:CI_RoleCode>
|
||||
</gmd:role>
|
||||
</gmd:CI_ResponsibleParty>
|
||||
</gmd:contact>
|
||||
<gmd:contact>
|
||||
<gmd:CI_ResponsibleParty>
|
||||
<gmd:individualName>
|
||||
<gco:CharacterString>iMarine Consortium Technical Support</gco:CharacterString>
|
||||
</gmd:individualName>
|
||||
<gmd:organisationName>
|
||||
<gco:CharacterString>iMarine.eu</gco:CharacterString>
|
||||
</gmd:organisationName>
|
||||
<gmd:contactInfo>
|
||||
<gmd:CI_Contact>
|
||||
<gmd:address>
|
||||
<gmd:CI_Address>
|
||||
<gmd:electronicMailAddress>
|
||||
<gco:CharacterString>support@i-marine.eu</gco:CharacterString>
|
||||
</gmd:electronicMailAddress>
|
||||
</gmd:CI_Address>
|
||||
</gmd:address>
|
||||
<gmd:onlineResource>
|
||||
<gmd:CI_OnlineResource>
|
||||
<gmd:linkage>
|
||||
<gmd:URL>http://www.i-marine.eu</gmd:URL>
|
||||
</gmd:linkage>
|
||||
<gmd:protocol>
|
||||
<gco:CharacterString>WWW:LINK-1.0-http--link</gco:CharacterString>
|
||||
</gmd:protocol>
|
||||
<gmd:name>
|
||||
<gco:CharacterString>i-Marine project website</gco:CharacterString>
|
||||
</gmd:name>
|
||||
</gmd:CI_OnlineResource>
|
||||
</gmd:onlineResource>
|
||||
</gmd:CI_Contact>
|
||||
</gmd:contactInfo>
|
||||
<gmd:role>
|
||||
<gmd:CI_RoleCode codeListValue="resourceProvider" codeList="http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#CI_RoleCode">Resource provider</gmd:CI_RoleCode>
|
||||
</gmd:role>
|
||||
</gmd:CI_ResponsibleParty>
|
||||
</gmd:contact>
|
||||
<gmd:dateStamp>
|
||||
<gco:DateTime>2013-06-19T04:41:20.762+02:00</gco:DateTime>
|
||||
</gmd:dateStamp>
|
||||
<gmd:spatialRepresentationInfo>
|
||||
<gmd:MD_VectorSpatialRepresentation>
|
||||
<gmd:topologyLevel>
|
||||
<gmd:MD_TopologyLevelCode codeListValue="geometryOnly" codeList="http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#MD_TopologyLevelCode">Geometry only</gmd:MD_TopologyLevelCode>
|
||||
</gmd:topologyLevel>
|
||||
<gmd:geometricObjects>
|
||||
<gmd:MD_GeometricObjects>
|
||||
<gmd:geometricObjectType>
|
||||
<gmd:MD_GeometricObjectTypeCode codeListValue="surface" codeList="http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#MD_GeometricObjectTypeCode">Surface</gmd:MD_GeometricObjectTypeCode>
|
||||
</gmd:geometricObjectType>
|
||||
<gmd:geometricObjectCount>
|
||||
<gco:Integer>362</gco:Integer>
|
||||
</gmd:geometricObjectCount>
|
||||
</gmd:MD_GeometricObjects>
|
||||
</gmd:geometricObjects>
|
||||
</gmd:MD_VectorSpatialRepresentation>
|
||||
</gmd:spatialRepresentationInfo>
|
||||
<gmd:identificationInfo>
|
||||
<gmd:MD_DataIdentification>
|
||||
<gmd:citation>
|
||||
<gmd:CI_Citation>
|
||||
<gmd:title>
|
||||
<gco:CharacterString>Latimeria chalumnae</gco:CharacterString>
|
||||
</gmd:title>
|
||||
<gmd:date>
|
||||
<gmd:CI_Date>
|
||||
<gmd:date>
|
||||
<gco:DateTime>2012-12-21T00:47:59.555+01:00</gco:DateTime>
|
||||
</gmd:date>
|
||||
<gmd:dateType>
|
||||
<gmd:CI_DateTypeCode codeSpace="eng" codeListValue="creation" codeList="http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode">Creation</gmd:CI_DateTypeCode>
|
||||
</gmd:dateType>
|
||||
</gmd:CI_Date>
|
||||
</gmd:date>
|
||||
<gmd:presentationForm>
|
||||
<gmd:CI_PresentationFormCode codeListValue="mapDigital" codeList="http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#CI_PresentationFormCode">Map digital</gmd:CI_PresentationFormCode>
|
||||
</gmd:presentationForm>
|
||||
</gmd:CI_Citation>
|
||||
</gmd:citation>
|
||||
<gmd:abstract>
|
||||
<gco:CharacterString>This Latimeria chalumnae Species Distribution Map has been generated with the AquaMaps methodology by exploiting the technology and the computational resources provided by iMarine. In particular, this map has been produced using the HSPEC 2050 Native Range dataset, generated using AquaMaps NativeRange2050 algorithm.</gco:CharacterString>
|
||||
</gmd:abstract>
|
||||
<gmd:purpose>
|
||||
<gco:CharacterString>The aim of this Species Distribution map is to provide its users with a model-based map displaying prediction of species distributions based on occurrence records.</gco:CharacterString>
|
||||
</gmd:purpose>
|
||||
<gmd:credit>
|
||||
<gco:CharacterString>This layer has been produced by iMarine (www.i-marine.eu). iMarine (283644) is funded by the European Commission under Framework Programme 7</gco:CharacterString>
|
||||
</gmd:credit>
|
||||
<gmd:credit>
|
||||
<gco:CharacterString>Kaschner, K., J. S. Ready, E. Agbayani, J. Rius, K. Kesner-Reyes, P. D. Eastwood, A. B. South, S. O. Kullander, T. Rees, C. H. Close, R. Watson, D. Pauly, and R. Froese. 2008 AquaMaps: Predicted range maps for aquatic species. World wide web electronic publication, www.aquamaps.org, Version 10/2008.</gco:CharacterString>
|
||||
</gmd:credit>
|
||||
<gmd:resourceMaintenance>
|
||||
<gmd:MD_MaintenanceInformation>
|
||||
<gmd:maintenanceAndUpdateFrequency>
|
||||
<gmd:MD_MaintenanceFrequencyCode codeListValue="asNeeded" codeList="http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#MD_MaintenanceFrequencyCode">As needed</gmd:MD_MaintenanceFrequencyCode>
|
||||
</gmd:maintenanceAndUpdateFrequency>
|
||||
</gmd:MD_MaintenanceInformation>
|
||||
</gmd:resourceMaintenance>
|
||||
<gmd:graphicOverview>
|
||||
<gmd:MD_BrowseGraphic>
|
||||
<gmd:fileName>
|
||||
<gco:CharacterString>http://node49.p.d4science.research-infrastructures.eu:9003/83/Animalia/Chordata/Sarcopterygii/Coelacanthiformes/Latimeriidae/Fis-30189/Earth.jpg</gco:CharacterString>
|
||||
</gmd:fileName>
|
||||
</gmd:MD_BrowseGraphic>
|
||||
</gmd:graphicOverview>
|
||||
<gmd:descriptiveKeywords>
|
||||
<gmd:MD_Keywords>
|
||||
<gmd:keyword>
|
||||
<gco:CharacterString>Coelacanth</gco:CharacterString>
|
||||
</gmd:keyword>
|
||||
<gmd:type>
|
||||
<gmd:MD_KeywordTypeCode codeListValue="theme" codeList="http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#MD_KeywordTypeCode">Theme</gmd:MD_KeywordTypeCode>
|
||||
</gmd:type>
|
||||
<gmd:thesaurusName>
|
||||
<gmd:CI_Citation>
|
||||
<gmd:title>
|
||||
<gco:CharacterString>FISHBASE</gco:CharacterString>
|
||||
</gmd:title>
|
||||
<gmd:date>
|
||||
<gmd:CI_Date>
|
||||
<gmd:date>
|
||||
<gco:DateTime>2013-06-18T18:06:55.662+02:00</gco:DateTime>
|
||||
</gmd:date>
|
||||
<gmd:dateType>
|
||||
<gmd:CI_DateTypeCode codeSpace="eng" codeListValue="creation" codeList="http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode">Creation</gmd:CI_DateTypeCode>
|
||||
</gmd:dateType>
|
||||
</gmd:CI_Date>
|
||||
</gmd:date>
|
||||
<gmd:citedResponsibleParty>
|
||||
<gmd:CI_ResponsibleParty>
|
||||
<gmd:individualName>
|
||||
<gco:CharacterString>FISHBASE</gco:CharacterString>
|
||||
</gmd:individualName>
|
||||
<gmd:organisationName>
|
||||
<gco:CharacterString>IFM-GEOMAR</gco:CharacterString>
|
||||
</gmd:organisationName>
|
||||
<gmd:contactInfo>
|
||||
<gmd:CI_Contact>
|
||||
<gmd:onlineResource>
|
||||
<gmd:CI_OnlineResource>
|
||||
<gmd:linkage>
|
||||
<gmd:URL>http://www.fishbase.org/search.php</gmd:URL>
|
||||
</gmd:linkage>
|
||||
<gmd:name>
|
||||
<gco:CharacterString>FISHBASE website</gco:CharacterString>
|
||||
</gmd:name>
|
||||
</gmd:CI_OnlineResource>
|
||||
</gmd:onlineResource>
|
||||
</gmd:CI_Contact>
|
||||
</gmd:contactInfo>
|
||||
<gmd:role>
|
||||
<gmd:CI_RoleCode codeListValue="pointOfContact" codeList="http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#CI_RoleCode">Point of contact</gmd:CI_RoleCode>
|
||||
</gmd:role>
|
||||
</gmd:CI_ResponsibleParty>
|
||||
</gmd:citedResponsibleParty>
|
||||
<gmd:otherCitationDetails>
|
||||
<gco:CharacterString>FishBase is a global species database of fish species (specifically finfish).</gco:CharacterString>
|
||||
</gmd:otherCitationDetails>
|
||||
</gmd:CI_Citation>
|
||||
</gmd:thesaurusName>
|
||||
</gmd:MD_Keywords>
|
||||
</gmd:descriptiveKeywords>
|
||||
<gmd:descriptiveKeywords>
|
||||
<gmd:MD_Keywords>
|
||||
<gmd:keyword>
|
||||
<gco:CharacterString>Latimeria chalumnae</gco:CharacterString>
|
||||
</gmd:keyword>
|
||||
<gmd:type>
|
||||
<gmd:MD_KeywordTypeCode codeListValue="theme" codeList="http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#MD_KeywordTypeCode">Theme</gmd:MD_KeywordTypeCode>
|
||||
</gmd:type>
|
||||
<gmd:thesaurusName>
|
||||
<gmd:CI_Citation>
|
||||
<gmd:title>
|
||||
<gco:CharacterString>OBIS</gco:CharacterString>
|
||||
</gmd:title>
|
||||
<gmd:date>
|
||||
<gmd:CI_Date>
|
||||
<gmd:date>
|
||||
<gco:DateTime>2013-06-18T18:06:55.662+02:00</gco:DateTime>
|
||||
</gmd:date>
|
||||
<gmd:dateType>
|
||||
<gmd:CI_DateTypeCode codeSpace="eng" codeListValue="creation" codeList="http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode">Creation</gmd:CI_DateTypeCode>
|
||||
</gmd:dateType>
|
||||
</gmd:CI_Date>
|
||||
</gmd:date>
|
||||
<gmd:citedResponsibleParty>
|
||||
<gmd:CI_ResponsibleParty>
|
||||
<gmd:individualName>
|
||||
<gco:CharacterString>OBIS</gco:CharacterString>
|
||||
</gmd:individualName>
|
||||
<gmd:organisationName>
|
||||
<gco:CharacterString>UNESCO</gco:CharacterString>
|
||||
</gmd:organisationName>
|
||||
<gmd:contactInfo>
|
||||
<gmd:CI_Contact>
|
||||
<gmd:onlineResource>
|
||||
<gmd:CI_OnlineResource>
|
||||
<gmd:linkage>
|
||||
<gmd:URL>http://www.iobis.org</gmd:URL>
|
||||
</gmd:linkage>
|
||||
<gmd:name>
|
||||
<gco:CharacterString>OBIS website</gco:CharacterString>
|
||||
</gmd:name>
|
||||
</gmd:CI_OnlineResource>
|
||||
</gmd:onlineResource>
|
||||
</gmd:CI_Contact>
|
||||
</gmd:contactInfo>
|
||||
<gmd:role>
|
||||
<gmd:CI_RoleCode codeListValue="pointOfContact" codeList="http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#CI_RoleCode">Point of contact</gmd:CI_RoleCode>
|
||||
</gmd:role>
|
||||
</gmd:CI_ResponsibleParty>
|
||||
</gmd:citedResponsibleParty>
|
||||
<gmd:otherCitationDetails>
|
||||
<gco:CharacterString>Intergovernmental Oceanographic Commission (IOC) of UNESCO. The Ocean Biogeographic Information System. Web. http://www.iobis.org. (Consulted on DATE)</gco:CharacterString>
|
||||
</gmd:otherCitationDetails>
|
||||
</gmd:CI_Citation>
|
||||
</gmd:thesaurusName>
|
||||
</gmd:MD_Keywords>
|
||||
</gmd:descriptiveKeywords>
|
||||
<gmd:descriptiveKeywords>
|
||||
<gmd:MD_Keywords>
|
||||
<gmd:keyword>
|
||||
<gco:CharacterString>Ecological niche modelling</gco:CharacterString>
|
||||
</gmd:keyword>
|
||||
<gmd:keyword>
|
||||
<gco:CharacterString>AquaMaps</gco:CharacterString>
|
||||
</gmd:keyword>
|
||||
<gmd:keyword>
|
||||
<gco:CharacterString>SpeciesDistribution</gco:CharacterString>
|
||||
</gmd:keyword>
|
||||
<gmd:keyword>
|
||||
<gco:CharacterString>iMarine</gco:CharacterString>
|
||||
</gmd:keyword>
|
||||
<gmd:type>
|
||||
<gmd:MD_KeywordTypeCode codeListValue="theme" codeList="http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#MD_KeywordTypeCode">Theme</gmd:MD_KeywordTypeCode>
|
||||
</gmd:type>
|
||||
<gmd:thesaurusName>
|
||||
<gmd:CI_Citation>
|
||||
<gmd:title>
|
||||
<gco:CharacterString>General</gco:CharacterString>
|
||||
</gmd:title>
|
||||
<gmd:date>
|
||||
<gmd:CI_Date>
|
||||
<gmd:date>
|
||||
<gco:DateTime>2013-06-19T04:41:20.762+02:00</gco:DateTime>
|
||||
</gmd:date>
|
||||
<gmd:dateType>
|
||||
<gmd:CI_DateTypeCode codeSpace="eng" codeListValue="creation" codeList="http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode">Creation</gmd:CI_DateTypeCode>
|
||||
</gmd:dateType>
|
||||
</gmd:CI_Date>
|
||||
</gmd:date>
|
||||
</gmd:CI_Citation>
|
||||
</gmd:thesaurusName>
|
||||
</gmd:MD_Keywords>
|
||||
</gmd:descriptiveKeywords>
|
||||
<gmd:spatialResolution>
|
||||
<gmd:MD_Resolution>
|
||||
<gmd:distance>
|
||||
<gco:Distance uom="http://schemas.opengis.net/iso/19139/20070417/resources/uom/gmxUom.xml#xpointer(//*[@gml:id='m'])">0.5</gco:Distance>
|
||||
</gmd:distance>
|
||||
</gmd:MD_Resolution>
|
||||
</gmd:spatialResolution>
|
||||
<gmd:language>
|
||||
<gmd:LanguageCode codeListValue="eng" codeList="http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/ML_gmxCodelists.xml#LanguageCode">English</gmd:LanguageCode>
|
||||
</gmd:language>
|
||||
<gmd:topicCategory>
|
||||
<gmd:MD_TopicCategoryCode>biota</gmd:MD_TopicCategoryCode>
|
||||
</gmd:topicCategory>
|
||||
<gmd:extent>
|
||||
<gmd:EX_Extent>
|
||||
<gmd:geographicElement>
|
||||
<gmd:EX_GeographicBoundingBox>
|
||||
<gmd:extentTypeCode>
|
||||
<gco:Boolean>true</gco:Boolean>
|
||||
</gmd:extentTypeCode>
|
||||
<gmd:westBoundLongitude>
|
||||
<gco:Decimal>-180.0</gco:Decimal>
|
||||
</gmd:westBoundLongitude>
|
||||
<gmd:eastBoundLongitude>
|
||||
<gco:Decimal>180.0</gco:Decimal>
|
||||
</gmd:eastBoundLongitude>
|
||||
<gmd:southBoundLatitude>
|
||||
<gco:Decimal>-90.0</gco:Decimal>
|
||||
</gmd:southBoundLatitude>
|
||||
<gmd:northBoundLatitude>
|
||||
<gco:Decimal>90.0</gco:Decimal>
|
||||
</gmd:northBoundLatitude>
|
||||
</gmd:EX_GeographicBoundingBox>
|
||||
</gmd:geographicElement>
|
||||
</gmd:EX_Extent>
|
||||
</gmd:extent>
|
||||
</gmd:MD_DataIdentification>
|
||||
</gmd:identificationInfo>
|
||||
|
||||
<gmd:dataQualityInfo>
|
||||
<gmd:DQ_DataQuality>
|
||||
<gmd:scope>
|
||||
<gmd:DQ_Scope>
|
||||
<gmd:level>
|
||||
<gmd:MD_ScopeCode codeSpace="eng" codeListValue="dataset" codeList="http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#MD_ScopeCode">Dataset</gmd:MD_ScopeCode>
|
||||
</gmd:level>
|
||||
</gmd:DQ_Scope>
|
||||
</gmd:scope>
|
||||
<gmd:lineage>
|
||||
<gmd:LI_Lineage>
|
||||
<gmd:statement>
|
||||
<gco:CharacterString>Kaschner, K., J. S. Ready, E. Agbayani, J. Rius, K. Kesner-Reyes, P. D. Eastwood, A. B. South, S. O. Kullander, T. Rees, C. H. Close, R. Watson, D. Pauly, and R. Froese. 2008 AquaMaps: Predicted range maps for aquatic species. World wide web electronic publication, www.aquamaps.org, Version 10/2008.</gco:CharacterString>
|
||||
</gmd:statement>
|
||||
<gmd:processStep>
|
||||
<gmd:LI_ProcessStep>
|
||||
<gmd:description>
|
||||
<gco:CharacterString>AquaMaps Ecological Niche Modelling</gco:CharacterString>
|
||||
</gmd:description>
|
||||
</gmd:LI_ProcessStep>
|
||||
</gmd:processStep>
|
||||
<gmd:source>
|
||||
<gmd:LI_Source>
|
||||
<gmd:sourceCitation>
|
||||
<gmd:CI_Citation>
|
||||
<gmd:title>
|
||||
<gco:CharacterString>HSPEC 2050 Native Range</gco:CharacterString>
|
||||
</gmd:title>
|
||||
<gmd:date>
|
||||
<gmd:CI_Date>
|
||||
<gmd:date>
|
||||
<gco:DateTime>2011-10-05T00:39:17.101+02:00</gco:DateTime>
|
||||
</gmd:date>
|
||||
<gmd:dateType>
|
||||
<gmd:CI_DateTypeCode codeSpace="eng" codeListValue="creation" codeList="http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode">Creation</gmd:CI_DateTypeCode>
|
||||
</gmd:dateType>
|
||||
</gmd:CI_Date>
|
||||
</gmd:date>
|
||||
<gmd:identifier>
|
||||
<gmd:MD_Identifier>
|
||||
<gmd:code>
|
||||
<gco:CharacterString>hspec2011_10_04_21_00_23_274</gco:CharacterString>
|
||||
</gmd:code>
|
||||
</gmd:MD_Identifier>
|
||||
</gmd:identifier>
|
||||
</gmd:CI_Citation>
|
||||
</gmd:sourceCitation>
|
||||
<gmd:sourceExtent>
|
||||
<gmd:EX_Extent>
|
||||
<gmd:geographicElement>
|
||||
<gmd:EX_GeographicBoundingBox>
|
||||
<gmd:extentTypeCode>
|
||||
<gco:Boolean>true</gco:Boolean>
|
||||
</gmd:extentTypeCode>
|
||||
<gmd:westBoundLongitude>
|
||||
<gco:Decimal>-180.0</gco:Decimal>
|
||||
</gmd:westBoundLongitude>
|
||||
<gmd:eastBoundLongitude>
|
||||
<gco:Decimal>180.0</gco:Decimal>
|
||||
</gmd:eastBoundLongitude>
|
||||
<gmd:southBoundLatitude>
|
||||
<gco:Decimal>-90.0</gco:Decimal>
|
||||
</gmd:southBoundLatitude>
|
||||
<gmd:northBoundLatitude>
|
||||
<gco:Decimal>90.0</gco:Decimal>
|
||||
</gmd:northBoundLatitude>
|
||||
</gmd:EX_GeographicBoundingBox>
|
||||
</gmd:geographicElement>
|
||||
</gmd:EX_Extent>
|
||||
</gmd:sourceExtent>
|
||||
</gmd:LI_Source>
|
||||
</gmd:source>
|
||||
</gmd:LI_Lineage>
|
||||
</gmd:lineage>
|
||||
</gmd:DQ_DataQuality>
|
||||
</gmd:dataQualityInfo>
|
||||
<gmd:metadataConstraints>
|
||||
<gmd:MD_LegalConstraints>
|
||||
<gmd:useLimitation>
|
||||
<gco:CharacterString>CC-BY-SA</gco:CharacterString>
|
||||
</gmd:useLimitation>
|
||||
<gmd:accessConstraints>
|
||||
<gmd:MD_RestrictionCode codeListValue="license" codeList="http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#MD_RestrictionCode">License</gmd:MD_RestrictionCode>
|
||||
</gmd:accessConstraints>
|
||||
<gmd:useConstraints>
|
||||
<gmd:MD_RestrictionCode codeListValue="license" codeList="http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#MD_RestrictionCode">License</gmd:MD_RestrictionCode>
|
||||
</gmd:useConstraints>
|
||||
</gmd:MD_LegalConstraints>
|
||||
</gmd:metadataConstraints>
|
||||
</gmd:MD_Metadata>
|
Loading…
Reference in New Issue