- Timestamp:
- 07/18/13 23:52:25 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
java/main/src/main/java/com/framsticks/params/AccessOperations.java
r102 r103 1 1 package com.framsticks.params; 2 3 import java.util.LinkedList; 4 import java.util.ListIterator; 5 6 import javax.annotation.Nullable; 2 7 3 8 import org.apache.logging.log4j.Logger; 4 9 import org.apache.logging.log4j.LogManager; 5 10 11 import com.framsticks.communication.File; 12 import com.framsticks.params.types.ListParam; 13 import com.framsticks.parsers.MultiParamLoader; 6 14 import com.framsticks.util.FramsticksException; 15 import com.framsticks.util.FramsticksUnsupportedOperationException; 16 import com.framsticks.util.Misc; 17 import com.framsticks.util.UnimplementedException; 18 import com.framsticks.util.lang.Casting; 7 19 import com.framsticks.util.lang.Containers; 8 20 import com.framsticks.util.lang.Holder; 21 import com.framsticks.util.lang.Pair; 9 22 // import com.framsticks.util.lang.Containers; 10 23 … … 14 27 public final class AccessOperations { 15 28 16 private final static Logger log = LogManager.getLogger( SimpleAbstractAccess.class.getName());29 private final static Logger log = LogManager.getLogger(AccessOperations.class); 17 30 18 31 /** … … 75 88 } 76 89 77 public static void save(Access access, Sink sink) { 90 public static <A extends Access> A assureSelected(A access) { 91 if (access.getSelected() == null) { 92 access.select(access.createAccessee()); 93 } 94 return access; 95 } 96 97 public static Access loadAll(@Nullable final Access rootAccess, Source source, final Registry registry) { 98 final MultiParamLoader loader = new MultiParamLoader(); 99 loader.setNewSource(source); 100 final LinkedList<Access> accessesStack = new LinkedList<>(); 101 if (rootAccess != null) { 102 assureSelected(rootAccess); 103 accessesStack.add(rootAccess); 104 } 105 final Holder<Boolean> first = new Holder<>(true); 106 final Holder<Boolean> needAdd = new Holder<>(); 107 final Holder<Access> currentAccess = new Holder<>(); 108 final Holder<Pair<Access, CompositeParam>> parent = new Holder<>(); 109 110 loader.setAccessProvider(new AccessProvider() { 111 @Override 112 public Access getAccess(String name) { 113 if (first.get()) { 114 first.set(false); 115 if (rootAccess != null) { 116 if (name.equals(rootAccess.getId())) { 117 needAdd.set(false); 118 currentAccess.set(rootAccess); 119 return rootAccess; 120 } 121 } else { 122 Access access = registry.createAccess(name); 123 needAdd.set(false); 124 currentAccess.set(access); 125 return access; 126 127 } 128 } 129 130 ListIterator<Access> accessIterator = accessesStack.listIterator(accessesStack.size()); 131 parent.set(null); 132 // log.debug("accesses stack: {}", accessesStack); 133 134 while (accessIterator.hasPrevious()) { 135 Access a = accessIterator.previous(); 136 assert a != null; 137 138 for (CompositeParam p : Containers.filterInstanceof(a.getParams(), CompositeParam.class)) { 139 if (p.getContainedTypeName().equals(name)) { 140 141 if (parent.get() != null) { 142 throw new FramsticksException().msg("ambiguity encountered during loading").arg("name", name); 143 } 144 145 if (p instanceof ListParam) { 146 ListAccess listAccess = Casting.assertCast(ListAccess.class, registry.prepareAccess(p)); 147 listAccess.select(a.get(p, Object.class)); 148 parent.set(new Pair<Access, CompositeParam>(listAccess, listAccess.prepareParamFor(Integer.toString(listAccess.getParamCount())))); 149 150 } else { 151 parent.set(Pair.make(a, p)); 152 } 153 } 154 } 155 156 if (parent.get() == null) { 157 accessIterator.remove(); 158 } 159 } 160 161 if (parent.get() == null) { 162 throw new FramsticksException().msg("failed to find place for loaded object").arg("name", name); 163 } 164 165 currentAccess.set(registry.prepareAccess(parent.get().second)); 166 Object object = parent.get().first.get(parent.get().second, Object.class); 167 if (object != null) { 168 currentAccess.get().select(object); 169 needAdd.set(false); 170 } else { 171 object = currentAccess.get().createAccessee(); 172 currentAccess.get().select(object); 173 needAdd.set(true); 174 } 175 176 return currentAccess.get(); 177 } 178 }); 179 180 loader.addListener(MultiParamLoader.Status.AfterObject, new MultiParamLoader.StatusListener() { 181 @Override 182 public void onStatusChange() { 183 if (needAdd.get()) { 184 parent.get().first.set(parent.get().second, currentAccess.get().getSelected()); 185 } 186 if (currentAccess.get() != rootAccess) { 187 accessesStack.add(currentAccess.get()); 188 } 189 currentAccess.set(null); 190 } 191 }); 192 193 loader.go(); 194 if (accessesStack.isEmpty()) { 195 throw new FramsticksException().msg("failed to load from source").arg("source", source); 196 } 197 return accessesStack.get(0); 198 } 199 200 public static void saveAll(Access access, Sink sink, Registry registry) { 201 if (access instanceof ObjectAccess) { 202 savePrimitives(access, sink); 203 } 204 for (CompositeParam p : filterInstanceof(access.getParams(), CompositeParam.class)) { 205 Object child = access.get(p, Object.class); 206 if (child == null) { 207 continue; 208 } 209 saveAll(registry.prepareAccess(p).select(child), sink, registry); 210 } 211 } 212 213 public static void saveComposites(Access access, Sink sink, Registry registry) { 214 for (CompositeParam p : filterInstanceof(access.getParams(), CompositeParam.class)) { 215 Object child = access.get(p, Object.class); 216 if (child == null) { 217 continue; 218 } 219 savePrimitives(registry.prepareAccess(p).select(child), sink); 220 } 221 } 222 223 public static void savePrimitives(Access access, Sink sink) { 78 224 if (access instanceof ObjectAccess) { 79 225 ObjectAccess objectAccess = (ObjectAccess) access; 80 226 FramsClass framsClass = access.getFramsClass(); 81 227 assert framsClass != null; 82 sink.print(framsClass.getId()).print(":").breakLine(); 228 boolean headerNeeded = true; 229 // sink.print(framsClass.getId()).print(":").breakLine(); 83 230 for (PrimitiveParam<?> p : filterInstanceof(framsClass.getParamEntries(), PrimitiveParam.class)) { 231 84 232 Object value = objectAccess.get(p, Object.class); 85 233 if ((value == null) || value.equals(p.getDef(Object.class))) { 86 234 continue; 87 235 } 236 237 if (headerNeeded) { 238 sink.print(framsClass.getId()).print(":").breakLine(); 239 headerNeeded = false; 240 } 241 88 242 sink.print(p.getId()).print(":"); 89 243 p.save(sink, value); 90 244 sink.breakLine(); 91 245 } 92 sink.breakLine(); 246 if (!headerNeeded) { 247 sink.breakLine(); 248 } 93 249 return; 94 250 } 251 throw new FramsticksException().msg("invalid type of access for primitive save").arg("access", access); 252 } 253 254 public static void save(Access access, Sink sink) { 255 if (access instanceof ObjectAccess) { 256 savePrimitives(access, sink); 257 return; 95 258 } 96 259 if (access instanceof ListAccess) { … … 107 270 } 108 271 272 public static void loadComposites(Access access, Source source, final Registry registry) { 273 if (access instanceof ObjectAccess) { 274 final ObjectAccess objectAccess = (ObjectAccess) access; 275 276 MultiParamLoader loader = new MultiParamLoader(); 277 278 loader.setNewSource(source); 279 280 loader.setAccessProvider(new AccessProvider() { 281 @Override 282 public Access getAccess(String name) { 283 CompositeParam result = null; 284 for (CompositeParam p : filterInstanceof(objectAccess.getParams(), CompositeParam.class)) { 285 if (p.getContainedTypeName().equals(name)) { 286 if (result != null) { 287 throw new FramsticksException().msg("class name is ambiguous in access").arg("name", name).arg("first candidate", result).arg("second candidate", p); 288 } 289 result = p; 290 291 } 292 } 293 if (result == null) { 294 throw new FramsticksException().msg("class name is unknown").arg("name", name).arg("in", objectAccess); 295 } 296 297 return registry.prepareAccess(result).select(objectAccess.get(result, Object.class)); 298 } 299 }); 300 301 302 loader.go(); 303 304 return; 305 } 306 throw new UnimplementedException().msg("unknown access category").arg("access", access); 307 } 308 109 309 public static void load(Access access, Source source) { 110 310 if (!(access instanceof ObjectAccess)) { … … 128 328 } 129 329 } 130 131 330 } 132 331 … … 215 414 } 216 415 416 417 /** 418 * 419 * If both arguments are File, than do nothing; otherwise: 420 * 421 * If from argument is a File: 422 * - if toJavaClass is Object.class, than try read using registry 423 * - otherwise: try use loadComposites 424 * 425 * If to argument is a File: 426 * - use Registry to saveAll 427 * 428 */ 429 public static <T, F> T convert(Class<T> toJavaClass, F from, Registry registry) { 430 if (toJavaClass.equals(from.getClass())) { 431 return toJavaClass.cast(from); 432 } 433 if (from instanceof File) { 434 File file = (File) from; 435 return Casting.throwCast(toJavaClass, loadAll((toJavaClass.equals(Object.class) ? null : registry.createAccess(toJavaClass)), file.getContent(), registry).getSelected()); 436 } 437 if (toJavaClass.equals(File.class)) { 438 ListSink sink = new ListSink(); 439 saveAll(registry.createAccess(from.getClass()).select(from), sink, registry); 440 return Casting.throwCast(toJavaClass, new File("", new ListSource(sink.getOut()))); 441 } 442 443 throw new FramsticksUnsupportedOperationException().msg("conversion").arg("from", from.getClass()).arg("to", toJavaClass); 444 } 445 446 @SuppressWarnings("serial") 447 public static class EqualityException extends FramsticksException { 448 } 449 450 451 public static void assureEquality(Access a, Access b, Registry registry) { 452 try { 453 if (a.getParamCount() != b.getParamCount()) { 454 throw new EqualityException().msg("param count not equal").arg("left", a.getParamCount()).arg("right", b.getParamCount()); 455 } 456 for (ValueParam avp : Containers.filterInstanceof(a.getParams(), ValueParam.class)) { 457 Param bp = b.getParam(avp.getId()); 458 if (bp == null) { 459 throw new EqualityException().msg("param from left not present in right").arg("param", avp); 460 } 461 Misc.checkEquals(avp.getClass(), bp.getClass(), "params type not equals", null); 462 ValueParam bvp = (ValueParam) bp; 463 464 Object oa = a.get(avp, Object.class); 465 Object ob = b.get(avp, Object.class); 466 467 if (avp instanceof CompositeParam) { 468 assureEquality(registry.prepareAccess((CompositeParam) avp).select(oa), registry.prepareAccess((CompositeParam) bvp).select(ob), registry); 469 continue; 470 } 471 Misc.checkEquals(oa, ob, "values not equal", null); 472 } 473 } catch (EqualityException e) { 474 throw e.arg("left", a).arg("right", b); 475 } 476 } 477 478 public static boolean areEqual(Access a, Access b, Registry registry) { 479 try { 480 assureEquality(a, b, registry); 481 return true; 482 } catch (EqualityException e) { 483 } 484 return false; 485 } 486 217 487 }
Note: See TracChangeset
for help on using the changeset viewer.