1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2003 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 * 26 * ident "%Z%%M% %I% %E% SMI" 27 */ 28 29 package com.sun.solaris.domain.pools; 30 31 import java.util.*; 32 33 import com.sun.solaris.service.pools.*; 34 35 /** 36 * This class represents a move of resources between two resource 37 * sets. It is designed to be extended by classes which implement 38 * different types of moves. 39 */ 40 abstract class Move 41 { 42 /** 43 * Source resource set 44 */ 45 private Resource from; 46 47 /** 48 * Destination resource set 49 */ 50 private Resource to; 51 52 /** 53 * Sole constructor. (For invocation by subclass constructors) 54 * 55 * @param from The source of the move 56 * @param to The destination of the move 57 */ Move(Resource from, Resource to)58 protected Move(Resource from, Resource to) 59 { 60 this.from = from; 61 this.to = to; 62 } 63 64 /** 65 * Return the source of this move. 66 */ getFrom()67 Resource getFrom() 68 { 69 return (from); 70 } 71 72 /** 73 * Return the destination of this move. 74 */ getTo()75 Resource getTo() 76 { 77 return (to); 78 } 79 80 /** 81 * Apply this move to the resources described. 82 * 83 * @throws PoolsException If the move fails for any reason. 84 */ apply()85 abstract void apply() throws PoolsException; 86 87 /** 88 * Return the quantity of moved resource. 89 */ getQty()90 abstract long getQty(); 91 } 92 93 /** 94 * This class represents a move of component resources between two 95 * resource sets. A component of a resource set is a uniquely 96 * identifiable component, such as a processor. 97 */ 98 final class ComponentMove extends Move 99 { 100 /** 101 * List of components being moved. 102 */ 103 private List compList; 104 105 /** 106 * Constructor 107 * 108 * @param from The source of the move 109 * @param to The destination of the move 110 * @param comp The component which is to be moved 111 */ ComponentMove(Resource from, Resource to, Component comp)112 ComponentMove(Resource from, Resource to, Component comp) 113 { 114 super(from, to); 115 compList = new ArrayList(); 116 compList.add(comp); 117 } 118 119 /** 120 * Return a list of the components that comprise this move. 121 * 122 * The members of the list are guaranteed to be Component 123 * objects. 124 */ getComponents()125 List getComponents() 126 { 127 return ((List) ((ArrayList) compList).clone()); 128 } 129 130 /** 131 * Apply the move to the configuration to which the resources 132 * belong. 133 * 134 * @throws PoolsException if the transfer of resource fails. 135 */ apply()136 void apply() throws PoolsException 137 { 138 getTo().transfer(getFrom(), compList); 139 } 140 141 /** 142 * Return the quantity of resource which is participating in 143 * this move. 144 */ getQty()145 long getQty() 146 { 147 return (compList.size()); 148 } 149 150 /** 151 * Converts the <code>ComponentMove</code> to a 152 * <code>String</code> of the form: 153 */ toString()154 public String toString() 155 { 156 return ("from " + getFrom().toString() + " to " + 157 getTo().toString() + " components " + compList); 158 } 159 } 160 161 /** 162 * This class represents a move of commodity resources between two 163 * resource sets. Such a resource cannot be uniquely identified in the 164 * resource abstraction and is thus different to a move consisting of 165 * uniquely identifiable resource components. 166 */ 167 class QuantityMove extends Move 168 { 169 /** 170 * The resource quantity of the move. 171 */ 172 private long qty; 173 174 /** 175 * Construct a quantity move using the supplied details. 176 * 177 * @param from The source of the resources. 178 * @param to The destination of the resources. 179 * @param qty The quantity of the resources. 180 * 181 * @throws IllegalArgumentException if the qty is negative. 182 */ QuantityMove(Resource from, Resource to, long qty)183 QuantityMove(Resource from, Resource to, long qty) 184 { 185 super(from, to); 186 if (qty < 0) 187 throw new IllegalArgumentException( 188 "The resource quantity supplied (" + qty + 189 ") is illegal."); 190 this.qty = qty; 191 } 192 193 /** 194 * Apply the move to the configuration to which the resources 195 * belong. 196 * 197 * @throws PoolsException if the transfer of resource fails. 198 */ apply()199 void apply() throws PoolsException 200 { 201 getTo().transfer(getFrom(), qty); 202 } 203 204 /** 205 * Return the quantity of resource which is participating in 206 * this move. 207 */ getQty()208 long getQty() 209 { 210 return (qty); 211 } 212 213 /** 214 * Return a string representation of the move. 215 */ toString()216 public String toString() 217 { 218 return ("from " + getFrom().toString() + " to " + 219 getTo().toString() + " quantity " + qty); 220 } 221 } 222