Package org.apache.clerezza.utils.customproperty

Source Code of org.apache.clerezza.utils.customproperty.CustomProperty

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

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.concurrent.locks.Lock;

import org.apache.clerezza.utils.customproperty.ontology.CUSTOMPROPERTY;
import org.apache.clerezza.platform.graphprovider.content.ContentGraphProvider;
import org.apache.clerezza.rdf.core.BNode;
import org.apache.clerezza.rdf.core.LiteralFactory;
import org.apache.clerezza.rdf.core.MGraph;
import org.apache.clerezza.rdf.core.NonLiteral;
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.impl.PlainLiteralImpl;
import org.apache.clerezza.rdf.core.impl.TripleImpl;
import org.apache.clerezza.rdf.ontologies.DCTERMS;
import org.apache.clerezza.rdf.ontologies.RDF;

/**
*
* @scr.service interface="org.apache.clerezza.utils.customproperty.CustomProperty"
* @scr.component
* @scr.reference name="cgProvider" cardinality="1..1" policy="static"
*                interface=
*                "org.apache.clerezza.platform.graphprovider.content.ContentGraphProvider"
*
* @author mkn
*/

public class CustomProperty {

  private ContentGraphProvider cgProvider;

 
  /**
   * Adding a single customfield to customize any item of a dependency
   *
   * @param dependency    type UriRef defining the dependency item of the customfield
   * @param dependencyValue  String to specify the property within the dependency type
   * @param label        label of the customfield
   * @param property      UriRef defining the meaning of the customfield
   * @param length     
   * @param cardinality
   *
   * @return true if field could be added
   */
  public boolean addSingleCustomField(UriRef dependency,
    String dependencyValue, String label, UriRef property, int length,
    int cardinality) {
      return addSingleCustomField(dependency, dependencyValue, label, null,
          null, property, length, cardinality);
  }

  /**
   * Adding a single customfield to customize any item of a dependency
   *
   * @param dependency    type UriRef defining the dependency item of the customfield
   * @param dependencyValue  String to specify the property within the dependency type
   * @param label        label of the customfield
   * @param description    the description about the usage of this custom field
   * @param config      configuration parameter for this customfield
   * @param property      UriRef defining the meaning of the customfield
   * @param length
   * @param cardinality
   *
   * @return true if field could be added
   */
  public boolean addSingleCustomField(UriRef dependency,
    String dependencyValue, String label, String description, String config,
      UriRef property, int length, int cardinality) {
    LockableMGraph contentGraph = cgProvider.getContentGraph();

    NonLiteral customfield = addBasicCustomField(contentGraph,
      property, cardinality, label, description, config, getCustomPropertyCollection(
        dependency, dependencyValue));
    Lock lock = contentGraph.getLock().writeLock();
    lock.lock();
    try {
      if(customfield != null){
        contentGraph.add(new TripleImpl( customfield , CUSTOMPROPERTY.length,
          LiteralFactory.getInstance().createTypedLiteral(length)));
        return true;
      } else {
        return false;
      }
    } finally {
      lock.unlock();
    }
  }


  /**
   * Adding a customfield to select one or more values within some predefined ones
   *
   * @param dependency    type UriRef defining the dependency item of the customfield
   * @param dependencyValue  String to specify the property within the dependency type
   * @param label        label of the customfield
   * @param property      UriRef defining the meaning of the customfield
   * @param multiselect    defines if one or more values can be selected
   * @param selectableValues  the values as a string seperated with a ","
   * @param cardinality
   *
   * @return true if field could be added
   */
  public boolean addMultipleCustomField(UriRef dependency,
      String dependencyValue, String label, UriRef property,
      String multiselect, String selectableValues, int cardinality) {
   
    return addMultipleCustomField(dependency, dependencyValue, label, null, null, property,
        multiselect, selectableValues, cardinality);
  }

