You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@clerezza.apache.org by re...@apache.org on 2015/04/14 15:12:55 UTC

[20/87] [abbrv] [partial] clerezza git commit: CLEREZZA-966: removed platform. prefix of folder names

http://git-wip-us.apache.org/repos/asf/clerezza/blob/70220239/platform/language/platform.language.core/src/main/java/org/apache/clerezza/platform/language/LanguageDescription.java
----------------------------------------------------------------------
diff --git a/platform/language/platform.language.core/src/main/java/org/apache/clerezza/platform/language/LanguageDescription.java b/platform/language/platform.language.core/src/main/java/org/apache/clerezza/platform/language/LanguageDescription.java
new file mode 100644
index 0000000..498dbbb
--- /dev/null
+++ b/platform/language/platform.language.core/src/main/java/org/apache/clerezza/platform/language/LanguageDescription.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.clerezza.platform.language;
+
+import java.util.Iterator;
+import java.util.concurrent.locks.Lock;
+import org.apache.clerezza.rdf.core.Language;
+import org.apache.clerezza.rdf.core.Literal;
+import org.apache.clerezza.rdf.core.PlainLiteral;
+import org.apache.clerezza.rdf.core.Resource;
+import org.apache.clerezza.rdf.core.TripleCollection;
+import org.apache.clerezza.rdf.core.access.LockableMGraph;
+import org.apache.clerezza.rdf.ontologies.LINGVOJ;
+import org.apache.clerezza.rdf.ontologies.RDFS;
+import org.apache.clerezza.rdf.utils.GraphNode;
+
+/**
+ * An object of this class keeps information about a language.
+ *
+ * @author mir
+ */
+public class LanguageDescription {
+
+    private GraphNode resource;
+    private Language language;
+
+    LanguageDescription(GraphNode resource) {
+        this.resource = resource;
+        Literal iso1Literal = null;
+        TripleCollection configGraph = resource.getGraph();
+        if (configGraph instanceof LockableMGraph) {
+            LockableMGraph lockableConfigGraph = (LockableMGraph)configGraph;
+            Lock readLock = lockableConfigGraph.getLock().readLock();
+            readLock.lock();
+            try {
+                iso1Literal = (Literal) resource.getObjects(LINGVOJ.iso1).next();
+            } finally {
+                readLock.unlock();
+            }
+        } else {
+            iso1Literal = (Literal) resource.getObjects(LINGVOJ.iso1).next();
+        }
+        if (iso1Literal == null) {
+            throw new RuntimeException("No iso1 code for " +resource.getNode());
+        }
+        String iso1 = iso1Literal.getLexicalForm();
+        this.language = new Language(iso1);
+    }
+
+    /**
+     * Returns a <code>Language</code> object which represents the language
+     * described by this object.
+     * @return the described language
+     */
+    public Language getLanguage() {
+        return language;
+    }
+
+    /**
+     * Returns a graph node in the content graph which leads to further
+     * information about the language described by this object.
+     * The information are those provided by http://www.lingvoj.org/lingvoj.rdf.
+     * @return the graph node leading to further information about the described
+     *        language
+     */
+    public GraphNode getResource() {
+        return resource;
+    }
+
+    /**
+     * Returns the label of the language described by this object in the
+     * specified language, or null if no lable is available in that language
+     * @param lang the language in which the label should be.
+     * @return
+     */
+    public String getLabel(Language lang) {
+        Lock readLock = null;
+        TripleCollection configGraph = resource.getGraph();
+        if (configGraph instanceof LockableMGraph) {
+            LockableMGraph lockableConfigGraph = (LockableMGraph)configGraph;
+            readLock = lockableConfigGraph.getLock().readLock();
+            readLock.lock();
+        }
+        try {
+            Iterator<Resource> labels = resource.getObjects(RDFS.label);
+            while (labels.hasNext()) {
+                PlainLiteral label = (PlainLiteral) labels.next();
+                if (label.getLanguage().equals(lang)) {
+                    return label.getLexicalForm();
+                }
+            }
+            return null;
+        } finally {
+            if (readLock != null) {
+                readLock.unlock();
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/clerezza/blob/70220239/platform/language/platform.language.core/src/main/java/org/apache/clerezza/platform/language/LanguageService.java
----------------------------------------------------------------------
diff --git a/platform/language/platform.language.core/src/main/java/org/apache/clerezza/platform/language/LanguageService.java b/platform/language/platform.language.core/src/main/java/org/apache/clerezza/platform/language/LanguageService.java
new file mode 100644
index 0000000..883a9c9
--- /dev/null
+++ b/platform/language/platform.language.core/src/main/java/org/apache/clerezza/platform/language/LanguageService.java
@@ -0,0 +1,328 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.clerezza.platform.language;
+
+import java.io.IOException;
+import java.lang.ref.SoftReference;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.locks.Lock;
+import org.apache.clerezza.platform.config.PlatformConfig;
+import org.apache.clerezza.platform.config.SystemConfig;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.clerezza.rdf.core.BNode;
+import org.apache.clerezza.rdf.core.Graph;
+import org.apache.clerezza.rdf.core.Language;
+import org.apache.clerezza.rdf.core.MGraph;
+import org.osgi.service.component.ComponentContext;
+import org.apache.clerezza.rdf.core.NonLiteral;
+import org.apache.clerezza.rdf.core.PlainLiteral;
+import org.apache.clerezza.rdf.core.Resource;
+import org.apache.clerezza.rdf.core.Triple;
+import org.apache.clerezza.rdf.core.UriRef;
+import org.apache.clerezza.rdf.core.access.LockableMGraph;
+import org.apache.clerezza.rdf.core.access.SecuredMGraph;
+import org.apache.clerezza.rdf.core.access.TcManager;
+import org.apache.clerezza.rdf.core.impl.SimpleMGraph;
+import org.apache.clerezza.rdf.core.impl.TripleImpl;
+import org.apache.clerezza.rdf.core.serializedform.ParsingProvider;
+import org.apache.clerezza.rdf.core.serializedform.SupportedFormat;
+import org.apache.clerezza.rdf.ontologies.LINGVOJ;
+import org.apache.clerezza.rdf.ontologies.PLATFORM;
+import org.apache.clerezza.rdf.ontologies.RDF;
+import org.apache.clerezza.rdf.ontologies.RDFS;
+import org.apache.clerezza.rdf.utils.GraphNode;
+import org.apache.clerezza.rdf.utils.RdfList;
+
+/**
+ * This class provides a OSGi service for managing languages in the Clerezza
+ * platform.
+ * 
+ * @author mir
+ */
+@Component(immediate=true, enabled= true)
+@Service(LanguageService.class)
+public class LanguageService {    
+
+    @Reference
+    private TcManager tcManager;
+
+    /**
+     * this is linked to the system-graph, accessing requires respective
+     * permission
+     */
+    private List<Resource> languageList;
+    /**
+     * no permission on the system graph required to access this
+     */
+    private List<Resource> languageListCache;
+
+    private static final String PARSER_FILTER =
+            "(supportedFormat=" + SupportedFormat.RDF_XML +")";
+
+    @Reference(target=PARSER_FILTER)
+    private ParsingProvider parser;
+
+    @Reference(target = SystemConfig.SYSTEM_GRAPH_FILTER)
+    private MGraph securedSystemGraph;
+
+    @Reference(target = PlatformConfig.CONFIG_GRAPH_FILTER)
+    private MGraph securedConfigGraph;
+    
+    private SoftReference<Graph> softLingvojGraph = new SoftReference<Graph>(null);
+
+
+    private LockableMGraph getSystemGraph() {
+        return ((SecuredMGraph) securedSystemGraph).getUnsecuredMGraph();
+    }
+
+    private LockableMGraph getConfigGraph() {
+        return ((SecuredMGraph) securedConfigGraph).getUnsecuredMGraph();
+    }
+
+    /**
+     * Returns a <code>List</code> of <code>LanguageDescription</code>s which
+     * describe the languages which are supported by the platform. The first
+     * entry describes the default language of the platform.
+     * @return a list containing all language descriptions.
+     */
+    public List<LanguageDescription> getLanguages() {
+        List<LanguageDescription> langList = new ArrayList<LanguageDescription>();
+        Iterator<Resource> languages = languageListCache.iterator();
+        while (languages.hasNext()) {
+            UriRef language = (UriRef) languages.next();
+            langList.add(new LanguageDescription(new GraphNode(language, getConfigGraph())));
+        }
+        return langList;
+    }
+
+    /**
+     * Returns the <code>LanguageDescription</code> of the default language
+     * of the platform.
+     * @return the language description of the default language.
+     */
+    public LanguageDescription getDefaultLanguage() {
+        return new LanguageDescription(
+                new GraphNode(languageListCache.get(0), getConfigGraph()));
+    }
+
+    /**
+     * Returns a set containg all language uris which are in the
+     * <http://www.lingvoj.org/lingvoj> graph which is included in this bundle.
+     * @return a set containing all language uris. This uris can be used to 
+     * add the language to Clerezza over the addLanguage()-method in this class.
+     */
+    public Set<UriRef> getAllLanguages() {
+        Set<UriRef> result = new HashSet<UriRef>();
+        Graph lingvojGraph = getLingvojGraph();
+        Iterator<Triple> languages = lingvojGraph.filter(null, RDFS.isDefinedBy,
+                null);
+        while (languages.hasNext()) {
+            UriRef languageUri = (UriRef) languages.next().getSubject();
+            result.add(languageUri);
+        }
+        return result;
+    }
+
+    /**
+     * Returns a language uri of a language which has a label containing the
+     * specified languageName. The label itself is in the language specified through
+     * inLanguage. If inLanguage is null, then all labels of a language of searched.
+     * If no language was found in the <http://www.lingvoj.org/lingvoj>
+     * graph, then null is returned. The returned uri can be used to
+     * add the language to Clerezza over the addLanguage()-method in this class.
+     * @return a language uris
+     */
+    public UriRef getLanguage(String languageName, Language inLanguage) {
+        Graph lingvojGraph = getLingvojGraph();
+        Iterator<Triple> languages = lingvojGraph.filter(null, RDFS.isDefinedBy, null);
+        while (languages.hasNext()) {
+            GraphNode languageNode = new GraphNode((UriRef) languages.next().getSubject(), lingvojGraph);
+            Iterator<Resource> labels = languageNode.getObjects(RDFS.label);
+            while (labels.hasNext()) {
+                PlainLiteral label = (PlainLiteral) labels.next();
+                if (label.getLanguage().equals(inLanguage) || inLanguage == null) {
+                    if (label.getLexicalForm().contains(languageName)) {
+                        return (UriRef) languageNode.getNode();
+                    }
+                }
+            }
+        }
+        return null;
+    }
+    
+    /**
+     * Get the language as <code>GraphNode</code> specified through languageUri. 
+     * The languageUri has to be a <http://www.lingvoj.org/ontology#Lingvo>
+     * according to the graph <http://www.lingvoj.org/lingvoj> included in this
+     * bundle., e.g. "http://www.lingvoj.org/lang/de".
+     *
+     * @param languageUri The language uri which specifies the language 
+     */
+    public GraphNode getLanguageNode(NonLiteral langUri) {
+        Graph lingvojRdf = getLingvojGraph();
+        return new GraphNode(langUri, lingvojRdf);
+    }
+
+    /**
+     * Adds the language specified through languageUri to the Clerezza
+     * platform. The languageUri has to be a <http://www.lingvoj.org/ontology#Lingvo>
+     * according to the graph <http://www.lingvoj.org/lingvoj> included in this
+     * bundle., e.g. "http://www.lingvoj.org/lang/de" adds German.
+     * The uri is added to the system graph and its context to the config graph.
+     * The context added is the context provided by lingvoj.rdf.
+     * @param languageUri The language uri which specifies the language to be
+     *        added to the platform.
+     */
+    public void addLanguage(UriRef languageUri) {
+        if (!languageListCache.contains(languageUri)) {
+            LockableMGraph systemGraph = getSystemGraph();
+            Lock writeLock = systemGraph.getLock().writeLock();
+            writeLock.lock();
+            try {
+                if (languageList.add(languageUri)) {
+                    addToLanguageConfigGraph(languageUri);
+                }
+            } finally {
+                writeLock.unlock();
+            }
+            languageListCache.add(languageUri);
+        }
+    }
+
+    private void synchronizeContentGraph() {
+        for (Resource resource : languageListCache) {
+            addToLanguageConfigGraph((UriRef)resource);
+        }
+    }
+    /**
+     * Adds the language information of the language specified through
+     * languageUri to the config graph. The languageUri has to be of type 
+     * <http://www.lingvoj.org/ontology#Lingvo> according to the graph 
+     * <http://www.lingvoj.org/lingvoj> included in this
+     * bundle., e.g. "http://www.lingvoj.org/lang/de" adds German.
+     * 
+     * The added language will not be a platform language.
+     *
+     * @param languageUri
+     */
+    public void addToLanguageConfigGraph(NonLiteral languageUri) {
+        LockableMGraph configGraph = getConfigGraph();
+        Lock writeLock = configGraph.getLock().writeLock();
+        writeLock.lock();
+        try {
+            if (!configGraph.filter(languageUri, LINGVOJ.iso1, null).hasNext()) {
+                configGraph.addAll(getLanguageContext(languageUri));
+            }
+        } finally {
+            writeLock.unlock();
+        }
+    }
+
+    private Graph getLanguageContext(NonLiteral langUri) {
+        Graph lingvojRdf = getLingvojGraph();
+        GraphNode languageNode = new GraphNode(langUri, lingvojRdf);
+        return languageNode.getNodeContext();
+    }
+    
+    private Graph getLingvojGraph() {
+        Graph lingvojGraph = softLingvojGraph.get();
+        if (lingvojGraph != null) {
+            return lingvojGraph;
+        }
+        URL config = getClass().getResource("lingvoj.rdf");
+        if (config == null) {
+            throw new RuntimeException("no file found");
+        }
+        try {
+            MGraph lingvojMGraph = new SimpleMGraph();
+            parser.parse(lingvojMGraph, config.openStream(), SupportedFormat.RDF_XML, null);
+            lingvojGraph = lingvojMGraph.getGraph();
+            softLingvojGraph = new SoftReference<Graph>(lingvojGraph);
+            return lingvojGraph;
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    /**
+     * The activate method is called when SCR activates the component configuration.
+     * 
+     * @param componentContext
+     */
+    protected void activate(ComponentContext componentContext) {
+        LockableMGraph systemGraph = getSystemGraph();
+        NonLiteral listNode = getListNode(systemGraph);
+
+        Lock writeLock = systemGraph.getLock().writeLock();
+        writeLock.lock();
+        try {
+            // the constructor of RdfList might write to the graph! => requires a write lock
+            final RdfList rdfList = new RdfList(listNode, systemGraph);
+            languageList = Collections.synchronizedList(rdfList);
+            //access to languages should not require access to system graph,
+            //so copying the resources to an ArrayList
+            languageListCache = Collections.synchronizedList(
+                    new ArrayList<Resource>(rdfList));
+            if (languageListCache.size() == 0) {
+                addLanguage(new UriRef("http://www.lingvoj.org/lang/en"));
+            }
+            //this is to make sure the content graph contains the relevant data
+            synchronizeContentGraph();
+        } finally {
+            writeLock.unlock();
+        }
+    }
+
+    private NonLiteral getListNode(LockableMGraph systemGraph) {
+        NonLiteral instance = null;
+        Lock readLock = systemGraph.getLock().readLock();
+        readLock.lock();
+        try {
+            Iterator<Triple> instances = systemGraph.filter(null, RDF.type, PLATFORM.Instance);
+            if (!instances.hasNext()) {
+                throw new RuntimeException("No Platform:Instance in system graph.");
+            }
+            instance = instances.next().getSubject();
+            Iterator<Triple> langListIter = systemGraph.filter(instance,
+                    PLATFORM.languages, null);
+            if (langListIter.hasNext()) {
+                return (NonLiteral) langListIter.next().getObject();
+            }
+        } finally {
+            readLock.unlock();
+        }
+        BNode listNode = new BNode();
+        Lock writeLock = systemGraph.getLock().writeLock();
+        writeLock.lock();
+        try {
+            systemGraph.add(new TripleImpl(instance, PLATFORM.languages, listNode));
+        } finally {
+            writeLock.unlock();
+        }
+        return listNode;
+    }
+}

http://git-wip-us.apache.org/repos/asf/clerezza/blob/70220239/platform/language/platform.language.core/src/main/java/org/apache/clerezza/platform/language/LanguageWidget.java
----------------------------------------------------------------------
diff --git a/platform/language/platform.language.core/src/main/java/org/apache/clerezza/platform/language/LanguageWidget.java b/platform/language/platform.language.core/src/main/java/org/apache/clerezza/platform/language/LanguageWidget.java
new file mode 100644
index 0000000..a403a08
--- /dev/null
+++ b/platform/language/platform.language.core/src/main/java/org/apache/clerezza/platform/language/LanguageWidget.java
@@ -0,0 +1,185 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.clerezza.platform.language;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.security.AccessControlException;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.List;
+import java.util.concurrent.locks.Lock;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.core.MediaType;
+import org.apache.clerezza.platform.Constants;
+import org.apache.clerezza.platform.config.PlatformConfig;
+
+import org.apache.clerezza.rdf.utils.GraphNode;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Property;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.Service;
+import org.osgi.service.component.ComponentContext;
+import org.apache.clerezza.platform.language.ontologies.LANGUAGE;
+import org.apache.clerezza.platform.typerendering.RenderletManager;
+import org.apache.clerezza.platform.typerendering.UserContextProvider;
+import org.apache.clerezza.platform.typerendering.scalaserverpages.ScalaServerPagesRenderlet;
+import org.apache.clerezza.rdf.core.BNode;
+import org.apache.clerezza.rdf.core.NonLiteral;
+import org.apache.clerezza.rdf.core.TripleCollection;
+import org.apache.clerezza.rdf.core.UriRef;
+import org.apache.clerezza.rdf.core.access.LockableMGraph;
+import org.apache.clerezza.rdf.core.access.TcManager;
+import org.apache.clerezza.rdf.core.impl.TripleImpl;
+import org.apache.clerezza.rdf.ontologies.PLATFORM;
+import org.apache.clerezza.rdf.ontologies.RDF;
+import org.apache.clerezza.rdf.utils.RdfList;
+import org.apache.clerezza.rdf.utils.UnionMGraph;
+import org.apache.clerezza.web.fileserver.BundlePathNode;
+import org.apache.clerezza.web.fileserver.FileServer;
+import org.apache.felix.scr.annotations.Services;
+import org.osgi.framework.Bundle;
+import org.wymiwyg.commons.util.dirbrowser.PathNode;
+
+/**
+ * Use the LanguageWidget service to store an RDF list of
+ * languages in a triple collection and retrieve the root node of the list. The widget
+ * can be rendered by using the render method. Via javascript function
+ * LanguageList.getLanguage() the currently selected language can be retrieved.
+ *
+ * @author tio
+ */
+@Component(enabled=true, immediate=true)
+@Services({
+    @Service(Object.class),
+    @Service(UserContextProvider.class)
+})
+@Property(name = "javax.ws.rs", boolValue = true)
+
+@Path("/language-widget")
+public class LanguageWidget implements UserContextProvider {
+
+    private FileServer fileServer;
+
+    @Reference
+    private TcManager tcManager;
+
+    @Reference
+    private PlatformConfig platformConfig;
+
+    @Reference
+    private RenderletManager renderletManager;
+
+    @Reference
+    private LanguageService languageService;
+    
+    protected void activate(ComponentContext context) throws IOException, URISyntaxException {
+        Bundle bundle = context.getBundleContext().getBundle();
+        URL resourceDir = getClass().getResource("staticweb");
+        PathNode pathNode = new BundlePathNode(bundle, resourceDir.getPath());
+
+        fileServer = new FileServer(pathNode);
+
+        URL template = getClass().getResource("language-list.ssp");
+        renderletManager.registerRenderlet(ScalaServerPagesRenderlet.class.getName(),
+                new UriRef(template.toURI().toString()),
+                LANGUAGE.LanguageList, "naked",
+                MediaType.APPLICATION_XHTML_XML_TYPE, true);
+
+    }
+
+    private LockableMGraph getConfigGraph() {
+        return tcManager.getMGraph(Constants.CONFIG_GRAPH_URI);
+    }
+
+    /**
+     *
+     * @param node  The graph of the specified GraphNode will not be locked, neither for reading nor writing.
+     *        It is the responsibility of the calling function to set the write lock, if necessary.
+     * @return
+     */
+    @Override
+    public GraphNode addUserContext(final GraphNode node) {    
+        final NonLiteral platformInstance = AccessController.doPrivileged(
+            new PrivilegedAction<NonLiteral>() {
+                @Override
+                public NonLiteral run() {
+                    return (NonLiteral) platformConfig.getPlatformInstance().getNode();
+                }
+            });
+        try {
+            return addLanguages(node, platformInstance, languageService.getLanguages(), false);
+             
+        } catch (AccessControlException ex) {
+            return AccessController.doPrivileged(
+                new PrivilegedAction<GraphNode>() {
+                    @Override
+                    public GraphNode run() {
+                        return addLanguages(node, platformInstance, languageService.getLanguages(), true);
+                    }
+                });
+        }        
+    }
+
+    private GraphNode addLanguages(GraphNode node, NonLiteral platformInstance, List<LanguageDescription> languages,
+            boolean copyToNode) {
+        TripleCollection graph = node.getGraph();
+        BNode listNode = new BNode();        
+        RdfList list = new RdfList(listNode, graph);
+        LockableMGraph configGraph = getConfigGraph();
+        Lock readLock = configGraph.getLock().readLock();
+        for (LanguageDescription languageDescription : languages) {
+            NonLiteral languageUri = (NonLiteral) languageDescription.getResource().getNode();
+            list.add(languageUri);
+            if (copyToNode) {
+                readLock.lock();
+                try {
+                    graph.addAll(new GraphNode(languageUri, configGraph).getNodeContext());
+                } finally {
+                    readLock.unlock();
+                }
+            }
+        }
+        node.addProperty(PLATFORM.instance, platformInstance);
+        graph.add(new TripleImpl(platformInstance, RDF.type, PLATFORM.Instance));
+        graph.add(new TripleImpl(platformInstance, PLATFORM.languages, listNode));
+        graph.add(new TripleImpl(listNode, RDF.type, LANGUAGE.LanguageList));
+        if (!copyToNode) {
+            node = new GraphNode(node.getNode(), new UnionMGraph(graph, configGraph));
+        }
+        return node;
+    }
+
+    /**
+     * Returns a PathNode of a static file from the staticweb folder.
+     *
+     * @param path specifies the path param of a URI
+     *
+     * @return {@link PathNode}
+     */
+    @GET
+    @Path("{path:.+}")
+    public PathNode getStaticFile(@PathParam("path") String path) {
+        return fileServer.getNode(path);
+    }
+}

http://git-wip-us.apache.org/repos/asf/clerezza/blob/70220239/platform/language/platform.language.core/src/main/resources/org/apache/clerezza/platform/language/language-list.ssp
----------------------------------------------------------------------
diff --git a/platform/language/platform.language.core/src/main/resources/org/apache/clerezza/platform/language/language-list.ssp b/platform/language/platform.language.core/src/main/resources/org/apache/clerezza/platform/language/language-list.ssp
new file mode 100644
index 0000000..362009b
--- /dev/null
+++ b/platform/language/platform.language.core/src/main/resources/org/apache/clerezza/platform/language/language-list.ssp
@@ -0,0 +1,50 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+
+import org.apache.clerezza.rdf.scala.utils.RichGraphNode
+def lingvoj(s: Any) = new UriRef("http://www.lingvoj.org/ontology#"+s)
+def rdfs(s: Any) = new UriRef("http://www.w3.org/2000/01/rdf-schema#"+s)
+def getLabel(language:Language, node:RichGraphNode) : String = {
+	val matchingLabels = for (label <- node/rdfs("label");
+		val labelLiteral = label.getNode.asInstanceOf[PlainLiteral];
+		if (labelLiteral.getLanguage.equals(language))
+	) yield {
+		label*
+	}
+	if (matchingLabels.length == 0) {
+		"no label"
+	} else {
+		matchingLabels.apply(0)
+	}
+}
+resultDocModifier.addScriptReference("/language-widget/scripts/language-list.js")
+val defaultLanguage:Language = new Language(res%!!(0)/lingvoj("iso1")*)
+
+<select name="availablelanguages" id="availablelanguages">
+	<option value={defaultLanguage.toString} selected="selected">{getLabel(defaultLanguage, res%!!(0))}</option>
+	{
+		for(language <- res!!;
+			val iso1 = language/lingvoj("iso1")*;
+			if (!iso1.equals(defaultLanguage.toString))) yield {
+			<option value={iso1}>{getLabel(defaultLanguage,language)}</option>
+		}
+	}
+</select>