/*******************************************************************************
* Copyright (c) 2011,2013 IBM Corporation.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v. 1.0 which accompanies this distribution.
*
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
*
* Masaki Wakao
* Yoshio Horiuchi
* Kohji Ohsawa
*******************************************************************************/
package org.eclipse.lyo.samples.excel.services.common;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.eclipse.lyo.rio.core.IConstants;
import org.eclipse.lyo.rio.services.RioServiceException;
import org.eclipse.lyo.rio.util.XmlUtils;
import org.eclipse.lyo.samples.excel.adapter.common.AdapterRegistry;
import org.eclipse.lyo.samples.excel.adapter.common.ResourceAdapter;
import org.eclipse.lyo.samples.excel.common.ConfigSingleton;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@Path("catalog")
public class CatalogService {
//TODO
public static final String OSLC_PTERM_PREFIXDEFINITION2 = IConstants.OSLC_PREFIX + ":PrefixDefinition";
private String baseUrl;
@GET
@Produces ({"application/rdf+xml", "application/xml"})
public String getCatalog(@Context UriInfo uriInfo) throws RioServiceException {
baseUrl = uriInfo.getBaseUri().toString();
String about = uriInfo.getAbsolutePath().toString();
return buildServicesResource(about);
}
private String getBaseUrl() {
return baseUrl;
}
public String buildServicesResource(String about) throws RioServiceException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(true);
factory.setNamespaceAware(true);
try{
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.newDocument();
Element rdf = doc.createElementNS(IConstants.RDF_NAMESPACE, IConstants.RDF_TYPE_PTERM_RDF);
doc.appendChild(rdf);
rdf.setAttribute("xmlns:" + IConstants.RDF_PREFIX, IConstants.RDF_NAMESPACE); //$NON-NLS-1$
rdf.setAttribute("xmlns:" + IConstants.DCTERMS_PREFIX, IConstants.DCTERMS_NAMESPACE); //$NON-NLS-1$
rdf.setAttribute("xmlns:" + IConstants.OSLC_PREFIX, IConstants.OSLC_NAMESPACE); //$NON-NLS-1$
Element sp = doc.createElementNS(IConstants.OSLC_NAMESPACE, IConstants.OSLC_TYPE_PTERM_SERVICEPROVIDERCATALOG);
rdf.appendChild(sp);
sp.setAttributeNS(IConstants.RDF_NAMESPACE, IConstants.RDF_PTERM_ABOUT, about);
Element elmTitle = doc.createElementNS(IConstants.DCTERMS_NAMESPACE, IConstants.DCTERMS_PTERM_TITLE);
elmTitle.setTextContent("OSLC Excel Adapter Catalog");
sp.appendChild(elmTitle);
Element elmDescr = doc.createElementNS(IConstants.DCTERMS_NAMESPACE, IConstants.DCTERMS_PTERM_DESCRIPTION);
elmDescr.setTextContent("Catalog for OSLC Excel Adapter");
sp.appendChild(elmDescr);
appendPublisher(sp);
Map<String, String> predefinedMappings = getPredefinedNamespaceMappings();
Set<Entry<String, String>> entries = predefinedMappings.entrySet();
for (Entry<String, String> prefixMapping : entries) {
appendPrefixDefinition(sp, prefixMapping.getKey(), prefixMapping.getValue());
}
// append custom prefixes
ConfigSingleton config = ConfigSingleton.getInstance();
Map<String, String> nsPrefixes = config.getNsPrefixes();
entries = nsPrefixes.entrySet();
for (Entry<String, String> nsMapping : entries) {
String ns = nsMapping.getValue();
if(!predefinedMappings.containsKey(ns)){
appendPrefixDefinition(sp, ns, nsMapping.getKey());
}
}
// service resource
ResourceAdapter adapter = AdapterRegistry.getAdapter(getBaseUrl() + IConstants.SERVICE_SERVICES);
adapter.loadRepository();
List<String> providers = adapter.getContexts();
for(String providerId: providers){
Element service = doc.createElementNS(IConstants.OSLC_NAMESPACE, IConstants.OSLC_PTERM_SERVICEPROVIDER);
String svcUri = getBaseUrl() + IConstants.SERVICE_SERVICES + "/catalog/" + providerId;
Element serviceProvider = doc.createElementNS(IConstants.OSLC_NAMESPACE, IConstants.OSLC_TYPE_PTERM_SERVICEPROVIDER);
serviceProvider.setAttributeNS(IConstants.RDF_NAMESPACE, IConstants.RDF_PTERM_ABOUT, svcUri);
Element title = doc.createElementNS(IConstants.DCTERMS_NAMESPACE, IConstants.DCTERMS_PTERM_TITLE);
title.setTextContent("OSLC Excel Adapter");
serviceProvider.appendChild(title);
service.appendChild(serviceProvider);
sp.appendChild(service);
}
return XmlUtils.prettyPrint(doc);
} catch (Exception e) {
throw new RioServiceException(e);
} finally {
}
}
private Map<String, String> getPredefinedNamespaceMappings() {
return new HashMap<String, String>();
}
private void appendPrefixDefinition( Element sp, String namespace, String prefix ) {
Document doc = sp.getOwnerDocument();
Element pd1 = doc.createElementNS(IConstants.OSLC_NAMESPACE, IConstants.OSLC_PTERM_PREFIXDEFINITION);
sp.appendChild(pd1);
Element pd2 = doc.createElementNS(IConstants.OSLC_NAMESPACE, OSLC_PTERM_PREFIXDEFINITION2);
pd1.appendChild(pd2);
Element elmPrefix = doc.createElementNS(IConstants.OSLC_NAMESPACE, IConstants.OSLC_PTERM_PREFIX);
pd2.appendChild(elmPrefix);
elmPrefix.setTextContent(prefix);
Element elmPrefixBase = doc.createElementNS(IConstants.OSLC_NAMESPACE, IConstants.OSLC_PTERM_PREFIXBASE);
pd2.appendChild(elmPrefixBase);
elmPrefixBase.setTextContent(namespace);
}
private void appendPublisher(Element sp) throws RioServiceException {
Document doc = sp.getOwnerDocument();
Element dcPub = doc.createElementNS(IConstants.DCTERMS_NAMESPACE, IConstants.DCTERMS_PTERM_PUBLISHER);
sp.appendChild(dcPub);
Element oslcPub = doc.createElementNS(IConstants.OSLC_NAMESPACE, IConstants.OSLC_PTERM_PUBLISHER);
dcPub.appendChild(oslcPub);
Element elm = doc.createElementNS(IConstants.DCTERMS_NAMESPACE, IConstants.DCTERMS_PTERM_TITLE);
oslcPub.appendChild(elm);
ConfigSingleton config = ConfigSingleton.getInstance();
elm.setTextContent(config.getPublisherTitle());
elm = doc.createElementNS(IConstants.DCTERMS_NAMESPACE, IConstants.DCTERMS_PTERM_IDENTIFIER);
oslcPub.appendChild(elm);
elm.setTextContent(config.getPublisherIdentifier());
elm = doc.createElementNS(IConstants.OSLC_NAMESPACE, IConstants.OSLC_PTERM_ICON);
oslcPub.appendChild(elm);
String iconUrl = getBaseUrl() + config.getPublisherIcon();
elm.setAttributeNS(IConstants.RDF_NAMESPACE, IConstants.RDF_PTERM_RESOURCE, iconUrl);
}
}