  /**
   * Adding a customfield to select one or more values within some predefined ones
   *
   * @param dependency    type UriRef defining the dependency item of the customfield
   * @param dependencyValue  String to specify the property within the dependency type
   * @param label        label of the customfield
   * @param description    the description about the usage of this custom field
   * @param config      configuration parameter for this customfield
   * @param property      UriRef defining the meaning of the customfield
   * @param multiselect    defines if one or more values can be selected
   * @param selectableValues  the values as a string seperated with a ","
   * @param cardinality
   *
   * @return true if field could be added
   */
  public boolean addMultipleCustomField(UriRef dependency,
      String dependencyValue, String label, String description, String config, UriRef property,
      String multiselect, String selectableValues, int cardinality) {
    LockableMGraph contentGraph = cgProvider.getContentGraph();

    NonLiteral customfield = addBasicCustomField(contentGraph, property,
      cardinality, label, description, config, getCustomPropertyCollection(dependency,
        dependencyValue));
    Lock lock = contentGraph.getLock().writeLock();
    lock.lock();
    try {
      if(customfield != null){
        Collection<Triple> tripleArray = new ArrayList<Triple>();
        String[] values = selectableValues.split(",");
        for (int i = 0; i < values.length; i++) {
          tripleArray
              .add(new TripleImpl(customfield, CUSTOMPROPERTY.value,
                  LiteralFactory.getInstance().createTypedLiteral(
                      values[i])));
        }
        tripleArray.add(new TripleImpl(customfield,
            CUSTOMPROPERTY.multiselectable, LiteralFactory.getInstance()
                .createTypedLiteral(multiselect)));
        contentGraph.addAll(tripleArray);
        return true;
      } else {
        return false;
      }
    } finally {
      lock.unlock();
    }
  }
 
  protected NonLiteral addBasicCustomField(LockableMGraph contentGraph,
      UriRef property, int cardinality, String label, String description,
      String config, NonLiteral propertyCollection) {
    Lock lock = contentGraph.getLock().writeLock();
    lock.lock();
    try {
      if(contentGraph.filter(null, CUSTOMPROPERTY.property, property).hasNext()) {
        return null;
      }
      Collection<Triple> tripleArray = new ArrayList<Triple>();
      NonLiteral customField = new BNode();
      contentGraph.add(new TripleImpl(customField,
          CUSTOMPROPERTY.property, property));
      tripleArray.add(new TripleImpl(propertyCollection,
          CUSTOMPROPERTY.customfield, customField));
      tripleArray.add(new TripleImpl(customField, RDF.type,
          CUSTOMPROPERTY.CustomField));
      tripleArray.add(new TripleImpl(customField, CUSTOMPROPERTY.cardinality,
          LiteralFactory.getInstance().createTypedLiteral(cardinality)));
      tripleArray.add(new TripleImpl(customField,
          CUSTOMPROPERTY.presentationlabel, new PlainLiteralImpl(label)));
      if(description != null && !description.isEmpty()) {
        tripleArray.add(new TripleImpl(customField,
          DCTERMS.description, new PlainLiteralImpl(description)));
      }
      if(config != null && !config.isEmpty()) {
        tripleArray.add(new TripleImpl(customField,
          CUSTOMPROPERTY.configuration, new PlainLiteralImpl(config)));
      }
      if(contentGraph.addAll(tripleArray)){
        return customField;
      } else {
        return null;
      }
    } finally {
      lock.unlock();
    }

   
  }

  /**
   * Get back the Resource of the collection for a specific dependency
   *
   * @param dependency    the type of items the collection is defining customproperties for
   * @param dependencyValue  a specification string to select the right collection within all dependency collections
   *
   * @return the resource of the found collection
   */
  public NonLiteral getCustomPropertyCollection(UriRef dependency,
      String dependencyValue) {
    LockableMGraph contentGraph = cgProvider.getContentGraph();
    Lock lock = contentGraph.getLock().readLock();
    lock.lock();
    try {
      Iterator<Triple> collections = contentGraph.filter(null, RDF.type,
          CUSTOMPROPERTY.CustomFieldCollection);
      while (collections.hasNext()) {
        Iterator<Triple> collections2 = contentGraph
            .filter(collections.next().getSubject(),
                CUSTOMPROPERTY.dependency, dependency);
        while (collections2.hasNext()) {
          Iterator<Triple> collections3 = contentGraph.filter(
              collections2.next().getSubject(),
              CUSTOMPROPERTY.dependencyvalue, LiteralFactory
                  .getInstance().createTypedLiteral(
                      dependencyValue));
          if (collections3.hasNext()) {
            return collections3.next().getSubject();
          }
        }
      }
    } finally {
      lock.unlock();
    }
    lock = contentGraph.getLock().writeLock();
    lock.lock();
    try {
      Collection<Triple> tripleArray = new ArrayList<Triple>();
      NonLiteral cfc = new BNode();
      tripleArray.add(new TripleImpl(cfc, RDF.type,
          CUSTOMPROPERTY.CustomFieldCollection));
      tripleArray.add(new TripleImpl(cfc, CUSTOMPROPERTY.dependency,
          dependency));
      tripleArray.add(new TripleImpl(cfc, CUSTOMPROPERTY.dependencyvalue,
          LiteralFactory.getInstance()
              .createTypedLiteral(dependencyValue)));
      contentGraph.addAll(tripleArray);
      return getCustomPropertyCollection(dependency, dependencyValue);
    } finally {
      lock.unlock();
    }
  }
 
