blob: c0de30333af4ddda37c367cf663b91b01402ec14 [file] [log] [blame]
/*
* 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.test.utils;
import org.apache.clerezza.*;
import org.apache.clerezza.implementation.TripleImpl;
import org.apache.clerezza.implementation.literal.PlainLiteralImpl;
import org.apache.commons.lang.RandomStringUtils;
import java.util.Iterator;
import java.util.UUID;
/**
* A <code>Graph</code> wrapper that allows growing and shrinking of
* the wrapped mgraph.
*
* @author mir
*/
public class RandomGraph extends GraphWrapper {
private int interconnectivity = 2;
public RandomGraph(Graph mGraph, int interconnectivity) {
super(mGraph);
this.interconnectivity = interconnectivity;
}
/**
* Creates a new random mutual graph.
*
* @param initialSize Determines the initial size of the content graph
* @param interconnectivity Determines the probability of using already existing
* resource when creating a new triple. The probability of using an existing
* resource over creating a new resouce is 1-(1/interconnectivity).
* @param mGraph
*/
public RandomGraph(int initialSize, int interconnectivity, Graph mGraph) {
super(mGraph);
if (interconnectivity <= 0) {
throw new IllegalArgumentException("growth speed and the interconnectivity "
+ "value have to be equals or highter one");
}
this.interconnectivity = interconnectivity;
setupInitialSize(initialSize);
}
/**
* Add or removes randomly a triple.
*
* @return the triple that was added or removed.
*/
public Triple evolve() {
Triple triple;
int random = rollDice(2);
if (random == 0 && size() != 0) {
triple = getRandomTriple();
remove(triple);
} else {
triple = createRandomTriple();
add(triple);
}
return triple;
}
/**
* Removes a random triple.
*
* @return the triple that was removed.
*/
public Triple removeRandomTriple() {
Triple randomTriple = getRandomTriple();
remove(randomTriple);
return randomTriple;
}
/**
* Adds a random triple.
*
* @return the triple that was added.
*/
public Triple addRandomTriple() {
Triple randomTriple;
do {
randomTriple = createRandomTriple();
} while(contains(randomTriple));
add(randomTriple);
return randomTriple;
}
private Triple createRandomTriple() {
return new TripleImpl(getSubject(), getPredicate(), getObject());
}
private BlankNodeOrIRI getSubject() {
int random = rollDice(interconnectivity);
if (size() == 0) {
random = 0;
}
switch (random) {
case 0: // create new BlankNodeOrIRI
RDFTerm newRDFTerm;
do {
newRDFTerm = createRandomRDFTerm();
} while (!(newRDFTerm instanceof BlankNodeOrIRI));
return (BlankNodeOrIRI) newRDFTerm;
default: // get existing BlankNodeOrIRI
RDFTerm existingRDFTerm;
do {
existingRDFTerm = getExistingRDFTerm();
if (existingRDFTerm == null) {
random = 0;
}
} while (!(existingRDFTerm instanceof BlankNodeOrIRI));
return (BlankNodeOrIRI) existingRDFTerm;
}
}
private IRI getPredicate() {
int random = rollDice(interconnectivity);
if (size() == 0) {
random = 0;
}
switch (random) {
case 0: // create new IRI
return createRandomIRI();
default: // get existing IRI
RDFTerm existingRDFTerm;
do {
existingRDFTerm = getExistingRDFTerm();
if (existingRDFTerm == null) {
random = 0;
}
} while (!(existingRDFTerm instanceof IRI));
return (IRI) existingRDFTerm;
}
}
private RDFTerm getObject() {
int random = rollDice(interconnectivity);
if (size() == 0) {
random = 0;
}
switch (random) {
case 0: // create new resource
return createRandomRDFTerm();
default: // get existing resource
RDFTerm existingRDFTerm = getExistingRDFTerm();
if (existingRDFTerm == null) {
random = 0;
}
return existingRDFTerm;
}
}
private static int rollDice(int faces) {
return (int) (Math.random() * faces);
}
private RDFTerm createRandomRDFTerm() {
switch (rollDice(3)) {
case 0:
return new BlankNode();
case 1:
return createRandomIRI();
case 2:
return new PlainLiteralImpl(RandomStringUtils.random(rollDice(100) + 1));
}
throw new RuntimeException("in createRandomRDFTerm()");
}
private RDFTerm getExistingRDFTerm() {
Triple triple = getRandomTriple();
if (triple == null) {
return null;
}
switch (rollDice(3)) {
case 0:
return triple.getSubject();
case 1:
return triple.getPredicate();
case 2:
return triple.getObject();
}
return null;
}
private IRI createRandomIRI() {
return new IRI("http://" + UUID.randomUUID().toString());
}
/**
* Returns a random triple contained in the Graph.
*/
public Triple getRandomTriple() {
int size = this.size();
if (size == 0) {
return null;
}
Iterator<Triple> triples = iterator();
while (triples.hasNext()) {
Triple triple = triples.next();
if (rollDice(this.size()) == 0) {
return triple;
}
}
return getRandomTriple();
}
private void setupInitialSize(int initialSize) {
for (int i = 0; i < initialSize; i++) {
addRandomTriple();
}
}
}