Package org.apache.clerezza.platform.config

Source Code of org.apache.clerezza.platform.config.PlatformConfig

/*
* 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.config;

import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.locks.Lock;
import org.apache.clerezza.platform.Constants;
import org.apache.clerezza.platform.graphprovider.content.ContentGraphProvider;
import org.apache.clerezza.platform.graphprovider.content.GraphNameTransitioner;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.osgi.framework.BundleContext;
import org.osgi.service.component.ComponentContext;
import org.apache.clerezza.rdf.core.NonLiteral;
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.NoSuchEntityException;
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.GraphNode;

/**
* This class provides a OSGi service for getting system properties from
* the sytem graph.
*
* @author mir
*/
@Component
@Service(PlatformConfig.class)
public class PlatformConfig {

  @Reference(target = SystemConfig.SYSTEM_GRAPH_FILTER)
  private LockableMGraph systemGraph;
  private BundleContext context;
  private static String DEFAULT_PORT = "8080";

  /**
   * @deprecated use org.apache.clerezza.platform.Contants instead
   */
  @Deprecated
  public static final UriRef CONFIG_GRAPH_URI = Constants.CONFIG_GRAPH_URI;

  /**
   * A filter that can be used to get the config graph as OSGi service,
   * that is provided by <code>org.apache.clerezza.rdf.core.access.TcManager</code>.
   */
  public static final String CONFIG_GRAPH_FILTER =
      "(name="+ Constants.CONFIG_GRAPH_URI_STRING +")";

  @Reference
  private TcManager tcManager;

  @Reference
  private ContentGraphProvider cgProvider;


  /**
   * Returns the default base URI of the Clerezza platform instance.
   * @return the base URI of the Clerezza platform
   */
  public UriRef getDefaultBaseUri() {
    return AccessController.doPrivileged(new PrivilegedAction<UriRef>() {

      @Override
      public UriRef run() {
        GraphNode platformInstance = getPlatformInstance();
        Lock l = platformInstance.readLock();
        l.lock();
        try {
          Iterator<Resource> triples = platformInstance.getObjects(PLATFORM.defaultBaseUri);
          if (triples.hasNext()) {
            return (UriRef) triples.next();
          } else {
            String port = context.getProperty("org.osgi.service.http.port");
            if (port == null) {
              port = DEFAULT_PORT;
            }
            if (port.equals("80")) {
              return new UriRef("http://localhost/");
            }
            return new UriRef("http://localhost:" + port + "/");
          }
        } finally {
          l.unlock();
        }
      }
    });
  }

  /**
   * Returns the platforminstance as <code>GraphNode</code> of the system
   * graph (a LockableMGraph). Access controls applies to the system graph
   * instance underlying the <code>GraphNode</code>.
   *
   * @return
   */
  public GraphNode getPlatformInstance() {
    return new GraphNode(getPlatformInstanceResource(), systemGraph);
  }

  private NonLiteral getPlatformInstanceResource() {
    Lock l = systemGraph.getLock().readLock();
    l.lock();
    try {
      Iterator<Triple> instances = systemGraph.filter(null, RDF.type, PLATFORM.Instance);
      if (!instances.hasNext()) {
        throw new RuntimeException("No Platform:Instance in system graph.");
      }
      return instances.next().getSubject();
    } finally {
      l.unlock();
    }
  }

  /**
   * Returns the base URIs of the Clerezza platform instance.
   * A base Uri is the shortest URI of a URI-Hierarhy the platform handles.
   * @return the base URI of the Clerezza platform
   */
  //todo: if this is the only class that sets and reads base uris then getBaseURIs should keep a cache
  public Set<UriRef> getBaseUris() {

    return AccessController.doPrivileged(new PrivilegedAction<Set<UriRef>>() {

      @Override
      public Set<UriRef> run() {
        Iterator<Resource> baseUrisIter = getPlatformInstance().
            getObjects(PLATFORM.baseUri);
        Set<UriRef> baseUris = new HashSet<UriRef>();
        while (baseUrisIter.hasNext()) {
          UriRef baseUri = (UriRef) baseUrisIter.next();
          baseUris.add(baseUri);
        }
        baseUris.add(getDefaultBaseUri());
        return baseUris;
      }
    });

  }

  /**
   * Adds a base URI to the Clerezza platform instance.
   *
   * @param baseUri The base URI which will be added to the platform instance
   */
  public void addBaseUri(UriRef baseUri) {
    systemGraph.add(new TripleImpl(getPlatformInstanceResource(), PLATFORM.baseUri, baseUri));
  }

  /**
   * Removes a base URI from the Clerezza platform instance.
   *
   * @param baseUri The base URI which will be removed from the platform instance
   */
  public void removeBaseUri(UriRef baseUri) {
    systemGraph.remove(new TripleImpl(getPlatformInstanceResource(), PLATFORM.baseUri, baseUri));
  }

  protected void activate(ComponentContext componentContext) {
    GraphNameTransitioner.renameGraphsWithOldNames(tcManager);
    this.context = componentContext.getBundleContext();
    try {
      tcManager.getMGraph(CONFIG_GRAPH_URI);
    } catch (NoSuchEntityException nsee) {
      tcManager.createMGraph(CONFIG_GRAPH_URI);     
    }
    cgProvider.addTemporaryAdditionGraph(CONFIG_GRAPH_URI);
  }
 
  protected void deactivate(ComponentContext componentContext) {
    this.context = null;
    cgProvider.removeTemporaryAdditionGraph(CONFIG_GRAPH_URI);
  }
}
TOP

Related Classes of org.apache.clerezza.platform.config.PlatformConfig

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.