/******************************************************************************* * Copyright (c) 2011 GigaSpaces Technologies Ltd. All rights reserved * * Licensed 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.cloudifysource.utilitydomain.context.kvstore; import groovy.lang.GroovyObjectSupport; import java.io.Serializable; import java.util.Iterator; import java.util.concurrent.TimeUnit; import org.cloudifysource.domain.context.Service; import org.cloudifysource.domain.context.ServiceContext; import org.cloudifysource.domain.context.kvstorage.AttributesFacade; import org.cloudifysource.utilitydomain.kvstorage.spaceentries.ServiceCloudifyAttribute; /********* * . * @author Eitan * */ public class ServiceAttributesAccessor extends AbstractAttributesAccessor { private final String serviceName; private final InstancesFacade instancesFacade; public ServiceAttributesAccessor(final AttributesFacade attributesFacadeImpl, final String applicationName, final String serviceName, final ServiceContext serviceContext) { super(attributesFacadeImpl, applicationName); this.serviceName = serviceName; this.instancesFacade = new InstancesFacade(attributesFacadeImpl, applicationName, serviceName, serviceContext); } @Override protected ServiceCloudifyAttribute prepareAttributeTemplate() { final ServiceCloudifyAttribute attribute = new ServiceCloudifyAttribute(); attribute.setServiceName(serviceName); return attribute; } public InstancesFacade getInstances() { return instancesFacade; } /************ * . * @author Eitan. * */ // This is serializable just because groovy .each method returns the iterator as a result, if the user // will write each method as a last command in a closue with no other return value he will get serialization error public static class InstancesFacade extends GroovyObjectSupport implements Iterable<InstanceAttributesAccessor>, Serializable { private static final long serialVersionUID = 1L; private static final int WAIT_FOR_SERVICE_TIMEOUT = 10; private final transient ServiceContext serviceContext; private final transient AttributesFacadeImpl attributesFacade; private final transient String applicationName; private final transient String serviceName; public InstancesFacade(final AttributesFacade attributesFacade, final String applicationName, final String serviceName, final ServiceContext serviceContext) { this.attributesFacade = (AttributesFacadeImpl) attributesFacade; this.applicationName = applicationName; this.serviceName = serviceName; this.serviceContext = serviceContext; } @Override public Iterator<InstanceAttributesAccessor> iterator() { return new InstanceFacadeIterator(); } /******** * Accessor. * @param key . * @return . */ public Object getAt(final Object key) { if (!(key instanceof Integer)) { throw new IllegalArgumentException("key must be integer and represent service instance id"); } final Integer instanceId = (Integer) key; return new InstanceAttributesAccessor(attributesFacade, applicationName, serviceName, instanceId); } @Override public String toString() { return ""; } /************ * . * @author barakme * */ public class InstanceFacadeIterator implements Iterator<InstanceAttributesAccessor>, Serializable { private static final long serialVersionUID = 1L; private final transient int instancesCount; private transient int currentInstanceIndex = 0; public InstanceFacadeIterator() { final Service service = serviceContext.waitForService(serviceContext.getServiceName(), WAIT_FOR_SERVICE_TIMEOUT, TimeUnit.SECONDS); instancesCount = service != null ? service.getNumberOfPlannedInstances() : 0; } @Override public boolean hasNext() { return currentInstanceIndex < instancesCount; } @Override public InstanceAttributesAccessor next() { final int instanceId = currentInstanceIndex + 1; currentInstanceIndex++; return new InstanceAttributesAccessor(attributesFacade, applicationName, serviceName, instanceId); } @Override public void remove() { throw new UnsupportedOperationException(); } @Override public String toString() { return ""; } } } }