From: <bd...@us...> - 2011-03-24 16:31:50
|
Revision: 9533 http://unicore.svn.sourceforge.net/unicore/?rev=9533&view=rev Author: bdemuth Date: 2011-03-24 16:31:40 +0000 (Thu, 24 Mar 2011) Log Message: ----------- Initial import. Still EXPERIMENTAL. Added Paths: ----------- resourceBrokering/broker/LICENSE.FZJ resourceBrokering/broker/pom.xml resourceBrokering/broker/src/ resourceBrokering/broker/src/main/ resourceBrokering/broker/src/main/java/ resourceBrokering/broker/src/main/java/eu/ resourceBrokering/broker/src/main/java/eu/unicore/ resourceBrokering/broker/src/main/java/eu/unicore/broker/ resourceBrokering/broker/src/main/java/eu/unicore/broker/AttributeCache.java resourceBrokering/broker/src/main/java/eu/unicore/broker/BrokeringConstants.java resourceBrokering/broker/src/main/java/eu/unicore/broker/DependencyFactory.java resourceBrokering/broker/src/main/java/eu/unicore/broker/EHAttributeCache.java resourceBrokering/broker/src/main/java/eu/unicore/broker/EntityWithAttributes.java resourceBrokering/broker/src/main/java/eu/unicore/broker/EntityWithAttributesImpl.java resourceBrokering/broker/src/main/java/eu/unicore/broker/JobToSiteBroker.java resourceBrokering/broker/src/main/java/eu/unicore/broker/JobToSiteBrokerImpl.java resourceBrokering/broker/src/main/java/eu/unicore/broker/exceptions/ resourceBrokering/broker/src/main/java/eu/unicore/broker/exceptions/NoMatchingSiteException.java resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/ resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/AbstractSiteIndex.java resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/SiteIndex.java resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/SiteIndexer.java resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/SiteIndexing.java resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/SiteIndexingImpl.java resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/inverted/ resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/inverted/InvertedSiteIndex.java resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/ranges/ resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/ranges/Interval.java resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/ranges/RangeSiteIndex.java resourceBrokering/broker/src/main/java/eu/unicore/broker/jobs/ resourceBrokering/broker/src/main/java/eu/unicore/broker/jobs/JobDescription.java resourceBrokering/broker/src/main/java/eu/unicore/broker/jobs/JobDescriptionFactory.java resourceBrokering/broker/src/main/java/eu/unicore/broker/jobs/JobDescriptionImpl.java resourceBrokering/broker/src/main/java/eu/unicore/broker/jobs/attributes/ resourceBrokering/broker/src/main/java/eu/unicore/broker/jobs/attributes/AbstractRangeBasedJobAttribute.java resourceBrokering/broker/src/main/java/eu/unicore/broker/jobs/attributes/BlackListAttribute.java resourceBrokering/broker/src/main/java/eu/unicore/broker/jobs/attributes/GreyListAttribute.java resourceBrokering/broker/src/main/java/eu/unicore/broker/jobs/attributes/WhiteListAttribute.java resourceBrokering/broker/src/main/java/eu/unicore/broker/matchmaking/ resourceBrokering/broker/src/main/java/eu/unicore/broker/matchmaking/AbstractJobToSiteMatchmaker.java resourceBrokering/broker/src/main/java/eu/unicore/broker/matchmaking/AbstractRangeBasedMatchmaker.java resourceBrokering/broker/src/main/java/eu/unicore/broker/matchmaking/BlackListMatchmaker.java resourceBrokering/broker/src/main/java/eu/unicore/broker/matchmaking/GreyListMatchmaker.java resourceBrokering/broker/src/main/java/eu/unicore/broker/matchmaking/JobToSiteMatchmaker.java resourceBrokering/broker/src/main/java/eu/unicore/broker/matchmaking/JobToSiteMatchmaking.java resourceBrokering/broker/src/main/java/eu/unicore/broker/matchmaking/JobToSiteMatchmakingImpl.java resourceBrokering/broker/src/main/java/eu/unicore/broker/matchmaking/WhiteListMatchmaker.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/ resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/Site.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/SiteDiscoverer.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/SiteDiscovery.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/SiteDiscoveryImpl.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/SiteImpl.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/SiteStore.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/SiteStoreImpl.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/attributes/ resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/attributes/AbstractSiteAttribute.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/attributes/MostRecentUsageAttribute.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/attributes/SiteAttribute.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/attributes/SiteAttributeCollector.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/attributes/SiteAttributeGathering.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/attributes/SiteAttributeGatheringImpl.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/rating/ resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/rating/AbstractSiteRatingStrategy.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/rating/JobToSiteMapping.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/rating/LeastRecentlyUsedRatingStrategy.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/rating/Rating.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/rating/SiteRating.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/rating/SiteRatingImpl.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/rating/SiteRatingStrategy.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/rating/UniformRatingStrategy.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/rating/WeightedSumRatingStrategy.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/selection/ resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/selection/HighestScoreSelectionStrategy.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/selection/ProbabilisticSelectionStrategy.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/selection/SiteAccessibilityChecker.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/selection/SiteSelection.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/selection/SiteSelectionImpl.java resourceBrokering/broker/src/main/java/eu/unicore/broker/sites/selection/SiteSelectionStrategy.java resourceBrokering/broker/src/main/java/eu/unicore/broker/users/ resourceBrokering/broker/src/main/java/eu/unicore/broker/users/User.java resourceBrokering/broker/src/main/java/eu/unicore/broker/users/UserImpl.java resourceBrokering/broker/src/main/java/eu/unicore/broker/users/UserStore.java resourceBrokering/broker/src/main/java/eu/unicore/broker/users/UserStoreImpl.java resourceBrokering/broker/src/main/java/eu/unicore/broker/users/attributes/ resourceBrokering/broker/src/main/java/eu/unicore/broker/users/attributes/InaccessibleSitesAttribute.java resourceBrokering/broker/src/main/java/eu/unicore/broker/utils/ resourceBrokering/broker/src/main/java/eu/unicore/broker/utils/CollectionUtils.java resourceBrokering/broker/src/main/resources/ resourceBrokering/broker/src/main/resources/conf/ resourceBrokering/broker/src/main/resources/conf/ehcache.xml resourceBrokering/broker/src/main/strategies/ resourceBrokering/broker/src/main/strategies/RandomStrategy.groovy resourceBrokering/broker/src/test/ resourceBrokering/broker/src/test/java/ resourceBrokering/broker/src/test/java/eu/ resourceBrokering/broker/src/test/java/eu/unicore/ resourceBrokering/broker/src/test/java/eu/unicore/broker/ resourceBrokering/broker/src/test/java/eu/unicore/broker/indexing/ resourceBrokering/broker/src/test/java/eu/unicore/broker/indexing/ranges/ resourceBrokering/broker/src/test/java/eu/unicore/broker/test/ resourceBrokering/broker/src/test/java/eu/unicore/broker/test/TestBrokering.java resourceBrokering/broker/src/test/java/eu/unicore/broker/test/TestDependencyInjection.java resourceBrokering/broker/src/test/resources/ resourceBrokering/broker/src/test/resources/broker.xml Added: resourceBrokering/broker/LICENSE.FZJ =================================================================== --- resourceBrokering/broker/LICENSE.FZJ (rev 0) +++ resourceBrokering/broker/LICENSE.FZJ 2011-03-24 16:31:40 UTC (rev 9533) @@ -0,0 +1,32 @@ +/********************************************************************************* + * Copyright (c) 2006 Forschungszentrum Juelich GmbH + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * (1) Redistributions of source code must retain the above copyright notice, + * this list of conditions and the disclaimer at the end. Redistributions in + * binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * (2) Neither the name of Forschungszentrum Juelich GmbH nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * DISCLAIMER + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + ********************************************************************************/ + Added: resourceBrokering/broker/pom.xml =================================================================== --- resourceBrokering/broker/pom.xml (rev 0) +++ resourceBrokering/broker/pom.xml 2011-03-24 16:31:40 UTC (rev 9533) @@ -0,0 +1,163 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>eu.unicore</groupId> + <artifactId>brokering</artifactId> + <version>1.0.0-SNAPSHOT</version> + <packaging>jar</packaging> + <description>UNICORE Resource Brokering</description> + <inceptionYear>2011</inceptionYear> + <name>ServiceOrchestrator</name> + + <!-- subversion configuration --> + <scm> + <connection>scm:svn:http://unicore.svn.sourceforge.net/svnroot/unicore/brokering/trunk</connection> + <developerConnection>scm:svn:https://unicore.svn.sourceforge.net/svnroot/unicore/brokering/trunk</developerConnection> + </scm> + + + <dependencies> + + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>3.8.1</version> + <scope>test</scope> + </dependency> + + + <dependency> + <groupId>org.codehaus.groovy</groupId> + <artifactId>groovy-all</artifactId> + <version>1.6.4</version> + </dependency> + + <dependency> + <groupId>net.sf.ehcache</groupId> + <artifactId>ehcache-core</artifactId> + <version>1.7.2</version> + </dependency> + + <dependency> + <groupId>log4j</groupId> + <artifactId>log4j</artifactId> + <version>1.2.16</version> + </dependency> + + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-log4j12</artifactId> + <version>1.6.1</version> + </dependency> + + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + <version>1.6.1</version> + </dependency> + + + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-context</artifactId> + <version>3.0.5.RELEASE</version> + </dependency> + + </dependencies> + + <!-- REPOSITORIES used --> + + <repositories> + <repository> + <id>unicore.eu</id> + <name>UNICORE repository</name> + <url>http://unicore-dev.zam.kfa-juelich.de/maven</url> + </repository> + </repositories> + <distributionManagement> + <repository> + <id>unicore.eu</id> + <name>UNICORE repository</name> + <url>dav:http://unicore-dev.zam.kfa-juelich.de/maven</url> + </repository> + <snapshotRepository> + <id>unicore.eu-snapshot</id> + <name>UNICORE SNAPSHOT Repository</name> + <url>dav:http://unicore-dev.zam.kfa-juelich.de/maven</url> + </snapshotRepository> + </distributionManagement> + + <build> + <extensions> + <extension> + <groupId>org.apache.maven.wagon</groupId> + <artifactId>wagon-ssh-external</artifactId> + <version>1.0-alpha-5</version> + </extension> + </extensions> + + <plugins> + + <!-- useJava 5 --> + <plugin> + <artifactId>maven-compiler-plugin</artifactId> + <configuration> + <source>1.5</source> + <target>1.5</target> + </configuration> + </plugin> + + <plugin> + <artifactId>maven-assembly-plugin</artifactId> + <configuration> + <descriptors> + <descriptor>src/main/assembly/deps.xml</descriptor> + </descriptors> + </configuration> + </plugin> + + <!-- attach sources in seperate jar file --> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-source-plugin</artifactId> + <inherited>true</inherited> + <executions> + <execution> + <id>source-plugin</id> + <phase>verify</phase> <!-- makes sure the source jar is build before install or compile --> + <goals> + <goal>jar</goal> + </goals> + <inherited>true</inherited> + </execution> + </executions> + <configuration> + <attach>true</attach> + </configuration> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <configuration> + <!-- skip>true</skip --> + <excludes> + <exclude>**/functional/**</exclude> + <exclude>**/*$*</exclude> + </excludes> + <forkMode>pertest</forkMode> + </configuration> + </plugin> + + <plugin> + <artifactId>maven-release-plugin</artifactId> + <version>2.0-beta-4</version> + <configuration> + <tagBase>https://unicore.svn.sourceforge.net/svnroot/unicore/workflow/tags/servorch</tagBase> + </configuration> + </plugin> + + </plugins> + </build> + +</project> Added: resourceBrokering/broker/src/main/java/eu/unicore/broker/AttributeCache.java =================================================================== --- resourceBrokering/broker/src/main/java/eu/unicore/broker/AttributeCache.java (rev 0) +++ resourceBrokering/broker/src/main/java/eu/unicore/broker/AttributeCache.java 2011-03-24 16:31:40 UTC (rev 9533) @@ -0,0 +1,47 @@ +package eu.unicore.broker; + +import java.io.Serializable; +import java.util.Map; +import java.util.Set; + +import javax.xml.namespace.QName; + +public interface AttributeCache { + public static final String INTERFACE_ID = AttributeCache.class.getName(); + + public Serializable getAttribute(String domain, String instance, QName attributeName); + + public void putAttribute(String domain, String instance, QName attributeName, Serializable attribute); + + public void removeAttribute(String domain, String instance, QName attributeName); + + public void removeInstance(String domain, String instance); + + public Set<QName> getAllAttributeNames(String domain, String instance); + + public Set<String> getAllInstanceIds(String domain); + + public void clearAllAttributes(String domain); + + public void clearAllAttributes(String domain, String instance); + + /** + * Get a read-only map indicating which attribute values have been modified + * since {@link #resetModifiedAttributes()} has been called. + * The outer map contains domain names as keys. The inner maps + * contain instance ids as keys and set of attribute names as + * values. Each attribute name set contains all attributes with modified + * values for the instance with the given id. + * + * @return The map containing attribute modifications or an empty map. Must NOT return null! + */ + public Map<String,Map<String,Set<QName>>> getModifiedAttributes(); + + /** + * Resets the logged attribute value changes. After calling this, + * {@link #getModifiedAttributes()} will return an empty map until + * {@link #putAttribute(String, String, QName, Serializable)} is called. + */ + public void resetModifiedAttributes(); + +} \ No newline at end of file Added: resourceBrokering/broker/src/main/java/eu/unicore/broker/BrokeringConstants.java =================================================================== --- resourceBrokering/broker/src/main/java/eu/unicore/broker/BrokeringConstants.java (rev 0) +++ resourceBrokering/broker/src/main/java/eu/unicore/broker/BrokeringConstants.java 2011-03-24 16:31:40 UTC (rev 9533) @@ -0,0 +1,14 @@ +package eu.unicore.broker; + +public interface BrokeringConstants { + + /** + * Very small positive number used in checks to avoid numerical problems + */ + public static double EPSILON = 1E-12; + + public static final String JOB_ATTRIBUTE_NAMESPACE = "http://unicore.eu/broker/jobs/attributes"; + public static final String SITE_ATTRIBUTE_NAMESPACE = "http://unicore.eu/broker/sites/attributes"; + public static final String USER_ATTRIBUTE_NAMESPACE = "http://unicore.eu/broker/users/attributes"; + +} Added: resourceBrokering/broker/src/main/java/eu/unicore/broker/DependencyFactory.java =================================================================== --- resourceBrokering/broker/src/main/java/eu/unicore/broker/DependencyFactory.java (rev 0) +++ resourceBrokering/broker/src/main/java/eu/unicore/broker/DependencyFactory.java 2011-03-24 16:31:40 UTC (rev 9533) @@ -0,0 +1,105 @@ +package eu.unicore.broker; + +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.AbstractApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + + +/** + * This class can be used to create/obtain objects that we depend on. The + * current underlying framework is Spring, but we could use a different DI + * mechanism instead. + * @author bdemuth + * + */ +public class DependencyFactory { + + public static final int AUTOWIRE_BY_NAME = DefaultListableBeanFactory.AUTOWIRE_BY_NAME; + public static final int AUTOWIRE_BY_TYPE = DefaultListableBeanFactory.AUTOWIRE_BY_TYPE; + public static final int AUTOWIRE_CONSTRUCTOR = DefaultListableBeanFactory.AUTOWIRE_CONSTRUCTOR; + public static final int AUTOWIRE_NO = DefaultListableBeanFactory.AUTOWIRE_NO; + + public static final String SCOPE_SINGLETON = DefaultListableBeanFactory.SCOPE_SINGLETON; + public static final String SCOPE_PROTOTYPE = DefaultListableBeanFactory.SCOPE_PROTOTYPE; + + private static AbstractApplicationContext context; + private static boolean initialized = false; + + private static Object initLock = new Object(); + + + public static Class<?> getClass(String className) + { + synchronized (initLock) { + if(context == null) + { + context = createDefaultContext(); + } + if(!initialized) + { + context.refresh(); + initialized = true; + } + } + return context.getType(className); + } + + public static <T> T getComponent(String identifier, Class<T> clazz) + { + + synchronized (initLock) { + if(context == null) + { + context = createDefaultContext(); + } + if(!initialized) + { + context.refresh(); + initialized = true; + } + } + T result = (T) context.getBean(clazz); + return result; + } + + + + /** + * Used to set the location(s) of config files that steer the dependency + * injection. The files must be on your classpath! + * @param configs + */ + public static void setConfigLocations(String... configs) + { + synchronized (initLock) { + initialized = false; + context = new ClassPathXmlApplicationContext(configs,false); + } + } + + public static void addComponent(String id, Class<?> componentClass, int autowireMode, String scope) throws Exception { + DefaultListableBeanFactory factory = (DefaultListableBeanFactory) context.getAutowireCapableBeanFactory(); + // create the bean definition + AbstractBeanDefinition beanDef = BeanDefinitionReaderUtils.createBeanDefinition(null, componentClass.getCanonicalName(), componentClass.getClassLoader()); + beanDef.setScope(scope); + beanDef.setAutowireMode(autowireMode); + // Create the bean - I'm using the class name as the bean name + factory.registerBeanDefinition(id, beanDef); + } + + + + public static void removeComponent(String id) { + DefaultListableBeanFactory factory = (DefaultListableBeanFactory) context.getAutowireCapableBeanFactory(); + factory.removeBeanDefinition(id); + } + + private static AbstractApplicationContext createDefaultContext() + { + return new ClassPathXmlApplicationContext(new String[]{"classpath:./conf/applicationContext.xml"},false); + } + +} Added: resourceBrokering/broker/src/main/java/eu/unicore/broker/EHAttributeCache.java =================================================================== --- resourceBrokering/broker/src/main/java/eu/unicore/broker/EHAttributeCache.java (rev 0) +++ resourceBrokering/broker/src/main/java/eu/unicore/broker/EHAttributeCache.java 2011-03-24 16:31:40 UTC (rev 9533) @@ -0,0 +1,229 @@ +package eu.unicore.broker; + +import java.io.IOException; +import java.io.Serializable; +import java.net.URL; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import javax.xml.namespace.QName; + +import eu.unicore.broker.utils.CollectionUtils; + +import net.sf.ehcache.Cache; +import net.sf.ehcache.CacheManager; +import net.sf.ehcache.Element; +import net.sf.ehcache.config.Configuration; +import net.sf.ehcache.config.ConfigurationFactory; + + +public class EHAttributeCache implements AttributeCache { + + protected Cache storage; + protected String persistencePath; + protected String configLocation; + + protected ConcurrentHashMap<String, Set<String>> instanceIdsByDomain = new ConcurrentHashMap<String, Set<String>>(); + protected ConcurrentHashMap<String, Set<QName>> attributeNamesByInstance = new ConcurrentHashMap<String, Set<QName>>(); + + Map<String, Map<String, Set<QName>>> modifiedAttributes = new ConcurrentHashMap<String, Map<String,Set<QName>>>(); + + private static final String KEY_SEPARATOR = "#+#+#"; + + public EHAttributeCache() { + super(); + } + + /* (non-Javadoc) + * @see eu.unicore.broker.AttributeCache#getAttribute(java.lang.String) + */ + public Serializable getAttribute(String domain, String instance, QName attributeName) { + + Element e = null; + String key = getKey(instance, attributeName); + try { + e = getStorage(domain).get(key); + } catch (Exception e1) { + getStorage(domain).remove(key); + } + if(e == null) + { + return null; + } + else if(!e.getKey().equals(key)) + { + // the db has just returned a misfitting entry + // shouldn't happen but HAS HAPPENED + // try to clean up this entry + getStorage(domain).remove(key); + return null; + } + return (Serializable) e.getObjectValue(); + } + + + + /* (non-Javadoc) + * @see eu.unicore.broker.AttributeCache#putAttribute(eu.unicore.broker.Attribute) + */ + public void putAttribute(String domain, String instance, QName attributeName, Serializable attribute) { + Serializable oldAttribute = getAttribute(domain, instance, attributeName); + if(CollectionUtils.equalOrBothNull(attribute, oldAttribute)) return; + Element e = new Element(getKey(instance, attributeName),attribute); + getStorage(domain).put(e); + Set<String> instanceIds = instanceIdsByDomain.get(domain); + if(instanceIds == null) + { + instanceIds = new HashSet<String>(); + instanceIdsByDomain.put(domain, instanceIds); + } + instanceIds.add(instance); + + Set<QName> attributeNames = attributeNamesByInstance.get(instance); + if(attributeNames == null) + { + attributeNames = new HashSet<QName>(); + attributeNamesByInstance.put(instance, attributeNames); + } + attributeNames.add(attributeName); + + Map<String,Set<QName>> modified = modifiedAttributes.get(domain); + if(modified == null) + { + modified = new ConcurrentHashMap<String, Set<QName>>(); + modifiedAttributes.put(domain, modified); + } + Set<QName> attributes = modified.get(instance); + if(attributes == null) + { + attributes = new HashSet<QName>(); + modified.put(instance, attributes); + } + attributes.add(attributeName); + } + + protected Cache getStorage(String domain) + { + if(storage == null) + { + + try { + Configuration config = null; + URL configLocation = getClass().getClassLoader().getResource(getConfigLocation()); + if(configLocation != null) + { + config = ConfigurationFactory.parseConfiguration(configLocation); + } + else + { + config = new Configuration(); + + + } + config.getDiskStoreConfiguration().setPath(getPersistencePath()); + //Create a CacheManager using defaults + CacheManager manager = new CacheManager(config); + storage = manager.getCache(domain); + if(storage == null) + { + manager.addCache(domain); + storage = manager.getCache(domain); + } + storage.flush(); // re-write index as it gets deleted by ehcache on startup (if we skip this, shutting the client uncleanly will cause data loss) + } catch (Exception e) { + e.printStackTrace(); + + } + + } + return storage; + } + + + public String getPersistencePath() + { + return persistencePath; + + } + + /* (non-Javadoc) + * @see eu.unicore.broker.AttributeCache#removeAttribute(java.lang.String) + */ + public void removeAttribute(String domain, String instance, QName attributeName) + { + getStorage(domain).remove(getKey(instance, attributeName)); + Set<QName> attributeNames = attributeNamesByInstance.get(instance); + if(attributeNames != null) attributeNames.remove(attributeName); + } + + public void removeInstance(String domain, String instance) + { + clearAllAttributes(domain, instance); + Set<String> instanceIds = instanceIdsByDomain.get(domain); + if(instanceIds != null) instanceIds.remove(instance); + } + + /* (non-Javadoc) + * @see eu.unicore.broker.AttributeCache#clearAllAttributes() + */ + public void clearAllAttributes(String domain) { + getStorage(domain).removeAll(); + } + + + + private String getKey(String instance, QName attributeName) + { + return instance + KEY_SEPARATOR+ attributeName.toString(); + } + + public void flushToDisk() throws IOException { + if(storage != null) + { + System.out.println("Storing "+storage.calculateInMemorySize()/1000+" Kbyte of attributes"); + storage.flush(); + } + } + + public void setPersistencePath(String persistencePath) { + this.persistencePath = persistencePath; + } + + public Set<QName> getAllAttributeNames(String domain, String instance) { + Set<QName> attributeNames = attributeNamesByInstance.get(instance); + return attributeNames; + } + + public Set<String> getAllInstanceIds(String domain) { + Set<String> instanceIds = instanceIdsByDomain.get(domain); + return instanceIds; + } + + public void clearAllAttributes(String domain, String instance) { + Set<QName> attributeNames = getAllAttributeNames(domain, instance); + attributeNamesByInstance.remove(instance); + for(QName attributeName : attributeNames) + { + removeAttribute(domain, instance, attributeName); + } + } + + public Map<String, Map<String, Set<QName>>> getModifiedAttributes() { + return modifiedAttributes; + } + + public void resetModifiedAttributes() { + modifiedAttributes.clear(); + + } + + public String getConfigLocation() { + return configLocation; + } + + public void setConfigLocation(String configLocation) { + this.configLocation = configLocation; + } +} Added: resourceBrokering/broker/src/main/java/eu/unicore/broker/EntityWithAttributes.java =================================================================== --- resourceBrokering/broker/src/main/java/eu/unicore/broker/EntityWithAttributes.java (rev 0) +++ resourceBrokering/broker/src/main/java/eu/unicore/broker/EntityWithAttributes.java 2011-03-24 16:31:40 UTC (rev 9533) @@ -0,0 +1,25 @@ +package eu.unicore.broker; + +import java.io.Serializable; +import java.util.Set; + +import javax.xml.namespace.QName; + +public interface EntityWithAttributes<A extends Serializable> { + + + public A getAttribute(QName attributeName); + + public void setAttribute(QName attributeName, A attribute); + + public abstract Set<QName> getAttributeNames(); + + public String getId(); + + public void setId(String id); + + public String getDomain(); + + public void dispose(); + +} Added: resourceBrokering/broker/src/main/java/eu/unicore/broker/EntityWithAttributesImpl.java =================================================================== --- resourceBrokering/broker/src/main/java/eu/unicore/broker/EntityWithAttributesImpl.java (rev 0) +++ resourceBrokering/broker/src/main/java/eu/unicore/broker/EntityWithAttributesImpl.java 2011-03-24 16:31:40 UTC (rev 9533) @@ -0,0 +1,95 @@ +package eu.unicore.broker; + +import java.io.Serializable; +import java.util.Set; + +import javax.xml.namespace.QName; + +import eu.unicore.broker.jobs.JobDescription; + +public abstract class EntityWithAttributesImpl<A extends Serializable> implements EntityWithAttributes<A> { + + private String id; + + protected AttributeCache attributeCache; + + public EntityWithAttributesImpl() + { + this(null); + } + + public EntityWithAttributesImpl(String id) { + super(); + this.id = id; + } + + + public Set<QName> getAttributeNames() { + return attributeCache.getAllAttributeNames(getDomain(), getId()); + } + + public void setAttribute(QName attributeName, A attribute) + { + attributeCache.putAttribute(getDomain(), getId(), attributeName, attribute); + } + + public A getAttribute(QName attributeName) + { + return (A) attributeCache.getAttribute(JobDescription.JOB_ATTRIBUTE_DOMAIN,getId(),attributeName); + } + + + public String getId() { + return id; + } + + public void setId(String id) { + this.id=id; + } + + public String toString() + { + return getId(); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((id == null) ? 0 : id.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (!(obj instanceof EntityWithAttributesImpl)) + return false; + EntityWithAttributesImpl other = (EntityWithAttributesImpl) obj; + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + return true; + } + + public void dispose() + { + attributeCache.clearAllAttributes(getDomain(), getId()); + } + + + public AttributeCache getAttributeCache() { + return attributeCache; + } + + + public void setAttributeCache(AttributeCache attributeCache) { + this.attributeCache = attributeCache; + } + +} Added: resourceBrokering/broker/src/main/java/eu/unicore/broker/JobToSiteBroker.java =================================================================== --- resourceBrokering/broker/src/main/java/eu/unicore/broker/JobToSiteBroker.java (rev 0) +++ resourceBrokering/broker/src/main/java/eu/unicore/broker/JobToSiteBroker.java 2011-03-24 16:31:40 UTC (rev 9533) @@ -0,0 +1,15 @@ +package eu.unicore.broker; + +import java.util.List; + +import eu.unicore.broker.jobs.JobDescription; +import eu.unicore.broker.sites.Site; + + +public interface JobToSiteBroker { + + public static final String INTERFACE_ID = JobToSiteBroker.class.getName(); + + public Site[] selectSites(JobDescription... jobs); + +} Added: resourceBrokering/broker/src/main/java/eu/unicore/broker/JobToSiteBrokerImpl.java =================================================================== --- resourceBrokering/broker/src/main/java/eu/unicore/broker/JobToSiteBrokerImpl.java (rev 0) +++ resourceBrokering/broker/src/main/java/eu/unicore/broker/JobToSiteBrokerImpl.java 2011-03-24 16:31:40 UTC (rev 9533) @@ -0,0 +1,60 @@ +package eu.unicore.broker; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.xml.namespace.QName; + +import eu.unicore.broker.indexing.SiteIndexing; +import eu.unicore.broker.jobs.JobDescription; +import eu.unicore.broker.matchmaking.JobToSiteMatchmaking; +import eu.unicore.broker.sites.Site; +import eu.unicore.broker.sites.SiteStore; +import eu.unicore.broker.sites.attributes.MostRecentUsageAttribute; +import eu.unicore.broker.sites.rating.JobToSiteMapping; +import eu.unicore.broker.sites.rating.Rating; +import eu.unicore.broker.sites.rating.SiteRating; +import eu.unicore.broker.sites.selection.SiteSelection; + +public class JobToSiteBrokerImpl implements JobToSiteBroker { + + private SiteStore siteStore; + private final SiteIndexing indexing; + private final JobToSiteMatchmaking matchmaking; + private final SiteRating siteRating; + private final SiteSelection siteSelection; + + + public JobToSiteBrokerImpl(SiteStore siteStore, SiteIndexing indexing, + JobToSiteMatchmaking matchmaking, SiteRating siteRating, + SiteSelection siteSelection) { + this.siteStore = siteStore; + this.indexing = indexing; + this.matchmaking = matchmaking; + this.siteRating = siteRating; + this.siteSelection = siteSelection; + } + + public Site[] selectSites(JobDescription... jobs) + { + + // first identify sites that are capable of dealing with each job + List<JobToSiteMapping> mappings = matchmaking.findMatchingSites(Arrays.asList(jobs),indexing); + + + // next, rate the sites, i.e. assign weights expressing how suitable they are for the jobs + List<Rating> ratings = siteRating.rate(mappings); + + + // finally use a selection strategy to choose one site per job + return siteSelection.selectSites(ratings.toArray(new Rating[ratings.size()])); + + } + + + +} Added: resourceBrokering/broker/src/main/java/eu/unicore/broker/exceptions/NoMatchingSiteException.java =================================================================== --- resourceBrokering/broker/src/main/java/eu/unicore/broker/exceptions/NoMatchingSiteException.java (rev 0) +++ resourceBrokering/broker/src/main/java/eu/unicore/broker/exceptions/NoMatchingSiteException.java 2011-03-24 16:31:40 UTC (rev 9533) @@ -0,0 +1,11 @@ +package eu.unicore.broker.exceptions; + +public class NoMatchingSiteException extends Exception { + + private static final long serialVersionUID=1L; + + public NoMatchingSiteException(String msg) + { + super(msg); + } +} Added: resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/AbstractSiteIndex.java =================================================================== --- resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/AbstractSiteIndex.java (rev 0) +++ resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/AbstractSiteIndex.java 2011-03-24 16:31:40 UTC (rev 9533) @@ -0,0 +1,50 @@ +package eu.unicore.broker.indexing; + +public abstract class AbstractSiteIndex implements SiteIndex, Cloneable { + private String id; + + public AbstractSiteIndex(String id) { + super(); + this.id = id; + } + + public String getId() { + return id; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((id == null) ? 0 : id.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (!(obj instanceof AbstractSiteIndex)) + return false; + AbstractSiteIndex other = (AbstractSiteIndex) obj; + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + return true; + } + + public SiteIndex clone() + { + try { + return (SiteIndex) super.clone(); + } catch (CloneNotSupportedException e) { + // should NOT happen! + return null; + } + } + +} Added: resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/SiteIndex.java =================================================================== --- resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/SiteIndex.java (rev 0) +++ resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/SiteIndex.java 2011-03-24 16:31:40 UTC (rev 9533) @@ -0,0 +1,12 @@ +package eu.unicore.broker.indexing; + +import java.io.Serializable; + +public interface SiteIndex extends Serializable { + + public static final String INTERFACE_ID = SiteIndex.class.getName(); + + public String getId(); + + +} Added: resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/SiteIndexer.java =================================================================== --- resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/SiteIndexer.java (rev 0) +++ resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/SiteIndexer.java 2011-03-24 16:31:40 UTC (rev 9533) @@ -0,0 +1,39 @@ +package eu.unicore.broker.indexing; + +import eu.unicore.broker.sites.Site; + +/** + * During matchmaking, previously built in-memory index structures may be used + * for speeding up the process. Implementations of this class can be registered + * dynamically at the {@link SiteIndexing} implementation. They are then + * informed about site changes at regular intervals in order to keep their index + * up-to-date. + * @author bdemuth + * + */ +public interface SiteIndexer { + + /** + * A site has been added and should be represented in the index + * @param site + * @param indexing + */ + public void sitesAdded(SiteIndexing indexing, Site... sites); + + /** + * A site has been updated and must be scrutinized to see whether the index + * must be updated as well. + * @param site + * @param indexing + */ + public void sitesUpdated(SiteIndexing indexing, Site... sites); + + /** + * A site could not be found anymore and should be removed from the index. + * @param site + * @param indexing + */ + public void sitesRemoved(SiteIndexing indexing, Site... sites); + + +} Added: resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/SiteIndexing.java =================================================================== --- resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/SiteIndexing.java (rev 0) +++ resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/SiteIndexing.java 2011-03-24 16:31:40 UTC (rev 9533) @@ -0,0 +1,24 @@ +package eu.unicore.broker.indexing; + +import java.util.List; + +import eu.unicore.broker.sites.Site; + +public interface SiteIndexing { + public static final String INTERFACE_ID = SiteIndexing.class.getName(); + + public abstract SiteIndex getIndex(String key); + + public abstract void putIndex(SiteIndex index); + + public abstract void sitesAdded(Site... site); + + public abstract void sitesUpdated(Site... site); + + public abstract void sitesRemoved(Site... site); + + public abstract List<SiteIndexer> getIndexers(); + + public abstract void setIndexers(List<SiteIndexer> indexers); + +} \ No newline at end of file Added: resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/SiteIndexingImpl.java =================================================================== --- resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/SiteIndexingImpl.java (rev 0) +++ resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/SiteIndexingImpl.java 2011-03-24 16:31:40 UTC (rev 9533) @@ -0,0 +1,115 @@ +package eu.unicore.broker.indexing; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; + +import eu.unicore.broker.sites.Site; + + +/** + * Base class for building indexes based on site attributes. These indexes are + * used during matchmaking for finding suitable sites efficiently. Different + * indexing techniques may be used, e.g. simple inverted indexes, interval trees + * for processing queries based on value ranges, etc. + * The class manages both a list of SiteIndexers that are responsible for + * building/updating the different indexes, as well as a map containing the + * indexes themselves (unique keys have to be used for storing/obtaining them). + * @author bdemuth + * + */ +public class SiteIndexingImpl implements SiteIndexing { + + private static final Logger logger = Logger.getLogger( + SiteIndexingImpl.class.getName()); + List<SiteIndexer> indexers = Collections.synchronizedList(new ArrayList<SiteIndexer>()); + Map<String,SiteIndex> indexes = new ConcurrentHashMap<String, SiteIndex>(); + + + public SiteIndexingImpl() + { + + } + + public SiteIndexingImpl(List<SiteIndexer> indexers) { + this.indexers = indexers; + } + + /* (non-Javadoc) + * @see eu.unicore.broker.indexing.SiteIndexing#getIndex(java.lang.String) + */ + public SiteIndex getIndex(String key) + { + return indexes.get(key); + } + + /* (non-Javadoc) + * @see eu.unicore.broker.indexing.SiteIndexing#putIndex(eu.unicore.broker.indexing.SiteIndex) + */ + public void putIndex(SiteIndex index) + { + indexes.put(index.getId(),index); + } + + + /* (non-Javadoc) + * @see eu.unicore.broker.indexing.SiteIndexing#siteAdded(eu.unicore.broker.sites.Site) + */ + public void sitesAdded(Site... sites) + { + for(SiteIndexer indexer : indexers) + { + try { + indexer.sitesAdded(this,sites); + } catch (Exception e) { + logger.log(Level.ERROR, "Error while informing site indexer "+indexer+" about added sites.",e); + } + } + } + + /* (non-Javadoc) + * @see eu.unicore.broker.indexing.SiteIndexing#siteUpdated(eu.unicore.broker.sites.Site) + */ + public void sitesUpdated(Site... sites) + { + for(SiteIndexer indexer : indexers) + { + try { + indexer.sitesUpdated(this,sites); + } catch (Exception e) { + logger.log(Level.ERROR, "Error while informing site indexer "+indexer+" about modified sites.",e); + } + } + } + + /* (non-Javadoc) + * @see eu.unicore.broker.indexing.SiteIndexing#siteRemoved(eu.unicore.broker.sites.Site) + */ + public void sitesRemoved(Site... sites) + { + for(SiteIndexer indexer : indexers) + { + try { + indexer.sitesRemoved(this,sites); + } catch (Exception e) { + logger.log(Level.ERROR, "Error while informing site indexer "+indexer+" about removed sites.",e); + } + } + } + + + + public void setIndexers(List<SiteIndexer> indexers) { + this.indexers = indexers; + } + + public List<SiteIndexer> getIndexers() { + return indexers; + } + +} Added: resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/inverted/InvertedSiteIndex.java =================================================================== --- resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/inverted/InvertedSiteIndex.java (rev 0) +++ resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/inverted/InvertedSiteIndex.java 2011-03-24 16:31:40 UTC (rev 9533) @@ -0,0 +1,77 @@ +package eu.unicore.broker.indexing.inverted; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import eu.unicore.broker.indexing.AbstractSiteIndex; +import eu.unicore.broker.indexing.SiteIndex; +import eu.unicore.broker.sites.Site; +import eu.unicore.broker.utils.CollectionUtils; + +public class InvertedSiteIndex<T> extends AbstractSiteIndex { + + private static final long serialVersionUID = -9090233697305408233L; + + private Map<T,Set<Site>> attributeToSites = new ConcurrentHashMap<T,Set<Site>>(); + private Map<Site,T> sitesToAttribute = new ConcurrentHashMap<Site,T>(); + + public InvertedSiteIndex(String id) { + super(id); + } + + public void setSitesWithAttributeValue(T attributeValue,Site... sites) + { + Set<Site> oldSites = attributeToSites.get(attributeValue); + if(oldSites == null) + { + oldSites = new HashSet<Site>(); + attributeToSites.put(attributeValue, oldSites); + } + for(Site s : sites) + { + oldSites.add(s); + sitesToAttribute.put(s, attributeValue); + } + } + + public void removeSites(Site... sites) + { + for(Site s : sites) + { + T attributeValue = sitesToAttribute.remove(s); + Set<Site> oldSites = attributeToSites.get(attributeValue); + if(oldSites != null) + { + oldSites.remove(s); + if(oldSites.size() == 0) + { + attributeToSites.remove(attributeValue); + } + } + } + } + + public Set<Site> getSitesWithAttributeValue(T attributeValue) + { + Set<Site> result = attributeToSites.get(attributeValue); + if(result == null) result = new HashSet<Site>(); + return result; + } + + public T getAttributeValue(Site s) + { + return sitesToAttribute.get(s); + } + + @Override + public InvertedSiteIndex<T> clone() { + InvertedSiteIndex<T> result = (InvertedSiteIndex<T>) super.clone(); + result.attributeToSites = CollectionUtils.deepClone(attributeToSites); + result.sitesToAttribute = CollectionUtils.deepClone(sitesToAttribute); + return result; + } + +} Added: resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/ranges/Interval.java =================================================================== --- resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/ranges/Interval.java (rev 0) +++ resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/ranges/Interval.java 2011-03-24 16:31:40 UTC (rev 9533) @@ -0,0 +1,122 @@ +package eu.unicore.broker.indexing.ranges; + +import java.io.Serializable; + +import eu.unicore.broker.BrokeringConstants; + + + +public class Interval implements Comparable<Interval>, Serializable, Cloneable, BrokeringConstants +{ + public Object data; + public String name = " "; + double start, end; + + + private boolean containsStart = true, containsEnd = true; + + public Interval(double start, double end) + { + this(start,end,true,true); + } + + public Interval(double start, double end, boolean containsStart, boolean containsEnd) + { + this.start = start; + this.end = end; + this.containsStart = containsStart; + this.containsEnd = containsEnd; + } + + public double getStart() { + return start; + } + + public void setStart(double start) { + this.start = start; + } + + public boolean containsStart() { + return containsStart; + } + + public void setContainsStart(boolean containsStart) { + this.containsStart = containsStart; + } + + public double getEnd() { + return end; + } + + public void setEnd(double end) { + this.end = end; + } + + public boolean containsEnd() { + return containsEnd; + } + + public void setContainsEnd(boolean containsEnd) { + this.containsEnd = containsEnd; + } + + public boolean intersects(Interval i) + { + return (getStart() < i.getEnd() || getStart() == i.getEnd() && containsStart() && i.containsEnd()) + && (getEnd() > i.getStart() || getEnd() == i.getStart() && containsEnd() && i.containsStart()); + } + + public boolean contains(Interval i) + { + return (getStart() < i.getStart() || getStart() == i.getStart() && containsStart) + && (getEnd() > i.getEnd() || getEnd() == i.getEnd() && containsEnd()); + } + + public String toString() + { + String opening = containsStart() ? "[" : "("; + String closing = containsEnd() ? "]" : ")"; + return opening + getStart()+","+getEnd()+closing; + } + + /** + * Compares this interval to another, based on their low + * endpoints. + * + * @param o The other <code>Interval</code> object. + * @return A negative integer if this <code>Interval</code> is + * less; 0 if the objects are equal; a positive integer if this + * <code>Interval</code> is greater. + * @throws ClassCastException if <code>o</code> is not an + * <code>Interval</code> object. + */ + public int compareTo(Interval i) + { + return Double.compare(start,i.start); + + } + + public boolean contains(double x) + { + if(x > start && x < end) return true; + if(Math.abs(x - start) < EPSILON && containsStart) return true; + if(Math.abs(x - end) < EPSILON && containsEnd) return true; + return false; + } + + public double getCenter() + { + return (end+start)/2; + } + + public Interval clone() + { + Interval clone = null; + try { + clone = (Interval) super.clone(); + } catch (CloneNotSupportedException e) { + e.printStackTrace(); + } + return clone; + } +} Added: resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/ranges/RangeSiteIndex.java =================================================================== --- resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/ranges/RangeSiteIndex.java (rev 0) +++ resourceBrokering/broker/src/main/java/eu/unicore/broker/indexing/ranges/RangeSiteIndex.java 2011-03-24 16:31:40 UTC (rev 9533) @@ -0,0 +1,68 @@ +package eu.unicore.broker.indexing.ranges; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import eu.unicore.broker.indexing.AbstractSiteIndex; +import eu.unicore.broker.indexing.SiteIndex; +import eu.unicore.broker.indexing.inverted.InvertedSiteIndex; +import eu.unicore.broker.sites.Site; +import eu.unicore.broker.utils.CollectionUtils; + +public class RangeSiteIndex extends AbstractSiteIndex { + + private Map<Site,Interval> map = new HashMap<Site, Interval>(); + + public RangeSiteIndex(String id) { + super(id); + + } + + public void addSite(Site s, Interval i) + { + i.data = s; + map.put(s,i); + } + + public void removeSite(Site s) + { + map.remove(s); + } + + public void updateSite(Site s, Interval i) + { + i.data = s; + map.put(s,i); + } + + public Set<Site> retrieveSites(Interval query, Set<Site> candidates) + { + + // Iterate over sites/intervals in a naive + // fashion; I've played with output-sensitive data structures like + // interval skip lists but the performance gain wasn't worth the extra + // space in memory + Set<Site> result = new HashSet<Site>(); + for(Site s : candidates) + { + Interval interval = map.get(s); + if(interval == null) continue; + if(query.intersects(interval)) + { + result.add(s); + } + } + return result; + } + + + @Override + public RangeSiteIndex clone() { + RangeSiteIndex result = (RangeSiteIndex) super.clone(); + result.map = CollectionUtils.deepClone(map); + return result; + } + +} Added: resourceBrokering/broker/src/main/java/eu/unicore/broker/jobs/JobDescription.java =================================================================== --- resourceBrokering/broker/src/main/java/eu/unicore/broker/jobs/JobDescription.java (rev 0) +++ resourceBrokering/broker/src/main/java/eu/unicore/broker/jobs/JobDescription.java 2011-03-24 16:31:40 UTC (rev 9533) @@ -0,0 +1,47 @@ +package eu.unicore.broker.jobs; + +import java.io.Serializable; + +import eu.unicore.broker.EntityWithAttributes; +import eu.unicore.broker.matchmaking.JobToSiteMatchmaker; +import eu.unicore.broker.sites.rating.SiteRatingStrategy; +import eu.unicore.broker.sites.selection.SiteSelectionStrategy; +import eu.unicore.broker.users.User; + +/** + * An abstraction of a job description that needs to be brokered. It is not + * bound to any particular descirption language. Is is characterized by a set of + * attributes that might differ depending on the job description language. + * Suitable and specialized {@link JobToSiteMatchmaker} objects are used to look + * at the different attributes and evaluate them during matchmaking. + * + * @author bdemuth + * + */ +public interface JobDescription extends EntityWithAttributes<Serializable> { + + public static final String INTERFACE_ID = JobDescription.class.getName(); + public static final String JOB_ATTRIBUTE_DOMAIN = "jobs"; + + + /** + * The user for which the job should be brokered. It may influence the + * brokering decision, e.g. when user preferences are adhered to. + * @return + */ + public User getUser(); + + public void setUser(User user); + + public String getBrokeringFailure(); + + public void setBrokeringFailure(String failure); + + public SiteRatingStrategy getSiteRatingStrategy(); + + public SiteSelectionStrategy getSiteSelectionStrategy(); + + public void setSiteRatingStrategy(SiteRatingStrategy s); + + public void setSiteSelectionStrategy(SiteSelectionStrategy s); +} Added: resourceBrokering/broker/src/main/java/eu/unicore/broker/jobs/JobDescriptionFactory.java =================================================================== --- resourceBrokering/broker/src/main/java/eu/unicore/broker/jobs/JobDescriptionFactory.java (rev 0) +++ resourceBrokering/broker/src/main/java/eu/unicore/broker/jobs/JobDescriptionFactory.java 2011-03-24 16:31:40 UTC (rev 9533) @@ -0,0 +1,14 @@ +package eu.unicore.broker.jobs; + +import eu.unicore.broker.DependencyFactory; + +public class JobDescriptionFactory { + + + public static JobDescription createJobDescription(String id) + { + JobDescription result = DependencyFactory.getComponent(JobDescription.INTERFACE_ID, JobDescription.class); + result.setId(id); + return result; + } +} Added: resourceBrokering/broker/src/main/java/eu/unicore/broker/jobs/JobDescriptionImpl.java =================================================================== --- resourceBrokering/broker/src/main/java/eu/unicore/broker/jobs/JobDescriptionImpl.java (rev 0) +++ resourceBrokering/broker/src/main/java/eu/unicore/broker/jobs/JobDescriptionImpl.java 2011-03-24 16:31:40 UTC (rev 9533) @@ -0,0 +1,93 @@ +package eu.unicore.broker.jobs; + +import java.io.Serializable; + +import javax.xml.namespace.QName; + +import eu.unicore.broker.AttributeCache; +import eu.unicore.broker.DependencyFactory; +import eu.unicore.broker.EntityWithAttributesImpl; +import eu.unicore.broker.sites.rating.SiteRatingStrategy; +import eu.unicore.broker.sites.selection.SiteSelectionStrategy; +import eu.unicore.broker.users.User; + +public class JobDescriptionImpl extends EntityWithAttributesImpl<Serializable> implements JobDescription{ + + private User user; + + private String brokeringFailure; + + private SiteRatingStrategy siteRatingStrategy; + + private SiteSelectionStrategy siteSelectionStrategy; + + /** + * Should only be instantiated via {@link JobDescriptionFactory#createJobDescription(String)} + */ + JobDescriptionImpl() + { + this(null); + } + + /** + * Should only be instantiated via {@link JobDescriptionFactory#createJobDescription(String)} + */ + JobDescriptionImpl(String id) { + this(id,null); + } + + /** + * Should only be instantiated via {@link JobDescriptionFactory#createJobDescription(String)} + */ + JobDescriptionImpl(String id, User user) { + super(id); + this.user = user; + } + + public String getDomain() { + return JOB_ATTRIBUTE_DOMAIN; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public String getBrokeringFailure() { + return brokeringFailure; + } + + public void setBrokeringFailure(String brokeringFailure) { + this.brokeringFailure = brokeringFailure; + } + + @Override + public String toString() { + return "JobDescriptionImpl [id=" + getId() + "]"; + } + + public SiteRatingStrategy getSiteRatingStrategy() { + return siteRatingStrategy; + } + + public void setSiteRatingStrategy(SiteRatingStrategy siteRatingStrategy) { + this.siteRatingStrategy = siteRatingStrategy; + } + + public SiteSelectionStrategy getSiteSelectionStrategy() { + return siteSelectionStrategy; + } + + public void setSiteSelectionStrategy(SiteSelectionStrategy siteSelectionStrategy) { + this.siteSelectionStrategy = siteSelectionStrategy; + } + + + + + + +} Added: resourceBrokering/broker/src/main/java/eu/unicore/broker/jobs/attributes/AbstractRangeBasedJobAttribute.java =================================================================== --- resourceBrokering/broker/src/main/java/eu/unicore/broker/jobs/attributes/AbstractRangeBasedJobAttribute.java (rev 0) +++ resourceBrokering/broker/src/main/java/eu/unicore/broker/jobs/attributes/AbstractRangeBasedJobAttribute.java 2011-03-24 16:31:40 UTC (rev 9533) @@ -0,0 +1,23 @@ +package eu.unicore.broker.jobs.attributes; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import eu.unicore.broker.indexing.ranges.Interval; + +public abstract class AbstractRangeBasedJobAttribute implements Serializable { + + + private List<Interval> requiredRanges = new ArrayList<Interval>(); + + public List<Interval> getRequiredRanges() { + return requiredRanges; + } + + public void setRequiredRanges(List<Interval> requiredRanges) { + this.requiredRanges = requiredRanges; + } + + +} Added: resourceBrokering/broker/src/main/java/eu/unicore/broker/jobs/attributes/BlackListAttribute.java =================================================================== --- resourceBrokering/broker/src/main/java/eu/unicore/broker/jobs/attributes/BlackListAttribute.java (rev 0) +++ resourceBrokering/broker/src/main/java/eu/unicore/broker/jobs/attributes/BlackListAttribute.java 2011-03-24 16:31:40 UTC (rev 9533) @@ -0,0 +1,43 @@ +package eu.unicore.broker.jobs.attributes; + +import java.io.Serializable; +import java.util.HashSet; +import java.util.Set; + +import javax.xml.namespace.QName; + +import eu.unicore.broker.BrokeringConstants; +import eu.unicore.broker.sites.Site; + +public class BlackListAttribute implements Serializable { + + public static final QName NAME = new QName(BrokeringConstants.JOB_ATTRIBUTE_NAMESPACE,"blackList"); + + private Set<Site> sites = new HashSet<Site>(); + + public BlackListAttribute(Site...sites) { + if(sites != null) + { + for(Site s : sites) + { + this.sites.add(s); + } + } + } + + public Set<Site> getSites() { + return sites; + } + + public void setSites(Set<Site> sites) { + this.sites = sites; + } + + @Override + public String toString() { + return "BlackListAttribute [sites=" + sites + "]"; + } + + + +} Added: resourceBrokering/broker/src/main/java/eu/unicore/broker/jobs/attributes/GreyListAttribute.java =================================================================== --- resourceBrokering/broker/src/main/java/eu/unicore/broker/jobs/attributes/GreyListAttribute.java (rev 0) +++ resourceBrokering/broker/src/main/java/eu/unicore/broker/jobs/attributes/GreyListAttribute.java 2011-03-24 16:31:40 UTC (rev 9533) @@ -0,0 +1,45 @@ +package eu.unicore.broker.jobs.attributes; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +import javax.xml... [truncated message content] |