| Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
| OctaveStruct |
|
| 2.3333333333333335;2.333 |
| 1 | /* | |
| 2 | * Copyright 2007, 2008, 2009 Ange Optimization ApS | |
| 3 | * | |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | * you may not use this file except in compliance with the License. | |
| 6 | * You may obtain a copy of the License at | |
| 7 | * | |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | * | |
| 10 | * Unless required by applicable law or agreed to in writing, software | |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | * See the License for the specific language governing permissions and | |
| 14 | * limitations under the License. | |
| 15 | */ | |
| 16 | package eu.simuline.octave.type; | |
| 17 | ||
| 18 | import java.util.Map; | |
| 19 | import java.util.TreeMap; | |
| 20 | ||
| 21 | import eu.simuline.octave.exception.OctaveClassCastException; | |
| 22 | import eu.simuline.octave.type.cast.Cast; | |
| 23 | ||
| 24 | /** | |
| 25 | * 1x1 struct. JavaOctave does not support the multidimensional structs | |
| 26 | * that octave has. | |
| 27 | */ | |
| 28 | 2 | public final class OctaveStruct implements OctaveObject { |
| 29 | ||
| 30 | ||
| 31 | private static final int PRIME = 31; | |
| 32 | ||
| 33 | // **** ER: I really have doubts that data can be null. | |
| 34 | private final Map<String, OctaveObject> data; | |
| 35 | ||
| 36 | /** | |
| 37 | * Create empty struct. | |
| 38 | */ | |
| 39 | 20 | public OctaveStruct() { |
| 40 | // Use a TreeMap in order to get a stable serialization | |
| 41 | // (I might want to use HashMap here and sort in OctaveIO.toText()) | |
| 42 | 20 | this.data = new TreeMap<String, OctaveObject>(); |
| 43 | 20 | } |
| 44 | ||
| 45 | /** | |
| 46 | * Create struct from data. | |
| 47 | * | |
| 48 | * @param data | |
| 49 | * this data will be referenced, not copied | |
| 50 | */ | |
| 51 | 14 | public OctaveStruct(final Map<String, OctaveObject> data) { |
| 52 | 14 | this.data = data; |
| 53 | 14 | } |
| 54 | ||
| 55 | /** | |
| 56 | * @param name | |
| 57 | * @param value | |
| 58 | */ | |
| 59 | @SuppressWarnings("PMD.AvoidThrowingNullPointerException") | |
| 60 | public void set(final String name, final OctaveObject value) { | |
| 61 | 24 | if (value == null) { |
| 62 | 0 | throw new NullPointerException |
| 63 | ("Cannot set field with null-name in octave struct. "); | |
| 64 | } | |
| 65 | 24 | this.data.put(name, value); |
| 66 | 24 | } |
| 67 | ||
| 68 | /** | |
| 69 | * Get object from struct as plain OctaveObject. | |
| 70 | * If you want to cast the object to a special type use | |
| 71 | * {@link OctaveStruct#get(Class, String)}. | |
| 72 | * | |
| 73 | * @param key | |
| 74 | * @return | |
| 75 | * shallow copy of value for this key, or null if key isn't there. | |
| 76 | */ | |
| 77 | public OctaveObject get(final String key) { | |
| 78 | 10 | final OctaveObject value = this.data.get(key); |
| 79 | 10 | return (value == null) ? null : value.shallowCopy(); |
| 80 | } | |
| 81 | ||
| 82 | /** | |
| 83 | * @param castClass | |
| 84 | * Class to cast to | |
| 85 | * @param key | |
| 86 | * @param <T> | |
| 87 | * @return shallow copy of value for this key, or null if key isn't there. | |
| 88 | * @throws OctaveClassCastException | |
| 89 | * if the object can not be cast to a castClass | |
| 90 | */ | |
| 91 | public <T extends OctaveObject> T get(final Class<T> castClass, | |
| 92 | final String key) { | |
| 93 | 8 | return Cast.cast(castClass, get(key)); |
| 94 | } | |
| 95 | ||
| 96 | /** | |
| 97 | * @return reference to internal map | |
| 98 | */ | |
| 99 | public Map<String, OctaveObject> getData() { | |
| 100 | 18 | return this.data; |
| 101 | } | |
| 102 | ||
| 103 | @Override | |
| 104 | public OctaveStruct shallowCopy() { | |
| 105 | 2 | return new OctaveStruct(this.data); |
| 106 | } | |
| 107 | ||
| 108 | @Override | |
| 109 | public int hashCode() { | |
| 110 | 0 | int result = 1; |
| 111 | 0 | result = PRIME * result + ((this.data == null) ? 0 : data.hashCode()); |
| 112 | 0 | return result; |
| 113 | } | |
| 114 | ||
| 115 | @Override | |
| 116 | public boolean equals(final Object obj) { | |
| 117 | 8 | if (this == obj) { |
| 118 | 0 | return true; |
| 119 | } | |
| 120 | 8 | if (obj == null) { |
| 121 | 0 | return false; |
| 122 | } | |
| 123 | 8 | if (getClass() != obj.getClass()) { |
| 124 | 0 | return false; |
| 125 | } | |
| 126 | 8 | final OctaveStruct other = (OctaveStruct) obj; |
| 127 | 8 | if (this.data == null) { |
| 128 | 0 | return other.data == null; |
| 129 | // if (other.data != null) { | |
| 130 | // return false; | |
| 131 | // } | |
| 132 | } else { | |
| 133 | 8 | return this.data.equals(other.data); |
| 134 | // if (!this.data.equals(other.data)) { | |
| 135 | // return false; | |
| 136 | // } | |
| 137 | } | |
| 138 | // return true; | |
| 139 | } | |
| 140 | ||
| 141 | } |