  /**
   * @param collection
   * @return all customfields of the collection
   */
  public ArrayList<NonLiteral>getCustomfieldsOfCollection(NonLiteral collection){
    ArrayList<NonLiteral> customfields = new ArrayList<NonLiteral>();
    LockableMGraph contentGraph = cgProvider.getContentGraph();
    Lock lock = contentGraph.getLock().readLock();
    lock.lock();
    try {
      Iterator <Triple> result= contentGraph.filter(collection, CUSTOMPROPERTY.customfield, null);
      while(result.hasNext()){
        customfields.add((NonLiteral) result.next().getObject());
      }
      return customfields;
    } finally {
      lock.unlock();
    }
  }

  /**
   * @param collection
   * @return all properties of the collection
   */
  public ArrayList<UriRef>getPropertiesOfCollection(NonLiteral collection){
    ArrayList<UriRef> customproperties = new ArrayList<UriRef>();
    LockableMGraph contentGraph = cgProvider.getContentGraph();
    Lock lock = contentGraph.getLock().readLock();
    lock.lock();
    try {
      Iterator <Triple> result= contentGraph.filter(collection, CUSTOMPROPERTY.customfield, null);
      while(result.hasNext()){
        Iterator <Triple> property= contentGraph.filter(
            (NonLiteral)result.next().getObject(), CUSTOMPROPERTY.property, null);
        if(property.hasNext()){
          customproperties.add((UriRef)property.next().getObject());
        }
      }
      return customproperties;
    } finally {
      lock.unlock();
    }
  }

 
  /**
   * Delete a customfield according to its collection and its property
   *
   * @param dependency
   * @param dependencyValue
   * @param property
   *
   * @return  returns whether the customfield could be deleted or not
   */
  public boolean deleteCustomField(UriRef dependency, String dependencyValue,
      UriRef property) {
    LockableMGraph contentGraph = cgProvider.getContentGraph();
    Collection<Triple> allCustomFieldTriples = new ArrayList<Triple>();
    Iterator<Triple> customfields = contentGraph.filter(
        getCustomPropertyCollection(dependency, dependencyValue),
        CUSTOMPROPERTY.customfield, null);
    boolean customFieldDelete = false;
    Lock lock = contentGraph.getLock().writeLock();
    lock.lock();
    try {
      while (customfields.hasNext()) {
        Iterator<Triple> customfields2 = contentGraph.filter(
            (NonLiteral) customfields.next().getObject(),
            CUSTOMPROPERTY.property, property);
        if (customfields2.hasNext()) {
          NonLiteral customField = customfields2.next().getSubject();
          Iterator<Triple> someCustomfieldTriples = contentGraph.filter(
              customField, null, null);
          while (someCustomfieldTriples.hasNext()) {
            allCustomFieldTriples.add(someCustomfieldTriples.next());
          }
          Iterator<Triple> otherCustomFieldTriples = contentGraph.filter(
              null, null, customField);
          while (otherCustomFieldTriples.hasNext()) {
            allCustomFieldTriples.add(otherCustomFieldTriples.next());
          }
          customFieldDelete =  true;
        }
      }
      contentGraph.removeAll(allCustomFieldTriples);
    } finally {
      lock.unlock();
    }   
    return customFieldDelete;

  }
 
  /**
   *
   * @param customfield
   * @return the property UriRef of the customfield
   */
  public UriRef getCustomFieldProperty(NonLiteral customfield){
    MGraph contentGraph = cgProvider.getContentGraph();
    return (UriRef)contentGraph.filter(customfield, CUSTOMPROPERTY.property,
        null).next().getObject();
  }
 
  protected void bindCgProvider(ContentGraphProvider cgProvider) {
    this.cgProvider = cgProvider;
  }
 
  protected void unbindCgProvider(ContentGraphProvider cgProvider) {
    this.cgProvider = null;
  }

}
TOP

Related Classes of org.apache.clerezza.utils.customproperty.CustomProperty

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.